From 8e04b41450b5186ee71f35d862434dc82f143fc5 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Wed, 22 Mar 2017 12:03:27 +0100 Subject: [PATCH 1/8] renamed test so views are not tested in cluster yet --- .../{api-view-spec.rb => api-view-spec-noncluster.rb} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename UnitTests/HttpInterface/{api-view-spec.rb => api-view-spec-noncluster.rb} (100%) diff --git a/UnitTests/HttpInterface/api-view-spec.rb b/UnitTests/HttpInterface/api-view-spec-noncluster.rb similarity index 100% rename from UnitTests/HttpInterface/api-view-spec.rb rename to UnitTests/HttpInterface/api-view-spec-noncluster.rb From 71bf18dd124796c411856181d7b174f2080cd2e4 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Wed, 22 Mar 2017 13:01:40 +0100 Subject: [PATCH 2/8] renaming --- arangod/MMFiles/MMFilesCollection.cpp | 36 ++++---- arangod/MMFiles/MMFilesCollection.h | 20 ++-- arangod/MMFiles/MMFilesCollectorCache.h | 6 +- arangod/MMFiles/MMFilesCollectorThread.cpp | 14 +-- arangod/MMFiles/MMFilesCompactorThread.cpp | 36 ++++---- arangod/MMFiles/MMFilesCompactorThread.h | 12 +-- arangod/MMFiles/MMFilesDatafile.cpp | 96 ++++++++++---------- arangod/MMFiles/MMFilesDatafile.h | 80 ++++++++-------- arangod/MMFiles/MMFilesDatafileHelper.h | 78 ++++++++-------- arangod/MMFiles/MMFilesEngine.cpp | 22 ++--- arangod/MMFiles/MMFilesEngine.h | 2 +- arangod/MMFiles/MMFilesLogfileManager.cpp | 6 +- arangod/MMFiles/MMFilesLogfileManager.h | 60 ++++++------ arangod/MMFiles/MMFilesRevisionsCache.cpp | 4 +- arangod/MMFiles/MMFilesRevisionsCache.h | 4 +- arangod/MMFiles/MMFilesV8Functions.cpp | 57 +++++++++++- arangod/MMFiles/MMFilesWalLogfile.h | 2 +- arangod/MMFiles/MMFilesWalMarker.h | 40 ++++---- arangod/MMFiles/MMFilesWalRecoverState.cpp | 18 ++-- arangod/MMFiles/MMFilesWalRecoverState.h | 6 +- arangod/MMFiles/MMFilesWalSlot.cpp | 6 +- arangod/MMFiles/MMFilesWalSlots.cpp | 12 +-- arangod/MMFiles/mmfiles-replication-dump.cpp | 34 +++---- arangod/V8Server/v8-collection.cpp | 48 ---------- arangod/VocBase/PhysicalCollection.h | 10 +- tests/Basics/structure-size-test.cpp | 36 ++++---- 26 files changed, 369 insertions(+), 376 deletions(-) diff --git a/arangod/MMFiles/MMFilesCollection.cpp b/arangod/MMFiles/MMFilesCollection.cpp index 8a4069d0ba..93b0c0e1af 100644 --- a/arangod/MMFiles/MMFilesCollection.cpp +++ b/arangod/MMFiles/MMFilesCollection.cpp @@ -206,7 +206,7 @@ PhysicalCollection* MMFilesCollection::clone(LogicalCollection* logical,Physical } /// @brief process a document (or edge) marker when opening a collection -int MMFilesCollection::OpenIteratorHandleDocumentMarker(TRI_df_marker_t const* marker, +int MMFilesCollection::OpenIteratorHandleDocumentMarker(MMFilesMarker const* marker, MMFilesDatafile* datafile, MMFilesCollection::OpenIteratorState* state) { LogicalCollection* collection = state->_collection; @@ -304,7 +304,7 @@ int MMFilesCollection::OpenIteratorHandleDocumentMarker(TRI_df_marker_t const* m } /// @brief process a deletion marker when opening a collection -int MMFilesCollection::OpenIteratorHandleDeletionMarker(TRI_df_marker_t const* marker, +int MMFilesCollection::OpenIteratorHandleDeletionMarker(MMFilesMarker const* marker, MMFilesDatafile* datafile, MMFilesCollection::OpenIteratorState* state) { LogicalCollection* collection = state->_collection; @@ -380,10 +380,10 @@ int MMFilesCollection::OpenIteratorHandleDeletionMarker(TRI_df_marker_t const* m } /// @brief iterator for open -bool MMFilesCollection::OpenIterator(TRI_df_marker_t const* marker, MMFilesCollection::OpenIteratorState* data, +bool MMFilesCollection::OpenIterator(MMFilesMarker const* marker, MMFilesCollection::OpenIteratorState* data, MMFilesDatafile* datafile) { TRI_voc_tick_t const tick = marker->getTick(); - TRI_df_marker_type_t const type = marker->getType(); + MMFilesMarkerype_t const type = marker->getType(); int res; @@ -779,7 +779,7 @@ int MMFilesCollection::reserveJournalSpace(TRI_voc_tick_t tick, TRI_ASSERT(datafile != nullptr); // try to reserve space in the datafile - TRI_df_marker_t* position = nullptr; + MMFilesMarker* position = nullptr; int res = datafile->reserveElement(size, &position, targetSize); // found a datafile with enough space left @@ -953,8 +953,8 @@ MMFilesDatafile* MMFilesCollection::createDatafile(TRI_voc_fid_t fid, } // create a collection header, still in the temporary file - TRI_df_marker_t* position; - int res = datafile->reserveElement(sizeof(TRI_col_header_marker_t), &position, journalSize); + MMFilesMarker* position; + int res = datafile->reserveElement(sizeof(MMFilesCollectionHeaderMarker), &position, journalSize); TRI_IF_FAILURE("CreateJournalDocumentCollectionReserve1") { res = TRI_ERROR_DEBUG; @@ -972,10 +972,10 @@ MMFilesDatafile* MMFilesCollection::createDatafile(TRI_voc_fid_t fid, THROW_ARANGO_EXCEPTION(res); } - TRI_col_header_marker_t cm; + MMFilesCollectionHeaderMarker cm; MMFilesDatafileHelper::InitMarker( - reinterpret_cast(&cm), TRI_DF_MARKER_COL_HEADER, - sizeof(TRI_col_header_marker_t), static_cast(fid)); + reinterpret_cast(&cm), TRI_DF_MARKER_COL_HEADER, + sizeof(MMFilesCollectionHeaderMarker), static_cast(fid)); cm._cid = _logicalCollection->cid(); res = datafile->writeCrcElement(position, &cm.base, false); @@ -1063,7 +1063,7 @@ bool MMFilesCollection::removeDatafile(MMFilesDatafile* df) { } /// @brief iterates over a collection -bool MMFilesCollection::iterateDatafiles(std::function const& cb) { +bool MMFilesCollection::iterateDatafiles(std::function const& cb) { if (!iterateDatafilesVector(_datafiles, cb) || !iterateDatafilesVector(_compactors, cb) || !iterateDatafilesVector(_journals, cb)) { @@ -1074,7 +1074,7 @@ bool MMFilesCollection::iterateDatafiles(std::function const& files, - std::function const& cb) { + std::function const& cb) { for (auto const& datafile : files) { datafile->sequentialAccess(); datafile->willNeed(); @@ -1273,7 +1273,7 @@ std::vector MMFilesCollection::datafiles } bool MMFilesCollection::applyForTickRange(TRI_voc_tick_t dataMin, TRI_voc_tick_t dataMax, - std::function const& callback) { + std::function const& callback) { LOG_TOPIC(TRACE, arangodb::Logger::FIXME) << "getting datafiles in data range " << dataMin << " - " << dataMax; std::vector datafiles = datafilesInRange(dataMin, dataMax); @@ -1297,14 +1297,14 @@ bool MMFilesCollection::applyForTickRange(TRI_voc_tick_t dataMin, TRI_voc_tick_t char const* end = ptr + datafile->currentSize(); while (ptr < end) { - auto const* marker = reinterpret_cast(ptr); + auto const* marker = reinterpret_cast(ptr); if (marker->getSize() == 0) { // end of datafile break; } - TRI_df_marker_type_t type = marker->getType(); + MMFilesMarkerype_t type = marker->getType(); if (type <= TRI_DF_MARKER_MIN) { break; @@ -1767,7 +1767,7 @@ int MMFilesCollection::iterateMarkersOnLoad(transaction::Methods* trx) { } // read all documents and fill primary index - auto cb = [&openState](TRI_df_marker_t const* marker, MMFilesDatafile* datafile) -> bool { + auto cb = [&openState](MMFilesMarker const* marker, MMFilesDatafile* datafile) -> bool { return OpenIterator(marker, &openState, datafile); }; @@ -2758,7 +2758,7 @@ uint8_t const* MMFilesCollection::lookupRevisionVPackConditional(TRI_voc_rid_t r uint8_t const* vpack = static_cast(old.dataptr()); if (maxTick > 0) { - TRI_df_marker_t const* marker = reinterpret_cast(vpack - MMFilesDatafileHelper::VPackOffset(TRI_DF_MARKER_VPACK_DOCUMENT)); + MMFilesMarker const* marker = reinterpret_cast(vpack - MMFilesDatafileHelper::VPackOffset(TRI_DF_MARKER_VPACK_DOCUMENT)); if (marker->getTick() > maxTick) { return nullptr; } @@ -2783,7 +2783,7 @@ void MMFilesCollection::updateRevision(TRI_voc_rid_t revisionId, uint8_t const* _revisionsCache.update(revisionId, dataptr, fid, isInWal); } -bool MMFilesCollection::updateRevisionConditional(TRI_voc_rid_t revisionId, TRI_df_marker_t const* oldPosition, TRI_df_marker_t const* newPosition, TRI_voc_fid_t newFid, bool isInWal) { +bool MMFilesCollection::updateRevisionConditional(TRI_voc_rid_t revisionId, MMFilesMarker const* oldPosition, MMFilesMarker const* newPosition, TRI_voc_fid_t newFid, bool isInWal) { TRI_ASSERT(revisionId != 0); TRI_ASSERT(newPosition != nullptr); return _revisionsCache.updateConditional(revisionId, oldPosition, newPosition, newFid, isInWal); diff --git a/arangod/MMFiles/MMFilesCollection.h b/arangod/MMFiles/MMFilesCollection.h index f65398270e..826c77eadc 100644 --- a/arangod/MMFiles/MMFilesCollection.h +++ b/arangod/MMFiles/MMFilesCollection.h @@ -37,7 +37,7 @@ #include "VocBase/PhysicalCollection.h" struct MMFilesDatafile; -struct TRI_df_marker_t; +struct MMFilesMarker; namespace arangodb { class LogicalCollection; @@ -158,13 +158,13 @@ class MMFilesCollection final : public PhysicalCollection { // datafile management bool applyForTickRange(TRI_voc_tick_t dataMin, TRI_voc_tick_t dataMax, - std::function const& callback) override; + std::function const& callback); /// @brief closes an open collection int close() override; /// @brief rotate the active journal - will do nothing if there is no journal - int rotateActiveJournal() override; + int rotateActiveJournal(); /// @brief sync the active journal - will do nothing if there is no journal /// or if the journal is volatile @@ -372,8 +372,8 @@ class MMFilesCollection final : public PhysicalCollection { TRI_voc_fid_t fid, bool isInWal); bool updateRevisionConditional(TRI_voc_rid_t revisionId, - TRI_df_marker_t const* oldPosition, - TRI_df_marker_t const* newPosition, + MMFilesMarker const* oldPosition, + MMFilesMarker const* newPosition, TRI_voc_fid_t newFid, bool isInWal); void removeRevision(TRI_voc_rid_t revisionId, bool updateStats); @@ -407,13 +407,13 @@ class MMFilesCollection final : public PhysicalCollection { arangodb::velocypack::Slice const toRemove); - static int OpenIteratorHandleDocumentMarker(TRI_df_marker_t const* marker, + static int OpenIteratorHandleDocumentMarker(MMFilesMarker const* marker, MMFilesDatafile* datafile, OpenIteratorState* state); - static int OpenIteratorHandleDeletionMarker(TRI_df_marker_t const* marker, + static int OpenIteratorHandleDeletionMarker(MMFilesMarker const* marker, MMFilesDatafile* datafile, OpenIteratorState* state); - static bool OpenIterator(TRI_df_marker_t const* marker, + static bool OpenIterator(MMFilesMarker const* marker, OpenIteratorState* data, MMFilesDatafile* datafile); /// @brief create statistics for a datafile, using the stats provided @@ -424,7 +424,7 @@ class MMFilesCollection final : public PhysicalCollection { /// @brief iterates over a collection bool iterateDatafiles( - std::function const& + std::function const& cb); /// @brief creates a datafile @@ -441,7 +441,7 @@ class MMFilesCollection final : public PhysicalCollection { bool iterateDatafilesVector( std::vector const& files, - std::function const& + std::function const& cb); MMFilesDocumentPosition lookupRevision(TRI_voc_rid_t revisionId) const; diff --git a/arangod/MMFiles/MMFilesCollectorCache.h b/arangod/MMFiles/MMFilesCollectorCache.h index dc0823beab..0a80886a27 100644 --- a/arangod/MMFiles/MMFilesCollectorCache.h +++ b/arangod/MMFiles/MMFilesCollectorCache.h @@ -30,7 +30,7 @@ #include "VocBase/voc-types.h" struct MMFilesDatafile; -struct TRI_df_marker_t; +struct MMFilesMarker; namespace arangodb { class MMFilesWalLogfile; @@ -142,11 +142,11 @@ struct MMFilesCollectorCache { }; /// @brief typedef key => document marker -typedef std::unordered_map +typedef std::unordered_map MMFilesDocumentOperationsType; /// @brief typedef for structural operation (attributes, shapes) markers -typedef std::vector MMFilesOperationsType; +typedef std::vector MMFilesOperationsType; } diff --git a/arangod/MMFiles/MMFilesCollectorThread.cpp b/arangod/MMFiles/MMFilesCollectorThread.cpp index e0ccda1d66..7cac642fe8 100644 --- a/arangod/MMFiles/MMFilesCollectorThread.cpp +++ b/arangod/MMFiles/MMFilesCollectorThread.cpp @@ -109,12 +109,12 @@ static bool ShouldIgnoreCollection(CollectorState const* state, } /// @brief callback to handle one marker during collection -static bool ScanMarker(TRI_df_marker_t const* marker, void* data, +static bool ScanMarker(MMFilesMarker const* marker, void* data, MMFilesDatafile* datafile) { CollectorState* state = static_cast(data); TRI_ASSERT(marker != nullptr); - TRI_df_marker_type_t const type = marker->getType(); + MMFilesMarkerype_t const type = marker->getType(); switch (type) { case TRI_DF_MARKER_PROLOGUE: { @@ -564,13 +564,13 @@ void MMFilesCollectorThread::processCollectionMarker( MMFilesCollectorOperation const& operation) { auto physical = static_cast(collection->getPhysical()); TRI_ASSERT(physical != nullptr); - auto const* walMarker = reinterpret_cast(operation.walPosition); + auto const* walMarker = reinterpret_cast(operation.walPosition); TRI_ASSERT(walMarker != nullptr); - TRI_ASSERT(reinterpret_cast(operation.datafilePosition)); + TRI_ASSERT(reinterpret_cast(operation.datafilePosition)); TRI_voc_size_t const datafileMarkerSize = operation.datafileMarkerSize; TRI_voc_fid_t const fid = operation.datafileId; - TRI_df_marker_type_t const type = walMarker->getType(); + MMFilesMarkerype_t const type = walMarker->getType(); if (type == TRI_DF_MARKER_VPACK_DOCUMENT) { auto& dfi = cache->createDfi(fid); @@ -589,7 +589,7 @@ void MMFilesCollectorThread::processCollectionMarker( if (element && element.revisionId() == revisionId) { // make it point to datafile now - TRI_df_marker_t const* newPosition = reinterpret_cast(operation.datafilePosition); + MMFilesMarker const* newPosition = reinterpret_cast(operation.datafilePosition); wasAdjusted = physical->updateRevisionConditional(element.revisionId(), walMarker, newPosition, fid, false); } @@ -810,7 +810,7 @@ int MMFilesCollectorThread::collect(MMFilesWalLogfile* logfile) { // sort vector by marker tick std::sort(sortedOperations.begin(), sortedOperations.end(), - [](TRI_df_marker_t const* left, TRI_df_marker_t const* right) { + [](MMFilesMarker const* left, MMFilesMarker const* right) { return (left->getTick() < right->getTick()); }); } diff --git a/arangod/MMFiles/MMFilesCompactorThread.cpp b/arangod/MMFiles/MMFilesCompactorThread.cpp index 29064604ad..8711a14b5c 100644 --- a/arangod/MMFiles/MMFilesCompactorThread.cpp +++ b/arangod/MMFiles/MMFilesCompactorThread.cpp @@ -243,13 +243,13 @@ int MMFilesCompactorThread::removeDatafile(LogicalCollection* collection, /// @brief calculate the target size for the compactor to be created MMFilesCompactorThread::CompactionInitialContext MMFilesCompactorThread::getCompactionContext( transaction::Methods* trx, LogicalCollection* collection, - std::vector const& toCompact) { + std::vector const& toCompact) { CompactionInitialContext context(trx, collection); // this is the minimum required size context._targetSize = - sizeof(TRI_df_header_marker_t) + sizeof(TRI_col_header_marker_t) + - sizeof(TRI_df_footer_marker_t) + 256; // allow for some overhead + sizeof(MMFilesDatafileHeaderMarker) + sizeof(MMFilesCollectionHeaderMarker) + + sizeof(MMFilesDatafileFooterMarker) + 256; // allow for some overhead size_t const n = toCompact.size(); @@ -271,12 +271,12 @@ MMFilesCompactorThread::CompactionInitialContext MMFilesCompactorThread::getComp context._keepDeletions = compaction._keepDeletions; /// @brief datafile iterator, calculates necessary total size - auto calculateSize = [&context](TRI_df_marker_t const* marker, MMFilesDatafile* datafile) -> bool { + auto calculateSize = [&context](MMFilesMarker const* marker, MMFilesDatafile* datafile) -> bool { LogicalCollection* collection = context._collection; TRI_ASSERT(collection != nullptr); auto physical = static_cast(collection->getPhysical()); TRI_ASSERT(physical != nullptr); - TRI_df_marker_type_t const type = marker->getType(); + MMFilesMarkerype_t const type = marker->getType(); // new or updated document if (type == TRI_DF_MARKER_VPACK_DOCUMENT) { @@ -287,12 +287,12 @@ MMFilesCompactorThread::CompactionInitialContext MMFilesCompactorThread::getComp // check if the document is still active auto primaryIndex = physical->primaryIndex(); - TRI_df_marker_t const* markerPtr = nullptr; + MMFilesMarker const* markerPtr = nullptr; MMFilesSimpleIndexElement element = primaryIndex->lookupKey(context._trx, keySlice); if (element) { MMFilesDocumentPosition const old = physical->lookupRevision(element.revisionId()); - markerPtr = reinterpret_cast( + markerPtr = reinterpret_cast( static_cast(old.dataptr()) - MMFilesDatafileHelper::VPackOffset(TRI_DF_MARKER_VPACK_DOCUMENT)); } @@ -353,7 +353,7 @@ MMFilesCompactorThread::CompactionInitialContext MMFilesCompactorThread::getComp /// @brief compact the specified datafiles void MMFilesCompactorThread::compactDatafiles(LogicalCollection* collection, - std::vector const& toCompact) { + std::vector const& toCompact) { TRI_ASSERT(collection != nullptr); auto physical = static_cast(collection->getPhysical()); TRI_ASSERT(physical != nullptr); @@ -368,10 +368,10 @@ void MMFilesCompactorThread::compactDatafiles(LogicalCollection* collection, /// file. /// IMPORTANT: if the logic inside this function is adjusted, the total size /// calculated by function CalculateSize might need adjustment, too!! - auto compactifier = [&context, &physical, this](TRI_df_marker_t const* marker, MMFilesDatafile* datafile) -> bool { + auto compactifier = [&context, &physical, this](MMFilesMarker const* marker, MMFilesDatafile* datafile) -> bool { TRI_voc_fid_t const targetFid = context->_compactor->fid(); - TRI_df_marker_type_t const type = marker->getType(); + MMFilesMarkerype_t const type = marker->getType(); // new or updated document if (type == TRI_DF_MARKER_VPACK_DOCUMENT) { @@ -382,11 +382,11 @@ void MMFilesCompactorThread::compactDatafiles(LogicalCollection* collection, // check if the document is still active auto primaryIndex = physical->primaryIndex(); - TRI_df_marker_t const* markerPtr = nullptr; + MMFilesMarker const* markerPtr = nullptr; MMFilesSimpleIndexElement element = primaryIndex->lookupKey(context->_trx, keySlice); if (element) { MMFilesDocumentPosition const old = physical->lookupRevision(element.revisionId()); - markerPtr = reinterpret_cast(static_cast(old.dataptr()) - MMFilesDatafileHelper::VPackOffset(TRI_DF_MARKER_VPACK_DOCUMENT)); + markerPtr = reinterpret_cast(static_cast(old.dataptr()) - MMFilesDatafileHelper::VPackOffset(TRI_DF_MARKER_VPACK_DOCUMENT)); } bool deleted = (markerPtr == nullptr || marker != markerPtr); @@ -401,7 +401,7 @@ void MMFilesCompactorThread::compactDatafiles(LogicalCollection* collection, context->_keepDeletions = true; // write to compactor files - TRI_df_marker_t* result; + MMFilesMarker* result; int res = copyMarker(context->_compactor, marker, &result); if (res != TRI_ERROR_NO_ERROR) { @@ -422,7 +422,7 @@ void MMFilesCompactorThread::compactDatafiles(LogicalCollection* collection, else if (type == TRI_DF_MARKER_VPACK_REMOVE) { if (context->_keepDeletions) { // write to compactor files - TRI_df_marker_t* result; + MMFilesMarker* result; int res = copyMarker(context->_compactor, marker, &result); if (res != TRI_ERROR_NO_ERROR) { @@ -661,7 +661,7 @@ bool MMFilesCompactorThread::compactCollection(LogicalCollection* collection, bo return false; } - std::vector toCompact; + std::vector toCompact; toCompact.reserve(maxFiles()); // now we have datafiles that we can process @@ -786,7 +786,7 @@ bool MMFilesCompactorThread::compactCollection(LogicalCollection* collection, bo LOG_TOPIC(DEBUG, Logger::COMPACTOR) << "found datafile #" << i << " eligible for compaction. fid: " << df->fid() << ", size: " << df->maximalSize() << ", reason: " << reason << ", numberDead: " << dfi.numberDead << ", numberAlive: " << dfi.numberAlive << ", numberDeletions: " << dfi.numberDeletions << ", numberUncollected: " << dfi.numberUncollected << ", sizeDead: " << dfi.sizeDead << ", sizeAlive: " << dfi.sizeAlive; totalSize += static_cast(df->maximalSize()); - compaction_info_t compaction; + CompactionInfo compaction; compaction._datafile = df; compaction._keepDeletions = (numAlive > 0 && i > 0); // TODO: verify that keepDeletions actually works with wrong numAlive stats @@ -999,8 +999,8 @@ uint64_t MMFilesCompactorThread::getNumberOfDocuments(LogicalCollection* collect } /// @brief write a copy of the marker into the datafile -int MMFilesCompactorThread::copyMarker(MMFilesDatafile* compactor, TRI_df_marker_t const* marker, - TRI_df_marker_t** result) { +int MMFilesCompactorThread::copyMarker(MMFilesDatafile* compactor, MMFilesMarker const* marker, + MMFilesMarker** result) { int res = compactor->reserveElement(marker->getSize(), result, 0); if (res != TRI_ERROR_NO_ERROR) { diff --git a/arangod/MMFiles/MMFilesCompactorThread.h b/arangod/MMFiles/MMFilesCompactorThread.h index a30c393184..5ef2030b6b 100644 --- a/arangod/MMFiles/MMFilesCompactorThread.h +++ b/arangod/MMFiles/MMFilesCompactorThread.h @@ -30,7 +30,7 @@ #include "VocBase/voc-types.h" struct MMFilesDatafile; -struct TRI_df_marker_t; +struct MMFilesMarker; struct TRI_vocbase_t; namespace arangodb { @@ -44,7 +44,7 @@ class Methods; class MMFilesCompactorThread final : public Thread { private: /// @brief compaction instruction for a single datafile - struct compaction_info_t { + struct CompactionInfo { MMFilesDatafile* _datafile; bool _keepDeletions; }; @@ -80,10 +80,10 @@ class MMFilesCompactorThread final : public Thread { /// @brief calculate the target size for the compactor to be created CompactionInitialContext getCompactionContext( transaction::Methods* trx, LogicalCollection* collection, - std::vector const& toCompact); + std::vector const& toCompact); /// @brief compact the specified datafiles - void compactDatafiles(LogicalCollection* collection, std::vector const&); + void compactDatafiles(LogicalCollection* collection, std::vector const&); /// @brief checks all datafiles of a collection bool compactCollection(LogicalCollection* collection, bool& wasBlocked); @@ -97,8 +97,8 @@ class MMFilesCompactorThread final : public Thread { uint64_t getNumberOfDocuments(LogicalCollection* collection); /// @brief write a copy of the marker into the datafile - int copyMarker(MMFilesDatafile* compactor, TRI_df_marker_t const* marker, - TRI_df_marker_t** result); + int copyMarker(MMFilesDatafile* compactor, MMFilesMarker const* marker, + MMFilesMarker** result); /// @brief wait time between compaction runs when idle static constexpr unsigned compactionSleepTime() { return 1000 * 1000; } diff --git a/arangod/MMFiles/MMFilesDatafile.cpp b/arangod/MMFiles/MMFilesDatafile.cpp index fae313f3b8..c2864b5ea1 100644 --- a/arangod/MMFiles/MMFilesDatafile.cpp +++ b/arangod/MMFiles/MMFilesDatafile.cpp @@ -111,7 +111,7 @@ static bool IsMarker28(void const* marker) { } /// @brief calculates the actual CRC of a marker, without bounds checks -static TRI_voc_crc_t CalculateCrcValue(TRI_df_marker_t const* marker) { +static TRI_voc_crc_t CalculateCrcValue(MMFilesMarker const* marker) { TRI_voc_size_t zero = 0; off_t o = marker->offsetOfCrc(); size_t n = sizeof(TRI_voc_crc_t); @@ -130,10 +130,10 @@ static TRI_voc_crc_t CalculateCrcValue(TRI_df_marker_t const* marker) { } /// @brief checks a CRC of a marker, with bounds checks -static bool CheckCrcMarker(TRI_df_marker_t const* marker, char const* end) { +static bool CheckCrcMarker(MMFilesMarker const* marker, char const* end) { TRI_voc_size_t const size = marker->getSize(); - if (size < sizeof(TRI_df_marker_t)) { + if (size < sizeof(MMFilesMarker)) { return false; } @@ -327,7 +327,7 @@ MMFilesDatafile* MMFilesDatafile::create(std::string const& filename, TRI_voc_fi (TRI_voc_size_t)(((maximalSize + pageSize - 1) / pageSize) * pageSize); // sanity check maximal size - if (sizeof(TRI_df_header_marker_t) + sizeof(TRI_df_footer_marker_t) > + if (sizeof(MMFilesDatafileHeaderMarker) + sizeof(MMFilesDatafileFooterMarker) > maximalSize) { LOG_TOPIC(ERR, arangodb::Logger::FIXME) << "cannot create datafile, maximal size '" << (unsigned int)maximalSize << "' is too small"; TRI_set_errno(TRI_ERROR_ARANGO_MAXIMAL_SIZE_TOO_SMALL); @@ -374,7 +374,7 @@ MMFilesDatafile* MMFilesDatafile::create(std::string const& filename, TRI_voc_fi /// @brief returns the name for a marker //////////////////////////////////////////////////////////////////////////////// -char const* TRI_NameMarkerDatafile(TRI_df_marker_type_t type) { +char const* TRI_NameMarkerDatafile(MMFilesMarkerype_t type) { switch (type) { // general markers case TRI_DF_MARKER_HEADER: @@ -429,13 +429,13 @@ char const* TRI_NameMarkerDatafile(TRI_df_marker_type_t type) { /// @brief checks whether a marker is valid //////////////////////////////////////////////////////////////////////////////// -bool TRI_IsValidMarkerDatafile(TRI_df_marker_t const* marker) { +bool TRI_IsValidMarkerDatafile(MMFilesMarker const* marker) { if (marker == nullptr) { return false; } // check marker type - TRI_df_marker_type_t const type = marker->getType(); + MMFilesMarkerype_t const type = marker->getType(); if (type <= TRI_DF_MARKER_MIN) { // marker type is less than minimum allowed type value @@ -460,7 +460,7 @@ bool TRI_IsValidMarkerDatafile(TRI_df_marker_t const* marker) { /// note: maximalJournalSize is the collection's maximalJournalSize property, /// which may be different from the size of the current datafile /// some callers do not set the value of maximalJournalSize -int MMFilesDatafile::reserveElement(TRI_voc_size_t size, TRI_df_marker_t** position, +int MMFilesDatafile::reserveElement(TRI_voc_size_t size, MMFilesMarker** position, TRI_voc_size_t maximalJournalSize) { *position = nullptr; size = encoding::alignedSize(size); @@ -508,7 +508,7 @@ int MMFilesDatafile::reserveElement(TRI_voc_size_t size, TRI_df_marker_t** posit return TRI_ERROR_ARANGO_DATAFILE_FULL; } - *position = reinterpret_cast(_next); + *position = reinterpret_cast(_next); TRI_ASSERT(*position != nullptr); @@ -566,7 +566,7 @@ int MMFilesDatafile::unlockFromMemory() { /// @brief writes a marker to the datafile /// this function will write the marker as-is, without any CRC or tick updates -int MMFilesDatafile::writeElement(void* position, TRI_df_marker_t const* marker, bool forceSync) { +int MMFilesDatafile::writeElement(void* position, MMFilesMarker const* marker, bool forceSync) { TRI_ASSERT(marker->getTick() > 0); TRI_ASSERT(marker->getSize() > 0); @@ -621,8 +621,8 @@ int MMFilesDatafile::writeElement(void* position, TRI_df_marker_t const* marker, //////////////////////////////////////////////////////////////////////////////// void TRI_UpdateTicksDatafile(MMFilesDatafile* datafile, - TRI_df_marker_t const* marker) { - TRI_df_marker_type_t const type = marker->getType(); + MMFilesMarker const* marker) { + MMFilesMarkerype_t const type = marker->getType(); if (type != TRI_DF_MARKER_HEADER && type != TRI_DF_MARKER_FOOTER && type != TRI_DF_MARKER_COL_HEADER) { @@ -652,7 +652,7 @@ void TRI_UpdateTicksDatafile(MMFilesDatafile* datafile, /// @brief checksums and writes a marker to the datafile //////////////////////////////////////////////////////////////////////////////// -int MMFilesDatafile::writeCrcElement(void* position, TRI_df_marker_t* marker, bool forceSync) { +int MMFilesDatafile::writeCrcElement(void* position, MMFilesMarker* marker, bool forceSync) { TRI_ASSERT(marker->getTick() != 0); if (isPhysical()) { @@ -672,7 +672,7 @@ int MMFilesDatafile::writeCrcElement(void* position, TRI_df_marker_t* marker, bo //////////////////////////////////////////////////////////////////////////////// bool TRI_IterateDatafile(MMFilesDatafile* datafile, - bool (*iterator)(TRI_df_marker_t const*, void*, + bool (*iterator)(MMFilesMarker const*, void*, MMFilesDatafile*), void* data) { TRI_ASSERT(iterator != nullptr); @@ -692,7 +692,7 @@ bool TRI_IterateDatafile(MMFilesDatafile* datafile, TRI_DEFER(TRI_UpdateTickServer(maxTick)); while (ptr < end) { - auto const* marker = reinterpret_cast(ptr); + auto const* marker = reinterpret_cast(ptr); if (marker->getSize() == 0) { return true; @@ -720,7 +720,7 @@ bool TRI_IterateDatafile(MMFilesDatafile* datafile, /// @brief iterates over a datafile /// also may set datafile's min/max tick values bool TRI_IterateDatafile(MMFilesDatafile* datafile, - std::function const& cb) { + std::function const& cb) { LOG_TOPIC(TRACE, arangodb::Logger::FIXME) << "iterating over datafile '" << datafile->getName() << "', fid: " << datafile->fid(); char const* ptr = datafile->data(); @@ -736,7 +736,7 @@ bool TRI_IterateDatafile(MMFilesDatafile* datafile, TRI_DEFER(TRI_UpdateTickServer(maxTick)); while (ptr < end) { - auto const* marker = reinterpret_cast(ptr); + auto const* marker = reinterpret_cast(ptr); if (marker->getSize() == 0) { return true; @@ -807,12 +807,12 @@ int MMFilesDatafile::seal() { } // create the footer - TRI_df_footer_marker_t footer = MMFilesDatafileHelper::CreateFooterMarker(_tickMax); + MMFilesDatafileFooterMarker footer = MMFilesDatafileHelper::CreateFooterMarker(_tickMax); // reserve space and write footer to file _footerSize = 0; - TRI_df_marker_t* position; + MMFilesMarker* position; int res = reserveElement(footer.base.getSize(), &position, 0); if (res == TRI_ERROR_NO_ERROR) { @@ -907,7 +907,7 @@ bool MMFilesDatafile::tryRepair(std::string const& path) { /// @brief diagnoses a marker //////////////////////////////////////////////////////////////////////////////// -static std::string DiagnoseMarker(TRI_df_marker_t const* marker, +static std::string DiagnoseMarker(MMFilesMarker const* marker, char const* end) { std::ostringstream result; @@ -916,7 +916,7 @@ static std::string DiagnoseMarker(TRI_df_marker_t const* marker, } // check marker type - TRI_df_marker_type_t type = marker->getType(); + MMFilesMarkerype_t type = marker->getType(); if (type <= TRI_DF_MARKER_MIN) { // marker type is less than minimum allowed type value @@ -943,9 +943,9 @@ static std::string DiagnoseMarker(TRI_df_marker_t const* marker, return result.str(); } - if (size < sizeof(TRI_df_marker_t)) { + if (size < sizeof(MMFilesMarker)) { result << "marker size is too small (" << size - << "). expecting at least " << sizeof(TRI_df_marker_t) << " bytes"; + << "). expecting at least " << sizeof(MMFilesMarker) << " bytes"; return result.str(); } @@ -975,7 +975,7 @@ MMFilesDatafile::MMFilesDatafile(std::string const& filename, int fd, void* mmHa _initSize(maximalSize), _maximalSize(maximalSize), _currentSize(currentSize), - _footerSize(sizeof(TRI_df_footer_marker_t)), + _footerSize(sizeof(MMFilesDatafileFooterMarker)), _full(false), _isSealed(false), _lockedInMemory(false), @@ -1092,11 +1092,11 @@ int MMFilesDatafile::truncateAndSeal(TRI_voc_size_t position) { // use multiples of page-size size_t maximalSize = - ((position + sizeof(TRI_df_footer_marker_t) + pageSize - 1) / pageSize) * + ((position + sizeof(MMFilesDatafileFooterMarker) + pageSize - 1) / pageSize) * pageSize; // sanity check - if (sizeof(TRI_df_header_marker_t) + sizeof(TRI_df_footer_marker_t) > + if (sizeof(MMFilesDatafileHeaderMarker) + sizeof(MMFilesDatafileFooterMarker) > maximalSize) { LOG_TOPIC(ERR, arangodb::Logger::FIXME) << "cannot create datafile '" << getName() << "', maximal size " << maximalSize << " is too small"; return TRI_ERROR_ARANGO_MAXIMAL_SIZE_TOO_SMALL; @@ -1247,10 +1247,10 @@ bool MMFilesDatafile::check(bool ignoreFailures) { TRI_DEFER(TRI_UpdateTickServer(maxTick)); while (ptr < end) { - TRI_df_marker_t const* marker = reinterpret_cast(ptr); + MMFilesMarker const* marker = reinterpret_cast(ptr); TRI_voc_size_t const size = marker->getSize(); TRI_voc_tick_t const tick = marker->getTick(); - TRI_df_marker_type_t const type = marker->getType(); + MMFilesMarkerype_t const type = marker->getType(); #ifdef DEBUG_DATAFILE LOG_TOPIC(TRACE, arangodb::Logger::FIXME) << "MARKER: size " << size << ", tick " << tick << ", crc " << marker->getCrc() << ", type " << type; @@ -1265,7 +1265,7 @@ bool MMFilesDatafile::check(bool ignoreFailures) { return true; } - if (size < sizeof(TRI_df_marker_t)) { + if (size < sizeof(MMFilesMarker)) { if (ignoreFailures) { return fix(currentSize); } @@ -1275,7 +1275,7 @@ bool MMFilesDatafile::check(bool ignoreFailures) { _next = _data + _currentSize; _state = TRI_DF_STATE_OPEN_ERROR; - LOG_TOPIC(WARN, arangodb::Logger::FIXME) << "marker in datafile '" << getName() << "' too small, size " << size << ", should be at least " << sizeof(TRI_df_marker_t); + LOG_TOPIC(WARN, arangodb::Logger::FIXME) << "marker in datafile '" << getName() << "' too small, size " << size << ", should be at least " << sizeof(MMFilesMarker); return false; } @@ -1360,10 +1360,10 @@ bool MMFilesDatafile::check(bool ignoreFailures) { if (next < end) { // there is a next marker auto nextMarker = - reinterpret_cast(next); + reinterpret_cast(next); if (nextMarker->getType() != 0 && - nextMarker->getSize() >= sizeof(TRI_df_marker_t) && + nextMarker->getSize() >= sizeof(MMFilesMarker) && next + nextMarker->getSize() <= end && TRI_IsValidMarkerDatafile(nextMarker) && CheckCrcMarker(nextMarker, end)) { @@ -1436,7 +1436,7 @@ bool MMFilesDatafile::check(bool ignoreFailures) { return true; } -void MMFilesDatafile::printMarker(TRI_df_marker_t const* marker, TRI_voc_size_t size, char const* begin, char const* end) const { +void MMFilesDatafile::printMarker(MMFilesMarker const* marker, TRI_voc_size_t size, char const* begin, char const* end) const { LOG_TOPIC(INFO, arangodb::Logger::FIXME) << "raw marker data following:"; LOG_TOPIC(INFO, arangodb::Logger::FIXME) << "type: " << TRI_NameMarkerDatafile(marker) << ", size: " << marker->getSize() << ", crc: " << marker->getCrc(); LOG_TOPIC(INFO, arangodb::Logger::FIXME) << "(expected layout: size (4 bytes), crc (4 bytes), type and tick (8 bytes), payload following)"; @@ -1529,7 +1529,7 @@ DatafileScan MMFilesDatafile::scanHelper() { } while (ptr < end) { - TRI_df_marker_t* marker = reinterpret_cast(ptr); + MMFilesMarker* marker = reinterpret_cast(ptr); DatafileScanEntry entry; entry.position = static_cast(ptr - _data); @@ -1560,7 +1560,7 @@ DatafileScan MMFilesDatafile::scanHelper() { return scan; } - if (marker->getSize() < sizeof(TRI_df_marker_t)) { + if (marker->getSize() < sizeof(MMFilesMarker)) { entry.status = 4; entry.diagnosis = DiagnoseMarker(marker, end); @@ -1591,7 +1591,7 @@ DatafileScan MMFilesDatafile::scanHelper() { scan.status = 4; } - TRI_df_marker_type_t const type = marker->getType(); + MMFilesMarkerype_t const type = marker->getType(); if (type == TRI_DF_MARKER_VPACK_DOCUMENT || type == TRI_DF_MARKER_VPACK_REMOVE) { @@ -1620,11 +1620,11 @@ DatafileScan MMFilesDatafile::scanHelper() { /// @brief create the initial datafile header marker int MMFilesDatafile::writeInitialHeaderMarker(TRI_voc_fid_t fid, TRI_voc_size_t maximalSize) { // create the header - TRI_df_header_marker_t header = MMFilesDatafileHelper::CreateHeaderMarker( + MMFilesDatafileHeaderMarker header = MMFilesDatafileHelper::CreateHeaderMarker( maximalSize, static_cast(fid)); // reserve space and write header to file - TRI_df_marker_t* position; + MMFilesMarker* position; int res = reserveElement(header.base.getSize(), &position, 0); if (res == TRI_ERROR_NO_ERROR) { @@ -1650,7 +1650,7 @@ bool MMFilesDatafile::tryRepair() { TRI_voc_size_t currentSize = 0; while (ptr < end) { - TRI_df_marker_t* marker = reinterpret_cast(ptr); + MMFilesMarker* marker = reinterpret_cast(ptr); TRI_voc_size_t const size = marker->getSize(); if (size == 0) { @@ -1658,7 +1658,7 @@ bool MMFilesDatafile::tryRepair() { return true; } - if (size < sizeof(TRI_df_marker_t) || ptr + size > end) { + if (size < sizeof(MMFilesMarker) || ptr + size > end) { // marker too small or too big return false; } @@ -1698,10 +1698,10 @@ bool MMFilesDatafile::tryRepair() { if (next < end) { // there is a next marker - auto nextMarker = reinterpret_cast(next); + auto nextMarker = reinterpret_cast(next); if (nextMarker->getType() != 0 && - nextMarker->getSize() >= sizeof(TRI_df_marker_t) && + nextMarker->getSize() >= sizeof(MMFilesMarker) && next + nextMarker->getSize() <= end && TRI_IsValidMarkerDatafile(nextMarker) && CheckCrcMarker(nextMarker, end)) { @@ -1711,9 +1711,9 @@ bool MMFilesDatafile::tryRepair() { auto buffer = std::unique_ptr(new char[size]); // create a new marker in the temporary buffer - auto temp = reinterpret_cast(buffer.get()); + auto temp = reinterpret_cast(buffer.get()); MMFilesDatafileHelper::InitMarker( - reinterpret_cast(buffer.get()), TRI_DF_MARKER_BLANK, + reinterpret_cast(buffer.get()), TRI_DF_MARKER_BLANK, static_cast(size)); temp->setCrc(CalculateCrcValue(temp)); @@ -1831,7 +1831,7 @@ MMFilesDatafile* MMFilesDatafile::openHelper(std::string const& filename, bool i // check that file is not too small TRI_voc_size_t size = static_cast(status.st_size); - if (size < sizeof(TRI_df_header_marker_t) + sizeof(TRI_df_footer_marker_t)) { + if (size < sizeof(MMFilesDatafileHeaderMarker) + sizeof(MMFilesDatafileFooterMarker)) { TRI_set_errno(TRI_ERROR_ARANGO_CORRUPTED_DATAFILE); TRI_CLOSE(fd); @@ -1844,7 +1844,7 @@ MMFilesDatafile* MMFilesDatafile::openHelper(std::string const& filename, bool i char buffer[128]; memset(&buffer[0], 0, sizeof(buffer)); - ssize_t len = sizeof(TRI_df_header_marker_t); + ssize_t len = sizeof(MMFilesDatafileHeaderMarker); ssize_t toRead = sizeof(buffer); if (toRead > static_cast(status.st_size)) { @@ -1862,10 +1862,10 @@ MMFilesDatafile* MMFilesDatafile::openHelper(std::string const& filename, bool i char const* ptr = reinterpret_cast(&buffer[0]); char const* end = static_cast(ptr) + len; - TRI_df_header_marker_t const* header = reinterpret_cast(&buffer[0]); + MMFilesDatafileHeaderMarker const* header = reinterpret_cast(&buffer[0]); // check CRC - ok = CheckCrcMarker(reinterpret_cast(ptr), end); + ok = CheckCrcMarker(reinterpret_cast(ptr), end); if (!ok) { if (IsMarker28(ptr)) { diff --git a/arangod/MMFiles/MMFilesDatafile.h b/arangod/MMFiles/MMFilesDatafile.h index 5eee023866..61072ed509 100644 --- a/arangod/MMFiles/MMFilesDatafile.h +++ b/arangod/MMFiles/MMFilesDatafile.h @@ -27,7 +27,7 @@ #include "Basics/Common.h" #include "VocBase/vocbase.h" -struct TRI_df_marker_t; +struct MMFilesMarker; /// @brief state of the datafile enum TRI_df_state_e { @@ -40,7 +40,7 @@ enum TRI_df_state_e { }; /// @brief type of the marker -enum TRI_df_marker_type_t : uint8_t { +enum MMFilesMarkerype_t : uint8_t { TRI_DF_MARKER_MIN = 9, // not a real marker type, // but used for bounds checking @@ -93,7 +93,7 @@ struct DatafileScanEntry { TRI_voc_size_t realSize; TRI_voc_tick_t tick; - TRI_df_marker_type_t type; + MMFilesMarkerype_t type; uint32_t status; char const* typeName; @@ -133,17 +133,17 @@ struct DatafileScan { /// /// @section DatafileMarker Datafile Marker /// -/// @copydetails TRI_df_marker_t +/// @copydetails MMFilesMarker /// -/// @copydetails TRI_df_header_marker_t +/// @copydetails MMFilesDatafileHeaderMarker /// -/// @copydetails TRI_df_footer_marker_t +/// @copydetails MMFilesDatafileFooterMarker /// /// A datafile is therefore structured as follows: /// /// /// -/// +/// /// /// /// @@ -163,7 +163,7 @@ struct DatafileScan { /// /// /// -/// +/// /// /// ///
TRI_df_header_marker_tMMFilesDatafileHeaderMarkerheader entry
data entry
TRI_df_footer_marker_tMMFilesDatafileFooterMarkerfooter entry
@@ -228,13 +228,13 @@ struct MMFilesDatafile { /// @brief writes a marker to the datafile /// this function will write the marker as-is, without any CRC or tick updates - int writeElement(void* position, TRI_df_marker_t const* marker, bool sync); + int writeElement(void* position, MMFilesMarker const* marker, bool sync); /// @brief checksums and writes a marker to the datafile - int writeCrcElement(void* position, TRI_df_marker_t* marker, bool sync); + int writeCrcElement(void* position, MMFilesMarker* marker, bool sync); /// @brief reserves room for an element, advances the pointer - int reserveElement(TRI_voc_size_t size, TRI_df_marker_t** position, + int reserveElement(TRI_voc_size_t size, MMFilesMarker** position, TRI_voc_size_t maximalJournalSize); void sequentialAccess(); @@ -291,7 +291,7 @@ struct MMFilesDatafile { /// @brief tries to repair a datafile bool tryRepair(); - void printMarker(TRI_df_marker_t const* marker, TRI_voc_size_t size, char const* begin, char const* end) const; + void printMarker(MMFilesMarker const* marker, TRI_voc_size_t size, char const* begin, char const* end) const; private: std::string _filename; // underlying filename @@ -351,9 +351,9 @@ struct MMFilesDatafile { /// the field _crc is equal to 0. /// /// -/// TRI_df_marker_type_t +/// MMFilesMarkerype_t /// _type -/// see @ref TRI_df_marker_type_t +/// see @ref MMFilesMarkerype_t /// /// /// TRI_voc_tick_t @@ -368,24 +368,24 @@ struct MMFilesDatafile { /// and _crc the second. //////////////////////////////////////////////////////////////////////////////// -struct TRI_df_marker_t { +struct MMFilesMarker { private: TRI_voc_size_t _size; // 4 bytes TRI_voc_crc_t _crc; // 4 bytes, generated uint64_t _typeAndTick; // 8 bytes, including 1 byte for type and 7 bytes for tick public: - TRI_df_marker_t() : _size(0), _crc(0), _typeAndTick(0) {} - ~TRI_df_marker_t() {} + MMFilesMarker() : _size(0), _crc(0), _typeAndTick(0) {} + ~MMFilesMarker() {} inline off_t offsetOfSize() const noexcept { - return offsetof(TRI_df_marker_t, _size); + return offsetof(MMFilesMarker, _size); } inline off_t offsetOfCrc() const noexcept { - return offsetof(TRI_df_marker_t, _crc); + return offsetof(MMFilesMarker, _crc); } inline off_t offsetOfTypeAndTick() const noexcept { - return offsetof(TRI_df_marker_t, _typeAndTick); + return offsetof(MMFilesMarker, _typeAndTick); } inline TRI_voc_size_t getSize() const noexcept { return _size; } inline void setSize(TRI_voc_size_t size) noexcept { _size = size; } @@ -400,15 +400,15 @@ struct TRI_df_marker_t { _typeAndTick &= 0xff00000000000000ULL; _typeAndTick |= tick & 0x00ffffffffffffffULL; } - inline TRI_df_marker_type_t getType() const noexcept { - return static_cast((_typeAndTick & 0xff00000000000000ULL) >> 56); + inline MMFilesMarkerype_t getType() const noexcept { + return static_cast((_typeAndTick & 0xff00000000000000ULL) >> 56); } - inline void setType(TRI_df_marker_type_t type) noexcept { + inline void setType(MMFilesMarkerype_t type) noexcept { uint64_t t = static_cast(type) << 56; _typeAndTick &= 0x00ffffffffffffffULL; _typeAndTick |= t; } - inline void setTypeAndTick(TRI_df_marker_type_t type, TRI_voc_tick_t tick) noexcept { + inline void setTypeAndTick(MMFilesMarkerype_t type, TRI_voc_tick_t tick) noexcept { uint64_t t = static_cast(type) << 56; t |= (tick & 0x00ffffffffffffffULL); _typeAndTick = t; @@ -416,12 +416,12 @@ struct TRI_df_marker_t { }; -static_assert(sizeof(TRI_df_marker_t) == 16, "invalid size for TRI_df_marker_t"); +static_assert(sizeof(MMFilesMarker) == 16, "invalid size for MMFilesMarker"); //////////////////////////////////////////////////////////////////////////////// /// @brief datafile header marker /// -/// The first blob entry in a datafile is always a TRI_df_header_marker_t. +/// The first blob entry in a datafile is always a MMFilesDatafileHeaderMarker. /// The header marker contains the version number of the datafile, its /// maximal size and the creation time. There is no data payload. /// @@ -448,8 +448,8 @@ static_assert(sizeof(TRI_df_marker_t) == 16, "invalid size for TRI_df_marker_t") /// //////////////////////////////////////////////////////////////////////////////// -struct TRI_df_header_marker_t { - TRI_df_marker_t base; // 16 bytes +struct MMFilesDatafileHeaderMarker { + MMFilesMarker base; // 16 bytes TRI_df_version_t _version; // 4 bytes TRI_voc_size_t _maximalSize; // 4 bytes @@ -457,21 +457,21 @@ struct TRI_df_header_marker_t { }; /// @brief datafile prologue marker -struct TRI_df_prologue_marker_t { - TRI_df_marker_t base; // 16 bytes +struct MMFilesPrologueMarker { + MMFilesMarker base; // 16 bytes TRI_voc_tick_t _databaseId; // 8 bytes TRI_voc_cid_t _collectionId; // 8 bytes }; /// @brief datafile footer marker -struct TRI_df_footer_marker_t { - TRI_df_marker_t base; // 16 bytes +struct MMFilesDatafileFooterMarker { + MMFilesMarker base; // 16 bytes }; /// @brief document datafile header marker -struct TRI_col_header_marker_t { - TRI_df_marker_t base; // 16 bytes +struct MMFilesCollectionHeaderMarker { + MMFilesMarker base; // 16 bytes TRI_voc_cid_t _cid; // 8 bytes }; @@ -480,9 +480,9 @@ struct TRI_col_header_marker_t { /// @brief returns the name for a marker //////////////////////////////////////////////////////////////////////////////// -char const* TRI_NameMarkerDatafile(TRI_df_marker_type_t); +char const* TRI_NameMarkerDatafile(MMFilesMarkerype_t); -static inline char const* TRI_NameMarkerDatafile(TRI_df_marker_t const* marker) { +static inline char const* TRI_NameMarkerDatafile(MMFilesMarker const* marker) { return TRI_NameMarkerDatafile(marker->getType()); } @@ -490,13 +490,13 @@ static inline char const* TRI_NameMarkerDatafile(TRI_df_marker_t const* marker) /// @brief checks whether a marker is valid //////////////////////////////////////////////////////////////////////////////// -bool TRI_IsValidMarkerDatafile(TRI_df_marker_t const*); +bool TRI_IsValidMarkerDatafile(MMFilesMarker const*); //////////////////////////////////////////////////////////////////////////////// /// @brief update tick values for a datafile //////////////////////////////////////////////////////////////////////////////// -void TRI_UpdateTicksDatafile(MMFilesDatafile*, TRI_df_marker_t const*); +void TRI_UpdateTicksDatafile(MMFilesDatafile*, MMFilesMarker const*); //////////////////////////////////////////////////////////////////////////////// /// @brief iterates over a datafile @@ -504,11 +504,11 @@ void TRI_UpdateTicksDatafile(MMFilesDatafile*, TRI_df_marker_t const*); //////////////////////////////////////////////////////////////////////////////// bool TRI_IterateDatafile(MMFilesDatafile*, - bool (*iterator)(TRI_df_marker_t const*, void*, + bool (*iterator)(MMFilesMarker const*, void*, MMFilesDatafile*), void* data); bool TRI_IterateDatafile(MMFilesDatafile*, - std::function const& cb); + std::function const& cb); #endif diff --git a/arangod/MMFiles/MMFilesDatafileHelper.h b/arangod/MMFiles/MMFilesDatafileHelper.h index 74c19fac4f..d9f07b6547 100644 --- a/arangod/MMFiles/MMFilesDatafileHelper.h +++ b/arangod/MMFiles/MMFilesDatafileHelper.h @@ -53,7 +53,7 @@ constexpr inline TRI_voc_size_t MaximalMarkerSize() { //////////////////////////////////////////////////////////////////////////////// constexpr inline TRI_voc_size_t JournalOverhead() { - return sizeof(TRI_df_header_marker_t) + sizeof(TRI_df_footer_marker_t); + return sizeof(MMFilesDatafileHeaderMarker) + sizeof(MMFilesDatafileFooterMarker); } //////////////////////////////////////////////////////////////////////////////// @@ -61,7 +61,7 @@ constexpr inline TRI_voc_size_t JournalOverhead() { //////////////////////////////////////////////////////////////////////////////// template -static inline T AlignedMarkerSize(TRI_df_marker_t const* marker) { +static inline T AlignedMarkerSize(MMFilesMarker const* marker) { size_t value = marker->getSize(); return static_cast((value + 7) - ((value + 7) & 7)); } @@ -72,11 +72,11 @@ static inline T AlignedMarkerSize(TRI_df_marker_t const* marker) { /// marker type //////////////////////////////////////////////////////////////////////////////// -static inline size_t VPackOffset(TRI_df_marker_type_t type) noexcept { +static inline size_t VPackOffset(MMFilesMarkerype_t type) noexcept { if (type == TRI_DF_MARKER_VPACK_DOCUMENT || type == TRI_DF_MARKER_VPACK_REMOVE) { // VPack is located after transaction id - return sizeof(TRI_df_marker_t) + sizeof(TRI_voc_tid_t); + return sizeof(MMFilesMarker) + sizeof(TRI_voc_tid_t); } if (type == TRI_DF_MARKER_VPACK_CREATE_COLLECTION || type == TRI_DF_MARKER_VPACK_DROP_COLLECTION || @@ -88,22 +88,22 @@ static inline size_t VPackOffset(TRI_df_marker_type_t type) noexcept { type == TRI_DF_MARKER_VPACK_DROP_VIEW || type == TRI_DF_MARKER_VPACK_CHANGE_VIEW) { // VPack is located after database id and collection id - return sizeof(TRI_df_marker_t) + sizeof(TRI_voc_tick_t) + sizeof(TRI_voc_cid_t); + return sizeof(MMFilesMarker) + sizeof(TRI_voc_tick_t) + sizeof(TRI_voc_cid_t); } if (type == TRI_DF_MARKER_VPACK_CREATE_DATABASE || type == TRI_DF_MARKER_VPACK_DROP_DATABASE) { // VPack is located after database id - return sizeof(TRI_df_marker_t) + sizeof(TRI_voc_tick_t); + return sizeof(MMFilesMarker) + sizeof(TRI_voc_tick_t); } if (type == TRI_DF_MARKER_VPACK_BEGIN_TRANSACTION || type == TRI_DF_MARKER_VPACK_COMMIT_TRANSACTION || type == TRI_DF_MARKER_VPACK_ABORT_TRANSACTION) { // these marker types do not have any VPack - return sizeof(TRI_df_marker_t) + sizeof(TRI_voc_tick_t) + sizeof(TRI_voc_tid_t); + return sizeof(MMFilesMarker) + sizeof(TRI_voc_tick_t) + sizeof(TRI_voc_tid_t); } if (type == TRI_DF_MARKER_PROLOGUE) { // this type does not have any VPack - return sizeof(TRI_df_marker_t) + sizeof(TRI_voc_tick_t) + sizeof(TRI_voc_cid_t); + return sizeof(MMFilesMarker) + sizeof(TRI_voc_tick_t) + sizeof(TRI_voc_cid_t); } return 0; } @@ -112,7 +112,7 @@ static inline size_t VPackOffset(TRI_df_marker_type_t type) noexcept { /// @brief returns the marker-specific database id offset //////////////////////////////////////////////////////////////////////////////// -static inline size_t DatabaseIdOffset(TRI_df_marker_type_t type) noexcept { +static inline size_t DatabaseIdOffset(MMFilesMarkerype_t type) noexcept { if (type == TRI_DF_MARKER_PROLOGUE || type == TRI_DF_MARKER_VPACK_CREATE_COLLECTION || type == TRI_DF_MARKER_VPACK_DROP_COLLECTION || @@ -128,7 +128,7 @@ static inline size_t DatabaseIdOffset(TRI_df_marker_type_t type) noexcept { type == TRI_DF_MARKER_VPACK_BEGIN_TRANSACTION || type == TRI_DF_MARKER_VPACK_COMMIT_TRANSACTION || type == TRI_DF_MARKER_VPACK_ABORT_TRANSACTION) { - return sizeof(TRI_df_marker_t); + return sizeof(MMFilesMarker); } return 0; } @@ -137,8 +137,8 @@ static inline size_t DatabaseIdOffset(TRI_df_marker_type_t type) noexcept { /// @brief returns the marker-specific database id //////////////////////////////////////////////////////////////////////////////// -static inline TRI_voc_tick_t DatabaseId(TRI_df_marker_t const* marker) noexcept { - TRI_df_marker_type_t type = marker->getType(); +static inline TRI_voc_tick_t DatabaseId(MMFilesMarker const* marker) noexcept { + MMFilesMarkerype_t type = marker->getType(); if (type == TRI_DF_MARKER_PROLOGUE || type == TRI_DF_MARKER_VPACK_CREATE_COLLECTION || type == TRI_DF_MARKER_VPACK_DROP_COLLECTION || @@ -163,7 +163,7 @@ static inline TRI_voc_tick_t DatabaseId(TRI_df_marker_t const* marker) noexcept /// @brief returns the marker-specific collection id offset //////////////////////////////////////////////////////////////////////////////// -static inline size_t CollectionIdOffset(TRI_df_marker_type_t type) noexcept { +static inline size_t CollectionIdOffset(MMFilesMarkerype_t type) noexcept { if (type == TRI_DF_MARKER_PROLOGUE || type == TRI_DF_MARKER_VPACK_CREATE_COLLECTION || type == TRI_DF_MARKER_VPACK_DROP_COLLECTION || @@ -171,7 +171,7 @@ static inline size_t CollectionIdOffset(TRI_df_marker_type_t type) noexcept { type == TRI_DF_MARKER_VPACK_CHANGE_COLLECTION || type == TRI_DF_MARKER_VPACK_CREATE_INDEX || type == TRI_DF_MARKER_VPACK_DROP_INDEX) { - return sizeof(TRI_df_marker_t) + sizeof(TRI_voc_tick_t); + return sizeof(MMFilesMarker) + sizeof(TRI_voc_tick_t); } return 0; } @@ -180,8 +180,8 @@ static inline size_t CollectionIdOffset(TRI_df_marker_type_t type) noexcept { /// @brief returns the marker-specific collection id //////////////////////////////////////////////////////////////////////////////// -static inline TRI_voc_tick_t CollectionId(TRI_df_marker_t const* marker) noexcept { - TRI_df_marker_type_t type = marker->getType(); +static inline TRI_voc_tick_t CollectionId(MMFilesMarker const* marker) noexcept { + MMFilesMarkerype_t type = marker->getType(); if (type == TRI_DF_MARKER_PROLOGUE || type == TRI_DF_MARKER_VPACK_CREATE_COLLECTION || type == TRI_DF_MARKER_VPACK_DROP_COLLECTION || @@ -198,11 +198,11 @@ static inline TRI_voc_tick_t CollectionId(TRI_df_marker_t const* marker) noexcep /// @brief returns the marker-specific view id offset //////////////////////////////////////////////////////////////////////////////// -static inline size_t ViewIdOffset(TRI_df_marker_type_t type) noexcept { +static inline size_t ViewIdOffset(MMFilesMarkerype_t type) noexcept { if (type == TRI_DF_MARKER_VPACK_CREATE_VIEW || type == TRI_DF_MARKER_VPACK_DROP_VIEW || type == TRI_DF_MARKER_VPACK_CHANGE_VIEW) { - return sizeof(TRI_df_marker_t) + sizeof(TRI_voc_tick_t); + return sizeof(MMFilesMarker) + sizeof(TRI_voc_tick_t); } return 0; } @@ -211,8 +211,8 @@ static inline size_t ViewIdOffset(TRI_df_marker_type_t type) noexcept { /// @brief returns the marker-specific view id //////////////////////////////////////////////////////////////////////////////// -static inline TRI_voc_tick_t ViewId(TRI_df_marker_t const* marker) noexcept { - TRI_df_marker_type_t type = marker->getType(); +static inline TRI_voc_tick_t ViewId(MMFilesMarker const* marker) noexcept { + MMFilesMarkerype_t type = marker->getType(); if (type == TRI_DF_MARKER_VPACK_CREATE_VIEW || type == TRI_DF_MARKER_VPACK_DROP_VIEW || type == TRI_DF_MARKER_VPACK_CHANGE_VIEW) { @@ -225,15 +225,15 @@ static inline TRI_voc_tick_t ViewId(TRI_df_marker_t const* marker) noexcept { /// @brief returns the marker-specific transaction id offset //////////////////////////////////////////////////////////////////////////////// -static inline TRI_voc_tick_t TransactionIdOffset(TRI_df_marker_type_t type) noexcept { +static inline TRI_voc_tick_t TransactionIdOffset(MMFilesMarkerype_t type) noexcept { if (type == TRI_DF_MARKER_VPACK_DOCUMENT || type == TRI_DF_MARKER_VPACK_REMOVE) { - return sizeof(TRI_df_marker_t); + return sizeof(MMFilesMarker); } if (type == TRI_DF_MARKER_VPACK_BEGIN_TRANSACTION || type == TRI_DF_MARKER_VPACK_COMMIT_TRANSACTION || type == TRI_DF_MARKER_VPACK_ABORT_TRANSACTION) { - return sizeof(TRI_df_marker_t) + sizeof(TRI_voc_tick_t); + return sizeof(MMFilesMarker) + sizeof(TRI_voc_tick_t); } return 0; } @@ -242,8 +242,8 @@ static inline TRI_voc_tick_t TransactionIdOffset(TRI_df_marker_type_t type) noex /// @brief returns the marker-specific transaction id //////////////////////////////////////////////////////////////////////////////// -static inline TRI_voc_tick_t TransactionId(TRI_df_marker_t const* marker) noexcept { - TRI_df_marker_type_t type = marker->getType(); +static inline TRI_voc_tick_t TransactionId(MMFilesMarker const* marker) noexcept { + MMFilesMarkerype_t type = marker->getType(); if (type == TRI_DF_MARKER_VPACK_DOCUMENT || type == TRI_DF_MARKER_VPACK_REMOVE || type == TRI_DF_MARKER_VPACK_BEGIN_TRANSACTION || @@ -258,8 +258,8 @@ static inline TRI_voc_tick_t TransactionId(TRI_df_marker_t const* marker) noexce /// @brief initializes a marker, using user-defined tick //////////////////////////////////////////////////////////////////////////////// -static inline void InitMarker(TRI_df_marker_t* marker, - TRI_df_marker_type_t type, uint32_t size, TRI_voc_tick_t tick) { +static inline void InitMarker(MMFilesMarker* marker, + MMFilesMarkerype_t type, uint32_t size, TRI_voc_tick_t tick) { TRI_ASSERT(marker != nullptr); TRI_ASSERT(type > TRI_DF_MARKER_MIN && type < TRI_DF_MARKER_MAX); TRI_ASSERT(size > 0); @@ -273,8 +273,8 @@ static inline void InitMarker(TRI_df_marker_t* marker, /// @brief initializes a marker, using tick 0 //////////////////////////////////////////////////////////////////////////////// -static inline void InitMarker(TRI_df_marker_t* marker, - TRI_df_marker_type_t type, uint32_t size) { +static inline void InitMarker(MMFilesMarker* marker, + MMFilesMarkerype_t type, uint32_t size) { InitMarker(marker, type, size, 0); // always use tick 0 } @@ -282,11 +282,11 @@ static inline void InitMarker(TRI_df_marker_t* marker, /// @brief create a header marker //////////////////////////////////////////////////////////////////////////////// -static inline TRI_df_header_marker_t CreateHeaderMarker(TRI_voc_size_t maximalSize, TRI_voc_tick_t fid) { +static inline MMFilesDatafileHeaderMarker CreateHeaderMarker(TRI_voc_size_t maximalSize, TRI_voc_tick_t fid) { static_assert(sizeof(TRI_voc_tick_t) == sizeof(TRI_voc_fid_t), "invalid tick/fid sizes"); - TRI_df_header_marker_t header; - InitMarker(reinterpret_cast(&header), TRI_DF_MARKER_HEADER, sizeof(TRI_df_header_marker_t), fid); + MMFilesDatafileHeaderMarker header; + InitMarker(reinterpret_cast(&header), TRI_DF_MARKER_HEADER, sizeof(MMFilesDatafileHeaderMarker), fid); header._version = TRI_DF_VERSION; header._maximalSize = maximalSize; @@ -299,9 +299,9 @@ static inline TRI_df_header_marker_t CreateHeaderMarker(TRI_voc_size_t maximalSi /// @brief create a prologue marker //////////////////////////////////////////////////////////////////////////////// -static inline TRI_df_prologue_marker_t CreatePrologueMarker(TRI_voc_tick_t databaseId, TRI_voc_cid_t collectionId) { - TRI_df_prologue_marker_t header; - InitMarker(reinterpret_cast(&header), TRI_DF_MARKER_PROLOGUE, sizeof(TRI_df_prologue_marker_t)); +static inline MMFilesPrologueMarker CreatePrologueMarker(TRI_voc_tick_t databaseId, TRI_voc_cid_t collectionId) { + MMFilesPrologueMarker header; + InitMarker(reinterpret_cast(&header), TRI_DF_MARKER_PROLOGUE, sizeof(MMFilesPrologueMarker)); encoding::storeNumber(reinterpret_cast(&header) + DatabaseIdOffset(TRI_DF_MARKER_PROLOGUE), databaseId, sizeof(decltype(databaseId))); encoding::storeNumber(reinterpret_cast(&header) + CollectionIdOffset(TRI_DF_MARKER_PROLOGUE), collectionId, sizeof(decltype(collectionId))); @@ -313,9 +313,9 @@ static inline TRI_df_prologue_marker_t CreatePrologueMarker(TRI_voc_tick_t datab /// @brief create a footer marker, using a user-defined tick //////////////////////////////////////////////////////////////////////////////// -static inline TRI_df_footer_marker_t CreateFooterMarker(TRI_voc_tick_t tick) { - TRI_df_footer_marker_t footer; - InitMarker(reinterpret_cast(&footer), TRI_DF_MARKER_FOOTER, sizeof(TRI_df_footer_marker_t), tick); +static inline MMFilesDatafileFooterMarker CreateFooterMarker(TRI_voc_tick_t tick) { + MMFilesDatafileFooterMarker footer; + InitMarker(reinterpret_cast(&footer), TRI_DF_MARKER_FOOTER, sizeof(MMFilesDatafileFooterMarker), tick); return footer; } @@ -324,7 +324,7 @@ static inline TRI_df_footer_marker_t CreateFooterMarker(TRI_voc_tick_t tick) { /// @brief create a footer marker, using tick 0 //////////////////////////////////////////////////////////////////////////////// -static inline TRI_df_footer_marker_t CreateFooterMarker() { +static inline MMFilesDatafileFooterMarker CreateFooterMarker() { return CreateFooterMarker(0); // always use tick 0 } diff --git a/arangod/MMFiles/MMFilesEngine.cpp b/arangod/MMFiles/MMFilesEngine.cpp index f92bf9273e..1692f4dbe6 100644 --- a/arangod/MMFiles/MMFilesEngine.cpp +++ b/arangod/MMFiles/MMFilesEngine.cpp @@ -767,7 +767,7 @@ std::string MMFilesEngine::createCollection( std::string const path = databasePath(vocbase); // sanity check - if (sizeof(TRI_df_header_marker_t) + sizeof(TRI_df_footer_marker_t) > + if (sizeof(MMFilesDatafileHeaderMarker) + sizeof(MMFilesDatafileFooterMarker) > static_cast(parameters->getPhysical())->journalSize()) { LOG_TOPIC(ERR, arangodb::Logger::FIXME) << "cannot create datafile '" << parameters->name() << "' in '" << path @@ -2111,7 +2111,7 @@ bool MMFilesEngine::iterateFiles(std::vector const& files) { /// it will check the ticks of all markers and update the internal tick /// counter accordingly. this is done so we'll not re-assign an already used /// tick value - auto cb = [this](TRI_df_marker_t const* marker, + auto cb = [this](MMFilesMarker const* marker, MMFilesDatafile* datafile) -> bool { TRI_voc_tick_t markerTick = marker->getTick(); @@ -2731,9 +2731,9 @@ bool MMFilesEngine::checkDatafileHeader(MMFilesDatafile* datafile, char const* ptr = datafile->data(); // skip the datafile header - ptr += encoding::alignedSize(sizeof(TRI_df_header_marker_t)); - TRI_col_header_marker_t const* cm = - reinterpret_cast(ptr); + ptr += encoding::alignedSize(sizeof(MMFilesDatafileHeaderMarker)); + MMFilesCollectionHeaderMarker const* cm = + reinterpret_cast(ptr); if (cm->base.getType() != TRI_DF_MARKER_COL_HEADER) { LOG_TOPIC(ERR, arangodb::Logger::FIXME) @@ -3032,7 +3032,7 @@ int MMFilesEngine::transferMarkersWorker( TRI_ASSERT(!operations.empty()); for (auto it2 = operations.begin(); it2 != operations.end(); ++it2) { - TRI_df_marker_t const* source = (*it2); + MMFilesMarker const* source = (*it2); TRI_voc_tick_t const tick = source->getTick(); if (tick <= minTransferTick) { @@ -3049,7 +3049,7 @@ int MMFilesEngine::transferMarkersWorker( } } - TRI_df_marker_type_t const type = source->getType(); + MMFilesMarkerype_t const type = source->getType(); if (type == TRI_DF_MARKER_VPACK_DOCUMENT || type == TRI_DF_MARKER_VPACK_REMOVE) { @@ -3082,7 +3082,7 @@ int MMFilesEngine::transferMarkersWorker( /// @brief get the next position for a marker of the specified size char* MMFilesEngine::nextFreeMarkerPosition(LogicalCollection* collection, TRI_voc_tick_t tick, - TRI_df_marker_type_t type, + MMFilesMarkerype_t type, TRI_voc_size_t size, MMFilesCollectorCache* cache) { // align the specified size @@ -3136,7 +3136,7 @@ char* MMFilesEngine::nextFreeMarkerPosition(LogicalCollection* collection, TRI_ASSERT(dst != nullptr); - MMFilesDatafileHelper::InitMarker(reinterpret_cast(dst), + MMFilesDatafileHelper::InitMarker(reinterpret_cast(dst), type, size); return dst; @@ -3148,8 +3148,8 @@ void MMFilesEngine::finishMarker(char const* walPosition, LogicalCollection* collection, TRI_voc_tick_t tick, MMFilesCollectorCache* cache) { - TRI_df_marker_t* marker = - reinterpret_cast(datafilePosition); + MMFilesMarker* marker = + reinterpret_cast(datafilePosition); MMFilesDatafile* datafile = cache->lastDatafile; TRI_ASSERT(datafile != nullptr); diff --git a/arangod/MMFiles/MMFilesEngine.h b/arangod/MMFiles/MMFilesEngine.h index 455ad97ed2..63d270b491 100644 --- a/arangod/MMFiles/MMFilesEngine.h +++ b/arangod/MMFiles/MMFilesEngine.h @@ -331,7 +331,7 @@ public: /// @brief get the next free position for a new marker of the specified size char* nextFreeMarkerPosition(LogicalCollection* collection, - TRI_voc_tick_t, TRI_df_marker_type_t, + TRI_voc_tick_t, MMFilesMarkerype_t, TRI_voc_size_t, MMFilesCollectorCache*); /// @brief set the tick of a marker and calculate its CRC value diff --git a/arangod/MMFiles/MMFilesLogfileManager.cpp b/arangod/MMFiles/MMFilesLogfileManager.cpp index b1f7cac313..f371f87c92 100644 --- a/arangod/MMFiles/MMFilesLogfileManager.cpp +++ b/arangod/MMFiles/MMFilesLogfileManager.cpp @@ -655,7 +655,7 @@ void MMFilesLogfileManager::signalSync(bool waitForSync) { // allocate space in a logfile for later writing MMFilesWalSlotInfo MMFilesLogfileManager::allocate(uint32_t size) { - TRI_ASSERT(size >= sizeof(TRI_df_marker_t)); + TRI_ASSERT(size >= sizeof(MMFilesMarker)); if (!_allowWrites) { // no writes allowed @@ -678,7 +678,7 @@ MMFilesWalSlotInfo MMFilesLogfileManager::allocate(uint32_t size) { // allocate space in a logfile for later writing MMFilesWalSlotInfo MMFilesLogfileManager::allocate(TRI_voc_tick_t databaseId, TRI_voc_cid_t collectionId, uint32_t size) { - TRI_ASSERT(size >= sizeof(TRI_df_marker_t)); + TRI_ASSERT(size >= sizeof(MMFilesMarker)); if (!_allowWrites) { // no writes allowed @@ -1531,7 +1531,7 @@ MMFilesLogfileManagerState MMFilesLogfileManager::state() { } // return the current available logfile ranges -LogfileRanges MMFilesLogfileManager::ranges() { +MMFilesLogfileManager::LogfileRanges MMFilesLogfileManager::ranges() { LogfileRanges result; READ_LOCKER(readLocker, _logfilesLock); diff --git a/arangod/MMFiles/MMFilesLogfileManager.h b/arangod/MMFiles/MMFilesLogfileManager.h index 1b96176ae3..1f107c6687 100644 --- a/arangod/MMFiles/MMFilesLogfileManager.h +++ b/arangod/MMFiles/MMFilesLogfileManager.h @@ -45,25 +45,6 @@ namespace options { class ProgramOptions; } -struct LogfileRange { - LogfileRange(MMFilesWalLogfile::IdType id, std::string const& filename, - std::string const& state, TRI_voc_tick_t tickMin, - TRI_voc_tick_t tickMax) - : id(id), - filename(filename), - state(state), - tickMin(tickMin), - tickMax(tickMax) {} - - MMFilesWalLogfile::IdType id; - std::string filename; - std::string state; - TRI_voc_tick_t tickMin; - TRI_voc_tick_t tickMax; -}; - -typedef std::vector LogfileRanges; - struct MMFilesTransactionData final : public TransactionData { MMFilesTransactionData() = delete; MMFilesTransactionData(MMFilesWalLogfile::IdType lastCollectedId, MMFilesWalLogfile::IdType lastSealedId) : @@ -81,17 +62,6 @@ struct MMFilesLogfileManagerState { std::string timeString; }; -struct LogfileBarrier { - LogfileBarrier() = delete; - - LogfileBarrier(TRI_voc_tick_t id, double expires, TRI_voc_tick_t minTick) - : id(id), expires(expires), minTick(minTick) {} - - TRI_voc_tick_t const id; - double expires; - TRI_voc_tick_t minTick; -}; - class MMFilesLogfileManager final : public application_features::ApplicationFeature { friend class MMFilesAllocatorThread; friend class MMFilesCollectorThread; @@ -114,6 +84,36 @@ class MMFilesLogfileManager final : public application_features::ApplicationFeat private: static MMFilesLogfileManager* Instance; + struct LogfileBarrier { + LogfileBarrier() = delete; + + LogfileBarrier(TRI_voc_tick_t id, double expires, TRI_voc_tick_t minTick) + : id(id), expires(expires), minTick(minTick) {} + + TRI_voc_tick_t const id; + double expires; + TRI_voc_tick_t minTick; + }; + + struct LogfileRange { + LogfileRange(MMFilesWalLogfile::IdType id, std::string const& filename, + std::string const& state, TRI_voc_tick_t tickMin, + TRI_voc_tick_t tickMax) + : id(id), + filename(filename), + state(state), + tickMin(tickMin), + tickMax(tickMax) {} + + MMFilesWalLogfile::IdType id; + std::string filename; + std::string state; + TRI_voc_tick_t tickMin; + TRI_voc_tick_t tickMax; + }; + + typedef std::vector LogfileRanges; + public: void collectOptions( std::shared_ptr options) override final; diff --git a/arangod/MMFiles/MMFilesRevisionsCache.cpp b/arangod/MMFiles/MMFilesRevisionsCache.cpp index b5d026f050..bd54f58f03 100644 --- a/arangod/MMFiles/MMFilesRevisionsCache.cpp +++ b/arangod/MMFiles/MMFilesRevisionsCache.cpp @@ -130,7 +130,7 @@ void MMFilesRevisionsCache::update(TRI_voc_rid_t revisionId, uint8_t const* data old->fid(fid, isInWal); } -bool MMFilesRevisionsCache::updateConditional(TRI_voc_rid_t revisionId, TRI_df_marker_t const* oldPosition, TRI_df_marker_t const* newPosition, TRI_voc_fid_t newFid, bool isInWal) { +bool MMFilesRevisionsCache::updateConditional(TRI_voc_rid_t revisionId, MMFilesMarker const* oldPosition, MMFilesMarker const* newPosition, TRI_voc_fid_t newFid, bool isInWal) { WRITE_LOCKER(locker, _lock); MMFilesDocumentPosition old = _positions.findByKey(nullptr, &revisionId); @@ -141,7 +141,7 @@ bool MMFilesRevisionsCache::updateConditional(TRI_voc_rid_t revisionId, TRI_df_m uint8_t const* vpack = static_cast(old.dataptr()); TRI_ASSERT(vpack != nullptr); - TRI_df_marker_t const* markerPtr = reinterpret_cast(vpack - MMFilesDatafileHelper::VPackOffset(TRI_DF_MARKER_VPACK_DOCUMENT)); + MMFilesMarker const* markerPtr = reinterpret_cast(vpack - MMFilesDatafileHelper::VPackOffset(TRI_DF_MARKER_VPACK_DOCUMENT)); if (markerPtr != oldPosition) { // element already outdated diff --git a/arangod/MMFiles/MMFilesRevisionsCache.h b/arangod/MMFiles/MMFilesRevisionsCache.h index fe64ffd772..378c541a58 100644 --- a/arangod/MMFiles/MMFilesRevisionsCache.h +++ b/arangod/MMFiles/MMFilesRevisionsCache.h @@ -30,7 +30,7 @@ #include "MMFiles/MMFilesDocumentPosition.h" #include "VocBase/voc-types.h" -struct TRI_df_marker_t; +struct MMFilesMarker; namespace arangodb { @@ -49,7 +49,7 @@ class MMFilesRevisionsCache { MMFilesDocumentPosition insert(TRI_voc_rid_t revisionId, uint8_t const* dataptr, TRI_voc_fid_t fid, bool isInWal, bool shouldLock); void insert(MMFilesDocumentPosition const& position, bool shouldLock); void update(TRI_voc_rid_t revisionId, uint8_t const* dataptr, TRI_voc_fid_t fid, bool isInWal); - bool updateConditional(TRI_voc_rid_t revisionId, TRI_df_marker_t const* oldPosition, TRI_df_marker_t const* newPosition, TRI_voc_fid_t newFid, bool isInWal); + bool updateConditional(TRI_voc_rid_t revisionId, MMFilesMarker const* oldPosition, MMFilesMarker const* newPosition, TRI_voc_fid_t newFid, bool isInWal); void remove(TRI_voc_rid_t revisionId); MMFilesDocumentPosition fetchAndRemove(TRI_voc_rid_t revisionId); diff --git a/arangod/MMFiles/MMFilesV8Functions.cpp b/arangod/MMFiles/MMFilesV8Functions.cpp index 2e70856a32..acb13c3b0e 100644 --- a/arangod/MMFiles/MMFilesV8Functions.cpp +++ b/arangod/MMFiles/MMFilesV8Functions.cpp @@ -25,10 +25,13 @@ #include "Basics/Exceptions.h" #include "Cluster/ClusterMethods.h" #include "Cluster/ServerState.h" +#include "MMFiles/MMFilesCollection.h" #include "MMFiles/MMFilesEngine.h" #include "MMFiles/MMFilesLogfileManager.h" #include "StorageEngine/EngineSelectorFeature.h" #include "StorageEngine/StorageEngine.h" +#include "Transaction/V8Context.h" +#include "Utils/SingleCollectionTransaction.h" #include "V8/v8-conv.h" #include "V8/v8-globals.h" #include "V8/v8-utils.h" @@ -41,6 +44,50 @@ using namespace arangodb; +/// @brief rotate the active journal of the collection +static void JS_RotateVocbaseCol( + v8::FunctionCallbackInfo const& args) { + TRI_V8_TRY_CATCH_BEGIN(isolate); + v8::HandleScope scope(isolate); + + if (ServerState::instance()->isCoordinator()) { + // renaming a collection in a cluster is unsupported + TRI_V8_THROW_EXCEPTION(TRI_ERROR_CLUSTER_UNSUPPORTED); + } + + PREVENT_EMBEDDED_TRANSACTION(); + + arangodb::LogicalCollection* collection = + TRI_UnwrapClass(args.Holder(), WRP_VOCBASE_COL_TYPE); + + if (collection == nullptr) { + TRI_V8_THROW_EXCEPTION_INTERNAL("cannot extract collection"); + } + + TRI_THROW_SHARDING_COLLECTION_NOT_YET_IMPLEMENTED(collection); + + SingleCollectionTransaction trx( + transaction::V8Context::Create(collection->vocbase(), true), + collection->cid(), AccessMode::Type::READ); + + int res = trx.begin(); + + if (res != TRI_ERROR_NO_ERROR) { + TRI_V8_THROW_EXCEPTION(res); + } + + res = static_cast(collection->getPhysical())->rotateActiveJournal(); + + trx.finish(res); + + if (res != TRI_ERROR_NO_ERROR) { + TRI_V8_THROW_EXCEPTION_MESSAGE(res, "could not rotate journal"); + } + + TRI_V8_RETURN_UNDEFINED(); + TRI_V8_TRY_CATCH_END +} + /// @brief returns information about the datafiles /// the collection must be unloaded. static void JS_DatafilesVocbaseCol( @@ -497,14 +544,16 @@ void MMFilesV8Functions::registerResources() { v8::Handle rt = v8::Handle::New(isolate, v8g->VocbaseColTempl); TRI_ASSERT(!rt.IsEmpty()); - TRI_AddMethodVocbase(isolate, rt, TRI_V8_ASCII_STRING("truncateDatafile"), - JS_TruncateDatafileVocbaseCol, true); - TRI_AddMethodVocbase(isolate, rt, TRI_V8_ASCII_STRING("tryRepairDatafile"), - JS_TryRepairDatafileVocbaseCol, true); TRI_AddMethodVocbase(isolate, rt, TRI_V8_ASCII_STRING("datafiles"), JS_DatafilesVocbaseCol, true); TRI_AddMethodVocbase(isolate, rt, TRI_V8_ASCII_STRING("datafileScan"), JS_DatafileScanVocbaseCol, true); + TRI_AddMethodVocbase(isolate, rt, TRI_V8_ASCII_STRING("rotate"), + JS_RotateVocbaseCol); + TRI_AddMethodVocbase(isolate, rt, TRI_V8_ASCII_STRING("truncateDatafile"), + JS_TruncateDatafileVocbaseCol, true); + TRI_AddMethodVocbase(isolate, rt, TRI_V8_ASCII_STRING("tryRepairDatafile"), + JS_TryRepairDatafileVocbaseCol, true); // add global WAL handling functions TRI_AddGlobalFunctionVocbase( diff --git a/arangod/MMFiles/MMFilesWalLogfile.h b/arangod/MMFiles/MMFilesWalLogfile.h index 7a2f1a5a1b..619bfe0af6 100644 --- a/arangod/MMFiles/MMFilesWalLogfile.h +++ b/arangod/MMFiles/MMFilesWalLogfile.h @@ -98,7 +98,7 @@ class MMFilesWalLogfile { inline MMFilesWalLogfile::IdType id() const { return _id; } /// @brief update the logfile tick status - inline void update(TRI_df_marker_t const* marker) { + inline void update(MMFilesMarker const* marker) { TRI_UpdateTicksDatafile(df(), marker); } diff --git a/arangod/MMFiles/MMFilesWalMarker.h b/arangod/MMFiles/MMFilesWalMarker.h index 14362a2294..edb008896e 100644 --- a/arangod/MMFiles/MMFilesWalMarker.h +++ b/arangod/MMFiles/MMFilesWalMarker.h @@ -47,7 +47,7 @@ class MMFilesWalMarker { virtual ~MMFilesWalMarker() {} /// @brief returns the marker type - virtual TRI_df_marker_type_t type() const = 0; + virtual MMFilesMarkerype_t type() const = 0; /// @brief returns the datafile id the marker comes from /// this should be 0 for new markers, but contain the actual @@ -73,19 +73,19 @@ class MMFilesWalMarker { /// this type is used during recovery only, to represent existing markers class MMFilesMarkerEnvelope : public MMFilesWalMarker { public: - MMFilesMarkerEnvelope(TRI_df_marker_t const* other, TRI_voc_fid_t fid) + MMFilesMarkerEnvelope(MMFilesMarker const* other, TRI_voc_fid_t fid) : _other(other), _fid(fid), _size(other->getSize()) { // we must always have a datafile id, and a reasonable marker size TRI_ASSERT(_fid > 0); - TRI_ASSERT(_size >= sizeof(TRI_df_marker_t)); + TRI_ASSERT(_size >= sizeof(MMFilesMarker)); } ~MMFilesMarkerEnvelope() = default; /// @brief returns the marker type - TRI_df_marker_type_t type() const override final { + MMFilesMarkerype_t type() const override final { // simply return the wrapped marker's type return _other->getType(); } @@ -115,7 +115,7 @@ class MMFilesMarkerEnvelope : public MMFilesWalMarker { } private: - TRI_df_marker_t const* _other; + MMFilesMarker const* _other; TRI_voc_fid_t _fid; uint32_t _size; }; @@ -124,7 +124,7 @@ class MMFilesMarkerEnvelope : public MMFilesWalMarker { /// updating/replacing or removing documents class MMFilesCrudMarker : public MMFilesWalMarker { public: - MMFilesCrudMarker(TRI_df_marker_type_t type, + MMFilesCrudMarker(MMFilesMarkerype_t type, TRI_voc_tid_t transactionId, arangodb::velocypack::Slice const& data) : _transactionId(transactionId), @@ -134,7 +134,7 @@ class MMFilesCrudMarker : public MMFilesWalMarker { ~MMFilesCrudMarker() = default; /// @brief returns the marker type - TRI_df_marker_type_t type() const override final { return _type; } + MMFilesMarkerype_t type() const override final { return _type; } /// @brief returns the datafile id /// this is always 0 for this type of marker, as the marker is not @@ -160,13 +160,13 @@ class MMFilesCrudMarker : public MMFilesWalMarker { private: TRI_voc_tid_t _transactionId; arangodb::velocypack::Slice _data; - TRI_df_marker_type_t _type; + MMFilesMarkerype_t _type; }; /// @brief a marker used for database-related operations class MMFilesDatabaseMarker : public MMFilesWalMarker { public: - MMFilesDatabaseMarker(TRI_df_marker_type_t type, + MMFilesDatabaseMarker(MMFilesMarkerype_t type, TRI_voc_tick_t databaseId, arangodb::velocypack::Slice const& data) : _databaseId(databaseId), @@ -178,7 +178,7 @@ class MMFilesDatabaseMarker : public MMFilesWalMarker { ~MMFilesDatabaseMarker() = default; /// @brief returns the marker type - TRI_df_marker_type_t type() const override final { return _type; } + MMFilesMarkerype_t type() const override final { return _type; } /// @brief returns the datafile id /// this is always 0 for this type of marker, as the marker is not @@ -201,13 +201,13 @@ class MMFilesDatabaseMarker : public MMFilesWalMarker { private: TRI_voc_tick_t _databaseId; arangodb::velocypack::Slice _data; - TRI_df_marker_type_t _type; + MMFilesMarkerype_t _type; }; /// @brief a marker used for collection-related operations class MMFilesCollectionMarker : public MMFilesWalMarker { public: - MMFilesCollectionMarker(TRI_df_marker_type_t type, + MMFilesCollectionMarker(MMFilesMarkerype_t type, TRI_voc_tick_t databaseId, TRI_voc_cid_t collectionId, arangodb::velocypack::Slice const& data) @@ -223,7 +223,7 @@ class MMFilesCollectionMarker : public MMFilesWalMarker { ~MMFilesCollectionMarker() = default; /// @brief returns the marker type - TRI_df_marker_type_t type() const override final { return _type; } + MMFilesMarkerype_t type() const override final { return _type; } /// @brief returns the datafile id /// this is always 0 for this type of marker, as the marker is not @@ -249,13 +249,13 @@ class MMFilesCollectionMarker : public MMFilesWalMarker { TRI_voc_tick_t _databaseId; TRI_voc_cid_t _collectionId; arangodb::velocypack::Slice _data; - TRI_df_marker_type_t _type; + MMFilesMarkerype_t _type; }; /// @brief a marker used for view-related operations class MMFilesViewMarker : public MMFilesWalMarker { public: - MMFilesViewMarker(TRI_df_marker_type_t type, + MMFilesViewMarker(MMFilesMarkerype_t type, TRI_voc_tick_t databaseId, TRI_voc_cid_t viewId, arangodb::velocypack::Slice const& data) @@ -271,7 +271,7 @@ class MMFilesViewMarker : public MMFilesWalMarker { ~MMFilesViewMarker() = default; /// @brief returns the marker type - TRI_df_marker_type_t type() const override final { return _type; } + MMFilesMarkerype_t type() const override final { return _type; } /// @brief returns the datafile id /// this is always 0 for this type of marker, as the marker is not @@ -297,13 +297,13 @@ class MMFilesViewMarker : public MMFilesWalMarker { TRI_voc_tick_t _databaseId; TRI_voc_cid_t _viewId; arangodb::velocypack::Slice _data; - TRI_df_marker_type_t _type; + MMFilesMarkerype_t _type; }; /// @brief a marker used for transaction-related operations class MMFilesTransactionMarker : public MMFilesWalMarker { public: - MMFilesTransactionMarker(TRI_df_marker_type_t type, + MMFilesTransactionMarker(MMFilesMarkerype_t type, TRI_voc_tick_t databaseId, TRI_voc_tid_t transactionId) : _databaseId(databaseId), @@ -316,7 +316,7 @@ class MMFilesTransactionMarker : public MMFilesWalMarker { ~MMFilesTransactionMarker() = default; /// @brief returns the marker type - TRI_df_marker_type_t type() const override final { return _type; } + MMFilesMarkerype_t type() const override final { return _type; } /// @brief returns the datafile id /// this is always 0 for this type of marker, as the marker is not @@ -340,7 +340,7 @@ class MMFilesTransactionMarker : public MMFilesWalMarker { private: TRI_voc_tick_t _databaseId; TRI_voc_tid_t _transactionId; - TRI_df_marker_type_t _type; + MMFilesMarkerype_t _type; }; } diff --git a/arangod/MMFiles/MMFilesWalRecoverState.cpp b/arangod/MMFiles/MMFilesWalRecoverState.cpp index 6c88dd5a77..701f0f63f9 100644 --- a/arangod/MMFiles/MMFilesWalRecoverState.cpp +++ b/arangod/MMFiles/MMFilesWalRecoverState.cpp @@ -258,7 +258,7 @@ LogicalCollection* MMFilesWalRecoverState::getCollection( /// @brief executes a single operation inside a transaction int MMFilesWalRecoverState::executeSingleOperation( TRI_voc_tick_t databaseId, TRI_voc_cid_t collectionId, - TRI_df_marker_t const* marker, TRI_voc_fid_t fid, + MMFilesMarker const* marker, TRI_voc_fid_t fid, std::function func) { // first find the correct database @@ -337,7 +337,7 @@ int MMFilesWalRecoverState::executeSingleOperation( /// @brief callback to handle one marker during recovery /// this function only builds up state and does not change any data -bool MMFilesWalRecoverState::InitialScanMarker(TRI_df_marker_t const* marker, +bool MMFilesWalRecoverState::InitialScanMarker(MMFilesMarker const* marker, void* data, MMFilesDatafile* datafile) { MMFilesWalRecoverState* state = @@ -354,7 +354,7 @@ bool MMFilesWalRecoverState::InitialScanMarker(TRI_df_marker_t const* marker, state->lastTick = tick; } - TRI_df_marker_type_t const type = marker->getType(); + MMFilesMarkerype_t const type = marker->getType(); switch (type) { case TRI_DF_MARKER_VPACK_DOCUMENT: { @@ -433,7 +433,7 @@ bool MMFilesWalRecoverState::InitialScanMarker(TRI_df_marker_t const* marker, /// @brief callback to replay one marker during recovery /// this function modifies indexes etc. -bool MMFilesWalRecoverState::ReplayMarker(TRI_df_marker_t const* marker, +bool MMFilesWalRecoverState::ReplayMarker(MMFilesMarker const* marker, void* data, MMFilesDatafile* datafile) { MMFilesWalRecoverState* state = @@ -443,7 +443,7 @@ bool MMFilesWalRecoverState::ReplayMarker(TRI_df_marker_t const* marker, LOG_TOPIC(TRACE, arangodb::Logger::FIXME) << "replaying marker of type " << TRI_NameMarkerDatafile(marker); #endif - TRI_df_marker_type_t const type = marker->getType(); + MMFilesMarkerype_t const type = marker->getType(); try { switch (type) { @@ -496,8 +496,8 @@ bool MMFilesWalRecoverState::ReplayMarker(TRI_df_marker_t const* marker, return TRI_ERROR_NO_ERROR; } - TRI_df_marker_t const* marker = - static_cast(envelope->mem()); + MMFilesMarker const* marker = + static_cast(envelope->mem()); std::string const collectionName = trx->documentCollection()->name(); @@ -573,8 +573,8 @@ bool MMFilesWalRecoverState::ReplayMarker(TRI_df_marker_t const* marker, return TRI_ERROR_NO_ERROR; } - TRI_df_marker_t const* marker = - static_cast(envelope->mem()); + MMFilesMarker const* marker = + static_cast(envelope->mem()); std::string const collectionName = trx->documentCollection()->name(); diff --git a/arangod/MMFiles/MMFilesWalRecoverState.h b/arangod/MMFiles/MMFilesWalRecoverState.h index edf628cfdb..bce9c5662c 100644 --- a/arangod/MMFiles/MMFilesWalRecoverState.h +++ b/arangod/MMFiles/MMFilesWalRecoverState.h @@ -140,16 +140,16 @@ struct MMFilesWalRecoverState { /// @brief executes a single operation inside a transaction int executeSingleOperation( - TRI_voc_tick_t, TRI_voc_cid_t, TRI_df_marker_t const*, TRI_voc_fid_t, + TRI_voc_tick_t, TRI_voc_cid_t, MMFilesMarker const*, TRI_voc_fid_t, std::function); /// @brief callback to handle one marker during recovery /// this function modifies indexes etc. - static bool ReplayMarker(TRI_df_marker_t const*, void*, MMFilesDatafile*); + static bool ReplayMarker(MMFilesMarker const*, void*, MMFilesDatafile*); /// @brief callback to handle one marker during recovery /// this function only builds up state and does not change any data - static bool InitialScanMarker(TRI_df_marker_t const*, void*, MMFilesDatafile*); + static bool InitialScanMarker(MMFilesMarker const*, void*, MMFilesDatafile*); /// @brief replay a single logfile int replayLogfile(MMFilesWalLogfile*, int); diff --git a/arangod/MMFiles/MMFilesWalSlot.cpp b/arangod/MMFiles/MMFilesWalSlot.cpp index d65056afd6..0ef5c5da08 100644 --- a/arangod/MMFiles/MMFilesWalSlot.cpp +++ b/arangod/MMFiles/MMFilesWalSlot.cpp @@ -65,9 +65,9 @@ void MMFilesWalSlot::finalize(MMFilesWalMarker const* marker) { TRI_ASSERT(_mem != nullptr); TRI_ASSERT(size == _size); - TRI_ASSERT(size >= sizeof(TRI_df_marker_t)); + TRI_ASSERT(size >= sizeof(MMFilesMarker)); - TRI_df_marker_t* dfm = static_cast(_mem); + MMFilesMarker* dfm = static_cast(_mem); // set type and tick dfm->setTypeAndTick(marker->type(), _tick); @@ -96,7 +96,7 @@ void MMFilesWalSlot::fill(void* src, size_t size) { TRI_ASSERT(size == _size); TRI_ASSERT(src != nullptr); - TRI_df_marker_t* marker = static_cast(src); + MMFilesMarker* marker = static_cast(src); // set tick marker->setTick(_tick); diff --git a/arangod/MMFiles/MMFilesWalSlots.cpp b/arangod/MMFiles/MMFilesWalSlots.cpp index 2310517a9c..49ab149225 100644 --- a/arangod/MMFiles/MMFilesWalSlots.cpp +++ b/arangod/MMFiles/MMFilesWalSlots.cpp @@ -33,7 +33,7 @@ using namespace arangodb; -static uint32_t const PrologueSize = encoding::alignedSize(sizeof(TRI_df_prologue_marker_t)); +static uint32_t const PrologueSize = encoding::alignedSize(sizeof(MMFilesPrologueMarker)); /// @brief create the slots MMFilesWalSlots::MMFilesWalSlots(MMFilesLogfileManager* logfileManager, size_t numberOfSlots, @@ -428,8 +428,8 @@ void MMFilesWalSlots::returnSyncRegion(MMFilesWalSyncRegion const& region) { _lastCommittedTick = tick; // update the data tick - TRI_df_marker_t const* m = - static_cast(slot->mem()); + MMFilesMarker const* m = + static_cast(slot->mem()); if (m->getType() != TRI_DF_MARKER_HEADER && m->getType() != TRI_DF_MARKER_FOOTER) { _lastCommittedDataTick = tick; @@ -609,7 +609,7 @@ int MMFilesWalSlots::closeLogfile(MMFilesWalSlot::TickType& lastCommittedTick, b int MMFilesWalSlots::writeHeader(MMFilesWalSlot* slot) { TRI_ASSERT(_logfile != nullptr); - TRI_df_header_marker_t header = MMFilesDatafileHelper::CreateHeaderMarker( + MMFilesDatafileHeaderMarker header = MMFilesDatafileHelper::CreateHeaderMarker( static_cast(_logfile->allocatedSize()), static_cast(_logfile->id()) ); @@ -631,7 +631,7 @@ int MMFilesWalSlots::writeHeader(MMFilesWalSlot* slot) { /// @brief write a prologue marker int MMFilesWalSlots::writePrologue(MMFilesWalSlot* slot, void* mem, TRI_voc_tick_t databaseId, TRI_voc_cid_t collectionId) { - TRI_df_prologue_marker_t header = MMFilesDatafileHelper::CreatePrologueMarker(databaseId, collectionId); + MMFilesPrologueMarker header = MMFilesDatafileHelper::CreatePrologueMarker(databaseId, collectionId); size_t const size = header.base.getSize(); TRI_ASSERT(size == PrologueSize); @@ -649,7 +649,7 @@ int MMFilesWalSlots::writePrologue(MMFilesWalSlot* slot, void* mem, TRI_voc_tick int MMFilesWalSlots::writeFooter(MMFilesWalSlot* slot) { TRI_ASSERT(_logfile != nullptr); - TRI_df_footer_marker_t footer = MMFilesDatafileHelper::CreateFooterMarker(); + MMFilesDatafileFooterMarker footer = MMFilesDatafileHelper::CreateFooterMarker(); size_t const size = footer.base.getSize(); auto* mem = static_cast(_logfile->reserve(size)); diff --git a/arangod/MMFiles/mmfiles-replication-dump.cpp b/arangod/MMFiles/mmfiles-replication-dump.cpp index e7ab6fb799..2e2cf7e4a0 100644 --- a/arangod/MMFiles/mmfiles-replication-dump.cpp +++ b/arangod/MMFiles/mmfiles-replication-dump.cpp @@ -86,8 +86,8 @@ static char const* NameFromCid(MMFilesReplicationDumpContext* dump, } /// @brief whether or not a marker should be replicated -static inline bool MustReplicateWalMarkerType(TRI_df_marker_t const* marker) { - TRI_df_marker_type_t type = marker->getType(); +static inline bool MustReplicateWalMarkerType(MMFilesMarker const* marker) { + MMFilesMarkerype_t type = marker->getType(); return (type == TRI_DF_MARKER_VPACK_DOCUMENT || type == TRI_DF_MARKER_VPACK_REMOVE || type == TRI_DF_MARKER_VPACK_BEGIN_TRANSACTION || @@ -102,8 +102,8 @@ static inline bool MustReplicateWalMarkerType(TRI_df_marker_t const* marker) { } /// @brief whether or not a marker belongs to a transaction -static inline bool IsTransactionWalMarkerType(TRI_df_marker_t const* marker) { - TRI_df_marker_type_t type = marker->getType(); +static inline bool IsTransactionWalMarkerType(MMFilesMarker const* marker) { + MMFilesMarkerype_t type = marker->getType(); return (type == TRI_DF_MARKER_VPACK_BEGIN_TRANSACTION || type == TRI_DF_MARKER_VPACK_COMMIT_TRANSACTION || type == TRI_DF_MARKER_VPACK_ABORT_TRANSACTION); @@ -111,7 +111,7 @@ static inline bool IsTransactionWalMarkerType(TRI_df_marker_t const* marker) { /// @brief translate a marker type to a replication type static TRI_replication_operation_e TranslateType( - TRI_df_marker_t const* marker) { + MMFilesMarker const* marker) { switch (marker->getType()) { case TRI_DF_MARKER_VPACK_DOCUMENT: return REPLICATION_MARKER_DOCUMENT; @@ -146,10 +146,10 @@ static TRI_replication_operation_e TranslateType( static int StringifyMarker(MMFilesReplicationDumpContext* dump, TRI_voc_tick_t databaseId, TRI_voc_cid_t collectionId, - TRI_df_marker_t const* marker, bool isDump, + MMFilesMarker const* marker, bool isDump, bool withTicks, bool isEdgeCollection) { TRI_ASSERT(MustReplicateWalMarkerType(marker)); - TRI_df_marker_type_t const type = marker->getType(); + MMFilesMarkerype_t const type = marker->getType(); if (!isDump) { // logger-follow command @@ -302,10 +302,10 @@ static int StringifyMarker(MMFilesReplicationDumpContext* dump, static int SliceifyMarker(MMFilesReplicationDumpContext* dump, TRI_voc_tick_t databaseId, TRI_voc_cid_t collectionId, - TRI_df_marker_t const* marker, bool isDump, + MMFilesMarker const* marker, bool isDump, bool withTicks, bool isEdgeCollection) { TRI_ASSERT(MustReplicateWalMarkerType(marker)); - TRI_df_marker_type_t const type = marker->getType(); + MMFilesMarkerype_t const type = marker->getType(); VPackBuffer buffer; std::shared_ptr> bufferPtr; @@ -427,7 +427,7 @@ static int SliceifyMarker(MMFilesReplicationDumpContext* dump, } /// @brief whether or not a marker belongs to a transaction static bool IsTransactionWalMarker(MMFilesReplicationDumpContext* dump, - TRI_df_marker_t const* marker) { + MMFilesMarker const* marker) { // first check the marker type if (!IsTransactionWalMarkerType(marker)) { return false; @@ -443,7 +443,7 @@ static bool IsTransactionWalMarker(MMFilesReplicationDumpContext* dump, /// @brief whether or not a marker is replicated static bool MustReplicateWalMarker( - MMFilesReplicationDumpContext* dump, TRI_df_marker_t const* marker, + MMFilesReplicationDumpContext* dump, MMFilesMarker const* marker, TRI_voc_tick_t databaseId, TRI_voc_cid_t collectionId, TRI_voc_tick_t firstRegularTick, std::unordered_set const& transactionIds) { @@ -508,7 +508,7 @@ static int DumpCollection(MMFilesReplicationDumpContext* dump, auto callback = [&dump, &lastFoundTick, &databaseId, &collectionId, &withTicks, &isEdgeCollection, &bufferFull, &useVpp, &collection]( - TRI_voc_tick_t foundTick, TRI_df_marker_t const* marker) { + TRI_voc_tick_t foundTick, MMFilesMarker const* marker) { // note the last tick we processed lastFoundTick = foundTick; @@ -538,7 +538,7 @@ static int DumpCollection(MMFilesReplicationDumpContext* dump, }; try { - bool hasMore = collection->getPhysical()->applyForTickRange(dataMin, dataMax, callback); + bool hasMore = static_cast(collection->getPhysical())->applyForTickRange(dataMin, dataMax, callback); if (lastFoundTick > 0) { // data available for requested range @@ -648,14 +648,14 @@ int MMFilesDumpLogReplication( logfile, ptr, end); while (ptr < end) { - auto const* marker = reinterpret_cast(ptr); + auto const* marker = reinterpret_cast(ptr); if (marker->getSize() == 0) { // end of datafile break; } - TRI_df_marker_type_t type = marker->getType(); + MMFilesMarkerype_t type = marker->getType(); if (type <= TRI_DF_MARKER_MIN || type >= TRI_DF_MARKER_MAX) { break; @@ -833,14 +833,14 @@ int MMFilesDetermineOpenTransactionsReplication(MMFilesReplicationDumpContext* d // LOG_TOPIC(INFO, arangodb::Logger::FIXME) << "scanning logfile " << i; while (ptr < end) { - auto const* marker = reinterpret_cast(ptr); + auto const* marker = reinterpret_cast(ptr); if (marker->getSize() == 0) { // end of datafile break; } - TRI_df_marker_type_t const type = marker->getType(); + MMFilesMarkerype_t const type = marker->getType(); if (type <= TRI_DF_MARKER_MIN || type >= TRI_DF_MARKER_MAX) { // somehow invalid diff --git a/arangod/V8Server/v8-collection.cpp b/arangod/V8Server/v8-collection.cpp index 22d75b5600..97bbb5605a 100644 --- a/arangod/V8Server/v8-collection.cpp +++ b/arangod/V8Server/v8-collection.cpp @@ -2158,52 +2158,6 @@ static void JS_RevisionVocbaseCol( TRI_V8_TRY_CATCH_END } -//////////////////////////////////////////////////////////////////////////////// -/// @brief was docuBlock collectionRotate -//////////////////////////////////////////////////////////////////////////////// - -static void JS_RotateVocbaseCol( - v8::FunctionCallbackInfo const& args) { - TRI_V8_TRY_CATCH_BEGIN(isolate); - v8::HandleScope scope(isolate); - - if (ServerState::instance()->isCoordinator()) { - // renaming a collection in a cluster is unsupported - TRI_V8_THROW_EXCEPTION(TRI_ERROR_CLUSTER_UNSUPPORTED); - } - - PREVENT_EMBEDDED_TRANSACTION(); - - arangodb::LogicalCollection* collection = - TRI_UnwrapClass(args.Holder(), WRP_VOCBASE_COL_TYPE); - - if (collection == nullptr) { - TRI_V8_THROW_EXCEPTION_INTERNAL("cannot extract collection"); - } - - TRI_THROW_SHARDING_COLLECTION_NOT_YET_IMPLEMENTED(collection); - - SingleCollectionTransaction trx( - transaction::V8Context::Create(collection->vocbase(), true), - collection->cid(), AccessMode::Type::READ); - - int res = trx.begin(); - - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION(res); - } - - res = collection->getPhysical()->rotateActiveJournal(); - - trx.finish(res); - - if (res != TRI_ERROR_NO_ERROR) { - TRI_V8_THROW_EXCEPTION_MESSAGE(res, "could not rotate journal"); - } - - TRI_V8_RETURN_UNDEFINED(); - TRI_V8_TRY_CATCH_END -} //////////////////////////////////////////////////////////////////////////////// /// @brief retrieves a collection from a V8 argument @@ -3071,8 +3025,6 @@ void TRI_InitV8Collections(v8::Handle context, JS_RenameVocbaseCol); TRI_AddMethodVocbase(isolate, rt, TRI_V8_ASCII_STRING("replace"), JS_ReplaceVocbaseCol); - TRI_AddMethodVocbase(isolate, rt, TRI_V8_ASCII_STRING("rotate"), - JS_RotateVocbaseCol); TRI_AddMethodVocbase( isolate, rt, TRI_V8_ASCII_STRING("save"), JS_InsertVocbaseCol); // note: save is now an alias for insert diff --git a/arangod/VocBase/PhysicalCollection.h b/arangod/VocBase/PhysicalCollection.h index a129148af9..1ff610e2a8 100644 --- a/arangod/VocBase/PhysicalCollection.h +++ b/arangod/VocBase/PhysicalCollection.h @@ -29,7 +29,7 @@ #include -struct TRI_df_marker_t; +struct MMFilesMarker; namespace arangodb { namespace transaction { @@ -80,14 +80,6 @@ class PhysicalCollection { virtual int close() = 0; - /// @brief rotate the active journal - will do nothing if there is no journal - /// REVIEW - MOVE INTO MMFILES?? - used in v8-collection - virtual int rotateActiveJournal() = 0; - - /// REVIEW - MOVE INTO MMFILES?? - used in replication-dump - virtual bool applyForTickRange(TRI_voc_tick_t dataMin, TRI_voc_tick_t dataMax, - std::function const& callback) = 0; - // @brief Return the number of documents in this collection virtual uint64_t numberDocuments() const = 0; diff --git a/tests/Basics/structure-size-test.cpp b/tests/Basics/structure-size-test.cpp index fcc07dff43..2c9c6fcb7b 100644 --- a/tests/Basics/structure-size-test.cpp +++ b/tests/Basics/structure-size-test.cpp @@ -52,7 +52,7 @@ TEST_CASE("CStructureSizeTest", "[structure-size]") { SECTION("tst_basic_elements") { CHECK(4 == (int) sizeof(TRI_col_type_e)); - CHECK(1 == (int) sizeof(TRI_df_marker_type_t)); + CHECK(1 == (int) sizeof(MMFilesMarker)); CHECK(4 == (int) sizeof(TRI_df_version_t)); CHECK(8 == (int) sizeof(TRI_voc_cid_t)); CHECK(4 == (int) sizeof(TRI_voc_crc_t)); @@ -63,13 +63,13 @@ SECTION("tst_basic_elements") { } //////////////////////////////////////////////////////////////////////////////// -/// @brief test sizeof TRI_df_marker_t +/// @brief test sizeof MMFilesMarker //////////////////////////////////////////////////////////////////////////////// SECTION("tst_df_marker") { - size_t s = sizeof(TRI_df_marker_t); + size_t s = sizeof(MMFilesMarker); - TRI_df_marker_t m; + MMFilesMarker m; CHECK(16 == (int) s); CHECK(s % 8 == 0); @@ -79,56 +79,56 @@ SECTION("tst_df_marker") { } //////////////////////////////////////////////////////////////////////////////// -/// @brief test sizeof TRI_df_header_marker_t +/// @brief test sizeof MMFilesDatafileHeaderMarker //////////////////////////////////////////////////////////////////////////////// SECTION("tst_df_header_marker") { - size_t s = sizeof(TRI_df_header_marker_t); + size_t s = sizeof(MMFilesDatafileHeaderMarker); CHECK(16 + 16 == (int) s); CHECK(s % 8 == 0); - CHECK(16 == (int) offsetOf(&TRI_df_header_marker_t::_version)); - CHECK(20 == (int) offsetOf(&TRI_df_header_marker_t::_maximalSize)); - CHECK(24 == (int) offsetOf(&TRI_df_header_marker_t::_fid)); + CHECK(16 == (int) offsetOf(&MMFilesDatafileHeaderMarker::_version)); + CHECK(20 == (int) offsetOf(&MMFilesDatafileHeaderMarker::_maximalSize)); + CHECK(24 == (int) offsetOf(&MMFilesDatafileHeaderMarker::_fid)); } //////////////////////////////////////////////////////////////////////////////// -/// @brief test sizeof TRI_df_footer_marker_t +/// @brief test sizeof MMFilesDatafileFooterMarker //////////////////////////////////////////////////////////////////////////////// SECTION("tst_df_footer_marker") { - size_t s = sizeof(TRI_df_footer_marker_t); + size_t s = sizeof(MMFilesDatafileFooterMarker); CHECK(16 == (int) s); CHECK(s % 8 == 0); } //////////////////////////////////////////////////////////////////////////////// -/// @brief test sizeof TRI_col_header_marker_t +/// @brief test sizeof MMFilesCollectionHeaderMarker //////////////////////////////////////////////////////////////////////////////// SECTION("tst_col_header_marker") { - size_t s = sizeof(TRI_col_header_marker_t); + size_t s = sizeof(MMFilesCollectionHeaderMarker); CHECK(16 + 8 == (int) s); // base + own size CHECK(s % 8 == 0); - CHECK(16 == (int) offsetOf(&TRI_col_header_marker_t::_cid)); + CHECK(16 == (int) offsetOf(&MMFilesCollectionHeaderMarker::_cid)); } //////////////////////////////////////////////////////////////////////////////// -/// @brief test sizeof TRI_df_prologue_marker_t +/// @brief test sizeof MMFilesPrologueMarker //////////////////////////////////////////////////////////////////////////////// SECTION("tst_df_prologue_marker") { - size_t s = sizeof(TRI_df_prologue_marker_t); + size_t s = sizeof(MMFilesPrologueMarker); CHECK(16 + 16 == (int) s); CHECK(s % 8 == 0); - CHECK(16 == (int) offsetOf(&TRI_df_prologue_marker_t::_databaseId)); - CHECK(24 == (int) offsetOf(&TRI_df_prologue_marker_t::_collectionId)); + CHECK(16 == (int) offsetOf(&MMFilesPrologueMarker::_databaseId)); + CHECK(24 == (int) offsetOf(&MMFilesPrologueMarker::_collectionId)); } //////////////////////////////////////////////////////////////////////////////// From c7b3e002b5acde077a8541c4e2e431fdb9593b69 Mon Sep 17 00:00:00 2001 From: jsteemann Date: Mon, 30 Jan 2017 14:05:54 +0100 Subject: [PATCH 3/8] fixed tests --- js/client/tests/shell/shell-vpack.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/js/client/tests/shell/shell-vpack.js b/js/client/tests/shell/shell-vpack.js index 5f2988cf56..967ca1708d 100644 --- a/js/client/tests/shell/shell-vpack.js +++ b/js/client/tests/shell/shell-vpack.js @@ -83,7 +83,7 @@ function versionJsonJson() { expect(obj).to.have.property('license'); expect(obj.server).to.be('arango'); - expect(obj.version).to.match(/[0-9]+\.[0-9]+\.+devel/); + expect(obj.version).to.match(/[0-9]+\.[0-9]+\.([0-9]+|devel)/); expect(obj.license).to.match(/enterprise|community/g); }; @@ -108,7 +108,7 @@ function versionVpackJson() { expect(obj).to.have.property('license'); expect(obj.server).to.be('arango'); - expect(obj.version).to.match(/[0-9]+\.[0-9]+\.+devel/); + expect(obj.version).to.match(/[0-9]+\.[0-9]+\.([0-9]+|devel)/); expect(obj.license).to.match(/enterprise|community/g); }; @@ -133,7 +133,7 @@ function versionJsonVpack () { expect(obj).to.have.property('license'); expect(obj.server).to.be('arango'); - expect(obj.version).to.match(/[0-9]+\.[0-9]+\.+devel/); + expect(obj.version).to.match(/[0-9]+\.[0-9]+\.([0-9]+|devel)/); expect(obj.license).to.match(/enterprise|community/g); }; @@ -158,7 +158,7 @@ function versionVpackVpack () { expect(obj).to.have.property('license'); expect(obj.server).to.be('arango'); - expect(obj.version).to.match(/[0-9]+\.[0-9]+\.+devel/); + expect(obj.version).to.match(/[0-9]+\.[0-9]+\.([0-9]+|devel)/); expect(obj.license).to.match(/enterprise|community/g); }; From 7f88bcaf33ae2010ff8d5e77d10b6436574c4849 Mon Sep 17 00:00:00 2001 From: Wilfried Goesgens Date: Wed, 22 Mar 2017 13:21:02 +0100 Subject: [PATCH 4/8] make this test work for milestone/alpha/beta/ releases --- js/client/tests/shell/shell-vpack.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/js/client/tests/shell/shell-vpack.js b/js/client/tests/shell/shell-vpack.js index 967ca1708d..979072bedb 100644 --- a/js/client/tests/shell/shell-vpack.js +++ b/js/client/tests/shell/shell-vpack.js @@ -83,7 +83,8 @@ function versionJsonJson() { expect(obj).to.have.property('license'); expect(obj.server).to.be('arango'); - expect(obj.version).to.match(/[0-9]+\.[0-9]+\.([0-9]+|devel)/); + expect(obj.version).to.match(/[0-9]+\.[0-9]+\.([0-9]+|(milestone|alpha|beta|devel|rc)[0-9]*)/); + expect(obj.license).to.match(/enterprise|community/g); }; @@ -108,7 +109,7 @@ function versionVpackJson() { expect(obj).to.have.property('license'); expect(obj.server).to.be('arango'); - expect(obj.version).to.match(/[0-9]+\.[0-9]+\.([0-9]+|devel)/); + expect(obj.version).to.match(/[0-9]+\.[0-9]+\.([0-9]+|(milestone|alpha|beta|devel|rc)[0-9]*)/); expect(obj.license).to.match(/enterprise|community/g); }; @@ -133,7 +134,7 @@ function versionJsonVpack () { expect(obj).to.have.property('license'); expect(obj.server).to.be('arango'); - expect(obj.version).to.match(/[0-9]+\.[0-9]+\.([0-9]+|devel)/); + expect(obj.version).to.match(/[0-9]+\.[0-9]+\.([0-9]+|(milestone|alpha|beta|devel|rc)[0-9]*)/); expect(obj.license).to.match(/enterprise|community/g); }; @@ -158,7 +159,7 @@ function versionVpackVpack () { expect(obj).to.have.property('license'); expect(obj.server).to.be('arango'); - expect(obj.version).to.match(/[0-9]+\.[0-9]+\.([0-9]+|devel)/); + expect(obj.version).to.match(/[0-9]+\.[0-9]+\.([0-9]+|(milestone|alpha|beta|devel|rc)[0-9]*)/); expect(obj.license).to.match(/enterprise|community/g); }; From 82ba9a3538235869d972b30ebb0417080c34413e Mon Sep 17 00:00:00 2001 From: jsteemann Date: Wed, 22 Mar 2017 13:26:58 +0100 Subject: [PATCH 5/8] fixed test expectation --- js/client/tests/shell/shell-vpack.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/js/client/tests/shell/shell-vpack.js b/js/client/tests/shell/shell-vpack.js index 5f2988cf56..66cc885ff8 100644 --- a/js/client/tests/shell/shell-vpack.js +++ b/js/client/tests/shell/shell-vpack.js @@ -158,7 +158,7 @@ function versionVpackVpack () { expect(obj).to.have.property('license'); expect(obj.server).to.be('arango'); - expect(obj.version).to.match(/[0-9]+\.[0-9]+\.+devel/); + expect(obj.version).to.match(/^[a-z0-9\.\-]+/); expect(obj.license).to.match(/enterprise|community/g); }; @@ -179,13 +179,8 @@ function echoVpackVpack () { expect(res).to.be.a(request.Response); expect(res.body).to.be.a('string'); expect(Number(res.headers['content-length'])).to.equal(res.rawBody.length); - //var obj = JSON.parse(res.body); - //print_vpack_as_json(res.body); - //expect(VPACK_TO_V8().to.equal(); }; - - //////////////////////////////////////////////////////////////////////////////// /// @brief executes the test suite //////////////////////////////////////////////////////////////////////////////// From d9d9eaac608a81c66c4a8c205d212d2324245d8f Mon Sep 17 00:00:00 2001 From: jsteemann Date: Wed, 22 Mar 2017 14:03:27 +0100 Subject: [PATCH 6/8] fixed two cluster tests --- arangod/Cluster/ClusterInfo.cpp | 1 + arangod/MMFiles/MMFilesCollection.cpp | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/arangod/Cluster/ClusterInfo.cpp b/arangod/Cluster/ClusterInfo.cpp index c9989255a8..cfcbac9694 100644 --- a/arangod/Cluster/ClusterInfo.cpp +++ b/arangod/Cluster/ClusterInfo.cpp @@ -1385,6 +1385,7 @@ int ClusterInfo::setCollectionPropertiesCoordinator( VPackBuilder temp; temp.openObject(); + temp.add("waitForSync", VPackValue(info->waitForSync())); info->getPhysical()->getPropertiesVPackCoordinator(temp); temp.close(); diff --git a/arangod/MMFiles/MMFilesCollection.cpp b/arangod/MMFiles/MMFilesCollection.cpp index 93b0c0e1af..0b01e52146 100644 --- a/arangod/MMFiles/MMFilesCollection.cpp +++ b/arangod/MMFiles/MMFilesCollection.cpp @@ -2987,6 +2987,7 @@ int MMFilesCollection::update(arangodb::transaction::Methods* trx, ManagedDocumentResult& previous, TRI_voc_rid_t const& revisionId, VPackSlice const key) { + bool const isEdgeCollection = (_logicalCollection->type() == TRI_COL_TYPE_EDGE); TRI_IF_FAILURE("UpdateDocumentNoLock") { return TRI_ERROR_DEBUG; } @@ -3034,6 +3035,9 @@ int MMFilesCollection::update(arangodb::transaction::Methods* trx, if (newSlice.length() <= 1) { // no need to do anything result = previous; + if (_logicalCollection->waitForSync()) { + options.waitForSync = true; + } return TRI_ERROR_NO_ERROR; } @@ -3107,7 +3111,6 @@ int MMFilesCollection::update(arangodb::transaction::Methods* trx, } return res; - } int MMFilesCollection::replace( From 1b3c2e59b2eee55e0a84f805e759053a479f89d3 Mon Sep 17 00:00:00 2001 From: hkernbach Date: Wed, 22 Mar 2017 14:34:49 +0100 Subject: [PATCH 7/8] fixed mem leak issue: #2352 --- CHANGELOG | 2 + .../APP/frontend/js/views/dashboardView.js | 2 +- .../APP/frontend/js/views/queryView.js | 124 +- .../_admin/aardvark/APP/frontend/src/ace.js | 20666 +++++++++------- .../aardvark/APP/frontend/src/ace.js.gz | Bin 155797 -> 169531 bytes .../aardvark/APP/frontend/src/ace.min.js | 22 +- .../aardvark/APP/frontend/src/worker-json.js | 3118 +-- .../APP/frontend/src/worker-json.js.gz | Bin 16763 -> 18212 bytes 8 files changed, 12722 insertions(+), 11212 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index d44bfb0c0e..ce8bf21932 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -159,6 +159,8 @@ v3.2.alpha1 (2017-02-05) v3.1.16 (2017-XX-XX) -------------------- +* ui - aql editor improvements + updated ace editor version (memory leak) + * fixed lost HTTP requests * ui - fixed some event issues diff --git a/js/apps/system/_admin/aardvark/APP/frontend/js/views/dashboardView.js b/js/apps/system/_admin/aardvark/APP/frontend/js/views/dashboardView.js index e24581d875..7df5c54173 100644 --- a/js/apps/system/_admin/aardvark/APP/frontend/js/views/dashboardView.js +++ b/js/apps/system/_admin/aardvark/APP/frontend/js/views/dashboardView.js @@ -1,7 +1,7 @@ /* jshint browser: true */ /* jshint unused: false */ /* global Backbone, $, window, arangoHelper, nv, d3, prettyBytes */ -/* global document, console, frontendConfig, Dygraph, _,templateEngine*/ +/* global document, console, frontendConfig, Dygraph, _,templateEngine */ (function () { 'use strict'; diff --git a/js/apps/system/_admin/aardvark/APP/frontend/js/views/queryView.js b/js/apps/system/_admin/aardvark/APP/frontend/js/views/queryView.js index c0fd8c19c7..aea0437e3d 100644 --- a/js/apps/system/_admin/aardvark/APP/frontend/js/views/queryView.js +++ b/js/apps/system/_admin/aardvark/APP/frontend/js/views/queryView.js @@ -21,6 +21,7 @@ customQueries: [], cachedQueries: {}, + queriesHistory: {}, graphViewers: [], queries: [], @@ -177,11 +178,13 @@ }, removeResults: function () { + var self = this; this.cachedQueries = {}; - $('.outputEditorWrapper').hide('fast', function () { - $('.outputEditorWrapper').remove(); + this.queriesHistory = {}; + + _.each($('.outputEditorWrapper'), function (v) { + self.closeAceResults(v.id.replace(/^\D+/g, '')); }); - $('#removeResults').hide(); }, getCustomQueryParameterByName: function (qName) { @@ -441,28 +444,25 @@ // deselect editors this.deselect(ace.edit('outputEditor' + count)); - this.deselect(ace.edit('sentQueryEditor' + count)); - this.deselect(ace.edit('sentBindParamEditor' + count)); }, downloadQueryResult: function (e) { - var count = $(e.currentTarget).attr('counter'); - var editor = ace.edit('sentQueryEditor' + count); - var query = editor.getValue(); + var counter = $(e.currentTarget).attr('counter'); + var query = this.queriesHistory[counter].sentQuery; - if (query !== '' || query !== undefined || query !== null) { + if (query !== '' && query !== undefined && query !== null) { var url; - if (Object.keys(this.bindParamTableObj).length === 0) { + if (Object.keys(this.queriesHistory[counter].bindParam).length === 0) { url = 'query/result/download/' + encodeURIComponent(btoa(JSON.stringify({ query: query }))); } else { url = 'query/result/download/' + encodeURIComponent(btoa(JSON.stringify({ query: query, - bindVars: this.bindParamTableObj + bindVars: this.queriesHistory[counter].bindParam }))); } arangoHelper.download(url); } else { - arangoHelper.arangoError('Query error', 'could not query result.'); + arangoHelper.arangoError('Query error', 'Could not download the result.'); } }, @@ -480,32 +480,23 @@ var counter = this.outputCounter; var outputEditor = ace.edit('outputEditor' + counter); - var sentQueryEditor = ace.edit('sentQueryEditor' + counter); - var sentBindParamEditor = ace.edit('sentBindParamEditor' + counter); - - sentQueryEditor.getSession().setMode('ace/mode/aql'); - sentQueryEditor.setOption('vScrollBarAlwaysVisible', true); - sentQueryEditor.setReadOnly(true); - this.setEditorAutoHeight(sentQueryEditor); outputEditor.setReadOnly(true); outputEditor.getSession().setMode('ace/mode/json'); outputEditor.setOption('vScrollBarAlwaysVisible', true); this.setEditorAutoHeight(outputEditor); - sentBindParamEditor.setValue(JSON.stringify(this.bindParamTableObj), 1); - sentBindParamEditor.setOption('vScrollBarAlwaysVisible', true); - sentBindParamEditor.getSession().setMode('ace/mode/json'); - sentBindParamEditor.setReadOnly(true); - this.setEditorAutoHeight(sentBindParamEditor); + // Store sent query and bindParameter + this.queriesHistory[counter] = { + sentQuery: this.aqlEditor.getValue(), + bindParam: this.bindParamTableObj + }; - this.fillExplain(outputEditor, sentQueryEditor, counter); + this.fillExplain(outputEditor, counter); this.outputCounter++; }, - fillExplain: function (outputEditor, sentQueryEditor, counter) { - sentQueryEditor.setValue(this.aqlEditor.getValue(), 1); - + fillExplain: function (outputEditor, counter) { var self = this; var queryData = this.readQueryData(); @@ -648,21 +639,42 @@ } }, + closeAceResults: function (counter, target) { + var self = this; + ace.edit('outputEditor' + counter).destroy(); + $('#outputEditorWrapper' + this.outputCounter).hide(); + + var cleanup = function (target) { + $(target).hide('fast', function () { + // remove dom + $(target).remove(); + if ($('.outputEditorWrapper').length === 0) { + self.cachedQueries = {}; + $('#removeResults').hide(); + } + }); + }; + + if (target) { + cleanup(target); + } else { + _.each($('#outputEditors').children(), function (elem) { + cleanup(elem); + }); + } + }, + closeResult: function (e) { var self = this; var target = $('#' + $(e.currentTarget).attr('element')).parent(); var id = $(target).attr('id'); - var counter = id.substring(id.length - 1, id.length - 0); + var counter = id.replace(/^\D+/g, ''); + + // remove unused ace editor instances + self.closeAceResults(counter, target); delete this.cachedQueries[counter]; - - $(target).hide('fast', function () { - $(target).remove(); - if ($('.outputEditorWrapper').length === 0) { - self.cachedQueries = {}; - $('#removeResults').hide(); - } - }); + delete this.queriesHistory[counter]; }, fillSelectBoxes: function () { @@ -738,7 +750,6 @@ _.each(this.cachedQueries, function (query, counter) { self.renderQueryResultBox(counter, null, true); self.renderQueryResult(query, counter, true); - self.fillSentQueryValue(counter); if (query.sentQuery) { self.bindQueryResultButtons(null, counter); @@ -748,11 +759,6 @@ } }, - fillSentQueryValue: function (counter) { - var sentQueryEditor = ace.edit('sentQueryEditor' + counter); - sentQueryEditor.setValue(this.cachedQueries[counter].sentQuery, 1); - }, - showSpotlight: function (type) { var callback, cancelCallback; @@ -1097,11 +1103,13 @@ // init aql editor this.aqlEditor = ace.edit('aqlEditor'); + this.aqlEditor.$blockScrolling = Infinity; this.aqlEditor.getSession().setMode('ace/mode/aql'); this.aqlEditor.setFontSize('10pt'); this.aqlEditor.setShowPrintMargin(false); this.bindParamAceEditor = ace.edit('bindParamAceEditor'); + this.bindParamAceEditor.$blockScrolling = Infinity; this.bindParamAceEditor.getSession().setMode('ace/mode/json'); this.bindParamAceEditor.setFontSize('10pt'); this.bindParamAceEditor.setShowPrintMargin(false); @@ -1560,29 +1568,24 @@ })); var outputEditor = ace.edit('outputEditor' + counter); - var sentQueryEditor = ace.edit('sentQueryEditor' + counter); - var sentBindParamEditor = ace.edit('sentBindParamEditor' + counter); - sentQueryEditor.getSession().setMode('ace/mode/aql'); - sentQueryEditor.setOption('vScrollBarAlwaysVisible', true); - sentQueryEditor.setFontSize('13px'); - sentQueryEditor.setReadOnly(true); - this.setEditorAutoHeight(sentQueryEditor); + // store query and bind parameters history outputEditor.setFontSize('13px'); + outputEditor.$blockScrolling = Infinity; outputEditor.getSession().setMode('ace/mode/json'); outputEditor.setReadOnly(true); outputEditor.setOption('vScrollBarAlwaysVisible', true); outputEditor.setShowPrintMargin(false); this.setEditorAutoHeight(outputEditor); - sentBindParamEditor.setValue(JSON.stringify(this.bindParamTableObj), 1); - sentBindParamEditor.setOption('vScrollBarAlwaysVisible', true); - sentBindParamEditor.getSession().setMode('ace/mode/json'); - sentBindParamEditor.setReadOnly(true); - this.setEditorAutoHeight(sentBindParamEditor); - if (!cached) { + // Store sent query and bindParameter + this.queriesHistory[counter] = { + sentQuery: this.aqlEditor.getValue(), + bindParam: this.bindParamTableObj + }; + this.fillResult(counter, selected); this.outputCounter++; } @@ -1641,9 +1644,6 @@ } if (queryData) { - var sentQueryEditor = ace.edit('sentQueryEditor' + counter); - sentQueryEditor.setValue(self.aqlEditor.getValue(), 1); - $.ajax({ type: 'POST', url: arangoHelper.databaseUrl('/_api/cursor'), @@ -1742,7 +1742,6 @@ if (!data.msg) { // handle usual query var result = self.analyseQuery(data.result); - // console.log('Using ' + result.defaultType + ' as data format.'); if (result.defaultType === 'table') { $('#outputEditorWrapper' + counter + ' .arangoToolbarTop').after( '
' @@ -1914,8 +1913,9 @@ self.toggleQueries(); } - var aql = ace.edit('sentQueryEditor' + counter).getValue(); - var bindParam = JSON.parse(ace.edit('sentBindParamEditor' + counter).getValue()); + var aql = self.queriesHistory[counter].sentQuery; + var bindParam = self.queriesHistory[counter].bindParam; + self.aqlEditor.setValue(aql, 1); self.deselect(self.aqlEditor); if (Object.keys(bindParam).length > 0) { diff --git a/js/apps/system/_admin/aardvark/APP/frontend/src/ace.js b/js/apps/system/_admin/aardvark/APP/frontend/src/ace.js index 1d8e42dba3..4ee0b7b8de 100644 --- a/js/apps/system/_admin/aardvark/APP/frontend/src/ace.js +++ b/js/apps/system/_admin/aardvark/APP/frontend/src/ace.js @@ -3,7 +3,7 @@ * * Copyright (c) 2010, Ajax.org B.V. * All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright @@ -14,7 +14,7 @@ * * Neither the name of Ajax.org B.V. nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -28,76 +28,81 @@ * * ***** END LICENSE BLOCK ***** */ +/** + * Define a module along with a payload + * @param module a name for the payload + * @param payload a function to call with (require, exports, module) params + */ + (function() { var ACE_NAMESPACE = ""; -var global = (function() { - return this; -})(); +var global = (function() { return this; })(); +if (!global && typeof window != "undefined") global = window; // strict mode if (!ACE_NAMESPACE && typeof requirejs !== "undefined") return; -var _define = function(module, deps, payload) { - if (typeof module !== 'string') { - if (_define.original) - _define.original.apply(window, arguments); +var define = function(module, deps, payload) { + if (typeof module !== "string") { + if (define.original) + define.original.apply(this, arguments); else { - console.error('dropping module because define wasn\'t a string.'); + console.error("dropping module because define wasn\'t a string."); console.trace(); } return; } - if (arguments.length == 2) payload = deps; - - if (!_define.modules) { - _define.modules = {}; - _define.payloads = {}; + if (!define.modules[module]) { + define.payloads[module] = payload; + define.modules[module] = null; } - - _define.payloads[module] = payload; - _define.modules[module] = null; }; + +define.modules = {}; +define.payloads = {}; + +/** + * Get at functionality define()ed using the function above + */ var _require = function(parentId, module, callback) { - if (Object.prototype.toString.call(module) === "[object Array]") { + if (typeof module === "string") { + var payload = lookup(parentId, module); + if (payload != undefined) { + callback && callback(); + return payload; + } + } else if (Object.prototype.toString.call(module) === "[object Array]") { var params = []; for (var i = 0, l = module.length; i < l; ++i) { var dep = lookup(parentId, module[i]); - if (!dep && _require.original) - return _require.original(module, callback); + if (dep == undefined && require.original) + return; params.push(dep); } - if (callback) { - callback.apply(null, params); - } - } - else if (typeof module === 'string') { - var payload = lookup(parentId, module); - if (!payload && _require.original) - return _require.original(module, callback); - - if (callback) { - callback(); - } - - return payload; - } - else { - if (_require.original) - return _require.original(module, callback); + return callback && callback.apply(null, params) || true; } }; +var require = function(module, callback) { + var packagedModule = _require("", module, callback); + if (packagedModule == undefined && require.original) + return require.original.apply(this, arguments); + return packagedModule; +}; + var normalizeModule = function(parentId, moduleName) { + // normalize plugin requires if (moduleName.indexOf("!") !== -1) { var chunks = moduleName.split("!"); return normalizeModule(parentId, chunks[0]) + "!" + normalizeModule(parentId, chunks[1]); } + // normalize relative requires if (moduleName.charAt(0) == ".") { var base = parentId.split("/").slice(0, -1).join("/"); moduleName = base + "/" + moduleName; @@ -107,16 +112,19 @@ var normalizeModule = function(parentId, moduleName) { moduleName = moduleName.replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, ""); } } - return moduleName; }; -var lookup = function(parentId, moduleName) { +/** + * Internal function to lookup moduleNames and resolve them by calling the + * definition function if needed. + */ +var lookup = function(parentId, moduleName) { moduleName = normalizeModule(parentId, moduleName); - var module = _define.modules[moduleName]; + var module = define.modules[moduleName]; if (!module) { - module = _define.payloads[moduleName]; + module = define.payloads[moduleName]; if (typeof module === 'function') { var exports = {}; var mod = { @@ -132,19 +140,15 @@ var lookup = function(parentId, moduleName) { var returnValue = module(req, exports, mod); exports = returnValue || mod.exports; - _define.modules[moduleName] = exports; - delete _define.payloads[moduleName]; + define.modules[moduleName] = exports; + delete define.payloads[moduleName]; } - module = _define.modules[moduleName] = exports || module; + module = define.modules[moduleName] = exports || module; } return module; }; function exportAce(ns) { - var require = function(module, callback) { - return _require("", module, callback); - }; - var root = global; if (ns) { if (!global[ns]) @@ -153,13 +157,13 @@ function exportAce(ns) { } if (!root.define || !root.define.packaged) { - _define.original = root.define; - root.define = _define; + define.original = root.define; + root.define = define; root.define.packaged = true; } if (!root.require || !root.require.packaged) { - _require.original = root.require; + require.original = root.require; root.require = require; root.require.packaged = true; } @@ -169,76 +173,8 @@ exportAce(ACE_NAMESPACE); })(); -define('ace/ace', ['require', 'exports', 'module' , 'ace/lib/fixoldbrowsers', 'ace/lib/dom', 'ace/lib/event', 'ace/editor', 'ace/edit_session', 'ace/undomanager', 'ace/virtual_renderer', 'ace/multi_select', 'ace/worker/worker_client', 'ace/keyboard/hash_handler', 'ace/placeholder', 'ace/mode/folding/fold_mode', 'ace/theme/textmate', 'ace/ext/error_marker', 'ace/config'], function(require, exports, module) { - - -require("./lib/fixoldbrowsers"); - -var dom = require("./lib/dom"); -var event = require("./lib/event"); - -var Editor = require("./editor").Editor; -var EditSession = require("./edit_session").EditSession; -var UndoManager = require("./undomanager").UndoManager; -var Renderer = require("./virtual_renderer").VirtualRenderer; -var MultiSelect = require("./multi_select").MultiSelect; -require("./worker/worker_client"); -require("./keyboard/hash_handler"); -require("./placeholder"); -require("./mode/folding/fold_mode"); -require("./theme/textmate"); -require("./ext/error_marker"); - -exports.config = require("./config"); -exports.require = require; -exports.edit = function(el) { - if (typeof(el) == "string") { - var _id = el; - var el = document.getElementById(_id); - if (!el) - throw new Error("ace.edit can't find div #" + _id); - } - - if (el.env && el.env.editor instanceof Editor) - return el.env.editor; - - var doc = exports.createEditSession(dom.getInnerText(el)); - el.innerHTML = ''; - - var editor = new Editor(new Renderer(el)); - new MultiSelect(editor); - editor.setSession(doc); - - var env = { - document: doc, - editor: editor, - onResize: editor.resize.bind(editor, null) - }; - event.addListener(window, "resize", env.onResize); - editor.on("destroy", function() { - event.removeListener(window, "resize", env.onResize); - }); - el.env = editor.env = env; - return editor; -}; -exports.createEditSession = function(text, mode) { - var doc = new EditSession(text, mode); - doc.setUndoManager(new UndoManager()); - return doc; -} -exports.EditSession = EditSession; -exports.UndoManager = UndoManager; -}); - -define('ace/lib/fixoldbrowsers', ['require', 'exports', 'module' , 'ace/lib/regexp', 'ace/lib/es5-shim'], function(require, exports, module) { - - -require("./regexp"); -require("./es5-shim"); - -}); - -define('ace/lib/regexp', ['require', 'exports', 'module' ], function(require, exports, module) { +define("ace/lib/regexp",["require","exports","module"], function(require, exports, module) { +"use strict"; var real = { exec: RegExp.prototype.exec, @@ -310,7 +246,7 @@ define('ace/lib/regexp', ['require', 'exports', 'module' ], function(require, ex }); -define('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) { +define("ace/lib/es5-shim",["require","exports","module"], function(require, exports, module) { function Empty() {} @@ -1007,11 +943,16 @@ var toObject = function (o) { }); -define('ace/lib/dom', ['require', 'exports', 'module' ], function(require, exports, module) { +define("ace/lib/fixoldbrowsers",["require","exports","module","ace/lib/regexp","ace/lib/es5-shim"], function(require, exports, module) { +"use strict"; +require("./regexp"); +require("./es5-shim"); -if (typeof document == "undefined") - return; +}); + +define("ace/lib/dom",["require","exports","module"], function(require, exports, module) { +"use strict"; var XHTML_NS = "http://www.w3.org/1999/xhtml"; @@ -1028,7 +969,7 @@ exports.createElement = function(tag, ns) { }; exports.hasCssClass = function(el, name) { - var classes = el.className.split(/\s+/g); + var classes = (el.className + "").split(/\s+/g); return classes.indexOf(name) !== -1; }; exports.addCssClass = function(el, name) { @@ -1058,7 +999,7 @@ exports.toggleCssClass = function(el, name) { add = false; classes.splice(index, 1); } - if(add) + if (add) classes.push(name); el.className = classes.join(" "); @@ -1094,16 +1035,16 @@ exports.importCssString = function importCssString(cssText, id, doc) { var style; + if (id) + cssText += "\n/*# sourceURL=ace/css/" + id + " */"; + if (doc.createStyleSheet) { style = doc.createStyleSheet(); style.cssText = cssText; if (id) style.owningElement.id = id; } else { - style = doc.createElementNS - ? doc.createElementNS(XHTML_NS, "style") - : doc.createElement("style"); - + style = exports.createElement("style"); style.appendChild(doc.createTextNode(cssText)); if (id) style.id = id; @@ -1140,38 +1081,6 @@ exports.getInnerHeight = function(element) { ); }; -if (window.pageYOffset !== undefined) { - exports.getPageScrollTop = function() { - return window.pageYOffset; - }; - - exports.getPageScrollLeft = function() { - return window.pageXOffset; - }; -} -else { - exports.getPageScrollTop = function() { - return document.body.scrollTop; - }; - - exports.getPageScrollLeft = function() { - return document.body.scrollLeft; - }; -} - -if (window.getComputedStyle) - exports.computedStyle = function(element, style) { - if (style) - return (window.getComputedStyle(element, "") || {})[style] || ""; - return window.getComputedStyle(element, "") || {}; - }; -else - exports.computedStyle = function(element, style) { - if (style) - return element.currentStyle[style]; - return element.currentStyle; - }; - exports.scrollbarWidth = function(document) { var inner = exports.createElement("ace_inner"); inner.style.width = "100%"; @@ -1208,6 +1117,43 @@ exports.scrollbarWidth = function(document) { return noScrollbar-withScrollbar; }; + +if (typeof document == "undefined") { + exports.importCssString = function() {}; + return; +} + +if (window.pageYOffset !== undefined) { + exports.getPageScrollTop = function() { + return window.pageYOffset; + }; + + exports.getPageScrollLeft = function() { + return window.pageXOffset; + }; +} +else { + exports.getPageScrollTop = function() { + return document.body.scrollTop; + }; + + exports.getPageScrollLeft = function() { + return document.body.scrollLeft; + }; +} + +if (window.getComputedStyle) + exports.computedStyle = function(element, style) { + if (style) + return (window.getComputedStyle(element, "") || {})[style] || ""; + return window.getComputedStyle(element, "") || {}; + }; +else + exports.computedStyle = function(element, style) { + if (style) + return element.currentStyle[style]; + return element.currentStyle; + }; exports.setInnerHtml = function(el, innerHtml) { var element = el.cloneNode(false);//document.createElement("div"); element.innerHTML = innerHtml; @@ -1240,328 +1186,38 @@ exports.getParentWindow = function(document) { }); -define('ace/lib/event', ['require', 'exports', 'module' , 'ace/lib/keys', 'ace/lib/useragent'], function(require, exports, module) { +define("ace/lib/oop",["require","exports","module"], function(require, exports, module) { +"use strict"; - -var keys = require("./keys"); -var useragent = require("./useragent"); - -exports.addListener = function(elem, type, callback) { - if (elem.addEventListener) { - return elem.addEventListener(type, callback, false); - } - if (elem.attachEvent) { - var wrapper = function() { - callback.call(elem, window.event); - }; - callback._wrapper = wrapper; - elem.attachEvent("on" + type, wrapper); - } -}; - -exports.removeListener = function(elem, type, callback) { - if (elem.removeEventListener) { - return elem.removeEventListener(type, callback, false); - } - if (elem.detachEvent) { - elem.detachEvent("on" + type, callback._wrapper || callback); - } -}; -exports.stopEvent = function(e) { - exports.stopPropagation(e); - exports.preventDefault(e); - return false; -}; - -exports.stopPropagation = function(e) { - if (e.stopPropagation) - e.stopPropagation(); - else - e.cancelBubble = true; -}; - -exports.preventDefault = function(e) { - if (e.preventDefault) - e.preventDefault(); - else - e.returnValue = false; -}; -exports.getButton = function(e) { - if (e.type == "dblclick") - return 0; - if (e.type == "contextmenu" || (e.ctrlKey && useragent.isMac)) - return 2; - if (e.preventDefault) { - return e.button; - } - else { - return {1:0, 2:2, 4:1}[e.button]; - } -}; - -exports.capture = function(el, eventHandler, releaseCaptureHandler) { - function onMouseUp(e) { - eventHandler && eventHandler(e); - releaseCaptureHandler && releaseCaptureHandler(e); - - exports.removeListener(document, "mousemove", eventHandler, true); - exports.removeListener(document, "mouseup", onMouseUp, true); - exports.removeListener(document, "dragstart", onMouseUp, true); - } - - exports.addListener(document, "mousemove", eventHandler, true); - exports.addListener(document, "mouseup", onMouseUp, true); - exports.addListener(document, "dragstart", onMouseUp, true); - - return onMouseUp; -}; - -exports.addMouseWheelListener = function(el, callback) { - if ("onmousewheel" in el) { - exports.addListener(el, "mousewheel", function(e) { - var factor = 8; - if (e.wheelDeltaX !== undefined) { - e.wheelX = -e.wheelDeltaX / factor; - e.wheelY = -e.wheelDeltaY / factor; - } else { - e.wheelX = 0; - e.wheelY = -e.wheelDelta / factor; - } - callback(e); - }); - } else if ("onwheel" in el) { - exports.addListener(el, "wheel", function(e) { - var factor = 0.35; - switch (e.deltaMode) { - case e.DOM_DELTA_PIXEL: - e.wheelX = e.deltaX * factor || 0; - e.wheelY = e.deltaY * factor || 0; - break; - case e.DOM_DELTA_LINE: - case e.DOM_DELTA_PAGE: - e.wheelX = (e.deltaX || 0) * 5; - e.wheelY = (e.deltaY || 0) * 5; - break; - } - - callback(e); - }); - } else { - exports.addListener(el, "DOMMouseScroll", function(e) { - if (e.axis && e.axis == e.HORIZONTAL_AXIS) { - e.wheelX = (e.detail || 0) * 5; - e.wheelY = 0; - } else { - e.wheelX = 0; - e.wheelY = (e.detail || 0) * 5; - } - callback(e); - }); - } -}; - -exports.addMultiMouseDownListener = function(el, timeouts, eventHandler, callbackName) { - var clicks = 0; - var startX, startY, timer; - var eventNames = { - 2: "dblclick", - 3: "tripleclick", - 4: "quadclick" - }; - - exports.addListener(el, "mousedown", function(e) { - if (exports.getButton(e) !== 0) { - clicks = 0; - } else if (e.detail > 1) { - clicks++; - if (clicks > 4) - clicks = 1; - } else { - clicks = 1; +exports.inherits = function(ctor, superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true } - if (useragent.isIE) { - var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5; - if (!timer || isNewClick) - clicks = 1; - if (timer) - clearTimeout(timer) - timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600); - - if (clicks == 1) { - startX = e.clientX; - startY = e.clientY; - } - } - - eventHandler[callbackName]("mousedown", e); - - if (clicks > 4) - clicks = 0; - else if (clicks > 1) - return eventHandler[callbackName](eventNames[clicks], e); }); - - if (useragent.isOldIE) { - exports.addListener(el, "dblclick", function(e) { - clicks = 2; - if (timer) - clearTimeout(timer); - timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600); - eventHandler[callbackName]("mousedown", e); - eventHandler[callbackName](eventNames[clicks], e); - }); - } }; -var getModifierHash = useragent.isMac && useragent.isOpera && !("KeyboardEvent" in window) - ? function(e) { - return 0 | (e.metaKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.ctrlKey ? 8 : 0); +exports.mixin = function(obj, mixin) { + for (var key in mixin) { + obj[key] = mixin[key]; } - : function(e) { - return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0); - }; - -exports.getModifierString = function(e) { - return keys.KEY_MODS[getModifierHash(e)]; + return obj; }; -function normalizeCommandKeys(callback, e, keyCode) { - var hashId = getModifierHash(e); - - if (!useragent.isMac && pressedKeys) { - if (pressedKeys[91] || pressedKeys[92]) - hashId |= 8; - if (pressedKeys.altGr) { - if ((3 & hashId) != 3) - pressedKeys.altGr = 0; - else - return; - } - if (keyCode === 18 || keyCode === 17) { - var location = e.location || e.keyLocation; - if (keyCode === 17 && location === 1) { - ts = e.timeStamp; - } else if (keyCode === 18 && hashId === 3 && location === 2) { - var dt = -ts; - ts = e.timeStamp; - dt += ts; - if (dt < 3) - pressedKeys.altGr = true; - } - } - } - - if (keyCode in keys.MODIFIER_KEYS) { - switch (keys.MODIFIER_KEYS[keyCode]) { - case "Alt": - hashId = 2; - break; - case "Shift": - hashId = 4; - break; - case "Ctrl": - hashId = 1; - break; - default: - hashId = 8; - break; - } - keyCode = -1; - } - - if (hashId & 8 && (keyCode === 91 || keyCode === 93)) { - keyCode = -1; - } - - if (!hashId && keyCode === 13) { - if (e.location || e.keyLocation === 3) { - callback(e, hashId, -keyCode); - if (e.defaultPrevented) - return; - } - } - if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) { - return false; - } - - return callback(e, hashId, keyCode); -} - -var pressedKeys = null; -var ts = 0; -exports.addCommandKeyListener = function(el, callback) { - var addListener = exports.addListener; - if (useragent.isOldGecko || (useragent.isOpera && !("KeyboardEvent" in window))) { - var lastKeyDownKeyCode = null; - addListener(el, "keydown", function(e) { - lastKeyDownKeyCode = e.keyCode; - }); - addListener(el, "keypress", function(e) { - return normalizeCommandKeys(callback, e, lastKeyDownKeyCode); - }); - } else { - var lastDefaultPrevented = null; - - addListener(el, "keydown", function(e) { - pressedKeys[e.keyCode] = true; - var result = normalizeCommandKeys(callback, e, e.keyCode); - lastDefaultPrevented = e.defaultPrevented; - return result; - }); - - addListener(el, "keypress", function(e) { - if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) { - exports.stopEvent(e); - lastDefaultPrevented = null; - } - }); - - addListener(el, "keyup", function(e) { - pressedKeys[e.keyCode] = null; - }); - - if (!pressedKeys) { - pressedKeys = Object.create(null); - addListener(window, "focus", function(e) { - pressedKeys = Object.create(null); - }); - } - } +exports.implement = function(proto, mixin) { + exports.mixin(proto, mixin); }; -if (window.postMessage && !useragent.isOldIE) { - var postMessageId = 1; - exports.nextTick = function(callback, win) { - win = win || window; - var messageName = "zero-timeout-message-" + postMessageId; - exports.addListener(win, "message", function listener(e) { - if (e.data == messageName) { - exports.stopPropagation(e); - exports.removeListener(win, "message", listener); - callback(); - } - }); - win.postMessage(messageName, "*"); - }; -} - - -exports.nextFrame = window.requestAnimationFrame || - window.mozRequestAnimationFrame || - window.webkitRequestAnimationFrame || - window.msRequestAnimationFrame || - window.oRequestAnimationFrame; - -if (exports.nextFrame) - exports.nextFrame = exports.nextFrame.bind(window); -else - exports.nextFrame = function(callback) { - setTimeout(callback, 17); - }; }); -define('ace/lib/keys', ['require', 'exports', 'module' , 'ace/lib/oop'], function(require, exports, module) { +define("ace/lib/keys",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/oop"], function(require, exports, module) { +"use strict"; +require("./fixoldbrowsers"); var oop = require("./oop"); var Keys = (function() { @@ -1627,8 +1283,8 @@ var Keys = (function() { 73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o', 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v', 87: 'w', 88: 'x', 89: 'y', 90: 'z', 107: '+', 109: '-', 110: '.', - 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`', 219: '[', - 220: '\\',221: ']', 222: '\'', + 186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`', + 219: '[', 220: '\\',221: ']', 222: "'", 111: '/', 106: '*' } }; var name, i; @@ -1647,16 +1303,19 @@ var Keys = (function() { ret.escape = ret.esc; ret.del = ret["delete"]; ret[173] = '-'; - + (function() { var mods = ["cmd", "ctrl", "alt", "shift"]; - for (var i = Math.pow(2, mods.length); i--;) { + for (var i = Math.pow(2, mods.length); i--;) { ret.KEY_MODS[i] = mods.filter(function(x) { return i & ret.KEY_MODS[x]; }).join("-") + "-"; } })(); + ret.KEY_MODS[0] = ""; + ret.KEY_MODS[-1] = "input-"; + return ret; })(); oop.mixin(exports, Keys); @@ -1670,35 +1329,8 @@ exports.keyCodeToString = function(keyCode) { }); -define('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) { - - -exports.inherits = function(ctor, superCtor) { - ctor.super_ = superCtor; - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); -}; - -exports.mixin = function(obj, mixin) { - for (var key in mixin) { - obj[key] = mixin[key]; - } - return obj; -}; - -exports.implement = function(proto, mixin) { - exports.mixin(proto, mixin); -}; - -}); - -define('ace/lib/useragent', ['require', 'exports', 'module' ], function(require, exports, module) { +define("ace/lib/useragent",["require","exports","module"], function(require, exports, module) { +"use strict"; exports.OS = { LINUX: "LINUX", MAC: "MAC", @@ -1727,8 +1359,8 @@ exports.isIE = : parseFloat((ua.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]); // for ie exports.isOldIE = exports.isIE && exports.isIE < 9; -exports.isGecko = exports.isMozilla = window.controllers && window.navigator.product === "Gecko"; -exports.isOldGecko = exports.isGecko && parseInt((ua.match(/rv\:(\d+)/)||[])[1], 10) < 4; +exports.isGecko = exports.isMozilla = (window.Controllers || window.controllers) && window.navigator.product === "Gecko"; +exports.isOldGecko = exports.isGecko && parseInt((ua.match(/rv:(\d+)/)||[])[1], 10) < 4; exports.isOpera = window.opera && Object.prototype.toString.call(window.opera) == "[object Opera]"; exports.isWebKit = parseFloat(ua.split("WebKit/")[1]) || undefined; @@ -1740,1633 +1372,357 @@ exports.isIPad = ua.indexOf("iPad") >= 0; exports.isTouchPad = ua.indexOf("TouchPad") >= 0; +exports.isChromeOS = ua.indexOf(" CrOS ") >= 0; + }); -define('ace/editor', ['require', 'exports', 'module' , 'ace/lib/fixoldbrowsers', 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/lang', 'ace/lib/useragent', 'ace/keyboard/textinput', 'ace/mouse/mouse_handler', 'ace/mouse/fold_handler', 'ace/keyboard/keybinding', 'ace/edit_session', 'ace/search', 'ace/range', 'ace/lib/event_emitter', 'ace/commands/command_manager', 'ace/commands/default_commands', 'ace/config'], function(require, exports, module) { +define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"], function(require, exports, module) { +"use strict"; +var keys = require("./keys"); +var useragent = require("./useragent"); -require("./lib/fixoldbrowsers"); +var pressedKeys = null; +var ts = 0; -var oop = require("./lib/oop"); -var dom = require("./lib/dom"); -var lang = require("./lib/lang"); -var useragent = require("./lib/useragent"); -var TextInput = require("./keyboard/textinput").TextInput; -var MouseHandler = require("./mouse/mouse_handler").MouseHandler; -var FoldHandler = require("./mouse/fold_handler").FoldHandler; -var KeyBinding = require("./keyboard/keybinding").KeyBinding; -var EditSession = require("./edit_session").EditSession; -var Search = require("./search").Search; -var Range = require("./range").Range; -var EventEmitter = require("./lib/event_emitter").EventEmitter; -var CommandManager = require("./commands/command_manager").CommandManager; -var defaultCommands = require("./commands/default_commands").commands; -var config = require("./config"); -var Editor = function(renderer, session) { - var container = renderer.getContainerElement(); - this.container = container; - this.renderer = renderer; - - this.commands = new CommandManager(useragent.isMac ? "mac" : "win", defaultCommands); - this.textInput = new TextInput(renderer.getTextAreaContainer(), this); - this.renderer.textarea = this.textInput.getElement(); - this.keyBinding = new KeyBinding(this); - this.$mouseHandler = new MouseHandler(this); - new FoldHandler(this); - - this.$blockScrolling = 0; - this.$search = new Search().set({ - wrap: true - }); - - this.$historyTracker = this.$historyTracker.bind(this); - this.commands.on("exec", this.$historyTracker); - - this.$initOperationListeners(); - - this._$emitInputEvent = lang.delayedCall(function() { - this._signal("input", {}); - this.session.bgTokenizer && this.session.bgTokenizer.scheduleStart(); - }.bind(this)); - - this.on("change", function(_, _self) { - _self._$emitInputEvent.schedule(31); - }); - - this.setSession(session || new EditSession("")); - config.resetOptions(this); - config._signal("editor", this); +exports.addListener = function(elem, type, callback) { + if (elem.addEventListener) { + return elem.addEventListener(type, callback, false); + } + if (elem.attachEvent) { + var wrapper = function() { + callback.call(elem, window.event); + }; + callback._wrapper = wrapper; + elem.attachEvent("on" + type, wrapper); + } }; -(function(){ +exports.removeListener = function(elem, type, callback) { + if (elem.removeEventListener) { + return elem.removeEventListener(type, callback, false); + } + if (elem.detachEvent) { + elem.detachEvent("on" + type, callback._wrapper || callback); + } +}; +exports.stopEvent = function(e) { + exports.stopPropagation(e); + exports.preventDefault(e); + return false; +}; - oop.implement(this, EventEmitter); +exports.stopPropagation = function(e) { + if (e.stopPropagation) + e.stopPropagation(); + else + e.cancelBubble = true; +}; - this.$initOperationListeners = function() { - function last(a) {return a[a.length - 1]} +exports.preventDefault = function(e) { + if (e.preventDefault) + e.preventDefault(); + else + e.returnValue = false; +}; +exports.getButton = function(e) { + if (e.type == "dblclick") + return 0; + if (e.type == "contextmenu" || (useragent.isMac && (e.ctrlKey && !e.altKey && !e.shiftKey))) + return 2; + if (e.preventDefault) { + return e.button; + } + else { + return {1:0, 2:2, 4:1}[e.button]; + } +}; - this.selections = []; - this.commands.on("exec", function(e) { - this.startOperation(e); +exports.capture = function(el, eventHandler, releaseCaptureHandler) { + function onMouseUp(e) { + eventHandler && eventHandler(e); + releaseCaptureHandler && releaseCaptureHandler(e); - var command = e.command; - if (command.aceCommandGroup == "fileJump") { - var prev = this.prevOp; - if (!prev || prev.command.aceCommandGroup != "fileJump") { - this.lastFileJumpPos = last(this.selections); - } + exports.removeListener(document, "mousemove", eventHandler, true); + exports.removeListener(document, "mouseup", onMouseUp, true); + exports.removeListener(document, "dragstart", onMouseUp, true); + } + + exports.addListener(document, "mousemove", eventHandler, true); + exports.addListener(document, "mouseup", onMouseUp, true); + exports.addListener(document, "dragstart", onMouseUp, true); + + return onMouseUp; +}; + +exports.addTouchMoveListener = function (el, callback) { + if ("ontouchmove" in el) { + var startx, starty; + exports.addListener(el, "touchstart", function (e) { + var touchObj = e.changedTouches[0]; + startx = touchObj.clientX; + starty = touchObj.clientY; + }); + exports.addListener(el, "touchmove", function (e) { + var factor = 1, + touchObj = e.changedTouches[0]; + + e.wheelX = -(touchObj.clientX - startx) / factor; + e.wheelY = -(touchObj.clientY - starty) / factor; + + startx = touchObj.clientX; + starty = touchObj.clientY; + + callback(e); + }); + } +}; + +exports.addMouseWheelListener = function(el, callback) { + if ("onmousewheel" in el) { + exports.addListener(el, "mousewheel", function(e) { + var factor = 8; + if (e.wheelDeltaX !== undefined) { + e.wheelX = -e.wheelDeltaX / factor; + e.wheelY = -e.wheelDeltaY / factor; } else { - this.lastFileJumpPos = null; + e.wheelX = 0; + e.wheelY = -e.wheelDelta / factor; } - }.bind(this), true); - - this.commands.on("afterExec", function(e) { - var command = e.command; - - if (command.aceCommandGroup == "fileJump") { - if (this.lastFileJumpPos && !this.curOp.selectionChanged) { - this.selection.fromJSON(this.lastFileJumpPos); - } - } - this.endOperation(e); - }.bind(this), true); - - this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this)); - - this.on("change", function() { - this.curOp || this.startOperation(); - this.curOp.docChanged = true; - }.bind(this), true); - - this.on("changeSelection", function() { - this.curOp || this.startOperation(); - this.curOp.selectionChanged = true; - }.bind(this), true); - }; - - this.curOp = null; - this.prevOp = {}; - this.startOperation = function(commadEvent) { - if (this.curOp) { - if (!commadEvent || this.curOp.command) - return; - this.prevOp = this.curOp; - } - if (!commadEvent) { - this.previousCommand = null; - commadEvent = {}; - } - - this.$opResetTimer.schedule(); - this.curOp = { - command: commadEvent.command || {}, - args: commadEvent.args, - scrollTop: this.renderer.scrollTop - }; - - var command = this.curOp.command; - if (command && command.scrollIntoView) - this.$blockScrolling++; - - this.selections.push(this.selection.toJSON()); - }; - - this.endOperation = function() { - if (this.curOp) { - var command = this.curOp.command; - if (command && command.scrollIntoView) { - this.$blockScrolling--; - switch (command.scrollIntoView) { - case "center": - this.renderer.scrollCursorIntoView(null, 0.5); - break; - case "animate": - case "cursor": - this.renderer.scrollCursorIntoView(); - break; - case "selectionPart": - var range = this.selection.getRange(); - var config = this.renderer.layerConfig; - if (range.start.row >= config.lastRow || range.end.row <= config.firstRow) { - this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead); - } - break; - default: - break; - } - if (command.scrollIntoView == "animate") - this.renderer.animateScrolling(this.curOp.scrollTop); + callback(e); + }); + } else if ("onwheel" in el) { + exports.addListener(el, "wheel", function(e) { + var factor = 0.35; + switch (e.deltaMode) { + case e.DOM_DELTA_PIXEL: + e.wheelX = e.deltaX * factor || 0; + e.wheelY = e.deltaY * factor || 0; + break; + case e.DOM_DELTA_LINE: + case e.DOM_DELTA_PAGE: + e.wheelX = (e.deltaX || 0) * 5; + e.wheelY = (e.deltaY || 0) * 5; + break; } - this.prevOp = this.curOp; - this.curOp = null; - } - }; - - this.$historyTracker = function(e) { - if (!this.$mergeUndoDeltas) - return; - - - var prev = this.prevOp; - var mergeableCommands = ["backspace", "del", "insertstring"]; - var shouldMerge = prev.command && (e.command.name == prev.command.name); - if (e.command.name == "insertstring") { - var text = e.args; - if (this.mergeNextCommand === undefined) - this.mergeNextCommand = true; - - shouldMerge = shouldMerge - && this.mergeNextCommand // previous command allows to coalesce with - && (!/\s/.test(text) || /\s/.test(prev.args)); // previous insertion was of same type - - this.mergeNextCommand = true; - } else { - shouldMerge = shouldMerge - && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable - } - - if ( - this.$mergeUndoDeltas != "always" - && Date.now() - this.sequenceStartTime > 2000 - ) { - shouldMerge = false; // the sequence is too long - } - - if (shouldMerge) - this.session.mergeUndoDeltas = true; - else if (mergeableCommands.indexOf(e.command.name) !== -1) - this.sequenceStartTime = Date.now(); - }; - this.setKeyboardHandler = function(keyboardHandler) { - if (!keyboardHandler) { - this.keyBinding.setKeyboardHandler(null); - } else if (typeof keyboardHandler === "string") { - this.$keybindingId = keyboardHandler; - var _self = this; - config.loadModule(["keybinding", keyboardHandler], function(module) { - if (_self.$keybindingId == keyboardHandler) - _self.keyBinding.setKeyboardHandler(module && module.handler); - }); - } else { - this.$keybindingId = null; - this.keyBinding.setKeyboardHandler(keyboardHandler); - } - }; - this.getKeyboardHandler = function() { - return this.keyBinding.getKeyboardHandler(); - }; - this.setSession = function(session) { - if (this.session == session) - return; - - var oldSession = this.session; - if (oldSession) { - this.session.removeEventListener("change", this.$onDocumentChange); - this.session.removeEventListener("changeMode", this.$onChangeMode); - this.session.removeEventListener("tokenizerUpdate", this.$onTokenizerUpdate); - this.session.removeEventListener("changeTabSize", this.$onChangeTabSize); - this.session.removeEventListener("changeWrapLimit", this.$onChangeWrapLimit); - this.session.removeEventListener("changeWrapMode", this.$onChangeWrapMode); - this.session.removeEventListener("onChangeFold", this.$onChangeFold); - this.session.removeEventListener("changeFrontMarker", this.$onChangeFrontMarker); - this.session.removeEventListener("changeBackMarker", this.$onChangeBackMarker); - this.session.removeEventListener("changeBreakpoint", this.$onChangeBreakpoint); - this.session.removeEventListener("changeAnnotation", this.$onChangeAnnotation); - this.session.removeEventListener("changeOverwrite", this.$onCursorChange); - this.session.removeEventListener("changeScrollTop", this.$onScrollTopChange); - this.session.removeEventListener("changeScrollLeft", this.$onScrollLeftChange); - - var selection = this.session.getSelection(); - selection.removeEventListener("changeCursor", this.$onCursorChange); - selection.removeEventListener("changeSelection", this.$onSelectionChange); - } - - this.session = session; - if (session) { - this.$onDocumentChange = this.onDocumentChange.bind(this); - session.addEventListener("change", this.$onDocumentChange); - this.renderer.setSession(session); - - this.$onChangeMode = this.onChangeMode.bind(this); - session.addEventListener("changeMode", this.$onChangeMode); - - this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this); - session.addEventListener("tokenizerUpdate", this.$onTokenizerUpdate); - - this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer); - session.addEventListener("changeTabSize", this.$onChangeTabSize); - - this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this); - session.addEventListener("changeWrapLimit", this.$onChangeWrapLimit); - - this.$onChangeWrapMode = this.onChangeWrapMode.bind(this); - session.addEventListener("changeWrapMode", this.$onChangeWrapMode); - - this.$onChangeFold = this.onChangeFold.bind(this); - session.addEventListener("changeFold", this.$onChangeFold); - - this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this); - this.session.addEventListener("changeFrontMarker", this.$onChangeFrontMarker); - - this.$onChangeBackMarker = this.onChangeBackMarker.bind(this); - this.session.addEventListener("changeBackMarker", this.$onChangeBackMarker); - - this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this); - this.session.addEventListener("changeBreakpoint", this.$onChangeBreakpoint); - - this.$onChangeAnnotation = this.onChangeAnnotation.bind(this); - this.session.addEventListener("changeAnnotation", this.$onChangeAnnotation); - - this.$onCursorChange = this.onCursorChange.bind(this); - this.session.addEventListener("changeOverwrite", this.$onCursorChange); - - this.$onScrollTopChange = this.onScrollTopChange.bind(this); - this.session.addEventListener("changeScrollTop", this.$onScrollTopChange); - - this.$onScrollLeftChange = this.onScrollLeftChange.bind(this); - this.session.addEventListener("changeScrollLeft", this.$onScrollLeftChange); - - this.selection = session.getSelection(); - this.selection.addEventListener("changeCursor", this.$onCursorChange); - - this.$onSelectionChange = this.onSelectionChange.bind(this); - this.selection.addEventListener("changeSelection", this.$onSelectionChange); - - this.onChangeMode(); - - this.$blockScrolling += 1; - this.onCursorChange(); - this.$blockScrolling -= 1; - - this.onScrollTopChange(); - this.onScrollLeftChange(); - this.onSelectionChange(); - this.onChangeFrontMarker(); - this.onChangeBackMarker(); - this.onChangeBreakpoint(); - this.onChangeAnnotation(); - this.session.getUseWrapMode() && this.renderer.adjustWrapLimit(); - this.renderer.updateFull(); - } - - this._signal("changeSession", { - session: session, - oldSession: oldSession + callback(e); }); - - oldSession && oldSession._signal("changeEditor", {oldEditor: this}); - session && session._signal("changeEditor", {editor: this}); - }; - this.getSession = function() { - return this.session; - }; - this.setValue = function(val, cursorPos) { - this.session.doc.setValue(val); - - if (!cursorPos) - this.selectAll(); - else if (cursorPos == 1) - this.navigateFileEnd(); - else if (cursorPos == -1) - this.navigateFileStart(); - - return val; - }; - this.getValue = function() { - return this.session.getValue(); - }; - this.getSelection = function() { - return this.selection; - }; - this.resize = function(force) { - this.renderer.onResize(force); - }; - this.setTheme = function(theme, cb) { - this.renderer.setTheme(theme, cb); - }; - this.getTheme = function() { - return this.renderer.getTheme(); - }; - this.setStyle = function(style) { - this.renderer.setStyle(style); - }; - this.unsetStyle = function(style) { - this.renderer.unsetStyle(style); - }; - this.getFontSize = function () { - return this.getOption("fontSize") || - dom.computedStyle(this.container, "fontSize"); - }; - this.setFontSize = function(size) { - this.setOption("fontSize", size); - }; - - this.$highlightBrackets = function() { - if (this.session.$bracketHighlight) { - this.session.removeMarker(this.session.$bracketHighlight); - this.session.$bracketHighlight = null; - } - - if (this.$highlightPending) { - return; - } - var self = this; - this.$highlightPending = true; - setTimeout(function() { - self.$highlightPending = false; - - var pos = self.session.findMatchingBracket(self.getCursorPosition()); - if (pos) { - var range = new Range(pos.row, pos.column, pos.row, pos.column+1); - } else if (self.session.$mode.getMatching) { - var range = self.session.$mode.getMatching(self.session); - } - if (range) - self.session.$bracketHighlight = self.session.addMarker(range, "ace_bracket", "text"); - }, 50); - }; - this.focus = function() { - var _self = this; - setTimeout(function() { - _self.textInput.focus(); - }); - this.textInput.focus(); - }; - this.isFocused = function() { - return this.textInput.isFocused(); - }; - this.blur = function() { - this.textInput.blur(); - }; - this.onFocus = function() { - if (this.$isFocused) - return; - this.$isFocused = true; - this.renderer.showCursor(); - this.renderer.visualizeFocus(); - this._emit("focus"); - }; - this.onBlur = function() { - if (!this.$isFocused) - return; - this.$isFocused = false; - this.renderer.hideCursor(); - this.renderer.visualizeBlur(); - this._emit("blur"); - }; - - this.$cursorChange = function() { - this.renderer.updateCursor(); - }; - this.onDocumentChange = function(e) { - var delta = e.data; - var range = delta.range; - var lastRow; - - if (range.start.row == range.end.row && delta.action != "insertLines" && delta.action != "removeLines") - lastRow = range.end.row; - else - lastRow = Infinity; - this.renderer.updateLines(range.start.row, lastRow); - - this._signal("change", e); - this.$cursorChange(); - }; - - this.onTokenizerUpdate = function(e) { - var rows = e.data; - this.renderer.updateLines(rows.first, rows.last); - }; - - - this.onScrollTopChange = function() { - this.renderer.scrollToY(this.session.getScrollTop()); - }; - - this.onScrollLeftChange = function() { - this.renderer.scrollToX(this.session.getScrollLeft()); - }; - this.onCursorChange = function() { - this.$cursorChange(); - - if (!this.$blockScrolling) { - this.renderer.scrollCursorIntoView(); - } - - this.$highlightBrackets(); - this.$updateHighlightActiveLine(); - this._signal("changeSelection"); - }; - - this.$updateHighlightActiveLine = function() { - var session = this.getSession(); - - var highlight; - if (this.$highlightActiveLine) { - if ((this.$selectionStyle != "line" || !this.selection.isMultiLine())) - highlight = this.getCursorPosition(); - if (this.renderer.$maxLines && this.session.getLength() === 1 && !(this.renderer.$minLines > 1)) - highlight = false; - } - - if (session.$highlightLineMarker && !highlight) { - session.removeMarker(session.$highlightLineMarker.id); - session.$highlightLineMarker = null; - } else if (!session.$highlightLineMarker && highlight) { - var range = new Range(highlight.row, highlight.column, highlight.row, Infinity); - range.id = session.addMarker(range, "ace_active-line", "screenLine"); - session.$highlightLineMarker = range; - } else if (highlight) { - session.$highlightLineMarker.start.row = highlight.row; - session.$highlightLineMarker.end.row = highlight.row; - session.$highlightLineMarker.start.column = highlight.column; - session._signal("changeBackMarker"); - } - }; - - this.onSelectionChange = function(e) { - var session = this.session; - - if (session.$selectionMarker) { - session.removeMarker(session.$selectionMarker); - } - session.$selectionMarker = null; - - if (!this.selection.isEmpty()) { - var range = this.selection.getRange(); - var style = this.getSelectionStyle(); - session.$selectionMarker = session.addMarker(range, "ace_selection", style); - } else { - this.$updateHighlightActiveLine(); - } - - var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp(); - this.session.highlight(re); - - this._signal("changeSelection"); - }; - - this.$getSelectionHighLightRegexp = function() { - var session = this.session; - - var selection = this.getSelectionRange(); - if (selection.isEmpty() || selection.isMultiLine()) - return; - - var startOuter = selection.start.column - 1; - var endOuter = selection.end.column + 1; - var line = session.getLine(selection.start.row); - var lineCols = line.length; - var needle = line.substring(Math.max(startOuter, 0), - Math.min(endOuter, lineCols)); - if ((startOuter >= 0 && /^[\w\d]/.test(needle)) || - (endOuter <= lineCols && /[\w\d]$/.test(needle))) - return; - - needle = line.substring(selection.start.column, selection.end.column); - if (!/^[\w\d]+$/.test(needle)) - return; - - var re = this.$search.$assembleRegExp({ - wholeWord: true, - caseSensitive: true, - needle: needle - }); - - return re; - }; - - - this.onChangeFrontMarker = function() { - this.renderer.updateFrontMarkers(); - }; - - this.onChangeBackMarker = function() { - this.renderer.updateBackMarkers(); - }; - - - this.onChangeBreakpoint = function() { - this.renderer.updateBreakpoints(); - }; - - this.onChangeAnnotation = function() { - this.renderer.setAnnotations(this.session.getAnnotations()); - }; - - - this.onChangeMode = function(e) { - this.renderer.updateText(); - this._emit("changeMode", e); - }; - - - this.onChangeWrapLimit = function() { - this.renderer.updateFull(); - }; - - this.onChangeWrapMode = function() { - this.renderer.onResize(true); - }; - - - this.onChangeFold = function() { - this.$updateHighlightActiveLine(); - this.renderer.updateFull(); - }; - this.getSelectedText = function() { - return this.session.getTextRange(this.getSelectionRange()); - }; - this.getCopyText = function() { - var text = this.getSelectedText(); - this._signal("copy", text); - return text; - }; - this.onCopy = function() { - this.commands.exec("copy", this); - }; - this.onCut = function() { - this.commands.exec("cut", this); - }; - this.onPaste = function(text) { - if (this.$readOnly) - return; - var e = {text: text}; - this._signal("paste", e); - this.insert(e.text, true); - }; - - - this.execCommand = function(command, args) { - this.commands.exec(command, this, args); - }; - this.insert = function(text, pasted) { - var session = this.session; - var mode = session.getMode(); - var cursor = this.getCursorPosition(); - - if (this.getBehavioursEnabled() && !pasted) { - var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text); - if (transform) { - if (text !== transform.text) { - this.session.mergeUndoDeltas = false; - this.$mergeNextCommand = false; - } - text = transform.text; - - } - } - - if (text == "\t") - text = this.session.getTabString(); - if (!this.selection.isEmpty()) { - var range = this.getSelectionRange(); - cursor = this.session.remove(range); - this.clearSelection(); - } - else if (this.session.getOverwrite()) { - var range = new Range.fromPoints(cursor, cursor); - range.end.column += text.length; - this.session.remove(range); - } - - if (text == "\n" || text == "\r\n") { - var line = session.getLine(cursor.row); - if (cursor.column > line.search(/\S|$/)) { - var d = line.substr(cursor.column).search(/\S|$/); - session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d); - } - } - this.clearSelection(); - - var start = cursor.column; - var lineState = session.getState(cursor.row); - var line = session.getLine(cursor.row); - var shouldOutdent = mode.checkOutdent(lineState, line, text); - var end = session.insert(cursor, text); - - if (transform && transform.selection) { - if (transform.selection.length == 2) { // Transform relative to the current column - this.selection.setSelectionRange( - new Range(cursor.row, start + transform.selection[0], - cursor.row, start + transform.selection[1])); - } else { // Transform relative to the current row. - this.selection.setSelectionRange( - new Range(cursor.row + transform.selection[0], - transform.selection[1], - cursor.row + transform.selection[2], - transform.selection[3])); - } - } - - if (session.getDocument().isNewLine(text)) { - var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString()); - - session.insert({row: cursor.row+1, column: 0}, lineIndent); - } - if (shouldOutdent) - mode.autoOutdent(lineState, session, cursor.row); - }; - - this.onTextInput = function(text) { - this.keyBinding.onTextInput(text); - }; - - this.onCommandKey = function(e, hashId, keyCode) { - this.keyBinding.onCommandKey(e, hashId, keyCode); - }; - this.setOverwrite = function(overwrite) { - this.session.setOverwrite(overwrite); - }; - this.getOverwrite = function() { - return this.session.getOverwrite(); - }; - this.toggleOverwrite = function() { - this.session.toggleOverwrite(); - }; - this.setScrollSpeed = function(speed) { - this.setOption("scrollSpeed", speed); - }; - this.getScrollSpeed = function() { - return this.getOption("scrollSpeed"); - }; - this.setDragDelay = function(dragDelay) { - this.setOption("dragDelay", dragDelay); - }; - this.getDragDelay = function() { - return this.getOption("dragDelay"); - }; - this.setSelectionStyle = function(val) { - this.setOption("selectionStyle", val); - }; - this.getSelectionStyle = function() { - return this.getOption("selectionStyle"); - }; - this.setHighlightActiveLine = function(shouldHighlight) { - this.setOption("highlightActiveLine", shouldHighlight); - }; - this.getHighlightActiveLine = function() { - return this.getOption("highlightActiveLine"); - }; - this.setHighlightGutterLine = function(shouldHighlight) { - this.setOption("highlightGutterLine", shouldHighlight); - }; - - this.getHighlightGutterLine = function() { - return this.getOption("highlightGutterLine"); - }; - this.setHighlightSelectedWord = function(shouldHighlight) { - this.setOption("highlightSelectedWord", shouldHighlight); - }; - this.getHighlightSelectedWord = function() { - return this.$highlightSelectedWord; - }; - - this.setAnimatedScroll = function(shouldAnimate){ - this.renderer.setAnimatedScroll(shouldAnimate); - }; - - this.getAnimatedScroll = function(){ - return this.renderer.getAnimatedScroll(); - }; - this.setShowInvisibles = function(showInvisibles) { - this.renderer.setShowInvisibles(showInvisibles); - }; - this.getShowInvisibles = function() { - return this.renderer.getShowInvisibles(); - }; - - this.setDisplayIndentGuides = function(display) { - this.renderer.setDisplayIndentGuides(display); - }; - - this.getDisplayIndentGuides = function() { - return this.renderer.getDisplayIndentGuides(); - }; - this.setShowPrintMargin = function(showPrintMargin) { - this.renderer.setShowPrintMargin(showPrintMargin); - }; - this.getShowPrintMargin = function() { - return this.renderer.getShowPrintMargin(); - }; - this.setPrintMarginColumn = function(showPrintMargin) { - this.renderer.setPrintMarginColumn(showPrintMargin); - }; - this.getPrintMarginColumn = function() { - return this.renderer.getPrintMarginColumn(); - }; - this.setReadOnly = function(readOnly) { - this.setOption("readOnly", readOnly); - }; - this.getReadOnly = function() { - return this.getOption("readOnly"); - }; - this.setBehavioursEnabled = function (enabled) { - this.setOption("behavioursEnabled", enabled); - }; - this.getBehavioursEnabled = function () { - return this.getOption("behavioursEnabled"); - }; - this.setWrapBehavioursEnabled = function (enabled) { - this.setOption("wrapBehavioursEnabled", enabled); - }; - this.getWrapBehavioursEnabled = function () { - return this.getOption("wrapBehavioursEnabled"); - }; - this.setShowFoldWidgets = function(show) { - this.setOption("showFoldWidgets", show); - - }; - this.getShowFoldWidgets = function() { - return this.getOption("showFoldWidgets"); - }; - - this.setFadeFoldWidgets = function(fade) { - this.setOption("fadeFoldWidgets", fade); - }; - - this.getFadeFoldWidgets = function() { - return this.getOption("fadeFoldWidgets"); - }; - this.remove = function(dir) { - if (this.selection.isEmpty()){ - if (dir == "left") - this.selection.selectLeft(); - else - this.selection.selectRight(); - } - - var range = this.getSelectionRange(); - if (this.getBehavioursEnabled()) { - var session = this.session; - var state = session.getState(range.start.row); - var new_range = session.getMode().transformAction(state, 'deletion', this, session, range); - - if (range.end.column === 0) { - var text = session.getTextRange(range); - if (text[text.length - 1] == "\n") { - var line = session.getLine(range.end.row); - if (/^\s+$/.test(line)) { - range.end.column = line.length; - } - } - } - if (new_range) - range = new_range; - } - - this.session.remove(range); - this.clearSelection(); - }; - this.removeWordRight = function() { - if (this.selection.isEmpty()) - this.selection.selectWordRight(); - - this.session.remove(this.getSelectionRange()); - this.clearSelection(); - }; - this.removeWordLeft = function() { - if (this.selection.isEmpty()) - this.selection.selectWordLeft(); - - this.session.remove(this.getSelectionRange()); - this.clearSelection(); - }; - this.removeToLineStart = function() { - if (this.selection.isEmpty()) - this.selection.selectLineStart(); - - this.session.remove(this.getSelectionRange()); - this.clearSelection(); - }; - this.removeToLineEnd = function() { - if (this.selection.isEmpty()) - this.selection.selectLineEnd(); - - var range = this.getSelectionRange(); - if (range.start.column == range.end.column && range.start.row == range.end.row) { - range.end.column = 0; - range.end.row++; - } - - this.session.remove(range); - this.clearSelection(); - }; - this.splitLine = function() { - if (!this.selection.isEmpty()) { - this.session.remove(this.getSelectionRange()); - this.clearSelection(); - } - - var cursor = this.getCursorPosition(); - this.insert("\n"); - this.moveCursorToPosition(cursor); - }; - this.transposeLetters = function() { - if (!this.selection.isEmpty()) { - return; - } - - var cursor = this.getCursorPosition(); - var column = cursor.column; - if (column === 0) - return; - - var line = this.session.getLine(cursor.row); - var swap, range; - if (column < line.length) { - swap = line.charAt(column) + line.charAt(column-1); - range = new Range(cursor.row, column-1, cursor.row, column+1); - } - else { - swap = line.charAt(column-1) + line.charAt(column-2); - range = new Range(cursor.row, column-2, cursor.row, column); - } - this.session.replace(range, swap); - }; - this.toLowerCase = function() { - var originalRange = this.getSelectionRange(); - if (this.selection.isEmpty()) { - this.selection.selectWord(); - } - - var range = this.getSelectionRange(); - var text = this.session.getTextRange(range); - this.session.replace(range, text.toLowerCase()); - this.selection.setSelectionRange(originalRange); - }; - this.toUpperCase = function() { - var originalRange = this.getSelectionRange(); - if (this.selection.isEmpty()) { - this.selection.selectWord(); - } - - var range = this.getSelectionRange(); - var text = this.session.getTextRange(range); - this.session.replace(range, text.toUpperCase()); - this.selection.setSelectionRange(originalRange); - }; - this.indent = function() { - var session = this.session; - var range = this.getSelectionRange(); - - if (range.start.row < range.end.row) { - var rows = this.$getSelectedRows(); - session.indentRows(rows.first, rows.last, "\t"); - return; - } else if (range.start.column < range.end.column) { - var text = session.getTextRange(range); - if (!/^\s+$/.test(text)) { - var rows = this.$getSelectedRows(); - session.indentRows(rows.first, rows.last, "\t"); - return; - } - } - - var line = session.getLine(range.start.row); - var position = range.start; - var size = session.getTabSize(); - var column = session.documentToScreenColumn(position.row, position.column); - - if (this.session.getUseSoftTabs()) { - var count = (size - column % size); - var indentString = lang.stringRepeat(" ", count); - } else { - var count = column % size; - while (line[range.start.column] == " " && count) { - range.start.column--; - count--; - } - this.selection.setSelectionRange(range); - indentString = "\t"; - } - return this.insert(indentString); - }; - this.blockIndent = function() { - var rows = this.$getSelectedRows(); - this.session.indentRows(rows.first, rows.last, "\t"); - }; - this.blockOutdent = function() { - var selection = this.session.getSelection(); - this.session.outdentRows(selection.getRange()); - }; - this.sortLines = function() { - var rows = this.$getSelectedRows(); - var session = this.session; - - var lines = []; - for (i = rows.first; i <= rows.last; i++) - lines.push(session.getLine(i)); - - lines.sort(function(a, b) { - if (a.toLowerCase() < b.toLowerCase()) return -1; - if (a.toLowerCase() > b.toLowerCase()) return 1; - return 0; - }); - - var deleteRange = new Range(0, 0, 0, 0); - for (var i = rows.first; i <= rows.last; i++) { - var line = session.getLine(i); - deleteRange.start.row = i; - deleteRange.end.row = i; - deleteRange.end.column = line.length; - session.replace(deleteRange, lines[i-rows.first]); - } - }; - this.toggleCommentLines = function() { - var state = this.session.getState(this.getCursorPosition().row); - var rows = this.$getSelectedRows(); - this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last); - }; - - this.toggleBlockComment = function() { - var cursor = this.getCursorPosition(); - var state = this.session.getState(cursor.row); - var range = this.getSelectionRange(); - this.session.getMode().toggleBlockComment(state, this.session, range, cursor); - }; - this.getNumberAt = function(row, column) { - var _numberRx = /[\-]?[0-9]+(?:\.[0-9]+)?/g; - _numberRx.lastIndex = 0; - - var s = this.session.getLine(row); - while (_numberRx.lastIndex < column) { - var m = _numberRx.exec(s); - if(m.index <= column && m.index+m[0].length >= column){ - var number = { - value: m[0], - start: m.index, - end: m.index+m[0].length - }; - return number; - } - } - return null; - }; - this.modifyNumber = function(amount) { - var row = this.selection.getCursor().row; - var column = this.selection.getCursor().column; - var charRange = new Range(row, column-1, row, column); - - var c = this.session.getTextRange(charRange); - if (!isNaN(parseFloat(c)) && isFinite(c)) { - var nr = this.getNumberAt(row, column); - if (nr) { - var fp = nr.value.indexOf(".") >= 0 ? nr.start + nr.value.indexOf(".") + 1 : nr.end; - var decimals = nr.start + nr.value.length - fp; - - var t = parseFloat(nr.value); - t *= Math.pow(10, decimals); - - - if(fp !== nr.end && column < fp){ - amount *= Math.pow(10, nr.end - column - 1); - } else { - amount *= Math.pow(10, nr.end - column); - } - - t += amount; - t /= Math.pow(10, decimals); - var nnr = t.toFixed(decimals); - var replaceRange = new Range(row, nr.start, row, nr.end); - this.session.replace(replaceRange, nnr); - this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length)); - - } - } - }; - this.removeLines = function() { - var rows = this.$getSelectedRows(); - var range; - if (rows.first === 0 || rows.last+1 < this.session.getLength()) - range = new Range(rows.first, 0, rows.last+1, 0); - else - range = new Range( - rows.first-1, this.session.getLine(rows.first-1).length, - rows.last, this.session.getLine(rows.last).length - ); - this.session.remove(range); - this.clearSelection(); - }; - - this.duplicateSelection = function() { - var sel = this.selection; - var doc = this.session; - var range = sel.getRange(); - var reverse = sel.isBackwards(); - if (range.isEmpty()) { - var row = range.start.row; - doc.duplicateLines(row, row); - } else { - var point = reverse ? range.start : range.end; - var endPoint = doc.insert(point, doc.getTextRange(range), false); - range.start = point; - range.end = endPoint; - - sel.setSelectionRange(range, reverse); - } - }; - this.moveLinesDown = function() { - this.$moveLines(function(firstRow, lastRow) { - return this.session.moveLinesDown(firstRow, lastRow); - }); - }; - this.moveLinesUp = function() { - this.$moveLines(function(firstRow, lastRow) { - return this.session.moveLinesUp(firstRow, lastRow); - }); - }; - this.moveText = function(range, toPosition, copy) { - return this.session.moveText(range, toPosition, copy); - }; - this.copyLinesUp = function() { - this.$moveLines(function(firstRow, lastRow) { - this.session.duplicateLines(firstRow, lastRow); - return 0; - }); - }; - this.copyLinesDown = function() { - this.$moveLines(function(firstRow, lastRow) { - return this.session.duplicateLines(firstRow, lastRow); - }); - }; - this.$moveLines = function(mover) { - var selection = this.selection; - if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) { - var range = selection.toOrientedRange(); - var rows = this.$getSelectedRows(range); - var linesMoved = mover.call(this, rows.first, rows.last); - range.moveBy(linesMoved, 0); - selection.fromOrientedRange(range); - } else { - var ranges = selection.rangeList.ranges; - selection.rangeList.detach(this.session); - - for (var i = ranges.length; i--; ) { - var rangeIndex = i; - var rows = ranges[i].collapseRows(); - var last = rows.end.row; - var first = rows.start.row; - while (i--) { - rows = ranges[i].collapseRows(); - if (first - rows.end.row <= 1) - first = rows.end.row; - else - break; - } - i++; - - var linesMoved = mover.call(this, first, last); - while (rangeIndex >= i) { - ranges[rangeIndex].moveBy(linesMoved, 0); - rangeIndex--; - } - } - selection.fromOrientedRange(selection.ranges[0]); - selection.rangeList.attach(this.session); - } - }; - this.$getSelectedRows = function() { - var range = this.getSelectionRange().collapseRows(); - - return { - first: this.session.getRowFoldStart(range.start.row), - last: this.session.getRowFoldEnd(range.end.row) - }; - }; - - this.onCompositionStart = function(text) { - this.renderer.showComposition(this.getCursorPosition()); - }; - - this.onCompositionUpdate = function(text) { - this.renderer.setCompositionText(text); - }; - - this.onCompositionEnd = function() { - this.renderer.hideComposition(); - }; - this.getFirstVisibleRow = function() { - return this.renderer.getFirstVisibleRow(); - }; - this.getLastVisibleRow = function() { - return this.renderer.getLastVisibleRow(); - }; - this.isRowVisible = function(row) { - return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow()); - }; - this.isRowFullyVisible = function(row) { - return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow()); - }; - this.$getVisibleRowCount = function() { - return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1; - }; - - this.$moveByPage = function(dir, select) { - var renderer = this.renderer; - var config = this.renderer.layerConfig; - var rows = dir * Math.floor(config.height / config.lineHeight); - - this.$blockScrolling++; - if (select === true) { - this.selection.$moveSelection(function(){ - this.moveCursorBy(rows, 0); - }); - } else if (select === false) { - this.selection.moveCursorBy(rows, 0); - this.selection.clearSelection(); - } - this.$blockScrolling--; - - var scrollTop = renderer.scrollTop; - - renderer.scrollBy(0, rows * config.lineHeight); - if (select != null) - renderer.scrollCursorIntoView(null, 0.5); - - renderer.animateScrolling(scrollTop); - }; - this.selectPageDown = function() { - this.$moveByPage(1, true); - }; - this.selectPageUp = function() { - this.$moveByPage(-1, true); - }; - this.gotoPageDown = function() { - this.$moveByPage(1, false); - }; - this.gotoPageUp = function() { - this.$moveByPage(-1, false); - }; - this.scrollPageDown = function() { - this.$moveByPage(1); - }; - this.scrollPageUp = function() { - this.$moveByPage(-1); - }; - this.scrollToRow = function(row) { - this.renderer.scrollToRow(row); - }; - this.scrollToLine = function(line, center, animate, callback) { - this.renderer.scrollToLine(line, center, animate, callback); - }; - this.centerSelection = function() { - var range = this.getSelectionRange(); - var pos = { - row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2), - column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2) - }; - this.renderer.alignCursor(pos, 0.5); - }; - this.getCursorPosition = function() { - return this.selection.getCursor(); - }; - this.getCursorPositionScreen = function() { - return this.session.documentToScreenPosition(this.getCursorPosition()); - }; - this.getSelectionRange = function() { - return this.selection.getRange(); - }; - this.selectAll = function() { - this.$blockScrolling += 1; - this.selection.selectAll(); - this.$blockScrolling -= 1; - }; - this.clearSelection = function() { - this.selection.clearSelection(); - }; - this.moveCursorTo = function(row, column) { - this.selection.moveCursorTo(row, column); - }; - this.moveCursorToPosition = function(pos) { - this.selection.moveCursorToPosition(pos); - }; - this.jumpToMatching = function(select) { - var cursor = this.getCursorPosition(); - - var range = this.session.getBracketRange(cursor); - if (!range) { - range = this.find({ - needle: /[{}()\[\]]/g, - preventScroll:true, - start: {row: cursor.row, column: cursor.column - 1} - }); - if (!range) - return; - var pos = range.start; - if (pos.row == cursor.row && Math.abs(pos.column - cursor.column) < 2) - range = this.session.getBracketRange(pos); - } - - pos = range && range.cursor || pos; - if (pos) { - if (select) { - if (range && range.isEqual(this.getSelectionRange())) - this.clearSelection(); - else - this.selection.selectTo(pos.row, pos.column); + } else { + exports.addListener(el, "DOMMouseScroll", function(e) { + if (e.axis && e.axis == e.HORIZONTAL_AXIS) { + e.wheelX = (e.detail || 0) * 5; + e.wheelY = 0; } else { - this.selection.moveTo(pos.row, pos.column); + e.wheelX = 0; + e.wheelY = (e.detail || 0) * 5; } - } - }; - this.gotoLine = function(lineNumber, column, animate) { - this.selection.clearSelection(); - this.session.unfold({row: lineNumber - 1, column: column || 0}); + callback(e); + }); + } +}; - this.$blockScrolling += 1; - this.exitMultiSelectMode && this.exitMultiSelectMode(); - this.moveCursorTo(lineNumber - 1, column || 0); - this.$blockScrolling -= 1; - - if (!this.isRowFullyVisible(lineNumber - 1)) - this.scrollToLine(lineNumber - 1, true, animate); - }; - this.navigateTo = function(row, column) { - this.selection.moveTo(row, column); - }; - this.navigateUp = function(times) { - if (this.selection.isMultiLine() && !this.selection.isBackwards()) { - var selectionStart = this.selection.anchor.getPosition(); - return this.moveCursorToPosition(selectionStart); - } - this.selection.clearSelection(); - this.selection.moveCursorBy(-times || -1, 0); - }; - this.navigateDown = function(times) { - if (this.selection.isMultiLine() && this.selection.isBackwards()) { - var selectionEnd = this.selection.anchor.getPosition(); - return this.moveCursorToPosition(selectionEnd); - } - this.selection.clearSelection(); - this.selection.moveCursorBy(times || 1, 0); - }; - this.navigateLeft = function(times) { - if (!this.selection.isEmpty()) { - var selectionStart = this.getSelectionRange().start; - this.moveCursorToPosition(selectionStart); - } - else { - times = times || 1; - while (times--) { - this.selection.moveCursorLeft(); - } - } - this.clearSelection(); - }; - this.navigateRight = function(times) { - if (!this.selection.isEmpty()) { - var selectionEnd = this.getSelectionRange().end; - this.moveCursorToPosition(selectionEnd); - } - else { - times = times || 1; - while (times--) { - this.selection.moveCursorRight(); - } - } - this.clearSelection(); - }; - this.navigateLineStart = function() { - this.selection.moveCursorLineStart(); - this.clearSelection(); - }; - this.navigateLineEnd = function() { - this.selection.moveCursorLineEnd(); - this.clearSelection(); - }; - this.navigateFileEnd = function() { - this.selection.moveCursorFileEnd(); - this.clearSelection(); - }; - this.navigateFileStart = function() { - this.selection.moveCursorFileStart(); - this.clearSelection(); - }; - this.navigateWordRight = function() { - this.selection.moveCursorWordRight(); - this.clearSelection(); - }; - this.navigateWordLeft = function() { - this.selection.moveCursorWordLeft(); - this.clearSelection(); - }; - this.replace = function(replacement, options) { - if (options) - this.$search.set(options); - - var range = this.$search.find(this.session); - var replaced = 0; - if (!range) - return replaced; - - if (this.$tryReplace(range, replacement)) { - replaced = 1; - } - if (range !== null) { - this.selection.setSelectionRange(range); - this.renderer.scrollSelectionIntoView(range.start, range.end); - } - - return replaced; - }; - this.replaceAll = function(replacement, options) { - if (options) { - this.$search.set(options); - } - - var ranges = this.$search.findAll(this.session); - var replaced = 0; - if (!ranges.length) - return replaced; - - this.$blockScrolling += 1; - - var selection = this.getSelectionRange(); - this.selection.moveTo(0, 0); - - for (var i = ranges.length - 1; i >= 0; --i) { - if(this.$tryReplace(ranges[i], replacement)) { - replaced++; - } - } - - this.selection.setSelectionRange(selection); - this.$blockScrolling -= 1; - - return replaced; +exports.addMultiMouseDownListener = function(elements, timeouts, eventHandler, callbackName) { + var clicks = 0; + var startX, startY, timer; + var eventNames = { + 2: "dblclick", + 3: "tripleclick", + 4: "quadclick" }; - this.$tryReplace = function(range, replacement) { - var input = this.session.getTextRange(range); - replacement = this.$search.replace(input, replacement); - if (replacement !== null) { - range.end = this.session.replace(range, replacement); - return range; + function onMousedown(e) { + if (exports.getButton(e) !== 0) { + clicks = 0; + } else if (e.detail > 1) { + clicks++; + if (clicks > 4) + clicks = 1; } else { - return null; + clicks = 1; } - }; - this.getLastSearchOptions = function() { - return this.$search.getOptions(); - }; - this.find = function(needle, options, animate) { - if (!options) - options = {}; + if (useragent.isIE) { + var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5; + if (!timer || isNewClick) + clicks = 1; + if (timer) + clearTimeout(timer); + timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600); - if (typeof needle == "string" || needle instanceof RegExp) - options.needle = needle; - else if (typeof needle == "object") - oop.mixin(options, needle); - - var range = this.selection.getRange(); - if (options.needle == null) { - needle = this.session.getTextRange(range) - || this.$search.$options.needle; - if (!needle) { - range = this.session.getWordRange(range.start.row, range.start.column); - needle = this.session.getTextRange(range); + if (clicks == 1) { + startX = e.clientX; + startY = e.clientY; } - this.$search.set({needle: needle}); } + + e._clicks = clicks; - this.$search.set(options); - if (!options.start) - this.$search.set({start: range}); + eventHandler[callbackName]("mousedown", e); - var newRange = this.$search.find(this.session); - if (options.preventScroll) - return newRange; - if (newRange) { - this.revealRange(newRange, animate); - return newRange; - } - if (options.backwards) - range.start = range.end; - else - range.end = range.start; - this.selection.setRange(range); - }; - this.findNext = function(options, animate) { - this.find({skipCurrent: true, backwards: false}, options, animate); - }; - this.findPrevious = function(options, animate) { - this.find(options, {skipCurrent: true, backwards: true}, animate); + if (clicks > 4) + clicks = 0; + else if (clicks > 1) + return eventHandler[callbackName](eventNames[clicks], e); + } + function onDblclick(e) { + clicks = 2; + if (timer) + clearTimeout(timer); + timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600); + eventHandler[callbackName]("mousedown", e); + eventHandler[callbackName](eventNames[clicks], e); + } + if (!Array.isArray(elements)) + elements = [elements]; + elements.forEach(function(el) { + exports.addListener(el, "mousedown", onMousedown); + if (useragent.isOldIE) + exports.addListener(el, "dblclick", onDblclick); + }); +}; + +var getModifierHash = useragent.isMac && useragent.isOpera && !("KeyboardEvent" in window) + ? function(e) { + return 0 | (e.metaKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.ctrlKey ? 8 : 0); + } + : function(e) { + return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0); }; - this.revealRange = function(range, animate) { - this.$blockScrolling += 1; - this.session.unfold(range); - this.selection.setSelectionRange(range); - this.$blockScrolling -= 1; +exports.getModifierString = function(e) { + return keys.KEY_MODS[getModifierHash(e)]; +}; - var scrollTop = this.renderer.scrollTop; - this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5); - if (animate !== false) - this.renderer.animateScrolling(scrollTop); - }; - this.undo = function() { - this.$blockScrolling++; - this.session.getUndoManager().undo(); - this.$blockScrolling--; - this.renderer.scrollCursorIntoView(null, 0.5); - }; - this.redo = function() { - this.$blockScrolling++; - this.session.getUndoManager().redo(); - this.$blockScrolling--; - this.renderer.scrollCursorIntoView(null, 0.5); - }; - this.destroy = function() { - this.renderer.destroy(); - this._signal("destroy", this); - }; - this.setAutoScrollEditorIntoView = function(enable) { - if (!enable) - return; - var rect; - var self = this; - var shouldScroll = false; - if (!this.$scrollAnchor) - this.$scrollAnchor = document.createElement("div"); - var scrollAnchor = this.$scrollAnchor; - scrollAnchor.style.cssText = "position:absolute"; - this.container.insertBefore(scrollAnchor, this.container.firstChild); - var onChangeSelection = this.on("changeSelection", function() { - shouldScroll = true; - }); - var onBeforeRender = this.renderer.on("beforeRender", function() { - if (shouldScroll) - rect = self.renderer.container.getBoundingClientRect(); - }); - var onAfterRender = this.renderer.on("afterRender", function() { - if (shouldScroll && rect && self.isFocused()) { - var renderer = self.renderer; - var pos = renderer.$cursorLayer.$pixelPos; - var config = renderer.layerConfig; - var top = pos.top - config.offset; - if (pos.top >= 0 && top + rect.top < 0) { - shouldScroll = true; - } else if (pos.top < config.height && - pos.top + rect.top + config.lineHeight > window.innerHeight) { - shouldScroll = false; - } else { - shouldScroll = null; - } - if (shouldScroll != null) { - scrollAnchor.style.top = top + "px"; - scrollAnchor.style.left = pos.left + "px"; - scrollAnchor.style.height = config.lineHeight + "px"; - scrollAnchor.scrollIntoView(shouldScroll); - } - shouldScroll = rect = null; - } - }); - this.setAutoScrollEditorIntoView = function(enable) { - if (enable) +function normalizeCommandKeys(callback, e, keyCode) { + var hashId = getModifierHash(e); + + if (!useragent.isMac && pressedKeys) { + if (e.getModifierState && (e.getModifierState("OS") || e.getModifierState("Win"))) + hashId |= 8; + if (pressedKeys.altGr) { + if ((3 & hashId) != 3) + pressedKeys.altGr = 0; + else return; - delete this.setAutoScrollEditorIntoView; - this.removeEventListener("changeSelection", onChangeSelection); - this.renderer.removeEventListener("afterRender", onAfterRender); - this.renderer.removeEventListener("beforeRender", onBeforeRender); - }; - }; - - - this.$resetCursorStyle = function() { - var style = this.$cursorStyle || "ace"; - var cursorLayer = this.renderer.$cursorLayer; - if (!cursorLayer) + } + if (keyCode === 18 || keyCode === 17) { + var location = "location" in e ? e.location : e.keyLocation; + if (keyCode === 17 && location === 1) { + if (pressedKeys[keyCode] == 1) + ts = e.timeStamp; + } else if (keyCode === 18 && hashId === 3 && location === 2) { + var dt = e.timeStamp - ts; + if (dt < 50) + pressedKeys.altGr = true; + } + } + } + + if (keyCode in keys.MODIFIER_KEYS) { + keyCode = -1; + } + if (hashId & 8 && (keyCode >= 91 && keyCode <= 93)) { + keyCode = -1; + } + + if (!hashId && keyCode === 13) { + var location = "location" in e ? e.location : e.keyLocation; + if (location === 3) { + callback(e, hashId, -keyCode); + if (e.defaultPrevented) + return; + } + } + + if (useragent.isChromeOS && hashId & 8) { + callback(e, hashId, keyCode); + if (e.defaultPrevented) return; - cursorLayer.setSmoothBlinking(style == "smooth"); - cursorLayer.isBlinking = !this.$readOnly && style != "wide"; + else + hashId &= ~8; + } + if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) { + return false; + } + + return callback(e, hashId, keyCode); +} + + +exports.addCommandKeyListener = function(el, callback) { + var addListener = exports.addListener; + if (useragent.isOldGecko || (useragent.isOpera && !("KeyboardEvent" in window))) { + var lastKeyDownKeyCode = null; + addListener(el, "keydown", function(e) { + lastKeyDownKeyCode = e.keyCode; + }); + addListener(el, "keypress", function(e) { + return normalizeCommandKeys(callback, e, lastKeyDownKeyCode); + }); + } else { + var lastDefaultPrevented = null; + + addListener(el, "keydown", function(e) { + pressedKeys[e.keyCode] = (pressedKeys[e.keyCode] || 0) + 1; + var result = normalizeCommandKeys(callback, e, e.keyCode); + lastDefaultPrevented = e.defaultPrevented; + return result; + }); + + addListener(el, "keypress", function(e) { + if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) { + exports.stopEvent(e); + lastDefaultPrevented = null; + } + }); + + addListener(el, "keyup", function(e) { + pressedKeys[e.keyCode] = null; + }); + + if (!pressedKeys) { + resetPressedKeys(); + addListener(window, "focus", resetPressedKeys); + } + } +}; +function resetPressedKeys() { + pressedKeys = Object.create(null); +} + +if (typeof window == "object" && window.postMessage && !useragent.isOldIE) { + var postMessageId = 1; + exports.nextTick = function(callback, win) { + win = win || window; + var messageName = "zero-timeout-message-" + postMessageId; + exports.addListener(win, "message", function listener(e) { + if (e.data == messageName) { + exports.stopPropagation(e); + exports.removeListener(win, "message", listener); + callback(); + } + }); + win.postMessage(messageName, "*"); }; - -}).call(Editor.prototype); +} +exports.nextFrame = typeof window == "object" && (window.requestAnimationFrame + || window.mozRequestAnimationFrame + || window.webkitRequestAnimationFrame + || window.msRequestAnimationFrame + || window.oRequestAnimationFrame); -config.defineOptions(Editor.prototype, "editor", { - selectionStyle: { - set: function(style) { - this.onSelectionChange(); - this._signal("changeSelectionStyle", {data: style}); - }, - initialValue: "line" - }, - highlightActiveLine: { - set: function() {this.$updateHighlightActiveLine();}, - initialValue: true - }, - highlightSelectedWord: { - set: function(shouldHighlight) {this.$onSelectionChange();}, - initialValue: true - }, - readOnly: { - set: function(readOnly) { - this.$resetCursorStyle(); - }, - initialValue: false - }, - cursorStyle: { - set: function(val) { this.$resetCursorStyle(); }, - values: ["ace", "slim", "smooth", "wide"], - initialValue: "ace" - }, - mergeUndoDeltas: { - values: [false, true, "always"], - initialValue: true - }, - behavioursEnabled: {initialValue: true}, - wrapBehavioursEnabled: {initialValue: true}, - autoScrollEditorIntoView: { - set: function(val) {this.setAutoScrollEditorIntoView(val)} - }, - - hScrollBarAlwaysVisible: "renderer", - vScrollBarAlwaysVisible: "renderer", - highlightGutterLine: "renderer", - animatedScroll: "renderer", - showInvisibles: "renderer", - showPrintMargin: "renderer", - printMarginColumn: "renderer", - printMargin: "renderer", - fadeFoldWidgets: "renderer", - showFoldWidgets: "renderer", - showLineNumbers: "renderer", - showGutter: "renderer", - displayIndentGuides: "renderer", - fontSize: "renderer", - fontFamily: "renderer", - maxLines: "renderer", - minLines: "renderer", - scrollPastEnd: "renderer", - fixedWidthGutter: "renderer", - theme: "renderer", - - scrollSpeed: "$mouseHandler", - dragDelay: "$mouseHandler", - dragEnabled: "$mouseHandler", - focusTimout: "$mouseHandler", - tooltipFollowsMouse: "$mouseHandler", - - firstLineNumber: "session", - overwrite: "session", - newLineMode: "session", - useWorker: "session", - useSoftTabs: "session", - tabSize: "session", - wrap: "session", - foldStyle: "session", - mode: "session" +if (exports.nextFrame) + exports.nextFrame = exports.nextFrame.bind(window); +else + exports.nextFrame = function(callback) { + setTimeout(callback, 17); + }; }); -exports.Editor = Editor; -}); - -define('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) { - +define("ace/lib/lang",["require","exports","module"], function(require, exports, module) { +"use strict"; exports.last = function(a) { return a[a.length - 1]; @@ -3411,28 +1767,30 @@ exports.copyArray = function(array){ var copy = []; for (var i=0, l=array.length; i= 53) { + onInput(); + } }; @@ -3924,18 +2311,25 @@ var TextInput = function(parentNode, host) { this.onContextMenu = function(e) { afterContextMenu = true; - if (!tempStyle) - tempStyle = text.style.cssText; - - text.style.cssText = "z-index:100000;" + (useragent.isIE ? "opacity:0.1;" : ""); - resetSelection(host.selection.isEmpty()); host._emit("nativecontextmenu", {target: host, domEvent: e}); + this.moveToMouse(e, true); + }; + + this.moveToMouse = function(e, bringToFront) { + if (!bringToFront && useragent.isOldIE) + return; + if (!tempStyle) + tempStyle = text.style.cssText; + text.style.cssText = (bringToFront ? "z-index:100000;" : "") + + "height:" + text.style.height + ";" + + (useragent.isIE ? "opacity:0.1;" : ""); + var rect = host.container.getBoundingClientRect(); var style = dom.computedStyle(host.container); var top = rect.top + (parseInt(style.borderTopWidth) || 0); var left = rect.left + (parseInt(rect.borderLeftWidth) || 0); - var maxTop = rect.bottom - top - text.clientHeight; + var maxTop = rect.bottom - top - text.clientHeight -2; var move = function(e) { text.style.left = e.clientX - left - 2 + "px"; text.style.top = Math.min(e.clientY - top - 2, maxTop) + "px"; @@ -3947,13 +2341,17 @@ var TextInput = function(parentNode, host) { if (host.renderer.$keepTextAreaAtCursor) host.renderer.$keepTextAreaAtCursor = null; - if (useragent.isWin) + + clearTimeout(closeTimeout); + if (useragent.isWin && !useragent.isOldIE) event.capture(host.container, move, onContextMenuClose); }; this.onContextMenuClose = onContextMenuClose; + var closeTimeout; function onContextMenuClose() { - setTimeout(function () { + clearTimeout(closeTimeout); + closeTimeout = setTimeout(function () { if (tempStyle) { text.style.cssText = tempStyle; tempStyle = ''; @@ -3962,161 +2360,27 @@ var TextInput = function(parentNode, host) { host.renderer.$keepTextAreaAtCursor = true; host.renderer.$moveTextAreaToCursor(); } - }, 0); - } - if (!useragent.isGecko || useragent.isMac) { - var onContextMenu = function(e) { - host.textInput.onContextMenu(e); - onContextMenuClose(); - }; - event.addListener(host.renderer.scroller, "contextmenu", onContextMenu); - event.addListener(text, "contextmenu", onContextMenu); + }, useragent.isOldIE ? 200 : 0); } + + var onContextMenu = function(e) { + host.textInput.onContextMenu(e); + onContextMenuClose(); + }; + event.addListener(text, "mouseup", onContextMenu); + event.addListener(text, "mousedown", function(e) { + e.preventDefault(); + onContextMenuClose(); + }); + event.addListener(host.renderer.scroller, "contextmenu", onContextMenu); + event.addListener(text, "contextmenu", onContextMenu); }; exports.TextInput = TextInput; }); -define('ace/mouse/mouse_handler', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent', 'ace/mouse/default_handlers', 'ace/mouse/default_gutter_handler', 'ace/mouse/mouse_event', 'ace/mouse/dragdrop_handler', 'ace/config'], function(require, exports, module) { - - -var event = require("../lib/event"); -var useragent = require("../lib/useragent"); -var DefaultHandlers = require("./default_handlers").DefaultHandlers; -var DefaultGutterHandler = require("./default_gutter_handler").GutterHandler; -var MouseEvent = require("./mouse_event").MouseEvent; -var DragdropHandler = require("./dragdrop_handler").DragdropHandler; -var config = require("../config"); - -var MouseHandler = function(editor) { - this.editor = editor; - - new DefaultHandlers(this); - new DefaultGutterHandler(this); - new DragdropHandler(this); - - var focusEditor = function(e) { editor.focus() }; - - var mouseTarget = editor.renderer.getMouseEventTarget(); - event.addListener(mouseTarget, "click", this.onMouseEvent.bind(this, "click")); - event.addListener(mouseTarget, "mousemove", this.onMouseMove.bind(this, "mousemove")); - event.addMultiMouseDownListener(mouseTarget, [400, 300, 250], this, "onMouseEvent"); - if (editor.renderer.scrollBarV) { - event.addMultiMouseDownListener(editor.renderer.scrollBarV.inner, [400, 300, 250], this, "onMouseEvent"); - event.addMultiMouseDownListener(editor.renderer.scrollBarH.inner, [400, 300, 250], this, "onMouseEvent"); - if (useragent.isIE) { - event.addListener(editor.renderer.scrollBarV.element, "mousedown", focusEditor); - event.addListener(editor.renderer.scrollBarH.element, "mousemove", focusEditor); - } - } - event.addMouseWheelListener(editor.container, this.onMouseWheel.bind(this, "mousewheel")); - - var gutterEl = editor.renderer.$gutter; - event.addListener(gutterEl, "mousedown", this.onMouseEvent.bind(this, "guttermousedown")); - event.addListener(gutterEl, "click", this.onMouseEvent.bind(this, "gutterclick")); - event.addListener(gutterEl, "dblclick", this.onMouseEvent.bind(this, "gutterdblclick")); - event.addListener(gutterEl, "mousemove", this.onMouseEvent.bind(this, "guttermousemove")); - - event.addListener(mouseTarget, "mousedown", focusEditor); - - event.addListener(gutterEl, "mousedown", function(e) { - editor.focus(); - return event.preventDefault(e); - }); -}; - -(function() { - this.onMouseEvent = function(name, e) { - this.editor._emit(name, new MouseEvent(e, this.editor)); - }; - - this.onMouseMove = function(name, e) { - var listeners = this.editor._eventRegistry && this.editor._eventRegistry.mousemove; - if (!listeners || !listeners.length) - return; - - this.editor._emit(name, new MouseEvent(e, this.editor)); - }; - - this.onMouseWheel = function(name, e) { - var mouseEvent = new MouseEvent(e, this.editor); - mouseEvent.speed = this.$scrollSpeed * 2; - mouseEvent.wheelX = e.wheelX; - mouseEvent.wheelY = e.wheelY; - - this.editor._emit(name, mouseEvent); - }; - - this.setState = function(state) { - this.state = state; - }; - - this.captureMouse = function(ev, mouseMoveHandler) { - this.x = ev.x; - this.y = ev.y; - - this.isMousePressed = true; - var renderer = this.editor.renderer; - if (renderer.$keepTextAreaAtCursor) - renderer.$keepTextAreaAtCursor = null; - - var self = this; - var onMouseMove = function(e) { - if (!e) return; - if (useragent.isWebKit && !e.which && self.releaseMouse) - return self.releaseMouse(); - - self.x = e.clientX; - self.y = e.clientY; - mouseMoveHandler && mouseMoveHandler(e); - self.mouseEvent = new MouseEvent(e, self.editor); - self.$mouseMoved = true; - }; - - var onCaptureEnd = function(e) { - clearInterval(timerId); - onCaptureInterval(); - self[self.state + "End"] && self[self.state + "End"](e); - self.state = ""; - if (renderer.$keepTextAreaAtCursor == null) { - renderer.$keepTextAreaAtCursor = true; - renderer.$moveTextAreaToCursor(); - } - self.isMousePressed = false; - self.$onCaptureMouseMove = self.releaseMouse = null; - e && self.onMouseEvent("mouseup", e); - }; - - var onCaptureInterval = function() { - self[self.state] && self[self.state](); - self.$mouseMoved = false; - }; - - if (useragent.isOldIE && ev.domEvent.type == "dblclick") { - return setTimeout(function() {onCaptureEnd(ev);}); - } - - self.$onCaptureMouseMove = onMouseMove; - self.releaseMouse = event.capture(this.editor.container, onMouseMove, onCaptureEnd); - var timerId = setInterval(onCaptureInterval, 20); - }; - this.releaseMouse = null; -}).call(MouseHandler.prototype); - -config.defineOptions(MouseHandler.prototype, "mouseHandler", { - scrollSpeed: {initialValue: 2}, - dragDelay: {initialValue: 150}, - dragEnabled: {initialValue: true}, - focusTimout: {initialValue: 0}, - tooltipFollowsMouse: {initialValue: true} -}); - - -exports.MouseHandler = MouseHandler; -}); - -define('ace/mouse/default_handlers', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/event', 'ace/lib/useragent'], function(require, exports, module) { - +define("ace/mouse/default_handlers",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"], function(require, exports, module) { +"use strict"; var dom = require("../lib/dom"); var event = require("../lib/event"); @@ -4133,6 +2397,7 @@ function DefaultHandlers(mouseHandler) { editor.setDefaultHandler("tripleclick", this.onTripleClick.bind(mouseHandler)); editor.setDefaultHandler("quadclick", this.onQuadClick.bind(mouseHandler)); editor.setDefaultHandler("mousewheel", this.onMouseWheel.bind(mouseHandler)); + editor.setDefaultHandler("touchmove", this.onTouchMove.bind(mouseHandler)); var exports = ["select", "startSelect", "selectEnd", "selectAllEnd", "selectByWordsEnd", "selectByLinesEnd", "dragWait", "dragWaitEnd", "focusWait"]; @@ -4157,17 +2422,19 @@ function DefaultHandlers(mouseHandler) { if (button !== 0) { var selectionRange = editor.getSelectionRange(); var selectionEmpty = selectionRange.isEmpty(); - - if (selectionEmpty) { + editor.$blockScrolling++; + if (selectionEmpty || button == 1) editor.selection.moveToPosition(pos); - } - editor.textInput.onContextMenu(ev.domEvent); + editor.$blockScrolling--; + if (button == 2) + editor.textInput.onContextMenu(ev.domEvent); return; // stopping event here breaks contextmenu on ff mac } + + this.mousedownEvent.time = Date.now(); if (inSelection && !editor.isFocused()) { editor.focus(); if (this.$focusTimout && !this.$clickSelection && !editor.inMultiSelectMode) { - this.mousedownEvent.time = Date.now(); this.setState("focusWait"); this.captureMouse(ev); return; @@ -4175,36 +2442,32 @@ function DefaultHandlers(mouseHandler) { } this.captureMouse(ev); - if (!inSelection || this.$clickSelection || ev.getShiftKey() || editor.inMultiSelectMode) { - this.startSelect(pos); - } else if (inSelection) { - this.mousedownEvent.time = Date.now(); - this.startSelect(pos); - } + this.startSelect(pos, ev.domEvent._clicks > 1); return ev.preventDefault(); }; - this.startSelect = function(pos) { + this.startSelect = function(pos, waitForClickSelection) { pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y); var editor = this.editor; - var shiftPressed = this.mousedownEvent.getShiftKey(); - if (shiftPressed) { + editor.$blockScrolling++; + if (this.mousedownEvent.getShiftKey()) editor.selection.selectToPosition(pos); - } - else if (!this.$clickSelection) { + else if (!waitForClickSelection) editor.selection.moveToPosition(pos); - } + if (!waitForClickSelection) + this.select(); if (editor.renderer.scroller.setCapture) { editor.renderer.scroller.setCapture(); } editor.setStyle("ace_selecting"); this.setState("select"); + editor.$blockScrolling--; }; this.select = function() { var anchor, editor = this.editor; var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y); - + editor.$blockScrolling++; if (this.$clickSelection) { var cmp = this.$clickSelection.comparePoint(cursor); @@ -4220,7 +2483,7 @@ function DefaultHandlers(mouseHandler) { editor.selection.setSelectionAnchor(anchor.row, anchor.column); } editor.selection.selectToPosition(cursor); - + editor.$blockScrolling--; editor.renderer.scrollCursorIntoView(); }; @@ -4228,7 +2491,7 @@ function DefaultHandlers(mouseHandler) { var anchor, editor = this.editor; var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y); var range = editor.selection[unitName](cursor.row, cursor.column); - + editor.$blockScrolling++; if (this.$clickSelection) { var cmpStart = this.$clickSelection.comparePoint(range.start); var cmpEnd = this.$clickSelection.comparePoint(range.end); @@ -4252,7 +2515,7 @@ function DefaultHandlers(mouseHandler) { editor.selection.setSelectionAnchor(anchor.row, anchor.column); } editor.selection.selectToPosition(cursor); - + editor.$blockScrolling--; editor.renderer.scrollCursorIntoView(); }; @@ -4292,7 +2555,7 @@ function DefaultHandlers(mouseHandler) { this.setState("selectByWords"); } this.$clickSelection = range; - this[this.state] && this[this.state](ev); + this.select(); }; this.onTripleClick = function(ev) { @@ -4300,8 +2563,14 @@ function DefaultHandlers(mouseHandler) { var editor = this.editor; this.setState("selectByLines"); - this.$clickSelection = editor.selection.getLineRange(pos.row); - this[this.state] && this[this.state](ev); + var range = editor.getSelectionRange(); + if (range.isMultiLine() && range.contains(pos.row, pos.column)) { + this.$clickSelection = editor.selection.getLineRange(range.start.row); + this.$clickSelection.end = editor.selection.getLineRange(range.end.row).end; + } else { + this.$clickSelection = editor.selection.getLineRange(pos.row); + } + this.select(); }; this.onQuadClick = function(ev) { @@ -4331,6 +2600,19 @@ function DefaultHandlers(mouseHandler) { return ev.stop(); } }; + + this.onTouchMove = function (ev) { + var t = ev.domEvent.timeStamp; + var dt = t - (this.$lastScrollTime || 0); + + var editor = this.editor; + var isScrolable = editor.renderer.isScrollableBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed); + if (isScrolable || dt < 200) { + this.$lastScrollTime = t; + editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed); + return ev.stop(); + } + }; }).call(DefaultHandlers.prototype); @@ -4356,8 +2638,72 @@ function calcRangeOrientation(range, cursor) { }); -define('ace/mouse/default_gutter_handler', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/oop', 'ace/lib/event', 'ace/tooltip'], function(require, exports, module) { +define("ace/tooltip",["require","exports","module","ace/lib/oop","ace/lib/dom"], function(require, exports, module) { +"use strict"; +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +function Tooltip (parentNode) { + this.isOpen = false; + this.$element = null; + this.$parentNode = parentNode; +} + +(function() { + this.$init = function() { + this.$element = dom.createElement("div"); + this.$element.className = "ace_tooltip"; + this.$element.style.display = "none"; + this.$parentNode.appendChild(this.$element); + return this.$element; + }; + this.getElement = function() { + return this.$element || this.$init(); + }; + this.setText = function(text) { + dom.setInnerText(this.getElement(), text); + }; + this.setHtml = function(html) { + this.getElement().innerHTML = html; + }; + this.setPosition = function(x, y) { + this.getElement().style.left = x + "px"; + this.getElement().style.top = y + "px"; + }; + this.setClassName = function(className) { + dom.addCssClass(this.getElement(), className); + }; + this.show = function(text, x, y) { + if (text != null) + this.setText(text); + if (x != null && y != null) + this.setPosition(x, y); + if (!this.isOpen) { + this.getElement().style.display = "block"; + this.isOpen = true; + } + }; + + this.hide = function() { + if (this.isOpen) { + this.getElement().style.display = "none"; + this.isOpen = false; + } + }; + this.getHeight = function() { + return this.getElement().offsetHeight; + }; + this.getWidth = function() { + return this.getElement().offsetWidth; + }; + +}).call(Tooltip.prototype); + +exports.Tooltip = Tooltip; +}); + +define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event","ace/tooltip"], function(require, exports, module) { +"use strict"; var dom = require("../lib/dom"); var oop = require("../lib/oop"); var event = require("../lib/event"); @@ -4416,12 +2762,13 @@ function GutterHandler(mouseHandler) { tooltip.setHtml(tooltipAnnotation); tooltip.show(); + editor._signal("showGutterTooltip", tooltip); editor.on("mousewheel", hideTooltip); if (mouseHandler.$tooltipFollowsMouse) { moveTooltip(mouseEvent); } else { - var gutterElement = gutter.$cells[editor.session.documentToScreenRow(row, 0)].element; + var gutterElement = mouseEvent.domEvent.target; var rect = gutterElement.getBoundingClientRect(); var style = tooltip.getElement().style; style.left = rect.right + "px"; @@ -4435,6 +2782,7 @@ function GutterHandler(mouseHandler) { if (tooltipAnnotation) { tooltip.hide(); tooltipAnnotation = null; + editor._signal("hideGutterTooltip", tooltip); editor.removeEventListener("mousewheel", hideTooltip); } } @@ -4508,72 +2856,8 @@ exports.GutterHandler = GutterHandler; }); -define('ace/tooltip', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom'], function(require, exports, module) { - - -var oop = require("./lib/oop"); -var dom = require("./lib/dom"); -function Tooltip (parentNode) { - this.isOpen = false; - this.$element = null; - this.$parentNode = parentNode; -} - -(function() { - this.$init = function() { - this.$element = dom.createElement("div"); - this.$element.className = "ace_tooltip"; - this.$element.style.display = "none"; - this.$parentNode.appendChild(this.$element); - return this.$element; - }; - this.getElement = function() { - return this.$element || this.$init(); - }; - this.setText = function(text) { - dom.setInnerText(this.getElement(), text); - }; - this.setHtml = function(html) { - this.getElement().innerHTML = html; - }; - this.setPosition = function(x, y) { - this.getElement().style.left = x + "px"; - this.getElement().style.top = y + "px"; - }; - this.setClassName = function(className) { - dom.addCssClass(this.getElement(), className); - }; - this.show = function(text, x, y) { - if (text != null) - this.setText(text); - if (x != null && y != null) - this.setPosition(x, y); - if (!this.isOpen) { - this.getElement().style.display = "block"; - this.isOpen = true; - } - }; - - this.hide = function() { - if (this.isOpen) { - this.getElement().style.display = "none"; - this.isOpen = false; - } - }; - this.getHeight = function() { - return this.getElement().offsetHeight; - }; - this.getWidth = function() { - return this.getElement().offsetWidth; - }; - -}).call(Tooltip.prototype); - -exports.Tooltip = Tooltip; -}); - -define('ace/mouse/mouse_event', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent'], function(require, exports, module) { - +define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(require, exports, module) { +"use strict"; var event = require("../lib/event"); var useragent = require("../lib/useragent"); @@ -4646,8 +2930,8 @@ var MouseEvent = exports.MouseEvent = function(domEvent, editor) { }); -define('ace/mouse/dragdrop_handler', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/event', 'ace/lib/useragent'], function(require, exports, module) { - +define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"], function(require, exports, module) { +"use strict"; var dom = require("../lib/dom"); var event = require("../lib/event"); @@ -4699,7 +2983,7 @@ function DragdropHandler(mouseHandler) { dataTransfer.effectAllowed = editor.getReadOnly() ? "copy" : "copyMove"; if (useragent.isOpera) { editor.container.appendChild(blankImage); - blankImage._top = blankImage.offsetTop; + blankImage.scrollTop = 0; } dataTransfer.setDragImage && dataTransfer.setDragImage(blankImage, 0, 0); if (useragent.isOpera) { @@ -4723,11 +3007,14 @@ function DragdropHandler(mouseHandler) { editor.renderer.$cursorLayer.setBlinking(true); } this.editor.unsetStyle("ace_dragging"); + this.editor.renderer.setCursorStyle(""); }; this.onDragEnter = function(e) { if (editor.getReadOnly() || !canAccept(e.dataTransfer)) return; + x = e.clientX; + y = e.clientY; if (!dragSelectionMarker) addDragMarker(); counter++; @@ -4738,14 +3025,14 @@ function DragdropHandler(mouseHandler) { this.onDragOver = function(e) { if (editor.getReadOnly() || !canAccept(e.dataTransfer)) return; + x = e.clientX; + y = e.clientY; if (!dragSelectionMarker) { addDragMarker(); counter++; } if (onMouseMoveTimer !== null) onMouseMoveTimer = null; - x = e.clientX; - y = e.clientY; e.dataTransfer.dropEffect = dragOperation = getDropEffect(e); return event.preventDefault(e); @@ -4761,7 +3048,7 @@ function DragdropHandler(mouseHandler) { }; this.onDrop = function(e) { - if (!dragSelectionMarker) + if (!dragCursor) return; var dataTransfer = e.dataTransfer; if (isInternal) { @@ -4872,6 +3159,7 @@ function DragdropHandler(mouseHandler) { if (editor.isFocused()) editor.renderer.$cursorLayer.setBlinking(false); clearInterval(timerId); + onDragInterval(); timerId = setInterval(onDragInterval, 20); counter = 0; event.addListener(document, "mousemove", onMouseMove); @@ -4887,6 +3175,7 @@ function DragdropHandler(mouseHandler) { if (editor.isFocused() && !isInternal) editor.renderer.$cursorLayer.setBlinking(!editor.getReadOnly()); range = null; + dragCursor = null; counter = 0; autoScrollStartTime = null; cursorMovedTime = null; @@ -4949,15 +3238,19 @@ function DragdropHandler(mouseHandler) { this.dragReadyEnd = function(e) { this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()); this.editor.unsetStyle("ace_dragging"); + this.editor.renderer.setCursorStyle(""); this.dragWaitEnd(); }; this.startDrag = function(){ this.cancelDrag = false; - var target = this.editor.container; + var editor = this.editor; + var target = editor.container; target.draggable = true; - this.editor.renderer.$cursorLayer.setBlinking(false); - this.editor.setStyle("ace_dragging"); + editor.renderer.$cursorLayer.setBlinking(false); + editor.setStyle("ace_dragging"); + var cursorStyle = useragent.isWin ? "default" : "move"; + editor.renderer.setCursorStyle(cursorStyle); this.setState("dragReady"); }; @@ -5019,262 +3312,8 @@ exports.DragdropHandler = DragdropHandler; }); -define('ace/config', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/lib/net', 'ace/lib/event_emitter'], function(require, exports, module) { -"no use strict"; - -var lang = require("./lib/lang"); -var oop = require("./lib/oop"); -var net = require("./lib/net"); -var EventEmitter = require("./lib/event_emitter").EventEmitter; - -var global = (function() { - return this; -})(); - -var options = { - packaged: false, - workerPath: null, - modePath: null, - themePath: null, - basePath: "", - suffix: ".js", - $moduleUrls: {} -}; - -exports.get = function(key) { - if (!options.hasOwnProperty(key)) - throw new Error("Unknown config key: " + key); - - return options[key]; -}; - -exports.set = function(key, value) { - if (!options.hasOwnProperty(key)) - throw new Error("Unknown config key: " + key); - - options[key] = value; -}; - -exports.all = function() { - return lang.copyObject(options); -}; -oop.implement(exports, EventEmitter); - -exports.moduleUrl = function(name, component) { - if (options.$moduleUrls[name]) - return options.$moduleUrls[name]; - - var parts = name.split("/"); - component = component || parts[parts.length - 2] || ""; - var sep = component == "snippets" ? "/" : "-"; - var base = parts[parts.length - 1]; - if (sep == "-") { - var re = new RegExp("^" + component + "[\\-_]|[\\-_]" + component + "$", "g"); - base = base.replace(re, ""); - } - - if ((!base || base == component) && parts.length > 1) - base = parts[parts.length - 2]; - var path = options[component + "Path"]; - if (path == null) { - path = options.basePath; - } else if (sep == "/") { - component = sep = ""; - } - if (path && path.slice(-1) != "/") - path += "/"; - return path + component + sep + base + this.get("suffix"); -}; - -exports.setModuleUrl = function(name, subst) { - return options.$moduleUrls[name] = subst; -}; - -exports.$loading = {}; -exports.loadModule = function(moduleName, onLoad) { - var module, moduleType; - if (Array.isArray(moduleName)) { - moduleType = moduleName[0]; - moduleName = moduleName[1]; - } - - try { - module = require(moduleName); - } catch (e) {} - if (module && !exports.$loading[moduleName]) - return onLoad && onLoad(module); - - if (!exports.$loading[moduleName]) - exports.$loading[moduleName] = []; - - exports.$loading[moduleName].push(onLoad); - - if (exports.$loading[moduleName].length > 1) - return; - - var afterLoad = function() { - require([moduleName], function(module) { - exports._emit("load.module", {name: moduleName, module: module}); - var listeners = exports.$loading[moduleName]; - exports.$loading[moduleName] = null; - listeners.forEach(function(onLoad) { - onLoad && onLoad(module); - }); - }); - }; - - if (!exports.get("packaged")) - return afterLoad(); - net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad); -}; -function init(packaged) { - options.packaged = packaged || require.packaged || module.packaged || (global.define && define.packaged); - - if (!global.document) - return ""; - - var scriptOptions = {}; - var scriptUrl = ""; - - var scripts = document.getElementsByTagName("script"); - for (var i=0; i 1) + base = parts[parts.length - 2]; + var path = options[component + "Path"]; + if (path == null) { + path = options.basePath; + } else if (sep == "/") { + component = sep = ""; + } + if (path && path.slice(-1) != "/") + path += "/"; + return path + component + sep + base + this.get("suffix"); +}; + +exports.setModuleUrl = function(name, subst) { + return options.$moduleUrls[name] = subst; +}; + +exports.$loading = {}; +exports.loadModule = function(moduleName, onLoad) { + var module, moduleType; + if (Array.isArray(moduleName)) { + moduleType = moduleName[0]; + moduleName = moduleName[1]; + } + + try { + module = require(moduleName); + } catch (e) {} + if (module && !exports.$loading[moduleName]) + return onLoad && onLoad(module); + + if (!exports.$loading[moduleName]) + exports.$loading[moduleName] = []; + + exports.$loading[moduleName].push(onLoad); + + if (exports.$loading[moduleName].length > 1) + return; + + var afterLoad = function() { + require([moduleName], function(module) { + exports._emit("load.module", {name: moduleName, module: module}); + var listeners = exports.$loading[moduleName]; + exports.$loading[moduleName] = null; + listeners.forEach(function(onLoad) { + onLoad && onLoad(module); + }); + }); + }; + + if (!exports.get("packaged")) + return afterLoad(); + net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad); +}; +init(true);function init(packaged) { + + if (!global || !global.document) + return; + + options.packaged = packaged || require.packaged || module.packaged || (global.define && define.packaged); + + var scriptOptions = {}; + var scriptUrl = ""; + var currentScript = (document.currentScript || document._currentScript ); // native or polyfill + var currentDocument = currentScript && currentScript.ownerDocument || document; + + var scripts = currentDocument.getElementsByTagName("script"); + for (var i=0; i [" + this.end.row + "/" + this.end.column + "]"); + }; + + this.contains = function(row, column) { + return this.compare(row, column) == 0; + }; + this.compareRange = function(range) { + var cmp, + end = range.end, + start = range.start; + + cmp = this.compare(end.row, end.column); + if (cmp == 1) { + cmp = this.compare(start.row, start.column); + if (cmp == 1) { + return 2; + } else if (cmp == 0) { + return 1; + } else { + return 0; + } + } else if (cmp == -1) { + return -2; + } else { + cmp = this.compare(start.row, start.column); + if (cmp == -1) { + return -1; + } else if (cmp == 1) { + return 42; + } else { + return 0; + } + } + }; + this.comparePoint = function(p) { + return this.compare(p.row, p.column); + }; + this.containsRange = function(range) { + return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; + }; + this.intersects = function(range) { + var cmp = this.compareRange(range); + return (cmp == -1 || cmp == 0 || cmp == 1); + }; + this.isEnd = function(row, column) { + return this.end.row == row && this.end.column == column; + }; + this.isStart = function(row, column) { + return this.start.row == row && this.start.column == column; + }; + this.setStart = function(row, column) { + if (typeof row == "object") { + this.start.column = row.column; + this.start.row = row.row; + } else { + this.start.row = row; + this.start.column = column; + } + }; + this.setEnd = function(row, column) { + if (typeof row == "object") { + this.end.column = row.column; + this.end.row = row.row; + } else { + this.end.row = row; + this.end.column = column; + } + }; + this.inside = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column) || this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideStart = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideEnd = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.compare = function(row, column) { + if (!this.isMultiLine()) { + if (row === this.start.row) { + return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); + } + } + + if (row < this.start.row) + return -1; + + if (row > this.end.row) + return 1; + + if (this.start.row === row) + return column >= this.start.column ? 0 : -1; + + if (this.end.row === row) + return column <= this.end.column ? 0 : 1; + + return 0; + }; + this.compareStart = function(row, column) { + if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.compareEnd = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else { + return this.compare(row, column); + } + }; + this.compareInside = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.clipRows = function(firstRow, lastRow) { + if (this.end.row > lastRow) + var end = {row: lastRow + 1, column: 0}; + else if (this.end.row < firstRow) + var end = {row: firstRow, column: 0}; + + if (this.start.row > lastRow) + var start = {row: lastRow + 1, column: 0}; + else if (this.start.row < firstRow) + var start = {row: firstRow, column: 0}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + this.extend = function(row, column) { + var cmp = this.compare(row, column); + + if (cmp == 0) + return this; + else if (cmp == -1) + var start = {row: row, column: column}; + else + var end = {row: row, column: column}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + + this.isEmpty = function() { + return (this.start.row === this.end.row && this.start.column === this.end.column); + }; + this.isMultiLine = function() { + return (this.start.row !== this.end.row); + }; + this.clone = function() { + return Range.fromPoints(this.start, this.end); + }; + this.collapseRows = function() { + if (this.end.column == 0) + return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0) + else + return new Range(this.start.row, 0, this.end.row, 0) + }; + this.toScreenRange = function(session) { + var screenPosStart = session.documentToScreenPosition(this.start); + var screenPosEnd = session.documentToScreenPosition(this.end); + + return new Range( + screenPosStart.row, screenPosStart.column, + screenPosEnd.row, screenPosEnd.column + ); + }; + this.moveBy = function(row, column) { + this.start.row += row; + this.start.column += column; + this.end.row += row; + this.end.column += column; + }; + +}).call(Range.prototype); +Range.fromPoints = function(start, end) { + return new Range(start.row, start.column, end.row, end.column); +}; +Range.comparePoints = comparePoints; + +Range.comparePoints = function(p1, p2) { + return p1.row - p2.row || p1.column - p2.column; +}; + + +exports.Range = Range; +}); + +define("ace/selection",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter","ace/range"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var lang = require("./lib/lang"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Selection = function(session) { + this.session = session; + this.doc = session.getDocument(); + + this.clearSelection(); + this.lead = this.selectionLead = this.doc.createAnchor(0, 0); + this.anchor = this.selectionAnchor = this.doc.createAnchor(0, 0); + + var self = this; + this.lead.on("change", function(e) { + self._emit("changeCursor"); + if (!self.$isEmpty) + self._emit("changeSelection"); + if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column) + self.$desiredColumn = null; + }); + + this.selectionAnchor.on("change", function() { + if (!self.$isEmpty) + self._emit("changeSelection"); + }); +}; + +(function() { + + oop.implement(this, EventEmitter); + this.isEmpty = function() { + return (this.$isEmpty || ( + this.anchor.row == this.lead.row && + this.anchor.column == this.lead.column + )); + }; + this.isMultiLine = function() { + if (this.isEmpty()) { + return false; + } + + return this.getRange().isMultiLine(); + }; + this.getCursor = function() { + return this.lead.getPosition(); + }; + this.setSelectionAnchor = function(row, column) { + this.anchor.setPosition(row, column); + + if (this.$isEmpty) { + this.$isEmpty = false; + this._emit("changeSelection"); + } + }; + this.getSelectionAnchor = function() { + if (this.$isEmpty) + return this.getSelectionLead(); + else + return this.anchor.getPosition(); + }; + this.getSelectionLead = function() { + return this.lead.getPosition(); + }; + this.shiftSelection = function(columns) { + if (this.$isEmpty) { + this.moveCursorTo(this.lead.row, this.lead.column + columns); + return; + } + + var anchor = this.getSelectionAnchor(); + var lead = this.getSelectionLead(); + + var isBackwards = this.isBackwards(); + + if (!isBackwards || anchor.column !== 0) + this.setSelectionAnchor(anchor.row, anchor.column + columns); + + if (isBackwards || lead.column !== 0) { + this.$moveSelection(function() { + this.moveCursorTo(lead.row, lead.column + columns); + }); + } + }; + this.isBackwards = function() { + var anchor = this.anchor; + var lead = this.lead; + return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column)); + }; + this.getRange = function() { + var anchor = this.anchor; + var lead = this.lead; + + if (this.isEmpty()) + return Range.fromPoints(lead, lead); + + if (this.isBackwards()) { + return Range.fromPoints(lead, anchor); + } + else { + return Range.fromPoints(anchor, lead); + } + }; + this.clearSelection = function() { + if (!this.$isEmpty) { + this.$isEmpty = true; + this._emit("changeSelection"); + } + }; + this.selectAll = function() { + var lastRow = this.doc.getLength() - 1; + this.setSelectionAnchor(0, 0); + this.moveCursorTo(lastRow, this.doc.getLine(lastRow).length); + }; + this.setRange = + this.setSelectionRange = function(range, reverse) { + if (reverse) { + this.setSelectionAnchor(range.end.row, range.end.column); + this.selectTo(range.start.row, range.start.column); + } else { + this.setSelectionAnchor(range.start.row, range.start.column); + this.selectTo(range.end.row, range.end.column); + } + if (this.getRange().isEmpty()) + this.$isEmpty = true; + this.$desiredColumn = null; + }; + + this.$moveSelection = function(mover) { + var lead = this.lead; + if (this.$isEmpty) + this.setSelectionAnchor(lead.row, lead.column); + + mover.call(this); + }; + this.selectTo = function(row, column) { + this.$moveSelection(function() { + this.moveCursorTo(row, column); + }); + }; + this.selectToPosition = function(pos) { + this.$moveSelection(function() { + this.moveCursorToPosition(pos); + }); + }; + this.moveTo = function(row, column) { + this.clearSelection(); + this.moveCursorTo(row, column); + }; + this.moveToPosition = function(pos) { + this.clearSelection(); + this.moveCursorToPosition(pos); + }; + this.selectUp = function() { + this.$moveSelection(this.moveCursorUp); + }; + this.selectDown = function() { + this.$moveSelection(this.moveCursorDown); + }; + this.selectRight = function() { + this.$moveSelection(this.moveCursorRight); + }; + this.selectLeft = function() { + this.$moveSelection(this.moveCursorLeft); + }; + this.selectLineStart = function() { + this.$moveSelection(this.moveCursorLineStart); + }; + this.selectLineEnd = function() { + this.$moveSelection(this.moveCursorLineEnd); + }; + this.selectFileEnd = function() { + this.$moveSelection(this.moveCursorFileEnd); + }; + this.selectFileStart = function() { + this.$moveSelection(this.moveCursorFileStart); + }; + this.selectWordRight = function() { + this.$moveSelection(this.moveCursorWordRight); + }; + this.selectWordLeft = function() { + this.$moveSelection(this.moveCursorWordLeft); + }; + this.getWordRange = function(row, column) { + if (typeof column == "undefined") { + var cursor = row || this.lead; + row = cursor.row; + column = cursor.column; + } + return this.session.getWordRange(row, column); + }; + this.selectWord = function() { + this.setSelectionRange(this.getWordRange()); + }; + this.selectAWord = function() { + var cursor = this.getCursor(); + var range = this.session.getAWordRange(cursor.row, cursor.column); + this.setSelectionRange(range); + }; + + this.getLineRange = function(row, excludeLastChar) { + var rowStart = typeof row == "number" ? row : this.lead.row; + var rowEnd; + + var foldLine = this.session.getFoldLine(rowStart); + if (foldLine) { + rowStart = foldLine.start.row; + rowEnd = foldLine.end.row; + } else { + rowEnd = rowStart; + } + if (excludeLastChar === true) + return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length); + else + return new Range(rowStart, 0, rowEnd + 1, 0); + }; + this.selectLine = function() { + this.setSelectionRange(this.getLineRange()); + }; + this.moveCursorUp = function() { + this.moveCursorBy(-1, 0); + }; + this.moveCursorDown = function() { + this.moveCursorBy(1, 0); + }; + this.moveCursorLeft = function() { + var cursor = this.lead.getPosition(), + fold; + + if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) { + this.moveCursorTo(fold.start.row, fold.start.column); + } else if (cursor.column === 0) { + if (cursor.row > 0) { + this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length); + } + } + else { + var tabSize = this.session.getTabSize(); + if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column-tabSize, cursor.column).split(" ").length-1 == tabSize) + this.moveCursorBy(0, -tabSize); + else + this.moveCursorBy(0, -1); + } + }; + this.moveCursorRight = function() { + var cursor = this.lead.getPosition(), + fold; + if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) { + this.moveCursorTo(fold.end.row, fold.end.column); + } + else if (this.lead.column == this.doc.getLine(this.lead.row).length) { + if (this.lead.row < this.doc.getLength() - 1) { + this.moveCursorTo(this.lead.row + 1, 0); + } + } + else { + var tabSize = this.session.getTabSize(); + var cursor = this.lead; + if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column, cursor.column+tabSize).split(" ").length-1 == tabSize) + this.moveCursorBy(0, tabSize); + else + this.moveCursorBy(0, 1); + } + }; + this.moveCursorLineStart = function() { + var row = this.lead.row; + var column = this.lead.column; + var screenRow = this.session.documentToScreenRow(row, column); + var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0); + var beforeCursor = this.session.getDisplayLine( + row, null, firstColumnPosition.row, + firstColumnPosition.column + ); + + var leadingSpace = beforeCursor.match(/^\s*/); + if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart) + firstColumnPosition.column += leadingSpace[0].length; + this.moveCursorToPosition(firstColumnPosition); + }; + this.moveCursorLineEnd = function() { + var lead = this.lead; + var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column); + if (this.lead.column == lineEnd.column) { + var line = this.session.getLine(lineEnd.row); + if (lineEnd.column == line.length) { + var textEnd = line.search(/\s+$/); + if (textEnd > 0) + lineEnd.column = textEnd; + } + } + + this.moveCursorTo(lineEnd.row, lineEnd.column); + }; + this.moveCursorFileEnd = function() { + var row = this.doc.getLength() - 1; + var column = this.doc.getLine(row).length; + this.moveCursorTo(row, column); + }; + this.moveCursorFileStart = function() { + this.moveCursorTo(0, 0); + }; + this.moveCursorLongWordRight = function() { + var row = this.lead.row; + var column = this.lead.column; + var line = this.doc.getLine(row); + var rightOfCursor = line.substring(column); + + var match; + this.session.nonTokenRe.lastIndex = 0; + this.session.tokenRe.lastIndex = 0; + var fold = this.session.getFoldAt(row, column, 1); + if (fold) { + this.moveCursorTo(fold.end.row, fold.end.column); + return; + } + if (match = this.session.nonTokenRe.exec(rightOfCursor)) { + column += this.session.nonTokenRe.lastIndex; + this.session.nonTokenRe.lastIndex = 0; + rightOfCursor = line.substring(column); + } + if (column >= line.length) { + this.moveCursorTo(row, line.length); + this.moveCursorRight(); + if (row < this.doc.getLength() - 1) + this.moveCursorWordRight(); + return; + } + if (match = this.session.tokenRe.exec(rightOfCursor)) { + column += this.session.tokenRe.lastIndex; + this.session.tokenRe.lastIndex = 0; + } + + this.moveCursorTo(row, column); + }; + this.moveCursorLongWordLeft = function() { + var row = this.lead.row; + var column = this.lead.column; + var fold; + if (fold = this.session.getFoldAt(row, column, -1)) { + this.moveCursorTo(fold.start.row, fold.start.column); + return; + } + + var str = this.session.getFoldStringAt(row, column, -1); + if (str == null) { + str = this.doc.getLine(row).substring(0, column); + } + + var leftOfCursor = lang.stringReverse(str); + var match; + this.session.nonTokenRe.lastIndex = 0; + this.session.tokenRe.lastIndex = 0; + if (match = this.session.nonTokenRe.exec(leftOfCursor)) { + column -= this.session.nonTokenRe.lastIndex; + leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex); + this.session.nonTokenRe.lastIndex = 0; + } + if (column <= 0) { + this.moveCursorTo(row, 0); + this.moveCursorLeft(); + if (row > 0) + this.moveCursorWordLeft(); + return; + } + if (match = this.session.tokenRe.exec(leftOfCursor)) { + column -= this.session.tokenRe.lastIndex; + this.session.tokenRe.lastIndex = 0; + } + + this.moveCursorTo(row, column); + }; + + this.$shortWordEndIndex = function(rightOfCursor) { + var match, index = 0, ch; + var whitespaceRe = /\s/; + var tokenRe = this.session.tokenRe; + + tokenRe.lastIndex = 0; + if (match = this.session.tokenRe.exec(rightOfCursor)) { + index = this.session.tokenRe.lastIndex; + } else { + while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) + index ++; + + if (index < 1) { + tokenRe.lastIndex = 0; + while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) { + tokenRe.lastIndex = 0; + index ++; + if (whitespaceRe.test(ch)) { + if (index > 2) { + index--; + break; + } else { + while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) + index ++; + if (index > 2) + break; + } + } + } + } + } + tokenRe.lastIndex = 0; + + return index; + }; + + this.moveCursorShortWordRight = function() { + var row = this.lead.row; + var column = this.lead.column; + var line = this.doc.getLine(row); + var rightOfCursor = line.substring(column); + + var fold = this.session.getFoldAt(row, column, 1); + if (fold) + return this.moveCursorTo(fold.end.row, fold.end.column); + + if (column == line.length) { + var l = this.doc.getLength(); + do { + row++; + rightOfCursor = this.doc.getLine(row); + } while (row < l && /^\s*$/.test(rightOfCursor)); + + if (!/^\s+/.test(rightOfCursor)) + rightOfCursor = ""; + column = 0; + } + + var index = this.$shortWordEndIndex(rightOfCursor); + + this.moveCursorTo(row, column + index); + }; + + this.moveCursorShortWordLeft = function() { + var row = this.lead.row; + var column = this.lead.column; + + var fold; + if (fold = this.session.getFoldAt(row, column, -1)) + return this.moveCursorTo(fold.start.row, fold.start.column); + + var line = this.session.getLine(row).substring(0, column); + if (column === 0) { + do { + row--; + line = this.doc.getLine(row); + } while (row > 0 && /^\s*$/.test(line)); + + column = line.length; + if (!/\s+$/.test(line)) + line = ""; + } + + var leftOfCursor = lang.stringReverse(line); + var index = this.$shortWordEndIndex(leftOfCursor); + + return this.moveCursorTo(row, column - index); + }; + + this.moveCursorWordRight = function() { + if (this.session.$selectLongWords) + this.moveCursorLongWordRight(); + else + this.moveCursorShortWordRight(); + }; + + this.moveCursorWordLeft = function() { + if (this.session.$selectLongWords) + this.moveCursorLongWordLeft(); + else + this.moveCursorShortWordLeft(); + }; + this.moveCursorBy = function(rows, chars) { + var screenPos = this.session.documentToScreenPosition( + this.lead.row, + this.lead.column + ); + + if (chars === 0) { + if (this.$desiredColumn) + screenPos.column = this.$desiredColumn; + else + this.$desiredColumn = screenPos.column; + } + + var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column); + + if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) { + if (this.session.lineWidgets && this.session.lineWidgets[docPos.row]) { + if (docPos.row > 0 || rows > 0) + docPos.row++; + } + } + this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0); + }; + this.moveCursorToPosition = function(position) { + this.moveCursorTo(position.row, position.column); + }; + this.moveCursorTo = function(row, column, keepDesiredColumn) { + var fold = this.session.getFoldAt(row, column, 1); + if (fold) { + row = fold.start.row; + column = fold.start.column; + } + + this.$keepDesiredColumnOnChange = true; + this.lead.setPosition(row, column); + this.$keepDesiredColumnOnChange = false; + + if (!keepDesiredColumn) + this.$desiredColumn = null; + }; + this.moveCursorToScreen = function(row, column, keepDesiredColumn) { + var pos = this.session.screenToDocumentPosition(row, column); + this.moveCursorTo(pos.row, pos.column, keepDesiredColumn); + }; + this.detach = function() { + this.lead.detach(); + this.anchor.detach(); + this.session = this.doc = null; + }; + + this.fromOrientedRange = function(range) { + this.setSelectionRange(range, range.cursor == range.start); + this.$desiredColumn = range.desiredColumn || this.$desiredColumn; + }; + + this.toOrientedRange = function(range) { + var r = this.getRange(); + if (range) { + range.start.column = r.start.column; + range.start.row = r.start.row; + range.end.column = r.end.column; + range.end.row = r.end.row; + } else { + range = r; + } + + range.cursor = this.isBackwards() ? range.start : range.end; + range.desiredColumn = this.$desiredColumn; + return range; + }; + this.getRangeOfMovements = function(func) { + var start = this.getCursor(); + try { + func(this); + var end = this.getCursor(); + return Range.fromPoints(start,end); + } catch(e) { + return Range.fromPoints(start,start); + } finally { + this.moveCursorToPosition(start); + } + }; + + this.toJSON = function() { + if (this.rangeCount) { + var data = this.ranges.map(function(r) { + var r1 = r.clone(); + r1.isBackwards = r.cursor == r.start; + return r1; + }); + } else { + var data = this.getRange(); + data.isBackwards = this.isBackwards(); + } + return data; + }; + + this.fromJSON = function(data) { + if (data.start == undefined) { + if (this.rangeList) { + this.toSingleRange(data[0]); + for (var i = data.length; i--; ) { + var r = Range.fromPoints(data[i].start, data[i].end); + if (data[i].isBackwards) + r.cursor = r.start; + this.addRange(r, true); + } + return; + } else + data = data[0]; + } + if (this.rangeList) + this.toSingleRange(data); + this.setSelectionRange(data, data.isBackwards); + }; + + this.isEqual = function(data) { + if ((data.length || this.rangeCount) && data.length != this.rangeCount) + return false; + if (!data.length || !this.ranges) + return this.getRange().isEqual(data); + + for (var i = this.ranges.length; i--; ) { + if (!this.ranges[i].isEqual(data[i])) + return false; + } + return true; + }; + +}).call(Selection.prototype); + +exports.Selection = Selection; +}); + +define("ace/tokenizer",["require","exports","module","ace/config"], function(require, exports, module) { +"use strict"; + +var config = require("./config"); +var MAX_TOKEN_COUNT = 2000; +var Tokenizer = function(rules) { + this.states = rules; + + this.regExps = {}; + this.matchMappings = {}; + for (var key in this.states) { + var state = this.states[key]; + var ruleRegExps = []; + var matchTotal = 0; + var mapping = this.matchMappings[key] = {defaultToken: "text"}; + var flag = "g"; + + var splitterRurles = []; + for (var i = 0; i < state.length; i++) { + var rule = state[i]; + if (rule.defaultToken) + mapping.defaultToken = rule.defaultToken; + if (rule.caseInsensitive) + flag = "gi"; + if (rule.regex == null) + continue; + + if (rule.regex instanceof RegExp) + rule.regex = rule.regex.toString().slice(1, -1); + var adjustedregex = rule.regex; + var matchcount = new RegExp("(?:(" + adjustedregex + ")|(.))").exec("a").length - 2; + if (Array.isArray(rule.token)) { + if (rule.token.length == 1 || matchcount == 1) { + rule.token = rule.token[0]; + } else if (matchcount - 1 != rule.token.length) { + this.reportError("number of classes and regexp groups doesn't match", { + rule: rule, + groupCount: matchcount - 1 + }); + rule.token = rule.token[0]; + } else { + rule.tokenArray = rule.token; + rule.token = null; + rule.onMatch = this.$arrayTokens; + } + } else if (typeof rule.token == "function" && !rule.onMatch) { + if (matchcount > 1) + rule.onMatch = this.$applyToken; + else + rule.onMatch = rule.token; + } + + if (matchcount > 1) { + if (/\\\d/.test(rule.regex)) { + adjustedregex = rule.regex.replace(/\\([0-9]+)/g, function(match, digit) { + return "\\" + (parseInt(digit, 10) + matchTotal + 1); + }); + } else { + matchcount = 1; + adjustedregex = this.removeCapturingGroups(rule.regex); + } + if (!rule.splitRegex && typeof rule.token != "string") + splitterRurles.push(rule); // flag will be known only at the very end + } + + mapping[matchTotal] = i; + matchTotal += matchcount; + + ruleRegExps.push(adjustedregex); + if (!rule.onMatch) + rule.onMatch = null; + } + + if (!ruleRegExps.length) { + mapping[0] = 0; + ruleRegExps.push("$"); + } + + splitterRurles.forEach(function(rule) { + rule.splitRegex = this.createSplitterRegexp(rule.regex, flag); + }, this); + + this.regExps[key] = new RegExp("(" + ruleRegExps.join(")|(") + ")|($)", flag); + } +}; + +(function() { + this.$setMaxTokenCount = function(m) { + MAX_TOKEN_COUNT = m | 0; + }; + + this.$applyToken = function(str) { + var values = this.splitRegex.exec(str).slice(1); + var types = this.token.apply(this, values); + if (typeof types === "string") + return [{type: types, value: str}]; + + var tokens = []; + for (var i = 0, l = types.length; i < l; i++) { + if (values[i]) + tokens[tokens.length] = { + type: types[i], + value: values[i] + }; + } + return tokens; + }; + + this.$arrayTokens = function(str) { + if (!str) + return []; + var values = this.splitRegex.exec(str); + if (!values) + return "text"; + var tokens = []; + var types = this.tokenArray; + for (var i = 0, l = types.length; i < l; i++) { + if (values[i + 1]) + tokens[tokens.length] = { + type: types[i], + value: values[i + 1] + }; + } + return tokens; + }; + + this.removeCapturingGroups = function(src) { + var r = src.replace( + /\[(?:\\.|[^\]])*?\]|\\.|\(\?[:=!]|(\()/g, + function(x, y) {return y ? "(?:" : x;} + ); + return r; + }; + + this.createSplitterRegexp = function(src, flag) { + if (src.indexOf("(?=") != -1) { + var stack = 0; + var inChClass = false; + var lastCapture = {}; + src.replace(/(\\.)|(\((?:\?[=!])?)|(\))|([\[\]])/g, function( + m, esc, parenOpen, parenClose, square, index + ) { + if (inChClass) { + inChClass = square != "]"; + } else if (square) { + inChClass = true; + } else if (parenClose) { + if (stack == lastCapture.stack) { + lastCapture.end = index+1; + lastCapture.stack = -1; + } + stack--; + } else if (parenOpen) { + stack++; + if (parenOpen.length != 1) { + lastCapture.stack = stack + lastCapture.start = index; + } + } + return m; + }); + + if (lastCapture.end != null && /^\)*$/.test(src.substr(lastCapture.end))) + src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end); + } + if (src.charAt(0) != "^") src = "^" + src; + if (src.charAt(src.length - 1) != "$") src += "$"; + + return new RegExp(src, (flag||"").replace("g", "")); + }; + this.getLineTokens = function(line, startState) { + if (startState && typeof startState != "string") { + var stack = startState.slice(0); + startState = stack[0]; + if (startState === "#tmp") { + stack.shift() + startState = stack.shift() + } + } else + var stack = []; + + var currentState = startState || "start"; + var state = this.states[currentState]; + if (!state) { + currentState = "start"; + state = this.states[currentState]; + } + var mapping = this.matchMappings[currentState]; + var re = this.regExps[currentState]; + re.lastIndex = 0; + + var match, tokens = []; + var lastIndex = 0; + var matchAttempts = 0; + + var token = {type: null, value: ""}; + + while (match = re.exec(line)) { + var type = mapping.defaultToken; + var rule = null; + var value = match[0]; + var index = re.lastIndex; + + if (index - value.length > lastIndex) { + var skipped = line.substring(lastIndex, index - value.length); + if (token.type == type) { + token.value += skipped; + } else { + if (token.type) + tokens.push(token); + token = {type: type, value: skipped}; + } + } + + for (var i = 0; i < match.length-2; i++) { + if (match[i + 1] === undefined) + continue; + + rule = state[mapping[i]]; + + if (rule.onMatch) + type = rule.onMatch(value, currentState, stack); + else + type = rule.token; + + if (rule.next) { + if (typeof rule.next == "string") { + currentState = rule.next; + } else { + currentState = rule.next(currentState, stack); + } + + state = this.states[currentState]; + if (!state) { + this.reportError("state doesn't exist", currentState); + currentState = "start"; + state = this.states[currentState]; + } + mapping = this.matchMappings[currentState]; + lastIndex = index; + re = this.regExps[currentState]; + re.lastIndex = index; + } + break; + } + + if (value) { + if (typeof type === "string") { + if ((!rule || rule.merge !== false) && token.type === type) { + token.value += value; + } else { + if (token.type) + tokens.push(token); + token = {type: type, value: value}; + } + } else if (type) { + if (token.type) + tokens.push(token); + token = {type: null, value: ""}; + for (var i = 0; i < type.length; i++) + tokens.push(type[i]); + } + } + + if (lastIndex == line.length) + break; + + lastIndex = index; + + if (matchAttempts++ > MAX_TOKEN_COUNT) { + if (matchAttempts > 2 * line.length) { + this.reportError("infinite loop with in ace tokenizer", { + startState: startState, + line: line + }); + } + while (lastIndex < line.length) { + if (token.type) + tokens.push(token); + token = { + value: line.substring(lastIndex, lastIndex += 2000), + type: "overflow" + }; + } + currentState = "start"; + stack = []; + break; + } + } + + if (token.type) + tokens.push(token); + + if (stack.length > 1) { + if (stack[0] !== currentState) + stack.unshift("#tmp", currentState); + } + return { + tokens : tokens, + state : stack.length ? stack : currentState + }; + }; + + this.reportError = config.reportError; + +}).call(Tokenizer.prototype); + +exports.Tokenizer = Tokenizer; +}); + +define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var lang = require("../lib/lang"); + +var TextHighlightRules = function() { + + this.$rules = { + "start" : [{ + token : "empty_line", + regex : '^$' + }, { + defaultToken : "text" + }] + }; +}; + +(function() { + + this.addRules = function(rules, prefix) { + if (!prefix) { + for (var key in rules) + this.$rules[key] = rules[key]; + return; + } + for (var key in rules) { + var state = rules[key]; + for (var i = 0; i < state.length; i++) { + var rule = state[i]; + if (rule.next || rule.onMatch) { + if (typeof rule.next == "string") { + if (rule.next.indexOf(prefix) !== 0) + rule.next = prefix + rule.next; + } + if (rule.nextState && rule.nextState.indexOf(prefix) !== 0) + rule.nextState = prefix + rule.nextState; + } + } + this.$rules[prefix + key] = state; + } + }; + + this.getRules = function() { + return this.$rules; + }; + + this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) { + var embedRules = typeof HighlightRules == "function" + ? new HighlightRules().getRules() + : HighlightRules; + if (states) { + for (var i = 0; i < states.length; i++) + states[i] = prefix + states[i]; + } else { + states = []; + for (var key in embedRules) + states.push(prefix + key); + } + + this.addRules(embedRules, prefix); + + if (escapeRules) { + var addRules = Array.prototype[append ? "push" : "unshift"]; + for (var i = 0; i < states.length; i++) + addRules.apply(this.$rules[states[i]], lang.deepCopy(escapeRules)); + } + + if (!this.$embeds) + this.$embeds = []; + this.$embeds.push(prefix); + }; + + this.getEmbeds = function() { + return this.$embeds; + }; + + var pushState = function(currentState, stack) { + if (currentState != "start" || stack.length) + stack.unshift(this.nextState, currentState); + return this.nextState; + }; + var popState = function(currentState, stack) { + stack.shift(); + return stack.shift() || "start"; + }; + + this.normalizeRules = function() { + var id = 0; + var rules = this.$rules; + function processState(key) { + var state = rules[key]; + state.processed = true; + for (var i = 0; i < state.length; i++) { + var rule = state[i]; + var toInsert = null; + if (Array.isArray(rule)) { + toInsert = rule; + rule = {}; + } + if (!rule.regex && rule.start) { + rule.regex = rule.start; + if (!rule.next) + rule.next = []; + rule.next.push({ + defaultToken: rule.token + }, { + token: rule.token + ".end", + regex: rule.end || rule.start, + next: "pop" + }); + rule.token = rule.token + ".start"; + rule.push = true; + } + var next = rule.next || rule.push; + if (next && Array.isArray(next)) { + var stateName = rule.stateName; + if (!stateName) { + stateName = rule.token; + if (typeof stateName != "string") + stateName = stateName[0] || ""; + if (rules[stateName]) + stateName += id++; + } + rules[stateName] = next; + rule.next = stateName; + processState(stateName); + } else if (next == "pop") { + rule.next = popState; + } + + if (rule.push) { + rule.nextState = rule.next || rule.push; + rule.next = pushState; + delete rule.push; + } + + if (rule.rules) { + for (var r in rule.rules) { + if (rules[r]) { + if (rules[r].push) + rules[r].push.apply(rules[r], rule.rules[r]); + } else { + rules[r] = rule.rules[r]; + } + } + } + var includeName = typeof rule == "string" + ? rule + : typeof rule.include == "string" + ? rule.include + : ""; + if (includeName) { + toInsert = rules[includeName]; + } + + if (toInsert) { + var args = [i, 1].concat(toInsert); + if (rule.noEscape) + args = args.filter(function(x) {return !x.next;}); + state.splice.apply(state, args); + i--; + } + + if (rule.keywordMap) { + rule.token = this.createKeywordMapper( + rule.keywordMap, rule.defaultToken || "text", rule.caseInsensitive + ); + delete rule.defaultToken; + } + } + } + Object.keys(rules).forEach(processState, this); + }; + + this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) { + var keywords = Object.create(null); + Object.keys(map).forEach(function(className) { + var a = map[className]; + if (ignoreCase) + a = a.toLowerCase(); + var list = a.split(splitChar || "|"); + for (var i = list.length; i--; ) + keywords[list[i]] = className; + }); + if (Object.getPrototypeOf(keywords)) { + keywords.__proto__ = null; + } + this.$keywordList = Object.keys(keywords); + map = null; + return ignoreCase + ? function(value) {return keywords[value.toLowerCase()] || defaultToken } + : function(value) {return keywords[value] || defaultToken }; + }; + + this.getKeywords = function() { + return this.$keywords; + }; + +}).call(TextHighlightRules.prototype); + +exports.TextHighlightRules = TextHighlightRules; +}); + +define("ace/mode/behaviour",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var Behaviour = function() { + this.$behaviours = {}; +}; + +(function () { + + this.add = function (name, action, callback) { + switch (undefined) { + case this.$behaviours: + this.$behaviours = {}; + case this.$behaviours[name]: + this.$behaviours[name] = {}; + } + this.$behaviours[name][action] = callback; + } + + this.addBehaviours = function (behaviours) { + for (var key in behaviours) { + for (var action in behaviours[key]) { + this.add(key, action, behaviours[key][action]); + } + } + } + + this.remove = function (name) { + if (this.$behaviours && this.$behaviours[name]) { + delete this.$behaviours[name]; + } + } + + this.inherit = function (mode, filter) { + if (typeof mode === "function") { + var behaviours = new mode().getBehaviours(filter); + } else { + var behaviours = mode.getBehaviours(filter); + } + this.addBehaviours(behaviours); + } + + this.getBehaviours = function (filter) { + if (!filter) { + return this.$behaviours; + } else { + var ret = {} + for (var i = 0; i < filter.length; i++) { + if (this.$behaviours[filter[i]]) { + ret[filter[i]] = this.$behaviours[filter[i]]; + } + } + return ret; + } + } + +}).call(Behaviour.prototype); + +exports.Behaviour = Behaviour; +}); + +define("ace/token_iterator",["require","exports","module"], function(require, exports, module) { +"use strict"; +var TokenIterator = function(session, initialRow, initialColumn) { + this.$session = session; + this.$row = initialRow; + this.$rowTokens = session.getTokens(initialRow); + + var token = session.getTokenAt(initialRow, initialColumn); + this.$tokenIndex = token ? token.index : -1; +}; + +(function() { + this.stepBackward = function() { + this.$tokenIndex -= 1; + + while (this.$tokenIndex < 0) { + this.$row -= 1; + if (this.$row < 0) { + this.$row = 0; + return null; + } + + this.$rowTokens = this.$session.getTokens(this.$row); + this.$tokenIndex = this.$rowTokens.length - 1; + } + + return this.$rowTokens[this.$tokenIndex]; + }; + this.stepForward = function() { + this.$tokenIndex += 1; + var rowCount; + while (this.$tokenIndex >= this.$rowTokens.length) { + this.$row += 1; + if (!rowCount) + rowCount = this.$session.getLength(); + if (this.$row >= rowCount) { + this.$row = rowCount - 1; + return null; + } + + this.$rowTokens = this.$session.getTokens(this.$row); + this.$tokenIndex = 0; + } + + return this.$rowTokens[this.$tokenIndex]; + }; + this.getCurrentToken = function () { + return this.$rowTokens[this.$tokenIndex]; + }; + this.getCurrentTokenRow = function () { + return this.$row; + }; + this.getCurrentTokenColumn = function() { + var rowTokens = this.$rowTokens; + var tokenIndex = this.$tokenIndex; + var column = rowTokens[tokenIndex].start; + if (column !== undefined) + return column; + + column = 0; + while (tokenIndex > 0) { + tokenIndex -= 1; + column += rowTokens[tokenIndex].value.length; + } + + return column; + }; + this.getCurrentTokenPosition = function() { + return {row: this.$row, column: this.getCurrentTokenColumn()}; + }; + +}).call(TokenIterator.prototype); + +exports.TokenIterator = TokenIterator; +}); + +define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"], function(require, exports, module) { +"use strict"; + +var oop = require("../../lib/oop"); +var Behaviour = require("../behaviour").Behaviour; +var TokenIterator = require("../../token_iterator").TokenIterator; +var lang = require("../../lib/lang"); + +var SAFE_INSERT_IN_TOKENS = + ["text", "paren.rparen", "punctuation.operator"]; +var SAFE_INSERT_BEFORE_TOKENS = + ["text", "paren.rparen", "punctuation.operator", "comment"]; + +var context; +var contextCache = {}; +var initContext = function(editor) { + var id = -1; + if (editor.multiSelect) { + id = editor.selection.index; + if (contextCache.rangeCount != editor.multiSelect.rangeCount) + contextCache = {rangeCount: editor.multiSelect.rangeCount}; + } + if (contextCache[id]) + return context = contextCache[id]; + context = contextCache[id] = { + autoInsertedBrackets: 0, + autoInsertedRow: -1, + autoInsertedLineEnd: "", + maybeInsertedBrackets: 0, + maybeInsertedRow: -1, + maybeInsertedLineStart: "", + maybeInsertedLineEnd: "" + }; +}; + +var getWrapped = function(selection, selected, opening, closing) { + var rowDiff = selection.end.row - selection.start.row; + return { + text: opening + selected + closing, + selection: [ + 0, + selection.start.column + 1, + rowDiff, + selection.end.column + (rowDiff ? 0 : 1) + ] + }; +}; + +var CstyleBehaviour = function() { + this.add("braces", "insertion", function(state, action, editor, session, text) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (text == '{') { + initContext(editor); + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "{" && editor.getWrapBehavioursEnabled()) { + return getWrapped(selection, selected, '{', '}'); + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + if (/[\]\}\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) { + CstyleBehaviour.recordAutoInsert(editor, session, "}"); + return { + text: '{}', + selection: [1, 1] + }; + } else { + CstyleBehaviour.recordMaybeInsert(editor, session, "{"); + return { + text: '{', + selection: [1, 1] + }; + } + } + } else if (text == '}') { + initContext(editor); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == '}') { + var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } else if (text == "\n" || text == "\r\n") { + initContext(editor); + var closing = ""; + if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) { + closing = lang.stringRepeat("}", context.maybeInsertedBrackets); + CstyleBehaviour.clearMaybeInsertedClosing(); + } + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar === '}') { + var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}'); + if (!openBracePos) + return null; + var next_indent = this.$getIndent(session.getLine(openBracePos.row)); + } else if (closing) { + var next_indent = this.$getIndent(line); + } else { + CstyleBehaviour.clearMaybeInsertedClosing(); + return; + } + var indent = next_indent + session.getTabString(); + + return { + text: '\n' + indent + '\n' + next_indent + closing, + selection: [1, indent.length, 1, indent.length] + }; + } else { + CstyleBehaviour.clearMaybeInsertedClosing(); + } + }); + + this.add("braces", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '{') { + initContext(editor); + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.end.column, range.end.column + 1); + if (rightChar == '}') { + range.end.column++; + return range; + } else { + context.maybeInsertedBrackets--; + } + } + }); + + this.add("parens", "insertion", function(state, action, editor, session, text) { + if (text == '(') { + initContext(editor); + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return getWrapped(selection, selected, '(', ')'); + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, ")"); + return { + text: '()', + selection: [1, 1] + }; + } + } else if (text == ')') { + initContext(editor); + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ')') { + var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("parens", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '(') { + initContext(editor); + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ')') { + range.end.column++; + return range; + } + } + }); + + this.add("brackets", "insertion", function(state, action, editor, session, text) { + if (text == '[') { + initContext(editor); + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && editor.getWrapBehavioursEnabled()) { + return getWrapped(selection, selected, '[', ']'); + } else if (CstyleBehaviour.isSaneInsertion(editor, session)) { + CstyleBehaviour.recordAutoInsert(editor, session, "]"); + return { + text: '[]', + selection: [1, 1] + }; + } + } else if (text == ']') { + initContext(editor); + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var rightChar = line.substring(cursor.column, cursor.column + 1); + if (rightChar == ']') { + var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row}); + if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) { + CstyleBehaviour.popAutoInsertedClosing(); + return { + text: '', + selection: [1, 1] + }; + } + } + } + }); + + this.add("brackets", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && selected == '[') { + initContext(editor); + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == ']') { + range.end.column++; + return range; + } + } + }); + + this.add("string_dquotes", "insertion", function(state, action, editor, session, text) { + if (text == '"' || text == "'") { + if (this.lineCommentStart && this.lineCommentStart.indexOf(text) != -1) + return; + initContext(editor); + var quote = text; + var selection = editor.getSelectionRange(); + var selected = session.doc.getTextRange(selection); + if (selected !== "" && selected !== "'" && selected != '"' && editor.getWrapBehavioursEnabled()) { + return getWrapped(selection, selected, quote, quote); + } else if (!selected) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + var leftChar = line.substring(cursor.column-1, cursor.column); + var rightChar = line.substring(cursor.column, cursor.column + 1); + + var token = session.getTokenAt(cursor.row, cursor.column); + var rightToken = session.getTokenAt(cursor.row, cursor.column + 1); + if (leftChar == "\\" && token && /escape/.test(token.type)) + return null; + + var stringBefore = token && /string|escape/.test(token.type); + var stringAfter = !rightToken || /string|escape/.test(rightToken.type); + + var pair; + if (rightChar == quote) { + pair = stringBefore !== stringAfter; + if (pair && /string\.end/.test(rightToken.type)) + pair = false; + } else { + if (stringBefore && !stringAfter) + return null; // wrap string with different quote + if (stringBefore && stringAfter) + return null; // do not pair quotes inside strings + var wordRe = session.$mode.tokenRe; + wordRe.lastIndex = 0; + var isWordBefore = wordRe.test(leftChar); + wordRe.lastIndex = 0; + var isWordAfter = wordRe.test(leftChar); + if (isWordBefore || isWordAfter) + return null; // before or after alphanumeric + if (rightChar && !/[\s;,.})\]\\]/.test(rightChar)) + return null; // there is rightChar and it isn't closing + pair = true; + } + return { + text: pair ? quote + quote : "", + selection: [1,1] + }; + } + } + }); + + this.add("string_dquotes", "deletion", function(state, action, editor, session, range) { + var selected = session.doc.getTextRange(range); + if (!range.isMultiLine() && (selected == '"' || selected == "'")) { + initContext(editor); + var line = session.doc.getLine(range.start.row); + var rightChar = line.substring(range.start.column + 1, range.start.column + 2); + if (rightChar == selected) { + range.end.column++; + return range; + } + } + }); + +}; + + +CstyleBehaviour.isSaneInsertion = function(editor, session) { + var cursor = editor.getCursorPosition(); + var iterator = new TokenIterator(session, cursor.row, cursor.column); + if (!this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) { + var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1); + if (!this.$matchTokenType(iterator2.getCurrentToken() || "text", SAFE_INSERT_IN_TOKENS)) + return false; + } + iterator.stepForward(); + return iterator.getCurrentTokenRow() !== cursor.row || + this.$matchTokenType(iterator.getCurrentToken() || "text", SAFE_INSERT_BEFORE_TOKENS); +}; + +CstyleBehaviour.$matchTokenType = function(token, types) { + return types.indexOf(token.type || token) > -1; +}; + +CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0])) + context.autoInsertedBrackets = 0; + context.autoInsertedRow = cursor.row; + context.autoInsertedLineEnd = bracket + line.substr(cursor.column); + context.autoInsertedBrackets++; +}; + +CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) { + var cursor = editor.getCursorPosition(); + var line = session.doc.getLine(cursor.row); + if (!this.isMaybeInsertedClosing(cursor, line)) + context.maybeInsertedBrackets = 0; + context.maybeInsertedRow = cursor.row; + context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket; + context.maybeInsertedLineEnd = line.substr(cursor.column); + context.maybeInsertedBrackets++; +}; + +CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) { + return context.autoInsertedBrackets > 0 && + cursor.row === context.autoInsertedRow && + bracket === context.autoInsertedLineEnd[0] && + line.substr(cursor.column) === context.autoInsertedLineEnd; +}; + +CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) { + return context.maybeInsertedBrackets > 0 && + cursor.row === context.maybeInsertedRow && + line.substr(cursor.column) === context.maybeInsertedLineEnd && + line.substr(0, cursor.column) == context.maybeInsertedLineStart; +}; + +CstyleBehaviour.popAutoInsertedClosing = function() { + context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1); + context.autoInsertedBrackets--; +}; + +CstyleBehaviour.clearMaybeInsertedClosing = function() { + if (context) { + context.maybeInsertedBrackets = 0; + context.maybeInsertedRow = -1; + } +}; + + + +oop.inherits(CstyleBehaviour, Behaviour); + +exports.CstyleBehaviour = CstyleBehaviour; +}); + +define("ace/unicode",["require","exports","module"], function(require, exports, module) { +"use strict"; +exports.packages = {}; + +addUnicodePackage({ + L: "0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC", + Ll: "0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A", + Lu: "0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A", + Lt: "01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC", + Lm: "02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F", + Lo: "01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC", + M: "0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26", + Mn: "0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26", + Mc: "0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC", + Me: "0488048906DE20DD-20E020E2-20E4A670-A672", + N: "0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19", + Nd: "0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19", + Nl: "16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF", + No: "00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835", + P: "0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65", + Pd: "002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D", + Ps: "0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62", + Pe: "0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63", + Pi: "00AB2018201B201C201F20392E022E042E092E0C2E1C2E20", + Pf: "00BB2019201D203A2E032E052E0A2E0D2E1D2E21", + Pc: "005F203F20402054FE33FE34FE4D-FE4FFF3F", + Po: "0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65", + S: "0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD", + Sm: "002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC", + Sc: "002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6", + Sk: "005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3", + So: "00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD", + Z: "002000A01680180E2000-200A20282029202F205F3000", + Zs: "002000A01680180E2000-200A202F205F3000", + Zl: "2028", + Zp: "2029", + C: "0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF", + Cc: "0000-001F007F-009F", + Cf: "00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB", + Co: "E000-F8FF", + Cs: "D800-DFFF", + Cn: "03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF" +}); + +function addUnicodePackage (pack) { + var codePoint = /\w{4}/g; + for (var name in pack) + exports.packages[name] = pack[name].replace(codePoint, "\\u$&"); +} + +}); + +define("ace/mode/text",["require","exports","module","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour/cstyle","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"], function(require, exports, module) { +"use strict"; + +var Tokenizer = require("../tokenizer").Tokenizer; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; +var CstyleBehaviour = require("./behaviour/cstyle").CstyleBehaviour; +var unicode = require("../unicode"); +var lang = require("../lib/lang"); +var TokenIterator = require("../token_iterator").TokenIterator; +var Range = require("../range").Range; + +var Mode = function() { + this.HighlightRules = TextHighlightRules; +}; + +(function() { + this.$defaultBehaviour = new CstyleBehaviour(); + + this.tokenRe = new RegExp("^[" + + unicode.packages.L + + unicode.packages.Mn + unicode.packages.Mc + + unicode.packages.Nd + + unicode.packages.Pc + "\\$_]+", "g" + ); + + this.nonTokenRe = new RegExp("^(?:[^" + + unicode.packages.L + + unicode.packages.Mn + unicode.packages.Mc + + unicode.packages.Nd + + unicode.packages.Pc + "\\$_]|\\s])+", "g" + ); + + this.getTokenizer = function() { + if (!this.$tokenizer) { + this.$highlightRules = this.$highlightRules || new this.HighlightRules(this.$highlightRuleConfig); + this.$tokenizer = new Tokenizer(this.$highlightRules.getRules()); + } + return this.$tokenizer; + }; + + this.lineCommentStart = ""; + this.blockComment = ""; + + this.toggleCommentLines = function(state, session, startRow, endRow) { + var doc = session.doc; + + var ignoreBlankLines = true; + var shouldRemove = true; + var minIndent = Infinity; + var tabSize = session.getTabSize(); + var insertAtTabStop = false; + + if (!this.lineCommentStart) { + if (!this.blockComment) + return false; + var lineCommentStart = this.blockComment.start; + var lineCommentEnd = this.blockComment.end; + var regexpStart = new RegExp("^(\\s*)(?:" + lang.escapeRegExp(lineCommentStart) + ")"); + var regexpEnd = new RegExp("(?:" + lang.escapeRegExp(lineCommentEnd) + ")\\s*$"); + + var comment = function(line, i) { + if (testRemove(line, i)) + return; + if (!ignoreBlankLines || /\S/.test(line)) { + doc.insertInLine({row: i, column: line.length}, lineCommentEnd); + doc.insertInLine({row: i, column: minIndent}, lineCommentStart); + } + }; + + var uncomment = function(line, i) { + var m; + if (m = line.match(regexpEnd)) + doc.removeInLine(i, line.length - m[0].length, line.length); + if (m = line.match(regexpStart)) + doc.removeInLine(i, m[1].length, m[0].length); + }; + + var testRemove = function(line, row) { + if (regexpStart.test(line)) + return true; + var tokens = session.getTokens(row); + for (var i = 0; i < tokens.length; i++) { + if (tokens[i].type === "comment") + return true; + } + }; + } else { + if (Array.isArray(this.lineCommentStart)) { + var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join("|"); + var lineCommentStart = this.lineCommentStart[0]; + } else { + var regexpStart = lang.escapeRegExp(this.lineCommentStart); + var lineCommentStart = this.lineCommentStart; + } + regexpStart = new RegExp("^(\\s*)(?:" + regexpStart + ") ?"); + + insertAtTabStop = session.getUseSoftTabs(); + + var uncomment = function(line, i) { + var m = line.match(regexpStart); + if (!m) return; + var start = m[1].length, end = m[0].length; + if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == " ") + end--; + doc.removeInLine(i, start, end); + }; + var commentWithSpace = lineCommentStart + " "; + var comment = function(line, i) { + if (!ignoreBlankLines || /\S/.test(line)) { + if (shouldInsertSpace(line, minIndent, minIndent)) + doc.insertInLine({row: i, column: minIndent}, commentWithSpace); + else + doc.insertInLine({row: i, column: minIndent}, lineCommentStart); + } + }; + var testRemove = function(line, i) { + return regexpStart.test(line); + }; + + var shouldInsertSpace = function(line, before, after) { + var spaces = 0; + while (before-- && line.charAt(before) == " ") + spaces++; + if (spaces % tabSize != 0) + return false; + var spaces = 0; + while (line.charAt(after++) == " ") + spaces++; + if (tabSize > 2) + return spaces % tabSize != tabSize - 1; + else + return spaces % tabSize == 0; + return true; + }; + } + + function iter(fun) { + for (var i = startRow; i <= endRow; i++) + fun(doc.getLine(i), i); + } + + + var minEmptyLength = Infinity; + iter(function(line, i) { + var indent = line.search(/\S/); + if (indent !== -1) { + if (indent < minIndent) + minIndent = indent; + if (shouldRemove && !testRemove(line, i)) + shouldRemove = false; + } else if (minEmptyLength > line.length) { + minEmptyLength = line.length; + } + }); + + if (minIndent == Infinity) { + minIndent = minEmptyLength; + ignoreBlankLines = false; + shouldRemove = false; + } + + if (insertAtTabStop && minIndent % tabSize != 0) + minIndent = Math.floor(minIndent / tabSize) * tabSize; + + iter(shouldRemove ? uncomment : comment); + }; + + this.toggleBlockComment = function(state, session, range, cursor) { + var comment = this.blockComment; + if (!comment) + return; + if (!comment.start && comment[0]) + comment = comment[0]; + + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + + var sel = session.selection; + var initialRange = session.selection.toOrientedRange(); + var startRow, colDiff; + + if (token && /comment/.test(token.type)) { + var startRange, endRange; + while (token && /comment/.test(token.type)) { + var i = token.value.indexOf(comment.start); + if (i != -1) { + var row = iterator.getCurrentTokenRow(); + var column = iterator.getCurrentTokenColumn() + i; + startRange = new Range(row, column, row, column + comment.start.length); + break; + } + token = iterator.stepBackward(); + } + + var iterator = new TokenIterator(session, cursor.row, cursor.column); + var token = iterator.getCurrentToken(); + while (token && /comment/.test(token.type)) { + var i = token.value.indexOf(comment.end); + if (i != -1) { + var row = iterator.getCurrentTokenRow(); + var column = iterator.getCurrentTokenColumn() + i; + endRange = new Range(row, column, row, column + comment.end.length); + break; + } + token = iterator.stepForward(); + } + if (endRange) + session.remove(endRange); + if (startRange) { + session.remove(startRange); + startRow = startRange.start.row; + colDiff = -comment.start.length; + } + } else { + colDiff = comment.start.length; + startRow = range.start.row; + session.insert(range.end, comment.end); + session.insert(range.start, comment.start); + } + if (initialRange.start.row == startRow) + initialRange.start.column += colDiff; + if (initialRange.end.row == startRow) + initialRange.end.column += colDiff; + session.selection.fromOrientedRange(initialRange); + }; + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + + this.autoOutdent = function(state, doc, row) { + }; + + this.$getIndent = function(line) { + return line.match(/^\s*/)[0]; + }; + + this.createWorker = function(session) { + return null; + }; + + this.createModeDelegates = function (mapping) { + this.$embeds = []; + this.$modes = {}; + for (var i in mapping) { + if (mapping[i]) { + this.$embeds.push(i); + this.$modes[i] = new mapping[i](); + } + } + + var delegations = ["toggleBlockComment", "toggleCommentLines", "getNextLineIndent", + "checkOutdent", "autoOutdent", "transformAction", "getCompletions"]; + + for (var i = 0; i < delegations.length; i++) { + (function(scope) { + var functionName = delegations[i]; + var defaultHandler = scope[functionName]; + scope[delegations[i]] = function() { + return this.$delegator(functionName, arguments, defaultHandler); + }; + }(this)); + } + }; + + this.$delegator = function(method, args, defaultHandler) { + var state = args[0]; + if (typeof state != "string") + state = state[0]; + for (var i = 0; i < this.$embeds.length; i++) { + if (!this.$modes[this.$embeds[i]]) continue; + + var split = state.split(this.$embeds[i]); + if (!split[0] && split[1]) { + args[0] = split[1]; + var mode = this.$modes[this.$embeds[i]]; + return mode[method].apply(mode, args); + } + } + var ret = defaultHandler.apply(this, args); + return defaultHandler ? ret : undefined; + }; + + this.transformAction = function(state, action, editor, session, param) { + if (this.$behaviour) { + var behaviours = this.$behaviour.getBehaviours(); + for (var key in behaviours) { + if (behaviours[key][action]) { + var ret = behaviours[key][action].apply(this, arguments); + if (ret) { + return ret; + } + } + } + } + }; + + this.getKeywords = function(append) { + if (!this.completionKeywords) { + var rules = this.$tokenizer.rules; + var completionKeywords = []; + for (var rule in rules) { + var ruleItr = rules[rule]; + for (var r = 0, l = ruleItr.length; r < l; r++) { + if (typeof ruleItr[r].token === "string") { + if (/keyword|support|storage/.test(ruleItr[r].token)) + completionKeywords.push(ruleItr[r].regex); + } + else if (typeof ruleItr[r].token === "object") { + for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) { + if (/keyword|support|storage/.test(ruleItr[r].token[a])) { + var rule = ruleItr[r].regex.match(/\(.+?\)/g)[a]; + completionKeywords.push(rule.substr(1, rule.length - 2)); + } + } + } + } + } + this.completionKeywords = completionKeywords; + } + if (!append) + return this.$keywordList; + return completionKeywords.concat(this.$keywordList || []); + }; + + this.$createKeywordList = function() { + if (!this.$highlightRules) + this.getTokenizer(); + return this.$keywordList = this.$highlightRules.$keywordList || []; + }; + + this.getCompletions = function(state, session, pos, prefix) { + var keywords = this.$keywordList || this.$createKeywordList(); + return keywords.map(function(word) { + return { + name: word, + value: word, + score: 0, + meta: "keyword" + }; + }); + }; + + this.$id = "ace/mode/text"; +}).call(Mode.prototype); + +exports.Mode = Mode; +}); + +define("ace/apply_delta",["require","exports","module"], function(require, exports, module) { +"use strict"; + +function throwDeltaError(delta, errorText){ + console.log("Invalid Delta:", delta); + throw "Invalid Delta: " + errorText; +} + +function positionInDocument(docLines, position) { + return position.row >= 0 && position.row < docLines.length && + position.column >= 0 && position.column <= docLines[position.row].length; +} + +function validateDelta(docLines, delta) { + if (delta.action != "insert" && delta.action != "remove") + throwDeltaError(delta, "delta.action must be 'insert' or 'remove'"); + if (!(delta.lines instanceof Array)) + throwDeltaError(delta, "delta.lines must be an Array"); + if (!delta.start || !delta.end) + throwDeltaError(delta, "delta.start/end must be an present"); + var start = delta.start; + if (!positionInDocument(docLines, delta.start)) + throwDeltaError(delta, "delta.start must be contained in document"); + var end = delta.end; + if (delta.action == "remove" && !positionInDocument(docLines, end)) + throwDeltaError(delta, "delta.end must contained in document for 'remove' actions"); + var numRangeRows = end.row - start.row; + var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0)); + if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars) + throwDeltaError(delta, "delta.range must match delta lines"); +} + +exports.applyDelta = function(docLines, delta, doNotValidate) { + + var row = delta.start.row; + var startColumn = delta.start.column; + var line = docLines[row] || ""; + switch (delta.action) { + case "insert": + var lines = delta.lines; + if (lines.length === 1) { + docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn); + } else { + var args = [row, 1].concat(delta.lines); + docLines.splice.apply(docLines, args); + docLines[row] = line.substring(0, startColumn) + docLines[row]; + docLines[row + delta.lines.length - 1] += line.substring(startColumn); + } + break; + case "remove": + var endColumn = delta.end.column; + var endRow = delta.end.row; + if (row === endRow) { + docLines[row] = line.substring(0, startColumn) + line.substring(endColumn); + } else { + docLines.splice( + row, endRow - row + 1, + line.substring(0, startColumn) + docLines[endRow].substring(endColumn) + ); + } + break; + } +} +}); + +define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; + +var Anchor = exports.Anchor = function(doc, row, column) { + this.$onChange = this.onChange.bind(this); + this.attach(doc); + + if (typeof column == "undefined") + this.setPosition(row.row, row.column); + else + this.setPosition(row, column); +}; + +(function() { + + oop.implement(this, EventEmitter); + this.getPosition = function() { + return this.$clipPositionToDocument(this.row, this.column); + }; + this.getDocument = function() { + return this.document; + }; + this.$insertRight = false; + this.onChange = function(delta) { + if (delta.start.row == delta.end.row && delta.start.row != this.row) + return; + + if (delta.start.row > this.row) + return; + + var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight); + this.setPosition(point.row, point.column, true); + }; + + function $pointsInOrder(point1, point2, equalPointsInOrder) { + var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column; + return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter); + } + + function $getTransformedPoint(delta, point, moveIfEqual) { + var deltaIsInsert = delta.action == "insert"; + var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row); + var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column); + var deltaStart = delta.start; + var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range. + if ($pointsInOrder(point, deltaStart, moveIfEqual)) { + return { + row: point.row, + column: point.column + }; + } + if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) { + return { + row: point.row + deltaRowShift, + column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0) + }; + } + + return { + row: deltaStart.row, + column: deltaStart.column + }; + } + this.setPosition = function(row, column, noClip) { + var pos; + if (noClip) { + pos = { + row: row, + column: column + }; + } else { + pos = this.$clipPositionToDocument(row, column); + } + + if (this.row == pos.row && this.column == pos.column) + return; + + var old = { + row: this.row, + column: this.column + }; + + this.row = pos.row; + this.column = pos.column; + this._signal("change", { + old: old, + value: pos + }); + }; + this.detach = function() { + this.document.removeEventListener("change", this.$onChange); + }; + this.attach = function(doc) { + this.document = doc || this.document; + this.document.on("change", this.$onChange); + }; + this.$clipPositionToDocument = function(row, column) { + var pos = {}; + + if (row >= this.document.getLength()) { + pos.row = Math.max(0, this.document.getLength() - 1); + pos.column = this.document.getLine(pos.row).length; + } + else if (row < 0) { + pos.row = 0; + pos.column = 0; + } + else { + pos.row = row; + pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); + } + + if (column < 0) + pos.column = 0; + + return pos; + }; + +}).call(Anchor.prototype); + +}); + +define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var applyDelta = require("./apply_delta").applyDelta; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Anchor = require("./anchor").Anchor; + +var Document = function(textOrLines) { + this.$lines = [""]; + if (textOrLines.length === 0) { + this.$lines = [""]; + } else if (Array.isArray(textOrLines)) { + this.insertMergedLines({row: 0, column: 0}, textOrLines); + } else { + this.insert({row: 0, column:0}, textOrLines); + } +}; + +(function() { + + oop.implement(this, EventEmitter); + this.setValue = function(text) { + var len = this.getLength() - 1; + this.remove(new Range(0, 0, len, this.getLine(len).length)); + this.insert({row: 0, column: 0}, text); + }; + this.getValue = function() { + return this.getAllLines().join(this.getNewLineCharacter()); + }; + this.createAnchor = function(row, column) { + return new Anchor(this, row, column); + }; + if ("aaa".split(/a/).length === 0) { + this.$split = function(text) { + return text.replace(/\r\n|\r/g, "\n").split("\n"); + }; + } else { + this.$split = function(text) { + return text.split(/\r\n|\r|\n/); + }; + } + + + this.$detectNewLine = function(text) { + var match = text.match(/^.*?(\r\n|\r|\n)/m); + this.$autoNewLine = match ? match[1] : "\n"; + this._signal("changeNewLineMode"); + }; + this.getNewLineCharacter = function() { + switch (this.$newLineMode) { + case "windows": + return "\r\n"; + case "unix": + return "\n"; + default: + return this.$autoNewLine || "\n"; + } + }; + + this.$autoNewLine = ""; + this.$newLineMode = "auto"; + this.setNewLineMode = function(newLineMode) { + if (this.$newLineMode === newLineMode) + return; + + this.$newLineMode = newLineMode; + this._signal("changeNewLineMode"); + }; + this.getNewLineMode = function() { + return this.$newLineMode; + }; + this.isNewLine = function(text) { + return (text == "\r\n" || text == "\r" || text == "\n"); + }; + this.getLine = function(row) { + return this.$lines[row] || ""; + }; + this.getLines = function(firstRow, lastRow) { + return this.$lines.slice(firstRow, lastRow + 1); + }; + this.getAllLines = function() { + return this.getLines(0, this.getLength()); + }; + this.getLength = function() { + return this.$lines.length; + }; + this.getTextRange = function(range) { + return this.getLinesForRange(range).join(this.getNewLineCharacter()); + }; + this.getLinesForRange = function(range) { + var lines; + if (range.start.row === range.end.row) { + lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)]; + } else { + lines = this.getLines(range.start.row, range.end.row); + lines[0] = (lines[0] || "").substring(range.start.column); + var l = lines.length - 1; + if (range.end.row - range.start.row == l) + lines[l] = lines[l].substring(0, range.end.column); + } + return lines; + }; + this.insertLines = function(row, lines) { + console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."); + return this.insertFullLines(row, lines); + }; + this.removeLines = function(firstRow, lastRow) { + console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."); + return this.removeFullLines(firstRow, lastRow); + }; + this.insertNewLine = function(position) { + console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."); + return this.insertMergedLines(position, ["", ""]); + }; + this.insert = function(position, text) { + if (this.getLength() <= 1) + this.$detectNewLine(text); + + return this.insertMergedLines(position, this.$split(text)); + }; + this.insertInLine = function(position, text) { + var start = this.clippedPos(position.row, position.column); + var end = this.pos(position.row, position.column + text.length); + + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: [text] + }, true); + + return this.clonePos(end); + }; + + this.clippedPos = function(row, column) { + var length = this.getLength(); + if (row === undefined) { + row = length; + } else if (row < 0) { + row = 0; + } else if (row >= length) { + row = length - 1; + column = undefined; + } + var line = this.getLine(row); + if (column == undefined) + column = line.length; + column = Math.min(Math.max(column, 0), line.length); + return {row: row, column: column}; + }; + + this.clonePos = function(pos) { + return {row: pos.row, column: pos.column}; + }; + + this.pos = function(row, column) { + return {row: row, column: column}; + }; + + this.$clipPosition = function(position) { + var length = this.getLength(); + if (position.row >= length) { + position.row = Math.max(0, length - 1); + position.column = this.getLine(length - 1).length; + } else { + position.row = Math.max(0, position.row); + position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length); + } + return position; + }; + this.insertFullLines = function(row, lines) { + row = Math.min(Math.max(row, 0), this.getLength()); + var column = 0; + if (row < this.getLength()) { + lines = lines.concat([""]); + column = 0; + } else { + lines = [""].concat(lines); + row--; + column = this.$lines[row].length; + } + this.insertMergedLines({row: row, column: column}, lines); + }; + this.insertMergedLines = function(position, lines) { + var start = this.clippedPos(position.row, position.column); + var end = { + row: start.row + lines.length - 1, + column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length + }; + + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: lines + }); + + return this.clonePos(end); + }; + this.remove = function(range) { + var start = this.clippedPos(range.start.row, range.start.column); + var end = this.clippedPos(range.end.row, range.end.column); + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({start: start, end: end}) + }); + return this.clonePos(start); + }; + this.removeInLine = function(row, startColumn, endColumn) { + var start = this.clippedPos(row, startColumn); + var end = this.clippedPos(row, endColumn); + + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({start: start, end: end}) + }, true); + + return this.clonePos(start); + }; + this.removeFullLines = function(firstRow, lastRow) { + firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1); + lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1); + var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0; + var deleteLastNewLine = lastRow < this.getLength() - 1; + var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow ); + var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 ); + var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow ); + var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); + var range = new Range(startRow, startCol, endRow, endCol); + var deletedLines = this.$lines.slice(firstRow, lastRow + 1); + + this.applyDelta({ + start: range.start, + end: range.end, + action: "remove", + lines: this.getLinesForRange(range) + }); + return deletedLines; + }; + this.removeNewLine = function(row) { + if (row < this.getLength() - 1 && row >= 0) { + this.applyDelta({ + start: this.pos(row, this.getLine(row).length), + end: this.pos(row + 1, 0), + action: "remove", + lines: ["", ""] + }); + } + }; + this.replace = function(range, text) { + if (!(range instanceof Range)) + range = Range.fromPoints(range.start, range.end); + if (text.length === 0 && range.isEmpty()) + return range.start; + if (text == this.getTextRange(range)) + return range.end; + + this.remove(range); + var end; + if (text) { + end = this.insert(range.start, text); + } + else { + end = range.start; + } + + return end; + }; + this.applyDeltas = function(deltas) { + for (var i=0; i=0; i--) { + this.revertDelta(deltas[i]); + } + }; + this.applyDelta = function(delta, doNotValidate) { + var isInsert = delta.action == "insert"; + if (isInsert ? delta.lines.length <= 1 && !delta.lines[0] + : !Range.comparePoints(delta.start, delta.end)) { + return; + } + + if (isInsert && delta.lines.length > 20000) + this.$splitAndapplyLargeDelta(delta, 20000); + applyDelta(this.$lines, delta, doNotValidate); + this._signal("change", delta); + }; + + this.$splitAndapplyLargeDelta = function(delta, MAX) { + var lines = delta.lines; + var l = lines.length; + var row = delta.start.row; + var column = delta.start.column; + var from = 0, to = 0; + do { + from = to; + to += MAX - 1; + var chunk = lines.slice(from, to); + if (to > l) { + delta.lines = chunk; + delta.start.row = row + from; + delta.start.column = column; + break; + } + chunk.push(""); + this.applyDelta({ + start: this.pos(row + from, column), + end: this.pos(row + to, column = 0), + action: delta.action, + lines: chunk + }, true); + } while(true); + }; + this.revertDelta = function(delta) { + this.applyDelta({ + start: this.clonePos(delta.start), + end: this.clonePos(delta.end), + action: (delta.action == "insert" ? "remove" : "insert"), + lines: delta.lines.slice() + }); + }; + this.indexToPosition = function(index, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + for (var i = startRow || 0, l = lines.length; i < l; i++) { + index -= lines[i].length + newlineLength; + if (index < 0) + return {row: i, column: index + lines[i].length + newlineLength}; + } + return {row: l-1, column: lines[l-1].length}; + }; + this.positionToIndex = function(pos, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + var index = 0; + var row = Math.min(pos.row, lines.length); + for (var i = startRow || 0; i < row; ++i) + index += lines[i].length + newlineLength; + + return index + pos.column; + }; + +}).call(Document.prototype); + +exports.Document = Document; +}); + +define("ace/background_tokenizer",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var EventEmitter = require("./lib/event_emitter").EventEmitter; + +var BackgroundTokenizer = function(tokenizer, editor) { + this.running = false; + this.lines = []; + this.states = []; + this.currentLine = 0; + this.tokenizer = tokenizer; + + var self = this; + + this.$worker = function() { + if (!self.running) { return; } + + var workerStart = new Date(); + var currentLine = self.currentLine; + var endLine = -1; + var doc = self.doc; + + var startLine = currentLine; + while (self.lines[currentLine]) + currentLine++; + + var len = doc.getLength(); + var processedLines = 0; + self.running = false; + while (currentLine < len) { + self.$tokenizeRow(currentLine); + endLine = currentLine; + do { + currentLine++; + } while (self.lines[currentLine]); + processedLines ++; + if ((processedLines % 5 === 0) && (new Date() - workerStart) > 20) { + self.running = setTimeout(self.$worker, 20); + break; + } + } + self.currentLine = currentLine; + + if (startLine <= endLine) + self.fireUpdateEvent(startLine, endLine); + }; +}; + +(function(){ + + oop.implement(this, EventEmitter); + this.setTokenizer = function(tokenizer) { + this.tokenizer = tokenizer; + this.lines = []; + this.states = []; + + this.start(0); + }; + this.setDocument = function(doc) { + this.doc = doc; + this.lines = []; + this.states = []; + + this.stop(); + }; + this.fireUpdateEvent = function(firstRow, lastRow) { + var data = { + first: firstRow, + last: lastRow + }; + this._signal("update", {data: data}); + }; + this.start = function(startRow) { + this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength()); + this.lines.splice(this.currentLine, this.lines.length); + this.states.splice(this.currentLine, this.states.length); + + this.stop(); + this.running = setTimeout(this.$worker, 700); + }; + + this.scheduleStart = function() { + if (!this.running) + this.running = setTimeout(this.$worker, 700); + } + + this.$updateOnChange = function(delta) { + var startRow = delta.start.row; + var len = delta.end.row - startRow; + + if (len === 0) { + this.lines[startRow] = null; + } else if (delta.action == "remove") { + this.lines.splice(startRow, len + 1, null); + this.states.splice(startRow, len + 1, null); + } else { + var args = Array(len + 1); + args.unshift(startRow, 1); + this.lines.splice.apply(this.lines, args); + this.states.splice.apply(this.states, args); + } + + this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength()); + + this.stop(); + }; + this.stop = function() { + if (this.running) + clearTimeout(this.running); + this.running = false; + }; + this.getTokens = function(row) { + return this.lines[row] || this.$tokenizeRow(row); + }; + this.getState = function(row) { + if (this.currentLine == row) + this.$tokenizeRow(row); + return this.states[row] || "start"; + }; + + this.$tokenizeRow = function(row) { + var line = this.doc.getLine(row); + var state = this.states[row - 1]; + + var data = this.tokenizer.getLineTokens(line, state, row); + + if (this.states[row] + "" !== data.state + "") { + this.states[row] = data.state; + this.lines[row + 1] = null; + if (this.currentLine > row + 1) + this.currentLine = row + 1; + } else if (this.currentLine == row) { + this.currentLine = row + 1; + } + + return this.lines[row] = data.tokens; + }; + +}).call(BackgroundTokenizer.prototype); + +exports.BackgroundTokenizer = BackgroundTokenizer; +}); + +define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"], function(require, exports, module) { +"use strict"; + +var lang = require("./lib/lang"); +var oop = require("./lib/oop"); +var Range = require("./range").Range; + +var SearchHighlight = function(regExp, clazz, type) { + this.setRegexp(regExp); + this.clazz = clazz; + this.type = type || "text"; +}; + +(function() { + this.MAX_RANGES = 500; + + this.setRegexp = function(regExp) { + if (this.regExp+"" == regExp+"") + return; + this.regExp = regExp; + this.cache = []; + }; + + this.update = function(html, markerLayer, session, config) { + if (!this.regExp) + return; + var start = config.firstRow, end = config.lastRow; + + for (var i = start; i <= end; i++) { + var ranges = this.cache[i]; + if (ranges == null) { + ranges = lang.getMatchOffsets(session.getLine(i), this.regExp); + if (ranges.length > this.MAX_RANGES) + ranges = ranges.slice(0, this.MAX_RANGES); + ranges = ranges.map(function(match) { + return new Range(i, match.offset, i, match.offset + match.length); + }); + this.cache[i] = ranges.length ? ranges : ""; + } + + for (var j = ranges.length; j --; ) { + markerLayer.drawSingleLineMarker( + html, ranges[j].toScreenRange(session), this.clazz, config); + } + } + }; + +}).call(SearchHighlight.prototype); + +exports.SearchHighlight = SearchHighlight; +}); + +define("ace/edit_session/fold_line",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; +function FoldLine(foldData, folds) { + this.foldData = foldData; + if (Array.isArray(folds)) { + this.folds = folds; + } else { + folds = this.folds = [ folds ]; + } + + var last = folds[folds.length - 1]; + this.range = new Range(folds[0].start.row, folds[0].start.column, + last.end.row, last.end.column); + this.start = this.range.start; + this.end = this.range.end; + + this.folds.forEach(function(fold) { + fold.setFoldLine(this); + }, this); +} + +(function() { + this.shiftRow = function(shift) { + this.start.row += shift; + this.end.row += shift; + this.folds.forEach(function(fold) { + fold.start.row += shift; + fold.end.row += shift; + }); + }; + + this.addFold = function(fold) { + if (fold.sameRow) { + if (fold.start.row < this.startRow || fold.endRow > this.endRow) { + throw new Error("Can't add a fold to this FoldLine as it has no connection"); + } + this.folds.push(fold); + this.folds.sort(function(a, b) { + return -a.range.compareEnd(b.start.row, b.start.column); + }); + if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) { + this.end.row = fold.end.row; + this.end.column = fold.end.column; + } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) { + this.start.row = fold.start.row; + this.start.column = fold.start.column; + } + } else if (fold.start.row == this.end.row) { + this.folds.push(fold); + this.end.row = fold.end.row; + this.end.column = fold.end.column; + } else if (fold.end.row == this.start.row) { + this.folds.unshift(fold); + this.start.row = fold.start.row; + this.start.column = fold.start.column; + } else { + throw new Error("Trying to add fold to FoldRow that doesn't have a matching row"); + } + fold.foldLine = this; + }; + + this.containsRow = function(row) { + return row >= this.start.row && row <= this.end.row; + }; + + this.walk = function(callback, endRow, endColumn) { + var lastEnd = 0, + folds = this.folds, + fold, + cmp, stop, isNewRow = true; + + if (endRow == null) { + endRow = this.end.row; + endColumn = this.end.column; + } + + for (var i = 0; i < folds.length; i++) { + fold = folds[i]; + + cmp = fold.range.compareStart(endRow, endColumn); + if (cmp == -1) { + callback(null, endRow, endColumn, lastEnd, isNewRow); + return; + } + + stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow); + stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd); + if (stop || cmp === 0) { + return; + } + isNewRow = !fold.sameRow; + lastEnd = fold.end.column; + } + callback(null, endRow, endColumn, lastEnd, isNewRow); + }; + + this.getNextFoldTo = function(row, column) { + var fold, cmp; + for (var i = 0; i < this.folds.length; i++) { + fold = this.folds[i]; + cmp = fold.range.compareEnd(row, column); + if (cmp == -1) { + return { + fold: fold, + kind: "after" + }; + } else if (cmp === 0) { + return { + fold: fold, + kind: "inside" + }; + } + } + return null; + }; + + this.addRemoveChars = function(row, column, len) { + var ret = this.getNextFoldTo(row, column), + fold, folds; + if (ret) { + fold = ret.fold; + if (ret.kind == "inside" + && fold.start.column != column + && fold.start.row != row) + { + window.console && window.console.log(row, column, fold); + } else if (fold.start.row == row) { + folds = this.folds; + var i = folds.indexOf(fold); + if (i === 0) { + this.start.column += len; + } + for (i; i < folds.length; i++) { + fold = folds[i]; + fold.start.column += len; + if (!fold.sameRow) { + return; + } + fold.end.column += len; + } + this.end.column += len; + } + } + }; + + this.split = function(row, column) { + var pos = this.getNextFoldTo(row, column); + + if (!pos || pos.kind == "inside") + return null; + + var fold = pos.fold; + var folds = this.folds; + var foldData = this.foldData; + + var i = folds.indexOf(fold); + var foldBefore = folds[i - 1]; + this.end.row = foldBefore.end.row; + this.end.column = foldBefore.end.column; + folds = folds.splice(i, folds.length - i); + + var newFoldLine = new FoldLine(foldData, folds); + foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine); + return newFoldLine; + }; + + this.merge = function(foldLineNext) { + var folds = foldLineNext.folds; + for (var i = 0; i < folds.length; i++) { + this.addFold(folds[i]); + } + var foldData = this.foldData; + foldData.splice(foldData.indexOf(foldLineNext), 1); + }; + + this.toString = function() { + var ret = [this.range.toString() + ": [" ]; + + this.folds.forEach(function(fold) { + ret.push(" " + fold.toString()); + }); + ret.push("]"); + return ret.join("\n"); + }; + + this.idxToPosition = function(idx) { + var lastFoldEndColumn = 0; + + for (var i = 0; i < this.folds.length; i++) { + var fold = this.folds[i]; + + idx -= fold.start.column - lastFoldEndColumn; + if (idx < 0) { + return { + row: fold.start.row, + column: fold.start.column + idx + }; + } + + idx -= fold.placeholder.length; + if (idx < 0) { + return fold.start; + } + + lastFoldEndColumn = fold.end.column; + } + + return { + row: this.end.row, + column: this.end.column + idx + }; + }; +}).call(FoldLine.prototype); + +exports.FoldLine = FoldLine; +}); + +define("ace/range_list",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; +var Range = require("./range").Range; +var comparePoints = Range.comparePoints; + +var RangeList = function() { + this.ranges = []; +}; + +(function() { + this.comparePoints = comparePoints; + + this.pointIndex = function(pos, excludeEdges, startIndex) { + var list = this.ranges; + + for (var i = startIndex || 0; i < list.length; i++) { + var range = list[i]; + var cmpEnd = comparePoints(pos, range.end); + if (cmpEnd > 0) + continue; + var cmpStart = comparePoints(pos, range.start); + if (cmpEnd === 0) + return excludeEdges && cmpStart !== 0 ? -i-2 : i; + if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges)) + return i; + + return -i-1; + } + return -i - 1; + }; + + this.add = function(range) { + var excludeEdges = !range.isEmpty(); + var startIndex = this.pointIndex(range.start, excludeEdges); + if (startIndex < 0) + startIndex = -startIndex - 1; + + var endIndex = this.pointIndex(range.end, excludeEdges, startIndex); + + if (endIndex < 0) + endIndex = -endIndex - 1; + else + endIndex++; + return this.ranges.splice(startIndex, endIndex - startIndex, range); + }; + + this.addList = function(list) { + var removed = []; + for (var i = list.length; i--; ) { + removed.push.apply(removed, this.add(list[i])); + } + return removed; + }; + + this.substractPoint = function(pos) { + var i = this.pointIndex(pos); + + if (i >= 0) + return this.ranges.splice(i, 1); + }; + this.merge = function() { + var removed = []; + var list = this.ranges; + + list = list.sort(function(a, b) { + return comparePoints(a.start, b.start); + }); + + var next = list[0], range; + for (var i = 1; i < list.length; i++) { + range = next; + next = list[i]; + var cmp = comparePoints(range.end, next.start); + if (cmp < 0) + continue; + + if (cmp == 0 && !range.isEmpty() && !next.isEmpty()) + continue; + + if (comparePoints(range.end, next.end) < 0) { + range.end.row = next.end.row; + range.end.column = next.end.column; + } + + list.splice(i, 1); + removed.push(next); + next = range; + i--; + } + + this.ranges = list; + + return removed; + }; + + this.contains = function(row, column) { + return this.pointIndex({row: row, column: column}) >= 0; + }; + + this.containsPoint = function(pos) { + return this.pointIndex(pos) >= 0; + }; + + this.rangeAtPoint = function(pos) { + var i = this.pointIndex(pos); + if (i >= 0) + return this.ranges[i]; + }; + + + this.clipRows = function(startRow, endRow) { + var list = this.ranges; + if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow) + return []; + + var startIndex = this.pointIndex({row: startRow, column: 0}); + if (startIndex < 0) + startIndex = -startIndex - 1; + var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex); + if (endIndex < 0) + endIndex = -endIndex - 1; + + var clipped = []; + for (var i = startIndex; i < endIndex; i++) { + clipped.push(list[i]); + } + return clipped; + }; + + this.removeAll = function() { + return this.ranges.splice(0, this.ranges.length); + }; + + this.attach = function(session) { + if (this.session) + this.detach(); + + this.session = session; + this.onChange = this.$onChange.bind(this); + + this.session.on('change', this.onChange); + }; + + this.detach = function() { + if (!this.session) + return; + this.session.removeListener('change', this.onChange); + this.session = null; + }; + + this.$onChange = function(delta) { + if (delta.action == "insert"){ + var start = delta.start; + var end = delta.end; + } else { + var end = delta.start; + var start = delta.end; + } + var startRow = start.row; + var endRow = end.row; + var lineDif = endRow - startRow; + + var colDiff = -start.column + end.column; + var ranges = this.ranges; + + for (var i = 0, n = ranges.length; i < n; i++) { + var r = ranges[i]; + if (r.end.row < startRow) + continue; + if (r.start.row > startRow) + break; + + if (r.start.row == startRow && r.start.column >= start.column ) { + if (r.start.column == start.column && this.$insertRight) { + } else { + r.start.column += colDiff; + r.start.row += lineDif; + } + } + if (r.end.row == startRow && r.end.column >= start.column) { + if (r.end.column == start.column && this.$insertRight) { + continue; + } + if (r.end.column == start.column && colDiff > 0 && i < n - 1) { + if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column) + r.end.column -= colDiff; + } + r.end.column += colDiff; + r.end.row += lineDif; + } + } + + if (lineDif != 0 && i < n) { + for (; i < n; i++) { + var r = ranges[i]; + r.start.row += lineDif; + r.end.row += lineDif; + } + } + }; + +}).call(RangeList.prototype); + +exports.RangeList = RangeList; +}); + +define("ace/edit_session/fold",["require","exports","module","ace/range","ace/range_list","ace/lib/oop"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; +var RangeList = require("../range_list").RangeList; +var oop = require("../lib/oop") +var Fold = exports.Fold = function(range, placeholder) { + this.foldLine = null; + this.placeholder = placeholder; + this.range = range; + this.start = range.start; + this.end = range.end; + + this.sameRow = range.start.row == range.end.row; + this.subFolds = this.ranges = []; +}; + +oop.inherits(Fold, RangeList); + +(function() { + + this.toString = function() { + return '"' + this.placeholder + '" ' + this.range.toString(); + }; + + this.setFoldLine = function(foldLine) { + this.foldLine = foldLine; + this.subFolds.forEach(function(fold) { + fold.setFoldLine(foldLine); + }); + }; + + this.clone = function() { + var range = this.range.clone(); + var fold = new Fold(range, this.placeholder); + this.subFolds.forEach(function(subFold) { + fold.subFolds.push(subFold.clone()); + }); + fold.collapseChildren = this.collapseChildren; + return fold; + }; + + this.addSubFold = function(fold) { + if (this.range.isEqual(fold)) + return; + + if (!this.range.containsRange(fold)) + throw new Error("A fold can't intersect already existing fold" + fold.range + this.range); + consumeRange(fold, this.start); + + var row = fold.start.row, column = fold.start.column; + for (var i = 0, cmp = -1; i < this.subFolds.length; i++) { + cmp = this.subFolds[i].range.compare(row, column); + if (cmp != 1) + break; + } + var afterStart = this.subFolds[i]; + + if (cmp == 0) + return afterStart.addSubFold(fold); + var row = fold.range.end.row, column = fold.range.end.column; + for (var j = i, cmp = -1; j < this.subFolds.length; j++) { + cmp = this.subFolds[j].range.compare(row, column); + if (cmp != 1) + break; + } + var afterEnd = this.subFolds[j]; + + if (cmp == 0) + throw new Error("A fold can't intersect already existing fold" + fold.range + this.range); + + var consumedFolds = this.subFolds.splice(i, j - i, fold); + fold.setFoldLine(this.foldLine); + + return fold; + }; + + this.restoreRange = function(range) { + return restoreRange(range, this.start); + }; + +}).call(Fold.prototype); + +function consumePoint(point, anchor) { + point.row -= anchor.row; + if (point.row == 0) + point.column -= anchor.column; +} +function consumeRange(range, anchor) { + consumePoint(range.start, anchor); + consumePoint(range.end, anchor); +} +function restorePoint(point, anchor) { + if (point.row == 0) + point.column += anchor.column; + point.row += anchor.row; +} +function restoreRange(range, anchor) { + restorePoint(range.start, anchor); + restorePoint(range.end, anchor); +} + +}); + +define("ace/edit_session/folding",["require","exports","module","ace/range","ace/edit_session/fold_line","ace/edit_session/fold","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +var Range = require("../range").Range; +var FoldLine = require("./fold_line").FoldLine; +var Fold = require("./fold").Fold; +var TokenIterator = require("../token_iterator").TokenIterator; + +function Folding() { + this.getFoldAt = function(row, column, side) { + var foldLine = this.getFoldLine(row); + if (!foldLine) + return null; + + var folds = foldLine.folds; + for (var i = 0; i < folds.length; i++) { + var fold = folds[i]; + if (fold.range.contains(row, column)) { + if (side == 1 && fold.range.isEnd(row, column)) { + continue; + } else if (side == -1 && fold.range.isStart(row, column)) { + continue; + } + return fold; + } + } + }; + this.getFoldsInRange = function(range) { + var start = range.start; + var end = range.end; + var foldLines = this.$foldData; + var foundFolds = []; + + start.column += 1; + end.column -= 1; + + for (var i = 0; i < foldLines.length; i++) { + var cmp = foldLines[i].range.compareRange(range); + if (cmp == 2) { + continue; + } + else if (cmp == -2) { + break; + } + + var folds = foldLines[i].folds; + for (var j = 0; j < folds.length; j++) { + var fold = folds[j]; + cmp = fold.range.compareRange(range); + if (cmp == -2) { + break; + } else if (cmp == 2) { + continue; + } else + if (cmp == 42) { + break; + } + foundFolds.push(fold); + } + } + start.column -= 1; + end.column += 1; + + return foundFolds; + }; + + this.getFoldsInRangeList = function(ranges) { + if (Array.isArray(ranges)) { + var folds = []; + ranges.forEach(function(range) { + folds = folds.concat(this.getFoldsInRange(range)); + }, this); + } else { + var folds = this.getFoldsInRange(ranges); + } + return folds; + }; + this.getAllFolds = function() { + var folds = []; + var foldLines = this.$foldData; + + for (var i = 0; i < foldLines.length; i++) + for (var j = 0; j < foldLines[i].folds.length; j++) + folds.push(foldLines[i].folds[j]); + + return folds; + }; + this.getFoldStringAt = function(row, column, trim, foldLine) { + foldLine = foldLine || this.getFoldLine(row); + if (!foldLine) + return null; + + var lastFold = { + end: { column: 0 } + }; + var str, fold; + for (var i = 0; i < foldLine.folds.length; i++) { + fold = foldLine.folds[i]; + var cmp = fold.range.compareEnd(row, column); + if (cmp == -1) { + str = this + .getLine(fold.start.row) + .substring(lastFold.end.column, fold.start.column); + break; + } + else if (cmp === 0) { + return null; + } + lastFold = fold; + } + if (!str) + str = this.getLine(fold.start.row).substring(lastFold.end.column); + + if (trim == -1) + return str.substring(0, column - lastFold.end.column); + else if (trim == 1) + return str.substring(column - lastFold.end.column); + else + return str; + }; + + this.getFoldLine = function(docRow, startFoldLine) { + var foldData = this.$foldData; + var i = 0; + if (startFoldLine) + i = foldData.indexOf(startFoldLine); + if (i == -1) + i = 0; + for (i; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) { + return foldLine; + } else if (foldLine.end.row > docRow) { + return null; + } + } + return null; + }; + this.getNextFoldLine = function(docRow, startFoldLine) { + var foldData = this.$foldData; + var i = 0; + if (startFoldLine) + i = foldData.indexOf(startFoldLine); + if (i == -1) + i = 0; + for (i; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (foldLine.end.row >= docRow) { + return foldLine; + } + } + return null; + }; + + this.getFoldedRowCount = function(first, last) { + var foldData = this.$foldData, rowCount = last-first+1; + for (var i = 0; i < foldData.length; i++) { + var foldLine = foldData[i], + end = foldLine.end.row, + start = foldLine.start.row; + if (end >= last) { + if (start < last) { + if (start >= first) + rowCount -= last-start; + else + rowCount = 0; // in one fold + } + break; + } else if (end >= first){ + if (start >= first) // fold inside range + rowCount -= end-start; + else + rowCount -= end-first+1; + } + } + return rowCount; + }; + + this.$addFoldLine = function(foldLine) { + this.$foldData.push(foldLine); + this.$foldData.sort(function(a, b) { + return a.start.row - b.start.row; + }); + return foldLine; + }; + this.addFold = function(placeholder, range) { + var foldData = this.$foldData; + var added = false; + var fold; + + if (placeholder instanceof Fold) + fold = placeholder; + else { + fold = new Fold(range, placeholder); + fold.collapseChildren = range.collapseChildren; + } + this.$clipRangeToDocument(fold.range); + + var startRow = fold.start.row; + var startColumn = fold.start.column; + var endRow = fold.end.row; + var endColumn = fold.end.column; + if (!(startRow < endRow || + startRow == endRow && startColumn <= endColumn - 2)) + throw new Error("The range has to be at least 2 characters width"); + + var startFold = this.getFoldAt(startRow, startColumn, 1); + var endFold = this.getFoldAt(endRow, endColumn, -1); + if (startFold && endFold == startFold) + return startFold.addSubFold(fold); + + if (startFold && !startFold.range.isStart(startRow, startColumn)) + this.removeFold(startFold); + + if (endFold && !endFold.range.isEnd(endRow, endColumn)) + this.removeFold(endFold); + var folds = this.getFoldsInRange(fold.range); + if (folds.length > 0) { + this.removeFolds(folds); + folds.forEach(function(subFold) { + fold.addSubFold(subFold); + }); + } + + for (var i = 0; i < foldData.length; i++) { + var foldLine = foldData[i]; + if (endRow == foldLine.start.row) { + foldLine.addFold(fold); + added = true; + break; + } else if (startRow == foldLine.end.row) { + foldLine.addFold(fold); + added = true; + if (!fold.sameRow) { + var foldLineNext = foldData[i + 1]; + if (foldLineNext && foldLineNext.start.row == endRow) { + foldLine.merge(foldLineNext); + break; + } + } + break; + } else if (endRow <= foldLine.start.row) { + break; + } + } + + if (!added) + foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold)); + + if (this.$useWrapMode) + this.$updateWrapData(foldLine.start.row, foldLine.start.row); + else + this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row); + this.$modified = true; + this._signal("changeFold", { data: fold, action: "add" }); + + return fold; + }; + + this.addFolds = function(folds) { + folds.forEach(function(fold) { + this.addFold(fold); + }, this); + }; + + this.removeFold = function(fold) { + var foldLine = fold.foldLine; + var startRow = foldLine.start.row; + var endRow = foldLine.end.row; + + var foldLines = this.$foldData; + var folds = foldLine.folds; + if (folds.length == 1) { + foldLines.splice(foldLines.indexOf(foldLine), 1); + } else + if (foldLine.range.isEnd(fold.end.row, fold.end.column)) { + folds.pop(); + foldLine.end.row = folds[folds.length - 1].end.row; + foldLine.end.column = folds[folds.length - 1].end.column; + } else + if (foldLine.range.isStart(fold.start.row, fold.start.column)) { + folds.shift(); + foldLine.start.row = folds[0].start.row; + foldLine.start.column = folds[0].start.column; + } else + if (fold.sameRow) { + folds.splice(folds.indexOf(fold), 1); + } else + { + var newFoldLine = foldLine.split(fold.start.row, fold.start.column); + folds = newFoldLine.folds; + folds.shift(); + newFoldLine.start.row = folds[0].start.row; + newFoldLine.start.column = folds[0].start.column; + } + + if (!this.$updating) { + if (this.$useWrapMode) + this.$updateWrapData(startRow, endRow); + else + this.$updateRowLengthCache(startRow, endRow); + } + this.$modified = true; + this._signal("changeFold", { data: fold, action: "remove" }); + }; + + this.removeFolds = function(folds) { + var cloneFolds = []; + for (var i = 0; i < folds.length; i++) { + cloneFolds.push(folds[i]); + } + + cloneFolds.forEach(function(fold) { + this.removeFold(fold); + }, this); + this.$modified = true; + }; + + this.expandFold = function(fold) { + this.removeFold(fold); + fold.subFolds.forEach(function(subFold) { + fold.restoreRange(subFold); + this.addFold(subFold); + }, this); + if (fold.collapseChildren > 0) { + this.foldAll(fold.start.row+1, fold.end.row, fold.collapseChildren-1); + } + fold.subFolds = []; + }; + + this.expandFolds = function(folds) { + folds.forEach(function(fold) { + this.expandFold(fold); + }, this); + }; + + this.unfold = function(location, expandInner) { + var range, folds; + if (location == null) { + range = new Range(0, 0, this.getLength(), 0); + expandInner = true; + } else if (typeof location == "number") + range = new Range(location, 0, location, this.getLine(location).length); + else if ("row" in location) + range = Range.fromPoints(location, location); + else + range = location; + + folds = this.getFoldsInRangeList(range); + if (expandInner) { + this.removeFolds(folds); + } else { + var subFolds = folds; + while (subFolds.length) { + this.expandFolds(subFolds); + subFolds = this.getFoldsInRangeList(range); + } + } + if (folds.length) + return folds; + }; + this.isRowFolded = function(docRow, startFoldRow) { + return !!this.getFoldLine(docRow, startFoldRow); + }; + + this.getRowFoldEnd = function(docRow, startFoldRow) { + var foldLine = this.getFoldLine(docRow, startFoldRow); + return foldLine ? foldLine.end.row : docRow; + }; + + this.getRowFoldStart = function(docRow, startFoldRow) { + var foldLine = this.getFoldLine(docRow, startFoldRow); + return foldLine ? foldLine.start.row : docRow; + }; + + this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) { + if (startRow == null) + startRow = foldLine.start.row; + if (startColumn == null) + startColumn = 0; + if (endRow == null) + endRow = foldLine.end.row; + if (endColumn == null) + endColumn = this.getLine(endRow).length; + var doc = this.doc; + var textLine = ""; + + foldLine.walk(function(placeholder, row, column, lastColumn) { + if (row < startRow) + return; + if (row == startRow) { + if (column < startColumn) + return; + lastColumn = Math.max(startColumn, lastColumn); + } + + if (placeholder != null) { + textLine += placeholder; + } else { + textLine += doc.getLine(row).substring(lastColumn, column); + } + }, endRow, endColumn); + return textLine; + }; + + this.getDisplayLine = function(row, endColumn, startRow, startColumn) { + var foldLine = this.getFoldLine(row); + + if (!foldLine) { + var line; + line = this.doc.getLine(row); + return line.substring(startColumn || 0, endColumn || line.length); + } else { + return this.getFoldDisplayLine( + foldLine, row, endColumn, startRow, startColumn); + } + }; + + this.$cloneFoldData = function() { + var fd = []; + fd = this.$foldData.map(function(foldLine) { + var folds = foldLine.folds.map(function(fold) { + return fold.clone(); + }); + return new FoldLine(fd, folds); + }); + + return fd; + }; + + this.toggleFold = function(tryToUnfold) { + var selection = this.selection; + var range = selection.getRange(); + var fold; + var bracketPos; + + if (range.isEmpty()) { + var cursor = range.start; + fold = this.getFoldAt(cursor.row, cursor.column); + + if (fold) { + this.expandFold(fold); + return; + } else if (bracketPos = this.findMatchingBracket(cursor)) { + if (range.comparePoint(bracketPos) == 1) { + range.end = bracketPos; + } else { + range.start = bracketPos; + range.start.column++; + range.end.column--; + } + } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) { + if (range.comparePoint(bracketPos) == 1) + range.end = bracketPos; + else + range.start = bracketPos; + + range.start.column++; + } else { + range = this.getCommentFoldRange(cursor.row, cursor.column) || range; + } + } else { + var folds = this.getFoldsInRange(range); + if (tryToUnfold && folds.length) { + this.expandFolds(folds); + return; + } else if (folds.length == 1 ) { + fold = folds[0]; + } + } + + if (!fold) + fold = this.getFoldAt(range.start.row, range.start.column); + + if (fold && fold.range.toString() == range.toString()) { + this.expandFold(fold); + return; + } + + var placeholder = "..."; + if (!range.isMultiLine()) { + placeholder = this.getTextRange(range); + if (placeholder.length < 4) + return; + placeholder = placeholder.trim().substring(0, 2) + ".."; + } + + this.addFold(placeholder, range); + }; + + this.getCommentFoldRange = function(row, column, dir) { + var iterator = new TokenIterator(this, row, column); + var token = iterator.getCurrentToken(); + if (token && /^comment|string/.test(token.type)) { + var range = new Range(); + var re = new RegExp(token.type.replace(/\..*/, "\\.")); + if (dir != 1) { + do { + token = iterator.stepBackward(); + } while (token && re.test(token.type)); + iterator.stepForward(); + } + + range.start.row = iterator.getCurrentTokenRow(); + range.start.column = iterator.getCurrentTokenColumn() + 2; + + iterator = new TokenIterator(this, row, column); + + if (dir != -1) { + do { + token = iterator.stepForward(); + } while (token && re.test(token.type)); + token = iterator.stepBackward(); + } else + token = iterator.getCurrentToken(); + + range.end.row = iterator.getCurrentTokenRow(); + range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 2; + return range; + } + }; + + this.foldAll = function(startRow, endRow, depth) { + if (depth == undefined) + depth = 100000; // JSON.stringify doesn't hanle Infinity + var foldWidgets = this.foldWidgets; + if (!foldWidgets) + return; // mode doesn't support folding + endRow = endRow || this.getLength(); + startRow = startRow || 0; + for (var row = startRow; row < endRow; row++) { + if (foldWidgets[row] == null) + foldWidgets[row] = this.getFoldWidget(row); + if (foldWidgets[row] != "start") + continue; + + var range = this.getFoldWidgetRange(row); + if (range && range.isMultiLine() + && range.end.row <= endRow + && range.start.row >= startRow + ) { + row = range.end.row; + try { + var fold = this.addFold("...", range); + if (fold) + fold.collapseChildren = depth; + } catch(e) {} + } + } + }; + this.$foldStyles = { + "manual": 1, + "markbegin": 1, + "markbeginend": 1 + }; + this.$foldStyle = "markbegin"; + this.setFoldStyle = function(style) { + if (!this.$foldStyles[style]) + throw new Error("invalid fold style: " + style + "[" + Object.keys(this.$foldStyles).join(", ") + "]"); + + if (this.$foldStyle == style) + return; + + this.$foldStyle = style; + + if (style == "manual") + this.unfold(); + var mode = this.$foldMode; + this.$setFolding(null); + this.$setFolding(mode); + }; + + this.$setFolding = function(foldMode) { + if (this.$foldMode == foldMode) + return; + + this.$foldMode = foldMode; + + this.off('change', this.$updateFoldWidgets); + this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); + this._signal("changeAnnotation"); + + if (!foldMode || this.$foldStyle == "manual") { + this.foldWidgets = null; + return; + } + + this.foldWidgets = []; + this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle); + this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle); + + this.$updateFoldWidgets = this.updateFoldWidgets.bind(this); + this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this); + this.on('change', this.$updateFoldWidgets); + this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets); + }; + + this.getParentFoldRangeData = function (row, ignoreCurrent) { + var fw = this.foldWidgets; + if (!fw || (ignoreCurrent && fw[row])) + return {}; + + var i = row - 1, firstRange; + while (i >= 0) { + var c = fw[i]; + if (c == null) + c = fw[i] = this.getFoldWidget(i); + + if (c == "start") { + var range = this.getFoldWidgetRange(i); + if (!firstRange) + firstRange = range; + if (range && range.end.row >= row) + break; + } + i--; + } + + return { + range: i !== -1 && range, + firstRange: firstRange + }; + }; + + this.onFoldWidgetClick = function(row, e) { + e = e.domEvent; + var options = { + children: e.shiftKey, + all: e.ctrlKey || e.metaKey, + siblings: e.altKey + }; + + var range = this.$toggleFoldWidget(row, options); + if (!range) { + var el = (e.target || e.srcElement); + if (el && /ace_fold-widget/.test(el.className)) + el.className += " ace_invalid"; + } + }; + + this.$toggleFoldWidget = function(row, options) { + if (!this.getFoldWidget) + return; + var type = this.getFoldWidget(row); + var line = this.getLine(row); + + var dir = type === "end" ? -1 : 1; + var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir); + + if (fold) { + if (options.children || options.all) + this.removeFold(fold); + else + this.expandFold(fold); + return fold; + } + + var range = this.getFoldWidgetRange(row, true); + if (range && !range.isMultiLine()) { + fold = this.getFoldAt(range.start.row, range.start.column, 1); + if (fold && range.isEqual(fold.range)) { + this.removeFold(fold); + return fold; + } + } + + if (options.siblings) { + var data = this.getParentFoldRangeData(row); + if (data.range) { + var startRow = data.range.start.row + 1; + var endRow = data.range.end.row; + } + this.foldAll(startRow, endRow, options.all ? 10000 : 0); + } else if (options.children) { + endRow = range ? range.end.row : this.getLength(); + this.foldAll(row + 1, endRow, options.all ? 10000 : 0); + } else if (range) { + if (options.all) + range.collapseChildren = 10000; + this.addFold("...", range); + } + + return range; + }; + + + + this.toggleFoldWidget = function(toggleParent) { + var row = this.selection.getCursor().row; + row = this.getRowFoldStart(row); + var range = this.$toggleFoldWidget(row, {}); + + if (range) + return; + var data = this.getParentFoldRangeData(row, true); + range = data.range || data.firstRange; + + if (range) { + row = range.start.row; + var fold = this.getFoldAt(row, this.getLine(row).length, 1); + + if (fold) { + this.removeFold(fold); + } else { + this.addFold("...", range); + } + } + }; + + this.updateFoldWidgets = function(delta) { + var firstRow = delta.start.row; + var len = delta.end.row - firstRow; + + if (len === 0) { + this.foldWidgets[firstRow] = null; + } else if (delta.action == 'remove') { + this.foldWidgets.splice(firstRow, len + 1, null); + } else { + var args = Array(len + 1); + args.unshift(firstRow, 1); + this.foldWidgets.splice.apply(this.foldWidgets, args); + } + }; + this.tokenizerUpdateFoldWidgets = function(e) { + var rows = e.data; + if (rows.first != rows.last) { + if (this.foldWidgets.length > rows.first) + this.foldWidgets.splice(rows.first, this.foldWidgets.length); + } + }; +} + +exports.Folding = Folding; + +}); + +define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"], function(require, exports, module) { +"use strict"; + +var TokenIterator = require("../token_iterator").TokenIterator; +var Range = require("../range").Range; + + +function BracketMatch() { + + this.findMatchingBracket = function(position, chr) { + if (position.column == 0) return null; + + var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1); + if (charBeforeCursor == "") return null; + + var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/); + if (!match) + return null; + + if (match[1]) + return this.$findClosingBracket(match[1], position); + else + return this.$findOpeningBracket(match[2], position); + }; + + this.getBracketRange = function(pos) { + var line = this.getLine(pos.row); + var before = true, range; + + var chr = line.charAt(pos.column-1); + var match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); + if (!match) { + chr = line.charAt(pos.column); + pos = {row: pos.row, column: pos.column + 1}; + match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); + before = false; + } + if (!match) + return null; + + if (match[1]) { + var bracketPos = this.$findClosingBracket(match[1], pos); + if (!bracketPos) + return null; + range = Range.fromPoints(pos, bracketPos); + if (!before) { + range.end.column++; + range.start.column--; + } + range.cursor = range.end; + } else { + var bracketPos = this.$findOpeningBracket(match[2], pos); + if (!bracketPos) + return null; + range = Range.fromPoints(bracketPos, pos); + if (!before) { + range.start.column++; + range.end.column--; + } + range.cursor = range.start; + } + + return range; + }; + + this.$brackets = { + ")": "(", + "(": ")", + "]": "[", + "[": "]", + "{": "}", + "}": "{" + }; + + this.$findOpeningBracket = function(bracket, position, typeRe) { + var openBracket = this.$brackets[bracket]; + var depth = 1; + + var iterator = new TokenIterator(this, position.row, position.column); + var token = iterator.getCurrentToken(); + if (!token) + token = iterator.stepForward(); + if (!token) + return; + + if (!typeRe){ + typeRe = new RegExp( + "(\\.?" + + token.type.replace(".", "\\.").replace("rparen", ".paren") + .replace(/\b(?:end)\b/, "(?:start|begin|end)") + + ")+" + ); + } + var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2; + var value = token.value; + + while (true) { + + while (valueIndex >= 0) { + var chr = value.charAt(valueIndex); + if (chr == openBracket) { + depth -= 1; + if (depth == 0) { + return {row: iterator.getCurrentTokenRow(), + column: valueIndex + iterator.getCurrentTokenColumn()}; + } + } + else if (chr == bracket) { + depth += 1; + } + valueIndex -= 1; + } + do { + token = iterator.stepBackward(); + } while (token && !typeRe.test(token.type)); + + if (token == null) + break; + + value = token.value; + valueIndex = value.length - 1; + } + + return null; + }; + + this.$findClosingBracket = function(bracket, position, typeRe) { + var closingBracket = this.$brackets[bracket]; + var depth = 1; + + var iterator = new TokenIterator(this, position.row, position.column); + var token = iterator.getCurrentToken(); + if (!token) + token = iterator.stepForward(); + if (!token) + return; + + if (!typeRe){ + typeRe = new RegExp( + "(\\.?" + + token.type.replace(".", "\\.").replace("lparen", ".paren") + .replace(/\b(?:start|begin)\b/, "(?:start|begin|end)") + + ")+" + ); + } + var valueIndex = position.column - iterator.getCurrentTokenColumn(); + + while (true) { + + var value = token.value; + var valueLength = value.length; + while (valueIndex < valueLength) { + var chr = value.charAt(valueIndex); + if (chr == closingBracket) { + depth -= 1; + if (depth == 0) { + return {row: iterator.getCurrentTokenRow(), + column: valueIndex + iterator.getCurrentTokenColumn()}; + } + } + else if (chr == bracket) { + depth += 1; + } + valueIndex += 1; + } + do { + token = iterator.stepForward(); + } while (token && !typeRe.test(token.type)); + + if (token == null) + break; + + valueIndex = 0; + } + + return null; + }; +} +exports.BracketMatch = BracketMatch; + +}); + +define("ace/edit_session",["require","exports","module","ace/lib/oop","ace/lib/lang","ace/config","ace/lib/event_emitter","ace/selection","ace/mode/text","ace/range","ace/document","ace/background_tokenizer","ace/search_highlight","ace/edit_session/folding","ace/edit_session/bracket_match"], function(require, exports, module) { +"use strict"; var oop = require("./lib/oop"); var lang = require("./lib/lang"); @@ -5628,9 +8599,10 @@ var EditSession = function(text, mode) { this.$undoSelect = true; this.$foldData = []; + this.id = "session" + (++EditSession.$uid); this.$foldData.toString = function() { return this.join("\n"); - } + }; this.on("changeFold", this.onChangeFold.bind(this)); this.$onChange = this.onChange.bind(this); @@ -5711,13 +8683,12 @@ var EditSession = function(text, mode) { this.$resetRowCache(fold.start.row); }; - this.onChange = function(e) { - var delta = e.data; + this.onChange = function(delta) { this.$modified = true; - this.$resetRowCache(delta.range.start.row); + this.$resetRowCache(delta.start.row); - var removedFolds = this.$updateInternalDataOnChange(e); + var removedFolds = this.$updateInternalDataOnChange(delta); if (!this.$fromUndo && this.$undoManager && !delta.ignore) { this.$deltasDoc.push(delta); if (removedFolds && removedFolds.length != 0) { @@ -5730,8 +8701,8 @@ var EditSession = function(text, mode) { this.$informUndoManager.schedule(); } - this.bgTokenizer.$updateOnChange(delta); - this._signal("change", e); + this.bgTokenizer && this.bgTokenizer.$updateOnChange(delta); + this._signal("change", delta); }; this.setValue = function(text) { this.doc.setValue(text); @@ -6075,17 +9046,17 @@ var EditSession = function(text, mode) { config.loadModule(["mode", path], function(m) { if (this.$modeId !== path) return cb && cb(); - if (this.$modes[path] && !options) - return this.$onChangeMode(this.$modes[path]); - if (m && m.Mode) { + if (this.$modes[path] && !options) { + this.$onChangeMode(this.$modes[path]); + } else if (m && m.Mode) { m = new m.Mode(options); if (!options) { this.$modes[path] = m; m.$id = path; } this.$onChangeMode(m); - cb && cb(); } + cb && cb(); }.bind(this)); if (!this.$mode) this.$onChangeMode(this.$modes["ace/mode/text"], true); @@ -6128,6 +9099,8 @@ var EditSession = function(text, mode) { if (!$isPlaceholder) { + if (mode.attachToSession) + mode.attachToSession(this); this.$options.wrapMethod.set.call(this, this.$wrapMethod); this.$setFolding(mode.foldingRules); this.bgTokenizer.start(0); @@ -6135,26 +9108,20 @@ var EditSession = function(text, mode) { } }; - this.$stopWorker = function() { - if (this.$worker) + if (this.$worker) { this.$worker.terminate(); - - this.$worker = null; + this.$worker = null; + } }; this.$startWorker = function() { - if (typeof Worker !== "undefined" && !require.noWorker) { - try { - this.$worker = this.$mode.createWorker(this); - } catch (e) { - console.log("Could not load worker"); - console.log(e); - this.$worker = null; - } - } - else + try { + this.$worker = this.$mode.createWorker(this); + } catch (e) { + config.warn("Could not load worker", e); this.$worker = null; + } }; this.getMode = function() { return this.$mode; @@ -6251,6 +9218,9 @@ var EditSession = function(text, mode) { this.remove = function(range) { return this.doc.remove(range); }; + this.removeFullLines = function(firstRow, lastRow){ + return this.doc.removeFullLines(firstRow, lastRow); + }; this.undoChanges = function(deltas, dontSelect) { if (!deltas.length) return; @@ -6303,39 +9273,36 @@ var EditSession = function(text, mode) { this.$getUndoSelection = function(deltas, isUndo, lastUndoRange) { function isInsert(delta) { - var insert = - delta.action === "insertText" || delta.action === "insertLines"; - return isUndo ? !insert : insert; + return isUndo ? delta.action !== "insert" : delta.action === "insert"; } var delta = deltas[0]; var range, point; var lastDeltaIsInsert = false; if (isInsert(delta)) { - range = Range.fromPoints(delta.range.start, delta.range.end); + range = Range.fromPoints(delta.start, delta.end); lastDeltaIsInsert = true; } else { - range = Range.fromPoints(delta.range.start, delta.range.start); + range = Range.fromPoints(delta.start, delta.start); lastDeltaIsInsert = false; } for (var i = 1; i < deltas.length; i++) { delta = deltas[i]; if (isInsert(delta)) { - point = delta.range.start; + point = delta.start; if (range.compare(point.row, point.column) == -1) { - range.setStart(delta.range.start); + range.setStart(point); } - point = delta.range.end; + point = delta.end; if (range.compare(point.row, point.column) == 1) { - range.setEnd(delta.range.end); + range.setEnd(point); } lastDeltaIsInsert = true; } else { - point = delta.range.start; + point = delta.start; if (range.compare(point.row, point.column) == -1) { - range = - Range.fromPoints(delta.range.start, delta.range.start); + range = Range.fromPoints(delta.start, delta.start); } lastDeltaIsInsert = false; } @@ -6403,7 +9370,7 @@ var EditSession = function(text, mode) { this.indentRows = function(startRow, endRow, indentString) { indentString = indentString.replace(/\t/g, this.getTabString()); for (var row=startRow; row<=endRow; row++) - this.insert({row: row, column:0}, indentString); + this.doc.insertInLine({row: row, column: 0}, indentString); }; this.outdentRows = function (range) { var rowRange = range.collapseRows(); @@ -6453,11 +9420,11 @@ var EditSession = function(text, mode) { x.end.row += diff; return x; }); - + var lines = dir == 0 ? this.doc.getLines(firstRow, lastRow) - : this.doc.removeLines(firstRow, lastRow); - this.doc.insertLines(firstRow+diff, lines); + : this.doc.removeFullLines(firstRow, lastRow); + this.doc.insertFullLines(firstRow+diff, lines); folds.length && this.addFolds(folds); return diff; }; @@ -6553,16 +9520,14 @@ var EditSession = function(text, mode) { }; this.setWrapLimitRange = function(min, max) { if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) { - this.$wrapLimitRange = { - min: min, - max: max - }; + this.$wrapLimitRange = { min: min, max: max }; this.$modified = true; - this._signal("changeWrapMode"); + if (this.$useWrapMode) + this._signal("changeWrapMode"); } }; this.adjustWrapLimit = function(desiredLimit, $printMargin) { - var limits = this.$wrapLimitRange + var limits = this.$wrapLimitRange; if (limits.max < 0) limits = {min: $printMargin, max: $printMargin}; var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max); @@ -6601,34 +9566,23 @@ var EditSession = function(text, mode) { }; }; - this.$updateInternalDataOnChange = function(e) { + this.$updateInternalDataOnChange = function(delta) { var useWrapMode = this.$useWrapMode; - var len; - var action = e.data.action; - var firstRow = e.data.range.start.row; - var lastRow = e.data.range.end.row; - var start = e.data.range.start; - var end = e.data.range.end; + var action = delta.action; + var start = delta.start; + var end = delta.end; + var firstRow = start.row; + var lastRow = end.row; + var len = lastRow - firstRow; var removedFolds = null; - - if (action.indexOf("Lines") != -1) { - if (action == "insertLines") { - lastRow = firstRow + (e.data.lines.length); - } else { - lastRow = firstRow; - } - len = e.data.lines ? e.data.lines.length : lastRow - firstRow; - } else { - len = lastRow - firstRow; - } - + this.$updating = true; if (len != 0) { - if (action.indexOf("remove") != -1) { + if (action === "remove") { this[useWrapMode ? "$wrapData" : "$rowLengthCache"].splice(firstRow, len); var foldLines = this.$foldData; - removedFolds = this.getFoldsInRange(e.data.range); + removedFolds = this.getFoldsInRange(delta); this.removeFolds(removedFolds); var foldLine = this.getFoldLine(end.row); @@ -6662,12 +9616,13 @@ var EditSession = function(text, mode) { var foldLine = this.getFoldLine(firstRow); var idx = 0; if (foldLine) { - var cmp = foldLine.range.compareInside(start.row, start.column) + var cmp = foldLine.range.compareInside(start.row, start.column); if (cmp == 0) { foldLine = foldLine.split(start.row, start.column); - foldLine.shiftRow(len); - foldLine.addRemoveChars( - lastRow, 0, end.column - start.column); + if (foldLine) { + foldLine.shiftRow(len); + foldLine.addRemoveChars(lastRow, 0, end.column - start.column); + } } else if (cmp == -1) { foldLine.addRemoveChars(firstRow, 0, end.column - start.column); @@ -6684,9 +9639,9 @@ var EditSession = function(text, mode) { } } } else { - len = Math.abs(e.data.range.start.column - e.data.range.end.column); - if (action.indexOf("remove") != -1) { - removedFolds = this.getFoldsInRange(e.data.range); + len = Math.abs(delta.start.column - delta.end.column); + if (action === "remove") { + removedFolds = this.getFoldsInRange(delta); this.removeFolds(removedFolds); len = -len; @@ -6768,7 +9723,7 @@ var EditSession = function(text, mode) { TAB_SPACE = 12; - this.$computeWrapSplits = function(tokens, wrapLimit) { + this.$computeWrapSplits = function(tokens, wrapLimit, tabSize) { if (tokens.length == 0) { return []; } @@ -6779,24 +9734,53 @@ var EditSession = function(text, mode) { var isCode = this.$wrapAsCode; + var indentedSoftWrap = this.$indentedSoftWrap; + var maxIndent = wrapLimit <= Math.max(2 * tabSize, 8) + || indentedSoftWrap === false ? 0 : Math.floor(wrapLimit / 2); + + function getWrapIndent() { + var indentation = 0; + if (maxIndent === 0) + return indentation; + if (indentedSoftWrap) { + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + if (token == SPACE) + indentation += 1; + else if (token == TAB) + indentation += tabSize; + else if (token == TAB_SPACE) + continue; + else + break; + } + } + if (isCode && indentedSoftWrap !== false) + indentation += tabSize; + return Math.min(indentation, maxIndent); + } function addSplit(screenPos) { var displayed = tokens.slice(lastSplit, screenPos); var len = displayed.length; - displayed.join(""). - replace(/12/g, function() { + displayed.join("") + .replace(/12/g, function() { len -= 1; - }). - replace(/2/g, function() { + }) + .replace(/2/g, function() { len -= 1; }); + if (!splits.length) { + indent = getWrapIndent(); + splits.indent = indent; + } lastDocSplit += len; splits.push(lastDocSplit); lastSplit = screenPos; } - - while (displayLength - lastSplit > wrapLimit) { - var split = lastSplit + wrapLimit; + var indent = 0; + while (displayLength - lastSplit > wrapLimit - indent) { + var split = lastSplit + wrapLimit - indent; if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) { addSplit(split); continue; @@ -6823,7 +9807,7 @@ var EditSession = function(text, mode) { addSplit(split); continue; } - var minSplit = Math.max(split - (isCode ? 10 : wrapLimit-(wrapLimit>>2)), lastSplit - 1); + var minSplit = Math.max(split - (wrapLimit -(wrapLimit>>2)), lastSplit - 1); while (split > minSplit && tokens[split] < PLACEHOLDER_START) { split --; } @@ -6844,7 +9828,9 @@ var EditSession = function(text, mode) { continue; } split = lastSplit + wrapLimit; - addSplit(split); + if (tokens[split] == CHAR_EXT) + split--; + addSplit(split - indent); } return splits; }; @@ -6920,6 +9906,16 @@ var EditSession = function(text, mode) { return this.$wrapData[row].length + 1; } }; + + this.getRowWrapIndent = function(screenRow) { + if (this.$useWrapMode) { + var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE); + var splits = this.$wrapData[pos.row]; + return splits.length && splits[0] < pos.column ? splits.indent : 0; + } else { + return 0; + } + } this.getScreenLastRowColumn = function(screenRow) { var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE); return this.documentToScreenColumn(pos.row, pos.column); @@ -7005,25 +10001,26 @@ var EditSession = function(text, mode) { return { row: maxRow, column: this.getLine(maxRow).length - } + }; } else { line = this.getLine(docRow); foldLine = null; } - + var wrapIndent = 0; if (this.$useWrapMode) { var splits = this.$wrapData[docRow]; if (splits) { var splitIndex = Math.floor(screenRow - row); column = splits[splitIndex]; if(splitIndex > 0 && splits.length) { + wrapIndent = splits.indent; docColumn = splits[splitIndex - 1] || splits[splits.length - 1]; line = line.substring(docColumn); } } } - docColumn += this.$getStringScreenWidth(line, screenColumn)[1]; + docColumn += this.$getStringScreenWidth(line, screenColumn - wrapIndent)[1]; if (this.$useWrapMode && docColumn >= column) docColumn = column - 1; @@ -7095,6 +10092,7 @@ var EditSession = function(text, mode) { textLine = this.getLine(docRow).substring(0, docColumn); foldStartRow = docRow; } + var wrapIndent = 0; if (this.$useWrapMode) { var wrapRow = this.$wrapData[foldStartRow]; if (wrapRow) { @@ -7106,12 +10104,13 @@ var EditSession = function(text, mode) { textLine = textLine.substring( wrapRow[screenRowOffset - 1] || 0, textLine.length ); + wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0; } } return { row: screenRow, - column: this.$getStringScreenWidth(textLine)[0] + column: wrapIndent + this.$getStringScreenWidth(textLine)[0] }; }; this.documentToScreenColumn = function(row, docColumn) { @@ -7153,7 +10152,38 @@ var EditSession = function(text, mode) { return screenRows; }; this.$setFontMetrics = function(fm) { - } + if (!this.$enableVarChar) return; + this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) { + if (maxScreenColumn === 0) + return [0, 0]; + if (!maxScreenColumn) + maxScreenColumn = Infinity; + screenColumn = screenColumn || 0; + + var c, column; + for (column = 0; column < str.length; column++) { + c = str.charAt(column); + if (c === "\t") { + screenColumn += this.getScreenTabSize(screenColumn); + } else { + screenColumn += fm.getCharacterWidth(c); + } + if (screenColumn > maxScreenColumn) { + break; + } + } + + return [screenColumn, column]; + }; + }; + + this.destroy = function() { + if (this.bgTokenizer) { + this.bgTokenizer.setDocument(null); + this.bgTokenizer = null; + } + this.$stopWorker(); + }; function isFullWidth(c) { if (c < 0x1100) return false; @@ -7189,7 +10219,7 @@ var EditSession = function(text, mode) { c >= 0xFE68 && c <= 0xFE6B || c >= 0xFF01 && c <= 0xFF60 || c >= 0xFFE0 && c <= 0xFFE6; - }; + } }).call(EditSession.prototype); @@ -7211,6 +10241,7 @@ config.defineOptions(EditSession.prototype, "session", { if (this.$wrap == value) return; + this.$wrap = value; if (!value) { this.setUseWrapMode(false); } else { @@ -7218,7 +10249,6 @@ config.defineOptions(EditSession.prototype, "session", { this.setWrapLimitRange(col, col); this.setUseWrapMode(true); } - this.$wrap = value; }, get: function() { if (this.getUseWrapMode()) { @@ -7248,6 +10278,7 @@ config.defineOptions(EditSession.prototype, "session", { }, initialValue: "auto" }, + indentedSoftWrap: { initialValue: true }, firstLineNumber: { set: function() {this._signal("changeBreakpoint");}, initialValue: 1 @@ -7293,4020 +10324,8 @@ config.defineOptions(EditSession.prototype, "session", { exports.EditSession = EditSession; }); -define('ace/selection', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter', 'ace/range'], function(require, exports, module) { - - -var oop = require("./lib/oop"); -var lang = require("./lib/lang"); -var EventEmitter = require("./lib/event_emitter").EventEmitter; -var Range = require("./range").Range; -var Selection = function(session) { - this.session = session; - this.doc = session.getDocument(); - - this.clearSelection(); - this.lead = this.selectionLead = this.doc.createAnchor(0, 0); - this.anchor = this.selectionAnchor = this.doc.createAnchor(0, 0); - - var self = this; - this.lead.on("change", function(e) { - self._emit("changeCursor"); - if (!self.$isEmpty) - self._emit("changeSelection"); - if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column) - self.$desiredColumn = null; - }); - - this.selectionAnchor.on("change", function() { - if (!self.$isEmpty) - self._emit("changeSelection"); - }); -}; - -(function() { - - oop.implement(this, EventEmitter); - this.isEmpty = function() { - return (this.$isEmpty || ( - this.anchor.row == this.lead.row && - this.anchor.column == this.lead.column - )); - }; - this.isMultiLine = function() { - if (this.isEmpty()) { - return false; - } - - return this.getRange().isMultiLine(); - }; - this.getCursor = function() { - return this.lead.getPosition(); - }; - this.setSelectionAnchor = function(row, column) { - this.anchor.setPosition(row, column); - - if (this.$isEmpty) { - this.$isEmpty = false; - this._emit("changeSelection"); - } - }; - this.getSelectionAnchor = function() { - if (this.$isEmpty) - return this.getSelectionLead() - else - return this.anchor.getPosition(); - }; - this.getSelectionLead = function() { - return this.lead.getPosition(); - }; - this.shiftSelection = function(columns) { - if (this.$isEmpty) { - this.moveCursorTo(this.lead.row, this.lead.column + columns); - return; - }; - - var anchor = this.getSelectionAnchor(); - var lead = this.getSelectionLead(); - - var isBackwards = this.isBackwards(); - - if (!isBackwards || anchor.column !== 0) - this.setSelectionAnchor(anchor.row, anchor.column + columns); - - if (isBackwards || lead.column !== 0) { - this.$moveSelection(function() { - this.moveCursorTo(lead.row, lead.column + columns); - }); - } - }; - this.isBackwards = function() { - var anchor = this.anchor; - var lead = this.lead; - return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column)); - }; - this.getRange = function() { - var anchor = this.anchor; - var lead = this.lead; - - if (this.isEmpty()) - return Range.fromPoints(lead, lead); - - if (this.isBackwards()) { - return Range.fromPoints(lead, anchor); - } - else { - return Range.fromPoints(anchor, lead); - } - }; - this.clearSelection = function() { - if (!this.$isEmpty) { - this.$isEmpty = true; - this._emit("changeSelection"); - } - }; - this.selectAll = function() { - var lastRow = this.doc.getLength() - 1; - this.setSelectionAnchor(0, 0); - this.moveCursorTo(lastRow, this.doc.getLine(lastRow).length); - }; - this.setRange = - this.setSelectionRange = function(range, reverse) { - if (reverse) { - this.setSelectionAnchor(range.end.row, range.end.column); - this.selectTo(range.start.row, range.start.column); - } else { - this.setSelectionAnchor(range.start.row, range.start.column); - this.selectTo(range.end.row, range.end.column); - } - if (this.getRange().isEmpty()) - this.$isEmpty = true; - this.$desiredColumn = null; - }; - - this.$moveSelection = function(mover) { - var lead = this.lead; - if (this.$isEmpty) - this.setSelectionAnchor(lead.row, lead.column); - - mover.call(this); - }; - this.selectTo = function(row, column) { - this.$moveSelection(function() { - this.moveCursorTo(row, column); - }); - }; - this.selectToPosition = function(pos) { - this.$moveSelection(function() { - this.moveCursorToPosition(pos); - }); - }; - this.moveTo = function(row, column) { - this.clearSelection(); - this.moveCursorTo(row, column); - }; - this.moveToPosition = function(pos) { - this.clearSelection(); - this.moveCursorToPosition(pos); - }; - this.selectUp = function() { - this.$moveSelection(this.moveCursorUp); - }; - this.selectDown = function() { - this.$moveSelection(this.moveCursorDown); - }; - this.selectRight = function() { - this.$moveSelection(this.moveCursorRight); - }; - this.selectLeft = function() { - this.$moveSelection(this.moveCursorLeft); - }; - this.selectLineStart = function() { - this.$moveSelection(this.moveCursorLineStart); - }; - this.selectLineEnd = function() { - this.$moveSelection(this.moveCursorLineEnd); - }; - this.selectFileEnd = function() { - this.$moveSelection(this.moveCursorFileEnd); - }; - this.selectFileStart = function() { - this.$moveSelection(this.moveCursorFileStart); - }; - this.selectWordRight = function() { - this.$moveSelection(this.moveCursorWordRight); - }; - this.selectWordLeft = function() { - this.$moveSelection(this.moveCursorWordLeft); - }; - this.getWordRange = function(row, column) { - if (typeof column == "undefined") { - var cursor = row || this.lead; - row = cursor.row; - column = cursor.column; - } - return this.session.getWordRange(row, column); - }; - this.selectWord = function() { - this.setSelectionRange(this.getWordRange()); - }; - this.selectAWord = function() { - var cursor = this.getCursor(); - var range = this.session.getAWordRange(cursor.row, cursor.column); - this.setSelectionRange(range); - }; - - this.getLineRange = function(row, excludeLastChar) { - var rowStart = typeof row == "number" ? row : this.lead.row; - var rowEnd; - - var foldLine = this.session.getFoldLine(rowStart); - if (foldLine) { - rowStart = foldLine.start.row; - rowEnd = foldLine.end.row; - } else { - rowEnd = rowStart; - } - if (excludeLastChar === true) - return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length); - else - return new Range(rowStart, 0, rowEnd + 1, 0); - }; - this.selectLine = function() { - this.setSelectionRange(this.getLineRange()); - }; - this.moveCursorUp = function() { - this.moveCursorBy(-1, 0); - }; - this.moveCursorDown = function() { - this.moveCursorBy(1, 0); - }; - this.moveCursorLeft = function() { - var cursor = this.lead.getPosition(), - fold; - - if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) { - this.moveCursorTo(fold.start.row, fold.start.column); - } else if (cursor.column == 0) { - if (cursor.row > 0) { - this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length); - } - } - else { - var tabSize = this.session.getTabSize(); - if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column-tabSize, cursor.column).split(" ").length-1 == tabSize) - this.moveCursorBy(0, -tabSize); - else - this.moveCursorBy(0, -1); - } - }; - this.moveCursorRight = function() { - var cursor = this.lead.getPosition(), - fold; - if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) { - this.moveCursorTo(fold.end.row, fold.end.column); - } - else if (this.lead.column == this.doc.getLine(this.lead.row).length) { - if (this.lead.row < this.doc.getLength() - 1) { - this.moveCursorTo(this.lead.row + 1, 0); - } - } - else { - var tabSize = this.session.getTabSize(); - var cursor = this.lead; - if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column, cursor.column+tabSize).split(" ").length-1 == tabSize) - this.moveCursorBy(0, tabSize); - else - this.moveCursorBy(0, 1); - } - }; - this.moveCursorLineStart = function() { - var row = this.lead.row; - var column = this.lead.column; - var screenRow = this.session.documentToScreenRow(row, column); - var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0); - var beforeCursor = this.session.getDisplayLine( - row, null, firstColumnPosition.row, - firstColumnPosition.column - ); - - var leadingSpace = beforeCursor.match(/^\s*/); - if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart) - firstColumnPosition.column += leadingSpace[0].length; - this.moveCursorToPosition(firstColumnPosition); - }; - this.moveCursorLineEnd = function() { - var lead = this.lead; - var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column); - if (this.lead.column == lineEnd.column) { - var line = this.session.getLine(lineEnd.row); - if (lineEnd.column == line.length) { - var textEnd = line.search(/\s+$/); - if (textEnd > 0) - lineEnd.column = textEnd; - } - } - - this.moveCursorTo(lineEnd.row, lineEnd.column); - }; - this.moveCursorFileEnd = function() { - var row = this.doc.getLength() - 1; - var column = this.doc.getLine(row).length; - this.moveCursorTo(row, column); - }; - this.moveCursorFileStart = function() { - this.moveCursorTo(0, 0); - }; - this.moveCursorLongWordRight = function() { - var row = this.lead.row; - var column = this.lead.column; - var line = this.doc.getLine(row); - var rightOfCursor = line.substring(column); - - var match; - this.session.nonTokenRe.lastIndex = 0; - this.session.tokenRe.lastIndex = 0; - var fold = this.session.getFoldAt(row, column, 1); - if (fold) { - this.moveCursorTo(fold.end.row, fold.end.column); - return; - } - if (match = this.session.nonTokenRe.exec(rightOfCursor)) { - column += this.session.nonTokenRe.lastIndex; - this.session.nonTokenRe.lastIndex = 0; - rightOfCursor = line.substring(column); - } - if (column >= line.length) { - this.moveCursorTo(row, line.length); - this.moveCursorRight(); - if (row < this.doc.getLength() - 1) - this.moveCursorWordRight(); - return; - } - if (match = this.session.tokenRe.exec(rightOfCursor)) { - column += this.session.tokenRe.lastIndex; - this.session.tokenRe.lastIndex = 0; - } - - this.moveCursorTo(row, column); - }; - this.moveCursorLongWordLeft = function() { - var row = this.lead.row; - var column = this.lead.column; - var fold; - if (fold = this.session.getFoldAt(row, column, -1)) { - this.moveCursorTo(fold.start.row, fold.start.column); - return; - } - - var str = this.session.getFoldStringAt(row, column, -1); - if (str == null) { - str = this.doc.getLine(row).substring(0, column) - } - - var leftOfCursor = lang.stringReverse(str); - var match; - this.session.nonTokenRe.lastIndex = 0; - this.session.tokenRe.lastIndex = 0; - if (match = this.session.nonTokenRe.exec(leftOfCursor)) { - column -= this.session.nonTokenRe.lastIndex; - leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex); - this.session.nonTokenRe.lastIndex = 0; - } - if (column <= 0) { - this.moveCursorTo(row, 0); - this.moveCursorLeft(); - if (row > 0) - this.moveCursorWordLeft(); - return; - } - if (match = this.session.tokenRe.exec(leftOfCursor)) { - column -= this.session.tokenRe.lastIndex; - this.session.tokenRe.lastIndex = 0; - } - - this.moveCursorTo(row, column); - }; - - this.$shortWordEndIndex = function(rightOfCursor) { - var match, index = 0, ch; - var whitespaceRe = /\s/; - var tokenRe = this.session.tokenRe; - - tokenRe.lastIndex = 0; - if (match = this.session.tokenRe.exec(rightOfCursor)) { - index = this.session.tokenRe.lastIndex; - } else { - while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) - index ++; - - if (index < 1) { - tokenRe.lastIndex = 0; - while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) { - tokenRe.lastIndex = 0; - index ++; - if (whitespaceRe.test(ch)) { - if (index > 2) { - index-- - break; - } else { - while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) - index ++; - if (index > 2) - break - } - } - } - } - } - tokenRe.lastIndex = 0; - - return index; - }; - - this.moveCursorShortWordRight = function() { - var row = this.lead.row; - var column = this.lead.column; - var line = this.doc.getLine(row); - var rightOfCursor = line.substring(column); - - var fold = this.session.getFoldAt(row, column, 1); - if (fold) - return this.moveCursorTo(fold.end.row, fold.end.column); - - if (column == line.length) { - var l = this.doc.getLength(); - do { - row++; - rightOfCursor = this.doc.getLine(row) - } while (row < l && /^\s*$/.test(rightOfCursor)) - - if (!/^\s+/.test(rightOfCursor)) - rightOfCursor = "" - column = 0; - } - - var index = this.$shortWordEndIndex(rightOfCursor); - - this.moveCursorTo(row, column + index); - }; - - this.moveCursorShortWordLeft = function() { - var row = this.lead.row; - var column = this.lead.column; - - var fold; - if (fold = this.session.getFoldAt(row, column, -1)) - return this.moveCursorTo(fold.start.row, fold.start.column); - - var line = this.session.getLine(row).substring(0, column); - if (column == 0) { - do { - row--; - line = this.doc.getLine(row); - } while (row > 0 && /^\s*$/.test(line)) - - column = line.length; - if (!/\s+$/.test(line)) - line = "" - } - - var leftOfCursor = lang.stringReverse(line); - var index = this.$shortWordEndIndex(leftOfCursor); - - return this.moveCursorTo(row, column - index); - }; - - this.moveCursorWordRight = function() { - if (this.session.$selectLongWords) - this.moveCursorLongWordRight(); - else - this.moveCursorShortWordRight(); - }; - - this.moveCursorWordLeft = function() { - if (this.session.$selectLongWords) - this.moveCursorLongWordLeft(); - else - this.moveCursorShortWordLeft(); - }; - this.moveCursorBy = function(rows, chars) { - var screenPos = this.session.documentToScreenPosition( - this.lead.row, - this.lead.column - ); - - if (chars === 0) { - if (this.$desiredColumn) - screenPos.column = this.$desiredColumn; - else - this.$desiredColumn = screenPos.column; - } - - var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column); - - if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) { - if (this.session.lineWidgets && this.session.lineWidgets[docPos.row]) - docPos.row++; - } - this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0); - }; - this.moveCursorToPosition = function(position) { - this.moveCursorTo(position.row, position.column); - }; - this.moveCursorTo = function(row, column, keepDesiredColumn) { - var fold = this.session.getFoldAt(row, column, 1); - if (fold) { - row = fold.start.row; - column = fold.start.column; - } - - this.$keepDesiredColumnOnChange = true; - this.lead.setPosition(row, column); - this.$keepDesiredColumnOnChange = false; - - if (!keepDesiredColumn) - this.$desiredColumn = null; - }; - this.moveCursorToScreen = function(row, column, keepDesiredColumn) { - var pos = this.session.screenToDocumentPosition(row, column); - this.moveCursorTo(pos.row, pos.column, keepDesiredColumn); - }; - this.detach = function() { - this.lead.detach(); - this.anchor.detach(); - this.session = this.doc = null; - } - - this.fromOrientedRange = function(range) { - this.setSelectionRange(range, range.cursor == range.start); - this.$desiredColumn = range.desiredColumn || this.$desiredColumn; - } - - this.toOrientedRange = function(range) { - var r = this.getRange(); - if (range) { - range.start.column = r.start.column; - range.start.row = r.start.row; - range.end.column = r.end.column; - range.end.row = r.end.row; - } else { - range = r; - } - - range.cursor = this.isBackwards() ? range.start : range.end; - range.desiredColumn = this.$desiredColumn; - return range; - } - this.getRangeOfMovements = function(func) { - var start = this.getCursor(); - try { - func.call(null, this); - var end = this.getCursor(); - return Range.fromPoints(start,end); - } catch(e) { - return Range.fromPoints(start,start); - } finally { - this.moveCursorToPosition(start); - } - } - - this.toJSON = function() { - if (this.rangeCount) { - var data = this.ranges.map(function(r) { - var r1 = r.clone(); - r1.isBackwards = r.cursor == r.start; - return r1; - }); - } else { - var data = this.getRange(); - data.isBackwards = this.isBackwards(); - } - return data; - }; - - this.fromJSON = function(data) { - if (data.start == undefined) { - if (this.rangeList) { - this.toSingleRange(data[0]); - for (var i = data.length; i--; ) { - var r = Range.fromPoints(data[i].start, data[i].end); - if (data.isBackwards) - r.cursor = r.start; - this.addRange(r, true); - } - return; - } else - data = data[0]; - } - if (this.rangeList) - this.toSingleRange(data); - this.setSelectionRange(data, data.isBackwards); - }; - - this.isEqual = function(data) { - if ((data.length || this.rangeCount) && data.length != this.rangeCount) - return false; - if (!data.length || !this.ranges) - return this.getRange().isEqual(data); - - for (var i = this.ranges.length; i--; ) { - if (!this.ranges[i].isEqual(data[i])) - return false - } - return true; - } - -}).call(Selection.prototype); - -exports.Selection = Selection; -}); - -define('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) { - -var comparePoints = function(p1, p2) { - return p1.row - p2.row || p1.column - p2.column; -}; -var Range = function(startRow, startColumn, endRow, endColumn) { - this.start = { - row: startRow, - column: startColumn - }; - - this.end = { - row: endRow, - column: endColumn - }; -}; - -(function() { - this.isEqual = function(range) { - return this.start.row === range.start.row && - this.end.row === range.end.row && - this.start.column === range.start.column && - this.end.column === range.end.column; - }; - this.toString = function() { - return ("Range: [" + this.start.row + "/" + this.start.column + - "] -> [" + this.end.row + "/" + this.end.column + "]"); - }; - - this.contains = function(row, column) { - return this.compare(row, column) == 0; - }; - this.compareRange = function(range) { - var cmp, - end = range.end, - start = range.start; - - cmp = this.compare(end.row, end.column); - if (cmp == 1) { - cmp = this.compare(start.row, start.column); - if (cmp == 1) { - return 2; - } else if (cmp == 0) { - return 1; - } else { - return 0; - } - } else if (cmp == -1) { - return -2; - } else { - cmp = this.compare(start.row, start.column); - if (cmp == -1) { - return -1; - } else if (cmp == 1) { - return 42; - } else { - return 0; - } - } - }; - this.comparePoint = function(p) { - return this.compare(p.row, p.column); - }; - this.containsRange = function(range) { - return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; - }; - this.intersects = function(range) { - var cmp = this.compareRange(range); - return (cmp == -1 || cmp == 0 || cmp == 1); - }; - this.isEnd = function(row, column) { - return this.end.row == row && this.end.column == column; - }; - this.isStart = function(row, column) { - return this.start.row == row && this.start.column == column; - }; - this.setStart = function(row, column) { - if (typeof row == "object") { - this.start.column = row.column; - this.start.row = row.row; - } else { - this.start.row = row; - this.start.column = column; - } - }; - this.setEnd = function(row, column) { - if (typeof row == "object") { - this.end.column = row.column; - this.end.row = row.row; - } else { - this.end.row = row; - this.end.column = column; - } - }; - this.inside = function(row, column) { - if (this.compare(row, column) == 0) { - if (this.isEnd(row, column) || this.isStart(row, column)) { - return false; - } else { - return true; - } - } - return false; - }; - this.insideStart = function(row, column) { - if (this.compare(row, column) == 0) { - if (this.isEnd(row, column)) { - return false; - } else { - return true; - } - } - return false; - }; - this.insideEnd = function(row, column) { - if (this.compare(row, column) == 0) { - if (this.isStart(row, column)) { - return false; - } else { - return true; - } - } - return false; - }; - this.compare = function(row, column) { - if (!this.isMultiLine()) { - if (row === this.start.row) { - return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); - }; - } - - if (row < this.start.row) - return -1; - - if (row > this.end.row) - return 1; - - if (this.start.row === row) - return column >= this.start.column ? 0 : -1; - - if (this.end.row === row) - return column <= this.end.column ? 0 : 1; - - return 0; - }; - this.compareStart = function(row, column) { - if (this.start.row == row && this.start.column == column) { - return -1; - } else { - return this.compare(row, column); - } - }; - this.compareEnd = function(row, column) { - if (this.end.row == row && this.end.column == column) { - return 1; - } else { - return this.compare(row, column); - } - }; - this.compareInside = function(row, column) { - if (this.end.row == row && this.end.column == column) { - return 1; - } else if (this.start.row == row && this.start.column == column) { - return -1; - } else { - return this.compare(row, column); - } - }; - this.clipRows = function(firstRow, lastRow) { - if (this.end.row > lastRow) - var end = {row: lastRow + 1, column: 0}; - else if (this.end.row < firstRow) - var end = {row: firstRow, column: 0}; - - if (this.start.row > lastRow) - var start = {row: lastRow + 1, column: 0}; - else if (this.start.row < firstRow) - var start = {row: firstRow, column: 0}; - - return Range.fromPoints(start || this.start, end || this.end); - }; - this.extend = function(row, column) { - var cmp = this.compare(row, column); - - if (cmp == 0) - return this; - else if (cmp == -1) - var start = {row: row, column: column}; - else - var end = {row: row, column: column}; - - return Range.fromPoints(start || this.start, end || this.end); - }; - - this.isEmpty = function() { - return (this.start.row === this.end.row && this.start.column === this.end.column); - }; - this.isMultiLine = function() { - return (this.start.row !== this.end.row); - }; - this.clone = function() { - return Range.fromPoints(this.start, this.end); - }; - this.collapseRows = function() { - if (this.end.column == 0) - return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0) - else - return new Range(this.start.row, 0, this.end.row, 0) - }; - this.toScreenRange = function(session) { - var screenPosStart = session.documentToScreenPosition(this.start); - var screenPosEnd = session.documentToScreenPosition(this.end); - - return new Range( - screenPosStart.row, screenPosStart.column, - screenPosEnd.row, screenPosEnd.column - ); - }; - this.moveBy = function(row, column) { - this.start.row += row; - this.start.column += column; - this.end.row += row; - this.end.column += column; - }; - -}).call(Range.prototype); -Range.fromPoints = function(start, end) { - return new Range(start.row, start.column, end.row, end.column); -}; -Range.comparePoints = comparePoints; - -Range.comparePoints = function(p1, p2) { - return p1.row - p2.row || p1.column - p2.column; -}; - - -exports.Range = Range; -}); - -define('ace/mode/text', ['require', 'exports', 'module' , 'ace/tokenizer', 'ace/mode/text_highlight_rules', 'ace/mode/behaviour', 'ace/unicode', 'ace/lib/lang', 'ace/token_iterator', 'ace/range'], function(require, exports, module) { - - -var Tokenizer = require("../tokenizer").Tokenizer; -var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; -var Behaviour = require("./behaviour").Behaviour; -var unicode = require("../unicode"); -var lang = require("../lib/lang"); -var TokenIterator = require("../token_iterator").TokenIterator; -var Range = require("../range").Range; - -var Mode = function() { - this.HighlightRules = TextHighlightRules; - this.$behaviour = new Behaviour(); -}; - -(function() { - - this.tokenRe = new RegExp("^[" - + unicode.packages.L - + unicode.packages.Mn + unicode.packages.Mc - + unicode.packages.Nd - + unicode.packages.Pc + "\\$_]+", "g" - ); - - this.nonTokenRe = new RegExp("^(?:[^" - + unicode.packages.L - + unicode.packages.Mn + unicode.packages.Mc - + unicode.packages.Nd - + unicode.packages.Pc + "\\$_]|\\s])+", "g" - ); - - this.getTokenizer = function() { - if (!this.$tokenizer) { - this.$highlightRules = new this.HighlightRules(); - this.$tokenizer = new Tokenizer(this.$highlightRules.getRules()); - } - return this.$tokenizer; - }; - - this.lineCommentStart = ""; - this.blockComment = ""; - - this.toggleCommentLines = function(state, session, startRow, endRow) { - var doc = session.doc; - - var ignoreBlankLines = true; - var shouldRemove = true; - var minIndent = Infinity; - var tabSize = session.getTabSize(); - var insertAtTabStop = false; - - if (!this.lineCommentStart) { - if (!this.blockComment) - return false; - var lineCommentStart = this.blockComment.start; - var lineCommentEnd = this.blockComment.end; - var regexpStart = new RegExp("^(\\s*)(?:" + lang.escapeRegExp(lineCommentStart) + ")"); - var regexpEnd = new RegExp("(?:" + lang.escapeRegExp(lineCommentEnd) + ")\\s*$"); - - var comment = function(line, i) { - if (testRemove(line, i)) - return; - if (!ignoreBlankLines || /\S/.test(line)) { - doc.insertInLine({row: i, column: line.length}, lineCommentEnd); - doc.insertInLine({row: i, column: minIndent}, lineCommentStart); - } - }; - - var uncomment = function(line, i) { - var m; - if (m = line.match(regexpEnd)) - doc.removeInLine(i, line.length - m[0].length, line.length); - if (m = line.match(regexpStart)) - doc.removeInLine(i, m[1].length, m[0].length); - }; - - var testRemove = function(line, row) { - if (regexpStart.test(line)) - return true; - var tokens = session.getTokens(row); - for (var i = 0; i < tokens.length; i++) { - if (tokens[i].type === 'comment') - return true; - } - }; - } else { - if (Array.isArray(this.lineCommentStart)) { - var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join("|"); - var lineCommentStart = this.lineCommentStart[0]; - } else { - var regexpStart = lang.escapeRegExp(this.lineCommentStart); - var lineCommentStart = this.lineCommentStart; - } - regexpStart = new RegExp("^(\\s*)(?:" + regexpStart + ") ?"); - - insertAtTabStop = session.getUseSoftTabs(); - - var uncomment = function(line, i) { - var m = line.match(regexpStart); - if (!m) return; - var start = m[1].length, end = m[0].length; - if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == " ") - end--; - doc.removeInLine(i, start, end); - }; - var commentWithSpace = lineCommentStart + " "; - var comment = function(line, i) { - if (!ignoreBlankLines || /\S/.test(line)) { - if (shouldInsertSpace(line, minIndent, minIndent)) - doc.insertInLine({row: i, column: minIndent}, commentWithSpace); - else - doc.insertInLine({row: i, column: minIndent}, lineCommentStart); - } - }; - var testRemove = function(line, i) { - return regexpStart.test(line); - }; - - var shouldInsertSpace = function(line, before, after) { - var spaces = 0; - while (before-- && line.charAt(before) == " ") - spaces++; - if (spaces % tabSize != 0) - return false; - var spaces = 0; - while (line.charAt(after++) == " ") - spaces++; - if (tabSize > 2) - return spaces % tabSize != tabSize - 1; - else - return spaces % tabSize == 0; - return true; - }; - } - - function iter(fun) { - for (var i = startRow; i <= endRow; i++) - fun(doc.getLine(i), i); - } - - - var minEmptyLength = Infinity; - iter(function(line, i) { - var indent = line.search(/\S/); - if (indent !== -1) { - if (indent < minIndent) - minIndent = indent; - if (shouldRemove && !testRemove(line, i)) - shouldRemove = false; - } else if (minEmptyLength > line.length) { - minEmptyLength = line.length; - } - }); - - if (minIndent == Infinity) { - minIndent = minEmptyLength; - ignoreBlankLines = false; - shouldRemove = false; - } - - if (insertAtTabStop && minIndent % tabSize != 0) - minIndent = Math.floor(minIndent / tabSize) * tabSize; - - iter(shouldRemove ? uncomment : comment); - }; - - this.toggleBlockComment = function(state, session, range, cursor) { - var comment = this.blockComment; - if (!comment) - return; - if (!comment.start && comment[0]) - comment = comment[0]; - - var iterator = new TokenIterator(session, cursor.row, cursor.column); - var token = iterator.getCurrentToken(); - - var sel = session.selection; - var initialRange = session.selection.toOrientedRange(); - var startRow, colDiff; - - if (token && /comment/.test(token.type)) { - var startRange, endRange; - while (token && /comment/.test(token.type)) { - var i = token.value.indexOf(comment.start); - if (i != -1) { - var row = iterator.getCurrentTokenRow(); - var column = iterator.getCurrentTokenColumn() + i; - startRange = new Range(row, column, row, column + comment.start.length); - break; - } - token = iterator.stepBackward(); - } - - var iterator = new TokenIterator(session, cursor.row, cursor.column); - var token = iterator.getCurrentToken(); - while (token && /comment/.test(token.type)) { - var i = token.value.indexOf(comment.end); - if (i != -1) { - var row = iterator.getCurrentTokenRow(); - var column = iterator.getCurrentTokenColumn() + i; - endRange = new Range(row, column, row, column + comment.end.length); - break; - } - token = iterator.stepForward(); - } - if (endRange) - session.remove(endRange); - if (startRange) { - session.remove(startRange); - startRow = startRange.start.row; - colDiff = -comment.start.length; - } - } else { - colDiff = comment.start.length; - startRow = range.start.row; - session.insert(range.end, comment.end); - session.insert(range.start, comment.start); - } - if (initialRange.start.row == startRow) - initialRange.start.column += colDiff; - if (initialRange.end.row == startRow) - initialRange.end.column += colDiff; - session.selection.fromOrientedRange(initialRange); - }; - - this.getNextLineIndent = function(state, line, tab) { - return this.$getIndent(line); - }; - - this.checkOutdent = function(state, line, input) { - return false; - }; - - this.autoOutdent = function(state, doc, row) { - }; - - this.$getIndent = function(line) { - return line.match(/^\s*/)[0]; - }; - - this.createWorker = function(session) { - return null; - }; - - this.createModeDelegates = function (mapping) { - this.$embeds = []; - this.$modes = {}; - for (var i in mapping) { - if (mapping[i]) { - this.$embeds.push(i); - this.$modes[i] = new mapping[i](); - } - } - - var delegations = ['toggleBlockComment', 'toggleCommentLines', 'getNextLineIndent', - 'checkOutdent', 'autoOutdent', 'transformAction', 'getCompletions']; - - for (var i = 0; i < delegations.length; i++) { - (function(scope) { - var functionName = delegations[i]; - var defaultHandler = scope[functionName]; - scope[delegations[i]] = function() { - return this.$delegator(functionName, arguments, defaultHandler); - }; - } (this)); - } - }; - - this.$delegator = function(method, args, defaultHandler) { - var state = args[0]; - if (typeof state != "string") - state = state[0]; - for (var i = 0; i < this.$embeds.length; i++) { - if (!this.$modes[this.$embeds[i]]) continue; - - var split = state.split(this.$embeds[i]); - if (!split[0] && split[1]) { - args[0] = split[1]; - var mode = this.$modes[this.$embeds[i]]; - return mode[method].apply(mode, args); - } - } - var ret = defaultHandler.apply(this, args); - return defaultHandler ? ret : undefined; - }; - - this.transformAction = function(state, action, editor, session, param) { - if (this.$behaviour) { - var behaviours = this.$behaviour.getBehaviours(); - for (var key in behaviours) { - if (behaviours[key][action]) { - var ret = behaviours[key][action].apply(this, arguments); - if (ret) { - return ret; - } - } - } - } - }; - - this.getKeywords = function(append) { - if (!this.completionKeywords) { - var rules = this.$tokenizer.rules; - var completionKeywords = []; - for (var rule in rules) { - var ruleItr = rules[rule]; - for (var r = 0, l = ruleItr.length; r < l; r++) { - if (typeof ruleItr[r].token === "string") { - if (/keyword|support|storage/.test(ruleItr[r].token)) - completionKeywords.push(ruleItr[r].regex); - } - else if (typeof ruleItr[r].token === "object") { - for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) { - if (/keyword|support|storage/.test(ruleItr[r].token[a])) { - var rule = ruleItr[r].regex.match(/\(.+?\)/g)[a]; - completionKeywords.push(rule.substr(1, rule.length - 2)); - } - } - } - } - } - this.completionKeywords = completionKeywords; - } - if (!append) - return this.$keywordList; - return completionKeywords.concat(this.$keywordList || []); - }; - - this.$createKeywordList = function() { - if (!this.$highlightRules) - this.getTokenizer(); - return this.$keywordList = this.$highlightRules.$keywordList || []; - }; - - this.getCompletions = function(state, session, pos, prefix) { - var keywords = this.$keywordList || this.$createKeywordList(); - return keywords.map(function(word) { - return { - name: word, - value: word, - score: 0, - meta: "keyword" - }; - }); - }; - - this.$id = "ace/mode/text"; -}).call(Mode.prototype); - -exports.Mode = Mode; -}); - -define('ace/tokenizer', ['require', 'exports', 'module' ], function(require, exports, module) { -var MAX_TOKEN_COUNT = 1000; -var Tokenizer = function(rules) { - this.states = rules; - - this.regExps = {}; - this.matchMappings = {}; - for (var key in this.states) { - var state = this.states[key]; - var ruleRegExps = []; - var matchTotal = 0; - var mapping = this.matchMappings[key] = {defaultToken: "text"}; - var flag = "g"; - - var splitterRurles = []; - for (var i = 0; i < state.length; i++) { - var rule = state[i]; - if (rule.defaultToken) - mapping.defaultToken = rule.defaultToken; - if (rule.caseInsensitive) - flag = "gi"; - if (rule.regex == null) - continue; - - if (rule.regex instanceof RegExp) - rule.regex = rule.regex.toString().slice(1, -1); - var adjustedregex = rule.regex; - var matchcount = new RegExp("(?:(" + adjustedregex + ")|(.))").exec("a").length - 2; - if (Array.isArray(rule.token)) { - if (rule.token.length == 1 || matchcount == 1) { - rule.token = rule.token[0]; - } else if (matchcount - 1 != rule.token.length) { - throw new Error("number of classes and regexp groups in '" + - rule.token + "'\n'" + rule.regex + "' doesn't match\n" - + (matchcount - 1) + "!=" + rule.token.length); - } else { - rule.tokenArray = rule.token; - rule.token = null; - rule.onMatch = this.$arrayTokens; - } - } else if (typeof rule.token == "function" && !rule.onMatch) { - if (matchcount > 1) - rule.onMatch = this.$applyToken; - else - rule.onMatch = rule.token; - } - - if (matchcount > 1) { - if (/\\\d/.test(rule.regex)) { - adjustedregex = rule.regex.replace(/\\([0-9]+)/g, function(match, digit) { - return "\\" + (parseInt(digit, 10) + matchTotal + 1); - }); - } else { - matchcount = 1; - adjustedregex = this.removeCapturingGroups(rule.regex); - } - if (!rule.splitRegex && typeof rule.token != "string") - splitterRurles.push(rule); // flag will be known only at the very end - } - - mapping[matchTotal] = i; - matchTotal += matchcount; - - ruleRegExps.push(adjustedregex); - if (!rule.onMatch) - rule.onMatch = null; - } - - splitterRurles.forEach(function(rule) { - rule.splitRegex = this.createSplitterRegexp(rule.regex, flag); - }, this); - - this.regExps[key] = new RegExp("(" + ruleRegExps.join(")|(") + ")|($)", flag); - } -}; - -(function() { - this.$setMaxTokenCount = function(m) { - MAX_TOKEN_COUNT = m | 0; - }; - - this.$applyToken = function(str) { - var values = this.splitRegex.exec(str).slice(1); - var types = this.token.apply(this, values); - if (typeof types === "string") - return [{type: types, value: str}]; - - var tokens = []; - for (var i = 0, l = types.length; i < l; i++) { - if (values[i]) - tokens[tokens.length] = { - type: types[i], - value: values[i] - }; - } - return tokens; - }, - - this.$arrayTokens = function(str) { - if (!str) - return []; - var values = this.splitRegex.exec(str); - if (!values) - return "text"; - var tokens = []; - var types = this.tokenArray; - for (var i = 0, l = types.length; i < l; i++) { - if (values[i + 1]) - tokens[tokens.length] = { - type: types[i], - value: values[i + 1] - }; - } - return tokens; - }; - - this.removeCapturingGroups = function(src) { - var r = src.replace( - /\[(?:\\.|[^\]])*?\]|\\.|\(\?[:=!]|(\()/g, - function(x, y) {return y ? "(?:" : x;} - ); - return r; - }; - - this.createSplitterRegexp = function(src, flag) { - if (src.indexOf("(?=") != -1) { - var stack = 0; - var inChClass = false; - var lastCapture = {}; - src.replace(/(\\.)|(\((?:\?[=!])?)|(\))|([\[\]])/g, function( - m, esc, parenOpen, parenClose, square, index - ) { - if (inChClass) { - inChClass = square != "]"; - } else if (square) { - inChClass = true; - } else if (parenClose) { - if (stack == lastCapture.stack) { - lastCapture.end = index+1; - lastCapture.stack = -1; - } - stack--; - } else if (parenOpen) { - stack++; - if (parenOpen.length != 1) { - lastCapture.stack = stack - lastCapture.start = index; - } - } - return m; - }); - - if (lastCapture.end != null && /^\)*$/.test(src.substr(lastCapture.end))) - src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end); - } - return new RegExp(src, (flag||"").replace("g", "")); - }; - this.getLineTokens = function(line, startState) { - if (startState && typeof startState != "string") { - var stack = startState.slice(0); - startState = stack[0]; - } else - var stack = []; - - var currentState = startState || "start"; - var state = this.states[currentState]; - if (!state) { - currentState = "start"; - state = this.states[currentState]; - } - var mapping = this.matchMappings[currentState]; - var re = this.regExps[currentState]; - re.lastIndex = 0; - - var match, tokens = []; - var lastIndex = 0; - - var token = {type: null, value: ""}; - - while (match = re.exec(line)) { - var type = mapping.defaultToken; - var rule = null; - var value = match[0]; - var index = re.lastIndex; - - if (index - value.length > lastIndex) { - var skipped = line.substring(lastIndex, index - value.length); - if (token.type == type) { - token.value += skipped; - } else { - if (token.type) - tokens.push(token); - token = {type: type, value: skipped}; - } - } - - for (var i = 0; i < match.length-2; i++) { - if (match[i + 1] === undefined) - continue; - - rule = state[mapping[i]]; - - if (rule.onMatch) - type = rule.onMatch(value, currentState, stack); - else - type = rule.token; - - if (rule.next) { - if (typeof rule.next == "string") - currentState = rule.next; - else - currentState = rule.next(currentState, stack); - - state = this.states[currentState]; - if (!state) { - window.console && console.error && console.error(currentState, "doesn't exist"); - currentState = "start"; - state = this.states[currentState]; - } - mapping = this.matchMappings[currentState]; - lastIndex = index; - re = this.regExps[currentState]; - re.lastIndex = index; - } - break; - } - - if (value) { - if (typeof type == "string") { - if ((!rule || rule.merge !== false) && token.type === type) { - token.value += value; - } else { - if (token.type) - tokens.push(token); - token = {type: type, value: value}; - } - } else if (type) { - if (token.type) - tokens.push(token); - token = {type: null, value: ""}; - for (var i = 0; i < type.length; i++) - tokens.push(type[i]); - } - } - - if (lastIndex == line.length) - break; - - lastIndex = index; - - if (tokens.length > MAX_TOKEN_COUNT) { - while (lastIndex < line.length) { - if (token.type) - tokens.push(token); - token = { - value: line.substring(lastIndex, lastIndex += 2000), - type: "overflow" - }; - } - currentState = "start"; - stack = []; - break; - } - } - - if (token.type) - tokens.push(token); - - if (stack.length > 1) { - if (stack[0] !== currentState) - stack.unshift(currentState); - } - return { - tokens : tokens, - state : stack.length ? stack : currentState - }; - }; - -}).call(Tokenizer.prototype); - -exports.Tokenizer = Tokenizer; -}); - -define('ace/mode/text_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/lang'], function(require, exports, module) { - - -var lang = require("../lib/lang"); - -var TextHighlightRules = function() { - - this.$rules = { - "start" : [{ - token : "empty_line", - regex : '^$' - }, { - defaultToken : "text" - }] - }; -}; - -(function() { - - this.addRules = function(rules, prefix) { - if (!prefix) { - for (var key in rules) - this.$rules[key] = rules[key]; - return; - } - for (var key in rules) { - var state = rules[key]; - for (var i = 0; i < state.length; i++) { - var rule = state[i]; - if (rule.next) { - if (typeof rule.next != "string") { - if (rule.nextState && rule.nextState.indexOf(prefix) !== 0) - rule.nextState = prefix + rule.nextState; - } else { - if (rule.next.indexOf(prefix) !== 0) - rule.next = prefix + rule.next; - } - - } - } - this.$rules[prefix + key] = state; - } - }; - - this.getRules = function() { - return this.$rules; - }; - - this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) { - var embedRules = typeof HighlightRules == "function" - ? new HighlightRules().getRules() - : HighlightRules; - if (states) { - for (var i = 0; i < states.length; i++) - states[i] = prefix + states[i]; - } else { - states = []; - for (var key in embedRules) - states.push(prefix + key); - } - - this.addRules(embedRules, prefix); - - if (escapeRules) { - var addRules = Array.prototype[append ? "push" : "unshift"]; - for (var i = 0; i < states.length; i++) - addRules.apply(this.$rules[states[i]], lang.deepCopy(escapeRules)); - } - - if (!this.$embeds) - this.$embeds = []; - this.$embeds.push(prefix); - }; - - this.getEmbeds = function() { - return this.$embeds; - }; - - var pushState = function(currentState, stack) { - if (currentState != "start" || stack.length) - stack.unshift(this.nextState, currentState); - return this.nextState; - }; - var popState = function(currentState, stack) { - stack.shift(); - return stack.shift() || "start"; - }; - - this.normalizeRules = function() { - var id = 0; - var rules = this.$rules; - function processState(key) { - var state = rules[key]; - state.processed = true; - for (var i = 0; i < state.length; i++) { - var rule = state[i]; - if (!rule.regex && rule.start) { - rule.regex = rule.start; - if (!rule.next) - rule.next = []; - rule.next.push({ - defaultToken: rule.token - }, { - token: rule.token + ".end", - regex: rule.end || rule.start, - next: "pop" - }); - rule.token = rule.token + ".start"; - rule.push = true; - } - var next = rule.next || rule.push; - if (next && Array.isArray(next)) { - var stateName = rule.stateName; - if (!stateName) { - stateName = rule.token; - if (typeof stateName != "string") - stateName = stateName[0] || ""; - if (rules[stateName]) - stateName += id++; - } - rules[stateName] = next; - rule.next = stateName; - processState(stateName); - } else if (next == "pop") { - rule.next = popState; - } - - if (rule.push) { - rule.nextState = rule.next || rule.push; - rule.next = pushState; - delete rule.push; - } - - if (rule.rules) { - for (var r in rule.rules) { - if (rules[r]) { - if (rules[r].push) - rules[r].push.apply(rules[r], rule.rules[r]); - } else { - rules[r] = rule.rules[r]; - } - } - } - if (rule.include || typeof rule == "string") { - var includeName = rule.include || rule; - var toInsert = rules[includeName]; - } else if (Array.isArray(rule)) - toInsert = rule; - - if (toInsert) { - var args = [i, 1].concat(toInsert); - if (rule.noEscape) - args = args.filter(function(x) {return !x.next;}); - state.splice.apply(state, args); - i--; - toInsert = null - } - - if (rule.keywordMap) { - rule.token = this.createKeywordMapper( - rule.keywordMap, rule.defaultToken || "text", rule.caseInsensitive - ); - delete rule.defaultToken; - } - } - }; - Object.keys(rules).forEach(processState, this); - }; - - this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) { - var keywords = Object.create(null); - Object.keys(map).forEach(function(className) { - var a = map[className]; - if (ignoreCase) - a = a.toLowerCase(); - var list = a.split(splitChar || "|"); - for (var i = list.length; i--; ) - keywords[list[i]] = className; - }); - if (Object.getPrototypeOf(keywords)) { - keywords.__proto__ = null; - } - this.$keywordList = Object.keys(keywords); - map = null; - return ignoreCase - ? function(value) {return keywords[value.toLowerCase()] || defaultToken } - : function(value) {return keywords[value] || defaultToken }; - } - - this.getKeywords = function() { - return this.$keywords; - }; - -}).call(TextHighlightRules.prototype); - -exports.TextHighlightRules = TextHighlightRules; -}); - -define('ace/mode/behaviour', ['require', 'exports', 'module' ], function(require, exports, module) { - - -var Behaviour = function() { - this.$behaviours = {}; -}; - -(function () { - - this.add = function (name, action, callback) { - switch (undefined) { - case this.$behaviours: - this.$behaviours = {}; - case this.$behaviours[name]: - this.$behaviours[name] = {}; - } - this.$behaviours[name][action] = callback; - } - - this.addBehaviours = function (behaviours) { - for (var key in behaviours) { - for (var action in behaviours[key]) { - this.add(key, action, behaviours[key][action]); - } - } - } - - this.remove = function (name) { - if (this.$behaviours && this.$behaviours[name]) { - delete this.$behaviours[name]; - } - } - - this.inherit = function (mode, filter) { - if (typeof mode === "function") { - var behaviours = new mode().getBehaviours(filter); - } else { - var behaviours = mode.getBehaviours(filter); - } - this.addBehaviours(behaviours); - } - - this.getBehaviours = function (filter) { - if (!filter) { - return this.$behaviours; - } else { - var ret = {} - for (var i = 0; i < filter.length; i++) { - if (this.$behaviours[filter[i]]) { - ret[filter[i]] = this.$behaviours[filter[i]]; - } - } - return ret; - } - } - -}).call(Behaviour.prototype); - -exports.Behaviour = Behaviour; -}); -define('ace/unicode', ['require', 'exports', 'module' ], function(require, exports, module) { -exports.packages = {}; - -addUnicodePackage({ - L: "0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC", - Ll: "0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A", - Lu: "0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A", - Lt: "01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC", - Lm: "02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F", - Lo: "01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC", - M: "0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26", - Mn: "0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26", - Mc: "0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC", - Me: "0488048906DE20DD-20E020E2-20E4A670-A672", - N: "0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19", - Nd: "0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19", - Nl: "16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF", - No: "00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835", - P: "0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65", - Pd: "002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D", - Ps: "0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62", - Pe: "0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63", - Pi: "00AB2018201B201C201F20392E022E042E092E0C2E1C2E20", - Pf: "00BB2019201D203A2E032E052E0A2E0D2E1D2E21", - Pc: "005F203F20402054FE33FE34FE4D-FE4FFF3F", - Po: "0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65", - S: "0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD", - Sm: "002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC", - Sc: "002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6", - Sk: "005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3", - So: "00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD", - Z: "002000A01680180E2000-200A20282029202F205F3000", - Zs: "002000A01680180E2000-200A202F205F3000", - Zl: "2028", - Zp: "2029", - C: "0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF", - Cc: "0000-001F007F-009F", - Cf: "00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB", - Co: "E000-F8FF", - Cs: "D800-DFFF", - Cn: "03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF" -}); - -function addUnicodePackage (pack) { - var codePoint = /\w{4}/g; - for (var name in pack) - exports.packages[name] = pack[name].replace(codePoint, "\\u$&"); -}; - -}); - -define('ace/token_iterator', ['require', 'exports', 'module' ], function(require, exports, module) { -var TokenIterator = function(session, initialRow, initialColumn) { - this.$session = session; - this.$row = initialRow; - this.$rowTokens = session.getTokens(initialRow); - - var token = session.getTokenAt(initialRow, initialColumn); - this.$tokenIndex = token ? token.index : -1; -}; - -(function() { - this.stepBackward = function() { - this.$tokenIndex -= 1; - - while (this.$tokenIndex < 0) { - this.$row -= 1; - if (this.$row < 0) { - this.$row = 0; - return null; - } - - this.$rowTokens = this.$session.getTokens(this.$row); - this.$tokenIndex = this.$rowTokens.length - 1; - } - - return this.$rowTokens[this.$tokenIndex]; - }; - this.stepForward = function() { - this.$tokenIndex += 1; - var rowCount; - while (this.$tokenIndex >= this.$rowTokens.length) { - this.$row += 1; - if (!rowCount) - rowCount = this.$session.getLength(); - if (this.$row >= rowCount) { - this.$row = rowCount - 1; - return null; - } - - this.$rowTokens = this.$session.getTokens(this.$row); - this.$tokenIndex = 0; - } - - return this.$rowTokens[this.$tokenIndex]; - }; - this.getCurrentToken = function () { - return this.$rowTokens[this.$tokenIndex]; - }; - this.getCurrentTokenRow = function () { - return this.$row; - }; - this.getCurrentTokenColumn = function() { - var rowTokens = this.$rowTokens; - var tokenIndex = this.$tokenIndex; - var column = rowTokens[tokenIndex].start; - if (column !== undefined) - return column; - - column = 0; - while (tokenIndex > 0) { - tokenIndex -= 1; - column += rowTokens[tokenIndex].value.length; - } - - return column; - }; - -}).call(TokenIterator.prototype); - -exports.TokenIterator = TokenIterator; -}); - -define('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) { - - -var oop = require("./lib/oop"); -var EventEmitter = require("./lib/event_emitter").EventEmitter; -var Range = require("./range").Range; -var Anchor = require("./anchor").Anchor; - -var Document = function(text) { - this.$lines = []; - if (text.length === 0) { - this.$lines = [""]; - } else if (Array.isArray(text)) { - this._insertLines(0, text); - } else { - this.insert({row: 0, column:0}, text); - } -}; - -(function() { - - oop.implement(this, EventEmitter); - this.setValue = function(text) { - var len = this.getLength(); - this.remove(new Range(0, 0, len, this.getLine(len-1).length)); - this.insert({row: 0, column:0}, text); - }; - this.getValue = function() { - return this.getAllLines().join(this.getNewLineCharacter()); - }; - this.createAnchor = function(row, column) { - return new Anchor(this, row, column); - }; - if ("aaa".split(/a/).length === 0) - this.$split = function(text) { - return text.replace(/\r\n|\r/g, "\n").split("\n"); - }; - else - this.$split = function(text) { - return text.split(/\r\n|\r|\n/); - }; - - - this.$detectNewLine = function(text) { - var match = text.match(/^.*?(\r\n|\r|\n)/m); - this.$autoNewLine = match ? match[1] : "\n"; - this._signal("changeNewLineMode"); - }; - this.getNewLineCharacter = function() { - switch (this.$newLineMode) { - case "windows": - return "\r\n"; - case "unix": - return "\n"; - default: - return this.$autoNewLine || "\n"; - } - }; - - this.$autoNewLine = ""; - this.$newLineMode = "auto"; - this.setNewLineMode = function(newLineMode) { - if (this.$newLineMode === newLineMode) - return; - - this.$newLineMode = newLineMode; - this._signal("changeNewLineMode"); - }; - this.getNewLineMode = function() { - return this.$newLineMode; - }; - this.isNewLine = function(text) { - return (text == "\r\n" || text == "\r" || text == "\n"); - }; - this.getLine = function(row) { - return this.$lines[row] || ""; - }; - this.getLines = function(firstRow, lastRow) { - return this.$lines.slice(firstRow, lastRow + 1); - }; - this.getAllLines = function() { - return this.getLines(0, this.getLength()); - }; - this.getLength = function() { - return this.$lines.length; - }; - this.getTextRange = function(range) { - if (range.start.row == range.end.row) { - return this.getLine(range.start.row) - .substring(range.start.column, range.end.column); - } - var lines = this.getLines(range.start.row, range.end.row); - lines[0] = (lines[0] || "").substring(range.start.column); - var l = lines.length - 1; - if (range.end.row - range.start.row == l) - lines[l] = lines[l].substring(0, range.end.column); - return lines.join(this.getNewLineCharacter()); - }; - - this.$clipPosition = function(position) { - var length = this.getLength(); - if (position.row >= length) { - position.row = Math.max(0, length - 1); - position.column = this.getLine(length-1).length; - } else if (position.row < 0) - position.row = 0; - return position; - }; - this.insert = function(position, text) { - if (!text || text.length === 0) - return position; - - position = this.$clipPosition(position); - if (this.getLength() <= 1) - this.$detectNewLine(text); - - var lines = this.$split(text); - var firstLine = lines.splice(0, 1)[0]; - var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0]; - - position = this.insertInLine(position, firstLine); - if (lastLine !== null) { - position = this.insertNewLine(position); // terminate first line - position = this._insertLines(position.row, lines); - position = this.insertInLine(position, lastLine || ""); - } - return position; - }; - this.insertLines = function(row, lines) { - if (row >= this.getLength()) - return this.insert({row: row, column: 0}, "\n" + lines.join("\n")); - return this._insertLines(Math.max(row, 0), lines); - }; - this._insertLines = function(row, lines) { - if (lines.length == 0) - return {row: row, column: 0}; - while (lines.length > 0xF000) { - var end = this._insertLines(row, lines.slice(0, 0xF000)); - lines = lines.slice(0xF000); - row = end.row; - } - - var args = [row, 0]; - args.push.apply(args, lines); - this.$lines.splice.apply(this.$lines, args); - - var range = new Range(row, 0, row + lines.length, 0); - var delta = { - action: "insertLines", - range: range, - lines: lines - }; - this._signal("change", { data: delta }); - return range.end; - }; - this.insertNewLine = function(position) { - position = this.$clipPosition(position); - var line = this.$lines[position.row] || ""; - - this.$lines[position.row] = line.substring(0, position.column); - this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length)); - - var end = { - row : position.row + 1, - column : 0 - }; - - var delta = { - action: "insertText", - range: Range.fromPoints(position, end), - text: this.getNewLineCharacter() - }; - this._signal("change", { data: delta }); - - return end; - }; - this.insertInLine = function(position, text) { - if (text.length == 0) - return position; - - var line = this.$lines[position.row] || ""; - - this.$lines[position.row] = line.substring(0, position.column) + text - + line.substring(position.column); - - var end = { - row : position.row, - column : position.column + text.length - }; - - var delta = { - action: "insertText", - range: Range.fromPoints(position, end), - text: text - }; - this._signal("change", { data: delta }); - - return end; - }; - this.remove = function(range) { - if (!(range instanceof Range)) - range = Range.fromPoints(range.start, range.end); - range.start = this.$clipPosition(range.start); - range.end = this.$clipPosition(range.end); - - if (range.isEmpty()) - return range.start; - - var firstRow = range.start.row; - var lastRow = range.end.row; - - if (range.isMultiLine()) { - var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1; - var lastFullRow = lastRow - 1; - - if (range.end.column > 0) - this.removeInLine(lastRow, 0, range.end.column); - - if (lastFullRow >= firstFullRow) - this._removeLines(firstFullRow, lastFullRow); - - if (firstFullRow != firstRow) { - this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length); - this.removeNewLine(range.start.row); - } - } - else { - this.removeInLine(firstRow, range.start.column, range.end.column); - } - return range.start; - }; - this.removeInLine = function(row, startColumn, endColumn) { - if (startColumn == endColumn) - return; - - var range = new Range(row, startColumn, row, endColumn); - var line = this.getLine(row); - var removed = line.substring(startColumn, endColumn); - var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length); - this.$lines.splice(row, 1, newLine); - - var delta = { - action: "removeText", - range: range, - text: removed - }; - this._signal("change", { data: delta }); - return range.start; - }; - this.removeLines = function(firstRow, lastRow) { - if (firstRow < 0 || lastRow >= this.getLength()) - return this.remove(new Range(firstRow, 0, lastRow + 1, 0)); - return this._removeLines(firstRow, lastRow); - }; - - this._removeLines = function(firstRow, lastRow) { - var range = new Range(firstRow, 0, lastRow + 1, 0); - var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1); - - var delta = { - action: "removeLines", - range: range, - nl: this.getNewLineCharacter(), - lines: removed - }; - this._signal("change", { data: delta }); - return removed; - }; - this.removeNewLine = function(row) { - var firstLine = this.getLine(row); - var secondLine = this.getLine(row+1); - - var range = new Range(row, firstLine.length, row+1, 0); - var line = firstLine + secondLine; - - this.$lines.splice(row, 2, line); - - var delta = { - action: "removeText", - range: range, - text: this.getNewLineCharacter() - }; - this._signal("change", { data: delta }); - }; - this.replace = function(range, text) { - if (!(range instanceof Range)) - range = Range.fromPoints(range.start, range.end); - if (text.length == 0 && range.isEmpty()) - return range.start; - if (text == this.getTextRange(range)) - return range.end; - - this.remove(range); - if (text) { - var end = this.insert(range.start, text); - } - else { - end = range.start; - } - - return end; - }; - this.applyDeltas = function(deltas) { - for (var i=0; i=0; i--) { - var delta = deltas[i]; - - var range = Range.fromPoints(delta.range.start, delta.range.end); - - if (delta.action == "insertLines") - this._removeLines(range.start.row, range.end.row - 1); - else if (delta.action == "insertText") - this.remove(range); - else if (delta.action == "removeLines") - this._insertLines(range.start.row, delta.lines); - else if (delta.action == "removeText") - this.insert(range.start, delta.text); - } - }; - this.indexToPosition = function(index, startRow) { - var lines = this.$lines || this.getAllLines(); - var newlineLength = this.getNewLineCharacter().length; - for (var i = startRow || 0, l = lines.length; i < l; i++) { - index -= lines[i].length + newlineLength; - if (index < 0) - return {row: i, column: index + lines[i].length + newlineLength}; - } - return {row: l-1, column: lines[l-1].length}; - }; - this.positionToIndex = function(pos, startRow) { - var lines = this.$lines || this.getAllLines(); - var newlineLength = this.getNewLineCharacter().length; - var index = 0; - var row = Math.min(pos.row, lines.length); - for (var i = startRow || 0; i < row; ++i) - index += lines[i].length + newlineLength; - - return index + pos.column; - }; - -}).call(Document.prototype); - -exports.Document = Document; -}); - -define('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) { - - -var oop = require("./lib/oop"); -var EventEmitter = require("./lib/event_emitter").EventEmitter; - -var Anchor = exports.Anchor = function(doc, row, column) { - this.$onChange = this.onChange.bind(this); - this.attach(doc); - - if (typeof column == "undefined") - this.setPosition(row.row, row.column); - else - this.setPosition(row, column); -}; - -(function() { - - oop.implement(this, EventEmitter); - this.getPosition = function() { - return this.$clipPositionToDocument(this.row, this.column); - }; - this.getDocument = function() { - return this.document; - }; - this.$insertRight = false; - this.onChange = function(e) { - var delta = e.data; - var range = delta.range; - - if (range.start.row == range.end.row && range.start.row != this.row) - return; - - if (range.start.row > this.row) - return; - - if (range.start.row == this.row && range.start.column > this.column) - return; - - var row = this.row; - var column = this.column; - var start = range.start; - var end = range.end; - - if (delta.action === "insertText") { - if (start.row === row && start.column <= column) { - if (start.column === column && this.$insertRight) { - } else if (start.row === end.row) { - column += end.column - start.column; - } else { - column -= start.column; - row += end.row - start.row; - } - } else if (start.row !== end.row && start.row < row) { - row += end.row - start.row; - } - } else if (delta.action === "insertLines") { - if (start.row === row && column === 0 && this.$insertRight) { - } - else if (start.row <= row) { - row += end.row - start.row; - } - } else if (delta.action === "removeText") { - if (start.row === row && start.column < column) { - if (end.column >= column) - column = start.column; - else - column = Math.max(0, column - (end.column - start.column)); - - } else if (start.row !== end.row && start.row < row) { - if (end.row === row) - column = Math.max(0, column - end.column) + start.column; - row -= (end.row - start.row); - } else if (end.row === row) { - row -= end.row - start.row; - column = Math.max(0, column - end.column) + start.column; - } - } else if (delta.action == "removeLines") { - if (start.row <= row) { - if (end.row <= row) - row -= end.row - start.row; - else { - row = start.row; - column = 0; - } - } - } - - this.setPosition(row, column, true); - }; - this.setPosition = function(row, column, noClip) { - var pos; - if (noClip) { - pos = { - row: row, - column: column - }; - } else { - pos = this.$clipPositionToDocument(row, column); - } - - if (this.row == pos.row && this.column == pos.column) - return; - - var old = { - row: this.row, - column: this.column - }; - - this.row = pos.row; - this.column = pos.column; - this._signal("change", { - old: old, - value: pos - }); - }; - this.detach = function() { - this.document.removeEventListener("change", this.$onChange); - }; - this.attach = function(doc) { - this.document = doc || this.document; - this.document.on("change", this.$onChange); - }; - this.$clipPositionToDocument = function(row, column) { - var pos = {}; - - if (row >= this.document.getLength()) { - pos.row = Math.max(0, this.document.getLength() - 1); - pos.column = this.document.getLine(pos.row).length; - } - else if (row < 0) { - pos.row = 0; - pos.column = 0; - } - else { - pos.row = row; - pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); - } - - if (column < 0) - pos.column = 0; - - return pos; - }; - -}).call(Anchor.prototype); - -}); - -define('ace/background_tokenizer', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) { - - -var oop = require("./lib/oop"); -var EventEmitter = require("./lib/event_emitter").EventEmitter; - -var BackgroundTokenizer = function(tokenizer, editor) { - this.running = false; - this.lines = []; - this.states = []; - this.currentLine = 0; - this.tokenizer = tokenizer; - - var self = this; - - this.$worker = function() { - if (!self.running) { return; } - - var workerStart = new Date(); - var currentLine = self.currentLine; - var endLine = -1; - var doc = self.doc; - - while (self.lines[currentLine]) - currentLine++; - - var startLine = currentLine; - - var len = doc.getLength(); - var processedLines = 0; - self.running = false; - while (currentLine < len) { - self.$tokenizeRow(currentLine); - endLine = currentLine; - do { - currentLine++; - } while (self.lines[currentLine]); - processedLines ++; - if ((processedLines % 5 == 0) && (new Date() - workerStart) > 20) { - self.running = setTimeout(self.$worker, 20); - self.currentLine = currentLine; - return; - } - } - self.currentLine = currentLine; - - if (startLine <= endLine) - self.fireUpdateEvent(startLine, endLine); - }; -}; - -(function(){ - - oop.implement(this, EventEmitter); - this.setTokenizer = function(tokenizer) { - this.tokenizer = tokenizer; - this.lines = []; - this.states = []; - - this.start(0); - }; - this.setDocument = function(doc) { - this.doc = doc; - this.lines = []; - this.states = []; - - this.stop(); - }; - this.fireUpdateEvent = function(firstRow, lastRow) { - var data = { - first: firstRow, - last: lastRow - }; - this._signal("update", {data: data}); - }; - this.start = function(startRow) { - this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength()); - this.lines.splice(this.currentLine, this.lines.length); - this.states.splice(this.currentLine, this.states.length); - - this.stop(); - this.running = setTimeout(this.$worker, 700); - }; - - this.scheduleStart = function() { - if (!this.running) - this.running = setTimeout(this.$worker, 700); - } - - this.$updateOnChange = function(delta) { - var range = delta.range; - var startRow = range.start.row; - var len = range.end.row - startRow; - - if (len === 0) { - this.lines[startRow] = null; - } else if (delta.action == "removeText" || delta.action == "removeLines") { - this.lines.splice(startRow, len + 1, null); - this.states.splice(startRow, len + 1, null); - } else { - var args = Array(len + 1); - args.unshift(startRow, 1); - this.lines.splice.apply(this.lines, args); - this.states.splice.apply(this.states, args); - } - - this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength()); - - this.stop(); - }; - this.stop = function() { - if (this.running) - clearTimeout(this.running); - this.running = false; - }; - this.getTokens = function(row) { - return this.lines[row] || this.$tokenizeRow(row); - }; - this.getState = function(row) { - if (this.currentLine == row) - this.$tokenizeRow(row); - return this.states[row] || "start"; - }; - - this.$tokenizeRow = function(row) { - var line = this.doc.getLine(row); - var state = this.states[row - 1]; - - var data = this.tokenizer.getLineTokens(line, state, row); - - if (this.states[row] + "" !== data.state + "") { - this.states[row] = data.state; - this.lines[row + 1] = null; - if (this.currentLine > row + 1) - this.currentLine = row + 1; - } else if (this.currentLine == row) { - this.currentLine = row + 1; - } - - return this.lines[row] = data.tokens; - }; - -}).call(BackgroundTokenizer.prototype); - -exports.BackgroundTokenizer = BackgroundTokenizer; -}); - -define('ace/search_highlight', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/range'], function(require, exports, module) { - - -var lang = require("./lib/lang"); -var oop = require("./lib/oop"); -var Range = require("./range").Range; - -var SearchHighlight = function(regExp, clazz, type) { - this.setRegexp(regExp); - this.clazz = clazz; - this.type = type || "text"; -}; - -(function() { - this.MAX_RANGES = 500; - - this.setRegexp = function(regExp) { - if (this.regExp+"" == regExp+"") - return; - this.regExp = regExp; - this.cache = []; - }; - - this.update = function(html, markerLayer, session, config) { - if (!this.regExp) - return; - var start = config.firstRow, end = config.lastRow; - - for (var i = start; i <= end; i++) { - var ranges = this.cache[i]; - if (ranges == null) { - ranges = lang.getMatchOffsets(session.getLine(i), this.regExp); - if (ranges.length > this.MAX_RANGES) - ranges = ranges.slice(0, this.MAX_RANGES); - ranges = ranges.map(function(match) { - return new Range(i, match.offset, i, match.offset + match.length); - }); - this.cache[i] = ranges.length ? ranges : ""; - } - - for (var j = ranges.length; j --; ) { - markerLayer.drawSingleLineMarker( - html, ranges[j].toScreenRange(session), this.clazz, config); - } - } - }; - -}).call(SearchHighlight.prototype); - -exports.SearchHighlight = SearchHighlight; -}); - -define('ace/edit_session/folding', ['require', 'exports', 'module' , 'ace/range', 'ace/edit_session/fold_line', 'ace/edit_session/fold', 'ace/token_iterator'], function(require, exports, module) { - - -var Range = require("../range").Range; -var FoldLine = require("./fold_line").FoldLine; -var Fold = require("./fold").Fold; -var TokenIterator = require("../token_iterator").TokenIterator; - -function Folding() { - this.getFoldAt = function(row, column, side) { - var foldLine = this.getFoldLine(row); - if (!foldLine) - return null; - - var folds = foldLine.folds; - for (var i = 0; i < folds.length; i++) { - var fold = folds[i]; - if (fold.range.contains(row, column)) { - if (side == 1 && fold.range.isEnd(row, column)) { - continue; - } else if (side == -1 && fold.range.isStart(row, column)) { - continue; - } - return fold; - } - } - }; - this.getFoldsInRange = function(range) { - var start = range.start; - var end = range.end; - var foldLines = this.$foldData; - var foundFolds = []; - - start.column += 1; - end.column -= 1; - - for (var i = 0; i < foldLines.length; i++) { - var cmp = foldLines[i].range.compareRange(range); - if (cmp == 2) { - continue; - } - else if (cmp == -2) { - break; - } - - var folds = foldLines[i].folds; - for (var j = 0; j < folds.length; j++) { - var fold = folds[j]; - cmp = fold.range.compareRange(range); - if (cmp == -2) { - break; - } else if (cmp == 2) { - continue; - } else - if (cmp == 42) { - break; - } - foundFolds.push(fold); - } - } - start.column -= 1; - end.column += 1; - - return foundFolds; - }; - - this.getFoldsInRangeList = function(ranges) { - if (Array.isArray(ranges)) { - var folds = []; - ranges.forEach(function(range) { - folds = folds.concat(this.getFoldsInRange(range)); - }, this); - } else { - var folds = this.getFoldsInRange(ranges); - } - return folds; - } - this.getAllFolds = function() { - var folds = []; - var foldLines = this.$foldData; - - for (var i = 0; i < foldLines.length; i++) - for (var j = 0; j < foldLines[i].folds.length; j++) - folds.push(foldLines[i].folds[j]); - - return folds; - }; - this.getFoldStringAt = function(row, column, trim, foldLine) { - foldLine = foldLine || this.getFoldLine(row); - if (!foldLine) - return null; - - var lastFold = { - end: { column: 0 } - }; - var str, fold; - for (var i = 0; i < foldLine.folds.length; i++) { - fold = foldLine.folds[i]; - var cmp = fold.range.compareEnd(row, column); - if (cmp == -1) { - str = this - .getLine(fold.start.row) - .substring(lastFold.end.column, fold.start.column); - break; - } - else if (cmp === 0) { - return null; - } - lastFold = fold; - } - if (!str) - str = this.getLine(fold.start.row).substring(lastFold.end.column); - - if (trim == -1) - return str.substring(0, column - lastFold.end.column); - else if (trim == 1) - return str.substring(column - lastFold.end.column); - else - return str; - }; - - this.getFoldLine = function(docRow, startFoldLine) { - var foldData = this.$foldData; - var i = 0; - if (startFoldLine) - i = foldData.indexOf(startFoldLine); - if (i == -1) - i = 0; - for (i; i < foldData.length; i++) { - var foldLine = foldData[i]; - if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) { - return foldLine; - } else if (foldLine.end.row > docRow) { - return null; - } - } - return null; - }; - this.getNextFoldLine = function(docRow, startFoldLine) { - var foldData = this.$foldData; - var i = 0; - if (startFoldLine) - i = foldData.indexOf(startFoldLine); - if (i == -1) - i = 0; - for (i; i < foldData.length; i++) { - var foldLine = foldData[i]; - if (foldLine.end.row >= docRow) { - return foldLine; - } - } - return null; - }; - - this.getFoldedRowCount = function(first, last) { - var foldData = this.$foldData, rowCount = last-first+1; - for (var i = 0; i < foldData.length; i++) { - var foldLine = foldData[i], - end = foldLine.end.row, - start = foldLine.start.row; - if (end >= last) { - if(start < last) { - if(start >= first) - rowCount -= last-start; - else - rowCount = 0;//in one fold - } - break; - } else if(end >= first){ - if (start >= first) //fold inside range - rowCount -= end-start; - else - rowCount -= end-first+1; - } - } - return rowCount; - }; - - this.$addFoldLine = function(foldLine) { - this.$foldData.push(foldLine); - this.$foldData.sort(function(a, b) { - return a.start.row - b.start.row; - }); - return foldLine; - }; - this.addFold = function(placeholder, range) { - var foldData = this.$foldData; - var added = false; - var fold; - - if (placeholder instanceof Fold) - fold = placeholder; - else { - fold = new Fold(range, placeholder); - fold.collapseChildren = range.collapseChildren; - } - this.$clipRangeToDocument(fold.range); - - var startRow = fold.start.row; - var startColumn = fold.start.column; - var endRow = fold.end.row; - var endColumn = fold.end.column; - if (!(startRow < endRow || - startRow == endRow && startColumn <= endColumn - 2)) - throw new Error("The range has to be at least 2 characters width"); - - var startFold = this.getFoldAt(startRow, startColumn, 1); - var endFold = this.getFoldAt(endRow, endColumn, -1); - if (startFold && endFold == startFold) - return startFold.addSubFold(fold); - - if ( - (startFold && !startFold.range.isStart(startRow, startColumn)) - || (endFold && !endFold.range.isEnd(endRow, endColumn)) - ) { - throw new Error("A fold can't intersect already existing fold" + fold.range + startFold.range); - } - var folds = this.getFoldsInRange(fold.range); - if (folds.length > 0) { - this.removeFolds(folds); - folds.forEach(function(subFold) { - fold.addSubFold(subFold); - }); - } - - for (var i = 0; i < foldData.length; i++) { - var foldLine = foldData[i]; - if (endRow == foldLine.start.row) { - foldLine.addFold(fold); - added = true; - break; - } else if (startRow == foldLine.end.row) { - foldLine.addFold(fold); - added = true; - if (!fold.sameRow) { - var foldLineNext = foldData[i + 1]; - if (foldLineNext && foldLineNext.start.row == endRow) { - foldLine.merge(foldLineNext); - break; - } - } - break; - } else if (endRow <= foldLine.start.row) { - break; - } - } - - if (!added) - foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold)); - - if (this.$useWrapMode) - this.$updateWrapData(foldLine.start.row, foldLine.start.row); - else - this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row); - this.$modified = true; - this._emit("changeFold", { data: fold, action: "add" }); - - return fold; - }; - - this.addFolds = function(folds) { - folds.forEach(function(fold) { - this.addFold(fold); - }, this); - }; - - this.removeFold = function(fold) { - var foldLine = fold.foldLine; - var startRow = foldLine.start.row; - var endRow = foldLine.end.row; - - var foldLines = this.$foldData; - var folds = foldLine.folds; - if (folds.length == 1) { - foldLines.splice(foldLines.indexOf(foldLine), 1); - } else - if (foldLine.range.isEnd(fold.end.row, fold.end.column)) { - folds.pop(); - foldLine.end.row = folds[folds.length - 1].end.row; - foldLine.end.column = folds[folds.length - 1].end.column; - } else - if (foldLine.range.isStart(fold.start.row, fold.start.column)) { - folds.shift(); - foldLine.start.row = folds[0].start.row; - foldLine.start.column = folds[0].start.column; - } else - if (fold.sameRow) { - folds.splice(folds.indexOf(fold), 1); - } else - { - var newFoldLine = foldLine.split(fold.start.row, fold.start.column); - folds = newFoldLine.folds; - folds.shift(); - newFoldLine.start.row = folds[0].start.row; - newFoldLine.start.column = folds[0].start.column; - } - - if (!this.$updating) { - if (this.$useWrapMode) - this.$updateWrapData(startRow, endRow); - else - this.$updateRowLengthCache(startRow, endRow); - } - this.$modified = true; - this._emit("changeFold", { data: fold, action: "remove" }); - }; - - this.removeFolds = function(folds) { - var cloneFolds = []; - for (var i = 0; i < folds.length; i++) { - cloneFolds.push(folds[i]); - } - - cloneFolds.forEach(function(fold) { - this.removeFold(fold); - }, this); - this.$modified = true; - }; - - this.expandFold = function(fold) { - this.removeFold(fold); - fold.subFolds.forEach(function(subFold) { - fold.restoreRange(subFold); - this.addFold(subFold); - }, this); - if (fold.collapseChildren > 0) { - this.foldAll(fold.start.row+1, fold.end.row, fold.collapseChildren-1); - } - fold.subFolds = []; - }; - - this.expandFolds = function(folds) { - folds.forEach(function(fold) { - this.expandFold(fold); - }, this); - }; - - this.unfold = function(location, expandInner) { - var range, folds; - if (location == null) { - range = new Range(0, 0, this.getLength(), 0); - expandInner = true; - } else if (typeof location == "number") - range = new Range(location, 0, location, this.getLine(location).length); - else if ("row" in location) - range = Range.fromPoints(location, location); - else - range = location; - - folds = this.getFoldsInRangeList(range); - if (expandInner) { - this.removeFolds(folds); - } else { - var subFolds = folds; - while (subFolds.length) { - this.expandFolds(subFolds); - subFolds = this.getFoldsInRangeList(range); - } - } - if (folds.length) - return folds; - }; - this.isRowFolded = function(docRow, startFoldRow) { - return !!this.getFoldLine(docRow, startFoldRow); - }; - - this.getRowFoldEnd = function(docRow, startFoldRow) { - var foldLine = this.getFoldLine(docRow, startFoldRow); - return foldLine ? foldLine.end.row : docRow; - }; - - this.getRowFoldStart = function(docRow, startFoldRow) { - var foldLine = this.getFoldLine(docRow, startFoldRow); - return foldLine ? foldLine.start.row : docRow; - }; - - this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) { - if (startRow == null) { - startRow = foldLine.start.row; - startColumn = 0; - } - - if (endRow == null) { - endRow = foldLine.end.row; - endColumn = this.getLine(endRow).length; - } - var doc = this.doc; - var textLine = ""; - - foldLine.walk(function(placeholder, row, column, lastColumn) { - if (row < startRow) - return; - if (row == startRow) { - if (column < startColumn) - return; - lastColumn = Math.max(startColumn, lastColumn); - } - - if (placeholder != null) { - textLine += placeholder; - } else { - textLine += doc.getLine(row).substring(lastColumn, column); - } - }, endRow, endColumn); - return textLine; - }; - - this.getDisplayLine = function(row, endColumn, startRow, startColumn) { - var foldLine = this.getFoldLine(row); - - if (!foldLine) { - var line; - line = this.doc.getLine(row); - return line.substring(startColumn || 0, endColumn || line.length); - } else { - return this.getFoldDisplayLine( - foldLine, row, endColumn, startRow, startColumn); - } - }; - - this.$cloneFoldData = function() { - var fd = []; - fd = this.$foldData.map(function(foldLine) { - var folds = foldLine.folds.map(function(fold) { - return fold.clone(); - }); - return new FoldLine(fd, folds); - }); - - return fd; - }; - - this.toggleFold = function(tryToUnfold) { - var selection = this.selection; - var range = selection.getRange(); - var fold; - var bracketPos; - - if (range.isEmpty()) { - var cursor = range.start; - fold = this.getFoldAt(cursor.row, cursor.column); - - if (fold) { - this.expandFold(fold); - return; - } else if (bracketPos = this.findMatchingBracket(cursor)) { - if (range.comparePoint(bracketPos) == 1) { - range.end = bracketPos; - } else { - range.start = bracketPos; - range.start.column++; - range.end.column--; - } - } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) { - if (range.comparePoint(bracketPos) == 1) - range.end = bracketPos; - else - range.start = bracketPos; - - range.start.column++; - } else { - range = this.getCommentFoldRange(cursor.row, cursor.column) || range; - } - } else { - var folds = this.getFoldsInRange(range); - if (tryToUnfold && folds.length) { - this.expandFolds(folds); - return; - } else if (folds.length == 1 ) { - fold = folds[0]; - } - } - - if (!fold) - fold = this.getFoldAt(range.start.row, range.start.column); - - if (fold && fold.range.toString() == range.toString()) { - this.expandFold(fold); - return; - } - - var placeholder = "..."; - if (!range.isMultiLine()) { - placeholder = this.getTextRange(range); - if(placeholder.length < 4) - return; - placeholder = placeholder.trim().substring(0, 2) + ".."; - } - - this.addFold(placeholder, range); - }; - - this.getCommentFoldRange = function(row, column, dir) { - var iterator = new TokenIterator(this, row, column); - var token = iterator.getCurrentToken(); - if (token && /^comment|string/.test(token.type)) { - var range = new Range(); - var re = new RegExp(token.type.replace(/\..*/, "\\.")); - if (dir != 1) { - do { - token = iterator.stepBackward(); - } while(token && re.test(token.type)); - iterator.stepForward(); - } - - range.start.row = iterator.getCurrentTokenRow(); - range.start.column = iterator.getCurrentTokenColumn() + 2; - - iterator = new TokenIterator(this, row, column); - - if (dir != -1) { - do { - token = iterator.stepForward(); - } while(token && re.test(token.type)); - token = iterator.stepBackward(); - } else - token = iterator.getCurrentToken(); - - range.end.row = iterator.getCurrentTokenRow(); - range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 2; - return range; - } - }; - - this.foldAll = function(startRow, endRow, depth) { - if (depth == undefined) - depth = 100000; // JSON.stringify doesn't hanle Infinity - var foldWidgets = this.foldWidgets; - if (!foldWidgets) - return; // mode doesn't support folding - endRow = endRow || this.getLength(); - startRow = startRow || 0; - for (var row = startRow; row < endRow; row++) { - if (foldWidgets[row] == null) - foldWidgets[row] = this.getFoldWidget(row); - if (foldWidgets[row] != "start") - continue; - - var range = this.getFoldWidgetRange(row); - if (range && range.isMultiLine() - && range.end.row <= endRow - && range.start.row >= startRow - ) { - row = range.end.row; - try { - var fold = this.addFold("...", range); - if (fold) - fold.collapseChildren = depth; - } catch(e) {} - } - } - }; - this.$foldStyles = { - "manual": 1, - "markbegin": 1, - "markbeginend": 1 - }; - this.$foldStyle = "markbegin"; - this.setFoldStyle = function(style) { - if (!this.$foldStyles[style]) - throw new Error("invalid fold style: " + style + "[" + Object.keys(this.$foldStyles).join(", ") + "]"); - - if (this.$foldStyle == style) - return; - - this.$foldStyle = style; - - if (style == "manual") - this.unfold(); - var mode = this.$foldMode; - this.$setFolding(null); - this.$setFolding(mode); - }; - - this.$setFolding = function(foldMode) { - if (this.$foldMode == foldMode) - return; - - this.$foldMode = foldMode; - - this.removeListener('change', this.$updateFoldWidgets); - this._emit("changeAnnotation"); - - if (!foldMode || this.$foldStyle == "manual") { - this.foldWidgets = null; - return; - } - - this.foldWidgets = []; - this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle); - this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle); - - this.$updateFoldWidgets = this.updateFoldWidgets.bind(this); - this.on('change', this.$updateFoldWidgets); - - }; - - this.getParentFoldRangeData = function (row, ignoreCurrent) { - var fw = this.foldWidgets; - if (!fw || (ignoreCurrent && fw[row])) - return {}; - - var i = row - 1, firstRange; - while (i >= 0) { - var c = fw[i]; - if (c == null) - c = fw[i] = this.getFoldWidget(i); - - if (c == "start") { - var range = this.getFoldWidgetRange(i); - if (!firstRange) - firstRange = range; - if (range && range.end.row >= row) - break; - } - i--; - } - - return { - range: i !== -1 && range, - firstRange: firstRange - }; - } - - this.onFoldWidgetClick = function(row, e) { - e = e.domEvent; - var options = { - children: e.shiftKey, - all: e.ctrlKey || e.metaKey, - siblings: e.altKey - }; - - var range = this.$toggleFoldWidget(row, options); - if (!range) { - var el = (e.target || e.srcElement) - if (el && /ace_fold-widget/.test(el.className)) - el.className += " ace_invalid"; - } - }; - - this.$toggleFoldWidget = function(row, options) { - if (!this.getFoldWidget) - return; - var type = this.getFoldWidget(row); - var line = this.getLine(row); - - var dir = type === "end" ? -1 : 1; - var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir); - - if (fold) { - if (options.children || options.all) - this.removeFold(fold); - else - this.expandFold(fold); - return; - } - - var range = this.getFoldWidgetRange(row, true); - if (range && !range.isMultiLine()) { - fold = this.getFoldAt(range.start.row, range.start.column, 1); - if (fold && range.isEqual(fold.range)) { - this.removeFold(fold); - return; - } - } - - if (options.siblings) { - var data = this.getParentFoldRangeData(row); - if (data.range) { - var startRow = data.range.start.row + 1; - var endRow = data.range.end.row; - } - this.foldAll(startRow, endRow, options.all ? 10000 : 0); - } else if (options.children) { - endRow = range ? range.end.row : this.getLength(); - this.foldAll(row + 1, range.end.row, options.all ? 10000 : 0); - } else if (range) { - if (options.all) - range.collapseChildren = 10000; - this.addFold("...", range); - } - - return range; - }; - - - - this.toggleFoldWidget = function(toggleParent) { - var row = this.selection.getCursor().row; - row = this.getRowFoldStart(row); - var range = this.$toggleFoldWidget(row, {}); - - if (range) - return; - var data = this.getParentFoldRangeData(row, true); - range = data.range || data.firstRange; - - if (range) { - row = range.start.row; - var fold = this.getFoldAt(row, this.getLine(row).length, 1); - - if (fold) { - this.removeFold(fold); - } else { - this.addFold("...", range); - } - } - }; - - this.updateFoldWidgets = function(e) { - var delta = e.data; - var range = delta.range; - var firstRow = range.start.row; - var len = range.end.row - firstRow; - - if (len === 0) { - this.foldWidgets[firstRow] = null; - } else if (delta.action == "removeText" || delta.action == "removeLines") { - this.foldWidgets.splice(firstRow, len + 1, null); - } else { - var args = Array(len + 1); - args.unshift(firstRow, 1); - this.foldWidgets.splice.apply(this.foldWidgets, args); - } - }; - -} - -exports.Folding = Folding; - -}); - -define('ace/edit_session/fold_line', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { - - -var Range = require("../range").Range; -function FoldLine(foldData, folds) { - this.foldData = foldData; - if (Array.isArray(folds)) { - this.folds = folds; - } else { - folds = this.folds = [ folds ]; - } - - var last = folds[folds.length - 1] - this.range = new Range(folds[0].start.row, folds[0].start.column, - last.end.row, last.end.column); - this.start = this.range.start; - this.end = this.range.end; - - this.folds.forEach(function(fold) { - fold.setFoldLine(this); - }, this); -} - -(function() { - this.shiftRow = function(shift) { - this.start.row += shift; - this.end.row += shift; - this.folds.forEach(function(fold) { - fold.start.row += shift; - fold.end.row += shift; - }); - } - - this.addFold = function(fold) { - if (fold.sameRow) { - if (fold.start.row < this.startRow || fold.endRow > this.endRow) { - throw new Error("Can't add a fold to this FoldLine as it has no connection"); - } - this.folds.push(fold); - this.folds.sort(function(a, b) { - return -a.range.compareEnd(b.start.row, b.start.column); - }); - if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) { - this.end.row = fold.end.row; - this.end.column = fold.end.column; - } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) { - this.start.row = fold.start.row; - this.start.column = fold.start.column; - } - } else if (fold.start.row == this.end.row) { - this.folds.push(fold); - this.end.row = fold.end.row; - this.end.column = fold.end.column; - } else if (fold.end.row == this.start.row) { - this.folds.unshift(fold); - this.start.row = fold.start.row; - this.start.column = fold.start.column; - } else { - throw new Error("Trying to add fold to FoldRow that doesn't have a matching row"); - } - fold.foldLine = this; - } - - this.containsRow = function(row) { - return row >= this.start.row && row <= this.end.row; - } - - this.walk = function(callback, endRow, endColumn) { - var lastEnd = 0, - folds = this.folds, - fold, - comp, stop, isNewRow = true; - - if (endRow == null) { - endRow = this.end.row; - endColumn = this.end.column; - } - - for (var i = 0; i < folds.length; i++) { - fold = folds[i]; - - comp = fold.range.compareStart(endRow, endColumn); - if (comp == -1) { - callback(null, endRow, endColumn, lastEnd, isNewRow); - return; - } - - stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow); - stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd); - if (stop || comp == 0) { - return; - } - isNewRow = !fold.sameRow; - lastEnd = fold.end.column; - } - callback(null, endRow, endColumn, lastEnd, isNewRow); - } - - this.getNextFoldTo = function(row, column) { - var fold, cmp; - for (var i = 0; i < this.folds.length; i++) { - fold = this.folds[i]; - cmp = fold.range.compareEnd(row, column); - if (cmp == -1) { - return { - fold: fold, - kind: "after" - }; - } else if (cmp == 0) { - return { - fold: fold, - kind: "inside" - } - } - } - return null; - } - - this.addRemoveChars = function(row, column, len) { - var ret = this.getNextFoldTo(row, column), - fold, folds; - if (ret) { - fold = ret.fold; - if (ret.kind == "inside" - && fold.start.column != column - && fold.start.row != row) - { - window.console && window.console.log(row, column, fold); - } else if (fold.start.row == row) { - folds = this.folds; - var i = folds.indexOf(fold); - if (i == 0) { - this.start.column += len; - } - for (i; i < folds.length; i++) { - fold = folds[i]; - fold.start.column += len; - if (!fold.sameRow) { - return; - } - fold.end.column += len; - } - this.end.column += len; - } - } - } - - this.split = function(row, column) { - var fold = this.getNextFoldTo(row, column).fold; - var folds = this.folds; - var foldData = this.foldData; - - if (!fold) - return null; - - var i = folds.indexOf(fold); - var foldBefore = folds[i - 1]; - this.end.row = foldBefore.end.row; - this.end.column = foldBefore.end.column; - folds = folds.splice(i, folds.length - i); - - var newFoldLine = new FoldLine(foldData, folds); - foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine); - return newFoldLine; - } - - this.merge = function(foldLineNext) { - var folds = foldLineNext.folds; - for (var i = 0; i < folds.length; i++) { - this.addFold(folds[i]); - } - var foldData = this.foldData; - foldData.splice(foldData.indexOf(foldLineNext), 1); - } - - this.toString = function() { - var ret = [this.range.toString() + ": [" ]; - - this.folds.forEach(function(fold) { - ret.push(" " + fold.toString()); - }); - ret.push("]") - return ret.join("\n"); - } - - this.idxToPosition = function(idx) { - var lastFoldEndColumn = 0; - var fold; - - for (var i = 0; i < this.folds.length; i++) { - var fold = this.folds[i]; - - idx -= fold.start.column - lastFoldEndColumn; - if (idx < 0) { - return { - row: fold.start.row, - column: fold.start.column + idx - }; - } - - idx -= fold.placeholder.length; - if (idx < 0) { - return fold.start; - } - - lastFoldEndColumn = fold.end.column; - } - - return { - row: this.end.row, - column: this.end.column + idx - }; - } -}).call(FoldLine.prototype); - -exports.FoldLine = FoldLine; -}); - -define('ace/edit_session/fold', ['require', 'exports', 'module' , 'ace/range', 'ace/range_list', 'ace/lib/oop'], function(require, exports, module) { - - -var Range = require("../range").Range; -var RangeList = require("../range_list").RangeList; -var oop = require("../lib/oop") -var Fold = exports.Fold = function(range, placeholder) { - this.foldLine = null; - this.placeholder = placeholder; - this.range = range; - this.start = range.start; - this.end = range.end; - - this.sameRow = range.start.row == range.end.row; - this.subFolds = this.ranges = []; -}; - -oop.inherits(Fold, RangeList); - -(function() { - - this.toString = function() { - return '"' + this.placeholder + '" ' + this.range.toString(); - }; - - this.setFoldLine = function(foldLine) { - this.foldLine = foldLine; - this.subFolds.forEach(function(fold) { - fold.setFoldLine(foldLine); - }); - }; - - this.clone = function() { - var range = this.range.clone(); - var fold = new Fold(range, this.placeholder); - this.subFolds.forEach(function(subFold) { - fold.subFolds.push(subFold.clone()); - }); - fold.collapseChildren = this.collapseChildren; - return fold; - }; - - this.addSubFold = function(fold) { - if (this.range.isEqual(fold)) - return; - - if (!this.range.containsRange(fold)) - throw new Error("A fold can't intersect already existing fold" + fold.range + this.range); - consumeRange(fold, this.start); - - var row = fold.start.row, column = fold.start.column; - for (var i = 0, cmp = -1; i < this.subFolds.length; i++) { - cmp = this.subFolds[i].range.compare(row, column); - if (cmp != 1) - break; - } - var afterStart = this.subFolds[i]; - - if (cmp == 0) - return afterStart.addSubFold(fold); - var row = fold.range.end.row, column = fold.range.end.column; - for (var j = i, cmp = -1; j < this.subFolds.length; j++) { - cmp = this.subFolds[j].range.compare(row, column); - if (cmp != 1) - break; - } - var afterEnd = this.subFolds[j]; - - if (cmp == 0) - throw new Error("A fold can't intersect already existing fold" + fold.range + this.range); - - var consumedFolds = this.subFolds.splice(i, j - i, fold); - fold.setFoldLine(this.foldLine); - - return fold; - }; - - this.restoreRange = function(range) { - return restoreRange(range, this.start); - }; - -}).call(Fold.prototype); - -function consumePoint(point, anchor) { - point.row -= anchor.row; - if (point.row == 0) - point.column -= anchor.column; -} -function consumeRange(range, anchor) { - consumePoint(range.start, anchor); - consumePoint(range.end, anchor); -} -function restorePoint(point, anchor) { - if (point.row == 0) - point.column += anchor.column; - point.row += anchor.row; -} -function restoreRange(range, anchor) { - restorePoint(range.start, anchor); - restorePoint(range.end, anchor); -} - -}); - -define('ace/range_list', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { - -var Range = require("./range").Range; -var comparePoints = Range.comparePoints; - -var RangeList = function() { - this.ranges = []; -}; - -(function() { - this.comparePoints = comparePoints; - - this.pointIndex = function(pos, excludeEdges, startIndex) { - var list = this.ranges; - - for (var i = startIndex || 0; i < list.length; i++) { - var range = list[i]; - var cmpEnd = comparePoints(pos, range.end); - if (cmpEnd > 0) - continue; - var cmpStart = comparePoints(pos, range.start); - if (cmpEnd === 0) - return excludeEdges && cmpStart !== 0 ? -i-2 : i; - if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges)) - return i; - - return -i-1; - } - return -i - 1; - }; - - this.add = function(range) { - var excludeEdges = !range.isEmpty(); - var startIndex = this.pointIndex(range.start, excludeEdges); - if (startIndex < 0) - startIndex = -startIndex - 1; - - var endIndex = this.pointIndex(range.end, excludeEdges, startIndex); - - if (endIndex < 0) - endIndex = -endIndex - 1; - else - endIndex++; - return this.ranges.splice(startIndex, endIndex - startIndex, range); - }; - - this.addList = function(list) { - var removed = []; - for (var i = list.length; i--; ) { - removed.push.call(removed, this.add(list[i])); - } - return removed; - }; - - this.substractPoint = function(pos) { - var i = this.pointIndex(pos); - - if (i >= 0) - return this.ranges.splice(i, 1); - }; - this.merge = function() { - var removed = []; - var list = this.ranges; - - list = list.sort(function(a, b) { - return comparePoints(a.start, b.start); - }); - - var next = list[0], range; - for (var i = 1; i < list.length; i++) { - range = next; - next = list[i]; - var cmp = comparePoints(range.end, next.start); - if (cmp < 0) - continue; - - if (cmp == 0 && !range.isEmpty() && !next.isEmpty()) - continue; - - if (comparePoints(range.end, next.end) < 0) { - range.end.row = next.end.row; - range.end.column = next.end.column; - } - - list.splice(i, 1); - removed.push(next); - next = range; - i--; - } - - this.ranges = list; - - return removed; - }; - - this.contains = function(row, column) { - return this.pointIndex({row: row, column: column}) >= 0; - }; - - this.containsPoint = function(pos) { - return this.pointIndex(pos) >= 0; - }; - - this.rangeAtPoint = function(pos) { - var i = this.pointIndex(pos); - if (i >= 0) - return this.ranges[i]; - }; - - - this.clipRows = function(startRow, endRow) { - var list = this.ranges; - if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow) - return []; - - var startIndex = this.pointIndex({row: startRow, column: 0}); - if (startIndex < 0) - startIndex = -startIndex - 1; - var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex); - if (endIndex < 0) - endIndex = -endIndex - 1; - - var clipped = []; - for (var i = startIndex; i < endIndex; i++) { - clipped.push(list[i]); - } - return clipped; - }; - - this.removeAll = function() { - return this.ranges.splice(0, this.ranges.length); - }; - - this.attach = function(session) { - if (this.session) - this.detach(); - - this.session = session; - this.onChange = this.$onChange.bind(this); - - this.session.on('change', this.onChange); - }; - - this.detach = function() { - if (!this.session) - return; - this.session.removeListener('change', this.onChange); - this.session = null; - }; - - this.$onChange = function(e) { - var changeRange = e.data.range; - if (e.data.action[0] == "i"){ - var start = changeRange.start; - var end = changeRange.end; - } else { - var end = changeRange.start; - var start = changeRange.end; - } - var startRow = start.row; - var endRow = end.row; - var lineDif = endRow - startRow; - - var colDiff = -start.column + end.column; - var ranges = this.ranges; - - for (var i = 0, n = ranges.length; i < n; i++) { - var r = ranges[i]; - if (r.end.row < startRow) - continue; - if (r.start.row > startRow) - break; - - if (r.start.row == startRow && r.start.column >= start.column ) { - if (r.start.column == start.column && this.$insertRight) { - } else { - r.start.column += colDiff; - r.start.row += lineDif; - } - } - if (r.end.row == startRow && r.end.column >= start.column) { - if (r.end.column == start.column && this.$insertRight) { - continue; - } - if (r.end.column == start.column && colDiff > 0 && i < n - 1) { - if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column) - r.end.column -= colDiff; - } - r.end.column += colDiff; - r.end.row += lineDif; - } - } - - if (lineDif != 0 && i < n) { - for (; i < n; i++) { - var r = ranges[i]; - r.start.row += lineDif; - r.end.row += lineDif; - } - } - }; - -}).call(RangeList.prototype); - -exports.RangeList = RangeList; -}); - -define('ace/edit_session/bracket_match', ['require', 'exports', 'module' , 'ace/token_iterator', 'ace/range'], function(require, exports, module) { - - -var TokenIterator = require("../token_iterator").TokenIterator; -var Range = require("../range").Range; - - -function BracketMatch() { - - this.findMatchingBracket = function(position, chr) { - if (position.column == 0) return null; - - var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1); - if (charBeforeCursor == "") return null; - - var match = charBeforeCursor.match(/([\(\[\{])|([\)\]\}])/); - if (!match) - return null; - - if (match[1]) - return this.$findClosingBracket(match[1], position); - else - return this.$findOpeningBracket(match[2], position); - }; - - this.getBracketRange = function(pos) { - var line = this.getLine(pos.row); - var before = true, range; - - var chr = line.charAt(pos.column-1); - var match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); - if (!match) { - chr = line.charAt(pos.column); - pos = {row: pos.row, column: pos.column + 1}; - match = chr && chr.match(/([\(\[\{])|([\)\]\}])/); - before = false; - } - if (!match) - return null; - - if (match[1]) { - var bracketPos = this.$findClosingBracket(match[1], pos); - if (!bracketPos) - return null; - range = Range.fromPoints(pos, bracketPos); - if (!before) { - range.end.column++; - range.start.column--; - } - range.cursor = range.end; - } else { - var bracketPos = this.$findOpeningBracket(match[2], pos); - if (!bracketPos) - return null; - range = Range.fromPoints(bracketPos, pos); - if (!before) { - range.start.column++; - range.end.column--; - } - range.cursor = range.start; - } - - return range; - }; - - this.$brackets = { - ")": "(", - "(": ")", - "]": "[", - "[": "]", - "{": "}", - "}": "{" - }; - - this.$findOpeningBracket = function(bracket, position, typeRe) { - var openBracket = this.$brackets[bracket]; - var depth = 1; - - var iterator = new TokenIterator(this, position.row, position.column); - var token = iterator.getCurrentToken(); - if (!token) - token = iterator.stepForward(); - if (!token) - return; - - if (!typeRe){ - typeRe = new RegExp( - "(\\.?" + - token.type.replace(".", "\\.").replace("rparen", ".paren") - + ")+" - ); - } - var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2; - var value = token.value; - - while (true) { - - while (valueIndex >= 0) { - var chr = value.charAt(valueIndex); - if (chr == openBracket) { - depth -= 1; - if (depth == 0) { - return {row: iterator.getCurrentTokenRow(), - column: valueIndex + iterator.getCurrentTokenColumn()}; - } - } - else if (chr == bracket) { - depth += 1; - } - valueIndex -= 1; - } - do { - token = iterator.stepBackward(); - } while (token && !typeRe.test(token.type)); - - if (token == null) - break; - - value = token.value; - valueIndex = value.length - 1; - } - - return null; - }; - - this.$findClosingBracket = function(bracket, position, typeRe) { - var closingBracket = this.$brackets[bracket]; - var depth = 1; - - var iterator = new TokenIterator(this, position.row, position.column); - var token = iterator.getCurrentToken(); - if (!token) - token = iterator.stepForward(); - if (!token) - return; - - if (!typeRe){ - typeRe = new RegExp( - "(\\.?" + - token.type.replace(".", "\\.").replace("lparen", ".paren") - + ")+" - ); - } - var valueIndex = position.column - iterator.getCurrentTokenColumn(); - - while (true) { - - var value = token.value; - var valueLength = value.length; - while (valueIndex < valueLength) { - var chr = value.charAt(valueIndex); - if (chr == closingBracket) { - depth -= 1; - if (depth == 0) { - return {row: iterator.getCurrentTokenRow(), - column: valueIndex + iterator.getCurrentTokenColumn()}; - } - } - else if (chr == bracket) { - depth += 1; - } - valueIndex += 1; - } - do { - token = iterator.stepForward(); - } while (token && !typeRe.test(token.type)); - - if (token == null) - break; - - valueIndex = 0; - } - - return null; - }; -} -exports.BracketMatch = BracketMatch; - -}); - -define('ace/search', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/range'], function(require, exports, module) { - +define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"], function(require, exports, module) { +"use strict"; var lang = require("./lib/lang"); var oop = require("./lib/oop"); @@ -11328,8 +10347,8 @@ var Search = function() { this.$options = options; }; this.find = function(session) { - var iterator = this.$matchIterator(session, this.$options); - + var options = this.$options; + var iterator = this.$matchIterator(session, options); if (!iterator) return false; @@ -11337,7 +10356,13 @@ var Search = function() { iterator.forEach(function(range, row, offset) { if (!range.start) { var column = range.offset + (offset || 0); - firstRange = new Range(row, column, row, column+range.length); + firstRange = new Range(row, column, row, column + range.length); + if (!range.length && options.start && options.start.start + && options.skipCurrent != false && firstRange.isEqual(options.start) + ) { + firstRange = null; + return false; + } } else firstRange = range; return true; @@ -11447,8 +10472,7 @@ var Search = function() { if (!re) return false; - var self = this, callback, backwards = options.backwards; - + var callback; if (options.$isMultiLine) { var len = re.length; var matchIterator = function(line, row, offset) { @@ -11473,7 +10497,7 @@ var Search = function() { if (callback(range)) return true; }; - } else if (backwards) { + } else if (options.backwards) { var matchIterator = function(line, row, startIndex) { var matches = lang.getMatchOffsets(line, re); for (var i = matches.length-1; i >= 0; i--) @@ -11488,11 +10512,13 @@ var Search = function() { return true; }; } + + var lineIterator = this.$lineIterator(session, options); return { forEach: function(_callback) { callback = _callback; - self.$lineIterator(session, options).forEach(matchIterator); + lineIterator.forEach(matchIterator); } }; }; @@ -11510,9 +10536,9 @@ var Search = function() { needle = lang.escapeRegExp(needle); if (options.wholeWord) - needle = "\\b" + needle + "\\b"; + needle = addWordBoundary(needle, options); - var modifier = options.caseSensitive ? "g" : "gi"; + var modifier = options.caseSensitive ? "gm" : "gmi"; options.$isMultiLine = !$disableFakeMultiline && /[\n\r]/.test(needle); if (options.$isMultiLine) @@ -11599,31 +10625,270 @@ var Search = function() { }).call(Search.prototype); +function addWordBoundary(needle, options) { + function wordBoundary(c) { + if (/\w/.test(c) || options.regExp) return "\\b"; + return ""; + } + return wordBoundary(needle[0]) + needle + + wordBoundary(needle[needle.length - 1]); +} + exports.Search = Search; }); -define('ace/commands/command_manager', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/keyboard/hash_handler', 'ace/lib/event_emitter'], function(require, exports, module) { +define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"], function(require, exports, module) { +"use strict"; + +var keyUtil = require("../lib/keys"); +var useragent = require("../lib/useragent"); +var KEY_MODS = keyUtil.KEY_MODS; + +function HashHandler(config, platform) { + this.platform = platform || (useragent.isMac ? "mac" : "win"); + this.commands = {}; + this.commandKeyBinding = {}; + this.addCommands(config); + this.$singleCommand = true; +} + +function MultiHashHandler(config, platform) { + HashHandler.call(this, config, platform); + this.$singleCommand = false; +} + +MultiHashHandler.prototype = HashHandler.prototype; + +(function() { + + + this.addCommand = function(command) { + if (this.commands[command.name]) + this.removeCommand(command); + + this.commands[command.name] = command; + + if (command.bindKey) + this._buildKeyHash(command); + }; + + this.removeCommand = function(command, keepCommand) { + var name = command && (typeof command === 'string' ? command : command.name); + command = this.commands[name]; + if (!keepCommand) + delete this.commands[name]; + var ckb = this.commandKeyBinding; + for (var keyId in ckb) { + var cmdGroup = ckb[keyId]; + if (cmdGroup == command) { + delete ckb[keyId]; + } else if (Array.isArray(cmdGroup)) { + var i = cmdGroup.indexOf(command); + if (i != -1) { + cmdGroup.splice(i, 1); + if (cmdGroup.length == 1) + ckb[keyId] = cmdGroup[0]; + } + } + } + }; + + this.bindKey = function(key, command, position) { + if (typeof key == "object" && key) { + if (position == undefined) + position = key.position; + key = key[this.platform]; + } + if (!key) + return; + if (typeof command == "function") + return this.addCommand({exec: command, bindKey: key, name: command.name || key}); + + key.split("|").forEach(function(keyPart) { + var chain = ""; + if (keyPart.indexOf(" ") != -1) { + var parts = keyPart.split(/\s+/); + keyPart = parts.pop(); + parts.forEach(function(keyPart) { + var binding = this.parseKeys(keyPart); + var id = KEY_MODS[binding.hashId] + binding.key; + chain += (chain ? " " : "") + id; + this._addCommandToBinding(chain, "chainKeys"); + }, this); + chain += " "; + } + var binding = this.parseKeys(keyPart); + var id = KEY_MODS[binding.hashId] + binding.key; + this._addCommandToBinding(chain + id, command, position); + }, this); + }; + + function getPosition(command) { + return typeof command == "object" && command.bindKey + && command.bindKey.position || 0; + } + this._addCommandToBinding = function(keyId, command, position) { + var ckb = this.commandKeyBinding, i; + if (!command) { + delete ckb[keyId]; + } else if (!ckb[keyId] || this.$singleCommand) { + ckb[keyId] = command; + } else { + if (!Array.isArray(ckb[keyId])) { + ckb[keyId] = [ckb[keyId]]; + } else if ((i = ckb[keyId].indexOf(command)) != -1) { + ckb[keyId].splice(i, 1); + } + + if (typeof position != "number") { + if (position || command.isDefault) + position = -100; + else + position = getPosition(command); + } + var commands = ckb[keyId]; + for (i = 0; i < commands.length; i++) { + var other = commands[i]; + var otherPos = getPosition(other); + if (otherPos > position) + break; + } + commands.splice(i, 0, command); + } + }; + + this.addCommands = function(commands) { + commands && Object.keys(commands).forEach(function(name) { + var command = commands[name]; + if (!command) + return; + + if (typeof command === "string") + return this.bindKey(command, name); + + if (typeof command === "function") + command = { exec: command }; + + if (typeof command !== "object") + return; + + if (!command.name) + command.name = name; + + this.addCommand(command); + }, this); + }; + + this.removeCommands = function(commands) { + Object.keys(commands).forEach(function(name) { + this.removeCommand(commands[name]); + }, this); + }; + + this.bindKeys = function(keyList) { + Object.keys(keyList).forEach(function(key) { + this.bindKey(key, keyList[key]); + }, this); + }; + + this._buildKeyHash = function(command) { + this.bindKey(command.bindKey, command); + }; + this.parseKeys = function(keys) { + var parts = keys.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(x){return x}); + var key = parts.pop(); + + var keyCode = keyUtil[key]; + if (keyUtil.FUNCTION_KEYS[keyCode]) + key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase(); + else if (!parts.length) + return {key: key, hashId: -1}; + else if (parts.length == 1 && parts[0] == "shift") + return {key: key.toUpperCase(), hashId: -1}; + + var hashId = 0; + for (var i = parts.length; i--;) { + var modifier = keyUtil.KEY_MODS[parts[i]]; + if (modifier == null) { + if (typeof console != "undefined") + console.error("invalid modifier " + parts[i] + " in " + keys); + return false; + } + hashId |= modifier; + } + return {key: key, hashId: hashId}; + }; + + this.findKeyCommand = function findKeyCommand(hashId, keyString) { + var key = KEY_MODS[hashId] + keyString; + return this.commandKeyBinding[key]; + }; + + this.handleKeyboard = function(data, hashId, keyString, keyCode) { + if (keyCode < 0) return; + var key = KEY_MODS[hashId] + keyString; + var command = this.commandKeyBinding[key]; + if (data.$keyChain) { + data.$keyChain += " " + key; + command = this.commandKeyBinding[data.$keyChain] || command; + } + + if (command) { + if (command == "chainKeys" || command[command.length - 1] == "chainKeys") { + data.$keyChain = data.$keyChain || key; + return {command: "null"}; + } + } + + if (data.$keyChain) { + if ((!hashId || hashId == 4) && keyString.length == 1) + data.$keyChain = data.$keyChain.slice(0, -key.length - 1); // wait for input + else if (hashId == -1 || keyCode > 0) + data.$keyChain = ""; // reset keyChain + } + return {command: command}; + }; + + this.getStatusText = function(editor, data) { + return data.$keyChain || ""; + }; + +}).call(HashHandler.prototype); + +exports.HashHandler = HashHandler; +exports.MultiHashHandler = MultiHashHandler; +}); + +define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; var oop = require("../lib/oop"); -var HashHandler = require("../keyboard/hash_handler").HashHandler; +var MultiHashHandler = require("../keyboard/hash_handler").MultiHashHandler; var EventEmitter = require("../lib/event_emitter").EventEmitter; var CommandManager = function(platform, commands) { - HashHandler.call(this, commands, platform); + MultiHashHandler.call(this, commands, platform); this.byName = this.commands; this.setDefaultHandler("exec", function(e) { return e.command.exec(e.editor, e.args || {}); }); }; -oop.inherits(CommandManager, HashHandler); +oop.inherits(CommandManager, MultiHashHandler); (function() { oop.implement(this, EventEmitter); this.exec = function(command, editor, args) { - if (typeof command === 'string') + if (Array.isArray(command)) { + for (var i = command.length; i--; ) { + if (this.exec(command[i], editor, args)) return true; + } + return false; + } + + if (typeof command === "string") command = this.commands[command]; if (!command) @@ -11633,10 +10898,10 @@ oop.inherits(CommandManager, HashHandler); return false; var e = {editor: editor, command: command, args: args}; - var retvalue = this._emit("exec", e); + e.returnValue = this._emit("exec", e); this._signal("afterExec", e); - return retvalue === false ? false : true; + return e.returnValue === false ? false : true; }; this.toggleRecording = function(editor) { @@ -11701,171 +10966,12 @@ exports.CommandManager = CommandManager; }); -define('ace/keyboard/hash_handler', ['require', 'exports', 'module' , 'ace/lib/keys', 'ace/lib/useragent'], function(require, exports, module) { - - -var keyUtil = require("../lib/keys"); -var useragent = require("../lib/useragent"); - -function HashHandler(config, platform) { - this.platform = platform || (useragent.isMac ? "mac" : "win"); - this.commands = {}; - this.commandKeyBinding = {}; - if (this.__defineGetter__ && this.__defineSetter__ && typeof console != "undefined" && console.error) { - var warned = false; - var warn = function() { - if (!warned) { - warned = true; - console.error("commmandKeyBinding has too many m's. use commandKeyBinding"); - } - }; - this.__defineGetter__("commmandKeyBinding", function() { - warn(); - return this.commandKeyBinding; - }); - this.__defineSetter__("commmandKeyBinding", function(val) { - warn(); - return this.commandKeyBinding = val; - }); - } else { - this.commmandKeyBinding = this.commandKeyBinding; - } - - this.addCommands(config); -}; - -(function() { - - this.addCommand = function(command) { - if (this.commands[command.name]) - this.removeCommand(command); - - this.commands[command.name] = command; - - if (command.bindKey) - this._buildKeyHash(command); - }; - - this.removeCommand = function(command) { - var name = (typeof command === 'string' ? command : command.name); - command = this.commands[name]; - delete this.commands[name]; - var ckb = this.commandKeyBinding; - for (var hashId in ckb) { - for (var key in ckb[hashId]) { - if (ckb[hashId][key] == command) - delete ckb[hashId][key]; - } - } - }; - - this.bindKey = function(key, command) { - if(!key) - return; - if (typeof command == "function") { - this.addCommand({exec: command, bindKey: key, name: command.name || key}); - return; - } - - var ckb = this.commandKeyBinding; - key.split("|").forEach(function(keyPart) { - var binding = this.parseKeys(keyPart, command); - var hashId = binding.hashId; - (ckb[hashId] || (ckb[hashId] = {}))[binding.key] = command; - }, this); - }; - - this.addCommands = function(commands) { - commands && Object.keys(commands).forEach(function(name) { - var command = commands[name]; - if (!command) - return; - - if (typeof command === "string") - return this.bindKey(command, name); - - if (typeof command === "function") - command = { exec: command }; - - if (typeof command !== "object") - return; - - if (!command.name) - command.name = name; - - this.addCommand(command); - }, this); - }; - - this.removeCommands = function(commands) { - Object.keys(commands).forEach(function(name) { - this.removeCommand(commands[name]); - }, this); - }; - - this.bindKeys = function(keyList) { - Object.keys(keyList).forEach(function(key) { - this.bindKey(key, keyList[key]); - }, this); - }; - - this._buildKeyHash = function(command) { - var binding = command.bindKey; - if (!binding) - return; - - var key = typeof binding == "string" ? binding: binding[this.platform]; - this.bindKey(key, command); - }; - this.parseKeys = function(keys) { - if (keys.indexOf(" ") != -1) - keys = keys.split(/\s+/).pop(); - - var parts = keys.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(x){return x}); - var key = parts.pop(); - - var keyCode = keyUtil[key]; - if (keyUtil.FUNCTION_KEYS[keyCode]) - key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase(); - else if (!parts.length) - return {key: key, hashId: -1}; - else if (parts.length == 1 && parts[0] == "shift") - return {key: key.toUpperCase(), hashId: -1}; - - var hashId = 0; - for (var i = parts.length; i--;) { - var modifier = keyUtil.KEY_MODS[parts[i]]; - if (modifier == null) { - if (typeof console != "undefined") - console.error("invalid modifier " + parts[i] + " in " + keys); - return false; - } - hashId |= modifier; - } - return {key: key, hashId: hashId}; - }; - - this.findKeyCommand = function findKeyCommand(hashId, keyString) { - var ckbr = this.commandKeyBinding; - return ckbr[hashId] && ckbr[hashId][keyString]; - }; - - this.handleKeyboard = function(data, hashId, keyString, keyCode) { - return { - command: this.findKeyCommand(hashId, keyString) - }; - }; - -}).call(HashHandler.prototype) - -exports.HashHandler = HashHandler; -}); - -define('ace/commands/default_commands', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/config'], function(require, exports, module) { - +define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"], function(require, exports, module) { +"use strict"; var lang = require("../lib/lang"); var config = require("../config"); +var Range = require("../range").Range; function bindKey(win, mac) { return {win: win, mac: mac}; @@ -11882,7 +10988,7 @@ exports.commands = [{ readOnly: true }, { name: "goToNextError", - bindKey: bindKey("Alt-E", "Ctrl-E"), + bindKey: bindKey("Alt-E", "F4"), exec: function(editor) { config.loadModule("ace/ext/error_marker", function(module) { module.showErrorMarker(editor, 1); @@ -11892,7 +10998,7 @@ exports.commands = [{ readOnly: true }, { name: "goToPreviousError", - bindKey: bindKey("Alt-Shift-E", "Ctrl-Shift-E"), + bindKey: bindKey("Alt-Shift-E", "Shift-F4"), exec: function(editor) { config.loadModule("ace/ext/error_marker", function(module) { module.showErrorMarker(editor, -1); @@ -11924,29 +11030,33 @@ exports.commands = [{ name: "fold", bindKey: bindKey("Alt-L|Ctrl-F1", "Command-Alt-L|Command-F1"), exec: function(editor) { editor.session.toggleFold(false); }, + multiSelectAction: "forEach", scrollIntoView: "center", readOnly: true }, { name: "unfold", bindKey: bindKey("Alt-Shift-L|Ctrl-Shift-F1", "Command-Alt-Shift-L|Command-Shift-F1"), exec: function(editor) { editor.session.toggleFold(true); }, + multiSelectAction: "forEach", scrollIntoView: "center", readOnly: true }, { name: "toggleFoldWidget", bindKey: bindKey("F2", "F2"), exec: function(editor) { editor.session.toggleFoldWidget(); }, + multiSelectAction: "forEach", scrollIntoView: "center", readOnly: true }, { name: "toggleParentFoldWidget", bindKey: bindKey("Alt-F2", "Alt-F2"), exec: function(editor) { editor.session.toggleFoldWidget(true); }, + multiSelectAction: "forEach", scrollIntoView: "center", readOnly: true }, { name: "foldall", - bindKey: bindKey("Ctrl-Alt-0", "Ctrl-Command-Option-0"), + bindKey: bindKey(null, "Ctrl-Command-Option-0"), exec: function(editor) { editor.session.foldAll(); }, scrollIntoView: "center", readOnly: true @@ -11969,15 +11079,19 @@ exports.commands = [{ name: "findnext", bindKey: bindKey("Ctrl-K", "Command-G"), exec: function(editor) { editor.findNext(); }, + multiSelectAction: "forEach", + scrollIntoView: "center", readOnly: true }, { name: "findprevious", bindKey: bindKey("Ctrl-Shift-K", "Command-Shift-G"), exec: function(editor) { editor.findPrevious(); }, + multiSelectAction: "forEach", + scrollIntoView: "center", readOnly: true }, { name: "selectOrFindNext", - bindKey: bindKey("ALt-K", "Ctrl-G"), + bindKey: bindKey("Alt-K", "Ctrl-G"), exec: function(editor) { if (editor.selection.isEmpty()) editor.selection.selectWord(); @@ -12009,7 +11123,7 @@ exports.commands = [{ readOnly: true }, { name: "selecttostart", - bindKey: bindKey("Ctrl-Shift-Home", "Command-Shift-Up"), + bindKey: bindKey("Ctrl-Shift-Home", "Command-Shift-Home|Command-Shift-Up"), exec: function(editor) { editor.getSelection().selectFileStart(); }, multiSelectAction: "forEach", readOnly: true, @@ -12025,19 +11139,21 @@ exports.commands = [{ aceCommandGroup: "fileJump" }, { name: "selectup", - bindKey: bindKey("Shift-Up", "Shift-Up"), + bindKey: bindKey("Shift-Up", "Shift-Up|Ctrl-Shift-P"), exec: function(editor) { editor.getSelection().selectUp(); }, multiSelectAction: "forEach", + scrollIntoView: "cursor", readOnly: true }, { name: "golineup", bindKey: bindKey("Up", "Up|Ctrl-P"), exec: function(editor, args) { editor.navigateUp(args.times); }, multiSelectAction: "forEach", + scrollIntoView: "cursor", readOnly: true }, { name: "selecttoend", - bindKey: bindKey("Ctrl-Shift-End", "Command-Shift-Down"), + bindKey: bindKey("Ctrl-Shift-End", "Command-Shift-End|Command-Shift-Down"), exec: function(editor) { editor.getSelection().selectFileEnd(); }, multiSelectAction: "forEach", readOnly: true, @@ -12053,7 +11169,7 @@ exports.commands = [{ aceCommandGroup: "fileJump" }, { name: "selectdown", - bindKey: bindKey("Shift-Down", "Shift-Down"), + bindKey: bindKey("Shift-Down", "Shift-Down|Ctrl-Shift-N"), exec: function(editor) { editor.getSelection().selectDown(); }, multiSelectAction: "forEach", scrollIntoView: "cursor", @@ -12081,7 +11197,7 @@ exports.commands = [{ readOnly: true }, { name: "selecttolinestart", - bindKey: bindKey("Alt-Shift-Left", "Command-Shift-Left"), + bindKey: bindKey("Alt-Shift-Left", "Command-Shift-Left|Ctrl-Shift-A"), exec: function(editor) { editor.getSelection().selectLineStart(); }, multiSelectAction: "forEach", scrollIntoView: "cursor", @@ -12095,7 +11211,7 @@ exports.commands = [{ readOnly: true }, { name: "selectleft", - bindKey: bindKey("Shift-Left", "Shift-Left"), + bindKey: bindKey("Shift-Left", "Shift-Left|Ctrl-Shift-B"), exec: function(editor) { editor.getSelection().selectLeft(); }, multiSelectAction: "forEach", scrollIntoView: "cursor", @@ -12123,7 +11239,7 @@ exports.commands = [{ readOnly: true }, { name: "selecttolineend", - bindKey: bindKey("Alt-Shift-Right", "Command-Shift-Right"), + bindKey: bindKey("Alt-Shift-Right", "Command-Shift-Right|Shift-End|Ctrl-Shift-E"), exec: function(editor) { editor.getSelection().selectLineEnd(); }, multiSelectAction: "forEach", scrollIntoView: "cursor", @@ -12215,17 +11331,37 @@ exports.commands = [{ readOnly: true }, { name: "jumptomatching", - bindKey: bindKey("Ctrl-P", "Ctrl-Shift-P"), + bindKey: bindKey("Ctrl-P", "Ctrl-P"), exec: function(editor) { editor.jumpToMatching(); }, multiSelectAction: "forEach", + scrollIntoView: "animate", readOnly: true }, { name: "selecttomatching", - bindKey: bindKey("Ctrl-Shift-P", null), + bindKey: bindKey("Ctrl-Shift-P", "Ctrl-Shift-P"), exec: function(editor) { editor.jumpToMatching(true); }, multiSelectAction: "forEach", + scrollIntoView: "animate", readOnly: true -}, +}, { + name: "expandToMatching", + bindKey: bindKey("Ctrl-Shift-M", "Ctrl-Shift-M"), + exec: function(editor) { editor.jumpToMatching(true, true); }, + multiSelectAction: "forEach", + scrollIntoView: "animate", + readOnly: true +}, { + name: "passKeysToBrowser", + bindKey: bindKey(null, null), + exec: function() {}, + passEvent: true, + readOnly: true +}, { + name: "copy", + exec: function(editor) { + }, + readOnly: true +}, { name: "cut", exec: function(editor) { @@ -12239,6 +11375,12 @@ exports.commands = [{ }, scrollIntoView: "cursor", multiSelectAction: "forEach" +}, { + name: "paste", + exec: function(editor, args) { + editor.$handlePaste(args); + }, + scrollIntoView: "cursor" }, { name: "removeline", bindKey: bindKey("Ctrl-D", "Command-D"), @@ -12273,11 +11415,13 @@ exports.commands = [{ name: "modifyNumberUp", bindKey: bindKey("Ctrl-Shift-Up", "Alt-Shift-Up"), exec: function(editor) { editor.modifyNumber(1); }, + scrollIntoView: "cursor", multiSelectAction: "forEach" }, { name: "modifyNumberDown", bindKey: bindKey("Ctrl-Shift-Down", "Alt-Shift-Down"), exec: function(editor) { editor.modifyNumber(-1); }, + scrollIntoView: "cursor", multiSelectAction: "forEach" }, { name: "replace", @@ -12424,53 +11568,1984 @@ exports.commands = [{ exec: function(editor) { editor.toLowerCase(); }, multiSelectAction: "forEach", scrollIntoView: "cursor" +}, { + name: "expandtoline", + bindKey: bindKey("Ctrl-Shift-L", "Command-Shift-L"), + exec: function(editor) { + var range = editor.selection.getRange(); + + range.start.column = range.end.column = 0; + range.end.row++; + editor.selection.setRange(range, false); + }, + multiSelectAction: "forEach", + scrollIntoView: "cursor", + readOnly: true +}, { + name: "joinlines", + bindKey: bindKey(null, null), + exec: function(editor) { + var isBackwards = editor.selection.isBackwards(); + var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor(); + var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead(); + var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length; + var selectedText = editor.session.doc.getTextRange(editor.selection.getRange()); + var selectedCount = selectedText.replace(/\n\s*/, " ").length; + var insertLine = editor.session.doc.getLine(selectionStart.row); + + for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) { + var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i))); + if (curLine.length !== 0) { + curLine = " " + curLine; + } + insertLine += curLine; + } + + if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) { + insertLine += editor.session.doc.getNewLineCharacter(); + } + + editor.clearSelection(); + editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine); + + if (selectedCount > 0) { + editor.selection.moveCursorTo(selectionStart.row, selectionStart.column); + editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount); + } else { + firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol; + editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol); + } + }, + multiSelectAction: "forEach", + readOnly: true +}, { + name: "invertSelection", + bindKey: bindKey(null, null), + exec: function(editor) { + var endRow = editor.session.doc.getLength() - 1; + var endCol = editor.session.doc.getLine(endRow).length; + var ranges = editor.selection.rangeList.ranges; + var newRanges = []; + if (ranges.length < 1) { + ranges = [editor.selection.getRange()]; + } + + for (var i = 0; i < ranges.length; i++) { + if (i == (ranges.length - 1)) { + if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) { + newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol)); + } + } + + if (i === 0) { + if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) { + newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column)); + } + } else { + newRanges.push(new Range(ranges[i-1].end.row, ranges[i-1].end.column, ranges[i].start.row, ranges[i].start.column)); + } + } + + editor.exitMultiSelectMode(); + editor.clearSelection(); + + for(var i = 0; i < newRanges.length; i++) { + editor.selection.addRange(newRanges[i], false); + } + }, + readOnly: true, + scrollIntoView: "none" }]; }); -define('ace/undomanager', ['require', 'exports', 'module' ], function(require, exports, module) { +define("ace/editor",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/keyboard/textinput","ace/mouse/mouse_handler","ace/mouse/fold_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","ace/lib/event_emitter","ace/commands/command_manager","ace/commands/default_commands","ace/config","ace/token_iterator"], function(require, exports, module) { +"use strict"; + +require("./lib/fixoldbrowsers"); + +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var lang = require("./lib/lang"); +var useragent = require("./lib/useragent"); +var TextInput = require("./keyboard/textinput").TextInput; +var MouseHandler = require("./mouse/mouse_handler").MouseHandler; +var FoldHandler = require("./mouse/fold_handler").FoldHandler; +var KeyBinding = require("./keyboard/keybinding").KeyBinding; +var EditSession = require("./edit_session").EditSession; +var Search = require("./search").Search; +var Range = require("./range").Range; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var CommandManager = require("./commands/command_manager").CommandManager; +var defaultCommands = require("./commands/default_commands").commands; +var config = require("./config"); +var TokenIterator = require("./token_iterator").TokenIterator; +var Editor = function(renderer, session) { + var container = renderer.getContainerElement(); + this.container = container; + this.renderer = renderer; + + this.commands = new CommandManager(useragent.isMac ? "mac" : "win", defaultCommands); + this.textInput = new TextInput(renderer.getTextAreaContainer(), this); + this.renderer.textarea = this.textInput.getElement(); + this.keyBinding = new KeyBinding(this); + this.$mouseHandler = new MouseHandler(this); + new FoldHandler(this); + + this.$blockScrolling = 0; + this.$search = new Search().set({ + wrap: true + }); + + this.$historyTracker = this.$historyTracker.bind(this); + this.commands.on("exec", this.$historyTracker); + + this.$initOperationListeners(); + + this._$emitInputEvent = lang.delayedCall(function() { + this._signal("input", {}); + if (this.session && this.session.bgTokenizer) + this.session.bgTokenizer.scheduleStart(); + }.bind(this)); + + this.on("change", function(_, _self) { + _self._$emitInputEvent.schedule(31); + }); + + this.setSession(session || new EditSession("")); + config.resetOptions(this); + config._signal("editor", this); +}; + +(function(){ + + oop.implement(this, EventEmitter); + + this.$initOperationListeners = function() { + function last(a) {return a[a.length - 1]} + + this.selections = []; + this.commands.on("exec", this.startOperation.bind(this), true); + this.commands.on("afterExec", this.endOperation.bind(this), true); + + this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this)); + + this.on("change", function() { + this.curOp || this.startOperation(); + this.curOp.docChanged = true; + }.bind(this), true); + + this.on("changeSelection", function() { + this.curOp || this.startOperation(); + this.curOp.selectionChanged = true; + }.bind(this), true); + }; + + this.curOp = null; + this.prevOp = {}; + this.startOperation = function(commadEvent) { + if (this.curOp) { + if (!commadEvent || this.curOp.command) + return; + this.prevOp = this.curOp; + } + if (!commadEvent) { + this.previousCommand = null; + commadEvent = {}; + } + + this.$opResetTimer.schedule(); + this.curOp = { + command: commadEvent.command || {}, + args: commadEvent.args, + scrollTop: this.renderer.scrollTop + }; + if (this.curOp.command.name && this.curOp.command.scrollIntoView !== undefined) + this.$blockScrolling++; + }; + + this.endOperation = function(e) { + if (this.curOp) { + if (e && e.returnValue === false) + return this.curOp = null; + this._signal("beforeEndOperation"); + var command = this.curOp.command; + if (command.name && this.$blockScrolling > 0) + this.$blockScrolling--; + var scrollIntoView = command && command.scrollIntoView; + if (scrollIntoView) { + switch (scrollIntoView) { + case "center-animate": + scrollIntoView = "animate"; + case "center": + this.renderer.scrollCursorIntoView(null, 0.5); + break; + case "animate": + case "cursor": + this.renderer.scrollCursorIntoView(); + break; + case "selectionPart": + var range = this.selection.getRange(); + var config = this.renderer.layerConfig; + if (range.start.row >= config.lastRow || range.end.row <= config.firstRow) { + this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead); + } + break; + default: + break; + } + if (scrollIntoView == "animate") + this.renderer.animateScrolling(this.curOp.scrollTop); + } + + this.prevOp = this.curOp; + this.curOp = null; + } + }; + this.$mergeableCommands = ["backspace", "del", "insertstring"]; + this.$historyTracker = function(e) { + if (!this.$mergeUndoDeltas) + return; + + var prev = this.prevOp; + var mergeableCommands = this.$mergeableCommands; + var shouldMerge = prev.command && (e.command.name == prev.command.name); + if (e.command.name == "insertstring") { + var text = e.args; + if (this.mergeNextCommand === undefined) + this.mergeNextCommand = true; + + shouldMerge = shouldMerge + && this.mergeNextCommand // previous command allows to coalesce with + && (!/\s/.test(text) || /\s/.test(prev.args)); // previous insertion was of same type + + this.mergeNextCommand = true; + } else { + shouldMerge = shouldMerge + && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable + } + + if ( + this.$mergeUndoDeltas != "always" + && Date.now() - this.sequenceStartTime > 2000 + ) { + shouldMerge = false; // the sequence is too long + } + + if (shouldMerge) + this.session.mergeUndoDeltas = true; + else if (mergeableCommands.indexOf(e.command.name) !== -1) + this.sequenceStartTime = Date.now(); + }; + this.setKeyboardHandler = function(keyboardHandler, cb) { + if (keyboardHandler && typeof keyboardHandler === "string") { + this.$keybindingId = keyboardHandler; + var _self = this; + config.loadModule(["keybinding", keyboardHandler], function(module) { + if (_self.$keybindingId == keyboardHandler) + _self.keyBinding.setKeyboardHandler(module && module.handler); + cb && cb(); + }); + } else { + this.$keybindingId = null; + this.keyBinding.setKeyboardHandler(keyboardHandler); + cb && cb(); + } + }; + this.getKeyboardHandler = function() { + return this.keyBinding.getKeyboardHandler(); + }; + this.setSession = function(session) { + if (this.session == session) + return; + if (this.curOp) this.endOperation(); + this.curOp = {}; + + var oldSession = this.session; + if (oldSession) { + this.session.off("change", this.$onDocumentChange); + this.session.off("changeMode", this.$onChangeMode); + this.session.off("tokenizerUpdate", this.$onTokenizerUpdate); + this.session.off("changeTabSize", this.$onChangeTabSize); + this.session.off("changeWrapLimit", this.$onChangeWrapLimit); + this.session.off("changeWrapMode", this.$onChangeWrapMode); + this.session.off("changeFold", this.$onChangeFold); + this.session.off("changeFrontMarker", this.$onChangeFrontMarker); + this.session.off("changeBackMarker", this.$onChangeBackMarker); + this.session.off("changeBreakpoint", this.$onChangeBreakpoint); + this.session.off("changeAnnotation", this.$onChangeAnnotation); + this.session.off("changeOverwrite", this.$onCursorChange); + this.session.off("changeScrollTop", this.$onScrollTopChange); + this.session.off("changeScrollLeft", this.$onScrollLeftChange); + + var selection = this.session.getSelection(); + selection.off("changeCursor", this.$onCursorChange); + selection.off("changeSelection", this.$onSelectionChange); + } + + this.session = session; + if (session) { + this.$onDocumentChange = this.onDocumentChange.bind(this); + session.on("change", this.$onDocumentChange); + this.renderer.setSession(session); + + this.$onChangeMode = this.onChangeMode.bind(this); + session.on("changeMode", this.$onChangeMode); + + this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this); + session.on("tokenizerUpdate", this.$onTokenizerUpdate); + + this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer); + session.on("changeTabSize", this.$onChangeTabSize); + + this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this); + session.on("changeWrapLimit", this.$onChangeWrapLimit); + + this.$onChangeWrapMode = this.onChangeWrapMode.bind(this); + session.on("changeWrapMode", this.$onChangeWrapMode); + + this.$onChangeFold = this.onChangeFold.bind(this); + session.on("changeFold", this.$onChangeFold); + + this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this); + this.session.on("changeFrontMarker", this.$onChangeFrontMarker); + + this.$onChangeBackMarker = this.onChangeBackMarker.bind(this); + this.session.on("changeBackMarker", this.$onChangeBackMarker); + + this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this); + this.session.on("changeBreakpoint", this.$onChangeBreakpoint); + + this.$onChangeAnnotation = this.onChangeAnnotation.bind(this); + this.session.on("changeAnnotation", this.$onChangeAnnotation); + + this.$onCursorChange = this.onCursorChange.bind(this); + this.session.on("changeOverwrite", this.$onCursorChange); + + this.$onScrollTopChange = this.onScrollTopChange.bind(this); + this.session.on("changeScrollTop", this.$onScrollTopChange); + + this.$onScrollLeftChange = this.onScrollLeftChange.bind(this); + this.session.on("changeScrollLeft", this.$onScrollLeftChange); + + this.selection = session.getSelection(); + this.selection.on("changeCursor", this.$onCursorChange); + + this.$onSelectionChange = this.onSelectionChange.bind(this); + this.selection.on("changeSelection", this.$onSelectionChange); + + this.onChangeMode(); + + this.$blockScrolling += 1; + this.onCursorChange(); + this.$blockScrolling -= 1; + + this.onScrollTopChange(); + this.onScrollLeftChange(); + this.onSelectionChange(); + this.onChangeFrontMarker(); + this.onChangeBackMarker(); + this.onChangeBreakpoint(); + this.onChangeAnnotation(); + this.session.getUseWrapMode() && this.renderer.adjustWrapLimit(); + this.renderer.updateFull(); + } else { + this.selection = null; + this.renderer.setSession(session); + } + + this._signal("changeSession", { + session: session, + oldSession: oldSession + }); + + this.curOp = null; + + oldSession && oldSession._signal("changeEditor", {oldEditor: this}); + session && session._signal("changeEditor", {editor: this}); + }; + this.getSession = function() { + return this.session; + }; + this.setValue = function(val, cursorPos) { + this.session.doc.setValue(val); + + if (!cursorPos) + this.selectAll(); + else if (cursorPos == 1) + this.navigateFileEnd(); + else if (cursorPos == -1) + this.navigateFileStart(); + + return val; + }; + this.getValue = function() { + return this.session.getValue(); + }; + this.getSelection = function() { + return this.selection; + }; + this.resize = function(force) { + this.renderer.onResize(force); + }; + this.setTheme = function(theme, cb) { + this.renderer.setTheme(theme, cb); + }; + this.getTheme = function() { + return this.renderer.getTheme(); + }; + this.setStyle = function(style) { + this.renderer.setStyle(style); + }; + this.unsetStyle = function(style) { + this.renderer.unsetStyle(style); + }; + this.getFontSize = function () { + return this.getOption("fontSize") || + dom.computedStyle(this.container, "fontSize"); + }; + this.setFontSize = function(size) { + this.setOption("fontSize", size); + }; + + this.$highlightBrackets = function() { + if (this.session.$bracketHighlight) { + this.session.removeMarker(this.session.$bracketHighlight); + this.session.$bracketHighlight = null; + } + + if (this.$highlightPending) { + return; + } + var self = this; + this.$highlightPending = true; + setTimeout(function() { + self.$highlightPending = false; + var session = self.session; + if (!session || !session.bgTokenizer) return; + var pos = session.findMatchingBracket(self.getCursorPosition()); + if (pos) { + var range = new Range(pos.row, pos.column, pos.row, pos.column + 1); + } else if (session.$mode.getMatching) { + var range = session.$mode.getMatching(self.session); + } + if (range) + session.$bracketHighlight = session.addMarker(range, "ace_bracket", "text"); + }, 50); + }; + this.$highlightTags = function() { + if (this.$highlightTagPending) + return; + var self = this; + this.$highlightTagPending = true; + setTimeout(function() { + self.$highlightTagPending = false; + + var session = self.session; + if (!session || !session.bgTokenizer) return; + + var pos = self.getCursorPosition(); + var iterator = new TokenIterator(self.session, pos.row, pos.column); + var token = iterator.getCurrentToken(); + + if (!token || !/\b(?:tag-open|tag-name)/.test(token.type)) { + session.removeMarker(session.$tagHighlight); + session.$tagHighlight = null; + return; + } + + if (token.type.indexOf("tag-open") != -1) { + token = iterator.stepForward(); + if (!token) + return; + } + + var tag = token.value; + var depth = 0; + var prevToken = iterator.stepBackward(); + + if (prevToken.value == '<'){ + do { + prevToken = token; + token = iterator.stepForward(); + + if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) { + if (prevToken.value === '<'){ + depth++; + } else if (prevToken.value === '= 0); + } else { + do { + token = prevToken; + prevToken = iterator.stepBackward(); + + if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) { + if (prevToken.value === '<') { + depth++; + } else if (prevToken.value === ' 1)) + highlight = false; + } + + if (session.$highlightLineMarker && !highlight) { + session.removeMarker(session.$highlightLineMarker.id); + session.$highlightLineMarker = null; + } else if (!session.$highlightLineMarker && highlight) { + var range = new Range(highlight.row, highlight.column, highlight.row, Infinity); + range.id = session.addMarker(range, "ace_active-line", "screenLine"); + session.$highlightLineMarker = range; + } else if (highlight) { + session.$highlightLineMarker.start.row = highlight.row; + session.$highlightLineMarker.end.row = highlight.row; + session.$highlightLineMarker.start.column = highlight.column; + session._signal("changeBackMarker"); + } + }; + + this.onSelectionChange = function(e) { + var session = this.session; + + if (session.$selectionMarker) { + session.removeMarker(session.$selectionMarker); + } + session.$selectionMarker = null; + + if (!this.selection.isEmpty()) { + var range = this.selection.getRange(); + var style = this.getSelectionStyle(); + session.$selectionMarker = session.addMarker(range, "ace_selection", style); + } else { + this.$updateHighlightActiveLine(); + } + + var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp(); + this.session.highlight(re); + + this._signal("changeSelection"); + }; + + this.$getSelectionHighLightRegexp = function() { + var session = this.session; + + var selection = this.getSelectionRange(); + if (selection.isEmpty() || selection.isMultiLine()) + return; + + var startOuter = selection.start.column - 1; + var endOuter = selection.end.column + 1; + var line = session.getLine(selection.start.row); + var lineCols = line.length; + var needle = line.substring(Math.max(startOuter, 0), + Math.min(endOuter, lineCols)); + if ((startOuter >= 0 && /^[\w\d]/.test(needle)) || + (endOuter <= lineCols && /[\w\d]$/.test(needle))) + return; + + needle = line.substring(selection.start.column, selection.end.column); + if (!/^[\w\d]+$/.test(needle)) + return; + + var re = this.$search.$assembleRegExp({ + wholeWord: true, + caseSensitive: true, + needle: needle + }); + + return re; + }; + + + this.onChangeFrontMarker = function() { + this.renderer.updateFrontMarkers(); + }; + + this.onChangeBackMarker = function() { + this.renderer.updateBackMarkers(); + }; + + + this.onChangeBreakpoint = function() { + this.renderer.updateBreakpoints(); + }; + + this.onChangeAnnotation = function() { + this.renderer.setAnnotations(this.session.getAnnotations()); + }; + + + this.onChangeMode = function(e) { + this.renderer.updateText(); + this._emit("changeMode", e); + }; + + + this.onChangeWrapLimit = function() { + this.renderer.updateFull(); + }; + + this.onChangeWrapMode = function() { + this.renderer.onResize(true); + }; + + + this.onChangeFold = function() { + this.$updateHighlightActiveLine(); + this.renderer.updateFull(); + }; + this.getSelectedText = function() { + return this.session.getTextRange(this.getSelectionRange()); + }; + this.getCopyText = function() { + var text = this.getSelectedText(); + this._signal("copy", text); + return text; + }; + this.onCopy = function() { + this.commands.exec("copy", this); + }; + this.onCut = function() { + this.commands.exec("cut", this); + }; + this.onPaste = function(text, event) { + var e = {text: text, event: event}; + this.commands.exec("paste", this, e); + }; + + this.$handlePaste = function(e) { + if (typeof e == "string") + e = {text: e}; + this._signal("paste", e); + var text = e.text; + if (!this.inMultiSelectMode || this.inVirtualSelectionMode) { + this.insert(text); + } else { + var lines = text.split(/\r\n|\r|\n/); + var ranges = this.selection.rangeList.ranges; + + if (lines.length > ranges.length || lines.length < 2 || !lines[1]) + return this.commands.exec("insertstring", this, text); + + for (var i = ranges.length; i--;) { + var range = ranges[i]; + if (!range.isEmpty()) + this.session.remove(range); + + this.session.insert(range.start, lines[i]); + } + } + }; + + this.execCommand = function(command, args) { + return this.commands.exec(command, this, args); + }; + this.insert = function(text, pasted) { + var session = this.session; + var mode = session.getMode(); + var cursor = this.getCursorPosition(); + + if (this.getBehavioursEnabled() && !pasted) { + var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text); + if (transform) { + if (text !== transform.text) { + this.session.mergeUndoDeltas = false; + this.$mergeNextCommand = false; + } + text = transform.text; + + } + } + + if (text == "\t") + text = this.session.getTabString(); + if (!this.selection.isEmpty()) { + var range = this.getSelectionRange(); + cursor = this.session.remove(range); + this.clearSelection(); + } + else if (this.session.getOverwrite()) { + var range = new Range.fromPoints(cursor, cursor); + range.end.column += text.length; + this.session.remove(range); + } + + if (text == "\n" || text == "\r\n") { + var line = session.getLine(cursor.row); + if (cursor.column > line.search(/\S|$/)) { + var d = line.substr(cursor.column).search(/\S|$/); + session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d); + } + } + this.clearSelection(); + + var start = cursor.column; + var lineState = session.getState(cursor.row); + var line = session.getLine(cursor.row); + var shouldOutdent = mode.checkOutdent(lineState, line, text); + var end = session.insert(cursor, text); + + if (transform && transform.selection) { + if (transform.selection.length == 2) { // Transform relative to the current column + this.selection.setSelectionRange( + new Range(cursor.row, start + transform.selection[0], + cursor.row, start + transform.selection[1])); + } else { // Transform relative to the current row. + this.selection.setSelectionRange( + new Range(cursor.row + transform.selection[0], + transform.selection[1], + cursor.row + transform.selection[2], + transform.selection[3])); + } + } + + if (session.getDocument().isNewLine(text)) { + var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString()); + + session.insert({row: cursor.row+1, column: 0}, lineIndent); + } + if (shouldOutdent) + mode.autoOutdent(lineState, session, cursor.row); + }; + + this.onTextInput = function(text) { + this.keyBinding.onTextInput(text); + }; + + this.onCommandKey = function(e, hashId, keyCode) { + this.keyBinding.onCommandKey(e, hashId, keyCode); + }; + this.setOverwrite = function(overwrite) { + this.session.setOverwrite(overwrite); + }; + this.getOverwrite = function() { + return this.session.getOverwrite(); + }; + this.toggleOverwrite = function() { + this.session.toggleOverwrite(); + }; + this.setScrollSpeed = function(speed) { + this.setOption("scrollSpeed", speed); + }; + this.getScrollSpeed = function() { + return this.getOption("scrollSpeed"); + }; + this.setDragDelay = function(dragDelay) { + this.setOption("dragDelay", dragDelay); + }; + this.getDragDelay = function() { + return this.getOption("dragDelay"); + }; + this.setSelectionStyle = function(val) { + this.setOption("selectionStyle", val); + }; + this.getSelectionStyle = function() { + return this.getOption("selectionStyle"); + }; + this.setHighlightActiveLine = function(shouldHighlight) { + this.setOption("highlightActiveLine", shouldHighlight); + }; + this.getHighlightActiveLine = function() { + return this.getOption("highlightActiveLine"); + }; + this.setHighlightGutterLine = function(shouldHighlight) { + this.setOption("highlightGutterLine", shouldHighlight); + }; + + this.getHighlightGutterLine = function() { + return this.getOption("highlightGutterLine"); + }; + this.setHighlightSelectedWord = function(shouldHighlight) { + this.setOption("highlightSelectedWord", shouldHighlight); + }; + this.getHighlightSelectedWord = function() { + return this.$highlightSelectedWord; + }; + + this.setAnimatedScroll = function(shouldAnimate){ + this.renderer.setAnimatedScroll(shouldAnimate); + }; + + this.getAnimatedScroll = function(){ + return this.renderer.getAnimatedScroll(); + }; + this.setShowInvisibles = function(showInvisibles) { + this.renderer.setShowInvisibles(showInvisibles); + }; + this.getShowInvisibles = function() { + return this.renderer.getShowInvisibles(); + }; + + this.setDisplayIndentGuides = function(display) { + this.renderer.setDisplayIndentGuides(display); + }; + + this.getDisplayIndentGuides = function() { + return this.renderer.getDisplayIndentGuides(); + }; + this.setShowPrintMargin = function(showPrintMargin) { + this.renderer.setShowPrintMargin(showPrintMargin); + }; + this.getShowPrintMargin = function() { + return this.renderer.getShowPrintMargin(); + }; + this.setPrintMarginColumn = function(showPrintMargin) { + this.renderer.setPrintMarginColumn(showPrintMargin); + }; + this.getPrintMarginColumn = function() { + return this.renderer.getPrintMarginColumn(); + }; + this.setReadOnly = function(readOnly) { + this.setOption("readOnly", readOnly); + }; + this.getReadOnly = function() { + return this.getOption("readOnly"); + }; + this.setBehavioursEnabled = function (enabled) { + this.setOption("behavioursEnabled", enabled); + }; + this.getBehavioursEnabled = function () { + return this.getOption("behavioursEnabled"); + }; + this.setWrapBehavioursEnabled = function (enabled) { + this.setOption("wrapBehavioursEnabled", enabled); + }; + this.getWrapBehavioursEnabled = function () { + return this.getOption("wrapBehavioursEnabled"); + }; + this.setShowFoldWidgets = function(show) { + this.setOption("showFoldWidgets", show); + + }; + this.getShowFoldWidgets = function() { + return this.getOption("showFoldWidgets"); + }; + + this.setFadeFoldWidgets = function(fade) { + this.setOption("fadeFoldWidgets", fade); + }; + + this.getFadeFoldWidgets = function() { + return this.getOption("fadeFoldWidgets"); + }; + this.remove = function(dir) { + if (this.selection.isEmpty()){ + if (dir == "left") + this.selection.selectLeft(); + else + this.selection.selectRight(); + } + + var range = this.getSelectionRange(); + if (this.getBehavioursEnabled()) { + var session = this.session; + var state = session.getState(range.start.row); + var new_range = session.getMode().transformAction(state, 'deletion', this, session, range); + + if (range.end.column === 0) { + var text = session.getTextRange(range); + if (text[text.length - 1] == "\n") { + var line = session.getLine(range.end.row); + if (/^\s+$/.test(line)) { + range.end.column = line.length; + } + } + } + if (new_range) + range = new_range; + } + + this.session.remove(range); + this.clearSelection(); + }; + this.removeWordRight = function() { + if (this.selection.isEmpty()) + this.selection.selectWordRight(); + + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + this.removeWordLeft = function() { + if (this.selection.isEmpty()) + this.selection.selectWordLeft(); + + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + this.removeToLineStart = function() { + if (this.selection.isEmpty()) + this.selection.selectLineStart(); + + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + }; + this.removeToLineEnd = function() { + if (this.selection.isEmpty()) + this.selection.selectLineEnd(); + + var range = this.getSelectionRange(); + if (range.start.column == range.end.column && range.start.row == range.end.row) { + range.end.column = 0; + range.end.row++; + } + + this.session.remove(range); + this.clearSelection(); + }; + this.splitLine = function() { + if (!this.selection.isEmpty()) { + this.session.remove(this.getSelectionRange()); + this.clearSelection(); + } + + var cursor = this.getCursorPosition(); + this.insert("\n"); + this.moveCursorToPosition(cursor); + }; + this.transposeLetters = function() { + if (!this.selection.isEmpty()) { + return; + } + + var cursor = this.getCursorPosition(); + var column = cursor.column; + if (column === 0) + return; + + var line = this.session.getLine(cursor.row); + var swap, range; + if (column < line.length) { + swap = line.charAt(column) + line.charAt(column-1); + range = new Range(cursor.row, column-1, cursor.row, column+1); + } + else { + swap = line.charAt(column-1) + line.charAt(column-2); + range = new Range(cursor.row, column-2, cursor.row, column); + } + this.session.replace(range, swap); + }; + this.toLowerCase = function() { + var originalRange = this.getSelectionRange(); + if (this.selection.isEmpty()) { + this.selection.selectWord(); + } + + var range = this.getSelectionRange(); + var text = this.session.getTextRange(range); + this.session.replace(range, text.toLowerCase()); + this.selection.setSelectionRange(originalRange); + }; + this.toUpperCase = function() { + var originalRange = this.getSelectionRange(); + if (this.selection.isEmpty()) { + this.selection.selectWord(); + } + + var range = this.getSelectionRange(); + var text = this.session.getTextRange(range); + this.session.replace(range, text.toUpperCase()); + this.selection.setSelectionRange(originalRange); + }; + this.indent = function() { + var session = this.session; + var range = this.getSelectionRange(); + + if (range.start.row < range.end.row) { + var rows = this.$getSelectedRows(); + session.indentRows(rows.first, rows.last, "\t"); + return; + } else if (range.start.column < range.end.column) { + var text = session.getTextRange(range); + if (!/^\s+$/.test(text)) { + var rows = this.$getSelectedRows(); + session.indentRows(rows.first, rows.last, "\t"); + return; + } + } + + var line = session.getLine(range.start.row); + var position = range.start; + var size = session.getTabSize(); + var column = session.documentToScreenColumn(position.row, position.column); + + if (this.session.getUseSoftTabs()) { + var count = (size - column % size); + var indentString = lang.stringRepeat(" ", count); + } else { + var count = column % size; + while (line[range.start.column - 1] == " " && count) { + range.start.column--; + count--; + } + this.selection.setSelectionRange(range); + indentString = "\t"; + } + return this.insert(indentString); + }; + this.blockIndent = function() { + var rows = this.$getSelectedRows(); + this.session.indentRows(rows.first, rows.last, "\t"); + }; + this.blockOutdent = function() { + var selection = this.session.getSelection(); + this.session.outdentRows(selection.getRange()); + }; + this.sortLines = function() { + var rows = this.$getSelectedRows(); + var session = this.session; + + var lines = []; + for (i = rows.first; i <= rows.last; i++) + lines.push(session.getLine(i)); + + lines.sort(function(a, b) { + if (a.toLowerCase() < b.toLowerCase()) return -1; + if (a.toLowerCase() > b.toLowerCase()) return 1; + return 0; + }); + + var deleteRange = new Range(0, 0, 0, 0); + for (var i = rows.first; i <= rows.last; i++) { + var line = session.getLine(i); + deleteRange.start.row = i; + deleteRange.end.row = i; + deleteRange.end.column = line.length; + session.replace(deleteRange, lines[i-rows.first]); + } + }; + this.toggleCommentLines = function() { + var state = this.session.getState(this.getCursorPosition().row); + var rows = this.$getSelectedRows(); + this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last); + }; + + this.toggleBlockComment = function() { + var cursor = this.getCursorPosition(); + var state = this.session.getState(cursor.row); + var range = this.getSelectionRange(); + this.session.getMode().toggleBlockComment(state, this.session, range, cursor); + }; + this.getNumberAt = function(row, column) { + var _numberRx = /[\-]?[0-9]+(?:\.[0-9]+)?/g; + _numberRx.lastIndex = 0; + + var s = this.session.getLine(row); + while (_numberRx.lastIndex < column) { + var m = _numberRx.exec(s); + if(m.index <= column && m.index+m[0].length >= column){ + var number = { + value: m[0], + start: m.index, + end: m.index+m[0].length + }; + return number; + } + } + return null; + }; + this.modifyNumber = function(amount) { + var row = this.selection.getCursor().row; + var column = this.selection.getCursor().column; + var charRange = new Range(row, column-1, row, column); + + var c = this.session.getTextRange(charRange); + if (!isNaN(parseFloat(c)) && isFinite(c)) { + var nr = this.getNumberAt(row, column); + if (nr) { + var fp = nr.value.indexOf(".") >= 0 ? nr.start + nr.value.indexOf(".") + 1 : nr.end; + var decimals = nr.start + nr.value.length - fp; + + var t = parseFloat(nr.value); + t *= Math.pow(10, decimals); + + + if(fp !== nr.end && column < fp){ + amount *= Math.pow(10, nr.end - column - 1); + } else { + amount *= Math.pow(10, nr.end - column); + } + + t += amount; + t /= Math.pow(10, decimals); + var nnr = t.toFixed(decimals); + var replaceRange = new Range(row, nr.start, row, nr.end); + this.session.replace(replaceRange, nnr); + this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length)); + + } + } + }; + this.removeLines = function() { + var rows = this.$getSelectedRows(); + this.session.removeFullLines(rows.first, rows.last); + this.clearSelection(); + }; + + this.duplicateSelection = function() { + var sel = this.selection; + var doc = this.session; + var range = sel.getRange(); + var reverse = sel.isBackwards(); + if (range.isEmpty()) { + var row = range.start.row; + doc.duplicateLines(row, row); + } else { + var point = reverse ? range.start : range.end; + var endPoint = doc.insert(point, doc.getTextRange(range), false); + range.start = point; + range.end = endPoint; + + sel.setSelectionRange(range, reverse); + } + }; + this.moveLinesDown = function() { + this.$moveLines(1, false); + }; + this.moveLinesUp = function() { + this.$moveLines(-1, false); + }; + this.moveText = function(range, toPosition, copy) { + return this.session.moveText(range, toPosition, copy); + }; + this.copyLinesUp = function() { + this.$moveLines(-1, true); + }; + this.copyLinesDown = function() { + this.$moveLines(1, true); + }; + this.$moveLines = function(dir, copy) { + var rows, moved; + var selection = this.selection; + if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) { + var range = selection.toOrientedRange(); + rows = this.$getSelectedRows(range); + moved = this.session.$moveLines(rows.first, rows.last, copy ? 0 : dir); + if (copy && dir == -1) moved = 0; + range.moveBy(moved, 0); + selection.fromOrientedRange(range); + } else { + var ranges = selection.rangeList.ranges; + selection.rangeList.detach(this.session); + this.inVirtualSelectionMode = true; + + var diff = 0; + var totalDiff = 0; + var l = ranges.length; + for (var i = 0; i < l; i++) { + var rangeIndex = i; + ranges[i].moveBy(diff, 0); + rows = this.$getSelectedRows(ranges[i]); + var first = rows.first; + var last = rows.last; + while (++i < l) { + if (totalDiff) ranges[i].moveBy(totalDiff, 0); + var subRows = this.$getSelectedRows(ranges[i]); + if (copy && subRows.first != last) + break; + else if (!copy && subRows.first > last + 1) + break; + last = subRows.last; + } + i--; + diff = this.session.$moveLines(first, last, copy ? 0 : dir); + if (copy && dir == -1) rangeIndex = i + 1; + while (rangeIndex <= i) { + ranges[rangeIndex].moveBy(diff, 0); + rangeIndex++; + } + if (!copy) diff = 0; + totalDiff += diff; + } + + selection.fromOrientedRange(selection.ranges[0]); + selection.rangeList.attach(this.session); + this.inVirtualSelectionMode = false; + } + }; + this.$getSelectedRows = function(range) { + range = (range || this.getSelectionRange()).collapseRows(); + + return { + first: this.session.getRowFoldStart(range.start.row), + last: this.session.getRowFoldEnd(range.end.row) + }; + }; + + this.onCompositionStart = function(text) { + this.renderer.showComposition(this.getCursorPosition()); + }; + + this.onCompositionUpdate = function(text) { + this.renderer.setCompositionText(text); + }; + + this.onCompositionEnd = function() { + this.renderer.hideComposition(); + }; + this.getFirstVisibleRow = function() { + return this.renderer.getFirstVisibleRow(); + }; + this.getLastVisibleRow = function() { + return this.renderer.getLastVisibleRow(); + }; + this.isRowVisible = function(row) { + return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow()); + }; + this.isRowFullyVisible = function(row) { + return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow()); + }; + this.$getVisibleRowCount = function() { + return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1; + }; + + this.$moveByPage = function(dir, select) { + var renderer = this.renderer; + var config = this.renderer.layerConfig; + var rows = dir * Math.floor(config.height / config.lineHeight); + + this.$blockScrolling++; + if (select === true) { + this.selection.$moveSelection(function(){ + this.moveCursorBy(rows, 0); + }); + } else if (select === false) { + this.selection.moveCursorBy(rows, 0); + this.selection.clearSelection(); + } + this.$blockScrolling--; + + var scrollTop = renderer.scrollTop; + + renderer.scrollBy(0, rows * config.lineHeight); + if (select != null) + renderer.scrollCursorIntoView(null, 0.5); + + renderer.animateScrolling(scrollTop); + }; + this.selectPageDown = function() { + this.$moveByPage(1, true); + }; + this.selectPageUp = function() { + this.$moveByPage(-1, true); + }; + this.gotoPageDown = function() { + this.$moveByPage(1, false); + }; + this.gotoPageUp = function() { + this.$moveByPage(-1, false); + }; + this.scrollPageDown = function() { + this.$moveByPage(1); + }; + this.scrollPageUp = function() { + this.$moveByPage(-1); + }; + this.scrollToRow = function(row) { + this.renderer.scrollToRow(row); + }; + this.scrollToLine = function(line, center, animate, callback) { + this.renderer.scrollToLine(line, center, animate, callback); + }; + this.centerSelection = function() { + var range = this.getSelectionRange(); + var pos = { + row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2), + column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2) + }; + this.renderer.alignCursor(pos, 0.5); + }; + this.getCursorPosition = function() { + return this.selection.getCursor(); + }; + this.getCursorPositionScreen = function() { + return this.session.documentToScreenPosition(this.getCursorPosition()); + }; + this.getSelectionRange = function() { + return this.selection.getRange(); + }; + this.selectAll = function() { + this.$blockScrolling += 1; + this.selection.selectAll(); + this.$blockScrolling -= 1; + }; + this.clearSelection = function() { + this.selection.clearSelection(); + }; + this.moveCursorTo = function(row, column) { + this.selection.moveCursorTo(row, column); + }; + this.moveCursorToPosition = function(pos) { + this.selection.moveCursorToPosition(pos); + }; + this.jumpToMatching = function(select, expand) { + var cursor = this.getCursorPosition(); + var iterator = new TokenIterator(this.session, cursor.row, cursor.column); + var prevToken = iterator.getCurrentToken(); + var token = prevToken || iterator.stepForward(); + + if (!token) return; + var matchType; + var found = false; + var depth = {}; + var i = cursor.column - token.start; + var bracketType; + var brackets = { + ")": "(", + "(": "(", + "]": "[", + "[": "[", + "{": "{", + "}": "{" + }; + + do { + if (token.value.match(/[{}()\[\]]/g)) { + for (; i < token.value.length && !found; i++) { + if (!brackets[token.value[i]]) { + continue; + } + + bracketType = brackets[token.value[i]] + '.' + token.type.replace("rparen", "lparen"); + + if (isNaN(depth[bracketType])) { + depth[bracketType] = 0; + } + + switch (token.value[i]) { + case '(': + case '[': + case '{': + depth[bracketType]++; + break; + case ')': + case ']': + case '}': + depth[bracketType]--; + + if (depth[bracketType] === -1) { + matchType = 'bracket'; + found = true; + } + break; + } + } + } + else if (token && token.type.indexOf('tag-name') !== -1) { + if (isNaN(depth[token.value])) { + depth[token.value] = 0; + } + + if (prevToken.value === '<') { + depth[token.value]++; + } + else if (prevToken.value === '= 0; --i) { + if(this.$tryReplace(ranges[i], replacement)) { + replaced++; + } + } + + this.selection.setSelectionRange(selection); + this.$blockScrolling -= 1; + + return replaced; + }; + + this.$tryReplace = function(range, replacement) { + var input = this.session.getTextRange(range); + replacement = this.$search.replace(input, replacement); + if (replacement !== null) { + range.end = this.session.replace(range, replacement); + return range; + } else { + return null; + } + }; + this.getLastSearchOptions = function() { + return this.$search.getOptions(); + }; + this.find = function(needle, options, animate) { + if (!options) + options = {}; + + if (typeof needle == "string" || needle instanceof RegExp) + options.needle = needle; + else if (typeof needle == "object") + oop.mixin(options, needle); + + var range = this.selection.getRange(); + if (options.needle == null) { + needle = this.session.getTextRange(range) + || this.$search.$options.needle; + if (!needle) { + range = this.session.getWordRange(range.start.row, range.start.column); + needle = this.session.getTextRange(range); + } + this.$search.set({needle: needle}); + } + + this.$search.set(options); + if (!options.start) + this.$search.set({start: range}); + + var newRange = this.$search.find(this.session); + if (options.preventScroll) + return newRange; + if (newRange) { + this.revealRange(newRange, animate); + return newRange; + } + if (options.backwards) + range.start = range.end; + else + range.end = range.start; + this.selection.setRange(range); + }; + this.findNext = function(options, animate) { + this.find({skipCurrent: true, backwards: false}, options, animate); + }; + this.findPrevious = function(options, animate) { + this.find(options, {skipCurrent: true, backwards: true}, animate); + }; + + this.revealRange = function(range, animate) { + this.$blockScrolling += 1; + this.session.unfold(range); + this.selection.setSelectionRange(range); + this.$blockScrolling -= 1; + + var scrollTop = this.renderer.scrollTop; + this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5); + if (animate !== false) + this.renderer.animateScrolling(scrollTop); + }; + this.undo = function() { + this.$blockScrolling++; + this.session.getUndoManager().undo(); + this.$blockScrolling--; + this.renderer.scrollCursorIntoView(null, 0.5); + }; + this.redo = function() { + this.$blockScrolling++; + this.session.getUndoManager().redo(); + this.$blockScrolling--; + this.renderer.scrollCursorIntoView(null, 0.5); + }; + this.destroy = function() { + this.renderer.destroy(); + this._signal("destroy", this); + if (this.session) { + this.session.destroy(); + } + }; + this.setAutoScrollEditorIntoView = function(enable) { + if (!enable) + return; + var rect; + var self = this; + var shouldScroll = false; + if (!this.$scrollAnchor) + this.$scrollAnchor = document.createElement("div"); + var scrollAnchor = this.$scrollAnchor; + scrollAnchor.style.cssText = "position:absolute"; + this.container.insertBefore(scrollAnchor, this.container.firstChild); + var onChangeSelection = this.on("changeSelection", function() { + shouldScroll = true; + }); + var onBeforeRender = this.renderer.on("beforeRender", function() { + if (shouldScroll) + rect = self.renderer.container.getBoundingClientRect(); + }); + var onAfterRender = this.renderer.on("afterRender", function() { + if (shouldScroll && rect && (self.isFocused() + || self.searchBox && self.searchBox.isFocused()) + ) { + var renderer = self.renderer; + var pos = renderer.$cursorLayer.$pixelPos; + var config = renderer.layerConfig; + var top = pos.top - config.offset; + if (pos.top >= 0 && top + rect.top < 0) { + shouldScroll = true; + } else if (pos.top < config.height && + pos.top + rect.top + config.lineHeight > window.innerHeight) { + shouldScroll = false; + } else { + shouldScroll = null; + } + if (shouldScroll != null) { + scrollAnchor.style.top = top + "px"; + scrollAnchor.style.left = pos.left + "px"; + scrollAnchor.style.height = config.lineHeight + "px"; + scrollAnchor.scrollIntoView(shouldScroll); + } + shouldScroll = rect = null; + } + }); + this.setAutoScrollEditorIntoView = function(enable) { + if (enable) + return; + delete this.setAutoScrollEditorIntoView; + this.off("changeSelection", onChangeSelection); + this.renderer.off("afterRender", onAfterRender); + this.renderer.off("beforeRender", onBeforeRender); + }; + }; + + + this.$resetCursorStyle = function() { + var style = this.$cursorStyle || "ace"; + var cursorLayer = this.renderer.$cursorLayer; + if (!cursorLayer) + return; + cursorLayer.setSmoothBlinking(/smooth/.test(style)); + cursorLayer.isBlinking = !this.$readOnly && style != "wide"; + dom.setCssClass(cursorLayer.element, "ace_slim-cursors", /slim/.test(style)); + }; + +}).call(Editor.prototype); + + + +config.defineOptions(Editor.prototype, "editor", { + selectionStyle: { + set: function(style) { + this.onSelectionChange(); + this._signal("changeSelectionStyle", {data: style}); + }, + initialValue: "line" + }, + highlightActiveLine: { + set: function() {this.$updateHighlightActiveLine();}, + initialValue: true + }, + highlightSelectedWord: { + set: function(shouldHighlight) {this.$onSelectionChange();}, + initialValue: true + }, + readOnly: { + set: function(readOnly) { + this.$resetCursorStyle(); + }, + initialValue: false + }, + cursorStyle: { + set: function(val) { this.$resetCursorStyle(); }, + values: ["ace", "slim", "smooth", "wide"], + initialValue: "ace" + }, + mergeUndoDeltas: { + values: [false, true, "always"], + initialValue: true + }, + behavioursEnabled: {initialValue: true}, + wrapBehavioursEnabled: {initialValue: true}, + autoScrollEditorIntoView: { + set: function(val) {this.setAutoScrollEditorIntoView(val)} + }, + keyboardHandler: { + set: function(val) { this.setKeyboardHandler(val); }, + get: function() { return this.keybindingId; }, + handlesSet: true + }, + + hScrollBarAlwaysVisible: "renderer", + vScrollBarAlwaysVisible: "renderer", + highlightGutterLine: "renderer", + animatedScroll: "renderer", + showInvisibles: "renderer", + showPrintMargin: "renderer", + printMarginColumn: "renderer", + printMargin: "renderer", + fadeFoldWidgets: "renderer", + showFoldWidgets: "renderer", + showLineNumbers: "renderer", + showGutter: "renderer", + displayIndentGuides: "renderer", + fontSize: "renderer", + fontFamily: "renderer", + maxLines: "renderer", + minLines: "renderer", + scrollPastEnd: "renderer", + fixedWidthGutter: "renderer", + theme: "renderer", + + scrollSpeed: "$mouseHandler", + dragDelay: "$mouseHandler", + dragEnabled: "$mouseHandler", + focusTimout: "$mouseHandler", + tooltipFollowsMouse: "$mouseHandler", + + firstLineNumber: "session", + overwrite: "session", + newLineMode: "session", + useWorker: "session", + useSoftTabs: "session", + tabSize: "session", + wrap: "session", + indentedSoftWrap: "session", + foldStyle: "session", + mode: "session" +}); + +exports.Editor = Editor; +}); + +define("ace/undomanager",["require","exports","module"], function(require, exports, module) { +"use strict"; var UndoManager = function() { this.reset(); }; (function() { this.execute = function(options) { - var deltas = options.args[0]; + var deltaSets = options.args[0]; this.$doc = options.args[1]; if (options.merge && this.hasUndo()){ this.dirtyCounter--; - deltas = this.$undoStack.pop().concat(deltas); + deltaSets = this.$undoStack.pop().concat(deltaSets); } - this.$undoStack.push(deltas); + this.$undoStack.push(deltaSets); this.$redoStack = []; - if (this.dirtyCounter < 0) { this.dirtyCounter = NaN; } this.dirtyCounter++; }; this.undo = function(dontSelect) { - var deltas = this.$undoStack.pop(); + var deltaSets = this.$undoStack.pop(); var undoSelectionRange = null; - if (deltas) { - undoSelectionRange = - this.$doc.undoChanges(deltas, dontSelect); - this.$redoStack.push(deltas); + if (deltaSets) { + undoSelectionRange = this.$doc.undoChanges(deltaSets, dontSelect); + this.$redoStack.push(deltaSets); this.dirtyCounter--; } return undoSelectionRange; }; this.redo = function(dontSelect) { - var deltas = this.$redoStack.pop(); + var deltaSets = this.$redoStack.pop(); var redoSelectionRange = null; - if (deltas) { + if (deltaSets) { redoSelectionRange = - this.$doc.redoChanges(deltas, dontSelect); - this.$undoStack.push(deltas); + this.$doc.redoChanges(this.$deserializeDeltas(deltaSets), dontSelect); + this.$undoStack.push(deltaSets); this.dirtyCounter++; } - return redoSelectionRange; }; this.reset = function() { @@ -12490,1642 +13565,55 @@ var UndoManager = function() { this.isClean = function() { return this.dirtyCounter === 0; }; - + this.$serializeDeltas = function(deltaSets) { + return cloneDeltaSetsObj(deltaSets, $serializeDelta); + }; + this.$deserializeDeltas = function(deltaSets) { + return cloneDeltaSetsObj(deltaSets, $deserializeDelta); + }; + + function $serializeDelta(delta){ + return { + action: delta.action, + start: delta.start, + end: delta.end, + lines: delta.lines.length == 1 ? null : delta.lines, + text: delta.lines.length == 1 ? delta.lines[0] : null + }; + } + + function $deserializeDelta(delta) { + return { + action: delta.action, + start: delta.start, + end: delta.end, + lines: delta.lines || [delta.text] + }; + } + + function cloneDeltaSetsObj(deltaSets_old, fnGetModifiedDelta) { + var deltaSets_new = new Array(deltaSets_old.length); + for (var i = 0; i < deltaSets_old.length; i++) { + var deltaSet_old = deltaSets_old[i]; + var deltaSet_new = { group: deltaSet_old.group, deltas: new Array(deltaSet_old.length)}; + + for (var j = 0; j < deltaSet_old.deltas.length; j++) { + var delta_old = deltaSet_old.deltas[j]; + deltaSet_new.deltas[j] = fnGetModifiedDelta(delta_old); + } + + deltaSets_new[i] = deltaSet_new; + } + return deltaSets_new; + } + }).call(UndoManager.prototype); exports.UndoManager = UndoManager; }); -define('ace/virtual_renderer', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/config', 'ace/lib/useragent', 'ace/layer/gutter', 'ace/layer/marker', 'ace/layer/text', 'ace/layer/cursor', 'ace/scrollbar', 'ace/renderloop', 'ace/layer/font_metrics', 'ace/lib/event_emitter'], function(require, exports, module) { - - -var oop = require("./lib/oop"); -var dom = require("./lib/dom"); -var config = require("./config"); -var useragent = require("./lib/useragent"); -var GutterLayer = require("./layer/gutter").Gutter; -var MarkerLayer = require("./layer/marker").Marker; -var TextLayer = require("./layer/text").Text; -var CursorLayer = require("./layer/cursor").Cursor; -var HScrollBar = require("./scrollbar").HScrollBar; -var VScrollBar = require("./scrollbar").VScrollBar; -var RenderLoop = require("./renderloop").RenderLoop; -var FontMetrics = require("./layer/font_metrics").FontMetrics; -var EventEmitter = require("./lib/event_emitter").EventEmitter; -var editorCss = ".ace_editor {\ -position: relative;\ -overflow: hidden;\ -font-family: 'Lato', 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\ -font-size: 12px;\ -line-height: normal;\ -direction: ltr;\ -}\ -.ace_scroller {\ -position: absolute;\ -overflow: hidden;\ -top: 0;\ -bottom: 0;\ -background-color: inherit;\ --ms-user-select: none;\ --moz-user-select: none;\ --webkit-user-select: none;\ -user-select: none;\ -}\ -.ace_content {\ -position: absolute;\ --moz-box-sizing: border-box;\ --webkit-box-sizing: border-box;\ -box-sizing: border-box;\ -cursor: text;\ -min-width: 100%;\ -}\ -.ace_dragging, .ace_dragging * {\ -cursor: move !important;\ -}\ -.ace_dragging .ace_scroller:before{\ -position: absolute;\ -top: 0;\ -left: 0;\ -right: 0;\ -bottom: 0;\ -content: '';\ -background: rgba(250, 250, 250, 0.01);\ -z-index: 1000;\ -}\ -.ace_dragging.ace_dark .ace_scroller:before{\ -background: rgba(0, 0, 0, 0.01);\ -}\ -.ace_selecting, .ace_selecting * {\ -cursor: text !important;\ -}\ -.ace_gutter {\ -position: absolute;\ -overflow : hidden;\ -width: auto;\ -top: 0;\ -bottom: 0;\ -left: 0;\ -cursor: default;\ -z-index: 4;\ --ms-user-select: none;\ --moz-user-select: none;\ --webkit-user-select: none;\ -user-select: none;\ -}\ -.ace_gutter-active-line {\ -position: absolute;\ -left: 0;\ -right: 0;\ -}\ -.ace_scroller.ace_scroll-left {\ -box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\ -}\ -.ace_gutter-cell {\ -padding-left: 19px;\ -padding-right: 6px;\ -background-repeat: no-repeat;\ -}\ -.ace_gutter-cell.ace_error {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\");\ -background-repeat: no-repeat;\ -background-position: 2px center;\ -}\ -.ace_gutter-cell.ace_warning {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\");\ -background-position: 2px center;\ -}\ -.ace_gutter-cell.ace_info {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\");\ -background-position: 2px center;\ -}\ -.ace_dark .ace_gutter-cell.ace_info {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\");\ -}\ -.ace_scrollbar {\ -position: absolute;\ -right: 0;\ -bottom: 0;\ -z-index: 6;\ -}\ -.ace_scrollbar-inner {\ -position: absolute;\ -cursor: text;\ -left: 0;\ -top: 0;\ -}\ -.ace_scrollbar-v{\ -overflow-x: hidden;\ -overflow-y: scroll;\ -top: 0;\ -}\ -.ace_scrollbar-h {\ -overflow-x: scroll;\ -overflow-y: hidden;\ -left: 0;\ -}\ -.ace_print-margin {\ -position: absolute;\ -height: 100%;\ -}\ -.ace_text-input {\ -position: absolute;\ -z-index: 0;\ -width: 0.5em;\ -height: 1em;\ -opacity: 0;\ -background: transparent;\ --moz-appearance: none;\ -appearance: none;\ -border: none;\ -resize: none;\ -outline: none;\ -overflow: hidden;\ -font: inherit;\ -padding: 0 1px;\ -margin: 0 -1px;\ -text-indent: -1em;\ --ms-user-select: text;\ --moz-user-select: text;\ --webkit-user-select: text;\ -user-select: text;\ -}\ -.ace_text-input.ace_composition {\ -background: #f8f8f8;\ -color: #111;\ -z-index: 1000;\ -opacity: 1;\ -text-indent: 0;\ -}\ -.ace_layer {\ -z-index: 1;\ -position: absolute;\ -overflow: hidden;\ -white-space: pre;\ -height: 100%;\ -width: 100%;\ --moz-box-sizing: border-box;\ --webkit-box-sizing: border-box;\ -box-sizing: border-box;\ -/* setting pointer-events: auto; on node under the mouse, which changes\ -during scroll, will break mouse wheel scrolling in Safari */\ -pointer-events: none;\ -}\ -.ace_gutter-layer {\ -position: relative;\ -width: auto;\ -text-align: right;\ -pointer-events: auto;\ -}\ -.ace_text-layer {\ -font: inherit !important;\ -}\ -.ace_cjk {\ -display: inline-block;\ -text-align: center;\ -}\ -.ace_cursor-layer {\ -z-index: 4;\ -}\ -.ace_cursor {\ -z-index: 4;\ -position: absolute;\ --moz-box-sizing: border-box;\ --webkit-box-sizing: border-box;\ -box-sizing: border-box;\ -border-left: 2px solid\ -}\ -.ace_slim-cursors .ace_cursor {\ -border-left-width: 1px;\ -}\ -.ace_overwrite-cursors .ace_cursor {\ -border-left-width: 0px;\ -border-bottom: 1px solid;\ -}\ -.ace_hidden-cursors .ace_cursor {\ -opacity: 0.2;\ -}\ -.ace_smooth-blinking .ace_cursor {\ --moz-transition: opacity 0.18s;\ --webkit-transition: opacity 0.18s;\ --o-transition: opacity 0.18s;\ --ms-transition: opacity 0.18s;\ -transition: opacity 0.18s;\ -}\ -.ace_editor.ace_multiselect .ace_cursor {\ -border-left-width: 1px;\ -}\ -.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\ -position: absolute;\ -z-index: 3;\ -}\ -.ace_marker-layer .ace_selection {\ -position: absolute;\ -z-index: 5;\ -}\ -.ace_marker-layer .ace_bracket {\ -position: absolute;\ -z-index: 6;\ -}\ -.ace_marker-layer .ace_active-line {\ -position: absolute;\ -z-index: 2;\ -}\ -.ace_marker-layer .ace_selected-word {\ -position: absolute;\ -z-index: 4;\ --moz-box-sizing: border-box;\ --webkit-box-sizing: border-box;\ -box-sizing: border-box;\ -}\ -.ace_line .ace_fold {\ --moz-box-sizing: border-box;\ --webkit-box-sizing: border-box;\ -box-sizing: border-box;\ -display: inline-block;\ -height: 11px;\ -margin-top: -2px;\ -vertical-align: middle;\ -background-image:\ -url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\ -url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\");\ -background-repeat: no-repeat, repeat-x;\ -background-position: center center, top left;\ -color: transparent;\ -border: 1px solid black;\ --moz-border-radius: 2px;\ --webkit-border-radius: 2px;\ -border-radius: 2px;\ -cursor: pointer;\ -pointer-events: auto;\ -}\ -.ace_dark .ace_fold {\ -}\ -.ace_fold:hover{\ -background-image:\ -url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\ -url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\");\ -}\ -.ace_tooltip {\ -background-color: #FFF;\ -background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\ -background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\ -border: 1px solid gray;\ -border-radius: 1px;\ -box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\ -color: black;\ -display: block;\ -max-width: 100%;\ -padding: 3px 4px;\ -position: fixed;\ -z-index: 999999;\ --moz-box-sizing: border-box;\ --webkit-box-sizing: border-box;\ -box-sizing: border-box;\ -cursor: default;\ -white-space: pre;\ -word-wrap: break-word;\ -line-height: normal;\ -font-style: normal;\ -font-weight: normal;\ -letter-spacing: normal;\ -pointer-events: none;\ -}\ -.ace_folding-enabled > .ace_gutter-cell {\ -padding-right: 13px;\ -}\ -.ace_fold-widget {\ --moz-box-sizing: border-box;\ --webkit-box-sizing: border-box;\ -box-sizing: border-box;\ -margin: 0 -12px 0 1px;\ -display: none;\ -width: 11px;\ -vertical-align: top;\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\");\ -background-repeat: no-repeat;\ -background-position: center;\ -border-radius: 3px;\ -border: 1px solid transparent;\ -cursor: pointer;\ -}\ -.ace_folding-enabled .ace_fold-widget {\ -display: inline-block; \ -}\ -.ace_fold-widget.ace_end {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\");\ -}\ -.ace_fold-widget.ace_closed {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\");\ -}\ -.ace_fold-widget:hover {\ -border: 1px solid rgba(0, 0, 0, 0.3);\ -background-color: rgba(255, 255, 255, 0.2);\ --moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\ --webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\ -box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\ -}\ -.ace_fold-widget:active {\ -border: 1px solid rgba(0, 0, 0, 0.4);\ -background-color: rgba(0, 0, 0, 0.05);\ --moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\ --webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\ -box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\ -}\ -/**\ -* Dark version for fold widgets\ -*/\ -.ace_dark .ace_fold-widget {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\");\ -}\ -.ace_dark .ace_fold-widget.ace_end {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\");\ -}\ -.ace_dark .ace_fold-widget.ace_closed {\ -background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\");\ -}\ -.ace_dark .ace_fold-widget:hover {\ -box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ -background-color: rgba(255, 255, 255, 0.1);\ -}\ -.ace_dark .ace_fold-widget:active {\ --moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ --webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ -box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ -}\ -.ace_fold-widget.ace_invalid {\ -background-color: #FFB4B4;\ -border-color: #DE5555;\ -}\ -.ace_fade-fold-widgets .ace_fold-widget {\ --moz-transition: opacity 0.4s ease 0.05s;\ --webkit-transition: opacity 0.4s ease 0.05s;\ --o-transition: opacity 0.4s ease 0.05s;\ --ms-transition: opacity 0.4s ease 0.05s;\ -transition: opacity 0.4s ease 0.05s;\ -opacity: 0;\ -}\ -.ace_fade-fold-widgets:hover .ace_fold-widget {\ --moz-transition: opacity 0.05s ease 0.05s;\ --webkit-transition: opacity 0.05s ease 0.05s;\ --o-transition: opacity 0.05s ease 0.05s;\ --ms-transition: opacity 0.05s ease 0.05s;\ -transition: opacity 0.05s ease 0.05s;\ -opacity:1;\ -}\ -.ace_underline {\ -text-decoration: underline;\ -}\ -.ace_bold {\ -font-weight: bold;\ -}\ -.ace_nobold .ace_bold {\ -font-weight: normal;\ -}\ -.ace_italic {\ -font-style: italic;\ -}\ -.ace_error-marker {\ -background-color: rgba(255, 0, 0,0.2);\ -position: absolute;\ -z-index: 9;\ -}\ -.ace_highlight-marker {\ -background-color: rgba(255, 255, 0,0.2);\ -position: absolute;\ -z-index: 8;\ -}\ -"; - -dom.importCssString(editorCss, "ace_editor"); - -var VirtualRenderer = function(container, theme) { - var _self = this; - - this.container = container || dom.createElement("div"); - this.$keepTextAreaAtCursor = !useragent.isOldIE; - - dom.addCssClass(this.container, "ace_editor"); - - this.setTheme(theme); - - this.$gutter = dom.createElement("div"); - this.$gutter.className = "ace_gutter"; - this.container.appendChild(this.$gutter); - - this.scroller = dom.createElement("div"); - this.scroller.className = "ace_scroller"; - this.container.appendChild(this.scroller); - - this.content = dom.createElement("div"); - this.content.className = "ace_content"; - this.scroller.appendChild(this.content); - - this.$gutterLayer = new GutterLayer(this.$gutter); - this.$gutterLayer.on("changeGutterWidth", this.onGutterResize.bind(this)); - - this.$markerBack = new MarkerLayer(this.content); - - var textLayer = this.$textLayer = new TextLayer(this.content); - this.canvas = textLayer.element; - - this.$markerFront = new MarkerLayer(this.content); - - this.$cursorLayer = new CursorLayer(this.content); - this.$horizScroll = false; - this.$vScroll = false; - - this.scrollBar = - this.scrollBarV = new VScrollBar(this.container, this); - this.scrollBarH = new HScrollBar(this.container, this); - this.scrollBarV.addEventListener("scroll", function(e) { - if (!_self.$scrollAnimation) - _self.session.setScrollTop(e.data - _self.scrollMargin.top); - }); - this.scrollBarH.addEventListener("scroll", function(e) { - if (!_self.$scrollAnimation) - _self.session.setScrollLeft(e.data - _self.scrollMargin.left); - }); - - this.scrollTop = 0; - this.scrollLeft = 0; - - this.cursorPos = { - row : 0, - column : 0 - }; - - this.$fontMetrics = new FontMetrics(this.container, 500); - this.$textLayer.$setFontMetrics(this.$fontMetrics); - this.$textLayer.addEventListener("changeCharacterSize", function(e) { - _self.updateCharacterSize(); - _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height); - _self._signal("changeCharacterSize", e); - }); - - this.$size = { - width: 0, - height: 0, - scrollerHeight: 0, - scrollerWidth: 0, - $dirty: true - }; - - this.layerConfig = { - width : 1, - padding : 0, - firstRow : 0, - firstRowScreen: 0, - lastRow : 0, - lineHeight : 0, - characterWidth : 0, - minHeight : 1, - maxHeight : 1, - offset : 0, - height : 1, - gutterOffset: 1 - }; - - this.scrollMargin = { - left: 0, - right: 0, - top: 0, - bottom: 0, - v: 0, - h: 0 - }; - - this.$loop = new RenderLoop( - this.$renderChanges.bind(this), - this.container.ownerDocument.defaultView - ); - this.$loop.schedule(this.CHANGE_FULL); - - this.updateCharacterSize(); - this.setPadding(4); - config.resetOptions(this); - config._emit("renderer", this); -}; - -(function() { - - this.CHANGE_CURSOR = 1; - this.CHANGE_MARKER = 2; - this.CHANGE_GUTTER = 4; - this.CHANGE_SCROLL = 8; - this.CHANGE_LINES = 16; - this.CHANGE_TEXT = 32; - this.CHANGE_SIZE = 64; - this.CHANGE_MARKER_BACK = 128; - this.CHANGE_MARKER_FRONT = 256; - this.CHANGE_FULL = 512; - this.CHANGE_H_SCROLL = 1024; - - oop.implement(this, EventEmitter); - - this.updateCharacterSize = function() { - if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) { - this.$allowBoldFonts = this.$textLayer.allowBoldFonts; - this.setStyle("ace_nobold", !this.$allowBoldFonts); - } - - this.layerConfig.characterWidth = - this.characterWidth = this.$textLayer.getCharacterWidth(); - this.layerConfig.lineHeight = - this.lineHeight = this.$textLayer.getLineHeight(); - this.$updatePrintMargin(); - }; - this.setSession = function(session) { - if (this.session) - this.session.doc.off("changeNewLineMode", this.onChangeNewLineMode); - - this.session = session; - if (!session) - return; - - if (this.scrollMargin.top && session.getScrollTop() <= 0) - session.setScrollTop(-this.scrollMargin.top); - - this.$cursorLayer.setSession(session); - this.$markerBack.setSession(session); - this.$markerFront.setSession(session); - this.$gutterLayer.setSession(session); - this.$textLayer.setSession(session); - this.$loop.schedule(this.CHANGE_FULL); - this.session.$setFontMetrics(this.$fontMetrics); - - this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this); - this.onChangeNewLineMode() - this.session.doc.on("changeNewLineMode", this.onChangeNewLineMode); - }; - this.updateLines = function(firstRow, lastRow) { - if (lastRow === undefined) - lastRow = Infinity; - - if (!this.$changedLines) { - this.$changedLines = { - firstRow: firstRow, - lastRow: lastRow - }; - } - else { - if (this.$changedLines.firstRow > firstRow) - this.$changedLines.firstRow = firstRow; - - if (this.$changedLines.lastRow < lastRow) - this.$changedLines.lastRow = lastRow; - } - - if (this.$changedLines.firstRow > this.layerConfig.lastRow || - this.$changedLines.lastRow < this.layerConfig.firstRow) - return; - this.$loop.schedule(this.CHANGE_LINES); - }; - - this.onChangeNewLineMode = function() { - this.$loop.schedule(this.CHANGE_TEXT); - this.$textLayer.$updateEolChar(); - }; - - this.onChangeTabSize = function() { - this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER); - this.$textLayer.onChangeTabSize(); - }; - this.updateText = function() { - this.$loop.schedule(this.CHANGE_TEXT); - }; - this.updateFull = function(force) { - if (force) - this.$renderChanges(this.CHANGE_FULL, true); - else - this.$loop.schedule(this.CHANGE_FULL); - }; - this.updateFontSize = function() { - this.$textLayer.checkForSizeChanges(); - }; - - this.$changes = 0; - this.$updateSizeAsync = function() { - if (this.$loop.pending) - this.$size.$dirty = true; - else - this.onResize(); - }; - this.onResize = function(force, gutterWidth, width, height) { - if (this.resizing > 2) - return; - else if (this.resizing > 0) - this.resizing++; - else - this.resizing = force ? 1 : 0; - var el = this.container; - if (!height) - height = el.clientHeight || el.scrollHeight; - if (!width) - width = el.clientWidth || el.scrollWidth; - var changes = this.$updateCachedSize(force, gutterWidth, width, height); - - if (!this.$size.scrollerHeight || (!width && !height)) - return this.resizing = 0; - - if (force) - this.$gutterLayer.$padding = null; - - if (force) - this.$renderChanges(changes | this.$changes, true); - else - this.$loop.schedule(changes | this.$changes); - - if (this.resizing) - this.resizing = 0; - }; - - this.$updateCachedSize = function(force, gutterWidth, width, height) { - height -= (this.$extraHeight || 0); - var changes = 0; - var size = this.$size; - var oldSize = { - width: size.width, - height: size.height, - scrollerHeight: size.scrollerHeight, - scrollerWidth: size.scrollerWidth - }; - if (height && (force || size.height != height)) { - size.height = height; - changes |= this.CHANGE_SIZE; - - size.scrollerHeight = size.height; - if (this.$horizScroll) - size.scrollerHeight -= this.scrollBarH.getHeight(); - this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + "px"; - - changes = changes | this.CHANGE_SCROLL; - } - - if (width && (force || size.width != width)) { - changes |= this.CHANGE_SIZE; - size.width = width; - - if (gutterWidth == null) - gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0; - - this.gutterWidth = gutterWidth; - - this.scrollBarH.element.style.left = - this.scroller.style.left = gutterWidth + "px"; - size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth()); - - this.scrollBarH.element.style.right = - this.scroller.style.right = this.scrollBarV.getWidth() + "px"; - this.scroller.style.bottom = this.scrollBarH.getHeight() + "px"; - - if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force) - changes |= this.CHANGE_FULL; - } - - size.$dirty = !width || !height; - - if (changes) - this._signal("resize", oldSize); - - return changes; - }; - - this.onGutterResize = function() { - var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0; - if (gutterWidth != this.gutterWidth) - this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height); - - if (this.session.getUseWrapMode() && this.adjustWrapLimit()) { - this.$loop.schedule(this.CHANGE_FULL); - } else if (this.$size.$dirty) { - this.$loop.schedule(this.CHANGE_FULL); - } else { - this.$computeLayerConfig(); - this.$loop.schedule(this.CHANGE_MARKER); - } - }; - this.adjustWrapLimit = function() { - var availableWidth = this.$size.scrollerWidth - this.$padding * 2; - var limit = Math.floor(availableWidth / this.characterWidth); - return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn); - }; - this.setAnimatedScroll = function(shouldAnimate){ - this.setOption("animatedScroll", shouldAnimate); - }; - this.getAnimatedScroll = function() { - return this.$animatedScroll; - }; - this.setShowInvisibles = function(showInvisibles) { - this.setOption("showInvisibles", showInvisibles); - }; - this.getShowInvisibles = function() { - return this.getOption("showInvisibles"); - }; - this.getDisplayIndentGuides = function() { - return this.getOption("displayIndentGuides"); - }; - - this.setDisplayIndentGuides = function(display) { - this.setOption("displayIndentGuides", display); - }; - this.setShowPrintMargin = function(showPrintMargin) { - this.setOption("showPrintMargin", showPrintMargin); - }; - this.getShowPrintMargin = function() { - return this.getOption("showPrintMargin"); - }; - this.setPrintMarginColumn = function(showPrintMargin) { - this.setOption("printMarginColumn", showPrintMargin); - }; - this.getPrintMarginColumn = function() { - return this.getOption("printMarginColumn"); - }; - this.getShowGutter = function(){ - return this.getOption("showGutter"); - }; - this.setShowGutter = function(show){ - return this.setOption("showGutter", show); - }; - - this.getFadeFoldWidgets = function(){ - return this.getOption("fadeFoldWidgets") - }; - - this.setFadeFoldWidgets = function(show) { - this.setOption("fadeFoldWidgets", show); - }; - - this.setHighlightGutterLine = function(shouldHighlight) { - this.setOption("highlightGutterLine", shouldHighlight); - }; - - this.getHighlightGutterLine = function() { - return this.getOption("highlightGutterLine"); - }; - - this.$updateGutterLineHighlight = function() { - var pos = this.$cursorLayer.$pixelPos; - var height = this.layerConfig.lineHeight; - if (this.session.getUseWrapMode()) { - var cursor = this.session.selection.getCursor(); - cursor.column = 0; - pos = this.$cursorLayer.getPixelPosition(cursor, true); - height *= this.session.getRowLength(cursor.row); - } - this.$gutterLineHighlight.style.top = pos.top - this.layerConfig.offset + "px"; - this.$gutterLineHighlight.style.height = height + "px"; - }; - - this.$updatePrintMargin = function() { - if (!this.$showPrintMargin && !this.$printMarginEl) - return; - - if (!this.$printMarginEl) { - var containerEl = dom.createElement("div"); - containerEl.className = "ace_layer ace_print-margin-layer"; - this.$printMarginEl = dom.createElement("div"); - this.$printMarginEl.className = "ace_print-margin"; - containerEl.appendChild(this.$printMarginEl); - this.content.insertBefore(containerEl, this.content.firstChild); - } - - var style = this.$printMarginEl.style; - style.left = ((this.characterWidth * this.$printMarginColumn) + this.$padding) + "px"; - style.visibility = this.$showPrintMargin ? "visible" : "hidden"; - - if (this.session && this.session.$wrap == -1) - this.adjustWrapLimit(); - }; - this.getContainerElement = function() { - return this.container; - }; - this.getMouseEventTarget = function() { - return this.content; - }; - this.getTextAreaContainer = function() { - return this.container; - }; - this.$moveTextAreaToCursor = function() { - if (!this.$keepTextAreaAtCursor) - return; - var config = this.layerConfig; - var posTop = this.$cursorLayer.$pixelPos.top; - var posLeft = this.$cursorLayer.$pixelPos.left; - posTop -= config.offset; - - var h = this.lineHeight; - if (posTop < 0 || posTop > config.height - h) - return; - - var w = this.characterWidth; - if (this.$composition) { - var val = this.textarea.value.replace(/^\x01+/, ""); - w *= (this.session.$getStringScreenWidth(val)[0]+2); - h += 2; - posTop -= 1; - } - posLeft -= this.scrollLeft; - if (posLeft > this.$size.scrollerWidth - w) - posLeft = this.$size.scrollerWidth - w; - - posLeft -= this.scrollBar.width; - - this.textarea.style.height = h + "px"; - this.textarea.style.width = w + "px"; - this.textarea.style.right = Math.max(0, this.$size.scrollerWidth - posLeft - w) + "px"; - this.textarea.style.bottom = Math.max(0, this.$size.height - posTop - h) + "px"; - }; - this.getFirstVisibleRow = function() { - return this.layerConfig.firstRow; - }; - this.getFirstFullyVisibleRow = function() { - return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1); - }; - this.getLastFullyVisibleRow = function() { - var flint = Math.floor((this.layerConfig.height + this.layerConfig.offset) / this.layerConfig.lineHeight); - return this.layerConfig.firstRow - 1 + flint; - }; - this.getLastVisibleRow = function() { - return this.layerConfig.lastRow; - }; - - this.$padding = null; - this.setPadding = function(padding) { - this.$padding = padding; - this.$textLayer.setPadding(padding); - this.$cursorLayer.setPadding(padding); - this.$markerFront.setPadding(padding); - this.$markerBack.setPadding(padding); - this.$loop.schedule(this.CHANGE_FULL); - this.$updatePrintMargin(); - }; - - this.setScrollMargin = function(top, bottom, left, right) { - var sm = this.scrollMargin; - sm.top = top|0; - sm.bottom = bottom|0; - sm.right = right|0; - sm.left = left|0; - sm.v = sm.top + sm.bottom; - sm.h = sm.left + sm.right; - if (sm.top && this.scrollTop <= 0 && this.session) - this.session.setScrollTop(-sm.top); - this.updateFull(); - }; - this.getHScrollBarAlwaysVisible = function() { - return this.$hScrollBarAlwaysVisible; - }; - this.setHScrollBarAlwaysVisible = function(alwaysVisible) { - this.setOption("hScrollBarAlwaysVisible", alwaysVisible); - }; - this.getVScrollBarAlwaysVisible = function() { - return this.$hScrollBarAlwaysVisible; - }; - this.setVScrollBarAlwaysVisible = function(alwaysVisible) { - this.setOption("vScrollBarAlwaysVisible", alwaysVisible); - }; - - this.$updateScrollBarV = function() { - this.scrollBarV.setScrollHeight(this.layerConfig.maxHeight + this.scrollMargin.v); - this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top); - }; - this.$updateScrollBarH = function() { - this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h); - this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left); - }; - - this.$frozen = false; - this.freeze = function() { - this.$frozen = true; - }; - - this.unfreeze = function() { - this.$frozen = false; - }; - - this.$renderChanges = function(changes, force) { - if (this.$changes) { - changes |= this.$changes; - this.$changes = 0; - } - if ((!this.session || !this.container.offsetWidth || this.$frozen) || (!changes && !force)) { - this.$changes |= changes; - return; - } - if (this.$size.$dirty) { - this.$changes |= changes; - return this.onResize(true); - } - if (!this.lineHeight) { - this.$textLayer.checkForSizeChanges(); - } - - this._signal("beforeRender"); - var config = this.layerConfig; - if (changes & this.CHANGE_FULL || - changes & this.CHANGE_SIZE || - changes & this.CHANGE_TEXT || - changes & this.CHANGE_LINES || - changes & this.CHANGE_SCROLL || - changes & this.CHANGE_H_SCROLL - ) { - changes |= this.$computeLayerConfig(); - config = this.layerConfig; - this.$updateScrollBarV(); - if (changes & this.CHANGE_H_SCROLL) - this.$updateScrollBarH(); - this.$gutterLayer.element.style.marginTop = (-config.offset) + "px"; - this.content.style.marginTop = (-config.offset) + "px"; - this.content.style.width = config.width + 2 * this.$padding + "px"; - this.content.style.height = config.minHeight + "px"; - } - if (changes & this.CHANGE_H_SCROLL) { - this.content.style.marginLeft = -this.scrollLeft + "px"; - this.scroller.className = this.scrollLeft <= 0 ? "ace_scroller" : "ace_scroller ace_scroll-left"; - } - if (changes & this.CHANGE_FULL) { - this.$textLayer.update(config); - if (this.$showGutter) - this.$gutterLayer.update(config); - this.$markerBack.update(config); - this.$markerFront.update(config); - this.$cursorLayer.update(config); - this.$moveTextAreaToCursor(); - this.$highlightGutterLine && this.$updateGutterLineHighlight(); - this._signal("afterRender"); - return; - } - if (changes & this.CHANGE_SCROLL) { - if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES) - this.$textLayer.update(config); - else - this.$textLayer.scrollLines(config); - - if (this.$showGutter) - this.$gutterLayer.update(config); - this.$markerBack.update(config); - this.$markerFront.update(config); - this.$cursorLayer.update(config); - this.$highlightGutterLine && this.$updateGutterLineHighlight(); - this.$moveTextAreaToCursor(); - this._signal("afterRender"); - return; - } - - if (changes & this.CHANGE_TEXT) { - this.$textLayer.update(config); - if (this.$showGutter) - this.$gutterLayer.update(config); - } - else if (changes & this.CHANGE_LINES) { - if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter) - this.$gutterLayer.update(config); - } - else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) { - if (this.$showGutter) - this.$gutterLayer.update(config); - } - - if (changes & this.CHANGE_CURSOR) { - this.$cursorLayer.update(config); - this.$moveTextAreaToCursor(); - this.$highlightGutterLine && this.$updateGutterLineHighlight(); - } - - if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) { - this.$markerFront.update(config); - } - - if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) { - this.$markerBack.update(config); - } - - this._signal("afterRender"); - }; - - - this.$autosize = function() { - var height = this.session.getScreenLength() * this.lineHeight; - var maxHeight = this.$maxLines * this.lineHeight; - var desiredHeight = Math.max( - (this.$minLines||1) * this.lineHeight, - Math.min(maxHeight, height) - ) + this.scrollMargin.v + (this.$extraHeight || 0); - var vScroll = height > maxHeight; - - if (desiredHeight != this.desiredHeight || - this.$size.height != this.desiredHeight || vScroll != this.$vScroll) { - if (vScroll != this.$vScroll) { - this.$vScroll = vScroll; - this.scrollBarV.setVisible(vScroll); - } - - var w = this.container.clientWidth; - this.container.style.height = desiredHeight + "px"; - this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight); - this.desiredHeight = desiredHeight; - } - }; - - this.$computeLayerConfig = function() { - if (this.$maxLines && this.lineHeight > 1) - this.$autosize(); - - var session = this.session; - var size = this.$size; - - var hideScrollbars = size.height <= 2 * this.lineHeight; - var screenLines = this.session.getScreenLength(); - var maxHeight = screenLines * this.lineHeight; - - var offset = this.scrollTop % this.lineHeight; - var minHeight = size.scrollerHeight + this.lineHeight; - - var longestLine = this.$getLongestLine(); - - var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible || - size.scrollerWidth - longestLine - 2 * this.$padding < 0); - - var hScrollChanged = this.$horizScroll !== horizScroll; - if (hScrollChanged) { - this.$horizScroll = horizScroll; - this.scrollBarH.setVisible(horizScroll); - } - - if (!this.$maxLines && this.$scrollPastEnd) { - if (this.scrollTop > maxHeight - size.scrollerHeight) - maxHeight += Math.min( - (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd, - this.scrollTop - maxHeight + size.scrollerHeight - ); - } - - var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible || - size.scrollerHeight - maxHeight < 0); - var vScrollChanged = this.$vScroll !== vScroll; - if (vScrollChanged) { - this.$vScroll = vScroll; - this.scrollBarV.setVisible(vScroll); - } - - this.session.setScrollTop(Math.max(-this.scrollMargin.top, - Math.min(this.scrollTop, maxHeight - size.scrollerHeight + this.scrollMargin.bottom))); - - this.session.setScrollLeft(Math.max(-this.scrollMargin.left, Math.min(this.scrollLeft, - longestLine + 2 * this.$padding - size.scrollerWidth + this.scrollMargin.right))); - - var lineCount = Math.ceil(minHeight / this.lineHeight) - 1; - var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight)); - var lastRow = firstRow + lineCount; - var firstRowScreen, firstRowHeight; - var lineHeight = this.lineHeight; - firstRow = session.screenToDocumentRow(firstRow, 0); - var foldLine = session.getFoldLine(firstRow); - if (foldLine) { - firstRow = foldLine.start.row; - } - - firstRowScreen = session.documentToScreenRow(firstRow, 0); - firstRowHeight = session.getRowLength(firstRow) * lineHeight; - - lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1); - minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight + - firstRowHeight; - - offset = this.scrollTop - firstRowScreen * lineHeight; - - var changes = 0; - if (this.layerConfig.width != longestLine) - changes = this.CHANGE_H_SCROLL; - if (hScrollChanged || vScrollChanged) { - changes = this.$updateCachedSize(true, this.gutterWidth, size.width, size.height); - this._signal("scrollbarVisibilityChanged"); - if (vScrollChanged) - longestLine = this.$getLongestLine(); - } - - this.layerConfig = { - width : longestLine, - padding : this.$padding, - firstRow : firstRow, - firstRowScreen: firstRowScreen, - lastRow : lastRow, - lineHeight : lineHeight, - characterWidth : this.characterWidth, - minHeight : minHeight, - maxHeight : maxHeight, - offset : offset, - gutterOffset : Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)), - height : this.$size.scrollerHeight - }; - - return changes; - }; - - this.$updateLines = function() { - var firstRow = this.$changedLines.firstRow; - var lastRow = this.$changedLines.lastRow; - this.$changedLines = null; - - var layerConfig = this.layerConfig; - - if (firstRow > layerConfig.lastRow + 1) { return; } - if (lastRow < layerConfig.firstRow) { return; } - if (lastRow === Infinity) { - if (this.$showGutter) - this.$gutterLayer.update(layerConfig); - this.$textLayer.update(layerConfig); - return; - } - this.$textLayer.updateLines(layerConfig, firstRow, lastRow); - return true; - }; - - this.$getLongestLine = function() { - var charCount = this.session.getScreenWidth(); - if (this.showInvisibles && !this.session.$useWrapMode) - charCount += 1; - - return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth)); - }; - this.updateFrontMarkers = function() { - this.$markerFront.setMarkers(this.session.getMarkers(true)); - this.$loop.schedule(this.CHANGE_MARKER_FRONT); - }; - this.updateBackMarkers = function() { - this.$markerBack.setMarkers(this.session.getMarkers()); - this.$loop.schedule(this.CHANGE_MARKER_BACK); - }; - this.addGutterDecoration = function(row, className){ - this.$gutterLayer.addGutterDecoration(row, className); - }; - this.removeGutterDecoration = function(row, className){ - this.$gutterLayer.removeGutterDecoration(row, className); - }; - this.updateBreakpoints = function(rows) { - this.$loop.schedule(this.CHANGE_GUTTER); - }; - this.setAnnotations = function(annotations) { - this.$gutterLayer.setAnnotations(annotations); - this.$loop.schedule(this.CHANGE_GUTTER); - }; - this.updateCursor = function() { - this.$loop.schedule(this.CHANGE_CURSOR); - }; - this.hideCursor = function() { - this.$cursorLayer.hideCursor(); - }; - this.showCursor = function() { - this.$cursorLayer.showCursor(); - }; - - this.scrollSelectionIntoView = function(anchor, lead, offset) { - this.scrollCursorIntoView(anchor, offset); - this.scrollCursorIntoView(lead, offset); - }; - this.scrollCursorIntoView = function(cursor, offset, $viewMargin) { - if (this.$size.scrollerHeight === 0) - return; - - var pos = this.$cursorLayer.getPixelPosition(cursor); - - var left = pos.left; - var top = pos.top; - - var topMargin = $viewMargin && $viewMargin.top || 0; - var bottomMargin = $viewMargin && $viewMargin.bottom || 0; - - var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop; - - if (scrollTop + topMargin > top) { - if (offset) - top -= offset * this.$size.scrollerHeight; - if (top === 0) - top = -this.scrollMargin.top; - this.session.setScrollTop(top); - } else if (scrollTop + this.$size.scrollerHeight - bottomMargin < top + this.lineHeight) { - if (offset) - top += offset * this.$size.scrollerHeight; - this.session.setScrollTop(top + this.lineHeight - this.$size.scrollerHeight); - } - - var scrollLeft = this.scrollLeft; - - if (scrollLeft > left) { - if (left < this.$padding + 2 * this.layerConfig.characterWidth) - left = -this.scrollMargin.left; - this.session.setScrollLeft(left); - } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) { - this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth)); - } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) { - this.session.setScrollLeft(0); - } - }; - this.getScrollTop = function() { - return this.session.getScrollTop(); - }; - this.getScrollLeft = function() { - return this.session.getScrollLeft(); - }; - this.getScrollTopRow = function() { - return this.scrollTop / this.lineHeight; - }; - this.getScrollBottomRow = function() { - return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1); - }; - this.scrollToRow = function(row) { - this.session.setScrollTop(row * this.lineHeight); - }; - - this.alignCursor = function(cursor, alignment) { - if (typeof cursor == "number") - cursor = {row: cursor, column: 0}; - - var pos = this.$cursorLayer.getPixelPosition(cursor); - var h = this.$size.scrollerHeight - this.lineHeight; - var offset = pos.top - h * (alignment || 0); - - this.session.setScrollTop(offset); - return offset; - }; - - this.STEPS = 8; - this.$calcSteps = function(fromValue, toValue){ - var i = 0; - var l = this.STEPS; - var steps = []; - - var func = function(t, x_min, dx) { - return dx * (Math.pow(t - 1, 3) + 1) + x_min; - }; - - for (i = 0; i < l; ++i) - steps.push(func(i / this.STEPS, fromValue, toValue - fromValue)); - - return steps; - }; - this.scrollToLine = function(line, center, animate, callback) { - var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0}); - var offset = pos.top; - if (center) - offset -= this.$size.scrollerHeight / 2; - - var initialScroll = this.scrollTop; - this.session.setScrollTop(offset); - if (animate !== false) - this.animateScrolling(initialScroll, callback); - }; - - this.animateScrolling = function(fromValue, callback) { - var toValue = this.scrollTop; - if (!this.$animatedScroll) - return; - var _self = this; - - if (fromValue == toValue) - return; - - if (this.$scrollAnimation) { - var oldSteps = this.$scrollAnimation.steps; - if (oldSteps.length) { - fromValue = oldSteps[0]; - if (fromValue == toValue) - return; - } - } - - var steps = _self.$calcSteps(fromValue, toValue); - this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps}; - - clearInterval(this.$timer); - - _self.session.setScrollTop(steps.shift()); - _self.session.$scrollTop = toValue; - this.$timer = setInterval(function() { - if (steps.length) { - _self.session.setScrollTop(steps.shift()); - _self.session.$scrollTop = toValue; - } else if (toValue != null) { - _self.session.$scrollTop = -1; - _self.session.setScrollTop(toValue); - toValue = null; - } else { - _self.$timer = clearInterval(_self.$timer); - _self.$scrollAnimation = null; - callback && callback(); - } - }, 10); - }; - this.scrollToY = function(scrollTop) { - if (this.scrollTop !== scrollTop) { - this.$loop.schedule(this.CHANGE_SCROLL); - this.scrollTop = scrollTop; - } - }; - this.scrollToX = function(scrollLeft) { - if (this.scrollLeft !== scrollLeft) - this.scrollLeft = scrollLeft; - this.$loop.schedule(this.CHANGE_H_SCROLL); - }; - this.scrollTo = function(x, y) { - this.session.setScrollTop(y); - this.session.setScrollLeft(y); - }; - this.scrollBy = function(deltaX, deltaY) { - deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY); - deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX); - }; - this.isScrollableBy = function(deltaX, deltaY) { - if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top) - return true; - if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight - - this.layerConfig.maxHeight - (this.$size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd - < -1 + this.scrollMargin.bottom) - return true; - if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left) - return true; - if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth - - this.layerConfig.width < -1 + this.scrollMargin.right) - return true; - }; - - this.pixelToScreenCoordinates = function(x, y) { - var canvasPos = this.scroller.getBoundingClientRect(); - - var offset = (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth; - var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight); - var col = Math.round(offset); - - return {row: row, column: col, side: offset - col > 0 ? 1 : -1}; - }; - - this.screenToTextCoordinates = function(x, y) { - var canvasPos = this.scroller.getBoundingClientRect(); - - var col = Math.round( - (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth - ); - - var row = (y + this.scrollTop - canvasPos.top) / this.lineHeight; - - return this.session.screenToDocumentPosition(row, Math.max(col, 0)); - }; - this.textToScreenCoordinates = function(row, column) { - var canvasPos = this.scroller.getBoundingClientRect(); - var pos = this.session.documentToScreenPosition(row, column); - - var x = this.$padding + Math.round(pos.column * this.characterWidth); - var y = pos.row * this.lineHeight; - - return { - pageX: canvasPos.left + x - this.scrollLeft, - pageY: canvasPos.top + y - this.scrollTop - }; - }; - this.visualizeFocus = function() { - dom.addCssClass(this.container, "ace_focus"); - }; - this.visualizeBlur = function() { - dom.removeCssClass(this.container, "ace_focus"); - }; - this.showComposition = function(position) { - if (!this.$composition) - this.$composition = { - keepTextAreaAtCursor: this.$keepTextAreaAtCursor, - cssText: this.textarea.style.cssText - }; - - this.$keepTextAreaAtCursor = true; - dom.addCssClass(this.textarea, "ace_composition"); - this.textarea.style.cssText = ""; - this.$moveTextAreaToCursor(); - }; - this.setCompositionText = function(text) { - this.$moveTextAreaToCursor(); - }; - this.hideComposition = function() { - if (!this.$composition) - return; - - dom.removeCssClass(this.textarea, "ace_composition"); - this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor; - this.textarea.style.cssText = this.$composition.cssText; - this.$composition = null; - }; - this.setTheme = function(theme, cb) { - var _self = this; - this.$themeId = theme; - _self._dispatchEvent('themeChange',{theme:theme}); - - if (!theme || typeof theme == "string") { - var moduleName = theme || this.$options.theme.initialValue; - config.loadModule(["theme", moduleName], afterLoad); - } else { - afterLoad(theme); - } - - function afterLoad(module) { - if (_self.$themeId != theme) - return cb && cb(); - if (!module.cssClass) - return; - dom.importCssString( - module.cssText, - module.cssClass, - _self.container.ownerDocument - ); - - if (_self.theme) - dom.removeCssClass(_self.container, _self.theme.cssClass); - - var padding = "padding" in module ? module.padding - : "padding" in (_self.theme || {}) ? 4 : _self.$padding; - if (_self.$padding && padding != _self.$padding) - _self.setPadding(padding); - _self.$theme = module.cssClass; - - _self.theme = module; - dom.addCssClass(_self.container, module.cssClass); - dom.setCssClass(_self.container, "ace_dark", module.isDark); - if (_self.$size) { - _self.$size.width = 0; - _self.$updateSizeAsync(); - } - - _self._dispatchEvent('themeLoaded', {theme:module}); - cb && cb(); - } - }; - this.getTheme = function() { - return this.$themeId; - }; - this.setStyle = function(style, include) { - dom.setCssClass(this.container, style, include !== false); - }; - this.unsetStyle = function(style) { - dom.removeCssClass(this.container, style); - }; - - this.setCursorStyle = function(style) { - if (this.content.style.cursor != style) - this.content.style.cursor = style; - }; - this.setMouseCursor = function(cursorStyle) { - this.content.style.cursor = cursorStyle; - }; - this.destroy = function() { - this.$textLayer.destroy(); - this.$cursorLayer.destroy(); - }; - -}).call(VirtualRenderer.prototype); - - -config.defineOptions(VirtualRenderer.prototype, "renderer", { - animatedScroll: {initialValue: false}, - showInvisibles: { - set: function(value) { - if (this.$textLayer.setShowInvisibles(value)) - this.$loop.schedule(this.CHANGE_TEXT); - }, - initialValue: false - }, - showPrintMargin: { - set: function() { this.$updatePrintMargin(); }, - initialValue: true - }, - printMarginColumn: { - set: function() { this.$updatePrintMargin(); }, - initialValue: 80 - }, - printMargin: { - set: function(val) { - if (typeof val == "number") - this.$printMarginColumn = val; - this.$showPrintMargin = !!val; - this.$updatePrintMargin(); - }, - get: function() { - return this.$showPrintMargin && this.$printMarginColumn; - } - }, - showGutter: { - set: function(show){ - this.$gutter.style.display = show ? "block" : "none"; - this.$loop.schedule(this.CHANGE_FULL); - this.onGutterResize(); - }, - initialValue: true - }, - fadeFoldWidgets: { - set: function(show) { - dom.setCssClass(this.$gutter, "ace_fade-fold-widgets", show); - }, - initialValue: false - }, - showFoldWidgets: { - set: function(show) {this.$gutterLayer.setShowFoldWidgets(show)}, - initialValue: true - }, - showLineNumbers: { - set: function(show) { - this.$gutterLayer.setShowLineNumbers(show); - this.$loop.schedule(this.CHANGE_GUTTER); - }, - initialValue: true - }, - displayIndentGuides: { - set: function(show) { - if (this.$textLayer.setDisplayIndentGuides(show)) - this.$loop.schedule(this.CHANGE_TEXT); - }, - initialValue: true - }, - highlightGutterLine: { - set: function(shouldHighlight) { - if (!this.$gutterLineHighlight) { - this.$gutterLineHighlight = dom.createElement("div"); - this.$gutterLineHighlight.className = "ace_gutter-active-line"; - this.$gutter.appendChild(this.$gutterLineHighlight); - return; - } - - this.$gutterLineHighlight.style.display = shouldHighlight ? "" : "none"; - if (this.$cursorLayer.$pixelPos) - this.$updateGutterLineHighlight(); - }, - initialValue: false, - value: true - }, - hScrollBarAlwaysVisible: { - set: function(val) { - if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll) - this.$loop.schedule(this.CHANGE_SCROLL); - }, - initialValue: false - }, - vScrollBarAlwaysVisible: { - set: function(val) { - if (!this.$vScrollBarAlwaysVisible || !this.$vScroll) - this.$loop.schedule(this.CHANGE_SCROLL); - }, - initialValue: false - }, - fontSize: { - set: function(size) { - if (typeof size == "number") - size = size + "px"; - this.container.style.fontSize = size; - this.updateFontSize(); - }, - initialValue: 12 - }, - fontFamily: { - set: function(name) { - this.container.style.fontFamily = name; - this.updateFontSize(); - } - }, - maxLines: { - set: function(val) { - this.updateFull(); - } - }, - minLines: { - set: function(val) { - this.updateFull(); - } - }, - scrollPastEnd: { - set: function(val) { - val = +val || 0; - if (this.$scrollPastEnd == val) - return; - this.$scrollPastEnd = val; - this.$loop.schedule(this.CHANGE_SCROLL); - }, - initialValue: 0, - handlesSet: true - }, - fixedWidthGutter: { - set: function(val) { - this.$gutterLayer.$fixedWidth = !!val; - this.$loop.schedule(this.CHANGE_GUTTER); - } - }, - theme: { - set: function(val) { this.setTheme(val) }, - get: function() { return this.$themeId || this.theme; }, - initialValue: "./theme/textmate", - handlesSet: true - } -}); - -exports.VirtualRenderer = VirtualRenderer; -}); - -define('ace/layer/gutter', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter'], function(require, exports, module) { - +define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; var dom = require("../lib/dom"); var oop = require("../lib/oop"); @@ -14154,7 +13642,8 @@ var Gutter = function(parentEl) { if (this.session) this.session.removeEventListener("change", this.$updateAnnotations); this.session = session; - session.on("change", this.$updateAnnotations); + if (session) + session.on("change", this.$updateAnnotations); }; this.addGutterDecoration = function(row, className){ @@ -14194,15 +13683,13 @@ var Gutter = function(parentEl) { } }; - this.$updateAnnotations = function (e) { + this.$updateAnnotations = function (delta) { if (!this.$annotations.length) return; - var delta = e.data; - var range = delta.range; - var firstRow = range.start.row; - var len = range.end.row - firstRow; + var firstRow = delta.start.row; + var len = delta.end.row - firstRow; if (len === 0) { - } else if (delta.action == "removeText" || delta.action == "removeLines") { + } else if (delta.action == 'remove') { this.$annotations.splice(firstRow, len + 1, null); } else { var args = new Array(len + 1); @@ -14378,8 +13865,8 @@ exports.Gutter = Gutter; }); -define('ace/layer/marker', ['require', 'exports', 'module' , 'ace/range', 'ace/lib/dom'], function(require, exports, module) { - +define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"], function(require, exports, module) { +"use strict"; var Range = require("../range").Range; var dom = require("../lib/dom"); @@ -14440,32 +13927,39 @@ var Marker = function(parentEl) { else this.drawMultiLineMarker(html, range, marker.clazz, config); } else { - this.drawSingleLineMarker(html, range, marker.clazz + " ace_start", config); + this.drawSingleLineMarker(html, range, marker.clazz + " ace_start" + " ace_br15", config); } } - this.element = dom.setInnerHtml(this.element, html.join("")); + this.element.innerHTML = html.join(""); }; this.$getTop = function(row, layerConfig) { return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight; }; + + function getBorderClass(tl, tr, br, bl) { + return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0); + } this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) { - var row = range.start.row; - - var lineRange = new Range( - row, range.start.column, - row, this.session.getScreenLastRowColumn(row) - ); - this.drawSingleLineMarker(stringBuilder, lineRange, clazz + " ace_start", layerConfig, 1, extraStyle); - row = range.end.row; - lineRange = new Range(row, 0, row, range.end.column); - this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 0, extraStyle); - - for (row = range.start.row + 1; row < range.end.row; row++) { - lineRange.start.row = row; - lineRange.end.row = row; - lineRange.end.column = this.session.getScreenLastRowColumn(row); - this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 1, extraStyle); + var session = this.session; + var start = range.start.row; + var end = range.end.row; + var row = start; + var prev = 0; + var curr = 0; + var next = session.getScreenLastRowColumn(row); + var lineRange = new Range(row, range.start.column, row, curr); + for (; row <= end; row++) { + lineRange.start.row = lineRange.end.row = row; + lineRange.start.column = row == start ? range.start.column : session.getRowWrapIndent(row); + lineRange.end.column = next; + prev = curr; + curr = next; + next = row + 1 < end ? session.getScreenLastRowColumn(row + 1) : row == end ? 0 : range.end.column; + this.drawSingleLineMarker(stringBuilder, lineRange, + clazz + (row == start ? " ace_start" : "") + " ace_br" + + getBorderClass(row == start || row == start + 1 && range.start.column, prev < curr, curr > next, row == end), + layerConfig, row == end ? 0 : 1, extraStyle); } }; this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) { @@ -14476,7 +13970,7 @@ var Marker = function(parentEl) { extraStyle = extraStyle || ""; stringBuilder.push( - "
" ); height = (range.end.row - range.start.row - 1) * config.lineHeight; - if (height < 0) + if (height <= 0) return; top = this.$getTop(range.start.row + 1, config); + + var radiusClass = (range.start.column ? 1 : 0) | (range.end.column ? 0 : 8); stringBuilder.push( - "
" - + this.TAB_CHAR - + lang.stringRepeat("\xa0", i - 1) + + lang.stringRepeat(this.TAB_CHAR, i) + ""); } else { - tabStr.push(lang.stringRepeat("\xa0", i)); + tabStr.push(lang.stringRepeat(" ", i)); } } if (this.displayIndentGuides) { @@ -14669,9 +14165,9 @@ var Text = function(parentEl) { spaceClass = " ace_invisible_space"; tabClass = " ace_invisible_tab"; var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize); - var tabContent = this.TAB_CHAR + lang.stringRepeat("\xa0", this.tabSize - 1); + var tabContent = lang.stringRepeat(this.TAB_CHAR, this.tabSize); } else{ - var spaceContent = lang.stringRepeat("\xa0", this.tabSize); + var spaceContent = lang.stringRepeat(" ", this.tabSize); var tabContent = spaceContent; } @@ -14726,7 +14222,7 @@ var Text = function(parentEl) { html, row, !this.$useLineGroups(), row == foldStart ? foldLine : false ); lineElement.style.height = config.lineHeight * this.session.getRowLength(row) + "px"; - dom.setInnerHtml(lineElement, html.join("")); + lineElement.innerHTML = html.join(""); } row++; } @@ -14829,7 +14325,7 @@ var Text = function(parentEl) { row++; } - this.element = dom.setInnerHtml(this.element, html.join("")); + this.element.innerHTML = html.join(""); }; this.$textToken = { @@ -14840,16 +14336,18 @@ var Text = function(parentEl) { this.$renderToken = function(stringBuilder, screenColumn, token, value) { var self = this; - var replaceReg = /\t|&|<|( +)|([\x00-\x1f\x80-\xa0\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g; + var replaceReg = /\t|&|<|>|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF\uFFF9-\uFFFC])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g; var replaceFunc = function(c, a, b, tabIdx, idx4) { if (a) { - return self.showInvisibles ? - "" + lang.stringRepeat(self.SPACE_CHAR, c.length) + "" : - lang.stringRepeat("\xa0", c.length); + return self.showInvisibles + ? "" + lang.stringRepeat(self.SPACE_CHAR, c.length) + "" + : c; } else if (c == "&") { return "&"; } else if (c == "<") { return "<"; + } else if (c == ">") { + return ">"; } else if (c == "\t") { var tabSize = self.session.getScreenTabSize(screenColumn + tabIdx); screenColumn += tabSize - 1; @@ -14937,6 +14435,8 @@ var Text = function(parentEl) { ); } + stringBuilder.push(lang.stringRepeat("\xa0", splits.indent)); + split ++; screenColumn = 0; splitChars = splits[split] || Number.MAX_VALUE; @@ -15083,19 +14583,19 @@ exports.Text = Text; }); -define('ace/layer/cursor', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) { - +define("ace/layer/cursor",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +"use strict"; var dom = require("../lib/dom"); -var IE8; +var isIE8; var Cursor = function(parentEl) { this.element = dom.createElement("div"); this.element.className = "ace_layer ace_cursor-layer"; parentEl.appendChild(this.element); - if (IE8 === undefined) - IE8 = "opacity" in this.element; + if (isIE8 === undefined) + isIE8 = !("opacity" in this.element.style); this.isVisible = false; this.isBlinking = true; @@ -15105,7 +14605,9 @@ var Cursor = function(parentEl) { this.cursors = []; this.cursor = this.addCursor(); dom.addCssClass(this.element, "ace_hidden-cursors"); - this.$updateCursors = this.$updateVisibility.bind(this); + this.$updateCursors = (isIE8 + ? this.$updateVisibility + : this.$updateOpacity).bind(this); }; (function() { @@ -15146,13 +14648,11 @@ var Cursor = function(parentEl) { }; this.setSmoothBlinking = function(smoothBlinking) { - if (smoothBlinking != this.smoothBlinking && !IE8) { + if (smoothBlinking != this.smoothBlinking && !isIE8) { this.smoothBlinking = smoothBlinking; dom.setCssClass(this.element, "ace_smooth-blinking", smoothBlinking); this.$updateCursors(true); - this.$updateCursors = (smoothBlinking - ? this.$updateOpacity - : this.$updateVisibility).bind(this); + this.$updateCursors = (this.$updateOpacity).bind(this); this.restartTimer(); } }; @@ -15250,11 +14750,15 @@ var Cursor = function(parentEl) { } var style = (this.cursors[cursorIndex++] || this.addCursor()).style; - - style.left = pixelPos.left + "px"; - style.top = pixelPos.top + "px"; - style.width = config.characterWidth + "px"; - style.height = config.lineHeight + "px"; + + if (!this.drawCursor) { + style.left = pixelPos.left + "px"; + style.top = pixelPos.top + "px"; + style.width = config.characterWidth + "px"; + style.height = config.lineHeight + "px"; + } else { + this.drawCursor(style, pixelPos, config, selections[i], this.session); + } } while (this.cursors.length > cursorIndex) this.removeCursor(); @@ -15264,6 +14768,8 @@ var Cursor = function(parentEl) { this.$pixelPos = pixelPos; this.restartTimer(); }; + + this.drawCursor = null; this.$setOverwrite = function(overwrite) { if (overwrite != this.overwrite) { @@ -15286,13 +14792,14 @@ exports.Cursor = Cursor; }); -define('ace/scrollbar', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/event', 'ace/lib/event_emitter'], function(require, exports, module) { - +define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; var oop = require("./lib/oop"); var dom = require("./lib/dom"); var event = require("./lib/event"); var EventEmitter = require("./lib/event_emitter").EventEmitter; +var MAX_SCROLL_H = 0x8000; var ScrollBar = function(parent) { this.element = dom.createElement("div"); this.element.className = "ace_scrollbar ace_scrollbar" + this.classSuffix; @@ -15316,11 +14823,13 @@ var ScrollBar = function(parent) { this.setVisible = function(isVisible) { this.element.style.display = isVisible ? "" : "none"; this.isVisible = isVisible; + this.coeff = 1; }; }).call(ScrollBar.prototype); var VScrollBar = function(parent, renderer) { ScrollBar.call(this, parent); this.scrollTop = 0; + this.scrollHeight = 0; renderer.$scrollbarWidth = this.width = dom.scrollbarWidth(parent.ownerDocument); this.inner.style.width = @@ -15335,6 +14844,10 @@ oop.inherits(VScrollBar, ScrollBar); this.onScroll = function() { if (!this.skipEvent) { this.scrollTop = this.element.scrollTop; + if (this.coeff != 1) { + var h = this.element.clientHeight / this.scrollHeight; + this.scrollTop = this.scrollTop * (1 - h) / (this.coeff - h); + } this._emit("scroll", {data: this.scrollTop}); } this.skipEvent = false; @@ -15345,16 +14858,22 @@ oop.inherits(VScrollBar, ScrollBar); this.setHeight = function(height) { this.element.style.height = height + "px"; }; - this.setInnerHeight = function(height) { - this.inner.style.height = height + "px"; - }; + this.setInnerHeight = this.setScrollHeight = function(height) { + this.scrollHeight = height; + if (height > MAX_SCROLL_H) { + this.coeff = MAX_SCROLL_H / height; + height = MAX_SCROLL_H; + } else if (this.coeff != 1) { + this.coeff = 1 + } this.inner.style.height = height + "px"; }; this.setScrollTop = function(scrollTop) { if (this.scrollTop != scrollTop) { this.skipEvent = true; - this.scrollTop = this.element.scrollTop = scrollTop; + this.scrollTop = scrollTop; + this.element.scrollTop = scrollTop * this.coeff; } }; @@ -15409,8 +14928,8 @@ exports.VScrollBar = VScrollBar; exports.HScrollBar = HScrollBar; }); -define('ace/renderloop', ['require', 'exports', 'module' , 'ace/lib/event'], function(require, exports, module) { - +define("ace/renderloop",["require","exports","module","ace/lib/event"], function(require, exports, module) { +"use strict"; var event = require("./lib/event"); @@ -15446,16 +14965,17 @@ var RenderLoop = function(onRender, win) { exports.RenderLoop = RenderLoop; }); -define('ace/layer/font_metrics', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/lang', 'ace/lib/event_emitter'], function(require, exports, module) { +define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"], function(require, exports, module) { var oop = require("../lib/oop"); var dom = require("../lib/dom"); var lang = require("../lib/lang"); +var useragent = require("../lib/useragent"); var EventEmitter = require("../lib/event_emitter").EventEmitter; var CHAR_COUNT = 0; -var FontMetrics = exports.FontMetrics = function(parentEl, interval) { +var FontMetrics = exports.FontMetrics = function(parentEl) { this.el = dom.createElement("div"); this.$setMeasureNodeStyles(this.el.style, true); @@ -15491,7 +15011,7 @@ var FontMetrics = exports.FontMetrics = function(parentEl, interval) { document.documentElement.appendChild(el); var w = el.getBoundingClientRect().width; if (w > 0 && w < 1) - CHAR_COUNT = 1; + CHAR_COUNT = 50; else CHAR_COUNT = 100; el.parentNode.removeChild(el); @@ -15499,11 +15019,16 @@ var FontMetrics = exports.FontMetrics = function(parentEl, interval) { this.$setMeasureNodeStyles = function(style, isRoot) { style.width = style.height = "auto"; - style.left = style.top = "-100px"; + style.left = style.top = "0px"; style.visibility = "hidden"; - style.position = "fixed"; + style.position = "absolute"; style.whiteSpace = "pre"; - style.font = "inherit"; + + if (useragent.isIE < 8) { + style["font-family"] = "inherit"; + } else { + style.font = "inherit"; + } style.overflow = isRoot ? "hidden" : "visible"; }; @@ -15532,18 +15057,23 @@ var FontMetrics = exports.FontMetrics = function(parentEl, interval) { this.setPolling = function(val) { if (val) { this.$pollSizeChanges(); - } else { - if (this.$pollSizeChangesTimer) - this.$pollSizeChangesTimer; + } else if (this.$pollSizeChangesTimer) { + clearInterval(this.$pollSizeChangesTimer); + this.$pollSizeChangesTimer = 0; } }; this.$measureSizes = function() { - if (CHAR_COUNT === 1) { - var rect = this.$measureNode.getBoundingClientRect(); + if (CHAR_COUNT === 50) { + var rect = null; + try { + rect = this.$measureNode.getBoundingClientRect(); + } catch(e) { + rect = {width: 0, height:0 }; + } var size = { height: rect.height, - width: rect.width + width: rect.width / CHAR_COUNT }; } else { var size = { @@ -15565,7 +15095,7 @@ var FontMetrics = exports.FontMetrics = function(parentEl, interval) { this.getCharacterWidth = function(ch) { var w = this.charSizes[ch]; if (w === undefined) { - this.charSizes[ch] = this.$measureCharWidth(ch) / this.$characterSize.width; + w = this.charSizes[ch] = this.$measureCharWidth(ch) / this.$characterSize.width; } return w; }; @@ -15580,7 +15110,2313 @@ var FontMetrics = exports.FontMetrics = function(parentEl, interval) { }); -define('ace/multi_select', ['require', 'exports', 'module' , 'ace/range_list', 'ace/range', 'ace/selection', 'ace/mouse/multi_select_handler', 'ace/lib/event', 'ace/lib/lang', 'ace/commands/multi_select_commands', 'ace/search', 'ace/edit_session', 'ace/editor', 'ace/config'], function(require, exports, module) { +define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/lib/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var config = require("./config"); +var useragent = require("./lib/useragent"); +var GutterLayer = require("./layer/gutter").Gutter; +var MarkerLayer = require("./layer/marker").Marker; +var TextLayer = require("./layer/text").Text; +var CursorLayer = require("./layer/cursor").Cursor; +var HScrollBar = require("./scrollbar").HScrollBar; +var VScrollBar = require("./scrollbar").VScrollBar; +var RenderLoop = require("./renderloop").RenderLoop; +var FontMetrics = require("./layer/font_metrics").FontMetrics; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var editorCss = ".ace_editor {\ +position: relative;\ +overflow: hidden;\ +font: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\ +direction: ltr;\ +text-align: left;\ +}\ +.ace_scroller {\ +position: absolute;\ +overflow: hidden;\ +top: 0;\ +bottom: 0;\ +background-color: inherit;\ +-ms-user-select: none;\ +-moz-user-select: none;\ +-webkit-user-select: none;\ +user-select: none;\ +cursor: text;\ +}\ +.ace_content {\ +position: absolute;\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +min-width: 100%;\ +}\ +.ace_dragging .ace_scroller:before{\ +position: absolute;\ +top: 0;\ +left: 0;\ +right: 0;\ +bottom: 0;\ +content: '';\ +background: rgba(250, 250, 250, 0.01);\ +z-index: 1000;\ +}\ +.ace_dragging.ace_dark .ace_scroller:before{\ +background: rgba(0, 0, 0, 0.01);\ +}\ +.ace_selecting, .ace_selecting * {\ +cursor: text !important;\ +}\ +.ace_gutter {\ +position: absolute;\ +overflow : hidden;\ +width: auto;\ +top: 0;\ +bottom: 0;\ +left: 0;\ +cursor: default;\ +z-index: 4;\ +-ms-user-select: none;\ +-moz-user-select: none;\ +-webkit-user-select: none;\ +user-select: none;\ +}\ +.ace_gutter-active-line {\ +position: absolute;\ +left: 0;\ +right: 0;\ +}\ +.ace_scroller.ace_scroll-left {\ +box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\ +}\ +.ace_gutter-cell {\ +padding-left: 19px;\ +padding-right: 6px;\ +background-repeat: no-repeat;\ +}\ +.ace_gutter-cell.ace_error {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\");\ +background-repeat: no-repeat;\ +background-position: 2px center;\ +}\ +.ace_gutter-cell.ace_warning {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\");\ +background-position: 2px center;\ +}\ +.ace_gutter-cell.ace_info {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\");\ +background-position: 2px center;\ +}\ +.ace_dark .ace_gutter-cell.ace_info {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\");\ +}\ +.ace_scrollbar {\ +position: absolute;\ +right: 0;\ +bottom: 0;\ +z-index: 6;\ +}\ +.ace_scrollbar-inner {\ +position: absolute;\ +cursor: text;\ +left: 0;\ +top: 0;\ +}\ +.ace_scrollbar-v{\ +overflow-x: hidden;\ +overflow-y: scroll;\ +top: 0;\ +}\ +.ace_scrollbar-h {\ +overflow-x: scroll;\ +overflow-y: hidden;\ +left: 0;\ +}\ +.ace_print-margin {\ +position: absolute;\ +height: 100%;\ +}\ +.ace_text-input {\ +position: absolute;\ +z-index: 0;\ +width: 0.5em;\ +height: 1em;\ +opacity: 0;\ +background: transparent;\ +-moz-appearance: none;\ +appearance: none;\ +border: none;\ +resize: none;\ +outline: none;\ +overflow: hidden;\ +font: inherit;\ +padding: 0 1px;\ +margin: 0 -1px;\ +text-indent: -1em;\ +-ms-user-select: text;\ +-moz-user-select: text;\ +-webkit-user-select: text;\ +user-select: text;\ +white-space: pre!important;\ +}\ +.ace_text-input.ace_composition {\ +background: inherit;\ +color: inherit;\ +z-index: 1000;\ +opacity: 1;\ +text-indent: 0;\ +}\ +.ace_layer {\ +z-index: 1;\ +position: absolute;\ +overflow: hidden;\ +word-wrap: normal;\ +white-space: pre;\ +height: 100%;\ +width: 100%;\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +pointer-events: none;\ +}\ +.ace_gutter-layer {\ +position: relative;\ +width: auto;\ +text-align: right;\ +pointer-events: auto;\ +}\ +.ace_text-layer {\ +font: inherit !important;\ +}\ +.ace_cjk {\ +display: inline-block;\ +text-align: center;\ +}\ +.ace_cursor-layer {\ +z-index: 4;\ +}\ +.ace_cursor {\ +z-index: 4;\ +position: absolute;\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +border-left: 2px solid;\ +transform: translatez(0);\ +}\ +.ace_slim-cursors .ace_cursor {\ +border-left-width: 1px;\ +}\ +.ace_overwrite-cursors .ace_cursor {\ +border-left-width: 0;\ +border-bottom: 1px solid;\ +}\ +.ace_hidden-cursors .ace_cursor {\ +opacity: 0.2;\ +}\ +.ace_smooth-blinking .ace_cursor {\ +-webkit-transition: opacity 0.18s;\ +transition: opacity 0.18s;\ +}\ +.ace_editor.ace_multiselect .ace_cursor {\ +border-left-width: 1px;\ +}\ +.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\ +position: absolute;\ +z-index: 3;\ +}\ +.ace_marker-layer .ace_selection {\ +position: absolute;\ +z-index: 5;\ +}\ +.ace_marker-layer .ace_bracket {\ +position: absolute;\ +z-index: 6;\ +}\ +.ace_marker-layer .ace_active-line {\ +position: absolute;\ +z-index: 2;\ +}\ +.ace_marker-layer .ace_selected-word {\ +position: absolute;\ +z-index: 4;\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +}\ +.ace_line .ace_fold {\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +display: inline-block;\ +height: 11px;\ +margin-top: -2px;\ +vertical-align: middle;\ +background-image:\ +url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\ +url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\");\ +background-repeat: no-repeat, repeat-x;\ +background-position: center center, top left;\ +color: transparent;\ +border: 1px solid black;\ +border-radius: 2px;\ +cursor: pointer;\ +pointer-events: auto;\ +}\ +.ace_dark .ace_fold {\ +}\ +.ace_fold:hover{\ +background-image:\ +url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\ +url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\");\ +}\ +.ace_tooltip {\ +background-color: #FFF;\ +background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\ +background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\ +border: 1px solid gray;\ +border-radius: 1px;\ +box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\ +color: black;\ +max-width: 100%;\ +padding: 3px 4px;\ +position: fixed;\ +z-index: 999999;\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +cursor: default;\ +white-space: pre;\ +word-wrap: break-word;\ +line-height: normal;\ +font-style: normal;\ +font-weight: normal;\ +letter-spacing: normal;\ +pointer-events: none;\ +}\ +.ace_folding-enabled > .ace_gutter-cell {\ +padding-right: 13px;\ +}\ +.ace_fold-widget {\ +-moz-box-sizing: border-box;\ +-webkit-box-sizing: border-box;\ +box-sizing: border-box;\ +margin: 0 -12px 0 1px;\ +display: none;\ +width: 11px;\ +vertical-align: top;\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\");\ +background-repeat: no-repeat;\ +background-position: center;\ +border-radius: 3px;\ +border: 1px solid transparent;\ +cursor: pointer;\ +}\ +.ace_folding-enabled .ace_fold-widget {\ +display: inline-block; \ +}\ +.ace_fold-widget.ace_end {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\");\ +}\ +.ace_fold-widget.ace_closed {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\");\ +}\ +.ace_fold-widget:hover {\ +border: 1px solid rgba(0, 0, 0, 0.3);\ +background-color: rgba(255, 255, 255, 0.2);\ +box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\ +}\ +.ace_fold-widget:active {\ +border: 1px solid rgba(0, 0, 0, 0.4);\ +background-color: rgba(0, 0, 0, 0.05);\ +box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\ +}\ +.ace_dark .ace_fold-widget {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\");\ +}\ +.ace_dark .ace_fold-widget.ace_end {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\");\ +}\ +.ace_dark .ace_fold-widget.ace_closed {\ +background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\");\ +}\ +.ace_dark .ace_fold-widget:hover {\ +box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ +background-color: rgba(255, 255, 255, 0.1);\ +}\ +.ace_dark .ace_fold-widget:active {\ +box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\ +}\ +.ace_fold-widget.ace_invalid {\ +background-color: #FFB4B4;\ +border-color: #DE5555;\ +}\ +.ace_fade-fold-widgets .ace_fold-widget {\ +-webkit-transition: opacity 0.4s ease 0.05s;\ +transition: opacity 0.4s ease 0.05s;\ +opacity: 0;\ +}\ +.ace_fade-fold-widgets:hover .ace_fold-widget {\ +-webkit-transition: opacity 0.05s ease 0.05s;\ +transition: opacity 0.05s ease 0.05s;\ +opacity:1;\ +}\ +.ace_underline {\ +text-decoration: underline;\ +}\ +.ace_bold {\ +font-weight: bold;\ +}\ +.ace_nobold .ace_bold {\ +font-weight: normal;\ +}\ +.ace_italic {\ +font-style: italic;\ +}\ +.ace_error-marker {\ +background-color: rgba(255, 0, 0,0.2);\ +position: absolute;\ +z-index: 9;\ +}\ +.ace_highlight-marker {\ +background-color: rgba(255, 255, 0,0.2);\ +position: absolute;\ +z-index: 8;\ +}\ +.ace_br1 {border-top-left-radius : 3px;}\ +.ace_br2 {border-top-right-radius : 3px;}\ +.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}\ +.ace_br4 {border-bottom-right-radius: 3px;}\ +.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}\ +.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}\ +.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}\ +.ace_br8 {border-bottom-left-radius : 3px;}\ +.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}\ +.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}\ +.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}\ +.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ +.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ +.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ +.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\ +"; + +dom.importCssString(editorCss, "ace_editor.css"); + +var VirtualRenderer = function(container, theme) { + var _self = this; + + this.container = container || dom.createElement("div"); + this.$keepTextAreaAtCursor = !useragent.isOldIE; + + dom.addCssClass(this.container, "ace_editor"); + + this.setTheme(theme); + + this.$gutter = dom.createElement("div"); + this.$gutter.className = "ace_gutter"; + this.container.appendChild(this.$gutter); + + this.scroller = dom.createElement("div"); + this.scroller.className = "ace_scroller"; + this.container.appendChild(this.scroller); + + this.content = dom.createElement("div"); + this.content.className = "ace_content"; + this.scroller.appendChild(this.content); + + this.$gutterLayer = new GutterLayer(this.$gutter); + this.$gutterLayer.on("changeGutterWidth", this.onGutterResize.bind(this)); + + this.$markerBack = new MarkerLayer(this.content); + + var textLayer = this.$textLayer = new TextLayer(this.content); + this.canvas = textLayer.element; + + this.$markerFront = new MarkerLayer(this.content); + + this.$cursorLayer = new CursorLayer(this.content); + this.$horizScroll = false; + this.$vScroll = false; + + this.scrollBar = + this.scrollBarV = new VScrollBar(this.container, this); + this.scrollBarH = new HScrollBar(this.container, this); + this.scrollBarV.addEventListener("scroll", function(e) { + if (!_self.$scrollAnimation) + _self.session.setScrollTop(e.data - _self.scrollMargin.top); + }); + this.scrollBarH.addEventListener("scroll", function(e) { + if (!_self.$scrollAnimation) + _self.session.setScrollLeft(e.data - _self.scrollMargin.left); + }); + + this.scrollTop = 0; + this.scrollLeft = 0; + + this.cursorPos = { + row : 0, + column : 0 + }; + + this.$fontMetrics = new FontMetrics(this.container); + this.$textLayer.$setFontMetrics(this.$fontMetrics); + this.$textLayer.addEventListener("changeCharacterSize", function(e) { + _self.updateCharacterSize(); + _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height); + _self._signal("changeCharacterSize", e); + }); + + this.$size = { + width: 0, + height: 0, + scrollerHeight: 0, + scrollerWidth: 0, + $dirty: true + }; + + this.layerConfig = { + width : 1, + padding : 0, + firstRow : 0, + firstRowScreen: 0, + lastRow : 0, + lineHeight : 0, + characterWidth : 0, + minHeight : 1, + maxHeight : 1, + offset : 0, + height : 1, + gutterOffset: 1 + }; + + this.scrollMargin = { + left: 0, + right: 0, + top: 0, + bottom: 0, + v: 0, + h: 0 + }; + + this.$loop = new RenderLoop( + this.$renderChanges.bind(this), + this.container.ownerDocument.defaultView + ); + this.$loop.schedule(this.CHANGE_FULL); + + this.updateCharacterSize(); + this.setPadding(4); + config.resetOptions(this); + config._emit("renderer", this); +}; + +(function() { + + this.CHANGE_CURSOR = 1; + this.CHANGE_MARKER = 2; + this.CHANGE_GUTTER = 4; + this.CHANGE_SCROLL = 8; + this.CHANGE_LINES = 16; + this.CHANGE_TEXT = 32; + this.CHANGE_SIZE = 64; + this.CHANGE_MARKER_BACK = 128; + this.CHANGE_MARKER_FRONT = 256; + this.CHANGE_FULL = 512; + this.CHANGE_H_SCROLL = 1024; + + oop.implement(this, EventEmitter); + + this.updateCharacterSize = function() { + if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) { + this.$allowBoldFonts = this.$textLayer.allowBoldFonts; + this.setStyle("ace_nobold", !this.$allowBoldFonts); + } + + this.layerConfig.characterWidth = + this.characterWidth = this.$textLayer.getCharacterWidth(); + this.layerConfig.lineHeight = + this.lineHeight = this.$textLayer.getLineHeight(); + this.$updatePrintMargin(); + }; + this.setSession = function(session) { + if (this.session) + this.session.doc.off("changeNewLineMode", this.onChangeNewLineMode); + + this.session = session; + if (session && this.scrollMargin.top && session.getScrollTop() <= 0) + session.setScrollTop(-this.scrollMargin.top); + + this.$cursorLayer.setSession(session); + this.$markerBack.setSession(session); + this.$markerFront.setSession(session); + this.$gutterLayer.setSession(session); + this.$textLayer.setSession(session); + if (!session) + return; + + this.$loop.schedule(this.CHANGE_FULL); + this.session.$setFontMetrics(this.$fontMetrics); + this.scrollBarV.scrollLeft = this.scrollBarV.scrollTop = null; + + this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this); + this.onChangeNewLineMode() + this.session.doc.on("changeNewLineMode", this.onChangeNewLineMode); + }; + this.updateLines = function(firstRow, lastRow, force) { + if (lastRow === undefined) + lastRow = Infinity; + + if (!this.$changedLines) { + this.$changedLines = { + firstRow: firstRow, + lastRow: lastRow + }; + } + else { + if (this.$changedLines.firstRow > firstRow) + this.$changedLines.firstRow = firstRow; + + if (this.$changedLines.lastRow < lastRow) + this.$changedLines.lastRow = lastRow; + } + if (this.$changedLines.lastRow < this.layerConfig.firstRow) { + if (force) + this.$changedLines.lastRow = this.layerConfig.lastRow; + else + return; + } + if (this.$changedLines.firstRow > this.layerConfig.lastRow) + return; + this.$loop.schedule(this.CHANGE_LINES); + }; + + this.onChangeNewLineMode = function() { + this.$loop.schedule(this.CHANGE_TEXT); + this.$textLayer.$updateEolChar(); + }; + + this.onChangeTabSize = function() { + this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER); + this.$textLayer.onChangeTabSize(); + }; + this.updateText = function() { + this.$loop.schedule(this.CHANGE_TEXT); + }; + this.updateFull = function(force) { + if (force) + this.$renderChanges(this.CHANGE_FULL, true); + else + this.$loop.schedule(this.CHANGE_FULL); + }; + this.updateFontSize = function() { + this.$textLayer.checkForSizeChanges(); + }; + + this.$changes = 0; + this.$updateSizeAsync = function() { + if (this.$loop.pending) + this.$size.$dirty = true; + else + this.onResize(); + }; + this.onResize = function(force, gutterWidth, width, height) { + if (this.resizing > 2) + return; + else if (this.resizing > 0) + this.resizing++; + else + this.resizing = force ? 1 : 0; + var el = this.container; + if (!height) + height = el.clientHeight || el.scrollHeight; + if (!width) + width = el.clientWidth || el.scrollWidth; + var changes = this.$updateCachedSize(force, gutterWidth, width, height); + + + if (!this.$size.scrollerHeight || (!width && !height)) + return this.resizing = 0; + + if (force) + this.$gutterLayer.$padding = null; + + if (force) + this.$renderChanges(changes | this.$changes, true); + else + this.$loop.schedule(changes | this.$changes); + + if (this.resizing) + this.resizing = 0; + this.scrollBarV.scrollLeft = this.scrollBarV.scrollTop = null; + }; + + this.$updateCachedSize = function(force, gutterWidth, width, height) { + height -= (this.$extraHeight || 0); + var changes = 0; + var size = this.$size; + var oldSize = { + width: size.width, + height: size.height, + scrollerHeight: size.scrollerHeight, + scrollerWidth: size.scrollerWidth + }; + if (height && (force || size.height != height)) { + size.height = height; + changes |= this.CHANGE_SIZE; + + size.scrollerHeight = size.height; + if (this.$horizScroll) + size.scrollerHeight -= this.scrollBarH.getHeight(); + this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + "px"; + + changes = changes | this.CHANGE_SCROLL; + } + + if (width && (force || size.width != width)) { + changes |= this.CHANGE_SIZE; + size.width = width; + + if (gutterWidth == null) + gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0; + + this.gutterWidth = gutterWidth; + + this.scrollBarH.element.style.left = + this.scroller.style.left = gutterWidth + "px"; + size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth()); + + this.scrollBarH.element.style.right = + this.scroller.style.right = this.scrollBarV.getWidth() + "px"; + this.scroller.style.bottom = this.scrollBarH.getHeight() + "px"; + + if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force) + changes |= this.CHANGE_FULL; + } + + size.$dirty = !width || !height; + + if (changes) + this._signal("resize", oldSize); + + return changes; + }; + + this.onGutterResize = function() { + var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0; + if (gutterWidth != this.gutterWidth) + this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height); + + if (this.session.getUseWrapMode() && this.adjustWrapLimit()) { + this.$loop.schedule(this.CHANGE_FULL); + } else if (this.$size.$dirty) { + this.$loop.schedule(this.CHANGE_FULL); + } else { + this.$computeLayerConfig(); + this.$loop.schedule(this.CHANGE_MARKER); + } + }; + this.adjustWrapLimit = function() { + var availableWidth = this.$size.scrollerWidth - this.$padding * 2; + var limit = Math.floor(availableWidth / this.characterWidth); + return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn); + }; + this.setAnimatedScroll = function(shouldAnimate){ + this.setOption("animatedScroll", shouldAnimate); + }; + this.getAnimatedScroll = function() { + return this.$animatedScroll; + }; + this.setShowInvisibles = function(showInvisibles) { + this.setOption("showInvisibles", showInvisibles); + }; + this.getShowInvisibles = function() { + return this.getOption("showInvisibles"); + }; + this.getDisplayIndentGuides = function() { + return this.getOption("displayIndentGuides"); + }; + + this.setDisplayIndentGuides = function(display) { + this.setOption("displayIndentGuides", display); + }; + this.setShowPrintMargin = function(showPrintMargin) { + this.setOption("showPrintMargin", showPrintMargin); + }; + this.getShowPrintMargin = function() { + return this.getOption("showPrintMargin"); + }; + this.setPrintMarginColumn = function(showPrintMargin) { + this.setOption("printMarginColumn", showPrintMargin); + }; + this.getPrintMarginColumn = function() { + return this.getOption("printMarginColumn"); + }; + this.getShowGutter = function(){ + return this.getOption("showGutter"); + }; + this.setShowGutter = function(show){ + return this.setOption("showGutter", show); + }; + + this.getFadeFoldWidgets = function(){ + return this.getOption("fadeFoldWidgets") + }; + + this.setFadeFoldWidgets = function(show) { + this.setOption("fadeFoldWidgets", show); + }; + + this.setHighlightGutterLine = function(shouldHighlight) { + this.setOption("highlightGutterLine", shouldHighlight); + }; + + this.getHighlightGutterLine = function() { + return this.getOption("highlightGutterLine"); + }; + + this.$updateGutterLineHighlight = function() { + var pos = this.$cursorLayer.$pixelPos; + var height = this.layerConfig.lineHeight; + if (this.session.getUseWrapMode()) { + var cursor = this.session.selection.getCursor(); + cursor.column = 0; + pos = this.$cursorLayer.getPixelPosition(cursor, true); + height *= this.session.getRowLength(cursor.row); + } + this.$gutterLineHighlight.style.top = pos.top - this.layerConfig.offset + "px"; + this.$gutterLineHighlight.style.height = height + "px"; + }; + + this.$updatePrintMargin = function() { + if (!this.$showPrintMargin && !this.$printMarginEl) + return; + + if (!this.$printMarginEl) { + var containerEl = dom.createElement("div"); + containerEl.className = "ace_layer ace_print-margin-layer"; + this.$printMarginEl = dom.createElement("div"); + this.$printMarginEl.className = "ace_print-margin"; + containerEl.appendChild(this.$printMarginEl); + this.content.insertBefore(containerEl, this.content.firstChild); + } + + var style = this.$printMarginEl.style; + style.left = ((this.characterWidth * this.$printMarginColumn) + this.$padding) + "px"; + style.visibility = this.$showPrintMargin ? "visible" : "hidden"; + + if (this.session && this.session.$wrap == -1) + this.adjustWrapLimit(); + }; + this.getContainerElement = function() { + return this.container; + }; + this.getMouseEventTarget = function() { + return this.scroller; + }; + this.getTextAreaContainer = function() { + return this.container; + }; + this.$moveTextAreaToCursor = function() { + if (!this.$keepTextAreaAtCursor) + return; + var config = this.layerConfig; + var posTop = this.$cursorLayer.$pixelPos.top; + var posLeft = this.$cursorLayer.$pixelPos.left; + posTop -= config.offset; + + var style = this.textarea.style; + var h = this.lineHeight; + if (posTop < 0 || posTop > config.height - h) { + style.top = style.left = "0"; + return; + } + + var w = this.characterWidth; + if (this.$composition) { + var val = this.textarea.value.replace(/^\x01+/, ""); + w *= (this.session.$getStringScreenWidth(val)[0]+2); + h += 2; + } + posLeft -= this.scrollLeft; + if (posLeft > this.$size.scrollerWidth - w) + posLeft = this.$size.scrollerWidth - w; + + posLeft += this.gutterWidth; + style.height = h + "px"; + style.width = w + "px"; + style.left = Math.min(posLeft, this.$size.scrollerWidth - w) + "px"; + style.top = Math.min(posTop, this.$size.height - h) + "px"; + }; + this.getFirstVisibleRow = function() { + return this.layerConfig.firstRow; + }; + this.getFirstFullyVisibleRow = function() { + return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1); + }; + this.getLastFullyVisibleRow = function() { + var config = this.layerConfig; + var lastRow = config.lastRow + var top = this.session.documentToScreenRow(lastRow, 0) * config.lineHeight; + if (top - this.session.getScrollTop() > config.height - config.lineHeight) + return lastRow - 1; + return lastRow; + }; + this.getLastVisibleRow = function() { + return this.layerConfig.lastRow; + }; + + this.$padding = null; + this.setPadding = function(padding) { + this.$padding = padding; + this.$textLayer.setPadding(padding); + this.$cursorLayer.setPadding(padding); + this.$markerFront.setPadding(padding); + this.$markerBack.setPadding(padding); + this.$loop.schedule(this.CHANGE_FULL); + this.$updatePrintMargin(); + }; + + this.setScrollMargin = function(top, bottom, left, right) { + var sm = this.scrollMargin; + sm.top = top|0; + sm.bottom = bottom|0; + sm.right = right|0; + sm.left = left|0; + sm.v = sm.top + sm.bottom; + sm.h = sm.left + sm.right; + if (sm.top && this.scrollTop <= 0 && this.session) + this.session.setScrollTop(-sm.top); + this.updateFull(); + }; + this.getHScrollBarAlwaysVisible = function() { + return this.$hScrollBarAlwaysVisible; + }; + this.setHScrollBarAlwaysVisible = function(alwaysVisible) { + this.setOption("hScrollBarAlwaysVisible", alwaysVisible); + }; + this.getVScrollBarAlwaysVisible = function() { + return this.$vScrollBarAlwaysVisible; + }; + this.setVScrollBarAlwaysVisible = function(alwaysVisible) { + this.setOption("vScrollBarAlwaysVisible", alwaysVisible); + }; + + this.$updateScrollBarV = function() { + var scrollHeight = this.layerConfig.maxHeight; + var scrollerHeight = this.$size.scrollerHeight; + if (!this.$maxLines && this.$scrollPastEnd) { + scrollHeight -= (scrollerHeight - this.lineHeight) * this.$scrollPastEnd; + if (this.scrollTop > scrollHeight - scrollerHeight) { + scrollHeight = this.scrollTop + scrollerHeight; + this.scrollBarV.scrollTop = null; + } + } + this.scrollBarV.setScrollHeight(scrollHeight + this.scrollMargin.v); + this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top); + }; + this.$updateScrollBarH = function() { + this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h); + this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left); + }; + + this.$frozen = false; + this.freeze = function() { + this.$frozen = true; + }; + + this.unfreeze = function() { + this.$frozen = false; + }; + + this.$renderChanges = function(changes, force) { + if (this.$changes) { + changes |= this.$changes; + this.$changes = 0; + } + if ((!this.session || !this.container.offsetWidth || this.$frozen) || (!changes && !force)) { + this.$changes |= changes; + return; + } + if (this.$size.$dirty) { + this.$changes |= changes; + return this.onResize(true); + } + if (!this.lineHeight) { + this.$textLayer.checkForSizeChanges(); + } + + this._signal("beforeRender"); + var config = this.layerConfig; + if (changes & this.CHANGE_FULL || + changes & this.CHANGE_SIZE || + changes & this.CHANGE_TEXT || + changes & this.CHANGE_LINES || + changes & this.CHANGE_SCROLL || + changes & this.CHANGE_H_SCROLL + ) { + changes |= this.$computeLayerConfig(); + if (config.firstRow != this.layerConfig.firstRow && config.firstRowScreen == this.layerConfig.firstRowScreen) { + var st = this.scrollTop + (config.firstRow - this.layerConfig.firstRow) * this.lineHeight; + if (st > 0) { + this.scrollTop = st; + changes = changes | this.CHANGE_SCROLL; + changes |= this.$computeLayerConfig(); + } + } + config = this.layerConfig; + this.$updateScrollBarV(); + if (changes & this.CHANGE_H_SCROLL) + this.$updateScrollBarH(); + this.$gutterLayer.element.style.marginTop = (-config.offset) + "px"; + this.content.style.marginTop = (-config.offset) + "px"; + this.content.style.width = config.width + 2 * this.$padding + "px"; + this.content.style.height = config.minHeight + "px"; + } + if (changes & this.CHANGE_H_SCROLL) { + this.content.style.marginLeft = -this.scrollLeft + "px"; + this.scroller.className = this.scrollLeft <= 0 ? "ace_scroller" : "ace_scroller ace_scroll-left"; + } + if (changes & this.CHANGE_FULL) { + this.$textLayer.update(config); + if (this.$showGutter) + this.$gutterLayer.update(config); + this.$markerBack.update(config); + this.$markerFront.update(config); + this.$cursorLayer.update(config); + this.$moveTextAreaToCursor(); + this.$highlightGutterLine && this.$updateGutterLineHighlight(); + this._signal("afterRender"); + return; + } + if (changes & this.CHANGE_SCROLL) { + if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES) + this.$textLayer.update(config); + else + this.$textLayer.scrollLines(config); + + if (this.$showGutter) + this.$gutterLayer.update(config); + this.$markerBack.update(config); + this.$markerFront.update(config); + this.$cursorLayer.update(config); + this.$highlightGutterLine && this.$updateGutterLineHighlight(); + this.$moveTextAreaToCursor(); + this._signal("afterRender"); + return; + } + + if (changes & this.CHANGE_TEXT) { + this.$textLayer.update(config); + if (this.$showGutter) + this.$gutterLayer.update(config); + } + else if (changes & this.CHANGE_LINES) { + if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter) + this.$gutterLayer.update(config); + } + else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) { + if (this.$showGutter) + this.$gutterLayer.update(config); + } + + if (changes & this.CHANGE_CURSOR) { + this.$cursorLayer.update(config); + this.$moveTextAreaToCursor(); + this.$highlightGutterLine && this.$updateGutterLineHighlight(); + } + + if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) { + this.$markerFront.update(config); + } + + if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) { + this.$markerBack.update(config); + } + + this._signal("afterRender"); + }; + + + this.$autosize = function() { + var height = this.session.getScreenLength() * this.lineHeight; + var maxHeight = this.$maxLines * this.lineHeight; + var desiredHeight = Math.min(maxHeight, + Math.max((this.$minLines || 1) * this.lineHeight, height) + ) + this.scrollMargin.v + (this.$extraHeight || 0); + if (this.$horizScroll) + desiredHeight += this.scrollBarH.getHeight(); + if (this.$maxPixelHeight && desiredHeight > this.$maxPixelHeight) + desiredHeight = this.$maxPixelHeight; + var vScroll = height > maxHeight; + + if (desiredHeight != this.desiredHeight || + this.$size.height != this.desiredHeight || vScroll != this.$vScroll) { + if (vScroll != this.$vScroll) { + this.$vScroll = vScroll; + this.scrollBarV.setVisible(vScroll); + } + + var w = this.container.clientWidth; + this.container.style.height = desiredHeight + "px"; + this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight); + this.desiredHeight = desiredHeight; + + this._signal("autosize"); + } + }; + + this.$computeLayerConfig = function() { + var session = this.session; + var size = this.$size; + + var hideScrollbars = size.height <= 2 * this.lineHeight; + var screenLines = this.session.getScreenLength(); + var maxHeight = screenLines * this.lineHeight; + + var longestLine = this.$getLongestLine(); + + var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible || + size.scrollerWidth - longestLine - 2 * this.$padding < 0); + + var hScrollChanged = this.$horizScroll !== horizScroll; + if (hScrollChanged) { + this.$horizScroll = horizScroll; + this.scrollBarH.setVisible(horizScroll); + } + var vScrollBefore = this.$vScroll; // autosize can change vscroll value in which case we need to update longestLine + if (this.$maxLines && this.lineHeight > 1) + this.$autosize(); + + var offset = this.scrollTop % this.lineHeight; + var minHeight = size.scrollerHeight + this.lineHeight; + + var scrollPastEnd = !this.$maxLines && this.$scrollPastEnd + ? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd + : 0; + maxHeight += scrollPastEnd; + + var sm = this.scrollMargin; + this.session.setScrollTop(Math.max(-sm.top, + Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom))); + + this.session.setScrollLeft(Math.max(-sm.left, Math.min(this.scrollLeft, + longestLine + 2 * this.$padding - size.scrollerWidth + sm.right))); + + var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible || + size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop > sm.top); + var vScrollChanged = vScrollBefore !== vScroll; + if (vScrollChanged) { + this.$vScroll = vScroll; + this.scrollBarV.setVisible(vScroll); + } + + var lineCount = Math.ceil(minHeight / this.lineHeight) - 1; + var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight)); + var lastRow = firstRow + lineCount; + var firstRowScreen, firstRowHeight; + var lineHeight = this.lineHeight; + firstRow = session.screenToDocumentRow(firstRow, 0); + var foldLine = session.getFoldLine(firstRow); + if (foldLine) { + firstRow = foldLine.start.row; + } + + firstRowScreen = session.documentToScreenRow(firstRow, 0); + firstRowHeight = session.getRowLength(firstRow) * lineHeight; + + lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1); + minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight + + firstRowHeight; + + offset = this.scrollTop - firstRowScreen * lineHeight; + + var changes = 0; + if (this.layerConfig.width != longestLine) + changes = this.CHANGE_H_SCROLL; + if (hScrollChanged || vScrollChanged) { + changes = this.$updateCachedSize(true, this.gutterWidth, size.width, size.height); + this._signal("scrollbarVisibilityChanged"); + if (vScrollChanged) + longestLine = this.$getLongestLine(); + } + + this.layerConfig = { + width : longestLine, + padding : this.$padding, + firstRow : firstRow, + firstRowScreen: firstRowScreen, + lastRow : lastRow, + lineHeight : lineHeight, + characterWidth : this.characterWidth, + minHeight : minHeight, + maxHeight : maxHeight, + offset : offset, + gutterOffset : lineHeight ? Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)) : 0, + height : this.$size.scrollerHeight + }; + + return changes; + }; + + this.$updateLines = function() { + var firstRow = this.$changedLines.firstRow; + var lastRow = this.$changedLines.lastRow; + this.$changedLines = null; + + var layerConfig = this.layerConfig; + + if (firstRow > layerConfig.lastRow + 1) { return; } + if (lastRow < layerConfig.firstRow) { return; } + if (lastRow === Infinity) { + if (this.$showGutter) + this.$gutterLayer.update(layerConfig); + this.$textLayer.update(layerConfig); + return; + } + this.$textLayer.updateLines(layerConfig, firstRow, lastRow); + return true; + }; + + this.$getLongestLine = function() { + var charCount = this.session.getScreenWidth(); + if (this.showInvisibles && !this.session.$useWrapMode) + charCount += 1; + + return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth)); + }; + this.updateFrontMarkers = function() { + this.$markerFront.setMarkers(this.session.getMarkers(true)); + this.$loop.schedule(this.CHANGE_MARKER_FRONT); + }; + this.updateBackMarkers = function() { + this.$markerBack.setMarkers(this.session.getMarkers()); + this.$loop.schedule(this.CHANGE_MARKER_BACK); + }; + this.addGutterDecoration = function(row, className){ + this.$gutterLayer.addGutterDecoration(row, className); + }; + this.removeGutterDecoration = function(row, className){ + this.$gutterLayer.removeGutterDecoration(row, className); + }; + this.updateBreakpoints = function(rows) { + this.$loop.schedule(this.CHANGE_GUTTER); + }; + this.setAnnotations = function(annotations) { + this.$gutterLayer.setAnnotations(annotations); + this.$loop.schedule(this.CHANGE_GUTTER); + }; + this.updateCursor = function() { + this.$loop.schedule(this.CHANGE_CURSOR); + }; + this.hideCursor = function() { + this.$cursorLayer.hideCursor(); + }; + this.showCursor = function() { + this.$cursorLayer.showCursor(); + }; + + this.scrollSelectionIntoView = function(anchor, lead, offset) { + this.scrollCursorIntoView(anchor, offset); + this.scrollCursorIntoView(lead, offset); + }; + this.scrollCursorIntoView = function(cursor, offset, $viewMargin) { + if (this.$size.scrollerHeight === 0) + return; + + var pos = this.$cursorLayer.getPixelPosition(cursor); + + var left = pos.left; + var top = pos.top; + + var topMargin = $viewMargin && $viewMargin.top || 0; + var bottomMargin = $viewMargin && $viewMargin.bottom || 0; + + var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop; + + if (scrollTop + topMargin > top) { + if (offset && scrollTop + topMargin > top + this.lineHeight) + top -= offset * this.$size.scrollerHeight; + if (top === 0) + top = -this.scrollMargin.top; + this.session.setScrollTop(top); + } else if (scrollTop + this.$size.scrollerHeight - bottomMargin < top + this.lineHeight) { + if (offset && scrollTop + this.$size.scrollerHeight - bottomMargin < top - this.lineHeight) + top += offset * this.$size.scrollerHeight; + this.session.setScrollTop(top + this.lineHeight - this.$size.scrollerHeight); + } + + var scrollLeft = this.scrollLeft; + + if (scrollLeft > left) { + if (left < this.$padding + 2 * this.layerConfig.characterWidth) + left = -this.scrollMargin.left; + this.session.setScrollLeft(left); + } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) { + this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth)); + } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) { + this.session.setScrollLeft(0); + } + }; + this.getScrollTop = function() { + return this.session.getScrollTop(); + }; + this.getScrollLeft = function() { + return this.session.getScrollLeft(); + }; + this.getScrollTopRow = function() { + return this.scrollTop / this.lineHeight; + }; + this.getScrollBottomRow = function() { + return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1); + }; + this.scrollToRow = function(row) { + this.session.setScrollTop(row * this.lineHeight); + }; + + this.alignCursor = function(cursor, alignment) { + if (typeof cursor == "number") + cursor = {row: cursor, column: 0}; + + var pos = this.$cursorLayer.getPixelPosition(cursor); + var h = this.$size.scrollerHeight - this.lineHeight; + var offset = pos.top - h * (alignment || 0); + + this.session.setScrollTop(offset); + return offset; + }; + + this.STEPS = 8; + this.$calcSteps = function(fromValue, toValue){ + var i = 0; + var l = this.STEPS; + var steps = []; + + var func = function(t, x_min, dx) { + return dx * (Math.pow(t - 1, 3) + 1) + x_min; + }; + + for (i = 0; i < l; ++i) + steps.push(func(i / this.STEPS, fromValue, toValue - fromValue)); + + return steps; + }; + this.scrollToLine = function(line, center, animate, callback) { + var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0}); + var offset = pos.top; + if (center) + offset -= this.$size.scrollerHeight / 2; + + var initialScroll = this.scrollTop; + this.session.setScrollTop(offset); + if (animate !== false) + this.animateScrolling(initialScroll, callback); + }; + + this.animateScrolling = function(fromValue, callback) { + var toValue = this.scrollTop; + if (!this.$animatedScroll) + return; + var _self = this; + + if (fromValue == toValue) + return; + + if (this.$scrollAnimation) { + var oldSteps = this.$scrollAnimation.steps; + if (oldSteps.length) { + fromValue = oldSteps[0]; + if (fromValue == toValue) + return; + } + } + + var steps = _self.$calcSteps(fromValue, toValue); + this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps}; + + clearInterval(this.$timer); + + _self.session.setScrollTop(steps.shift()); + _self.session.$scrollTop = toValue; + this.$timer = setInterval(function() { + if (steps.length) { + _self.session.setScrollTop(steps.shift()); + _self.session.$scrollTop = toValue; + } else if (toValue != null) { + _self.session.$scrollTop = -1; + _self.session.setScrollTop(toValue); + toValue = null; + } else { + _self.$timer = clearInterval(_self.$timer); + _self.$scrollAnimation = null; + callback && callback(); + } + }, 10); + }; + this.scrollToY = function(scrollTop) { + if (this.scrollTop !== scrollTop) { + this.$loop.schedule(this.CHANGE_SCROLL); + this.scrollTop = scrollTop; + } + }; + this.scrollToX = function(scrollLeft) { + if (this.scrollLeft !== scrollLeft) + this.scrollLeft = scrollLeft; + this.$loop.schedule(this.CHANGE_H_SCROLL); + }; + this.scrollTo = function(x, y) { + this.session.setScrollTop(y); + this.session.setScrollLeft(y); + }; + this.scrollBy = function(deltaX, deltaY) { + deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY); + deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX); + }; + this.isScrollableBy = function(deltaX, deltaY) { + if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top) + return true; + if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight + - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom) + return true; + if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left) + return true; + if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth + - this.layerConfig.width < -1 + this.scrollMargin.right) + return true; + }; + + this.pixelToScreenCoordinates = function(x, y) { + var canvasPos = this.scroller.getBoundingClientRect(); + + var offset = (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth; + var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight); + var col = Math.round(offset); + + return {row: row, column: col, side: offset - col > 0 ? 1 : -1}; + }; + + this.screenToTextCoordinates = function(x, y) { + var canvasPos = this.scroller.getBoundingClientRect(); + + var col = Math.round( + (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth + ); + + var row = (y + this.scrollTop - canvasPos.top) / this.lineHeight; + + return this.session.screenToDocumentPosition(row, Math.max(col, 0)); + }; + this.textToScreenCoordinates = function(row, column) { + var canvasPos = this.scroller.getBoundingClientRect(); + var pos = this.session.documentToScreenPosition(row, column); + + var x = this.$padding + Math.round(pos.column * this.characterWidth); + var y = pos.row * this.lineHeight; + + return { + pageX: canvasPos.left + x - this.scrollLeft, + pageY: canvasPos.top + y - this.scrollTop + }; + }; + this.visualizeFocus = function() { + dom.addCssClass(this.container, "ace_focus"); + }; + this.visualizeBlur = function() { + dom.removeCssClass(this.container, "ace_focus"); + }; + this.showComposition = function(position) { + if (!this.$composition) + this.$composition = { + keepTextAreaAtCursor: this.$keepTextAreaAtCursor, + cssText: this.textarea.style.cssText + }; + + this.$keepTextAreaAtCursor = true; + dom.addCssClass(this.textarea, "ace_composition"); + this.textarea.style.cssText = ""; + this.$moveTextAreaToCursor(); + }; + this.setCompositionText = function(text) { + this.$moveTextAreaToCursor(); + }; + this.hideComposition = function() { + if (!this.$composition) + return; + + dom.removeCssClass(this.textarea, "ace_composition"); + this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor; + this.textarea.style.cssText = this.$composition.cssText; + this.$composition = null; + }; + this.setTheme = function(theme, cb) { + var _self = this; + this.$themeId = theme; + _self._dispatchEvent('themeChange',{theme:theme}); + + if (!theme || typeof theme == "string") { + var moduleName = theme || this.$options.theme.initialValue; + config.loadModule(["theme", moduleName], afterLoad); + } else { + afterLoad(theme); + } + + function afterLoad(module) { + if (_self.$themeId != theme) + return cb && cb(); + if (!module || !module.cssClass) + throw new Error("couldn't load module " + theme + " or it didn't call define"); + dom.importCssString( + module.cssText, + module.cssClass, + _self.container.ownerDocument + ); + + if (_self.theme) + dom.removeCssClass(_self.container, _self.theme.cssClass); + + var padding = "padding" in module ? module.padding + : "padding" in (_self.theme || {}) ? 4 : _self.$padding; + if (_self.$padding && padding != _self.$padding) + _self.setPadding(padding); + _self.$theme = module.cssClass; + + _self.theme = module; + dom.addCssClass(_self.container, module.cssClass); + dom.setCssClass(_self.container, "ace_dark", module.isDark); + if (_self.$size) { + _self.$size.width = 0; + _self.$updateSizeAsync(); + } + + _self._dispatchEvent('themeLoaded', {theme:module}); + cb && cb(); + } + }; + this.getTheme = function() { + return this.$themeId; + }; + this.setStyle = function(style, include) { + dom.setCssClass(this.container, style, include !== false); + }; + this.unsetStyle = function(style) { + dom.removeCssClass(this.container, style); + }; + + this.setCursorStyle = function(style) { + if (this.scroller.style.cursor != style) + this.scroller.style.cursor = style; + }; + this.setMouseCursor = function(cursorStyle) { + this.scroller.style.cursor = cursorStyle; + }; + this.destroy = function() { + this.$textLayer.destroy(); + this.$cursorLayer.destroy(); + }; + +}).call(VirtualRenderer.prototype); + + +config.defineOptions(VirtualRenderer.prototype, "renderer", { + animatedScroll: {initialValue: false}, + showInvisibles: { + set: function(value) { + if (this.$textLayer.setShowInvisibles(value)) + this.$loop.schedule(this.CHANGE_TEXT); + }, + initialValue: false + }, + showPrintMargin: { + set: function() { this.$updatePrintMargin(); }, + initialValue: true + }, + printMarginColumn: { + set: function() { this.$updatePrintMargin(); }, + initialValue: 80 + }, + printMargin: { + set: function(val) { + if (typeof val == "number") + this.$printMarginColumn = val; + this.$showPrintMargin = !!val; + this.$updatePrintMargin(); + }, + get: function() { + return this.$showPrintMargin && this.$printMarginColumn; + } + }, + showGutter: { + set: function(show){ + this.$gutter.style.display = show ? "block" : "none"; + this.$loop.schedule(this.CHANGE_FULL); + this.onGutterResize(); + }, + initialValue: true + }, + fadeFoldWidgets: { + set: function(show) { + dom.setCssClass(this.$gutter, "ace_fade-fold-widgets", show); + }, + initialValue: false + }, + showFoldWidgets: { + set: function(show) {this.$gutterLayer.setShowFoldWidgets(show)}, + initialValue: true + }, + showLineNumbers: { + set: function(show) { + this.$gutterLayer.setShowLineNumbers(show); + this.$loop.schedule(this.CHANGE_GUTTER); + }, + initialValue: true + }, + displayIndentGuides: { + set: function(show) { + if (this.$textLayer.setDisplayIndentGuides(show)) + this.$loop.schedule(this.CHANGE_TEXT); + }, + initialValue: true + }, + highlightGutterLine: { + set: function(shouldHighlight) { + if (!this.$gutterLineHighlight) { + this.$gutterLineHighlight = dom.createElement("div"); + this.$gutterLineHighlight.className = "ace_gutter-active-line"; + this.$gutter.appendChild(this.$gutterLineHighlight); + return; + } + + this.$gutterLineHighlight.style.display = shouldHighlight ? "" : "none"; + if (this.$cursorLayer.$pixelPos) + this.$updateGutterLineHighlight(); + }, + initialValue: false, + value: true + }, + hScrollBarAlwaysVisible: { + set: function(val) { + if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll) + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: false + }, + vScrollBarAlwaysVisible: { + set: function(val) { + if (!this.$vScrollBarAlwaysVisible || !this.$vScroll) + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: false + }, + fontSize: { + set: function(size) { + if (typeof size == "number") + size = size + "px"; + this.container.style.fontSize = size; + this.updateFontSize(); + }, + initialValue: 12 + }, + fontFamily: { + set: function(name) { + this.container.style.fontFamily = name; + this.updateFontSize(); + } + }, + maxLines: { + set: function(val) { + this.updateFull(); + } + }, + minLines: { + set: function(val) { + this.updateFull(); + } + }, + maxPixelHeight: { + set: function(val) { + this.updateFull(); + }, + initialValue: 0 + }, + scrollPastEnd: { + set: function(val) { + val = +val || 0; + if (this.$scrollPastEnd == val) + return; + this.$scrollPastEnd = val; + this.$loop.schedule(this.CHANGE_SCROLL); + }, + initialValue: 0, + handlesSet: true + }, + fixedWidthGutter: { + set: function(val) { + this.$gutterLayer.$fixedWidth = !!val; + this.$loop.schedule(this.CHANGE_GUTTER); + } + }, + theme: { + set: function(val) { this.setTheme(val) }, + get: function() { return this.$themeId || this.theme; }, + initialValue: "./theme/textmate", + handlesSet: true + } +}); + +exports.VirtualRenderer = VirtualRenderer; +}); + +define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var net = require("../lib/net"); +var EventEmitter = require("../lib/event_emitter").EventEmitter; +var config = require("../config"); + +var WorkerClient = function(topLevelNamespaces, mod, classname, workerUrl) { + this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this); + this.changeListener = this.changeListener.bind(this); + this.onMessage = this.onMessage.bind(this); + if (require.nameToUrl && !require.toUrl) + require.toUrl = require.nameToUrl; + + if (config.get("packaged") || !require.toUrl) { + workerUrl = workerUrl || config.moduleUrl(mod, "worker"); + } else { + var normalizePath = this.$normalizePath; + workerUrl = workerUrl || normalizePath(require.toUrl("ace/worker/worker.js", null, "_")); + + var tlns = {}; + topLevelNamespaces.forEach(function(ns) { + tlns[ns] = normalizePath(require.toUrl(ns, null, "_").replace(/(\.js)?(\?.*)?$/, "")); + }); + } + + try { + this.$worker = new Worker(workerUrl); + } catch(e) { + if (e instanceof window.DOMException) { + var blob = this.$workerBlob(workerUrl); + var URL = window.URL || window.webkitURL; + var blobURL = URL.createObjectURL(blob); + + this.$worker = new Worker(blobURL); + URL.revokeObjectURL(blobURL); + } else { + throw e; + } + } + this.$worker.postMessage({ + init : true, + tlns : tlns, + module : mod, + classname : classname + }); + + this.callbackId = 1; + this.callbacks = {}; + + this.$worker.onmessage = this.onMessage; +}; + +(function(){ + + oop.implement(this, EventEmitter); + + this.onMessage = function(e) { + var msg = e.data; + switch(msg.type) { + case "event": + this._signal(msg.name, {data: msg.data}); + break; + case "call": + var callback = this.callbacks[msg.id]; + if (callback) { + callback(msg.data); + delete this.callbacks[msg.id]; + } + break; + case "error": + this.reportError(msg.data); + break; + case "log": + window.console && console.log && console.log.apply(console, msg.data); + break; + } + }; + + this.reportError = function(err) { + window.console && console.error && console.error(err); + }; + + this.$normalizePath = function(path) { + return net.qualifyURL(path); + }; + + this.terminate = function() { + this._signal("terminate", {}); + this.deltaQueue = null; + this.$worker.terminate(); + this.$worker = null; + if (this.$doc) + this.$doc.off("change", this.changeListener); + this.$doc = null; + }; + + this.send = function(cmd, args) { + this.$worker.postMessage({command: cmd, args: args}); + }; + + this.call = function(cmd, args, callback) { + if (callback) { + var id = this.callbackId++; + this.callbacks[id] = callback; + args.push(id); + } + this.send(cmd, args); + }; + + this.emit = function(event, data) { + try { + this.$worker.postMessage({event: event, data: {data: data.data}}); + } + catch(ex) { + console.error(ex.stack); + } + }; + + this.attachToDocument = function(doc) { + if(this.$doc) + this.terminate(); + + this.$doc = doc; + this.call("setValue", [doc.getValue()]); + doc.on("change", this.changeListener); + }; + + this.changeListener = function(delta) { + if (!this.deltaQueue) { + this.deltaQueue = []; + setTimeout(this.$sendDeltaQueue, 0); + } + if (delta.action == "insert") + this.deltaQueue.push(delta.start, delta.lines); + else + this.deltaQueue.push(delta.start, delta.end); + }; + + this.$sendDeltaQueue = function() { + var q = this.deltaQueue; + if (!q) return; + this.deltaQueue = null; + if (q.length > 50 && q.length > this.$doc.getLength() >> 1) { + this.call("setValue", [this.$doc.getValue()]); + } else + this.emit("change", {data: q}); + }; + + this.$workerBlob = function(workerUrl) { + var script = "importScripts('" + net.qualifyURL(workerUrl) + "');"; + try { + return new Blob([script], {"type": "application/javascript"}); + } catch (e) { // Backwards-compatibility + var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder; + var blobBuilder = new BlobBuilder(); + blobBuilder.append(script); + return blobBuilder.getBlob("application/javascript"); + } + }; + +}).call(WorkerClient.prototype); + + +var UIWorkerClient = function(topLevelNamespaces, mod, classname) { + this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this); + this.changeListener = this.changeListener.bind(this); + this.callbackId = 1; + this.callbacks = {}; + this.messageBuffer = []; + + var main = null; + var emitSync = false; + var sender = Object.create(EventEmitter); + var _self = this; + + this.$worker = {}; + this.$worker.terminate = function() {}; + this.$worker.postMessage = function(e) { + _self.messageBuffer.push(e); + if (main) { + if (emitSync) + setTimeout(processNext); + else + processNext(); + } + }; + this.setEmitSync = function(val) { emitSync = val }; + + var processNext = function() { + var msg = _self.messageBuffer.shift(); + if (msg.command) + main[msg.command].apply(main, msg.args); + else if (msg.event) + sender._signal(msg.event, msg.data); + }; + + sender.postMessage = function(msg) { + _self.onMessage({data: msg}); + }; + sender.callback = function(data, callbackId) { + this.postMessage({type: "call", id: callbackId, data: data}); + }; + sender.emit = function(name, data) { + this.postMessage({type: "event", name: name, data: data}); + }; + + config.loadModule(["worker", mod], function(Main) { + main = new Main[classname](sender); + while (_self.messageBuffer.length) + processNext(); + }); +}; + +UIWorkerClient.prototype = WorkerClient.prototype; + +exports.UIWorkerClient = UIWorkerClient; +exports.WorkerClient = WorkerClient; + +}); + +define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"], function(require, exports, module) { +"use strict"; + +var Range = require("./range").Range; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var oop = require("./lib/oop"); + +var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) { + var _self = this; + this.length = length; + this.session = session; + this.doc = session.getDocument(); + this.mainClass = mainClass; + this.othersClass = othersClass; + this.$onUpdate = this.onUpdate.bind(this); + this.doc.on("change", this.$onUpdate); + this.$others = others; + + this.$onCursorChange = function() { + setTimeout(function() { + _self.onCursorChange(); + }); + }; + + this.$pos = pos; + var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1}; + this.$undoStackDepth = undoStack.length; + this.setup(); + + session.selection.on("changeCursor", this.$onCursorChange); +}; + +(function() { + + oop.implement(this, EventEmitter); + this.setup = function() { + var _self = this; + var doc = this.doc; + var session = this.session; + + this.selectionBefore = session.selection.toJSON(); + if (session.selection.inMultiSelectMode) + session.selection.toSingleRange(); + + this.pos = doc.createAnchor(this.$pos.row, this.$pos.column); + var pos = this.pos; + pos.$insertRight = true; + pos.detach(); + pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false); + this.others = []; + this.$others.forEach(function(other) { + var anchor = doc.createAnchor(other.row, other.column); + anchor.$insertRight = true; + anchor.detach(); + _self.others.push(anchor); + }); + session.setUndoSelect(false); + }; + this.showOtherMarkers = function() { + if (this.othersActive) return; + var session = this.session; + var _self = this; + this.othersActive = true; + this.others.forEach(function(anchor) { + anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false); + }); + }; + this.hideOtherMarkers = function() { + if (!this.othersActive) return; + this.othersActive = false; + for (var i = 0; i < this.others.length; i++) { + this.session.removeMarker(this.others[i].markerId); + } + }; + this.onUpdate = function(delta) { + if (this.$updating) + return this.updateAnchors(delta); + + var range = delta; + if (range.start.row !== range.end.row) return; + if (range.start.row !== this.pos.row) return; + this.$updating = true; + var lengthDiff = delta.action === "insert" ? range.end.column - range.start.column : range.start.column - range.end.column; + var inMainRange = range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1; + var distanceFromStart = range.start.column - this.pos.column; + + this.updateAnchors(delta); + + if (inMainRange) + this.length += lengthDiff; + + if (inMainRange && !this.session.$fromUndo) { + if (delta.action === 'insert') { + for (var i = this.others.length - 1; i >= 0; i--) { + var otherPos = this.others[i]; + var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart}; + this.doc.insertMergedLines(newPos, delta.lines); + } + } else if (delta.action === 'remove') { + for (var i = this.others.length - 1; i >= 0; i--) { + var otherPos = this.others[i]; + var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart}; + this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff)); + } + } + } + + this.$updating = false; + this.updateMarkers(); + }; + + this.updateAnchors = function(delta) { + this.pos.onChange(delta); + for (var i = this.others.length; i--;) + this.others[i].onChange(delta); + this.updateMarkers(); + }; + + this.updateMarkers = function() { + if (this.$updating) + return; + var _self = this; + var session = this.session; + var updateMarker = function(pos, className) { + session.removeMarker(pos.markerId); + pos.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column+_self.length), className, null, false); + }; + updateMarker(this.pos, this.mainClass); + for (var i = this.others.length; i--;) + updateMarker(this.others[i], this.othersClass); + }; + + this.onCursorChange = function(event) { + if (this.$updating || !this.session) return; + var pos = this.session.selection.getCursor(); + if (pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) { + this.showOtherMarkers(); + this._emit("cursorEnter", event); + } else { + this.hideOtherMarkers(); + this._emit("cursorLeave", event); + } + }; + this.detach = function() { + this.session.removeMarker(this.pos && this.pos.markerId); + this.hideOtherMarkers(); + this.doc.removeEventListener("change", this.$onUpdate); + this.session.selection.removeEventListener("changeCursor", this.$onCursorChange); + this.session.setUndoSelect(true); + this.session = null; + }; + this.cancel = function() { + if (this.$undoStackDepth === -1) + return; + var undoManager = this.session.getUndoManager(); + var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth; + for (var i = 0; i < undosRequired; i++) { + undoManager.undo(true); + } + if (this.selectionBefore) + this.session.selection.fromJSON(this.selectionBefore); + }; +}).call(PlaceHolder.prototype); + + +exports.PlaceHolder = PlaceHolder; +}); + +define("ace/mouse/multi_select_handler",["require","exports","module","ace/lib/event","ace/lib/useragent"], function(require, exports, module) { + +var event = require("../lib/event"); +var useragent = require("../lib/useragent"); +function isSamePoint(p1, p2) { + return p1.row == p2.row && p1.column == p2.column; +} + +function onMouseDown(e) { + var ev = e.domEvent; + var alt = ev.altKey; + var shift = ev.shiftKey; + var ctrl = ev.ctrlKey; + var accel = e.getAccelKey(); + var button = e.getButton(); + + if (ctrl && useragent.isMac) + button = ev.button; + + if (e.editor.inMultiSelectMode && button == 2) { + e.editor.textInput.onContextMenu(e.domEvent); + return; + } + + if (!ctrl && !alt && !accel) { + if (button === 0 && e.editor.inMultiSelectMode) + e.editor.exitMultiSelectMode(); + return; + } + + if (button !== 0) + return; + + var editor = e.editor; + var selection = editor.selection; + var isMultiSelect = editor.inMultiSelectMode; + var pos = e.getDocumentPosition(); + var cursor = selection.getCursor(); + var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor)); + + var mouseX = e.x, mouseY = e.y; + var onMouseSelection = function(e) { + mouseX = e.clientX; + mouseY = e.clientY; + }; + + var session = editor.session; + var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); + var screenCursor = screenAnchor; + + var selectionMode; + if (editor.$mouseHandler.$enableJumpToDef) { + if (ctrl && alt || accel && alt) + selectionMode = shift ? "block" : "add"; + else if (alt && editor.$blockSelectEnabled) + selectionMode = "block"; + } else { + if (accel && !alt) { + selectionMode = "add"; + if (!isMultiSelect && shift) + return; + } else if (alt && editor.$blockSelectEnabled) { + selectionMode = "block"; + } + } + + if (selectionMode && useragent.isMac && ev.ctrlKey) { + editor.$mouseHandler.cancelContextMenu(); + } + + if (selectionMode == "add") { + if (!isMultiSelect && inSelection) + return; // dragging + + if (!isMultiSelect) { + var range = selection.toOrientedRange(); + editor.addSelectionMarker(range); + } + + var oldRange = selection.rangeList.rangeAtPoint(pos); + + + editor.$blockScrolling++; + editor.inVirtualSelectionMode = true; + + if (shift) { + oldRange = null; + range = selection.ranges[0] || range; + editor.removeSelectionMarker(range); + } + editor.once("mouseup", function() { + var tmpSel = selection.toOrientedRange(); + + if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor)) + selection.substractPoint(tmpSel.cursor); + else { + if (shift) { + selection.substractPoint(range.cursor); + } else if (range) { + editor.removeSelectionMarker(range); + selection.addRange(range); + } + selection.addRange(tmpSel); + } + editor.$blockScrolling--; + editor.inVirtualSelectionMode = false; + }); + + } else if (selectionMode == "block") { + e.stop(); + editor.inVirtualSelectionMode = true; + var initialRange; + var rectSel = []; + var blockSelect = function() { + var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); + var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column); + + if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead)) + return; + screenCursor = newCursor; + + editor.$blockScrolling++; + editor.selection.moveToPosition(cursor); + editor.renderer.scrollCursorIntoView(); + + editor.removeSelectionMarkers(rectSel); + rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor); + if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty()) + rectSel[0] = editor.$mouseHandler.$clickSelection.clone(); + rectSel.forEach(editor.addSelectionMarker, editor); + editor.updateSelectionMarkers(); + editor.$blockScrolling--; + }; + editor.$blockScrolling++; + if (isMultiSelect && !accel) { + selection.toSingleRange(); + } else if (!isMultiSelect && accel) { + initialRange = selection.toOrientedRange(); + editor.addSelectionMarker(initialRange); + } + + if (shift) + screenAnchor = session.documentToScreenPosition(selection.lead); + else + selection.moveToPosition(pos); + editor.$blockScrolling--; + + screenCursor = {row: -1, column: -1}; + + var onMouseSelectionEnd = function(e) { + clearInterval(timerId); + editor.removeSelectionMarkers(rectSel); + if (!rectSel.length) + rectSel = [selection.toOrientedRange()]; + editor.$blockScrolling++; + if (initialRange) { + editor.removeSelectionMarker(initialRange); + selection.toSingleRange(initialRange); + } + for (var i = 0; i < rectSel.length; i++) + selection.addRange(rectSel[i]); + editor.inVirtualSelectionMode = false; + editor.$mouseHandler.$clickSelection = null; + editor.$blockScrolling--; + }; + + var onSelectionInterval = blockSelect; + + event.capture(editor.container, onMouseSelection, onMouseSelectionEnd); + var timerId = setInterval(function() {onSelectionInterval();}, 20); + + return e.preventDefault(); + } +} + + +exports.onMouseDown = onMouseDown; + +}); + +define("ace/commands/multi_select_commands",["require","exports","module","ace/keyboard/hash_handler"], function(require, exports, module) { +exports.defaultCommands = [{ + name: "addCursorAbove", + exec: function(editor) { editor.selectMoreLines(-1); }, + bindKey: {win: "Ctrl-Alt-Up", mac: "Ctrl-Alt-Up"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "addCursorBelow", + exec: function(editor) { editor.selectMoreLines(1); }, + bindKey: {win: "Ctrl-Alt-Down", mac: "Ctrl-Alt-Down"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "addCursorAboveSkipCurrent", + exec: function(editor) { editor.selectMoreLines(-1, true); }, + bindKey: {win: "Ctrl-Alt-Shift-Up", mac: "Ctrl-Alt-Shift-Up"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "addCursorBelowSkipCurrent", + exec: function(editor) { editor.selectMoreLines(1, true); }, + bindKey: {win: "Ctrl-Alt-Shift-Down", mac: "Ctrl-Alt-Shift-Down"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectMoreBefore", + exec: function(editor) { editor.selectMore(-1); }, + bindKey: {win: "Ctrl-Alt-Left", mac: "Ctrl-Alt-Left"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectMoreAfter", + exec: function(editor) { editor.selectMore(1); }, + bindKey: {win: "Ctrl-Alt-Right", mac: "Ctrl-Alt-Right"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectNextBefore", + exec: function(editor) { editor.selectMore(-1, true); }, + bindKey: {win: "Ctrl-Alt-Shift-Left", mac: "Ctrl-Alt-Shift-Left"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "selectNextAfter", + exec: function(editor) { editor.selectMore(1, true); }, + bindKey: {win: "Ctrl-Alt-Shift-Right", mac: "Ctrl-Alt-Shift-Right"}, + scrollIntoView: "cursor", + readOnly: true +}, { + name: "splitIntoLines", + exec: function(editor) { editor.multiSelect.splitIntoLines(); }, + bindKey: {win: "Ctrl-Alt-L", mac: "Ctrl-Alt-L"}, + readOnly: true +}, { + name: "alignCursors", + exec: function(editor) { editor.alignCursors(); }, + bindKey: {win: "Ctrl-Alt-A", mac: "Ctrl-Alt-A"}, + scrollIntoView: "cursor" +}, { + name: "findAll", + exec: function(editor) { editor.findAll(); }, + bindKey: {win: "Ctrl-Alt-K", mac: "Ctrl-Alt-G"}, + scrollIntoView: "cursor", + readOnly: true +}]; +exports.multiSelectCommands = [{ + name: "singleSelection", + bindKey: "esc", + exec: function(editor) { editor.exitMultiSelectMode(); }, + scrollIntoView: "cursor", + readOnly: true, + isAvailable: function(editor) {return editor && editor.inMultiSelectMode} +}]; + +var HashHandler = require("../keyboard/hash_handler").HashHandler; +exports.keyboardHandler = new HashHandler(exports.multiSelectCommands); + +}); + +define("ace/multi_select",["require","exports","module","ace/range_list","ace/range","ace/selection","ace/mouse/multi_select_handler","ace/lib/event","ace/lib/lang","ace/commands/multi_select_commands","ace/search","ace/edit_session","ace/editor","ace/config"], function(require, exports, module) { var RangeList = require("./range_list").RangeList; var Range = require("./range").Range; @@ -15612,7 +17448,7 @@ var EditSession = require("./edit_session").EditSession; if (!range) return; - if (!this.inMultiSelectMode && this.rangeCount == 0) { + if (!this.inMultiSelectMode && this.rangeCount === 0) { var oldRange = this.toOrientedRange(); this.rangeList.add(oldRange); this.rangeList.add(range); @@ -15689,7 +17525,7 @@ var EditSession = require("./edit_session").EditSession; this._signal("removeRange", {ranges: removed}); - if (this.rangeCount == 0 && this.inMultiSelectMode) { + if (this.rangeCount === 0 && this.inMultiSelectMode) { this.inMultiSelectMode = false; this._signal("singleSelect"); this.session.$undoSelect = true; @@ -15932,32 +17768,37 @@ var Editor = require("./editor").Editor; } return result; }; - this.forEachSelection = function(cmd, args, $byLines) { + this.forEachSelection = function(cmd, args, options) { if (this.inVirtualSelectionMode) return; - + var keepOrder = options && options.keepOrder; + var $byLines = options == true || options && options.$byLines var session = this.session; var selection = this.selection; var rangeList = selection.rangeList; + var ranges = (keepOrder ? selection : rangeList).ranges; var result; + if (!ranges.length) + return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {}); + var reg = selection._eventRegistry; selection._eventRegistry = {}; var tmpSel = new Selection(session); this.inVirtualSelectionMode = true; - for (var i = rangeList.ranges.length; i--;) { + for (var i = ranges.length; i--;) { if ($byLines) { - while (i > 0 && rangeList.ranges[i].start.row == rangeList.ranges[i - 1].end.row) + while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row) i--; } - tmpSel.fromOrientedRange(rangeList.ranges[i]); - tmpSel.id = rangeList.ranges[i].marker; + tmpSel.fromOrientedRange(ranges[i]); + tmpSel.index = i; this.selection = session.selection = tmpSel; - var cmdResult = cmd.exec(this, args || {}); - if (result !== undefined) + var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {}); + if (!result && cmdResult !== undefined) result = cmdResult; - tmpSel.toOrientedRange(rangeList.ranges[i]); + tmpSel.toOrientedRange(ranges[i]); } tmpSel.detach(); @@ -15997,36 +17838,31 @@ var Editor = require("./editor").Editor; } return text; }; - this.onPaste = function(text) { - if (this.$readOnly) - return; - - - var e = {text: text}; - this._signal("paste", e); - text = e.text; - if (!this.inMultiSelectMode || this.inVirtualSelectionMode) - return this.insert(text); - - var lines = text.split(/\r\n|\r|\n/); - var ranges = this.selection.rangeList.ranges; - - if (lines.length > ranges.length || lines.length < 2 || !lines[1]) - return this.commands.exec("insertstring", this, text); - - for (var i = ranges.length; i--;) { - var range = ranges[i]; - if (!range.isEmpty()) - this.session.remove(range); - - this.session.insert(range.start, lines[i]); + + this.$checkMultiselectChange = function(e, anchor) { + if (this.inMultiSelectMode && !this.inVirtualSelectionMode) { + var range = this.multiSelect.ranges[0]; + if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor) + return; + var pos = anchor == this.multiSelect.anchor + ? range.cursor == range.start ? range.end : range.start + : range.cursor; + if (pos.row != anchor.row + || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column) + this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange()); } }; this.findAll = function(needle, options, additive) { options = options || {}; options.needle = needle || options.needle; + if (options.needle == undefined) { + var range = this.selection.isEmpty() + ? this.selection.getWordRange() + : this.selection.getRange(); + options.needle = this.session.getTextRange(range); + } this.$search.set(options); - + var ranges = this.$search.findAll(this.session); if (!ranges.length) return 0; @@ -16039,7 +17875,9 @@ var Editor = require("./editor").Editor; for (var i = ranges.length; i--; ) selection.addRange(ranges[i], true); - + if (range && selection.rangeList.rangeAtPoint(range.start)) + selection.addRange(range, true); + this.$blockScrolling -= 1; return ranges.length; @@ -16117,7 +17955,7 @@ var Editor = require("./editor").Editor; range.start.column = tmp.start.column; } }; - this.selectMore = function(dir, skip) { + this.selectMore = function(dir, skip, stopAtFirst) { var session = this.session; var sel = session.multiSelect; @@ -16126,6 +17964,8 @@ var Editor = require("./editor").Editor; range = session.getWordRange(range.start.row, range.start.column); range.cursor = dir == -1 ? range.start : range.end; this.multiSelect.addRange(range); + if (stopAtFirst) + return; } var needle = session.getTextRange(range); @@ -16145,8 +17985,14 @@ var Editor = require("./editor").Editor; var session = this.session; var sel = session.multiSelect; var ranges = sel.ranges; - - if (!ranges.length) { + var row = -1; + var sameRowRanges = ranges.filter(function(r) { + if (r.cursor.row == row) + return true; + row = r.cursor.row; + }); + + if (!ranges.length || sameRowRanges.length == ranges.length - 1) { var range = this.selection.getRange(); var fr = range.start.row, lr = range.end.row; var guessRange = fr == lr; @@ -16163,22 +18009,18 @@ var Editor = require("./editor").Editor; if (fr < 0) fr = 0; if (lr >= max) lr = max - 1; } - var lines = this.session.doc.removeLines(fr, lr); + var lines = this.session.removeFullLines(fr, lr); lines = this.$reAlignText(lines, guessRange); - this.session.doc.insert({row: fr, column: 0}, lines.join("\n") + "\n"); + this.session.insert({row: fr, column: 0}, lines.join("\n") + "\n"); if (!guessRange) { range.start.column = 0; range.end.column = lines[lines.length - 1].length; } this.selection.setRange(range); } else { - var row = -1; - var sameRowRanges = ranges.filter(function(r) { - if (r.cursor.row == row) - return true; - row = r.cursor.row; + sameRowRanges.forEach(function(r) { + sel.substractPoint(r.cursor); }); - sel.$onRemoveRange(sameRowRanges); var maxCol = 0; var minSpace = Infinity; @@ -16253,19 +18095,19 @@ var Editor = require("./editor").Editor; function alignLeft(m) { return !m[2] ? m[0] : spaces(startW) + m[2] + spaces(textW - m[2].length + endW) - + m[4].replace(/^([=:])\s+/, "$1 ") + + m[4].replace(/^([=:])\s+/, "$1 "); } function alignRight(m) { return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2] + spaces(endW, " ") - + m[4].replace(/^([=:])\s+/, "$1 ") + + m[4].replace(/^([=:])\s+/, "$1 "); } function unAlign(m) { return !m[2] ? m[0] : spaces(startW) + m[2] + spaces(endW) - + m[4].replace(/^([=:])\s+/, "$1 ") + + m[4].replace(/^([=:])\s+/, "$1 "); } - } + }; }).call(Editor.prototype); @@ -16274,27 +18116,33 @@ function isSamePoint(p1, p2) { } exports.onSessionChange = function(e) { var session = e.session; - if (!session.multiSelect) { + if (session && !session.multiSelect) { session.$selectionMarkers = []; session.selection.$initRangeList(); session.multiSelect = session.selection; } - this.multiSelect = session.multiSelect; + this.multiSelect = session && session.multiSelect; var oldSession = e.oldSession; if (oldSession) { - oldSession.multiSelect.removeEventListener("addRange", this.$onAddRange); - oldSession.multiSelect.removeEventListener("removeRange", this.$onRemoveRange); - oldSession.multiSelect.removeEventListener("multiSelect", this.$onMultiSelect); - oldSession.multiSelect.removeEventListener("singleSelect", this.$onSingleSelect); + oldSession.multiSelect.off("addRange", this.$onAddRange); + oldSession.multiSelect.off("removeRange", this.$onRemoveRange); + oldSession.multiSelect.off("multiSelect", this.$onMultiSelect); + oldSession.multiSelect.off("singleSelect", this.$onSingleSelect); + oldSession.multiSelect.lead.off("change", this.$checkMultiselectChange); + oldSession.multiSelect.anchor.off("change", this.$checkMultiselectChange); } - session.multiSelect.on("addRange", this.$onAddRange); - session.multiSelect.on("removeRange", this.$onRemoveRange); - session.multiSelect.on("multiSelect", this.$onMultiSelect); - session.multiSelect.on("singleSelect", this.$onSingleSelect); + if (session) { + session.multiSelect.on("addRange", this.$onAddRange); + session.multiSelect.on("removeRange", this.$onRemoveRange); + session.multiSelect.on("multiSelect", this.$onMultiSelect); + session.multiSelect.on("singleSelect", this.$onSingleSelect); + session.multiSelect.lead.on("change", this.$checkMultiselectChange); + session.multiSelect.anchor.on("change", this.$checkMultiselectChange); + } - if (this.inMultiSelectMode != session.selection.inMultiSelectMode) { + if (session && this.inMultiSelectMode != session.selection.inMultiSelectMode) { if (session.selection.inMultiSelectMode) this.$onMultiSelect(); else @@ -16309,6 +18157,7 @@ function MultiSelect(editor) { editor.$onMultiSelect = editor.$onMultiSelect.bind(editor); editor.$onSingleSelect = editor.$onSingleSelect.bind(editor); editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor); + editor.$checkMultiselectChange = editor.$checkMultiselectChange.bind(editor); editor.$multiselectOnSessionChange(editor); editor.on("changeSession", editor.$multiselectOnSessionChange); @@ -16323,7 +18172,8 @@ function addAltCursorListeners(editor){ var el = editor.textInput.getElement(); var altCursor = false; event.addListener(el, "keydown", function(e) { - if (e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey)) { + var altDown = e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey); + if (editor.$blockSelectEnabled && altDown) { if (!altCursor) { editor.renderer.setMouseCursor("crosshair"); altCursor = true; @@ -16359,595 +18209,21 @@ require("./config").defineOptions(Editor.prototype, "editor", { } }, value: true + }, + enableBlockSelect: { + set: function(val) { + this.$blockSelectEnabled = val; + }, + value: true } -}) +}); }); -define('ace/mouse/multi_select_handler', ['require', 'exports', 'module' , 'ace/lib/event'], function(require, exports, module) { - -var event = require("../lib/event"); -function isSamePoint(p1, p2) { - return p1.row == p2.row && p1.column == p2.column; -} - -function onMouseDown(e) { - var ev = e.domEvent; - var alt = ev.altKey; - var shift = ev.shiftKey; - var ctrl = e.getAccelKey(); - var button = e.getButton(); - - if (e.editor.inMultiSelectMode && button == 2) { - e.editor.textInput.onContextMenu(e.domEvent); - return; - } - - if (!ctrl && !alt) { - if (button === 0 && e.editor.inMultiSelectMode) - e.editor.exitMultiSelectMode(); - return; - } - - var editor = e.editor; - var selection = editor.selection; - var isMultiSelect = editor.inMultiSelectMode; - var pos = e.getDocumentPosition(); - var cursor = selection.getCursor(); - var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor)); - - - var mouseX = e.x, mouseY = e.y; - var onMouseSelection = function(e) { - mouseX = e.clientX; - mouseY = e.clientY; - }; - - var blockSelect = function() { - var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); - var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column); - - if (isSamePoint(screenCursor, newCursor) - && isSamePoint(cursor, selection.selectionLead)) - return; - screenCursor = newCursor; - - editor.selection.moveToPosition(cursor); - editor.renderer.scrollCursorIntoView(); - - editor.removeSelectionMarkers(rectSel); - rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor); - rectSel.forEach(editor.addSelectionMarker, editor); - editor.updateSelectionMarkers(); - }; - - var session = editor.session; - var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY); - var screenCursor = screenAnchor; - - - - if (ctrl && !alt && !shift && button === 0) { - if (!isMultiSelect && inSelection) - return; // dragging - - if (!isMultiSelect) { - var range = selection.toOrientedRange(); - editor.addSelectionMarker(range); - } - - var oldRange = selection.rangeList.rangeAtPoint(pos); - - editor.$blockScrolling++; - editor.once("mouseup", function() { - var tmpSel = selection.toOrientedRange(); - - if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor)) - selection.substractPoint(tmpSel.cursor); - else { - if (range) { - editor.removeSelectionMarker(range); - selection.addRange(range); - } - selection.addRange(tmpSel); - } - editor.$blockScrolling--; - }); - - } else if (alt && button === 0) { - e.stop(); - - if (isMultiSelect && !ctrl) - selection.toSingleRange(); - else if (!isMultiSelect && ctrl) - selection.addRange(); - - var rectSel = []; - if (shift) { - screenAnchor = session.documentToScreenPosition(selection.lead); - blockSelect(); - } else { - selection.moveToPosition(pos); - } - - - var onMouseSelectionEnd = function(e) { - clearInterval(timerId); - editor.removeSelectionMarkers(rectSel); - for (var i = 0; i < rectSel.length; i++) - selection.addRange(rectSel[i]); - }; - - var onSelectionInterval = blockSelect; - - event.capture(editor.container, onMouseSelection, onMouseSelectionEnd); - var timerId = setInterval(function() {onSelectionInterval();}, 20); - - return e.preventDefault(); - } -} - - -exports.onMouseDown = onMouseDown; - -}); - -define('ace/commands/multi_select_commands', ['require', 'exports', 'module' , 'ace/keyboard/hash_handler'], function(require, exports, module) { -exports.defaultCommands = [{ - name: "addCursorAbove", - exec: function(editor) { editor.selectMoreLines(-1); }, - bindKey: {win: "Ctrl-Alt-Up", mac: "Ctrl-Alt-Up"}, - readonly: true -}, { - name: "addCursorBelow", - exec: function(editor) { editor.selectMoreLines(1); }, - bindKey: {win: "Ctrl-Alt-Down", mac: "Ctrl-Alt-Down"}, - readonly: true -}, { - name: "addCursorAboveSkipCurrent", - exec: function(editor) { editor.selectMoreLines(-1, true); }, - bindKey: {win: "Ctrl-Alt-Shift-Up", mac: "Ctrl-Alt-Shift-Up"}, - readonly: true -}, { - name: "addCursorBelowSkipCurrent", - exec: function(editor) { editor.selectMoreLines(1, true); }, - bindKey: {win: "Ctrl-Alt-Shift-Down", mac: "Ctrl-Alt-Shift-Down"}, - readonly: true -}, { - name: "selectMoreBefore", - exec: function(editor) { editor.selectMore(-1); }, - bindKey: {win: "Ctrl-Alt-Left", mac: "Ctrl-Alt-Left"}, - readonly: true -}, { - name: "selectMoreAfter", - exec: function(editor) { editor.selectMore(1); }, - bindKey: {win: "Ctrl-Alt-Right", mac: "Ctrl-Alt-Right"}, - readonly: true -}, { - name: "selectNextBefore", - exec: function(editor) { editor.selectMore(-1, true); }, - bindKey: {win: "Ctrl-Alt-Shift-Left", mac: "Ctrl-Alt-Shift-Left"}, - readonly: true -}, { - name: "selectNextAfter", - exec: function(editor) { editor.selectMore(1, true); }, - bindKey: {win: "Ctrl-Alt-Shift-Right", mac: "Ctrl-Alt-Shift-Right"}, - readonly: true -}, { - name: "splitIntoLines", - exec: function(editor) { editor.multiSelect.splitIntoLines(); }, - bindKey: {win: "Ctrl-Alt-L", mac: "Ctrl-Alt-L"}, - readonly: true -}, { - name: "alignCursors", - exec: function(editor) { editor.alignCursors(); }, - bindKey: {win: "Ctrl-Alt-A", mac: "Ctrl-Alt-A"} -}]; -exports.multiSelectCommands = [{ - name: "singleSelection", - bindKey: "esc", - exec: function(editor) { editor.exitMultiSelectMode(); }, - readonly: true, - isAvailable: function(editor) {return editor && editor.inMultiSelectMode} -}]; - -var HashHandler = require("../keyboard/hash_handler").HashHandler; -exports.keyboardHandler = new HashHandler(exports.multiSelectCommands); - -}); - -define('ace/worker/worker_client', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/net', 'ace/lib/event_emitter', 'ace/config'], function(require, exports, module) { - - -var oop = require("../lib/oop"); -var net = require("../lib/net"); -var EventEmitter = require("../lib/event_emitter").EventEmitter; -var config = require("../config"); - -var WorkerClient = function(topLevelNamespaces, mod, classname, workerUrl) { - this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this); - this.changeListener = this.changeListener.bind(this); - this.onMessage = this.onMessage.bind(this); - if (require.nameToUrl && !require.toUrl) - require.toUrl = require.nameToUrl; - - if (config.get("packaged") || !require.toUrl) { - workerUrl = workerUrl || config.moduleUrl(mod, "worker"); - } else { - var normalizePath = this.$normalizePath; - workerUrl = workerUrl || normalizePath(require.toUrl("ace/worker/worker.js", null, "_")); - - var tlns = {}; - topLevelNamespaces.forEach(function(ns) { - tlns[ns] = normalizePath(require.toUrl(ns, null, "_").replace(/(\.js)?(\?.*)?$/, "")); - }); - } - - try { - this.$worker = new Worker(workerUrl); - } catch(e) { - if (e instanceof window.DOMException) { - var blob = this.$workerBlob(workerUrl); - var URL = window.URL || window.webkitURL; - var blobURL = URL.createObjectURL(blob); - - this.$worker = new Worker(blobURL); - URL.revokeObjectURL(blobURL); - } else { - throw e; - } - } - this.$worker.postMessage({ - init : true, - tlns : tlns, - module : mod, - classname : classname - }); - - this.callbackId = 1; - this.callbacks = {}; - - this.$worker.onmessage = this.onMessage; -}; - -(function(){ - - oop.implement(this, EventEmitter); - - this.onMessage = function(e) { - var msg = e.data; - switch(msg.type) { - case "log": - window.console && console.log && console.log.apply(console, msg.data); - break; - - case "event": - this._signal(msg.name, {data: msg.data}); - break; - - case "call": - var callback = this.callbacks[msg.id]; - if (callback) { - callback(msg.data); - delete this.callbacks[msg.id]; - } - break; - } - }; - - this.$normalizePath = function(path) { - if (!location.host) // needed for file:// protocol - return path; - path = path.replace(/^[a-z]+:\/\/[^\/]+/, ""); // Remove domain name and rebuild it - path = location.protocol + "//" + location.host - + (path.charAt(0) == "/" ? "" : location.pathname.replace(/\/[^\/]*$/, "")) - + "/" + path.replace(/^[\/]+/, ""); - return path; - }; - - this.terminate = function() { - this._signal("terminate", {}); - this.deltaQueue = null; - this.$worker.terminate(); - this.$worker = null; - this.$doc.removeEventListener("change", this.changeListener); - this.$doc = null; - }; - - this.send = function(cmd, args) { - this.$worker.postMessage({command: cmd, args: args}); - }; - - this.call = function(cmd, args, callback) { - if (callback) { - var id = this.callbackId++; - this.callbacks[id] = callback; - args.push(id); - } - this.send(cmd, args); - }; - - this.emit = function(event, data) { - try { - this.$worker.postMessage({event: event, data: {data: data.data}}); - } - catch(ex) {} - }; - - this.attachToDocument = function(doc) { - if(this.$doc) - this.terminate(); - - this.$doc = doc; - this.call("setValue", [doc.getValue()]); - doc.on("change", this.changeListener); - }; - - this.changeListener = function(e) { - if (!this.deltaQueue) { - this.deltaQueue = [e.data]; - setTimeout(this.$sendDeltaQueue, 0); - } else - this.deltaQueue.push(e.data); - }; - - this.$sendDeltaQueue = function() { - var q = this.deltaQueue; - if (!q) return; - this.deltaQueue = null; - if (q.length > 20 && q.length > this.$doc.getLength() >> 1) { - this.call("setValue", [this.$doc.getValue()]); - } else - this.emit("change", {data: q}); - }; - - this.$workerBlob = function(workerUrl) { - var script = "importScripts('" + net.qualifyURL( workerUrl ) + "');"; - try { - return new Blob([script], {"type": "application/javascript"}); - } catch (e) { // Backwards-compatibility - var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder; - var blobBuilder = new BlobBuilder(); - blobBuilder.append(script); - return blobBuilder.getBlob("application/javascript"); - } - }; - -}).call(WorkerClient.prototype); - - -var UIWorkerClient = function(topLevelNamespaces, mod, classname) { - this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this); - this.changeListener = this.changeListener.bind(this); - this.callbackId = 1; - this.callbacks = {}; - this.messageBuffer = []; - - var main = null; - var emitSync = false; - var sender = Object.create(EventEmitter); - var _self = this; - - this.$worker = {}; - this.$worker.terminate = function() {}; - this.$worker.postMessage = function(e) { - _self.messageBuffer.push(e); - if (main) { - if (emitSync) - setTimeout(processNext); - else - processNext(); - } - }; - this.setEmitSync = function(val) { emitSync = val }; - - var processNext = function() { - var msg = _self.messageBuffer.shift(); - if (msg.command) - main[msg.command].apply(main, msg.args); - else if (msg.event) - sender._signal(msg.event, msg.data); - }; - - sender.postMessage = function(msg) { - _self.onMessage({data: msg}); - }; - sender.callback = function(data, callbackId) { - this.postMessage({type: "call", id: callbackId, data: data}); - }; - sender.emit = function(name, data) { - this.postMessage({type: "event", name: name, data: data}); - }; - - config.loadModule(["worker", mod], function(Main) { - main = new Main[classname](sender); - while (_self.messageBuffer.length) - processNext(); - }); -}; - -UIWorkerClient.prototype = WorkerClient.prototype; - -exports.UIWorkerClient = UIWorkerClient; -exports.WorkerClient = WorkerClient; - -}); -define('ace/placeholder', ['require', 'exports', 'module' , 'ace/range', 'ace/lib/event_emitter', 'ace/lib/oop'], function(require, exports, module) { - - -var Range = require("./range").Range; -var EventEmitter = require("./lib/event_emitter").EventEmitter; -var oop = require("./lib/oop"); - -var PlaceHolder = function(session, length, pos, others, mainClass, othersClass) { - var _self = this; - this.length = length; - this.session = session; - this.doc = session.getDocument(); - this.mainClass = mainClass; - this.othersClass = othersClass; - this.$onUpdate = this.onUpdate.bind(this); - this.doc.on("change", this.$onUpdate); - this.$others = others; - - this.$onCursorChange = function() { - setTimeout(function() { - _self.onCursorChange(); - }); - }; - - this.$pos = pos; - var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1}; - this.$undoStackDepth = undoStack.length; - this.setup(); - - session.selection.on("changeCursor", this.$onCursorChange); -}; - -(function() { - - oop.implement(this, EventEmitter); - this.setup = function() { - var _self = this; - var doc = this.doc; - var session = this.session; - var pos = this.$pos; - - this.pos = doc.createAnchor(pos.row, pos.column); - this.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false); - this.pos.on("change", function(event) { - session.removeMarker(_self.markerId); - _self.markerId = session.addMarker(new Range(event.value.row, event.value.column, event.value.row, event.value.column+_self.length), _self.mainClass, null, false); - }); - this.others = []; - this.$others.forEach(function(other) { - var anchor = doc.createAnchor(other.row, other.column); - _self.others.push(anchor); - }); - session.setUndoSelect(false); - }; - this.showOtherMarkers = function() { - if(this.othersActive) return; - var session = this.session; - var _self = this; - this.othersActive = true; - this.others.forEach(function(anchor) { - anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false); - anchor.on("change", function(event) { - session.removeMarker(anchor.markerId); - anchor.markerId = session.addMarker(new Range(event.value.row, event.value.column, event.value.row, event.value.column+_self.length), _self.othersClass, null, false); - }); - }); - }; - this.hideOtherMarkers = function() { - if(!this.othersActive) return; - this.othersActive = false; - for (var i = 0; i < this.others.length; i++) { - this.session.removeMarker(this.others[i].markerId); - } - }; - this.onUpdate = function(event) { - var delta = event.data; - var range = delta.range; - if(range.start.row !== range.end.row) return; - if(range.start.row !== this.pos.row) return; - if (this.$updating) return; - this.$updating = true; - var lengthDiff = delta.action === "insertText" ? range.end.column - range.start.column : range.start.column - range.end.column; - - if(range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1) { - var distanceFromStart = range.start.column - this.pos.column; - this.length += lengthDiff; - if(!this.session.$fromUndo) { - if(delta.action === "insertText") { - for (var i = this.others.length - 1; i >= 0; i--) { - var otherPos = this.others[i]; - var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart}; - if(otherPos.row === range.start.row && range.start.column < otherPos.column) - newPos.column += lengthDiff; - this.doc.insert(newPos, delta.text); - } - } else if(delta.action === "removeText") { - for (var i = this.others.length - 1; i >= 0; i--) { - var otherPos = this.others[i]; - var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart}; - if(otherPos.row === range.start.row && range.start.column < otherPos.column) - newPos.column += lengthDiff; - this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff)); - } - } - if(range.start.column === this.pos.column && delta.action === "insertText") { - setTimeout(function() { - this.pos.setPosition(this.pos.row, this.pos.column - lengthDiff); - for (var i = 0; i < this.others.length; i++) { - var other = this.others[i]; - var newPos = {row: other.row, column: other.column - lengthDiff}; - if(other.row === range.start.row && range.start.column < other.column) - newPos.column += lengthDiff; - other.setPosition(newPos.row, newPos.column); - } - }.bind(this), 0); - } - else if(range.start.column === this.pos.column && delta.action === "removeText") { - setTimeout(function() { - for (var i = 0; i < this.others.length; i++) { - var other = this.others[i]; - if(other.row === range.start.row && range.start.column < other.column) { - other.setPosition(other.row, other.column - lengthDiff); - } - } - }.bind(this), 0); - } - } - this.pos._emit("change", {value: this.pos}); - for (var i = 0; i < this.others.length; i++) { - this.others[i]._emit("change", {value: this.others[i]}); - } - } - this.$updating = false; - }; - - this.onCursorChange = function(event) { - if (this.$updating) return; - var pos = this.session.selection.getCursor(); - if(pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) { - this.showOtherMarkers(); - this._emit("cursorEnter", event); - } else { - this.hideOtherMarkers(); - this._emit("cursorLeave", event); - } - }; - this.detach = function() { - this.session.removeMarker(this.markerId); - this.hideOtherMarkers(); - this.doc.removeEventListener("change", this.$onUpdate); - this.session.selection.removeEventListener("changeCursor", this.$onCursorChange); - this.pos.detach(); - for (var i = 0; i < this.others.length; i++) { - this.others[i].detach(); - } - this.session.setUndoSelect(true); - }; - this.cancel = function() { - if(this.$undoStackDepth === -1) - throw Error("Canceling placeholders only supported with undo manager attached to session."); - var undoManager = this.session.getUndoManager(); - var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth; - for (var i = 0; i < undosRequired; i++) { - undoManager.undo(true); - } - }; -}).call(PlaceHolder.prototype); - - -exports.PlaceHolder = PlaceHolder; -}); - -define('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) { - +define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"], function(require, exports, module) { +"use strict"; var Range = require("../../range").Range; @@ -17035,8 +18311,8 @@ var FoldMode = exports.FoldMode = function() {}; }); -define('ace/theme/textmate', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) { - +define("ace/theme/textmate",["require","exports","module","ace/lib/dom"], function(require, exports, module) { +"use strict"; exports.isDark = false; exports.cssClass = "ace-tm"; @@ -17135,7 +18411,6 @@ background: rgb(181, 213, 255);\ }\ .ace-tm.ace_multiselect .ace_selection.ace_start {\ box-shadow: 0 0 3px 0px white;\ -border-radius: 2px;\ }\ .ace-tm .ace_marker-layer .ace_step {\ background: rgb(252, 255, 0);\ @@ -17166,11 +18441,363 @@ var dom = require("../lib/dom"); dom.importCssString(exports.cssText, exports.cssClass); }); -define('ace/ext/error_marker', ['require', 'exports', 'module' , 'ace/line_widgets', 'ace/lib/dom', 'ace/range'], function(require, exports, module) { +define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"], function(require, exports, module) { +"use strict"; -var LineWidgets = require("ace/line_widgets").LineWidgets; -var dom = require("ace/lib/dom"); -var Range = require("ace/range").Range; +var oop = require("./lib/oop"); +var dom = require("./lib/dom"); +var Range = require("./range").Range; + + +function LineWidgets(session) { + this.session = session; + this.session.widgetManager = this; + this.session.getRowLength = this.getRowLength; + this.session.$getWidgetScreenLength = this.$getWidgetScreenLength; + this.updateOnChange = this.updateOnChange.bind(this); + this.renderWidgets = this.renderWidgets.bind(this); + this.measureWidgets = this.measureWidgets.bind(this); + this.session._changedWidgets = []; + this.$onChangeEditor = this.$onChangeEditor.bind(this); + + this.session.on("change", this.updateOnChange); + this.session.on("changeFold", this.updateOnFold); + this.session.on("changeEditor", this.$onChangeEditor); +} + +(function() { + this.getRowLength = function(row) { + var h; + if (this.lineWidgets) + h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0; + else + h = 0; + if (!this.$useWrapMode || !this.$wrapData[row]) { + return 1 + h; + } else { + return this.$wrapData[row].length + 1 + h; + } + }; + + this.$getWidgetScreenLength = function() { + var screenRows = 0; + this.lineWidgets.forEach(function(w){ + if (w && w.rowCount && !w.hidden) + screenRows += w.rowCount; + }); + return screenRows; + }; + + this.$onChangeEditor = function(e) { + this.attach(e.editor); + }; + + this.attach = function(editor) { + if (editor && editor.widgetManager && editor.widgetManager != this) + editor.widgetManager.detach(); + + if (this.editor == editor) + return; + + this.detach(); + this.editor = editor; + + if (editor) { + editor.widgetManager = this; + editor.renderer.on("beforeRender", this.measureWidgets); + editor.renderer.on("afterRender", this.renderWidgets); + } + }; + this.detach = function(e) { + var editor = this.editor; + if (!editor) + return; + + this.editor = null; + editor.widgetManager = null; + + editor.renderer.off("beforeRender", this.measureWidgets); + editor.renderer.off("afterRender", this.renderWidgets); + var lineWidgets = this.session.lineWidgets; + lineWidgets && lineWidgets.forEach(function(w) { + if (w && w.el && w.el.parentNode) { + w._inDocument = false; + w.el.parentNode.removeChild(w.el); + } + }); + }; + + this.updateOnFold = function(e, session) { + var lineWidgets = session.lineWidgets; + if (!lineWidgets || !e.action) + return; + var fold = e.data; + var start = fold.start.row; + var end = fold.end.row; + var hide = e.action == "add"; + for (var i = start + 1; i < end; i++) { + if (lineWidgets[i]) + lineWidgets[i].hidden = hide; + } + if (lineWidgets[end]) { + if (hide) { + if (!lineWidgets[start]) + lineWidgets[start] = lineWidgets[end]; + else + lineWidgets[end].hidden = hide; + } else { + if (lineWidgets[start] == lineWidgets[end]) + lineWidgets[start] = undefined; + lineWidgets[end].hidden = hide; + } + } + }; + + this.updateOnChange = function(delta) { + var lineWidgets = this.session.lineWidgets; + if (!lineWidgets) return; + + var startRow = delta.start.row; + var len = delta.end.row - startRow; + + if (len === 0) { + } else if (delta.action == 'remove') { + var removed = lineWidgets.splice(startRow + 1, len); + removed.forEach(function(w) { + w && this.removeLineWidget(w); + }, this); + this.$updateRows(); + } else { + var args = new Array(len); + args.unshift(startRow, 0); + lineWidgets.splice.apply(lineWidgets, args); + this.$updateRows(); + } + }; + + this.$updateRows = function() { + var lineWidgets = this.session.lineWidgets; + if (!lineWidgets) return; + var noWidgets = true; + lineWidgets.forEach(function(w, i) { + if (w) { + noWidgets = false; + w.row = i; + while (w.$oldWidget) { + w.$oldWidget.row = i; + w = w.$oldWidget; + } + } + }); + if (noWidgets) + this.session.lineWidgets = null; + }; + + this.addLineWidget = function(w) { + if (!this.session.lineWidgets) + this.session.lineWidgets = new Array(this.session.getLength()); + + var old = this.session.lineWidgets[w.row]; + if (old) { + w.$oldWidget = old; + if (old.el && old.el.parentNode) { + old.el.parentNode.removeChild(old.el); + old._inDocument = false; + } + } + + this.session.lineWidgets[w.row] = w; + + w.session = this.session; + + var renderer = this.editor.renderer; + if (w.html && !w.el) { + w.el = dom.createElement("div"); + w.el.innerHTML = w.html; + } + if (w.el) { + dom.addCssClass(w.el, "ace_lineWidgetContainer"); + w.el.style.position = "absolute"; + w.el.style.zIndex = 5; + renderer.container.appendChild(w.el); + w._inDocument = true; + } + + if (!w.coverGutter) { + w.el.style.zIndex = 3; + } + if (w.pixelHeight == null) { + w.pixelHeight = w.el.offsetHeight; + } + if (w.rowCount == null) { + w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight; + } + + var fold = this.session.getFoldAt(w.row, 0); + w.$fold = fold; + if (fold) { + var lineWidgets = this.session.lineWidgets; + if (w.row == fold.end.row && !lineWidgets[fold.start.row]) + lineWidgets[fold.start.row] = w; + else + w.hidden = true; + } + + this.session._emit("changeFold", {data:{start:{row: w.row}}}); + + this.$updateRows(); + this.renderWidgets(null, renderer); + this.onWidgetChanged(w); + return w; + }; + + this.removeLineWidget = function(w) { + w._inDocument = false; + w.session = null; + if (w.el && w.el.parentNode) + w.el.parentNode.removeChild(w.el); + if (w.editor && w.editor.destroy) try { + w.editor.destroy(); + } catch(e){} + if (this.session.lineWidgets) { + var w1 = this.session.lineWidgets[w.row] + if (w1 == w) { + this.session.lineWidgets[w.row] = w.$oldWidget; + if (w.$oldWidget) + this.onWidgetChanged(w.$oldWidget); + } else { + while (w1) { + if (w1.$oldWidget == w) { + w1.$oldWidget = w.$oldWidget; + break; + } + w1 = w1.$oldWidget; + } + } + } + this.session._emit("changeFold", {data:{start:{row: w.row}}}); + this.$updateRows(); + }; + + this.getWidgetsAtRow = function(row) { + var lineWidgets = this.session.lineWidgets; + var w = lineWidgets && lineWidgets[row]; + var list = []; + while (w) { + list.push(w); + w = w.$oldWidget; + } + return list; + }; + + this.onWidgetChanged = function(w) { + this.session._changedWidgets.push(w); + this.editor && this.editor.renderer.updateFull(); + }; + + this.measureWidgets = function(e, renderer) { + var changedWidgets = this.session._changedWidgets; + var config = renderer.layerConfig; + + if (!changedWidgets || !changedWidgets.length) return; + var min = Infinity; + for (var i = 0; i < changedWidgets.length; i++) { + var w = changedWidgets[i]; + if (!w || !w.el) continue; + if (w.session != this.session) continue; + if (!w._inDocument) { + if (this.session.lineWidgets[w.row] != w) + continue; + w._inDocument = true; + renderer.container.appendChild(w.el); + } + + w.h = w.el.offsetHeight; + + if (!w.fixedWidth) { + w.w = w.el.offsetWidth; + w.screenWidth = Math.ceil(w.w / config.characterWidth); + } + + var rowCount = w.h / config.lineHeight; + if (w.coverLine) { + rowCount -= this.session.getRowLineCount(w.row); + if (rowCount < 0) + rowCount = 0; + } + if (w.rowCount != rowCount) { + w.rowCount = rowCount; + if (w.row < min) + min = w.row; + } + } + if (min != Infinity) { + this.session._emit("changeFold", {data:{start:{row: min}}}); + this.session.lineWidgetWidth = null; + } + this.session._changedWidgets = []; + }; + + this.renderWidgets = function(e, renderer) { + var config = renderer.layerConfig; + var lineWidgets = this.session.lineWidgets; + if (!lineWidgets) + return; + var first = Math.min(this.firstRow, config.firstRow); + var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length); + + while (first > 0 && !lineWidgets[first]) + first--; + + this.firstRow = config.firstRow; + this.lastRow = config.lastRow; + + renderer.$cursorLayer.config = config; + for (var i = first; i <= last; i++) { + var w = lineWidgets[i]; + if (!w || !w.el) continue; + if (w.hidden) { + w.el.style.top = -100 - (w.pixelHeight || 0) + "px"; + continue; + } + if (!w._inDocument) { + w._inDocument = true; + renderer.container.appendChild(w.el); + } + var top = renderer.$cursorLayer.getPixelPosition({row: i, column:0}, true).top; + if (!w.coverLine) + top += config.lineHeight * this.session.getRowLineCount(w.row); + w.el.style.top = top - config.offset + "px"; + + var left = w.coverGutter ? 0 : renderer.gutterWidth; + if (!w.fixedWidth) + left -= renderer.scrollLeft; + w.el.style.left = left + "px"; + + if (w.fullWidth && w.screenWidth) { + w.el.style.minWidth = config.width + 2 * config.padding + "px"; + } + + if (w.fixedWidth) { + w.el.style.right = renderer.scrollBar.getWidth() + "px"; + } else { + w.el.style.right = ""; + } + } + }; + +}).call(LineWidgets.prototype); + + +exports.LineWidgets = LineWidgets; + +}); + +define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"], function(require, exports, module) { +"use strict"; +var LineWidgets = require("../line_widgets").LineWidgets; +var dom = require("../lib/dom"); +var Range = require("../range").Range; function binarySearch(array, needle, comparator) { var first = 0; @@ -17198,7 +18825,7 @@ function findAnnotations(session, row, dir) { if (i < 0) i = -i - 1; - if (i >= annotations.length - 1) + if (i >= annotations.length) i = dir > 0 ? 0 : annotations.length - 1; else if (i === 0 && dir < 0) i = annotations.length - 1; @@ -17234,7 +18861,9 @@ exports.showErrorMarker = function(editor, dir) { var pos = editor.getCursorPosition(); var row = pos.row; - var oldWidget = session.lineWidgets && session.lineWidgets[row]; + var oldWidget = session.widgetManager.getWidgetsAtRow(row).filter(function(w) { + return w.type == "errorMarker"; + })[0]; if (oldWidget) { oldWidget.destroy(); } else { @@ -17264,7 +18893,8 @@ exports.showErrorMarker = function(editor, dir) { row: pos.row, fixedWidth: true, coverGutter: true, - el: dom.createElement("div") + el: dom.createElement("div"), + type: "errorMarker" }; var el = w.el.appendChild(dom.createElement("div")); var arrow = w.el.appendChild(dom.createElement("div")); @@ -17349,281 +18979,91 @@ dom.importCssString("\ }); -define('ace/line_widgets', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/range'], function(require, exports, module) { +define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"], function(require, exports, module) { +"use strict"; +require("./lib/fixoldbrowsers"); -var oop = require("./lib/oop"); var dom = require("./lib/dom"); -var Range = require("./range").Range; +var event = require("./lib/event"); +var Editor = require("./editor").Editor; +var EditSession = require("./edit_session").EditSession; +var UndoManager = require("./undomanager").UndoManager; +var Renderer = require("./virtual_renderer").VirtualRenderer; +require("./worker/worker_client"); +require("./keyboard/hash_handler"); +require("./placeholder"); +require("./multi_select"); +require("./mode/folding/fold_mode"); +require("./theme/textmate"); +require("./ext/error_marker"); -function LineWidgets(session) { - this.session = session; - this.session.widgetManager = this; - this.session.getRowLength = this.getRowLength; - this.session.$getWidgetScreenLength = this.$getWidgetScreenLength; - this.updateOnChange = this.updateOnChange.bind(this); - this.renderWidgets = this.renderWidgets.bind(this); - this.measureWidgets = this.measureWidgets.bind(this); - this.session._changedWidgets = []; - this.detach = this.detach.bind(this); - - this.session.on("change", this.updateOnChange); +exports.config = require("./config"); +exports.require = require; + +if (typeof define === "function") + exports.define = define; +exports.edit = function(el) { + if (typeof el == "string") { + var _id = el; + el = document.getElementById(_id); + if (!el) + throw new Error("ace.edit can't find div #" + _id); + } + + if (el && el.env && el.env.editor instanceof Editor) + return el.env.editor; + + var value = ""; + if (el && /input|textarea/i.test(el.tagName)) { + var oldNode = el; + value = oldNode.value; + el = dom.createElement("pre"); + oldNode.parentNode.replaceChild(el, oldNode); + } else if (el) { + value = dom.getInnerText(el); + el.innerHTML = ""; + } + + var doc = exports.createEditSession(value); + + var editor = new Editor(new Renderer(el)); + editor.setSession(doc); + + var env = { + document: doc, + editor: editor, + onResize: editor.resize.bind(editor, null) + }; + if (oldNode) env.textarea = oldNode; + event.addListener(window, "resize", env.onResize); + editor.on("destroy", function() { + event.removeListener(window, "resize", env.onResize); + env.editor.container.env = null; // prevent memory leak on old ie + }); + editor.container.env = editor.env = env; + return editor; +}; +exports.createEditSession = function(text, mode) { + var doc = new EditSession(text, mode); + doc.setUndoManager(new UndoManager()); + return doc; } - -(function() { - this.getRowLength = function(row) { - var h; - if (this.lineWidgets) - h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0; - else - h = 0; - if (!this.$useWrapMode || !this.$wrapData[row]) { - return 1 + h; - } else { - return this.$wrapData[row].length + 1 + h; - } - }; - - this.$getWidgetScreenLength = function() { - var screenRows = 0; - this.lineWidgets.forEach(function(w){ - if (w && w.rowCount) - screenRows +=w.rowCount; - }); - return screenRows; - }; - - this.attach = function(editor) { - if (editor.widgetManager && editor.widgetManager != this) - editor.widgetManager.detach(); - - if (this.editor == editor) - return; - - this.detach(); - this.editor = editor; - - this.editor.on("changeSession", this.detach); - - editor.widgetManager = this; - - editor.setOption("enableLineWidgets", true); - editor.renderer.on("beforeRender", this.measureWidgets); - editor.renderer.on("afterRender", this.renderWidgets); - }; - this.detach = function(e) { - if (e && e.session == this.session) - return; // sometimes attach can be called before setSession - var editor = this.editor; - if (!editor) - return; - - editor.off("changeSession", this.detach); - - this.editor = null; - editor.widgetManager = null; - - editor.renderer.off("beforeRender", this.measureWidgets); - editor.renderer.off("afterRender", this.renderWidgets); - var lineWidgets = this.session.lineWidgets; - lineWidgets && lineWidgets.forEach(function(w) { - if (w && w.el && w.el.parentNode) { - w._inDocument = false; - w.el.parentNode.removeChild(w.el); - } - }); - }; - - this.updateOnChange = function(e) { - var lineWidgets = this.session.lineWidgets; - if (!lineWidgets) return; - - var delta = e.data; - var range = delta.range; - var startRow = range.start.row; - var len = range.end.row - startRow; - - if (len === 0) { - } else if (delta.action == "removeText" || delta.action == "removeLines") { - var removed = lineWidgets.splice(startRow + 1, len); - removed.forEach(function(w) { - w && this.removeLineWidget(w); - }, this); - this.$updateRows(); - } else { - var args = new Array(len); - args.unshift(startRow, 0); - lineWidgets.splice.apply(lineWidgets, args); - this.$updateRows(); - } - }; - - this.$updateRows = function() { - var lineWidgets = this.session.lineWidgets; - if (!lineWidgets) return; - var noWidgets = true; - lineWidgets.forEach(function(w, i) { - if (w) { - noWidgets = false; - w.row = i; - } - }); - if (noWidgets) - this.session.lineWidgets = null; - }; - - this.addLineWidget = function(w) { - if (!this.session.lineWidgets) - this.session.lineWidgets = new Array(this.session.getLength()); - - this.session.lineWidgets[w.row] = w; - - var renderer = this.editor.renderer; - if (w.html && !w.el) { - w.el = dom.createElement("div"); - w.el.innerHTML = w.html; - } - if (w.el) { - dom.addCssClass(w.el, "ace_lineWidgetContainer"); - w.el.style.position = "absolute"; - w.el.style.zIndex = 5; - renderer.container.appendChild(w.el); - w._inDocument = true; - } - - if (!w.coverGutter) { - w.el.style.zIndex = 3; - } - if (!w.pixelHeight) { - w.pixelHeight = w.el.offsetHeight; - } - if (w.rowCount == null) - w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight; - - this.session._emit("changeFold", {data:{start:{row: w.row}}}); - - this.$updateRows(); - this.renderWidgets(null, renderer); - return w; - }; - - this.removeLineWidget = function(w) { - w._inDocument = false; - if (w.el && w.el.parentNode) - w.el.parentNode.removeChild(w.el); - if (w.editor && w.editor.destroy) try { - w.editor.destroy(); - } catch(e){} - if (this.session.lineWidgets) - this.session.lineWidgets[w.row] = undefined; - this.session._emit("changeFold", {data:{start:{row: w.row}}}); - this.$updateRows(); - }; - - this.onWidgetChanged = function(w) { - this.session._changedWidgets.push(w); - this.editor && this.editor.renderer.updateFull(); - }; - - this.measureWidgets = function(e, renderer) { - var changedWidgets = this.session._changedWidgets; - var config = renderer.layerConfig; - - if (!changedWidgets || !changedWidgets.length) return; - var min = Infinity; - for (var i = 0; i < changedWidgets.length; i++) { - var w = changedWidgets[i]; - if (!w._inDocument) { - w._inDocument = true; - renderer.container.appendChild(w.el); - } - - w.h = w.el.offsetHeight; - - if (!w.fixedWidth) { - w.w = w.el.offsetWidth; - w.screenWidth = Math.ceil(w.w / config.characterWidth); - } - - var rowCount = w.h / config.lineHeight; - if (w.coverLine) { - rowCount -= this.session.getRowLineCount(w.row); - if (rowCount < 0) - rowCount = 0; - } - if (w.rowCount != rowCount) { - w.rowCount = rowCount; - if (w.row < min) - min = w.row; - } - } - if (min != Infinity) { - this.session._emit("changeFold", {data:{start:{row: min}}}); - this.session.lineWidgetWidth = null; - } - this.session._changedWidgets = []; - }; - - this.renderWidgets = function(e, renderer) { - var config = renderer.layerConfig; - var lineWidgets = this.session.lineWidgets; - if (!lineWidgets) - return; - var first = Math.min(this.firstRow, config.firstRow); - var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length); - - while (first > 0 && !lineWidgets[first]) - first--; - - this.firstRow = config.firstRow; - this.lastRow = config.lastRow; - - renderer.$cursorLayer.config = config; - for (var i = first; i <= last; i++) { - var w = lineWidgets[i]; - if (!w || !w.el) continue; - - if (!w._inDocument) { - w._inDocument = true; - renderer.container.appendChild(w.el); - } - var top = renderer.$cursorLayer.getPixelPosition({row: i, column:0}, true).top; - if (!w.coverLine) - top += config.lineHeight * this.session.getRowLineCount(w.row); - w.el.style.top = top - config.offset + "px"; - - var left = w.coverGutter ? 0 : renderer.gutterWidth; - if (!w.fixedWidth) - left -= renderer.scrollLeft; - w.el.style.left = left + "px"; - - if (w.fixedWidth) { - w.el.style.right = renderer.scrollBar.getWidth() + "px"; - } else { - w.el.style.right = ""; - } - } - }; - -}).call(LineWidgets.prototype); - - -exports.LineWidgets = LineWidgets; - +exports.EditSession = EditSession; +exports.UndoManager = UndoManager; +exports.version = "1.2.6"; }); - - - - -; (function() { window.require(["ace/ace"], function(a) { - a && a.config.init(); + if (a) { + a.config.init(true); + a.define = window.define; + } if (!window.ace) - window.ace = {}; + window.ace = a; for (var key in a) if (a.hasOwnProperty(key)) - ace[key] = a[key]; + window.ace[key] = a[key]; }); })(); - + \ No newline at end of file diff --git a/js/apps/system/_admin/aardvark/APP/frontend/src/ace.js.gz b/js/apps/system/_admin/aardvark/APP/frontend/src/ace.js.gz index 6255e11a471b71a5a2f37a3406834c13f35cb049..c4b56cfbfcd5f6343cb7ac77893263562670e0bf 100644 GIT binary patch literal 169531 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 z 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%0D(<#j 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 z z;v)+`)m?d3iRy^dHSrxj9<`4Rd60Nsw3BaRla=BOjYwenyNUQPx+cKV z9a7~PDNhr?6+A&}5|H*O!5A?V0?S{-$O51*^};HBftgF%WT1=#HHiy|%D9o#tT^%n zE+mFx?W+_u^Qm1D*r5QNK4#0l$a*ek0;$5K0ePL~Zu7PvJc|P6XRINm-b?=jM|I$p zr-zy|F8we)a4IeI=_Ug$-2Z4xB6#S_GErZ?yVfLwU6dzN6}BcYWgMg1eOL5IXn7a) zQl9xO`x%``HjxhrnPEv!3IPIWv=%sf;KDE23O{hkXYjnqr(CX}4Wo?Iis7VVTP_xk zEWXXvGk)2n?$0GzowoKNo7Hv<$Nez6RC^x#K>$D-;&g)${N#qSF5CcvgipOmZiyft z%Tr;nW)1uqQ(z&wP)yrXk9?TVvsh=ihw=Iz&=d|6xAH^hKL<44S^j*>4{JuQy@{W^ z)iI#+Khb6^W65QB(;1>Rh(A{oZcVZYxq?bUWdxQEqG-fLv>} zY(8hGBUwWB-XB&p}#tsH@5XcJpJ>-49nvY&jxKn-hiCLcy+p9tyM}T0^sV{#- X#<4QLu&UpE1MmGC^dIW<$TkT8I-<8I diff --git a/js/apps/system/_admin/aardvark/APP/frontend/src/ace.min.js b/js/apps/system/_admin/aardvark/APP/frontend/src/ace.min.js index 0a0addfb0b..34ba6d74a5 100644 --- a/js/apps/system/_admin/aardvark/APP/frontend/src/ace.min.js +++ b/js/apps/system/_admin/aardvark/APP/frontend/src/ace.min.js @@ -1,11 +1,11 @@ -!function(){function a(a){var b=function(a,b){return e("",a,b)},f=c;a&&(c[a]||(c[a]={}),f=c[a]),f.define&&f.define.packaged||(d.original=f.define,f.define=d,f.define.packaged=!0),f.require&&f.require.packaged||(e.original=f.require,f.require=b,f.require.packaged=!0)}var b="",c=function(){return this}();if(b||"undefined"==typeof requirejs){var d=function(a,b,c){return"string"!=typeof a?void(d.original?d.original.apply(window,arguments):(console.error("dropping module because define wasn't a string."),console.trace())):(2==arguments.length&&(c=b),d.modules||(d.modules={},d.payloads={}),d.payloads[a]=c,void(d.modules[a]=null))},e=function(a,b,c){if("[object Array]"===Object.prototype.toString.call(b)){for(var d=[],f=0,h=b.length;f1&&e(i,"")>-1&&(c=RegExp(this.source,f.replace.call(d(this),"g","")),f.replace.call(a.slice(i.index),c,function(){for(var a=1;ai.index&&this.lastIndex--}return i},h||(RegExp.prototype.test=function(a){var b=f.exec.call(this,a);return b&&this.global&&!b[0].length&&this.lastIndex>b.index&&this.lastIndex--,!!b}))}),define("ace/lib/es5-shim",["require","exports","module"],function(a,b,c){function d(){}function e(a){try{return Object.defineProperty(a,"sentinel",{}),"sentinel"in a}catch(b){}}function f(a){return a=+a,a!==a?a=0:0!==a&&a!==1/0&&a!==-(1/0)&&(a=(a>0||-1)*Math.floor(Math.abs(a))),a}Function.prototype.bind||(Function.prototype.bind=function(a){var b=this;if("function"!=typeof b)throw new TypeError("Function.prototype.bind called on incompatible "+b);var c=o.call(arguments,1),e=function(){if(this instanceof e){var d=b.apply(this,c.concat(o.call(arguments)));return Object(d)===d?d:this}return b.apply(a,c.concat(o.call(arguments)))};return b.prototype&&(d.prototype=b.prototype,e.prototype=new d,d.prototype=null),e});var g,h,i,j,k,l=Function.prototype.call,m=Array.prototype,n=Object.prototype,o=m.slice,p=l.bind(n.toString),q=l.bind(n.hasOwnProperty);if((k=q(n,"__defineGetter__"))&&(g=l.bind(n.__defineGetter__),h=l.bind(n.__defineSetter__),i=l.bind(n.__lookupGetter__),j=l.bind(n.__lookupSetter__)),2!=[1,2].splice(0).length)if(function(){function a(a){var b=new Array(a+2);return b[0]=b[1]=0,b}var b,c=[];if(c.splice.apply(c,a(20)),c.splice.apply(c,a(26)),b=c.length,c.splice(5,0,"XXX"),b+1==c.length,b+1==c.length)return!0}()){var r=Array.prototype.splice;Array.prototype.splice=function(a,b){return arguments.length?r.apply(this,[void 0===a?0:a,void 0===b?this.length-a:b].concat(o.call(arguments,2))):[]}}else Array.prototype.splice=function(a,b){var c=this.length;a>0?a>c&&(a=c):void 0==a?a=0:a<0&&(a=Math.max(c+a,0)),a+bh)for(l=j;l--;)this[i+l]=this[h+l];if(f&&a===k)this.length=k,this.push.apply(this,e);else for(this.length=k+f,l=0;l>>0;if("[object Function]"!=p(a))throw new TypeError;for(;++e>>0,e=Array(d),f=arguments[1];if("[object Function]"!=p(a))throw new TypeError(a+" is not a function");for(var g=0;g>>0,f=[],g=arguments[1];if("[object Function]"!=p(a))throw new TypeError(a+" is not a function");for(var h=0;h>>0,e=arguments[1];if("[object Function]"!=p(a))throw new TypeError(a+" is not a function");for(var f=0;f>>0,e=arguments[1];if("[object Function]"!=p(a))throw new TypeError(a+" is not a function");for(var f=0;f>>0;if("[object Function]"!=p(a))throw new TypeError(a+" is not a function");if(!d&&1==arguments.length)throw new TypeError("reduce of empty array with no initial value");var e,f=0;if(arguments.length>=2)e=arguments[1];else for(;;){if(f in c){e=c[f++];break}if(++f>=d)throw new TypeError("reduce of empty array with no initial value")}for(;f>>0;if("[object Function]"!=p(a))throw new TypeError(a+" is not a function");if(!d&&1==arguments.length)throw new TypeError("reduceRight of empty array with no initial value");var e,f=d-1;if(arguments.length>=2)e=arguments[1];else for(;;){if(f in c){e=c[f--];break}if(--f<0)throw new TypeError("reduceRight of empty array with no initial value")}do f in this&&(e=a.call(void 0,e,c[f],f,b));while(f--);return e}),Array.prototype.indexOf&&[0,1].indexOf(1,2)==-1||(Array.prototype.indexOf=function(a){var b=t&&"[object String]"==p(this)?this.split(""):K(this),c=b.length>>>0;if(!c)return-1;var d=0;for(arguments.length>1&&(d=f(arguments[1])),d=d>=0?d:Math.max(0,c+d);d>>0;if(!c)return-1;var d=c-1;for(arguments.length>1&&(d=Math.min(d,f(arguments[1]))),d=d>=0?d:c-Math.abs(d);d>=0;d--)if(d in b&&a===b[d])return d;return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(a){return a.__proto__||(a.constructor?a.constructor.prototype:n)}),!Object.getOwnPropertyDescriptor){var u="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(a,b){if("object"!=typeof a&&"function"!=typeof a||null===a)throw new TypeError(u+a);if(q(a,b)){var c,d,e;if(c={enumerable:!0,configurable:!0},k){var f=a.__proto__;a.__proto__=n;var d=i(a,b),e=j(a,b);if(a.__proto__=f,d||e)return d&&(c.get=d),e&&(c.set=e),c}return c.value=a[b],c}}}if(Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(a){return Object.keys(a)}),!Object.create){var v;v=null===Object.prototype.__proto__?function(){return{__proto__:null}}:function(){var a={};for(var b in a)a[b]=null;return a.constructor=a.hasOwnProperty=a.propertyIsEnumerable=a.isPrototypeOf=a.toLocaleString=a.toString=a.valueOf=a.__proto__=null,a},Object.create=function(a,b){var c;if(null===a)c=v();else{if("object"!=typeof a)throw new TypeError("typeof prototype["+typeof a+"] != 'object'");var d=function(){};d.prototype=a,c=new d,c.__proto__=a}return void 0!==b&&Object.defineProperties(c,b),c}}if(Object.defineProperty){var w=e({}),x="undefined"==typeof document||e(document.createElement("div"));if(!w||!x)var y=Object.defineProperty}if(!Object.defineProperty||y){var z="Property description must be an object: ",A="Object.defineProperty called on non-object: ",B="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(a,b,c){if("object"!=typeof a&&"function"!=typeof a||null===a)throw new TypeError(A+a);if("object"!=typeof c&&"function"!=typeof c||null===c)throw new TypeError(z+c);if(y)try{return y.call(Object,a,b,c)}catch(d){}if(q(c,"value"))if(k&&(i(a,b)||j(a,b))){var e=a.__proto__;a.__proto__=n,delete a[b],a[b]=c.value,a.__proto__=e}else a[b]=c.value;else{if(!k)throw new TypeError(B);q(c,"get")&&g(a,b,c.get),q(c,"set")&&h(a,b,c.set)}return a}}Object.defineProperties||(Object.defineProperties=function(a,b){for(var c in b)q(b,c)&&Object.defineProperty(a,c,b[c]);return a}),Object.seal||(Object.seal=function(a){return a}),Object.freeze||(Object.freeze=function(a){return a});try{Object.freeze(function(){})}catch(C){Object.freeze=function(a){return function(b){return"function"==typeof b?b:a(b)}}(Object.freeze)}if(Object.preventExtensions||(Object.preventExtensions=function(a){return a}),Object.isSealed||(Object.isSealed=function(a){return!1}),Object.isFrozen||(Object.isFrozen=function(a){return!1}),Object.isExtensible||(Object.isExtensible=function(a){if(Object(a)===a)throw new TypeError;for(var b="";q(a,b);)b+="?";a[b]=!0;var c=q(a,b);return delete a[b],c}),!Object.keys){var D=!0,E=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],F=E.length;for(var G in{toString:null})D=!1;Object.keys=function L(a){if("object"!=typeof a&&"function"!=typeof a||null===a)throw new TypeError("Object.keys called on a non-object");var L=[];for(var b in a)q(a,b)&&L.push(b);if(D)for(var c=0,d=F;c1?(j++,j>4&&(j=1)):j=1,f.isIE){var l=Math.abs(a.clientX-g)>5||Math.abs(a.clientY-h)>5;i&&!l||(j=1),i&&clearTimeout(i),i=setTimeout(function(){i=null},c[j-1]||600),1==j&&(g=a.clientX,h=a.clientY)}if(d[e]("mousedown",a),j>4)j=0;else if(j>1)return d[e](k[j],a)}),f.isOldIE&&b.addListener(a,"dblclick",function(a){j=2,i&&clearTimeout(i),i=setTimeout(function(){i=null},c[j-1]||600),d[e]("mousedown",a),d[e](k[j],a)})};var g=!f.isMac||!f.isOpera||"KeyboardEvent"in window?function(a){return 0|(a.ctrlKey?1:0)|(a.altKey?2:0)|(a.shiftKey?4:0)|(a.metaKey?8:0)}:function(a){return 0|(a.metaKey?1:0)|(a.altKey?2:0)|(a.shiftKey?4:0)|(a.ctrlKey?8:0)};b.getModifierString=function(a){return e.KEY_MODS[g(a)]};var h=null,i=0;if(b.addCommandKeyListener=function(a,c){var e=b.addListener;if(f.isOldGecko||f.isOpera&&!("KeyboardEvent"in window)){var g=null;e(a,"keydown",function(a){g=a.keyCode}),e(a,"keypress",function(a){return d(c,a,g)})}else{var i=null;e(a,"keydown",function(a){h[a.keyCode]=!0;var b=d(c,a,a.keyCode);return i=a.defaultPrevented,b}),e(a,"keypress",function(a){i&&(a.ctrlKey||a.altKey||a.shiftKey||a.metaKey)&&(b.stopEvent(a),i=null)}),e(a,"keyup",function(a){h[a.keyCode]=null}),h||(h=Object.create(null),e(window,"focus",function(a){h=Object.create(null)}))}},window.postMessage&&!f.isOldIE){var j=1;b.nextTick=function(a,c){c=c||window;var d="zero-timeout-message-"+j;b.addListener(c,"message",function e(f){f.data==d&&(b.stopPropagation(f),b.removeListener(c,"message",e),a())}),c.postMessage(d,"*")}}b.nextFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame,b.nextFrame?b.nextFrame=b.nextFrame.bind(window):b.nextFrame=function(a){setTimeout(a,17)}}),define("ace/lib/keys",["require","exports","module","ace/lib/oop"],function(a,b,c){var d=a("./oop"),e=function(){var a,b,c={MODIFIER_KEYS:{16:"Shift",17:"Ctrl",18:"Alt",224:"Meta"},KEY_MODS:{ctrl:1,alt:2,option:2,shift:4,"super":8,meta:8,command:8,cmd:8},FUNCTION_KEYS:{8:"Backspace",9:"Tab",13:"Return",19:"Pause",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"Print",45:"Insert",46:"Delete",96:"Numpad0",97:"Numpad1",98:"Numpad2",99:"Numpad3",100:"Numpad4",101:"Numpad5",102:"Numpad6",103:"Numpad7",104:"Numpad8",105:"Numpad9","-13":"NumpadEnter",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Numlock",145:"Scrolllock"},PRINTABLE_KEYS:{32:" ",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",107:"+",109:"-",110:".",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'"}};for(b in c.FUNCTION_KEYS)a=c.FUNCTION_KEYS[b].toLowerCase(),c[a]=parseInt(b,10);for(b in c.PRINTABLE_KEYS)a=c.PRINTABLE_KEYS[b].toLowerCase(),c[a]=parseInt(b,10);return d.mixin(c,c.MODIFIER_KEYS),d.mixin(c,c.PRINTABLE_KEYS),d.mixin(c,c.FUNCTION_KEYS),c.enter=c["return"],c.escape=c.esc,c.del=c["delete"],c[173]="-",function(){for(var a=["cmd","ctrl","alt","shift"],b=Math.pow(2,a.length);b--;)c.KEY_MODS[b]=a.filter(function(a){return b&c.KEY_MODS[a]}).join("-")+"-"}(),c}();d.mixin(b,e),b.keyCodeToString=function(a){var b=e[a];return"string"!=typeof b&&(b=String.fromCharCode(a)),b.toLowerCase()}}),define("ace/lib/oop",["require","exports","module"],function(a,b,c){b.inherits=function(a,b){a.super_=b,a.prototype=Object.create(b.prototype,{constructor:{value:a,enumerable:!1,writable:!0,configurable:!0}})},b.mixin=function(a,b){for(var c in b)a[c]=b[c];return a},b.implement=function(a,c){b.mixin(a,c)}}),define("ace/lib/useragent",["require","exports","module"],function(a,b,c){if(b.OS={LINUX:"LINUX",MAC:"MAC",WINDOWS:"WINDOWS"},b.getOS=function(){return b.isMac?b.OS.MAC:b.isLinux?b.OS.LINUX:b.OS.WINDOWS},"object"==typeof navigator){var d=(navigator.platform.match(/mac|win|linux/i)||["other"])[0].toLowerCase(),e=navigator.userAgent;b.isWin="win"==d,b.isMac="mac"==d,b.isLinux="linux"==d,b.isIE="Microsoft Internet Explorer"==navigator.appName||navigator.appName.indexOf("MSAppHost")>=0?parseFloat((e.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]):parseFloat((e.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]),b.isOldIE=b.isIE&&b.isIE<9,b.isGecko=b.isMozilla=window.controllers&&"Gecko"===window.navigator.product,b.isOldGecko=b.isGecko&&parseInt((e.match(/rv\:(\d+)/)||[])[1],10)<4,b.isOpera=window.opera&&"[object Opera]"==Object.prototype.toString.call(window.opera),b.isWebKit=parseFloat(e.split("WebKit/")[1])||void 0,b.isChrome=parseFloat(e.split(" Chrome/")[1])||void 0,b.isAIR=e.indexOf("AdobeAIR")>=0,b.isIPad=e.indexOf("iPad")>=0,b.isTouchPad=e.indexOf("TouchPad")>=0}}),define("ace/editor",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/keyboard/textinput","ace/mouse/mouse_handler","ace/mouse/fold_handler","ace/keyboard/keybinding","ace/edit_session","ace/search","ace/range","ace/lib/event_emitter","ace/commands/command_manager","ace/commands/default_commands","ace/config"],function(a,b,c){a("./lib/fixoldbrowsers");var d=a("./lib/oop"),e=a("./lib/dom"),f=a("./lib/lang"),g=a("./lib/useragent"),h=a("./keyboard/textinput").TextInput,i=a("./mouse/mouse_handler").MouseHandler,j=a("./mouse/fold_handler").FoldHandler,k=a("./keyboard/keybinding").KeyBinding,l=a("./edit_session").EditSession,m=a("./search").Search,n=a("./range").Range,o=a("./lib/event_emitter").EventEmitter,p=a("./commands/command_manager").CommandManager,q=a("./commands/default_commands").commands,r=a("./config"),s=function(a,b){var c=a.getContainerElement();this.container=c,this.renderer=a,this.commands=new p(g.isMac?"mac":"win",q),this.textInput=new h(a.getTextAreaContainer(),this),this.renderer.textarea=this.textInput.getElement(),this.keyBinding=new k(this),this.$mouseHandler=new i(this),new j(this),this.$blockScrolling=0,this.$search=(new m).set({wrap:!0}),this.$historyTracker=this.$historyTracker.bind(this),this.commands.on("exec",this.$historyTracker),this.$initOperationListeners(),this._$emitInputEvent=f.delayedCall(function(){this._signal("input",{}),this.session.bgTokenizer&&this.session.bgTokenizer.scheduleStart()}.bind(this)),this.on("change",function(a,b){b._$emitInputEvent.schedule(31)}),this.setSession(b||new l("")),r.resetOptions(this),r._signal("editor",this)};(function(){d.implement(this,o),this.$initOperationListeners=function(){function a(a){return a[a.length-1]}this.selections=[],this.commands.on("exec",function(b){this.startOperation(b);var c=b.command;if("fileJump"==c.aceCommandGroup){var d=this.prevOp;d&&"fileJump"==d.command.aceCommandGroup||(this.lastFileJumpPos=a(this.selections))}else this.lastFileJumpPos=null}.bind(this),!0),this.commands.on("afterExec",function(a){var b=a.command;"fileJump"==b.aceCommandGroup&&this.lastFileJumpPos&&!this.curOp.selectionChanged&&this.selection.fromJSON(this.lastFileJumpPos),this.endOperation(a)}.bind(this),!0),this.$opResetTimer=f.delayedCall(this.endOperation.bind(this)),this.on("change",function(){this.curOp||this.startOperation(),this.curOp.docChanged=!0}.bind(this),!0),this.on("changeSelection",function(){this.curOp||this.startOperation(),this.curOp.selectionChanged=!0}.bind(this),!0)},this.curOp=null,this.prevOp={},this.startOperation=function(a){if(this.curOp){if(!a||this.curOp.command)return;this.prevOp=this.curOp}a||(this.previousCommand=null,a={}),this.$opResetTimer.schedule(),this.curOp={command:a.command||{},args:a.args,scrollTop:this.renderer.scrollTop};var b=this.curOp.command;b&&b.scrollIntoView&&this.$blockScrolling++,this.selections.push(this.selection.toJSON())},this.endOperation=function(){if(this.curOp){var a=this.curOp.command;if(a&&a.scrollIntoView){switch(this.$blockScrolling--,a.scrollIntoView){case"center":this.renderer.scrollCursorIntoView(null,.5);break;case"animate":case"cursor":this.renderer.scrollCursorIntoView();break;case"selectionPart":var b=this.selection.getRange(),c=this.renderer.layerConfig;(b.start.row>=c.lastRow||b.end.row<=c.firstRow)&&this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead)}"animate"==a.scrollIntoView&&this.renderer.animateScrolling(this.curOp.scrollTop)}this.prevOp=this.curOp,this.curOp=null}},this.$historyTracker=function(a){if(this.$mergeUndoDeltas){var b=this.prevOp,c=["backspace","del","insertstring"],d=b.command&&a.command.name==b.command.name;if("insertstring"==a.command.name){var e=a.args;void 0===this.mergeNextCommand&&(this.mergeNextCommand=!0),d=d&&this.mergeNextCommand&&(!/\s/.test(e)||/\s/.test(b.args)),this.mergeNextCommand=!0}else d=d&&c.indexOf(a.command.name)!==-1;"always"!=this.$mergeUndoDeltas&&Date.now()-this.sequenceStartTime>2e3&&(d=!1),d?this.session.mergeUndoDeltas=!0:c.indexOf(a.command.name)!==-1&&(this.sequenceStartTime=Date.now())}},this.setKeyboardHandler=function(a){if(a)if("string"==typeof a){this.$keybindingId=a;var b=this;r.loadModule(["keybinding",a],function(c){b.$keybindingId==a&&b.keyBinding.setKeyboardHandler(c&&c.handler)})}else this.$keybindingId=null,this.keyBinding.setKeyboardHandler(a);else this.keyBinding.setKeyboardHandler(null)},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(a){if(this.session!=a){var b=this.session;if(b){this.session.removeEventListener("change",this.$onDocumentChange),this.session.removeEventListener("changeMode",this.$onChangeMode),this.session.removeEventListener("tokenizerUpdate",this.$onTokenizerUpdate),this.session.removeEventListener("changeTabSize",this.$onChangeTabSize),this.session.removeEventListener("changeWrapLimit",this.$onChangeWrapLimit),this.session.removeEventListener("changeWrapMode",this.$onChangeWrapMode),this.session.removeEventListener("onChangeFold",this.$onChangeFold),this.session.removeEventListener("changeFrontMarker",this.$onChangeFrontMarker),this.session.removeEventListener("changeBackMarker",this.$onChangeBackMarker),this.session.removeEventListener("changeBreakpoint",this.$onChangeBreakpoint),this.session.removeEventListener("changeAnnotation",this.$onChangeAnnotation),this.session.removeEventListener("changeOverwrite",this.$onCursorChange),this.session.removeEventListener("changeScrollTop",this.$onScrollTopChange),this.session.removeEventListener("changeScrollLeft",this.$onScrollLeftChange);var c=this.session.getSelection();c.removeEventListener("changeCursor",this.$onCursorChange),c.removeEventListener("changeSelection",this.$onSelectionChange)}this.session=a,a&&(this.$onDocumentChange=this.onDocumentChange.bind(this),a.addEventListener("change",this.$onDocumentChange),this.renderer.setSession(a),this.$onChangeMode=this.onChangeMode.bind(this),a.addEventListener("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),a.addEventListener("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),a.addEventListener("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),a.addEventListener("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),a.addEventListener("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),a.addEventListener("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.addEventListener("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.addEventListener("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.addEventListener("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.addEventListener("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.addEventListener("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.addEventListener("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.addEventListener("changeScrollLeft",this.$onScrollLeftChange),this.selection=a.getSelection(),this.selection.addEventListener("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.addEventListener("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.$blockScrolling+=1,this.onCursorChange(),this.$blockScrolling-=1,this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(), -this.renderer.updateFull()),this._signal("changeSession",{session:a,oldSession:b}),b&&b._signal("changeEditor",{oldEditor:this}),a&&a._signal("changeEditor",{editor:this})}},this.getSession=function(){return this.session},this.setValue=function(a,b){return this.session.doc.setValue(a),b?1==b?this.navigateFileEnd():b==-1&&this.navigateFileStart():this.selectAll(),a},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(a){this.renderer.onResize(a)},this.setTheme=function(a,b){this.renderer.setTheme(a,b)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(a){this.renderer.setStyle(a)},this.unsetStyle=function(a){this.renderer.unsetStyle(a)},this.getFontSize=function(){return this.getOption("fontSize")||e.computedStyle(this.container,"fontSize")},this.setFontSize=function(a){this.setOption("fontSize",a)},this.$highlightBrackets=function(){if(this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null),!this.$highlightPending){var a=this;this.$highlightPending=!0,setTimeout(function(){a.$highlightPending=!1;var b=a.session.findMatchingBracket(a.getCursorPosition());if(b)var c=new n(b.row,b.column,b.row,b.column+1);else if(a.session.$mode.getMatching)var c=a.session.$mode.getMatching(a.session);c&&(a.session.$bracketHighlight=a.session.addMarker(c,"ace_bracket","text"))},50)}},this.focus=function(){var a=this;setTimeout(function(){a.textInput.focus()}),this.textInput.focus()},this.isFocused=function(){return this.textInput.isFocused()},this.blur=function(){this.textInput.blur()},this.onFocus=function(){this.$isFocused||(this.$isFocused=!0,this.renderer.showCursor(),this.renderer.visualizeFocus(),this._emit("focus"))},this.onBlur=function(){this.$isFocused&&(this.$isFocused=!1,this.renderer.hideCursor(),this.renderer.visualizeBlur(),this._emit("blur"))},this.$cursorChange=function(){this.renderer.updateCursor()},this.onDocumentChange=function(a){var b,c=a.data,d=c.range;b=d.start.row==d.end.row&&"insertLines"!=c.action&&"removeLines"!=c.action?d.end.row:1/0,this.renderer.updateLines(d.start.row,b),this._signal("change",a),this.$cursorChange()},this.onTokenizerUpdate=function(a){var b=a.data;this.renderer.updateLines(b.first,b.last)},this.onScrollTopChange=function(){this.renderer.scrollToY(this.session.getScrollTop())},this.onScrollLeftChange=function(){this.renderer.scrollToX(this.session.getScrollLeft())},this.onCursorChange=function(){this.$cursorChange(),this.$blockScrolling||this.renderer.scrollCursorIntoView(),this.$highlightBrackets(),this.$updateHighlightActiveLine(),this._signal("changeSelection")},this.$updateHighlightActiveLine=function(){var a,b=this.getSession();if(this.$highlightActiveLine&&("line"==this.$selectionStyle&&this.selection.isMultiLine()||(a=this.getCursorPosition()),!this.renderer.$maxLines||1!==this.session.getLength()||this.renderer.$minLines>1||(a=!1)),b.$highlightLineMarker&&!a)b.removeMarker(b.$highlightLineMarker.id),b.$highlightLineMarker=null;else if(!b.$highlightLineMarker&&a){var c=new n(a.row,a.column,a.row,1/0);c.id=b.addMarker(c,"ace_active-line","screenLine"),b.$highlightLineMarker=c}else a&&(b.$highlightLineMarker.start.row=a.row,b.$highlightLineMarker.end.row=a.row,b.$highlightLineMarker.start.column=a.column,b._signal("changeBackMarker"))},this.onSelectionChange=function(a){var b=this.session;if(b.$selectionMarker&&b.removeMarker(b.$selectionMarker),b.$selectionMarker=null,this.selection.isEmpty())this.$updateHighlightActiveLine();else{var c=this.selection.getRange(),d=this.getSelectionStyle();b.$selectionMarker=b.addMarker(c,"ace_selection",d)}var e=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(e),this._signal("changeSelection")},this.$getSelectionHighLightRegexp=function(){var a=this.session,b=this.getSelectionRange();if(!b.isEmpty()&&!b.isMultiLine()){var c=b.start.column-1,d=b.end.column+1,e=a.getLine(b.start.row),f=e.length,g=e.substring(Math.max(c,0),Math.min(d,f));if(!(c>=0&&/^[\w\d]/.test(g)||d<=f&&/[\w\d]$/.test(g))&&(g=e.substring(b.start.column,b.end.column),/^[\w\d]+$/.test(g))){var h=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:g});return h}}},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(a){this.renderer.updateText(),this._emit("changeMode",a)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())},this.getCopyText=function(){var a=this.getSelectedText();return this._signal("copy",a),a},this.onCopy=function(){this.commands.exec("copy",this)},this.onCut=function(){this.commands.exec("cut",this)},this.onPaste=function(a){if(!this.$readOnly){var b={text:a};this._signal("paste",b),this.insert(b.text,!0)}},this.execCommand=function(a,b){this.commands.exec(a,this,b)},this.insert=function(a,b){var c=this.session,d=c.getMode(),e=this.getCursorPosition();if(this.getBehavioursEnabled()&&!b){var f=d.transformAction(c.getState(e.row),"insertion",this,c,a);f&&(a!==f.text&&(this.session.mergeUndoDeltas=!1,this.$mergeNextCommand=!1),a=f.text)}if("\t"==a&&(a=this.session.getTabString()),this.selection.isEmpty()){if(this.session.getOverwrite()){var g=new n.fromPoints(e,e);g.end.column+=a.length,this.session.remove(g)}}else{var g=this.getSelectionRange();e=this.session.remove(g),this.clearSelection()}if("\n"==a||"\r\n"==a){var h=c.getLine(e.row);if(e.column>h.search(/\S|$/)){var i=h.substr(e.column).search(/\S|$/);c.doc.removeInLine(e.row,e.column,e.column+i)}}this.clearSelection();var j=e.column,k=c.getState(e.row),h=c.getLine(e.row),l=d.checkOutdent(k,h,a);c.insert(e,a);if(f&&f.selection&&(2==f.selection.length?this.selection.setSelectionRange(new n(e.row,j+f.selection[0],e.row,j+f.selection[1])):this.selection.setSelectionRange(new n(e.row+f.selection[0],f.selection[1],e.row+f.selection[2],f.selection[3]))),c.getDocument().isNewLine(a)){var m=d.getNextLineIndent(k,h.slice(0,e.column),c.getTabString());c.insert({row:e.row+1,column:0},m)}l&&d.autoOutdent(k,c,e.row)},this.onTextInput=function(a){this.keyBinding.onTextInput(a)},this.onCommandKey=function(a,b,c){this.keyBinding.onCommandKey(a,b,c)},this.setOverwrite=function(a){this.session.setOverwrite(a)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(a){this.setOption("scrollSpeed",a)},this.getScrollSpeed=function(){return this.getOption("scrollSpeed")},this.setDragDelay=function(a){this.setOption("dragDelay",a)},this.getDragDelay=function(){return this.getOption("dragDelay")},this.setSelectionStyle=function(a){this.setOption("selectionStyle",a)},this.getSelectionStyle=function(){return this.getOption("selectionStyle")},this.setHighlightActiveLine=function(a){this.setOption("highlightActiveLine",a)},this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")},this.setHighlightGutterLine=function(a){this.setOption("highlightGutterLine",a)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.setHighlightSelectedWord=function(a){this.setOption("highlightSelectedWord",a)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(a){this.renderer.setAnimatedScroll(a)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(a){this.renderer.setShowInvisibles(a)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(a){this.renderer.setDisplayIndentGuides(a)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(a){this.renderer.setShowPrintMargin(a)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(a){this.renderer.setPrintMarginColumn(a)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(a){this.setOption("readOnly",a)},this.getReadOnly=function(){return this.getOption("readOnly")},this.setBehavioursEnabled=function(a){this.setOption("behavioursEnabled",a)},this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")},this.setWrapBehavioursEnabled=function(a){this.setOption("wrapBehavioursEnabled",a)},this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")},this.setShowFoldWidgets=function(a){this.setOption("showFoldWidgets",a)},this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")},this.setFadeFoldWidgets=function(a){this.setOption("fadeFoldWidgets",a)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.remove=function(a){this.selection.isEmpty()&&("left"==a?this.selection.selectLeft():this.selection.selectRight());var b=this.getSelectionRange();if(this.getBehavioursEnabled()){var c=this.session,d=c.getState(b.start.row),e=c.getMode().transformAction(d,"deletion",this,c,b);if(0===b.end.column){var f=c.getTextRange(b);if("\n"==f[f.length-1]){var g=c.getLine(b.end.row);/^\s+$/.test(g)&&(b.end.column=g.length)}}e&&(b=e)}this.session.remove(b),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var a=this.getSelectionRange();a.start.column==a.end.column&&a.start.row==a.end.row&&(a.end.column=0,a.end.row++),this.session.remove(a),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var a=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(a)},this.transposeLetters=function(){if(this.selection.isEmpty()){var a=this.getCursorPosition(),b=a.column;if(0!==b){var c,d,e=this.session.getLine(a.row);bb.toLowerCase()?1:0});for(var d=new n(0,0,0,0),e=a.first;e<=a.last;e++){var f=b.getLine(e);d.start.row=e,d.end.row=e,d.end.column=f.length,b.replace(d,c[e-a.first])}},this.toggleCommentLines=function(){var a=this.session.getState(this.getCursorPosition().row),b=this.$getSelectedRows();this.session.getMode().toggleCommentLines(a,this.session,b.first,b.last)},this.toggleBlockComment=function(){var a=this.getCursorPosition(),b=this.session.getState(a.row),c=this.getSelectionRange();this.session.getMode().toggleBlockComment(b,this.session,c,a)},this.getNumberAt=function(a,b){var c=/[\-]?[0-9]+(?:\.[0-9]+)?/g;c.lastIndex=0;for(var d=this.session.getLine(a);c.lastIndex=b){var f={value:e[0],start:e.index,end:e.index+e[0].length};return f}}return null},this.modifyNumber=function(a){var b=this.selection.getCursor().row,c=this.selection.getCursor().column,d=new n(b,c-1,b,c),e=this.session.getTextRange(d);if(!isNaN(parseFloat(e))&&isFinite(e)){var f=this.getNumberAt(b,c);if(f){var g=f.value.indexOf(".")>=0?f.start+f.value.indexOf(".")+1:f.end,h=f.start+f.value.length-g,i=parseFloat(f.value);i*=Math.pow(10,h),a*=g!==f.end&&c=g;)f[h].moveBy(e,0),h--}b.fromOrientedRange(b.ranges[0]),b.rangeList.attach(this.session)}},this.$getSelectedRows=function(){var a=this.getSelectionRange().collapseRows();return{first:this.session.getRowFoldStart(a.start.row),last:this.session.getRowFoldEnd(a.end.row)}},this.onCompositionStart=function(a){this.renderer.showComposition(this.getCursorPosition())},this.onCompositionUpdate=function(a){this.renderer.setCompositionText(a)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(a){return a>=this.getFirstVisibleRow()&&a<=this.getLastVisibleRow()},this.isRowFullyVisible=function(a){return a>=this.renderer.getFirstFullyVisibleRow()&&a<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(a,b){var c=this.renderer,d=this.renderer.layerConfig,e=a*Math.floor(d.height/d.lineHeight);this.$blockScrolling++,b===!0?this.selection.$moveSelection(function(){this.moveCursorBy(e,0)}):b===!1&&(this.selection.moveCursorBy(e,0),this.selection.clearSelection()),this.$blockScrolling--;var f=c.scrollTop;c.scrollBy(0,e*d.lineHeight),null!=b&&c.scrollCursorIntoView(null,.5),c.animateScrolling(f)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(a){this.renderer.scrollToRow(a)},this.scrollToLine=function(a,b,c,d){this.renderer.scrollToLine(a,b,c,d)},this.centerSelection=function(){var a=this.getSelectionRange(),b={row:Math.floor(a.start.row+(a.end.row-a.start.row)/2),column:Math.floor(a.start.column+(a.end.column-a.start.column)/2)};this.renderer.alignCursor(b,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),this.$blockScrolling-=1},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(a,b){this.selection.moveCursorTo(a,b)},this.moveCursorToPosition=function(a){this.selection.moveCursorToPosition(a)},this.jumpToMatching=function(a){var b=this.getCursorPosition(),c=this.session.getBracketRange(b);if(!c){if(c=this.find({needle:/[{}()\[\]]/g,preventScroll:!0,start:{row:b.row,column:b.column-1}}),!c)return;var d=c.start;d.row==b.row&&Math.abs(d.column-b.column)<2&&(c=this.session.getBracketRange(d))}d=c&&c.cursor||d,d&&(a?c&&c.isEqual(this.getSelectionRange())?this.clearSelection():this.selection.selectTo(d.row,d.column):this.selection.moveTo(d.row,d.column))},this.gotoLine=function(a,b,c){this.selection.clearSelection(),this.session.unfold({row:a-1,column:b||0}),this.$blockScrolling+=1,this.exitMultiSelectMode&&this.exitMultiSelectMode(),this.moveCursorTo(a-1,b||0),this.$blockScrolling-=1,this.isRowFullyVisible(a-1)||this.scrollToLine(a-1,!0,c)},this.navigateTo=function(a,b){this.selection.moveTo(a,b)},this.navigateUp=function(a){if(this.selection.isMultiLine()&&!this.selection.isBackwards()){var b=this.selection.anchor.getPosition();return this.moveCursorToPosition(b)}this.selection.clearSelection(),this.selection.moveCursorBy(-a||-1,0)},this.navigateDown=function(a){if(this.selection.isMultiLine()&&this.selection.isBackwards()){var b=this.selection.anchor.getPosition();return this.moveCursorToPosition(b)}this.selection.clearSelection(),this.selection.moveCursorBy(a||1,0)},this.navigateLeft=function(a){if(this.selection.isEmpty())for(a=a||1;a--;)this.selection.moveCursorLeft();else{var b=this.getSelectionRange().start;this.moveCursorToPosition(b)}this.clearSelection()},this.navigateRight=function(a){if(this.selection.isEmpty())for(a=a||1;a--;)this.selection.moveCursorRight();else{var b=this.getSelectionRange().end;this.moveCursorToPosition(b)}this.clearSelection()},this.navigateLineStart=function(){this.selection.moveCursorLineStart(),this.clearSelection()},this.navigateLineEnd=function(){this.selection.moveCursorLineEnd(),this.clearSelection()},this.navigateFileEnd=function(){this.selection.moveCursorFileEnd(),this.clearSelection()},this.navigateFileStart=function(){this.selection.moveCursorFileStart(),this.clearSelection()},this.navigateWordRight=function(){this.selection.moveCursorWordRight(),this.clearSelection()},this.navigateWordLeft=function(){this.selection.moveCursorWordLeft(),this.clearSelection()},this.replace=function(a,b){b&&this.$search.set(b);var c=this.$search.find(this.session),d=0;return c?(this.$tryReplace(c,a)&&(d=1),null!==c&&(this.selection.setSelectionRange(c),this.renderer.scrollSelectionIntoView(c.start,c.end)),d):d},this.replaceAll=function(a,b){b&&this.$search.set(b);var c=this.$search.findAll(this.session),d=0;if(!c.length)return d;this.$blockScrolling+=1;var e=this.getSelectionRange();this.selection.moveTo(0,0);for(var f=c.length-1;f>=0;--f)this.$tryReplace(c[f],a)&&d++;return this.selection.setSelectionRange(e),this.$blockScrolling-=1,d},this.$tryReplace=function(a,b){var c=this.session.getTextRange(a);return b=this.$search.replace(c,b),null!==b?(a.end=this.session.replace(a,b),a):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(a,b,c){b||(b={}),"string"==typeof a||a instanceof RegExp?b.needle=a:"object"==typeof a&&d.mixin(b,a);var e=this.selection.getRange();null==b.needle&&(a=this.session.getTextRange(e)||this.$search.$options.needle,a||(e=this.session.getWordRange(e.start.row,e.start.column),a=this.session.getTextRange(e)),this.$search.set({needle:a})),this.$search.set(b),b.start||this.$search.set({start:e});var f=this.$search.find(this.session);return b.preventScroll?f:f?(this.revealRange(f,c),f):(b.backwards?e.start=e.end:e.end=e.start,void this.selection.setRange(e))},this.findNext=function(a,b){this.find({skipCurrent:!0,backwards:!1},a,b)},this.findPrevious=function(a,b){this.find(a,{skipCurrent:!0,backwards:!0},b)},this.revealRange=function(a,b){this.$blockScrolling+=1,this.session.unfold(a),this.selection.setSelectionRange(a),this.$blockScrolling-=1;var c=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(a.start,a.end,.5),b!==!1&&this.renderer.animateScrolling(c)},this.undo=function(){this.$blockScrolling++,this.session.getUndoManager().undo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.$blockScrolling++,this.session.getUndoManager().redo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._signal("destroy",this)},this.setAutoScrollEditorIntoView=function(a){if(a){var b,c=this,d=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement("div"));var e=this.$scrollAnchor;e.style.cssText="position:absolute",this.container.insertBefore(e,this.container.firstChild);var f=this.on("changeSelection",function(){d=!0}),g=this.renderer.on("beforeRender",function(){d&&(b=c.renderer.container.getBoundingClientRect())}),h=this.renderer.on("afterRender",function(){if(d&&b&&c.isFocused()){var a=c.renderer,f=a.$cursorLayer.$pixelPos,g=a.layerConfig,h=f.top-g.offset;d=f.top>=0&&h+b.top<0||!(f.topwindow.innerHeight)&&null,null!=d&&(e.style.top=h+"px",e.style.left=f.left+"px",e.style.height=g.lineHeight+"px",e.scrollIntoView(d)),d=b=null}});this.setAutoScrollEditorIntoView=function(a){a||(delete this.setAutoScrollEditorIntoView,this.removeEventListener("changeSelection",f),this.renderer.removeEventListener("afterRender",h),this.renderer.removeEventListener("beforeRender",g))}}},this.$resetCursorStyle=function(){var a=this.$cursorStyle||"ace",b=this.renderer.$cursorLayer;b&&(b.setSmoothBlinking("smooth"==a),b.isBlinking=!this.$readOnly&&"wide"!=a)}}).call(s.prototype),r.defineOptions(s.prototype,"editor",{selectionStyle:{set:function(a){this.onSelectionChange(),this._signal("changeSelectionStyle",{data:a})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(a){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(a){this.$resetCursorStyle()},initialValue:!1},cursorStyle:{set:function(a){this.$resetCursorStyle()},values:["ace","slim","smooth","wide"],initialValue:"ace"},mergeUndoDeltas:{values:[!1,!0,"always"],initialValue:!0},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},autoScrollEditorIntoView:{set:function(a){this.setAutoScrollEditorIntoView(a)}},hScrollBarAlwaysVisible:"renderer",vScrollBarAlwaysVisible:"renderer",highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",printMargin:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",showLineNumbers:"renderer",showGutter:"renderer",displayIndentGuides:"renderer",fontSize:"renderer",fontFamily:"renderer",maxLines:"renderer",minLines:"renderer",scrollPastEnd:"renderer",fixedWidthGutter:"renderer",theme:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",dragEnabled:"$mouseHandler",focusTimout:"$mouseHandler",tooltipFollowsMouse:"$mouseHandler",firstLineNumber:"session",overwrite:"session",newLineMode:"session",useWorker:"session",useSoftTabs:"session",tabSize:"session",wrap:"session",foldStyle:"session",mode:"session"}),b.Editor=s}),define("ace/lib/lang",["require","exports","module"],function(a,b,c){b.last=function(a){return a[a.length-1]},b.stringReverse=function(a){return a.split("").reverse().join("")},b.stringRepeat=function(a,b){for(var c="";b>0;)1&b&&(c+=a),(b>>=1)&&(a+=a);return c};var d=/^\s\s*/,e=/\s\s*$/;b.stringTrimLeft=function(a){return a.replace(d,"")},b.stringTrimRight=function(a){return a.replace(e,"")},b.copyObject=function(a){var b={};for(var c in a)b[c]=a[c];return b},b.copyArray=function(a){for(var b=[],c=0,d=a.length;c=0)b=this.$clickSelection.start,e.start.row==d.row&&e.start.column==d.column||(d=e.end);else if(g==-1&&1==h)d=e.end,b=e.start;else{var i=f(this.$clickSelection,d);d=i.cursor,b=i.anchor}c.selection.setSelectionAnchor(b.row,b.column)}c.selection.selectToPosition(d),c.renderer.scrollCursorIntoView()},this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.$clickSelection=null,this.editor.unsetStyle("ace_selecting"),this.editor.renderer.scroller.releaseCapture&&this.editor.renderer.scroller.releaseCapture()},this.focusWait=function(){var a=e(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),b=Date.now();(a>g||b-this.mousedownEvent.time>this.$focusTimout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.onDoubleClick=function(a){var b=a.getDocumentPosition(),c=this.editor,d=c.session,e=d.getBracketRange(b);e?(e.isEmpty()&&(e.start.column--,e.end.column++),this.setState("select")):(e=c.selection.getWordRange(b.row,b.column),this.setState("selectByWords")),this.$clickSelection=e,this[this.state]&&this[this.state](a)},this.onTripleClick=function(a){var b=a.getDocumentPosition(),c=this.editor;this.setState("selectByLines"),this.$clickSelection=c.selection.getLineRange(b.row),this[this.state]&&this[this.state](a)},this.onQuadClick=function(a){var b=this.editor;b.selectAll(),this.$clickSelection=b.getSelectionRange(),this.setState("selectAll")},this.onMouseWheel=function(a){if(!a.getAccelKey()){a.getShiftKey()&&a.wheelY&&!a.wheelX&&(a.wheelX=a.wheelY,a.wheelY=0);var b=a.domEvent.timeStamp,c=b-(this.$lastScrollTime||0),d=this.editor,e=d.renderer.isScrollableBy(a.wheelX*a.speed,a.wheelY*a.speed);return e||c<200?(this.$lastScrollTime=b,d.renderer.scrollBy(a.wheelX*a.speed,a.wheelY*a.speed),a.stop()):void 0}}}).call(d.prototype),b.DefaultHandlers=d}),define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event","ace/tooltip"],function(a,b,c){function d(a){function b(){var b=l.getDocumentPosition().row,e=i.$annotations[b];if(!e)return c();var f=g.session.getLength();if(b==f){var h=g.renderer.pixelToScreenCoordinates(0,l.y).row,k=l.$pos;if(h>g.session.documentToScreenRow(k.row,k.column))return c()}if(m!=e)if(m=e.text.join("
"),j.setHtml(m),j.show(),g.on("mousewheel",c),a.$tooltipFollowsMouse)d(l);else{var n=i.$cells[g.session.documentToScreenRow(b,0)].element,o=n.getBoundingClientRect(),p=j.getElement().style;p.left=o.right+"px",p.top=o.bottom+"px"}}function c(){k&&(k=clearTimeout(k)),m&&(j.hide(),m=null,g.removeEventListener("mousewheel",c))}function d(a){j.setPosition(a.x,a.y)}var g=a.editor,i=g.renderer.$gutterLayer,j=new e(g.container);a.editor.setDefaultHandler("guttermousedown",function(b){if(g.isFocused()&&0==b.getButton()){var c=i.getRegion(b);if("foldWidgets"!=c){var d=b.getDocumentPosition().row,e=g.session.selection;if(b.getShiftKey())e.selectTo(d,0);else{if(2==b.domEvent.detail)return g.selectAll(),b.preventDefault();a.$clickSelection=g.selection.getLineRange(d)}return a.setState("selectByLines"),a.captureMouse(b),b.preventDefault()}}});var k,l,m;a.editor.setDefaultHandler("guttermousemove",function(e){var g=e.domEvent.target||e.domEvent.srcElement;return f.hasCssClass(g,"ace_fold-widget")?c():(m&&a.$tooltipFollowsMouse&&d(e),l=e,void(k||(k=setTimeout(function(){k=null,l&&!a.isMousePressed?b():c()},50))))}),h.addListener(g.renderer.$gutter,"mouseout",function(a){l=null,m&&!k&&(k=setTimeout(function(){k=null,c()},50))}),g.on("changeSession",c)}function e(a){i.call(this,a)}var f=a("../lib/dom"),g=a("../lib/oop"),h=a("../lib/event"),i=a("../tooltip").Tooltip;g.inherits(e,i),function(){this.setPosition=function(a,b){var c=window.innerWidth||document.documentElement.clientWidth,d=window.innerHeight||document.documentElement.clientHeight,e=this.getWidth(),f=this.getHeight();a+=15,b+=15,a+e>c&&(a-=a+e-c),b+f>d&&(b-=20+f),i.prototype.setPosition.call(this,a,b)}}.call(e.prototype),b.GutterHandler=d}),define("ace/tooltip",["require","exports","module","ace/lib/oop","ace/lib/dom"],function(a,b,c){function d(a){this.isOpen=!1,this.$element=null,this.$parentNode=a}var e=(a("./lib/oop"),a("./lib/dom"));(function(){this.$init=function(){return this.$element=e.createElement("div"),this.$element.className="ace_tooltip",this.$element.style.display="none",this.$parentNode.appendChild(this.$element),this.$element},this.getElement=function(){return this.$element||this.$init()},this.setText=function(a){e.setInnerText(this.getElement(),a)},this.setHtml=function(a){this.getElement().innerHTML=a},this.setPosition=function(a,b){this.getElement().style.left=a+"px",this.getElement().style.top=b+"px"},this.setClassName=function(a){e.addCssClass(this.getElement(),a)},this.show=function(a,b,c){null!=a&&this.setText(a),null!=b&&null!=c&&this.setPosition(b,c),this.isOpen||(this.getElement().style.display="block",this.isOpen=!0)},this.hide=function(){this.isOpen&&(this.getElement().style.display="none",this.isOpen=!1)},this.getHeight=function(){return this.getElement().offsetHeight},this.getWidth=function(){return this.getElement().offsetWidth}}).call(d.prototype),b.Tooltip=d}),define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(a,b,c){var d=a("../lib/event"),e=a("../lib/useragent"),f=b.MouseEvent=function(a,b){this.domEvent=a,this.editor=b,this.x=this.clientX=a.clientX,this.y=this.clientY=a.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){d.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){d.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos?this.$pos:(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY),this.$pos)},this.inSelection=function(){if(null!==this.$inSelection)return this.$inSelection;var a=this.editor,b=a.getSelectionRange();if(b.isEmpty())this.$inSelection=!1;else{var c=this.getDocumentPosition();this.$inSelection=b.contains(c.row,c.column)}return this.$inSelection},this.getButton=function(){return d.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=e.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(f.prototype)}),define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(a,b,c){function d(a){function b(a,b){var c=Date.now(),d=!b||a.row!=b.row,f=!b||a.column!=b.column;if(!C||d||f)q.$blockScrolling+=1,q.moveCursorToPosition(a),q.$blockScrolling-=1,C=c,D={x:u,y:v};else{var g=e(D.x,D.y,u,v);g>k?C=null:c-C>=j&&(q.renderer.scrollCursorIntoView(),C=null)}}function c(a,b){var c=Date.now(),d=q.renderer.layerConfig.lineHeight,e=q.renderer.layerConfig.characterWidth,f=q.renderer.scroller.getBoundingClientRect(),g={x:{left:u-f.left,right:f.right-u},y:{top:v-f.top,bottom:f.bottom-v}},h=Math.min(g.x.left,g.x.right),j=Math.min(g.y.top,g.y.bottom),k={row:a.row,column:a.column};h/e<=2&&(k.column+=g.x.left=i&&q.renderer.scrollCursorIntoView(k):B=c:B=null}function d(){var a=y;y=q.renderer.screenToTextCoordinates(u,v),b(y,a),c(y,a)}function l(){x=q.selection.toOrientedRange(),t=q.session.addMarker(x,"ace_selection",q.getSelectionStyle()),q.clearSelection(),q.isFocused()&&q.renderer.$cursorLayer.setBlinking(!1),clearInterval(w),w=setInterval(d,20),F=0,g.addListener(document,"mousemove",n)}function m(){clearInterval(w),q.session.removeMarker(t),t=null,q.$blockScrolling+=1,q.selection.fromOrientedRange(x),q.$blockScrolling-=1,q.isFocused()&&!A&&q.renderer.$cursorLayer.setBlinking(!q.getReadOnly()),x=null,F=0,B=null,C=null,g.removeListener(document,"mousemove",n)}function n(){null==G&&(G=setTimeout(function(){null!=G&&t&&m()},20))}function o(a){var b=a.types;return!b||Array.prototype.some.call(b,function(a){return"text/plain"==a||"Text"==a})}function p(a){var b=["copy","copymove","all","uninitialized"],c=["move","copymove","linkmove","all","uninitialized"],d=h.isMac?a.altKey:a.ctrlKey,e="uninitialized";try{e=a.dataTransfer.effectAllowed.toLowerCase()}catch(a){}var f="none";return d&&b.indexOf(e)>=0?f="copy":c.indexOf(e)>=0?f="move":b.indexOf(e)>=0&&(f="copy"),f}var q=a.editor,r=f.createElement("img");r.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",h.isOpera&&(r.style.cssText="width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;");var s=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];s.forEach(function(b){a[b]=this[b]},this),q.addEventListener("mousedown",this.onMouseDown.bind(a));var t,u,v,w,x,y,z,A,B,C,D,E=q.container,F=0;this.onDragStart=function(a){if(this.cancelDrag||!E.draggable){var b=this;return setTimeout(function(){b.startSelect(),b.captureMouse(a)},0),a.preventDefault()}x=q.getSelectionRange();var c=a.dataTransfer;c.effectAllowed=q.getReadOnly()?"copy":"copyMove",h.isOpera&&(q.container.appendChild(r),r._top=r.offsetTop),c.setDragImage&&c.setDragImage(r,0,0),h.isOpera&&q.container.removeChild(r),c.clearData(),c.setData("Text",q.session.getTextRange()),A=!0,this.setState("drag")},this.onDragEnd=function(a){if(E.draggable=!1,A=!1,this.setState(null),!q.getReadOnly()){var b=a.dataTransfer.dropEffect;z||"move"!=b||q.session.remove(q.getSelectionRange()),q.renderer.$cursorLayer.setBlinking(!0)}this.editor.unsetStyle("ace_dragging")},this.onDragEnter=function(a){if(!q.getReadOnly()&&o(a.dataTransfer))return t||l(),F++,a.dataTransfer.dropEffect=z=p(a),g.preventDefault(a)},this.onDragOver=function(a){if(!q.getReadOnly()&&o(a.dataTransfer))return t||(l(),F++),null!==G&&(G=null),u=a.clientX,v=a.clientY,a.dataTransfer.dropEffect=z=p(a),g.preventDefault(a)},this.onDragLeave=function(a){if(F--,F<=0&&t)return m(),z=null,g.preventDefault(a)},this.onDrop=function(a){if(t){var b=a.dataTransfer;if(A)switch(z){case"move":x=x.contains(y.row,y.column)?{start:y,end:y}:q.moveText(x,y);break;case"copy":x=q.moveText(x,y,!0)}else{var c=b.getData("Text");x={start:y,end:q.session.insert(y,c)},q.focus(),z=null}return m(),g.preventDefault(a)}},g.addListener(E,"dragstart",this.onDragStart.bind(a)),g.addListener(E,"dragend",this.onDragEnd.bind(a)),g.addListener(E,"dragenter",this.onDragEnter.bind(a)),g.addListener(E,"dragover",this.onDragOver.bind(a)),g.addListener(E,"dragleave",this.onDragLeave.bind(a)),g.addListener(E,"drop",this.onDrop.bind(a));var G=null}function e(a,b,c,d){return Math.sqrt(Math.pow(c-a,2)+Math.pow(d-b,2))}var f=a("../lib/dom"),g=a("../lib/event"),h=a("../lib/useragent"),i=200,j=200,k=5;(function(){this.dragWait=function(){var a=Date.now()-this.mousedownEvent.time;a>this.editor.getDragDelay()&&this.startDrag()},this.dragWaitEnd=function(){var a=this.editor.container;a.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()),this.selectEnd()},this.dragReadyEnd=function(a){this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()),this.editor.unsetStyle("ace_dragging"),this.dragWaitEnd()},this.startDrag=function(){this.cancelDrag=!1;var a=this.editor.container;a.draggable=!0,this.editor.renderer.$cursorLayer.setBlinking(!1),this.editor.setStyle("ace_dragging"),this.setState("dragReady")},this.onMouseDrag=function(a){var b=this.editor.container;if(h.isIE&&"dragReady"==this.state){var c=e(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);c>3&&b.dragDrop()}if("dragWait"===this.state){var c=e(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);c>0&&(b.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()))}},this.onMouseDown=function(a){if(this.$dragEnabled){this.mousedownEvent=a;var b=this.editor,c=a.inSelection(),d=a.getButton(),e=a.domEvent.detail||1;if(1===e&&0===d&&c){if(a.editor.inMultiSelectMode&&(a.getAccelKey()||a.getShiftKey()))return;this.mousedownEvent.time=Date.now();var f=a.domEvent.target||a.domEvent.srcElement;if("unselectable"in f&&(f.unselectable="on"),b.getDragDelay()){if(h.isWebKit){this.cancelDrag=!0;var g=b.container;g.draggable=!0}this.setState("dragWait")}else this.startDrag();this.captureMouse(a,this.onMouseDrag.bind(this)),a.defaultPrevented=!0}}}}).call(d.prototype),b.DragdropHandler=d}),define("ace/config",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/lib/net","ace/lib/event_emitter"],function(a,b,c){"no use strict";function d(d){if(k.packaged=d||a.packaged||c.packaged||j.define&&define.packaged,!j.document)return"";for(var f={},g="",h=document.getElementsByTagName("script"),i=0;i1&&(e=c[c.length-2]);var g=k[b+"Path"];return null==g?g=k.basePath:"/"==d&&(b=d=""),g&&"/"!=g.slice(-1)&&(g+="/"),g+b+d+e+this.get("suffix")},b.setModuleUrl=function(a,b){return k.$moduleUrls[a]=b},b.$loading={},b.loadModule=function(c,d){var e,f;Array.isArray(c)&&(f=c[0],c=c[1]);try{e=a(c)}catch(g){}if(e&&!b.$loading[c])return d&&d(e);if(b.$loading[c]||(b.$loading[c]=[]),b.$loading[c].push(d),!(b.$loading[c].length>1)){var i=function(){a([c],function(a){b._emit("load.module",{name:c,module:a});var d=b.$loading[c];b.$loading[c]=null,d.forEach(function(b){b&&b(a)})})};return b.get("packaged")?void h.loadScript(b.moduleUrl(c,f),i):i()}},b.init=d;var l={setOptions:function(a){Object.keys(a).forEach(function(b){this.setOption(b,a[b])},this)},getOptions:function(a){var b={};return a?Array.isArray(a)||(b=a,a=Object.keys(b)):a=Object.keys(this.$options),a.forEach(function(a){b[a]=this.getOption(a)},this),b},setOption:function(a,b){if(this["$"+a]!==b){var c=this.$options[a];if(!c)return void("undefined"!=typeof console&&console.warn&&console.warn('misspelled option "'+a+'"'));if(c.forwardTo)return this[c.forwardTo]&&this[c.forwardTo].setOption(a,b);c.handlesSet||(this["$"+a]=b),c&&c.set&&c.set.call(this,b)}},getOption:function(a){var b=this.$options[a];return b?b.forwardTo?this[b.forwardTo]&&this[b.forwardTo].getOption(a):b&&b.get?b.get.call(this):this["$"+a]:void("undefined"!=typeof console&&console.warn&&console.warn('misspelled option "'+a+'"'))}},m={};b.defineOptions=function(a,b,c){return a.$options||(m[b]=a.$options={}),Object.keys(c).forEach(function(b){var d=c[b];"string"==typeof d&&(d={forwardTo:d}),d.name||(d.name=b),a.$options[d.name]=d,"initialValue"in d&&(a["$"+d.name]=d.initialValue)}),g.implement(a,l),this},b.resetOptions=function(a){Object.keys(a.$options).forEach(function(b){var c=a.$options[b];"value"in c&&a.setOption(b,c.value)})},b.setDefaultValue=function(a,c,d){var e=m[a]||(m[a]={});e[c]&&(e.forwardTo?b.setDefaultValue(e.forwardTo,c,d):e[c].value=d)},b.setDefaultValues=function(a,c){Object.keys(c).forEach(function(d){b.setDefaultValue(a,d,c[d])})}}),define("ace/lib/net",["require","exports","module","ace/lib/dom"],function(a,b,c){var d=a("./dom");b.get=function(a,b){var c=new XMLHttpRequest;c.open("GET",a,!0),c.onreadystatechange=function(){4===c.readyState&&b(c.responseText)},c.send(null)},b.loadScript=function(a,b){var c=d.getDocumentHead(),e=document.createElement("script");e.src=a,c.appendChild(e),e.onload=e.onreadystatechange=function(a,c){!c&&e.readyState&&"loaded"!=e.readyState&&"complete"!=e.readyState||(e=e.onload=e.onreadystatechange=null,c||b())}},b.qualifyURL=function(a){var b=document.createElement("a");return b.href=a,b.href}}),define("ace/lib/event_emitter",["require","exports","module"],function(a,b,c){var d={},e=function(){this.propagationStopped=!0},f=function(){this.defaultPrevented=!0};d._emit=d._dispatchEvent=function(a,b){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var c=this._eventRegistry[a]||[],d=this._defaultHandlers[a];if(c.length||d){"object"==typeof b&&b||(b={}),b.type||(b.type=a),b.stopPropagation||(b.stopPropagation=e),b.preventDefault||(b.preventDefault=f),c=c.slice();for(var g=0;g=4352&&a<=4447||a>=4515&&a<=4519||a>=4602&&a<=4607||a>=9001&&a<=9002||a>=11904&&a<=11929||a>=11931&&a<=12019||a>=12032&&a<=12245||a>=12272&&a<=12283||a>=12288&&a<=12350||a>=12353&&a<=12438||a>=12441&&a<=12543||a>=12549&&a<=12589||a>=12593&&a<=12686||a>=12688&&a<=12730||a>=12736&&a<=12771||a>=12784&&a<=12830||a>=12832&&a<=12871||a>=12880&&a<=13054||a>=13056&&a<=19903||a>=19968&&a<=42124||a>=42128&&a<=42182||a>=43360&&a<=43388||a>=44032&&a<=55203||a>=55216&&a<=55238||a>=55243&&a<=55291||a>=63744&&a<=64255||a>=65040&&a<=65049||a>=65072&&a<=65106||a>=65108&&a<=65126||a>=65128&&a<=65131||a>=65281&&a<=65376||a>=65504&&a<=65510)}d.implement(this,g),this.setDocument=function(a){this.doc&&this.doc.removeListener("change",this.$onChange),this.doc=a,a.on("change",this.$onChange),this.bgTokenizer&&this.bgTokenizer.setDocument(this.getDocument()),this.resetCaches()},this.getDocument=function(){return this.doc},this.$resetRowCache=function(a){if(!a)return this.$docRowCache=[],void(this.$screenRowCache=[]);var b=this.$docRowCache.length,c=this.$getRowCacheIndex(this.$docRowCache,a)+1;b>c&&(this.$docRowCache.splice(c,b),this.$screenRowCache.splice(c,b))},this.$getRowCacheIndex=function(a,b){for(var c=0,d=a.length-1;c<=d;){var e=c+d>>1,f=a[e];if(b>f)c=e+1;else{if(!(b=b));f++);return(c=d[f])?(c.index=f,c.start=e-c.value.length,c):null},this.setUndoManager=function(a){if(this.$undoManager=a,this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel(),a){var b=this;this.$syncInformUndoManager=function(){b.$informUndoManager.cancel(),b.$deltasFold.length&&(b.$deltas.push({group:"fold",deltas:b.$deltasFold}),b.$deltasFold=[]),b.$deltasDoc.length&&(b.$deltas.push({group:"doc",deltas:b.$deltasDoc}),b.$deltasDoc=[]),b.$deltas.length>0&&a.execute({action:"aceupdate",args:[b.$deltas,b],merge:b.mergeUndoDeltas}),b.mergeUndoDeltas=!1,b.$deltas=[]},this.$informUndoManager=e.delayedCall(this.$syncInformUndoManager)}},this.markUndoGroup=function(){this.$syncInformUndoManager&&this.$syncInformUndoManager()},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?e.stringRepeat(" ",this.getTabSize()):"\t"},this.setUseSoftTabs=function(a){this.setOption("useSoftTabs",a)},this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs},this.setTabSize=function(a){this.setOption("tabSize",a)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(a){return this.$useSoftTabs&&a.column%this.$tabSize===0},this.$overwrite=!1,this.setOverwrite=function(a){this.setOption("overwrite",a)},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(a,b){this.$decorations[a]||(this.$decorations[a]=""),this.$decorations[a]+=" "+b,this._signal("changeBreakpoint",{})},this.removeGutterDecoration=function(a,b){this.$decorations[a]=(this.$decorations[a]||"").replace(" "+b,""),this._signal("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(a){this.$breakpoints=[];for(var b=0;b0&&(d=!!c.charAt(b-1).match(this.tokenRe)),d||(d=!!c.charAt(b).match(this.tokenRe)),d)var e=this.tokenRe;else if(/^\s+$/.test(c.slice(b-1,b+1)))var e=/\s/;else var e=this.nonTokenRe;var f=b;if(f>0){do f--;while(f>=0&&c.charAt(f).match(e));f++}for(var g=b;ga&&(a=b.screenWidth)}),this.lineWidgetWidth=a},this.$computeWidth=function(a){if(this.$modified||a){if(this.$modified=!1,this.$useWrapMode)return this.screenWidth=this.$wrapLimit;for(var b=this.doc.getAllLines(),c=this.$rowLengthCache,d=0,e=0,f=this.$foldData[e],g=f?f.start.row:1/0,h=b.length,i=0;ig){if(i=f.end.row+1,i>=h)break;f=this.$foldData[e++],g=f?f.start.row:1/0}null==c[i]&&(c[i]=this.$getStringScreenWidth(b[i])[0]),c[i]>d&&(d=c[i])}this.screenWidth=d}},this.getLine=function(a){return this.doc.getLine(a)},this.getLines=function(a,b){return this.doc.getLines(a,b)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(a){return this.doc.getTextRange(a||this.selection.getRange())},this.insert=function(a,b){return this.doc.insert(a,b)},this.remove=function(a){return this.doc.remove(a)},this.undoChanges=function(a,b){if(a.length){this.$fromUndo=!0;for(var c=null,d=a.length-1;d!=-1;d--){var e=a[d];"doc"==e.group?(this.doc.revertDeltas(e.deltas),c=this.$getUndoSelection(e.deltas,!0,c)):e.deltas.forEach(function(a){this.addFolds(a.folds)},this)}return this.$fromUndo=!1,c&&this.$undoSelect&&!b&&this.selection.setSelectionRange(c),c}},this.redoChanges=function(a,b){if(a.length){this.$fromUndo=!0;for(var c=null,d=0;da.end.column&&(f.start.column+=h),f.end.row==a.end.row&&f.end.column>a.end.column&&(f.end.column+=h)),g&&f.start.row>=a.end.row&&(f.start.row+=g,f.end.row+=g)}if(f.end=this.insert(f.start,d),e.length){var i=a.start,k=f.start,g=k.row-i.row,h=k.column-i.column;this.addFolds(e.map(function(a){return a=a.clone(),a.start.row==i.row&&(a.start.column+=h),a.end.row==i.row&&(a.end.column+=h),a.start.row+=g,a.end.row+=g,a}))}return f},this.indentRows=function(a,b,c){c=c.replace(/\t/g,this.getTabString());for(var d=a;d<=b;d++)this.insert({row:d,column:0},c)},this.outdentRows=function(a){for(var b=a.collapseRows(),c=new j(0,0,0,0),d=this.getTabSize(),e=b.start.row;e<=b.end.row;++e){var f=this.getLine(e);c.start.row=e,c.end.row=e;for(var g=0;g0){var d=this.getRowFoldEnd(b+c);if(d>this.doc.getLength()-1)return 0;var e=d-b}else{a=this.$clipRowToDocument(a),b=this.$clipRowToDocument(b);var e=b-a+1}var f=new j(a,0,b,Number.MAX_VALUE),g=this.getFoldsInRange(f).map(function(a){return a=a.clone(),a.start.row+=e,a.end.row+=e,a}),h=0==c?this.doc.getLines(a,b):this.doc.removeLines(a,b);return this.doc.insertLines(a+e,h),g.length&&this.addFolds(g),e},this.moveLinesUp=function(a,b){return this.$moveLines(a,b,-1)},this.moveLinesDown=function(a,b){return this.$moveLines(a,b,1)},this.duplicateLines=function(a,b){return this.$moveLines(a,b,0)},this.$clipRowToDocument=function(a){return Math.max(0,Math.min(a,this.doc.getLength()-1))},this.$clipColumnToRow=function(a,b){return b<0?0:Math.min(this.doc.getLine(a).length,b)},this.$clipPositionToDocument=function(a,b){if(b=Math.max(0,b),a<0)a=0,b=0;else{var c=this.doc.getLength();a>=c?(a=c-1,b=this.doc.getLine(c-1).length):b=Math.min(this.doc.getLine(a).length,b)}return{row:a,column:b}},this.$clipRangeToDocument=function(a){a.start.row<0?(a.start.row=0,a.start.column=0):a.start.column=this.$clipColumnToRow(a.start.row,a.start.column);var b=this.doc.getLength()-1;return a.end.row>b?(a.end.row=b,a.end.column=this.doc.getLine(b).length):a.end.column=this.$clipColumnToRow(a.end.row,a.end.column),a},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(a){if(a!=this.$useWrapMode){if(this.$useWrapMode=a,this.$modified=!0,this.$resetRowCache(0),a){var b=this.getLength();this.$wrapData=Array(b),this.$updateWrapData(0,b-1)}this._signal("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(a,b){this.$wrapLimitRange.min===a&&this.$wrapLimitRange.max===b||(this.$wrapLimitRange={min:a,max:b},this.$modified=!0,this._signal("changeWrapMode"))},this.adjustWrapLimit=function(a,b){var c=this.$wrapLimitRange;c.max<0&&(c={min:b,max:b});var d=this.$constrainWrapLimit(a,c.min,c.max);return d!=this.$wrapLimit&&d>1&&(this.$wrapLimit=d,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._signal("changeWrapLimit")),!0)},this.$constrainWrapLimit=function(a,b,c){return b&&(a=Math.max(b,a)),c&&(a=Math.min(c,a)),a},this.getWrapLimit=function(){return this.$wrapLimit},this.setWrapLimit=function(a){this.setWrapLimitRange(a,a)},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(a){var b,c=this.$useWrapMode,d=a.data.action,e=a.data.range.start.row,f=a.data.range.end.row,g=a.data.range.start,h=a.data.range.end,i=null;if(d.indexOf("Lines")!=-1?(f="insertLines"==d?e+a.data.lines.length:e,b=a.data.lines?a.data.lines.length:f-e):b=f-e,this.$updating=!0,0!=b)if(d.indexOf("remove")!=-1){this[c?"$wrapData":"$rowLengthCache"].splice(e,b);var j=this.$foldData;i=this.getFoldsInRange(a.data.range),this.removeFolds(i);var k=this.getFoldLine(h.row),l=0;if(k){k.addRemoveChars(h.row,h.column,g.column-h.column),k.shiftRow(-b);var m=this.getFoldLine(e);m&&m!==k&&(m.merge(k),k=m),l=j.indexOf(k)+1}for(l;l=h.row&&k.shiftRow(-b)}f=e}else{var n=Array(b);n.unshift(e,0);var o=c?this.$wrapData:this.$rowLengthCache;o.splice.apply(o,n);var j=this.$foldData,k=this.getFoldLine(e),l=0;if(k){var p=k.range.compareInside(g.row,g.column);0==p?(k=k.split(g.row,g.column),k.shiftRow(b),k.addRemoveChars(f,0,h.column-g.column)):p==-1&&(k.addRemoveChars(e,0,h.column-g.column),k.shiftRow(b)),l=j.indexOf(k)+1}for(l;l=e&&k.shiftRow(b)}}else{b=Math.abs(a.data.range.start.column-a.data.range.end.column),d.indexOf("remove")!=-1&&(i=this.getFoldsInRange(a.data.range),this.removeFolds(i),b=-b);var k=this.getFoldLine(e);k&&k.addRemoveChars(e,g.column,b)}return c&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),this.$updating=!1,c?this.$updateWrapData(e,f):this.$updateRowLengthCache(e,f),i},this.$updateRowLengthCache=function(a,b,c){this.$rowLengthCache[a]=null,this.$rowLengthCache[b]=null},this.$updateWrapData=function(a,b){var c,d,e=this.doc.getAllLines(),f=this.getTabSize(),g=this.$wrapData,h=this.$wrapLimit,i=a;for(b=Math.min(b,e.length-1);i<=b;)d=this.getFoldLine(i,d),d?(c=[],d.walk(function(a,b,d,f){var g;if(null!=a){g=this.$getDisplayTokens(a,c.length),g[0]=k;for(var h=1;hb;){var i=f+b;if(a[i-1]>=p&&a[i]>=p)c(i);else if(a[i]!=k&&a[i]!=n){for(var j=Math.max(i-(h?10:b-(b>>2)),f-1);i>j&&a[i]j&&a[i]j&&a[i]==o;)i--}else for(;i>j&&a[i]j?c(++i):(i=f+b,c(i))}else{for(i;i!=f-1&&a[i]!=k;i--);if(i>f){c(i);continue}for(i=f+b;i39&&i<48||i>57&&i<64?f.push(o):i>=4352&&b(i)?f.push(c,h):f.push(c)}return f},this.$getStringScreenWidth=function(a,c,d){if(0==c)return[0,0];null==c&&(c=1/0),d=d||0;var e,f;for(f=0;f=4352&&b(e)?2:1,!(d>c));f++);return[d,f]},this.lineWidgets=null,this.getRowLength=function(a){if(this.lineWidgets)var b=this.lineWidgets[a]&&this.lineWidgets[a].rowCount||0;else b=0;return this.$useWrapMode&&this.$wrapData[a]?this.$wrapData[a].length+1+b:1+b},this.getRowLineCount=function(a){return this.$useWrapMode&&this.$wrapData[a]?this.$wrapData[a].length+1:1},this.getScreenLastRowColumn=function(a){var b=this.screenToDocumentPosition(a,Number.MAX_VALUE);return this.documentToScreenColumn(b.row,b.column)},this.getDocumentLastRowColumn=function(a,b){var c=this.documentToScreenRow(a,b);return this.getScreenLastRowColumn(c)},this.getDocumentLastRowColumnPosition=function(a,b){var c=this.documentToScreenRow(a,b);return this.screenToDocumentPosition(c,Number.MAX_VALUE/10)},this.getRowSplitData=function(a){return this.$useWrapMode?this.$wrapData[a]:void 0},this.getScreenTabSize=function(a){return this.$tabSize-a%this.$tabSize},this.screenToDocumentRow=function(a,b){return this.screenToDocumentPosition(a,b).row},this.screenToDocumentColumn=function(a,b){return this.screenToDocumentPosition(a,b).column},this.screenToDocumentPosition=function(a,b){if(a<0)return{row:0,column:0};var c,d,e=0,f=0,g=0,h=0,i=this.$screenRowCache,j=this.$getRowCacheIndex(i,a),k=i.length;if(k&&j>=0)var g=i[j],e=this.$docRowCache[j],l=a>i[k-1];else var l=!k;for(var m=this.getLength()-1,n=this.getNextFoldLine(e),o=n?n.start.row:1/0;g<=a&&(h=this.getRowLength(e),!(g+h>a||e>=m));)g+=h,e++,e>o&&(e=n.end.row+1,n=this.getNextFoldLine(e,n),o=n?n.start.row:1/0),l&&(this.$docRowCache.push(e),this.$screenRowCache.push(g));if(n&&n.start.row<=e)c=this.getFoldDisplayLine(n),e=n.start.row;else{if(g+h<=a||e>m)return{row:m,column:this.getLine(m).length};c=this.getLine(e),n=null}if(this.$useWrapMode){var p=this.$wrapData[e];if(p){var q=Math.floor(a-g);d=p[q],q>0&&p.length&&(f=p[q-1]||p[p.length-1],c=c.substring(f))}}return f+=this.$getStringScreenWidth(c,b)[1],this.$useWrapMode&&f>=d&&(f=d-1),n?n.idxToPosition(f):{row:e,column:f}},this.documentToScreenPosition=function(a,b){if("undefined"==typeof b)var c=this.$clipPositionToDocument(a.row,a.column);else c=this.$clipPositionToDocument(a,b);a=c.row,b=c.column;var d=0,e=null,f=null;f=this.getFoldAt(a,b,1),f&&(a=f.start.row,b=f.start.column);var g,h=0,i=this.$docRowCache,j=this.$getRowCacheIndex(i,a),k=i.length;if(k&&j>=0)var h=i[j],d=this.$screenRowCache[j],l=a>i[k-1];else var l=!k;for(var m=this.getNextFoldLine(h),n=m?m.start.row:1/0;h=n){if(g=m.end.row+1,g>a)break;m=this.getNextFoldLine(g,m),n=m?m.start.row:1/0}else g=h+1;d+=this.getRowLength(h),h=g,l&&(this.$docRowCache.push(h),this.$screenRowCache.push(d))}var o="";if(m&&h>=n?(o=this.getFoldDisplayLine(m,a,b),e=m.start.row):(o=this.getLine(a).substring(0,b),e=a),this.$useWrapMode){var p=this.$wrapData[e];if(p){for(var q=0;o.length>=p[q];)d++,q++;o=o.substring(p[q-1]||0,o.length)}}return{row:d,column:this.$getStringScreenWidth(o)[0]}},this.documentToScreenColumn=function(a,b){return this.documentToScreenPosition(a,b).column},this.documentToScreenRow=function(a,b){return this.documentToScreenPosition(a,b).row},this.getScreenLength=function(){var a=0,b=null;if(this.$useWrapMode)for(var c=this.$wrapData.length,d=0,e=0,b=this.$foldData[e++],f=b?b.start.row:1/0;df&&(d=b.end.row+1,b=this.$foldData[e++],f=b?b.start.row:1/0)}else{a=this.getLength();for(var h=this.$foldData,e=0;eb.row||a.row==b.row&&a.column>b.column},this.getRange=function(){var a=this.anchor,b=this.lead;return this.isEmpty()?g.fromPoints(b,b):this.isBackwards()?g.fromPoints(b,a):g.fromPoints(a,b)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){var a=this.doc.getLength()-1;this.setSelectionAnchor(0,0),this.moveCursorTo(a,this.doc.getLine(a).length)},this.setRange=this.setSelectionRange=function(a,b){b?(this.setSelectionAnchor(a.end.row,a.end.column),this.selectTo(a.start.row,a.start.column)):(this.setSelectionAnchor(a.start.row,a.start.column),this.selectTo(a.end.row,a.end.column)),this.getRange().isEmpty()&&(this.$isEmpty=!0),this.$desiredColumn=null},this.$moveSelection=function(a){var b=this.lead;this.$isEmpty&&this.setSelectionAnchor(b.row,b.column),a.call(this)},this.selectTo=function(a,b){this.$moveSelection(function(){this.moveCursorTo(a,b)})},this.selectToPosition=function(a){this.$moveSelection(function(){this.moveCursorToPosition(a)})},this.moveTo=function(a,b){this.clearSelection(),this.moveCursorTo(a,b)},this.moveToPosition=function(a){this.clearSelection(),this.moveCursorToPosition(a)},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(a,b){if("undefined"==typeof b){var c=a||this.lead;a=c.row,b=c.column}return this.session.getWordRange(a,b)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var a=this.getCursor(),b=this.session.getAWordRange(a.row,a.column);this.setSelectionRange(b)},this.getLineRange=function(a,b){var c,d="number"==typeof a?a:this.lead.row,e=this.session.getFoldLine(d);return e?(d=e.start.row,c=e.end.row):c=d,b===!0?new g(d,0,c,this.session.getLine(c).length):new g(d,0,c+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.moveCursorLeft=function(){var a,b=this.lead.getPosition();if(a=this.session.getFoldAt(b.row,b.column,-1))this.moveCursorTo(a.start.row,a.start.column);else if(0==b.column)b.row>0&&this.moveCursorTo(b.row-1,this.doc.getLine(b.row-1).length);else{var c=this.session.getTabSize();this.session.isTabStop(b)&&this.doc.getLine(b.row).slice(b.column-c,b.column).split(" ").length-1==c?this.moveCursorBy(0,-c):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var a,b=this.lead.getPosition();if(a=this.session.getFoldAt(b.row,b.column,1))this.moveCursorTo(a.end.row,a.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row0&&(b.column=d)}}this.moveCursorTo(b.row,b.column)},this.moveCursorFileEnd=function(){var a=this.doc.getLength()-1,b=this.doc.getLine(a).length;this.moveCursorTo(a,b)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var a,b=this.lead.row,c=this.lead.column,d=this.doc.getLine(b),e=d.substring(c);this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var f=this.session.getFoldAt(b,c,1);return f?void this.moveCursorTo(f.end.row,f.end.column):((a=this.session.nonTokenRe.exec(e))&&(c+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,e=d.substring(c)),c>=d.length?(this.moveCursorTo(b,d.length),this.moveCursorRight(),void(b0&&this.moveCursorWordLeft())):((f=this.session.tokenRe.exec(g))&&(c-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0),void this.moveCursorTo(b,c))},this.$shortWordEndIndex=function(a){var b,c,d=0,e=/\s/,f=this.session.tokenRe;if(f.lastIndex=0,b=this.session.tokenRe.exec(a))d=this.session.tokenRe.lastIndex;else{for(;(c=a[d])&&e.test(c);)d++;if(d<1)for(f.lastIndex=0;(c=a[d])&&!f.test(c);)if(f.lastIndex=0,d++,e.test(c)){if(d>2){d--;break}for(;(c=a[d])&&e.test(c);)d++;if(d>2)break}}return f.lastIndex=0,d},this.moveCursorShortWordRight=function(){var a=this.lead.row,b=this.lead.column,c=this.doc.getLine(a),d=c.substring(b),e=this.session.getFoldAt(a,b,1);if(e)return this.moveCursorTo(e.end.row,e.end.column);if(b==c.length){var f=this.doc.getLength();do a++,d=this.doc.getLine(a);while(a0&&/^\s*$/.test(d));c=d.length,/\s+$/.test(d)||(d="")}var f=e.stringReverse(d),g=this.$shortWordEndIndex(f);return this.moveCursorTo(b,c-g)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(a,b){var c=this.session.documentToScreenPosition(this.lead.row,this.lead.column);0===b&&(this.$desiredColumn?c.column=this.$desiredColumn:this.$desiredColumn=c.column);var d=this.session.screenToDocumentPosition(c.row+a,c.column);0!==a&&0===b&&d.row===this.lead.row&&d.column===this.lead.column&&this.session.lineWidgets&&this.session.lineWidgets[d.row]&&d.row++,this.moveCursorTo(d.row,d.column+b,0===b)},this.moveCursorToPosition=function(a){this.moveCursorTo(a.row,a.column)},this.moveCursorTo=function(a,b,c){var d=this.session.getFoldAt(a,b,1);d&&(a=d.start.row,b=d.start.column),this.$keepDesiredColumnOnChange=!0,this.lead.setPosition(a,b),this.$keepDesiredColumnOnChange=!1,c||(this.$desiredColumn=null)},this.moveCursorToScreen=function(a,b,c){var d=this.session.screenToDocumentPosition(a,b);this.moveCursorTo(d.row,d.column,c)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(a){this.setSelectionRange(a,a.cursor==a.start),this.$desiredColumn=a.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(a){var b=this.getRange();return a?(a.start.column=b.start.column,a.start.row=b.start.row,a.end.column=b.end.column, -a.end.row=b.end.row):a=b,a.cursor=this.isBackwards()?a.start:a.end,a.desiredColumn=this.$desiredColumn,a},this.getRangeOfMovements=function(a){var b=this.getCursor();try{a.call(null,this);var c=this.getCursor();return g.fromPoints(b,c)}catch(d){return g.fromPoints(b,b)}finally{this.moveCursorToPosition(b)}},this.toJSON=function(){if(this.rangeCount)var a=this.ranges.map(function(a){var b=a.clone();return b.isBackwards=a.cursor==a.start,b});else{var a=this.getRange();a.isBackwards=this.isBackwards()}return a},this.fromJSON=function(a){if(void 0==a.start){if(this.rangeList){this.toSingleRange(a[0]);for(var b=a.length;b--;){var c=g.fromPoints(a[b].start,a[b].end);a.isBackwards&&(c.cursor=c.start),this.addRange(c,!0)}return}a=a[0]}this.rangeList&&this.toSingleRange(a),this.setSelectionRange(a,a.isBackwards)},this.isEqual=function(a){if((a.length||this.rangeCount)&&a.length!=this.rangeCount)return!1;if(!a.length||!this.ranges)return this.getRange().isEqual(a);for(var b=this.ranges.length;b--;)if(!this.ranges[b].isEqual(a[b]))return!1;return!0}}).call(h.prototype),b.Selection=h}),define("ace/range",["require","exports","module"],function(a,b,c){var d=function(a,b){return a.row-b.row||a.column-b.column},e=function(a,b,c,d){this.start={row:a,column:b},this.end={row:c,column:d}};(function(){this.isEqual=function(a){return this.start.row===a.start.row&&this.end.row===a.end.row&&this.start.column===a.start.column&&this.end.column===a.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(a,b){return 0==this.compare(a,b)},this.compareRange=function(a){var b,c=a.end,d=a.start;return b=this.compare(c.row,c.column),1==b?(b=this.compare(d.row,d.column),1==b?2:0==b?1:0):b==-1?-2:(b=this.compare(d.row,d.column),b==-1?-1:1==b?42:0)},this.comparePoint=function(a){return this.compare(a.row,a.column)},this.containsRange=function(a){return 0==this.comparePoint(a.start)&&0==this.comparePoint(a.end)},this.intersects=function(a){var b=this.compareRange(a);return b==-1||0==b||1==b},this.isEnd=function(a,b){return this.end.row==a&&this.end.column==b},this.isStart=function(a,b){return this.start.row==a&&this.start.column==b},this.setStart=function(a,b){"object"==typeof a?(this.start.column=a.column,this.start.row=a.row):(this.start.row=a,this.start.column=b)},this.setEnd=function(a,b){"object"==typeof a?(this.end.column=a.column,this.end.row=a.row):(this.end.row=a,this.end.column=b)},this.inside=function(a,b){return 0==this.compare(a,b)&&(!this.isEnd(a,b)&&!this.isStart(a,b))},this.insideStart=function(a,b){return 0==this.compare(a,b)&&!this.isEnd(a,b)},this.insideEnd=function(a,b){return 0==this.compare(a,b)&&!this.isStart(a,b)},this.compare=function(a,b){return this.isMultiLine()||a!==this.start.row?athis.end.row?1:this.start.row===a?b>=this.start.column?0:-1:this.end.row===a?b<=this.end.column?0:1:0:bthis.end.column?1:0},this.compareStart=function(a,b){return this.start.row==a&&this.start.column==b?-1:this.compare(a,b)},this.compareEnd=function(a,b){return this.end.row==a&&this.end.column==b?1:this.compare(a,b)},this.compareInside=function(a,b){return this.end.row==a&&this.end.column==b?1:this.start.row==a&&this.start.column==b?-1:this.compare(a,b)},this.clipRows=function(a,b){if(this.end.row>b)var c={row:b+1,column:0};else if(this.end.rowb)var d={row:b+1,column:0};else if(this.start.row2?d%k!=k-1:d%k==0}}else{if(!this.blockComment)return!1;var n=this.blockComment.start,t=this.blockComment.end,m=new RegExp("^(\\s*)(?:"+h.escapeRegExp(n)+")"),u=new RegExp("(?:"+h.escapeRegExp(t)+")\\s*$"),q=function(a,b){r(a,b)||g&&!/\S/.test(a)||(f.insertInLine({row:b,column:a.length},t),f.insertInLine({row:b,column:j},n))},o=function(a,b){var c;(c=a.match(u))&&f.removeInLine(b,a.length-c[0].length,a.length),(c=a.match(m))&&f.removeInLine(b,c[1].length,c[0].length)},r=function(a,c){if(m.test(a))return!0;for(var d=b.getTokens(c),e=0;ea.length&&(v=a.length)}),j==1/0&&(j=v,g=!1,i=!1),l&&j%k!=0&&(j=Math.floor(j/k)*k),e(i?o:q)},this.toggleBlockComment=function(a,b,c,d){var e=this.blockComment;if(e){!e.start&&e[0]&&(e=e[0]);var f,g,h=new i(b,d.row,d.column),k=h.getCurrentToken(),l=(b.selection,b.selection.toOrientedRange());if(k&&/comment/.test(k.type)){for(var m,n;k&&/comment/.test(k.type);){var o=k.value.indexOf(e.start);if(o!=-1){var p=h.getCurrentTokenRow(),q=h.getCurrentTokenColumn()+o;m=new j(p,q,p,q+e.start.length);break}k=h.stepBackward()}for(var h=new i(b,d.row,d.column),k=h.getCurrentToken();k&&/comment/.test(k.type);){var o=k.value.indexOf(e.end);if(o!=-1){var p=h.getCurrentTokenRow(),q=h.getCurrentTokenColumn()+o;n=new j(p,q,p,q+e.end.length);break}k=h.stepForward()}n&&b.remove(n),m&&(b.remove(m),f=m.start.row,g=-e.start.length)}else g=e.start.length,f=c.start.row,b.insert(c.end,e.end),b.insert(c.start,e.start);l.start.row==f&&(l.start.column+=g),l.end.row==f&&(l.end.column+=g),b.selection.fromOrientedRange(l)}},this.getNextLineIndent=function(a,b,c){return this.$getIndent(b)},this.checkOutdent=function(a,b,c){return!1},this.autoOutdent=function(a,b,c){},this.$getIndent=function(a){return a.match(/^\s*/)[0]},this.createWorker=function(a){return null},this.createModeDelegates=function(a){this.$embeds=[],this.$modes={};for(var b in a)a[b]&&(this.$embeds.push(b),this.$modes[b]=new a[b]);for(var c=["toggleBlockComment","toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction","getCompletions"],b=0;b1?j.onMatch=this.$applyToken:j.onMatch=j.token);l>1&&(/\\\d/.test(j.regex)?k=j.regex.replace(/\\([0-9]+)/g,function(a,b){return"\\"+(parseInt(b,10)+e+1)}):(l=1,k=this.removeCapturingGroups(j.regex)),j.splitRegex||"string"==typeof j.token||h.push(j)),f[e]=i,e+=l,d.push(k),j.onMatch||(j.onMatch=null)}}h.forEach(function(a){a.splitRegex=this.createSplitterRegexp(a.regex,g)},this),this.regExps[b]=new RegExp("("+d.join(")|(")+")|($)",g)}};(function(){this.$setMaxTokenCount=function(a){d=0|a},this.$applyToken=function(a){var b=this.splitRegex.exec(a).slice(1),c=this.token.apply(this,b);if("string"==typeof c)return[{type:c,value:a}];for(var d=[],e=0,f=c.length;ek){var q=a.substring(k,p-o.length);l.type==m?l.value+=q:(l.type&&j.push(l),l={type:m,value:q})}for(var r=0;rd){for(;k1&&c[0]!==e&&c.unshift(e),{tokens:j,state:c.length?c:e}}}).call(e.prototype),b.Tokenizer=e}),define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(a,b,c){var d=a("../lib/lang"),e=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(a,b){if(b)for(var c in a){for(var d=a[c],e=0;e=this.$rowTokens.length;){if(this.$row+=1,a||(a=this.$session.getLength()),this.$row>=a)return this.$row=a-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var a=this.$rowTokens,b=this.$tokenIndex,c=a[b].start;if(void 0!==c)return c;for(c=0;b>0;)b-=1,c+=a[b].value.length;return c}}).call(d.prototype),b.TokenIterator=d}),define("ace/document",["require","exports","module","ace/lib/oop","ace/lib/event_emitter","ace/range","ace/anchor"],function(a,b,c){var d=a("./lib/oop"),e=a("./lib/event_emitter").EventEmitter,f=a("./range").Range,g=a("./anchor").Anchor,h=function(a){this.$lines=[],0===a.length?this.$lines=[""]:Array.isArray(a)?this._insertLines(0,a):this.insert({row:0,column:0},a)};(function(){d.implement(this,e),this.setValue=function(a){var b=this.getLength();this.remove(new f(0,0,b,this.getLine(b-1).length)),this.insert({row:0,column:0},a)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(a,b){return new g(this,a,b)},0==="aaa".split(/a/).length?this.$split=function(a){return a.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(a){return a.split(/\r\n|\r|\n/)},this.$detectNewLine=function(a){var b=a.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=b?b[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(a){this.$newLineMode!==a&&(this.$newLineMode=a,this._signal("changeNewLineMode"))},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(a){return"\r\n"==a||"\r"==a||"\n"==a},this.getLine=function(a){return this.$lines[a]||""},this.getLines=function(a,b){return this.$lines.slice(a,b+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(a){if(a.start.row==a.end.row)return this.getLine(a.start.row).substring(a.start.column,a.end.column);var b=this.getLines(a.start.row,a.end.row);b[0]=(b[0]||"").substring(a.start.column);var c=b.length-1;return a.end.row-a.start.row==c&&(b[c]=b[c].substring(0,a.end.column)),b.join(this.getNewLineCharacter())},this.$clipPosition=function(a){var b=this.getLength();return a.row>=b?(a.row=Math.max(0,b-1),a.column=this.getLine(b-1).length):a.row<0&&(a.row=0),a},this.insert=function(a,b){if(!b||0===b.length)return a;a=this.$clipPosition(a),this.getLength()<=1&&this.$detectNewLine(b);var c=this.$split(b),d=c.splice(0,1)[0],e=0==c.length?null:c.splice(c.length-1,1)[0];return a=this.insertInLine(a,d),null!==e&&(a=this.insertNewLine(a),a=this._insertLines(a.row,c),a=this.insertInLine(a,e||"")),a},this.insertLines=function(a,b){return a>=this.getLength()?this.insert({row:a,column:0},"\n"+b.join("\n")):this._insertLines(Math.max(a,0),b)},this._insertLines=function(a,b){if(0==b.length)return{row:a,column:0};for(;b.length>61440;){var c=this._insertLines(a,b.slice(0,61440));b=b.slice(61440),a=c.row}var d=[a,0];d.push.apply(d,b),this.$lines.splice.apply(this.$lines,d);var e=new f(a,0,a+b.length,0),g={action:"insertLines",range:e,lines:b};return this._signal("change",{data:g}),e.end},this.insertNewLine=function(a){a=this.$clipPosition(a);var b=this.$lines[a.row]||"";this.$lines[a.row]=b.substring(0,a.column),this.$lines.splice(a.row+1,0,b.substring(a.column,b.length));var c={row:a.row+1,column:0},d={action:"insertText",range:f.fromPoints(a,c),text:this.getNewLineCharacter()};return this._signal("change",{data:d}),c},this.insertInLine=function(a,b){if(0==b.length)return a;var c=this.$lines[a.row]||"";this.$lines[a.row]=c.substring(0,a.column)+b+c.substring(a.column);var d={row:a.row,column:a.column+b.length},e={action:"insertText",range:f.fromPoints(a,d),text:b};return this._signal("change",{data:e}),d},this.remove=function(a){if(a instanceof f||(a=f.fromPoints(a.start,a.end)),a.start=this.$clipPosition(a.start),a.end=this.$clipPosition(a.end),a.isEmpty())return a.start;var b=a.start.row,c=a.end.row;if(a.isMultiLine()){var d=0==a.start.column?b:b+1,e=c-1;a.end.column>0&&this.removeInLine(c,0,a.end.column),e>=d&&this._removeLines(d,e),d!=b&&(this.removeInLine(b,a.start.column,this.getLine(b).length),this.removeNewLine(a.start.row))}else this.removeInLine(b,a.start.column,a.end.column);return a.start},this.removeInLine=function(a,b,c){if(b!=c){var d=new f(a,b,a,c),e=this.getLine(a),g=e.substring(b,c),h=e.substring(0,b)+e.substring(c,e.length);this.$lines.splice(a,1,h);var i={action:"removeText",range:d,text:g};return this._signal("change",{data:i}),d.start}},this.removeLines=function(a,b){return a<0||b>=this.getLength()?this.remove(new f(a,0,b+1,0)):this._removeLines(a,b)},this._removeLines=function(a,b){var c=new f(a,0,b+1,0),d=this.$lines.splice(a,b-a+1),e={action:"removeLines",range:c,nl:this.getNewLineCharacter(),lines:d};return this._signal("change",{data:e}),d},this.removeNewLine=function(a){var b=this.getLine(a),c=this.getLine(a+1),d=new f(a,b.length,a+1,0),e=b+c;this.$lines.splice(a,2,e);var g={action:"removeText",range:d,text:this.getNewLineCharacter()};this._signal("change",{data:g})},this.replace=function(a,b){if(a instanceof f||(a=f.fromPoints(a.start,a.end)),0==b.length&&a.isEmpty())return a.start;if(b==this.getTextRange(a))return a.end;if(this.remove(a),b)var c=this.insert(a.start,b);else c=a.start;return c},this.applyDeltas=function(a){for(var b=0;b=0;b--){var c=a[b],d=f.fromPoints(c.range.start,c.range.end);"insertLines"==c.action?this._removeLines(d.start.row,d.end.row-1):"insertText"==c.action?this.remove(d):"removeLines"==c.action?this._insertLines(d.start.row,c.lines):"removeText"==c.action&&this.insert(d.start,c.text)}},this.indexToPosition=function(a,b){for(var c=this.$lines||this.getAllLines(),d=this.getNewLineCharacter().length,e=b||0,f=c.length;ethis.row||c.start.row==this.row&&c.start.column>this.column)){var d=this.row,e=this.column,f=c.start,g=c.end;"insertText"===b.action?f.row===d&&f.column<=e?f.column===e&&this.$insertRight||(f.row===g.row?e+=g.column-f.column:(e-=f.column,d+=g.row-f.row)):f.row!==g.row&&f.row=e?f.column:Math.max(0,e-(g.column-f.column)):f.row!==g.row&&f.row=this.document.getLength()?(c.row=Math.max(0,this.document.getLength()-1),c.column=this.document.getLine(c.row).length):a<0?(c.row=0,c.column=0):(c.row=a,c.column=Math.min(this.document.getLine(c.row).length,Math.max(0,b))),b<0&&(c.column=0),c}}).call(f.prototype)}),define("ace/background_tokenizer",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(a,b,c){var d=a("./lib/oop"),e=a("./lib/event_emitter").EventEmitter,f=function(a,b){this.running=!1,this.lines=[],this.states=[],this.currentLine=0,this.tokenizer=a;var c=this;this.$worker=function(){if(c.running){for(var a=new Date,b=c.currentLine,d=-1,e=c.doc;c.lines[b];)b++;var f=b,g=e.getLength(),h=0;for(c.running=!1;b20)return c.running=setTimeout(c.$worker,20),void(c.currentLine=b)}c.currentLine=b,f<=d&&c.fireUpdateEvent(f,d)}}};(function(){d.implement(this,e),this.setTokenizer=function(a){this.tokenizer=a,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(a){this.doc=a,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(a,b){var c={first:a,last:b};this._signal("update",{data:c})},this.start=function(a){this.currentLine=Math.min(a||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.scheduleStart=function(){this.running||(this.running=setTimeout(this.$worker,700))},this.$updateOnChange=function(a){var b=a.range,c=b.start.row,d=b.end.row-c;if(0===d)this.lines[c]=null;else if("removeText"==a.action||"removeLines"==a.action)this.lines.splice(c,d+1,null),this.states.splice(c,d+1,null);else{var e=Array(d+1);e.unshift(c,1),this.lines.splice.apply(this.lines,e),this.states.splice.apply(this.states,e)}this.currentLine=Math.min(c,this.currentLine,this.doc.getLength()),this.stop()},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(a){return this.lines[a]||this.$tokenizeRow(a)},this.getState=function(a){return this.currentLine==a&&this.$tokenizeRow(a),this.states[a]||"start"},this.$tokenizeRow=function(a){var b=this.doc.getLine(a),c=this.states[a-1],d=this.tokenizer.getLineTokens(b,c,a);return this.states[a]+""!=d.state+""?(this.states[a]=d.state,this.lines[a+1]=null,this.currentLine>a+1&&(this.currentLine=a+1)):this.currentLine==a&&(this.currentLine=a+1),this.lines[a]=d.tokens}}).call(f.prototype),b.BackgroundTokenizer=f}),define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(a,b,c){var d=a("./lib/lang"),e=(a("./lib/oop"),a("./range").Range),f=function(a,b,c){this.setRegexp(a),this.clazz=b,this.type=c||"text"};(function(){this.MAX_RANGES=500,this.setRegexp=function(a){this.regExp+""!=a+""&&(this.regExp=a,this.cache=[])},this.update=function(a,b,c,f){if(this.regExp)for(var g=f.firstRow,h=f.lastRow,i=g;i<=h;i++){var j=this.cache[i];null==j&&(j=d.getMatchOffsets(c.getLine(i),this.regExp),j.length>this.MAX_RANGES&&(j=j.slice(0,this.MAX_RANGES)),j=j.map(function(a){return new e(i,a.offset,i,a.offset+a.length)}),this.cache[i]=j.length?j:"");for(var k=j.length;k--;)b.drawSingleLineMarker(a,j[k].toScreenRange(c),this.clazz,f)}}}).call(f.prototype),b.SearchHighlight=f}),define("ace/edit_session/folding",["require","exports","module","ace/range","ace/edit_session/fold_line","ace/edit_session/fold","ace/token_iterator"],function(a,b,c){function d(){this.getFoldAt=function(a,b,c){var d=this.getFoldLine(a);if(!d)return null;for(var e=d.folds,f=0;f=a)return e;if(e.end.row>a)return null}return null},this.getNextFoldLine=function(a,b){var c=this.$foldData,d=0;for(b&&(d=c.indexOf(b)),d==-1&&(d=0),d;d=a)return e}return null},this.getFoldedRowCount=function(a,b){for(var c=this.$foldData,d=b-a+1,e=0;e=b){h=a?d-=b-h:d=0);break}g>=a&&(d-=h>=a?g-h:g-a+1)}return d},this.$addFoldLine=function(a){return this.$foldData.push(a),this.$foldData.sort(function(a,b){return a.start.row-b.start.row}),a},this.addFold=function(a,b){var c,d=this.$foldData,e=!1;a instanceof g?c=a:(c=new g(b,a),c.collapseChildren=b.collapseChildren),this.$clipRangeToDocument(c.range);var h=c.start.row,i=c.start.column,j=c.end.row,k=c.end.column;if(!(h0&&(this.removeFolds(n),n.forEach(function(a){c.addSubFold(a)}));for(var o=0;o0&&this.foldAll(a.start.row+1,a.end.row,a.collapseChildren-1),a.subFolds=[]},this.expandFolds=function(a){a.forEach(function(a){this.expandFold(a)},this)},this.unfold=function(a,b){var c,d;if(null==a?(c=new e(0,0,this.getLength(),0),b=!0):c="number"==typeof a?new e(a,0,a,this.getLine(a).length):"row"in a?e.fromPoints(a,a):a,d=this.getFoldsInRangeList(c),b)this.removeFolds(d);else for(var f=d;f.length;)this.expandFolds(f),f=this.getFoldsInRangeList(c);if(d.length)return d},this.isRowFolded=function(a,b){return!!this.getFoldLine(a,b)},this.getRowFoldEnd=function(a,b){var c=this.getFoldLine(a,b);return c?c.end.row:a},this.getRowFoldStart=function(a,b){var c=this.getFoldLine(a,b);return c?c.start.row:a},this.getFoldDisplayLine=function(a,b,c,d,e){null==d&&(d=a.start.row,e=0),null==b&&(b=a.end.row,c=this.getLine(b).length);var f=this.doc,g="";return a.walk(function(a,b,c,h){if(!(b=a){e=f.end.row;try{var g=this.addFold("...",f);g&&(g.collapseChildren=c)}catch(h){}}}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(a){if(!this.$foldStyles[a])throw new Error("invalid fold style: "+a+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle!=a){this.$foldStyle=a,"manual"==a&&this.unfold();var b=this.$foldMode;this.$setFolding(null),this.$setFolding(b)}},this.$setFolding=function(a){if(this.$foldMode!=a){if(this.$foldMode=a,this.removeListener("change",this.$updateFoldWidgets),this._emit("changeAnnotation"),!a||"manual"==this.$foldStyle)return void(this.foldWidgets=null);this.foldWidgets=[],this.getFoldWidget=a.getFoldWidget.bind(a,this,this.$foldStyle),this.getFoldWidgetRange=a.getFoldWidgetRange.bind(a,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets)}},this.getParentFoldRangeData=function(a,b){var c=this.foldWidgets;if(!c||b&&c[a])return{};for(var d,e=a-1;e>=0;){var f=c[e];if(null==f&&(f=c[e]=this.getFoldWidget(e)),"start"==f){var g=this.getFoldWidgetRange(e);if(d||(d=g),g&&g.end.row>=a)break}e--}return{range:e!==-1&&g,firstRange:d}},this.onFoldWidgetClick=function(a,b){b=b.domEvent;var c={children:b.shiftKey,all:b.ctrlKey||b.metaKey,siblings:b.altKey},d=this.$toggleFoldWidget(a,c);if(!d){var e=b.target||b.srcElement;e&&/ace_fold-widget/.test(e.className)&&(e.className+=" ace_invalid")}},this.$toggleFoldWidget=function(a,b){if(this.getFoldWidget){var c=this.getFoldWidget(a),d=this.getLine(a),e="end"===c?-1:1,f=this.getFoldAt(a,e===-1?0:d.length,e);if(f)return void(b.children||b.all?this.removeFold(f):this.expandFold(f));var g=this.getFoldWidgetRange(a,!0);if(g&&!g.isMultiLine()&&(f=this.getFoldAt(g.start.row,g.start.column,1),f&&g.isEqual(f.range)))return void this.removeFold(f);if(b.siblings){var h=this.getParentFoldRangeData(a);if(h.range)var i=h.range.start.row+1,j=h.range.end.row;this.foldAll(i,j,b.all?1e4:0)}else b.children?(j=g?g.end.row:this.getLength(),this.foldAll(a+1,g.end.row,b.all?1e4:0)):g&&(b.all&&(g.collapseChildren=1e4),this.addFold("...",g));return g}},this.toggleFoldWidget=function(a){var b=this.selection.getCursor().row;b=this.getRowFoldStart(b);var c=this.$toggleFoldWidget(b,{});if(!c){var d=this.getParentFoldRangeData(b,!0); -if(c=d.range||d.firstRange){b=c.start.row;var e=this.getFoldAt(b,this.getLine(b).length,1);e?this.removeFold(e):this.addFold("...",c)}}},this.updateFoldWidgets=function(a){var b=a.data,c=b.range,d=c.start.row,e=c.end.row-d;if(0===e)this.foldWidgets[d]=null;else if("removeText"==b.action||"removeLines"==b.action)this.foldWidgets.splice(d,e+1,null);else{var f=Array(e+1);f.unshift(d,1),this.foldWidgets.splice.apply(this.foldWidgets,f)}}}var e=a("../range").Range,f=a("./fold_line").FoldLine,g=a("./fold").Fold,h=a("../token_iterator").TokenIterator;b.Folding=d}),define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(a,b,c){function d(a,b){this.foldData=a,Array.isArray(b)?this.folds=b:b=this.folds=[b];var c=b[b.length-1];this.range=new e(b[0].start.row,b[0].start.column,c.end.row,c.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(a){a.setFoldLine(this)},this)}var e=a("../range").Range;(function(){this.shiftRow=function(a){this.start.row+=a,this.end.row+=a,this.folds.forEach(function(b){b.start.row+=a,b.end.row+=a})},this.addFold=function(a){if(a.sameRow){if(a.start.rowthis.endRow)throw new Error("Can't add a fold to this FoldLine as it has no connection");this.folds.push(a),this.folds.sort(function(a,b){return-a.range.compareEnd(b.start.row,b.start.column)}),this.range.compareEnd(a.start.row,a.start.column)>0?(this.end.row=a.end.row,this.end.column=a.end.column):this.range.compareStart(a.end.row,a.end.column)<0&&(this.start.row=a.start.row,this.start.column=a.start.column)}else if(a.start.row==this.end.row)this.folds.push(a),this.end.row=a.end.row,this.end.column=a.end.column;else{if(a.end.row!=this.start.row)throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");this.folds.unshift(a),this.start.row=a.start.row,this.start.column=a.start.column}a.foldLine=this},this.containsRow=function(a){return a>=this.start.row&&a<=this.end.row},this.walk=function(a,b,c){var d,e,f,g=0,h=this.folds,i=!0;null==b&&(b=this.end.row,c=this.end.column);for(var j=0;j0)){var i=e(a,g.start);return 0===h?b&&0!==i?-f-2:f:i>0||0===i&&!b?f:-f-1}}return-f-1},this.add=function(a){var b=!a.isEmpty(),c=this.pointIndex(a.start,b);c<0&&(c=-c-1);var d=this.pointIndex(a.end,b,c);return d<0?d=-d-1:d++,this.ranges.splice(c,d-c,a)},this.addList=function(a){for(var b=[],c=a.length;c--;)b.push.call(b,this.add(a[c]));return b},this.substractPoint=function(a){var b=this.pointIndex(a);if(b>=0)return this.ranges.splice(b,1)},this.merge=function(){var a=[],b=this.ranges;b=b.sort(function(a,b){return e(a.start,b.start)});for(var c,d=b[0],f=1;f=0},this.containsPoint=function(a){return this.pointIndex(a)>=0},this.rangeAtPoint=function(a){var b=this.pointIndex(a);if(b>=0)return this.ranges[b]},this.clipRows=function(a,b){var c=this.ranges;if(c[0].start.row>b||c[c.length-1].start.rowe)break;if(l.start.row==e&&l.start.column>=c.column&&(l.start.column==c.column&&this.$insertRight||(l.start.column+=h,l.start.row+=g)),l.end.row==e&&l.end.column>=c.column){if(l.end.column==c.column&&this.$insertRight)continue;l.end.column==c.column&&h>0&&jl.start.column&&l.end.column==i[j+1].start.column&&(l.end.column-=h),l.end.column+=h,l.end.row+=g}}}if(0!=g&&j=0;){var k=j.charAt(i);if(k==d){if(f-=1,0==f)return{row:g.getCurrentTokenRow(),column:i+g.getCurrentTokenColumn()}}else k==a&&(f+=1);i-=1}do h=g.stepBackward();while(h&&!c.test(h.type));if(null==h)break;j=h.value,i=j.length-1}return null}},this.$findClosingBracket=function(a,b,c){var d=this.$brackets[a],f=1,g=new e(this,b.row,b.column),h=g.getCurrentToken();if(h||(h=g.stepForward()),h){c||(c=new RegExp("(\\.?"+h.type.replace(".","\\.").replace("lparen",".paren")+")+"));for(var i=b.column-g.getCurrentTokenColumn();;){for(var j=h.value,k=j.length;ip||(g.push(i=new f(l,p,l+j-1,q)),j>2&&(l=l+j-2))}}else for(var r=0;rv&&g[m].end.row==c.end.row;)m--;for(g=g.slice(r,m+1),r=0,m=g.length;r=0;h--)if(e(g[h],b,f))return!0};else var j=function(a,b,f){for(var g=d.getMatchOffsets(a,c),h=0;h=g;d--)if(c(a.getLine(d),d))return;if(0!=b.wrap)for(d=h,g=f.row;d>=g;d--)if(c(a.getLine(d),d))return}}:function(c){var d=f.row,e=a.getLine(d).substr(f.column);if(!c(e,d,f.column)){for(d+=1;d<=h;d++)if(c(a.getLine(d),d))return;if(0!=b.wrap)for(d=g,h=f.row;d<=h;d++)if(c(a.getLine(d),d))return}};return{forEach:i}}}).call(g.prototype),b.Search=g}),define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(a,b,c){var d=a("../lib/oop"),e=a("../keyboard/hash_handler").HashHandler,f=a("../lib/event_emitter").EventEmitter,g=function(a,b){e.call(this,b,a),this.byName=this.commands,this.setDefaultHandler("exec",function(a){return a.command.exec(a.editor,a.args||{})})};d.inherits(g,e),function(){d.implement(this,f),this.exec=function(a,b,c){if("string"==typeof a&&(a=this.commands[a]),!a)return!1;if(b&&b.$readOnly&&!a.readOnly)return!1;var d={editor:b,command:a,args:c},e=this._emit("exec",d);return this._signal("afterExec",d),e!==!1},this.toggleRecording=function(a){if(!this.$inReplay)return a&&a._emit("changeStatus"),this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(a){this.macro.push([a.command,a.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(a){if(!this.$inReplay&&this.macro){if(this.recording)return this.toggleRecording(a);try{this.$inReplay=!0,this.macro.forEach(function(b){"string"==typeof b?this.exec(b,a):this.exec(b[0],a,b[1])},this)}finally{this.$inReplay=!1}}},this.trimMacro=function(a){return a.map(function(a){return"string"!=typeof a[0]&&(a[0]=a[0].name),a[1]||(a=a[0]),a})}}.call(g.prototype),b.CommandManager=g}),define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(a,b,c){function d(a,b){if(this.platform=b||(f.isMac?"mac":"win"),this.commands={},this.commandKeyBinding={},this.__defineGetter__&&this.__defineSetter__&&"undefined"!=typeof console&&console.error){var c=!1,d=function(){c||(c=!0,console.error("commmandKeyBinding has too many m's. use commandKeyBinding"))};this.__defineGetter__("commmandKeyBinding",function(){return d(),this.commandKeyBinding}),this.__defineSetter__("commmandKeyBinding",function(a){return d(),this.commandKeyBinding=a})}else this.commmandKeyBinding=this.commandKeyBinding;this.addCommands(a)}var e=a("../lib/keys"),f=a("../lib/useragent");(function(){this.addCommand=function(a){this.commands[a.name]&&this.removeCommand(a),this.commands[a.name]=a,a.bindKey&&this._buildKeyHash(a)},this.removeCommand=function(a){var b="string"==typeof a?a:a.name;a=this.commands[b],delete this.commands[b];var c=this.commandKeyBinding;for(var d in c)for(var e in c[d])c[d][e]==a&&delete c[d][e]},this.bindKey=function(a,b){if(a){if("function"==typeof b)return void this.addCommand({exec:b,bindKey:a,name:b.name||a});var c=this.commandKeyBinding;a.split("|").forEach(function(a){var d=this.parseKeys(a,b),e=d.hashId;(c[e]||(c[e]={}))[d.key]=b},this)}},this.addCommands=function(a){a&&Object.keys(a).forEach(function(b){var c=a[b];if(c){if("string"==typeof c)return this.bindKey(c,b);"function"==typeof c&&(c={exec:c}),"object"==typeof c&&(c.name||(c.name=b),this.addCommand(c))}},this)},this.removeCommands=function(a){Object.keys(a).forEach(function(b){this.removeCommand(a[b])},this)},this.bindKeys=function(a){Object.keys(a).forEach(function(b){this.bindKey(b,a[b])},this)},this._buildKeyHash=function(a){var b=a.bindKey;if(b){var c="string"==typeof b?b:b[this.platform];this.bindKey(c,a)}},this.parseKeys=function(a){a.indexOf(" ")!=-1&&(a=a.split(/\s+/).pop());var b=a.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(a){return a}),c=b.pop(),d=e[c];if(e.FUNCTION_KEYS[d])c=e.FUNCTION_KEYS[d].toLowerCase();else{if(!b.length)return{key:c,hashId:-1};if(1==b.length&&"shift"==b[0])return{key:c.toUpperCase(),hashId:-1}}for(var f=0,g=b.length;g--;){var h=e.KEY_MODS[b[g]];if(null==h)return"undefined"!=typeof console&&console.error("invalid modifier "+b[g]+" in "+a),!1;f|=h}return{key:c,hashId:f}},this.findKeyCommand=function(a,b){var c=this.commandKeyBinding;return c[a]&&c[a][b]},this.handleKeyboard=function(a,b,c,d){return{command:this.findKeyCommand(b,c)}}}).call(d.prototype),b.HashHandler=d}),define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config"],function(a,b,c){function d(a,b){return{win:a,mac:b}}var e=a("../lib/lang"),f=a("../config");b.commands=[{name:"showSettingsMenu",bindKey:d("Ctrl-,","Command-,"),exec:function(a){f.loadModule("ace/ext/settings_menu",function(b){b.init(a),a.showSettingsMenu()})},readOnly:!0},{name:"goToNextError",bindKey:d("Alt-E","Ctrl-E"),exec:function(a){f.loadModule("ace/ext/error_marker",function(b){b.showErrorMarker(a,1)})},scrollIntoView:"animate",readOnly:!0},{name:"goToPreviousError",bindKey:d("Alt-Shift-E","Ctrl-Shift-E"),exec:function(a){f.loadModule("ace/ext/error_marker",function(b){b.showErrorMarker(a,-1)})},scrollIntoView:"animate",readOnly:!0},{name:"selectall",bindKey:d("Ctrl-A","Command-A"),exec:function(a){a.selectAll()},readOnly:!0},{name:"centerselection",bindKey:d(null,"Ctrl-L"),exec:function(a){a.centerSelection()},readOnly:!0},{name:"gotoline",bindKey:d("Ctrl-L","Command-L"),exec:function(a){var b=parseInt(prompt("Enter line number:"),10);isNaN(b)||a.gotoLine(b)},readOnly:!0},{name:"fold",bindKey:d("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(a){a.session.toggleFold(!1)},scrollIntoView:"center",readOnly:!0},{name:"unfold",bindKey:d("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(a){a.session.toggleFold(!0)},scrollIntoView:"center",readOnly:!0},{name:"toggleFoldWidget",bindKey:d("F2","F2"),exec:function(a){a.session.toggleFoldWidget()},scrollIntoView:"center",readOnly:!0},{name:"toggleParentFoldWidget",bindKey:d("Alt-F2","Alt-F2"),exec:function(a){a.session.toggleFoldWidget(!0)},scrollIntoView:"center",readOnly:!0},{name:"foldall",bindKey:d("Ctrl-Alt-0","Ctrl-Command-Option-0"),exec:function(a){a.session.foldAll()},scrollIntoView:"center",readOnly:!0},{name:"foldOther",bindKey:d("Alt-0","Command-Option-0"),exec:function(a){a.session.foldAll(),a.session.unfold(a.selection.getAllRanges())},scrollIntoView:"center",readOnly:!0},{name:"unfoldall",bindKey:d("Alt-Shift-0","Command-Option-Shift-0"),exec:function(a){a.session.unfold()},scrollIntoView:"center",readOnly:!0},{name:"findnext",bindKey:d("Ctrl-K","Command-G"),exec:function(a){a.findNext()},readOnly:!0},{name:"findprevious",bindKey:d("Ctrl-Shift-K","Command-Shift-G"),exec:function(a){a.findPrevious()},readOnly:!0},{name:"selectOrFindNext",bindKey:d("ALt-K","Ctrl-G"),exec:function(a){a.selection.isEmpty()?a.selection.selectWord():a.findNext()},readOnly:!0},{name:"selectOrFindPrevious",bindKey:d("Alt-Shift-K","Ctrl-Shift-G"),exec:function(a){a.selection.isEmpty()?a.selection.selectWord():a.findPrevious()},readOnly:!0},{name:"find",bindKey:d("Ctrl-F","Command-F"),exec:function(a){f.loadModule("ace/ext/searchbox",function(b){b.Search(a)})},readOnly:!0},{name:"overwrite",bindKey:"Insert",exec:function(a){a.toggleOverwrite()},readOnly:!0},{name:"selecttostart",bindKey:d("Ctrl-Shift-Home","Command-Shift-Up"),exec:function(a){a.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotostart",bindKey:d("Ctrl-Home","Command-Home|Command-Up"),exec:function(a){a.navigateFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectup",bindKey:d("Shift-Up","Shift-Up"),exec:function(a){a.getSelection().selectUp()},multiSelectAction:"forEach",readOnly:!0},{name:"golineup",bindKey:d("Up","Up|Ctrl-P"),exec:function(a,b){a.navigateUp(b.times)},multiSelectAction:"forEach",readOnly:!0},{name:"selecttoend",bindKey:d("Ctrl-Shift-End","Command-Shift-Down"),exec:function(a){a.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotoend",bindKey:d("Ctrl-End","Command-End|Command-Down"),exec:function(a){a.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectdown",bindKey:d("Shift-Down","Shift-Down"),exec:function(a){a.getSelection().selectDown()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golinedown",bindKey:d("Down","Down|Ctrl-N"),exec:function(a,b){a.navigateDown(b.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordleft",bindKey:d("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(a){a.getSelection().selectWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordleft",bindKey:d("Ctrl-Left","Option-Left"),exec:function(a){a.navigateWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolinestart",bindKey:d("Alt-Shift-Left","Command-Shift-Left"),exec:function(a){a.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolinestart",bindKey:d("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(a){a.navigateLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectleft",bindKey:d("Shift-Left","Shift-Left"),exec:function(a){a.getSelection().selectLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoleft",bindKey:d("Left","Left|Ctrl-B"),exec:function(a,b){a.navigateLeft(b.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordright",bindKey:d("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(a){a.getSelection().selectWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordright",bindKey:d("Ctrl-Right","Option-Right"),exec:function(a){a.navigateWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolineend",bindKey:d("Alt-Shift-Right","Command-Shift-Right"),exec:function(a){a.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolineend",bindKey:d("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(a){a.navigateLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectright",bindKey:d("Shift-Right","Shift-Right"),exec:function(a){a.getSelection().selectRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoright",bindKey:d("Right","Right|Ctrl-F"),exec:function(a,b){a.navigateRight(b.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectpagedown",bindKey:"Shift-PageDown",exec:function(a){a.selectPageDown()},readOnly:!0},{name:"pagedown",bindKey:d(null,"Option-PageDown"),exec:function(a){a.scrollPageDown()},readOnly:!0},{name:"gotopagedown",bindKey:d("PageDown","PageDown|Ctrl-V"),exec:function(a){a.gotoPageDown()},readOnly:!0},{name:"selectpageup",bindKey:"Shift-PageUp",exec:function(a){a.selectPageUp()},readOnly:!0},{name:"pageup",bindKey:d(null,"Option-PageUp"),exec:function(a){a.scrollPageUp()},readOnly:!0},{name:"gotopageup",bindKey:"PageUp",exec:function(a){a.gotoPageUp()},readOnly:!0},{name:"scrollup",bindKey:d("Ctrl-Up",null),exec:function(a){a.renderer.scrollBy(0,-2*a.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"scrolldown",bindKey:d("Ctrl-Down",null),exec:function(a){a.renderer.scrollBy(0,2*a.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"selectlinestart",bindKey:"Shift-Home",exec:function(a){a.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectlineend",bindKey:"Shift-End",exec:function(a){a.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"togglerecording",bindKey:d("Ctrl-Alt-E","Command-Option-E"),exec:function(a){a.commands.toggleRecording(a)},readOnly:!0},{name:"replaymacro",bindKey:d("Ctrl-Shift-E","Command-Shift-E"),exec:function(a){a.commands.replay(a)},readOnly:!0},{name:"jumptomatching",bindKey:d("Ctrl-P","Ctrl-Shift-P"),exec:function(a){a.jumpToMatching()},multiSelectAction:"forEach",readOnly:!0},{name:"selecttomatching",bindKey:d("Ctrl-Shift-P",null),exec:function(a){a.jumpToMatching(!0)},multiSelectAction:"forEach",readOnly:!0},{name:"cut",exec:function(a){var b=a.getSelectionRange();a._emit("cut",b),a.selection.isEmpty()||(a.session.remove(b),a.clearSelection())},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"removeline",bindKey:d("Ctrl-D","Command-D"),exec:function(a){a.removeLines()},scrollIntoView:"cursor",multiSelectAction:"forEachLine"},{name:"duplicateSelection",bindKey:d("Ctrl-Shift-D","Command-Shift-D"),exec:function(a){a.duplicateSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"sortlines",bindKey:d("Ctrl-Alt-S","Command-Alt-S"),exec:function(a){a.sortLines()},scrollIntoView:"selection",multiSelectAction:"forEachLine"},{name:"togglecomment",bindKey:d("Ctrl-/","Command-/"),exec:function(a){a.toggleCommentLines()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"toggleBlockComment",bindKey:d("Ctrl-Shift-/","Command-Shift-/"),exec:function(a){a.toggleBlockComment()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"modifyNumberUp",bindKey:d("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(a){a.modifyNumber(1)},multiSelectAction:"forEach"},{name:"modifyNumberDown",bindKey:d("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(a){a.modifyNumber(-1)},multiSelectAction:"forEach"},{name:"replace",bindKey:d("Ctrl-H","Command-Option-F"),exec:function(a){f.loadModule("ace/ext/searchbox",function(b){b.Search(a,!0)})}},{name:"undo",bindKey:d("Ctrl-Z","Command-Z"),exec:function(a){a.undo()}},{name:"redo",bindKey:d("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(a){a.redo()}},{name:"copylinesup",bindKey:d("Alt-Shift-Up","Command-Option-Up"),exec:function(a){a.copyLinesUp()},scrollIntoView:"cursor"},{name:"movelinesup",bindKey:d("Alt-Up","Option-Up"),exec:function(a){a.moveLinesUp()},scrollIntoView:"cursor"},{name:"copylinesdown",bindKey:d("Alt-Shift-Down","Command-Option-Down"),exec:function(a){a.copyLinesDown()},scrollIntoView:"cursor"},{name:"movelinesdown",bindKey:d("Alt-Down","Option-Down"),exec:function(a){a.moveLinesDown()},scrollIntoView:"cursor"},{name:"del",bindKey:d("Delete","Delete|Ctrl-D|Shift-Delete"),exec:function(a){a.remove("right")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"backspace",bindKey:d("Shift-Backspace|Backspace","Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(a){a.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"cut_or_delete",bindKey:d("Shift-Delete",null),exec:function(a){return!!a.selection.isEmpty()&&void a.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestart",bindKey:d("Alt-Backspace","Command-Backspace"),exec:function(a){a.removeToLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineend",bindKey:d("Alt-Delete","Ctrl-K"),exec:function(a){a.removeToLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordleft",bindKey:d("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(a){a.removeWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordright",bindKey:d("Ctrl-Delete","Alt-Delete"),exec:function(a){a.removeWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"outdent",bindKey:d("Shift-Tab","Shift-Tab"),exec:function(a){a.blockOutdent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"indent",bindKey:d("Tab","Tab"),exec:function(a){a.indent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"blockoutdent",bindKey:d("Ctrl-[","Ctrl-["),exec:function(a){a.blockOutdent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"blockindent",bindKey:d("Ctrl-]","Ctrl-]"),exec:function(a){a.blockIndent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"insertstring",exec:function(a,b){a.insert(b)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"inserttext",exec:function(a,b){a.insert(e.stringRepeat(b.text||"",b.times||1))},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"splitline",bindKey:d(null,"Ctrl-O"),exec:function(a){a.splitLine()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"transposeletters",bindKey:d("Ctrl-T","Ctrl-T"),exec:function(a){a.transposeLetters()},multiSelectAction:function(a){a.transposeSelections(1)},scrollIntoView:"cursor"},{name:"touppercase",bindKey:d("Ctrl-U","Ctrl-U"),exec:function(a){a.toUpperCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"tolowercase",bindKey:d("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(a){a.toLowerCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"}]}),define("ace/undomanager",["require","exports","module"],function(a,b,c){var d=function(){this.reset()};(function(){this.execute=function(a){var b=a.args[0];this.$doc=a.args[1],a.merge&&this.hasUndo()&&(this.dirtyCounter--,b=this.$undoStack.pop().concat(b)),this.$undoStack.push(b),this.$redoStack=[],this.dirtyCounter<0&&(this.dirtyCounter=NaN),this.dirtyCounter++},this.undo=function(a){var b=this.$undoStack.pop(),c=null;return b&&(c=this.$doc.undoChanges(b,a),this.$redoStack.push(b),this.dirtyCounter--),c},this.redo=function(a){var b=this.$redoStack.pop(),c=null;return b&&(c=this.$doc.redoChanges(b,a),this.$undoStack.push(b),this.dirtyCounter++),c},this.reset=function(){this.$undoStack=[],this.$redoStack=[],this.dirtyCounter=0},this.hasUndo=function(){return this.$undoStack.length>0},this.hasRedo=function(){return this.$redoStack.length>0},this.markClean=function(){this.dirtyCounter=0},this.isClean=function(){return 0===this.dirtyCounter}}).call(d.prototype),b.UndoManager=d}),define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/lib/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"],function(a,b,c){ -var d=a("./lib/oop"),e=a("./lib/dom"),f=a("./config"),g=a("./lib/useragent"),h=a("./layer/gutter").Gutter,i=a("./layer/marker").Marker,j=a("./layer/text").Text,k=a("./layer/cursor").Cursor,l=a("./scrollbar").HScrollBar,m=a("./scrollbar").VScrollBar,n=a("./renderloop").RenderLoop,o=a("./layer/font_metrics").FontMetrics,p=a("./lib/event_emitter").EventEmitter,q='.ace_editor {position: relative;overflow: hidden;font-family: \'Lato\', \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;font-size: 12px;line-height: normal;direction: ltr;}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;}.ace_content {position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: text;min-width: 100%;}.ace_dragging, .ace_dragging * {cursor: move !important;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \'\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");}.ace_scrollbar {position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;text-indent: -1em;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;}.ace_text-input.ace_composition {background: #f8f8f8;color: #111;z-index: 1000;opacity: 1;text-indent: 0;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;white-space: pre;height: 100%;width: 100%;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;/* setting pointer-events: auto; on node under the mouse, which changesduring scroll, will break mouse wheel scrolling in Safari */pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;}.ace_text-layer {font: inherit !important;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;border-left: 2px solid}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0px;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {-moz-transition: opacity 0.18s;-webkit-transition: opacity 0.18s;-o-transition: opacity 0.18s;-ms-transition: opacity 0.18s;transition: opacity 0.18s;}.ace_editor.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}.ace_line .ace_fold {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;-moz-border-radius: 2px;-webkit-border-radius: 2px;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");}.ace_tooltip {background-color: #FFF;background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;display: block;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block; }.ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");}.ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}/*** Dark version for fold widgets*/.ace_dark .ace_fold-widget {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");}.ace_dark .ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {-moz-transition: opacity 0.4s ease 0.05s;-webkit-transition: opacity 0.4s ease 0.05s;-o-transition: opacity 0.4s ease 0.05s;-ms-transition: opacity 0.4s ease 0.05s;transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {-moz-transition: opacity 0.05s ease 0.05s;-webkit-transition: opacity 0.05s ease 0.05s;-o-transition: opacity 0.05s ease 0.05s;-ms-transition: opacity 0.05s ease 0.05s;transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}';e.importCssString(q,"ace_editor");var r=function(a,b){var c=this;this.container=a||e.createElement("div"),this.$keepTextAreaAtCursor=!g.isOldIE,e.addCssClass(this.container,"ace_editor"),this.setTheme(b),this.$gutter=e.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.scroller=e.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=e.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new h(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new i(this.content);var d=this.$textLayer=new j(this.content);this.canvas=d.element,this.$markerFront=new i(this.content),this.$cursorLayer=new k(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new m(this.container,this),this.scrollBarH=new l(this.container,this),this.scrollBarV.addEventListener("scroll",function(a){c.$scrollAnimation||c.session.setScrollTop(a.data-c.scrollMargin.top)}),this.scrollBarH.addEventListener("scroll",function(a){c.$scrollAnimation||c.session.setScrollLeft(a.data-c.scrollMargin.left)}),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new o(this.container,500),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener("changeCharacterSize",function(a){c.updateCharacterSize(),c.onResize(!0,c.gutterWidth,c.$size.width,c.$size.height),c._signal("changeCharacterSize",a)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$loop=new n(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),f.resetOptions(this),f._emit("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,d.implement(this,p),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin()},this.setSession=function(a){this.session&&this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode),this.session=a,a&&(this.scrollMargin.top&&a.getScrollTop()<=0&&a.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(a),this.$markerBack.setSession(a),this.$markerFront.setSession(a),this.$gutterLayer.setSession(a),this.$textLayer.setSession(a),this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode))},this.updateLines=function(a,b){void 0===b&&(b=1/0),this.$changedLines?(this.$changedLines.firstRow>a&&(this.$changedLines.firstRow=a),this.$changedLines.lastRowthis.layerConfig.lastRow||this.$changedLines.lastRow2)){this.resizing>0?this.resizing++:this.resizing=a?1:0;var e=this.container;d||(d=e.clientHeight||e.scrollHeight),c||(c=e.clientWidth||e.scrollWidth);var f=this.$updateCachedSize(a,b,c,d);if(!this.$size.scrollerHeight||!c&&!d)return this.resizing=0;a&&(this.$gutterLayer.$padding=null),a?this.$renderChanges(f|this.$changes,!0):this.$loop.schedule(f|this.$changes),this.resizing&&(this.resizing=0)}},this.$updateCachedSize=function(a,b,c,d){d-=this.$extraHeight||0;var e=0,f=this.$size,g={width:f.width,height:f.height,scrollerHeight:f.scrollerHeight,scrollerWidth:f.scrollerWidth};return d&&(a||f.height!=d)&&(f.height=d,e|=this.CHANGE_SIZE,f.scrollerHeight=f.height,this.$horizScroll&&(f.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px",e|=this.CHANGE_SCROLL),c&&(a||f.width!=c)&&(e|=this.CHANGE_SIZE,f.width=c,null==b&&(b=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=b,this.scrollBarH.element.style.left=this.scroller.style.left=b+"px",f.scrollerWidth=Math.max(0,c-b-this.scrollBarV.getWidth()),this.scrollBarH.element.style.right=this.scroller.style.right=this.scrollBarV.getWidth()+"px",this.scroller.style.bottom=this.scrollBarH.getHeight()+"px",(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||a)&&(e|=this.CHANGE_FULL)),f.$dirty=!c||!d,e&&this._signal("resize",g),e},this.onGutterResize=function(){var a=this.$showGutter?this.$gutter.offsetWidth:0;a!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,a,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()?this.$loop.schedule(this.CHANGE_FULL):this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):(this.$computeLayerConfig(),this.$loop.schedule(this.CHANGE_MARKER))},this.adjustWrapLimit=function(){var a=this.$size.scrollerWidth-2*this.$padding,b=Math.floor(a/this.characterWidth);return this.session.adjustWrapLimit(b,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(a){this.setOption("animatedScroll",a)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(a){this.setOption("showInvisibles",a)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(a){this.setOption("displayIndentGuides",a)},this.setShowPrintMargin=function(a){this.setOption("showPrintMargin",a)},this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(a){this.setOption("printMarginColumn",a)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(a){return this.setOption("showGutter",a)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(a){this.setOption("fadeFoldWidgets",a)},this.setHighlightGutterLine=function(a){this.setOption("highlightGutterLine",a)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updateGutterLineHighlight=function(){var a=this.$cursorLayer.$pixelPos,b=this.layerConfig.lineHeight;if(this.session.getUseWrapMode()){var c=this.session.selection.getCursor();c.column=0,a=this.$cursorLayer.getPixelPosition(c,!0),b*=this.session.getRowLength(c.row)}this.$gutterLineHighlight.style.top=a.top-this.layerConfig.offset+"px",this.$gutterLineHighlight.style.height=b+"px"},this.$updatePrintMargin=function(){if(this.$showPrintMargin||this.$printMarginEl){if(!this.$printMarginEl){var a=e.createElement("div");a.className="ace_layer ace_print-margin-layer",this.$printMarginEl=e.createElement("div"),this.$printMarginEl.className="ace_print-margin",a.appendChild(this.$printMarginEl),this.content.insertBefore(a,this.content.firstChild)}var b=this.$printMarginEl.style;b.left=this.characterWidth*this.$printMarginColumn+this.$padding+"px",b.visibility=this.$showPrintMargin?"visible":"hidden",this.session&&this.session.$wrap==-1&&this.adjustWrapLimit()}},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.content},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(this.$keepTextAreaAtCursor){var a=this.layerConfig,b=this.$cursorLayer.$pixelPos.top,c=this.$cursorLayer.$pixelPos.left;b-=a.offset;var d=this.lineHeight;if(!(b<0||b>a.height-d)){var e=this.characterWidth;if(this.$composition){var f=this.textarea.value.replace(/^\x01+/,"");e*=this.session.$getStringScreenWidth(f)[0]+2,d+=2,b-=1}c-=this.scrollLeft,c>this.$size.scrollerWidth-e&&(c=this.$size.scrollerWidth-e),c-=this.scrollBar.width,this.textarea.style.height=d+"px",this.textarea.style.width=e+"px",this.textarea.style.right=Math.max(0,this.$size.scrollerWidth-c-e)+"px",this.textarea.style.bottom=Math.max(0,this.$size.height-b-d)+"px"}}},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(0===this.layerConfig.offset?0:1)},this.getLastFullyVisibleRow=function(){var a=Math.floor((this.layerConfig.height+this.layerConfig.offset)/this.layerConfig.lineHeight);return this.layerConfig.firstRow-1+a},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(a){this.$padding=a,this.$textLayer.setPadding(a),this.$cursorLayer.setPadding(a),this.$markerFront.setPadding(a),this.$markerBack.setPadding(a),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(a,b,c,d){var e=this.scrollMargin;e.top=0|a,e.bottom=0|b,e.right=0|d,e.left=0|c,e.v=e.top+e.bottom,e.h=e.left+e.right,e.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-e.top),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(a){this.setOption("hScrollBarAlwaysVisible",a)},this.getVScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(a){this.setOption("vScrollBarAlwaysVisible",a)},this.$updateScrollBarV=function(){this.scrollBarV.setScrollHeight(this.layerConfig.maxHeight+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(a,b){if(this.$changes&&(a|=this.$changes,this.$changes=0),!this.session||!this.container.offsetWidth||this.$frozen||!a&&!b)return void(this.$changes|=a);if(this.$size.$dirty)return this.$changes|=a,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal("beforeRender");var c=this.layerConfig;return(a&this.CHANGE_FULL||a&this.CHANGE_SIZE||a&this.CHANGE_TEXT||a&this.CHANGE_LINES||a&this.CHANGE_SCROLL||a&this.CHANGE_H_SCROLL)&&(a|=this.$computeLayerConfig(),c=this.layerConfig,this.$updateScrollBarV(),a&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),this.$gutterLayer.element.style.marginTop=-c.offset+"px",this.content.style.marginTop=-c.offset+"px",this.content.style.width=c.width+2*this.$padding+"px",this.content.style.height=c.minHeight+"px"),a&this.CHANGE_H_SCROLL&&(this.content.style.marginLeft=-this.scrollLeft+"px",this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left"),a&this.CHANGE_FULL?(this.$textLayer.update(c),this.$showGutter&&this.$gutterLayer.update(c),this.$markerBack.update(c),this.$markerFront.update(c),this.$cursorLayer.update(c),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),void this._signal("afterRender")):a&this.CHANGE_SCROLL?(a&this.CHANGE_TEXT||a&this.CHANGE_LINES?this.$textLayer.update(c):this.$textLayer.scrollLines(c),this.$showGutter&&this.$gutterLayer.update(c),this.$markerBack.update(c),this.$markerFront.update(c),this.$cursorLayer.update(c),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this.$moveTextAreaToCursor(),void this._signal("afterRender")):(a&this.CHANGE_TEXT?(this.$textLayer.update(c),this.$showGutter&&this.$gutterLayer.update(c)):a&this.CHANGE_LINES?(this.$updateLines()||a&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(c):(a&this.CHANGE_TEXT||a&this.CHANGE_GUTTER)&&this.$showGutter&&this.$gutterLayer.update(c),a&this.CHANGE_CURSOR&&(this.$cursorLayer.update(c),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight()),a&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(c),a&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(c),void this._signal("afterRender"))},this.$autosize=function(){var a=this.session.getScreenLength()*this.lineHeight,b=this.$maxLines*this.lineHeight,c=Math.max((this.$minLines||1)*this.lineHeight,Math.min(b,a))+this.scrollMargin.v+(this.$extraHeight||0),d=a>b;if(c!=this.desiredHeight||this.$size.height!=this.desiredHeight||d!=this.$vScroll){d!=this.$vScroll&&(this.$vScroll=d,this.scrollBarV.setVisible(d));var e=this.container.clientWidth;this.container.style.height=c+"px",this.$updateCachedSize(!0,this.$gutterWidth,e,c),this.desiredHeight=c}},this.$computeLayerConfig=function(){this.$maxLines&&this.lineHeight>1&&this.$autosize();var a=this.session,b=this.$size,c=b.height<=2*this.lineHeight,d=this.session.getScreenLength(),e=d*this.lineHeight,f=this.scrollTop%this.lineHeight,g=b.scrollerHeight+this.lineHeight,h=this.$getLongestLine(),i=!c&&(this.$hScrollBarAlwaysVisible||b.scrollerWidth-h-2*this.$padding<0),j=this.$horizScroll!==i;j&&(this.$horizScroll=i,this.scrollBarH.setVisible(i)),!this.$maxLines&&this.$scrollPastEnd&&this.scrollTop>e-b.scrollerHeight&&(e+=Math.min((b.scrollerHeight-this.lineHeight)*this.$scrollPastEnd,this.scrollTop-e+b.scrollerHeight));var k=!c&&(this.$vScrollBarAlwaysVisible||b.scrollerHeight-e<0),l=this.$vScroll!==k;l&&(this.$vScroll=k,this.scrollBarV.setVisible(k)),this.session.setScrollTop(Math.max(-this.scrollMargin.top,Math.min(this.scrollTop,e-b.scrollerHeight+this.scrollMargin.bottom))),this.session.setScrollLeft(Math.max(-this.scrollMargin.left,Math.min(this.scrollLeft,h+2*this.$padding-b.scrollerWidth+this.scrollMargin.right)));var m,n,o=Math.ceil(g/this.lineHeight)-1,p=Math.max(0,Math.round((this.scrollTop-f)/this.lineHeight)),q=p+o,r=this.lineHeight;p=a.screenToDocumentRow(p,0);var s=a.getFoldLine(p);s&&(p=s.start.row),m=a.documentToScreenRow(p,0),n=a.getRowLength(p)*r,q=Math.min(a.screenToDocumentRow(q,0),a.getLength()-1),g=b.scrollerHeight+a.getRowLength(q)*r+n,f=this.scrollTop-m*r;var t=0;return this.layerConfig.width!=h&&(t=this.CHANGE_H_SCROLL),(j||l)&&(t=this.$updateCachedSize(!0,this.gutterWidth,b.width,b.height),this._signal("scrollbarVisibilityChanged"),l&&(h=this.$getLongestLine())),this.layerConfig={width:h,padding:this.$padding,firstRow:p,firstRowScreen:m,lastRow:q,lineHeight:r,characterWidth:this.characterWidth,minHeight:g,maxHeight:e,offset:f,gutterOffset:Math.max(0,Math.ceil((f+b.height-b.scrollerHeight)/r)),height:this.$size.scrollerHeight},t},this.$updateLines=function(){var a=this.$changedLines.firstRow,b=this.$changedLines.lastRow;this.$changedLines=null;var c=this.layerConfig;if(!(a>c.lastRow+1||bf?(b&&(f-=b*this.$size.scrollerHeight),0===f&&(f=-this.scrollMargin.top),this.session.setScrollTop(f)):i+this.$size.scrollerHeight-he?(e=1-this.scrollMargin.top||(b>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight-(this.$size.scrollerHeight-this.lineHeight)*this.$scrollPastEnd<-1+this.scrollMargin.bottom||(a<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left||(a>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right||void 0)))},this.pixelToScreenCoordinates=function(a,b){var c=this.scroller.getBoundingClientRect(),d=(a+this.scrollLeft-c.left-this.$padding)/this.characterWidth,e=Math.floor((b+this.scrollTop-c.top)/this.lineHeight),f=Math.round(d);return{row:e,column:f,side:d-f>0?1:-1}},this.screenToTextCoordinates=function(a,b){var c=this.scroller.getBoundingClientRect(),d=Math.round((a+this.scrollLeft-c.left-this.$padding)/this.characterWidth),e=(b+this.scrollTop-c.top)/this.lineHeight;return this.session.screenToDocumentPosition(e,Math.max(d,0))},this.textToScreenCoordinates=function(a,b){var c=this.scroller.getBoundingClientRect(),d=this.session.documentToScreenPosition(a,b),e=this.$padding+Math.round(d.column*this.characterWidth),f=d.row*this.lineHeight;return{pageX:c.left+e-this.scrollLeft,pageY:c.top+f-this.scrollTop}},this.visualizeFocus=function(){e.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){e.removeCssClass(this.container,"ace_focus")},this.showComposition=function(a){this.$composition||(this.$composition={keepTextAreaAtCursor:this.$keepTextAreaAtCursor,cssText:this.textarea.style.cssText}),this.$keepTextAreaAtCursor=!0,e.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor()},this.setCompositionText=function(a){this.$moveTextAreaToCursor()},this.hideComposition=function(){this.$composition&&(e.removeCssClass(this.textarea,"ace_composition"),this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor,this.textarea.style.cssText=this.$composition.cssText,this.$composition=null)},this.setTheme=function(a,b){function c(c){if(d.$themeId!=a)return b&&b();if(c.cssClass){e.importCssString(c.cssText,c.cssClass,d.container.ownerDocument),d.theme&&e.removeCssClass(d.container,d.theme.cssClass);var f="padding"in c?c.padding:"padding"in(d.theme||{})?4:d.$padding;d.$padding&&f!=d.$padding&&d.setPadding(f),d.$theme=c.cssClass,d.theme=c,e.addCssClass(d.container,c.cssClass),e.setCssClass(d.container,"ace_dark",c.isDark),d.$size&&(d.$size.width=0,d.$updateSizeAsync()),d._dispatchEvent("themeLoaded",{theme:c}),b&&b()}}var d=this;if(this.$themeId=a,d._dispatchEvent("themeChange",{theme:a}),a&&"string"!=typeof a)c(a);else{var g=a||this.$options.theme.initialValue;f.loadModule(["theme",g],c)}},this.getTheme=function(){return this.$themeId},this.setStyle=function(a,b){e.setCssClass(this.container,a,b!==!1)},this.unsetStyle=function(a){e.removeCssClass(this.container,a)},this.setCursorStyle=function(a){this.content.style.cursor!=a&&(this.content.style.cursor=a)},this.setMouseCursor=function(a){this.content.style.cursor=a},this.destroy=function(){this.$textLayer.destroy(),this.$cursorLayer.destroy()}}).call(r.prototype),f.defineOptions(r.prototype,"renderer",{animatedScroll:{initialValue:!1},showInvisibles:{set:function(a){this.$textLayer.setShowInvisibles(a)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!1},showPrintMargin:{set:function(){this.$updatePrintMargin()},initialValue:!0},printMarginColumn:{set:function(){this.$updatePrintMargin()},initialValue:80},printMargin:{set:function(a){"number"==typeof a&&(this.$printMarginColumn=a),this.$showPrintMargin=!!a,this.$updatePrintMargin()},get:function(){return this.$showPrintMargin&&this.$printMarginColumn}},showGutter:{set:function(a){this.$gutter.style.display=a?"block":"none",this.$loop.schedule(this.CHANGE_FULL),this.onGutterResize()},initialValue:!0},fadeFoldWidgets:{set:function(a){e.setCssClass(this.$gutter,"ace_fade-fold-widgets",a)},initialValue:!1},showFoldWidgets:{set:function(a){this.$gutterLayer.setShowFoldWidgets(a)},initialValue:!0},showLineNumbers:{set:function(a){this.$gutterLayer.setShowLineNumbers(a),this.$loop.schedule(this.CHANGE_GUTTER)},initialValue:!0},displayIndentGuides:{set:function(a){this.$textLayer.setDisplayIndentGuides(a)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!0},highlightGutterLine:{set:function(a){return this.$gutterLineHighlight?(this.$gutterLineHighlight.style.display=a?"":"none",void(this.$cursorLayer.$pixelPos&&this.$updateGutterLineHighlight())):(this.$gutterLineHighlight=e.createElement("div"),this.$gutterLineHighlight.className="ace_gutter-active-line",void this.$gutter.appendChild(this.$gutterLineHighlight))},initialValue:!1,value:!0},hScrollBarAlwaysVisible:{set:function(a){this.$hScrollBarAlwaysVisible&&this.$horizScroll||this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},vScrollBarAlwaysVisible:{set:function(a){this.$vScrollBarAlwaysVisible&&this.$vScroll||this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},fontSize:{set:function(a){"number"==typeof a&&(a+="px"),this.container.style.fontSize=a,this.updateFontSize()},initialValue:12},fontFamily:{set:function(a){this.container.style.fontFamily=a,this.updateFontSize()}},maxLines:{set:function(a){this.updateFull()}},minLines:{set:function(a){this.updateFull()}},scrollPastEnd:{set:function(a){a=+a||0,this.$scrollPastEnd!=a&&(this.$scrollPastEnd=a,this.$loop.schedule(this.CHANGE_SCROLL))},initialValue:0,handlesSet:!0},fixedWidthGutter:{set:function(a){this.$gutterLayer.$fixedWidth=!!a,this.$loop.schedule(this.CHANGE_GUTTER)}},theme:{set:function(a){this.setTheme(a)},get:function(){return this.$themeId||this.theme},initialValue:"./theme/textmate",handlesSet:!0}}),b.VirtualRenderer=r}),define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter"],function(a,b,c){var d=a("../lib/dom"),e=a("../lib/oop"),f=a("../lib/lang"),g=a("../lib/event_emitter").EventEmitter,h=function(a){this.element=d.createElement("div"),this.element.className="ace_layer ace_gutter-layer",a.appendChild(this.element),this.setShowFoldWidgets(this.$showFoldWidgets),this.gutterWidth=0,this.$annotations=[],this.$updateAnnotations=this.$updateAnnotations.bind(this),this.$cells=[]};(function(){e.implement(this,g),this.setSession=function(a){this.session&&this.session.removeEventListener("change",this.$updateAnnotations),this.session=a,a.on("change",this.$updateAnnotations)},this.addGutterDecoration=function(a,b){window.console&&console.warn&&console.warn("deprecated use session.addGutterDecoration"),this.session.addGutterDecoration(a,b)},this.removeGutterDecoration=function(a,b){window.console&&console.warn&&console.warn("deprecated use session.removeGutterDecoration"),this.session.removeGutterDecoration(a,b)},this.setAnnotations=function(a){this.$annotations=[];for(var b=0;bg&&(p=f.end.row+1,f=b.getNextFoldLine(p,f),g=f?f.start.row:1/0),p>e){for(;this.$cells.length>o+1;)n=this.$cells.pop(),this.element.removeChild(n.element);break}n=this.$cells[++o],n||(n={element:null,textNode:null,foldWidget:null},n.element=d.createElement("div"),n.textNode=document.createTextNode(""),n.element.appendChild(n.textNode),this.element.appendChild(n.element),this.$cells[o]=n);var q="ace_gutter-cell ";i[p]&&(q+=i[p]),j[p]&&(q+=j[p]),this.$annotations[p]&&(q+=this.$annotations[p].className),n.element.className!=q&&(n.element.className=q);var r=b.getRowLength(p)*a.lineHeight+"px";if(r!=n.element.style.height&&(n.element.style.height=r),h){var s=h[p];null==s&&(s=h[p]=b.getFoldWidget(p))}if(s){n.foldWidget||(n.foldWidget=d.createElement("span"),n.element.appendChild(n.foldWidget));var q="ace_fold-widget ace_"+s;q+="start"==s&&p==g&&pc.right-b.right?"foldWidgets":void 0}}).call(h.prototype),b.Gutter=h}),define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(a,b,c){var d=a("../range").Range,e=a("../lib/dom"),f=function(a){this.element=e.createElement("div"),this.element.className="ace_layer ace_marker-layer",a.appendChild(this.element)};(function(){this.$padding=0,this.setPadding=function(a){this.$padding=a},this.setSession=function(a){this.session=a},this.setMarkers=function(a){this.markers=a},this.update=function(a){var a=a||this.config;if(a){this.config=a;var b=[];for(var c in this.markers){var d=this.markers[c];if(d.range){var f=d.range.clipRows(a.firstRow,a.lastRow);if(!f.isEmpty())if(f=f.toScreenRange(this.session),d.renderer){var g=this.$getTop(f.start.row,a),h=this.$padding+f.start.column*a.characterWidth;d.renderer(b,f,h,g,a)}else"fullLine"==d.type?this.drawFullLineMarker(b,f,d.clazz,a):"screenLine"==d.type?this.drawScreenLineMarker(b,f,d.clazz,a):f.isMultiLine()?"text"==d.type?this.drawTextMarker(b,f,d.clazz,a):this.drawMultiLineMarker(b,f,d.clazz,a):this.drawSingleLineMarker(b,f,d.clazz+" ace_start",a)}else d.update(b,this,this.session,a)}this.element=e.setInnerHtml(this.element,b.join(""))}},this.$getTop=function(a,b){return(a-b.firstRowScreen)*b.lineHeight},this.drawTextMarker=function(a,b,c,e,f){var g=b.start.row,h=new d(g,b.start.column,g,this.session.getScreenLastRowColumn(g));for(this.drawSingleLineMarker(a,h,c+" ace_start",e,1,f),g=b.end.row,h=new d(g,0,g,b.end.column),this.drawSingleLineMarker(a,h,c,e,0,f),g=b.start.row+1;g

"),h=this.$getTop(b.end.row,d);var j=b.end.column*d.characterWidth;a.push("
"),g=(b.end.row-b.start.row-1)*d.lineHeight,g<0||(h=this.$getTop(b.start.row+1,d),a.push("
"))},this.drawSingleLineMarker=function(a,b,c,d,e,f){var g=d.lineHeight,h=(b.end.column+(e||0)-b.start.column)*d.characterWidth,i=this.$getTop(b.start.row,d),j=this.$padding+b.start.column*d.characterWidth;a.push("
")},this.drawFullLineMarker=function(a,b,c,d,e){var f=this.$getTop(b.start.row,d),g=d.lineHeight;b.start.row!=b.end.row&&(g+=this.$getTop(b.end.row,d)-f),a.push("
")},this.drawScreenLineMarker=function(a,b,c,d,e){var f=this.$getTop(b.start.row,d),g=d.lineHeight;a.push("
")}}).call(f.prototype),b.Marker=f}),define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(a,b,c){var d=a("../lib/oop"),e=a("../lib/dom"),f=a("../lib/lang"),g=(a("../lib/useragent"),a("../lib/event_emitter").EventEmitter),h=function(a){this.element=e.createElement("div"),this.element.className="ace_layer ace_text-layer",a.appendChild(this.element),this.$updateEolChar=this.$updateEolChar.bind(this)};(function(){d.implement(this,g),this.EOF_CHAR="¶",this.EOL_CHAR_LF="¬",this.EOL_CHAR_CRLF="¤",this.EOL_CHAR=this.EOL_CHAR_LF,this.TAB_CHAR="→",this.SPACE_CHAR="·",this.$padding=0,this.$updateEolChar=function(){var a="\n"==this.session.doc.getNewLineCharacter()?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=a)return this.EOL_CHAR=a,!0},this.setPadding=function(a){this.$padding=a,this.element.style.padding="0 "+a+"px"},this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0},this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0},this.$setFontMetrics=function(a){this.$fontMetrics=a,this.$fontMetrics.on("changeCharacterSize",function(a){this._signal("changeCharacterSize",a)}.bind(this)),this.$pollSizeChanges()},this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()},this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()},this.setSession=function(a){this.session=a,this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(a){return this.showInvisibles!=a&&(this.showInvisibles=a,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(a){return this.displayIndentGuides!=a&&(this.displayIndentGuides=a,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var a=this.session.getTabSize();this.tabSize=a;for(var b=this.$tabStrings=[0],c=1;c"+this.TAB_CHAR+f.stringRepeat(" ",c-1)+""):b.push(f.stringRepeat(" ",c));if(this.displayIndentGuides){this.$indentGuideRe=/\s\S| \t|\t |\s$/;var d="ace_indent-guide",e="",g="";if(this.showInvisibles){d+=" ace_invisible",e=" ace_invisible_space",g=" ace_invisible_tab";var h=f.stringRepeat(this.SPACE_CHAR,this.tabSize),i=this.TAB_CHAR+f.stringRepeat(" ",this.tabSize-1)}else var h=f.stringRepeat(" ",this.tabSize),i=h;this.$tabStrings[" "]=""+h+"",this.$tabStrings["\t"]=""+i+""}},this.updateLines=function(a,b,c){this.config.lastRow==a.lastRow&&this.config.firstRow==a.firstRow||this.scrollLines(a),this.config=a;for(var d=Math.max(b,a.firstRow),f=Math.min(c,a.lastRow),g=this.element.childNodes,h=0,i=a.firstRow;ik&&(i=j.end.row+1,j=this.session.getNextFoldLine(i,j),k=j?j.start.row:1/0),i>f)break;var l=g[h++];if(l){var m=[];this.$renderLine(m,i,!this.$useLineGroups(),i==k&&j),l.style.height=a.lineHeight*this.session.getRowLength(i)+"px",e.setInnerHtml(l,m.join(""))}i++}},this.scrollLines=function(a){var b=this.config;if(this.config=a,!b||b.lastRow0;d--)c.removeChild(c.firstChild);if(b.lastRow>a.lastRow)for(var d=this.session.getFoldedRowCount(a.lastRow+1,b.lastRow);d>0;d--)c.removeChild(c.lastChild);if(a.firstRowb.lastRow){var e=this.$renderLinesFragment(a,b.lastRow+1,a.lastRow);c.appendChild(e)}},this.$renderLinesFragment=function(a,b,c){for(var d=this.element.ownerDocument.createDocumentFragment(),f=b,g=this.session.getNextFoldLine(f),h=g?g.start.row:1/0;;){if(f>h&&(f=g.end.row+1,g=this.session.getNextFoldLine(f,g),h=g?g.start.row:1/0),f>c)break;var i=e.createElement("div"),j=[];if(this.$renderLine(j,f,!1,f==h&&g),i.innerHTML=j.join(""),this.$useLineGroups())i.className="ace_line_group",d.appendChild(i),i.style.height=a.lineHeight*this.session.getRowLength(f)+"px";else for(;i.firstChild;)d.appendChild(i.firstChild);f++}return d},this.update=function(a){this.config=a;for(var b=[],c=a.firstRow,d=a.lastRow,f=c,g=this.session.getNextFoldLine(f),h=g?g.start.row:1/0;;){if(f>h&&(f=g.end.row+1,g=this.session.getNextFoldLine(f,g),h=g?g.start.row:1/0),f>d)break;this.$useLineGroups()&&b.push("
"),this.$renderLine(b,f,!1,f==h&&g),this.$useLineGroups()&&b.push("
"),f++}this.element=e.setInnerHtml(this.element,b.join(""))},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(a,b,c,d){var e=this,g=/\t|&|<|( +)|([\x00-\x1f\x80-\xa0\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g,h=function(a,c,d,g,h){if(c)return e.showInvisibles?""+f.stringRepeat(e.SPACE_CHAR,a.length)+"":f.stringRepeat(" ",a.length);if("&"==a)return"&";if("<"==a)return"<";if("\t"==a){var i=e.session.getScreenTabSize(b+g);return b+=i-1,e.$tabStrings[i]}if(" "==a){var j=e.showInvisibles?"ace_cjk ace_invisible ace_invisible_space":"ace_cjk",k=e.showInvisibles?e.SPACE_CHAR:"";return b+=1,""+k+""}return d?""+e.SPACE_CHAR+"":(b+=1,""+a+"")},i=d.replace(g,h);if(this.$textToken[c.type])a.push(i);else{var j="ace_"+c.type.replace(/\./g," ace_"),k="";"fold"==c.type&&(k=" style='width:"+c.value.length*this.config.characterWidth+"px;' "),a.push("",i,"")}return b+d.length},this.renderIndentGuide=function(a,b,c){var d=b.search(this.$indentGuideRe);return d<=0||d>=c?b:" "==b[0]?(d-=d%this.tabSize,a.push(f.stringRepeat(this.$tabStrings[" "],d/this.tabSize)),b.substr(d)):"\t"==b[0]?(a.push(f.stringRepeat(this.$tabStrings["\t"],d)),b.substr(d)):b},this.$renderWrappedLine=function(a,b,c,d){for(var e=0,f=0,g=c[0],h=0,i=0;i=g;)h=this.$renderToken(a,h,j,k.substring(0,g-e)),k=k.substring(g-e),e=g,d||a.push("","
"),f++,h=0,g=c[f]||Number.MAX_VALUE;0!=k.length&&(e+=k.length,h=this.$renderToken(a,h,j,k))}}},this.$renderSimpleLine=function(a,b){var c=0,d=b[0],e=d.value;this.displayIndentGuides&&(e=this.renderIndentGuide(a,e)),e&&(c=this.$renderToken(a,c,d,e));for(var f=1;f"),e.length){var f=this.session.getRowSplitData(b);f&&f.length?this.$renderWrappedLine(a,e,f,c):this.$renderSimpleLine(a,e)}this.showInvisibles&&(d&&(b=d.end.row),a.push("",b==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,"")),c||a.push("
")},this.$getFoldLineTokens=function(a,b){function c(a,b,c){for(var d=0,f=0;f+a[d].value.lengthc-b&&(g=g.substring(0,c-b)),e.push({type:a[d].type,value:g}),f=b+g.length,d+=1}for(;fc?e.push({type:a[d].type,value:g.substring(0,c-f)}):e.push(a[d]),f+=g.length,d+=1}}var d=this.session,e=[],f=d.getTokens(a);return b.walk(function(a,b,g,h,i){null!=a?e.push({type:"fold",value:a}):(i&&(f=d.getTokens(b)),f.length&&c(f,h,g))},b.end.row,this.session.getLine(b.end.row).length),e},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(h.prototype),b.Text=h}),define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(a,b,c){var d,e=a("../lib/dom"),f=function(a){this.element=e.createElement("div"),this.element.className="ace_layer ace_cursor-layer",a.appendChild(this.element),void 0===d&&(d="opacity"in this.element),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),e.addCssClass(this.element,"ace_hidden-cursors"),this.$updateCursors=this.$updateVisibility.bind(this)};(function(){this.$updateVisibility=function(a){for(var b=this.cursors,c=b.length;c--;)b[c].style.visibility=a?"":"hidden"},this.$updateOpacity=function(a){for(var b=this.cursors,c=b.length;c--;)b[c].style.opacity=a?"":"0"},this.$padding=0,this.setPadding=function(a){this.$padding=a},this.setSession=function(a){this.session=a},this.setBlinking=function(a){a!=this.isBlinking&&(this.isBlinking=a,this.restartTimer())},this.setBlinkInterval=function(a){a!=this.blinkInterval&&(this.blinkInterval=a,this.restartTimer())},this.setSmoothBlinking=function(a){a==this.smoothBlinking||d||(this.smoothBlinking=a,e.setCssClass(this.element,"ace_smooth-blinking",a),this.$updateCursors(!0),this.$updateCursors=(a?this.$updateOpacity:this.$updateVisibility).bind(this),this.restartTimer())},this.addCursor=function(){var a=e.createElement("div");return a.className="ace_cursor",this.element.appendChild(a),this.cursors.push(a),a},this.removeCursor=function(){if(this.cursors.length>1){var a=this.cursors.pop();return a.parentNode.removeChild(a),a}},this.hideCursor=function(){this.isVisible=!1,e.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,e.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){var a=this.$updateCursors;if(clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.smoothBlinking&&e.removeCssClass(this.element,"ace_smooth-blinking"),a(!0),this.isBlinking&&this.blinkInterval&&this.isVisible){this.smoothBlinking&&setTimeout(function(){e.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));var b=function(){this.timeoutId=setTimeout(function(){a(!1)},.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){a(!0),b()},this.blinkInterval),b()}},this.getPixelPosition=function(a,b){if(!this.config||!this.session)return{left:0,top:0};a||(a=this.session.selection.getCursor());var c=this.session.documentToScreenPosition(a),d=this.$padding+c.column*this.config.characterWidth,e=(c.row-(b?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:d,top:e}},this.update=function(a){this.config=a;var b=this.session.$selectionMarkers,c=0,d=0;void 0!==b&&0!==b.length||(b=[{cursor:null}]);for(var c=0,e=b.length;ca.height+a.offset||f.top<0)&&c>1)){var g=(this.cursors[d++]||this.addCursor()).style;g.left=f.left+"px",g.top=f.top+"px",g.width=a.characterWidth+"px",g.height=a.lineHeight+"px"}}for(;this.cursors.length>d;)this.removeCursor();var h=this.session.getOverwrite();this.$setOverwrite(h),this.$pixelPos=f,this.restartTimer()},this.$setOverwrite=function(a){a!=this.overwrite&&(this.overwrite=a,a?e.addCssClass(this.element,"ace_overwrite-cursors"):e.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(f.prototype),b.Cursor=f}),define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(a,b,c){var d=a("./lib/oop"),e=a("./lib/dom"),f=a("./lib/event"),g=a("./lib/event_emitter").EventEmitter,h=function(a){this.element=e.createElement("div"),this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix,this.inner=e.createElement("div"),this.inner.className="ace_scrollbar-inner",this.element.appendChild(this.inner),a.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,f.addListener(this.element,"scroll",this.onScroll.bind(this)),f.addListener(this.element,"mousedown",f.preventDefault)};(function(){d.implement(this,g),this.setVisible=function(a){this.element.style.display=a?"":"none",this.isVisible=a}}).call(h.prototype);var i=function(a,b){h.call(this,a),this.scrollTop=0,b.$scrollbarWidth=this.width=e.scrollbarWidth(a.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+"px"};d.inherits(i,h),function(){this.classSuffix="-v",this.onScroll=function(){this.skipEvent||(this.scrollTop=this.element.scrollTop,this._emit("scroll",{data:this.scrollTop})),this.skipEvent=!1},this.getWidth=function(){return this.isVisible?this.width:0},this.setHeight=function(a){this.element.style.height=a+"px"},this.setInnerHeight=function(a){this.inner.style.height=a+"px"},this.setScrollHeight=function(a){this.inner.style.height=a+"px"},this.setScrollTop=function(a){this.scrollTop!=a&&(this.skipEvent=!0,this.scrollTop=this.element.scrollTop=a)}}.call(i.prototype);var j=function(a,b){h.call(this,a),this.scrollLeft=0,this.height=b.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};d.inherits(j,h),function(){this.classSuffix="-h",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit("scroll",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(a){this.element.style.width=a+"px"},this.setInnerWidth=function(a){this.inner.style.width=a+"px"},this.setScrollWidth=function(a){this.inner.style.width=a+"px"},this.setScrollLeft=function(a){this.scrollLeft!=a&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=a)}}.call(j.prototype),b.ScrollBar=i,b.ScrollBarV=i,b.ScrollBarH=j,b.VScrollBar=i,b.HScrollBar=j}),define("ace/renderloop",["require","exports","module","ace/lib/event"],function(a,b,c){var d=a("./lib/event"),e=function(a,b){this.onRender=a,this.pending=!1,this.changes=0,this.window=b||window};(function(){this.schedule=function(a){if(this.changes=this.changes|a,!this.pending&&this.changes){this.pending=!0;var b=this;d.nextFrame(function(){b.pending=!1;for(var a;a=b.changes;)b.changes=0,b.onRender(a)},this.window)}}}).call(e.prototype),b.RenderLoop=e}),define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/event_emitter"],function(a,b,c){var d=a("../lib/oop"),e=a("../lib/dom"),f=a("../lib/lang"),g=a("../lib/event_emitter").EventEmitter,h=0,i=b.FontMetrics=function(a,b){this.el=e.createElement("div"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=e.createElement("div"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=e.createElement("div"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),a.appendChild(this.el),h||this.$testFractionalRect(),this.$measureNode.innerHTML=f.stringRepeat("X",h),this.$characterSize={width:0,height:0},this.checkForSizeChanges()};(function(){d.implement(this,g),this.$characterSize={width:0,height:0},this.$testFractionalRect=function(){var a=e.createElement("div");this.$setMeasureNodeStyles(a.style),a.style.width="0.2px",document.documentElement.appendChild(a);var b=a.getBoundingClientRect().width;h=b>0&&b<1?1:100,a.parentNode.removeChild(a)},this.$setMeasureNodeStyles=function(a,b){a.width=a.height="auto",a.left=a.top="-100px",a.visibility="hidden",a.position="fixed",a.whiteSpace="pre",a.font="inherit",a.overflow=b?"hidden":"visible"},this.checkForSizeChanges=function(){var a=this.$measureSizes();if(a&&(this.$characterSize.width!==a.width||this.$characterSize.height!==a.height)){this.$measureNode.style.fontWeight="bold";var b=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=a,this.charSizes=Object.create(null),this.allowBoldFonts=b&&b.width===a.width&&b.height===a.height,this._emit("changeCharacterSize",{data:a})}},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer)return this.$pollSizeChangesTimer;var a=this;return this.$pollSizeChangesTimer=setInterval(function(){a.checkForSizeChanges()},500)},this.setPolling=function(a){a?this.$pollSizeChanges():this.$pollSizeChangesTimer&&this.$pollSizeChangesTimer},this.$measureSizes=function(){if(1===h)var a=this.$measureNode.getBoundingClientRect(),b={height:a.height,width:a.width};else var b={height:this.$measureNode.clientHeight,width:this.$measureNode.clientWidth/h};return 0===b.width||0===b.height?null:b},this.$measureCharWidth=function(a){this.$main.innerHTML=f.stringRepeat(a,h);var b=this.$main.getBoundingClientRect();return b.width/h},this.getCharacterWidth=function(a){var b=this.charSizes[a];return void 0===b&&(this.charSizes[a]=this.$measureCharWidth(a)/this.$characterSize.width),b},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)}}).call(i.prototype)}),define("ace/multi_select",["require","exports","module","ace/range_list","ace/range","ace/selection","ace/mouse/multi_select_handler","ace/lib/event","ace/lib/lang","ace/commands/multi_select_commands","ace/search","ace/edit_session","ace/editor","ace/config"],function(a,b,c){ -function d(a,b,c){return p.$options.wrap=!0,p.$options.needle=b,p.$options.backwards=c==-1,p.find(a)}function e(a,b){return a.row==b.row&&a.column==b.column}function f(a){a.$multiselectOnSessionChange||(a.$onAddRange=a.$onAddRange.bind(a),a.$onRemoveRange=a.$onRemoveRange.bind(a),a.$onMultiSelect=a.$onMultiSelect.bind(a),a.$onSingleSelect=a.$onSingleSelect.bind(a),a.$multiselectOnSessionChange=b.onSessionChange.bind(a),a.$multiselectOnSessionChange(a),a.on("changeSession",a.$multiselectOnSessionChange),a.on("mousedown",k),a.commands.addCommands(n.defaultCommands),g(a))}function g(a){function b(b){d&&(a.renderer.setMouseCursor(""),d=!1)}var c=a.textInput.getElement(),d=!1;l.addListener(c,"keydown",function(c){18!=c.keyCode||c.ctrlKey||c.shiftKey||c.metaKey?d&&b():d||(a.renderer.setMouseCursor("crosshair"),d=!0)}),l.addListener(c,"keyup",b),l.addListener(c,"blur",b)}var h=a("./range_list").RangeList,i=a("./range").Range,j=a("./selection").Selection,k=a("./mouse/multi_select_handler").onMouseDown,l=a("./lib/event"),m=a("./lib/lang"),n=a("./commands/multi_select_commands");b.commands=n.defaultCommands.concat(n.multiSelectCommands);var o=a("./search").Search,p=new o,q=a("./edit_session").EditSession;(function(){this.getSelectionMarkers=function(){return this.$selectionMarkers}}).call(q.prototype),function(){this.ranges=null,this.rangeList=null,this.addRange=function(a,b){if(a){if(!this.inMultiSelectMode&&0==this.rangeCount){var c=this.toOrientedRange();if(this.rangeList.add(c),this.rangeList.add(a),2!=this.rangeList.ranges.length)return this.rangeList.removeAll(),b||this.fromOrientedRange(a);this.rangeList.removeAll(),this.rangeList.add(c),this.$onAddRange(c)}a.cursor||(a.cursor=a.end);var d=this.rangeList.add(a);return this.$onAddRange(a),d.length&&this.$onRemoveRange(d),this.rangeCount>1&&!this.inMultiSelectMode&&(this._signal("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),b||this.fromOrientedRange(a)}},this.toSingleRange=function(a){a=a||this.ranges[0];var b=this.rangeList.removeAll();b.length&&this.$onRemoveRange(b),a&&this.fromOrientedRange(a)},this.substractPoint=function(a){var b=this.rangeList.substractPoint(a);if(b)return this.$onRemoveRange(b),b[0]},this.mergeOverlappingRanges=function(){var a=this.rangeList.merge();a.length?this.$onRemoveRange(a):this.ranges[0]&&this.fromOrientedRange(this.ranges[0])},this.$onAddRange=function(a){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(a),this._signal("addRange",{range:a})},this.$onRemoveRange=function(a){if(this.rangeCount=this.rangeList.ranges.length,1==this.rangeCount&&this.inMultiSelectMode){var b=this.rangeList.ranges.pop();a.push(b),this.rangeCount=0}for(var c=a.length;c--;){var d=this.ranges.indexOf(a[c]);this.ranges.splice(d,1)}this._signal("removeRange",{ranges:a}),0==this.rangeCount&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),b=b||this.ranges[0],b&&!b.isEqual(this.getRange())&&this.fromOrientedRange(b)},this.$initRangeList=function(){this.rangeList||(this.rangeList=new h,this.ranges=[],this.rangeCount=0)},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){if(this.rangeCount>1){var a=this.rangeList.ranges,b=a[a.length-1],c=i.fromPoints(a[0].start,b.end);this.toSingleRange(),this.setSelectionRange(c,b.cursor==b.start)}else{var c=this.getRange(),d=this.isBackwards(),e=c.start.row,f=c.end.row;if(e==f){if(d)var g=c.end,h=c.start;else var g=c.start,h=c.end;return this.addRange(i.fromPoints(h,h)),void this.addRange(i.fromPoints(g,g))}var j=[],k=this.getLineRange(e,!0);k.start.column=c.start.column,j.push(k);for(var l=e+1;l1){var a=this.rangeList.ranges,b=a[a.length-1],c=i.fromPoints(a[0].start,b.end);this.toSingleRange(),this.setSelectionRange(c,b.cursor==b.start)}else{var d=this.session.documentToScreenPosition(this.selectionLead),e=this.session.documentToScreenPosition(this.selectionAnchor),f=this.rectangularRangeBlock(d,e);f.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(a,b,c){var d=[],f=a.column0;)p--;if(p>0)for(var q=0;d[q].isEmpty();)q++;for(var r=p;r>=q;r--)d[r].isEmpty()&&d.splice(r,1)}return d}}.call(j.prototype);var r=a("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(a){a.cursor||(a.cursor=a.end);var b=this.getSelectionStyle();return a.marker=this.session.addMarker(a,"ace_selection",b),this.session.$selectionMarkers.push(a),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,a},this.removeSelectionMarker=function(a){if(a.marker){this.session.removeMarker(a.marker);var b=this.session.$selectionMarkers.indexOf(a);b!=-1&&this.session.$selectionMarkers.splice(b,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length}},this.removeSelectionMarkers=function(a){for(var b=this.session.$selectionMarkers,c=a.length;c--;){var d=a[c];if(d.marker){this.session.removeMarker(d.marker);var e=b.indexOf(d);e!=-1&&b.splice(e,1)}}this.session.selectionMarkerCount=b.length},this.$onAddRange=function(a){this.addSelectionMarker(a.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(a){this.removeSelectionMarkers(a.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(a){this.inMultiSelectMode||(this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(n.keyboardHandler),this.commands.setDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers())},this.$onSingleSelect=function(a){this.session.multiSelect.inVirtualMode||(this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(n.keyboardHandler),this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit("changeSelection"))},this.$onMultiSelectExec=function(a){var b=a.command,c=a.editor;if(c.multiSelect){if(b.multiSelectAction)"forEach"==b.multiSelectAction?d=c.forEachSelection(b,a.args):"forEachLine"==b.multiSelectAction?d=c.forEachSelection(b,a.args,!0):"single"==b.multiSelectAction?(c.exitMultiSelectMode(),d=b.exec(c,a.args||{})):d=b.multiSelectAction(c,a.args||{});else{var d=b.exec(c,a.args||{});c.multiSelect.addRange(c.multiSelect.toOrientedRange()),c.multiSelect.mergeOverlappingRanges()}return d}},this.forEachSelection=function(a,b,c){if(!this.inVirtualSelectionMode){var d,e=this.session,f=this.selection,g=f.rangeList,h=f._eventRegistry;f._eventRegistry={};var i=new j(e);this.inVirtualSelectionMode=!0;for(var k=g.ranges.length;k--;){if(c)for(;k>0&&g.ranges[k].start.row==g.ranges[k-1].end.row;)k--;i.fromOrientedRange(g.ranges[k]),i.id=g.ranges[k].marker,this.selection=e.selection=i;var l=a.exec(this,b||{});void 0!==d&&(d=l),i.toOrientedRange(g.ranges[k])}i.detach(),this.selection=e.selection=f,this.inVirtualSelectionMode=!1,f._eventRegistry=h,f.mergeOverlappingRanges();var m=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),m&&m.from==m.to&&this.renderer.animateScrolling(m.from),d}},this.exitMultiSelectMode=function(){this.inMultiSelectMode&&!this.inVirtualSelectionMode&&this.multiSelect.toSingleRange()},this.getSelectedText=function(){var a="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){for(var b=this.multiSelect.rangeList.ranges,c=[],d=0;dd.length||c.length<2||!c[1])return this.commands.exec("insertstring",this,a);for(var e=d.length;e--;){var f=d[e];f.isEmpty()||this.session.remove(f),this.session.insert(f.start,c[e])}}},this.findAll=function(a,b,c){b=b||{},b.needle=a||b.needle,this.$search.set(b);var d=this.$search.findAll(this.session);if(!d.length)return 0;this.$blockScrolling+=1;var e=this.multiSelect;c||e.toSingleRange(d[0]);for(var f=d.length;f--;)e.addRange(d[f],!0);return this.$blockScrolling-=1,d.length},this.selectMoreLines=function(a,b){var c=this.selection.toOrientedRange(),d=c.cursor==c.end,e=this.session.documentToScreenPosition(c.cursor);this.selection.$desiredColumn&&(e.column=this.selection.$desiredColumn);var f=this.session.screenToDocumentPosition(e.row+a,e.column);if(c.isEmpty())var g=f;else var h=this.session.documentToScreenPosition(d?c.end:c.start),g=this.session.screenToDocumentPosition(h.row+a,h.column);if(d){var j=i.fromPoints(f,g);j.cursor=j.start}else{var j=i.fromPoints(g,f);j.cursor=j.end}if(j.desiredColumn=e.column,this.selection.inMultiSelectMode){if(b)var k=c.cursor}else this.selection.addRange(c);this.selection.addRange(j),k&&this.selection.substractPoint(k)},this.transposeSelections=function(a){for(var b=this.session,c=b.multiSelect,d=c.ranges,e=d.length;e--;){var f=d[e];if(f.isEmpty()){var g=b.getWordRange(f.start.row,f.start.column);f.start.row=g.start.row,f.start.column=g.start.column,f.end.row=g.end.row,f.end.column=g.end.column}}c.mergeOverlappingRanges();for(var h=[],e=d.length;e--;){var f=d[e];h.unshift(b.getTextRange(f))}a<0?h.unshift(h.pop()):h.push(h.shift());for(var e=d.length;e--;){var f=d[e],g=f.clone();b.replace(f,h[e]),f.start.row=g.start.row,f.start.column=g.start.column}},this.selectMore=function(a,b){var c=this.session,e=c.multiSelect,f=e.toOrientedRange();f.isEmpty()&&(f=c.getWordRange(f.start.row,f.start.column),f.cursor=a==-1?f.start:f.end,this.multiSelect.addRange(f));var g=c.getTextRange(f),h=d(c,g,a);h&&(h.cursor=a==-1?h.start:h.end,this.$blockScrolling+=1,this.session.unfold(h),this.multiSelect.addRange(h),this.$blockScrolling-=1,this.renderer.scrollCursorIntoView(null,.5)),b&&this.multiSelect.substractPoint(f.cursor)},this.alignCursors=function(){var a=this.session,b=a.multiSelect,c=b.ranges;if(c.length){var d=-1,e=c.filter(function(a){return a.cursor.row==d||void(d=a.cursor.row)});b.$onRemoveRange(e);var f=0,g=1/0,h=c.map(function(b){var c=b.cursor,d=a.getLine(c.row),e=d.substr(c.column).search(/\S/g);return e==-1&&(e=0),c.column>f&&(f=c.column),ej?a.insert(d,m.stringRepeat(" ",e-j)):a.remove(new i(d.row,d.column,d.row,d.column-e+j)),b.start.column=b.end.column=f,b.start.row=b.end.row=d.row,b.cursor=b.end}),b.fromOrientedRange(c[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}else{var j=this.selection.getRange(),k=j.start.row,l=j.end.row,n=k==l;if(n){var o,p=this.session.getLength();do o=this.session.getLine(l);while(/[=:]/.test(o)&&++l0);k<0&&(k=0),l>=p&&(l=p-1)}var q=this.session.doc.removeLines(k,l);q=this.$reAlignText(q,n),this.session.doc.insert({row:k,column:0},q.join("\n")+"\n"),n||(j.start.column=0,j.end.column=q[q.length-1].length),this.selection.setRange(j)}},this.$reAlignText=function(a,b){function c(a){return m.stringRepeat(" ",a)}function d(a){return a[2]?c(g)+a[2]+c(h-a[2].length+i)+a[4].replace(/^([=:])\s+/,"$1 "):a[0]}function e(a){return a[2]?c(g+h-a[2].length)+a[2]+c(i," ")+a[4].replace(/^([=:])\s+/,"$1 "):a[0]}function f(a){return a[2]?c(g)+a[2]+c(i)+a[4].replace(/^([=:])\s+/,"$1 "):a[0]}var g,h,i,j=!0,k=!0;return a.map(function(a){var b=a.match(/(\s*)(.*?)(\s*)([=:].*)/);return b?null==g?(g=b[1].length,h=b[2].length,i=b[3].length,b):(g+h+i!=b[1].length+b[2].length+b[3].length&&(k=!1),g!=b[1].length&&(j=!1),g>b[1].length&&(g=b[1].length),hb[3].length&&(i=b[3].length),b):[a]}).map(b?d:j?k?e:d:f)}}).call(r.prototype),b.onSessionChange=function(a){var b=a.session;b.multiSelect||(b.$selectionMarkers=[],b.selection.$initRangeList(),b.multiSelect=b.selection),this.multiSelect=b.multiSelect;var c=a.oldSession;c&&(c.multiSelect.removeEventListener("addRange",this.$onAddRange),c.multiSelect.removeEventListener("removeRange",this.$onRemoveRange),c.multiSelect.removeEventListener("multiSelect",this.$onMultiSelect),c.multiSelect.removeEventListener("singleSelect",this.$onSingleSelect)),b.multiSelect.on("addRange",this.$onAddRange),b.multiSelect.on("removeRange",this.$onRemoveRange),b.multiSelect.on("multiSelect",this.$onMultiSelect),b.multiSelect.on("singleSelect",this.$onSingleSelect),this.inMultiSelectMode!=b.selection.inMultiSelectMode&&(b.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},b.MultiSelect=f,a("./config").defineOptions(r.prototype,"editor",{enableMultiselect:{set:function(a){f(this),a?(this.on("changeSession",this.$multiselectOnSessionChange),this.on("mousedown",k)):(this.off("changeSession",this.$multiselectOnSessionChange),this.off("mousedown",k))},value:!0}})}),define("ace/mouse/multi_select_handler",["require","exports","module","ace/lib/event"],function(a,b,c){function d(a,b){return a.row==b.row&&a.column==b.column}function e(a){var b=a.domEvent,c=b.altKey,e=b.shiftKey,g=a.getAccelKey(),h=a.getButton();if(a.editor.inMultiSelectMode&&2==h)return void a.editor.textInput.onContextMenu(a.domEvent);if(!g&&!c)return void(0===h&&a.editor.inMultiSelectMode&&a.editor.exitMultiSelectMode());var i=a.editor,j=i.selection,k=i.inMultiSelectMode,l=a.getDocumentPosition(),m=j.getCursor(),n=a.inSelection()||j.isEmpty()&&d(l,m),o=a.x,p=a.y,q=function(a){o=a.clientX,p=a.clientY},r=function(){var a=i.renderer.pixelToScreenCoordinates(o,p),b=s.screenToDocumentPosition(a.row,a.column);d(u,a)&&d(b,j.selectionLead)||(u=a,i.selection.moveToPosition(b),i.renderer.scrollCursorIntoView(),i.removeSelectionMarkers(v),v=j.rectangularRangeBlock(u,t),v.forEach(i.addSelectionMarker,i),i.updateSelectionMarkers())},s=i.session,t=i.renderer.pixelToScreenCoordinates(o,p),u=t;if(!g||c||e||0!==h){if(c&&0===h){a.stop(),k&&!g?j.toSingleRange():!k&&g&&j.addRange();var v=[];e?(t=s.documentToScreenPosition(j.lead),r()):j.moveToPosition(l);var w=function(a){clearInterval(y),i.removeSelectionMarkers(v);for(var b=0;b20&&a.length>this.$doc.getLength()>>1?this.call("setValue",[this.$doc.getValue()]):this.emit("change",{data:a}))},this.$workerBlob=function(a){var b="importScripts('"+e.qualifyURL(a)+"');";try{return new Blob([b],{type:"application/javascript"})}catch(c){var d=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder,f=new d;return f.append(b),f.getBlob("application/javascript")}}}).call(h.prototype);var i=function(a,b,c){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.callbackId=1,this.callbacks={},this.messageBuffer=[];var d=null,e=!1,h=Object.create(f),i=this;this.$worker={},this.$worker.terminate=function(){},this.$worker.postMessage=function(a){i.messageBuffer.push(a),d&&(e?setTimeout(j):j())},this.setEmitSync=function(a){e=a};var j=function(){var a=i.messageBuffer.shift();a.command?d[a.command].apply(d,a.args):a.event&&h._signal(a.event,a.data)};h.postMessage=function(a){i.onMessage({data:a})},h.callback=function(a,b){this.postMessage({type:"call",id:b,data:a})},h.emit=function(a,b){this.postMessage({type:"event",name:a,data:b})},g.loadModule(["worker",b],function(a){for(d=new a[c](h);i.messageBuffer.length;)j()})};i.prototype=h.prototype,b.UIWorkerClient=i,b.WorkerClient=h}),define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(a,b,c){var d=a("./range").Range,e=a("./lib/event_emitter").EventEmitter,f=a("./lib/oop"),g=function(a,b,c,d,e,f){var g=this;this.length=b,this.session=a,this.doc=a.getDocument(),this.mainClass=e,this.othersClass=f,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=d,this.$onCursorChange=function(){setTimeout(function(){g.onCursorChange()})},this.$pos=c;var h=a.getUndoManager().$undoStack||a.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=h.length,this.setup(),a.selection.on("changeCursor",this.$onCursorChange)};(function(){f.implement(this,e),this.setup=function(){var a=this,b=this.doc,c=this.session,e=this.$pos;this.pos=b.createAnchor(e.row,e.column),this.markerId=c.addMarker(new d(e.row,e.column,e.row,e.column+this.length),this.mainClass,null,!1),this.pos.on("change",function(b){c.removeMarker(a.markerId),a.markerId=c.addMarker(new d(b.value.row,b.value.column,b.value.row,b.value.column+a.length),a.mainClass,null,!1)}),this.others=[],this.$others.forEach(function(c){var d=b.createAnchor(c.row,c.column);a.others.push(d)}),c.setUndoSelect(!1)},this.showOtherMarkers=function(){if(!this.othersActive){var a=this.session,b=this;this.othersActive=!0,this.others.forEach(function(c){c.markerId=a.addMarker(new d(c.row,c.column,c.row,c.column+b.length),b.othersClass,null,!1),c.on("change",function(e){a.removeMarker(c.markerId),c.markerId=a.addMarker(new d(e.value.row,e.value.column,e.value.row,e.value.column+b.length),b.othersClass,null,!1)})})}},this.hideOtherMarkers=function(){if(this.othersActive){this.othersActive=!1;for(var a=0;a=this.pos.column&&c.start.column<=this.pos.column+this.length+1){var f=c.start.column-this.pos.column;if(this.length+=e,!this.session.$fromUndo){if("insertText"===b.action)for(var g=this.others.length-1;g>=0;g--){var h=this.others[g],i={row:h.row,column:h.column+f};h.row===c.start.row&&c.start.column=0;g--){var h=this.others[g],i={row:h.row,column:h.column+f};h.row===c.start.row&&c.start.column=this.pos.column&&b.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",a)):(this.hideOtherMarkers(),this._emit("cursorLeave",a))}},this.detach=function(){this.session.removeMarker(this.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.pos.detach();for(var a=0;aj){var m=a.getLine(k).length;return new d(j,h,k,m)}}},this.openingBracketBlock=function(a,b,c,e,f){var g={row:c,column:e+1},h=a.$findClosingBracket(b,g,f);if(h){var i=a.foldWidgets[h.row];return null==i&&(i=a.getFoldWidget(h.row)),"start"==i&&h.row>g.row&&(h.row--,h.column=a.getLine(h.row).length),d.fromPoints(g,h)}},this.closingBracketBlock=function(a,b,c,e,f){var g={row:c,column:e},h=a.$findOpeningBracket(b,g);if(h)return h.column++,g.column--,d.fromPoints(h,g)}}).call(e.prototype)}),define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(a,b,c){b.isDark=!1,b.cssClass="ace-tm",b.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;border-radius: 2px;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var d=a("../lib/dom");d.importCssString(b.cssText,b.cssClass)}),define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"],function(a,b,c){function d(a,b,c){for(var d=0,e=a.length-1;d<=e;){var f=d+e>>1,g=c(b,a[f]);if(g>0)d=f+1;else{if(!(g<0))return f;e=f-1}}return-(d+1)}function e(a,b,c){var e=a.getAnnotations().sort(h.comparePoints);if(e.length){var f=d(e,{row:b,column:-1},h.comparePoints);f<0&&(f=-f-1),f>=e.length-1?f=c>0?0:e.length-1:0===f&&c<0&&(f=e.length-1);var g=e[f];if(g&&c){if(g.row===b){do g=e[f+=c];while(g&&g.row===b);if(!g)return e.slice()}var i=[];b=g.row;do i[c<0?"unshift":"push"](g),g=e[f+=c];while(g&&g.row==b);return i.length&&i}}}var f=a("ace/line_widgets").LineWidgets,g=a("ace/lib/dom"),h=a("ace/range").Range;b.showErrorMarker=function(a,b){var c=a.session;c.widgetManager||(c.widgetManager=new f(c),c.widgetManager.attach(a));var d=a.getCursorPosition(),h=d.row,i=c.lineWidgets&&c.lineWidgets[h];i?i.destroy():h-=b;var j,k=e(c,h,b);if(k){var l=k[0];d.column=(l.pos&&"number"!=typeof l.column?l.pos.sc:l.column)||0,d.row=l.row,j=a.renderer.$gutterLayer.$annotations[d.row]}else{if(i)return;j={text:["Looks good!"],className:"ace_ok"}}a.session.unfold(d.row),a.selection.moveToPosition(d);var m={row:d.row,fixedWidth:!0,coverGutter:!0,el:g.createElement("div")},n=m.el.appendChild(g.createElement("div")),o=m.el.appendChild(g.createElement("div"));o.className="error_widget_arrow "+j.className;var p=a.renderer.$cursorLayer.getPixelPosition(d).left;o.style.left=p+a.renderer.gutterWidth-5+"px",m.el.className="error_widget_wrapper",n.className="error_widget "+j.className,n.innerHTML=j.text.join("
"),n.appendChild(g.createElement("div"));var q=function(a,b,c){if(0===b&&("esc"===c||"return"===c))return m.destroy(),{command:"null"}};m.destroy=function(){a.$mouseHandler.isMousePressed||(a.keyBinding.removeKeyboardHandler(q),c.widgetManager.removeLineWidget(m),a.off("changeSelection",m.destroy),a.off("changeSession",m.destroy),a.off("mouseup",m.destroy),a.off("change",m.destroy))},a.keyBinding.addKeyboardHandler(q),a.on("changeSelection",m.destroy),a.on("changeSession",m.destroy),a.on("mouseup",m.destroy),a.on("change",m.destroy),a.session.widgetManager.addLineWidget(m),m.el.onmousedown=a.focus.bind(a),a.renderer.scrollCursorIntoView(null,.5,{bottom:m.el.offsetHeight})},g.importCssString(" .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }",""); -}),define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"],function(a,b,c){function d(a){this.session=a,this.session.widgetManager=this,this.session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.detach=this.detach.bind(this),this.session.on("change",this.updateOnChange)}var e=(a("./lib/oop"),a("./lib/dom"));a("./range").Range;(function(){this.getRowLength=function(a){var b;return b=this.lineWidgets?this.lineWidgets[a]&&this.lineWidgets[a].rowCount||0:0,this.$useWrapMode&&this.$wrapData[a]?this.$wrapData[a].length+1+b:1+b},this.$getWidgetScreenLength=function(){var a=0;return this.lineWidgets.forEach(function(b){b&&b.rowCount&&(a+=b.rowCount)}),a},this.attach=function(a){a.widgetManager&&a.widgetManager!=this&&a.widgetManager.detach(),this.editor!=a&&(this.detach(),this.editor=a,this.editor.on("changeSession",this.detach),a.widgetManager=this,a.setOption("enableLineWidgets",!0),a.renderer.on("beforeRender",this.measureWidgets),a.renderer.on("afterRender",this.renderWidgets))},this.detach=function(a){if(!a||a.session!=this.session){var b=this.editor;if(b){b.off("changeSession",this.detach),this.editor=null,b.widgetManager=null,b.renderer.off("beforeRender",this.measureWidgets),b.renderer.off("afterRender",this.renderWidgets);var c=this.session.lineWidgets;c&&c.forEach(function(a){a&&a.el&&a.el.parentNode&&(a._inDocument=!1,a.el.parentNode.removeChild(a.el))})}}},this.updateOnChange=function(a){var b=this.session.lineWidgets;if(b){var c=a.data,d=c.range,e=d.start.row,f=d.end.row-e;if(0===f);else if("removeText"==c.action||"removeLines"==c.action){var g=b.splice(e+1,f);g.forEach(function(a){a&&this.removeLineWidget(a)},this),this.$updateRows()}else{var h=new Array(f);h.unshift(e,0),b.splice.apply(b,h),this.$updateRows()}}},this.$updateRows=function(){var a=this.session.lineWidgets;if(a){var b=!0;a.forEach(function(a,c){a&&(b=!1,a.row=c)}),b&&(this.session.lineWidgets=null)}},this.addLineWidget=function(a){this.session.lineWidgets||(this.session.lineWidgets=new Array(this.session.getLength())),this.session.lineWidgets[a.row]=a;var b=this.editor.renderer;return a.html&&!a.el&&(a.el=e.createElement("div"),a.el.innerHTML=a.html),a.el&&(e.addCssClass(a.el,"ace_lineWidgetContainer"),a.el.style.position="absolute",a.el.style.zIndex=5,b.container.appendChild(a.el),a._inDocument=!0),a.coverGutter||(a.el.style.zIndex=3),a.pixelHeight||(a.pixelHeight=a.el.offsetHeight),null==a.rowCount&&(a.rowCount=a.pixelHeight/b.layerConfig.lineHeight),this.session._emit("changeFold",{data:{start:{row:a.row}}}),this.$updateRows(),this.renderWidgets(null,b),a},this.removeLineWidget=function(a){if(a._inDocument=!1,a.el&&a.el.parentNode&&a.el.parentNode.removeChild(a.el),a.editor&&a.editor.destroy)try{a.editor.destroy()}catch(b){}this.session.lineWidgets&&(this.session.lineWidgets[a.row]=void 0),this.session._emit("changeFold",{data:{start:{row:a.row}}}),this.$updateRows()},this.onWidgetChanged=function(a){this.session._changedWidgets.push(a),this.editor&&this.editor.renderer.updateFull()},this.measureWidgets=function(a,b){var c=this.session._changedWidgets,d=b.layerConfig;if(c&&c.length){for(var e=1/0,f=0;f0&&!d[e];)e--;this.firstRow=c.firstRow,this.lastRow=c.lastRow,b.$cursorLayer.config=c;for(var g=e;g<=f;g++){var h=d[g];if(h&&h.el){h._inDocument||(h._inDocument=!0,b.container.appendChild(h.el));var i=b.$cursorLayer.getPixelPosition({row:g,column:0},!0).top;h.coverLine||(i+=c.lineHeight*this.session.getRowLineCount(h.row)),h.el.style.top=i-c.offset+"px";var j=h.coverGutter?0:b.gutterWidth;h.fixedWidth||(j-=b.scrollLeft),h.el.style.left=j+"px",h.fixedWidth?h.el.style.right=b.scrollBar.getWidth()+"px":h.el.style.right=""}}}}}).call(d.prototype),b.LineWidgets=d}),function(){window.require(["ace/ace"],function(a){a&&a.config.init(),window.ace||(window.ace={});for(var b in a)a.hasOwnProperty(b)&&(ace[b]=a[b])})}(); \ No newline at end of file +!function(){function a(a){var b=c;a&&(c[a]||(c[a]={}),b=c[a]),b.define&&b.define.packaged||(d.original=b.define,b.define=d,b.define.packaged=!0),b.require&&b.require.packaged||(f.original=b.require,b.require=f,b.require.packaged=!0)}var b="",c=function(){return this}();if(c||"undefined"==typeof window||(c=window),b||"undefined"==typeof requirejs){var d=function(a,b,c){return"string"!=typeof a?void(d.original?d.original.apply(this,arguments):(console.error("dropping module because define wasn't a string."),console.trace())):(2==arguments.length&&(c=b),void(d.modules[a]||(d.payloads[a]=c,d.modules[a]=null)))};d.modules={},d.payloads={};var e=function(a,b,c){if("string"==typeof b){var d=h(a,b);if(void 0!=d)return c&&c(),d}else if("[object Array]"===Object.prototype.toString.call(b)){for(var e=[],g=0,i=b.length;g1&&e(i,"")>-1&&(c=RegExp(this.source,f.replace.call(d(this),"g","")),f.replace.call(a.slice(i.index),c,function(){for(var a=1;ai.index&&this.lastIndex--}return i},h||(RegExp.prototype.test=function(a){var b=f.exec.call(this,a);return b&&this.global&&!b[0].length&&this.lastIndex>b.index&&this.lastIndex--,!!b}))}),define("ace/lib/es5-shim",["require","exports","module"],function(a,b,c){function d(){}function e(a){try{return Object.defineProperty(a,"sentinel",{}),"sentinel"in a}catch(b){}}function f(a){return a=+a,a!==a?a=0:0!==a&&a!==1/0&&a!==-(1/0)&&(a=(a>0||-1)*Math.floor(Math.abs(a))),a}Function.prototype.bind||(Function.prototype.bind=function(a){var b=this;if("function"!=typeof b)throw new TypeError("Function.prototype.bind called on incompatible "+b);var c=o.call(arguments,1),e=function(){if(this instanceof e){var d=b.apply(this,c.concat(o.call(arguments)));return Object(d)===d?d:this}return b.apply(a,c.concat(o.call(arguments)))};return b.prototype&&(d.prototype=b.prototype,e.prototype=new d,d.prototype=null),e});var g,h,i,j,k,l=Function.prototype.call,m=Array.prototype,n=Object.prototype,o=m.slice,p=l.bind(n.toString),q=l.bind(n.hasOwnProperty);if((k=q(n,"__defineGetter__"))&&(g=l.bind(n.__defineGetter__),h=l.bind(n.__defineSetter__),i=l.bind(n.__lookupGetter__),j=l.bind(n.__lookupSetter__)),2!=[1,2].splice(0).length)if(function(){function a(a){var b=new Array(a+2);return b[0]=b[1]=0,b}var b,c=[];if(c.splice.apply(c,a(20)),c.splice.apply(c,a(26)),b=c.length,c.splice(5,0,"XXX"),b+1==c.length,b+1==c.length)return!0}()){var r=Array.prototype.splice;Array.prototype.splice=function(a,b){return arguments.length?r.apply(this,[void 0===a?0:a,void 0===b?this.length-a:b].concat(o.call(arguments,2))):[]}}else Array.prototype.splice=function(a,b){var c=this.length;a>0?a>c&&(a=c):void 0==a?a=0:a<0&&(a=Math.max(c+a,0)),a+bh)for(l=j;l--;)this[i+l]=this[h+l];if(f&&a===k)this.length=k,this.push.apply(this,e);else for(this.length=k+f,l=0;l>>0;if("[object Function]"!=p(a))throw new TypeError;for(;++e>>0,e=Array(d),f=arguments[1];if("[object Function]"!=p(a))throw new TypeError(a+" is not a function");for(var g=0;g>>0,f=[],g=arguments[1];if("[object Function]"!=p(a))throw new TypeError(a+" is not a function");for(var h=0;h>>0,e=arguments[1];if("[object Function]"!=p(a))throw new TypeError(a+" is not a function");for(var f=0;f>>0,e=arguments[1];if("[object Function]"!=p(a))throw new TypeError(a+" is not a function");for(var f=0;f>>0;if("[object Function]"!=p(a))throw new TypeError(a+" is not a function");if(!d&&1==arguments.length)throw new TypeError("reduce of empty array with no initial value");var e,f=0;if(arguments.length>=2)e=arguments[1];else for(;;){if(f in c){e=c[f++];break}if(++f>=d)throw new TypeError("reduce of empty array with no initial value")}for(;f>>0;if("[object Function]"!=p(a))throw new TypeError(a+" is not a function");if(!d&&1==arguments.length)throw new TypeError("reduceRight of empty array with no initial value");var e,f=d-1;if(arguments.length>=2)e=arguments[1];else for(;;){if(f in c){e=c[f--];break}if(--f<0)throw new TypeError("reduceRight of empty array with no initial value")}do f in this&&(e=a.call(void 0,e,c[f],f,b));while(f--);return e}),Array.prototype.indexOf&&[0,1].indexOf(1,2)==-1||(Array.prototype.indexOf=function(a){var b=t&&"[object String]"==p(this)?this.split(""):K(this),c=b.length>>>0;if(!c)return-1;var d=0;for(arguments.length>1&&(d=f(arguments[1])),d=d>=0?d:Math.max(0,c+d);d>>0;if(!c)return-1;var d=c-1;for(arguments.length>1&&(d=Math.min(d,f(arguments[1]))),d=d>=0?d:c-Math.abs(d);d>=0;d--)if(d in b&&a===b[d])return d;return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(a){return a.__proto__||(a.constructor?a.constructor.prototype:n)}),!Object.getOwnPropertyDescriptor){var u="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(a,b){if("object"!=typeof a&&"function"!=typeof a||null===a)throw new TypeError(u+a);if(q(a,b)){var c,d,e;if(c={enumerable:!0,configurable:!0},k){var f=a.__proto__;a.__proto__=n;var d=i(a,b),e=j(a,b);if(a.__proto__=f,d||e)return d&&(c.get=d),e&&(c.set=e),c}return c.value=a[b],c}}}if(Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(a){return Object.keys(a)}),!Object.create){var v;v=null===Object.prototype.__proto__?function(){return{__proto__:null}}:function(){var a={};for(var b in a)a[b]=null;return a.constructor=a.hasOwnProperty=a.propertyIsEnumerable=a.isPrototypeOf=a.toLocaleString=a.toString=a.valueOf=a.__proto__=null,a},Object.create=function(a,b){var c;if(null===a)c=v();else{if("object"!=typeof a)throw new TypeError("typeof prototype["+typeof a+"] != 'object'");var d=function(){};d.prototype=a,c=new d,c.__proto__=a}return void 0!==b&&Object.defineProperties(c,b),c}}if(Object.defineProperty){var w=e({}),x="undefined"==typeof document||e(document.createElement("div"));if(!w||!x)var y=Object.defineProperty}if(!Object.defineProperty||y){var z="Property description must be an object: ",A="Object.defineProperty called on non-object: ",B="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(a,b,c){if("object"!=typeof a&&"function"!=typeof a||null===a)throw new TypeError(A+a);if("object"!=typeof c&&"function"!=typeof c||null===c)throw new TypeError(z+c);if(y)try{return y.call(Object,a,b,c)}catch(d){}if(q(c,"value"))if(k&&(i(a,b)||j(a,b))){var e=a.__proto__;a.__proto__=n,delete a[b],a[b]=c.value,a.__proto__=e}else a[b]=c.value;else{if(!k)throw new TypeError(B);q(c,"get")&&g(a,b,c.get),q(c,"set")&&h(a,b,c.set)}return a}}Object.defineProperties||(Object.defineProperties=function(a,b){for(var c in b)q(b,c)&&Object.defineProperty(a,c,b[c]);return a}),Object.seal||(Object.seal=function(a){return a}),Object.freeze||(Object.freeze=function(a){return a});try{Object.freeze(function(){})}catch(C){Object.freeze=function(a){return function(b){return"function"==typeof b?b:a(b)}}(Object.freeze)}if(Object.preventExtensions||(Object.preventExtensions=function(a){return a}),Object.isSealed||(Object.isSealed=function(a){return!1}),Object.isFrozen||(Object.isFrozen=function(a){return!1}),Object.isExtensible||(Object.isExtensible=function(a){if(Object(a)===a)throw new TypeError;for(var b="";q(a,b);)b+="?";a[b]=!0;var c=q(a,b);return delete a[b],c}),!Object.keys){var D=!0,E=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],F=E.length;for(var G in{toString:null})D=!1;Object.keys=function L(a){if("object"!=typeof a&&"function"!=typeof a||null===a)throw new TypeError("Object.keys called on a non-object");var L=[];for(var b in a)q(a,b)&&L.push(b);if(D)for(var c=0,d=F;c=0?parseFloat((e.match(/(?:MSIE |Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]):parseFloat((e.match(/(?:Trident\/[0-9]+[\.0-9]+;.*rv:)([0-9]+[\.0-9]+)/)||[])[1]),b.isOldIE=b.isIE&&b.isIE<9,b.isGecko=b.isMozilla=(window.Controllers||window.controllers)&&"Gecko"===window.navigator.product,b.isOldGecko=b.isGecko&&parseInt((e.match(/rv:(\d+)/)||[])[1],10)<4,b.isOpera=window.opera&&"[object Opera]"==Object.prototype.toString.call(window.opera),b.isWebKit=parseFloat(e.split("WebKit/")[1])||void 0,b.isChrome=parseFloat(e.split(" Chrome/")[1])||void 0,b.isAIR=e.indexOf("AdobeAIR")>=0,b.isIPad=e.indexOf("iPad")>=0,b.isTouchPad=e.indexOf("TouchPad")>=0,b.isChromeOS=e.indexOf(" CrOS ")>=0}}),define("ace/lib/event",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(a,b,c){"use strict";function d(a,b,c){var d=j(b);if(!g.isMac&&h){if(b.getModifierState&&(b.getModifierState("OS")||b.getModifierState("Win"))&&(d|=8),h.altGr){if(3==(3&d))return;h.altGr=0}if(18===c||17===c){var e="location"in b?b.location:b.keyLocation;if(17===c&&1===e)1==h[c]&&(i=b.timeStamp);else if(18===c&&3===d&&2===e){var k=b.timeStamp-i;k<50&&(h.altGr=!0)}}}if(c in f.MODIFIER_KEYS&&(c=-1),8&d&&c>=91&&c<=93&&(c=-1),!d&&13===c){var e="location"in b?b.location:b.keyLocation;if(3===e&&(a(b,d,-c),b.defaultPrevented))return}if(g.isChromeOS&&8&d){if(a(b,d,c),b.defaultPrevented)return;d&=-9}return!!(d||c in f.FUNCTION_KEYS||c in f.PRINTABLE_KEYS)&&a(b,d,c)}function e(){h=Object.create(null)}var f=a("./keys"),g=a("./useragent"),h=null,i=0;b.addListener=function(a,b,c){if(a.addEventListener)return a.addEventListener(b,c,!1);if(a.attachEvent){var d=function(){c.call(a,window.event)};c._wrapper=d,a.attachEvent("on"+b,d)}},b.removeListener=function(a,b,c){return a.removeEventListener?a.removeEventListener(b,c,!1):void(a.detachEvent&&a.detachEvent("on"+b,c._wrapper||c))},b.stopEvent=function(a){return b.stopPropagation(a),b.preventDefault(a),!1},b.stopPropagation=function(a){a.stopPropagation?a.stopPropagation():a.cancelBubble=!0},b.preventDefault=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1},b.getButton=function(a){return"dblclick"==a.type?0:"contextmenu"==a.type||g.isMac&&a.ctrlKey&&!a.altKey&&!a.shiftKey?2:a.preventDefault?a.button:{1:0,2:2,4:1}[a.button]},b.capture=function(a,c,d){function e(a){c&&c(a),d&&d(a),b.removeListener(document,"mousemove",c,!0),b.removeListener(document,"mouseup",e,!0),b.removeListener(document,"dragstart",e,!0)}return b.addListener(document,"mousemove",c,!0),b.addListener(document,"mouseup",e,!0),b.addListener(document,"dragstart",e,!0),e},b.addTouchMoveListener=function(a,c){if("ontouchmove"in a){var d,e;b.addListener(a,"touchstart",function(a){var b=a.changedTouches[0];d=b.clientX,e=b.clientY}),b.addListener(a,"touchmove",function(a){var b=1,f=a.changedTouches[0];a.wheelX=-(f.clientX-d)/b,a.wheelY=-(f.clientY-e)/b,d=f.clientX,e=f.clientY,c(a)})}},b.addMouseWheelListener=function(a,c){"onmousewheel"in a?b.addListener(a,"mousewheel",function(a){var b=8;void 0!==a.wheelDeltaX?(a.wheelX=-a.wheelDeltaX/b,a.wheelY=-a.wheelDeltaY/b):(a.wheelX=0,a.wheelY=-a.wheelDelta/b),c(a)}):"onwheel"in a?b.addListener(a,"wheel",function(a){var b=.35;switch(a.deltaMode){case a.DOM_DELTA_PIXEL:a.wheelX=a.deltaX*b||0,a.wheelY=a.deltaY*b||0;break;case a.DOM_DELTA_LINE:case a.DOM_DELTA_PAGE:a.wheelX=5*(a.deltaX||0),a.wheelY=5*(a.deltaY||0)}c(a)}):b.addListener(a,"DOMMouseScroll",function(a){a.axis&&a.axis==a.HORIZONTAL_AXIS?(a.wheelX=5*(a.detail||0),a.wheelY=0):(a.wheelX=0,a.wheelY=5*(a.detail||0)),c(a)})},b.addMultiMouseDownListener=function(a,c,d,e){function f(a){if(0!==b.getButton(a)?l=0:a.detail>1?(l++,l>4&&(l=1)):l=1,g.isIE){var f=Math.abs(a.clientX-i)>5||Math.abs(a.clientY-j)>5;k&&!f||(l=1),k&&clearTimeout(k),k=setTimeout(function(){k=null},c[l-1]||600),1==l&&(i=a.clientX,j=a.clientY)}if(a._clicks=l,d[e]("mousedown",a),l>4)l=0;else if(l>1)return d[e](m[l],a)}function h(a){l=2,k&&clearTimeout(k),k=setTimeout(function(){k=null},c[l-1]||600),d[e]("mousedown",a),d[e](m[l],a)}var i,j,k,l=0,m={2:"dblclick",3:"tripleclick",4:"quadclick"};Array.isArray(a)||(a=[a]),a.forEach(function(a){b.addListener(a,"mousedown",f),g.isOldIE&&b.addListener(a,"dblclick",h)})};var j=!g.isMac||!g.isOpera||"KeyboardEvent"in window?function(a){return 0|(a.ctrlKey?1:0)|(a.altKey?2:0)|(a.shiftKey?4:0)|(a.metaKey?8:0)}:function(a){return 0|(a.metaKey?1:0)|(a.altKey?2:0)|(a.shiftKey?4:0)|(a.ctrlKey?8:0)};if(b.getModifierString=function(a){return f.KEY_MODS[j(a)]},b.addCommandKeyListener=function(a,c){var f=b.addListener;if(g.isOldGecko||g.isOpera&&!("KeyboardEvent"in window)){var i=null;f(a,"keydown",function(a){i=a.keyCode}),f(a,"keypress",function(a){return d(c,a,i)})}else{var j=null;f(a,"keydown",function(a){h[a.keyCode]=(h[a.keyCode]||0)+1;var b=d(c,a,a.keyCode);return j=a.defaultPrevented,b}),f(a,"keypress",function(a){j&&(a.ctrlKey||a.altKey||a.shiftKey||a.metaKey)&&(b.stopEvent(a),j=null)}),f(a,"keyup",function(a){h[a.keyCode]=null}),h||(e(),f(window,"focus",e))}},"object"==typeof window&&window.postMessage&&!g.isOldIE){var k=1;b.nextTick=function(a,c){c=c||window;var d="zero-timeout-message-"+k;b.addListener(c,"message",function e(f){f.data==d&&(b.stopPropagation(f),b.removeListener(c,"message",e),a())}),c.postMessage(d,"*")}}b.nextFrame="object"==typeof window&&(window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame),b.nextFrame?b.nextFrame=b.nextFrame.bind(window):b.nextFrame=function(a){setTimeout(a,17)}}),define("ace/lib/lang",["require","exports","module"],function(a,b,c){"use strict";b.last=function(a){return a[a.length-1]},b.stringReverse=function(a){return a.split("").reverse().join("")},b.stringRepeat=function(a,b){for(var c="";b>0;)1&b&&(c+=a),(b>>=1)&&(a+=a);return c};var d=/^\s\s*/,e=/\s\s*$/;b.stringTrimLeft=function(a){return a.replace(d,"")},b.stringTrimRight=function(a){return a.replace(e,"")},b.copyObject=function(a){var b={};for(var c in a)b[c]=a[c];return b},b.copyArray=function(a){for(var b=[],c=0,d=a.length;c=53&&F()}},O=g.delayedCall(M,50);d.addListener(l,"compositionstart",L),e.isGecko?d.addListener(l,"text",function(){O.schedule()}):(d.addListener(l,"keyup",function(){O.schedule()}),d.addListener(l,"keydown",function(){O.schedule()})),d.addListener(l,"compositionend",N),this.getElement=function(){return l},this.setReadOnly=function(a){l.readOnly=a},this.onContextMenu=function(a){D=!0,c(b.selection.isEmpty()),b._emit("nativecontextmenu",{target:b,domEvent:a}),this.moveToMouse(a,!0)},this.moveToMouse=function(a,c){if(c||!e.isOldIE){q||(q=l.style.cssText),l.style.cssText=(c?"z-index:100000;":"")+"height:"+l.style.height+";"+(e.isIE?"opacity:0.1;":"");var g=b.container.getBoundingClientRect(),h=f.computedStyle(b.container),i=g.top+(parseInt(h.borderTopWidth)||0),j=g.left+(parseInt(g.borderLeftWidth)||0),m=g.bottom-i-l.clientHeight-2,n=function(a){l.style.left=a.clientX-j-2+"px",l.style.top=Math.min(a.clientY-i-2,m)+"px"};n(a),"mousedown"==a.type&&(b.renderer.$keepTextAreaAtCursor&&(b.renderer.$keepTextAreaAtCursor=null),clearTimeout(P),e.isWin&&!e.isOldIE&&d.capture(b.container,n,k))}},this.onContextMenuClose=k;var P,Q=function(a){b.textInput.onContextMenu(a),k()};d.addListener(l,"mouseup",Q),d.addListener(l,"mousedown",function(a){a.preventDefault(),k()}),d.addListener(b.renderer.scroller,"contextmenu",Q),d.addListener(l,"contextmenu",Q)};b.TextInput=j}),define("ace/mouse/default_handlers",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(a,b,c){ +"use strict";function d(a){a.$clickSelection=null;var b=a.editor;b.setDefaultHandler("mousedown",this.onMouseDown.bind(a)),b.setDefaultHandler("dblclick",this.onDoubleClick.bind(a)),b.setDefaultHandler("tripleclick",this.onTripleClick.bind(a)),b.setDefaultHandler("quadclick",this.onQuadClick.bind(a)),b.setDefaultHandler("mousewheel",this.onMouseWheel.bind(a)),b.setDefaultHandler("touchmove",this.onTouchMove.bind(a));var c=["select","startSelect","selectEnd","selectAllEnd","selectByWordsEnd","selectByLinesEnd","dragWait","dragWaitEnd","focusWait"];c.forEach(function(b){a[b]=this[b]},this),a.selectByLines=this.extendSelectionBy.bind(a,"getLineRange"),a.selectByWords=this.extendSelectionBy.bind(a,"getWordRange")}function e(a,b,c,d){return Math.sqrt(Math.pow(c-a,2)+Math.pow(d-b,2))}function f(a,b){if(a.start.row==a.end.row)var c=2*b.column-a.start.column-a.end.column;else if(a.start.row!=a.end.row-1||a.start.column||a.end.column)var c=2*b.row-a.start.row-a.end.row;else var c=b.column-4;return c<0?{cursor:a.start,anchor:a.end}:{cursor:a.end,anchor:a.start}}var g=(a("../lib/dom"),a("../lib/event"),a("../lib/useragent"),0);(function(){this.onMouseDown=function(a){var b=a.inSelection(),c=a.getDocumentPosition();this.mousedownEvent=a;var d=this.editor,e=a.getButton();if(0!==e){var f=d.getSelectionRange(),g=f.isEmpty();return d.$blockScrolling++,(g||1==e)&&d.selection.moveToPosition(c),d.$blockScrolling--,void(2==e&&d.textInput.onContextMenu(a.domEvent))}return this.mousedownEvent.time=Date.now(),!b||d.isFocused()||(d.focus(),!this.$focusTimout||this.$clickSelection||d.inMultiSelectMode)?(this.captureMouse(a),this.startSelect(c,a.domEvent._clicks>1),a.preventDefault()):(this.setState("focusWait"),void this.captureMouse(a))},this.startSelect=function(a,b){a=a||this.editor.renderer.screenToTextCoordinates(this.x,this.y);var c=this.editor;c.$blockScrolling++,this.mousedownEvent.getShiftKey()?c.selection.selectToPosition(a):b||c.selection.moveToPosition(a),b||this.select(),c.renderer.scroller.setCapture&&c.renderer.scroller.setCapture(),c.setStyle("ace_selecting"),this.setState("select"),c.$blockScrolling--},this.select=function(){var a,b=this.editor,c=b.renderer.screenToTextCoordinates(this.x,this.y);if(b.$blockScrolling++,this.$clickSelection){var d=this.$clickSelection.comparePoint(c);if(d==-1)a=this.$clickSelection.end;else if(1==d)a=this.$clickSelection.start;else{var e=f(this.$clickSelection,c);c=e.cursor,a=e.anchor}b.selection.setSelectionAnchor(a.row,a.column)}b.selection.selectToPosition(c),b.$blockScrolling--,b.renderer.scrollCursorIntoView()},this.extendSelectionBy=function(a){var b,c=this.editor,d=c.renderer.screenToTextCoordinates(this.x,this.y),e=c.selection[a](d.row,d.column);if(c.$blockScrolling++,this.$clickSelection){var g=this.$clickSelection.comparePoint(e.start),h=this.$clickSelection.comparePoint(e.end);if(g==-1&&h<=0)b=this.$clickSelection.end,e.end.row==d.row&&e.end.column==d.column||(d=e.start);else if(1==h&&g>=0)b=this.$clickSelection.start,e.start.row==d.row&&e.start.column==d.column||(d=e.end);else if(g==-1&&1==h)d=e.end,b=e.start;else{var i=f(this.$clickSelection,d);d=i.cursor,b=i.anchor}c.selection.setSelectionAnchor(b.row,b.column)}c.selection.selectToPosition(d),c.$blockScrolling--,c.renderer.scrollCursorIntoView()},this.selectEnd=this.selectAllEnd=this.selectByWordsEnd=this.selectByLinesEnd=function(){this.$clickSelection=null,this.editor.unsetStyle("ace_selecting"),this.editor.renderer.scroller.releaseCapture&&this.editor.renderer.scroller.releaseCapture()},this.focusWait=function(){var a=e(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y),b=Date.now();(a>g||b-this.mousedownEvent.time>this.$focusTimout)&&this.startSelect(this.mousedownEvent.getDocumentPosition())},this.onDoubleClick=function(a){var b=a.getDocumentPosition(),c=this.editor,d=c.session,e=d.getBracketRange(b);e?(e.isEmpty()&&(e.start.column--,e.end.column++),this.setState("select")):(e=c.selection.getWordRange(b.row,b.column),this.setState("selectByWords")),this.$clickSelection=e,this.select()},this.onTripleClick=function(a){var b=a.getDocumentPosition(),c=this.editor;this.setState("selectByLines");var d=c.getSelectionRange();d.isMultiLine()&&d.contains(b.row,b.column)?(this.$clickSelection=c.selection.getLineRange(d.start.row),this.$clickSelection.end=c.selection.getLineRange(d.end.row).end):this.$clickSelection=c.selection.getLineRange(b.row),this.select()},this.onQuadClick=function(a){var b=this.editor;b.selectAll(),this.$clickSelection=b.getSelectionRange(),this.setState("selectAll")},this.onMouseWheel=function(a){if(!a.getAccelKey()){a.getShiftKey()&&a.wheelY&&!a.wheelX&&(a.wheelX=a.wheelY,a.wheelY=0);var b=a.domEvent.timeStamp,c=b-(this.$lastScrollTime||0),d=this.editor,e=d.renderer.isScrollableBy(a.wheelX*a.speed,a.wheelY*a.speed);return e||c<200?(this.$lastScrollTime=b,d.renderer.scrollBy(a.wheelX*a.speed,a.wheelY*a.speed),a.stop()):void 0}},this.onTouchMove=function(a){var b=a.domEvent.timeStamp,c=b-(this.$lastScrollTime||0),d=this.editor,e=d.renderer.isScrollableBy(a.wheelX*a.speed,a.wheelY*a.speed);if(e||c<200)return this.$lastScrollTime=b,d.renderer.scrollBy(a.wheelX*a.speed,a.wheelY*a.speed),a.stop()}}).call(d.prototype),b.DefaultHandlers=d}),define("ace/tooltip",["require","exports","module","ace/lib/oop","ace/lib/dom"],function(a,b,c){"use strict";function d(a){this.isOpen=!1,this.$element=null,this.$parentNode=a}var e=(a("./lib/oop"),a("./lib/dom"));(function(){this.$init=function(){return this.$element=e.createElement("div"),this.$element.className="ace_tooltip",this.$element.style.display="none",this.$parentNode.appendChild(this.$element),this.$element},this.getElement=function(){return this.$element||this.$init()},this.setText=function(a){e.setInnerText(this.getElement(),a)},this.setHtml=function(a){this.getElement().innerHTML=a},this.setPosition=function(a,b){this.getElement().style.left=a+"px",this.getElement().style.top=b+"px"},this.setClassName=function(a){e.addCssClass(this.getElement(),a)},this.show=function(a,b,c){null!=a&&this.setText(a),null!=b&&null!=c&&this.setPosition(b,c),this.isOpen||(this.getElement().style.display="block",this.isOpen=!0)},this.hide=function(){this.isOpen&&(this.getElement().style.display="none",this.isOpen=!1)},this.getHeight=function(){return this.getElement().offsetHeight},this.getWidth=function(){return this.getElement().offsetWidth}}).call(d.prototype),b.Tooltip=d}),define("ace/mouse/default_gutter_handler",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/event","ace/tooltip"],function(a,b,c){"use strict";function d(a){function b(){var b=l.getDocumentPosition().row,e=i.$annotations[b];if(!e)return c();var f=g.session.getLength();if(b==f){var h=g.renderer.pixelToScreenCoordinates(0,l.y).row,k=l.$pos;if(h>g.session.documentToScreenRow(k.row,k.column))return c()}if(m!=e)if(m=e.text.join("
"),j.setHtml(m),j.show(),g._signal("showGutterTooltip",j),g.on("mousewheel",c),a.$tooltipFollowsMouse)d(l);else{var n=l.domEvent.target,o=n.getBoundingClientRect(),p=j.getElement().style;p.left=o.right+"px",p.top=o.bottom+"px"}}function c(){k&&(k=clearTimeout(k)),m&&(j.hide(),m=null,g._signal("hideGutterTooltip",j),g.removeEventListener("mousewheel",c))}function d(a){j.setPosition(a.x,a.y)}var g=a.editor,i=g.renderer.$gutterLayer,j=new e(g.container);a.editor.setDefaultHandler("guttermousedown",function(b){if(g.isFocused()&&0==b.getButton()){var c=i.getRegion(b);if("foldWidgets"!=c){var d=b.getDocumentPosition().row,e=g.session.selection;if(b.getShiftKey())e.selectTo(d,0);else{if(2==b.domEvent.detail)return g.selectAll(),b.preventDefault();a.$clickSelection=g.selection.getLineRange(d)}return a.setState("selectByLines"),a.captureMouse(b),b.preventDefault()}}});var k,l,m;a.editor.setDefaultHandler("guttermousemove",function(e){var g=e.domEvent.target||e.domEvent.srcElement;return f.hasCssClass(g,"ace_fold-widget")?c():(m&&a.$tooltipFollowsMouse&&d(e),l=e,void(k||(k=setTimeout(function(){k=null,l&&!a.isMousePressed?b():c()},50))))}),h.addListener(g.renderer.$gutter,"mouseout",function(a){l=null,m&&!k&&(k=setTimeout(function(){k=null,c()},50))}),g.on("changeSession",c)}function e(a){i.call(this,a)}var f=a("../lib/dom"),g=a("../lib/oop"),h=a("../lib/event"),i=a("../tooltip").Tooltip;g.inherits(e,i),function(){this.setPosition=function(a,b){var c=window.innerWidth||document.documentElement.clientWidth,d=window.innerHeight||document.documentElement.clientHeight,e=this.getWidth(),f=this.getHeight();a+=15,b+=15,a+e>c&&(a-=a+e-c),b+f>d&&(b-=20+f),i.prototype.setPosition.call(this,a,b)}}.call(e.prototype),b.GutterHandler=d}),define("ace/mouse/mouse_event",["require","exports","module","ace/lib/event","ace/lib/useragent"],function(a,b,c){"use strict";var d=a("../lib/event"),e=a("../lib/useragent"),f=b.MouseEvent=function(a,b){this.domEvent=a,this.editor=b,this.x=this.clientX=a.clientX,this.y=this.clientY=a.clientY,this.$pos=null,this.$inSelection=null,this.propagationStopped=!1,this.defaultPrevented=!1};(function(){this.stopPropagation=function(){d.stopPropagation(this.domEvent),this.propagationStopped=!0},this.preventDefault=function(){d.preventDefault(this.domEvent),this.defaultPrevented=!0},this.stop=function(){this.stopPropagation(),this.preventDefault()},this.getDocumentPosition=function(){return this.$pos?this.$pos:(this.$pos=this.editor.renderer.screenToTextCoordinates(this.clientX,this.clientY),this.$pos)},this.inSelection=function(){if(null!==this.$inSelection)return this.$inSelection;var a=this.editor,b=a.getSelectionRange();if(b.isEmpty())this.$inSelection=!1;else{var c=this.getDocumentPosition();this.$inSelection=b.contains(c.row,c.column)}return this.$inSelection},this.getButton=function(){return d.getButton(this.domEvent)},this.getShiftKey=function(){return this.domEvent.shiftKey},this.getAccelKey=e.isMac?function(){return this.domEvent.metaKey}:function(){return this.domEvent.ctrlKey}}).call(f.prototype)}),define("ace/mouse/dragdrop_handler",["require","exports","module","ace/lib/dom","ace/lib/event","ace/lib/useragent"],function(a,b,c){"use strict";function d(a){function b(a,b){var c=Date.now(),d=!b||a.row!=b.row,f=!b||a.column!=b.column;if(!C||d||f)q.$blockScrolling+=1,q.moveCursorToPosition(a),q.$blockScrolling-=1,C=c,D={x:u,y:v};else{var g=e(D.x,D.y,u,v);g>k?C=null:c-C>=j&&(q.renderer.scrollCursorIntoView(),C=null)}}function c(a,b){var c=Date.now(),d=q.renderer.layerConfig.lineHeight,e=q.renderer.layerConfig.characterWidth,f=q.renderer.scroller.getBoundingClientRect(),g={x:{left:u-f.left,right:f.right-u},y:{top:v-f.top,bottom:f.bottom-v}},h=Math.min(g.x.left,g.x.right),j=Math.min(g.y.top,g.y.bottom),k={row:a.row,column:a.column};h/e<=2&&(k.column+=g.x.left=i&&q.renderer.scrollCursorIntoView(k):B=c:B=null}function d(){var a=y;y=q.renderer.screenToTextCoordinates(u,v),b(y,a),c(y,a)}function l(){x=q.selection.toOrientedRange(),t=q.session.addMarker(x,"ace_selection",q.getSelectionStyle()),q.clearSelection(),q.isFocused()&&q.renderer.$cursorLayer.setBlinking(!1),clearInterval(w),d(),w=setInterval(d,20),F=0,g.addListener(document,"mousemove",n)}function m(){clearInterval(w),q.session.removeMarker(t),t=null,q.$blockScrolling+=1,q.selection.fromOrientedRange(x),q.$blockScrolling-=1,q.isFocused()&&!A&&q.renderer.$cursorLayer.setBlinking(!q.getReadOnly()),x=null,y=null,F=0,B=null,C=null,g.removeListener(document,"mousemove",n)}function n(){null==G&&(G=setTimeout(function(){null!=G&&t&&m()},20))}function o(a){var b=a.types;return!b||Array.prototype.some.call(b,function(a){return"text/plain"==a||"Text"==a})}function p(a){var b=["copy","copymove","all","uninitialized"],c=["move","copymove","linkmove","all","uninitialized"],d=h.isMac?a.altKey:a.ctrlKey,e="uninitialized";try{e=a.dataTransfer.effectAllowed.toLowerCase()}catch(a){}var f="none";return d&&b.indexOf(e)>=0?f="copy":c.indexOf(e)>=0?f="move":b.indexOf(e)>=0&&(f="copy"),f}var q=a.editor,r=f.createElement("img");r.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",h.isOpera&&(r.style.cssText="width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;");var s=["dragWait","dragWaitEnd","startDrag","dragReadyEnd","onMouseDrag"];s.forEach(function(b){a[b]=this[b]},this),q.addEventListener("mousedown",this.onMouseDown.bind(a));var t,u,v,w,x,y,z,A,B,C,D,E=q.container,F=0;this.onDragStart=function(a){if(this.cancelDrag||!E.draggable){var b=this;return setTimeout(function(){b.startSelect(),b.captureMouse(a)},0),a.preventDefault()}x=q.getSelectionRange();var c=a.dataTransfer;c.effectAllowed=q.getReadOnly()?"copy":"copyMove",h.isOpera&&(q.container.appendChild(r),r.scrollTop=0),c.setDragImage&&c.setDragImage(r,0,0),h.isOpera&&q.container.removeChild(r),c.clearData(),c.setData("Text",q.session.getTextRange()),A=!0,this.setState("drag")},this.onDragEnd=function(a){if(E.draggable=!1,A=!1,this.setState(null),!q.getReadOnly()){var b=a.dataTransfer.dropEffect;z||"move"!=b||q.session.remove(q.getSelectionRange()),q.renderer.$cursorLayer.setBlinking(!0)}this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle("")},this.onDragEnter=function(a){if(!q.getReadOnly()&&o(a.dataTransfer))return u=a.clientX,v=a.clientY,t||l(),F++,a.dataTransfer.dropEffect=z=p(a),g.preventDefault(a)},this.onDragOver=function(a){if(!q.getReadOnly()&&o(a.dataTransfer))return u=a.clientX,v=a.clientY,t||(l(),F++),null!==G&&(G=null),a.dataTransfer.dropEffect=z=p(a),g.preventDefault(a)},this.onDragLeave=function(a){if(F--,F<=0&&t)return m(),z=null,g.preventDefault(a)},this.onDrop=function(a){if(y){var b=a.dataTransfer;if(A)switch(z){case"move":x=x.contains(y.row,y.column)?{start:y,end:y}:q.moveText(x,y);break;case"copy":x=q.moveText(x,y,!0)}else{var c=b.getData("Text");x={start:y,end:q.session.insert(y,c)},q.focus(),z=null}return m(),g.preventDefault(a)}},g.addListener(E,"dragstart",this.onDragStart.bind(a)),g.addListener(E,"dragend",this.onDragEnd.bind(a)),g.addListener(E,"dragenter",this.onDragEnter.bind(a)),g.addListener(E,"dragover",this.onDragOver.bind(a)),g.addListener(E,"dragleave",this.onDragLeave.bind(a)),g.addListener(E,"drop",this.onDrop.bind(a));var G=null}function e(a,b,c,d){return Math.sqrt(Math.pow(c-a,2)+Math.pow(d-b,2))}var f=a("../lib/dom"),g=a("../lib/event"),h=a("../lib/useragent"),i=200,j=200,k=5;(function(){this.dragWait=function(){var a=Date.now()-this.mousedownEvent.time;a>this.editor.getDragDelay()&&this.startDrag()},this.dragWaitEnd=function(){var a=this.editor.container;a.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()),this.selectEnd()},this.dragReadyEnd=function(a){this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly()),this.editor.unsetStyle("ace_dragging"),this.editor.renderer.setCursorStyle(""),this.dragWaitEnd()},this.startDrag=function(){this.cancelDrag=!1;var a=this.editor,b=a.container;b.draggable=!0,a.renderer.$cursorLayer.setBlinking(!1),a.setStyle("ace_dragging");var c=h.isWin?"default":"move";a.renderer.setCursorStyle(c),this.setState("dragReady")},this.onMouseDrag=function(a){var b=this.editor.container;if(h.isIE&&"dragReady"==this.state){var c=e(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);c>3&&b.dragDrop()}if("dragWait"===this.state){var c=e(this.mousedownEvent.x,this.mousedownEvent.y,this.x,this.y);c>0&&(b.draggable=!1,this.startSelect(this.mousedownEvent.getDocumentPosition()))}},this.onMouseDown=function(a){if(this.$dragEnabled){this.mousedownEvent=a;var b=this.editor,c=a.inSelection(),d=a.getButton(),e=a.domEvent.detail||1;if(1===e&&0===d&&c){if(a.editor.inMultiSelectMode&&(a.getAccelKey()||a.getShiftKey()))return;this.mousedownEvent.time=Date.now();var f=a.domEvent.target||a.domEvent.srcElement;if("unselectable"in f&&(f.unselectable="on"),b.getDragDelay()){if(h.isWebKit){this.cancelDrag=!0;var g=b.container;g.draggable=!0}this.setState("dragWait")}else this.startDrag();this.captureMouse(a,this.onMouseDrag.bind(this)),a.defaultPrevented=!0}}}}).call(d.prototype),b.DragdropHandler=d}),define("ace/lib/net",["require","exports","module","ace/lib/dom"],function(a,b,c){"use strict";var d=a("./dom");b.get=function(a,b){var c=new XMLHttpRequest;c.open("GET",a,!0),c.onreadystatechange=function(){4===c.readyState&&b(c.responseText)},c.send(null)},b.loadScript=function(a,b){var c=d.getDocumentHead(),e=document.createElement("script");e.src=a,c.appendChild(e),e.onload=e.onreadystatechange=function(a,c){!c&&e.readyState&&"loaded"!=e.readyState&&"complete"!=e.readyState||(e=e.onload=e.onreadystatechange=null,c||b())}},b.qualifyURL=function(a){var b=document.createElement("a");return b.href=a,b.href}}),define("ace/lib/event_emitter",["require","exports","module"],function(a,b,c){"use strict";var d={},e=function(){this.propagationStopped=!0},f=function(){this.defaultPrevented=!0};d._emit=d._dispatchEvent=function(a,b){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var c=this._eventRegistry[a]||[],d=this._defaultHandlers[a];if(c.length||d){"object"==typeof b&&b||(b={}),b.type||(b.type=a),b.stopPropagation||(b.stopPropagation=e),b.preventDefault||(b.preventDefault=f),c=c.slice();for(var g=0;g1&&(e=c[c.length-2]);var g=j[b+"Path"];return null==g?g=j.basePath:"/"==d&&(b=d=""),g&&"/"!=g.slice(-1)&&(g+="/"),g+b+d+e+this.get("suffix")},b.setModuleUrl=function(a,b){return j.$moduleUrls[a]=b},b.$loading={},b.loadModule=function(c,d){var e,f;Array.isArray(c)&&(f=c[0],c=c[1]);try{e=a(c)}catch(h){}if(e&&!b.$loading[c])return d&&d(e);if(b.$loading[c]||(b.$loading[c]=[]),b.$loading[c].push(d),!(b.$loading[c].length>1)){var i=function(){a([c],function(a){b._emit("load.module",{name:c,module:a});var d=b.$loading[c];b.$loading[c]=null,d.forEach(function(b){b&&b(a)})})};return b.get("packaged")?void g.loadScript(b.moduleUrl(c,f),i):i()}},d(!0),b.init=d}),define("ace/mouse/mouse_handler",["require","exports","module","ace/lib/event","ace/lib/useragent","ace/mouse/default_handlers","ace/mouse/default_gutter_handler","ace/mouse/mouse_event","ace/mouse/dragdrop_handler","ace/config"],function(a,b,c){"use strict";var d=a("../lib/event"),e=a("../lib/useragent"),f=a("./default_handlers").DefaultHandlers,g=a("./default_gutter_handler").GutterHandler,h=a("./mouse_event").MouseEvent,i=a("./dragdrop_handler").DragdropHandler,j=a("../config"),k=function(a){var b=this;this.editor=a,new f(this),new g(this),new i(this);var c=function(b){var c=!document.hasFocus||!document.hasFocus()||!a.isFocused()&&document.activeElement==(a.textInput&&a.textInput.getElement());c&&window.focus(),a.focus()},h=a.renderer.getMouseEventTarget();d.addListener(h,"click",this.onMouseEvent.bind(this,"click")),d.addListener(h,"mousemove",this.onMouseMove.bind(this,"mousemove")),d.addMultiMouseDownListener([h,a.renderer.scrollBarV&&a.renderer.scrollBarV.inner,a.renderer.scrollBarH&&a.renderer.scrollBarH.inner,a.textInput&&a.textInput.getElement()].filter(Boolean),[400,300,250],this,"onMouseEvent"),d.addMouseWheelListener(a.container,this.onMouseWheel.bind(this,"mousewheel")),d.addTouchMoveListener(a.container,this.onTouchMove.bind(this,"touchmove"));var j=a.renderer.$gutter;d.addListener(j,"mousedown",this.onMouseEvent.bind(this,"guttermousedown")),d.addListener(j,"click",this.onMouseEvent.bind(this,"gutterclick")),d.addListener(j,"dblclick",this.onMouseEvent.bind(this,"gutterdblclick")),d.addListener(j,"mousemove",this.onMouseEvent.bind(this,"guttermousemove")),d.addListener(h,"mousedown",c),d.addListener(j,"mousedown",c),e.isIE&&a.renderer.scrollBarV&&(d.addListener(a.renderer.scrollBarV.element,"mousedown",c),d.addListener(a.renderer.scrollBarH.element,"mousedown",c)),a.on("mousemove",function(c){if(!b.state&&!b.$dragDelay&&b.$dragEnabled){var d=a.renderer.screenToTextCoordinates(c.x,c.y),e=a.session.selection.getRange(),f=a.renderer;!e.isEmpty()&&e.insideStart(d.row,d.column)?f.setCursorStyle("default"):f.setCursorStyle("")}})};(function(){this.onMouseEvent=function(a,b){this.editor._emit(a,new h(b,this.editor))},this.onMouseMove=function(a,b){var c=this.editor._eventRegistry&&this.editor._eventRegistry.mousemove;c&&c.length&&this.editor._emit(a,new h(b,this.editor))},this.onMouseWheel=function(a,b){var c=new h(b,this.editor);c.speed=2*this.$scrollSpeed,c.wheelX=b.wheelX,c.wheelY=b.wheelY,this.editor._emit(a,c)},this.onTouchMove=function(a,b){var c=new h(b,this.editor);c.speed=1,c.wheelX=b.wheelX,c.wheelY=b.wheelY,this.editor._emit(a,c)},this.setState=function(a){this.state=a},this.captureMouse=function(a,b){this.x=a.x,this.y=a.y,this.isMousePressed=!0;var c=this.editor.renderer;c.$keepTextAreaAtCursor&&(c.$keepTextAreaAtCursor=null);var f=this,g=function(a){if(a){if(e.isWebKit&&!a.which&&f.releaseMouse)return f.releaseMouse();f.x=a.clientX,f.y=a.clientY,b&&b(a),f.mouseEvent=new h(a,f.editor),f.$mouseMoved=!0}},i=function(a){clearInterval(k),j(),f[f.state+"End"]&&f[f.state+"End"](a),f.state="",null==c.$keepTextAreaAtCursor&&(c.$keepTextAreaAtCursor=!0,c.$moveTextAreaToCursor()),f.isMousePressed=!1,f.$onCaptureMouseMove=f.releaseMouse=null,a&&f.onMouseEvent("mouseup",a)},j=function(){f[f.state]&&f[f.state](),f.$mouseMoved=!1};if(e.isOldIE&&"dblclick"==a.domEvent.type)return setTimeout(function(){i(a)});f.$onCaptureMouseMove=g,f.releaseMouse=d.capture(this.editor.container,g,i);var k=setInterval(j,20)},this.releaseMouse=null,this.cancelContextMenu=function(){var a=function(b){b&&b.domEvent&&"contextmenu"!=b.domEvent.type||(this.editor.off("nativecontextmenu",a),b&&b.domEvent&&d.stopEvent(b.domEvent))}.bind(this);setTimeout(a,10),this.editor.on("nativecontextmenu",a)}}).call(k.prototype),j.defineOptions(k.prototype,"mouseHandler",{scrollSpeed:{initialValue:2},dragDelay:{initialValue:e.isMac?150:0},dragEnabled:{initialValue:!0},focusTimout:{initialValue:0},tooltipFollowsMouse:{initialValue:!0}}),b.MouseHandler=k}),define("ace/mouse/fold_handler",["require","exports","module"],function(a,b,c){"use strict";function d(a){a.on("click",function(b){var c=b.getDocumentPosition(),d=a.session,e=d.getFoldAt(c.row,c.column,1);e&&(b.getAccelKey()?d.removeFold(e):d.expandFold(e),b.stop())}),a.on("gutterclick",function(b){var c=a.renderer.$gutterLayer.getRegion(b);if("foldWidgets"==c){var d=b.getDocumentPosition().row,e=a.session;e.foldWidgets&&e.foldWidgets[d]&&a.session.onFoldWidgetClick(d,b),a.isFocused()||a.focus(),b.stop()}}),a.on("gutterdblclick",function(b){var c=a.renderer.$gutterLayer.getRegion(b);if("foldWidgets"==c){var d=b.getDocumentPosition().row,e=a.session,f=e.getParentFoldRangeData(d,!0),g=f.range||f.firstRange;if(g){d=g.start.row;var h=e.getFoldAt(d,e.getLine(d).length,1);h?e.removeFold(h):(e.addFold("...",g),a.renderer.scrollCursorIntoView({row:g.start.row,column:0}))}b.stop()}})}b.FoldHandler=d}),define("ace/keyboard/keybinding",["require","exports","module","ace/lib/keys","ace/lib/event"],function(a,b,c){"use strict";var d=a("../lib/keys"),e=a("../lib/event"),f=function(a){this.$editor=a,this.$data={editor:a},this.$handlers=[],this.setDefaultHandler(a.commands)};(function(){this.setDefaultHandler=function(a){this.removeKeyboardHandler(this.$defaultHandler),this.$defaultHandler=a,this.addKeyboardHandler(a,0)},this.setKeyboardHandler=function(a){var b=this.$handlers;if(b[b.length-1]!=a){for(;b[b.length-1]&&b[b.length-1]!=this.$defaultHandler;)this.removeKeyboardHandler(b[b.length-1]);this.addKeyboardHandler(a,1)}},this.addKeyboardHandler=function(a,b){if(a){"function"!=typeof a||a.handleKeyboard||(a.handleKeyboard=a);var c=this.$handlers.indexOf(a);c!=-1&&this.$handlers.splice(c,1),void 0==b?this.$handlers.push(a):this.$handlers.splice(b,0,a),c==-1&&a.attach&&a.attach(this.$editor)}},this.removeKeyboardHandler=function(a){var b=this.$handlers.indexOf(a);return b!=-1&&(this.$handlers.splice(b,1),a.detach&&a.detach(this.$editor),!0)},this.getKeyboardHandler=function(){return this.$handlers[this.$handlers.length-1]},this.getStatusText=function(){var a=this.$data,b=a.editor;return this.$handlers.map(function(c){return c.getStatusText&&c.getStatusText(b,a)||""}).filter(Boolean).join(" ")},this.$callKeyboardHandlers=function(a,b,c,d){for(var f,g=!1,h=this.$editor.commands,i=this.$handlers.length;i--&&(f=this.$handlers[i].handleKeyboard(this.$data,a,b,c,d),!(f&&f.command&&(g="null"==f.command||h.exec(f.command,this.$editor,f.args,d),g&&d&&a!=-1&&1!=f.passEvent&&1!=f.command.passEvent&&e.stopEvent(d),g))););return g||a!=-1||(f={command:"insertstring"},g=h.exec("insertstring",this.$editor,b)),g&&this.$editor._signal&&this.$editor._signal("keyboardActivity",f),g},this.onCommandKey=function(a,b,c){var e=d.keyCodeToString(c);this.$callKeyboardHandlers(b,e,c,a)},this.onTextInput=function(a){this.$callKeyboardHandlers(-1,a)}}).call(f.prototype),b.KeyBinding=f}),define("ace/range",["require","exports","module"],function(a,b,c){"use strict";var d=function(a,b){return a.row-b.row||a.column-b.column},e=function(a,b,c,d){this.start={row:a,column:b},this.end={row:c,column:d}};(function(){this.isEqual=function(a){return this.start.row===a.start.row&&this.end.row===a.end.row&&this.start.column===a.start.column&&this.end.column===a.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(a,b){return 0==this.compare(a,b)},this.compareRange=function(a){var b,c=a.end,d=a.start;return b=this.compare(c.row,c.column),1==b?(b=this.compare(d.row,d.column),1==b?2:0==b?1:0):b==-1?-2:(b=this.compare(d.row,d.column),b==-1?-1:1==b?42:0)},this.comparePoint=function(a){return this.compare(a.row,a.column)},this.containsRange=function(a){return 0==this.comparePoint(a.start)&&0==this.comparePoint(a.end)},this.intersects=function(a){var b=this.compareRange(a);return b==-1||0==b||1==b},this.isEnd=function(a,b){return this.end.row==a&&this.end.column==b},this.isStart=function(a,b){return this.start.row==a&&this.start.column==b},this.setStart=function(a,b){"object"==typeof a?(this.start.column=a.column,this.start.row=a.row):(this.start.row=a,this.start.column=b)},this.setEnd=function(a,b){"object"==typeof a?(this.end.column=a.column,this.end.row=a.row):(this.end.row=a,this.end.column=b)},this.inside=function(a,b){return 0==this.compare(a,b)&&(!this.isEnd(a,b)&&!this.isStart(a,b))},this.insideStart=function(a,b){return 0==this.compare(a,b)&&!this.isEnd(a,b)},this.insideEnd=function(a,b){return 0==this.compare(a,b)&&!this.isStart(a,b)},this.compare=function(a,b){return this.isMultiLine()||a!==this.start.row?athis.end.row?1:this.start.row===a?b>=this.start.column?0:-1:this.end.row===a?b<=this.end.column?0:1:0:bthis.end.column?1:0},this.compareStart=function(a,b){return this.start.row==a&&this.start.column==b?-1:this.compare(a,b)},this.compareEnd=function(a,b){return this.end.row==a&&this.end.column==b?1:this.compare(a,b)},this.compareInside=function(a,b){return this.end.row==a&&this.end.column==b?1:this.start.row==a&&this.start.column==b?-1:this.compare(a,b); +},this.clipRows=function(a,b){if(this.end.row>b)var c={row:b+1,column:0};else if(this.end.rowb)var d={row:b+1,column:0};else if(this.start.rowb.row||a.row==b.row&&a.column>b.column},this.getRange=function(){var a=this.anchor,b=this.lead;return this.isEmpty()?g.fromPoints(b,b):this.isBackwards()?g.fromPoints(b,a):g.fromPoints(a,b)},this.clearSelection=function(){this.$isEmpty||(this.$isEmpty=!0,this._emit("changeSelection"))},this.selectAll=function(){var a=this.doc.getLength()-1;this.setSelectionAnchor(0,0),this.moveCursorTo(a,this.doc.getLine(a).length)},this.setRange=this.setSelectionRange=function(a,b){b?(this.setSelectionAnchor(a.end.row,a.end.column),this.selectTo(a.start.row,a.start.column)):(this.setSelectionAnchor(a.start.row,a.start.column),this.selectTo(a.end.row,a.end.column)),this.getRange().isEmpty()&&(this.$isEmpty=!0),this.$desiredColumn=null},this.$moveSelection=function(a){var b=this.lead;this.$isEmpty&&this.setSelectionAnchor(b.row,b.column),a.call(this)},this.selectTo=function(a,b){this.$moveSelection(function(){this.moveCursorTo(a,b)})},this.selectToPosition=function(a){this.$moveSelection(function(){this.moveCursorToPosition(a)})},this.moveTo=function(a,b){this.clearSelection(),this.moveCursorTo(a,b)},this.moveToPosition=function(a){this.clearSelection(),this.moveCursorToPosition(a)},this.selectUp=function(){this.$moveSelection(this.moveCursorUp)},this.selectDown=function(){this.$moveSelection(this.moveCursorDown)},this.selectRight=function(){this.$moveSelection(this.moveCursorRight)},this.selectLeft=function(){this.$moveSelection(this.moveCursorLeft)},this.selectLineStart=function(){this.$moveSelection(this.moveCursorLineStart)},this.selectLineEnd=function(){this.$moveSelection(this.moveCursorLineEnd)},this.selectFileEnd=function(){this.$moveSelection(this.moveCursorFileEnd)},this.selectFileStart=function(){this.$moveSelection(this.moveCursorFileStart)},this.selectWordRight=function(){this.$moveSelection(this.moveCursorWordRight)},this.selectWordLeft=function(){this.$moveSelection(this.moveCursorWordLeft)},this.getWordRange=function(a,b){if("undefined"==typeof b){var c=a||this.lead;a=c.row,b=c.column}return this.session.getWordRange(a,b)},this.selectWord=function(){this.setSelectionRange(this.getWordRange())},this.selectAWord=function(){var a=this.getCursor(),b=this.session.getAWordRange(a.row,a.column);this.setSelectionRange(b)},this.getLineRange=function(a,b){var c,d="number"==typeof a?a:this.lead.row,e=this.session.getFoldLine(d);return e?(d=e.start.row,c=e.end.row):c=d,b===!0?new g(d,0,c,this.session.getLine(c).length):new g(d,0,c+1,0)},this.selectLine=function(){this.setSelectionRange(this.getLineRange())},this.moveCursorUp=function(){this.moveCursorBy(-1,0)},this.moveCursorDown=function(){this.moveCursorBy(1,0)},this.moveCursorLeft=function(){var a,b=this.lead.getPosition();if(a=this.session.getFoldAt(b.row,b.column,-1))this.moveCursorTo(a.start.row,a.start.column);else if(0===b.column)b.row>0&&this.moveCursorTo(b.row-1,this.doc.getLine(b.row-1).length);else{var c=this.session.getTabSize();this.session.isTabStop(b)&&this.doc.getLine(b.row).slice(b.column-c,b.column).split(" ").length-1==c?this.moveCursorBy(0,-c):this.moveCursorBy(0,-1)}},this.moveCursorRight=function(){var a,b=this.lead.getPosition();if(a=this.session.getFoldAt(b.row,b.column,1))this.moveCursorTo(a.end.row,a.end.column);else if(this.lead.column==this.doc.getLine(this.lead.row).length)this.lead.row0&&(b.column=d)}}this.moveCursorTo(b.row,b.column)},this.moveCursorFileEnd=function(){var a=this.doc.getLength()-1,b=this.doc.getLine(a).length;this.moveCursorTo(a,b)},this.moveCursorFileStart=function(){this.moveCursorTo(0,0)},this.moveCursorLongWordRight=function(){var a,b=this.lead.row,c=this.lead.column,d=this.doc.getLine(b),e=d.substring(c);this.session.nonTokenRe.lastIndex=0,this.session.tokenRe.lastIndex=0;var f=this.session.getFoldAt(b,c,1);return f?void this.moveCursorTo(f.end.row,f.end.column):((a=this.session.nonTokenRe.exec(e))&&(c+=this.session.nonTokenRe.lastIndex,this.session.nonTokenRe.lastIndex=0,e=d.substring(c)),c>=d.length?(this.moveCursorTo(b,d.length),this.moveCursorRight(),void(b0&&this.moveCursorWordLeft())):((f=this.session.tokenRe.exec(g))&&(c-=this.session.tokenRe.lastIndex,this.session.tokenRe.lastIndex=0),void this.moveCursorTo(b,c))},this.$shortWordEndIndex=function(a){var b,c,d=0,e=/\s/,f=this.session.tokenRe;if(f.lastIndex=0,b=this.session.tokenRe.exec(a))d=this.session.tokenRe.lastIndex;else{for(;(c=a[d])&&e.test(c);)d++;if(d<1)for(f.lastIndex=0;(c=a[d])&&!f.test(c);)if(f.lastIndex=0,d++,e.test(c)){if(d>2){d--;break}for(;(c=a[d])&&e.test(c);)d++;if(d>2)break}}return f.lastIndex=0,d},this.moveCursorShortWordRight=function(){var a=this.lead.row,b=this.lead.column,c=this.doc.getLine(a),d=c.substring(b),e=this.session.getFoldAt(a,b,1);if(e)return this.moveCursorTo(e.end.row,e.end.column);if(b==c.length){var f=this.doc.getLength();do a++,d=this.doc.getLine(a);while(a0&&/^\s*$/.test(d));c=d.length,/\s+$/.test(d)||(d="")}var f=e.stringReverse(d),g=this.$shortWordEndIndex(f);return this.moveCursorTo(b,c-g)},this.moveCursorWordRight=function(){this.session.$selectLongWords?this.moveCursorLongWordRight():this.moveCursorShortWordRight()},this.moveCursorWordLeft=function(){this.session.$selectLongWords?this.moveCursorLongWordLeft():this.moveCursorShortWordLeft()},this.moveCursorBy=function(a,b){var c=this.session.documentToScreenPosition(this.lead.row,this.lead.column);0===b&&(this.$desiredColumn?c.column=this.$desiredColumn:this.$desiredColumn=c.column);var d=this.session.screenToDocumentPosition(c.row+a,c.column);0!==a&&0===b&&d.row===this.lead.row&&d.column===this.lead.column&&this.session.lineWidgets&&this.session.lineWidgets[d.row]&&(d.row>0||a>0)&&d.row++,this.moveCursorTo(d.row,d.column+b,0===b)},this.moveCursorToPosition=function(a){this.moveCursorTo(a.row,a.column)},this.moveCursorTo=function(a,b,c){var d=this.session.getFoldAt(a,b,1);d&&(a=d.start.row,b=d.start.column),this.$keepDesiredColumnOnChange=!0,this.lead.setPosition(a,b),this.$keepDesiredColumnOnChange=!1,c||(this.$desiredColumn=null)},this.moveCursorToScreen=function(a,b,c){var d=this.session.screenToDocumentPosition(a,b);this.moveCursorTo(d.row,d.column,c)},this.detach=function(){this.lead.detach(),this.anchor.detach(),this.session=this.doc=null},this.fromOrientedRange=function(a){this.setSelectionRange(a,a.cursor==a.start),this.$desiredColumn=a.desiredColumn||this.$desiredColumn},this.toOrientedRange=function(a){var b=this.getRange();return a?(a.start.column=b.start.column,a.start.row=b.start.row,a.end.column=b.end.column,a.end.row=b.end.row):a=b,a.cursor=this.isBackwards()?a.start:a.end,a.desiredColumn=this.$desiredColumn,a},this.getRangeOfMovements=function(a){var b=this.getCursor();try{a(this);var c=this.getCursor();return g.fromPoints(b,c)}catch(d){return g.fromPoints(b,b)}finally{this.moveCursorToPosition(b)}},this.toJSON=function(){if(this.rangeCount)var a=this.ranges.map(function(a){var b=a.clone();return b.isBackwards=a.cursor==a.start,b});else{var a=this.getRange();a.isBackwards=this.isBackwards()}return a},this.fromJSON=function(a){if(void 0==a.start){if(this.rangeList){this.toSingleRange(a[0]);for(var b=a.length;b--;){var c=g.fromPoints(a[b].start,a[b].end);a[b].isBackwards&&(c.cursor=c.start),this.addRange(c,!0)}return}a=a[0]}this.rangeList&&this.toSingleRange(a),this.setSelectionRange(a,a.isBackwards)},this.isEqual=function(a){if((a.length||this.rangeCount)&&a.length!=this.rangeCount)return!1;if(!a.length||!this.ranges)return this.getRange().isEqual(a);for(var b=this.ranges.length;b--;)if(!this.ranges[b].isEqual(a[b]))return!1;return!0}}).call(h.prototype),b.Selection=h}),define("ace/tokenizer",["require","exports","module","ace/config"],function(a,b,c){"use strict";var d=a("./config"),e=2e3,f=function(a){this.states=a,this.regExps={},this.matchMappings={};for(var b in this.states){for(var c=this.states[b],d=[],e=0,f=this.matchMappings[b]={defaultToken:"text"},g="g",h=[],i=0;i1?j.onMatch=this.$applyToken:j.onMatch=j.token),l>1&&(/\\\d/.test(j.regex)?k=j.regex.replace(/\\([0-9]+)/g,function(a,b){return"\\"+(parseInt(b,10)+e+1)}):(l=1,k=this.removeCapturingGroups(j.regex)),j.splitRegex||"string"==typeof j.token||h.push(j)),f[e]=i,e+=l,d.push(k),j.onMatch||(j.onMatch=null)}}d.length||(f[0]=0,d.push("$")),h.forEach(function(a){a.splitRegex=this.createSplitterRegexp(a.regex,g)},this),this.regExps[b]=new RegExp("("+d.join(")|(")+")|($)",g)}};(function(){this.$setMaxTokenCount=function(a){e=0|a},this.$applyToken=function(a){var b=this.splitRegex.exec(a).slice(1),c=this.token.apply(this,b);if("string"==typeof c)return[{type:c,value:a}];for(var d=[],e=0,f=c.length;ek){var r=a.substring(k,q-p.length);m.type==n?m.value+=r:(m.type&&j.push(m),m={type:n,value:r})}for(var s=0;se){for(l>2*a.length&&this.reportError("infinite loop with in ace tokenizer",{startState:b,line:a});k1&&c[0]!==d&&c.unshift("#tmp",d),{tokens:j,state:c.length?c:d}},this.reportError=d.reportError}).call(f.prototype),b.Tokenizer=f}),define("ace/mode/text_highlight_rules",["require","exports","module","ace/lib/lang"],function(a,b,c){"use strict";var d=a("../lib/lang"),e=function(){this.$rules={start:[{token:"empty_line",regex:"^$"},{defaultToken:"text"}]}};(function(){this.addRules=function(a,b){if(b)for(var c in a){for(var d=a[c],e=0;e=this.$rowTokens.length;){if(this.$row+=1,a||(a=this.$session.getLength()),this.$row>=a)return this.$row=a-1,null;this.$rowTokens=this.$session.getTokens(this.$row),this.$tokenIndex=0}return this.$rowTokens[this.$tokenIndex]},this.getCurrentToken=function(){return this.$rowTokens[this.$tokenIndex]},this.getCurrentTokenRow=function(){return this.$row},this.getCurrentTokenColumn=function(){var a=this.$rowTokens,b=this.$tokenIndex,c=a[b].start;if(void 0!==c)return c;for(c=0;b>0;)b-=1,c+=a[b].value.length;return c},this.getCurrentTokenPosition=function(){return{row:this.$row,column:this.getCurrentTokenColumn()}}}).call(d.prototype),b.TokenIterator=d}),define("ace/mode/behaviour/cstyle",["require","exports","module","ace/lib/oop","ace/mode/behaviour","ace/token_iterator","ace/lib/lang"],function(a,b,c){"use strict";var d,e=a("../../lib/oop"),f=a("../behaviour").Behaviour,g=a("../../token_iterator").TokenIterator,h=a("../../lib/lang"),i=["text","paren.rparen","punctuation.operator"],j=["text","paren.rparen","punctuation.operator","comment"],k={},l=function(a){var b=-1;return a.multiSelect&&(b=a.selection.index,k.rangeCount!=a.multiSelect.rangeCount&&(k={rangeCount:a.multiSelect.rangeCount})),k[b]?d=k[b]:void(d=k[b]={autoInsertedBrackets:0,autoInsertedRow:-1,autoInsertedLineEnd:"",maybeInsertedBrackets:0,maybeInsertedRow:-1,maybeInsertedLineStart:"",maybeInsertedLineEnd:""})},m=function(a,b,c,d){var e=a.end.row-a.start.row;return{text:c+b+d,selection:[0,a.start.column+1,e,a.end.column+(e?0:1)]}},n=function(){this.add("braces","insertion",function(a,b,c,e,f){var g=c.getCursorPosition(),i=e.doc.getLine(g.row);if("{"==f){l(c);var j=c.getSelectionRange(),k=e.doc.getTextRange(j);if(""!==k&&"{"!==k&&c.getWrapBehavioursEnabled())return m(j,k,"{","}");if(n.isSaneInsertion(c,e))return/[\]\}\)]/.test(i[g.column])||c.inMultiSelectMode?(n.recordAutoInsert(c,e,"}"),{text:"{}",selection:[1,1]}):(n.recordMaybeInsert(c,e,"{"),{text:"{",selection:[1,1]})}else if("}"==f){l(c);var o=i.substring(g.column,g.column+1);if("}"==o){var p=e.$findOpeningBracket("}",{column:g.column+1,row:g.row});if(null!==p&&n.isAutoInsertedClosing(g,i,f))return n.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}else{if("\n"==f||"\r\n"==f){l(c);var q="";n.isMaybeInsertedClosing(g,i)&&(q=h.stringRepeat("}",d.maybeInsertedBrackets),n.clearMaybeInsertedClosing());var o=i.substring(g.column,g.column+1);if("}"===o){var r=e.findMatchingBracket({row:g.row,column:g.column+1},"}");if(!r)return null;var s=this.$getIndent(e.getLine(r.row))}else{if(!q)return void n.clearMaybeInsertedClosing();var s=this.$getIndent(i)}var t=s+e.getTabString();return{text:"\n"+t+"\n"+s+q,selection:[1,t.length,1,t.length]}}n.clearMaybeInsertedClosing()}}),this.add("braces","deletion",function(a,b,c,e,f){var g=e.doc.getTextRange(f);if(!f.isMultiLine()&&"{"==g){l(c);var h=e.doc.getLine(f.start.row),i=h.substring(f.end.column,f.end.column+1);if("}"==i)return f.end.column++,f;d.maybeInsertedBrackets--}}),this.add("parens","insertion",function(a,b,c,d,e){if("("==e){l(c);var f=c.getSelectionRange(),g=d.doc.getTextRange(f);if(""!==g&&c.getWrapBehavioursEnabled())return m(f,g,"(",")");if(n.isSaneInsertion(c,d))return n.recordAutoInsert(c,d,")"),{text:"()",selection:[1,1]}}else if(")"==e){l(c);var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if(")"==j){var k=d.$findOpeningBracket(")",{column:h.column+1,row:h.row});if(null!==k&&n.isAutoInsertedClosing(h,i,e))return n.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("parens","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&"("==f){l(c);var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(")"==h)return e.end.column++,e}}),this.add("brackets","insertion",function(a,b,c,d,e){if("["==e){l(c);var f=c.getSelectionRange(),g=d.doc.getTextRange(f);if(""!==g&&c.getWrapBehavioursEnabled())return m(f,g,"[","]");if(n.isSaneInsertion(c,d))return n.recordAutoInsert(c,d,"]"),{text:"[]",selection:[1,1]}}else if("]"==e){l(c);var h=c.getCursorPosition(),i=d.doc.getLine(h.row),j=i.substring(h.column,h.column+1);if("]"==j){var k=d.$findOpeningBracket("]",{column:h.column+1,row:h.row});if(null!==k&&n.isAutoInsertedClosing(h,i,e))return n.popAutoInsertedClosing(),{text:"",selection:[1,1]}}}}),this.add("brackets","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&"["==f){l(c);var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if("]"==h)return e.end.column++,e}}),this.add("string_dquotes","insertion",function(a,b,c,d,e){if('"'==e||"'"==e){if(this.lineCommentStart&&this.lineCommentStart.indexOf(e)!=-1)return;l(c);var f=e,g=c.getSelectionRange(),h=d.doc.getTextRange(g);if(""!==h&&"'"!==h&&'"'!=h&&c.getWrapBehavioursEnabled())return m(g,h,f,f);if(!h){var i=c.getCursorPosition(),j=d.doc.getLine(i.row),k=j.substring(i.column-1,i.column),n=j.substring(i.column,i.column+1),o=d.getTokenAt(i.row,i.column),p=d.getTokenAt(i.row,i.column+1);if("\\"==k&&o&&/escape/.test(o.type))return null;var q,r=o&&/string|escape/.test(o.type),s=!p||/string|escape/.test(p.type);if(n==f)q=r!==s,q&&/string\.end/.test(p.type)&&(q=!1);else{if(r&&!s)return null;if(r&&s)return null;var t=d.$mode.tokenRe;t.lastIndex=0;var u=t.test(k);t.lastIndex=0;var v=t.test(k);if(u||v)return null;if(n&&!/[\s;,.})\]\\]/.test(n))return null;q=!0}return{text:q?f+f:"",selection:[1,1]}}}}),this.add("string_dquotes","deletion",function(a,b,c,d,e){var f=d.doc.getTextRange(e);if(!e.isMultiLine()&&('"'==f||"'"==f)){l(c);var g=d.doc.getLine(e.start.row),h=g.substring(e.start.column+1,e.start.column+2);if(h==f)return e.end.column++,e}})};n.isSaneInsertion=function(a,b){var c=a.getCursorPosition(),d=new g(b,c.row,c.column);if(!this.$matchTokenType(d.getCurrentToken()||"text",i)){var e=new g(b,c.row,c.column+1);if(!this.$matchTokenType(e.getCurrentToken()||"text",i))return!1}return d.stepForward(),d.getCurrentTokenRow()!==c.row||this.$matchTokenType(d.getCurrentToken()||"text",j)},n.$matchTokenType=function(a,b){return b.indexOf(a.type||a)>-1},n.recordAutoInsert=function(a,b,c){var e=a.getCursorPosition(),f=b.doc.getLine(e.row);this.isAutoInsertedClosing(e,f,d.autoInsertedLineEnd[0])||(d.autoInsertedBrackets=0),d.autoInsertedRow=e.row,d.autoInsertedLineEnd=c+f.substr(e.column),d.autoInsertedBrackets++},n.recordMaybeInsert=function(a,b,c){var e=a.getCursorPosition(),f=b.doc.getLine(e.row);this.isMaybeInsertedClosing(e,f)||(d.maybeInsertedBrackets=0),d.maybeInsertedRow=e.row,d.maybeInsertedLineStart=f.substr(0,e.column)+c,d.maybeInsertedLineEnd=f.substr(e.column),d.maybeInsertedBrackets++},n.isAutoInsertedClosing=function(a,b,c){return d.autoInsertedBrackets>0&&a.row===d.autoInsertedRow&&c===d.autoInsertedLineEnd[0]&&b.substr(a.column)===d.autoInsertedLineEnd},n.isMaybeInsertedClosing=function(a,b){return d.maybeInsertedBrackets>0&&a.row===d.maybeInsertedRow&&b.substr(a.column)===d.maybeInsertedLineEnd&&b.substr(0,a.column)==d.maybeInsertedLineStart},n.popAutoInsertedClosing=function(){d.autoInsertedLineEnd=d.autoInsertedLineEnd.substr(1),d.autoInsertedBrackets--},n.clearMaybeInsertedClosing=function(){d&&(d.maybeInsertedBrackets=0,d.maybeInsertedRow=-1)},e.inherits(n,f),b.CstyleBehaviour=n}),define("ace/unicode",["require","exports","module"],function(a,b,c){"use strict";function d(a){var c=/\w{4}/g;for(var d in a)b.packages[d]=a[d].replace(c,"\\u$&")}b.packages={},d({L:"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",Ll:"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A", +Lu:"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A",Lt:"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC",Lm:"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F",Lo:"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC",M:"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26",Mn:"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26",Mc:"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC",Me:"0488048906DE20DD-20E020E2-20E4A670-A672",N:"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nd:"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19",Nl:"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF",No:"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835",P:"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65",Pd:"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D",Ps:"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62",Pe:"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63",Pi:"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20",Pf:"00BB2019201D203A2E032E052E0A2E0D2E1D2E21",Pc:"005F203F20402054FE33FE34FE4D-FE4FFF3F",Po:"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65",S:"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD",Sm:"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC",Sc:"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6",Sk:"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3",So:"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD",Z:"002000A01680180E2000-200A20282029202F205F3000",Zs:"002000A01680180E2000-200A202F205F3000",Zl:"2028",Zp:"2029",C:"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF",Cc:"0000-001F007F-009F",Cf:"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB",Co:"E000-F8FF",Cs:"D800-DFFF",Cn:"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF"})}),define("ace/mode/text",["require","exports","module","ace/tokenizer","ace/mode/text_highlight_rules","ace/mode/behaviour/cstyle","ace/unicode","ace/lib/lang","ace/token_iterator","ace/range"],function(a,b,c){"use strict";var d=a("../tokenizer").Tokenizer,e=a("./text_highlight_rules").TextHighlightRules,f=a("./behaviour/cstyle").CstyleBehaviour,g=a("../unicode"),h=a("../lib/lang"),i=a("../token_iterator").TokenIterator,j=a("../range").Range,k=function(){this.HighlightRules=e};(function(){this.$defaultBehaviour=new f,this.tokenRe=new RegExp("^["+g.packages.L+g.packages.Mn+g.packages.Mc+g.packages.Nd+g.packages.Pc+"\\$_]+","g"),this.nonTokenRe=new RegExp("^(?:[^"+g.packages.L+g.packages.Mn+g.packages.Mc+g.packages.Nd+g.packages.Pc+"\\$_]|\\s])+","g"),this.getTokenizer=function(){return this.$tokenizer||(this.$highlightRules=this.$highlightRules||new this.HighlightRules(this.$highlightRuleConfig),this.$tokenizer=new d(this.$highlightRules.getRules())),this.$tokenizer},this.lineCommentStart="",this.blockComment="",this.toggleCommentLines=function(a,b,c,d){function e(a){for(var b=c;b<=d;b++)a(f.getLine(b),b)}var f=b.doc,g=!0,i=!0,j=1/0,k=b.getTabSize(),l=!1;if(this.lineCommentStart){if(Array.isArray(this.lineCommentStart))var m=this.lineCommentStart.map(h.escapeRegExp).join("|"),n=this.lineCommentStart[0];else var m=h.escapeRegExp(this.lineCommentStart),n=this.lineCommentStart;m=new RegExp("^(\\s*)(?:"+m+") ?"),l=b.getUseSoftTabs();var o=function(a,b){var c=a.match(m);if(c){var d=c[1].length,e=c[0].length;s(a,d,e)||" "!=c[0][e-1]||e--,f.removeInLine(b,d,e)}},p=n+" ",q=function(a,b){g&&!/\S/.test(a)||(s(a,j,j)?f.insertInLine({row:b,column:j},p):f.insertInLine({row:b,column:j},n))},r=function(a,b){return m.test(a)},s=function(a,b,c){for(var d=0;b--&&" "==a.charAt(b);)d++;if(d%k!=0)return!1;for(var d=0;" "==a.charAt(c++);)d++;return k>2?d%k!=k-1:d%k==0}}else{if(!this.blockComment)return!1;var n=this.blockComment.start,t=this.blockComment.end,m=new RegExp("^(\\s*)(?:"+h.escapeRegExp(n)+")"),u=new RegExp("(?:"+h.escapeRegExp(t)+")\\s*$"),q=function(a,b){r(a,b)||g&&!/\S/.test(a)||(f.insertInLine({row:b,column:a.length},t),f.insertInLine({row:b,column:j},n))},o=function(a,b){var c;(c=a.match(u))&&f.removeInLine(b,a.length-c[0].length,a.length),(c=a.match(m))&&f.removeInLine(b,c[1].length,c[0].length)},r=function(a,c){if(m.test(a))return!0;for(var d=b.getTokens(c),e=0;ea.length&&(v=a.length)}),j==1/0&&(j=v,g=!1,i=!1),l&&j%k!=0&&(j=Math.floor(j/k)*k),e(i?o:q)},this.toggleBlockComment=function(a,b,c,d){var e=this.blockComment;if(e){!e.start&&e[0]&&(e=e[0]);var f,g,h=new i(b,d.row,d.column),k=h.getCurrentToken(),l=(b.selection,b.selection.toOrientedRange());if(k&&/comment/.test(k.type)){for(var m,n;k&&/comment/.test(k.type);){var o=k.value.indexOf(e.start);if(o!=-1){var p=h.getCurrentTokenRow(),q=h.getCurrentTokenColumn()+o;m=new j(p,q,p,q+e.start.length);break}k=h.stepBackward()}for(var h=new i(b,d.row,d.column),k=h.getCurrentToken();k&&/comment/.test(k.type);){var o=k.value.indexOf(e.end);if(o!=-1){var p=h.getCurrentTokenRow(),q=h.getCurrentTokenColumn()+o;n=new j(p,q,p,q+e.end.length);break}k=h.stepForward()}n&&b.remove(n),m&&(b.remove(m),f=m.start.row,g=-e.start.length)}else g=e.start.length,f=c.start.row,b.insert(c.end,e.end),b.insert(c.start,e.start);l.start.row==f&&(l.start.column+=g),l.end.row==f&&(l.end.column+=g),b.selection.fromOrientedRange(l)}},this.getNextLineIndent=function(a,b,c){return this.$getIndent(b)},this.checkOutdent=function(a,b,c){return!1},this.autoOutdent=function(a,b,c){},this.$getIndent=function(a){return a.match(/^\s*/)[0]},this.createWorker=function(a){return null},this.createModeDelegates=function(a){this.$embeds=[],this.$modes={};for(var b in a)a[b]&&(this.$embeds.push(b),this.$modes[b]=new a[b]);for(var c=["toggleBlockComment","toggleCommentLines","getNextLineIndent","checkOutdent","autoOutdent","transformAction","getCompletions"],b=0;bthis.row)){var c=b(a,{row:this.row,column:this.column},this.$insertRight);this.setPosition(c.row,c.column,!0)}},this.setPosition=function(a,b,c){var d;if(d=c?{row:a,column:b}:this.$clipPositionToDocument(a,b),this.row!=d.row||this.column!=d.column){var e={row:this.row,column:this.column};this.row=d.row,this.column=d.column,this._signal("change",{old:e,value:d})}},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(a){this.document=a||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(a,b){var c={};return a>=this.document.getLength()?(c.row=Math.max(0,this.document.getLength()-1),c.column=this.document.getLine(c.row).length):a<0?(c.row=0,c.column=0):(c.row=a,c.column=Math.min(this.document.getLine(c.row).length,Math.max(0,b))),b<0&&(c.column=0),c}}).call(f.prototype)}),define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(a,b,c){"use strict";var d=a("./lib/oop"),e=a("./apply_delta").applyDelta,f=a("./lib/event_emitter").EventEmitter,g=a("./range").Range,h=a("./anchor").Anchor,i=function(a){this.$lines=[""],0===a.length?this.$lines=[""]:Array.isArray(a)?this.insertMergedLines({row:0,column:0},a):this.insert({row:0,column:0},a)};(function(){d.implement(this,f),this.setValue=function(a){var b=this.getLength()-1;this.remove(new g(0,0,b,this.getLine(b).length)),this.insert({row:0,column:0},a)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(a,b){return new h(this,a,b)},0==="aaa".split(/a/).length?this.$split=function(a){return a.replace(/\r\n|\r/g,"\n").split("\n")}:this.$split=function(a){return a.split(/\r\n|\r|\n/)},this.$detectNewLine=function(a){var b=a.match(/^.*?(\r\n|\r|\n)/m);this.$autoNewLine=b?b[1]:"\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\r\n";case"unix":return"\n";default:return this.$autoNewLine||"\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(a){this.$newLineMode!==a&&(this.$newLineMode=a,this._signal("changeNewLineMode"))},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(a){return"\r\n"==a||"\r"==a||"\n"==a},this.getLine=function(a){return this.$lines[a]||""},this.getLines=function(a,b){return this.$lines.slice(a,b+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(a){return this.getLinesForRange(a).join(this.getNewLineCharacter())},this.getLinesForRange=function(a){var b;if(a.start.row===a.end.row)b=[this.getLine(a.start.row).substring(a.start.column,a.end.column)];else{b=this.getLines(a.start.row,a.end.row),b[0]=(b[0]||"").substring(a.start.column);var c=b.length-1;a.end.row-a.start.row==c&&(b[c]=b[c].substring(0,a.end.column))}return b},this.insertLines=function(a,b){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(a,b)},this.removeLines=function(a,b){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(a,b)},this.insertNewLine=function(a){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."),this.insertMergedLines(a,["",""])},this.insert=function(a,b){return this.getLength()<=1&&this.$detectNewLine(b),this.insertMergedLines(a,this.$split(b))},this.insertInLine=function(a,b){var c=this.clippedPos(a.row,a.column),d=this.pos(a.row,a.column+b.length);return this.applyDelta({start:c,end:d,action:"insert",lines:[b]},!0),this.clonePos(d)},this.clippedPos=function(a,b){var c=this.getLength();void 0===a?a=c:a<0?a=0:a>=c&&(a=c-1,b=void 0);var d=this.getLine(a);return void 0==b&&(b=d.length),b=Math.min(Math.max(b,0),d.length),{row:a,column:b}},this.clonePos=function(a){return{row:a.row,column:a.column}},this.pos=function(a,b){return{row:a,column:b}},this.$clipPosition=function(a){var b=this.getLength();return a.row>=b?(a.row=Math.max(0,b-1),a.column=this.getLine(b-1).length):(a.row=Math.max(0,a.row),a.column=Math.min(Math.max(a.column,0),this.getLine(a.row).length)),a},this.insertFullLines=function(a,b){a=Math.min(Math.max(a,0),this.getLength());var c=0;a0,d=b=0&&this.applyDelta({start:this.pos(a,this.getLine(a).length),end:this.pos(a+1,0),action:"remove",lines:["",""]})},this.replace=function(a,b){if(a instanceof g||(a=g.fromPoints(a.start,a.end)),0===b.length&&a.isEmpty())return a.start;if(b==this.getTextRange(a))return a.end;this.remove(a);var c;return c=b?this.insert(a.start,b):a.start},this.applyDeltas=function(a){for(var b=0;b=0;b--)this.revertDelta(a[b])},this.applyDelta=function(a,b){var c="insert"==a.action;(c?a.lines.length<=1&&!a.lines[0]:!g.comparePoints(a.start,a.end))||(c&&a.lines.length>2e4&&this.$splitAndapplyLargeDelta(a,2e4),e(this.$lines,a,b),this._signal("change",a))},this.$splitAndapplyLargeDelta=function(a,b){for(var c=a.lines,d=c.length,e=a.start.row,f=a.start.column,g=0,h=0;;){g=h,h+=b-1;var i=c.slice(g,h);if(h>d){a.lines=i,a.start.row=e+g,a.start.column=f;break}i.push(""),this.applyDelta({start:this.pos(e+g,f),end:this.pos(e+h,f=0),action:a.action,lines:i},!0)}},this.revertDelta=function(a){this.applyDelta({start:this.clonePos(a.start),end:this.clonePos(a.end),action:"insert"==a.action?"remove":"insert",lines:a.lines.slice()})},this.indexToPosition=function(a,b){for(var c=this.$lines||this.getAllLines(),d=this.getNewLineCharacter().length,e=b||0,f=c.length;e20){c.running=setTimeout(c.$worker,20);break}}c.currentLine=b,f<=d&&c.fireUpdateEvent(f,d)}}};(function(){d.implement(this,e),this.setTokenizer=function(a){this.tokenizer=a,this.lines=[],this.states=[],this.start(0)},this.setDocument=function(a){this.doc=a,this.lines=[],this.states=[],this.stop()},this.fireUpdateEvent=function(a,b){var c={first:a,last:b};this._signal("update",{data:c})},this.start=function(a){this.currentLine=Math.min(a||0,this.currentLine,this.doc.getLength()),this.lines.splice(this.currentLine,this.lines.length),this.states.splice(this.currentLine,this.states.length),this.stop(),this.running=setTimeout(this.$worker,700)},this.scheduleStart=function(){this.running||(this.running=setTimeout(this.$worker,700))},this.$updateOnChange=function(a){var b=a.start.row,c=a.end.row-b;if(0===c)this.lines[b]=null;else if("remove"==a.action)this.lines.splice(b,c+1,null),this.states.splice(b,c+1,null);else{var d=Array(c+1);d.unshift(b,1),this.lines.splice.apply(this.lines,d),this.states.splice.apply(this.states,d)}this.currentLine=Math.min(b,this.currentLine,this.doc.getLength()),this.stop()},this.stop=function(){this.running&&clearTimeout(this.running),this.running=!1},this.getTokens=function(a){return this.lines[a]||this.$tokenizeRow(a)},this.getState=function(a){return this.currentLine==a&&this.$tokenizeRow(a),this.states[a]||"start"},this.$tokenizeRow=function(a){var b=this.doc.getLine(a),c=this.states[a-1],d=this.tokenizer.getLineTokens(b,c,a);return this.states[a]+""!=d.state+""?(this.states[a]=d.state,this.lines[a+1]=null,this.currentLine>a+1&&(this.currentLine=a+1)):this.currentLine==a&&(this.currentLine=a+1),this.lines[a]=d.tokens}}).call(f.prototype),b.BackgroundTokenizer=f}),define("ace/search_highlight",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(a,b,c){"use strict";var d=a("./lib/lang"),e=(a("./lib/oop"),a("./range").Range),f=function(a,b,c){this.setRegexp(a),this.clazz=b,this.type=c||"text"};(function(){this.MAX_RANGES=500,this.setRegexp=function(a){this.regExp+""!=a+""&&(this.regExp=a,this.cache=[])},this.update=function(a,b,c,f){if(this.regExp)for(var g=f.firstRow,h=f.lastRow,i=g;i<=h;i++){var j=this.cache[i];null==j&&(j=d.getMatchOffsets(c.getLine(i),this.regExp),j.length>this.MAX_RANGES&&(j=j.slice(0,this.MAX_RANGES)),j=j.map(function(a){return new e(i,a.offset,i,a.offset+a.length)}),this.cache[i]=j.length?j:"");for(var k=j.length;k--;)b.drawSingleLineMarker(a,j[k].toScreenRange(c),this.clazz,f)}}}).call(f.prototype),b.SearchHighlight=f}),define("ace/edit_session/fold_line",["require","exports","module","ace/range"],function(a,b,c){"use strict";function d(a,b){this.foldData=a,Array.isArray(b)?this.folds=b:b=this.folds=[b];var c=b[b.length-1];this.range=new e(b[0].start.row,b[0].start.column,c.end.row,c.end.column),this.start=this.range.start,this.end=this.range.end,this.folds.forEach(function(a){a.setFoldLine(this)},this)}var e=a("../range").Range;(function(){this.shiftRow=function(a){this.start.row+=a,this.end.row+=a,this.folds.forEach(function(b){b.start.row+=a,b.end.row+=a})},this.addFold=function(a){if(a.sameRow){if(a.start.rowthis.endRow)throw new Error("Can't add a fold to this FoldLine as it has no connection");this.folds.push(a),this.folds.sort(function(a,b){return-a.range.compareEnd(b.start.row,b.start.column)}),this.range.compareEnd(a.start.row,a.start.column)>0?(this.end.row=a.end.row,this.end.column=a.end.column):this.range.compareStart(a.end.row,a.end.column)<0&&(this.start.row=a.start.row,this.start.column=a.start.column)}else if(a.start.row==this.end.row)this.folds.push(a),this.end.row=a.end.row,this.end.column=a.end.column;else{if(a.end.row!=this.start.row)throw new Error("Trying to add fold to FoldRow that doesn't have a matching row");this.folds.unshift(a),this.start.row=a.start.row,this.start.column=a.start.column}a.foldLine=this},this.containsRow=function(a){return a>=this.start.row&&a<=this.end.row},this.walk=function(a,b,c){var d,e,f,g=0,h=this.folds,i=!0;null==b&&(b=this.end.row,c=this.end.column);for(var j=0;j0)){var i=e(a,g.start);return 0===h?b&&0!==i?-f-2:f:i>0||0===i&&!b?f:-f-1}}return-f-1},this.add=function(a){var b=!a.isEmpty(),c=this.pointIndex(a.start,b);c<0&&(c=-c-1);var d=this.pointIndex(a.end,b,c);return d<0?d=-d-1:d++,this.ranges.splice(c,d-c,a)},this.addList=function(a){for(var b=[],c=a.length;c--;)b.push.apply(b,this.add(a[c]));return b},this.substractPoint=function(a){var b=this.pointIndex(a);if(b>=0)return this.ranges.splice(b,1)},this.merge=function(){var a=[],b=this.ranges;b=b.sort(function(a,b){return e(a.start,b.start)});for(var c,d=b[0],f=1;f=0},this.containsPoint=function(a){return this.pointIndex(a)>=0},this.rangeAtPoint=function(a){var b=this.pointIndex(a);if(b>=0)return this.ranges[b]},this.clipRows=function(a,b){var c=this.ranges;if(c[0].start.row>b||c[c.length-1].start.rowd)break;if(k.start.row==d&&k.start.column>=b.column&&(k.start.column==b.column&&this.$insertRight||(k.start.column+=g,k.start.row+=f)),k.end.row==d&&k.end.column>=b.column){if(k.end.column==b.column&&this.$insertRight)continue;k.end.column==b.column&&g>0&&ik.start.column&&k.end.column==h[i+1].start.column&&(k.end.column-=g),k.end.column+=g,k.end.row+=f}}}if(0!=f&&i=a)return e;if(e.end.row>a)return null}return null},this.getNextFoldLine=function(a,b){var c=this.$foldData,d=0;for(b&&(d=c.indexOf(b)),d==-1&&(d=0),d;d=a)return e}return null},this.getFoldedRowCount=function(a,b){for(var c=this.$foldData,d=b-a+1,e=0;e=b){h=a?d-=b-h:d=0);break}g>=a&&(d-=h>=a?g-h:g-a+1)}return d},this.$addFoldLine=function(a){return this.$foldData.push(a),this.$foldData.sort(function(a,b){return a.start.row-b.start.row}),a},this.addFold=function(a,b){var c,d=this.$foldData,e=!1;a instanceof g?c=a:(c=new g(b,a),c.collapseChildren=b.collapseChildren),this.$clipRangeToDocument(c.range);var h=c.start.row,i=c.start.column,j=c.end.row,k=c.end.column;if(!(h0&&(this.removeFolds(n),n.forEach(function(a){c.addSubFold(a)}));for(var o=0;o0&&this.foldAll(a.start.row+1,a.end.row,a.collapseChildren-1),a.subFolds=[]},this.expandFolds=function(a){a.forEach(function(a){this.expandFold(a)},this)},this.unfold=function(a,b){var c,d;if(null==a?(c=new e(0,0,this.getLength(),0),b=!0):c="number"==typeof a?new e(a,0,a,this.getLine(a).length):"row"in a?e.fromPoints(a,a):a,d=this.getFoldsInRangeList(c),b)this.removeFolds(d);else for(var f=d;f.length;)this.expandFolds(f),f=this.getFoldsInRangeList(c);if(d.length)return d},this.isRowFolded=function(a,b){return!!this.getFoldLine(a,b)},this.getRowFoldEnd=function(a,b){var c=this.getFoldLine(a,b);return c?c.end.row:a},this.getRowFoldStart=function(a,b){var c=this.getFoldLine(a,b);return c?c.start.row:a},this.getFoldDisplayLine=function(a,b,c,d,e){null==d&&(d=a.start.row),null==e&&(e=0),null==b&&(b=a.end.row),null==c&&(c=this.getLine(b).length);var f=this.doc,g="";return a.walk(function(a,b,c,h){if(!(b=a){e=f.end.row;try{var g=this.addFold("...",f);g&&(g.collapseChildren=c)}catch(h){}}}}},this.$foldStyles={manual:1,markbegin:1,markbeginend:1},this.$foldStyle="markbegin",this.setFoldStyle=function(a){if(!this.$foldStyles[a])throw new Error("invalid fold style: "+a+"["+Object.keys(this.$foldStyles).join(", ")+"]");if(this.$foldStyle!=a){this.$foldStyle=a,"manual"==a&&this.unfold();var b=this.$foldMode;this.$setFolding(null),this.$setFolding(b)}},this.$setFolding=function(a){if(this.$foldMode!=a){if(this.$foldMode=a,this.off("change",this.$updateFoldWidgets),this.off("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets),this._signal("changeAnnotation"),!a||"manual"==this.$foldStyle)return void(this.foldWidgets=null);this.foldWidgets=[],this.getFoldWidget=a.getFoldWidget.bind(a,this,this.$foldStyle),this.getFoldWidgetRange=a.getFoldWidgetRange.bind(a,this,this.$foldStyle),this.$updateFoldWidgets=this.updateFoldWidgets.bind(this),this.$tokenizerUpdateFoldWidgets=this.tokenizerUpdateFoldWidgets.bind(this),this.on("change",this.$updateFoldWidgets),this.on("tokenizerUpdate",this.$tokenizerUpdateFoldWidgets)}},this.getParentFoldRangeData=function(a,b){var c=this.foldWidgets;if(!c||b&&c[a])return{};for(var d,e=a-1;e>=0;){var f=c[e];if(null==f&&(f=c[e]=this.getFoldWidget(e)),"start"==f){var g=this.getFoldWidgetRange(e);if(d||(d=g),g&&g.end.row>=a)break}e--}return{range:e!==-1&&g,firstRange:d}},this.onFoldWidgetClick=function(a,b){b=b.domEvent;var c={children:b.shiftKey,all:b.ctrlKey||b.metaKey,siblings:b.altKey},d=this.$toggleFoldWidget(a,c);if(!d){var e=b.target||b.srcElement;e&&/ace_fold-widget/.test(e.className)&&(e.className+=" ace_invalid")}},this.$toggleFoldWidget=function(a,b){if(this.getFoldWidget){var c=this.getFoldWidget(a),d=this.getLine(a),e="end"===c?-1:1,f=this.getFoldAt(a,e===-1?0:d.length,e);if(f)return b.children||b.all?this.removeFold(f):this.expandFold(f),f;var g=this.getFoldWidgetRange(a,!0);if(g&&!g.isMultiLine()&&(f=this.getFoldAt(g.start.row,g.start.column,1),f&&g.isEqual(f.range)))return this.removeFold(f),f;if(b.siblings){var h=this.getParentFoldRangeData(a);if(h.range)var i=h.range.start.row+1,j=h.range.end.row;this.foldAll(i,j,b.all?1e4:0)}else b.children?(j=g?g.end.row:this.getLength(),this.foldAll(a+1,j,b.all?1e4:0)):g&&(b.all&&(g.collapseChildren=1e4),this.addFold("...",g));return g}},this.toggleFoldWidget=function(a){var b=this.selection.getCursor().row;b=this.getRowFoldStart(b);var c=this.$toggleFoldWidget(b,{});if(!c){var d=this.getParentFoldRangeData(b,!0);if(c=d.range||d.firstRange){b=c.start.row;var e=this.getFoldAt(b,this.getLine(b).length,1);e?this.removeFold(e):this.addFold("...",c)}}},this.updateFoldWidgets=function(a){var b=a.start.row,c=a.end.row-b;if(0===c)this.foldWidgets[b]=null;else if("remove"==a.action)this.foldWidgets.splice(b,c+1,null);else{var d=Array(c+1);d.unshift(b,1),this.foldWidgets.splice.apply(this.foldWidgets,d)}},this.tokenizerUpdateFoldWidgets=function(a){var b=a.data;b.first!=b.last&&this.foldWidgets.length>b.first&&this.foldWidgets.splice(b.first,this.foldWidgets.length)}}var e=a("../range").Range,f=a("./fold_line").FoldLine,g=a("./fold").Fold,h=a("../token_iterator").TokenIterator;b.Folding=d}),define("ace/edit_session/bracket_match",["require","exports","module","ace/token_iterator","ace/range"],function(a,b,c){"use strict";function d(){this.findMatchingBracket=function(a,b){if(0==a.column)return null;var c=b||this.getLine(a.row).charAt(a.column-1);if(""==c)return null;var d=c.match(/([\(\[\{])|([\)\]\}])/);return d?d[1]?this.$findClosingBracket(d[1],a):this.$findOpeningBracket(d[2],a):null},this.getBracketRange=function(a){var b,c=this.getLine(a.row),d=!0,e=c.charAt(a.column-1),g=e&&e.match(/([\(\[\{])|([\)\]\}])/);if(g||(e=c.charAt(a.column),a={row:a.row,column:a.column+1},g=e&&e.match(/([\(\[\{])|([\)\]\}])/),d=!1),!g)return null;if(g[1]){var h=this.$findClosingBracket(g[1],a);if(!h)return null;b=f.fromPoints(a,h),d||(b.end.column++,b.start.column--),b.cursor=b.end}else{var h=this.$findOpeningBracket(g[2],a);if(!h)return null;b=f.fromPoints(h,a),d||(b.start.column++,b.end.column--),b.cursor=b.start}return b},this.$brackets={")":"(","(":")","]":"[","[":"]","{":"}","}":"{"},this.$findOpeningBracket=function(a,b,c){var d=this.$brackets[a],f=1,g=new e(this,b.row,b.column),h=g.getCurrentToken();if(h||(h=g.stepForward()),h){c||(c=new RegExp("(\\.?"+h.type.replace(".","\\.").replace("rparen",".paren").replace(/\b(?:end)\b/,"(?:start|begin|end)")+")+"));for(var i=b.column-g.getCurrentTokenColumn()-2,j=h.value;;){for(;i>=0;){var k=j.charAt(i);if(k==d){if(f-=1,0==f)return{row:g.getCurrentTokenRow(),column:i+g.getCurrentTokenColumn()}}else k==a&&(f+=1);i-=1}do h=g.stepBackward();while(h&&!c.test(h.type));if(null==h)break;j=h.value,i=j.length-1}return null}},this.$findClosingBracket=function(a,b,c){var d=this.$brackets[a],f=1,g=new e(this,b.row,b.column),h=g.getCurrentToken();if(h||(h=g.stepForward()),h){c||(c=new RegExp("(\\.?"+h.type.replace(".","\\.").replace("lparen",".paren").replace(/\b(?:start|begin)\b/,"(?:start|begin|end)")+")+"));for(var i=b.column-g.getCurrentTokenColumn();;){for(var j=h.value,k=j.length;i=4352&&a<=4447||a>=4515&&a<=4519||a>=4602&&a<=4607||a>=9001&&a<=9002||a>=11904&&a<=11929||a>=11931&&a<=12019||a>=12032&&a<=12245||a>=12272&&a<=12283||a>=12288&&a<=12350||a>=12353&&a<=12438||a>=12441&&a<=12543||a>=12549&&a<=12589||a>=12593&&a<=12686||a>=12688&&a<=12730||a>=12736&&a<=12771||a>=12784&&a<=12830||a>=12832&&a<=12871||a>=12880&&a<=13054||a>=13056&&a<=19903||a>=19968&&a<=42124||a>=42128&&a<=42182||a>=43360&&a<=43388||a>=44032&&a<=55203||a>=55216&&a<=55238||a>=55243&&a<=55291||a>=63744&&a<=64255||a>=65040&&a<=65049||a>=65072&&a<=65106||a>=65108&&a<=65126||a>=65128&&a<=65131||a>=65281&&a<=65376||a>=65504&&a<=65510)}d.implement(this,g),this.setDocument=function(a){this.doc&&this.doc.removeListener("change",this.$onChange),this.doc=a,a.on("change",this.$onChange),this.bgTokenizer&&this.bgTokenizer.setDocument(this.getDocument()),this.resetCaches()},this.getDocument=function(){return this.doc},this.$resetRowCache=function(a){if(!a)return this.$docRowCache=[],void(this.$screenRowCache=[]);var b=this.$docRowCache.length,c=this.$getRowCacheIndex(this.$docRowCache,a)+1;b>c&&(this.$docRowCache.splice(c,b),this.$screenRowCache.splice(c,b))},this.$getRowCacheIndex=function(a,b){for(var c=0,d=a.length-1;c<=d;){var e=c+d>>1,f=a[e];if(b>f)c=e+1;else{if(!(b=b));f++);return(c=d[f])?(c.index=f,c.start=e-c.value.length,c):null},this.setUndoManager=function(a){if(this.$undoManager=a,this.$deltas=[],this.$deltasDoc=[],this.$deltasFold=[],this.$informUndoManager&&this.$informUndoManager.cancel(),a){var b=this;this.$syncInformUndoManager=function(){b.$informUndoManager.cancel(),b.$deltasFold.length&&(b.$deltas.push({group:"fold",deltas:b.$deltasFold}),b.$deltasFold=[]),b.$deltasDoc.length&&(b.$deltas.push({group:"doc",deltas:b.$deltasDoc}),b.$deltasDoc=[]),b.$deltas.length>0&&a.execute({action:"aceupdate",args:[b.$deltas,b],merge:b.mergeUndoDeltas}),b.mergeUndoDeltas=!1,b.$deltas=[]},this.$informUndoManager=e.delayedCall(this.$syncInformUndoManager)}},this.markUndoGroup=function(){this.$syncInformUndoManager&&this.$syncInformUndoManager()},this.$defaultUndoManager={undo:function(){},redo:function(){},reset:function(){}},this.getUndoManager=function(){return this.$undoManager||this.$defaultUndoManager},this.getTabString=function(){return this.getUseSoftTabs()?e.stringRepeat(" ",this.getTabSize()):"\t"},this.setUseSoftTabs=function(a){this.setOption("useSoftTabs",a)},this.getUseSoftTabs=function(){return this.$useSoftTabs&&!this.$mode.$indentWithTabs},this.setTabSize=function(a){this.setOption("tabSize",a)},this.getTabSize=function(){return this.$tabSize},this.isTabStop=function(a){return this.$useSoftTabs&&a.column%this.$tabSize===0},this.$overwrite=!1,this.setOverwrite=function(a){this.setOption("overwrite",a)},this.getOverwrite=function(){return this.$overwrite},this.toggleOverwrite=function(){this.setOverwrite(!this.$overwrite)},this.addGutterDecoration=function(a,b){this.$decorations[a]||(this.$decorations[a]=""),this.$decorations[a]+=" "+b,this._signal("changeBreakpoint",{})},this.removeGutterDecoration=function(a,b){this.$decorations[a]=(this.$decorations[a]||"").replace(" "+b,""),this._signal("changeBreakpoint",{})},this.getBreakpoints=function(){return this.$breakpoints},this.setBreakpoints=function(a){this.$breakpoints=[];for(var b=0;b0&&(d=!!c.charAt(b-1).match(this.tokenRe)),d||(d=!!c.charAt(b).match(this.tokenRe)),d)var e=this.tokenRe;else if(/^\s+$/.test(c.slice(b-1,b+1)))var e=/\s/;else var e=this.nonTokenRe;var f=b;if(f>0){do f--;while(f>=0&&c.charAt(f).match(e));f++}for(var g=b;ga&&(a=b.screenWidth)}),this.lineWidgetWidth=a},this.$computeWidth=function(a){if(this.$modified||a){if(this.$modified=!1,this.$useWrapMode)return this.screenWidth=this.$wrapLimit;for(var b=this.doc.getAllLines(),c=this.$rowLengthCache,d=0,e=0,f=this.$foldData[e],g=f?f.start.row:1/0,h=b.length,i=0;ig){if(i=f.end.row+1,i>=h)break;f=this.$foldData[e++],g=f?f.start.row:1/0}null==c[i]&&(c[i]=this.$getStringScreenWidth(b[i])[0]),c[i]>d&&(d=c[i])}this.screenWidth=d}},this.getLine=function(a){return this.doc.getLine(a)},this.getLines=function(a,b){return this.doc.getLines(a,b)},this.getLength=function(){return this.doc.getLength()},this.getTextRange=function(a){return this.doc.getTextRange(a||this.selection.getRange())},this.insert=function(a,b){return this.doc.insert(a,b)},this.remove=function(a){return this.doc.remove(a)},this.removeFullLines=function(a,b){return this.doc.removeFullLines(a,b)},this.undoChanges=function(a,b){if(a.length){this.$fromUndo=!0;for(var c=null,d=a.length-1;d!=-1;d--){var e=a[d];"doc"==e.group?(this.doc.revertDeltas(e.deltas),c=this.$getUndoSelection(e.deltas,!0,c)):e.deltas.forEach(function(a){this.addFolds(a.folds)},this)}return this.$fromUndo=!1,c&&this.$undoSelect&&!b&&this.selection.setSelectionRange(c),c}},this.redoChanges=function(a,b){if(a.length){this.$fromUndo=!0;for(var c=null,d=0;da.end.column&&(f.start.column+=h),f.end.row==a.end.row&&f.end.column>a.end.column&&(f.end.column+=h)),g&&f.start.row>=a.end.row&&(f.start.row+=g,f.end.row+=g)}if(f.end=this.insert(f.start,d),e.length){var i=a.start,k=f.start,g=k.row-i.row,h=k.column-i.column;this.addFolds(e.map(function(a){return a=a.clone(),a.start.row==i.row&&(a.start.column+=h),a.end.row==i.row&&(a.end.column+=h),a.start.row+=g,a.end.row+=g,a}))}return f},this.indentRows=function(a,b,c){c=c.replace(/\t/g,this.getTabString());for(var d=a;d<=b;d++)this.doc.insertInLine({row:d,column:0},c)},this.outdentRows=function(a){for(var b=a.collapseRows(),c=new j(0,0,0,0),d=this.getTabSize(),e=b.start.row;e<=b.end.row;++e){var f=this.getLine(e);c.start.row=e,c.end.row=e;for(var g=0;g0){var d=this.getRowFoldEnd(b+c);if(d>this.doc.getLength()-1)return 0;var e=d-b}else{a=this.$clipRowToDocument(a),b=this.$clipRowToDocument(b);var e=b-a+1}var f=new j(a,0,b,Number.MAX_VALUE),g=this.getFoldsInRange(f).map(function(a){return a=a.clone(),a.start.row+=e,a.end.row+=e,a}),h=0==c?this.doc.getLines(a,b):this.doc.removeFullLines(a,b);return this.doc.insertFullLines(a+e,h),g.length&&this.addFolds(g),e},this.moveLinesUp=function(a,b){return this.$moveLines(a,b,-1)},this.moveLinesDown=function(a,b){return this.$moveLines(a,b,1)},this.duplicateLines=function(a,b){return this.$moveLines(a,b,0)},this.$clipRowToDocument=function(a){return Math.max(0,Math.min(a,this.doc.getLength()-1))},this.$clipColumnToRow=function(a,b){return b<0?0:Math.min(this.doc.getLine(a).length,b)},this.$clipPositionToDocument=function(a,b){if(b=Math.max(0,b),a<0)a=0,b=0;else{var c=this.doc.getLength();a>=c?(a=c-1,b=this.doc.getLine(c-1).length):b=Math.min(this.doc.getLine(a).length,b)}return{row:a,column:b}},this.$clipRangeToDocument=function(a){a.start.row<0?(a.start.row=0,a.start.column=0):a.start.column=this.$clipColumnToRow(a.start.row,a.start.column);var b=this.doc.getLength()-1;return a.end.row>b?(a.end.row=b,a.end.column=this.doc.getLine(b).length):a.end.column=this.$clipColumnToRow(a.end.row,a.end.column),a},this.$wrapLimit=80,this.$useWrapMode=!1,this.$wrapLimitRange={min:null,max:null},this.setUseWrapMode=function(a){if(a!=this.$useWrapMode){if(this.$useWrapMode=a,this.$modified=!0,this.$resetRowCache(0),a){var b=this.getLength();this.$wrapData=Array(b),this.$updateWrapData(0,b-1)}this._signal("changeWrapMode")}},this.getUseWrapMode=function(){return this.$useWrapMode},this.setWrapLimitRange=function(a,b){this.$wrapLimitRange.min===a&&this.$wrapLimitRange.max===b||(this.$wrapLimitRange={min:a,max:b},this.$modified=!0,this.$useWrapMode&&this._signal("changeWrapMode"))},this.adjustWrapLimit=function(a,b){var c=this.$wrapLimitRange;c.max<0&&(c={min:b,max:b});var d=this.$constrainWrapLimit(a,c.min,c.max);return d!=this.$wrapLimit&&d>1&&(this.$wrapLimit=d,this.$modified=!0,this.$useWrapMode&&(this.$updateWrapData(0,this.getLength()-1),this.$resetRowCache(0),this._signal("changeWrapLimit")),!0)},this.$constrainWrapLimit=function(a,b,c){return b&&(a=Math.max(b,a)),c&&(a=Math.min(c,a)),a},this.getWrapLimit=function(){return this.$wrapLimit},this.setWrapLimit=function(a){this.setWrapLimitRange(a,a)},this.getWrapLimitRange=function(){return{min:this.$wrapLimitRange.min,max:this.$wrapLimitRange.max}},this.$updateInternalDataOnChange=function(a){var b=this.$useWrapMode,c=a.action,d=a.start,e=a.end,f=d.row,g=e.row,h=g-f,i=null;if(this.$updating=!0,0!=h)if("remove"===c){this[b?"$wrapData":"$rowLengthCache"].splice(f,h);var j=this.$foldData;i=this.getFoldsInRange(a),this.removeFolds(i);var k=this.getFoldLine(e.row),l=0;if(k){k.addRemoveChars(e.row,e.column,d.column-e.column),k.shiftRow(-h);var m=this.getFoldLine(f);m&&m!==k&&(m.merge(k),k=m),l=j.indexOf(k)+1}for(l;l=e.row&&k.shiftRow(-h)}g=f}else{var n=Array(h);n.unshift(f,0);var o=b?this.$wrapData:this.$rowLengthCache;o.splice.apply(o,n);var j=this.$foldData,k=this.getFoldLine(f),l=0;if(k){var p=k.range.compareInside(d.row,d.column);0==p?(k=k.split(d.row,d.column),k&&(k.shiftRow(h),k.addRemoveChars(g,0,e.column-d.column))):p==-1&&(k.addRemoveChars(f,0,e.column-d.column),k.shiftRow(h)),l=j.indexOf(k)+1}for(l;l=f&&k.shiftRow(h)}}else{h=Math.abs(a.start.column-a.end.column),"remove"===c&&(i=this.getFoldsInRange(a),this.removeFolds(i),h=-h);var k=this.getFoldLine(f);k&&k.addRemoveChars(f,d.column,h)}return b&&this.$wrapData.length!=this.doc.getLength()&&console.error("doc.getLength() and $wrapData.length have to be the same!"),this.$updating=!1,b?this.$updateWrapData(f,g):this.$updateRowLengthCache(f,g),i},this.$updateRowLengthCache=function(a,b,c){this.$rowLengthCache[a]=null,this.$rowLengthCache[b]=null},this.$updateWrapData=function(a,b){var c,d,e=this.doc.getAllLines(),f=this.getTabSize(),g=this.$wrapData,i=this.$wrapLimit,j=a;for(b=Math.min(b,e.length-1);j<=b;)d=this.getFoldLine(j,d),d?(c=[],d.walk(function(a,b,d,f){var g;if(null!=a){g=this.$getDisplayTokens(a,c.length),g[0]=h;for(var i=1;ib-t;){var u=j+b-t;if(a[u-1]>=o&&a[u]>=o)f(u);else if(a[u]!=h&&a[u]!=k){for(var v=Math.max(u-(b-(b>>2)),j-1);u>v&&a[u]v&&a[u]v&&a[u]==n;)u--}else for(;u>v&&a[u]v?f(++u):(u=j+b,a[u]==c&&u--,f(u-t))}else{for(u;u!=j-1&&a[u]!=h;u--);if(u>j){f(u);continue}for(u=j+b;u39&&i<48||i>57&&i<64?g.push(n):i>=4352&&a(i)?g.push(b,c):g.push(b)}return g},this.$getStringScreenWidth=function(b,c,d){if(0==c)return[0,0];null==c&&(c=1/0),d=d||0;var e,f;for(f=0;f=4352&&a(e)?2:1,!(d>c));f++);return[d,f]},this.lineWidgets=null,this.getRowLength=function(a){if(this.lineWidgets)var b=this.lineWidgets[a]&&this.lineWidgets[a].rowCount||0;else b=0;return this.$useWrapMode&&this.$wrapData[a]?this.$wrapData[a].length+1+b:1+b},this.getRowLineCount=function(a){return this.$useWrapMode&&this.$wrapData[a]?this.$wrapData[a].length+1:1},this.getRowWrapIndent=function(a){if(this.$useWrapMode){var b=this.screenToDocumentPosition(a,Number.MAX_VALUE),c=this.$wrapData[b.row];return c.length&&c[0]=0)var g=i[j],e=this.$docRowCache[j],l=a>i[k-1];else var l=!k;for(var m=this.getLength()-1,n=this.getNextFoldLine(e),o=n?n.start.row:1/0;g<=a&&(h=this.getRowLength(e),!(g+h>a||e>=m));)g+=h,e++,e>o&&(e=n.end.row+1,n=this.getNextFoldLine(e,n),o=n?n.start.row:1/0),l&&(this.$docRowCache.push(e),this.$screenRowCache.push(g));if(n&&n.start.row<=e)c=this.getFoldDisplayLine(n),e=n.start.row;else{if(g+h<=a||e>m)return{row:m,column:this.getLine(m).length};c=this.getLine(e),n=null}var p=0;if(this.$useWrapMode){var q=this.$wrapData[e];if(q){var r=Math.floor(a-g);d=q[r],r>0&&q.length&&(p=q.indent,f=q[r-1]||q[q.length-1],c=c.substring(f))}}return f+=this.$getStringScreenWidth(c,b-p)[1],this.$useWrapMode&&f>=d&&(f=d-1),n?n.idxToPosition(f):{row:e,column:f}},this.documentToScreenPosition=function(a,b){if("undefined"==typeof b)var c=this.$clipPositionToDocument(a.row,a.column);else c=this.$clipPositionToDocument(a,b);a=c.row,b=c.column;var d=0,e=null,f=null;f=this.getFoldAt(a,b,1),f&&(a=f.start.row,b=f.start.column);var g,h=0,i=this.$docRowCache,j=this.$getRowCacheIndex(i,a),k=i.length;if(k&&j>=0)var h=i[j],d=this.$screenRowCache[j],l=a>i[k-1];else var l=!k;for(var m=this.getNextFoldLine(h),n=m?m.start.row:1/0;h=n){if(g=m.end.row+1,g>a)break;m=this.getNextFoldLine(g,m),n=m?m.start.row:1/0}else g=h+1;d+=this.getRowLength(h),h=g,l&&(this.$docRowCache.push(h),this.$screenRowCache.push(d))}var o="";m&&h>=n?(o=this.getFoldDisplayLine(m,a,b),e=m.start.row):(o=this.getLine(a).substring(0,b),e=a);var p=0;if(this.$useWrapMode){var q=this.$wrapData[e];if(q){for(var r=0;o.length>=q[r];)d++,r++;o=o.substring(q[r-1]||0,o.length),p=r>0?q.indent:0}}return{row:d,column:p+this.$getStringScreenWidth(o)[0]}},this.documentToScreenColumn=function(a,b){return this.documentToScreenPosition(a,b).column},this.documentToScreenRow=function(a,b){return this.documentToScreenPosition(a,b).row},this.getScreenLength=function(){var a=0,b=null;if(this.$useWrapMode)for(var c=this.$wrapData.length,d=0,e=0,b=this.$foldData[e++],f=b?b.start.row:1/0;df&&(d=b.end.row+1,b=this.$foldData[e++],f=b?b.start.row:1/0)}else{a=this.getLength();for(var h=this.$foldData,e=0;ec));f++);return[d,f]})},this.destroy=function(){this.bgTokenizer&&(this.bgTokenizer.setDocument(null),this.bgTokenizer=null),this.$stopWorker()}}).call(n.prototype),a("./edit_session/folding").Folding.call(n.prototype),a("./edit_session/bracket_match").BracketMatch.call(n.prototype),f.defineOptions(n.prototype,"session",{wrap:{set:function(a){if(a&&"off"!=a?"free"==a?a=!0:"printMargin"==a?a=-1:"string"==typeof a&&(a=parseInt(a,10)||!1):a=!1,this.$wrap!=a)if(this.$wrap=a,a){var b="number"==typeof a?a:null;this.setWrapLimitRange(b,b),this.setUseWrapMode(!0)}else this.setUseWrapMode(!1)},get:function(){return this.getUseWrapMode()?this.$wrap==-1?"printMargin":this.getWrapLimitRange().min?this.$wrap:"free":"off"},handlesSet:!0},wrapMethod:{set:function(a){a="auto"==a?"text"!=this.$mode.type:"text"!=a,a!=this.$wrapAsCode&&(this.$wrapAsCode=a,this.$useWrapMode&&(this.$modified=!0,this.$resetRowCache(0),this.$updateWrapData(0,this.getLength()-1)))},initialValue:"auto"},indentedSoftWrap:{initialValue:!0},firstLineNumber:{set:function(){this._signal("changeBreakpoint")},initialValue:1},useWorker:{set:function(a){this.$useWorker=a,this.$stopWorker(),a&&this.$startWorker()},initialValue:!0},useSoftTabs:{initialValue:!0},tabSize:{set:function(a){isNaN(a)||this.$tabSize===a||(this.$modified=!0,this.$rowLengthCache=[],this.$tabSize=a,this._signal("changeTabSize"))},initialValue:4,handlesSet:!0},overwrite:{set:function(a){this._signal("changeOverwrite")},initialValue:!1},newLineMode:{set:function(a){this.doc.setNewLineMode(a)},get:function(){return this.doc.getNewLineMode()},handlesSet:!0},mode:{set:function(a){this.setMode(a)},get:function(){return this.$modeId}}}),b.EditSession=n}),define("ace/search",["require","exports","module","ace/lib/lang","ace/lib/oop","ace/range"],function(a,b,c){"use strict";function d(a,b){function c(a){return/\w/.test(a)||b.regExp?"\\b":""}return c(a[0])+a+c(a[a.length-1])}var e=a("./lib/lang"),f=a("./lib/oop"),g=a("./range").Range,h=function(){this.$options={}};(function(){this.set=function(a){return f.mixin(this.$options,a),this},this.getOptions=function(){return e.copyObject(this.$options)},this.setOptions=function(a){this.$options=a},this.find=function(a){var b=this.$options,c=this.$matchIterator(a,b);if(!c)return!1;var d=null;return c.forEach(function(a,c,e){if(a.start)d=a;else{var f=a.offset+(e||0);if(d=new g(c,f,c,f+a.length),!a.length&&b.start&&b.start.start&&0!=b.skipCurrent&&d.isEqual(b.start))return d=null,!1}return!0}),d},this.findAll=function(a){var b=this.$options;if(!b.needle)return[];this.$assembleRegExp(b);var c=b.range,d=c?a.getLines(c.start.row,c.end.row):a.doc.getAllLines(),f=[],h=b.re;if(b.$isMultiLine){var i,j=h.length,k=d.length-j;a:for(var l=h.offset||0;l<=k;l++){for(var m=0;mp||(f.push(i=new g(l,p,l+j-1,q)),j>2&&(l=l+j-2))}}else for(var r=0;rv&&f[m].end.row==c.end.row;)m--;for(f=f.slice(r,m+1),r=0,m=f.length;r=0;h--)if(d(g[h],b,f))return!0};else var h=function(a,b,f){for(var g=e.getMatchOffsets(a,c),h=0;h=g;d--)if(c(a.getLine(d),d))return;if(0!=b.wrap)for(d=h,g=f.row;d>=g;d--)if(c(a.getLine(d),d))return}}:function(c){var d=f.row,e=a.getLine(d).substr(f.column);if(!c(e,d,f.column)){for(d+=1;d<=h;d++)if(c(a.getLine(d),d))return;if(0!=b.wrap)for(d=g,h=f.row;d<=h;d++)if(c(a.getLine(d),d))return}};return{forEach:i}}}).call(h.prototype),b.Search=h}),define("ace/keyboard/hash_handler",["require","exports","module","ace/lib/keys","ace/lib/useragent"],function(a,b,c){"use strict";function d(a,b){this.platform=b||(g.isMac?"mac":"win"),this.commands={},this.commandKeyBinding={},this.addCommands(a),this.$singleCommand=!0}function e(a,b){d.call(this,a,b),this.$singleCommand=!1}var f=a("../lib/keys"),g=a("../lib/useragent"),h=f.KEY_MODS;e.prototype=d.prototype,function(){function a(a){return"object"==typeof a&&a.bindKey&&a.bindKey.position||0}this.addCommand=function(a){this.commands[a.name]&&this.removeCommand(a),this.commands[a.name]=a,a.bindKey&&this._buildKeyHash(a)},this.removeCommand=function(a,b){var c=a&&("string"==typeof a?a:a.name);a=this.commands[c],b||delete this.commands[c];var d=this.commandKeyBinding;for(var e in d){var f=d[e];if(f==a)delete d[e];else if(Array.isArray(f)){var g=f.indexOf(a);g!=-1&&(f.splice(g,1),1==f.length&&(d[e]=f[0]))}}},this.bindKey=function(a,b,c){if("object"==typeof a&&a&&(void 0==c&&(c=a.position),a=a[this.platform]),a)return"function"==typeof b?this.addCommand({exec:b,bindKey:a,name:b.name||a}):void a.split("|").forEach(function(a){var d="";if(a.indexOf(" ")!=-1){var e=a.split(/\s+/);a=e.pop(),e.forEach(function(a){var b=this.parseKeys(a),c=h[b.hashId]+b.key;d+=(d?" ":"")+c,this._addCommandToBinding(d,"chainKeys")},this),d+=" "}var f=this.parseKeys(a),g=h[f.hashId]+f.key;this._addCommandToBinding(d+g,b,c)},this)},this._addCommandToBinding=function(b,c,d){var e,f=this.commandKeyBinding;if(c)if(!f[b]||this.$singleCommand)f[b]=c;else{Array.isArray(f[b])?(e=f[b].indexOf(c))!=-1&&f[b].splice(e,1):f[b]=[f[b]],"number"!=typeof d&&(d=d||c.isDefault?-100:a(c));var g=f[b];for(e=0;ed)break}g.splice(e,0,c)}else delete f[b]},this.addCommands=function(a){a&&Object.keys(a).forEach(function(b){var c=a[b];if(c){if("string"==typeof c)return this.bindKey(c,b);"function"==typeof c&&(c={exec:c}),"object"==typeof c&&(c.name||(c.name=b),this.addCommand(c))}},this)},this.removeCommands=function(a){Object.keys(a).forEach(function(b){this.removeCommand(a[b])},this)},this.bindKeys=function(a){Object.keys(a).forEach(function(b){this.bindKey(b,a[b])},this)},this._buildKeyHash=function(a){this.bindKey(a.bindKey,a)},this.parseKeys=function(a){var b=a.toLowerCase().split(/[\-\+]([\-\+])?/).filter(function(a){return a}),c=b.pop(),d=f[c];if(f.FUNCTION_KEYS[d])c=f.FUNCTION_KEYS[d].toLowerCase();else{if(!b.length)return{key:c,hashId:-1};if(1==b.length&&"shift"==b[0])return{key:c.toUpperCase(),hashId:-1}}for(var e=0,g=b.length;g--;){var h=f.KEY_MODS[b[g]];if(null==h)return"undefined"!=typeof console&&console.error("invalid modifier "+b[g]+" in "+a),!1;e|=h}return{key:c,hashId:e}},this.findKeyCommand=function(a,b){var c=h[a]+b;return this.commandKeyBinding[c]},this.handleKeyboard=function(a,b,c,d){if(!(d<0)){var e=h[b]+c,f=this.commandKeyBinding[e];return a.$keyChain&&(a.$keyChain+=" "+e,f=this.commandKeyBinding[a.$keyChain]||f),!f||"chainKeys"!=f&&"chainKeys"!=f[f.length-1]?(a.$keyChain&&(b&&4!=b||1!=c.length?(b==-1||d>0)&&(a.$keyChain=""):a.$keyChain=a.$keyChain.slice(0,-e.length-1)),{command:f}):(a.$keyChain=a.$keyChain||e,{command:"null"})}},this.getStatusText=function(a,b){return b.$keyChain||""}}.call(d.prototype),b.HashHandler=d,b.MultiHashHandler=e}),define("ace/commands/command_manager",["require","exports","module","ace/lib/oop","ace/keyboard/hash_handler","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../keyboard/hash_handler").MultiHashHandler,f=a("../lib/event_emitter").EventEmitter,g=function(a,b){e.call(this,b,a),this.byName=this.commands,this.setDefaultHandler("exec",function(a){return a.command.exec(a.editor,a.args||{})})};d.inherits(g,e),function(){d.implement(this,f),this.exec=function(a,b,c){if(Array.isArray(a)){for(var d=a.length;d--;)if(this.exec(a[d],b,c))return!0;return!1}if("string"==typeof a&&(a=this.commands[a]),!a)return!1;if(b&&b.$readOnly&&!a.readOnly)return!1;var e={editor:b,command:a,args:c};return e.returnValue=this._emit("exec",e),this._signal("afterExec",e),e.returnValue!==!1},this.toggleRecording=function(a){if(!this.$inReplay)return a&&a._emit("changeStatus"),this.recording?(this.macro.pop(),this.removeEventListener("exec",this.$addCommandToMacro),this.macro.length||(this.macro=this.oldMacro),this.recording=!1):(this.$addCommandToMacro||(this.$addCommandToMacro=function(a){this.macro.push([a.command,a.args])}.bind(this)),this.oldMacro=this.macro,this.macro=[],this.on("exec",this.$addCommandToMacro),this.recording=!0)},this.replay=function(a){if(!this.$inReplay&&this.macro){if(this.recording)return this.toggleRecording(a);try{this.$inReplay=!0,this.macro.forEach(function(b){"string"==typeof b?this.exec(b,a):this.exec(b[0],a,b[1])},this)}finally{this.$inReplay=!1}}},this.trimMacro=function(a){return a.map(function(a){return"string"!=typeof a[0]&&(a[0]=a[0].name),a[1]||(a=a[0]),a})}}.call(g.prototype),b.CommandManager=g}),define("ace/commands/default_commands",["require","exports","module","ace/lib/lang","ace/config","ace/range"],function(a,b,c){"use strict";function d(a,b){return{win:a,mac:b}}var e=a("../lib/lang"),f=a("../config"),g=a("../range").Range;b.commands=[{name:"showSettingsMenu",bindKey:d("Ctrl-,","Command-,"),exec:function(a){f.loadModule("ace/ext/settings_menu",function(b){b.init(a),a.showSettingsMenu()})},readOnly:!0},{name:"goToNextError",bindKey:d("Alt-E","F4"),exec:function(a){f.loadModule("ace/ext/error_marker",function(b){b.showErrorMarker(a,1)})},scrollIntoView:"animate",readOnly:!0},{name:"goToPreviousError",bindKey:d("Alt-Shift-E","Shift-F4"),exec:function(a){f.loadModule("ace/ext/error_marker",function(b){b.showErrorMarker(a,-1)})},scrollIntoView:"animate",readOnly:!0},{name:"selectall",bindKey:d("Ctrl-A","Command-A"),exec:function(a){a.selectAll()},readOnly:!0},{name:"centerselection",bindKey:d(null,"Ctrl-L"),exec:function(a){a.centerSelection()},readOnly:!0},{name:"gotoline",bindKey:d("Ctrl-L","Command-L"),exec:function(a){var b=parseInt(prompt("Enter line number:"),10);isNaN(b)||a.gotoLine(b)},readOnly:!0},{name:"fold",bindKey:d("Alt-L|Ctrl-F1","Command-Alt-L|Command-F1"),exec:function(a){a.session.toggleFold(!1)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"unfold",bindKey:d("Alt-Shift-L|Ctrl-Shift-F1","Command-Alt-Shift-L|Command-Shift-F1"),exec:function(a){a.session.toggleFold(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleFoldWidget",bindKey:d("F2","F2"),exec:function(a){a.session.toggleFoldWidget()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"toggleParentFoldWidget",bindKey:d("Alt-F2","Alt-F2"),exec:function(a){a.session.toggleFoldWidget(!0)},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"foldall",bindKey:d(null,"Ctrl-Command-Option-0"),exec:function(a){a.session.foldAll()},scrollIntoView:"center",readOnly:!0},{name:"foldOther",bindKey:d("Alt-0","Command-Option-0"),exec:function(a){a.session.foldAll(),a.session.unfold(a.selection.getAllRanges())},scrollIntoView:"center",readOnly:!0},{name:"unfoldall",bindKey:d("Alt-Shift-0","Command-Option-Shift-0"),exec:function(a){a.session.unfold()},scrollIntoView:"center",readOnly:!0},{name:"findnext",bindKey:d("Ctrl-K","Command-G"),exec:function(a){a.findNext()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"findprevious",bindKey:d("Ctrl-Shift-K","Command-Shift-G"),exec:function(a){a.findPrevious()},multiSelectAction:"forEach",scrollIntoView:"center",readOnly:!0},{name:"selectOrFindNext",bindKey:d("Alt-K","Ctrl-G"),exec:function(a){a.selection.isEmpty()?a.selection.selectWord():a.findNext()},readOnly:!0},{name:"selectOrFindPrevious",bindKey:d("Alt-Shift-K","Ctrl-Shift-G"),exec:function(a){a.selection.isEmpty()?a.selection.selectWord():a.findPrevious()},readOnly:!0},{name:"find",bindKey:d("Ctrl-F","Command-F"),exec:function(a){f.loadModule("ace/ext/searchbox",function(b){ +b.Search(a)})},readOnly:!0},{name:"overwrite",bindKey:"Insert",exec:function(a){a.toggleOverwrite()},readOnly:!0},{name:"selecttostart",bindKey:d("Ctrl-Shift-Home","Command-Shift-Home|Command-Shift-Up"),exec:function(a){a.getSelection().selectFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotostart",bindKey:d("Ctrl-Home","Command-Home|Command-Up"),exec:function(a){a.navigateFileStart()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectup",bindKey:d("Shift-Up","Shift-Up|Ctrl-Shift-P"),exec:function(a){a.getSelection().selectUp()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golineup",bindKey:d("Up","Up|Ctrl-P"),exec:function(a,b){a.navigateUp(b.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttoend",bindKey:d("Ctrl-Shift-End","Command-Shift-End|Command-Shift-Down"),exec:function(a){a.getSelection().selectFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"gotoend",bindKey:d("Ctrl-End","Command-End|Command-Down"),exec:function(a){a.navigateFileEnd()},multiSelectAction:"forEach",readOnly:!0,scrollIntoView:"animate",aceCommandGroup:"fileJump"},{name:"selectdown",bindKey:d("Shift-Down","Shift-Down|Ctrl-Shift-N"),exec:function(a){a.getSelection().selectDown()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"golinedown",bindKey:d("Down","Down|Ctrl-N"),exec:function(a,b){a.navigateDown(b.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordleft",bindKey:d("Ctrl-Shift-Left","Option-Shift-Left"),exec:function(a){a.getSelection().selectWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordleft",bindKey:d("Ctrl-Left","Option-Left"),exec:function(a){a.navigateWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolinestart",bindKey:d("Alt-Shift-Left","Command-Shift-Left|Ctrl-Shift-A"),exec:function(a){a.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolinestart",bindKey:d("Alt-Left|Home","Command-Left|Home|Ctrl-A"),exec:function(a){a.navigateLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectleft",bindKey:d("Shift-Left","Shift-Left|Ctrl-Shift-B"),exec:function(a){a.getSelection().selectLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoleft",bindKey:d("Left","Left|Ctrl-B"),exec:function(a,b){a.navigateLeft(b.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectwordright",bindKey:d("Ctrl-Shift-Right","Option-Shift-Right"),exec:function(a){a.getSelection().selectWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotowordright",bindKey:d("Ctrl-Right","Option-Right"),exec:function(a){a.navigateWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selecttolineend",bindKey:d("Alt-Shift-Right","Command-Shift-Right|Shift-End|Ctrl-Shift-E"),exec:function(a){a.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotolineend",bindKey:d("Alt-Right|End","Command-Right|End|Ctrl-E"),exec:function(a){a.navigateLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectright",bindKey:d("Shift-Right","Shift-Right"),exec:function(a){a.getSelection().selectRight()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"gotoright",bindKey:d("Right","Right|Ctrl-F"),exec:function(a,b){a.navigateRight(b.times)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectpagedown",bindKey:"Shift-PageDown",exec:function(a){a.selectPageDown()},readOnly:!0},{name:"pagedown",bindKey:d(null,"Option-PageDown"),exec:function(a){a.scrollPageDown()},readOnly:!0},{name:"gotopagedown",bindKey:d("PageDown","PageDown|Ctrl-V"),exec:function(a){a.gotoPageDown()},readOnly:!0},{name:"selectpageup",bindKey:"Shift-PageUp",exec:function(a){a.selectPageUp()},readOnly:!0},{name:"pageup",bindKey:d(null,"Option-PageUp"),exec:function(a){a.scrollPageUp()},readOnly:!0},{name:"gotopageup",bindKey:"PageUp",exec:function(a){a.gotoPageUp()},readOnly:!0},{name:"scrollup",bindKey:d("Ctrl-Up",null),exec:function(a){a.renderer.scrollBy(0,-2*a.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"scrolldown",bindKey:d("Ctrl-Down",null),exec:function(a){a.renderer.scrollBy(0,2*a.renderer.layerConfig.lineHeight)},readOnly:!0},{name:"selectlinestart",bindKey:"Shift-Home",exec:function(a){a.getSelection().selectLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"selectlineend",bindKey:"Shift-End",exec:function(a){a.getSelection().selectLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"togglerecording",bindKey:d("Ctrl-Alt-E","Command-Option-E"),exec:function(a){a.commands.toggleRecording(a)},readOnly:!0},{name:"replaymacro",bindKey:d("Ctrl-Shift-E","Command-Shift-E"),exec:function(a){a.commands.replay(a)},readOnly:!0},{name:"jumptomatching",bindKey:d("Ctrl-P","Ctrl-P"),exec:function(a){a.jumpToMatching()},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"selecttomatching",bindKey:d("Ctrl-Shift-P","Ctrl-Shift-P"),exec:function(a){a.jumpToMatching(!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"expandToMatching",bindKey:d("Ctrl-Shift-M","Ctrl-Shift-M"),exec:function(a){a.jumpToMatching(!0,!0)},multiSelectAction:"forEach",scrollIntoView:"animate",readOnly:!0},{name:"passKeysToBrowser",bindKey:d(null,null),exec:function(){},passEvent:!0,readOnly:!0},{name:"copy",exec:function(a){},readOnly:!0},{name:"cut",exec:function(a){var b=a.getSelectionRange();a._emit("cut",b),a.selection.isEmpty()||(a.session.remove(b),a.clearSelection())},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"paste",exec:function(a,b){a.$handlePaste(b)},scrollIntoView:"cursor"},{name:"removeline",bindKey:d("Ctrl-D","Command-D"),exec:function(a){a.removeLines()},scrollIntoView:"cursor",multiSelectAction:"forEachLine"},{name:"duplicateSelection",bindKey:d("Ctrl-Shift-D","Command-Shift-D"),exec:function(a){a.duplicateSelection()},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"sortlines",bindKey:d("Ctrl-Alt-S","Command-Alt-S"),exec:function(a){a.sortLines()},scrollIntoView:"selection",multiSelectAction:"forEachLine"},{name:"togglecomment",bindKey:d("Ctrl-/","Command-/"),exec:function(a){a.toggleCommentLines()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"toggleBlockComment",bindKey:d("Ctrl-Shift-/","Command-Shift-/"),exec:function(a){a.toggleBlockComment()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"modifyNumberUp",bindKey:d("Ctrl-Shift-Up","Alt-Shift-Up"),exec:function(a){a.modifyNumber(1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"modifyNumberDown",bindKey:d("Ctrl-Shift-Down","Alt-Shift-Down"),exec:function(a){a.modifyNumber(-1)},scrollIntoView:"cursor",multiSelectAction:"forEach"},{name:"replace",bindKey:d("Ctrl-H","Command-Option-F"),exec:function(a){f.loadModule("ace/ext/searchbox",function(b){b.Search(a,!0)})}},{name:"undo",bindKey:d("Ctrl-Z","Command-Z"),exec:function(a){a.undo()}},{name:"redo",bindKey:d("Ctrl-Shift-Z|Ctrl-Y","Command-Shift-Z|Command-Y"),exec:function(a){a.redo()}},{name:"copylinesup",bindKey:d("Alt-Shift-Up","Command-Option-Up"),exec:function(a){a.copyLinesUp()},scrollIntoView:"cursor"},{name:"movelinesup",bindKey:d("Alt-Up","Option-Up"),exec:function(a){a.moveLinesUp()},scrollIntoView:"cursor"},{name:"copylinesdown",bindKey:d("Alt-Shift-Down","Command-Option-Down"),exec:function(a){a.copyLinesDown()},scrollIntoView:"cursor"},{name:"movelinesdown",bindKey:d("Alt-Down","Option-Down"),exec:function(a){a.moveLinesDown()},scrollIntoView:"cursor"},{name:"del",bindKey:d("Delete","Delete|Ctrl-D|Shift-Delete"),exec:function(a){a.remove("right")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"backspace",bindKey:d("Shift-Backspace|Backspace","Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H"),exec:function(a){a.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"cut_or_delete",bindKey:d("Shift-Delete",null),exec:function(a){return!!a.selection.isEmpty()&&void a.remove("left")},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolinestart",bindKey:d("Alt-Backspace","Command-Backspace"),exec:function(a){a.removeToLineStart()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removetolineend",bindKey:d("Alt-Delete","Ctrl-K"),exec:function(a){a.removeToLineEnd()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordleft",bindKey:d("Ctrl-Backspace","Alt-Backspace|Ctrl-Alt-Backspace"),exec:function(a){a.removeWordLeft()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"removewordright",bindKey:d("Ctrl-Delete","Alt-Delete"),exec:function(a){a.removeWordRight()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"outdent",bindKey:d("Shift-Tab","Shift-Tab"),exec:function(a){a.blockOutdent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"indent",bindKey:d("Tab","Tab"),exec:function(a){a.indent()},multiSelectAction:"forEach",scrollIntoView:"selectionPart"},{name:"blockoutdent",bindKey:d("Ctrl-[","Ctrl-["),exec:function(a){a.blockOutdent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"blockindent",bindKey:d("Ctrl-]","Ctrl-]"),exec:function(a){a.blockIndent()},multiSelectAction:"forEachLine",scrollIntoView:"selectionPart"},{name:"insertstring",exec:function(a,b){a.insert(b)},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"inserttext",exec:function(a,b){a.insert(e.stringRepeat(b.text||"",b.times||1))},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"splitline",bindKey:d(null,"Ctrl-O"),exec:function(a){a.splitLine()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"transposeletters",bindKey:d("Ctrl-T","Ctrl-T"),exec:function(a){a.transposeLetters()},multiSelectAction:function(a){a.transposeSelections(1)},scrollIntoView:"cursor"},{name:"touppercase",bindKey:d("Ctrl-U","Ctrl-U"),exec:function(a){a.toUpperCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"tolowercase",bindKey:d("Ctrl-Shift-U","Ctrl-Shift-U"),exec:function(a){a.toLowerCase()},multiSelectAction:"forEach",scrollIntoView:"cursor"},{name:"expandtoline",bindKey:d("Ctrl-Shift-L","Command-Shift-L"),exec:function(a){var b=a.selection.getRange();b.start.column=b.end.column=0,b.end.row++,a.selection.setRange(b,!1)},multiSelectAction:"forEach",scrollIntoView:"cursor",readOnly:!0},{name:"joinlines",bindKey:d(null,null),exec:function(a){for(var b=a.selection.isBackwards(),c=b?a.selection.getSelectionLead():a.selection.getSelectionAnchor(),d=b?a.selection.getSelectionAnchor():a.selection.getSelectionLead(),f=a.session.doc.getLine(c.row).length,h=a.session.doc.getTextRange(a.selection.getRange()),i=h.replace(/\n\s*/," ").length,j=a.session.doc.getLine(c.row),k=c.row+1;k<=d.row+1;k++){var l=e.stringTrimLeft(e.stringTrimRight(a.session.doc.getLine(k)));0!==l.length&&(l=" "+l),j+=l}d.row+10?(a.selection.moveCursorTo(c.row,c.column),a.selection.selectTo(c.row,c.column+i)):(f=a.session.doc.getLine(c.row).length>f?f+1:f,a.selection.moveCursorTo(c.row,f))},multiSelectAction:"forEach",readOnly:!0},{name:"invertSelection",bindKey:d(null,null),exec:function(a){var b=a.session.doc.getLength()-1,c=a.session.doc.getLine(b).length,d=a.selection.rangeList.ranges,e=[];d.length<1&&(d=[a.selection.getRange()]);for(var f=0;f0&&this.$blockScrolling--;var c=b&&b.scrollIntoView;if(c){switch(c){case"center-animate":c="animate";case"center":this.renderer.scrollCursorIntoView(null,.5);break;case"animate":case"cursor":this.renderer.scrollCursorIntoView();break;case"selectionPart":var d=this.selection.getRange(),e=this.renderer.layerConfig;(d.start.row>=e.lastRow||d.end.row<=e.firstRow)&&this.renderer.scrollSelectionIntoView(this.selection.anchor,this.selection.lead)}"animate"==c&&this.renderer.animateScrolling(this.curOp.scrollTop)}this.prevOp=this.curOp,this.curOp=null}},this.$mergeableCommands=["backspace","del","insertstring"],this.$historyTracker=function(a){if(this.$mergeUndoDeltas){var b=this.prevOp,c=this.$mergeableCommands,d=b.command&&a.command.name==b.command.name;if("insertstring"==a.command.name){var e=a.args;void 0===this.mergeNextCommand&&(this.mergeNextCommand=!0),d=d&&this.mergeNextCommand&&(!/\s/.test(e)||/\s/.test(b.args)),this.mergeNextCommand=!0}else d=d&&c.indexOf(a.command.name)!==-1;"always"!=this.$mergeUndoDeltas&&Date.now()-this.sequenceStartTime>2e3&&(d=!1),d?this.session.mergeUndoDeltas=!0:c.indexOf(a.command.name)!==-1&&(this.sequenceStartTime=Date.now())}},this.setKeyboardHandler=function(a,b){if(a&&"string"==typeof a){this.$keybindingId=a;var c=this;r.loadModule(["keybinding",a],function(d){c.$keybindingId==a&&c.keyBinding.setKeyboardHandler(d&&d.handler),b&&b()})}else this.$keybindingId=null,this.keyBinding.setKeyboardHandler(a),b&&b()},this.getKeyboardHandler=function(){return this.keyBinding.getKeyboardHandler()},this.setSession=function(a){if(this.session!=a){this.curOp&&this.endOperation(),this.curOp={};var b=this.session;if(b){this.session.off("change",this.$onDocumentChange),this.session.off("changeMode",this.$onChangeMode),this.session.off("tokenizerUpdate",this.$onTokenizerUpdate),this.session.off("changeTabSize",this.$onChangeTabSize),this.session.off("changeWrapLimit",this.$onChangeWrapLimit),this.session.off("changeWrapMode",this.$onChangeWrapMode),this.session.off("changeFold",this.$onChangeFold),this.session.off("changeFrontMarker",this.$onChangeFrontMarker),this.session.off("changeBackMarker",this.$onChangeBackMarker),this.session.off("changeBreakpoint",this.$onChangeBreakpoint),this.session.off("changeAnnotation",this.$onChangeAnnotation),this.session.off("changeOverwrite",this.$onCursorChange),this.session.off("changeScrollTop",this.$onScrollTopChange),this.session.off("changeScrollLeft",this.$onScrollLeftChange);var c=this.session.getSelection();c.off("changeCursor",this.$onCursorChange),c.off("changeSelection",this.$onSelectionChange)}this.session=a,a?(this.$onDocumentChange=this.onDocumentChange.bind(this),a.on("change",this.$onDocumentChange),this.renderer.setSession(a),this.$onChangeMode=this.onChangeMode.bind(this),a.on("changeMode",this.$onChangeMode),this.$onTokenizerUpdate=this.onTokenizerUpdate.bind(this),a.on("tokenizerUpdate",this.$onTokenizerUpdate),this.$onChangeTabSize=this.renderer.onChangeTabSize.bind(this.renderer),a.on("changeTabSize",this.$onChangeTabSize),this.$onChangeWrapLimit=this.onChangeWrapLimit.bind(this),a.on("changeWrapLimit",this.$onChangeWrapLimit),this.$onChangeWrapMode=this.onChangeWrapMode.bind(this),a.on("changeWrapMode",this.$onChangeWrapMode),this.$onChangeFold=this.onChangeFold.bind(this),a.on("changeFold",this.$onChangeFold),this.$onChangeFrontMarker=this.onChangeFrontMarker.bind(this),this.session.on("changeFrontMarker",this.$onChangeFrontMarker),this.$onChangeBackMarker=this.onChangeBackMarker.bind(this),this.session.on("changeBackMarker",this.$onChangeBackMarker),this.$onChangeBreakpoint=this.onChangeBreakpoint.bind(this),this.session.on("changeBreakpoint",this.$onChangeBreakpoint),this.$onChangeAnnotation=this.onChangeAnnotation.bind(this),this.session.on("changeAnnotation",this.$onChangeAnnotation),this.$onCursorChange=this.onCursorChange.bind(this),this.session.on("changeOverwrite",this.$onCursorChange),this.$onScrollTopChange=this.onScrollTopChange.bind(this),this.session.on("changeScrollTop",this.$onScrollTopChange),this.$onScrollLeftChange=this.onScrollLeftChange.bind(this),this.session.on("changeScrollLeft",this.$onScrollLeftChange),this.selection=a.getSelection(),this.selection.on("changeCursor",this.$onCursorChange),this.$onSelectionChange=this.onSelectionChange.bind(this),this.selection.on("changeSelection",this.$onSelectionChange),this.onChangeMode(),this.$blockScrolling+=1,this.onCursorChange(),this.$blockScrolling-=1,this.onScrollTopChange(),this.onScrollLeftChange(),this.onSelectionChange(),this.onChangeFrontMarker(),this.onChangeBackMarker(),this.onChangeBreakpoint(),this.onChangeAnnotation(),this.session.getUseWrapMode()&&this.renderer.adjustWrapLimit(),this.renderer.updateFull()):(this.selection=null,this.renderer.setSession(a)),this._signal("changeSession",{session:a,oldSession:b}),this.curOp=null,b&&b._signal("changeEditor",{oldEditor:this}),a&&a._signal("changeEditor",{editor:this})}},this.getSession=function(){return this.session},this.setValue=function(a,b){return this.session.doc.setValue(a),b?1==b?this.navigateFileEnd():b==-1&&this.navigateFileStart():this.selectAll(),a},this.getValue=function(){return this.session.getValue()},this.getSelection=function(){return this.selection},this.resize=function(a){this.renderer.onResize(a)},this.setTheme=function(a,b){this.renderer.setTheme(a,b)},this.getTheme=function(){return this.renderer.getTheme()},this.setStyle=function(a){this.renderer.setStyle(a)},this.unsetStyle=function(a){this.renderer.unsetStyle(a)},this.getFontSize=function(){return this.getOption("fontSize")||e.computedStyle(this.container,"fontSize")},this.setFontSize=function(a){this.setOption("fontSize",a)},this.$highlightBrackets=function(){if(this.session.$bracketHighlight&&(this.session.removeMarker(this.session.$bracketHighlight),this.session.$bracketHighlight=null),!this.$highlightPending){var a=this;this.$highlightPending=!0,setTimeout(function(){a.$highlightPending=!1;var b=a.session;if(b&&b.bgTokenizer){var c=b.findMatchingBracket(a.getCursorPosition());if(c)var d=new n(c.row,c.column,c.row,c.column+1);else if(b.$mode.getMatching)var d=b.$mode.getMatching(a.session);d&&(b.$bracketHighlight=b.addMarker(d,"ace_bracket","text"))}},50)}},this.$highlightTags=function(){if(!this.$highlightTagPending){var a=this;this.$highlightTagPending=!0,setTimeout(function(){a.$highlightTagPending=!1;var b=a.session;if(b&&b.bgTokenizer){var c=a.getCursorPosition(),d=new s(a.session,c.row,c.column),e=d.getCurrentToken();if(!e||!/\b(?:tag-open|tag-name)/.test(e.type))return b.removeMarker(b.$tagHighlight),void(b.$tagHighlight=null);if(e.type.indexOf("tag-open")==-1||(e=d.stepForward())){var f=e.value,g=0,h=d.stepBackward();if("<"==h.value){do h=e,e=d.stepForward(),e&&e.value===f&&e.type.indexOf("tag-name")!==-1&&("<"===h.value?g++:"=0)}else{do e=h,h=d.stepBackward(),e&&e.value===f&&e.type.indexOf("tag-name")!==-1&&("<"===h.value?g++:"1||(a=!1)),b.$highlightLineMarker&&!a)b.removeMarker(b.$highlightLineMarker.id),b.$highlightLineMarker=null;else if(!b.$highlightLineMarker&&a){var c=new n(a.row,a.column,a.row,1/0);c.id=b.addMarker(c,"ace_active-line","screenLine"),b.$highlightLineMarker=c}else a&&(b.$highlightLineMarker.start.row=a.row,b.$highlightLineMarker.end.row=a.row,b.$highlightLineMarker.start.column=a.column,b._signal("changeBackMarker"))},this.onSelectionChange=function(a){var b=this.session;if(b.$selectionMarker&&b.removeMarker(b.$selectionMarker),b.$selectionMarker=null,this.selection.isEmpty())this.$updateHighlightActiveLine();else{var c=this.selection.getRange(),d=this.getSelectionStyle();b.$selectionMarker=b.addMarker(c,"ace_selection",d)}var e=this.$highlightSelectedWord&&this.$getSelectionHighLightRegexp();this.session.highlight(e),this._signal("changeSelection")},this.$getSelectionHighLightRegexp=function(){var a=this.session,b=this.getSelectionRange();if(!b.isEmpty()&&!b.isMultiLine()){var c=b.start.column-1,d=b.end.column+1,e=a.getLine(b.start.row),f=e.length,g=e.substring(Math.max(c,0),Math.min(d,f));if(!(c>=0&&/^[\w\d]/.test(g)||d<=f&&/[\w\d]$/.test(g))&&(g=e.substring(b.start.column,b.end.column),/^[\w\d]+$/.test(g))){var h=this.$search.$assembleRegExp({wholeWord:!0,caseSensitive:!0,needle:g});return h}}},this.onChangeFrontMarker=function(){this.renderer.updateFrontMarkers()},this.onChangeBackMarker=function(){this.renderer.updateBackMarkers()},this.onChangeBreakpoint=function(){this.renderer.updateBreakpoints()},this.onChangeAnnotation=function(){this.renderer.setAnnotations(this.session.getAnnotations())},this.onChangeMode=function(a){this.renderer.updateText(),this._emit("changeMode",a)},this.onChangeWrapLimit=function(){this.renderer.updateFull()},this.onChangeWrapMode=function(){this.renderer.onResize(!0)},this.onChangeFold=function(){this.$updateHighlightActiveLine(),this.renderer.updateFull()},this.getSelectedText=function(){return this.session.getTextRange(this.getSelectionRange())},this.getCopyText=function(){var a=this.getSelectedText();return this._signal("copy",a),a},this.onCopy=function(){this.commands.exec("copy",this)},this.onCut=function(){this.commands.exec("cut",this)},this.onPaste=function(a,b){var c={text:a,event:b};this.commands.exec("paste",this,c)},this.$handlePaste=function(a){"string"==typeof a&&(a={text:a}),this._signal("paste",a);var b=a.text;if(!this.inMultiSelectMode||this.inVirtualSelectionMode)this.insert(b);else{var c=b.split(/\r\n|\r|\n/),d=this.selection.rangeList.ranges;if(c.length>d.length||c.length<2||!c[1])return this.commands.exec("insertstring",this,b);for(var e=d.length;e--;){var f=d[e];f.isEmpty()||this.session.remove(f),this.session.insert(f.start,c[e])}}},this.execCommand=function(a,b){return this.commands.exec(a,this,b)},this.insert=function(a,b){var c=this.session,d=c.getMode(),e=this.getCursorPosition();if(this.getBehavioursEnabled()&&!b){var f=d.transformAction(c.getState(e.row),"insertion",this,c,a);f&&(a!==f.text&&(this.session.mergeUndoDeltas=!1,this.$mergeNextCommand=!1),a=f.text)}if("\t"==a&&(a=this.session.getTabString()),this.selection.isEmpty()){if(this.session.getOverwrite()){var g=new n.fromPoints(e,e);g.end.column+=a.length,this.session.remove(g)}}else{var g=this.getSelectionRange();e=this.session.remove(g),this.clearSelection()}if("\n"==a||"\r\n"==a){var h=c.getLine(e.row);if(e.column>h.search(/\S|$/)){var i=h.substr(e.column).search(/\S|$/);c.doc.removeInLine(e.row,e.column,e.column+i)}}this.clearSelection();var j=e.column,k=c.getState(e.row),h=c.getLine(e.row),l=d.checkOutdent(k,h,a);c.insert(e,a);if(f&&f.selection&&(2==f.selection.length?this.selection.setSelectionRange(new n(e.row,j+f.selection[0],e.row,j+f.selection[1])):this.selection.setSelectionRange(new n(e.row+f.selection[0],f.selection[1],e.row+f.selection[2],f.selection[3]))),c.getDocument().isNewLine(a)){var m=d.getNextLineIndent(k,h.slice(0,e.column),c.getTabString());c.insert({row:e.row+1,column:0},m)}l&&d.autoOutdent(k,c,e.row)},this.onTextInput=function(a){this.keyBinding.onTextInput(a)},this.onCommandKey=function(a,b,c){this.keyBinding.onCommandKey(a,b,c)},this.setOverwrite=function(a){this.session.setOverwrite(a)},this.getOverwrite=function(){return this.session.getOverwrite()},this.toggleOverwrite=function(){this.session.toggleOverwrite()},this.setScrollSpeed=function(a){this.setOption("scrollSpeed",a)},this.getScrollSpeed=function(){return this.getOption("scrollSpeed")},this.setDragDelay=function(a){this.setOption("dragDelay",a)},this.getDragDelay=function(){return this.getOption("dragDelay")},this.setSelectionStyle=function(a){this.setOption("selectionStyle",a)},this.getSelectionStyle=function(){return this.getOption("selectionStyle")},this.setHighlightActiveLine=function(a){this.setOption("highlightActiveLine",a)},this.getHighlightActiveLine=function(){return this.getOption("highlightActiveLine")},this.setHighlightGutterLine=function(a){this.setOption("highlightGutterLine",a)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.setHighlightSelectedWord=function(a){this.setOption("highlightSelectedWord",a)},this.getHighlightSelectedWord=function(){return this.$highlightSelectedWord},this.setAnimatedScroll=function(a){this.renderer.setAnimatedScroll(a)},this.getAnimatedScroll=function(){return this.renderer.getAnimatedScroll()},this.setShowInvisibles=function(a){this.renderer.setShowInvisibles(a)},this.getShowInvisibles=function(){return this.renderer.getShowInvisibles()},this.setDisplayIndentGuides=function(a){this.renderer.setDisplayIndentGuides(a)},this.getDisplayIndentGuides=function(){return this.renderer.getDisplayIndentGuides()},this.setShowPrintMargin=function(a){this.renderer.setShowPrintMargin(a)},this.getShowPrintMargin=function(){return this.renderer.getShowPrintMargin()},this.setPrintMarginColumn=function(a){this.renderer.setPrintMarginColumn(a)},this.getPrintMarginColumn=function(){return this.renderer.getPrintMarginColumn()},this.setReadOnly=function(a){this.setOption("readOnly",a)},this.getReadOnly=function(){return this.getOption("readOnly")},this.setBehavioursEnabled=function(a){this.setOption("behavioursEnabled",a)},this.getBehavioursEnabled=function(){return this.getOption("behavioursEnabled")},this.setWrapBehavioursEnabled=function(a){this.setOption("wrapBehavioursEnabled",a)},this.getWrapBehavioursEnabled=function(){return this.getOption("wrapBehavioursEnabled")},this.setShowFoldWidgets=function(a){this.setOption("showFoldWidgets",a)},this.getShowFoldWidgets=function(){return this.getOption("showFoldWidgets")},this.setFadeFoldWidgets=function(a){this.setOption("fadeFoldWidgets",a)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.remove=function(a){this.selection.isEmpty()&&("left"==a?this.selection.selectLeft():this.selection.selectRight());var b=this.getSelectionRange();if(this.getBehavioursEnabled()){var c=this.session,d=c.getState(b.start.row),e=c.getMode().transformAction(d,"deletion",this,c,b);if(0===b.end.column){var f=c.getTextRange(b);if("\n"==f[f.length-1]){var g=c.getLine(b.end.row);/^\s+$/.test(g)&&(b.end.column=g.length)}}e&&(b=e)}this.session.remove(b),this.clearSelection()},this.removeWordRight=function(){this.selection.isEmpty()&&this.selection.selectWordRight(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeWordLeft=function(){this.selection.isEmpty()&&this.selection.selectWordLeft(),this.session.remove(this.getSelectionRange()),this.clearSelection()},this.removeToLineStart=function(){this.selection.isEmpty()&&this.selection.selectLineStart(),this.session.remove(this.getSelectionRange()), +this.clearSelection()},this.removeToLineEnd=function(){this.selection.isEmpty()&&this.selection.selectLineEnd();var a=this.getSelectionRange();a.start.column==a.end.column&&a.start.row==a.end.row&&(a.end.column=0,a.end.row++),this.session.remove(a),this.clearSelection()},this.splitLine=function(){this.selection.isEmpty()||(this.session.remove(this.getSelectionRange()),this.clearSelection());var a=this.getCursorPosition();this.insert("\n"),this.moveCursorToPosition(a)},this.transposeLetters=function(){if(this.selection.isEmpty()){var a=this.getCursorPosition(),b=a.column;if(0!==b){var c,d,e=this.session.getLine(a.row);bb.toLowerCase()?1:0});for(var d=new n(0,0,0,0),e=a.first;e<=a.last;e++){var f=b.getLine(e);d.start.row=e,d.end.row=e,d.end.column=f.length,b.replace(d,c[e-a.first])}},this.toggleCommentLines=function(){var a=this.session.getState(this.getCursorPosition().row),b=this.$getSelectedRows();this.session.getMode().toggleCommentLines(a,this.session,b.first,b.last)},this.toggleBlockComment=function(){var a=this.getCursorPosition(),b=this.session.getState(a.row),c=this.getSelectionRange();this.session.getMode().toggleBlockComment(b,this.session,c,a)},this.getNumberAt=function(a,b){var c=/[\-]?[0-9]+(?:\.[0-9]+)?/g;c.lastIndex=0;for(var d=this.session.getLine(a);c.lastIndex=b){var f={value:e[0],start:e.index,end:e.index+e[0].length};return f}}return null},this.modifyNumber=function(a){var b=this.selection.getCursor().row,c=this.selection.getCursor().column,d=new n(b,c-1,b,c),e=this.session.getTextRange(d);if(!isNaN(parseFloat(e))&&isFinite(e)){var f=this.getNumberAt(b,c);if(f){var g=f.value.indexOf(".")>=0?f.start+f.value.indexOf(".")+1:f.end,h=f.start+f.value.length-g,i=parseFloat(f.value);i*=Math.pow(10,h),a*=g!==f.end&&cn+1)break;n=o.last}for(k--,h=this.session.$moveLines(m,n,b?0:a),b&&a==-1&&(l=k+1);l<=k;)g[l].moveBy(h,0),l++;b||(h=0),i+=h}e.fromOrientedRange(e.ranges[0]),e.rangeList.attach(this.session),this.inVirtualSelectionMode=!1}},this.$getSelectedRows=function(a){return a=(a||this.getSelectionRange()).collapseRows(),{first:this.session.getRowFoldStart(a.start.row),last:this.session.getRowFoldEnd(a.end.row)}},this.onCompositionStart=function(a){this.renderer.showComposition(this.getCursorPosition())},this.onCompositionUpdate=function(a){this.renderer.setCompositionText(a)},this.onCompositionEnd=function(){this.renderer.hideComposition()},this.getFirstVisibleRow=function(){return this.renderer.getFirstVisibleRow()},this.getLastVisibleRow=function(){return this.renderer.getLastVisibleRow()},this.isRowVisible=function(a){return a>=this.getFirstVisibleRow()&&a<=this.getLastVisibleRow()},this.isRowFullyVisible=function(a){return a>=this.renderer.getFirstFullyVisibleRow()&&a<=this.renderer.getLastFullyVisibleRow()},this.$getVisibleRowCount=function(){return this.renderer.getScrollBottomRow()-this.renderer.getScrollTopRow()+1},this.$moveByPage=function(a,b){var c=this.renderer,d=this.renderer.layerConfig,e=a*Math.floor(d.height/d.lineHeight);this.$blockScrolling++,b===!0?this.selection.$moveSelection(function(){this.moveCursorBy(e,0)}):b===!1&&(this.selection.moveCursorBy(e,0),this.selection.clearSelection()),this.$blockScrolling--;var f=c.scrollTop;c.scrollBy(0,e*d.lineHeight),null!=b&&c.scrollCursorIntoView(null,.5),c.animateScrolling(f)},this.selectPageDown=function(){this.$moveByPage(1,!0)},this.selectPageUp=function(){this.$moveByPage(-1,!0)},this.gotoPageDown=function(){this.$moveByPage(1,!1)},this.gotoPageUp=function(){this.$moveByPage(-1,!1)},this.scrollPageDown=function(){this.$moveByPage(1)},this.scrollPageUp=function(){this.$moveByPage(-1)},this.scrollToRow=function(a){this.renderer.scrollToRow(a)},this.scrollToLine=function(a,b,c,d){this.renderer.scrollToLine(a,b,c,d)},this.centerSelection=function(){var a=this.getSelectionRange(),b={row:Math.floor(a.start.row+(a.end.row-a.start.row)/2),column:Math.floor(a.start.column+(a.end.column-a.start.column)/2)};this.renderer.alignCursor(b,.5)},this.getCursorPosition=function(){return this.selection.getCursor()},this.getCursorPositionScreen=function(){return this.session.documentToScreenPosition(this.getCursorPosition())},this.getSelectionRange=function(){return this.selection.getRange()},this.selectAll=function(){this.$blockScrolling+=1,this.selection.selectAll(),this.$blockScrolling-=1},this.clearSelection=function(){this.selection.clearSelection()},this.moveCursorTo=function(a,b){this.selection.moveCursorTo(a,b)},this.moveCursorToPosition=function(a){this.selection.moveCursorToPosition(a)},this.jumpToMatching=function(a,b){var c=this.getCursorPosition(),d=new s(this.session,c.row,c.column),e=d.getCurrentToken(),f=e||d.stepForward();if(f){var g,h,i=!1,j={},k=c.column-f.start,l={")":"(","(":"(","]":"[","[":"[","{":"{","}":"{"};do{if(f.value.match(/[{}()\[\]]/g)){for(;k=0;--f)this.$tryReplace(c[f],a)&&d++;return this.selection.setSelectionRange(e),this.$blockScrolling-=1,d},this.$tryReplace=function(a,b){var c=this.session.getTextRange(a);return b=this.$search.replace(c,b),null!==b?(a.end=this.session.replace(a,b),a):null},this.getLastSearchOptions=function(){return this.$search.getOptions()},this.find=function(a,b,c){b||(b={}),"string"==typeof a||a instanceof RegExp?b.needle=a:"object"==typeof a&&d.mixin(b,a);var e=this.selection.getRange();null==b.needle&&(a=this.session.getTextRange(e)||this.$search.$options.needle,a||(e=this.session.getWordRange(e.start.row,e.start.column),a=this.session.getTextRange(e)),this.$search.set({needle:a})),this.$search.set(b),b.start||this.$search.set({start:e});var f=this.$search.find(this.session);return b.preventScroll?f:f?(this.revealRange(f,c),f):(b.backwards?e.start=e.end:e.end=e.start,void this.selection.setRange(e))},this.findNext=function(a,b){this.find({skipCurrent:!0,backwards:!1},a,b)},this.findPrevious=function(a,b){this.find(a,{skipCurrent:!0,backwards:!0},b)},this.revealRange=function(a,b){this.$blockScrolling+=1,this.session.unfold(a),this.selection.setSelectionRange(a),this.$blockScrolling-=1;var c=this.renderer.scrollTop;this.renderer.scrollSelectionIntoView(a.start,a.end,.5),b!==!1&&this.renderer.animateScrolling(c)},this.undo=function(){this.$blockScrolling++,this.session.getUndoManager().undo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.redo=function(){this.$blockScrolling++,this.session.getUndoManager().redo(),this.$blockScrolling--,this.renderer.scrollCursorIntoView(null,.5)},this.destroy=function(){this.renderer.destroy(),this._signal("destroy",this),this.session&&this.session.destroy()},this.setAutoScrollEditorIntoView=function(a){if(a){var b,c=this,d=!1;this.$scrollAnchor||(this.$scrollAnchor=document.createElement("div"));var e=this.$scrollAnchor;e.style.cssText="position:absolute",this.container.insertBefore(e,this.container.firstChild);var f=this.on("changeSelection",function(){d=!0}),g=this.renderer.on("beforeRender",function(){d&&(b=c.renderer.container.getBoundingClientRect())}),h=this.renderer.on("afterRender",function(){if(d&&b&&(c.isFocused()||c.searchBox&&c.searchBox.isFocused())){var a=c.renderer,f=a.$cursorLayer.$pixelPos,g=a.layerConfig,h=f.top-g.offset;d=f.top>=0&&h+b.top<0||!(f.topwindow.innerHeight)&&null,null!=d&&(e.style.top=h+"px",e.style.left=f.left+"px",e.style.height=g.lineHeight+"px",e.scrollIntoView(d)),d=b=null}});this.setAutoScrollEditorIntoView=function(a){a||(delete this.setAutoScrollEditorIntoView,this.off("changeSelection",f),this.renderer.off("afterRender",h),this.renderer.off("beforeRender",g))}}},this.$resetCursorStyle=function(){var a=this.$cursorStyle||"ace",b=this.renderer.$cursorLayer;b&&(b.setSmoothBlinking(/smooth/.test(a)),b.isBlinking=!this.$readOnly&&"wide"!=a,e.setCssClass(b.element,"ace_slim-cursors",/slim/.test(a)))}}).call(t.prototype),r.defineOptions(t.prototype,"editor",{selectionStyle:{set:function(a){this.onSelectionChange(),this._signal("changeSelectionStyle",{data:a})},initialValue:"line"},highlightActiveLine:{set:function(){this.$updateHighlightActiveLine()},initialValue:!0},highlightSelectedWord:{set:function(a){this.$onSelectionChange()},initialValue:!0},readOnly:{set:function(a){this.$resetCursorStyle()},initialValue:!1},cursorStyle:{set:function(a){this.$resetCursorStyle()},values:["ace","slim","smooth","wide"],initialValue:"ace"},mergeUndoDeltas:{values:[!1,!0,"always"],initialValue:!0},behavioursEnabled:{initialValue:!0},wrapBehavioursEnabled:{initialValue:!0},autoScrollEditorIntoView:{set:function(a){this.setAutoScrollEditorIntoView(a)}},keyboardHandler:{set:function(a){this.setKeyboardHandler(a)},get:function(){return this.keybindingId},handlesSet:!0},hScrollBarAlwaysVisible:"renderer",vScrollBarAlwaysVisible:"renderer",highlightGutterLine:"renderer",animatedScroll:"renderer",showInvisibles:"renderer",showPrintMargin:"renderer",printMarginColumn:"renderer",printMargin:"renderer",fadeFoldWidgets:"renderer",showFoldWidgets:"renderer",showLineNumbers:"renderer",showGutter:"renderer",displayIndentGuides:"renderer",fontSize:"renderer",fontFamily:"renderer",maxLines:"renderer",minLines:"renderer",scrollPastEnd:"renderer",fixedWidthGutter:"renderer",theme:"renderer",scrollSpeed:"$mouseHandler",dragDelay:"$mouseHandler",dragEnabled:"$mouseHandler",focusTimout:"$mouseHandler",tooltipFollowsMouse:"$mouseHandler",firstLineNumber:"session",overwrite:"session",newLineMode:"session",useWorker:"session",useSoftTabs:"session",tabSize:"session",wrap:"session",indentedSoftWrap:"session",foldStyle:"session",mode:"session"}),b.Editor=t}),define("ace/undomanager",["require","exports","module"],function(a,b,c){"use strict";var d=function(){this.reset()};(function(){function a(a){return{action:a.action,start:a.start,end:a.end,lines:1==a.lines.length?null:a.lines,text:1==a.lines.length?a.lines[0]:null}}function b(a){return{action:a.action,start:a.start,end:a.end,lines:a.lines||[a.text]}}function c(a,b){for(var c=new Array(a.length),d=0;d0},this.hasRedo=function(){return this.$redoStack.length>0},this.markClean=function(){this.dirtyCounter=0},this.isClean=function(){return 0===this.dirtyCounter},this.$serializeDeltas=function(b){return c(b,a)},this.$deserializeDeltas=function(a){return c(a,b)}}).call(d.prototype),b.UndoManager=d}),define("ace/layer/gutter",["require","exports","module","ace/lib/dom","ace/lib/oop","ace/lib/lang","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("../lib/dom"),e=a("../lib/oop"),f=a("../lib/lang"),g=a("../lib/event_emitter").EventEmitter,h=function(a){this.element=d.createElement("div"),this.element.className="ace_layer ace_gutter-layer",a.appendChild(this.element),this.setShowFoldWidgets(this.$showFoldWidgets),this.gutterWidth=0,this.$annotations=[],this.$updateAnnotations=this.$updateAnnotations.bind(this),this.$cells=[]};(function(){e.implement(this,g),this.setSession=function(a){this.session&&this.session.removeEventListener("change",this.$updateAnnotations),this.session=a,a&&a.on("change",this.$updateAnnotations)},this.addGutterDecoration=function(a,b){window.console&&console.warn&&console.warn("deprecated use session.addGutterDecoration"),this.session.addGutterDecoration(a,b)},this.removeGutterDecoration=function(a,b){window.console&&console.warn&&console.warn("deprecated use session.removeGutterDecoration"),this.session.removeGutterDecoration(a,b)},this.setAnnotations=function(a){this.$annotations=[];for(var b=0;bg&&(p=f.end.row+1,f=b.getNextFoldLine(p,f),g=f?f.start.row:1/0),p>e){for(;this.$cells.length>o+1;)n=this.$cells.pop(),this.element.removeChild(n.element);break}n=this.$cells[++o],n||(n={element:null,textNode:null,foldWidget:null},n.element=d.createElement("div"),n.textNode=document.createTextNode(""),n.element.appendChild(n.textNode),this.element.appendChild(n.element),this.$cells[o]=n);var q="ace_gutter-cell ";i[p]&&(q+=i[p]),j[p]&&(q+=j[p]),this.$annotations[p]&&(q+=this.$annotations[p].className),n.element.className!=q&&(n.element.className=q);var r=b.getRowLength(p)*a.lineHeight+"px";if(r!=n.element.style.height&&(n.element.style.height=r),h){var s=h[p];null==s&&(s=h[p]=b.getFoldWidget(p))}if(s){n.foldWidget||(n.foldWidget=d.createElement("span"),n.element.appendChild(n.foldWidget));var q="ace_fold-widget ace_"+s;q+="start"==s&&p==g&&pc.right-b.right?"foldWidgets":void 0}}).call(h.prototype),b.Gutter=h}),define("ace/layer/marker",["require","exports","module","ace/range","ace/lib/dom"],function(a,b,c){"use strict";var d=a("../range").Range,e=a("../lib/dom"),f=function(a){this.element=e.createElement("div"),this.element.className="ace_layer ace_marker-layer",a.appendChild(this.element)};(function(){function a(a,b,c,d){return(a?1:0)|(b?2:0)|(c?4:0)|(d?8:0)}this.$padding=0,this.setPadding=function(a){this.$padding=a},this.setSession=function(a){this.session=a},this.setMarkers=function(a){this.markers=a},this.update=function(a){var a=a||this.config;if(a){this.config=a;var b=[];for(var c in this.markers){var d=this.markers[c];if(d.range){var e=d.range.clipRows(a.firstRow,a.lastRow);if(!e.isEmpty())if(e=e.toScreenRange(this.session),d.renderer){var f=this.$getTop(e.start.row,a),g=this.$padding+e.start.column*a.characterWidth;d.renderer(b,e,g,f,a)}else"fullLine"==d.type?this.drawFullLineMarker(b,e,d.clazz,a):"screenLine"==d.type?this.drawScreenLineMarker(b,e,d.clazz,a):e.isMultiLine()?"text"==d.type?this.drawTextMarker(b,e,d.clazz,a):this.drawMultiLineMarker(b,e,d.clazz,a):this.drawSingleLineMarker(b,e,d.clazz+" ace_start ace_br15",a)}else d.update(b,this,this.session,a)}this.element.innerHTML=b.join("")}},this.$getTop=function(a,b){return(a-b.firstRowScreen)*b.lineHeight},this.drawTextMarker=function(b,c,e,f,g){for(var h=this.session,i=c.start.row,j=c.end.row,k=i,l=0,m=0,n=h.getScreenLastRowColumn(k),o=new d(k,c.start.column,k,m);k<=j;k++)o.start.row=o.end.row=k,o.start.column=k==i?c.start.column:h.getRowWrapIndent(k),o.end.column=n,l=m,m=n,n=k+1n,k==j),f,k==j?0:1,g)},this.drawMultiLineMarker=function(a,b,c,d,e){var f=this.$padding,g=d.lineHeight,h=this.$getTop(b.start.row,d),i=f+b.start.column*d.characterWidth;e=e||"",a.push("
"),h=this.$getTop(b.end.row,d);var j=b.end.column*d.characterWidth;if(a.push("
"),g=(b.end.row-b.start.row-1)*d.lineHeight,!(g<=0)){h=this.$getTop(b.start.row+1,d);var k=(b.start.column?1:0)|(b.end.column?0:8);a.push("
")}},this.drawSingleLineMarker=function(a,b,c,d,e,f){var g=d.lineHeight,h=(b.end.column+(e||0)-b.start.column)*d.characterWidth,i=this.$getTop(b.start.row,d),j=this.$padding+b.start.column*d.characterWidth;a.push("
")},this.drawFullLineMarker=function(a,b,c,d,e){var f=this.$getTop(b.start.row,d),g=d.lineHeight;b.start.row!=b.end.row&&(g+=this.$getTop(b.end.row,d)-f),a.push("
")},this.drawScreenLineMarker=function(a,b,c,d,e){var f=this.$getTop(b.start.row,d),g=d.lineHeight;a.push("
")}}).call(f.prototype),b.Marker=f}),define("ace/layer/text",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/dom"),f=a("../lib/lang"),g=(a("../lib/useragent"),a("../lib/event_emitter").EventEmitter),h=function(a){this.element=e.createElement("div"),this.element.className="ace_layer ace_text-layer",a.appendChild(this.element),this.$updateEolChar=this.$updateEolChar.bind(this)};(function(){d.implement(this,g),this.EOF_CHAR="¶",this.EOL_CHAR_LF="¬",this.EOL_CHAR_CRLF="¤",this.EOL_CHAR=this.EOL_CHAR_LF,this.TAB_CHAR="—",this.SPACE_CHAR="·",this.$padding=0,this.$updateEolChar=function(){var a="\n"==this.session.doc.getNewLineCharacter()?this.EOL_CHAR_LF:this.EOL_CHAR_CRLF;if(this.EOL_CHAR!=a)return this.EOL_CHAR=a,!0},this.setPadding=function(a){this.$padding=a,this.element.style.padding="0 "+a+"px"},this.getLineHeight=function(){return this.$fontMetrics.$characterSize.height||0},this.getCharacterWidth=function(){return this.$fontMetrics.$characterSize.width||0},this.$setFontMetrics=function(a){this.$fontMetrics=a,this.$fontMetrics.on("changeCharacterSize",function(a){this._signal("changeCharacterSize",a)}.bind(this)),this.$pollSizeChanges()},this.checkForSizeChanges=function(){this.$fontMetrics.checkForSizeChanges()},this.$pollSizeChanges=function(){return this.$pollSizeChangesTimer=this.$fontMetrics.$pollSizeChanges()},this.setSession=function(a){this.session=a,a&&this.$computeTabString()},this.showInvisibles=!1,this.setShowInvisibles=function(a){return this.showInvisibles!=a&&(this.showInvisibles=a,this.$computeTabString(),!0)},this.displayIndentGuides=!0,this.setDisplayIndentGuides=function(a){return this.displayIndentGuides!=a&&(this.displayIndentGuides=a,this.$computeTabString(),!0)},this.$tabStrings=[],this.onChangeTabSize=this.$computeTabString=function(){var a=this.session.getTabSize();this.tabSize=a;for(var b=this.$tabStrings=[0],c=1;c"+f.stringRepeat(this.TAB_CHAR,c)+""):b.push(f.stringRepeat(" ",c));if(this.displayIndentGuides){this.$indentGuideRe=/\s\S| \t|\t |\s$/;var d="ace_indent-guide",e="",g="";if(this.showInvisibles){d+=" ace_invisible",e=" ace_invisible_space",g=" ace_invisible_tab";var h=f.stringRepeat(this.SPACE_CHAR,this.tabSize),i=f.stringRepeat(this.TAB_CHAR,this.tabSize)}else var h=f.stringRepeat(" ",this.tabSize),i=h;this.$tabStrings[" "]=""+h+"",this.$tabStrings["\t"]=""+i+""}},this.updateLines=function(a,b,c){this.config.lastRow==a.lastRow&&this.config.firstRow==a.firstRow||this.scrollLines(a),this.config=a;for(var d=Math.max(b,a.firstRow),e=Math.min(c,a.lastRow),f=this.element.childNodes,g=0,h=a.firstRow;hj&&(h=i.end.row+1,i=this.session.getNextFoldLine(h,i),j=i?i.start.row:1/0),h>e)break;var k=f[g++];if(k){var l=[];this.$renderLine(l,h,!this.$useLineGroups(),h==j&&i),k.style.height=a.lineHeight*this.session.getRowLength(h)+"px",k.innerHTML=l.join("")}h++}},this.scrollLines=function(a){var b=this.config;if(this.config=a,!b||b.lastRow0;d--)c.removeChild(c.firstChild);if(b.lastRow>a.lastRow)for(var d=this.session.getFoldedRowCount(a.lastRow+1,b.lastRow);d>0;d--)c.removeChild(c.lastChild);if(a.firstRowb.lastRow){var e=this.$renderLinesFragment(a,b.lastRow+1,a.lastRow);c.appendChild(e)}},this.$renderLinesFragment=function(a,b,c){for(var d=this.element.ownerDocument.createDocumentFragment(),f=b,g=this.session.getNextFoldLine(f),h=g?g.start.row:1/0;;){if(f>h&&(f=g.end.row+1,g=this.session.getNextFoldLine(f,g),h=g?g.start.row:1/0),f>c)break;var i=e.createElement("div"),j=[];if(this.$renderLine(j,f,!1,f==h&&g),i.innerHTML=j.join(""),this.$useLineGroups())i.className="ace_line_group",d.appendChild(i),i.style.height=a.lineHeight*this.session.getRowLength(f)+"px";else for(;i.firstChild;)d.appendChild(i.firstChild);f++}return d},this.update=function(a){this.config=a;for(var b=[],c=a.firstRow,d=a.lastRow,e=c,f=this.session.getNextFoldLine(e),g=f?f.start.row:1/0;;){if(e>g&&(e=f.end.row+1,f=this.session.getNextFoldLine(e,f),g=f?f.start.row:1/0),e>d)break;this.$useLineGroups()&&b.push("
"),this.$renderLine(b,e,!1,e==g&&f),this.$useLineGroups()&&b.push("
"),e++}this.element.innerHTML=b.join("")},this.$textToken={text:!0,rparen:!0,lparen:!0},this.$renderToken=function(a,b,c,d){var e=this,g=/\t|&|<|>|( +)|([\x00-\x1f\x80-\xa0\xad\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF\uFFF9-\uFFFC])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g,h=function(a,c,d,g,h){if(c)return e.showInvisibles?""+f.stringRepeat(e.SPACE_CHAR,a.length)+"":a;if("&"==a)return"&";if("<"==a)return"<";if(">"==a)return">";if("\t"==a){var i=e.session.getScreenTabSize(b+g);return b+=i-1,e.$tabStrings[i]}if(" "==a){var j=e.showInvisibles?"ace_cjk ace_invisible ace_invisible_space":"ace_cjk",k=e.showInvisibles?e.SPACE_CHAR:"";return b+=1, +""+k+""}return d?""+e.SPACE_CHAR+"":(b+=1,""+a+"")},i=d.replace(g,h);if(this.$textToken[c.type])a.push(i);else{var j="ace_"+c.type.replace(/\./g," ace_"),k="";"fold"==c.type&&(k=" style='width:"+c.value.length*this.config.characterWidth+"px;' "),a.push("",i,"")}return b+d.length},this.renderIndentGuide=function(a,b,c){var d=b.search(this.$indentGuideRe);return d<=0||d>=c?b:" "==b[0]?(d-=d%this.tabSize,a.push(f.stringRepeat(this.$tabStrings[" "],d/this.tabSize)),b.substr(d)):"\t"==b[0]?(a.push(f.stringRepeat(this.$tabStrings["\t"],d)),b.substr(d)):b},this.$renderWrappedLine=function(a,b,c,d){for(var e=0,g=0,h=c[0],i=0,j=0;j=h;)i=this.$renderToken(a,i,k,l.substring(0,h-e)),l=l.substring(h-e),e=h,d||a.push("","
"),a.push(f.stringRepeat(" ",c.indent)),g++,i=0,h=c[g]||Number.MAX_VALUE;0!=l.length&&(e+=l.length,i=this.$renderToken(a,i,k,l))}}},this.$renderSimpleLine=function(a,b){var c=0,d=b[0],e=d.value;this.displayIndentGuides&&(e=this.renderIndentGuide(a,e)),e&&(c=this.$renderToken(a,c,d,e));for(var f=1;f"),e.length){var f=this.session.getRowSplitData(b);f&&f.length?this.$renderWrappedLine(a,e,f,c):this.$renderSimpleLine(a,e)}this.showInvisibles&&(d&&(b=d.end.row),a.push("",b==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,"")),c||a.push("
")},this.$getFoldLineTokens=function(a,b){function c(a,b,c){for(var d=0,f=0;f+a[d].value.lengthc-b&&(g=g.substring(0,c-b)),e.push({type:a[d].type,value:g}),f=b+g.length,d+=1}for(;fc?e.push({type:a[d].type,value:g.substring(0,c-f)}):e.push(a[d]),f+=g.length,d+=1}}var d=this.session,e=[],f=d.getTokens(a);return b.walk(function(a,b,g,h,i){null!=a?e.push({type:"fold",value:a}):(i&&(f=d.getTokens(b)),f.length&&c(f,h,g))},b.end.row,this.session.getLine(b.end.row).length),e},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(h.prototype),b.Text=h}),define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(a,b,c){"use strict";var d,e=a("../lib/dom"),f=function(a){this.element=e.createElement("div"),this.element.className="ace_layer ace_cursor-layer",a.appendChild(this.element),void 0===d&&(d=!("opacity"in this.element.style)),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),e.addCssClass(this.element,"ace_hidden-cursors"),this.$updateCursors=(d?this.$updateVisibility:this.$updateOpacity).bind(this)};(function(){this.$updateVisibility=function(a){for(var b=this.cursors,c=b.length;c--;)b[c].style.visibility=a?"":"hidden"},this.$updateOpacity=function(a){for(var b=this.cursors,c=b.length;c--;)b[c].style.opacity=a?"":"0"},this.$padding=0,this.setPadding=function(a){this.$padding=a},this.setSession=function(a){this.session=a},this.setBlinking=function(a){a!=this.isBlinking&&(this.isBlinking=a,this.restartTimer())},this.setBlinkInterval=function(a){a!=this.blinkInterval&&(this.blinkInterval=a,this.restartTimer())},this.setSmoothBlinking=function(a){a==this.smoothBlinking||d||(this.smoothBlinking=a,e.setCssClass(this.element,"ace_smooth-blinking",a),this.$updateCursors(!0),this.$updateCursors=this.$updateOpacity.bind(this),this.restartTimer())},this.addCursor=function(){var a=e.createElement("div");return a.className="ace_cursor",this.element.appendChild(a),this.cursors.push(a),a},this.removeCursor=function(){if(this.cursors.length>1){var a=this.cursors.pop();return a.parentNode.removeChild(a),a}},this.hideCursor=function(){this.isVisible=!1,e.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,e.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){var a=this.$updateCursors;if(clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.smoothBlinking&&e.removeCssClass(this.element,"ace_smooth-blinking"),a(!0),this.isBlinking&&this.blinkInterval&&this.isVisible){this.smoothBlinking&&setTimeout(function(){e.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));var b=function(){this.timeoutId=setTimeout(function(){a(!1)},.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){a(!0),b()},this.blinkInterval),b()}},this.getPixelPosition=function(a,b){if(!this.config||!this.session)return{left:0,top:0};a||(a=this.session.selection.getCursor());var c=this.session.documentToScreenPosition(a),d=this.$padding+c.column*this.config.characterWidth,e=(c.row-(b?this.config.firstRowScreen:0))*this.config.lineHeight;return{left:d,top:e}},this.update=function(a){this.config=a;var b=this.session.$selectionMarkers,c=0,d=0;void 0!==b&&0!==b.length||(b=[{cursor:null}]);for(var c=0,e=b.length;ca.height+a.offset||f.top<0)&&c>1)){var g=(this.cursors[d++]||this.addCursor()).style;this.drawCursor?this.drawCursor(g,f,a,b[c],this.session):(g.left=f.left+"px",g.top=f.top+"px",g.width=a.characterWidth+"px",g.height=a.lineHeight+"px")}}for(;this.cursors.length>d;)this.removeCursor();var h=this.session.getOverwrite();this.$setOverwrite(h),this.$pixelPos=f,this.restartTimer()},this.drawCursor=null,this.$setOverwrite=function(a){a!=this.overwrite&&(this.overwrite=a,a?e.addCssClass(this.element,"ace_overwrite-cursors"):e.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(f.prototype),b.Cursor=f}),define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("./lib/oop"),e=a("./lib/dom"),f=a("./lib/event"),g=a("./lib/event_emitter").EventEmitter,h=32768,i=function(a){this.element=e.createElement("div"),this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix,this.inner=e.createElement("div"),this.inner.className="ace_scrollbar-inner",this.element.appendChild(this.inner),a.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,f.addListener(this.element,"scroll",this.onScroll.bind(this)),f.addListener(this.element,"mousedown",f.preventDefault)};(function(){d.implement(this,g),this.setVisible=function(a){this.element.style.display=a?"":"none",this.isVisible=a,this.coeff=1}}).call(i.prototype);var j=function(a,b){i.call(this,a),this.scrollTop=0,this.scrollHeight=0,b.$scrollbarWidth=this.width=e.scrollbarWidth(a.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+"px"};d.inherits(j,i),function(){this.classSuffix="-v",this.onScroll=function(){if(!this.skipEvent){if(this.scrollTop=this.element.scrollTop,1!=this.coeff){var a=this.element.clientHeight/this.scrollHeight;this.scrollTop=this.scrollTop*(1-a)/(this.coeff-a)}this._emit("scroll",{data:this.scrollTop})}this.skipEvent=!1},this.getWidth=function(){return this.isVisible?this.width:0},this.setHeight=function(a){this.element.style.height=a+"px"},this.setInnerHeight=this.setScrollHeight=function(a){this.scrollHeight=a,a>h?(this.coeff=h/a,a=h):1!=this.coeff&&(this.coeff=1),this.inner.style.height=a+"px"},this.setScrollTop=function(a){this.scrollTop!=a&&(this.skipEvent=!0,this.scrollTop=a,this.element.scrollTop=a*this.coeff)}}.call(j.prototype);var k=function(a,b){i.call(this,a),this.scrollLeft=0,this.height=b.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};d.inherits(k,i),function(){this.classSuffix="-h",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit("scroll",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(a){this.element.style.width=a+"px"},this.setInnerWidth=function(a){this.inner.style.width=a+"px"},this.setScrollWidth=function(a){this.inner.style.width=a+"px"},this.setScrollLeft=function(a){this.scrollLeft!=a&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=a)}}.call(k.prototype),b.ScrollBar=j,b.ScrollBarV=j,b.ScrollBarH=k,b.VScrollBar=j,b.HScrollBar=k}),define("ace/renderloop",["require","exports","module","ace/lib/event"],function(a,b,c){"use strict";var d=a("./lib/event"),e=function(a,b){this.onRender=a,this.pending=!1,this.changes=0,this.window=b||window};(function(){this.schedule=function(a){if(this.changes=this.changes|a,!this.pending&&this.changes){this.pending=!0;var b=this;d.nextFrame(function(){b.pending=!1;for(var a;a=b.changes;)b.changes=0,b.onRender(a)},this.window)}}}).call(e.prototype),b.RenderLoop=e}),define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(a,b,c){var d=a("../lib/oop"),e=a("../lib/dom"),f=a("../lib/lang"),g=a("../lib/useragent"),h=a("../lib/event_emitter").EventEmitter,i=0,j=b.FontMetrics=function(a){this.el=e.createElement("div"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=e.createElement("div"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=e.createElement("div"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),a.appendChild(this.el),i||this.$testFractionalRect(),this.$measureNode.innerHTML=f.stringRepeat("X",i),this.$characterSize={width:0,height:0},this.checkForSizeChanges()};(function(){d.implement(this,h),this.$characterSize={width:0,height:0},this.$testFractionalRect=function(){var a=e.createElement("div");this.$setMeasureNodeStyles(a.style),a.style.width="0.2px",document.documentElement.appendChild(a);var b=a.getBoundingClientRect().width;i=b>0&&b<1?50:100,a.parentNode.removeChild(a)},this.$setMeasureNodeStyles=function(a,b){a.width=a.height="auto",a.left=a.top="0px",a.visibility="hidden",a.position="absolute",a.whiteSpace="pre",g.isIE<8?a["font-family"]="inherit":a.font="inherit",a.overflow=b?"hidden":"visible"},this.checkForSizeChanges=function(){var a=this.$measureSizes();if(a&&(this.$characterSize.width!==a.width||this.$characterSize.height!==a.height)){this.$measureNode.style.fontWeight="bold";var b=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=a,this.charSizes=Object.create(null),this.allowBoldFonts=b&&b.width===a.width&&b.height===a.height,this._emit("changeCharacterSize",{data:a})}},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer)return this.$pollSizeChangesTimer;var a=this;return this.$pollSizeChangesTimer=setInterval(function(){a.checkForSizeChanges()},500)},this.setPolling=function(a){a?this.$pollSizeChanges():this.$pollSizeChangesTimer&&(clearInterval(this.$pollSizeChangesTimer),this.$pollSizeChangesTimer=0)},this.$measureSizes=function(){if(50===i){var a=null;try{a=this.$measureNode.getBoundingClientRect()}catch(b){a={width:0,height:0}}var c={height:a.height,width:a.width/i}}else var c={height:this.$measureNode.clientHeight,width:this.$measureNode.clientWidth/i};return 0===c.width||0===c.height?null:c},this.$measureCharWidth=function(a){this.$main.innerHTML=f.stringRepeat(a,i);var b=this.$main.getBoundingClientRect();return b.width/i},this.getCharacterWidth=function(a){var b=this.charSizes[a];return void 0===b&&(b=this.charSizes[a]=this.$measureCharWidth(a)/this.$characterSize.width),b},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)}}).call(j.prototype)}),define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/lib/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"],function(a,b,c){"use strict";var d=a("./lib/oop"),e=a("./lib/dom"),f=a("./config"),g=a("./lib/useragent"),h=a("./layer/gutter").Gutter,i=a("./layer/marker").Marker,j=a("./layer/text").Text,k=a("./layer/cursor").Cursor,l=a("./scrollbar").HScrollBar,m=a("./scrollbar").VScrollBar,n=a("./renderloop").RenderLoop,o=a("./layer/font_metrics").FontMetrics,p=a("./lib/event_emitter").EventEmitter,q='.ace_editor {position: relative;overflow: hidden;font: 12px/normal \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;direction: ltr;text-align: left;}.ace_scroller {position: absolute;overflow: hidden;top: 0;bottom: 0;background-color: inherit;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;cursor: text;}.ace_content {position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;min-width: 100%;}.ace_dragging .ace_scroller:before{position: absolute;top: 0;left: 0;right: 0;bottom: 0;content: \'\';background: rgba(250, 250, 250, 0.01);z-index: 1000;}.ace_dragging.ace_dark .ace_scroller:before{background: rgba(0, 0, 0, 0.01);}.ace_selecting, .ace_selecting * {cursor: text !important;}.ace_gutter {position: absolute;overflow : hidden;width: auto;top: 0;bottom: 0;left: 0;cursor: default;z-index: 4;-ms-user-select: none;-moz-user-select: none;-webkit-user-select: none;user-select: none;}.ace_gutter-active-line {position: absolute;left: 0;right: 0;}.ace_scroller.ace_scroll-left {box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;}.ace_gutter-cell {padding-left: 19px;padding-right: 6px;background-repeat: no-repeat;}.ace_gutter-cell.ace_error {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: 2px center;}.ace_gutter-cell.ace_warning {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");background-position: 2px center;}.ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");background-position: 2px center;}.ace_dark .ace_gutter-cell.ace_info {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");}.ace_scrollbar {position: absolute;right: 0;bottom: 0;z-index: 6;}.ace_scrollbar-inner {position: absolute;cursor: text;left: 0;top: 0;}.ace_scrollbar-v{overflow-x: hidden;overflow-y: scroll;top: 0;}.ace_scrollbar-h {overflow-x: scroll;overflow-y: hidden;left: 0;}.ace_print-margin {position: absolute;height: 100%;}.ace_text-input {position: absolute;z-index: 0;width: 0.5em;height: 1em;opacity: 0;background: transparent;-moz-appearance: none;appearance: none;border: none;resize: none;outline: none;overflow: hidden;font: inherit;padding: 0 1px;margin: 0 -1px;text-indent: -1em;-ms-user-select: text;-moz-user-select: text;-webkit-user-select: text;user-select: text;white-space: pre!important;}.ace_text-input.ace_composition {background: inherit;color: inherit;z-index: 1000;opacity: 1;text-indent: 0;}.ace_layer {z-index: 1;position: absolute;overflow: hidden;word-wrap: normal;white-space: pre;height: 100%;width: 100%;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;pointer-events: none;}.ace_gutter-layer {position: relative;width: auto;text-align: right;pointer-events: auto;}.ace_text-layer {font: inherit !important;}.ace_cjk {display: inline-block;text-align: center;}.ace_cursor-layer {z-index: 4;}.ace_cursor {z-index: 4;position: absolute;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;border-left: 2px solid;transform: translatez(0);}.ace_slim-cursors .ace_cursor {border-left-width: 1px;}.ace_overwrite-cursors .ace_cursor {border-left-width: 0;border-bottom: 1px solid;}.ace_hidden-cursors .ace_cursor {opacity: 0.2;}.ace_smooth-blinking .ace_cursor {-webkit-transition: opacity 0.18s;transition: opacity 0.18s;}.ace_editor.ace_multiselect .ace_cursor {border-left-width: 1px;}.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {position: absolute;z-index: 3;}.ace_marker-layer .ace_selection {position: absolute;z-index: 5;}.ace_marker-layer .ace_bracket {position: absolute;z-index: 6;}.ace_marker-layer .ace_active-line {position: absolute;z-index: 2;}.ace_marker-layer .ace_selected-word {position: absolute;z-index: 4;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}.ace_line .ace_fold {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;display: inline-block;height: 11px;margin-top: -2px;vertical-align: middle;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");background-repeat: no-repeat, repeat-x;background-position: center center, top left;color: transparent;border: 1px solid black;border-radius: 2px;cursor: pointer;pointer-events: auto;}.ace_dark .ace_fold {}.ace_fold:hover{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");}.ace_tooltip {background-color: #FFF;background-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));background-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));border: 1px solid gray;border-radius: 1px;box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);color: black;max-width: 100%;padding: 3px 4px;position: fixed;z-index: 999999;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;cursor: default;white-space: pre;word-wrap: break-word;line-height: normal;font-style: normal;font-weight: normal;letter-spacing: normal;pointer-events: none;}.ace_folding-enabled > .ace_gutter-cell {padding-right: 13px;}.ace_fold-widget {-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;margin: 0 -12px 0 1px;display: none;width: 11px;vertical-align: top;background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");background-repeat: no-repeat;background-position: center;border-radius: 3px;border: 1px solid transparent;cursor: pointer;}.ace_folding-enabled .ace_fold-widget {display: inline-block; }.ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");}.ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");}.ace_fold-widget:hover {border: 1px solid rgba(0, 0, 0, 0.3);background-color: rgba(255, 255, 255, 0.2);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);}.ace_fold-widget:active {border: 1px solid rgba(0, 0, 0, 0.4);background-color: rgba(0, 0, 0, 0.05);box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);}.ace_dark .ace_fold-widget {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");}.ace_dark .ace_fold-widget.ace_end {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget.ace_closed {background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");}.ace_dark .ace_fold-widget:hover {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);background-color: rgba(255, 255, 255, 0.1);}.ace_dark .ace_fold-widget:active {box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);}.ace_fold-widget.ace_invalid {background-color: #FFB4B4;border-color: #DE5555;}.ace_fade-fold-widgets .ace_fold-widget {-webkit-transition: opacity 0.4s ease 0.05s;transition: opacity 0.4s ease 0.05s;opacity: 0;}.ace_fade-fold-widgets:hover .ace_fold-widget {-webkit-transition: opacity 0.05s ease 0.05s;transition: opacity 0.05s ease 0.05s;opacity:1;}.ace_underline {text-decoration: underline;}.ace_bold {font-weight: bold;}.ace_nobold .ace_bold {font-weight: normal;}.ace_italic {font-style: italic;}.ace_error-marker {background-color: rgba(255, 0, 0,0.2);position: absolute;z-index: 9;}.ace_highlight-marker {background-color: rgba(255, 255, 0,0.2);position: absolute;z-index: 8;}.ace_br1 {border-top-left-radius : 3px;}.ace_br2 {border-top-right-radius : 3px;}.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}.ace_br4 {border-bottom-right-radius: 3px;}.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}.ace_br8 {border-bottom-left-radius : 3px;}.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}';e.importCssString(q,"ace_editor.css");var r=function(a,b){var c=this;this.container=a||e.createElement("div"),this.$keepTextAreaAtCursor=!g.isOldIE,e.addCssClass(this.container,"ace_editor"),this.setTheme(b),this.$gutter=e.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.scroller=e.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=e.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new h(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new i(this.content);var d=this.$textLayer=new j(this.content);this.canvas=d.element,this.$markerFront=new i(this.content),this.$cursorLayer=new k(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new m(this.container,this),this.scrollBarH=new l(this.container,this),this.scrollBarV.addEventListener("scroll",function(a){c.$scrollAnimation||c.session.setScrollTop(a.data-c.scrollMargin.top)}),this.scrollBarH.addEventListener("scroll",function(a){c.$scrollAnimation||c.session.setScrollLeft(a.data-c.scrollMargin.left)}),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new o(this.container),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener("changeCharacterSize",function(a){c.updateCharacterSize(),c.onResize(!0,c.gutterWidth,c.$size.width,c.$size.height),c._signal("changeCharacterSize",a)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$loop=new n(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),f.resetOptions(this),f._emit("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,d.implement(this,p),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin()},this.setSession=function(a){this.session&&this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode),this.session=a,a&&this.scrollMargin.top&&a.getScrollTop()<=0&&a.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(a),this.$markerBack.setSession(a),this.$markerFront.setSession(a),this.$gutterLayer.setSession(a),this.$textLayer.setSession(a),a&&(this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null,this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode))},this.updateLines=function(a,b,c){if(void 0===b&&(b=1/0),this.$changedLines?(this.$changedLines.firstRow>a&&(this.$changedLines.firstRow=a),this.$changedLines.lastRowthis.layerConfig.lastRow||this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar()},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(a){a?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(a,b,c,d){if(!(this.resizing>2)){this.resizing>0?this.resizing++:this.resizing=a?1:0;var e=this.container;d||(d=e.clientHeight||e.scrollHeight),c||(c=e.clientWidth||e.scrollWidth);var f=this.$updateCachedSize(a,b,c,d);if(!this.$size.scrollerHeight||!c&&!d)return this.resizing=0;a&&(this.$gutterLayer.$padding=null),a?this.$renderChanges(f|this.$changes,!0):this.$loop.schedule(f|this.$changes),this.resizing&&(this.resizing=0),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null}},this.$updateCachedSize=function(a,b,c,d){d-=this.$extraHeight||0;var e=0,f=this.$size,g={width:f.width,height:f.height,scrollerHeight:f.scrollerHeight,scrollerWidth:f.scrollerWidth};return d&&(a||f.height!=d)&&(f.height=d,e|=this.CHANGE_SIZE,f.scrollerHeight=f.height,this.$horizScroll&&(f.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px",e|=this.CHANGE_SCROLL),c&&(a||f.width!=c)&&(e|=this.CHANGE_SIZE,f.width=c,null==b&&(b=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=b,this.scrollBarH.element.style.left=this.scroller.style.left=b+"px",f.scrollerWidth=Math.max(0,c-b-this.scrollBarV.getWidth()),this.scrollBarH.element.style.right=this.scroller.style.right=this.scrollBarV.getWidth()+"px",this.scroller.style.bottom=this.scrollBarH.getHeight()+"px",(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||a)&&(e|=this.CHANGE_FULL)),f.$dirty=!c||!d,e&&this._signal("resize",g),e},this.onGutterResize=function(){var a=this.$showGutter?this.$gutter.offsetWidth:0;a!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,a,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()?this.$loop.schedule(this.CHANGE_FULL):this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):(this.$computeLayerConfig(),this.$loop.schedule(this.CHANGE_MARKER))},this.adjustWrapLimit=function(){var a=this.$size.scrollerWidth-2*this.$padding,b=Math.floor(a/this.characterWidth);return this.session.adjustWrapLimit(b,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(a){this.setOption("animatedScroll",a)},this.getAnimatedScroll=function(){ +return this.$animatedScroll},this.setShowInvisibles=function(a){this.setOption("showInvisibles",a)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(a){this.setOption("displayIndentGuides",a)},this.setShowPrintMargin=function(a){this.setOption("showPrintMargin",a)},this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(a){this.setOption("printMarginColumn",a)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(a){return this.setOption("showGutter",a)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(a){this.setOption("fadeFoldWidgets",a)},this.setHighlightGutterLine=function(a){this.setOption("highlightGutterLine",a)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updateGutterLineHighlight=function(){var a=this.$cursorLayer.$pixelPos,b=this.layerConfig.lineHeight;if(this.session.getUseWrapMode()){var c=this.session.selection.getCursor();c.column=0,a=this.$cursorLayer.getPixelPosition(c,!0),b*=this.session.getRowLength(c.row)}this.$gutterLineHighlight.style.top=a.top-this.layerConfig.offset+"px",this.$gutterLineHighlight.style.height=b+"px"},this.$updatePrintMargin=function(){if(this.$showPrintMargin||this.$printMarginEl){if(!this.$printMarginEl){var a=e.createElement("div");a.className="ace_layer ace_print-margin-layer",this.$printMarginEl=e.createElement("div"),this.$printMarginEl.className="ace_print-margin",a.appendChild(this.$printMarginEl),this.content.insertBefore(a,this.content.firstChild)}var b=this.$printMarginEl.style;b.left=this.characterWidth*this.$printMarginColumn+this.$padding+"px",b.visibility=this.$showPrintMargin?"visible":"hidden",this.session&&this.session.$wrap==-1&&this.adjustWrapLimit()}},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.scroller},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(this.$keepTextAreaAtCursor){var a=this.layerConfig,b=this.$cursorLayer.$pixelPos.top,c=this.$cursorLayer.$pixelPos.left;b-=a.offset;var d=this.textarea.style,e=this.lineHeight;if(b<0||b>a.height-e)return void(d.top=d.left="0");var f=this.characterWidth;if(this.$composition){var g=this.textarea.value.replace(/^\x01+/,"");f*=this.session.$getStringScreenWidth(g)[0]+2,e+=2}c-=this.scrollLeft,c>this.$size.scrollerWidth-f&&(c=this.$size.scrollerWidth-f),c+=this.gutterWidth,d.height=e+"px",d.width=f+"px",d.left=Math.min(c,this.$size.scrollerWidth-f)+"px",d.top=Math.min(b,this.$size.height-e)+"px"}},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(0===this.layerConfig.offset?0:1)},this.getLastFullyVisibleRow=function(){var a=this.layerConfig,b=a.lastRow,c=this.session.documentToScreenRow(b,0)*a.lineHeight;return c-this.session.getScrollTop()>a.height-a.lineHeight?b-1:b},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(a){this.$padding=a,this.$textLayer.setPadding(a),this.$cursorLayer.setPadding(a),this.$markerFront.setPadding(a),this.$markerBack.setPadding(a),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(a,b,c,d){var e=this.scrollMargin;e.top=0|a,e.bottom=0|b,e.right=0|d,e.left=0|c,e.v=e.top+e.bottom,e.h=e.left+e.right,e.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-e.top),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(a){this.setOption("hScrollBarAlwaysVisible",a)},this.getVScrollBarAlwaysVisible=function(){return this.$vScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(a){this.setOption("vScrollBarAlwaysVisible",a)},this.$updateScrollBarV=function(){var a=this.layerConfig.maxHeight,b=this.$size.scrollerHeight;!this.$maxLines&&this.$scrollPastEnd&&(a-=(b-this.lineHeight)*this.$scrollPastEnd,this.scrollTop>a-b&&(a=this.scrollTop+b,this.scrollBarV.scrollTop=null)),this.scrollBarV.setScrollHeight(a+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(a,b){if(this.$changes&&(a|=this.$changes,this.$changes=0),!this.session||!this.container.offsetWidth||this.$frozen||!a&&!b)return void(this.$changes|=a);if(this.$size.$dirty)return this.$changes|=a,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal("beforeRender");var c=this.layerConfig;if(a&this.CHANGE_FULL||a&this.CHANGE_SIZE||a&this.CHANGE_TEXT||a&this.CHANGE_LINES||a&this.CHANGE_SCROLL||a&this.CHANGE_H_SCROLL){if(a|=this.$computeLayerConfig(),c.firstRow!=this.layerConfig.firstRow&&c.firstRowScreen==this.layerConfig.firstRowScreen){var d=this.scrollTop+(c.firstRow-this.layerConfig.firstRow)*this.lineHeight;d>0&&(this.scrollTop=d,a|=this.CHANGE_SCROLL,a|=this.$computeLayerConfig())}c=this.layerConfig,this.$updateScrollBarV(),a&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),this.$gutterLayer.element.style.marginTop=-c.offset+"px",this.content.style.marginTop=-c.offset+"px",this.content.style.width=c.width+2*this.$padding+"px",this.content.style.height=c.minHeight+"px"}return a&this.CHANGE_H_SCROLL&&(this.content.style.marginLeft=-this.scrollLeft+"px",this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left"),a&this.CHANGE_FULL?(this.$textLayer.update(c),this.$showGutter&&this.$gutterLayer.update(c),this.$markerBack.update(c),this.$markerFront.update(c),this.$cursorLayer.update(c),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),void this._signal("afterRender")):a&this.CHANGE_SCROLL?(a&this.CHANGE_TEXT||a&this.CHANGE_LINES?this.$textLayer.update(c):this.$textLayer.scrollLines(c),this.$showGutter&&this.$gutterLayer.update(c),this.$markerBack.update(c),this.$markerFront.update(c),this.$cursorLayer.update(c),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this.$moveTextAreaToCursor(),void this._signal("afterRender")):(a&this.CHANGE_TEXT?(this.$textLayer.update(c),this.$showGutter&&this.$gutterLayer.update(c)):a&this.CHANGE_LINES?(this.$updateLines()||a&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(c):(a&this.CHANGE_TEXT||a&this.CHANGE_GUTTER)&&this.$showGutter&&this.$gutterLayer.update(c),a&this.CHANGE_CURSOR&&(this.$cursorLayer.update(c),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight()),a&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(c),a&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(c),void this._signal("afterRender"))},this.$autosize=function(){var a=this.session.getScreenLength()*this.lineHeight,b=this.$maxLines*this.lineHeight,c=Math.min(b,Math.max((this.$minLines||1)*this.lineHeight,a))+this.scrollMargin.v+(this.$extraHeight||0);this.$horizScroll&&(c+=this.scrollBarH.getHeight()),this.$maxPixelHeight&&c>this.$maxPixelHeight&&(c=this.$maxPixelHeight);var d=a>b;if(c!=this.desiredHeight||this.$size.height!=this.desiredHeight||d!=this.$vScroll){d!=this.$vScroll&&(this.$vScroll=d,this.scrollBarV.setVisible(d));var e=this.container.clientWidth;this.container.style.height=c+"px",this.$updateCachedSize(!0,this.$gutterWidth,e,c),this.desiredHeight=c,this._signal("autosize")}},this.$computeLayerConfig=function(){var a=this.session,b=this.$size,c=b.height<=2*this.lineHeight,d=this.session.getScreenLength(),e=d*this.lineHeight,f=this.$getLongestLine(),g=!c&&(this.$hScrollBarAlwaysVisible||b.scrollerWidth-f-2*this.$padding<0),h=this.$horizScroll!==g;h&&(this.$horizScroll=g,this.scrollBarH.setVisible(g));var i=this.$vScroll;this.$maxLines&&this.lineHeight>1&&this.$autosize();var j=this.scrollTop%this.lineHeight,k=b.scrollerHeight+this.lineHeight,l=!this.$maxLines&&this.$scrollPastEnd?(b.scrollerHeight-this.lineHeight)*this.$scrollPastEnd:0;e+=l;var m=this.scrollMargin;this.session.setScrollTop(Math.max(-m.top,Math.min(this.scrollTop,e-b.scrollerHeight+m.bottom))),this.session.setScrollLeft(Math.max(-m.left,Math.min(this.scrollLeft,f+2*this.$padding-b.scrollerWidth+m.right)));var n=!c&&(this.$vScrollBarAlwaysVisible||b.scrollerHeight-e+l<0||this.scrollTop>m.top),o=i!==n;o&&(this.$vScroll=n,this.scrollBarV.setVisible(n));var p,q,r=Math.ceil(k/this.lineHeight)-1,s=Math.max(0,Math.round((this.scrollTop-j)/this.lineHeight)),t=s+r,u=this.lineHeight;s=a.screenToDocumentRow(s,0);var v=a.getFoldLine(s);v&&(s=v.start.row),p=a.documentToScreenRow(s,0),q=a.getRowLength(s)*u,t=Math.min(a.screenToDocumentRow(t,0),a.getLength()-1),k=b.scrollerHeight+a.getRowLength(t)*u+q,j=this.scrollTop-p*u;var w=0;return this.layerConfig.width!=f&&(w=this.CHANGE_H_SCROLL),(h||o)&&(w=this.$updateCachedSize(!0,this.gutterWidth,b.width,b.height),this._signal("scrollbarVisibilityChanged"),o&&(f=this.$getLongestLine())),this.layerConfig={width:f,padding:this.$padding,firstRow:s,firstRowScreen:p,lastRow:t,lineHeight:u,characterWidth:this.characterWidth,minHeight:k,maxHeight:e,offset:j,gutterOffset:u?Math.max(0,Math.ceil((j+b.height-b.scrollerHeight)/u)):0,height:this.$size.scrollerHeight},w},this.$updateLines=function(){var a=this.$changedLines.firstRow,b=this.$changedLines.lastRow;this.$changedLines=null;var c=this.layerConfig;if(!(a>c.lastRow+1||bf?(b&&i+g>f+this.lineHeight&&(f-=b*this.$size.scrollerHeight),0===f&&(f=-this.scrollMargin.top),this.session.setScrollTop(f)):i+this.$size.scrollerHeight-he?(e=1-this.scrollMargin.top||(b>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1+this.scrollMargin.bottom||(a<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left||(a>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right||void 0)))},this.pixelToScreenCoordinates=function(a,b){var c=this.scroller.getBoundingClientRect(),d=(a+this.scrollLeft-c.left-this.$padding)/this.characterWidth,e=Math.floor((b+this.scrollTop-c.top)/this.lineHeight),f=Math.round(d);return{row:e,column:f,side:d-f>0?1:-1}},this.screenToTextCoordinates=function(a,b){var c=this.scroller.getBoundingClientRect(),d=Math.round((a+this.scrollLeft-c.left-this.$padding)/this.characterWidth),e=(b+this.scrollTop-c.top)/this.lineHeight;return this.session.screenToDocumentPosition(e,Math.max(d,0))},this.textToScreenCoordinates=function(a,b){var c=this.scroller.getBoundingClientRect(),d=this.session.documentToScreenPosition(a,b),e=this.$padding+Math.round(d.column*this.characterWidth),f=d.row*this.lineHeight;return{pageX:c.left+e-this.scrollLeft,pageY:c.top+f-this.scrollTop}},this.visualizeFocus=function(){e.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){e.removeCssClass(this.container,"ace_focus")},this.showComposition=function(a){this.$composition||(this.$composition={keepTextAreaAtCursor:this.$keepTextAreaAtCursor,cssText:this.textarea.style.cssText}),this.$keepTextAreaAtCursor=!0,e.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor()},this.setCompositionText=function(a){this.$moveTextAreaToCursor()},this.hideComposition=function(){this.$composition&&(e.removeCssClass(this.textarea,"ace_composition"),this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor,this.textarea.style.cssText=this.$composition.cssText,this.$composition=null)},this.setTheme=function(a,b){function c(c){if(d.$themeId!=a)return b&&b();if(!c||!c.cssClass)throw new Error("couldn't load module "+a+" or it didn't call define");e.importCssString(c.cssText,c.cssClass,d.container.ownerDocument),d.theme&&e.removeCssClass(d.container,d.theme.cssClass);var f="padding"in c?c.padding:"padding"in(d.theme||{})?4:d.$padding;d.$padding&&f!=d.$padding&&d.setPadding(f),d.$theme=c.cssClass,d.theme=c,e.addCssClass(d.container,c.cssClass),e.setCssClass(d.container,"ace_dark",c.isDark),d.$size&&(d.$size.width=0,d.$updateSizeAsync()),d._dispatchEvent("themeLoaded",{theme:c}),b&&b()}var d=this;if(this.$themeId=a,d._dispatchEvent("themeChange",{theme:a}),a&&"string"!=typeof a)c(a);else{var g=a||this.$options.theme.initialValue;f.loadModule(["theme",g],c)}},this.getTheme=function(){return this.$themeId},this.setStyle=function(a,b){e.setCssClass(this.container,a,b!==!1)},this.unsetStyle=function(a){e.removeCssClass(this.container,a)},this.setCursorStyle=function(a){this.scroller.style.cursor!=a&&(this.scroller.style.cursor=a)},this.setMouseCursor=function(a){this.scroller.style.cursor=a},this.destroy=function(){this.$textLayer.destroy(),this.$cursorLayer.destroy()}}).call(r.prototype),f.defineOptions(r.prototype,"renderer",{animatedScroll:{initialValue:!1},showInvisibles:{set:function(a){this.$textLayer.setShowInvisibles(a)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!1},showPrintMargin:{set:function(){this.$updatePrintMargin()},initialValue:!0},printMarginColumn:{set:function(){this.$updatePrintMargin()},initialValue:80},printMargin:{set:function(a){"number"==typeof a&&(this.$printMarginColumn=a),this.$showPrintMargin=!!a,this.$updatePrintMargin()},get:function(){return this.$showPrintMargin&&this.$printMarginColumn}},showGutter:{set:function(a){this.$gutter.style.display=a?"block":"none",this.$loop.schedule(this.CHANGE_FULL),this.onGutterResize()},initialValue:!0},fadeFoldWidgets:{set:function(a){e.setCssClass(this.$gutter,"ace_fade-fold-widgets",a)},initialValue:!1},showFoldWidgets:{set:function(a){this.$gutterLayer.setShowFoldWidgets(a)},initialValue:!0},showLineNumbers:{set:function(a){this.$gutterLayer.setShowLineNumbers(a),this.$loop.schedule(this.CHANGE_GUTTER)},initialValue:!0},displayIndentGuides:{set:function(a){this.$textLayer.setDisplayIndentGuides(a)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!0},highlightGutterLine:{set:function(a){return this.$gutterLineHighlight?(this.$gutterLineHighlight.style.display=a?"":"none",void(this.$cursorLayer.$pixelPos&&this.$updateGutterLineHighlight())):(this.$gutterLineHighlight=e.createElement("div"),this.$gutterLineHighlight.className="ace_gutter-active-line",void this.$gutter.appendChild(this.$gutterLineHighlight))},initialValue:!1,value:!0},hScrollBarAlwaysVisible:{set:function(a){this.$hScrollBarAlwaysVisible&&this.$horizScroll||this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},vScrollBarAlwaysVisible:{set:function(a){this.$vScrollBarAlwaysVisible&&this.$vScroll||this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},fontSize:{set:function(a){"number"==typeof a&&(a+="px"),this.container.style.fontSize=a,this.updateFontSize()},initialValue:12},fontFamily:{set:function(a){this.container.style.fontFamily=a,this.updateFontSize()}},maxLines:{set:function(a){this.updateFull()}},minLines:{set:function(a){this.updateFull()}},maxPixelHeight:{set:function(a){this.updateFull()},initialValue:0},scrollPastEnd:{set:function(a){a=+a||0,this.$scrollPastEnd!=a&&(this.$scrollPastEnd=a,this.$loop.schedule(this.CHANGE_SCROLL))},initialValue:0,handlesSet:!0},fixedWidthGutter:{set:function(a){this.$gutterLayer.$fixedWidth=!!a,this.$loop.schedule(this.CHANGE_GUTTER)}},theme:{set:function(a){this.setTheme(a)},get:function(){return this.$themeId||this.theme},initialValue:"./theme/textmate",handlesSet:!0}}),b.VirtualRenderer=r}),define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"],function(a,b,c){"use strict";var d=a("../lib/oop"),e=a("../lib/net"),f=a("../lib/event_emitter").EventEmitter,g=a("../config"),h=function(b,c,d,e){if(this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.onMessage=this.onMessage.bind(this),a.nameToUrl&&!a.toUrl&&(a.toUrl=a.nameToUrl),g.get("packaged")||!a.toUrl)e=e||g.moduleUrl(c,"worker");else{var f=this.$normalizePath;e=e||f(a.toUrl("ace/worker/worker.js",null,"_"));var h={};b.forEach(function(b){h[b]=f(a.toUrl(b,null,"_").replace(/(\.js)?(\?.*)?$/,""))})}try{this.$worker=new Worker(e)}catch(i){if(!(i instanceof window.DOMException))throw i;var j=this.$workerBlob(e),k=window.URL||window.webkitURL,l=k.createObjectURL(j);this.$worker=new Worker(l),k.revokeObjectURL(l)}this.$worker.postMessage({init:!0,tlns:h,module:c,classname:d}),this.callbackId=1,this.callbacks={},this.$worker.onmessage=this.onMessage};(function(){d.implement(this,f),this.onMessage=function(a){var b=a.data;switch(b.type){case"event":this._signal(b.name,{data:b.data});break;case"call":var c=this.callbacks[b.id];c&&(c(b.data),delete this.callbacks[b.id]);break;case"error":this.reportError(b.data);break;case"log":window.console&&console.log&&console.log.apply(console,b.data)}},this.reportError=function(a){window.console&&console.error&&console.error(a)},this.$normalizePath=function(a){return e.qualifyURL(a)},this.terminate=function(){this._signal("terminate",{}),this.deltaQueue=null,this.$worker.terminate(),this.$worker=null,this.$doc&&this.$doc.off("change",this.changeListener),this.$doc=null},this.send=function(a,b){this.$worker.postMessage({command:a,args:b})},this.call=function(a,b,c){if(c){var d=this.callbackId++;this.callbacks[d]=c,b.push(d)}this.send(a,b)},this.emit=function(a,b){try{this.$worker.postMessage({event:a,data:{data:b.data}})}catch(c){console.error(c.stack)}},this.attachToDocument=function(a){this.$doc&&this.terminate(),this.$doc=a,this.call("setValue",[a.getValue()]),a.on("change",this.changeListener)},this.changeListener=function(a){this.deltaQueue||(this.deltaQueue=[],setTimeout(this.$sendDeltaQueue,0)),"insert"==a.action?this.deltaQueue.push(a.start,a.lines):this.deltaQueue.push(a.start,a.end)},this.$sendDeltaQueue=function(){var a=this.deltaQueue;a&&(this.deltaQueue=null,a.length>50&&a.length>this.$doc.getLength()>>1?this.call("setValue",[this.$doc.getValue()]):this.emit("change",{data:a}))},this.$workerBlob=function(a){var b="importScripts('"+e.qualifyURL(a)+"');";try{return new Blob([b],{type:"application/javascript"})}catch(c){var d=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder,f=new d;return f.append(b),f.getBlob("application/javascript")}}}).call(h.prototype);var i=function(a,b,c){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.callbackId=1,this.callbacks={},this.messageBuffer=[];var d=null,e=!1,h=Object.create(f),i=this;this.$worker={},this.$worker.terminate=function(){},this.$worker.postMessage=function(a){i.messageBuffer.push(a),d&&(e?setTimeout(j):j())},this.setEmitSync=function(a){e=a};var j=function(){var a=i.messageBuffer.shift();a.command?d[a.command].apply(d,a.args):a.event&&h._signal(a.event,a.data)};h.postMessage=function(a){i.onMessage({data:a})},h.callback=function(a,b){this.postMessage({type:"call",id:b,data:a})},h.emit=function(a,b){this.postMessage({type:"event",name:a,data:b})},g.loadModule(["worker",b],function(a){for(d=new a[c](h);i.messageBuffer.length;)j()})};i.prototype=h.prototype,b.UIWorkerClient=i,b.WorkerClient=h}),define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(a,b,c){"use strict";var d=a("./range").Range,e=a("./lib/event_emitter").EventEmitter,f=a("./lib/oop"),g=function(a,b,c,d,e,f){var g=this;this.length=b,this.session=a,this.doc=a.getDocument(),this.mainClass=e,this.othersClass=f,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=d,this.$onCursorChange=function(){setTimeout(function(){g.onCursorChange()})},this.$pos=c;var h=a.getUndoManager().$undoStack||a.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=h.length,this.setup(),a.selection.on("changeCursor",this.$onCursorChange)};(function(){f.implement(this,e),this.setup=function(){var a=this,b=this.doc,c=this.session;this.selectionBefore=c.selection.toJSON(),c.selection.inMultiSelectMode&&c.selection.toSingleRange(),this.pos=b.createAnchor(this.$pos.row,this.$pos.column);var e=this.pos;e.$insertRight=!0,e.detach(),e.markerId=c.addMarker(new d(e.row,e.column,e.row,e.column+this.length),this.mainClass,null,!1),this.others=[],this.$others.forEach(function(c){var d=b.createAnchor(c.row,c.column);d.$insertRight=!0,d.detach(),a.others.push(d)}),c.setUndoSelect(!1)},this.showOtherMarkers=function(){if(!this.othersActive){var a=this.session,b=this;this.othersActive=!0,this.others.forEach(function(c){c.markerId=a.addMarker(new d(c.row,c.column,c.row,c.column+b.length),b.othersClass,null,!1)})}},this.hideOtherMarkers=function(){if(this.othersActive){this.othersActive=!1;for(var a=0;a=this.pos.column&&b.start.column<=this.pos.column+this.length+1,f=b.start.column-this.pos.column;if(this.updateAnchors(a),e&&(this.length+=c),e&&!this.session.$fromUndo)if("insert"===a.action)for(var g=this.others.length-1;g>=0;g--){var h=this.others[g],i={row:h.row,column:h.column+f};this.doc.insertMergedLines(i,a.lines)}else if("remove"===a.action)for(var g=this.others.length-1;g>=0;g--){var h=this.others[g],i={row:h.row,column:h.column+f};this.doc.remove(new d(i.row,i.column,i.row,i.column-c))}this.$updating=!1,this.updateMarkers()}},this.updateAnchors=function(a){this.pos.onChange(a);for(var b=this.others.length;b--;)this.others[b].onChange(a);this.updateMarkers()},this.updateMarkers=function(){if(!this.$updating){var a=this,b=this.session,c=function(c,e){b.removeMarker(c.markerId),c.markerId=b.addMarker(new d(c.row,c.column,c.row,c.column+a.length),e,null,!1)};c(this.pos,this.mainClass);for(var e=this.others.length;e--;)c(this.others[e],this.othersClass)}},this.onCursorChange=function(a){if(!this.$updating&&this.session){var b=this.session.selection.getCursor();b.row===this.pos.row&&b.column>=this.pos.column&&b.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",a)):(this.hideOtherMarkers(),this._emit("cursorLeave",a))}},this.detach=function(){this.session.removeMarker(this.pos&&this.pos.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.session.setUndoSelect(!0),this.session=null},this.cancel=function(){if(this.$undoStackDepth!==-1){for(var a=this.session.getUndoManager(),b=(a.$undoStack||a.$undostack).length-this.$undoStackDepth,c=0;c1&&!this.inMultiSelectMode&&(this._signal("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),b||this.fromOrientedRange(a)}},this.toSingleRange=function(a){a=a||this.ranges[0];var b=this.rangeList.removeAll();b.length&&this.$onRemoveRange(b),a&&this.fromOrientedRange(a)},this.substractPoint=function(a){var b=this.rangeList.substractPoint(a);if(b)return this.$onRemoveRange(b),b[0]},this.mergeOverlappingRanges=function(){var a=this.rangeList.merge();a.length?this.$onRemoveRange(a):this.ranges[0]&&this.fromOrientedRange(this.ranges[0])},this.$onAddRange=function(a){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(a),this._signal("addRange",{range:a})},this.$onRemoveRange=function(a){if(this.rangeCount=this.rangeList.ranges.length,1==this.rangeCount&&this.inMultiSelectMode){var b=this.rangeList.ranges.pop();a.push(b),this.rangeCount=0}for(var c=a.length;c--;){var d=this.ranges.indexOf(a[c]);this.ranges.splice(d,1)}this._signal("removeRange",{ranges:a}),0===this.rangeCount&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),b=b||this.ranges[0],b&&!b.isEqual(this.getRange())&&this.fromOrientedRange(b)},this.$initRangeList=function(){this.rangeList||(this.rangeList=new h,this.ranges=[],this.rangeCount=0)},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){if(this.rangeCount>1){var a=this.rangeList.ranges,b=a[a.length-1],c=i.fromPoints(a[0].start,b.end);this.toSingleRange(),this.setSelectionRange(c,b.cursor==b.start)}else{var c=this.getRange(),d=this.isBackwards(),e=c.start.row,f=c.end.row;if(e==f){if(d)var g=c.end,h=c.start;else var g=c.start,h=c.end;return this.addRange(i.fromPoints(h,h)),void this.addRange(i.fromPoints(g,g))}var j=[],k=this.getLineRange(e,!0);k.start.column=c.start.column,j.push(k);for(var l=e+1;l1){var a=this.rangeList.ranges,b=a[a.length-1],c=i.fromPoints(a[0].start,b.end);this.toSingleRange(),this.setSelectionRange(c,b.cursor==b.start)}else{var d=this.session.documentToScreenPosition(this.selectionLead),e=this.session.documentToScreenPosition(this.selectionAnchor),f=this.rectangularRangeBlock(d,e);f.forEach(this.addRange,this)}},this.rectangularRangeBlock=function(a,b,c){var d=[],f=a.column0;)p--;if(p>0)for(var q=0;d[q].isEmpty();)q++;for(var r=p;r>=q;r--)d[r].isEmpty()&&d.splice(r,1)}return d}}.call(j.prototype);var r=a("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(a){a.cursor||(a.cursor=a.end);var b=this.getSelectionStyle();return a.marker=this.session.addMarker(a,"ace_selection",b),this.session.$selectionMarkers.push(a),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,a},this.removeSelectionMarker=function(a){if(a.marker){this.session.removeMarker(a.marker);var b=this.session.$selectionMarkers.indexOf(a);b!=-1&&this.session.$selectionMarkers.splice(b,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length}},this.removeSelectionMarkers=function(a){for(var b=this.session.$selectionMarkers,c=a.length;c--;){var d=a[c];if(d.marker){this.session.removeMarker(d.marker);var e=b.indexOf(d);e!=-1&&b.splice(e,1)}}this.session.selectionMarkerCount=b.length},this.$onAddRange=function(a){this.addSelectionMarker(a.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(a){this.removeSelectionMarkers(a.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(a){this.inMultiSelectMode||(this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(n.keyboardHandler),this.commands.setDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers())},this.$onSingleSelect=function(a){this.session.multiSelect.inVirtualMode||(this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(n.keyboardHandler),this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit("changeSelection"))},this.$onMultiSelectExec=function(a){var b=a.command,c=a.editor;if(c.multiSelect){if(b.multiSelectAction)"forEach"==b.multiSelectAction?d=c.forEachSelection(b,a.args):"forEachLine"==b.multiSelectAction?d=c.forEachSelection(b,a.args,!0):"single"==b.multiSelectAction?(c.exitMultiSelectMode(),d=b.exec(c,a.args||{})):d=b.multiSelectAction(c,a.args||{});else{var d=b.exec(c,a.args||{});c.multiSelect.addRange(c.multiSelect.toOrientedRange()),c.multiSelect.mergeOverlappingRanges()}return d}},this.forEachSelection=function(a,b,c){if(!this.inVirtualSelectionMode){var d,e=c&&c.keepOrder,f=1==c||c&&c.$byLines,g=this.session,h=this.selection,i=h.rangeList,k=(e?h:i).ranges;if(!k.length)return a.exec?a.exec(this,b||{}):a(this,b||{});var l=h._eventRegistry;h._eventRegistry={};var m=new j(g);this.inVirtualSelectionMode=!0;for(var n=k.length;n--;){if(f)for(;n>0&&k[n].start.row==k[n-1].end.row;)n--;m.fromOrientedRange(k[n]),m.index=n,this.selection=g.selection=m;var o=a.exec?a.exec(this,b||{}):a(this,b||{});d||void 0===o||(d=o),m.toOrientedRange(k[n])}m.detach(),this.selection=g.selection=h,this.inVirtualSelectionMode=!1,h._eventRegistry=l,h.mergeOverlappingRanges();var p=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),p&&p.from==p.to&&this.renderer.animateScrolling(p.from),d}},this.exitMultiSelectMode=function(){this.inMultiSelectMode&&!this.inVirtualSelectionMode&&this.multiSelect.toSingleRange()},this.getSelectedText=function(){var a="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){for(var b=this.multiSelect.rangeList.ranges,c=[],d=0;df&&(f=c.column),ej?a.insert(d,m.stringRepeat(" ",e-j)):a.remove(new i(d.row,d.column,d.row,d.column-e+j)),b.start.column=b.end.column=f,b.start.row=b.end.row=d.row,b.cursor=b.end}),b.fromOrientedRange(c[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}else{var j=this.selection.getRange(),k=j.start.row,l=j.end.row,n=k==l;if(n){var o,p=this.session.getLength();do o=this.session.getLine(l);while(/[=:]/.test(o)&&++l0);k<0&&(k=0),l>=p&&(l=p-1)}var q=this.session.removeFullLines(k,l);q=this.$reAlignText(q,n),this.session.insert({row:k,column:0},q.join("\n")+"\n"),n||(j.start.column=0,j.end.column=q[q.length-1].length),this.selection.setRange(j)}},this.$reAlignText=function(a,b){function c(a){return m.stringRepeat(" ",a)}function d(a){return a[2]?c(g)+a[2]+c(h-a[2].length+i)+a[4].replace(/^([=:])\s+/,"$1 "):a[0]}function e(a){return a[2]?c(g+h-a[2].length)+a[2]+c(i," ")+a[4].replace(/^([=:])\s+/,"$1 "):a[0]}function f(a){return a[2]?c(g)+a[2]+c(i)+a[4].replace(/^([=:])\s+/,"$1 "):a[0]}var g,h,i,j=!0,k=!0;return a.map(function(a){var b=a.match(/(\s*)(.*?)(\s*)([=:].*)/);return b?null==g?(g=b[1].length,h=b[2].length,i=b[3].length,b):(g+h+i!=b[1].length+b[2].length+b[3].length&&(k=!1),g!=b[1].length&&(j=!1),g>b[1].length&&(g=b[1].length),hb[3].length&&(i=b[3].length),b):[a]}).map(b?d:j?k?e:d:f)}}).call(r.prototype),b.onSessionChange=function(a){var b=a.session;b&&!b.multiSelect&&(b.$selectionMarkers=[],b.selection.$initRangeList(),b.multiSelect=b.selection),this.multiSelect=b&&b.multiSelect;var c=a.oldSession;c&&(c.multiSelect.off("addRange",this.$onAddRange),c.multiSelect.off("removeRange",this.$onRemoveRange),c.multiSelect.off("multiSelect",this.$onMultiSelect),c.multiSelect.off("singleSelect",this.$onSingleSelect),c.multiSelect.lead.off("change",this.$checkMultiselectChange),c.multiSelect.anchor.off("change",this.$checkMultiselectChange)),b&&(b.multiSelect.on("addRange",this.$onAddRange),b.multiSelect.on("removeRange",this.$onRemoveRange),b.multiSelect.on("multiSelect",this.$onMultiSelect),b.multiSelect.on("singleSelect",this.$onSingleSelect),b.multiSelect.lead.on("change",this.$checkMultiselectChange),b.multiSelect.anchor.on("change",this.$checkMultiselectChange)),b&&this.inMultiSelectMode!=b.selection.inMultiSelectMode&&(b.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},b.MultiSelect=f,a("./config").defineOptions(r.prototype,"editor",{enableMultiselect:{set:function(a){f(this),a?(this.on("changeSession",this.$multiselectOnSessionChange),this.on("mousedown",k)):(this.off("changeSession",this.$multiselectOnSessionChange),this.off("mousedown",k))},value:!0},enableBlockSelect:{set:function(a){this.$blockSelectEnabled=a},value:!0}})}),define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(a,b,c){"use strict";var d=a("../../range").Range,e=b.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(a,b,c){var d=a.getLine(c);return this.foldingStartMarker.test(d)?"start":"markbeginend"==b&&this.foldingStopMarker&&this.foldingStopMarker.test(d)?"end":""},this.getFoldWidgetRange=function(a,b,c){return null},this.indentationBlock=function(a,b,c){var e=/\S/,f=a.getLine(b),g=f.search(e);if(g!=-1){for(var h=c||f.length,i=a.getLength(),j=b,k=b;++bj){var m=a.getLine(k).length;return new d(j,h,k,m)}}},this.openingBracketBlock=function(a,b,c,e,f){var g={row:c,column:e+1},h=a.$findClosingBracket(b,g,f);if(h){var i=a.foldWidgets[h.row];return null==i&&(i=a.getFoldWidget(h.row)),"start"==i&&h.row>g.row&&(h.row--,h.column=a.getLine(h.row).length),d.fromPoints(g,h)}},this.closingBracketBlock=function(a,b,c,e,f){var g={row:c,column:e},h=a.$findOpeningBracket(b,g);if(h)return h.column++,g.column--,d.fromPoints(h,g)}}).call(e.prototype)}),define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(a,b,c){"use strict";b.isDark=!1,b.cssClass="ace-tm",b.cssText='.ace-tm .ace_gutter {background: #f0f0f0;color: #333;}.ace-tm .ace_print-margin {width: 1px;background: #e8e8e8;}.ace-tm .ace_fold {background-color: #6B72E6;}.ace-tm {background-color: #FFFFFF;color: black;}.ace-tm .ace_cursor {color: black;}.ace-tm .ace_invisible {color: rgb(191, 191, 191);}.ace-tm .ace_storage,.ace-tm .ace_keyword {color: blue;}.ace-tm .ace_constant {color: rgb(197, 6, 11);}.ace-tm .ace_constant.ace_buildin {color: rgb(88, 72, 246);}.ace-tm .ace_constant.ace_language {color: rgb(88, 92, 246);}.ace-tm .ace_constant.ace_library {color: rgb(6, 150, 14);}.ace-tm .ace_invalid {background-color: rgba(255, 0, 0, 0.1);color: red;}.ace-tm .ace_support.ace_function {color: rgb(60, 76, 114);}.ace-tm .ace_support.ace_constant {color: rgb(6, 150, 14);}.ace-tm .ace_support.ace_type,.ace-tm .ace_support.ace_class {color: rgb(109, 121, 222);}.ace-tm .ace_keyword.ace_operator {color: rgb(104, 118, 135);}.ace-tm .ace_string {color: rgb(3, 106, 7);}.ace-tm .ace_comment {color: rgb(76, 136, 107);}.ace-tm .ace_comment.ace_doc {color: rgb(0, 102, 255);}.ace-tm .ace_comment.ace_doc.ace_tag {color: rgb(128, 159, 191);}.ace-tm .ace_constant.ace_numeric {color: rgb(0, 0, 205);}.ace-tm .ace_variable {color: rgb(49, 132, 149);}.ace-tm .ace_xml-pe {color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function {color: #0000A2;}.ace-tm .ace_heading {color: rgb(12, 7, 255);}.ace-tm .ace_list {color:rgb(185, 6, 144);}.ace-tm .ace_meta.ace_tag {color:rgb(0, 22, 142);}.ace-tm .ace_string.ace_regex {color: rgb(255, 0, 0)}.ace-tm .ace_marker-layer .ace_selection {background: rgb(181, 213, 255);}.ace-tm.ace_multiselect .ace_selection.ace_start {box-shadow: 0 0 3px 0px white;}.ace-tm .ace_marker-layer .ace_step {background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack {background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket {margin: -1px 0 0 -1px;border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active-line {background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_gutter-active-line {background-color : #dcdcdc;}.ace-tm .ace_marker-layer .ace_selected-word {background: rgb(250, 250, 255);border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_indent-guide {background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;}';var d=a("../lib/dom");d.importCssString(b.cssText,b.cssClass)}),define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"],function(a,b,c){"use strict";function d(a){this.session=a,this.session.widgetManager=this,this.session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.$onChangeEditor=this.$onChangeEditor.bind(this),this.session.on("change",this.updateOnChange),this.session.on("changeFold",this.updateOnFold),this.session.on("changeEditor",this.$onChangeEditor)}var e=(a("./lib/oop"),a("./lib/dom"));a("./range").Range;(function(){this.getRowLength=function(a){var b;return b=this.lineWidgets?this.lineWidgets[a]&&this.lineWidgets[a].rowCount||0:0,this.$useWrapMode&&this.$wrapData[a]?this.$wrapData[a].length+1+b:1+b},this.$getWidgetScreenLength=function(){var a=0;return this.lineWidgets.forEach(function(b){b&&b.rowCount&&!b.hidden&&(a+=b.rowCount)}),a},this.$onChangeEditor=function(a){this.attach(a.editor)},this.attach=function(a){a&&a.widgetManager&&a.widgetManager!=this&&a.widgetManager.detach(),this.editor!=a&&(this.detach(),this.editor=a,a&&(a.widgetManager=this,a.renderer.on("beforeRender",this.measureWidgets),a.renderer.on("afterRender",this.renderWidgets)))},this.detach=function(a){var b=this.editor;if(b){this.editor=null,b.widgetManager=null,b.renderer.off("beforeRender",this.measureWidgets),b.renderer.off("afterRender",this.renderWidgets);var c=this.session.lineWidgets;c&&c.forEach(function(a){a&&a.el&&a.el.parentNode&&(a._inDocument=!1,a.el.parentNode.removeChild(a.el))})}},this.updateOnFold=function(a,b){var c=b.lineWidgets;if(c&&a.action){for(var d=a.data,e=d.start.row,f=d.end.row,g="add"==a.action,h=e+1;h0&&!d[e];)e--;this.firstRow=c.firstRow,this.lastRow=c.lastRow,b.$cursorLayer.config=c;for(var g=e;g<=f;g++){var h=d[g];if(h&&h.el)if(h.hidden)h.el.style.top=-100-(h.pixelHeight||0)+"px";else{h._inDocument||(h._inDocument=!0,b.container.appendChild(h.el));var i=b.$cursorLayer.getPixelPosition({row:g,column:0},!0).top;h.coverLine||(i+=c.lineHeight*this.session.getRowLineCount(h.row)),h.el.style.top=i-c.offset+"px";var j=h.coverGutter?0:b.gutterWidth;h.fixedWidth||(j-=b.scrollLeft),h.el.style.left=j+"px",h.fullWidth&&h.screenWidth&&(h.el.style.minWidth=c.width+2*c.padding+"px"),h.fixedWidth?h.el.style.right=b.scrollBar.getWidth()+"px":h.el.style.right=""}}}}}).call(d.prototype),b.LineWidgets=d}),define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"],function(a,b,c){"use strict";function d(a,b,c){for(var d=0,e=a.length-1;d<=e;){var f=d+e>>1,g=c(b,a[f]);if(g>0)d=f+1;else{if(!(g<0))return f;e=f-1}}return-(d+1)}function e(a,b,c){var e=a.getAnnotations().sort(h.comparePoints);if(e.length){var f=d(e,{row:b,column:-1},h.comparePoints);f<0&&(f=-f-1),f>=e.length?f=c>0?0:e.length-1:0===f&&c<0&&(f=e.length-1);var g=e[f];if(g&&c){if(g.row===b){do g=e[f+=c];while(g&&g.row===b);if(!g)return e.slice()}var i=[];b=g.row;do i[c<0?"unshift":"push"](g),g=e[f+=c];while(g&&g.row==b);return i.length&&i}}}var f=a("../line_widgets").LineWidgets,g=a("../lib/dom"),h=a("../range").Range;b.showErrorMarker=function(a,b){var c=a.session;c.widgetManager||(c.widgetManager=new f(c),c.widgetManager.attach(a));var d=a.getCursorPosition(),h=d.row,i=c.widgetManager.getWidgetsAtRow(h).filter(function(a){return"errorMarker"==a.type})[0];i?i.destroy():h-=b;var j,k=e(c,h,b);if(k){var l=k[0];d.column=(l.pos&&"number"!=typeof l.column?l.pos.sc:l.column)||0,d.row=l.row,j=a.renderer.$gutterLayer.$annotations[d.row]}else{if(i)return;j={text:["Looks good!"],className:"ace_ok"}}a.session.unfold(d.row),a.selection.moveToPosition(d);var m={row:d.row,fixedWidth:!0,coverGutter:!0,el:g.createElement("div"),type:"errorMarker"},n=m.el.appendChild(g.createElement("div")),o=m.el.appendChild(g.createElement("div"));o.className="error_widget_arrow "+j.className;var p=a.renderer.$cursorLayer.getPixelPosition(d).left;o.style.left=p+a.renderer.gutterWidth-5+"px",m.el.className="error_widget_wrapper",n.className="error_widget "+j.className,n.innerHTML=j.text.join("
"),n.appendChild(g.createElement("div"));var q=function(a,b,c){if(0===b&&("esc"===c||"return"===c))return m.destroy(),{command:"null"}};m.destroy=function(){a.$mouseHandler.isMousePressed||(a.keyBinding.removeKeyboardHandler(q),c.widgetManager.removeLineWidget(m),a.off("changeSelection",m.destroy),a.off("changeSession",m.destroy),a.off("mouseup",m.destroy),a.off("change",m.destroy))},a.keyBinding.addKeyboardHandler(q),a.on("changeSelection",m.destroy),a.on("changeSession",m.destroy),a.on("mouseup",m.destroy),a.on("change",m.destroy),a.session.widgetManager.addLineWidget(m),m.el.onmousedown=a.focus.bind(a),a.renderer.scrollCursorIntoView(null,.5,{bottom:m.el.offsetHeight})},g.importCssString(" .error_widget_wrapper { background: inherit; color: inherit; border:none } .error_widget { border-top: solid 2px; border-bottom: solid 2px; margin: 5px 0; padding: 10px 40px; white-space: pre-wrap; } .error_widget.ace_error, .error_widget_arrow.ace_error{ border-color: #ff5a5a } .error_widget.ace_warning, .error_widget_arrow.ace_warning{ border-color: #F1D817 } .error_widget.ace_info, .error_widget_arrow.ace_info{ border-color: #5a5a5a } .error_widget.ace_ok, .error_widget_arrow.ace_ok{ border-color: #5aaa5a } .error_widget_arrow { position: absolute; border: solid 5px; border-top-color: transparent!important; border-right-color: transparent!important; border-left-color: transparent!important; top: -5px; }","")}),define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"],function(a,b,c){"use strict";a("./lib/fixoldbrowsers");var d=a("./lib/dom"),e=a("./lib/event"),f=a("./editor").Editor,g=a("./edit_session").EditSession,h=a("./undomanager").UndoManager,i=a("./virtual_renderer").VirtualRenderer;a("./worker/worker_client"),a("./keyboard/hash_handler"),a("./placeholder"),a("./multi_select"),a("./mode/folding/fold_mode"),a("./theme/textmate"),a("./ext/error_marker"),b.config=a("./config"),b.require=a,"function"==typeof define&&(b.define=define),b.edit=function(a){if("string"==typeof a){var c=a;if(a=document.getElementById(c),!a)throw new Error("ace.edit can't find div #"+c)}if(a&&a.env&&a.env.editor instanceof f)return a.env.editor;var g="";if(a&&/input|textarea/i.test(a.tagName)){var h=a;g=h.value,a=d.createElement("pre"),h.parentNode.replaceChild(a,h)}else a&&(g=d.getInnerText(a),a.innerHTML="");var j=b.createEditSession(g),k=new f(new i(a));k.setSession(j);var l={document:j,editor:k,onResize:k.resize.bind(k,null)};return h&&(l.textarea=h),e.addListener(window,"resize",l.onResize),k.on("destroy",function(){e.removeListener(window,"resize",l.onResize),l.editor.container.env=null}),k.container.env=k.env=l,k},b.createEditSession=function(a,b){var c=new g(a,b);return c.setUndoManager(new h),c},b.EditSession=g,b.UndoManager=h,b.version="1.2.6"}),function(){window.require(["ace/ace"],function(a){a&&(a.config.init(!0),a.define=window.define),window.ace||(window.ace=a);for(var b in a)a.hasOwnProperty(b)&&(window.ace[b]=a[b])})}(); \ No newline at end of file diff --git a/js/apps/system/_admin/aardvark/APP/frontend/src/worker-json.js b/js/apps/system/_admin/aardvark/APP/frontend/src/worker-json.js index f3c28bc5df..f25cfd5a4e 100644 --- a/js/apps/system/_admin/aardvark/APP/frontend/src/worker-json.js +++ b/js/apps/system/_admin/aardvark/APP/frontend/src/worker-json.js @@ -1,49 +1,65 @@ "no use strict"; +;(function(window) { +if (typeof window.window != "undefined" && window.document) + return; +if (window.require && window.define) + return; -if (typeof window != "undefined" && window.document) - throw "atempt to load ace worker into main window instead of webWorker"; - -var console = { - log: function() { +if (!window.console) { + window.console = function() { var msgs = Array.prototype.slice.call(arguments, 0); postMessage({type: "log", data: msgs}); - }, - error: function() { - var msgs = Array.prototype.slice.call(arguments, 0); - postMessage({type: "log", data: msgs}); - } -}; -var window = { - console: console + }; + window.console.error = + window.console.warn = + window.console.log = + window.console.trace = window.console; +} +window.window = window; +window.ace = window; + +window.onerror = function(message, file, line, col, err) { + postMessage({type: "error", data: { + message: message, + data: err.data, + file: file, + line: line, + col: col, + stack: err.stack + }}); }; -var normalizeModule = function(parentId, moduleName) { +window.normalizeModule = function(parentId, moduleName) { // normalize plugin requires if (moduleName.indexOf("!") !== -1) { var chunks = moduleName.split("!"); - return normalizeModule(parentId, chunks[0]) + "!" + normalizeModule(parentId, chunks[1]); + return window.normalizeModule(parentId, chunks[0]) + "!" + window.normalizeModule(parentId, chunks[1]); } // normalize relative requires if (moduleName.charAt(0) == ".") { var base = parentId.split("/").slice(0, -1).join("/"); - moduleName = base + "/" + moduleName; + moduleName = (base ? base + "/" : "") + moduleName; - while(moduleName.indexOf(".") !== -1 && previous != moduleName) { + while (moduleName.indexOf(".") !== -1 && previous != moduleName) { var previous = moduleName; - moduleName = moduleName.replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, ""); + moduleName = moduleName.replace(/^\.\//, "").replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, ""); } } return moduleName; }; -var require = function(parentId, id) { +window.require = function require(parentId, id) { + if (!id) { + id = parentId; + parentId = null; + } if (!id.charAt) throw new Error("worker.js require() accepts only (parentId, id) as arguments"); - id = normalizeModule(parentId, id); + id = window.normalizeModule(parentId, id); - var module = require.modules[id]; + var module = window.require.modules[id]; if (module) { if (!module.initialized) { module.initialized = true; @@ -51,59 +67,102 @@ var require = function(parentId, id) { } return module.exports; } + + if (!window.require.tlns) + return console.log("unable to load " + id); - var chunks = id.split("/"); - chunks[0] = require.tlns[chunks[0]] || chunks[0]; - var path = chunks.join("/") + ".js"; + var path = resolveModuleId(id, window.require.tlns); + if (path.slice(-3) != ".js") path += ".js"; - require.id = id; + window.require.id = id; + window.require.modules[id] = {}; // prevent infinite loop on broken modules importScripts(path); - return require(parentId, id); + return window.require(parentId, id); }; +function resolveModuleId(id, paths) { + var testPath = id, tail = ""; + while (testPath) { + var alias = paths[testPath]; + if (typeof alias == "string") { + return alias + tail; + } else if (alias) { + return alias.location.replace(/\/*$/, "/") + (tail || alias.main || alias.name); + } else if (alias === false) { + return ""; + } + var i = testPath.lastIndexOf("/"); + if (i === -1) break; + tail = testPath.substr(i) + tail; + testPath = testPath.slice(0, i); + } + return id; +} +window.require.modules = {}; +window.require.tlns = {}; -require.modules = {}; -require.tlns = {}; - -var define = function(id, deps, factory) { +window.define = function(id, deps, factory) { if (arguments.length == 2) { factory = deps; if (typeof id != "string") { deps = id; - id = require.id; + id = window.require.id; } } else if (arguments.length == 1) { factory = id; - id = require.id; + deps = []; + id = window.require.id; + } + + if (typeof factory != "function") { + window.require.modules[id] = { + exports: factory, + initialized: true + }; + return; } - if (id.indexOf("text!") === 0) - return; - - var req = function(deps, factory) { - return require(id, deps, factory); + if (!deps.length) + // If there is no dependencies, we inject "require", "exports" and + // "module" as dependencies, to provide CommonJS compatibility. + deps = ["require", "exports", "module"]; + + var req = function(childId) { + return window.require(id, childId); }; - require.modules[id] = { + window.require.modules[id] = { + exports: {}, factory: function() { - var module = { - exports: {} - }; - var returnExports = factory(req, module.exports, module); + var module = this; + var returnExports = factory.apply(this, deps.map(function(dep) { + switch (dep) { + // Because "require", "exports" and "module" aren't actual + // dependencies, we must handle them seperately. + case "require": return req; + case "exports": return module.exports; + case "module": return module; + // But for all other dependencies, we can just go ahead and + // require them. + default: return req(dep); + } + })); if (returnExports) module.exports = returnExports; return module; } }; }; +window.define.amd = {}; +require.tlns = {}; +window.initBaseUrls = function initBaseUrls(topLevelNamespaces) { + for (var i in topLevelNamespaces) + require.tlns[i] = topLevelNamespaces[i]; +}; -function initBaseUrls(topLevelNamespaces) { - require.tlns = topLevelNamespaces; -} +window.initSender = function initSender() { -function initSender() { - - var EventEmitter = require(null, "ace/lib/event_emitter").EventEmitter; - var oop = require(null, "ace/lib/oop"); + var EventEmitter = window.require("ace/lib/event_emitter").EventEmitter; + var oop = window.require("ace/lib/oop"); var Sender = function() {}; @@ -130,113 +189,1516 @@ function initSender() { }).call(Sender.prototype); return new Sender(); -} +}; -var main; -var sender; +var main = window.main = null; +var sender = window.sender = null; -onmessage = function(e) { +window.onmessage = function(e) { var msg = e.data; - if (msg.command) { + if (msg.event && sender) { + sender._signal(msg.event, msg.data); + } + else if (msg.command) { if (main[msg.command]) main[msg.command].apply(main, msg.args); + else if (window[msg.command]) + window[msg.command].apply(window, msg.args); else throw new Error("Unknown command:" + msg.command); } - else if (msg.init) { - initBaseUrls(msg.tlns); - require(null, "ace/lib/fixoldbrowsers"); - sender = initSender(); - var clazz = require(null, msg.module)[msg.classname]; - main = new clazz(sender); - } - else if (msg.event && sender) { - sender._emit(msg.event, msg.data); + else if (msg.init) { + window.initBaseUrls(msg.tlns); + require("ace/lib/es5-shim"); + sender = window.sender = window.initSender(); + var clazz = require(msg.module)[msg.classname]; + main = window.main = new clazz(sender); } }; -// vim:set ts=4 sts=4 sw=4 st: +})(this); -define('ace/lib/fixoldbrowsers', ['require', 'exports', 'module' , 'ace/lib/regexp', 'ace/lib/es5-shim'], function(require, exports, module) { +define("ace/lib/oop",["require","exports","module"], function(require, exports, module) { +"use strict"; +exports.inherits = function(ctor, superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); +}; -require("./regexp"); -require("./es5-shim"); +exports.mixin = function(obj, mixin) { + for (var key in mixin) { + obj[key] = mixin[key]; + } + return obj; +}; + +exports.implement = function(proto, mixin) { + exports.mixin(proto, mixin); +}; }); - -define('ace/lib/regexp', ['require', 'exports', 'module' ], function(require, exports, module) { - var real = { - exec: RegExp.prototype.exec, - test: RegExp.prototype.test, - match: String.prototype.match, - replace: String.prototype.replace, - split: String.prototype.split - }, - compliantExecNpcg = real.exec.call(/()??/, "")[1] === undefined, // check `exec` handling of nonparticipating capturing groups - compliantLastIndexIncrement = function () { - var x = /^/g; - real.test.call(x, ""); - return !x.lastIndex; - }(); - - if (compliantLastIndexIncrement && compliantExecNpcg) - return; - RegExp.prototype.exec = function (str) { - var match = real.exec.apply(this, arguments), - name, r2; - if ( typeof(str) == 'string' && match) { - if (!compliantExecNpcg && match.length > 1 && indexOf(match, "") > -1) { - r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), "g", "")); - real.replace.call(str.slice(match.index), r2, function () { - for (var i = 1; i < arguments.length - 2; i++) { - if (arguments[i] === undefined) - match[i] = undefined; - } - }); - } - if (this._xregexp && this._xregexp.captureNames) { - for (var i = 1; i < match.length; i++) { - name = this._xregexp.captureNames[i - 1]; - if (name) - match[name] = match[i]; - } - } - if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index)) - this.lastIndex--; - } - return match; +define("ace/range",["require","exports","module"], function(require, exports, module) { +"use strict"; +var comparePoints = function(p1, p2) { + return p1.row - p2.row || p1.column - p2.column; +}; +var Range = function(startRow, startColumn, endRow, endColumn) { + this.start = { + row: startRow, + column: startColumn }; - if (!compliantLastIndexIncrement) { - RegExp.prototype.test = function (str) { - var match = real.exec.call(this, str); - if (match && this.global && !match[0].length && (this.lastIndex > match.index)) - this.lastIndex--; - return !!match; + + this.end = { + row: endRow, + column: endColumn + }; +}; + +(function() { + this.isEqual = function(range) { + return this.start.row === range.start.row && + this.end.row === range.end.row && + this.start.column === range.start.column && + this.end.column === range.end.column; + }; + this.toString = function() { + return ("Range: [" + this.start.row + "/" + this.start.column + + "] -> [" + this.end.row + "/" + this.end.column + "]"); + }; + + this.contains = function(row, column) { + return this.compare(row, column) == 0; + }; + this.compareRange = function(range) { + var cmp, + end = range.end, + start = range.start; + + cmp = this.compare(end.row, end.column); + if (cmp == 1) { + cmp = this.compare(start.row, start.column); + if (cmp == 1) { + return 2; + } else if (cmp == 0) { + return 1; + } else { + return 0; + } + } else if (cmp == -1) { + return -2; + } else { + cmp = this.compare(start.row, start.column); + if (cmp == -1) { + return -1; + } else if (cmp == 1) { + return 42; + } else { + return 0; + } + } + }; + this.comparePoint = function(p) { + return this.compare(p.row, p.column); + }; + this.containsRange = function(range) { + return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; + }; + this.intersects = function(range) { + var cmp = this.compareRange(range); + return (cmp == -1 || cmp == 0 || cmp == 1); + }; + this.isEnd = function(row, column) { + return this.end.row == row && this.end.column == column; + }; + this.isStart = function(row, column) { + return this.start.row == row && this.start.column == column; + }; + this.setStart = function(row, column) { + if (typeof row == "object") { + this.start.column = row.column; + this.start.row = row.row; + } else { + this.start.row = row; + this.start.column = column; + } + }; + this.setEnd = function(row, column) { + if (typeof row == "object") { + this.end.column = row.column; + this.end.row = row.row; + } else { + this.end.row = row; + this.end.column = column; + } + }; + this.inside = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column) || this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideStart = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isEnd(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.insideEnd = function(row, column) { + if (this.compare(row, column) == 0) { + if (this.isStart(row, column)) { + return false; + } else { + return true; + } + } + return false; + }; + this.compare = function(row, column) { + if (!this.isMultiLine()) { + if (row === this.start.row) { + return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); + } + } + + if (row < this.start.row) + return -1; + + if (row > this.end.row) + return 1; + + if (this.start.row === row) + return column >= this.start.column ? 0 : -1; + + if (this.end.row === row) + return column <= this.end.column ? 0 : 1; + + return 0; + }; + this.compareStart = function(row, column) { + if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.compareEnd = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else { + return this.compare(row, column); + } + }; + this.compareInside = function(row, column) { + if (this.end.row == row && this.end.column == column) { + return 1; + } else if (this.start.row == row && this.start.column == column) { + return -1; + } else { + return this.compare(row, column); + } + }; + this.clipRows = function(firstRow, lastRow) { + if (this.end.row > lastRow) + var end = {row: lastRow + 1, column: 0}; + else if (this.end.row < firstRow) + var end = {row: firstRow, column: 0}; + + if (this.start.row > lastRow) + var start = {row: lastRow + 1, column: 0}; + else if (this.start.row < firstRow) + var start = {row: firstRow, column: 0}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + this.extend = function(row, column) { + var cmp = this.compare(row, column); + + if (cmp == 0) + return this; + else if (cmp == -1) + var start = {row: row, column: column}; + else + var end = {row: row, column: column}; + + return Range.fromPoints(start || this.start, end || this.end); + }; + + this.isEmpty = function() { + return (this.start.row === this.end.row && this.start.column === this.end.column); + }; + this.isMultiLine = function() { + return (this.start.row !== this.end.row); + }; + this.clone = function() { + return Range.fromPoints(this.start, this.end); + }; + this.collapseRows = function() { + if (this.end.column == 0) + return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0) + else + return new Range(this.start.row, 0, this.end.row, 0) + }; + this.toScreenRange = function(session) { + var screenPosStart = session.documentToScreenPosition(this.start); + var screenPosEnd = session.documentToScreenPosition(this.end); + + return new Range( + screenPosStart.row, screenPosStart.column, + screenPosEnd.row, screenPosEnd.column + ); + }; + this.moveBy = function(row, column) { + this.start.row += row; + this.start.column += column; + this.end.row += row; + this.end.column += column; + }; + +}).call(Range.prototype); +Range.fromPoints = function(start, end) { + return new Range(start.row, start.column, end.row, end.column); +}; +Range.comparePoints = comparePoints; + +Range.comparePoints = function(p1, p2) { + return p1.row - p2.row || p1.column - p2.column; +}; + + +exports.Range = Range; +}); + +define("ace/apply_delta",["require","exports","module"], function(require, exports, module) { +"use strict"; + +function throwDeltaError(delta, errorText){ + console.log("Invalid Delta:", delta); + throw "Invalid Delta: " + errorText; +} + +function positionInDocument(docLines, position) { + return position.row >= 0 && position.row < docLines.length && + position.column >= 0 && position.column <= docLines[position.row].length; +} + +function validateDelta(docLines, delta) { + if (delta.action != "insert" && delta.action != "remove") + throwDeltaError(delta, "delta.action must be 'insert' or 'remove'"); + if (!(delta.lines instanceof Array)) + throwDeltaError(delta, "delta.lines must be an Array"); + if (!delta.start || !delta.end) + throwDeltaError(delta, "delta.start/end must be an present"); + var start = delta.start; + if (!positionInDocument(docLines, delta.start)) + throwDeltaError(delta, "delta.start must be contained in document"); + var end = delta.end; + if (delta.action == "remove" && !positionInDocument(docLines, end)) + throwDeltaError(delta, "delta.end must contained in document for 'remove' actions"); + var numRangeRows = end.row - start.row; + var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0)); + if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars) + throwDeltaError(delta, "delta.range must match delta lines"); +} + +exports.applyDelta = function(docLines, delta, doNotValidate) { + + var row = delta.start.row; + var startColumn = delta.start.column; + var line = docLines[row] || ""; + switch (delta.action) { + case "insert": + var lines = delta.lines; + if (lines.length === 1) { + docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn); + } else { + var args = [row, 1].concat(delta.lines); + docLines.splice.apply(docLines, args); + docLines[row] = line.substring(0, startColumn) + docLines[row]; + docLines[row + delta.lines.length - 1] += line.substring(startColumn); + } + break; + case "remove": + var endColumn = delta.end.column; + var endRow = delta.end.row; + if (row === endRow) { + docLines[row] = line.substring(0, startColumn) + line.substring(endColumn); + } else { + docLines.splice( + row, endRow - row + 1, + line.substring(0, startColumn) + docLines[endRow].substring(endColumn) + ); + } + break; + } +} +}); + +define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module) { +"use strict"; + +var EventEmitter = {}; +var stopPropagation = function() { this.propagationStopped = true; }; +var preventDefault = function() { this.defaultPrevented = true; }; + +EventEmitter._emit = +EventEmitter._dispatchEvent = function(eventName, e) { + this._eventRegistry || (this._eventRegistry = {}); + this._defaultHandlers || (this._defaultHandlers = {}); + + var listeners = this._eventRegistry[eventName] || []; + var defaultHandler = this._defaultHandlers[eventName]; + if (!listeners.length && !defaultHandler) + return; + + if (typeof e != "object" || !e) + e = {}; + + if (!e.type) + e.type = eventName; + if (!e.stopPropagation) + e.stopPropagation = stopPropagation; + if (!e.preventDefault) + e.preventDefault = preventDefault; + + listeners = listeners.slice(); + for (var i=0; i this.row) + return; + + var point = $getTransformedPoint(delta, {row: this.row, column: this.column}, this.$insertRight); + this.setPosition(point.row, point.column, true); + }; + + function $pointsInOrder(point1, point2, equalPointsInOrder) { + var bColIsAfter = equalPointsInOrder ? point1.column <= point2.column : point1.column < point2.column; + return (point1.row < point2.row) || (point1.row == point2.row && bColIsAfter); + } + + function $getTransformedPoint(delta, point, moveIfEqual) { + var deltaIsInsert = delta.action == "insert"; + var deltaRowShift = (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row); + var deltaColShift = (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column); + var deltaStart = delta.start; + var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range. + if ($pointsInOrder(point, deltaStart, moveIfEqual)) { + return { + row: point.row, + column: point.column + }; + } + if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) { + return { + row: point.row + deltaRowShift, + column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0) + }; + } + + return { + row: deltaStart.row, + column: deltaStart.column + }; + } + this.setPosition = function(row, column, noClip) { + var pos; + if (noClip) { + pos = { + row: row, + column: column + }; + } else { + pos = this.$clipPositionToDocument(row, column); + } + + if (this.row == pos.row && this.column == pos.column) + return; + + var old = { + row: this.row, + column: this.column + }; + + this.row = pos.row; + this.column = pos.column; + this._signal("change", { + old: old, + value: pos + }); + }; + this.detach = function() { + this.document.removeEventListener("change", this.$onChange); + }; + this.attach = function(doc) { + this.document = doc || this.document; + this.document.on("change", this.$onChange); + }; + this.$clipPositionToDocument = function(row, column) { + var pos = {}; + + if (row >= this.document.getLength()) { + pos.row = Math.max(0, this.document.getLength() - 1); + pos.column = this.document.getLine(pos.row).length; + } + else if (row < 0) { + pos.row = 0; + pos.column = 0; + } + else { + pos.row = row; + pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); + } + + if (column < 0) + pos.column = 0; + + return pos; + }; + +}).call(Anchor.prototype); + +}); + +define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"], function(require, exports, module) { +"use strict"; + +var oop = require("./lib/oop"); +var applyDelta = require("./apply_delta").applyDelta; +var EventEmitter = require("./lib/event_emitter").EventEmitter; +var Range = require("./range").Range; +var Anchor = require("./anchor").Anchor; + +var Document = function(textOrLines) { + this.$lines = [""]; + if (textOrLines.length === 0) { + this.$lines = [""]; + } else if (Array.isArray(textOrLines)) { + this.insertMergedLines({row: 0, column: 0}, textOrLines); + } else { + this.insert({row: 0, column:0}, textOrLines); + } +}; + +(function() { + + oop.implement(this, EventEmitter); + this.setValue = function(text) { + var len = this.getLength() - 1; + this.remove(new Range(0, 0, len, this.getLine(len).length)); + this.insert({row: 0, column: 0}, text); + }; + this.getValue = function() { + return this.getAllLines().join(this.getNewLineCharacter()); + }; + this.createAnchor = function(row, column) { + return new Anchor(this, row, column); + }; + if ("aaa".split(/a/).length === 0) { + this.$split = function(text) { + return text.replace(/\r\n|\r/g, "\n").split("\n"); + }; + } else { + this.$split = function(text) { + return text.split(/\r\n|\r|\n/); }; } - function getNativeFlags (regex) { - return (regex.global ? "g" : "") + - (regex.ignoreCase ? "i" : "") + - (regex.multiline ? "m" : "") + - (regex.extended ? "x" : "") + // Proposed for ES4; included in AS3 - (regex.sticky ? "y" : ""); - } - function indexOf (array, item, from) { - if (Array.prototype.indexOf) // Use the native array method if available - return array.indexOf(item, from); - for (var i = from || 0; i < array.length; i++) { - if (array[i] === item) - return i; + this.$detectNewLine = function(text) { + var match = text.match(/^.*?(\r\n|\r|\n)/m); + this.$autoNewLine = match ? match[1] : "\n"; + this._signal("changeNewLineMode"); + }; + this.getNewLineCharacter = function() { + switch (this.$newLineMode) { + case "windows": + return "\r\n"; + case "unix": + return "\n"; + default: + return this.$autoNewLine || "\n"; } - return -1; + }; + + this.$autoNewLine = ""; + this.$newLineMode = "auto"; + this.setNewLineMode = function(newLineMode) { + if (this.$newLineMode === newLineMode) + return; + + this.$newLineMode = newLineMode; + this._signal("changeNewLineMode"); + }; + this.getNewLineMode = function() { + return this.$newLineMode; + }; + this.isNewLine = function(text) { + return (text == "\r\n" || text == "\r" || text == "\n"); + }; + this.getLine = function(row) { + return this.$lines[row] || ""; + }; + this.getLines = function(firstRow, lastRow) { + return this.$lines.slice(firstRow, lastRow + 1); + }; + this.getAllLines = function() { + return this.getLines(0, this.getLength()); + }; + this.getLength = function() { + return this.$lines.length; + }; + this.getTextRange = function(range) { + return this.getLinesForRange(range).join(this.getNewLineCharacter()); + }; + this.getLinesForRange = function(range) { + var lines; + if (range.start.row === range.end.row) { + lines = [this.getLine(range.start.row).substring(range.start.column, range.end.column)]; + } else { + lines = this.getLines(range.start.row, range.end.row); + lines[0] = (lines[0] || "").substring(range.start.column); + var l = lines.length - 1; + if (range.end.row - range.start.row == l) + lines[l] = lines[l].substring(0, range.end.column); + } + return lines; + }; + this.insertLines = function(row, lines) { + console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."); + return this.insertFullLines(row, lines); + }; + this.removeLines = function(firstRow, lastRow) { + console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."); + return this.removeFullLines(firstRow, lastRow); + }; + this.insertNewLine = function(position) { + console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead."); + return this.insertMergedLines(position, ["", ""]); + }; + this.insert = function(position, text) { + if (this.getLength() <= 1) + this.$detectNewLine(text); + + return this.insertMergedLines(position, this.$split(text)); + }; + this.insertInLine = function(position, text) { + var start = this.clippedPos(position.row, position.column); + var end = this.pos(position.row, position.column + text.length); + + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: [text] + }, true); + + return this.clonePos(end); + }; + + this.clippedPos = function(row, column) { + var length = this.getLength(); + if (row === undefined) { + row = length; + } else if (row < 0) { + row = 0; + } else if (row >= length) { + row = length - 1; + column = undefined; + } + var line = this.getLine(row); + if (column == undefined) + column = line.length; + column = Math.min(Math.max(column, 0), line.length); + return {row: row, column: column}; + }; + + this.clonePos = function(pos) { + return {row: pos.row, column: pos.column}; + }; + + this.pos = function(row, column) { + return {row: row, column: column}; + }; + + this.$clipPosition = function(position) { + var length = this.getLength(); + if (position.row >= length) { + position.row = Math.max(0, length - 1); + position.column = this.getLine(length - 1).length; + } else { + position.row = Math.max(0, position.row); + position.column = Math.min(Math.max(position.column, 0), this.getLine(position.row).length); + } + return position; + }; + this.insertFullLines = function(row, lines) { + row = Math.min(Math.max(row, 0), this.getLength()); + var column = 0; + if (row < this.getLength()) { + lines = lines.concat([""]); + column = 0; + } else { + lines = [""].concat(lines); + row--; + column = this.$lines[row].length; + } + this.insertMergedLines({row: row, column: column}, lines); + }; + this.insertMergedLines = function(position, lines) { + var start = this.clippedPos(position.row, position.column); + var end = { + row: start.row + lines.length - 1, + column: (lines.length == 1 ? start.column : 0) + lines[lines.length - 1].length + }; + + this.applyDelta({ + start: start, + end: end, + action: "insert", + lines: lines + }); + + return this.clonePos(end); + }; + this.remove = function(range) { + var start = this.clippedPos(range.start.row, range.start.column); + var end = this.clippedPos(range.end.row, range.end.column); + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({start: start, end: end}) + }); + return this.clonePos(start); + }; + this.removeInLine = function(row, startColumn, endColumn) { + var start = this.clippedPos(row, startColumn); + var end = this.clippedPos(row, endColumn); + + this.applyDelta({ + start: start, + end: end, + action: "remove", + lines: this.getLinesForRange({start: start, end: end}) + }, true); + + return this.clonePos(start); + }; + this.removeFullLines = function(firstRow, lastRow) { + firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1); + lastRow = Math.min(Math.max(0, lastRow ), this.getLength() - 1); + var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0; + var deleteLastNewLine = lastRow < this.getLength() - 1; + var startRow = ( deleteFirstNewLine ? firstRow - 1 : firstRow ); + var startCol = ( deleteFirstNewLine ? this.getLine(startRow).length : 0 ); + var endRow = ( deleteLastNewLine ? lastRow + 1 : lastRow ); + var endCol = ( deleteLastNewLine ? 0 : this.getLine(endRow).length ); + var range = new Range(startRow, startCol, endRow, endCol); + var deletedLines = this.$lines.slice(firstRow, lastRow + 1); + + this.applyDelta({ + start: range.start, + end: range.end, + action: "remove", + lines: this.getLinesForRange(range) + }); + return deletedLines; + }; + this.removeNewLine = function(row) { + if (row < this.getLength() - 1 && row >= 0) { + this.applyDelta({ + start: this.pos(row, this.getLine(row).length), + end: this.pos(row + 1, 0), + action: "remove", + lines: ["", ""] + }); + } + }; + this.replace = function(range, text) { + if (!(range instanceof Range)) + range = Range.fromPoints(range.start, range.end); + if (text.length === 0 && range.isEmpty()) + return range.start; + if (text == this.getTextRange(range)) + return range.end; + + this.remove(range); + var end; + if (text) { + end = this.insert(range.start, text); + } + else { + end = range.start; + } + + return end; + }; + this.applyDeltas = function(deltas) { + for (var i=0; i=0; i--) { + this.revertDelta(deltas[i]); + } + }; + this.applyDelta = function(delta, doNotValidate) { + var isInsert = delta.action == "insert"; + if (isInsert ? delta.lines.length <= 1 && !delta.lines[0] + : !Range.comparePoints(delta.start, delta.end)) { + return; + } + + if (isInsert && delta.lines.length > 20000) + this.$splitAndapplyLargeDelta(delta, 20000); + applyDelta(this.$lines, delta, doNotValidate); + this._signal("change", delta); + }; + + this.$splitAndapplyLargeDelta = function(delta, MAX) { + var lines = delta.lines; + var l = lines.length; + var row = delta.start.row; + var column = delta.start.column; + var from = 0, to = 0; + do { + from = to; + to += MAX - 1; + var chunk = lines.slice(from, to); + if (to > l) { + delta.lines = chunk; + delta.start.row = row + from; + delta.start.column = column; + break; + } + chunk.push(""); + this.applyDelta({ + start: this.pos(row + from, column), + end: this.pos(row + to, column = 0), + action: delta.action, + lines: chunk + }, true); + } while(true); + }; + this.revertDelta = function(delta) { + this.applyDelta({ + start: this.clonePos(delta.start), + end: this.clonePos(delta.end), + action: (delta.action == "insert" ? "remove" : "insert"), + lines: delta.lines.slice() + }); + }; + this.indexToPosition = function(index, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + for (var i = startRow || 0, l = lines.length; i < l; i++) { + index -= lines[i].length + newlineLength; + if (index < 0) + return {row: i, column: index + lines[i].length + newlineLength}; + } + return {row: l-1, column: lines[l-1].length}; + }; + this.positionToIndex = function(pos, startRow) { + var lines = this.$lines || this.getAllLines(); + var newlineLength = this.getNewLineCharacter().length; + var index = 0; + var row = Math.min(pos.row, lines.length); + for (var i = startRow || 0; i < row; ++i) + index += lines[i].length + newlineLength; + + return index + pos.column; + }; + +}).call(Document.prototype); + +exports.Document = Document; +}); + +define("ace/lib/lang",["require","exports","module"], function(require, exports, module) { +"use strict"; + +exports.last = function(a) { + return a[a.length - 1]; +}; + +exports.stringReverse = function(string) { + return string.split("").reverse().join(""); +}; + +exports.stringRepeat = function (string, count) { + var result = ''; + while (count > 0) { + if (count & 1) + result += string; + + if (count >>= 1) + string += string; } + return result; +}; + +var trimBeginRegexp = /^\s\s*/; +var trimEndRegexp = /\s\s*$/; + +exports.stringTrimLeft = function (string) { + return string.replace(trimBeginRegexp, ''); +}; + +exports.stringTrimRight = function (string) { + return string.replace(trimEndRegexp, ''); +}; + +exports.copyObject = function(obj) { + var copy = {}; + for (var key in obj) { + copy[key] = obj[key]; + } + return copy; +}; + +exports.copyArray = function(array){ + var copy = []; + for (var i=0, l=array.length; i= '0' && ch <= '9') { + string += ch; + next(); + } + if (ch === '.') { + string += '.'; + while (next() && ch >= '0' && ch <= '9') { + string += ch; + } + } + if (ch === 'e' || ch === 'E') { + string += ch; + next(); + if (ch === '-' || ch === '+') { + string += ch; + next(); + } + while (ch >= '0' && ch <= '9') { + string += ch; + next(); + } + } + number = +string; + if (isNaN(number)) { + error("Bad number"); + } else { + return number; + } + }, + + string = function () { + + var hex, + i, + string = '', + uffff; + + if (ch === '"') { + while (next()) { + if (ch === '"') { + next(); + return string; + } else if (ch === '\\') { + next(); + if (ch === 'u') { + uffff = 0; + for (i = 0; i < 4; i += 1) { + hex = parseInt(next(), 16); + if (!isFinite(hex)) { + break; + } + uffff = uffff * 16 + hex; + } + string += String.fromCharCode(uffff); + } else if (typeof escapee[ch] === 'string') { + string += escapee[ch]; + } else { + break; + } + } else { + string += ch; + } + } + } + error("Bad string"); + }, + + white = function () { + + while (ch && ch <= ' ') { + next(); + } + }, + + word = function () { + + switch (ch) { + case 't': + next('t'); + next('r'); + next('u'); + next('e'); + return true; + case 'f': + next('f'); + next('a'); + next('l'); + next('s'); + next('e'); + return false; + case 'n': + next('n'); + next('u'); + next('l'); + next('l'); + return null; + } + error("Unexpected '" + ch + "'"); + }, + + value, // Place holder for the value function. + + array = function () { + + var array = []; + + if (ch === '[') { + next('['); + white(); + if (ch === ']') { + next(']'); + return array; // empty array + } + while (ch) { + array.push(value()); + white(); + if (ch === ']') { + next(']'); + return array; + } + next(','); + white(); + } + } + error("Bad array"); + }, + + object = function () { + + var key, + object = {}; + + if (ch === '{') { + next('{'); + white(); + if (ch === '}') { + next('}'); + return object; // empty object + } + while (ch) { + key = string(); + white(); + next(':'); + if (Object.hasOwnProperty.call(object, key)) { + error('Duplicate key "' + key + '"'); + } + object[key] = value(); + white(); + if (ch === '}') { + next('}'); + return object; + } + next(','); + white(); + } + } + error("Bad object"); + }; + + value = function () { + + white(); + switch (ch) { + case '{': + return object(); + case '[': + return array(); + case '"': + return string(); + case '-': + return number(); + default: + return ch >= '0' && ch <= '9' ? number() : word(); + } + }; + + return function (source, reviver) { + var result; + + text = source; + at = 0; + ch = ' '; + result = value(); + white(); + if (ch) { + error("Syntax error"); + } + + return typeof reviver === 'function' ? function walk(holder, key) { + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + }({'': result}, '') : result; + }; +}); + +define("ace/mode/json_worker",["require","exports","module","ace/lib/oop","ace/worker/mirror","ace/mode/json/json_parse"], function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var Mirror = require("../worker/mirror").Mirror; +var parse = require("./json/json_parse"); + +var JsonWorker = exports.JsonWorker = function(sender) { + Mirror.call(this, sender); + this.setTimeout(200); +}; + +oop.inherits(JsonWorker, Mirror); + +(function() { + + this.onUpdate = function() { + var value = this.doc.getValue(); + var errors = []; + try { + if (value) + parse(value); + } catch (e) { + var pos = this.doc.indexToPosition(e.at-1); + errors.push({ + row: pos.row, + column: pos.column, + text: e.message, + type: "error" + }); + } + this.sender.emit("annotate", errors); + }; + +}).call(JsonWorker.prototype); + +}); + +define("ace/lib/es5-shim",["require","exports","module"], function(require, exports, module) { function Empty() {} @@ -870,23 +2332,6 @@ if (!Date.now) { return new Date().getTime(); }; } -if("0".split(void 0, 0).length) { - var string_split = String.prototype.split; - String.prototype.split = function(separator, limit) { - if(separator === void 0 && limit === 0)return []; - return string_split.apply(this, arguments); - } -} -if("".substr && "0b".substr(-1) !== "b") { - var string_substr = String.prototype.substr; - String.prototype.substr = function(start, length) { - return string_substr.call( - this, - start < 0 ? (start = this.length + start) < 0 ? 0 : start : start, - length - ); - } -} var ws = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003" + "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" + "\u2029\uFEFF"; @@ -895,12 +2340,7 @@ if (!String.prototype.trim || ws.trim()) { var trimBeginRegexp = new RegExp("^" + ws + ws + "*"), trimEndRegexp = new RegExp(ws + ws + "*$"); String.prototype.trim = function trim() { - if (this === undefined || this === null) { - throw new TypeError("can't convert "+this+" to object"); - } - return String(this) - .replace(trimBeginRegexp, "") - .replace(trimEndRegexp, ""); + return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, ""); }; } @@ -954,1375 +2394,3 @@ var toObject = function (o) { }; }); - -define('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) { - - -var EventEmitter = {}; - -EventEmitter._emit = -EventEmitter._dispatchEvent = function(eventName, e) { - this._eventRegistry = this._eventRegistry || {}; - this._defaultHandlers = this._defaultHandlers || {}; - - var listeners = this._eventRegistry[eventName] || []; - var defaultHandler = this._defaultHandlers[eventName]; - if (!listeners.length && !defaultHandler) - return; - - if (typeof e != "object" || !e) - e = {}; - - if (!e.type) - e.type = eventName; - - if (!e.stopPropagation) { - e.stopPropagation = function() { - this.propagationStopped = true; - }; - } - - if (!e.preventDefault) { - e.preventDefault = function() { - this.defaultPrevented = true; - }; - } - - for (var i=0; i= length) { - position.row = Math.max(0, length - 1); - position.column = this.getLine(length-1).length; - } - return position; - }; - this.insert = function(position, text) { - if (!text || text.length === 0) - return position; - - position = this.$clipPosition(position); - if (this.getLength() <= 1) - this.$detectNewLine(text); - - var lines = this.$split(text); - var firstLine = lines.splice(0, 1)[0]; - var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0]; - - position = this.insertInLine(position, firstLine); - if (lastLine !== null) { - position = this.insertNewLine(position); // terminate first line - position = this.insertLines(position.row, lines); - position = this.insertInLine(position, lastLine || ""); - } - return position; - }; - this.insertLines = function(row, lines) { - if (lines.length == 0) - return {row: row, column: 0}; - if (lines.length > 0xFFFF) { - var end = this.insertLines(row, lines.slice(0xFFFF)); - lines = lines.slice(0, 0xFFFF); - } - - var args = [row, 0]; - args.push.apply(args, lines); - this.$lines.splice.apply(this.$lines, args); - - var range = new Range(row, 0, row + lines.length, 0); - var delta = { - action: "insertLines", - range: range, - lines: lines - }; - this._emit("change", { data: delta }); - return end || range.end; - }; - this.insertNewLine = function(position) { - position = this.$clipPosition(position); - var line = this.$lines[position.row] || ""; - - this.$lines[position.row] = line.substring(0, position.column); - this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length)); - - var end = { - row : position.row + 1, - column : 0 - }; - - var delta = { - action: "insertText", - range: Range.fromPoints(position, end), - text: this.getNewLineCharacter() - }; - this._emit("change", { data: delta }); - - return end; - }; - this.insertInLine = function(position, text) { - if (text.length == 0) - return position; - - var line = this.$lines[position.row] || ""; - - this.$lines[position.row] = line.substring(0, position.column) + text - + line.substring(position.column); - - var end = { - row : position.row, - column : position.column + text.length - }; - - var delta = { - action: "insertText", - range: Range.fromPoints(position, end), - text: text - }; - this._emit("change", { data: delta }); - - return end; - }; - this.remove = function(range) { - range.start = this.$clipPosition(range.start); - range.end = this.$clipPosition(range.end); - - if (range.isEmpty()) - return range.start; - - var firstRow = range.start.row; - var lastRow = range.end.row; - - if (range.isMultiLine()) { - var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1; - var lastFullRow = lastRow - 1; - - if (range.end.column > 0) - this.removeInLine(lastRow, 0, range.end.column); - - if (lastFullRow >= firstFullRow) - this.removeLines(firstFullRow, lastFullRow); - - if (firstFullRow != firstRow) { - this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length); - this.removeNewLine(range.start.row); - } - } - else { - this.removeInLine(firstRow, range.start.column, range.end.column); - } - return range.start; - }; - this.removeInLine = function(row, startColumn, endColumn) { - if (startColumn == endColumn) - return; - - var range = new Range(row, startColumn, row, endColumn); - var line = this.getLine(row); - var removed = line.substring(startColumn, endColumn); - var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length); - this.$lines.splice(row, 1, newLine); - - var delta = { - action: "removeText", - range: range, - text: removed - }; - this._emit("change", { data: delta }); - return range.start; - }; - this.removeLines = function(firstRow, lastRow) { - var range = new Range(firstRow, 0, lastRow + 1, 0); - var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1); - - var delta = { - action: "removeLines", - range: range, - nl: this.getNewLineCharacter(), - lines: removed - }; - this._emit("change", { data: delta }); - return removed; - }; - this.removeNewLine = function(row) { - var firstLine = this.getLine(row); - var secondLine = this.getLine(row+1); - - var range = new Range(row, firstLine.length, row+1, 0); - var line = firstLine + secondLine; - - this.$lines.splice(row, 2, line); - - var delta = { - action: "removeText", - range: range, - text: this.getNewLineCharacter() - }; - this._emit("change", { data: delta }); - }; - this.replace = function(range, text) { - if (text.length == 0 && range.isEmpty()) - return range.start; - if (text == this.getTextRange(range)) - return range.end; - - this.remove(range); - if (text) { - var end = this.insert(range.start, text); - } - else { - end = range.start; - } - - return end; - }; - this.applyDeltas = function(deltas) { - for (var i=0; i=0; i--) { - var delta = deltas[i]; - if (!delta.hasOwnProperty("range") || - !delta.range.hasOwnProperty("start") || - !delta.range.hasOwnProperty("end") - ) { - return; - } - var range = Range.fromPoints(delta.range.start, delta.range.end); - - if (delta.action == "insertLines") - this.removeLines(range.start.row, range.end.row - 1); - else if (delta.action == "insertText") - this.remove(range); - else if (delta.action == "removeLines") - this.insertLines(range.start.row, delta.lines); - else if (delta.action == "removeText") - this.insert(range.start, delta.text); - } - }; - this.indexToPosition = function(index, startRow) { - var lines = this.$lines || this.getAllLines(); - var newlineLength = this.getNewLineCharacter().length; - for (var i = startRow || 0, l = lines.length; i < l; i++) { - index -= lines[i].length + newlineLength; - if (index < 0) - return {row: i, column: index + lines[i].length + newlineLength}; - } - return {row: l-1, column: lines[l-1].length}; - }; - this.positionToIndex = function(pos, startRow) { - var lines = this.$lines || this.getAllLines(); - var newlineLength = this.getNewLineCharacter().length; - var index = 0; - var row = Math.min(pos.row, lines.length); - for (var i = startRow || 0; i < row; ++i) - index += lines[i].length; - - return index + newlineLength * i + pos.column; - }; - -}).call(Document.prototype); - -exports.Document = Document; -}); - -define('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) { -var Range = function(startRow, startColumn, endRow, endColumn) { - this.start = { - row: startRow, - column: startColumn - }; - - this.end = { - row: endRow, - column: endColumn - }; -}; - -(function() { - this.isEqual = function(range) { - return this.start.row == range.start.row && - this.end.row == range.end.row && - this.start.column == range.start.column && - this.end.column == range.end.column - }; - this.toString = function() { - return ("Range: [" + this.start.row + "/" + this.start.column + - "] -> [" + this.end.row + "/" + this.end.column + "]"); - }; - - this.contains = function(row, column) { - return this.compare(row, column) == 0; - }; - this.compareRange = function(range) { - var cmp, - end = range.end, - start = range.start; - - cmp = this.compare(end.row, end.column); - if (cmp == 1) { - cmp = this.compare(start.row, start.column); - if (cmp == 1) { - return 2; - } else if (cmp == 0) { - return 1; - } else { - return 0; - } - } else if (cmp == -1) { - return -2; - } else { - cmp = this.compare(start.row, start.column); - if (cmp == -1) { - return -1; - } else if (cmp == 1) { - return 42; - } else { - return 0; - } - } - }; - this.comparePoint = function(p) { - return this.compare(p.row, p.column); - }; - this.containsRange = function(range) { - return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0; - }; - this.intersects = function(range) { - var cmp = this.compareRange(range); - return (cmp == -1 || cmp == 0 || cmp == 1); - }; - this.isEnd = function(row, column) { - return this.end.row == row && this.end.column == column; - }; - this.isStart = function(row, column) { - return this.start.row == row && this.start.column == column; - }; - this.setStart = function(row, column) { - if (typeof row == "object") { - this.start.column = row.column; - this.start.row = row.row; - } else { - this.start.row = row; - this.start.column = column; - } - }; - this.setEnd = function(row, column) { - if (typeof row == "object") { - this.end.column = row.column; - this.end.row = row.row; - } else { - this.end.row = row; - this.end.column = column; - } - }; - this.inside = function(row, column) { - if (this.compare(row, column) == 0) { - if (this.isEnd(row, column) || this.isStart(row, column)) { - return false; - } else { - return true; - } - } - return false; - }; - this.insideStart = function(row, column) { - if (this.compare(row, column) == 0) { - if (this.isEnd(row, column)) { - return false; - } else { - return true; - } - } - return false; - }; - this.insideEnd = function(row, column) { - if (this.compare(row, column) == 0) { - if (this.isStart(row, column)) { - return false; - } else { - return true; - } - } - return false; - }; - this.compare = function(row, column) { - if (!this.isMultiLine()) { - if (row === this.start.row) { - return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0); - }; - } - - if (row < this.start.row) - return -1; - - if (row > this.end.row) - return 1; - - if (this.start.row === row) - return column >= this.start.column ? 0 : -1; - - if (this.end.row === row) - return column <= this.end.column ? 0 : 1; - - return 0; - }; - this.compareStart = function(row, column) { - if (this.start.row == row && this.start.column == column) { - return -1; - } else { - return this.compare(row, column); - } - }; - this.compareEnd = function(row, column) { - if (this.end.row == row && this.end.column == column) { - return 1; - } else { - return this.compare(row, column); - } - }; - this.compareInside = function(row, column) { - if (this.end.row == row && this.end.column == column) { - return 1; - } else if (this.start.row == row && this.start.column == column) { - return -1; - } else { - return this.compare(row, column); - } - }; - this.clipRows = function(firstRow, lastRow) { - if (this.end.row > lastRow) { - var end = { - row: lastRow+1, - column: 0 - }; - } - - if (this.start.row > lastRow) { - var start = { - row: lastRow+1, - column: 0 - }; - } - - if (this.start.row < firstRow) { - var start = { - row: firstRow, - column: 0 - }; - } - - if (this.end.row < firstRow) { - var end = { - row: firstRow, - column: 0 - }; - } - return Range.fromPoints(start || this.start, end || this.end); - }; - this.extend = function(row, column) { - var cmp = this.compare(row, column); - - if (cmp == 0) - return this; - else if (cmp == -1) - var start = {row: row, column: column}; - else - var end = {row: row, column: column}; - - return Range.fromPoints(start || this.start, end || this.end); - }; - - this.isEmpty = function() { - return (this.start.row == this.end.row && this.start.column == this.end.column); - }; - this.isMultiLine = function() { - return (this.start.row !== this.end.row); - }; - this.clone = function() { - return Range.fromPoints(this.start, this.end); - }; - this.collapseRows = function() { - if (this.end.column == 0) - return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0) - else - return new Range(this.start.row, 0, this.end.row, 0) - }; - this.toScreenRange = function(session) { - var screenPosStart = - session.documentToScreenPosition(this.start); - var screenPosEnd = - session.documentToScreenPosition(this.end); - - return new Range( - screenPosStart.row, screenPosStart.column, - screenPosEnd.row, screenPosEnd.column - ); - }; - -}).call(Range.prototype); -Range.fromPoints = function(start, end) { - return new Range(start.row, start.column, end.row, end.column); -}; - -exports.Range = Range; -}); - -define('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) { - - -var oop = require("./lib/oop"); -var EventEmitter = require("./lib/event_emitter").EventEmitter; - -var Anchor = exports.Anchor = function(doc, row, column) { - this.document = doc; - - if (typeof column == "undefined") - this.setPosition(row.row, row.column); - else - this.setPosition(row, column); - - this.$onChange = this.onChange.bind(this); - doc.on("change", this.$onChange); -}; - -(function() { - - oop.implement(this, EventEmitter); - - this.getPosition = function() { - return this.$clipPositionToDocument(this.row, this.column); - }; - - this.getDocument = function() { - return this.document; - }; - - this.onChange = function(e) { - var delta = e.data; - var range = delta.range; - - if (range.start.row == range.end.row && range.start.row != this.row) - return; - - if (range.start.row > this.row) - return; - - if (range.start.row == this.row && range.start.column > this.column) - return; - - var row = this.row; - var column = this.column; - - if (delta.action === "insertText") { - if (range.start.row === row && range.start.column <= column) { - if (range.start.row === range.end.row) { - column += range.end.column - range.start.column; - } - else { - column -= range.start.column; - row += range.end.row - range.start.row; - } - } - else if (range.start.row !== range.end.row && range.start.row < row) { - row += range.end.row - range.start.row; - } - } else if (delta.action === "insertLines") { - if (range.start.row <= row) { - row += range.end.row - range.start.row; - } - } - else if (delta.action == "removeText") { - if (range.start.row == row && range.start.column < column) { - if (range.end.column >= column) - column = range.start.column; - else - column = Math.max(0, column - (range.end.column - range.start.column)); - - } else if (range.start.row !== range.end.row && range.start.row < row) { - if (range.end.row == row) { - column = Math.max(0, column - range.end.column) + range.start.column; - } - row -= (range.end.row - range.start.row); - } - else if (range.end.row == row) { - row -= range.end.row - range.start.row; - column = Math.max(0, column - range.end.column) + range.start.column; - } - } else if (delta.action == "removeLines") { - if (range.start.row <= row) { - if (range.end.row <= row) - row -= range.end.row - range.start.row; - else { - row = range.start.row; - column = 0; - } - } - } - - this.setPosition(row, column, true); - }; - - this.setPosition = function(row, column, noClip) { - var pos; - if (noClip) { - pos = { - row: row, - column: column - }; - } - else { - pos = this.$clipPositionToDocument(row, column); - } - - if (this.row == pos.row && this.column == pos.column) - return; - - var old = { - row: this.row, - column: this.column - }; - - this.row = pos.row; - this.column = pos.column; - this._emit("change", { - old: old, - value: pos - }); - }; - - this.detach = function() { - this.document.removeEventListener("change", this.$onChange); - }; - this.$clipPositionToDocument = function(row, column) { - var pos = {}; - - if (row >= this.document.getLength()) { - pos.row = Math.max(0, this.document.getLength() - 1); - pos.column = this.document.getLine(pos.row).length; - } - else if (row < 0) { - pos.row = 0; - pos.column = 0; - } - else { - pos.row = row; - pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column)); - } - - if (column < 0) - pos.column = 0; - - return pos; - }; - -}).call(Anchor.prototype); - -}); - -define('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) { - - -exports.stringReverse = function(string) { - return string.split("").reverse().join(""); -}; - -exports.stringRepeat = function (string, count) { - var result = ''; - while (count > 0) { - if (count & 1) - result += string; - - if (count >>= 1) - string += string; - } - return result; -}; - -var trimBeginRegexp = /^\s\s*/; -var trimEndRegexp = /\s\s*$/; - -exports.stringTrimLeft = function (string) { - return string.replace(trimBeginRegexp, ''); -}; - -exports.stringTrimRight = function (string) { - return string.replace(trimEndRegexp, ''); -}; - -exports.copyObject = function(obj) { - var copy = {}; - for (var key in obj) { - copy[key] = obj[key]; - } - return copy; -}; - -exports.copyArray = function(array){ - var copy = []; - for (var i=0, l=array.length; i= '0' && ch <= '9') { - string += ch; - next(); - } - if (ch === '.') { - string += '.'; - while (next() && ch >= '0' && ch <= '9') { - string += ch; - } - } - if (ch === 'e' || ch === 'E') { - string += ch; - next(); - if (ch === '-' || ch === '+') { - string += ch; - next(); - } - while (ch >= '0' && ch <= '9') { - string += ch; - next(); - } - } - number = +string; - if (isNaN(number)) { - error("Bad number"); - } else { - return number; - } - }, - - string = function () { - - var hex, - i, - string = '', - uffff; - - if (ch === '"') { - while (next()) { - if (ch === '"') { - next(); - return string; - } else if (ch === '\\') { - next(); - if (ch === 'u') { - uffff = 0; - for (i = 0; i < 4; i += 1) { - hex = parseInt(next(), 16); - if (!isFinite(hex)) { - break; - } - uffff = uffff * 16 + hex; - } - string += String.fromCharCode(uffff); - } else if (typeof escapee[ch] === 'string') { - string += escapee[ch]; - } else { - break; - } - } else { - string += ch; - } - } - } - error("Bad string"); - }, - - white = function () { - - while (ch && ch <= ' ') { - next(); - } - }, - - word = function () { - - switch (ch) { - case 't': - next('t'); - next('r'); - next('u'); - next('e'); - return true; - case 'f': - next('f'); - next('a'); - next('l'); - next('s'); - next('e'); - return false; - case 'n': - next('n'); - next('u'); - next('l'); - next('l'); - return null; - } - error("Unexpected '" + ch + "'"); - }, - - value, // Place holder for the value function. - - array = function () { - - var array = []; - - if (ch === '[') { - next('['); - white(); - if (ch === ']') { - next(']'); - return array; // empty array - } - while (ch) { - array.push(value()); - white(); - if (ch === ']') { - next(']'); - return array; - } - next(','); - white(); - } - } - error("Bad array"); - }, - - object = function () { - - var key, - object = {}; - - if (ch === '{') { - next('{'); - white(); - if (ch === '}') { - next('}'); - return object; // empty object - } - while (ch) { - key = string(); - white(); - next(':'); - if (Object.hasOwnProperty.call(object, key)) { - error('Duplicate key "' + key + '"'); - } - object[key] = value(); - white(); - if (ch === '}') { - next('}'); - return object; - } - next(','); - white(); - } - } - error("Bad object"); - }; - - value = function () { - - white(); - switch (ch) { - case '{': - return object(); - case '[': - return array(); - case '"': - return string(); - case '-': - return number(); - default: - return ch >= '0' && ch <= '9' ? number() : word(); - } - }; - - return function (source, reviver) { - var result; - - text = source; - at = 0; - ch = ' '; - result = value(); - white(); - if (ch) { - error("Syntax error"); - } - - return typeof reviver === 'function' ? function walk(holder, key) { - var k, v, value = holder[key]; - if (value && typeof value === 'object') { - for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { - v = walk(value, k); - if (v !== undefined) { - value[k] = v; - } else { - delete value[k]; - } - } - } - } - return reviver.call(holder, key, value); - }({'': result}, '') : result; - }; -}); diff --git a/js/apps/system/_admin/aardvark/APP/frontend/src/worker-json.js.gz b/js/apps/system/_admin/aardvark/APP/frontend/src/worker-json.js.gz index b3a73fafa1726f0514cafb542b5fda02326b1167..f38543c76cca3830b875e6bcbaf930e1aacec478 100644 GIT binary patch literal 18212 zcmV(;K-<3`iwFP!000046YYIzb6dxi_ILk^D~u`xO%jxp#FNODU9v>aXi7F!k}_|q zC`AR4mm+Ks-~gbOF#7NFJZI@XeHW0F?MyQ7pllK7K7IP^y>}00^XhzASIgC6a=03N z`PrAlc+ila6UV#k0-PGXi)v; zH=chqKRiFJXRFQ6Dts38>U=T#Qt%jpMg3prlSLhi2$r&dl(=C<4(GGwd|HzrA}v#^ zdsQObAqe$$yr@o>ZW$spk>HN)LyE+=L#&-qrM}z;U#Y(D1^2?KB7i^bY1XGfXs)#Z)gb#oq2QkJXn z;ZJu->PWsy#z(3M>T#}T^Tp|SI{9n;{ru>BN^vI3IU6rvw2zLqt5eDQVSJkGZFjdy zC9AXP`J2fMhAmdSlzQkTx!4HaQ@`Io9u95{HsL7us-4>|KgxxMd3bU@`-!F*iY?Ek zla&<8cBua2T2E9c{liSO;ybwYa?U!!H!b`#IqMnXdlehI+b`MX+ zi~FnLt<4Io4o2WP+W>ieJw}+hS2?jG<8ybgsg5|jwM_|)ew)vX{Bs|sQ`I$P9lC-d_qgIlgSvg7JYkP$FfO|Xoh z)bgS}o5ClDyMK8xda=8^O%6sW@x`vEQama7;4d$BUv5ceDwM1HsKze;%0Ff`nS{a% zJOF3wcl8E?njAUbH0~SuCwZG31$|~ZT*JtmolmElp~M-Ik=lxedSY6gEava3S^cis zW4s&=-pv<3)r--O%S6*=H9kD7&sNK7KAV218Z?fVRSMy>9N}N+yVU-{lfg?<;UU4w znUqE<#O1-{=%q50o!uoQBB7KN7XCk3O(f1FArge2HUxyVTAbHeiUF*Ce>Pu$aksM3 z@%V5xUwjyDjw~w|Q#rG6q5Tq2fK)`Jx54UaI$LJd7#eGPM`)RbXz|Cd;Y+J|HJy)- zDux-6BC8d&l;qiXbpnzXHQMaA7HS_I4JU}LT@_}jvY>^8o!`j^)uO>5eVe^O{ZXpZ|U|#A+GA>>WK=Hf?JIzQ_wv?KaH}skmf*M zkXbAY+k;;)&h&F89I)epn_5^2dittTX<4@tXgc2o!nIEfqis(*!0uU() zg_R=M&>@KgDnk(&ANE6wEv&fUM4R3(9!=}n z8#?s8>W%|Ya8?Egi6gTYObh-5!=)l?SpMvAQo|_TA$j&=eYmOyrU&%# z2S(+f8qbbWy+Ack){wqz;6Y=7k=NVFQC&TlpPtTV|M3i6_fy2C$?FMvydOphkL#qX zLey@i8mPGzS&>NIH59HAI?~ z4UoM$nFPo2Y$bRvHT{NkG(J0G&)U*^$z$iwKwRCac4fYS@!a5Ge24 z`f$v-fG)XH(Mj~^Yt^%j6?$Z=^YJw4jcEJ>bf~Pfqto-{syYE8_8m^@(`pHb#duXu zgYq2#{~mJ4kf^!qZ4k7bjlB);wwd5n(q$JY7RyzcY29@nG9`7_Mv0xTs$-1rF@;dg z=|gR%5683WM>76qUX4#`beE#bL^6QSJWQmM{UHJ&evi+mD^RE(vuhL-<+dr+h~?lP zH$&UWL`Jc~)N*9-GNt%numyZsqmiRUa+XDF=>VB$X+ty`pEBB_Blel`J_?PNfwEKf zEllB0i|MioevZJDGlr}A*<_&oH)19Vu#Ps4YBt5*={Kf+GzFlb3YP7FMJe z<0umGjE0VBp5*aDnx+ovkSS8_v8TCrI$5m*z6>+N0m$B+PG0XyhxApga2Nu{Vk%bh z!)|J`smeHz>x1Z2eTz_1XHACyfmjwYvP)0%U87KI{h4eO!_rLv4!GTZhV zb2LF#Lz(@7vrnhYDdRRV6thhU9dr1xX*m`j_=dRC}D2r>l_sSEfD*p9??Yc z@VD?m)kGfHE!A1UC^v#%iF(m@2l+&Mw-V$9eMEe9(g`iaKW^%DrmFng1ca|rUQx8qFO;udBtLE<_^*FOL9d1s zXydb~vc))VN%uj_W=;H<)fxkC!!UP2Hq^?KAmIHUHzm>`=`(G$GB=E|+XtzOvYk4{ z+o_w1ag}!ijY>?VYq!p4nJL#nu?q8@%M+ldx zE}hf~_^JMY*160iBPeo!JU04LP=2WJv{DOesxLX~t z#c7B@S891|4e znwZ4XOpn&Qu>iX{Qs`b)%$M~bOGav5+(vjAQs$d0+)=?Xg`Y5;XB1&I@uDyRf?46) zorQbBO-V$+PaYSyYb_UQ32jyG1cI$tSzm|ruPv~4?U90RuGc9sl>S|ypUIs(1o(cL zc}OI1G&X5WqQMvQQ85C#Go3Mpp}i>$3GNzDtG8b6Oda@zpkeS8S)abe5k!k_1B1UP zkkSxIK}%ULmgqQf&N_zl-Jq5)^}A^0Q*Ca1v9O%;fP9sDn!v5_j6zr4!i0?kS_%LVGy)f9hC zX+$GfFNI+3?6Ay8jgUcAGWV+L4LXq~4fY55CX0eUG2oWNrYkAKvC8>W@VL+q5w$X^Z z|G_Q88sIC6;)dD$_gH1M99gHBefWT?KcT(ej+{A-ijS*7z>NG{3Y z7T9bNCDjQwb`ea{1{Dn+7LB@vbEV zl7@6S^0u2(gTH26$f9Q(xV9tJ!&K#e#M=wl3pO(=D$G(~x=no)!OYrj7D$T)g{Oao zozY578AzJw9je5gC`wdkm8_v#fIgM-T*Err%PKCR-n?B#RHNg?{8T3~hl<2|X!1*@ zJvfeXDRzvb>h~+v%w+?q?txv=&^MY6AIX)<3ehSDrlfBxgNcBoE;pc3O0c7>UNxbH z{j?B73+yhQiu^J{7IY$e^rcVFRv%)ABl?k5Cu=QXE|l}5t~#6U?C2{LP%4QIJx`XY z`*KYxxIH{l(SiJMisKZQplunf;50jR{9U-`)9LtZStIlmfho!_c{JmYwfUg>R%t{g zWiIdPd_<-|Ct|Su@Ox|+#lE8V4OL+ODTf9`56gjd@~}*@7FuumL36!IO%Y+j7KbmG zUd9qtJri1^aF;kuf<2^B0Cdi!KtGwMc?yFY`GKV8h7cgwo{dvZnSYaeay3V_Cqesa zh#(xGNpfh(Amy-@l2{dgBTe<#m;erhH41@LQ+=wa!17oK!c-2u+?;?!aO)lC86K>X{kcI&g3U6 zFD7d?(wdwJLv5f%E41EXS~e?wgWztc)Uy2i#kIWdDOG`O`3n+hdU1(bHVeKws;8^* zud<5xnRA860LysDiu44B)Cu|XILC7|ubUTQki{{AM>8xQW23JWyUU|vEN}LzI~N8e zj2tycIKl8|nF8#y5r=*>duV45hwyohRIyXiGaJU>$zt7b$gdGD*^zIie}&yPhRZiX zmy2hqfZ1^ik)>k{=7p)FYw@nCsg1QfVYIoZkx!@eYpupJWtO*UI&YOG$Y zuN($Z&cV+x1p#ue2tBy+%RHzU~h?qc6izBkOxQQ z^yTJNYt`ajDfUoG@uDInPdh~D-eG$)tcR^rs$)H4QgRpYRj3AML9hV?lf@dqq)D+E z?@*s+3cIewPO}R|uFSbI(Qf2fD$-<)UCJ$*dYmir0_Dk6B42Pm(>@*W)0slDha&{I+*Yzxbr)~?uCMAfQkjjRftzb+3|`7r`C-O!sQut`BO>JCRtPRTnW~IBKvR=D!xtscjh0L5P&@J6wGPxrj&iSQI&;~sn zw(oYJLUJ`>+U-DIZ#2&(;v?pv$J+TQ&Bt8A~NCB%K}a7Au|XYvwT{+}%7XX7_= zND(>S$>m;o9Rgz%;`z@2eum~5(*r!e%iZF{VrNPp>T!)uBUK3S^O;}N?& zWy#zm>$uRy>@04(2Wsg^+ui}Pe51~V*xJ!xgi)!p96VG5)L<%M(S(loW{wz)kG`uMzvw?qEDv(7rHe5?j5I`cy^^+D6 zT%FaXfpTGrEJ z5J^2N=?;}v#l}ZRQo~~l2*ZHVh0F^e9@tqOIW9 zBK;)2?Z*Ha?b=p=O-B#as4VdH*n?LQC8DPsL)a^=FW(n)!y&T?c!~*hg!vn3D2xh* z(u-FJ{@gu(^a}g&KZ16ODLIH^2v+CB5sr2{pR&p708~^C=G6pP(BpLn{JEG!LkG!R z5u;bvjRJLeF?{v5faN@SbauWx8G`hnU^2s#`w7Oc-AQUGNt-aNW9~YiODk&Ntu#1; zKS8J5jYGuhqz9H!sn;RqBbI4L`^;GXN9@NNH1Z`asi_O}Iv3pvxZH}kgzr3mf<@6Z zTu-HCNZ+94a4|@DxzXAD3|mi>R_iJkc*BO_PqmE{FE2HXj>y^Ur!^xV)ZhUx^5JskgH~~plsx&s%u#@=|@4MlHF{?bqcT=IPqLg$g9stmDQz%L$({)(R zsBE!?BPL-d(1RoaOx@tJ85|co##|;JPt{mnc;oyS%~RRLX>0P> znxpRAqOAdE>-6@Iqb&D-5v;fX?=b=SNx*GgWc5qWe*&sC*2Kj0$$W9i!pL?ylPzcc(yyBR zrF263<)@wUqjrE6wE6+Y!AQ=3vo6Fq=0`5tfF&8tgW`hVzOad+E~b=_bb^_MZO#?= zW&&4@sO9E-hN)IP%Owf^d-NJsAgZ%)EV<(q?%+G&YK5hySYQJyojjDC+4<_o90mjl znt~_3KnuD!MI!{-Jg;FcmYloFC4Mv}lxMeuE(rQ62igVsn@kj>nS|%UVq;;UNWgC% zVkePv@qGT!SEVFV7?N))4&w;cOf+7dm$^!H5V&+|6+=XHQzurRPTriz&V3%n4E4A= zV086~SHO1?WcazX=Yp(g+WLLomKQL z{?*D?Q82c zli%N{ZlDsiB(7^-&T)e1lr%ilR4%$|i`vP|He&H3;Was{jGGZMwlS#7gYGu&9eaS* zGD??5ie>8TnABApjQRu^5ck*&t4YKWnjdFF{}$QNPIL=yiC8NW#`;?Lz*+E3yNZp~ zlNE1xG(JijlxEA6EYHzjrEXPwq4}h^bW*1zS2XH%m4a{~NNz(CkV2A*mxheNJZ&N? zC6u*nMbv=sJ6Q&}`BknoXlM(R-zE7afp)h9DowQb!h~r_sz0jP;b6Ko>43#_7+F;<q;y z?7M{w6^T!D5p^SeSS@6>MO>l)9HmSP_~2Mcri=ULN*xmB%U@vn?eVf3>L-kti;ajq zV`v>|OOIlp-)(^YD-N!UZ8TvF9_iiGwS$Ko{rvnPIi2sRjiy6|%J$|+vb2^oOb=it zk?nJ|yX%~m;}YvJfYA|ushy$QK384Y0&ZzLDO|2|HSJu zfPTZZ)r%Lizr9%OzQL`uFJ^qmK;LfQ_pDoE-@N1^#bc4%&1=`Lb?m;-y8rfKw%bt` zRjdHhAOp=@%d_=YfvQLD6)gw zFFAJ)p=6mzp+=|Bihn;p!sg^csR9ivHHc(kk(a12-)^X+&D1W5Hv;*tL%j!XIVd-l znZ5_)I?(Nf&S#VNeI-hGTfFVW-WDCYilv~^Vb!3|Qr5o5vc)W|m74)TJSqGxJ0L2$(DCS^ER_C*tb+QD3`JeL_j0Z;GSarP$?^v^mx!tv)eW7r zZycnll}JAyUSlbP@^=aeF&bJxk98ps_EIiQw{AD2p_pPj5EctA`6#6yORX+a5Go`i z_-*e`s}v?9yzkzq(Hn%wMjsEx@sc}j#V(lOgNwF0Qtnl7YuBb2B{V2~4)u8FD>pst zja^3Xck_i5wCj65q2+VV9aH2;dVi4w={K;WmYsv1C~%Flk(!1HIu6Vu4mJRyQPgyh zWX=9V0}a}(v;jJ1=_mq?Ed?aU{%lb4GE>!R)ncu&(q*&Oh?kUSoCyUUG6L#rd_`nV8zMQpHRJiOPH?%Ks z=liNY8dU_v4dynn`yKX4DcEVfI+^qI2{v+$kML4bW+286#hi-iiD;#+&5^IYH#lmA zoU1byG4?Q~Ac;aeM|LH~8pVcfBHR3_Fgh9%jJ@TI+SM5=QFXAU0C5=Qm26iB8ynlz z#s*#k1Jo7N*Mnui7as;MJNjf=d9=!0d9%?>J&6?4vBwXqP+1C>igZ8}K$y!rZj2LoUp0Yxvr9K3_Auy*Rn;H?RV#oUYH^qF^S}b1IX}p|Gn^u4N*f{lbKgl$JEatV^kAn_Vg%?XMs< zL7;A*5egNxI%5v6j@Isv<&MOqeX__c76X#6AYC0L5n2v}r~=wSl75IQ9>wfFv(TnS zQzZro(vY_NMGGY73_1B5xF=j!EuC6)gv8Q8mCH7J{E)f6tq zQ!>rj3<7shKm(~CTTY~yktccai%9?P+no?PGf}~+QsUM65kkB6-=mUc zNEW?hooXAyKp)VFC0yE_3mw8d4ivA?KUJB5$zMt0Du?b4oK)GIpBP>gokjKyrGxk} zkAi(Mo`%w?62V}+#Sp5*v^(1(8!7Z4KMtT@udFZz)qo;MmU;#kumxc_YKMi8WmV;% zl`QU`Nh{avf3H_kXFJy(1cylJnUHh4p~jSm=c9+149^-q#=4*|zag&=ljmQKiK@qz zB`kz|$IJ8b(A-fVdUg@R9XU>K^|fF0PkYZ8ALBj>M+izCBZdcE7_)7qu=7-UL&Git zzsa>jG_1G$@R@YI46sbsUqO_qGMG4s?5Qjf%vnOQ3()4hB`o6H>Z--k8kNDD$QR#h z^U4ZAeUk)*dF2kY`F_NX%&J`(`C3!iI?5|>R&cJgC%!ko%p+LJQGz%4nx#9`TvR#o z_!)c;D-D9x7Iobln51@_zFx`!G*>HnBKexgfaH3CDYRl`R|1^knM9x8E%VaY|N2db zU|icyL;-k5O?VPfXpQbvWd}Pp1pU2WMiM$NS`@j}DVCx^Nj1Iw8bXLp%`h++&>79b zOn}>MWU~|<%Zq3Q-b!-;Mf&?mcLd{Sy`%{teIh=dqEm4NhS&#g~Gg{v-C1wh`lDfx9O=Yk7Q*Mv*;HnB`@B;DH*yz;aw%jA=oV|2{Tx- zk|Ur+#Jj%{GY#^_>RH@cyMRP@TeSxL~`0<*f z5Sb1j_h}t%#HA0Ddq$f_o*g^Q6jdkRxm*&Ji762oyIk4Ui#ZPX;c8q=qBKwYD})cw znn(S~uSh-P*Uj=v95D}i?=sA{Sc`Zl^+)SmOHn}#Zp5x8U(1~YJ3CD!nDM7Nu1Hm8 zqeWBCZAz2?O=EJMLk2XRRKPZJkBR{rXT}-8>{>I)!x~u9HLJZ_-FPaoySReTE)kOW zWgGA1RF;!BK31US2C7oYacW&WR`l|?Ex3=7$9f?dIn6Ql)ng0>_i10|^dkkZ-`+SfxTiRqU%aJWxI z=)pfZgfc})(kliAaha2OVl}})FOrKem!FRAg3;|0+*j-)tma;T`s^s=y#*Dh{%UtW zL|>SaruqtE+siW_t9N)Xy&i^Do7i&jej*FhpeXesr244n^)ia`NlQP7)SWVti9g^TksPItcr?xzJ^u<+L{ryEAoSFndC7 z*+Hh0#X1o^I4D%EtrRZR_^O(=uJ)m+3uD!e6+k<0HNoBs>T=CeicOxJL~m_bXSVfS zbXphJZ>SsJwaR=Bv$rnO2{C1_E^tnF!ZrKC>H(6Rb}JuMi*CE<^!fae9iUIPk1QMN z{X;00=A@!6S^y?9e1>@#5Uz`2QP&}i_nQbT0R{ndUshXNlk60fxYlj={juZMYY-_C znQE+LSesL$fgaM?1mE3Wo=)(??4AoQ{VNW8gQemkWL_&bMOW#PqYIyS(!goqP#tt6 zGa0+j8@J=mYYc-IIW?tGTUgJL@M64%oKc4I@8BCP}$j{(TZFegb&0N$+`ziIC1z>T`Z z1M|?T!f=Z{21AFH@y1RNg^uM|k$SfYR8gxONitYD{TA2T&2YyZ7zgdUe|fQdvHW~j zk5n*!4--=(w8^(5VCWd%Z) zD_NWkHrh9+q(qO^hBT$Y1*^Y^>ORFj@}oH{>;~bY070$Ldetqq@qGUMnBmBS2@TA}PgR{tZi^VZa1p>s;*F~oQSboSuzZ@a zohT||Bp?vpVg%ANI1Pe$9b=jY$|RZiwFvIYo=#1H$vP%z{&BTrC`|>DF7YhM!PgGg z5XwN9H&G&~r*g|*Lsa7r+n8g)Su2%Us9Wq3J(GLt?p7 z;^ih!4Q;%5ar1VwfzVq1{rUHgqZBTw<2P~$={NuK+dq6ModIo)b_bsPyCQkRlmA#G ze`U#E+(L30$uT0qV&37&{_!!+kQ7sh+5%#_SLEV?P!mE4J!}a5i#s)%ODz*FPYP_R z83_g*m0u)>WESr90ws5O>9tSvOg0 z7^HMuBlm6#S;|*sJ3ByG$Imx#lL64ShVAd>i=XPn?&*Zj2wgIEZ(kqa$6o9< zfiws3iKBe_k1V%9p!rDtXjfL}(CA8@jx&8Gq5+u*+8jBA!gFe(0h_3`U?d0qzZXFO z(z{G4A$c2KufYvsu4kEC)FhPBFS#uOJxCQ8{fgbA!li;o9=1*sQP9znz<}js_ zn^A~Qx|}ngDL}Y2&{?B3Qo3RZhE}Omip!f(6060bJ!uZd@*D~-1IHIdK-7#jOu_P* zE={|1n8^>A4|hCZrWwGY4d~nj+tCNDST6TKIdgHRSrw}zJ@<>zm{2#_y8W^klM&WG z!X89(;j`U7jcxOgxV4EKPGH+IwdcQq6OQFr{BI{mp4qO-CePbd!PYLRs8w|->mjb$ z3d;^oLLM3BZqN!VbH{k~ke}V%>bV@} znGB}$GgfN(rJYGy zr2>8_NDAQ|yrrxe;0k8s+Om|*3K?M!Ie~g8Girw??pVz9k4R-Wzzhf`+wf@3#sJHH zhxmW6fr%hFWlD3?vZX+8b+U5P#aJ&kEiV#?_KwBEF%VDC$`@?uX zFYU6YiI{NR9EL6%I~!dx%4K(K>4XIP zhng6&qy`jE&Mh5Ne68h#yB9ZZZHQV-?yW{q@9%T;c$Hs7f9XtF+OYJ#h}wx3fJihC`26%up14b z`03NB<|Yw#DbGP{fDr3M8{S9SRVt0B&evihHjyJNEbM1<(&Aqkgz@zkzDtFrso(Jr zn~HUmIszyhC8bODXtu(&YY5BegWmq45hoo!{v|gzCd=<8v&pI+0#m1z#}fX%V;h=h z#lP8>V`}{FBGSK~gKjjoprrJPSc2cz<2Boc1fO9c8>4vc8RV9t2k6HRrKUB)2}a{@ zsL6s!eQ9AiXF9CENeumrtsTy~1TGPLw_q;CoGI;UOu8jrR#pBAfl*P% zz!<|CVunn?tchy5$zY#OI}cT-?7JdHrmLuSzToEeHMRQXYwhl%yyLmC+9>Zrql~0} zrj?c@{W7SJMO}!6^;9|ru|vV{;YMBALsWQ+_shU zSug3c{+iZ^Zw=|4S*dCE^)4qbn-WvZ#Qy}*6=R6@U?Ccw%yD3ligE3e=@`$`o#47? zbnw{(aBM62$u38^%Pz~i>rGb1&76<}SbDw4iH{A}LBIEGAg{D1A`mb283f13zY*)p zPOOAd>q34TGqX+L!r_n2N4t{0s~q)a2PZ9u&YN30(^v1V~1zm1vMrX{7luuV;BDXtVOQCw=Ax-Uta$u1u= zBn5Zd zvn5;dWs6g1J@mC@LY7p3z8}flvReziIwqd0>6wr!r(RtXq||pyy9DXx=2v!06;|Pw zHayb?qt_){qU-M0Xv=%iXn6~1MC()VgKlsMA#G^PtQPV#0*kXp5ufT8(~m-}QJFi6%lY}@5XVljQF($r&auT|=<}_-iB--B zqCM7P*}P@R^>&&hGDhw$1EsRMU?HFe| z(s9N&AT_uCXU=_aCF%$7|c(H*66SeG* zvgsQR=q@7!bnKo;i%+j~AH^jLPr8AE`wsF;hm8#w@^V8$8`rcxan*_j-+TbE^#Wqr zT_%9{T@^*5JMU0eFx@6?`Hw4> zvX+U(aou^LTC+9Jw5bkSbkV5 z4j@J180P4hkKE!vB5SC<)0v9v8gp)5!`i63k}v75aWSn5^7bkB1>x}Bs+z2L@)~N}ejPm#iRNMM7OG z@5KFS5-Q2d)FKEt;gjQ`(S>spt2wQ{DJpT$?2PmlkW;U6QbtF#VlX)q@N^Ax^Afa; zI`8@zOF<$Jz(W9zQRH6f2&t`3r8_&%CnF% zozH(dKZ`J$5@D9-XJ_-pYI*UlF$5YuibxM`Z{NWdQ9TKC%MZ|FOp^C; z!a=>^VI#>Pzp8QS_t74fAOFb9G_-j2`uq(p)L7QIQGdC_BT@fy`?r5cZtf^>OzNjv zEPvR#Geg=Ka6)f2kgYo=E;=JW+|mk=F`w9JEtZ;(hK;b?`;lDn`ZnvHacLq`2#}0ln8|%9@nJ2IbAPy&(+&lbs`y`FVlG&DY zO{#;$Innq>?yZoX#M}Ag2saXbga12kwD%G^v=`pWa=Hgq^-NzyJBp5pynpM$XpxX^ zJnrfk;Z7rj)uK#xIcw!z98_-(2$w5LuAI<~*s7+Bq8=KDabjaX^PB>Ty5tC~ad_V) zm9w>Q$%;ei5UvZo@#bjYUaF%mYf&s=B9G`B2s$p3ob1VKD^x~OsSsi|QgNwlViQVYdneQW_ge*7 zSf+Z(Y}g~k@3_S zTQ@oh6H^UlDn)tI&}9Y+NvdUP6iQbOkiz)sFvxXx`6)G>K0j=?Uqc|#j+ zyH&$!EfQg@-rK@ZK(gX3A4F`GrSYle!>|T^sf84KIZ!&%Q2X`#eSP#ycIu%Pn`{}3 z2X?g?yNRom9e_D%;1t?e-YC2=yoELd^8^VQ0&L_i_aC98Jv_Bu^4ZFc99szvnyTH; zao7tn19xN#o|L5~McAoNVpHZ{4ytdG0$C$J z;s}C@2OX<&6_fxw=i|fQ`Oqml%i?^C& zM!vI2SX^t;@Q1G1P8|n5-+#F82TT$@;p~O&uYix`{!arrsgnCWNO`kn3JHYj+^0x} zYar8OIfRHC+*E*##yWeMeiK^`o|KIVw}W_%>Q6;hv@t;bFR`zFODQc%=SLv}4JTTx z;VoUZn&a3nYHxII901~kKAOO4oC03YvUyjxM0vpe?e={_r4=Sqrv34w!hqGOOcrry7uFp0#H=3uWlone3Q-nZDw<`=@+e{A{QBt=96q@|sYOall zN|E{!tp&^Ml+5IZX4j0YDzYlaRX0E_lK)kA(A82Y)QG@@%$8sN%IVkg2;N!v!RcuR zYsrlMAPN7B?(lP5;eV-lb0~A8X{sHa05^_orm5H4v7J4eVg6V zv_|GdW90Auvqj!T>Z&?J=(y-14X&6hkjuLhaxNyBV^~{6sbv}S0Ydq)? zV{|QQ)P}#OPn>7zk|#1rTk}#{Ei$oHw{_7>8X_cUj8!upUxrAPQ6#M=1DHq|tsMgr zDAlI1e`_mL#eDzt9Ky@a<$$b}BU7+uqnnP76oG$9b$I0^Id(lhreVuhjl)n{1~hsE z^~&Rz4t|mpQyA0r6K!jOjb>`HR{I7%p!%zf zrQKA2;RvQzQvb{_=ElmoFbl4@?mWjH(ww4_huVL*7`C(XOT@699nP*5SEak^_;*e8 z`ZQHI@@t2%R_sr4pFkgJQ z#M=*OA~B_k-NnvKGpu>>IAPD1ANG%jIEC`&WF<4$JQDwi$(X|_mYvvKv-yM7|DC3& z*G-n2LOpm_r8}waTiTs=Fx?HTu>00-J@iRG6B{&EL#& zU4Z>#1il&}231;aNFIXKo!?$&zM(*Dl|yo$8AnF{Kd@pqaW~?tw^7~JoOUc=a&Faa z*}*)sg|tjN5h57Jub0D4yGB#V`%c<#-ldQ&VTd-ZVT%jRX5LZNE(f#JpJUVedQ2AE zke}qOyKpvdmyoviI&K`>ExYb^0lx9t~LM!q> zdWl}`Ds(rfp`)a??Fur%S`Wuvx{KT8onfFsY{RK>F1B8badZT)mSLF4=X7SrlQ-uf zt%ALHc~aQgza8aDKoXOT5cMcC+59s)LN{|!AQg5C4xD-g${~Q`uIjeR%eqLJiX;`( z&D56_Tt{SsIEu)KgOzA)O$m{S47V9nM_&YOil8Lk3pvWHOJ0|XLYmPoWKk%?mmoQ? z=WiKy-{^L0Hztej0%)!wmr?Sr@Cz!!;?BN3T-rbuWdCoL`&bAftk+oV)y9Uc9EGh1QWmi+@ zvayKSl4>uSho zDdCbhcwU8tqAZ9=0iv_#_9>%M?GoO!zzbKPGxRFbZt}tc_ch|_5hU2M!8aQssy)|Y zmZcUJ~!hPl%WTx2ddv6)@STEd5Fd9M6yq>vt|dPo(t&+C(HermV)|wcuiFHVt6QT z51TRKE^m2gQ4D;&7PFzKtOA}={IPts#D!@<$yEsm+FdT0%J3Y#bDqCzqo=p%IJ zgGd(z&8p4JcQ^`YFY((D7W)=iO}K2BZ*?9Ao_81_a8jid-iPq=`)N{ zp1*qbrzcPLpFZDvNCLGpwX8T-!tU@A2xqe63j}IaN9#u@R6zO+z#iuos~^X2$2wF( zKN^oW))>18P2G|X9hs89IKiwqkxUL2j34h#Yjf_{o*#6sxS7>*;};rgLejEGK6_g}^HOq{J{ z+|83_7X@)dNSB5y=rM9Qu$p>qfwL05`X&SlB?Ng4>Cpby?#|J|T>~2jY(fBimb4C# zu18Y|-Pz+}-Pf)+n?xs0YW_w`_3gfXSKp0IKu?Tq*l@QsA_&74Te?>N`L}LUiH^d7 z@s%nzjS)Z^wRx+- z{+E4kfYO$dRx(JANF9plA~^R7z0QOJHD(Vg#K+3{xr+3b^*Eg;Hv*UxrNrMR8JF!< zu^%t$`mbqIli}CISc9fqqmJA_6gat;K;{eO1qXJW`=fhN5X9uNMveYaunxXcRlUSh zNVEa#_0F~XfWb-sg)}{KWimgVA%+>I=}59mvk~}GIPmF>O`m1a!jxIjc|GHE;j`7= z`&B(#qMzBEKx*Yj#kMk?sxWJF6)T-ApTP+0blB9C=gF~3PwTI#b30zb_}yau*E)@x z8p&lv3i_!PnM5%W?ADbk%UNZGIlZG&nwnxrne5EX#q7Ka8Vf&N?akV=Kw3}v?doM}cEuxVavrjnDHET8gp zEj`YfHFIrFteIR+>@{^=<0M?@5zz*X`FMRslC$_%nigu(lDZ^H{IdtH%TR`8)ad_ww%-^6$UOzkiT_|0w_7=f8KpnrTalaYkKGi9P(*}Xy3>Mk zlgws%@x4Jf<`BZ0>;-9(m23%qmttSuNRqlOGe}@-rqGo0OeV#d&1)d!&7~Bt2y2(C zSpPDYxW%BTg@?Cyu{SaO+>zgI!W1O&pdy@Arv9*buKHYeU>##}Vlhk`Rc1a>tKQ<4 z&3ZR=Wu^{XXYSv6ca;!9o%(Q!J3g(YLqJprBbU(e@w z_Ip-LPv=~{<+>+x2@THPXbUPG>&)P4zJ@_G`gXJL{xLTSsp({OwxtslVNwWkQAt}@ z0&0>hokiKl8&uRDb#4MpaJ@qnKmd!u>CBs;49x`bMKS^0in&H8vXlnWp`_}+&Um8O z6IvvDhHBJ31CyH<$;_2z2mBR@KEds>5`Lb;#Pm*4(Y;u%-B|#RoJhK&94zSW z7P~Tz)840C)xpZvYup;5>(pah2$~Ex@z~kbz|8vw9`c;eaP)Fj4YuZ61716#Jphkt bg)i>QkO6eTC()1NIQqWlkuwm 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 From e270ddb262f1c0fe9c431842598188161b02a61b Mon Sep 17 00:00:00 2001 From: jsteemann Date: Wed, 22 Mar 2017 14:46:10 +0100 Subject: [PATCH 8/8] fixed failing test --- arangod/MMFiles/MMFilesCollection.cpp | 4 +-- arangod/MMFiles/MMFilesCollectorThread.cpp | 4 +-- arangod/MMFiles/MMFilesCompactorThread.cpp | 4 +-- arangod/MMFiles/MMFilesDatafile.cpp | 12 +++---- arangod/MMFiles/MMFilesDatafile.h | 26 +++++++-------- arangod/MMFiles/MMFilesDatafileHelper.h | 22 ++++++------- arangod/MMFiles/MMFilesEngine.cpp | 4 +-- arangod/MMFiles/MMFilesEngine.h | 2 +- arangod/MMFiles/MMFilesWalMarker.h | 34 ++++++++++---------- arangod/MMFiles/MMFilesWalRecoverState.cpp | 4 +-- arangod/MMFiles/mmfiles-replication-dump.cpp | 12 +++---- tests/Basics/structure-size-test.cpp | 4 +-- 12 files changed, 66 insertions(+), 66 deletions(-) diff --git a/arangod/MMFiles/MMFilesCollection.cpp b/arangod/MMFiles/MMFilesCollection.cpp index 0b01e52146..04e8bc6a71 100644 --- a/arangod/MMFiles/MMFilesCollection.cpp +++ b/arangod/MMFiles/MMFilesCollection.cpp @@ -383,7 +383,7 @@ int MMFilesCollection::OpenIteratorHandleDeletionMarker(MMFilesMarker const* mar bool MMFilesCollection::OpenIterator(MMFilesMarker const* marker, MMFilesCollection::OpenIteratorState* data, MMFilesDatafile* datafile) { TRI_voc_tick_t const tick = marker->getTick(); - MMFilesMarkerype_t const type = marker->getType(); + MMFilesMarkerType const type = marker->getType(); int res; @@ -1304,7 +1304,7 @@ bool MMFilesCollection::applyForTickRange(TRI_voc_tick_t dataMin, TRI_voc_tick_t break; } - MMFilesMarkerype_t type = marker->getType(); + MMFilesMarkerType type = marker->getType(); if (type <= TRI_DF_MARKER_MIN) { break; diff --git a/arangod/MMFiles/MMFilesCollectorThread.cpp b/arangod/MMFiles/MMFilesCollectorThread.cpp index 7cac642fe8..f2f0c8570e 100644 --- a/arangod/MMFiles/MMFilesCollectorThread.cpp +++ b/arangod/MMFiles/MMFilesCollectorThread.cpp @@ -114,7 +114,7 @@ static bool ScanMarker(MMFilesMarker const* marker, void* data, CollectorState* state = static_cast(data); TRI_ASSERT(marker != nullptr); - MMFilesMarkerype_t const type = marker->getType(); + MMFilesMarkerType const type = marker->getType(); switch (type) { case TRI_DF_MARKER_PROLOGUE: { @@ -570,7 +570,7 @@ void MMFilesCollectorThread::processCollectionMarker( TRI_voc_size_t const datafileMarkerSize = operation.datafileMarkerSize; TRI_voc_fid_t const fid = operation.datafileId; - MMFilesMarkerype_t const type = walMarker->getType(); + MMFilesMarkerType const type = walMarker->getType(); if (type == TRI_DF_MARKER_VPACK_DOCUMENT) { auto& dfi = cache->createDfi(fid); diff --git a/arangod/MMFiles/MMFilesCompactorThread.cpp b/arangod/MMFiles/MMFilesCompactorThread.cpp index 8711a14b5c..c178133ea5 100644 --- a/arangod/MMFiles/MMFilesCompactorThread.cpp +++ b/arangod/MMFiles/MMFilesCompactorThread.cpp @@ -276,7 +276,7 @@ MMFilesCompactorThread::CompactionInitialContext MMFilesCompactorThread::getComp TRI_ASSERT(collection != nullptr); auto physical = static_cast(collection->getPhysical()); TRI_ASSERT(physical != nullptr); - MMFilesMarkerype_t const type = marker->getType(); + MMFilesMarkerType const type = marker->getType(); // new or updated document if (type == TRI_DF_MARKER_VPACK_DOCUMENT) { @@ -371,7 +371,7 @@ void MMFilesCompactorThread::compactDatafiles(LogicalCollection* collection, auto compactifier = [&context, &physical, this](MMFilesMarker const* marker, MMFilesDatafile* datafile) -> bool { TRI_voc_fid_t const targetFid = context->_compactor->fid(); - MMFilesMarkerype_t const type = marker->getType(); + MMFilesMarkerType const type = marker->getType(); // new or updated document if (type == TRI_DF_MARKER_VPACK_DOCUMENT) { diff --git a/arangod/MMFiles/MMFilesDatafile.cpp b/arangod/MMFiles/MMFilesDatafile.cpp index c2864b5ea1..f6abcc912d 100644 --- a/arangod/MMFiles/MMFilesDatafile.cpp +++ b/arangod/MMFiles/MMFilesDatafile.cpp @@ -374,7 +374,7 @@ MMFilesDatafile* MMFilesDatafile::create(std::string const& filename, TRI_voc_fi /// @brief returns the name for a marker //////////////////////////////////////////////////////////////////////////////// -char const* TRI_NameMarkerDatafile(MMFilesMarkerype_t type) { +char const* TRI_NameMarkerDatafile(MMFilesMarkerType type) { switch (type) { // general markers case TRI_DF_MARKER_HEADER: @@ -435,7 +435,7 @@ bool TRI_IsValidMarkerDatafile(MMFilesMarker const* marker) { } // check marker type - MMFilesMarkerype_t const type = marker->getType(); + MMFilesMarkerType const type = marker->getType(); if (type <= TRI_DF_MARKER_MIN) { // marker type is less than minimum allowed type value @@ -622,7 +622,7 @@ int MMFilesDatafile::writeElement(void* position, MMFilesMarker const* marker, b void TRI_UpdateTicksDatafile(MMFilesDatafile* datafile, MMFilesMarker const* marker) { - MMFilesMarkerype_t const type = marker->getType(); + MMFilesMarkerType const type = marker->getType(); if (type != TRI_DF_MARKER_HEADER && type != TRI_DF_MARKER_FOOTER && type != TRI_DF_MARKER_COL_HEADER) { @@ -916,7 +916,7 @@ static std::string DiagnoseMarker(MMFilesMarker const* marker, } // check marker type - MMFilesMarkerype_t type = marker->getType(); + MMFilesMarkerType type = marker->getType(); if (type <= TRI_DF_MARKER_MIN) { // marker type is less than minimum allowed type value @@ -1250,7 +1250,7 @@ bool MMFilesDatafile::check(bool ignoreFailures) { MMFilesMarker const* marker = reinterpret_cast(ptr); TRI_voc_size_t const size = marker->getSize(); TRI_voc_tick_t const tick = marker->getTick(); - MMFilesMarkerype_t const type = marker->getType(); + MMFilesMarkerType const type = marker->getType(); #ifdef DEBUG_DATAFILE LOG_TOPIC(TRACE, arangodb::Logger::FIXME) << "MARKER: size " << size << ", tick " << tick << ", crc " << marker->getCrc() << ", type " << type; @@ -1591,7 +1591,7 @@ DatafileScan MMFilesDatafile::scanHelper() { scan.status = 4; } - MMFilesMarkerype_t const type = marker->getType(); + MMFilesMarkerType const type = marker->getType(); if (type == TRI_DF_MARKER_VPACK_DOCUMENT || type == TRI_DF_MARKER_VPACK_REMOVE) { diff --git a/arangod/MMFiles/MMFilesDatafile.h b/arangod/MMFiles/MMFilesDatafile.h index 61072ed509..649da0f7a7 100644 --- a/arangod/MMFiles/MMFilesDatafile.h +++ b/arangod/MMFiles/MMFilesDatafile.h @@ -40,7 +40,7 @@ enum TRI_df_state_e { }; /// @brief type of the marker -enum MMFilesMarkerype_t : uint8_t { +enum MMFilesMarkerType : uint8_t { TRI_DF_MARKER_MIN = 9, // not a real marker type, // but used for bounds checking @@ -93,7 +93,7 @@ struct DatafileScanEntry { TRI_voc_size_t realSize; TRI_voc_tick_t tick; - MMFilesMarkerype_t type; + MMFilesMarkerType type; uint32_t status; char const* typeName; @@ -179,7 +179,7 @@ struct DatafileScan { #define TRI_DF_VERSION (2) /// @brief datafile version -typedef uint32_t TRI_df_version_t; +typedef uint32_t MMFilesDatafileVersionType; /// @brief datafile struct MMFilesDatafile { @@ -351,9 +351,9 @@ struct MMFilesDatafile { /// the field _crc is equal to 0. /// /// -/// MMFilesMarkerype_t +/// MMFilesMarkerType /// _type -/// see @ref MMFilesMarkerype_t +/// see @ref MMFilesMarkerType /// /// /// TRI_voc_tick_t @@ -400,15 +400,15 @@ struct MMFilesMarker { _typeAndTick &= 0xff00000000000000ULL; _typeAndTick |= tick & 0x00ffffffffffffffULL; } - inline MMFilesMarkerype_t getType() const noexcept { - return static_cast((_typeAndTick & 0xff00000000000000ULL) >> 56); + inline MMFilesMarkerType getType() const noexcept { + return static_cast((_typeAndTick & 0xff00000000000000ULL) >> 56); } - inline void setType(MMFilesMarkerype_t type) noexcept { + inline void setType(MMFilesMarkerType type) noexcept { uint64_t t = static_cast(type) << 56; _typeAndTick &= 0x00ffffffffffffffULL; _typeAndTick |= t; } - inline void setTypeAndTick(MMFilesMarkerype_t type, TRI_voc_tick_t tick) noexcept { + inline void setTypeAndTick(MMFilesMarkerType type, TRI_voc_tick_t tick) noexcept { uint64_t t = static_cast(type) << 56; t |= (tick & 0x00ffffffffffffffULL); _typeAndTick = t; @@ -427,9 +427,9 @@ static_assert(sizeof(MMFilesMarker) == 16, "invalid size for MMFilesMarker"); /// /// /// -/// +/// /// -/// +/// /// /// /// @@ -451,7 +451,7 @@ static_assert(sizeof(MMFilesMarker) == 16, "invalid size for MMFilesMarker"); struct MMFilesDatafileHeaderMarker { MMFilesMarker base; // 16 bytes - TRI_df_version_t _version; // 4 bytes + MMFilesDatafileVersionType _version; // 4 bytes TRI_voc_size_t _maximalSize; // 4 bytes TRI_voc_tick_t _fid; // 8 bytes }; @@ -480,7 +480,7 @@ struct MMFilesCollectionHeaderMarker { /// @brief returns the name for a marker //////////////////////////////////////////////////////////////////////////////// -char const* TRI_NameMarkerDatafile(MMFilesMarkerype_t); +char const* TRI_NameMarkerDatafile(MMFilesMarkerType); static inline char const* TRI_NameMarkerDatafile(MMFilesMarker const* marker) { return TRI_NameMarkerDatafile(marker->getType()); diff --git a/arangod/MMFiles/MMFilesDatafileHelper.h b/arangod/MMFiles/MMFilesDatafileHelper.h index d9f07b6547..bb4613a822 100644 --- a/arangod/MMFiles/MMFilesDatafileHelper.h +++ b/arangod/MMFiles/MMFilesDatafileHelper.h @@ -72,7 +72,7 @@ static inline T AlignedMarkerSize(MMFilesMarker const* marker) { /// marker type //////////////////////////////////////////////////////////////////////////////// -static inline size_t VPackOffset(MMFilesMarkerype_t type) noexcept { +static inline size_t VPackOffset(MMFilesMarkerType type) noexcept { if (type == TRI_DF_MARKER_VPACK_DOCUMENT || type == TRI_DF_MARKER_VPACK_REMOVE) { // VPack is located after transaction id @@ -112,7 +112,7 @@ static inline size_t VPackOffset(MMFilesMarkerype_t type) noexcept { /// @brief returns the marker-specific database id offset //////////////////////////////////////////////////////////////////////////////// -static inline size_t DatabaseIdOffset(MMFilesMarkerype_t type) noexcept { +static inline size_t DatabaseIdOffset(MMFilesMarkerType type) noexcept { if (type == TRI_DF_MARKER_PROLOGUE || type == TRI_DF_MARKER_VPACK_CREATE_COLLECTION || type == TRI_DF_MARKER_VPACK_DROP_COLLECTION || @@ -138,7 +138,7 @@ static inline size_t DatabaseIdOffset(MMFilesMarkerype_t type) noexcept { //////////////////////////////////////////////////////////////////////////////// static inline TRI_voc_tick_t DatabaseId(MMFilesMarker const* marker) noexcept { - MMFilesMarkerype_t type = marker->getType(); + MMFilesMarkerType type = marker->getType(); if (type == TRI_DF_MARKER_PROLOGUE || type == TRI_DF_MARKER_VPACK_CREATE_COLLECTION || type == TRI_DF_MARKER_VPACK_DROP_COLLECTION || @@ -163,7 +163,7 @@ static inline TRI_voc_tick_t DatabaseId(MMFilesMarker const* marker) noexcept { /// @brief returns the marker-specific collection id offset //////////////////////////////////////////////////////////////////////////////// -static inline size_t CollectionIdOffset(MMFilesMarkerype_t type) noexcept { +static inline size_t CollectionIdOffset(MMFilesMarkerType type) noexcept { if (type == TRI_DF_MARKER_PROLOGUE || type == TRI_DF_MARKER_VPACK_CREATE_COLLECTION || type == TRI_DF_MARKER_VPACK_DROP_COLLECTION || @@ -181,7 +181,7 @@ static inline size_t CollectionIdOffset(MMFilesMarkerype_t type) noexcept { //////////////////////////////////////////////////////////////////////////////// static inline TRI_voc_tick_t CollectionId(MMFilesMarker const* marker) noexcept { - MMFilesMarkerype_t type = marker->getType(); + MMFilesMarkerType type = marker->getType(); if (type == TRI_DF_MARKER_PROLOGUE || type == TRI_DF_MARKER_VPACK_CREATE_COLLECTION || type == TRI_DF_MARKER_VPACK_DROP_COLLECTION || @@ -198,7 +198,7 @@ static inline TRI_voc_tick_t CollectionId(MMFilesMarker const* marker) noexcept /// @brief returns the marker-specific view id offset //////////////////////////////////////////////////////////////////////////////// -static inline size_t ViewIdOffset(MMFilesMarkerype_t type) noexcept { +static inline size_t ViewIdOffset(MMFilesMarkerType type) noexcept { if (type == TRI_DF_MARKER_VPACK_CREATE_VIEW || type == TRI_DF_MARKER_VPACK_DROP_VIEW || type == TRI_DF_MARKER_VPACK_CHANGE_VIEW) { @@ -212,7 +212,7 @@ static inline size_t ViewIdOffset(MMFilesMarkerype_t type) noexcept { //////////////////////////////////////////////////////////////////////////////// static inline TRI_voc_tick_t ViewId(MMFilesMarker const* marker) noexcept { - MMFilesMarkerype_t type = marker->getType(); + MMFilesMarkerType type = marker->getType(); if (type == TRI_DF_MARKER_VPACK_CREATE_VIEW || type == TRI_DF_MARKER_VPACK_DROP_VIEW || type == TRI_DF_MARKER_VPACK_CHANGE_VIEW) { @@ -225,7 +225,7 @@ static inline TRI_voc_tick_t ViewId(MMFilesMarker const* marker) noexcept { /// @brief returns the marker-specific transaction id offset //////////////////////////////////////////////////////////////////////////////// -static inline TRI_voc_tick_t TransactionIdOffset(MMFilesMarkerype_t type) noexcept { +static inline TRI_voc_tick_t TransactionIdOffset(MMFilesMarkerType type) noexcept { if (type == TRI_DF_MARKER_VPACK_DOCUMENT || type == TRI_DF_MARKER_VPACK_REMOVE) { return sizeof(MMFilesMarker); @@ -243,7 +243,7 @@ static inline TRI_voc_tick_t TransactionIdOffset(MMFilesMarkerype_t type) noexce //////////////////////////////////////////////////////////////////////////////// static inline TRI_voc_tick_t TransactionId(MMFilesMarker const* marker) noexcept { - MMFilesMarkerype_t type = marker->getType(); + MMFilesMarkerType type = marker->getType(); if (type == TRI_DF_MARKER_VPACK_DOCUMENT || type == TRI_DF_MARKER_VPACK_REMOVE || type == TRI_DF_MARKER_VPACK_BEGIN_TRANSACTION || @@ -259,7 +259,7 @@ static inline TRI_voc_tick_t TransactionId(MMFilesMarker const* marker) noexcept //////////////////////////////////////////////////////////////////////////////// static inline void InitMarker(MMFilesMarker* marker, - MMFilesMarkerype_t type, uint32_t size, TRI_voc_tick_t tick) { + MMFilesMarkerType type, uint32_t size, TRI_voc_tick_t tick) { TRI_ASSERT(marker != nullptr); TRI_ASSERT(type > TRI_DF_MARKER_MIN && type < TRI_DF_MARKER_MAX); TRI_ASSERT(size > 0); @@ -274,7 +274,7 @@ static inline void InitMarker(MMFilesMarker* marker, //////////////////////////////////////////////////////////////////////////////// static inline void InitMarker(MMFilesMarker* marker, - MMFilesMarkerype_t type, uint32_t size) { + MMFilesMarkerType type, uint32_t size) { InitMarker(marker, type, size, 0); // always use tick 0 } diff --git a/arangod/MMFiles/MMFilesEngine.cpp b/arangod/MMFiles/MMFilesEngine.cpp index 1692f4dbe6..516bb0a452 100644 --- a/arangod/MMFiles/MMFilesEngine.cpp +++ b/arangod/MMFiles/MMFilesEngine.cpp @@ -3049,7 +3049,7 @@ int MMFilesEngine::transferMarkersWorker( } } - MMFilesMarkerype_t const type = source->getType(); + MMFilesMarkerType const type = source->getType(); if (type == TRI_DF_MARKER_VPACK_DOCUMENT || type == TRI_DF_MARKER_VPACK_REMOVE) { @@ -3082,7 +3082,7 @@ int MMFilesEngine::transferMarkersWorker( /// @brief get the next position for a marker of the specified size char* MMFilesEngine::nextFreeMarkerPosition(LogicalCollection* collection, TRI_voc_tick_t tick, - MMFilesMarkerype_t type, + MMFilesMarkerType type, TRI_voc_size_t size, MMFilesCollectorCache* cache) { // align the specified size diff --git a/arangod/MMFiles/MMFilesEngine.h b/arangod/MMFiles/MMFilesEngine.h index 63d270b491..94ae3322f6 100644 --- a/arangod/MMFiles/MMFilesEngine.h +++ b/arangod/MMFiles/MMFilesEngine.h @@ -331,7 +331,7 @@ public: /// @brief get the next free position for a new marker of the specified size char* nextFreeMarkerPosition(LogicalCollection* collection, - TRI_voc_tick_t, MMFilesMarkerype_t, + TRI_voc_tick_t, MMFilesMarkerType, TRI_voc_size_t, MMFilesCollectorCache*); /// @brief set the tick of a marker and calculate its CRC value diff --git a/arangod/MMFiles/MMFilesWalMarker.h b/arangod/MMFiles/MMFilesWalMarker.h index edb008896e..e9e107086f 100644 --- a/arangod/MMFiles/MMFilesWalMarker.h +++ b/arangod/MMFiles/MMFilesWalMarker.h @@ -47,7 +47,7 @@ class MMFilesWalMarker { virtual ~MMFilesWalMarker() {} /// @brief returns the marker type - virtual MMFilesMarkerype_t type() const = 0; + virtual MMFilesMarkerType type() const = 0; /// @brief returns the datafile id the marker comes from /// this should be 0 for new markers, but contain the actual @@ -85,7 +85,7 @@ class MMFilesMarkerEnvelope : public MMFilesWalMarker { ~MMFilesMarkerEnvelope() = default; /// @brief returns the marker type - MMFilesMarkerype_t type() const override final { + MMFilesMarkerType type() const override final { // simply return the wrapped marker's type return _other->getType(); } @@ -124,7 +124,7 @@ class MMFilesMarkerEnvelope : public MMFilesWalMarker { /// updating/replacing or removing documents class MMFilesCrudMarker : public MMFilesWalMarker { public: - MMFilesCrudMarker(MMFilesMarkerype_t type, + MMFilesCrudMarker(MMFilesMarkerType type, TRI_voc_tid_t transactionId, arangodb::velocypack::Slice const& data) : _transactionId(transactionId), @@ -134,7 +134,7 @@ class MMFilesCrudMarker : public MMFilesWalMarker { ~MMFilesCrudMarker() = default; /// @brief returns the marker type - MMFilesMarkerype_t type() const override final { return _type; } + MMFilesMarkerType type() const override final { return _type; } /// @brief returns the datafile id /// this is always 0 for this type of marker, as the marker is not @@ -160,13 +160,13 @@ class MMFilesCrudMarker : public MMFilesWalMarker { private: TRI_voc_tid_t _transactionId; arangodb::velocypack::Slice _data; - MMFilesMarkerype_t _type; + MMFilesMarkerType _type; }; /// @brief a marker used for database-related operations class MMFilesDatabaseMarker : public MMFilesWalMarker { public: - MMFilesDatabaseMarker(MMFilesMarkerype_t type, + MMFilesDatabaseMarker(MMFilesMarkerType type, TRI_voc_tick_t databaseId, arangodb::velocypack::Slice const& data) : _databaseId(databaseId), @@ -178,7 +178,7 @@ class MMFilesDatabaseMarker : public MMFilesWalMarker { ~MMFilesDatabaseMarker() = default; /// @brief returns the marker type - MMFilesMarkerype_t type() const override final { return _type; } + MMFilesMarkerType type() const override final { return _type; } /// @brief returns the datafile id /// this is always 0 for this type of marker, as the marker is not @@ -201,13 +201,13 @@ class MMFilesDatabaseMarker : public MMFilesWalMarker { private: TRI_voc_tick_t _databaseId; arangodb::velocypack::Slice _data; - MMFilesMarkerype_t _type; + MMFilesMarkerType _type; }; /// @brief a marker used for collection-related operations class MMFilesCollectionMarker : public MMFilesWalMarker { public: - MMFilesCollectionMarker(MMFilesMarkerype_t type, + MMFilesCollectionMarker(MMFilesMarkerType type, TRI_voc_tick_t databaseId, TRI_voc_cid_t collectionId, arangodb::velocypack::Slice const& data) @@ -223,7 +223,7 @@ class MMFilesCollectionMarker : public MMFilesWalMarker { ~MMFilesCollectionMarker() = default; /// @brief returns the marker type - MMFilesMarkerype_t type() const override final { return _type; } + MMFilesMarkerType type() const override final { return _type; } /// @brief returns the datafile id /// this is always 0 for this type of marker, as the marker is not @@ -249,13 +249,13 @@ class MMFilesCollectionMarker : public MMFilesWalMarker { TRI_voc_tick_t _databaseId; TRI_voc_cid_t _collectionId; arangodb::velocypack::Slice _data; - MMFilesMarkerype_t _type; + MMFilesMarkerType _type; }; /// @brief a marker used for view-related operations class MMFilesViewMarker : public MMFilesWalMarker { public: - MMFilesViewMarker(MMFilesMarkerype_t type, + MMFilesViewMarker(MMFilesMarkerType type, TRI_voc_tick_t databaseId, TRI_voc_cid_t viewId, arangodb::velocypack::Slice const& data) @@ -271,7 +271,7 @@ class MMFilesViewMarker : public MMFilesWalMarker { ~MMFilesViewMarker() = default; /// @brief returns the marker type - MMFilesMarkerype_t type() const override final { return _type; } + MMFilesMarkerType type() const override final { return _type; } /// @brief returns the datafile id /// this is always 0 for this type of marker, as the marker is not @@ -297,13 +297,13 @@ class MMFilesViewMarker : public MMFilesWalMarker { TRI_voc_tick_t _databaseId; TRI_voc_cid_t _viewId; arangodb::velocypack::Slice _data; - MMFilesMarkerype_t _type; + MMFilesMarkerType _type; }; /// @brief a marker used for transaction-related operations class MMFilesTransactionMarker : public MMFilesWalMarker { public: - MMFilesTransactionMarker(MMFilesMarkerype_t type, + MMFilesTransactionMarker(MMFilesMarkerType type, TRI_voc_tick_t databaseId, TRI_voc_tid_t transactionId) : _databaseId(databaseId), @@ -316,7 +316,7 @@ class MMFilesTransactionMarker : public MMFilesWalMarker { ~MMFilesTransactionMarker() = default; /// @brief returns the marker type - MMFilesMarkerype_t type() const override final { return _type; } + MMFilesMarkerType type() const override final { return _type; } /// @brief returns the datafile id /// this is always 0 for this type of marker, as the marker is not @@ -340,7 +340,7 @@ class MMFilesTransactionMarker : public MMFilesWalMarker { private: TRI_voc_tick_t _databaseId; TRI_voc_tid_t _transactionId; - MMFilesMarkerype_t _type; + MMFilesMarkerType _type; }; } diff --git a/arangod/MMFiles/MMFilesWalRecoverState.cpp b/arangod/MMFiles/MMFilesWalRecoverState.cpp index 701f0f63f9..3895ce9015 100644 --- a/arangod/MMFiles/MMFilesWalRecoverState.cpp +++ b/arangod/MMFiles/MMFilesWalRecoverState.cpp @@ -354,7 +354,7 @@ bool MMFilesWalRecoverState::InitialScanMarker(MMFilesMarker const* marker, state->lastTick = tick; } - MMFilesMarkerype_t const type = marker->getType(); + MMFilesMarkerType const type = marker->getType(); switch (type) { case TRI_DF_MARKER_VPACK_DOCUMENT: { @@ -443,7 +443,7 @@ bool MMFilesWalRecoverState::ReplayMarker(MMFilesMarker const* marker, LOG_TOPIC(TRACE, arangodb::Logger::FIXME) << "replaying marker of type " << TRI_NameMarkerDatafile(marker); #endif - MMFilesMarkerype_t const type = marker->getType(); + MMFilesMarkerType const type = marker->getType(); try { switch (type) { diff --git a/arangod/MMFiles/mmfiles-replication-dump.cpp b/arangod/MMFiles/mmfiles-replication-dump.cpp index 2e2cf7e4a0..315e89bf6f 100644 --- a/arangod/MMFiles/mmfiles-replication-dump.cpp +++ b/arangod/MMFiles/mmfiles-replication-dump.cpp @@ -87,7 +87,7 @@ static char const* NameFromCid(MMFilesReplicationDumpContext* dump, /// @brief whether or not a marker should be replicated static inline bool MustReplicateWalMarkerType(MMFilesMarker const* marker) { - MMFilesMarkerype_t type = marker->getType(); + MMFilesMarkerType type = marker->getType(); return (type == TRI_DF_MARKER_VPACK_DOCUMENT || type == TRI_DF_MARKER_VPACK_REMOVE || type == TRI_DF_MARKER_VPACK_BEGIN_TRANSACTION || @@ -103,7 +103,7 @@ static inline bool MustReplicateWalMarkerType(MMFilesMarker const* marker) { /// @brief whether or not a marker belongs to a transaction static inline bool IsTransactionWalMarkerType(MMFilesMarker const* marker) { - MMFilesMarkerype_t type = marker->getType(); + MMFilesMarkerType type = marker->getType(); return (type == TRI_DF_MARKER_VPACK_BEGIN_TRANSACTION || type == TRI_DF_MARKER_VPACK_COMMIT_TRANSACTION || type == TRI_DF_MARKER_VPACK_ABORT_TRANSACTION); @@ -149,7 +149,7 @@ static int StringifyMarker(MMFilesReplicationDumpContext* dump, MMFilesMarker const* marker, bool isDump, bool withTicks, bool isEdgeCollection) { TRI_ASSERT(MustReplicateWalMarkerType(marker)); - MMFilesMarkerype_t const type = marker->getType(); + MMFilesMarkerType const type = marker->getType(); if (!isDump) { // logger-follow command @@ -305,7 +305,7 @@ static int SliceifyMarker(MMFilesReplicationDumpContext* dump, MMFilesMarker const* marker, bool isDump, bool withTicks, bool isEdgeCollection) { TRI_ASSERT(MustReplicateWalMarkerType(marker)); - MMFilesMarkerype_t const type = marker->getType(); + MMFilesMarkerType const type = marker->getType(); VPackBuffer buffer; std::shared_ptr> bufferPtr; @@ -655,7 +655,7 @@ int MMFilesDumpLogReplication( break; } - MMFilesMarkerype_t type = marker->getType(); + MMFilesMarkerType type = marker->getType(); if (type <= TRI_DF_MARKER_MIN || type >= TRI_DF_MARKER_MAX) { break; @@ -840,7 +840,7 @@ int MMFilesDetermineOpenTransactionsReplication(MMFilesReplicationDumpContext* d break; } - MMFilesMarkerype_t const type = marker->getType(); + MMFilesMarkerType const type = marker->getType(); if (type <= TRI_DF_MARKER_MIN || type >= TRI_DF_MARKER_MAX) { // somehow invalid diff --git a/tests/Basics/structure-size-test.cpp b/tests/Basics/structure-size-test.cpp index 2c9c6fcb7b..c94e8d7ab1 100644 --- a/tests/Basics/structure-size-test.cpp +++ b/tests/Basics/structure-size-test.cpp @@ -52,8 +52,8 @@ TEST_CASE("CStructureSizeTest", "[structure-size]") { SECTION("tst_basic_elements") { CHECK(4 == (int) sizeof(TRI_col_type_e)); - CHECK(1 == (int) sizeof(MMFilesMarker)); - CHECK(4 == (int) sizeof(TRI_df_version_t)); + CHECK(1 == (int) sizeof(MMFilesMarkerType)); + CHECK(4 == (int) sizeof(MMFilesDatafileVersionType)); CHECK(8 == (int) sizeof(TRI_voc_cid_t)); CHECK(4 == (int) sizeof(TRI_voc_crc_t)); CHECK(8 == (int) sizeof(TRI_voc_tid_t));
TRI_df_version_tMMFilesDatafileVersionType_versionThe version of a datafile, see @ref TRI_df_version_t.The version of a datafile, see @ref MMFilesDatafileVersionType.
TRI_voc_size_t