diff --git a/.gitattributes b/.gitattributes index 320a36841a69367b64f7290405ccd3306880e0e3..0dd7521feb99b9069ee8b1e47ca3cf09251b362f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4745,9 +4745,6 @@ SAS/OTB/OTB/conf/ParmDBConfiguration.xml -text SAS/OTB/OTB/conf/Plotter-config-plottertest.jar -text SAS/OTB/OTB/dist-src/OTB -text svneol=unset#text/x-shellscript SAS/OTB/OTB/dist-src/OTB.log_prop -text -SAS/OTB/OTB/dist-src/showOTB -text svneol=unset#application/x-shellscript -SAS/OTB/OTB/dist-src/startOTB -text -SAS/OTB/OTB/dist-src/stopOTB -text svneol=unset#application/x-shellscript SAS/OTB/OTB/doc/OTB.EAP -text SAS/OTB/OTB/pom.xml -text SAS/OTB/OTB/src/nl/astron/lofar/sas/otb/exceptions/ConnectionFailedException.java -text @@ -4847,9 +4844,6 @@ SAS/OTB/jOTDB3/CMakeLists.txt -text SAS/OTB/jOTDB3/assembly.xml -text SAS/OTB/jOTDB3/build.xml -text SAS/OTB/jOTDB3/dist-src/jOTDB3.log_prop -text -SAS/OTB/jOTDB3/dist-src/showServerOTB -text svneol=unset#application/x-shellscript -SAS/OTB/jOTDB3/dist-src/startServerOTB -text -SAS/OTB/jOTDB3/dist-src/stopServerOTB -text svneol=unset#application/x-shellscript SAS/OTB/jOTDB3/include/jOTDB3/CMakeLists.txt -text SAS/OTB/jOTDB3/include/jOTDB3/nl_astron_lofar_sas_otb_jotdb3_jCampaign.h -text SAS/OTB/jOTDB3/include/jOTDB3/nl_astron_lofar_sas_otb_jotdb3_jClassifConv.h -text @@ -4980,14 +4974,19 @@ SAS/OTDB_Services/test/t_TreeStatusEvents.run -text svneol=unset#application/x-s SAS/OTDB_Services/test/t_TreeStatusEvents.sh -text svneol=unset#application/x-shellscript SAS/OTDB_Services/test/unittest_db.dump.gz -text svneol=unset#application/x-gzip SAS/ResourceAssignment/CMakeLists.txt -text +SAS/ResourceAssignment/OTDBtoRATaskStatusPropagator/CMakeLists.txt -text +SAS/ResourceAssignment/OTDBtoRATaskStatusPropagator/__init__.py -text +SAS/ResourceAssignment/OTDBtoRATaskStatusPropagator/otdbtorataskstatuspropagator -text +SAS/ResourceAssignment/OTDBtoRATaskStatusPropagator/otdbtorataskstatuspropagator.ini -text +SAS/ResourceAssignment/OTDBtoRATaskStatusPropagator/propagator.py -text SAS/ResourceAssignment/QPIDInfrastructure/CMakeLists.txt -text SAS/ResourceAssignment/QPIDInfrastructure/README -text SAS/ResourceAssignment/QPIDInfrastructure/bin/CMakeLists.txt -text SAS/ResourceAssignment/QPIDInfrastructure/bin/addtoQPIDDB.py -text -SAS/ResourceAssignment/QPIDInfrastructure/bin/cep4_config.sh -text SAS/ResourceAssignment/QPIDInfrastructure/bin/compareQPIDwithDB.py -text SAS/ResourceAssignment/QPIDInfrastructure/bin/configQPIDfromDB.py -text SAS/ResourceAssignment/QPIDInfrastructure/bin/gatherfrombrokers.sh -text +SAS/ResourceAssignment/QPIDInfrastructure/bin/populateDB.sh -text SAS/ResourceAssignment/QPIDInfrastructure/bin/qpidinfra_dump.sql -text SAS/ResourceAssignment/QPIDInfrastructure/bin/route_to_struct.py -text SAS/ResourceAssignment/QPIDInfrastructure/lib/CMakeLists.txt -text @@ -5000,20 +4999,54 @@ SAS/ResourceAssignment/QPIDInfrastructure/test/test_qpid_database.sh -text SAS/ResourceAssignment/RATaskSpecifiedService/bin/CMakeLists.txt -text SAS/ResourceAssignment/RATaskSpecifiedService/bin/rataskspecifiedservice -text SAS/ResourceAssignment/RATaskSpecifiedService/bin/rataskspecifiedservice.ini -text +SAS/ResourceAssignment/RATaskSpecifiedService/lib/config.py -text SAS/ResourceAssignment/RATaskSpecifiedService/test/tRATaskSpecified.in_correlator -text SAS/ResourceAssignment/RATaskSpecifiedService/test/tRATaskSpecified.in_preprocessing -text SAS/ResourceAssignment/RATaskSpecifiedService/test/tRATaskSpecified.sh eol=lf +SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/CMakeLists.txt -text +SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/bin/CMakeLists.txt -text +SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/bin/rotspservice -text +SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/bin/rotspservice.ini -text +SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/CMakeLists.txt -text +SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/__init__.py -text +SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/config.py -text +SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/otdbrpc.py -text +SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/propagator.py -text +SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/rotspservice.py -text +SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/translator.py -text +SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/test/CMakeLists.txt -text +SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/test/t_rotspservice.py -text +SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/test/t_rotspservice.run -text +SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/test/t_rotspservice.sh -text +SAS/ResourceAssignment/ResourceAssigner/CMakeLists.txt -text +SAS/ResourceAssignment/ResourceAssigner/bin/CMakeLists.txt -text +SAS/ResourceAssignment/ResourceAssigner/bin/resourceassigner -text +SAS/ResourceAssignment/ResourceAssigner/bin/resourceassigner.ini -text +SAS/ResourceAssignment/ResourceAssigner/lib/CMakeLists.txt -text +SAS/ResourceAssignment/ResourceAssigner/lib/__init__.py -text +SAS/ResourceAssignment/ResourceAssigner/lib/assignment.py -text +SAS/ResourceAssignment/ResourceAssigner/lib/config.py -text +SAS/ResourceAssignment/ResourceAssigner/lib/raservice.py -text +SAS/ResourceAssignment/ResourceAssigner/test/CMakeLists.txt -text +SAS/ResourceAssignment/ResourceAssigner/test/t_resourceassigner.py -text +SAS/ResourceAssignment/ResourceAssigner/test/t_resourceassigner.run -text +SAS/ResourceAssignment/ResourceAssigner/test/t_resourceassigner.sh -text SAS/ResourceAssignment/ResourceAssignmentDatabase/CMakeLists.txt -text SAS/ResourceAssignment/ResourceAssignmentDatabase/__init__.py -text SAS/ResourceAssignment/ResourceAssignmentDatabase/config.py -text SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py -text +SAS/ResourceAssignment/ResourceAssignmentDatabase/radbbuslistener.py -text SAS/ResourceAssignment/ResourceAssignmentDatabase/radbpglistener -text SAS/ResourceAssignment/ResourceAssignmentDatabase/radbpglistener.ini -text SAS/ResourceAssignment/ResourceAssignmentDatabase/radbpglistener.py -text +SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/CMakeLists.txt -text SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_notifications.sql -text SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_resource_allocation_statics.sql -text +SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_triggers.sql -text SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_virtual_instrument.sql -text +SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_add_notifications.sql.py -text SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_add_virtual_instrument.sql.py -text +SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_and_populate_database.sql -text SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_database.sql -text SAS/ResourceAssignment/ResourceAssignmentDatabase/tests/fill_database.sql -text SAS/ResourceAssignment/ResourceAssignmentEditor/CMakeLists.txt -text @@ -5026,10 +5059,13 @@ SAS/ResourceAssignment/ResourceAssignmentEditor/config/default.py -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/CMakeLists.txt -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/__init__.py -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/fakedata.py -text +SAS/ResourceAssignment/ResourceAssignmentEditor/lib/mom.py -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/radbchangeshandler.py -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/app.js -text +SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/chartresourceusagecontroller.js -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/datacontroller.js -text -SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/ganttcontroller.js -text +SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/ganttprojectcontroller.js -text +SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/ganttresourcecontroller.js -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/gridcontroller.js -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/css/bootstrap.min.css -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/css/main.css -text @@ -5046,6 +5082,12 @@ SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angu SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-bounds-plugin.min.css -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-bounds-plugin.min.js -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-bounds-plugin.min.js.map -text +SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.css -text +SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.js -text +SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.js.map -text +SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.min.css -text +SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.min.js -text +SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.min.js.map -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-drawtask-plugin.js -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-drawtask-plugin.js.map -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-drawtask-plugin.min.css -text @@ -5149,13 +5191,22 @@ SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-grid/ui SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-layout/angular-ui-layout.css -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-layout/angular-ui-layout.js -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-layout/angular-ui-layout.min.js -text +SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-tabs/angular-ui.bootstrap.tabs.js -text +SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-tabs/angular-ui.bootstrap.tabs.min.js -text +SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-tabs/tab.html -text +SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-tabs/tabset.html -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-tree/angular-ui-tree.js -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-tree/angular-ui-tree.min.js -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular/angular-csp.css -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular/angular.js -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular/angular.min.js -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular/angular.min.js.map -text +SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/highcharts/exporting.js -text +SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/highcharts/highcharts-ng.js -text +SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/highcharts/highcharts.js -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/jquery/jquery.min.js -text +SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/jsplumb/jsplumb-2.0.7-min.js -text +SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/jsplumb/jsplumb-2.0.7.js -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/moment/.bower.json -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/moment/moment-with-locales.js -text SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/moment/moment-with-locales.min.js -text @@ -5174,10 +5225,30 @@ SAS/ResourceAssignment/ResourceAssignmentEditor/test/CMakeLists.txt -text SAS/ResourceAssignment/ResourceAssignmentEditor/test/test_webservice.py -text SAS/ResourceAssignment/ResourceAssignmentEditor/test/test_webservice.run -text SAS/ResourceAssignment/ResourceAssignmentEditor/test/test_webservice.sh -text +SAS/ResourceAssignment/ResourceAssignmentEstimator/CMakeLists.txt -text +SAS/ResourceAssignment/ResourceAssignmentEstimator/__init__.py -text +SAS/ResourceAssignment/ResourceAssignmentEstimator/config.py -text +SAS/ResourceAssignment/ResourceAssignmentEstimator/raestimatorservice -text +SAS/ResourceAssignment/ResourceAssignmentEstimator/raestimatorservice.ini -text +SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/CMakeLists.txt -text +SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/__init__.py -text +SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/base_resource_estimator.py -text +SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/calibration_pipeline.py -text +SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/image_pipeline.py -text +SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/longbaseline_pipeline.py -text +SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/observation.py -text +SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/parameterset.py -text +SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/pulsar_pipeline.py -text +SAS/ResourceAssignment/ResourceAssignmentEstimator/service.py -text +SAS/ResourceAssignment/ResourceAssignmentEstimator/test/CMakeLists.txt -text +SAS/ResourceAssignment/ResourceAssignmentEstimator/test/__init__.py -text +SAS/ResourceAssignment/ResourceAssignmentEstimator/test/t_resource_estimator.py -text +SAS/ResourceAssignment/ResourceAssignmentEstimator/test/t_resource_estimator.run -text svneol=unset#application/x-shellscript +SAS/ResourceAssignment/ResourceAssignmentEstimator/test/t_resource_estimator.sh -text svneol=unset#application/x-shellscript +SAS/ResourceAssignment/ResourceAssignmentEstimator/test/testset.py -text SAS/ResourceAssignment/ResourceAssignmentService/CMakeLists.txt -text SAS/ResourceAssignment/ResourceAssignmentService/__init__.py -text SAS/ResourceAssignment/ResourceAssignmentService/config.py -text -SAS/ResourceAssignment/ResourceAssignmentService/radbbuslistener.py -text SAS/ResourceAssignment/ResourceAssignmentService/radbclient -text SAS/ResourceAssignment/ResourceAssignmentService/radbservice -text SAS/ResourceAssignment/ResourceAssignmentService/radbservice.ini -text @@ -5194,12 +5265,14 @@ SAS/ResourceAssignment/Services/test/tRATaskSpecified.in_preprocessing -text SAS/ResourceAssignment/Services/test/tRATaskSpecified.sh eol=lf SAS/ResourceAssignment/SystemStatusDatabase/CMakeLists.txt -text SAS/ResourceAssignment/SystemStatusDatabase/__init__.py -text +SAS/ResourceAssignment/SystemStatusDatabase/sql/CMakeLists.txt -text SAS/ResourceAssignment/SystemStatusDatabase/sql/SetupDatabase.sql -text SAS/ResourceAssignment/SystemStatusDatabase/ssdb.py -text SAS/ResourceAssignment/SystemStatusService/CMakeLists.txt -text SAS/ResourceAssignment/SystemStatusService/SSDBQueryService.py -text SAS/ResourceAssignment/SystemStatusService/SSDBrpc.py -text SAS/ResourceAssignment/SystemStatusService/__init__.py -text +SAS/ResourceAssignment/SystemStatusService/config.py -text SAS/ResourceAssignment/SystemStatusService/ssdbservice -text SAS/ResourceAssignment/SystemStatusService/ssdbservice.ini -text SAS/ResourceAssignment/SystemStatusService/test/CMakeLists.txt -text diff --git a/CEP/Calibration/BBSControl/scripts/parmdbplot.py b/CEP/Calibration/BBSControl/scripts/parmdbplot.py index 25495c22951c7d45023cbd5c7f7061c7498b42c2..141a79f4193c89976bb0e2f1ae3adc486730a00a 100755 --- a/CEP/Calibration/BBSControl/scripts/parmdbplot.py +++ b/CEP/Calibration/BBSControl/scripts/parmdbplot.py @@ -771,7 +771,7 @@ class PlotWindow(QFrame): else: xlabel = ["Time (sample)", "Freq (sample)"][self.axis] - if self.calType == "CommonRotationAngle" or self.calType == "RotationAngle": + if self.calType == "CommonRotationAngle" or self.calType == "RotationAngle" or self.calType == "RotationMeasure": phaselabel = "Rotation angle (rad)" else: phaselabel = "Phase (rad)" diff --git a/CEP/Calibration/BBSKernel/src/MeasurementAIPS.cc b/CEP/Calibration/BBSKernel/src/MeasurementAIPS.cc index 75615f92f09ed10b9d9fe1a129551391960588f0..3863d0f2aef41889cf99607649a425be32ab07af 100644 --- a/CEP/Calibration/BBSKernel/src/MeasurementAIPS.cc +++ b/CEP/Calibration/BBSKernel/src/MeasurementAIPS.cc @@ -726,11 +726,13 @@ void MeasurementAIPS::initDimensions() Vector<Double> upFreq = frequency(Slice(1,frequency.nelements()-1)); Vector<Double> lowFreq = frequency(Slice(0,frequency.nelements()-1)); Double freqstep0=upFreq(0)-lowFreq(0); - ASSERTSTR(allEQ(upFreq-lowFreq,freqstep0), + // Check to 1 kHz accuracy + ASSERTSTR(allNearAbs(upFreq-lowFreq,freqstep0,1.e3), "Channels are not evenly spaced. This is not supported."); } - ASSERTSTR(allEQ(width, width(0)), + // Check to 1 kHz accuracy + ASSERTSTR(allNearAbs(width, width(0),1.e3), "Channels width is not the same for all channels. This is not supported" " yet."); diff --git a/CEP/DP3/DPPP/src/ApplyCal.cc b/CEP/DP3/DPPP/src/ApplyCal.cc index 0841398434e25bc93ddf176b1383bf122f099a1e..b0394aafe9e19dea745d80763822cf3dbf14c389 100644 --- a/CEP/DP3/DPPP/src/ApplyCal.cc +++ b/CEP/DP3/DPPP/src/ApplyCal.cc @@ -282,11 +282,18 @@ namespace LOFAR { double maxFreq (info().chanFreqs()[numFreqs-1]+0.5*freqInterval); itsLastTime = bufStartTime + itsTimeSlotsPerParmUpdate * itsTimeInterval; + uint numTimes = itsTimeSlotsPerParmUpdate; + + double lastMSTime = info().startTime() + info().ntime() * itsTimeInterval; + if (itsLastTime > lastMSTime) { + itsLastTime = lastMSTime; + numTimes = info().ntime() % itsTimeSlotsPerParmUpdate; + } map<string, vector<double> > parmMap; map<string, vector<double> >::iterator parmIt; - uint tfDomainSize=itsTimeSlotsPerParmUpdate*numFreqs; + uint tfDomainSize=numTimes*numFreqs; for (uint parmExprNum = 0; parmExprNum<itsParmExprs.size();++parmExprNum) { // parmMap contains parameter values for all antennas @@ -300,6 +307,7 @@ namespace LOFAR { if (parmIt != parmMap.end()) { parmvalues[parmExprNum][ant].swap(parmIt->second); + ASSERT(parmvalues[parmExprNum][ant].size()==tfDomainSize); } else {// No value found, try default Array<double> defValues; double defValue; @@ -419,8 +427,8 @@ namespace LOFAR { if (itsInvert) { chi = -chi; } - double sinv = sin(parmvalues[0][ant][tf] * chi); - double cosv = cos(parmvalues[0][ant][tf] * chi); + double sinv = sin(chi); + double cosv = cos(chi); itsParms[0][ant][tf] = cosv; itsParms[1][ant][tf] = -sinv; itsParms[2][ant][tf] = sinv; diff --git a/CMake/LofarPackageList.cmake b/CMake/LofarPackageList.cmake index 8b3786ad6a31e21e3446bf83a926aad2b1dacb0e..61eb3f8dc9681386ea86026f38c6317e38790c32 100644 --- a/CMake/LofarPackageList.cmake +++ b/CMake/LofarPackageList.cmake @@ -1,7 +1,7 @@ # - Create for each LOFAR package a variable containing the absolute path to # its source directory. # -# Generated by gen_LofarPackageList_cmake.sh at do mrt 24 08:54:31 CET 2016 +# Generated by gen_LofarPackageList_cmake.sh at ma apr 4 12:02:12 CEST 2016 # # ---- DO NOT EDIT ---- # @@ -147,13 +147,17 @@ if(NOT DEFINED LOFAR_PACKAGE_LIST_INCLUDED) set(MoMQueryService_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/MoM/MoMQueryService) set(jOTDB3_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/OTB/jOTDB3) set(OTB-Java_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/OTB/OTB) - set(ResourceAssignmentEditor_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/ResourceAssignment/ResourceAssignmentEditor) + set(QPIDInfrastructure_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/ResourceAssignment/QPIDInfrastructure) set(RATaskSpecifiedService_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/ResourceAssignment/RATaskSpecifiedService) - set(ResourceAssignmentService_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/ResourceAssignment/ResourceAssignmentService) + set(RAtoOTDBTaskSpecificationPropagator_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator) + set(ResourceAssigner_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/ResourceAssignment/ResourceAssigner) set(ResourceAssignmentDatabase_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/ResourceAssignment/ResourceAssignmentDatabase) + set(ResourceAssignmentEditor_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/ResourceAssignment/ResourceAssignmentEditor) + set(ResourceAssignmentEstimator_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/ResourceAssignment/ResourceAssignmentEstimator) + set(ResourceAssignmentService_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/ResourceAssignment/ResourceAssignmentService) set(SystemStatusDatabase_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/ResourceAssignment/SystemStatusDatabase) set(SystemStatusService_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/ResourceAssignment/SystemStatusService) - set(QPIDInfrastructure_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/ResourceAssignment/QPIDInfrastructure) + set(OTDBtoRATaskStatusPropagator_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SAS/ResourceAssignment/OTDBtoRATaskStatusPropagator) set(CCU_MAC_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SubSystems/CCU_MAC) set(LCU_MAC_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SubSystems/LCU_MAC) set(MCU_MAC_SOURCE_DIR ${CMAKE_SOURCE_DIR}/SubSystems/MCU_MAC) diff --git a/CMake/variants/variants.MacRenting b/CMake/variants/variants.MacRenting index 890e39c9faf6ab64ed5f405bb9131e2d5e0fe95c..887e2eb8d27f1417f6eb9f04a812f9f1e58da08f 100644 --- a/CMake/variants/variants.MacRenting +++ b/CMake/variants/variants.MacRenting @@ -1,6 +1,31 @@ ## $Id: variants 33283 2016-01-15 14:05:11Z schaap $ +# Specific options +option(USE_BACKTRACE "No backtrace" OFF) +option(USE_LOG4CPLUS "log4cxx is used" OFF) +option(USE_LOG4CXX "log4cxx is used" OFF) +option(USE_SHMEM "No shmem" OFF) +option(USE_OPENMP "No openmp" OFF) -option(USE_LOG4CPLUS "Use Log4Cplus" OFF) +# Where to find packages +set(LOFAR_ROOT_DIR /Users/renting/sim/LOFAR/installed/gnu_opt) +#set(ASKAPSOFT_ROOT_DIR /Users/renting/askaptree) +set(CASACORE_ROOT_DIR /Users/renting) +set(CASAREST_ROOT_DIR /Users/renting) +set(AOFLAGGER_ROOT_DIR /Users/renting/external) +set(PYRAP_ROOT_DIR /Users/renting) +set(CFITSIO_ROOT_DIR /usr/local) +set(FFTW3_ROOT_DIR /opt/local) +set(ENV{HDF5_ROOT} /opt/local) +#set(PQXX_ROOT_DIR /Library/PostgreSQL/8.3) +#set(LOG4CXX_ROOT_DIR /Users/renting/askaptree/ASKAPsoft/3rdParty/log4cxx/log4cxx-0.10.0/install) +#set(GSL_ROOT_DIR /Users/renting/askaptree/ASKAPsoft/3rdParty/gsl/gsl-1.10/install) +#set(CMDLINEPARSER_ROOT_DIR /Users/renting/askaptree/ASKAPsoft/3rdParty/cmdlineparser/cmdlineparser-0.1.1/install) -option(USE_OPENMP "Use OpenMP" OFF) +# Compilers are in non-standard place. +set(GNU_Fortran /usr/bin/gfortran) # GNU Fortran compiler +set(GNU_C /usr/bin/gcc) +set(GNU_CXX /usr/bin/g++) +set(CLANG_C /usr/bin/clang) +set(CLANG_CXX /usr/bin/clang++) +set(CLANG_Fortran /usr/bin/gfortran) # GNU Fortran compiler \ No newline at end of file diff --git a/LCS/Messaging/python/messaging/RPC.py b/LCS/Messaging/python/messaging/RPC.py index 3d8e4f8c36629508ff0e2764ac8f8b64771c720c..69935df5b42e9b8f65da10d26a24129a3e2e04aa 100644 --- a/LCS/Messaging/python/messaging/RPC.py +++ b/LCS/Messaging/python/messaging/RPC.py @@ -23,6 +23,9 @@ from .messagebus import ToBus, FromBus from .messages import RequestMessage, ReplyMessage import uuid +import logging + +logger = logging.getLogger(__name__) def _analyze_args(args,kwargs): HasKwArgs=(len(kwargs)>0) @@ -138,6 +141,10 @@ class RPC(): result=myrpc(request) """ + return self.execute(*args, **kwargs) + + def execute(self, *args, **kwargs): + '''execute the remote procedure call''' timeout = kwargs.pop("timeout", self.timeout) Content = _args_as_content(*args, **kwargs) HasArgs, HasKwArgs = _analyze_args(args, kwargs) @@ -196,4 +203,153 @@ class RPC(): raise RPCException(answer.errmsg) return (None, status) -__all__ = ["RPC", "RPCException"] +class RPCWrapper(object): + """ + RCPWrapper is a helper class to simplify the re-use of rpc calls. + It hides the boiler plate code of setting up the rpc connection, + and it caches connections per method for faster access. + + Typical Usage: + Derive a subclass, define some methods, and in the method call self.rpc(method, *args, **kwargs) + + Example: + Suppose you want to do an rpc call on service 'MyService'. + Normally you would write: + + with RPC(busname='MyBus', service='MyService') as myrpc: + result, status = myrpc() + + if status == 'OK': + #process result + print result + + That's just for one(!) rpc method. + Now suppose you want to implement 10 such rpc methods; + That would require 10 times the boiler plate. + + So, what's the solution? + Define a RPCWrapper-derived class once, like so: + + class MyRPC(RPCWrapper): + def doMyServiceCall(self): + return self.rpc() + + And use it like so: + + with MyRPC(busname='MyBus', service='MyService') as myrpc: + result = myrpc.doMyServiceCall() + + #process result + print result + + Not a whole lot better than the first solution, right? Wrong! + The benefit comes when you want to wrap multiple methods. + Of course, the Service should provide these methods, + in this case: 'MyBus/MyService.foo', 'MyBus/MyService.bar', ...etc + Again, define a RPCWrapper-derived class once, like so: + + class MyRPC(RPCWrapper): + def foo(self): + return self.rpc('foo') + + def bar(self): + return self.rpc('bar') + + def fancyStuff(self): + result = self.rpc('bar') + #... do complicated result processing... + return processed_result + + def methodWithArgs(self, arg1, arg2): + return self.rpc('bar', arg1=arg1, arg2=arg2) + + + And use it like so: + + with MyRPC(busname='MyBus', service='MyService') as myrpc: + result1 = myrpc.foo() + #... process result1 ... + + result2 = myrpc.bar() + #... process result2 ... + + result3 = myrpc.fancyStuff() + #... process result3 ... + + result4 = myrpc.methodWithArgs('abc', 123) + #... process result4 ... + + Now that's nice clean code! + And, as a extra benifit, the rpc connections for each + method are cached and cleaned automatically! + """ + def __init__(self, busname=None, + servicename=None, + broker=None, + timeout=10): + self.busname = busname + self.servicename = servicename + self.broker = broker + self.timeout = timeout + + self._serviceRPCs = {} #cache of rpc's for each service + + def open(self): + '''Empty implementation, since each rpc connection is lazily opened on first use and then cached''' + pass + + def close(self): + '''Close all opened rpc connections''' + for rpc in self._serviceRPCs.values(): + rpc.close() + + def __enter__(self): + """Internal use only. (handles scope 'with')""" + self.open() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + """Internal use only. (handles scope 'with') + Close all opened rpc connections""" + self.close() + + def rpc(self, method=None, *args, **kwargs): + '''execute the rpc call on the <bus>/<service>.<method> and return the result''' + try: + if self.timeout: + rpckwargs = {'timeout': self.timeout} + + service_method = (self.servicename + '.' + method) if self.servicename and method \ + else self.servicename if self.servicename else method + + #check cache + if service_method not in self._serviceRPCs: + # not in cache + # so, create RPC for this service method, open it, and cache it + rpc = RPC(service_method, busname=self.busname, broker=self.broker, ForwardExceptions=True, **rpckwargs) + rpc.open() + self._serviceRPCs[service_method] = rpc + + rpc = self._serviceRPCs[service_method] + + if args: + if kwargs: + res, status = rpc(*args, **kwargs) + else: + res, status = rpc(*args) + elif kwargs: + res, status = rpc(**kwargs) + else: + res, status = rpc() + + if status != 'OK': + logger.error('status: %s' % status) + logger.error('result: %s' % res) + raise RPCException("%s %s" % (status, res)) + + return res + except RPCException as e: + logger.error(str(e)) + raise + +__all__ = ["RPC", "RPCException", "RPCWrapper"] diff --git a/LCS/Messaging/python/messaging/Service.py b/LCS/Messaging/python/messaging/Service.py index 95c1fd45875f55d39e231ad63f4f31f5d30d2f3f..034d2c835076b259352137a7512b7887ba0639aa 100644 --- a/LCS/Messaging/python/messaging/Service.py +++ b/LCS/Messaging/python/messaging/Service.py @@ -136,13 +136,13 @@ class Service(AbstractBusListener): def start_listening(self, numthreads=None): """ Start the background threads and process incoming messages. - """ + """ if self.isListening(): return # only on a 'bus' we already connect the reply_bus if self.busname: - self.reply_bus = ToBus(self.busname) + self.reply_bus = ToBus(self.busname, broker=self.broker) self.reply_bus.open() else: self.reply_bus=None @@ -179,9 +179,9 @@ class Service(AbstractBusListener): return args def _send_reply(self, replymessage, status, reply_to, errtxt="",backtrace=""): - """ - Internal use only. Send a reply message to the RPC client including exception info. - """ + """ + Internal use only. Send a reply message to the RPC client including exception info. + """ # Compose Reply message from reply and status. if isinstance(replymessage,ReplyMessage): reply_msg = replymessage @@ -204,7 +204,7 @@ class Service(AbstractBusListener): reply_busname=reply_address[num_parts-2] subject=reply_address[num_parts-1] try: - with ToBus(reply_busname) as dest: + with ToBus(reply_busname, broker=self.broker) as dest: # remove any extra field if present if ';' in subject: subject = subject.split(';')[0] @@ -309,11 +309,11 @@ class Service(AbstractBusListener): del rawbacktrace[0] del rawbacktrace[-1] backtrace = ''.join(rawbacktrace).encode('latin-1').decode('unicode_escape') - self._debug(backtrace) + logger.error("exception while handling message: %s\n%s" % (errtxt, backtrace)) if self.verbose: - logger.info("[Service:] Status: %s", str(status)) - logger.info("[Service:] ERRTXT: %s", str(errtxt)) - logger.info("[Service:] BackTrace: %s", str( backtrace )) + logger.error("[Service:] Status: %s", str(status)) + logger.error("[Service:] ERRTXT: %s", str(errtxt)) + logger.error("[Service:] BackTrace: %s", str( backtrace )) self._send_reply(None, status, lofar_msg.reply_to, errtxt=errtxt, backtrace=backtrace) def _onAfterReceiveMessage(self, successful): diff --git a/LCS/Messaging/python/messaging/messagebus.py b/LCS/Messaging/python/messaging/messagebus.py index 703eb5a7e679f1195f62113b4823589eec2d769a..0fc4f9b79d75842b9d4ddb4a9ce5cc26b9fec55f 100644 --- a/LCS/Messaging/python/messaging/messagebus.py +++ b/LCS/Messaging/python/messaging/messagebus.py @@ -111,7 +111,7 @@ class FromBus(object): if (self.opened==0): try: self.connection.open() - logger.info("[FromBus] Connected to broker: %s", self.broker) + logger.debug("[FromBus] Connected to broker: %s", self.broker) self.session = self.connection.session() logger.debug("[FromBus] Created session: %s", self.session.name) self.add_queue(self.address, self.options) @@ -147,7 +147,7 @@ class FromBus(object): self.broker) finally: self.session = None - logger.info("[FromBus] Disconnected from broker: %s", self.broker) + logger.debug("[FromBus] Disconnected from broker: %s", self.broker) self.opened-=1 @@ -185,7 +185,7 @@ class FromBus(object): except qpid.messaging.MessagingError: raise_exception(MessageBusError, "[FromBus] Failed to create %s" % (what,)) - logger.info("[FromBus] Created %s", what) + logger.debug("[FromBus] Created %s", what) def receive(self, timeout=DEFAULT_TIMEOUT, logDebugMessages=True): """ @@ -207,7 +207,7 @@ class FromBus(object): raise_exception(MessageBusError, "[FromBus] Failed to fetch message from: " "%s" % self.address) - logger.info("[FromBus] Message received on: %s subject: %s" % (self.address, msg.subject)) + logger.debug("[FromBus] Message received on: %s subject: %s" % (self.address, msg.subject)) if logDebugMessages: logger.debug("[FromBus] %s" % msg) try: @@ -297,18 +297,19 @@ class ToBus(object): def open(self): if (self.opened==0): - try: - self.connection.open() - logger.info("[ToBus] Connected to broker: %s", self.broker) - self.session = self.connection.session() - logger.debug("[ToBus] Created session: %s", self.session.name) - self._add_queue(self.address, self.options) - except qpid.messaging.MessagingError: - self.__exit__(*sys.exc_info()) - raise_exception(MessageBusError, "[ToBus] Initialization failed") - except MessageBusError: - self.__exit__(*sys.exc_info()) - raise + try: + logger.debug("[ToBus] Connecting to broker: %s", self.broker) + self.connection.open() + logger.debug("[ToBus] Connected to broker: %s", self.broker) + self.session = self.connection.session() + logger.debug("[ToBus] Created session: %s", self.session.name) + self._add_queue(self.address, self.options) + except qpid.messaging.MessagingError: + self.__exit__(*sys.exc_info()) + raise_exception(MessageBusError, "[ToBus] Initialization failed") + except MessageBusError: + self.__exit__(*sys.exc_info()) + raise self.opened+=1 @@ -325,7 +326,7 @@ class ToBus(object): """ try: self.connection.open() - logger.info("[ToBus] Connected to broker: %s", self.broker) + logger.debug("[ToBus] Connected to broker: %s", self.broker) self.session = self.connection.session() logger.debug("[ToBus] Created session: %s", self.session.name) self._add_queue(self.address, self.options) @@ -371,7 +372,7 @@ class ToBus(object): self.broker) finally: self.session = None - logger.info("[ToBus] Disconnected from broker: %s", self.broker) + logger.debug("[ToBus] Disconnected from broker: %s", self.broker) def _check_session(self): """ @@ -417,7 +418,7 @@ class ToBus(object): except qpid.messaging.MessagingError: raise_exception(MessageBusError, "[ToBus] Failed to create %s" % (what,)) - logger.info("[ToBus] Created %s", what) + logger.debug("[ToBus] Created %s", what) def send(self, message, timeout=DEFAULT_TIMEOUT): """ @@ -435,7 +436,7 @@ class ToBus(object): raise_exception(MessageBusError, "[ToBus] Failed to send message to: %s" % sender.target) - logger.info("[ToBus] Message sent to: %s subject: %s" % (self.address, message.subject)) + logger.debug("[ToBus] Message sent to: %s subject: %s" % (self.address, message.subject)) class AbstractBusListener(object): @@ -530,7 +531,8 @@ class AbstractBusListener(object): self._running.clear() for thread, args in self._threads.items(): - logger.debug("Thread %2d: STOPPING Listening for messages on %s" % (args['index'], self.address)) + logger.debug("Thread %2d: STOPPING Listening for messages on %s at broker %s" % + (args['index'], self.address, self.broker if self.broker else 'localhost')) thread.join() logger.info("Thread %2d: STOPPED Listening for messages on %s" % (args['index'], self.address)) logger.info(" %d messages received and %d processed OK." % (args['num_received_messages'], args['num_processed_messages'])) @@ -582,7 +584,8 @@ class AbstractBusListener(object): currentThread = threading.currentThread() args = self._threads[currentThread] thread_idx = args['index'] - logger.info( "Thread %d START Listening for messages on %s" %(thread_idx, self.address)) + logger.info( "Thread %d START Listening for messages on %s at broker %s" % + (thread_idx, self.address, self.broker if self.broker else 'localhost')) try: self._onListenLoopBegin() except Exception as e: diff --git a/LCS/Messaging/python/messaging/test/t_messagebus.py b/LCS/Messaging/python/messaging/test/t_messagebus.py index c4a70a0d66dc1df2b6f4930824e659dcf8320333..5f2f2a9af6d75ee4650afccd3c317a90dc63a398 100644 --- a/LCS/Messaging/python/messaging/test/t_messagebus.py +++ b/LCS/Messaging/python/messaging/test/t_messagebus.py @@ -51,7 +51,7 @@ class FromBusInitFailed(unittest.TestCase): Connecting to non-existent broker address must raise MessageBusError """ regexp = re.escape(self.error) - regexp += '.*' + 'No address associated with hostname' + regexp += '.*' + '(No address associated with hostname|Name or service not known)' with self.assertRaisesRegexp(MessageBusError, regexp): with FromBus(QUEUE, broker="foo.bar", broker_options={'reconnect': False}): pass @@ -162,7 +162,7 @@ class ToBusInitFailed(unittest.TestCase): Connecting to non-existent broker address must raise MessageBusError """ regexp = re.escape(self.error) - regexp += '.*' + 'No address associated with hostname' + regexp += '.*' + '(No address associated with hostname|Name or service not known)' with self.assertRaisesRegexp(MessageBusError, regexp): with ToBus(QUEUE, broker="foo.bar", broker_options={'reconnect': False}): pass diff --git a/LCS/PyCommon/datetimeutils.py b/LCS/PyCommon/datetimeutils.py index aec37c73cf6b928174fdb2c8cb1647456cc72ac5..dc66dc9a10a9d93cc4d218679679efb8e27aded1 100644 --- a/LCS/PyCommon/datetimeutils.py +++ b/LCS/PyCommon/datetimeutils.py @@ -44,3 +44,12 @@ def monthRanges(min_date, max_date): month_start = datetime(month_start.year+1, month_start.month-11, 1, tzinfo=min_date.tzinfo) return ranges + +def totalSeconds(td_value): + '''Return the total number of fractional seconds contained in the duration. + For Python < 2.7 compute it, else use total_seconds() method. + ''' + if hasattr(td_value,"total_seconds"): + return td_value.total_seconds() + + return (td_value.microseconds + (td_value.seconds + td_value.days * 86400) * 1000000) / 1000000.0 diff --git a/LCS/PyCommon/dbcredentials.py b/LCS/PyCommon/dbcredentials.py index 666a0879b1a2e7e401f3b5169986594511a97c87..7767790fd233831202059a7a42ca232c60ae57e1 100644 --- a/LCS/PyCommon/dbcredentials.py +++ b/LCS/PyCommon/dbcredentials.py @@ -24,6 +24,10 @@ import os import pwd from ConfigParser import SafeConfigParser, NoSectionError, DuplicateSectionError from optparse import OptionGroup +from os import stat, path, chmod +import logging + +logger = logging.getLogger(__name__) __all__ = ["Credentials", "DBCredentials", "options_group", "parse_options"] @@ -64,6 +68,9 @@ class Credentials: def __str__(self): return "type={type} addr={host}:{port} auth={user}:{password} db={database}".format(**self.__dict__) + def stringWithHiddenPassword(self): + return "type={type} addr={host}:{port} auth={user}:XXXXXX db={database}".format(**self.__dict__) + def pg_connect_options(self): """ Returns a dict of options to provide to PyGreSQL's pg.connect function. Use: @@ -80,6 +87,39 @@ class Credentials: "dbname": self.database, } + def psycopg2_connect_options(self): + """ + Returns a dict of options to provide to PsycoPG2's psycopg2.connect function. Use: + + conn = psycopg2.connect(**dbcreds.psycopg2_connect_options()) + """ + return { + "host": self.host, + "port": self.port or None, + + "user": self.user, + "password": self.password, + + "database": self.database, + } + + + def mysql_connect_options(self): + """ + Returns a dict of options to provide to python's mysql.connector.connect function. Use: + + from mysql import connector + conn = connector.connect(**dbcreds.mysql_connect_options()) + """ + options = { "host": self.host, + "user": self.user, + "passwd": self.password, + "database": self.database } + + if self.port: + options["port"] = self.port + + return options class DBCredentials: def __init__(self, filepatterns=None): @@ -110,11 +150,20 @@ class DBCredentials: "{HOME}/.lofar/dbcredentials/*.ini", ] - self.config = SafeConfigParser() - self.files = sum([findfiles(p) for p in filepatterns],[]) - self.config.read(self.files) + # make sure the files are mode 600 to hide passwords + for file in self.files: + if oct(stat(file).st_mode & 0777) != '0600': + logger.info('Changing permissions of %s to 600' % file) + try: + chmod(file, 0600) + except Exception as e: + logger.error('Error: Could not change permissions on %s: %s' % (file, str(e))) + + #read the files into config + self.config = SafeConfigParser() + self.config.read(self.files) def get(self, database): """ @@ -138,6 +187,8 @@ class DBCredentials: if "database" in d: creds.database = d["database"] + if "type" in d: creds.type = d["type"] + return creds @@ -173,7 +224,7 @@ class DBCredentials: return "database:%s" % (database,) -def options_group(parser): +def options_group(parser, default_credentials=""): """ Return an optparse.OptionGroup containing command-line parameters for database connections and authentication. @@ -189,8 +240,8 @@ def options_group(parser): help="User of the database server") group.add_option("-P", "--password", dest="dbPassword", type="string", default="", help="Password of the database server") - group.add_option("-C", "--dbcredentials", dest="dbcredentials", type="string", default="", - help="Name of database credential set to use") + group.add_option("-C", "--dbcredentials", dest="dbcredentials", type="string", default=default_credentials, + help="Name of database credential set to use [default=%default]") return group diff --git a/LCS/PyCommon/postgres.py b/LCS/PyCommon/postgres.py index 633244828e07b83f3b57e0e1076ea04a30bb6387..2db1316e19116db9630de7d6e86256a892a02fd0 100644 --- a/LCS/PyCommon/postgres.py +++ b/LCS/PyCommon/postgres.py @@ -33,6 +33,85 @@ import psycopg2.extensions logger = logging.getLogger(__name__) +def makePostgresNotificationQueries(schema, table, action, view_for_row=None, view_selection_id=None): + action = action.upper() + if action not in ('INSERT', 'UPDATE', 'DELETE'): + raise ValueError('''trigger_type '%s' not in ('INSERT', 'UPDATE', 'DELETE')''' % action) + + if view_for_row and action == 'DELETE': + raise ValueError('You cannot use a view for results on action DELETE') + + if view_for_row: + change_name = '''{table}_{action}_with_{view_for_row}'''.format(schema=schema, + table=table, + action=action, + view_for_row=view_for_row) + function_name = '''NOTIFY_{change_name}'''.format(change_name=change_name) + function_sql = ''' + CREATE OR REPLACE FUNCTION {schema}.{function_name}() + RETURNS TRIGGER AS $$ + DECLARE + new_row_from_view {schema}.{view_for_row}%ROWTYPE; + BEGIN + select * into new_row_from_view from {schema}.{view_for_row} where {view_selection_id} = NEW.id LIMIT 1; + PERFORM pg_notify(CAST('{change_name}' AS text), + '{{"old":' || {old} || ',"new":' || row_to_json(new_row_from_view)::text || '}}'); + RETURN NEW; + END; + $$ LANGUAGE plpgsql; + '''.format(schema=schema, + function_name=function_name, + table=table, + action=action, + old='row_to_json(OLD)::text' if action == 'UPDATE' or action == 'DELETE' else '\'null\'', + view_for_row=view_for_row, + view_selection_id=view_selection_id if view_selection_id else 'id', + change_name=change_name.lower()) + else: + change_name = '''{table}_{action}'''.format(table=table, action=action) + function_name = '''NOTIFY_{change_name}'''.format(change_name=change_name) + function_sql = ''' + CREATE OR REPLACE FUNCTION {schema}.{function_name}() + RETURNS TRIGGER AS $$ + BEGIN + PERFORM pg_notify(CAST('{change_name}' AS text), + '{{"old":' || {old} || ',"new":' || {new} || '}}'); + RETURN {value}; + END; + $$ LANGUAGE plpgsql; + '''.format(schema=schema, + function_name=function_name, + table=table, + action=action, + old='row_to_json(OLD)::text' if action == 'UPDATE' or action == 'DELETE' else '\'null\'', + new='row_to_json(NEW)::text' if action == 'UPDATE' or action == 'INSERT' else '\'null\'', + value='OLD' if action == 'DELETE' else 'NEW', + change_name=change_name.lower()) + + trigger_name = 'TRIGGER_NOTIFY_%s' % function_name + + trigger_sql = ''' + CREATE TRIGGER {trigger_name} + AFTER {action} ON {schema}.{table} + FOR EACH ROW + EXECUTE PROCEDURE {schema}.{function_name}(); + '''.format(trigger_name=trigger_name, + function_name=function_name, + schema=schema, + table=table, + action=action) + + drop_sql = ''' + DROP TRIGGER IF EXISTS {trigger_name} ON {schema}.{table} CASCADE; + DROP FUNCTION IF EXISTS {schema}.{function_name}(); + '''.format(trigger_name=trigger_name, + function_name=function_name, + schema=schema, + table=table) + + sql = drop_sql + '\n' + function_sql + '\n' + trigger_sql + sql_lines = '\n'.join([s.strip() for s in sql.split('\n')]) + '\n' + return sql_lines class PostgresListener(object): ''' This class lets you listen to postgress notifications @@ -96,64 +175,6 @@ class PostgresListener(object): if notification in self.__callbacks: del self.__callbacks[notification] - def setupPostgresNotifications(self, schema, table, updateNotification=True, insertNotification=True, deleteNotification=True, view_for_row=None): - items = [] - if updateNotification: - items.append(('update', 'NEW')) - - if insertNotification: - items.append(('insert', 'NEW')) - - if deleteNotification: - items.append(('delete', 'OLD')) - - for item in items: - if view_for_row and item[0] != 'delete': - function_sql = ''' - CREATE OR REPLACE FUNCTION {schema}.notify_{table}_{action}() - RETURNS trigger AS $$ - DECLARE - new_row_from_view {schema}.{view_for_row}%ROWTYPE; - BEGIN - select * into new_row_from_view from {schema}.{view_for_row} where id = {value}.id LIMIT 1; - PERFORM pg_notify(CAST('{table}_{action}' AS text), row_to_json(new_row_from_view)::text); - RETURN {value}; - END; - $$ LANGUAGE plpgsql; - '''.format(schema=schema, - table=table, - action=item[0], - value=item[1], - view_for_row=view_for_row) - else: - function_sql = ''' - CREATE OR REPLACE FUNCTION {schema}.notify_{table}_{action}() - RETURNS trigger AS $$ - BEGIN - PERFORM pg_notify(CAST('{table}_{action}' AS text), row_to_json({value})::text); - RETURN {value}; - END; - $$ LANGUAGE plpgsql; - '''.format(schema=schema, - table=table, - action=item[0], - value=item[1]) - - trigger_sql = ''' - DROP TRIGGER IF EXISTS trigger_notify_{table}_{action} ON {schema}.{table}; - - CREATE TRIGGER trigger_notify_{table}_{action} - AFTER {action} ON {schema}.{table} - FOR EACH ROW - EXECUTE PROCEDURE {schema}.notify_{table}_{action}(); - '''.format(schema=schema, - table=table, - action=item[0], - value=item[1]) - - sql = function_sql + trigger_sql - self.cursor.execute(sql) - def isListening(self): '''Are we listening? Has the listener been started?''' with self.__lock: diff --git a/LCS/PyCommon/util.py b/LCS/PyCommon/util.py index 4ff3eac627c3fb2f5726a3f49d6e6265bc5ee1e7..f6f0847ab259ffda78fa23981ce16160e5b6585a 100644 --- a/LCS/PyCommon/util.py +++ b/LCS/PyCommon/util.py @@ -137,3 +137,22 @@ def humanreadablesize(num, suffix='B', base=1000): except TypeError: return str(num) +def convertIntKeysToString(dct): + '''recursively convert all int keys in a dict to string''' + + #python2.7 using dict comprehension + #return {str(k): convertIntKeysToString(v) if isinstance(v, dict) else v for k,v in dct.items()} + + #python2.6 using dict constructor and list comprehension + return dict((str(k), convertIntKeysToString(v) if isinstance(v, dict) else v) for k,v in dct.items()) + +def convertStringDigitKeysToInt(dct): + '''recursively convert all string keys which are a digit in a dict to int''' + #python2.7 using dict comprehension + #return {int(k) if isinstance(k, basestring) and k.isdigit() else k : convertStringDigitKeysToInt(v) if isinstance(v, dict) else v for k,v in dct.items()} + + #python2.6 using dict constructor and list comprehension + return dict((int(k) if isinstance(k, basestring) and k.isdigit() else k, convertStringDigitKeysToInt(v) if isinstance(v, dict) else v) for k,v in dct.items()) + +def to_csv_string(values): + return ','.join(str(x) for x in values) diff --git a/LTA/LTAIngest/doc/LTA-SIP.xsd b/LTA/LTAIngest/doc/LTA-SIP.xsd index 993aed9c258c1b4d8b6e662d266cf218b03b45b4..6a8a3b2ec69efa363a0ce520bb1a991c70064943 100644 --- a/LTA/LTAIngest/doc/LTA-SIP.xsd +++ b/LTA/LTAIngest/doc/LTA-SIP.xsd @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<xs:schema targetNamespace="http://www.astron.nl/SIP-Lofar" version="2.6.0" xmlns="http://www.astron.nl/SIP-Lofar" xmlns:xs="http://www.w3.org/2001/XMLSchema"> +<xs:schema targetNamespace="http://www.astron.nl/SIP-Lofar" version="2.6.1" xmlns="http://www.astron.nl/SIP-Lofar" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:annotation> <xs:documentation> XML Schema for data model Submission Information Package LOFAR Long Term Archive @@ -121,6 +121,7 @@ <xs:enumeration value="B1950"/> <xs:enumeration value="J2000"/> <xs:enumeration value="SUN"/> + <xs:enumeration value="JUPITER"/> </xs:restriction> </xs:simpleType> <xs:annotation> diff --git a/RTCP/Cobalt/GPUProc/src/scripts/cobalt_functions.sh b/RTCP/Cobalt/GPUProc/src/scripts/cobalt_functions.sh index 06c46236025c66c0dae08b1fba7bbdbdb2612d02..301a14087ab925df3f35217a5c3bd52d17911112 100755 --- a/RTCP/Cobalt/GPUProc/src/scripts/cobalt_functions.sh +++ b/RTCP/Cobalt/GPUProc/src/scripts/cobalt_functions.sh @@ -36,14 +36,24 @@ function setkey { echo "$KEY = $VAL" >> "$PARSET" } +COBALT_DATAPRODUCTS="Correlated CoherentStokes IncoherentStokes" + function read_cluster_model { - CLUSTER_NAME=$(getkey Observation.Cluster.ProcessingCluster.clusterName "") + # HACK: Search for first cluster, and assume they're all the same. We support only output + # to a single cluster for now. + for DP in ${COBALT_DATAPRODUCTS}; do + CLUSTER_NAME=$(getkey Observation.DataProducts.Output_${DP}.storageClusterName "") + if [ -n "${CLUSTER_NAME}" ]; then + break + fi + done # Hack to derive required properties (cluster model) from cluster name. case "${CLUSTER_NAME}" in CEP4) HEADNODE=head01.cep4.control.lofar - COMPUTENODES="`seq -f "cpu%02.0f.cep4" 1 50`" + #COMPUTENODES="`seq -f "cpu%02.0f.cep4" 1 50`" + COMPUTENODES="`seq -f "cpu%02.0f.cep4" 1 26` `seq -f "cpu%02.0f.cep4" 30 35` `seq -f "cpu%02.0f.cep4" 37 39`" NRCOMPUTENODES=50 GLOBALFS_DIR=/data diff --git a/RTCP/Cobalt/OutputProc/src/OutputThread.cc b/RTCP/Cobalt/OutputProc/src/OutputThread.cc index 5e0237bd2e76ea147429b25190914c4fa370be8c..e972dfdc5ac9e658b957092c23c0fd19fd15fafd 100644 --- a/RTCP/Cobalt/OutputProc/src/OutputThread.cc +++ b/RTCP/Cobalt/OutputProc/src/OutputThread.cc @@ -164,12 +164,14 @@ namespace LOFAR template<typename T> void OutputThread<T>::init() { try { - // fini the data product ASSERT(itsWriter.get()); itsWriter->init(); } catch (Exception &ex) { LOG_ERROR_STR(itsLogPrefix << "Could not create meta data: " << ex); + + if (!itsParset.settings.realTime) + THROW(StorageException, ex); } } @@ -183,6 +185,9 @@ namespace LOFAR itsWriter->fini(finalMetaData); } catch (Exception &ex) { LOG_ERROR_STR(itsLogPrefix << "Could not add final meta data: " << ex); + + if (!itsParset.settings.realTime) + THROW(StorageException, ex); } } @@ -266,7 +271,7 @@ namespace LOFAR catch (Exception &ex) { LOG_ERROR_STR(itsLogPrefix << "Cannot open " << path << ": " << ex); - if ( !itsParset.settings.realTime) + if (!itsParset.settings.realTime) THROW(StorageException, ex); itsWriter = new MSWriterNull(itsParset); diff --git a/RTCP/Cobalt/OutputProc/test/tOutputThread.cc b/RTCP/Cobalt/OutputProc/test/tOutputThread.cc index f44b73fb31767571ba7366ced5fb674953f77b81..92cdcbc4b9a4d7ee31ea25c360c74194ef61c2c4 100644 --- a/RTCP/Cobalt/OutputProc/test/tOutputThread.cc +++ b/RTCP/Cobalt/OutputProc/test/tOutputThread.cc @@ -67,20 +67,26 @@ TEST(testCorrelatorOutputThreadThrowsStorageException) Pool<StreamableData> outputPool("testCorrelatorOutputThreadThrowsStorageException::outputPool", true); MACIO::RTmetadata rtmd(12345, "", ""); + bool caught = false; + try { SubbandOutputThread SubbandOutputThread(par, (unsigned) 0, outputPool, rtmd, "rtmd key prefix", "Log prefix", "./"); SubbandOutputThread.createMS(); + SubbandOutputThread.init(); } catch (StorageException &ex) // Catch the correct exception { cout << "Got the correct exception. " << endl; cout << ex.what() << endl; + caught = true; + } - //else Let the exception fall tru + + ASSERT(caught); cout << "Success" << endl; } @@ -150,9 +156,7 @@ TEST(testCorrelatorOutputThreadRealtimeThrowsNoException) (unsigned)0, outputPool, rtmd, "rtmd key prefix", "Log prefix", "./"); SubbandOutputThread.createMS(); - - // ensure null writer - ASSERT( (dynamic_cast<MSWriterNull*> (SubbandOutputThread.getMSWriter()) != 0)); + SubbandOutputThread.init(); cout << "Success" << endl; } @@ -194,19 +198,25 @@ TEST(testBeamformerOutputThreadThrowsStorageException) Pool<StreamableData> outputPool("testBeamformerOutputThreadThrowsStorageException::outputPool", true); MACIO::RTmetadata rtmd(12345, "", ""); + bool caught = false; + try { SubbandOutputThread SubbandOutputThread(par, (unsigned)0, outputPool, rtmd, "rtmd key prefix", "Log prefix", "./"); SubbandOutputThread.createMS(); + SubbandOutputThread.init(); } catch (StorageException &ex) // Catch the correct exception { cout << "Got the correct exception. " << endl; cout << ex.what() << endl; + + caught = true; } - //else Let the exception fall tru + + ASSERT(caught); cout << "Success" << endl; } @@ -280,9 +290,7 @@ TEST(testBeamformerOutputThreadRealtimeThrowsNoException) (unsigned)0, outputPool, rtmd, "rtmd key prefix", "Log prefix", "/NonExisting"); BeamOutputThread.createMS(); - - //// ensure null writer - ASSERT((dynamic_cast<MSWriterNull*> (BeamOutputThread.getMSWriter()) != 0)); + BeamOutputThread.init(); cout << "Success" << endl; } diff --git a/SAS/MoM/MoMQueryService/config.py b/SAS/MoM/MoMQueryService/config.py index e199990efd6878ddbf379c4eeb143b280841e33d..ebd3d6287dd1c5fd37a8dd0de7a6968d67820e7a 100644 --- a/SAS/MoM/MoMQueryService/config.py +++ b/SAS/MoM/MoMQueryService/config.py @@ -1,23 +1,5 @@ #!/usr/bin/python # $Id$ -from os import stat, path, chmod -import logging - -logger = logging.getLogger(__name__) - -# make sure config.py is mode 600 to hide passwords -if oct(stat(path.realpath(__file__)).st_mode & 0777) != '0600': - logger.info('Changing permissions of config.py to 600') - try: - chmod(__file__, 0600) - except Exception as e: - print 'Error: Could not change permissions on config.py: ' + str(e) - exit(-1) - -# do not commit passwd in svn -# this file should have permissions 600 -momreadonly_passwd='daub673(ming' - DEFAULT_BUSNAME = 'lofar.ra.command' DEFAULT_SERVICENAME = 'momqueryservice' diff --git a/SAS/MoM/MoMQueryService/momqueryrpc.py b/SAS/MoM/MoMQueryService/momqueryrpc.py index 29fafa5abd6a4616788dc58ff2a366752f9076ab..e517ac02d61e3709be174147bc986bc663e601f7 100644 --- a/SAS/MoM/MoMQueryService/momqueryrpc.py +++ b/SAS/MoM/MoMQueryService/momqueryrpc.py @@ -3,7 +3,7 @@ import sys import logging from optparse import OptionParser -from lofar.messaging.RPC import RPC, RPCException +from lofar.messaging.RPC import RPC, RPCException, RPCWrapper from lofar.mom.momqueryservice.config import DEFAULT_BUSNAME, DEFAULT_SERVICENAME ''' Simple RPC client for Service momqueryservice @@ -12,56 +12,7 @@ from lofar.mom.momqueryservice.config import DEFAULT_BUSNAME, DEFAULT_SERVICENAM logger = logging.getLogger(__file__) -class MoMRPC: - def __init__(self, busname=DEFAULT_BUSNAME, - servicename=DEFAULT_SERVICENAME, - broker=None): - self.busname = busname - self.servicename = servicename - self.broker = broker - - self._serviceRPCs = {} #cache of rpc's for each service - - def __enter__(self): - """ - Internal use only. (handles scope 'with') - """ - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - """ - Internal use only. (handles scope 'with') - """ - for rpc in self._serviceRPCs.values(): - rpc.__exit__(exc_type, exc_val, exc_tb) - - def _rpc(self, method, timeout=10, **kwargs): - try: - rpckwargs = {'timeout': timeout} - service_method = self.servicename + '.' + method - - if service_method not in self._serviceRPCs: - rpc = RPC(service_method, busname=self.busname, broker=self.broker, ForwardExceptions=True, **rpckwargs) - rpc.__enter__() - self._serviceRPCs[service_method] = rpc #store rpc in cache for reuse - - rpc = self._serviceRPCs[service_method] - - if kwargs: - res, status = rpc(**kwargs) - else: - res, status = rpc() - - if status != 'OK': - logger.error('status: %s' % status) - logger.error('result: %s' % res) - raise Exception("%s %s" % (status, res)) - - return res - except RPCException as e: - logger.error(str(e)) - raise - +class MoMRPC(RPCWrapper): def getProjectDetails(self, ids): '''get the project details for one or more mom ids :param ids single or list of mom ids @@ -72,13 +23,13 @@ class MoMRPC: ids_string = ', '.join(ids) logger.info("Requesting details for: %s" % (str(ids_string))) - return self._rpc('GetProjectDetails', mom_ids=ids_string) + return self.rpc('GetProjectDetails', mom_ids=ids_string) def getProjects(self): '''get all projects :rtype dict with all projects''' logger.info("Requesting all projects") - projects = self._rpc('GetProjects') + projects = self.rpc('GetProjects') for project in projects: project['statustime'] = project['statustime'].datetime() diff --git a/SAS/MoM/MoMQueryService/momqueryservice.ini b/SAS/MoM/MoMQueryService/momqueryservice.ini index 46e75c1c7d68ef9b61eae94ea4ec18d33e06b2d5..a73dfacdcae47f7776ac9e232453191769b8f36d 100644 --- a/SAS/MoM/MoMQueryService/momqueryservice.ini +++ b/SAS/MoM/MoMQueryService/momqueryservice.ini @@ -1,5 +1,5 @@ [program:momqueryservice] -command=/bin/bash -c 'source $LOFARROOT/lofarinit.sh;momqueryservice --busname=lofar.ra.command --servicename=momqueryservice' +command=/bin/bash -c 'source $LOFARROOT/lofarinit.sh;momqueryservice' user=lofarsys stopsignal=INT ; KeyboardInterrupt stopasgroup=true ; bash does not propagate signals diff --git a/SAS/MoM/MoMQueryService/momqueryservice.py b/SAS/MoM/MoMQueryService/momqueryservice.py index 3ea294d3fc00176b116429e926993096189eebca..d7d541d5c27da11083f5e0186e43c9464b255d0c 100755 --- a/SAS/MoM/MoMQueryService/momqueryservice.py +++ b/SAS/MoM/MoMQueryService/momqueryservice.py @@ -21,12 +21,15 @@ with RPC(busname, 'GetProjectDetails') as getProjectDetails: from os import stat import sys import logging +import time from optparse import OptionParser from mysql import connector +from mysql.connector.errors import OperationalError from lofar.messaging import Service from lofar.messaging.Service import MessageHandlerInterface from lofar.common.util import waitForInterrupt from lofar.mom.momqueryservice.config import DEFAULT_BUSNAME, DEFAULT_SERVICENAME +from lofar.common import dbcredentials logger=logging.getLogger(__file__) @@ -54,11 +57,58 @@ def _isListOfInts(items): class MoMDatabaseWrapper: '''handler class for details query in mom db''' - def __init__(self, passwd): - self.conn = connector.connect(host="mysql1.control.lofar", - user="momreadonly", - passwd=passwd, - database="lofar_mom3") + def __init__(self, dbcreds): + self.dbcreds = dbcreds + self.conn = None + + def _connect(self): + connect_options = self.dbcreds.mysql_connect_options() + connect_options['connection_timeout'] = 5 + try: + logger.info("Connecting to %s" % self.dbcreds.stringWithHiddenPassword()) + self.conn = connector.connect(**connect_options) + logger.info("Connected to %s" % self.dbcreds.stringWithHiddenPassword()) + except Exception as e: + logger.error(str(e)) + self.conn = None + + def ensureConnection(self): + if not self.conn: + self._connect() + + try: + # try a simple select + # if it fails, reconnect + cursor = self.conn.cursor() + cursor.execute('''SELECT id FROM project;''') + if len(cursor.fetchall()) == 0: + logger.warning('unexpected answer while checking connection. reconnecting in 1 sec...') + time.sleep(1) + self._connect() + except (OperationalError, AttributeError) as e: + if isinstance(e, OperationalError): + logger.error(str(e)) + for i in range(5): + logger.info("retrying to connect to mom database") + self._connect() + if self.conn: + logger.info("connected to mom database") + break + time.sleep(i*i) + + def _executeQuery(self, query): + def doQuery(connection): + cursor = connection.cursor(dictionary=True) + cursor.execute(query) + return cursor.fetchall() + + try: + return doQuery(self.conn) + except (OperationalError, AttributeError) as e: + if isinstance(e, OperationalError): + logger.error(str(e)) + self.ensureConnection() + return doQuery(self.conn) def getProjectDetails(self, mom_ids): ''' get the project details (project_mom2id, project_name, @@ -67,37 +117,31 @@ class MoMDatabaseWrapper: :param mixed mom_ids comma seperated string of mom2object id's, or list of ints :rtype list of dict's key value pairs with the project details ''' + if not mom_ids: + return {} if _isListOfInts(mom_ids): ids = mom_ids else: ids = _idsFromString(mom_ids) - logger.info(mom_ids) - logger.info(ids) - if not ids: raise ValueError("Could not find proper ids in: " + mom_ids) ids_str = ','.join([str(id) for id in ids]) - logger.info(ids_str) - logger.info("Query for mom id%s: %s" % ('\'s' if len(ids) > 1 else '', ids_str)) - cursor = self.conn.cursor(dictionary=True) # TODO: make a view for this query in momdb! - query = '''SELECT project.mom2id as project_mom2id, project.name as project_name, project.description as project_description, - object.mom2id as object_mom2id, object.name as object_name, object.description as object_description, object.mom2objecttype as object_type, object.group_id as object_group_id - FROM lofar_mom3.mom2object as object - inner join lofar_mom3.mom2object as project on project.id = object.ownerprojectid + query = '''SELECT project.mom2id as project_mom2id, project.id as project_mom2objectid, project.name as project_name, project.description as project_description, + object.mom2id as object_mom2id, object.id as object_mom2objectid, object.name as object_name, object.description as object_description, object.mom2objecttype as object_type, object.group_id as object_group_id + FROM mom2object as object + left join mom2object as project on project.id = object.ownerprojectid where object.mom2id in (%s) order by project_mom2id ''' % (ids_str,) - cursor.execute(query) - - rows = cursor.fetchall() + rows = self._executeQuery(query) logger.info("Found %d results for mom id%s: %s" % (len(rows), '\'s' if len(ids) > 1 else '', ids_str)) @@ -107,6 +151,8 @@ class MoMDatabaseWrapper: object_mom2id = row['object_mom2id'] result[str(object_mom2id)] = dict(row) + logger.info(result) + return result def getProjects(self): @@ -115,20 +161,17 @@ class MoMDatabaseWrapper: last_user_name, statustime) :rtype list of dict's key value pairs with all projects ''' - cursor = self.conn.cursor(dictionary=True) # TODO: make a view for this query in momdb! query = '''SELECT project.mom2id as mom2id, project.name as name, project.description as description, - lofar_mom3.statustype.code as status_name, lofar_mom3.statustype.id as status_id, - lofar_mom3.status.userid as last_user_id, lofar_mom3.status.name as last_user_name, lofar_mom3.status.statustime as statustime - FROM lofar_mom3.mom2object as project - left join lofar_mom3.mom2objectstatus as status on project.currentstatusid = status.id - left join lofar_mom3.status as statustype on status.statusid=statustype.id + statustype.code as status_name, statustype.id as status_id, + status.userid as last_user_id, status.name as last_user_name, status.statustime as statustime + FROM mom2object as project + left join mom2objectstatus as status on project.currentstatusid = status.id + left join status as statustype on status.statusid=statustype.id where project.mom2objecttype='PROJECT' order by mom2id; ''' - cursor.execute(query) - - return cursor.fetchall() + return self._executeQuery(query) class ProjectDetailsQueryHandler(MessageHandlerInterface): @@ -136,8 +179,8 @@ class ProjectDetailsQueryHandler(MessageHandlerInterface): :param MoMDatabaseWrapper momdb inject database access via wrapper ''' def __init__(self, **kwargs): - MessageHandlerInterface.__init__(self, **kwargs) - self.momreadonly_passwd = kwargs.pop("momreadonly_passwd", '') + super(ProjectDetailsQueryHandler, self).__init__(**kwargs) + self.dbcreds = kwargs.pop("dbcreds", None) self.service2MethodMap = { 'GetProjects': self.getProjects, @@ -145,12 +188,13 @@ class ProjectDetailsQueryHandler(MessageHandlerInterface): } def prepare_loop(self): - self.momdb = MoMDatabaseWrapper(self.momreadonly_passwd) + self.momdb = MoMDatabaseWrapper(self.dbcreds) def getProjectDetails(self, mom_ids): - logger.info(mom_ids) + if not mom_ids: + return {} + ids = _idsFromString(mom_ids) - logger.info(ids) if not _isListOfInts(ids): raise ValueError("%s is not a proper list of ints" % str(mom_ids)) return self.momdb.getProjectDetails(ids) @@ -160,12 +204,13 @@ class ProjectDetailsQueryHandler(MessageHandlerInterface): def createService(busname=DEFAULT_BUSNAME, servicename=DEFAULT_SERVICENAME, - momreadonly_passwd='', - handler=None): + dbcreds=None, + handler=None, + broker=None): '''create the GetProjectDetails on given busname :param string busname: name of the bus on which this service listens :param string servicename: name of the service - :param string momreadonly_passwd: the momreadonly passwd. + :param Credentials dbcreds: Credentials for the MoM database. :param ProjectDetailsQueryHandler handler: ProjectDetailsQueryHandler class Type, or mock like type :rtype: lofar.messaging.Service''' @@ -175,29 +220,33 @@ def createService(busname=DEFAULT_BUSNAME, return Service(servicename, handler, busname=busname, - numthreads=1, + numthreads=2, use_service_methods=True, verbose=False, - handler_args={'momreadonly_passwd':momreadonly_passwd}) + broker=broker, + handler_args={'dbcreds' : dbcreds}) -def main(busname=DEFAULT_BUSNAME, - servicename=DEFAULT_SERVICENAME, - momreadonly_passwd=None): +def main(): '''Starts the momqueryservice.GetProjectDetails service''' - if not momreadonly_passwd: - from lofar.mom.momqueryservice.config import momreadonly_passwd - # Check the invocation arguments parser = OptionParser("%prog [options]", description='runs the momqueryservice') - parser.add_option("-b", "--busname", dest="busname", type="string", default=busname, help="Name of the bus exchange on the qpid broker, default: %s" % busname) - parser.add_option("-s", "--servicename", dest="servicename", type="string", default=servicename, help="Name for this service, default: %s" % servicename) + parser.add_option('-q', '--broker', dest='broker', type='string', default=None, help='Address of the qpid broker, default: localhost') + parser.add_option("-b", "--busname", dest="busname", type="string", default=DEFAULT_BUSNAME, help="Name of the bus exchange on the qpid broker, [default: %default]") + parser.add_option("-s", "--servicename", dest="servicename", type="string", default=DEFAULT_SERVICENAME, help="Name for this service, [default: %default]") + parser.add_option_group(dbcredentials.options_group(parser)) + parser.set_defaults(dbcredentials="MoM") (options, args) = parser.parse_args() + dbcreds = dbcredentials.parse_options(options) + # start the service and listen. - with createService(busname=options.busname, servicename=options.servicename, momreadonly_passwd=momreadonly_passwd): + with createService(busname=options.busname, + servicename=options.servicename, + broker=options.broker, + dbcreds=dbcreds): waitForInterrupt() if __name__ == '__main__': diff --git a/SAS/OTB/OTB-distribution/pom.xml b/SAS/OTB/OTB-distribution/pom.xml index c3dc9a40ce48e5a58719cb1f813e54e4019b5c2d..ebe9c064b94fbe55edae7f7d84a0555c45249e0a 100644 --- a/SAS/OTB/OTB-distribution/pom.xml +++ b/SAS/OTB/OTB-distribution/pom.xml @@ -10,11 +10,11 @@ <parent> <groupId>nl.astron.lofar.sas.otb</groupId> <artifactId>otb-parent</artifactId> - <version>2.9.1-SNAPSHOT</version> + <version>2.16.3-SNAPSHOT</version> </parent> <artifactId>OTB-distribution</artifactId> - <version>2.9.1-SNAPSHOT</version> + <version>2.16.3-SNAPSHOT</version> <packaging>pom</packaging> diff --git a/SAS/OTB/OTB/dist-src/showOTB b/SAS/OTB/OTB/dist-src/showOTB deleted file mode 100755 index d586fa6384b7e0f90647933e6a3ec86c76f29dd0..0000000000000000000000000000000000000000 --- a/SAS/OTB/OTB/dist-src/showOTB +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash -# -# Shop running OTB clients -# -# Usage: showOTB -# -# Author: A.P. Schoenmakers -# - - -echo "Finding OTB clients:" - -user_ports=( `ps -eaf | grep "otb\/client\/" | grep java | awk '{print $1":"$2":"$(NF-4)}'` ) - -if [ "$user_ports" == "" ]; then - echo "No OTB clients running" - exit -fi - -for user_port in "${user_ports[@]}" - do - user=`echo $user_port | awk -F: '{print $1}'` - pid=`echo $user_port | awk -F: '{print $2}'` - port=`echo $user_port | awk -F: '{print $3}'` - echo "Found client using port $port started by user $user with PID $pid" - done - - - diff --git a/SAS/OTB/OTB/dist-src/startOTB b/SAS/OTB/OTB/dist-src/startOTB deleted file mode 100755 index 6ac8b87441cb53c0ae17e2ba8e06dd3a70b69b60..0000000000000000000000000000000000000000 --- a/SAS/OTB/OTB/dist-src/startOTB +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/sh - -# Check if portnumber is added to commandline; if yes, use it. -if [ -z $1 ]; then - port1=12500 -else - port1=$1 -fi -echo "Using port $port1 for this client" - -export OTB_DIR=/opt/sas/otb/client -export JAVA_HOME=/usr/java/jdk1.7.0_02 - -echo -echo --- Starting OTB Client --- - -otbfile=`ls $OTB_DIR/OTB*.jar | grep -v javadoc | grep -v sources` -export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$OTB_DIR -export OTB_APP=$OTB_DIR/`basename $otbfile` -export CLASSPATH=$OTB_APP - -for JAR_DEPENDENCY in $OTB_DIR/lib/*.jar -do - echo -- Adding dependency to CLASSPATH: `basename $JAR_DEPENDENCY` - export CLASSPATH=$CLASSPATH:$JAR_DEPENDENCY -done - -echo Starting up ... -curdate=`date +%Y%m%dT%H%M%S` -logfile="/localhome/log/OTBClient_${port1}_${curdate}.log" -echo "Logging client logs to file $logfile" -$JAVA_HOME/bin/java -cp $CLASSPATH nl.astron.lofar.sas.otb.Main -s sas001 -p $port1 -d LOFAR_4 -u busyman 2>&1 1>$logfile & -clientpid=$! -echo Started OTB client with PID: $clientpid diff --git a/SAS/OTB/OTB/dist-src/stopOTB b/SAS/OTB/OTB/dist-src/stopOTB deleted file mode 100755 index 5cc996ad6f043e965559e930efb584ac67958687..0000000000000000000000000000000000000000 --- a/SAS/OTB/OTB/dist-src/stopOTB +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash -# -# Stop running OTB client -# -# Usage: stopOTBServer [<port>] -# where <port> is the portnumber used by the client (default 12500) -# -# Author: A.P. Schoenmakers - -if [ -z $1 ]; then - port=12500 -else - port=$1 -fi - -echo "Finding clients using port $port" - -client_users=( `ps -eaf | grep "otb\/client\/" | grep java | grep $port | awk '{print $1}'` ) -client_pids=( `ps -eaf | grep "otb\/client\/" | grep java | grep $port| awk '{print $2}'` ) - -if [ ${#client_users[@]} == 0 ]; then - echo "No OTB clients running that use port $port" - exit -else - for client_pid in ${client_pids[@]} - do - echo "Found OTB with PID $client_pid; killing it now" - sudo kill $client_pid - done -fi - diff --git a/SAS/OTB/OTB/pom.xml b/SAS/OTB/OTB/pom.xml index b6a58e006a86e854c52f752dad1c396811015615..d91db1fbc704a15c3e785c58400b697d450c34a9 100644 --- a/SAS/OTB/OTB/pom.xml +++ b/SAS/OTB/OTB/pom.xml @@ -10,7 +10,7 @@ <parent> <groupId>nl.astron.lofar.sas.otb</groupId> <artifactId>otb-parent</artifactId> - <version>2.9.1-SNAPSHOT</version> + <version>2.16.3-SNAPSHOT</version> </parent> <artifactId>OTB</artifactId> diff --git a/SAS/OTB/RSP/pom.xml b/SAS/OTB/RSP/pom.xml index 6c2785cd6d13d168be4ad8c5125ea21bf9fb52ff..70d3dca4946e8f0a15206b3def9e830a338a7eaf 100644 --- a/SAS/OTB/RSP/pom.xml +++ b/SAS/OTB/RSP/pom.xml @@ -9,7 +9,7 @@ <parent> <groupId>nl.astron.lofar.sas.otb</groupId> <artifactId>otb-parent</artifactId> - <version>2.9.1-SNAPSHOT</version> + <version>2.16.3-SNAPSHOT</version> </parent> <artifactId>RSP</artifactId> diff --git a/SAS/OTB/jOTDB3/dist-src/showServerOTB b/SAS/OTB/jOTDB3/dist-src/showServerOTB deleted file mode 100755 index c9397d90c27d187b9c9e969147601b202d0ad259..0000000000000000000000000000000000000000 --- a/SAS/OTB/jOTDB3/dist-src/showServerOTB +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash -# -# Shop running OTB servers -# -# Usage: showServerOTB -# -# Author: A.P. Schoenmakers -# - - -echo "Finding OTB servers:" - -user_ports=( `ps -eaf | grep server | grep java | awk '{print $1":"$2":"$NF-1}'` ) - -if [ "$user_ports" == "" ]; then - echo "No such servers running" - exit -fi - -for user_port in "${user_ports[@]}" - do - user=`echo $user_port | awk -F: '{print $1}'` - pid=`echo $user_port | awk -F: '{print $2}'` - port=`echo $user_port | awk -F: '{print $3}'` - echo "Found server using port $port started by user $user with PID $pid" - done - - - diff --git a/SAS/OTB/jOTDB3/dist-src/startServerOTB b/SAS/OTB/jOTDB3/dist-src/startServerOTB deleted file mode 100755 index 04bdc0c92e9db28720e78e51e2e0fd66345b60ec..0000000000000000000000000000000000000000 --- a/SAS/OTB/jOTDB3/dist-src/startServerOTB +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/sh -# -# Script to start OTB server. Default port is 12500, another portnumber -# can be provided on the commandline, e.g. -# -# startServerOTB 12600 -# - -# Check if portnumber is added to commandline; if yes, use it. -if [ -z $1 ]; then - port1=12500 - port2=12501 -else - port1=$1 - let port2=port1+1 -fi -echo "Using port $port1 and $port2 for this server" - -export OTB_DIR=/opt/sas/otb/server -export JAVA_HOME=/usr/java/jdk1.7.0_02 - -echo -echo --- Starting OTB Server --- - -# Prevent javadoc and source jar files to play a role -jotdb3file=`ls $OTB_DIR/jOTDB3*.jar | grep -v javadoc | grep -v sources` -export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$OTB_DIR -export OTB_APP=$OTB_DIR/`basename $jotdb3file` -export CLASSPATH=$OTB_APP - -for JAR_DEPENDENCY in $OTB_DIR/lib/*.jar -do - echo -- Adding dependency to CLASSPATH: `basename $JAR_DEPENDENCY` - export CLASSPATH=$CLASSPATH:$JAR_DEPENDENCY -done - -echo Starting up ... - -curdate=`date +%Y%m%dT%H%M%S` -logfile="/localhome/log/OTBServer_${port1}_${curdate}.log" -echo "Logging serverlogs to file $logfile" -serverpid=0 -# Find out if other server running already (with same port) -ps -ef | grep -v grep | grep java | grep server | grep $port1 2>&1 1>/dev/null -if [ $? -ne 0 ]; then - $JAVA_HOME/bin/java -cp $CLASSPATH nl.astron.lofar.sas.otb.jotdb3.jOTDBserver -s sas001 -d sasdb -p $port1 -o $port2 2>&1 1>&$logfile & - serverpid=$! - echo Started server with PID: $serverpid -else - echo "Server for port $port1 already running!" -fi diff --git a/SAS/OTB/jOTDB3/dist-src/stopServerOTB b/SAS/OTB/jOTDB3/dist-src/stopServerOTB deleted file mode 100755 index e42d76fc353328d1fa708128c7549f28de1a67cb..0000000000000000000000000000000000000000 --- a/SAS/OTB/jOTDB3/dist-src/stopServerOTB +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash -# -# Stop running OTB server -# -# Usage: stopOTBServer [<port>] -# where is the portnumber used by the server (default 12500) -# -# Author: A.P. Schoenmakers - -if [ -z $1 ]; then - port=12500 -else - port=$1 -fi - -echo "Finding server using port $port" - -user_port=`ps -eaf | grep server | grep java | grep $port | awk '{print $1,$2}'` - -if [ "$user_port" == "" ]; then - echo "No such server running" - exit -else - user=`echo $user_port | awk '{print $1}'` - pid=`echo $user_port | awk '{print $2}'` - echo "Found server running by user $user with PID $pid; killing it now" - if [ "$user" == "lofarsys" ]; then - kill $pid - else - sudo -u $user kill $pid - fi -fi - - diff --git a/SAS/OTB/jOTDB3/pom.xml b/SAS/OTB/jOTDB3/pom.xml index 8cd1743d6c845f192c73e33ce6becd06e7b7805a..ca1161e555c0c75d50cde8ebba62582635000691 100644 --- a/SAS/OTB/jOTDB3/pom.xml +++ b/SAS/OTB/jOTDB3/pom.xml @@ -10,7 +10,7 @@ <parent> <groupId>nl.astron.lofar.sas.otb</groupId> <artifactId>otb-parent</artifactId> - <version>2.9.1-SNAPSHOT</version> + <version>2.16.3-SNAPSHOT</version> </parent> <artifactId>jOTDB3</artifactId> diff --git a/SAS/OTB/jParmFacade/pom.xml b/SAS/OTB/jParmFacade/pom.xml index 20b4ebf0713108e05331c206d61bc55e85310931..4bb7b4529b43bd9956f8f0cd31f757a8f3b3254b 100644 --- a/SAS/OTB/jParmFacade/pom.xml +++ b/SAS/OTB/jParmFacade/pom.xml @@ -10,7 +10,7 @@ <parent> <groupId>nl.astron.lofar.sas.otb</groupId> <artifactId>otb-parent</artifactId> - <version>2.9.1-SNAPSHOT</version> + <version>2.16.3-SNAPSHOT</version> </parent> <artifactId>jParmFacade</artifactId> diff --git a/SAS/OTB/jRSP/pom.xml b/SAS/OTB/jRSP/pom.xml index c89ab3b1c1e5074a9d39ea92b4bf229dc9a09877..5ae33df0f9546cc8b5d2732b887b7abfd891c576 100644 --- a/SAS/OTB/jRSP/pom.xml +++ b/SAS/OTB/jRSP/pom.xml @@ -9,7 +9,7 @@ <parent> <groupId>nl.astron.lofar.sas.otb</groupId> <artifactId>otb-parent</artifactId> - <version>2.9.1-SNAPSHOT</version> + <version>2.16.3-SNAPSHOT</version> </parent> <artifactId>jRSP</artifactId> diff --git a/SAS/OTB/pom.xml b/SAS/OTB/pom.xml index 9bdbf08c4835636c7fcb70d773c84de285270cb1..7b9e5e7bedc8df8a23061731a35e078b8dff0141 100644 --- a/SAS/OTB/pom.xml +++ b/SAS/OTB/pom.xml @@ -15,7 +15,7 @@ <groupId>nl.astron.lofar.sas.otb</groupId> <artifactId>otb-parent</artifactId> - <version>2.9.1-SNAPSHOT</version> + <version>2.16.3-SNAPSHOT</version> <packaging>pom</packaging> @@ -145,7 +145,7 @@ <dependency> <groupId>${project.groupId}</groupId> <artifactId>OTB-distribution</artifactId> - <version>2.9.1-SNAPSHOT</version> + <version>2.16.3-SNAPSHOT</version> </dependency> <!-- Import the group 'nl.astron.lofar.lib' --> diff --git a/SAS/OTDB_Services/OTDBBusListener.py b/SAS/OTDB_Services/OTDBBusListener.py index 75854d5bf9d25a64a60b3485aee0cc6e63f03e86..d699cf878a5119471812c357f12396c1e25a3bcb 100644 --- a/SAS/OTDB_Services/OTDBBusListener.py +++ b/SAS/OTDB_Services/OTDBBusListener.py @@ -28,6 +28,7 @@ Typical usage is to derive your own subclass from OTDBBusListener and implement """ from lofar.messaging.messagebus import AbstractBusListener +from lofar.sas.otdb.config import DEFAULT_OTDB_NOTIFICATION_BUSNAME, DEFAULT_OTDB_NOTIFICATION_SUBJECT import qpid.messaging import logging @@ -37,7 +38,7 @@ logger = logging.getLogger(__name__) class OTDBBusListener(AbstractBusListener): - def __init__(self, busname='lofar.otdb.notification', subject='otdb.treestatus', broker=None, **kwargs): + def __init__(self, busname=DEFAULT_OTDB_NOTIFICATION_BUSNAME, subject=DEFAULT_OTDB_NOTIFICATION_SUBJECT, broker=None, **kwargs): """ OTDBBusListener listens on the lofar otdb message bus and calls (empty) on<SomeMessage> methods when such a message is received. Typical usage is to derive your own subclass from OTDBBusListener and implement the specific on<SomeMessage> methods that you are interested in. @@ -66,6 +67,8 @@ class OTDBBusListener(AbstractBusListener): except: pass + logger.info("otdb task status changed: otdb_id=%s status=%s" % (treeId, msg.content['state'])) + if msg.content['state'] == 'described': self.onObservationDescribed(treeId, modificationTime) elif msg.content['state'] == 'prepared': diff --git a/SAS/OTDB_Services/TreeService.ini b/SAS/OTDB_Services/TreeService.ini index f8c1658c06ebbc0293e8bf1b0c0ebd701493094d..090d256417c78ebe489d46417657739f082dbbb5 100644 --- a/SAS/OTDB_Services/TreeService.ini +++ b/SAS/OTDB_Services/TreeService.ini @@ -1,7 +1,8 @@ [program:TreeService] -command=/bin/bash -c 'source $LOFARROOT/lofarinit.sh;TreeService.py --dbcredentials=OTDB --busname=lofar.otdb.specification' +command=/bin/bash -c 'source $LOFARROOT/lofarinit.sh;TreeService.py --dbcredentials=OTDB' user=lofarsys stopsignal=INT ; KeyboardInterrupt stopasgroup=true ; bash does not propagate signals stdout_logfile=%(program_name)s.log -stderr_logfile=%(program_name)s.stderr +redirect_stderr=true +stderr_logfile=NONE diff --git a/SAS/OTDB_Services/TreeService.py b/SAS/OTDB_Services/TreeService.py index 686a75a84b6810b7119004887ed640d921107c8b..419667b8d516cb4abdcff9f7f02e377491d3d635 100755 --- a/SAS/OTDB_Services/TreeService.py +++ b/SAS/OTDB_Services/TreeService.py @@ -51,7 +51,7 @@ HARDWARE_TREE = 10 TEMPLATE_TREE = 20 VIC_TREE = 30 -logging.basicConfig(stream=sys.stdout, level=logging.INFO) +logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) logger = logging.getLogger(__name__) # Define our own exceptions @@ -377,19 +377,6 @@ def TaskPrepareForScheduling(input_dict, db_connection): except QUERY_EXCEPTIONS, exc_info: raise FunctionError("TaskPrepareForScheduling: {}".format(exc_info)) - # If task is of the type VItemplate convert it to a VHtree - delete_old_task = False - if task_type == TEMPLATE_TREE: - try: - # create executable task - new_task_id = db_connection.query("select instanciateVHtree(1,{})".format(task_id)).getresult()[0][0] - # get the characteristics - (task_id,task_type,task_state) = db_connection.query("select treeid,type,state from getTreeInfo({},False)"\ - .format(new_task_id)).getresult()[0] - delete_old_task = True - except QUERY_EXCEPTIONS, exc_info: - raise FunctionError("TaskPrepareForScheduling: failed for task {}: {}".format(otdb_id, exc_info)) - # Get list of defines tree states state_names = {} state_nrs = {} @@ -400,12 +387,24 @@ def TaskPrepareForScheduling(input_dict, db_connection): except QUERY_EXCEPTIONS, exc_info: raise FunctionError("Error while getting list of task states for tree {}: {}".format(otdb_id, exc_info)) - # make sure the tree is in the right state - if task_state != state_names['approved']: + # If task is of the type VItemplate convert it to a VHtree + delete_old_task = False + if task_type == TEMPLATE_TREE: try: - db_connection.query("select setTreeState(1,{},{}::INT2,True)".format(task_id, state_names['approved'])) + # create executable task + new_task_id = db_connection.query("select instanciateVHtree(1,{})".format(task_id)).getresult()[0][0] + # get the characteristics + (task_id,task_type,task_state) = db_connection.query("select treeid,type,state from getTreeInfo({},False)"\ + .format(new_task_id)).getresult()[0] + delete_old_task = True except QUERY_EXCEPTIONS, exc_info: - raise FunctionError("Error while setting task {} to 'approved': {}".format(task_id, exc_info)) + raise FunctionError("TaskPrepareForScheduling: failed for task {}: {}".format(otdb_id, exc_info)) + # make sure the tree is in the right state + if task_state != state_names['approved']: + try: + db_connection.query("select setTreeState(1,{},{}::INT2,True)".format(task_id, state_names['approved'])) + except QUERY_EXCEPTIONS, exc_info: + raise FunctionError("Error while setting task {} to 'approved': {}".format(task_id, exc_info)) if delete_old_task: TaskDelete({'OtdbID':otdb_id}, db_connection) @@ -623,15 +622,17 @@ if __name__ == "__main__": from optparse import OptionParser from lofar.common import dbcredentials from lofar.common.util import waitForInterrupt - from lofar.sas.otdb.config import DEFAULT_BUSNAME, DEFAULT_SERVICENAME + from lofar.sas.otdb.config import DEFAULT_OTDB_SERVICE_BUSNAME, DEFAULT_OTDB_SERVICENAME from lofar.messaging import setQpidLogLevel # Check the invocation arguments parser = OptionParser("%prog [options]") - parser.add_option("-B", "--busname", dest="busname", type="string", default=DEFAULT_BUSNAME, - help="Busname or queue-name on which RPC commands are received, default: %s" % DEFAULT_BUSNAME) - parser.add_option("-S", "--servicename", dest="servicename", type="string", default=DEFAULT_SERVICENAME, - help="Name for this service, default: %s" % DEFAULT_SERVICENAME) + parser.add_option("-B", "--busname", dest="busname", type="string", + default=DEFAULT_OTDB_SERVICE_BUSNAME, + help="Busname or queue-name on which RPC commands are received. [default: %default") + parser.add_option("-S", "--servicename", dest="servicename", type="string", + default=DEFAULT_OTDB_SERVICENAME, + help="Name for this service. [default: %default") parser.add_option('-V', '--verbose', dest='verbose', action='store_true', help='verbose logging') # Add options of dbcredentials: --database, --host, ... parser.add_option_group(dbcredentials.options_group(parser)) diff --git a/SAS/OTDB_Services/TreeStatusEvents.ini b/SAS/OTDB_Services/TreeStatusEvents.ini index 0e9a1f8758200f6508cdaa9e51631b274e8b7f6f..b16300df8c78169bd92f28e73e1984172edeba34 100644 --- a/SAS/OTDB_Services/TreeStatusEvents.ini +++ b/SAS/OTDB_Services/TreeStatusEvents.ini @@ -1,7 +1,8 @@ [program:TreeStatusEvents] -command=/bin/bash -c 'source $LOFARROOT/lofarinit.sh;TreeStatusEvents.py --dbcredentials=OTDB --busname lofar.otdb.status' +command=/bin/bash -c 'source $LOFARROOT/lofarinit.sh;TreeStatusEvents.py --dbcredentials=OTDB' user=lofarsys stopsignal=INT ; KeyboardInterrupt stopasgroup=true ; bash does not propagate signals stdout_logfile=%(program_name)s.log -stderr_logfile=%(program_name)s.stderr +redirect_stderr=true +stderr_logfile=NONE diff --git a/SAS/OTDB_Services/TreeStatusEvents.py b/SAS/OTDB_Services/TreeStatusEvents.py index 77ce52df36c0b9a5540151f9c60aae9e4b3bc996..1b896e6048cae512446d5e61ad2a3b63d2c30ad8 100755 --- a/SAS/OTDB_Services/TreeStatusEvents.py +++ b/SAS/OTDB_Services/TreeStatusEvents.py @@ -29,11 +29,12 @@ import os.path import sys, time, pg, datetime import logging from lofar.messaging import EventMessage, ToBus +from lofar.sas.otdb.config import DEFAULT_OTDB_NOTIFICATION_BUSNAME, DEFAULT_OTDB_NOTIFICATION_SUBJECT QUERY_EXCEPTIONS = (TypeError, ValueError, MemoryError, pg.ProgrammingError, pg.InternalError) alive = False -logging.basicConfig(stream=sys.stdout, level=logging.INFO) +logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) logger = logging.getLogger(__name__) # Define our own exceptions @@ -84,18 +85,13 @@ if __name__ == "__main__": # Check the invocation arguments parser = OptionParser("%prog [options]") - parser.add_option("-B", "--busname", dest="busname", type="string", default="", - help="Busname or queue-name the status changes are published on") + parser.add_option("-B", "--busname", dest="busname", type="string", default=DEFAULT_OTDB_NOTIFICATION_BUSNAME, + help="Busname or queue-name the status changes are published on. [default: %default]") parser.add_option_group(dbcredentials.options_group(parser)) (options, args) = parser.parse_args() dbcreds = dbcredentials.parse_options(options) - if not options.busname: - print "Missing busname" - parser.print_help() - sys.exit(1) - # Set signalhandler to stop the program in a neat way. signal.signal(signal.SIGINT, signal_handler) @@ -154,7 +150,7 @@ if __name__ == "__main__": for (treeid, state, modtime, creation) in record_list: content = { "treeID" : treeid, "state" : allowed_states.get(state, "unknown_state"), "time_of_change" : modtime } - msg = EventMessage(context="otdb.treestatus", content=content) + msg = EventMessage(context=DEFAULT_OTDB_NOTIFICATION_SUBJECT, content=content) logger.info("sending message treeid %s state %s modtime %s" % (treeid, allowed_states.get(state, "unknown_state"), modtime)) send_bus.send(msg) diff --git a/SAS/OTDB_Services/config.py b/SAS/OTDB_Services/config.py index 3a73038b67aa96879ffeca0d44d2dd03c0ea0219..4058c16d940f986782f9ef70a4ca58177fa0b35e 100644 --- a/SAS/OTDB_Services/config.py +++ b/SAS/OTDB_Services/config.py @@ -1,5 +1,8 @@ #!/usr/bin/python # $Id$ -DEFAULT_BUSNAME = 'lofar.otdb.specification' -DEFAULT_SERVICENAME = 'OTDBService' +DEFAULT_OTDB_SERVICE_BUSNAME = 'lofar.otdb.command' +DEFAULT_OTDB_SERVICENAME = 'OTDBService' + +DEFAULT_OTDB_NOTIFICATION_BUSNAME='lofar.otdb.notification' +DEFAULT_OTDB_NOTIFICATION_SUBJECT='TaskStatus' diff --git a/SAS/ResourceAssignment/CMakeLists.txt b/SAS/ResourceAssignment/CMakeLists.txt index 96492b983e747d30e9b3ed0cecefa55c246bbb16..6a61bf2d933268085c192b54fecef82d7aeccfe7 100644 --- a/SAS/ResourceAssignment/CMakeLists.txt +++ b/SAS/ResourceAssignment/CMakeLists.txt @@ -1,11 +1,15 @@ # $Id: CMakeLists.txt 32401 2015-09-03 13:41:57Z klijn $ -lofar_add_package(ResourceAssignmentEditor) +lofar_add_package(QPIDInfrastructure) lofar_add_package(RATaskSpecifiedService) -lofar_add_package(ResourceAssignmentService) +lofar_add_package(RAtoOTDBTaskSpecificationPropagator) +lofar_add_package(ResourceAssigner) lofar_add_package(ResourceAssignmentDatabase) +lofar_add_package(ResourceAssignmentEditor) +lofar_add_package(ResourceAssignmentEstimator) +lofar_add_package(ResourceAssignmentService) lofar_add_package(SystemStatusDatabase) lofar_add_package(SystemStatusService) -lofar_add_package(QPIDInfrastructure) +lofar_add_package(OTDBtoRATaskStatusPropagator) diff --git a/SAS/ResourceAssignment/OTDBtoRATaskStatusPropagator/CMakeLists.txt b/SAS/ResourceAssignment/OTDBtoRATaskStatusPropagator/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..1e29bd04eede7cbad861a3afa1cabc7c82359ccb --- /dev/null +++ b/SAS/ResourceAssignment/OTDBtoRATaskStatusPropagator/CMakeLists.txt @@ -0,0 +1,21 @@ +# $Id$ + +lofar_package(OTDBtoRATaskStatusPropagator 1.0 DEPENDS PyMessaging ResourceAssignmentService OTDB_Services) + +lofar_find_package(Python 2.6 REQUIRED) +include(PythonInstall) + +set(_py_files + __init__.py + propagator.py +) + +python_install(${_py_files} DESTINATION lofar/sas/resourceassignment/otdbtorataskstatuspropagator) + +lofar_add_bin_scripts(otdbtorataskstatuspropagator) + +# supervisord config files +install(FILES + otdbtorataskstatuspropagator.ini + DESTINATION etc/supervisord.d) + diff --git a/SAS/ResourceAssignment/OTDBtoRATaskStatusPropagator/__init__.py b/SAS/ResourceAssignment/OTDBtoRATaskStatusPropagator/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..fbbab2d1199b1de168c7f25fb5e7eac727b3d066 --- /dev/null +++ b/SAS/ResourceAssignment/OTDBtoRATaskStatusPropagator/__init__.py @@ -0,0 +1 @@ +# $Id$ diff --git a/SAS/ResourceAssignment/OTDBtoRATaskStatusPropagator/otdbtorataskstatuspropagator b/SAS/ResourceAssignment/OTDBtoRATaskStatusPropagator/otdbtorataskstatuspropagator new file mode 100644 index 0000000000000000000000000000000000000000..cc9e3bfd64b8c2016d684d3b5c4ac5e252fca661 --- /dev/null +++ b/SAS/ResourceAssignment/OTDBtoRATaskStatusPropagator/otdbtorataskstatuspropagator @@ -0,0 +1,10 @@ +#!/usr/bin/python +# $Id: radbservice 33373 2016-01-22 11:01:15Z schaap $ + +''' +runs the otb to radb taskstatus propagator service +''' +from lofar.sas.resourceassignment.otdbtorataskstatuspropagator.propagator import main + +if __name__ == '__main__': + main() diff --git a/SAS/ResourceAssignment/OTDBtoRATaskStatusPropagator/otdbtorataskstatuspropagator.ini b/SAS/ResourceAssignment/OTDBtoRATaskStatusPropagator/otdbtorataskstatuspropagator.ini new file mode 100644 index 0000000000000000000000000000000000000000..be97662836eae4978f3582c8aa527556ba30fb74 --- /dev/null +++ b/SAS/ResourceAssignment/OTDBtoRATaskStatusPropagator/otdbtorataskstatuspropagator.ini @@ -0,0 +1,8 @@ +[program:ortspropagator] +command=/bin/bash -c 'source $LOFARROOT/lofarinit.sh;otdbtorataskstatuspropagator' +user=lofarsys +stopsignal=INT ; KeyboardInterrupt +stopasgroup=true ; bash does not propagate signals +stdout_logfile=%(program_name)s.log +redirect_stderr=true +stderr_logfile=NONE diff --git a/SAS/ResourceAssignment/OTDBtoRATaskStatusPropagator/propagator.py b/SAS/ResourceAssignment/OTDBtoRATaskStatusPropagator/propagator.py new file mode 100644 index 0000000000000000000000000000000000000000..30bad8597e179277c9129c1381bd3cd5c8984545 --- /dev/null +++ b/SAS/ResourceAssignment/OTDBtoRATaskStatusPropagator/propagator.py @@ -0,0 +1,113 @@ +#!/usr/bin/python +# $Id$ + +''' +TODO: add doc +''' +import logging +from optparse import OptionParser +from lofar.sas.otdb.OTDBBusListener import OTDBBusListener +from lofar.common.util import waitForInterrupt +from lofar.sas.otdb.config import DEFAULT_OTDB_NOTIFICATION_BUSNAME, DEFAULT_OTDB_NOTIFICATION_SUBJECT +from lofar.sas.resourceassignment.resourceassignmentservice.config import DEFAULT_BUSNAME as DEFAULT_RADB_BUSNAME +from lofar.sas.resourceassignment.resourceassignmentservice.config import DEFAULT_SERVICENAME as DEFAULT_RADB_SERVICENAME +from lofar.sas.resourceassignment.resourceassignmentservice.rpc import RARPC + +logger = logging.getLogger(__name__) + +class OTDBtoRATaskStatusPropagator(OTDBBusListener): + def __init__(self, + otdb_notification_busname=DEFAULT_OTDB_NOTIFICATION_BUSNAME, + otdb_notification_subject=DEFAULT_OTDB_NOTIFICATION_SUBJECT, + radb_busname=DEFAULT_RADB_BUSNAME, + radb_servicename=DEFAULT_RADB_SERVICENAME, + broker=None, **kwargs): + super(OTDBtoRATaskStatusPropagator, self).__init__(busname=otdb_notification_busname, + subject=otdb_notification_subject, + broker=broker, + **kwargs) + + self.radb = RARPC(busname=radb_busname, servicename=radb_servicename, broker=broker) + + def start_listening(self, **kwargs): + self.radb.open() + super(OTDBtoRATaskStatusPropagator, self).start_listening(**kwargs) + + def stop_listening(self, **kwargs): + self.radb.close() + super(OTDBtoRATaskStatusPropagator, self).stop_listening(**kwargs) + + def _update_radb_task_status(self, otdb_id, task_status): + task = self.radb.getTask(otdb_id=otdb_id) + + if not task: + logger.warning("Task with otdb_id %s in not present in the RADB" % otdb_id) + return + + task_id = task['id'] + logger.info("updating task %s with otdb_id %s to status %s" % (task_id, otdb_id, task_status)) + self.radb.updateTask(task_id=task_id, status=task_status) + + def onObservationPrepared(self, treeId, modificationTime): + self._update_radb_task_status(treeId, 'prepared') + + def onObservationApproved(self, treeId, modificationTime): + self._update_radb_task_status(treeId, 'approved') + + def onObservationOnHold(self, treeId, modificationTime): + self._update_radb_task_status(treeId, 'on_hold') + + def onObservationConflict(self, treeId, modificationTime): + self._update_radb_task_status(treeId, 'conflict') + + def onObservationPrescheduled(self, treeId, modificationTime): + logger.info("not propagating prescheduled status for otdb_id %s to radb because the resource assigner takes care of this" % (treeId)) + + def onObservationScheduled(self, treeId, modificationTime): + self._update_radb_task_status(treeId, 'scheduled') + + def onObservationQueued(self, treeId, modificationTime): + self._update_radb_task_status(treeId, 'queued') + + def onObservationStarted(self, treeId, modificationTime): + self._update_radb_task_status(treeId, 'active') + + def onObservationCompleting(self, treeId, modificationTime): + self._update_radb_task_status(treeId, 'completing') + + def onObservationFinished(self, treeId, modificationTime): + self._update_radb_task_status(treeId, 'finished') + + def onObservationAborted(self, treeId, modificationTime): + self._update_radb_task_status(treeId, 'aborted') + +def main(): + # Check the invocation arguments + parser = OptionParser("%prog [options]", + description='runs the resourceassignment database service') + parser.add_option('-q', '--broker', dest='broker', type='string', default=None, help='Address of the qpid broker, default: localhost') + parser.add_option("--otdb_notification_busname", dest="otdb_notification_busname", type="string", + default=DEFAULT_OTDB_NOTIFICATION_BUSNAME, + help="Bus or queue where the OTDB notifications are published. [default: %default]") + parser.add_option("--otdb_notification_subject", dest="otdb_notification_subject", type="string", + default=DEFAULT_OTDB_NOTIFICATION_SUBJECT, + help="Subject of OTDB notifications on otdb_notification_busname. [default: %default]") + parser.add_option("--radb_busname", dest="radb_busname", type="string", + default=DEFAULT_RADB_BUSNAME, + help="Name of the radb bus exchange on the qpid broker. [default: %default]") + parser.add_option("--radb_servicename", dest="radb_servicename", type="string", + default=DEFAULT_RADB_SERVICENAME, + help="Name of the radb service. [default: %default]") + (options, args) = parser.parse_args() + + logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) + + with OTDBtoRATaskStatusPropagator(otdb_notification_busname=options.otdb_notification_busname, + otdb_notification_subject=options.otdb_notification_subject, + radb_busname=options.radb_busname, + radb_servicename=options.radb_servicename, + broker=options.broker): + waitForInterrupt() + +if __name__ == '__main__': + main() diff --git a/SAS/ResourceAssignment/QPIDInfrastructure/CMakeLists.txt b/SAS/ResourceAssignment/QPIDInfrastructure/CMakeLists.txt index 741a619e355cb665b267fe013077db75f934ba31..f65d3a3cc3d599f55caef1a29c7d7db801a7d7ab 100644 --- a/SAS/ResourceAssignment/QPIDInfrastructure/CMakeLists.txt +++ b/SAS/ResourceAssignment/QPIDInfrastructure/CMakeLists.txt @@ -1,6 +1,6 @@ # $Id: CMakeLists.txt 30355 2014-11-04 13:46:05Z loose $ -lofar_package(QPIDInfrastructure 0.1) +lofar_package(QPIDInfrastructure 0.1 DEPENDS PyCommon) include(PythonInstall) diff --git a/SAS/ResourceAssignment/QPIDInfrastructure/README b/SAS/ResourceAssignment/QPIDInfrastructure/README index dac569e42f0510bc1374ad86497793634d4805ac..3c3607333cb4d171c636a637a2ea2c485cdc1e82 100644 --- a/SAS/ResourceAssignment/QPIDInfrastructure/README +++ b/SAS/ResourceAssignment/QPIDInfrastructure/README @@ -3,7 +3,7 @@ QPIDinfra Database bin: addtoQPIDDB.py Tool to add information in the database configQPIDfromDB.py Tool to create a buildscript from the database - cep4_config.sh Script to insert CEP4 config into database + populateDB.sh Script to insert LOFAR config into database compareQPIDwithDB.py WIP: Tool to read database and compare with QPID brokers gatherfrombrokers.sh WIP: Tool to retrieve info from brokers and insert in database route_to_struct.py diff --git a/SAS/ResourceAssignment/QPIDInfrastructure/bin/CMakeLists.txt b/SAS/ResourceAssignment/QPIDInfrastructure/bin/CMakeLists.txt index 6444ec60bbdc14686fa9d7301b2607864ee608ba..cf062009e8be156d0b5dfe65dc7269b7cc3025bb 100644 --- a/SAS/ResourceAssignment/QPIDInfrastructure/bin/CMakeLists.txt +++ b/SAS/ResourceAssignment/QPIDInfrastructure/bin/CMakeLists.txt @@ -1,7 +1,7 @@ # $Id: CMakeLists.txt 32341 2015-08-28 11:59:26Z schaap $ lofar_add_bin_scripts(addtoQPIDDB.py - cep4_config.sh + populateDB.sh compareQPIDwithDB.py configQPIDfromDB.py gatherfrombrokers.sh diff --git a/SAS/ResourceAssignment/QPIDInfrastructure/bin/addtoQPIDDB.py b/SAS/ResourceAssignment/QPIDInfrastructure/bin/addtoQPIDDB.py index ad038b1da0fc07fad75d5d62924cfbd459fa41b4..0d12ef72902e485b4e1eb508412dc1323d95edc7 100755 --- a/SAS/ResourceAssignment/QPIDInfrastructure/bin/addtoQPIDDB.py +++ b/SAS/ResourceAssignment/QPIDInfrastructure/bin/addtoQPIDDB.py @@ -2,6 +2,7 @@ import sys from lofar.qpidinfrastructure.QPIDDB import qpidinfra +from lofar.common import dbcredentials from optparse import OptionParser @@ -13,16 +14,20 @@ if __name__ == '__main__': parser.add_option('-q', '--queue', dest='queue', type='string', default=None, help='Name of the queue on the broker') parser.add_option('-e', '--exchange', dest='exchange', type='string', default=None, help='Name of the exchange on the broker') parser.add_option('-k', '--routingkey', dest='routingkey', type='string', default='#', help='Federation routing key') + parser.add_option_group(dbcredentials.options_group(parser, "qpidinfra")) (options, args) = parser.parse_args() if (len(sys.argv)<2): parser.print_help() + sys.exit(0) - QPIDinfra = qpidinfra() + dbcreds = dbcredentials.parse_options(options) + QPIDinfra = qpidinfra(dbcreds) if (options.broker==None): parser.print_help() + sys.exit(1) else: QPIDinfra.addhost(options.broker) @@ -39,7 +44,7 @@ if __name__ == '__main__': QPIDinfra.addhost(options.federation) if (options.queue): QPIDinfra.addqueue(options.queue) # should be superfluous - ecxchange='' + exchange='' if (options.exchange): QPIDinfra.addexchange(options.exchange) exchange=options.exchange diff --git a/SAS/ResourceAssignment/QPIDInfrastructure/bin/cep4_config.sh b/SAS/ResourceAssignment/QPIDInfrastructure/bin/cep4_config.sh deleted file mode 100755 index 901b43b95a3e674bb2f55a7b4d5ee4b465cb67c2..0000000000000000000000000000000000000000 --- a/SAS/ResourceAssignment/QPIDInfrastructure/bin/cep4_config.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -for tnode in head{01..02}.cep4.lofar -do -for fnode in cpu{01..50}.cep4.lofar -do - ./addtoQPIDDB.py -b $fnode -q lofar.task.feedback.dataproducts -f $tnode -e lofar.default.bus -done -./addtoQPIDDB.py -b$tnode -q lofar.task.feedback.dataproducts -f ccu001.control.lofar -e lofar.default.bus -done - - diff --git a/SAS/ResourceAssignment/QPIDInfrastructure/bin/compareQPIDwithDB.py b/SAS/ResourceAssignment/QPIDInfrastructure/bin/compareQPIDwithDB.py index 502d002295c9e96028987a13fe320b98a5dd9876..f62a740ab34795bf1f9e127b3d57bc95a4fb4d9e 100755 --- a/SAS/ResourceAssignment/QPIDInfrastructure/bin/compareQPIDwithDB.py +++ b/SAS/ResourceAssignment/QPIDInfrastructure/bin/compareQPIDwithDB.py @@ -1,6 +1,7 @@ #!/usr/bin/python from lofar.qpidinfrastructure.QPIDDB import qpidinfra +from lofar.common import dbcredentials S_INDB = 1 S_ONQPID = 2 @@ -81,7 +82,8 @@ def qpidQroute_add(settings): Host(settings['fromhost']).tagqueueroute(settings['tohost'],settings['queuename'],DEFINED) -QPIDinfra = qpidinfra() +dbcreds = dbcredentials.DBCredentials().get("qpidinfra") +QPIDinfra = qpidinfra(dbcreds) QPIDinfra.perqueue(qpidconfig_add_queue) diff --git a/SAS/ResourceAssignment/QPIDInfrastructure/bin/configQPIDfromDB.py b/SAS/ResourceAssignment/QPIDInfrastructure/bin/configQPIDfromDB.py index df7387834b4f35ab490b16d2b3954db4a6e10705..362eb0d56efced412849e2aa83e8901008fec08a 100755 --- a/SAS/ResourceAssignment/QPIDInfrastructure/bin/configQPIDfromDB.py +++ b/SAS/ResourceAssignment/QPIDInfrastructure/bin/configQPIDfromDB.py @@ -1,6 +1,7 @@ #!/usr/bin/python from lofar.qpidinfrastructure.QPIDDB import qpidinfra +from lofar.common import dbcredentials def qpidconfig_add_queue(settings): print ("qpid-config -b %s add queue %s --durable" %(settings['hostname'],settings['queuename'])) @@ -12,9 +13,10 @@ def qpidroute_add(settings): print ("qpid-route -d route add %s %s %s \'%s\' " %(settings['tohost'],settings['fromhost'],settings['exchangename'],settings['routingkey'])) def qpidQroute_add(settings): - print ("qpid-route -d queue add %s %s %s '%s'" %(settings['tohost'],settings['fromhost'],settings['queuename'],settings['exchangename'])) + print ("qpid-route -d queue add %s %s '%s' '%s'" %(settings['tohost'],settings['fromhost'],settings['exchangename'],settings['queuename'])) -QPIDinfra = qpidinfra() +dbcreds = dbcredentials.DBCredentials().get("qpidinfra") +QPIDinfra = qpidinfra(dbcreds) QPIDinfra.perqueue(qpidconfig_add_queue) QPIDinfra.perexchange(qpidconfig_add_topic) QPIDinfra.perfederationexchange(qpidroute_add) diff --git a/SAS/ResourceAssignment/QPIDInfrastructure/bin/populateDB.sh b/SAS/ResourceAssignment/QPIDInfrastructure/bin/populateDB.sh new file mode 100755 index 0000000000000000000000000000000000000000..88227602ea71d6600b3aefb0f54d8875d9e9fbf3 --- /dev/null +++ b/SAS/ResourceAssignment/QPIDInfrastructure/bin/populateDB.sh @@ -0,0 +1,142 @@ +#!/bin/bash + +# ----------------------------------------- +# Configuration +# +# TODO: Pull from locally deployed config file? +# ----------------------------------------- + +# Whether to modify production (true) or test (false) +PROD=false + +# Host names to use +if $PROD; then + CCU=ccu001.control.lofar + MCU=mcu001.control.lofar + SCU=scu001.control.lofar + SAS=sas001.control.lofar + + MOM_USER=lcs023.control.lofar + MOM_INGEST=lcs029.control.lofar + + COBALT="`seq -f cbt%03.0f.control.lofar 1 8`" + + CEP2="`seq -f locus%03.0f.cep2.lofar 1 94`" + CEP2HEAD=lhn001.cep2.lofar + + CEP4="`seq -f cpu%02.0f.cep4.control.lofar 1 50`" + CEP4HEAD="head01.cep4.control.lofar head02.cep4.control.lofar" +else + CCU=ccu099.control.lofar + MCU=mcu099.control.lofar + SCU=scu099.control.lofar + SAS=sas099.control.lofar + + MOM_USER=lcs028.control.lofar + MOM_INGEST=lcs028.control.lofar + + COBALT="cbt009.control.lofar" + + CEP2="locus098.cep2.lofar locus099.cep2.lofar" + CEP2HEAD=locus102.cep2.lofar + + CEP4="`seq -f cpu%02.0f.cep4.control.lofar 1 50`" + CEP4HEAD="head01.cep4.control.lofar head02.cep4.control.lofar" +fi + +# ----------------------------------------- +# Cobalt & Pipelines -> MessageRouter +# ----------------------------------------- + +for tnode in $CEP4HEAD +do + for fnode in $CEP4 + do + addtoQPIDDB.py --broker $fnode --queue lofar.task.feedback.dataproducts --federation $tnode + addtoQPIDDB.py --broker $fnode --queue lofar.task.feedback.processing --federation $tnode + addtoQPIDDB.py --broker $fnode --queue lofar.task.feedback.state --federation $tnode + done + + addtoQPIDDB.py --broker $tnode --queue lofar.task.feedback.dataproducts --federation $CCU + addtoQPIDDB.py --broker $tnode --queue lofar.task.feedback.processing --federation $CCU + addtoQPIDDB.py --broker $tnode --queue lofar.task.feedback.state --federation $CCU +done + +for tnode in $CEP2HEAD +do + for fnode in $CEP2 + do + addtoQPIDDB.py --broker $fnode --queue lofar.task.feedback.dataproducts --federation $tnode + addtoQPIDDB.py --broker $fnode --queue lofar.task.feedback.processing --federation $tnode + addtoQPIDDB.py --broker $fnode --queue lofar.task.feedback.state --federation $tnode + done + + addtoQPIDDB.py --broker $tnode --queue lofar.task.feedback.dataproducts --federation $CCU + addtoQPIDDB.py --broker $tnode --queue lofar.task.feedback.processing --federation $CCU + addtoQPIDDB.py --broker $tnode --queue lofar.task.feedback.state --federation $CCU +done + +# ----------------------------------------- +# MessageRouter -> MoM +# ----------------------------------------- + +addtoQPIDDB.py --broker $CCU --queue mom.task.feedback.dataproducts --federation $MOM_USER +addtoQPIDDB.py --broker $CCU --queue mom.task.feedback.processing --federation $MOM_USER +addtoQPIDDB.py --broker $CCU --queue mom.task.feedback.state --federation $MOM_USER + +# ----------------------------------------- +# MessageRouter -> OTDB +# ----------------------------------------- + +addtoQPIDDB.py --broker $CCU --queue otdb.task.feedback.dataproducts --federation $MCU +addtoQPIDDB.py --broker $CCU --queue otdb.task.feedback.processing --federation $MCU + +# ----------------------------------------- +# MessageRouter -> MAC +# ----------------------------------------- + +addtoQPIDDB.py --broker $CCU --exchange mac.task.feedback.state + +# ----------------------------------------- +# MACScheduler -> MessageRouter -> MoM +# ----------------------------------------- + +addtoQPIDDB.py --broker $MCU --queue lofar.task.specification.system --federation $CCU +addtoQPIDDB.py --broker $CCU --queue mom.task.specification.system --federation $MOM_USER + +# ----------------------------------------- +# MoM <-> MoM-OTDB-Adapter +# ----------------------------------------- + +addtoQPIDDB.py --broker $SAS --queue mom.command --federation $MOM_USER +addtoQPIDDB.py --broker $SAS --queue mom.importxml --federation $MOM_USER +addtoQPIDDB.py --broker $MOM_USER --queue mom-otdb-adapter.importxml --federation $SAS + +# ----------------------------------------- +# MoM Services +# ----------------------------------------- +addtoQPIDDB.py --broker $MOM_USER --exchange lofar.mom.bus +addtoQPIDDB.py --broker $MOM_INGEST --exchange lofar.mom.bus + +# ----------------------------------------- +# ResourceAssignment +# ----------------------------------------- + +addtoQPIDDB.py --broker $SCU --exchange lofar.ra.command +addtoQPIDDB.py --broker $SCU --exchange lofar.ra.notification +addtoQPIDDB.py --broker $SCU --exchange lofar.otdb.command +addtoQPIDDB.py --broker $SCU --exchange lofar.otdb.notification +addtoQPIDDB.py --broker $SCU --exchange lofar.ssdb.command +addtoQPIDDB.py --broker $SCU --exchange lofar.ssdb.notification + +# TODO: messages will end up at $SCU twice? +for tnode in head{01..02}.cep4 +do + for fnode in cpu{01..50}.cep4 + do + addtoQPIDDB.py --broker $fnode --exchange lofar.otdb.command --federation $tnode + done + + addtoQPIDDB.py --broker $tnode --exchange lofar.otdb.command --federation $SCU +done + diff --git a/SAS/ResourceAssignment/QPIDInfrastructure/bin/route_to_struct.py b/SAS/ResourceAssignment/QPIDInfrastructure/bin/route_to_struct.py index c555a48e692bd590dff0ae5d1d9a1dd563f7b664..72ae8f21f25e0a0b45978be9725cb5f4cb6ec0b2 100755 --- a/SAS/ResourceAssignment/QPIDInfrastructure/bin/route_to_struct.py +++ b/SAS/ResourceAssignment/QPIDInfrastructure/bin/route_to_struct.py @@ -2,9 +2,10 @@ import sys from lofar.qpidinfrastructure.QPIDDB import qpidinfra +from lofar.common import dbcredentials - -todb=qpidinfra() +dbcreds = dbcredentials.DBCredentials().get("qpidinfra") +todb=qpidinfra(dbcreds) tosearch = sys.stdin.readlines() diff --git a/SAS/ResourceAssignment/QPIDInfrastructure/lib/QPIDDB.py b/SAS/ResourceAssignment/QPIDInfrastructure/lib/QPIDDB.py index 7c2b0a598ec50bc73a9659ad94ba3cfa6071e6f6..87019b014f55f47e276cecdf070221daf3192b45 100755 --- a/SAS/ResourceAssignment/QPIDInfrastructure/lib/QPIDDB.py +++ b/SAS/ResourceAssignment/QPIDInfrastructure/lib/QPIDDB.py @@ -5,10 +5,10 @@ from psqlQPIDDB import psqlQPIDDB class qpidinfra: """ Class to access and edit the QPIDInfra database. """ - def __init__(self): + def __init__(self, dbcreds): """ Initialize the database connection. """ - self.db=psqlQPIDDB('qpidinfra') + self.db=psqlQPIDDB(dbcreds) def perqueue(self,callback): """ Iterate over all queues defined in the database. @@ -224,13 +224,13 @@ class qpidinfra: """ Add an exchange route for the given exchangeid with routingkey, fromid, toid and dynamic (bool). If dynamic is set to True the routing key won't have any effect since teh routing is assumed dynamic. """ - if (getexchangeroute(self,exchangeid,routingkey,fromid,toid)==0): - self.db.docommit("insert into exchangeroutes (eid,fromhost,tohost,routingkey,dynamic);" %(exchangeid,fromid,toid,routingkey,dynamic)) + if (self.getexchangeroute(exchangeid,routingkey,fromid,toid)==0): + self.db.docommit("insert into exchangeroutes (eid,fromhost,tohost,routingkey,dynamic) values (%s, %s, %s, '%s', %s);" %(exchangeid,fromid,toid,routingkey,dynamic)) def delexchangeroute(self,exchangeid,routingkey,fromid,toid,dynamic=False): """ Delete the exchange route for exchangeid,routingkey,fromid,toid and dynamic(bool). """ - id = getexchangeroute(self,exchangeid,routingkey,fromid,toid) + id = self.getexchangeroute(exchangeid,routingkey,fromid,toid) if (id!=0): print("Removing exchangeroute for key %s and exchange %s from host %s to host %s" %(routingkey,exchangekey,fromid,toid)) self.db.docommit("delete from exchangeroutes where erouteid=%d;" %(id)) diff --git a/SAS/ResourceAssignment/QPIDInfrastructure/lib/psqlQPIDDB.py b/SAS/ResourceAssignment/QPIDInfrastructure/lib/psqlQPIDDB.py index 385b41ebd718625c4edff05b2dcd1bfed7256d46..b11ecdac1a32a372ea3ca2de2c4b13047d66ff50 100755 --- a/SAS/ResourceAssignment/QPIDInfrastructure/lib/psqlQPIDDB.py +++ b/SAS/ResourceAssignment/QPIDInfrastructure/lib/psqlQPIDDB.py @@ -1,4 +1,5 @@ #!/usr/bin/python + import psycopg2 as pg import psycopg2.extras as pgdefs @@ -8,26 +9,31 @@ class psqlQPIDDB: postgres database that holds the QPID infra configuration. """ - def __init__(self,dbname): + def __init__(self, dbcreds=None): """ Init the class with the name of the database - example: db = psqlQPIDDB('qpidinfra') + example: db = psqlQPIDDB(dbcreds) + where `dbcreds' is an lofar.common.dbcredentials.Credentials object. """ - self.dbname = dbname - self.conn = pg.connect("dbname='%s'" %(self.dbname)) + self.dbcreds = dbcreds + self.conn = None + self.ensure_connect() def ensure_connect(self): """ ensure that the database is still connected. raises an exception "ERROR: Failed to connect to database XXX" if the reconnect failed. """ - if (self.conn and self.conn.status==1): + + if self.conn and self.conn.status==1: return - self.conn=pg.connect("dbname='%s'" %(self.dbname)) - if (self.conn and self.conn.status==1): + + self.conn = pg.connect(**self.dbcreds.psycopg2_connect_options()) + + if self.conn and self.conn.status==1: return else: - raise Exception( "ERROR: Failed to reconnect to database %s" %(self.dbname)) + raise Exception("ERROR: Failed to reconnect to database %s" % (self.dbcreds,)) def doquery(self,query): """ execute a query on the database and return reult as a list of dicts. @@ -35,6 +41,7 @@ class psqlQPIDDB: useful for fetching infromation from the database. usage: ret=doquery("select * from table;") """ + self.ensure_connect() cur = self.conn.cursor(cursor_factory = pgdefs.RealDictCursor) cur.execute(query) diff --git a/SAS/ResourceAssignment/QPIDInfrastructure/sql/qpidinfradb.sql b/SAS/ResourceAssignment/QPIDInfrastructure/sql/qpidinfradb.sql index a8ade198b2ee38279bcb06ba37b6c9537f585101..2c467a92abf6be5cabda59cd9bebe3dac966c5ba 100644 --- a/SAS/ResourceAssignment/QPIDInfrastructure/sql/qpidinfradb.sql +++ b/SAS/ResourceAssignment/QPIDInfrastructure/sql/qpidinfradb.sql @@ -1,3 +1,8 @@ +-- Usage: +-- +-- psql --command="CREATE DATABASE qpidinfra" +-- psql --dbname=qpidinfra --file=qpidinfradb.sql + DROP TABLE IF EXISTS exchanges CASCADE; DROP TABLE IF EXISTS queues CASCADE; DROP TABLE IF EXISTS hosts CASCADE; @@ -45,6 +50,7 @@ CREATE TABLE queueroutes( eid bigint references exchanges(exchangeid) ON DELETE CASCADE, PRIMARY KEY (qrouteid) ); + CREATE TABLE exchangeroutes( erouteid SERIAL, fromhost bigint references hosts(hostid) ON DELETE CASCADE, @@ -54,6 +60,7 @@ CREATE TABLE exchangeroutes( routingkey varchar(512) default '#', PRIMARY KEY (erouteid) ); + CREATE TABLE queuelistener( qlistenid SERIAL, fromhost bigint references hosts(hostid) ON DELETE CASCADE, @@ -63,41 +70,4 @@ CREATE TABLE queuelistener( PRIMARY KEY (qlistenid) ); - -INSERT INTO exchanges (exchangename) VALUES - ('lofar.ra.command'), - ('lofar.ra.notification'), - ('lofar.otdb.command'), - ('lofar.otdb.notification'), - ('lofar.sm.command'), - ('lofar.sm.notification'), - ('lofar.mom.command'), - ('lofar.mom.notification'); - -INSERT INTO queues (queuename) VALUES - ('TreeStatus'), - ('TaskSpecified'), - ('ResourceAssigner'); - -INSERT INTO hosts (hostname) VALUES - ('scu001.control.lofar'), - ('ccu001.control.lofar'), - ('head01.control.lofar'); - - -INSERT INTO persistentexchanges (eid,hid) VALUES - (1,1), - (2,1), - (3,1), - (4,1), - (5,1), - (6,1), - (7,1), - (8,1); - -insert INTO persistentqueues (qid,hid) VALUES - (1,1), - (2,1), - (3,1); - -commit; +COMMIT; diff --git a/SAS/ResourceAssignment/RATaskSpecifiedService/bin/rataskspecifiedservice b/SAS/ResourceAssignment/RATaskSpecifiedService/bin/rataskspecifiedservice index 2f778d587a41579c4c3c13c2e0ebb29b60d36181..093e6b96b19e1cd98e0d3a79eadbfe8dea49528e 100644 --- a/SAS/ResourceAssignment/RATaskSpecifiedService/bin/rataskspecifiedservice +++ b/SAS/ResourceAssignment/RATaskSpecifiedService/bin/rataskspecifiedservice @@ -25,24 +25,7 @@ Daemon that listens to OTDB status changes to PRESCHEDULED, requests the parset of such jobs (+ their predecessors), and posts them on the bus. """ -from lofar.sas.resourceassignment.rataskspecified.RATaskSpecified import RATaskSpecified +from lofar.sas.resourceassignment.rataskspecified.RATaskSpecified import main if __name__ == "__main__": - import sys - from optparse import OptionParser - - # Check the invocation arguments - parser = OptionParser("%prog -O otdb_bus -B my_bus [options]") - parser.add_option("-O", "--otdb_bus", dest="otdb_busname", type="string", default="", - help="Bus or queue OTDB operates on") - parser.add_option("-B", "--my_bus", dest="my_busname", type="string", default="", - help="Bus or queue we publish resource requests on") - (options, args) = parser.parse_args() - - if not options.statusbus or not options.parsetbus or not options.busname: - parser.print_help() - sys.exit(1) - - with RATaskSpecified("OTDB.TaskSpecified", otdb_busname=options.otdb_busname, my_busname=options.my_busname) as jts: - waitForInterrupt() - + main() diff --git a/SAS/ResourceAssignment/RATaskSpecifiedService/bin/rataskspecifiedservice.ini b/SAS/ResourceAssignment/RATaskSpecifiedService/bin/rataskspecifiedservice.ini index fa18d43856d59896880b29913019cf21734076e6..91f6b88fd5135fe96ae293ad23d52ec360dafd66 100644 --- a/SAS/ResourceAssignment/RATaskSpecifiedService/bin/rataskspecifiedservice.ini +++ b/SAS/ResourceAssignment/RATaskSpecifiedService/bin/rataskspecifiedservice.ini @@ -4,4 +4,5 @@ user=lofarsys stopsignal=INT ; KeyboardInterrupt stopasgroup=true stdout_logfile=%(program_name)s.log -stderr_logfile=%(program_name)s.stderr +redirect_stderr=true +stderr_logfile=NONE diff --git a/SAS/ResourceAssignment/RATaskSpecifiedService/lib/CMakeLists.txt b/SAS/ResourceAssignment/RATaskSpecifiedService/lib/CMakeLists.txt index d7d46f3b5d3582e78d3e7b6e58feb179031faf85..355fc0b34b6ddd91710da6bdd1516b1f7d81b3db 100644 --- a/SAS/ResourceAssignment/RATaskSpecifiedService/lib/CMakeLists.txt +++ b/SAS/ResourceAssignment/RATaskSpecifiedService/lib/CMakeLists.txt @@ -3,5 +3,6 @@ python_install( RATaskSpecified.py RABusListener.py + config.py DESTINATION lofar/sas/resourceassignment/rataskspecified ) diff --git a/SAS/ResourceAssignment/RATaskSpecifiedService/lib/RABusListener.py b/SAS/ResourceAssignment/RATaskSpecifiedService/lib/RABusListener.py index 6d5f5a7712577503bedd09cda5845123905031cb..c457c07729c3b41d7dc93637a718647c9feb7157 100644 --- a/SAS/ResourceAssignment/RATaskSpecifiedService/lib/RABusListener.py +++ b/SAS/ResourceAssignment/RATaskSpecifiedService/lib/RABusListener.py @@ -28,6 +28,8 @@ Typical usage is to derive your own subclass from RABusListener and implement th """ from lofar.messaging.messagebus import AbstractBusListener +from lofar.sas.resourceassignment.rataskspecified.config import DEFAULT_RA_TASK_SPECIFIED_NOTIFICATION_BUSNAME +from lofar.sas.resourceassignment.rataskspecified.config import DEFAULT_RA_TASK_SPECIFIED_NOTIFICATION_SUBJECT import qpid.messaging import logging @@ -37,7 +39,10 @@ logger = logging.getLogger(__name__) class RATaskSpecifiedBusListener(AbstractBusListener): - def __init__(self, busname='lofar.ra.notification', subject='OTDB.TaskSpecified', broker=None, **kwargs): + def __init__(self, + busname=DEFAULT_RA_TASK_SPECIFIED_NOTIFICATION_BUSNAME, + subject=DEFAULT_RA_TASK_SPECIFIED_NOTIFICATION_SUBJECT, + broker=None, **kwargs): """ RATaskSpecifiedBusListener listens on the lofar ra message bus and calls (empty) on<SomeMessage> methods when such a message is received. Typical usage is to derive your own subclass from RATaskSpecifiedBusListener and implement the specific on<SomeMessage> methods that you are interested in. @@ -55,13 +60,12 @@ class RATaskSpecifiedBusListener(AbstractBusListener): def _handleMessage(self, msg): logger.debug("RABusListener.handleMessage: %s" %str(msg)) - sasId = msg.content['sasID'] - modificationTime = msg.content['time_of_change'].datetime() - resource_indicators = msg.content['resource_indicators'] + otdb_id = msg.content['otdb_id'] + specification_tree = msg.content - self.onTaskSpecified(sasId, modificationTime, resource_indicators) + self.onTaskSpecified(otdb_id, specification_tree) - def onTaskSpecified(self, sasId, modificationTime, resourceIndicators): + def onTaskSpecified(self, otdb_id, specification_tree): pass __all__ = ["RATaskSpecifiedBusListener"] diff --git a/SAS/ResourceAssignment/RATaskSpecifiedService/lib/RATaskSpecified.py b/SAS/ResourceAssignment/RATaskSpecifiedService/lib/RATaskSpecified.py index e05047d467f60f5276525967282e9b7e47d730cb..03647d7f2d4cfb25d135dd7d3b9dffae053d12dc 100755 --- a/SAS/ResourceAssignment/RATaskSpecifiedService/lib/RATaskSpecified.py +++ b/SAS/ResourceAssignment/RATaskSpecifiedService/lib/RATaskSpecified.py @@ -25,10 +25,15 @@ Daemon that listens to OTDB status changes to PRESCHEDULED and SCHEDULED, reques the parset of such jobs (+ their predecessors), and posts them on the bus. """ -from lofar.messaging import FromBus, ToBus, RPC, EventMessage +from lofar.messaging import FromBus, ToBus, EventMessage # RPC, from lofar.parameterset import PyParameterValue from lofar.sas.otdb.OTDBBusListener import OTDBBusListener from lofar.common.util import waitForInterrupt +from lofar.sas.resourceassignment.ratootdbtaskspecificationpropagator.otdbrpc import OTDBRPC +from lofar.sas.otdb.config import DEFAULT_OTDB_NOTIFICATION_BUSNAME, DEFAULT_OTDB_NOTIFICATION_SUBJECT +from lofar.sas.resourceassignment.rataskspecified.config import DEFAULT_RA_TASK_SPECIFIED_NOTIFICATION_BUSNAME +from lofar.sas.resourceassignment.rataskspecified.config import DEFAULT_RA_TASK_SPECIFIED_NOTIFICATION_SUBJECT +from lofar.sas.otdb.config import DEFAULT_OTDB_SERVICE_BUSNAME, DEFAULT_OTDB_SERVICENAME import logging logger = logging.getLogger(__name__) @@ -36,193 +41,280 @@ logger = logging.getLogger(__name__) """ Prefix that is common to all parset keys, depending on the exact source. """ PARSET_PREFIX="ObsSW." -def predecessors( parset ): - """ Extract the list of predecessor obs IDs from the given parset. """ - - key = PARSET_PREFIX + "Observation.Scheduler.predecessors" - strlist = PyParameterValue(str(parset[key]), True).getStringVector() - - # Key contains "Lxxxxx" values, we want to have "xxxxx" only - result = [int(filter(str.isdigit,x)) for x in strlist] - - return result - -def resourceIndicatorsFromParset( parset ): - """ Extract the parset keys that are required for resource assignment. """ - - subset = {} - - def get(key, default=None): - """ Return the value of parset key `key', or `default' if the key - is not defined. """ - return parset.get(PARSET_PREFIX + key, default) - - def add(key, conversion=lambda x: x): - """ Add the given key to our subset selection, using an optional - conversion. """ - value = get(key) - if value is not None: - subset[key] = conversion(value) - - """ Some conversion functions for common parameter-value types.""" - def strvector(value): - return PyParameterValue(value, True).getStringVector() - - def intvector(value): - return PyParameterValue(value, True).getIntVector() - - def bool(value): - return PyParameterValue(value, True).getBool() - - # ===================================== - # Parset meta info - # ===================================== - subset["Version.number"] = parset.get("Version.number") - - # ===================================== - # Observation settings - # ===================================== - add("Observation.sampleClock") - add("Observation.nrBitsPerSample") - add("Observation.antennaSet") - add("Observation.VirtualInstrument.stationList", strvector) - add("Observation.startTime") - add("Observation.stopTime") - add("Observation.nrBeams") - nrSAPs = int(get("Observation.nrBeams", 0)) - for sap in xrange(0, nrSAPs): - add("Observation.Beam[%d].subbandList" % (sap,), intvector) - - # ===================================== - # Correlator settings - # ===================================== - add("Observation.DataProducts.Output_Correlated.enabled", bool) - add("Cobalt.Correlator.integrationTime") - add("Cobalt.Correlator.nrChannelsPerSubband") - # TODO: We need a service that computes these 3 values - add("Cobalt.Correlator.nrBlocksPerIntegration") - add("Cobalt.Correlator.nrIntegrationsPerBlock") - add("Cobalt.blockSize") - - # ===================================== - # Beamformer settings - # ===================================== - add("Observation.DataProducts.Output_IncoherentStokes.enabled", bool) - add("Observation.DataProducts.Output_CoherentStokes.enabled", bool) - add("Cobalt.BeamFormer.flysEye", bool) - #add("Cobalt.BeamFormer.CoherentStokes.nrChannelsPerSubband") # only needed to determine Cobalt.blockSize - add("Cobalt.BeamFormer.CoherentStokes.subbandsPerFile") - add("Cobalt.BeamFormer.CoherentStokes.timeIntegrationFactor") - add("Cobalt.BeamFormer.CoherentStokes.which") - #add("Cobalt.BeamFormer.IncoherentStokes.nrChannelsPerSubband") # only needed to determine Cobalt.blockSize - add("Cobalt.BeamFormer.IncoherentStokes.subbandsPerFile") - add("Cobalt.BeamFormer.IncoherentStokes.timeIntegrationFactor") - add("Cobalt.BeamFormer.IncoherentStokes.which") - for sap in xrange(0, nrSAPs): - add("Observation.Beam[%d].nrTabRings" % (sap,)) - - nrTABs = int(get("Observation.Beam[%d].nrTiedArrayBeams" % (sap,), 0)) - for tab in xrange(0, nrTABs): - add("Observation.Beam[%d].TiedArrayBeam[%d].coherent" % (sap,tab), bool) - - # ===================================== - # Pipeline settings - # ===================================== - # Calibrator / Averaging pipelines - add("Observation.DataProducts.Output_Correlated.enabled", bool) - add("Observation.DataProducts.Output_InstrumentModel.enabled", bool) - add("Observation.DataProducts.Input_Correlated.enabled", bool) - add("Observation.DataProducts.Input_Correlated.skip", intvector) - add("Observation.ObservationControl.PythonControl.DPPP.demixer.demixfreqstep") - add("Observation.ObservationControl.PythonControl.DPPP.demixer.demixtimestep") - - # Imaging pipeline - add("Observation.DataProducts.Output_SkyImage.enabled", bool) - add("Observation.ObservationControl.PythonControl.Imaging.slices_per_image") - add("Observation.ObservationControl.PythonControl.Imaging.subbands_per_image") - - # Long-baseline pipeline - add("Observation.ObservationControl.PythonControl.LongBaseline.subbandgroups_per_ms") - add("Observation.ObservationControl.PythonControl.LongBaseline.subbands_per_subbandgroup") - - # Pulsar pipeline - add("Observation.DataProducts.Output_Pulsar.enabled", bool) - add("Observation.DataProducts.Input_CoherentStokes.enabled", bool) - add("Observation.DataProducts.Input_CoherentStokes.skip", intvector) - add("Observation.DataProducts.Input_IncoherentStokes.enabled", bool) - add("Observation.DataProducts.Input_IncoherentStokes.skip", intvector) - - return subset +def convertSchedulerProcessSubtype(processSubType): + '''convert scheduler processSubType as defined in SAS/Scheduler/src/OTDBTree.h to RA (type, subtype) tuple''' + if processSubType == "Averaging Pipeline": + return "pipeline", "averaging pipeline" + elif processSubType == "Calibration Pipeline": + return "pipeline", "calibration pipeline" + elif processSubType == "Imaging Pipeline": + return "pipeline", "imaging pipeline" + elif processSubType == "Imaging Pipeline MSSS": + return "pipeline", "imaging pipeline msss" + elif processSubType == "Long Baseline Pipeline": + return "pipeline", "long baseline pipeline" + elif processSubType == "Pulsar Pipeline": + return "pipeline", "pulsar pipeline" + elif processSubType == "Beam Observation": + return "observation", "bfmeasurement" + elif processSubType == "Interferometer": + return "observation", "interferometer" + elif processSubType == "TBB (piggyback)": + return "observation", "tbbmeasurement" + elif processSubType == "TBB (standalone)": + return "observation", "tbbmeasurement" + ##TODO Maintenance and Reservation + return "unknown", "unknown" + +def resourceIndicatorsFromParset( parsetDict ): + """ Extract the parset keys that are required for resource assignment. """ + + subset = {} + + def get(key, default=None): + """ Return the value of parset key `key', or `default' if the key + is not defined. """ + return parsetDict.get(PARSET_PREFIX + key, default) + + def add(key, conversion=lambda x: x): + """ Add the given key to our subset selection, using an optional + conversion. """ + value = get(key) + if value is not None: + subset[key] = conversion(value) + + """ Some conversion functions for common parameter-value types.""" + def strvector(value): + return PyParameterValue(str(value), True).getStringVector() + + def intvector(value): + return PyParameterValue(str(value), True)._expand().getIntVector() + + def bool(value): + return PyParameterValue(str(value), True).getBool() + + # ===================================== + # Parset meta info + # ===================================== + subset["Version.number"] = parsetDict.get("Version.number") + + # ===================================== + # Observation settings + # ===================================== + add("Observation.momID") + add("Observation.sampleClock") + add("Observation.nrBitsPerSample") + add("Observation.antennaSet") + add("Observation.VirtualInstrument.stationList", strvector) + add("Observation.startTime") + add("Observation.stopTime") + add("Observation.nrBeams") + + nrSAPs = int(get("Observation.nrBeams", 0)) + for sap in xrange(0, nrSAPs): + add("Observation.Beam[%d].subbandList" % (sap,), intvector) + + # ===================================== + # Correlator settings + # ===================================== + add("Observation.DataProducts.Output_Correlated.enabled", bool) + add("Observation.DataProducts.Output_Correlated.storageClusterName") + add("Observation.ObservationControl.OnlineControl.Cobalt.Correlator.integrationTime") + add("Observation.ObservationControl.OnlineControl.Cobalt.Correlator.nrChannelsPerSubband") + # TODO: We need a service that computes these 3 values + add("Cobalt.Correlator.nrBlocksPerIntegration") + add("Cobalt.Correlator.nrIntegrationsPerBlock") + add("Cobalt.blockSize") + + + # ===================================== + # Beamformer settings + # ===================================== + add("Observation.DataProducts.Output_IncoherentStokes.enabled", bool) + add("Observation.DataProducts.Output_IncoherentStokes.storageClusterName") + add("Observation.DataProducts.Output_CoherentStokes.enabled", bool) + add("Observation.DataProducts.Output_CoherentStokes.storageClusterName") + add("Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.flysEye", bool) + #add("Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.CoherentStokes.nrChannelsPerSubband") # only needed to determine Cobalt.blockSize + add("Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.CoherentStokes.subbandsPerFile") + add("Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.CoherentStokes.timeIntegrationFactor") + add("Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.CoherentStokes.which") + #add("Observation.ObservationControl.OnlineControl.Cobalt.IncoherentStokes.nrChannelsPerSubband") # only needed to determine Cobalt.blockSize + add("Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.IncoherentStokes.subbandsPerFile") + add("Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.IncoherentStokes.timeIntegrationFactor") + add("Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.IncoherentStokes.which") + for sap in xrange(0, nrSAPs): + add("Observation.Beam[%d].nrTabRings" % (sap,)) + + add("Observation.Beam[%d].nrTiedArrayBeams" % (sap,)) + nrTABs = int(get("Observation.Beam[%d].nrTiedArrayBeams" % (sap,), 0)) + for tab in xrange(0, nrTABs): + add("Observation.Beam[%d].TiedArrayBeam[%d].coherent" % (sap,tab), bool) + + # ===================================== + # Pipeline settings + # ===================================== + # Calibrator / Averaging pipelines + add("Observation.DataProducts.Output_Correlated.enabled", bool) + add("Observation.DataProducts.Output_Correlated.storageClusterName") + add("Observation.DataProducts.Output_InstrumentModel.enabled", bool) + add("Observation.DataProducts.Output_InstrumentModel.storageClusterName") + add("Observation.DataProducts.Input_Correlated.enabled", bool) + add("Observation.DataProducts.Input_Correlated.skip", intvector) + add("Observation.ObservationControl.PythonControl.DPPP.demixer.demixfreqstep") + add("Observation.ObservationControl.PythonControl.DPPP.demixer.demixtimestep") + + # Imaging pipeline + add("Observation.DataProducts.Output_SkyImage.enabled", bool) + add("Observation.DataProducts.Output_SkyImage.storageClusterName") + add("Observation.ObservationControl.PythonControl.Imaging.slices_per_image") + add("Observation.ObservationControl.PythonControl.Imaging.subbands_per_image") + + # Long-baseline pipeline + add("Observation.ObservationControl.PythonControl.LongBaseline.subbandgroups_per_ms") + add("Observation.ObservationControl.PythonControl.LongBaseline.subbands_per_subbandgroup") + + # Pulsar pipeline + add("Observation.DataProducts.Output_Pulsar.enabled", bool) + add("Observation.DataProducts.Output_Pulsar.storageClusterName") + add("Observation.DataProducts.Input_CoherentStokes.enabled", bool) + add("Observation.DataProducts.Input_CoherentStokes.skip", intvector) + add("Observation.DataProducts.Input_IncoherentStokes.enabled", bool) + add("Observation.DataProducts.Input_IncoherentStokes.skip", intvector) + + return subset class RATaskSpecified(OTDBBusListener): - def __init__(self, servicename, otdb_busname=None, my_busname=None, **kwargs): - super(RATaskSpecified, self).__init__(busname=otdb_busname, subject="TaskStatus", **kwargs) - - self.parset_rpc = RPC(service="TaskSpecification", busname=otdb_busname) - self.send_bus = ToBus("%s/%s" % (my_busname, servicename)) - - def start_listening(self, **kwargs): - self.parset_rpc.open() - self.send_bus.open() - - super(RATaskSpecified, self).start_listening(**kwargs) - - def stop_listening(self, **kwargs): - super(RATaskSpecified, self).stop_listening(**kwargs) - - self.send_bus.close() - self.parset_rpc.close() - - def onObservationPrescheduled(self, treeId, modificationTime): - logger.info("Processing obs ID %s", treeId) - - # Request the parset - main_obsID = treeId - main_parset,_ = self.parset_rpc( OtdbID=main_obsID ) - - # Construct a dict of all the parsets we retrieved - parsets = {} - parsets[main_obsID] = main_parset - - logger.info("Processing predecessors") - - # Collect the initial set of predecessors - request_obsIDs = set(predecessors(main_parset)) - - logger.info("Processing %s", request_obsIDs) - - # Iterate recursively over all known predecessor obsIDs, and request their parsets - while request_obsIDs: - obsID = request_obsIDs.pop() - - if obsID in parsets: - # Predecessor lists can overlap -- we already have this one - continue - - logger.info("Fetching predecessor %s", obsID) - - # Request predecessor parset - parsets[obsID],_ = self.parset_rpc( OtdbID=obsID ) - - # Add the list of predecessors - request_obsIDs = request_obsIDs.union(predecessors(parsets[obsID])) - - # Convert parsets to resource indicators - logger.info("Extracting resource indicators") - resourceIndicators = dict([(str(obsID), resourceIndicatorsFromParset(parset)) for (obsID,parset) in parsets.iteritems()]) - - # Construct and send result message - logger.info("Sending result") - result = { - "sasID": main_obsID, - "state": "prescheduled", - "time_of_change": modificationTime, - "resource_indicators": resourceIndicators, - } - - # Put result on bus - msg = EventMessage(content=result) - self.send_bus.send(msg) - - logger.info("Result sent") - + def __init__(self, + otdb_notification_busname=DEFAULT_OTDB_NOTIFICATION_BUSNAME, + otdb_notification_subject=DEFAULT_OTDB_NOTIFICATION_SUBJECT, + otdb_service_busname=DEFAULT_OTDB_SERVICE_BUSNAME, + otdb_service_subject=DEFAULT_OTDB_SERVICENAME, + notification_busname=DEFAULT_RA_TASK_SPECIFIED_NOTIFICATION_BUSNAME, + notification_subject=DEFAULT_RA_TASK_SPECIFIED_NOTIFICATION_SUBJECT, + broker=None, **kwargs): + super(RATaskSpecified, self).__init__(busname=otdb_notification_busname, subject=otdb_notification_subject, **kwargs) + self.otdbrpc = OTDBRPC(busname=otdb_service_busname, servicename=otdb_service_subject, broker=broker) ## , ForwardExceptions=True hardcoded in RPCWrapper right now + self.send_bus = ToBus("%s/%s" % (notification_busname, notification_subject)) + + def start_listening(self, **kwargs): + self.otdbrpc.open() + self.send_bus.open() + super(RATaskSpecified, self).start_listening(**kwargs) + + def stop_listening(self, **kwargs): + super(RATaskSpecified, self).stop_listening(**kwargs) + self.send_bus.close() + self.otdbrpc.close() + + def get_predecessors(self, parset): + """ Extract the list of predecessor obs IDs from the given parset. """ + + key = PARSET_PREFIX + "Observation.Scheduler.predecessors" + stringlist = PyParameterValue(str(parset[key]), True).getStringVector() + + # Key contains values starting with 'S' = Scheduler, 'L'/'T' = OTDB, 'M' = MoM + # 'S' we can probably ignore? Might be only internal in the Scheduler? + result = [] + for s in stringlist: + try: # Made the source a string for readability, but it's not efficient + if s.startswith('M'): + result.append({'source': 'mom', 'id': int(s[1:])}) + elif s.startswith('L') or s.startswith('T'): + result.append({'source': 'otdb', 'id': int(s[1:])}) + else: # 'S' + logger.info("found a predecessor ID I can't handle: %s" % s) + result.append({'source': 'other', 'id': int(s[1:])}) + except ValueError: + logger.warning("found a predecessor ID that I can't parse %s" % s) + return result + + def get_specification_with_predecessors(self, id, id_source, state, found_parsets): + logger.info("Processing ID %s from %s" % (id, id_source)) + if id_source == "other": + return None + elif id_source == "mom": + otdb_id = self.otdbrpc.taskGetIDs( mom_id=id )['otdb_id'] + elif id_source == "otdb": + otdb_id = id + else: + logger.warning("Error in understanding id %s", id) + + logger.info("Processing OTDB ID %s", otdb_id) + result = {"otdb_id": otdb_id, "predecessors": []} + if state: + result["state"] = state # TODO should be status not state + else: + pass #otdbrpc.taskGetStatus not implemented and maybe not needed? + + if otdb_id in found_parsets: + parset = found_parsets[otdb_id] + else: + parset = self.otdbrpc.taskGetSpecification( otdb_id=otdb_id )['specification'] + found_parsets[otdb_id] = parset + + logger.info("parset [%s]: %s" % (otdb_id, parset)) + result['specification'] = resourceIndicatorsFromParset(parset) + + key = PARSET_PREFIX + "Observation.processSubtype" + result['task_type'], result['task_subtype'] = convertSchedulerProcessSubtype(parset.get(key, "")) + + logger.info("Processing predecessors") + predecessor_ids = self.get_predecessors(parset) + for id in predecessor_ids: + predecessor_result = self.get_specification_with_predecessors(id['id'], id['source'], "", found_parsets) + if predecessor_result: + result["predecessors"].append(predecessor_result) + return result + + def onObservationPrescheduled(self, main_id, modificationTime): + # Construct root node of tree + resultTree = self.get_specification_with_predecessors(main_id, "otdb", "prescheduled", {}) + logger.info("Sending result: %s" % resultTree) + + # Put result on bus + msg = EventMessage(content=resultTree) + self.send_bus.send(msg) + logger.info("Result sent") + +def main(): + import logging + import sys + from optparse import OptionParser + from lofar.common.util import waitForInterrupt + + logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) + + # Check the invocation arguments + parser = OptionParser("%prog [options]", + description="run the rataskspecified service") + parser.add_option("-b", "--notification_bus", dest="notification_bus", type="string", + default=DEFAULT_RA_TASK_SPECIFIED_NOTIFICATION_BUSNAME, + help="Bus or queue we publish resource requests on. [default: %default]") + parser.add_option("-s", "--notification_subject", dest="notification_subject", type="string", + default=DEFAULT_RA_TASK_SPECIFIED_NOTIFICATION_SUBJECT, + help="The subject of the event messages which this service publishes. [default: %default]") + parser.add_option("--otdb_notification_bus", dest="otdb_notification_bus", type="string", + default=DEFAULT_OTDB_NOTIFICATION_BUSNAME, + help="Bus or queue where the OTDB notifications are published. [default: %default]") + parser.add_option("--otdb_notification_subject", dest="otdb_notification_subject", type="string", + default=DEFAULT_OTDB_NOTIFICATION_SUBJECT, + help="Subject of OTDB notifications on otdb_notification_bus. [default: %default]") + parser.add_option("--otdb_request_bus", dest="otdb_request_bus", type="string", + default=DEFAULT_OTDB_SERVICE_BUSNAME, + help="Bus or queue where the OTDB requests are handled. [default: %default]") + parser.add_option('-q', '--broker', dest='broker', type='string', default=None, help='Address of the qpid broker, default: localhost') + (options, args) = parser.parse_args() + + with RATaskSpecified(otdb_notification_busname=options.otdb_notification_bus, + otdb_notification_subject=options.otdb_notification_subject, + otdb_service_busname=options.otdb_request_bus, + otdb_service_subject=DEFAULT_OTDB_SERVICENAME, ##TODO parse this from command line + notification_busname=options.notification_bus, + notification_subject=options.notification_subject, + broker=options.broker): + waitForInterrupt() + + +if __name__ == "__main__": + main() diff --git a/SAS/ResourceAssignment/RATaskSpecifiedService/lib/config.py b/SAS/ResourceAssignment/RATaskSpecifiedService/lib/config.py new file mode 100644 index 0000000000000000000000000000000000000000..f5c2f48dc010af2e4cc0c23ff93b8b7b03932b92 --- /dev/null +++ b/SAS/ResourceAssignment/RATaskSpecifiedService/lib/config.py @@ -0,0 +1,5 @@ +#!/usr/bin/python +# $Id$ + +DEFAULT_RA_TASK_SPECIFIED_NOTIFICATION_BUSNAME='lofar.ra.notification' +DEFAULT_RA_TASK_SPECIFIED_NOTIFICATION_SUBJECT='RA.TaskSpecified' diff --git a/SAS/ResourceAssignment/RATaskSpecifiedService/test/tRATaskSpecified.py b/SAS/ResourceAssignment/RATaskSpecifiedService/test/tRATaskSpecified.py index 7debab33d6fa9aa0581a4ff2a452f98836e0e687..ccffef18377678f06a8e434cec42b1afd7551cdc 100644 --- a/SAS/ResourceAssignment/RATaskSpecifiedService/test/tRATaskSpecified.py +++ b/SAS/ResourceAssignment/RATaskSpecifiedService/test/tRATaskSpecified.py @@ -9,6 +9,7 @@ from RABusListener import RATaskSpecifiedBusListener from lofar.parameterset import PyParameterSet from lofar.messaging import EventMessage, Service from lofar.common.methodtrigger import MethodTrigger +from lofar.sas.otdb.config import DEFAULT_OTDB_SERVICENAME import unittest from glob import glob @@ -76,7 +77,7 @@ class TestService(unittest.TestCase): self.addCleanup(self.bus.close) # Define the services we use - self.status_service = "%s/TaskStatus" % (self.busname,) + self.status_service = "%s/%s.TaskGetSpecification" % (self.busname,DEFAULT_OTDB_SERVICENAME) # ================================ # Setup mock parset service @@ -103,7 +104,7 @@ class TestService(unittest.TestCase): PARSET_PREFIX + "Observation.Scheduler.predecessors": predecessors, } - parset_service = Service("TaskSpecification", TaskSpecificationService, busname=self.busname) + parset_service = Service(DEFAULT_OTDB_SERVICENAME+".TaskSpecification", TaskSpecificationService, busname=self.busname) parset_service.start_listening() self.addCleanup(parset_service.stop_listening) @@ -124,7 +125,9 @@ class TestService(unittest.TestCase): 3 requires nothing """ - with RATaskSpecified("OTDB.TaskSpecified", otdb_busname=self.busname, my_busname=self.busname) as jts: + with RATaskSpecified(otdb_notification_busname=self.busname, + otdb_service_busname=self.busname, + notification_busname=self.busname) as jts: # Send fake status update with ToBus(self.status_service) as tb: msg = EventMessage(content={ @@ -156,7 +159,7 @@ class TestService(unittest.TestCase): 3 requires nothing """ - with RATaskSpecified("OTDB.TaskSpecified", otdb_busname=self.busname, my_busname=self.busname) as jts: + with RATaskSpecified(otdb_notification_busname=self.busname, notification_busname=self.busname) as jts: # Send fake status update with ToBus(self.status_service) as tb: msg = EventMessage(content={ diff --git a/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/CMakeLists.txt b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..e652fe295b5fe6a754f5bf4adfa8bb2cd6c20c52 --- /dev/null +++ b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/CMakeLists.txt @@ -0,0 +1,10 @@ +# $Id: CMakeLists.txt 30355 2014-11-04 13:46:05Z loose $ + +lofar_package(RAtoOTDBTaskSpecificationPropagator 0.1 DEPENDS PyMessaging PyCommon pyparameterset) + +include(PythonInstall) +set(USE_PYTHON_COMPILATION Off) + +add_subdirectory(lib) +add_subdirectory(bin) +add_subdirectory(test) diff --git a/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/bin/CMakeLists.txt b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/bin/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..fc5d95ef35794fa8943f6f07676e8e305ce616a6 --- /dev/null +++ b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/bin/CMakeLists.txt @@ -0,0 +1,9 @@ +# $Id: CMakeLists.txt 32341 2015-08-28 11:59:26Z schaap $ + +lofar_add_bin_scripts(rotspservice) + +# supervisord config files +install(FILES + rotspservice.ini + DESTINATION etc/supervisord.d) + diff --git a/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/bin/rotspservice b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/bin/rotspservice new file mode 100755 index 0000000000000000000000000000000000000000..bcb97ba8fdc22b084f7c70d4baf7f1a46c2ee213 --- /dev/null +++ b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/bin/rotspservice @@ -0,0 +1,27 @@ +#!/usr/bin/python + +# Copyright (C) 2012-2015 ASTRON (Netherlands Institute for Radio Astronomy) +# P.O. Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. + +'''Startup script for RAtoOTDBTaskSpecificationPropagator service''' + +import sys +from lofar.sas.resourceassignment.ratootdbtaskspecificationpropagator.rotspservice import main + +if __name__ == '__main__': + main() + diff --git a/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/bin/rotspservice.ini b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/bin/rotspservice.ini new file mode 100644 index 0000000000000000000000000000000000000000..ff98cf9f2089426350dc68cadc09b056b4032f69 --- /dev/null +++ b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/bin/rotspservice.ini @@ -0,0 +1,8 @@ +[program:rotspservice] +command=/bin/bash -c 'source $LOFARROOT/lofarinit.sh;rotspservice' +user=lofarsys +stopsignal=INT ; KeyboardInterrupt +stopasgroup=true ; bash does not propagate signals +stdout_logfile=%(program_name)s.log +redirect_stderr=true +stderr_logfile=NONE diff --git a/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/CMakeLists.txt b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..7713a14080bb4ff22b0dd6f1b5120738aec341ed --- /dev/null +++ b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/CMakeLists.txt @@ -0,0 +1,11 @@ +# $Id: CMakeLists.txt 32905 2015-11-17 15:31:54Z schaap $ + +python_install( + __init__.py + rotspservice.py + translator.py + config.py + propagator.py + otdbrpc.py + DESTINATION lofar/sas/resourceassignment/ratootdbtaskspecificationpropagator) + diff --git a/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/__init__.py b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/config.py b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/config.py new file mode 100644 index 0000000000000000000000000000000000000000..e72bb94ab0897aade3307504f1e2a809ec841e1f --- /dev/null +++ b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/config.py @@ -0,0 +1,6 @@ +#!/usr/bin/python +# $Id$ + +#DEFAULT_BUSNAME = 'lofar.ra.command' +#DEFAULT_SERVICENAME = 'RAtoORTBTaskSpecificationPropagationService' + diff --git a/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/otdbrpc.py b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/otdbrpc.py new file mode 100644 index 0000000000000000000000000000000000000000..02ba5e00960d69591224e07d8182599df23656b9 --- /dev/null +++ b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/otdbrpc.py @@ -0,0 +1,147 @@ +#!/usr/bin/python + +import logging +import datetime +from lofar.messaging.RPC import RPC, RPCException, RPCWrapper +from lofar.sas.otdb.config import DEFAULT_OTDB_SERVICE_BUSNAME, DEFAULT_OTDB_SERVICENAME + +''' Simple RPC client for Service lofarbus.*Z +''' + +logger = logging.getLogger(__name__) + +class OTDBPRCException(Exception): + def __init__(self, message): + self.message = message + + def __str__(self): + return "OTDBPRCException: " + str(self.message) + +class OTDBRPC(RPCWrapper): + def __init__(self, busname=DEFAULT_OTDB_SERVICE_BUSNAME, + servicename=DEFAULT_OTDB_SERVICENAME, + broker=None): + super(OTDBRPC, self).__init__(busname, servicename, broker) + + def taskGetIDs(self, otdb_id=None, mom_id=None): + if otdb_id: + answer = self.rpc('TaskGetIDs', OtdbID=otdb_id, return_tuple=False) + elif mom_id: + answer = self.rpc('TaskGetIDs', MomID=mom_id, return_tuple=False) + else: + raise OTDBPRCException("TaskGetIDs was called without OTDB or Mom ID") + if not answer: + raise OTDBPRCException("TaskGetIDs returned an empty dict") + return {"tree_type": answer[0], "otdb_id": answer[1], "mom_id": answer[2]} + + + def taskGetSpecification(self, otdb_id=None, mom_id=None): + if otdb_id: + answer = self.rpc('TaskGetSpecification', OtdbID=otdb_id) + elif mom_id: + answer = self.rpc('TaskGetSpecification', MomID=mom_id) + else: + raise OTDBPRCException("TaskGetSpecification was called without OTDB or Mom ID") + if not answer["TaskSpecification"]: + raise OTDBPRCException("TaskGetSpecification returned an empty dict") + return {"specification": answer["TaskSpecification"]} + + def taskCreate(self, otdb_id=None, mom_id=None, template_name="", campaign_name="", specification={}): + if otdb_id: ##Can this ever be called with a otdb_id? + answer = self.rpc('TaskCreate', OtdbID=otdb_id, TemplateName=template_name, CampaignName=campaign_name, Specification=specification) + elif mom_id: + answer = self.rpc('TaskCreate', MomID=mom_id, TemplateName=template_name, CampaignName=campaign_name, Specification=specification) + else: + raise OTDBPRCException("TaskCreate was called without OTDB or Mom ID") + if not answer["Success"]: + raise OTDBPRCException("TaskCreate failed for MoM ID %i" % (mom_id,)) + return {"mom_id": answer["MomID"], "otdb_id": answer["OtdbID"]} + + def taskSetStatus(self, otdb_id=None, new_status="", update_timestamps=True): + answer = self.rpc('TaskSetStatus', OtdbID=otdb_id, NewStatus=new_status, UpdateTimestamps=update_timestamps) + if not answer["Success"]: + raise OTDBPRCException("TaskSetStatus failed for %i" % (otdb_id,)) + return {"mom_id": answer["MomID"], "otdb_id": answer["OtdbID"]} + + def taskSetSpecification(self, otdb_id=None, specification={}): + answer = self.rpc('TaskSetSpecification', OtdbID=otdb_id, Specification=specification) + if "Errors" in answer: + for key, problem in answer["Errors"].iteritems(): + logger.warning("TaskSetSpecification for %i failed to set key %s because of %s" % (otdb_id, key, problem)) + raise OTDBPRCException("TaskSetSpecification failed to set all keys for %i" % (otdb_id,)) + return {"mom_id": answer["MomID"], "otdb_id": answer["OtdbID"]} + + def taskPrepareForScheduling(self, otdb_id=None, starttime="", endtime=""): + answer = self.rpc('TaskPrepareForScheduling', OtdbID= otdb_id, StartTime=starttime, StopTime=endtime) + return {"otdb_id": answer["OtdbID"]} + + def taskDelete(self, otdb_id=None): + answer = self.rpc('TaskDelete', OtdbID=otdb_id) + if not answer["Success"]: + logger.warning("TaskDelete failed for %i" % (otdb_id,)) ##Probably was already deleted? + return {"mom_id": answer["MomID"], "otdb_id": answer["OtdbID"]} + + def getDefaultTemplates(self): + answer = self.rpc('GetDefaultTemplates') + if not answer["DefaultTemplates"]: + raise OTDBPRCException("GetDefaultTemplates returned an empty dict") + return {"default_templates": answer["DefaultTemplates"]} + + def getStations(self): + answer = self.rpc('GetStations') + if not answer["Stations"]: + raise OTDBPRCException("GetStations returned an empty dict") + return {"stations": answer["Stations"]} + + def setProject(self, name=None, title="", pi="", co_i="", contact=""): + if not name: + raise OTDBPRCException("SetProject was called with an empty project") + answer = self.rpc('SetProject', name=name, pi=pi, co_i=co_i, contact=contact) + if not answer["projectID"]: + raise OTDBPRCException("SetProject failed for %s" % (name,)) + return {"project_id": answer["projectID"]} + + +def do_tests(busname=DEFAULT_OTDB_SERVICE_BUSNAME, servicename=DEFAULT_OTDB_SERVICENAME): + with OTDBPRC(busname=busname, servicename=servicename) as rpc: + #for i in range(0, 10): + #taskId = rpc.insertTask(1234, 5678, 'active', 'OBSERVATION', 1)['id'] + #rcId = rpc.insertResourceClaim(1, taskId, datetime.datetime.utcnow(), datetime.datetime.utcnow() + datetime.timedelta(hours=1), 'CLAIMED', 1, 10, 'einstein', -1)['id'] + #print rpc.getResourceClaim(rcId) + #rpc.updateResourceClaim(rcId, starttime=datetime.datetime.utcnow(), endtime=datetime.datetime.utcnow() + datetime.timedelta(hours=2), status='ALLOCATED') + #print rpc.getResourceClaim(rcId) + #print + + #tasks = rpc.getTasks() + #for t in tasks: + #print rpc.getTask(t['id']) + #for i in range(4,9): + #rcId = rpc.insertResourceClaim(i, t['id'], datetime.datetime.utcnow(), datetime.datetime.utcnow() + datetime.timedelta(hours=1), 'CLAIMED', 1, 10, 'einstein', -1)['id'] + ##print rpc.deleteTask(t['id']) + ##print rpc.getTasks() + ##print rpc.getResourceClaims() + + #print + #taskId = tasks[0]['id'] + #print 'taskId=', taskId + #print rpc.getResourceClaimsForTask(taskId) + #print rpc.updateResourceClaimsForTask(taskId, starttime=datetime.datetime.utcnow(), endtime=datetime.datetime.utcnow() + datetime.timedelta(hours=3)) + #print rpc.getResourceClaimsForTask(taskId) + + #print rpc.getTasks() + #print rpc.getResourceClaims() + #print rpc.getResources() + #print rpc.getResourceGroups() + #print rpc.getResourceGroupMemberships() + + #rpc.deleteTask(taskId) + + #print rpc.getTasks() + #print rpc.getResourceClaims() + pass + + + +if __name__ == '__main__': + logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) + do_tests() diff --git a/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/propagator.py b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/propagator.py new file mode 100755 index 0000000000000000000000000000000000000000..b902885226a57b54dd0a8b045056032a8e7fd832 --- /dev/null +++ b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/propagator.py @@ -0,0 +1,144 @@ +#!/usr/bin/env python + +# Copyright (C) 2015 +# ASTRON (Netherlands Institute for Radio Astronomy) +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. +# +# $Id: assignment.py 1580 2015-09-30 14:18:57Z loose $ + +""" +RAtoOTDBTaskSpecificationPropagator gets a task to be scheduled in OTDB, +reads the info from the RA DB and sends it to OTDB in the correct format. +""" + +import logging +import datetime +import time + +from lofar.messaging.RPC import RPC, RPCException +from lofar.parameterset import parameterset + +from lofar.sas.resourceassignment.resourceassignmentservice.rpc import RARPC as RADBRPC +from lofar.sas.resourceassignment.resourceassignmentservice.config import DEFAULT_BUSNAME as RADB_BUSNAME +from lofar.sas.resourceassignment.resourceassignmentservice.config import DEFAULT_SERVICENAME as RADB_SERVICENAME + +from lofar.sas.resourceassignment.ratootdbtaskspecificationpropagator.otdbrpc import OTDBRPC +from lofar.sas.otdb.config import DEFAULT_OTDB_SERVICE_BUSNAME, DEFAULT_OTDB_SERVICENAME +from lofar.sas.resourceassignment.ratootdbtaskspecificationpropagator.translator import RAtoOTDBTranslator + +from lofar.mom.momqueryservice.momqueryrpc import MoMRPC +from lofar.mom.momqueryservice.config import DEFAULT_BUSNAME as DEFAULT_MOM_BUSNAME +from lofar.mom.momqueryservice.config import DEFAULT_SERVICENAME as DEFAULT_MOM_SERVICENAME + +logger = logging.getLogger(__name__) + + +class RAtoOTDBPropagator(): + def __init__(self, + radb_busname=RADB_BUSNAME, + radb_servicename=RADB_SERVICENAME, + radb_broker=None, + otdb_busname=DEFAULT_OTDB_SERVICE_BUSNAME, + otdb_servicename=DEFAULT_OTDB_SERVICENAME, + mom_busname=DEFAULT_MOM_BUSNAME, + mom_servicename=DEFAULT_MOM_SERVICENAME, + otdb_broker=None, + mom_broker=None, + broker=None): + """ + RAtoOTDBPropagator updates tasks in the OTDB after the ResourceAssigner is done with them. + :param radb_busname: busname on which the radb service listens (default: lofar.ra.command) + :param radb_servicename: servicename of the radb service (default: RADBService) + :param radb_broker: valid Qpid broker host (default: None, which means localhost) + :param otdb_busname: busname on which the OTDB service listens (default: lofar.otdb.command) + :param otdb_servicename: servicename of the OTDB service (default: OTDBService) + :param otdb_broker: valid Qpid broker host (default: None, which means localhost) + :param broker: if specified, overrules radb_broker and otdb_broker. Valid Qpid broker host (default: None, which means localhost) + """ + if broker: + radb_broker = broker + otdb_broker = broker + mom_broker = broker + + self.radbrpc = RADBRPC(busname=radb_busname, servicename=radb_servicename, broker=radb_broker) ## , ForwardExceptions=True hardcoded in RPCWrapper right now + self.otdbrpc = OTDBRPC(busname=otdb_busname, servicename=otdb_servicename, broker=otdb_broker) ## , ForwardExceptions=True hardcoded in RPCWrapper right now + self.momrpc = MoMRPC(busname=mom_busname, servicename=mom_servicename, broker=mom_broker) + self.translator = RAtoOTDBTranslator() + + def __enter__(self): + """Internal use only. (handles scope 'with')""" + self.open() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + """Internal use only. (handles scope 'with')""" + self.close() + + def open(self): + """Open rpc connections to radb service and resource estimator service""" + self.radbrpc.open() + self.otdbrpc.open() + self.momrpc.open() + + def close(self): + """Close rpc connections to radb service and resource estimator service""" + self.radbrpc.close() + self.otdbrpc.close() + self.momrpc.close() + + def doTaskConflict(self, ra_id, otdb_id, mom_id): + logger.info('doTaskConflict: otdb_id=%s mom_id=%s' % (otdb_id, mom_id)) + if not otdb_id: + logger.warning('doTaskConflict no valid otdb_id: otdb_id=%s' % (otdb_id,)) + return + self.otdbrpc.taskSetStatus(otdb_id, 'conflict') + + def doTaskScheduled(self, ra_id, otdb_id, mom_id): + try: + logger.info('doTaskScheduled: otdb_id=%s mom_id=%s' % (otdb_id, mom_id)) + if not otdb_id: + logger.warning('doTaskScheduled no valid otdb_id: otdb_id=%s' % (otdb_id,)) + return + ra_info = self.getRAinfo(ra_id) + project = self.momrpc.getProjectDetails(mom_id) + logger.info(project) + project_name = "_".join(project[str(mom_id)]['project_name'].split()) + otdb_info = self.translator.CreateParset(otdb_id, ra_info, project_name) + logger.debug("Parset info for OTDB: %s" %otdb_info) + self.setOTDBinfo(otdb_id, otdb_info, 'scheduled') + except Exception as e: + logger.error(e) + self.doTaskConflict(ra_id, otdb_id, mom_id) + + def getRAinfo(self, ra_id): + info = {} + info["storage"] = {} + task = self.radbrpc.getTask(ra_id) + claims = self.radbrpc.getResourceClaims(task_id=ra_id, extended=True, include_properties=True) + for claim in claims: + logger.debug("Processing claim: %s" % claim) + if claim['resource_type_name'] == 'storage': + info['storage'] = claim + info["starttime"] = task["starttime"] + info["endtime"] = task["endtime"] + info["status"] = task["status"] + return info + + def setOTDBinfo(self, otdb_id, otdb_info, otdb_status): + self.otdbrpc.taskSetSpecification(otdb_id, otdb_info) + self.otdbrpc.taskPrepareForScheduling(otdb_id, otdb_info["LOFAR.ObsSW.Observation.startTime"], otdb_info["LOFAR.ObsSW.Observation.stopTime"]) + self.otdbrpc.taskSetStatus(otdb_id, otdb_status) diff --git a/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/rotspservice.py b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/rotspservice.py new file mode 100755 index 0000000000000000000000000000000000000000..98b29ea356eba84252bf2bcdfd54c694486bd303 --- /dev/null +++ b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/rotspservice.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python + +# rotspservice.py: RAtoOTDBTaskSpecificationPropagator listens on the lofar ?? bus and calls onTaskScheduled +# +# Copyright (C) 2015 +# ASTRON (Netherlands Institute for Radio Astronomy) +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. +# +# $Id: rotspservice.py 1580 2015-09-30 14:18:57Z loose $ + +""" +RATaskStatusChangedListener listens to a bus on which tasks handled by the ResourceAssigner get published. +It will then try to propagate the changes to OTDB as Scheduled or Conflict. +""" + +import qpid.messaging +import logging +from datetime import datetime +import time + +from lofar.messaging.RPC import RPC, RPCException + +import lofar.sas.resourceassignment.resourceassignmentservice.rpc as rarpc ## RA DB +from lofar.sas.resourceassignment.database.radbbuslistener import RADBBusListener +from lofar.sas.resourceassignment.database.config import DEFAULT_NOTIFICATION_BUSNAME as RA_NOTIFICATION_BUSNAME +from lofar.sas.resourceassignment.database.config import DEFAULT_NOTIFICATION_PREFIX as RA_NOTIFICATION_PREFIX +from lofar.sas.resourceassignment.ratootdbtaskspecificationpropagator.propagator import RAtoOTDBPropagator + +logger = logging.getLogger(__name__) + +class RATaskStatusChangedListener(RADBBusListener): + def __init__(self, + busname=RA_NOTIFICATION_BUSNAME, + subject=RA_NOTIFICATION_PREFIX + 'TaskUpdated', + broker=None, + propagator=None, ## TODO also give translator? + **kwargs): + """ + RATaskScheduledListener listens on the lofar ?? bus and calls onTaskScheduled or onTaskConclict + :param busname: valid Qpid address (default: lofar.ra.notification) + :param broker: valid Qpid broker host (default: None, which means localhost) + additional parameters in kwargs: + options= <dict> Dictionary of options passed to QPID + exclusive= <bool> Create an exclusive binding so no other services can consume duplicate messages (default: False) + numthreads= <int> Number of parallel threads processing messages (default: 1) + verbose= <bool> Output extra logging over stdout (default: False) + """ + super(RATaskStatusChangedListener, self).__init__(busname=busname, subjects=subject, broker=broker, **kwargs) + + self.propagator = propagator + if not self.propagator: + self.propagator = RAtoOTDBPropagator() + + def onTaskUpdated(self, old_task, new_task): + # override super onTaskUpdated + # check for status change, and call either onTaskScheduled or onTaskScheduled + if old_task['status_id'] != new_task['status_id']: + if new_task['status'] == 'scheduled': + self.onTaskScheduled(new_task['id'], new_task['otdb_id'], new_task['mom_id']) + elif new_task['status'] == 'conflict': + self.onTaskConflict(new_task['id'], new_task['otdb_id'], new_task['mom_id']) + + def onTaskScheduled(self, ra_id, otdb_id, mom_id): + logger.info('onTaskScheduled: ra_id=%s otdb_id=%s mom_id=%s' % (ra_id, otdb_id, mom_id)) + + self.propagator.doTaskScheduled(ra_id, otdb_id, mom_id) + + def onTaskConflict(self, ra_id, otdb_id, mom_id): + logger.info('onTaskConflict: ra_id=%s otdb_id=%s mom_id=%s' % (ra_id, otdb_id, mom_id)) + + self.propagator.doTaskConflict(ra_id, otdb_id, mom_id) + + +__all__ = ["RATaskStatusChangedListener"] + +def main(): + from optparse import OptionParser + from lofar.messaging import setQpidLogLevel + from lofar.common.util import waitForInterrupt + + from lofar.sas.resourceassignment.resourceassignmentservice.config import DEFAULT_BUSNAME as RADB_BUSNAME + from lofar.sas.resourceassignment.resourceassignmentservice.config import DEFAULT_SERVICENAME as RADB_SERVICENAME + from lofar.sas.otdb.config import DEFAULT_OTDB_SERVICE_BUSNAME, DEFAULT_OTDB_SERVICENAME + + from lofar.mom.momqueryservice.config import DEFAULT_BUSNAME as DEFAULT_MOM_BUSNAME + from lofar.mom.momqueryservice.config import DEFAULT_SERVICENAME as DEFAULT_MOM_SERVICENAME + + + # Check the invocation arguments + parser = OptionParser("%prog [options]", + description='runs the RAtoOTDBTaskSpecificationPropagator service') + parser.add_option('-q', '--broker', dest='broker', type='string', default=None, help='Address of the qpid broker, default: localhost') + parser.add_option("--notification_busname", dest="notification_busname", type="string", default=RA_NOTIFICATION_BUSNAME, help="Name of the notification bus on which messages are published, default: %default") + parser.add_option("--notification_subject", dest="notification_subject", type="string", default=RA_NOTIFICATION_PREFIX+'TaskUpdated', help="Subject of the published messages to listen for, default: %default") + parser.add_option("--radb_busname", dest="radb_busname", type="string", default=RADB_BUSNAME, help="Name of the bus on which the RADB service listens, default: %default") + parser.add_option("--radb_servicename", dest="radb_servicename", type="string", default=RADB_SERVICENAME, help="Name of the RADB service, default: %default") + parser.add_option("--otdb_busname", dest="otdb_busname", type="string", default=DEFAULT_OTDB_SERVICE_BUSNAME, help="Name of the bus on which the OTDB service listens, default: %default") + parser.add_option("--otdb_servicename", dest="otdb_servicename", type="string", default=DEFAULT_OTDB_SERVICENAME, help="Name of the OTDB service, default: %default") + parser.add_option("--mom_busname", dest="mom_busname", type="string", default=DEFAULT_MOM_BUSNAME, help="Name of the bus on which the MoM service listens, default: %default") + parser.add_option("--mom_servicename", dest="mom_servicename", type="string", default=DEFAULT_MOM_SERVICENAME, help="Name of the MoM service, default: %default") + parser.add_option('-V', '--verbose', dest='verbose', action='store_true', help='verbose logging') + (options, args) = parser.parse_args() + + logging.getLogger('lofar.sas.resourceassignment.database.radbbuslistener').level = logging.WARN + setQpidLogLevel(logging.INFO) + logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', + level=logging.DEBUG if options.verbose else logging.INFO) + + with RAtoOTDBPropagator(radb_busname=options.radb_busname, + radb_servicename=options.radb_servicename, + otdb_busname=options.otdb_busname, + otdb_servicename=options.otdb_servicename, + mom_busname=options.mom_busname, + mom_servicename=options.mom_servicename, + broker=options.broker) as propagator: + with RATaskStatusChangedListener(busname=options.notification_busname, + subject=options.notification_subject, + broker=options.broker, + propagator=propagator) as listener: + waitForInterrupt() + +if __name__ == '__main__': + main() diff --git a/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/translator.py b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/translator.py new file mode 100755 index 0000000000000000000000000000000000000000..9ac56974fe0240008e4b5b745e07ba49d9cb7d3b --- /dev/null +++ b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/lib/translator.py @@ -0,0 +1,194 @@ +#!/usr/bin/env python + +# Copyright (C) 2015 +# ASTRON (Netherlands Institute for Radio Astronomy) +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. +# +# $Id: assignment.py 1580 2015-09-30 14:18:57Z loose $ + +""" +RAtoOTDBTaskSpecificationPropagator gets a task to be scheduled in OTDB, +reads the info from the RA DB and sends it to OTDB in the correct format. +""" + +import logging +from lofar.common.util import to_csv_string +from math import ceil, floor + +#from lofar.parameterset import parameterset + +logger = logging.getLogger(__name__) + +""" Prefix that is common to all parset keys, depending on the exact source. """ +PREFIX="LOFAR.ObsSW.Observation." +##TODO use this. + +class RAtoOTDBTranslator(): + def __init__(self): + """ + RAtoOTDBTranslator translates values from the RADB into parset keys to be stored in an OTDB Tree + """ + + def CreateCorrelated(self, otdb_id, storage_properties, project_name): + sb_nr = 0 + locations = [] + filenames = [] + result = {} + for sap in storage_properties["saps"]: ##We might need to sort saps? + logging.debug('processing sap: %s' % sap) + if "nr_of_uv_files" in sap['properties']: + for _ in xrange(sap['properties']['nr_of_uv_files']): + locations.append("CEP4:/data/projects/%s/L%d" % (project_name, otdb_id)) + filenames.append("L%d_SAP%03d_SB%03d_uv.MS" % (otdb_id, sap['sap_nr'], sb_nr)) + sb_nr += 1 + result[PREFIX + 'DataProducts.Output_Correlated.locations'] = '[' + to_csv_string(locations) + ']' + result[PREFIX + 'DataProducts.Output_Correlated.filenames'] = '[' + to_csv_string(filenames) + ']' + return result + + def CreateCoherentStokes(self, otdb_id, storage_properties, project_name): + SB_nr = 0 + locations = [] + filenames = [] + result = {} + nr_stokes = storage_properties['nr_of_cs_stokes'] + for sap in storage_properties["saps"]: ##We might need to sort saps? + if "nr_of_cs_files" in sap['properties']: + nr_files = sap['properties']['nr_of_cs_files'] + nr_tabs = sap['properties']['nr_of_tabs'] + nr_parts = int(ceil(nr_files/float(nr_tabs * nr_stokes))) + for tab in xrange(nr_tabs): + for stokes in xrange(nr_stokes): + for part in xrange(nr_parts): + locations.append("CEP4:/data/projects/%s/L%d" % (project_name, otdb_id)) + filenames.append("L%d_SAP%03d_B%03d_S%d_P%03d_bf.h5" % (otdb_id, sap['sap_nr'], tab, stokes, part)) + result[PREFIX + 'DataProducts.Output_CoherentStokes.locations'] = '[' + to_csv_string(locations) + ']' + result[PREFIX + 'DataProducts.Output_CoherentStokes.filenames'] = '[' + to_csv_string(filenames) + ']' + return result + + def CreateIncoherentStokes(self, otdb_id, storage_properties, project_name): + SB_nr = 0 + locations = [] + filenames = [] + result = {} + nr_stokes = storage_properties['nr_of_is_stokes'] + for sap in storage_properties["saps"]: ##We might need to sort saps? + if "nr_of_is_files" in sap['properties']: + nr_files = sap['properties']['nr_of_is_files'] + nr_tabs = sap['properties']['nr_of_tabs'] + nr_parts = int(ceil(nr_files/float(nr_tabs * nr_stokes))) + for tab in xrange(nr_tabs): + for stokes in xrange(nr_stokes): + for part in xrange(nr_parts): + locations.append("CEP4:/data/projects/%s/L%d" % (project_name, otdb_id)) + filenames.append("L%d_SAP%03d_B%03d_S%d_P%03d_bf.h5" % (otdb_id, sap['sap_nr'], tab, stokes, part)) + result[PREFIX + 'DataProducts.Output_IncoherentStokes.locations'] = '[' + to_csv_string(locations) + ']' + result[PREFIX + 'DataProducts.Output_IncoherentStokes.filenames'] = '[' + to_csv_string(filenames) + ']' + return result + + def CreateCreateInstrumentModel(self, otdb_id, storage_properties, project_name): + SB_nr = 0 + locations = [] + filenames = [] + result = {} + for sap in storage_properties["saps"]: ##We might need to sort saps? + if "nr_of_im_files" in sap['properties']: + for _ in range(sap['properties']['nr_of_im_files']): + locations.append("CEP4:/data/projects/%s/L%d" % (project_name, otdb_id)) + filenames.append("L%d_SAP%03d_SB%03d_inst.INST" % (otdb_id, sap['sap_nr'], sb_nr)) + result[PREFIX + 'DataProducts.Output_InstrumentModel.locations'] = '[' + to_csv_string(locations) + ']' + result[PREFIX + 'DataProducts.Output_InstrumentModel.filenames'] = '[' + to_csv_string(filenames) + ']' + return result + + def CreateSkyImage(self, otdb_id, storage_properties, project_name): + SB_nr = 0 + locations = [] + filenames = [] + result = {} + for sap in storage_properties["saps"]: ##We might need to sort saps? + if "nr_of_img_files" in sap['properties']: + for _ in range(sap['properties']['nr_of_img_files']): + locations.append("CEP4:/data/projects/%s/L%d" % (project_name, otdb_id)) + filenames.append("L%d_SAP%03d_SB%03d_sky.IM" % (otdb_id, sap['sap_nr'], sb_nr)) + result[PREFIX + 'DataProducts.Output_SkyImage.locations'] = '[' + to_csv_string(locations) + ']' + result[PREFIX + 'DataProducts.Output_SkyImage.filenames'] = '[' + to_csv_string(filenames) + ']' + return result + + def CreatePulsarPipeline(self, otdb_id, storage_properties, project_name): + SB_nr = 0 + locations = [] + filenames = [] + result = {} + for sap in storage_properties["saps"]: ##We might need to sort saps? + if "nr_of_uv_files" in sap['properties']: + for _ in range(sap['properties']['nr_of_pulp_files']): + locations.append("CEP4:/data/projects/%s/L%d" % (project_name, otdb_id)) + filenames.append("L%d_SAP%03d_SB%03d_bf.h5" % (otdb_id, sap['sap_nr'], sb_nr)) + result[PREFIX + 'DataProducts.Output_Pulsar.locations'] = '[' + to_csv_string(locations) + ']' + result[PREFIX + 'DataProducts.Output_Pulsar.filenames'] = '[' + to_csv_string(filenames) + ']' + return result + + + def CreateStorageKeys(self, otdb_id, storage_properties, project_name): + logging.debug(otdb_id, storage_properties) + result = {} + if 'nr_of_uv_files' in storage_properties: + result.update(self.CreateCorrelated(otdb_id, storage_properties, project_name)) + if 'nr_of_cs_files' in storage_properties: + result.update(self.CreateCoherentStokes(otdb_id, storage_properties, project_name)) + if 'nr_of_is_files' in storage_properties: + result.update(self.CreateIncoherentStokes(otdb_id, storage_properties, project_name)) + if 'nr_of_im_files' in storage_properties: + result.update(self.CreateInstrumentModel(otdb_id, storage_properties, project_name)) + if 'nr_of_img_files' in storage_properties: + result.update(self.CreateSkyImage(otdb_id, storage_properties, project_name)) + if 'nr_of_pulp_files' in storage_properties: + result.update(self.CreatePulsarPipeline(otdb_id, storage_properties, project_name)) + return result + + def parseStorageProperties(self, storage_claim): + result = {} + result['saps'] = [] + if 'saps' in storage_claim: + for s in storage_claim['saps']: + properties = {} + for p in s['properties']: + properties[p['type_name']] = p['value'] + result['saps'].append({'sap_nr' : s['sap_nr'], 'properties': properties}) + for p in storage_claim['properties']: + result[p['type_name']] = p['value'] + return result + + def CreateParset(self, otdb_id, ra_info, project_name): + logger.info('CreateParset: start=%s, end=%s' % (ra_info['starttime'], ra_info['endtime'])) + + parset = {} + #parset[PREFIX+'momID'] = str(mom_id) + parset[PREFIX+'startTime'] = ra_info['starttime'].strftime('%Y-%m-%d %H:%M:%S') + parset[PREFIX+'stopTime'] = ra_info['endtime'].strftime('%Y-%m-%d %H:%M:%S') + + if 'storage' in ra_info: + logging.debug(ra_info['storage']) + parset.update(self.CreateStorageKeys(otdb_id, self.parseStorageProperties(ra_info['storage']), project_name)) + if 'stations' in ra_info: + parset[PREFIX+'VirtualInstrument.stationList'] = ra_info["stations"] + return parset + + + + + + diff --git a/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/test/CMakeLists.txt b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/test/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..bef78ee1fbe64cba4cc7d0a8fee4630c7559ab18 --- /dev/null +++ b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/test/CMakeLists.txt @@ -0,0 +1,6 @@ +# $Id: CMakeLists.txt 32333 2015-08-28 08:15:24Z schaap $ +include(LofarCTest) + +lofar_add_test(t_rotspservice) + + diff --git a/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/test/t_rotspservice.py b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/test/t_rotspservice.py new file mode 100755 index 0000000000000000000000000000000000000000..19e4f19a2cdee3ddd6d40ada7baf166a261c87fe --- /dev/null +++ b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/test/t_rotspservice.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python + +import unittest +import sys +import datetime +import logging +import inspect +from lofar.messaging.RPC import RPC + +logger = logging.getLogger(__name__) +logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) + +try: + from mock import MagicMock + from mock import patch +except ImportError: + print 'Cannot run test without python MagicMock' + print 'Please install MagicMock: pip install mock' + exit(3) + + +print 'TODO: fix test' +exit(3) + +# the system under test is the ResourceAssigner, not the RARPC +# so, patch (mock) the RARPC class during these tests. +# when the ResourceAssigner instantiates an RARPC it will get the mocked class. +with patch('lofar.sas.resourceassignment.ratootdbtaskspecificationpropagator.rpc.RARPC', autospec=True) as MockRARPC, \ + patch.object(RPC, 'execute') as mockRPC_execute, \ + patch.object(RPC, 'open'), \ + patch.object(RPC, 'close'): + mockRARPC = MockRARPC.return_value + + # modify the return values of the various RARPC methods with pre-cooked answers + mockRARPC.getTask.return_value = {u'status': u'active', u'status_id': 600, u'type_id': 0, u'specification_id': 8, u'starttime': datetime.datetime(2016, 2, 14, 20, 0), u'mom_id': 634163, u'endtime': datetime.datetime(2016, 2, 14, 21, 30), u'type': u'Observation', u'id': 9355, u'otdb_id': 431140} + + #mock the RPC execute method + def mockRPCExecute(*arg, **kwarg): + #trick to get the servicename via the callstack from within this mock method + servicename = inspect.stack()[3][0].f_locals['self'].ServiceName + + #give pre-cooked answer depending on called service + if servicename == 'ResourceEstimator': + return {'Observation':{'total_data_size':1, 'total_bandwidth':1, 'output_files':1}}, "OK" + elif servicename == 'SSDBService.GetActiveGroupNames': + return {0:'storagenodes', 1:'computenodes', 2:'archivenodes', 3:'locusnodes', 4:'cep4'}, "OK" + elif servicename == 'SSDBService.GetHostForGID': + return {u'groupname': u'cep4', u'nodes': [{u'claimedspace': 0, u'totalspace': 702716, u'statename': u'Active', u'usedspace': 23084, u'id': 1, u'groupname': u'cep4', u'path': u'/lustre', u'hostname': u'lustre001'}]}, "OK" + + return None, None + + mockRPC_execute.side_effect = mockRPCExecute + + ## import ResourceAssigner now, so it will use the mocked classes and methods + #from lofar.sas.resourceassignment.ratootdbtaskspecificationpropagator.? import ? + + ##define the test class + #class RAtoOTDBTaskSpecificationPropagatorTest(unittest.TestCase): + #'''Test the logic in the RAtoOTDBTaskSpecificationPropagator''' + + #def testRAtoOTDBTaskSpecificationPropagator(self): + #with RAtoOTDBTaskSpecificationPropagator() as rotsp: + ##define inputs + #sasId='431140' + #parsets={u'431140': {u'Observation.DataProducts.Output_InstrumentModel.enabled': False, u'Observation.stopTime': u'2016-02-14 21:30:00', u'Observation.VirtualInstrument.stationList': [u'CS005', u'CS001', u'CS011', u'CS401', u'CS002', u'CS007', u'CS201', u'CS032', u'CS003', u'CS101', u'CS028', u'CS017', u'CS024', u'CS103', u'CS026', u'CS501', u'CS031', u'CS301', u'CS030', u'CS302', u'CS004', u'CS006', u'CS021'], u'Observation.DataProducts.Input_CoherentStokes.enabled': False, u'Observation.DataProducts.Output_CoherentStokes.enabled': True, u'Task.type': u'Observation', u'Observation.Beam[0].subbandList': [51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450], u'Observation.DataProducts.Input_Correlated.skip': [], u'Observation.antennaSet': u'LBA_OUTER', u'Observation.nrBitsPerSample': u'8', u'Observation.Beam[0].nrTabRings': u'0', u'Version.number': u'33385', u'Observation.DataProducts.Output_IncoherentStokes.enabled': False, u'Observation.DataProducts.Input_IncoherentStokes.enabled': False, u'Observation.DataProducts.Input_Correlated.enabled': False, u'Observation.Beam[0].TiedArrayBeam[0].coherent': True, u'Observation.DataProducts.Output_Pulsar.enabled': False, u'Observation.DataProducts.Input_CoherentStokes.skip': [], u'Observation.DataProducts.Output_SkyImage.enabled': False, u'Task.subtype': u'BFMeasurement', u'Observation.momID': u'634163', u'Observation.startTime': u'2016-02-14 20:00:00', u'Observation.nrBeams': u'1', u'Observation.DataProducts.Input_IncoherentStokes.skip': [], u'Observation.DataProducts.Output_Correlated.enabled': False, u'Observation.sampleClock': u'200'}} + + ##test the main assignment method + #rotsp.do?(sasId, parsets) + + ##TODO: added test asserts etc + + #unittest.main(verbosity=2) diff --git a/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/test/t_rotspservice.run b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/test/t_rotspservice.run new file mode 100755 index 0000000000000000000000000000000000000000..ed9f65f684d25688efe47919388ffc5547e37ab1 --- /dev/null +++ b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/test/t_rotspservice.run @@ -0,0 +1,6 @@ +#!/bin/bash + +# Run the unit test +source python-coverage.sh +python_coverage_test "rotspservice*" t_rotspservice.py + diff --git a/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/test/t_rotspservice.sh b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/test/t_rotspservice.sh new file mode 100755 index 0000000000000000000000000000000000000000..ccb800fbdb1712299921c2aa18cacdea3fdb0b69 --- /dev/null +++ b/SAS/ResourceAssignment/RAtoOTDBTaskSpecificationPropagator/test/t_rotspservice.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +./runctest.sh t_rotspservice diff --git a/SAS/ResourceAssignment/ResourceAssigner/CMakeLists.txt b/SAS/ResourceAssignment/ResourceAssigner/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..e78a2d4035fd64feec25aa3ade452677df9e061b --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssigner/CMakeLists.txt @@ -0,0 +1,10 @@ +# $Id: CMakeLists.txt 30355 2014-11-04 13:46:05Z loose $ + +lofar_package(ResourceAssigner 0.1 DEPENDS PyMessaging PyCommon pyparameterset) + +include(PythonInstall) +set(USE_PYTHON_COMPILATION Off) + +add_subdirectory(lib) +add_subdirectory(bin) +add_subdirectory(test) diff --git a/SAS/ResourceAssignment/ResourceAssigner/bin/CMakeLists.txt b/SAS/ResourceAssignment/ResourceAssigner/bin/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..13b5a2fc8f346242cb0442295acc79a62d09ebb6 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssigner/bin/CMakeLists.txt @@ -0,0 +1,9 @@ +# $Id: CMakeLists.txt 32341 2015-08-28 11:59:26Z schaap $ + +lofar_add_bin_scripts(resourceassigner) + +# supervisord config files +install(FILES + resourceassigner.ini + DESTINATION etc/supervisord.d) + diff --git a/SAS/ResourceAssignment/ResourceAssigner/bin/resourceassigner b/SAS/ResourceAssignment/ResourceAssigner/bin/resourceassigner new file mode 100755 index 0000000000000000000000000000000000000000..c8ca3f27fba1a93fb0b0c59f499206db7d64358b --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssigner/bin/resourceassigner @@ -0,0 +1,27 @@ +#!/usr/bin/python + +# Copyright (C) 2012-2015 ASTRON (Netherlands Institute for Radio Astronomy) +# P.O. Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. + +'''Startup script for resourceassigner service''' + +import sys +from lofar.sas.resourceassignment.resourceassigner.raservice import main + +if __name__ == '__main__': + main() + diff --git a/SAS/ResourceAssignment/ResourceAssigner/bin/resourceassigner.ini b/SAS/ResourceAssignment/ResourceAssigner/bin/resourceassigner.ini new file mode 100644 index 0000000000000000000000000000000000000000..a144ded3d438cf63137bcaf97bc96b6f605682b1 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssigner/bin/resourceassigner.ini @@ -0,0 +1,8 @@ +[program:resourceassigner] +command=/bin/bash -c 'source $LOFARROOT/lofarinit.sh;resourceassigner' +user=lofarsys +stopsignal=INT ; KeyboardInterrupt +stopasgroup=true ; bash does not propagate signals +stdout_logfile=%(program_name)s.log +redirect_stderr=true +stderr_logfile=NONE diff --git a/SAS/ResourceAssignment/ResourceAssigner/lib/CMakeLists.txt b/SAS/ResourceAssignment/ResourceAssigner/lib/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..658a170041262a2c9dcd476386390870c97aba0c --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssigner/lib/CMakeLists.txt @@ -0,0 +1,9 @@ +# $Id: CMakeLists.txt 32905 2015-11-17 15:31:54Z schaap $ + +python_install( + __init__.py + raservice.py + assignment.py + config.py + DESTINATION lofar/sas/resourceassignment/resourceassigner) + diff --git a/SAS/ResourceAssignment/ResourceAssigner/lib/__init__.py b/SAS/ResourceAssignment/ResourceAssigner/lib/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/SAS/ResourceAssignment/ResourceAssigner/lib/assignment.py b/SAS/ResourceAssignment/ResourceAssigner/lib/assignment.py new file mode 100755 index 0000000000000000000000000000000000000000..01697f554aecbda4add1e49c92926fe456eef572 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssigner/lib/assignment.py @@ -0,0 +1,314 @@ +#!/usr/bin/env python + +# Copyright (C) 2015 +# ASTRON (Netherlands Institute for Radio Astronomy) +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. +# +# $Id: assignment.py 1580 2015-09-30 14:18:57Z loose $ + +""" +ResourceAssigner inserts/updates tasks and assigns resources to it based on incoming parset. +""" + +import logging +from datetime import datetime, timedelta +import time +import collections + +from lofar.common.util import humanreadablesize +from lofar.messaging.RPC import RPC, RPCException +from lofar.parameterset import parameterset + +from lofar.sas.resourceassignment.resourceassignmentservice.rpc import RARPC +from lofar.sas.resourceassignment.resourceassignmentservice.config import DEFAULT_BUSNAME as RADB_BUSNAME +from lofar.sas.resourceassignment.resourceassignmentservice.config import DEFAULT_SERVICENAME as RADB_SERVICENAME + +from lofar.sas.resourceassignment.resourceassignmentestimator.config import DEFAULT_BUSNAME as RE_BUSNAME +from lofar.sas.resourceassignment.resourceassignmentestimator.config import DEFAULT_SERVICENAME as RE_SERVICENAME + +from lofar.sas.systemstatus.service.SSDBrpc import SSDBRPC +from lofar.sas.systemstatus.service.config import DEFAULT_SSDB_BUSNAME +from lofar.sas.systemstatus.service.config import DEFAULT_SSDB_SERVICENAME + +logger = logging.getLogger(__name__) + +class ResourceAssigner(): + def __init__(self, + radb_busname=RADB_BUSNAME, + radb_servicename=RADB_SERVICENAME, + radb_broker=None, + re_busname=RE_BUSNAME, + re_servicename=RE_SERVICENAME, + re_broker=None, + ssdb_busname=DEFAULT_SSDB_BUSNAME, + ssdb_servicename=DEFAULT_SSDB_SERVICENAME, + ssdb_broker=None, + broker=None): + """ + ResourceAssigner inserts/updates tasks in the radb and assigns resources to it based on incoming parset. + :param radb_busname: busname on which the radb service listens (default: lofar.ra.command) + :param radb_servicename: servicename of the radb service (default: RADBService) + :param radb_broker: valid Qpid broker host (default: None, which means localhost) + :param re_busname: busname on which the resource estimator service listens (default: lofar.ra.command) + :param re_servicename: servicename of the resource estimator service (default: ResourceEstimation) + :param re_broker: valid Qpid broker host (default: None, which means localhost) + :param ssdb_busname: busname on which the ssdb service listens (default: lofar.system) + :param ssdb_servicename: servicename of the radb service (default: SSDBService) + :param ssdb_broker: valid Qpid broker host (default: None, which means localhost) + :param broker: if specified, overrules radb_broker, re_broker and ssdb_broker. Valid Qpid broker host (default: None, which means localhost) + """ + if broker: + radb_broker = broker + re_broker = broker + ssdb_broker = broker + + self.radbrpc = RARPC(servicename=radb_servicename, busname=radb_busname, broker=radb_broker) + self.rerpc = RPC(re_servicename, busname=re_busname, broker=re_broker, ForwardExceptions=True) + self.ssdbrpc = SSDBRPC(servicename=ssdb_servicename, busname=ssdb_busname, broker=ssdb_broker) + + def __enter__(self): + """Internal use only. (handles scope 'with')""" + self.open() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + """Internal use only. (handles scope 'with')""" + self.close() + + def open(self): + """Open rpc connections to radb service and resource estimator service""" + self.radbrpc.open() + self.rerpc.open() + self.ssdbrpc.open() + + def close(self): + """Close rpc connections to radb service and resource estimator service""" + self.radbrpc.close() + self.rerpc.close() + self.ssdbrpc.close() + + def doAssignment(self, specification_tree): + logger.info('doAssignment: specification_tree=%s' % (specification_tree)) + + otdb_id = specification_tree['otdb_id'] + taskType = specification_tree.get('task_type', '').lower() + status = specification_tree.get('state', 'prescheduled').lower() + + #parse main parset... + mainParset = parameterset(specification_tree['specification']) + + if not self.checkCluster(mainParset): + return + + momId = mainParset.getInt('Observation.momID', -1) + startTime = datetime.strptime(mainParset.getString('Observation.startTime'), '%Y-%m-%d %H:%M:%S') + endTime = datetime.strptime(mainParset.getString('Observation.stopTime'), '%Y-%m-%d %H:%M:%S') + + # insert new task and specification in the radb + # any existing specification and task with same otdb_id will be deleted automatically + logger.info('doAssignment: insertSpecification momId=%s, otdb_id=%s, status=%s, taskType=%s, startTime=%s, endTime=%s' % + (momId, otdb_id, status, taskType, startTime, endTime)) + result = self.radbrpc.insertSpecificationAndTask(momId, otdb_id, status, taskType, startTime, endTime, str(mainParset)) + + if not result['inserted']: + logger.error('could not insert specification and task') + return + + specificationId = result['specification_id'] + taskId = result['task_id'] + logger.info('doAssignment: inserted specification (id=%s) and task (id=%s)' % (specificationId,taskId)) + + needed = self.getNeededResouces(specification_tree) + logger.info('doAssignment: getNeededResouces=%s' % (needed,)) + + if not str(otdb_id) in needed: + logger.error("no otdb_id %s found in estimator results %s" % (otdb_id, needed)) + return + + if not taskType in needed[str(otdb_id)]: + logger.error("no task type %s found in estimator results %s" % (taskType, needed[str(otdb_id)])) + return + + # make sure the availability in the radb is up to date + # TODO: this should be updated regularly + try: + self.updateAvailableResources('cep4') + except Exception as e: + logger.warning("Exception while updating available resources: %s" % str(e)) + + # claim the resources for this task + # during the claim inserts the claims are automatically validated + # and if not enough resources are available, then they are put to conflict status + # also, if any claim is in conflict state, then the task is put to conflict status as well + main_needed = needed[str(otdb_id)] + task = self.radbrpc.getTask(taskId) + claimed, claim_ids = self.claimResources(main_needed, task) + if claimed: + conflictingClaims = self.radbrpc.getResourceClaims(task_id=taskId, status='conflict') + + if conflictingClaims: + logger.warning('doAssignment: %s conflicting claims detected. Task cannot be scheduled. %s' % + (len(conflictingClaims), conflictingClaims)) + else: + logger.info('doAssignment: all claims for task %s were succesfully claimed. Setting task status to scheduled' % (taskId,)) + self.radbrpc.updateTaskAndResourceClaims(taskId, task_status='scheduled', claim_status='allocated') + + self.processPredecessors(specification_tree) + + def processPredecessors(self, specification_tree): + try: + predecessor_trees = specification_tree['predecessors'] + + if predecessor_trees: + otdb_id = specification_tree['otdb_id'] + task = self.radbrpc.getTask(otdb_id=otdb_id) + + for predecessor_tree in predecessor_trees: + pred_otdb_id = predecessor_tree['otdb_id'] + predecessor_task = self.radbrpc.getTask(otdb_id=pred_otdb_id) + if predecessor_task: + self.radbrpc.insertTaskPredecessor(task['id'], predecessor_task['id']) + self.processPredecessors(predecessor_tree) + + except Exception as e: + logger.error(e) + + def checkCluster(self, parset): + # check storageClusterName for enabled DataProducts + # if any storageClusterName is not CEP4, we do not accept this parset + keys = ['Output_Correlated', + 'Output_IncoherentStokes', + 'Output_CoherentStokes', + 'Output_InstrumentModel', + 'Output_SkyImage', + 'Output_Pulsar'] + for key in keys: + if parset.getBool('Observation.DataProducts.%s.enabled' % key, False): + if parset.getString('Observation.DataProducts.%s.storageClusterName' % key, '') != 'CEP4': + logger.warn("storageClusterName not CEP4, rejecting specification.") + return False + + logger.info("all enabled storageClusterName's are CEP4, accepting specification.") + return True + + + def getNeededResouces(self, specification_tree): + replymessage, status = self.rerpc({"specification_tree":specification_tree}, timeout=10) + logger.info('getNeededResouces: %s' % replymessage) + return replymessage + + def updateAvailableResources(self, cluster): + # find out which resources are available + # and what is their capacity + # For now, only look at CEP4 storage + # Later, also look at stations up/down for short term scheduling + + #get all active groupnames, find id for cluster group + groupnames = self.ssdbrpc.getactivegroupnames() + cluster_group_id = next(k for k,v in groupnames.items() if v == cluster) + + # for CEP4 cluster, do hard codes lookup of first and only node + node_info = self.ssdbrpc.gethostsforgid(cluster_group_id)['nodes'][0] + + storage_resources = self.radbrpc.getResources(resource_types='storage', include_availability=True) + cep4_storage_resource = next(x for x in storage_resources if 'cep4' in x['name']) + active = node_info['statename'] == 'Active' + total_capacity = node_info['totalspace'] + available_capacity = total_capacity - node_info['usedspace'] + + logger.info("Updating resource availability of %s (id=%s) to active=%s available_capacity=%s total_capacity=%s" % + (cep4_storage_resource['name'], cep4_storage_resource['id'], active, available_capacity, total_capacity)) + + self.radbrpc.updateResourceAvailability(cep4_storage_resource['id'], + active=active, + available_capacity=available_capacity, + total_capacity=total_capacity) + + + def claimResources(self, needed_resources, task): + logger.info('claimResources: task %s needed_resources=%s' % (task, needed_resources)) + + # get the needed resources for the task type + needed_resources_for_task_type = needed_resources[task['type']] + + # get db lists + rc_property_types = {rcpt['name']:rcpt['id'] for rcpt in self.radbrpc.getResourceClaimPropertyTypes()} + resource_types = {rt['name']:rt['id'] for rt in self.radbrpc.getResourceTypes()} + resources = self.radbrpc.getResources() + + # loop over needed_resources -> resource_type -> claim (and props) + # flatten the tree dict to a list of claims (with props) + claims = [] + for resource_type_name, needed_claim_for_resource_type in needed_resources_for_task_type.items(): + if resource_type_name in resource_types: + logger.info('claimResources: processing resource_type: %s' % resource_type_name) + db_resource_type_id = resource_types[resource_type_name] + db_resources_for_type = [r for r in resources if r['type_id'] == db_resource_type_id] + + # needed_claim_for_resource_type is a dict containing exactly one kvp of which the value is an int + # that value is the value for the claim + needed_claim_value = next((v for k,v in needed_claim_for_resource_type.items() if isinstance(v, int))) + + # FIXME: right now we just pick the first resource from the 'cep4' resources. + # estimator will deliver this info in the future + db_cep4_resources_for_type = [r for r in db_resources_for_type if 'cep4' in r['name'].lower()] + + if db_cep4_resources_for_type: + claim = {'resource_id':db_cep4_resources_for_type[0]['id'], + 'starttime':task['starttime'], + 'endtime':task['endtime'], + 'status':'claimed', + 'claim_size':needed_claim_value} + + #FIXME: find proper way to extend storage time with a month + if 'storage' in db_cep4_resources_for_type[0]['name']: + claim['endtime'] += timedelta(days=31) + + # if the needed_claim_for_resource_type dict contains more kvp's, + # then the subdict contains groups of properties for the claim + if len(needed_claim_for_resource_type) > 1: + claim['properties'] = [] + needed_prop_groups = next((v for k,v in needed_claim_for_resource_type.items() if isinstance(v, collections.Iterable))) + + def processProperties(propertiesDict, sap_nr=None): + for prop_type_name, prop_value in propertiesDict.items(): + if prop_type_name in rc_property_types: + rc_property_type_id = rc_property_types[prop_type_name] + property = {'type':rc_property_type_id, 'value':prop_value} + if sap_nr is not None: + property['sap_nr'] = sap_nr + claim['properties'].append(property) + else: + logger.error('claimResources: unknown prop_type:%s' % prop_type_name) + + for group_name, needed_prop_group in needed_prop_groups.items(): + if group_name == 'saps': + for sap_dict in needed_prop_group: + processProperties(sap_dict['properties'], sap_dict['sap_nr']) + else: + processProperties(needed_prop_group) + + logger.info('claimResources: created claim:%s' % claim) + claims.append(claim) + else: + logger.error('claimResources: unknown resource_type:%s' % resource_type_name) + + logger.info('claimResources: inserting %d claims in the radb' % len(claims)) + claim_ids = self.radbrpc.insertResourceClaims(task['id'], claims, 1, 'anonymous', -1)['ids'] + logger.info('claimResources: %d claims were inserted in the radb' % len(claim_ids)) + return len(claim_ids) == len(claims), claim_ids + diff --git a/SAS/ResourceAssignment/ResourceAssigner/lib/config.py b/SAS/ResourceAssignment/ResourceAssigner/lib/config.py new file mode 100644 index 0000000000000000000000000000000000000000..d69a4adc1795ad1e118b0d1cf7d02ddabf592902 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssigner/lib/config.py @@ -0,0 +1,5 @@ +#!/usr/bin/python +# $Id$ + +DEFAULT_BUSNAME = 'lofar.ra.command' +DEFAULT_SERVICENAME = 'RAService' diff --git a/SAS/ResourceAssignment/ResourceAssigner/lib/raservice.py b/SAS/ResourceAssignment/ResourceAssigner/lib/raservice.py new file mode 100755 index 0000000000000000000000000000000000000000..e524b3848a1ea3a1622c5672003c574913700ea4 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssigner/lib/raservice.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python + +# ResourceAssigner.py: ResourceAssigner listens on the lofar ?? bus and calls onTaskSpecified +# +# Copyright (C) 2015 +# ASTRON (Netherlands Institute for Radio Astronomy) +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. +# +# $Id: raservice.py 1580 2015-09-30 14:18:57Z loose $ + +""" +TaskSpecifiedListener listens to a bus on which specified tasks get published. It will then try +to assign resources to these tasks. +""" + +import qpid.messaging +import logging +from datetime import datetime +import time + +from lofar.sas.resourceassignment.rataskspecified.RABusListener import RATaskSpecifiedBusListener +from lofar.messaging.RPC import RPC, RPCException + +import lofar.sas.resourceassignment.resourceassignmentservice.rpc as rarpc +from lofar.sas.resourceassignment.rataskspecified.config import DEFAULT_RA_TASK_SPECIFIED_NOTIFICATION_BUSNAME +from lofar.sas.resourceassignment.rataskspecified.config import DEFAULT_RA_TASK_SPECIFIED_NOTIFICATION_SUBJECT +from lofar.sas.resourceassignment.resourceassigner.assignment import ResourceAssigner + +logger = logging.getLogger(__name__) + +class SpecifiedTaskListener(RATaskSpecifiedBusListener): + def __init__(self, + busname=DEFAULT_RA_TASK_SPECIFIED_NOTIFICATION_BUSNAME, + subject=DEFAULT_RA_TASK_SPECIFIED_NOTIFICATION_SUBJECT, + broker=None, + assigner=None, + **kwargs): + """ + SpecifiedTaskListener listens on the lofar ?? bus and calls onTaskSpecified + :param busname: valid Qpid address (default: lofar.otdb.status) + :param broker: valid Qpid broker host (default: None, which means localhost) + additional parameters in kwargs: + options= <dict> Dictionary of options passed to QPID + exclusive= <bool> Create an exclusive binding so no other services can consume duplicate messages (default: False) + numthreads= <int> Number of parallel threads processing messages (default: 1) + verbose= <bool> Output extra logging over stdout (default: False) + """ + super(SpecifiedTaskListener, self).__init__(busname=busname, subject=subject, broker=broker, **kwargs) + + self.assigner = assigner + if not self.assigner: + self.assigner = ResourceAssigner() + + def onTaskSpecified(self, otdb_id, specification_tree): + logger.info('onTaskSpecified: otdb_id=%s' % otdb_id) + + self.assigner.doAssignment(specification_tree) + +__all__ = ["SpecifiedTaskListener"] + +def main(): + from optparse import OptionParser + from lofar.messaging import setQpidLogLevel + from lofar.common.util import waitForInterrupt + + from lofar.sas.resourceassignment.resourceassignmentservice.config import DEFAULT_BUSNAME as RADB_BUSNAME + from lofar.sas.resourceassignment.resourceassignmentservice.config import DEFAULT_SERVICENAME as RADB_SERVICENAME + from lofar.sas.resourceassignment.resourceassignmentestimator.config import DEFAULT_BUSNAME as RE_BUSNAME + from lofar.sas.resourceassignment.resourceassignmentestimator.config import DEFAULT_SERVICENAME as RE_SERVICENAME + from lofar.sas.systemstatus.service.config import DEFAULT_SSDB_BUSNAME + from lofar.sas.systemstatus.service.config import DEFAULT_SSDB_SERVICENAME + + # Check the invocation arguments + parser = OptionParser("%prog [options]", + description='runs the resourceassigner service') + parser.add_option('-q', '--broker', dest='broker', type='string', + default=None, + help='Address of the qpid broker, default: localhost') + parser.add_option("--notification_busname", dest="notification_busname", type="string", + default=DEFAULT_RA_TASK_SPECIFIED_NOTIFICATION_BUSNAME, + help="Name of the notification bus on which taskspecified messages are published. [default: %default]") + parser.add_option("--notification_subject", dest="notification_subject", type="string", + default=DEFAULT_RA_TASK_SPECIFIED_NOTIFICATION_SUBJECT, + help="Subject of the published taskspecified messages to listen for. [default: %default]") + parser.add_option("--radb_busname", dest="radb_busname", type="string", + default=RADB_BUSNAME, + help="Name of the bus on which the radb service listens. [default: %default]") + parser.add_option("--radb_servicename", dest="radb_servicename", type="string", + default=RADB_SERVICENAME, + help="Name of the radb service. [default: %default]") + parser.add_option("--re_busname", dest="re_busname", type="string", + default=RE_BUSNAME, + help="Name of the bus on which the resource estimator service listens. [default: %default]") + parser.add_option("--re_servicename", dest="re_servicename", type="string", + default=RE_SERVICENAME, + help="Name of the resource estimator service. [default: %default]") + parser.add_option("--ssdb_busname", dest="ssdb_busname", type="string", + default=DEFAULT_SSDB_BUSNAME, + help="Name of the bus on which the ssdb service listens. [default: %default]") + parser.add_option("--ssdb_servicename", dest="ssdb_servicename", type="string", + default=DEFAULT_SSDB_SERVICENAME, + help="Name of the ssdb service. [default: %default]") + parser.add_option('-V', '--verbose', dest='verbose', action='store_true', help='verbose logging') + (options, args) = parser.parse_args() + + logging.getLogger('lofar.messaging.messagebus').setLevel(logging.WARNING) + setQpidLogLevel(logging.INFO) + logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', + level=logging.DEBUG if options.verbose else logging.INFO) + + with ResourceAssigner(radb_busname=options.radb_busname, + radb_servicename=options.radb_servicename, + re_busname=options.re_busname, + re_servicename=options.re_servicename, + ssdb_busname=options.ssdb_busname, + ssdb_servicename=options.ssdb_servicename, + broker=options.broker) as assigner: + with SpecifiedTaskListener(busname=options.notification_busname, + subject=options.notification_subject, + broker=options.broker, + assigner=assigner) as listener: + waitForInterrupt() + +if __name__ == '__main__': + main() diff --git a/SAS/ResourceAssignment/ResourceAssigner/test/CMakeLists.txt b/SAS/ResourceAssignment/ResourceAssigner/test/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..2d5931cddbb6bfeb1ec9beeadc80e3388d0e01bb --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssigner/test/CMakeLists.txt @@ -0,0 +1,6 @@ +# $Id: CMakeLists.txt 32333 2015-08-28 08:15:24Z schaap $ +include(LofarCTest) + +lofar_add_test(t_resourceassigner) + + diff --git a/SAS/ResourceAssignment/ResourceAssigner/test/t_resourceassigner.py b/SAS/ResourceAssignment/ResourceAssigner/test/t_resourceassigner.py new file mode 100755 index 0000000000000000000000000000000000000000..76848599e5472d646fbbc9db474d77f678327e38 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssigner/test/t_resourceassigner.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python + +import unittest +import sys +import datetime +import logging +import inspect +from lofar.messaging.RPC import RPC + +logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) +logger = logging.getLogger(__name__) + +try: + from mock import MagicMock + from mock import patch +except ImportError: + print 'Cannot run test without python MagicMock' + print 'Please install MagicMock: pip install mock' + exit(3) + +# the system under test is the ResourceAssigner, not the RARPC +# so, patch (mock) the RARPC class during these tests. +# when the ResourceAssigner instantiates an RARPC it will get the mocked class. +with patch('lofar.sas.resourceassignment.resourceassignmentservice.rpc.RARPC', autospec=True) as MockRARPC, \ + patch.object(RPC, 'execute') as mockRPC_execute, \ + patch.object(RPC, 'open'), \ + patch.object(RPC, 'close'): + mockRARPC = MockRARPC.return_value + + # modify the return values of the various RARPC methods with pre-cooked answers + mockRARPC.getTask.return_value = {"endtime": datetime.datetime(2016, 3, 25, 22, 47, 31), "id": 2299, "mom_id": 351543, "name": "IS HBA_DUAL", "otdb_id": 1290472, "predecessor_ids": [], "project_mom_id": 2, "project_name": "test-lofar", "specification_id": 2323, "starttime": datetime.datetime(2016, 3, 25, 21, 47, 31), "status": "prescheduled", "status_id": 350, "successor_ids": [], "type": "observation", "type_id": 0} + mockRARPC.getResourceTypes.return_value = [{"id": 0, "name": "rsp", "unit": "rsp_channel_bit", "unit_id": 0}, {"id": 1, "name": "tbb", "unit": "bytes", "unit_id": 1}, {"id": 2, "name": "rcu", "unit": "rcu_board", "unit_id": 2}, {"id": 3, "name": "bandwidth", "unit": "bytes/second", "unit_id": 3}, {"id": 4, "name": "processor", "unit": "cores", "unit_id": 4}, {"id": 5, "name": "storage", "unit": "bytes", "unit_id": 1}] + mockRARPC.getResources.return_value = [{"id": 116, "name": "cep4bandwidth", "type": "bandwidth", "type_id": 3, "unit": "bytes/second"},{"id": 117, "name": "cep4storage", "type": "storage", "type_id": 5, "unit": "bytes"}] + mockRARPC.getResourceClaimPropertyTypes.return_value = [{"id": 0, "name": "nr_of_is_files"}, {"id": 1, "name": "nr_of_cs_files"}, {"id": 2, "name": "nr_of_uv_files"}, {"id": 3, "name": "nr_of_im_files"}, {"id": 4, "name": "nr_of_cores"}, {"id": 5, "name": "nr_of_beamlets"}, {"id": 6, "name": "nr_of_bits"}, {"id": 7, "name": "is_file_size"}] + + def mockRARPC_insertResourceClaims(*arg, **kwarg): + logger.info("insertResourceClaims: %s" % ', '.join(str(x) for x in arg)) + return {'ids':range(len(arg[1]))} + mockRARPC.insertResourceClaims.side_effect = mockRARPC_insertResourceClaims + + #mock the RPC execute method + def mockRPCExecute(*arg, **kwarg): + #trick to get the servicename via the callstack from within this mock method + servicename = inspect.stack()[3][0].f_locals['self'].ServiceName + logger.info("mockRPCExecute servicename=%s" % servicename) + + #give pre-cooked answer depending on called service + if servicename == 'ResourceEstimation': + return {'1290472': {'observation': {'bandwidth': {'total_size': 9372800}, 'storage': {'total_size': 140592000, 'output_files': {'is': {'is_nr_stokes': 1, 'is_file_size': 36864000, 'nr_of_is_files': 1}, 'uv': {'nr_of_uv_files': 50, 'uv_file_size': 2074560}, 'saps': [{'sap_nr': 0, 'properties': {'nr_of_uv_files': 50, 'nr_of_is_files': 1}}]}}}}}, "OK" + elif servicename == 'SSDBService.GetActiveGroupNames': + return {0:'storagenodes', 1:'computenodes', 2:'archivenodes', 3:'locusnodes', 4:'cep4'}, "OK" + elif servicename == 'SSDBService.GetHostForGID': + return {u'groupname': u'cep4', u'nodes': [{u'claimedspace': 0, u'totalspace': 702716, u'statename': u'Active', u'usedspace': 23084, u'id': 1, u'groupname': u'cep4', u'path': u'/lustre', u'hostname': u'lustre001'}]}, "OK" + + return None, None + + mockRPC_execute.side_effect = mockRPCExecute + + # import ResourceAssigner now, so it will use the mocked classes and methods + from lofar.sas.resourceassignment.resourceassigner.assignment import ResourceAssigner + + #define the test class + class ResourceAssignerTest(unittest.TestCase): + '''Test the logic in the ResourceAssigner''' + + #def test_doAssignment(self): + #with ResourceAssigner() as assigner: + ##define inputs + #specification_tree={u'task_type': u'pipeline', u'specification': {u'Observation.DataProducts.Output_InstrumentModel.enabled': False, u'Observation.stopTime': u'2016-03-25 14:15:37', u'Observation.VirtualInstrument.stationList': [], u'Observation.DataProducts.Input_CoherentStokes.enabled': False, u'Observation.DataProducts.Output_CoherentStokes.enabled': False, u'Observation.DataProducts.Input_Correlated.skip': [0, 0, 0, 0], u'Observation.antennaSet': u'LBA_INNER', u'Observation.nrBitsPerSample': u'16', u'Observation.ObservationControl.PythonControl.LongBaseline.subbandgroups_per_ms': u'2', u'Observation.DataProducts.Output_IncoherentStokes.enabled': False, u'Observation.DataProducts.Input_IncoherentStokes.enabled': False, u'Observation.DataProducts.Input_Correlated.enabled': True, u'Observation.DataProducts.Output_Pulsar.enabled': False, u'Observation.DataProducts.Input_CoherentStokes.skip': [], u'Observation.DataProducts.Output_SkyImage.enabled': False, u'Version.number': u'33774', u'Observation.momID': u'351557', u'Observation.startTime': u'2016-03-25 14:14:57', u'Observation.ObservationControl.PythonControl.LongBaseline.subbands_per_subbandgroup': u'2', u'Observation.nrBeams': u'0', u'Observation.DataProducts.Input_IncoherentStokes.skip': [], u'Observation.DataProducts.Output_Correlated.enabled': True, u'Observation.sampleClock': u'200'}, u'task_subtype': u'long baseline pipeline', u'state': u'prescheduled', u'otdb_id': 1290494, u'predecessors': [{u'task_subtype': u'averaging pipeline', u'specification': {u'Observation.DataProducts.Output_InstrumentModel.enabled': False, u'Observation.stopTime': u'2016-03-25 13:51:05', u'Observation.VirtualInstrument.stationList': [], u'Observation.DataProducts.Input_CoherentStokes.enabled': False, u'Observation.DataProducts.Output_CoherentStokes.enabled': False, u'Observation.DataProducts.Output_SkyImage.enabled': False, u'Observation.DataProducts.Input_Correlated.skip': [0, 0, 0, 0], u'Observation.antennaSet': u'LBA_INNER', u'Observation.nrBitsPerSample': u'16', u'Observation.ObservationControl.PythonControl.LongBaseline.subbandgroups_per_ms': u'1', u'Observation.DataProducts.Output_IncoherentStokes.enabled': False, u'Observation.DataProducts.Input_IncoherentStokes.enabled': False, u'Observation.DataProducts.Input_Correlated.enabled': True, u'Observation.DataProducts.Output_Pulsar.enabled': False, u'Observation.DataProducts.Input_CoherentStokes.skip': [], u'Observation.ObservationControl.PythonControl.DPPP.demixer.demixtimestep': u'10', u'Version.number': u'33774', u'Observation.momID': u'351556', u'Observation.startTime': u'2016-03-25 13:49:55', u'Observation.ObservationControl.PythonControl.LongBaseline.subbands_per_subbandgroup': u'1', u'Observation.nrBeams': u'0', u'Observation.DataProducts.Input_IncoherentStokes.skip': [], u'Observation.ObservationControl.PythonControl.DPPP.demixer.demixfreqstep': u'64', u'Observation.DataProducts.Output_Correlated.enabled': True, u'Observation.sampleClock': u'200'}, u'task_type': u'pipeline', u'otdb_id': 1290496, u'predecessors': [{u'task_subtype': u'bfmeasurement', u'specification': {u'Observation.DataProducts.Output_InstrumentModel.enabled': False, u'Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.IncoherentStokes.timeIntegrationFactor': u'1', u'Observation.stopTime': u'2016-03-26 00:33:31', u'Observation.VirtualInstrument.stationList': [u'RS205', u'RS503', u'CS013', u'RS508', u'RS106'], u'Observation.DataProducts.Input_CoherentStokes.enabled': False, u'Observation.DataProducts.Output_CoherentStokes.enabled': False, u'Observation.ObservationControl.OnlineControl.Cobalt.Correlator.nrChannelsPerSubband': u'64', u'Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.IncoherentStokes.which': u'I', u'Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.CoherentStokes.which': u'I', u'Observation.Beam[0].subbandList': [100, 101, 102, 103], u'Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.IncoherentStokes.subbandsPerFile': u'512', u'Observation.DataProducts.Input_Correlated.skip': [], u'Observation.antennaSet': u'HBA_DUAL', u'Observation.nrBitsPerSample': u'8', u'Observation.Beam[0].nrTabRings': u'0', u'Observation.Beam[0].nrTiedArrayBeams': u'0', u'Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.flysEye': False, u'Observation.nrBeams': u'1', u'Observation.ObservationControl.OnlineControl.Cobalt.Correlator.integrationTime': u'1.0', u'Observation.DataProducts.Output_IncoherentStokes.enabled': False, u'Observation.DataProducts.Input_IncoherentStokes.enabled': False, u'Observation.DataProducts.Input_Correlated.enabled': False, u'Observation.DataProducts.Output_Pulsar.enabled': False, u'Observation.DataProducts.Input_CoherentStokes.skip': [], u'Observation.DataProducts.Output_SkyImage.enabled': False, u'Version.number': u'33774', u'Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.CoherentStokes.timeIntegrationFactor': u'1', u'Observation.momID': u'351539', u'Observation.startTime': u'2016-03-26 00:31:31', u'Observation.ObservationControl.OnlineControl.Cobalt.BeamFormer.CoherentStokes.subbandsPerFile': u'512', u'Observation.DataProducts.Input_IncoherentStokes.skip': [], u'Observation.DataProducts.Output_Correlated.enabled': True, u'Observation.sampleClock': u'200'}, u'task_type': u'observation', u'otdb_id': 1290476, u'predecessors': []}]}]} + + ##test the main assignment method + #assigner.doAssignment(specification_tree) + + ##TODO: added test asserts etc + + def test_claimResources(self): + with ResourceAssigner() as assigner: + #define inputs + estimator_output,_=assigner.rerpc() + needed_resources=estimator_output['1290472'] + task = assigner.radbrpc.getTask(1290472) + + #test claimResources method + assigner.claimResources(needed_resources, task) + + #TODO: added test asserts etc + + unittest.main(verbosity=2) diff --git a/SAS/ResourceAssignment/ResourceAssigner/test/t_resourceassigner.run b/SAS/ResourceAssignment/ResourceAssigner/test/t_resourceassigner.run new file mode 100755 index 0000000000000000000000000000000000000000..9417586b550145c2d7cdd6ef1578a33f99798b35 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssigner/test/t_resourceassigner.run @@ -0,0 +1,6 @@ +#!/bin/bash + +# Run the unit test +source python-coverage.sh +python_coverage_test "resourceassigner*" t_resourceassigner.py + diff --git a/SAS/ResourceAssignment/ResourceAssigner/test/t_resourceassigner.sh b/SAS/ResourceAssignment/ResourceAssigner/test/t_resourceassigner.sh new file mode 100755 index 0000000000000000000000000000000000000000..6d1482d4e0638e3d767ada06971487f9ec83e0e0 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssigner/test/t_resourceassigner.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +./runctest.sh t_resourceassigner diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/CMakeLists.txt b/SAS/ResourceAssignment/ResourceAssignmentDatabase/CMakeLists.txt index ac1e852eb24aca9af9d7274134e1a7113a94de08..69bf1a5629455aa0eaaad7d1e0d21844b62de124 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/CMakeLists.txt +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/CMakeLists.txt @@ -10,6 +10,7 @@ set(_py_files config.py radb.py radbpglistener.py + radbbuslistener.py ) python_install(${_py_files} DESTINATION lofar/sas/resourceassignment/database) @@ -21,4 +22,4 @@ install(FILES radbpglistener.ini DESTINATION etc/supervisord.d) -# add_subdirectory(test) +add_subdirectory(sql) diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/config.py b/SAS/ResourceAssignment/ResourceAssignmentDatabase/config.py index 347403ac95700a5c7cee1c2c2198e030151f0fa8..dabf0b2a3750874a7bf3199675def744ea418f4c 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/config.py +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/config.py @@ -1,22 +1,6 @@ #!/usr/bin/python # $Id$ -from os import stat, path, chmod -import logging - -logger = logging.getLogger(__name__) - -# make sure config.py is mode 600 to hide passwords -if oct(stat(path.realpath(__file__)).st_mode & 0777) != '0600': - logger.info('Changing permissions of config.py to 600') - try: - chmod(__file__, 0600) - except Exception as e: - print 'Error: Could not change permissions on config.py: ' + str(e) - exit(-1) - -# do not commit passwd in svn -# this file should have permissions 600 -radb_password='' - -DEFAULT_BUSNAME = 'lofar.ra.notification' +DEFAULT_NOTIFICATION_BUSNAME = 'lofar.ra.notification' +DEFAULT_NOTIFICATION_PREFIX = 'RADB.' +DEFAULT_NOTIFICATION_SUBJECTS=DEFAULT_NOTIFICATION_PREFIX+'*' diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py index 0b01f9b29ba0f068a7755d9147d3e6614bd017cf..2dabbf96e02a61217141221c05585e864ff5d48a 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py @@ -25,31 +25,85 @@ TODO: documentation import logging import psycopg2 import psycopg2.extras -import datetime +from datetime import datetime, timedelta import time +import collections +from optparse import OptionParser +from lofar.common import dbcredentials +from lofar.common.util import to_csv_string logger = logging.getLogger(__name__) +_FETCH_NONE=0 +_FETCH_ONE=1 +_FETCH_ALL=2 class RADatabase: - def __init__(self, password='', - username='resourceassignment', - host='10.149.96.6', #mcu005.control.lofar - database='resourceassignment'): - self.conn = psycopg2.connect(host=host, - user=username, - password=password, - database=database) + def __init__(self, dbcreds=None, log_queries=False): + self.dbcreds = dbcreds + self.conn = None + self.cursor = None + self.log_queries = log_queries + + def _connect(self): + self.conn = None + self.cursor = None + + self.conn = psycopg2.connect(host=self.dbcreds.host, + user=self.dbcreds.user, + password=self.dbcreds.password, + database=self.dbcreds.database, + connect_timeout=5) self.cursor = self.conn.cursor(cursor_factory = psycopg2.extras.RealDictCursor) + def _queryAsSingleLine(self, query, qargs=None): + line = ' '.join(query.replace('\n', ' ').split()) + if qargs: + line = line % tuple(qargs) + return line + + def _executeQuery(self, query, qargs=None, fetch=_FETCH_NONE): + '''execute the query and reconnect upon OperationalError''' + try: + if self.log_queries: + logger.info('executing query: %s' % self._queryAsSingleLine(query, qargs)) + + self.cursor.execute(query, qargs) + except (psycopg2.OperationalError, AttributeError) as e: + if isinstance(e, psycopg2.OperationalError): + logger.error(str(e)) + for i in range(5): + logger.info("(re)trying to connect to radb") + self._connect() + if self.conn: + logger.info("connected to radb") + self.cursor.execute(query, qargs) + break + time.sleep(i*i) + except (psycopg2.IntegrityError, psycopg2.ProgrammingError, psycopg2.InternalError, psycopg2.DataError)as e: + logger.error("Rolling back query=\'%s\' due to error: \'%s\'" % (self._queryAsSingleLine(query, qargs), e)) + self.rollback() + return [] + + if fetch == _FETCH_ONE: + return self.cursor.fetchone() + + if fetch == _FETCH_ALL: + return self.cursor.fetchall() + + def commit(self): + logger.info('commit') self.conn.commit() + def rollback(self): + logger.info('rollback') + self.conn.rollback() + def getTaskStatuses(self): query = '''SELECT * from resource_allocation.task_status;''' - self.cursor.execute(query) - return list(self.cursor.fetchall()) + return list(self._executeQuery(query, fetch=_FETCH_ALL)) def getTaskStatusNames(self): return [x['name'] for x in self.getTaskStatuses()] @@ -57,8 +111,7 @@ class RADatabase: def getTaskStatusId(self, status_name): query = '''SELECT id from resource_allocation.task_status WHERE name = %s;''' - self.cursor.execute(query, [status_name]) - result = self.cursor.fetchone() + result = self._executeQuery(query, [status_name], fetch=_FETCH_ONE) if result: return result['id'] @@ -67,9 +120,8 @@ class RADatabase: def getTaskTypes(self): query = '''SELECT * from resource_allocation.task_type;''' - self.cursor.execute(query) - return list(self.cursor.fetchall()) + return list(self._executeQuery(query, fetch=_FETCH_ALL)) def getTaskTypeNames(self): return [x['name'] for x in self.getTaskTypes()] @@ -77,8 +129,7 @@ class RADatabase: def getTaskTypeId(self, type_name): query = '''SELECT id from resource_allocation.task_type WHERE name = %s;''' - self.cursor.execute(query, [type_name]) - result = self.cursor.fetchone() + result = self._executeQuery(query, [type_name], fetch=_FETCH_ONE) if result: return result['id'] @@ -87,9 +138,8 @@ class RADatabase: def getResourceClaimStatuses(self): query = '''SELECT * from resource_allocation.resource_claim_status;''' - self.cursor.execute(query) - return list(self.cursor.fetchall()) + return list(self._executeQuery(query, fetch=_FETCH_ALL)) def getResourceClaimStatusNames(self): return [x['name'] for x in self.getResourceClaimStatuses()] @@ -97,8 +147,7 @@ class RADatabase: def getResourceClaimStatusId(self, status_name): query = '''SELECT id from resource_allocation.resource_claim_status WHERE name = %s;''' - self.cursor.execute(query, [status_name]) - result = self.cursor.fetchone() + result = self._executeQuery(query, [status_name], fetch=_FETCH_ONE) if result: return result['id'] @@ -107,17 +156,34 @@ class RADatabase: def getTasks(self): query = '''SELECT * from resource_allocation.task_view;''' - self.cursor.execute(query) + tasks = list(self._executeQuery(query, fetch=_FETCH_ALL)) + predIds = self.getTaskPredecessorIds() + succIds = self.getTaskSuccessorIds() - return list(self.cursor.fetchall()) + for task in tasks: + task['predecessor_ids'] = predIds.get(task['id'], []) + task['successor_ids'] = succIds.get(task['id'], []) + + return tasks - def getTask(self, id): - query = '''SELECT * from resource_allocation.task_view tv - where tv.id = (%s); - ''' - self.cursor.execute(query, (id,)) - result = self.cursor.fetchone() + def getTask(self, id=None, mom_id=None, otdb_id=None): + '''get a task for either the given (task)id, or for the given mom_id, or for the given otdb_id''' + ids = [id, mom_id, otdb_id] + validIds = [x for x in ids if x != None] + + if len(validIds) != 1: + raise KeyError("Provide one and only one id: id=%s, mom_id=%s, otdb_id=%s" % (id, mom_id, otdb_id)) + + query = '''SELECT * from resource_allocation.task_view tv ''' + if id: + query += '''where tv.id = (%s);''' + elif mom_id: + query += '''where tv.mom_id = (%s);''' + elif otdb_id: + query += '''where tv.otdb_id = (%s);''' + result = self._executeQuery(query, validIds, fetch=_FETCH_ONE) + return dict(result) if result else None def _convertTaskTypeAndStatusToIds(self, task_status, task_type): @@ -133,6 +199,8 @@ class RADatabase: return task_status, task_type def insertTask(self, mom_id, otdb_id, task_status, task_type, specification_id, commit=True): + logger.info('insertTask mom_id=%s, otdb_id=%s, task_status=%s, task_type=%s, specification_id=%s' % + (mom_id, otdb_id, task_status, task_type, specification_id)) task_status, task_type = self._convertTaskTypeAndStatusToIds(task_status, task_type) query = '''INSERT INTO resource_allocation.task @@ -140,19 +208,19 @@ class RADatabase: VALUES (%s, %s, %s, %s, %s) RETURNING id;''' - self.cursor.execute(query, (mom_id, otdb_id, task_status, task_type, specification_id)) - id = self.cursor.fetchone()['id'] + id = self._executeQuery(query, (mom_id, otdb_id, task_status, task_type, specification_id), fetch=_FETCH_ONE)['id'] if commit: - self.conn.commit() + self.commit() return id def deleteTask(self, task_id, commit=True): + logger.info('deleteTask task_id=%s' % task_id) query = '''DELETE FROM resource_allocation.task WHERE resource_allocation.task.id = %s;''' - self.cursor.execute(query, [task_id]) + self._executeQuery(query, [task_id]) if commit: - self.conn.commit() + self.commit() return self.cursor.rowcount > 0 def updateTask(self, task_id, mom_id=None, otdb_id=None, task_status=None, task_type=None, specification_id=None, commit=True): @@ -161,23 +229,23 @@ class RADatabase: fields = [] values = [] - if mom_id: + if mom_id is not None : fields.append('mom_id') values.append(mom_id) - if otdb_id: + if otdb_id is not None : fields.append('otdb_id') values.append(otdb_id) - if task_status: + if task_status is not None : fields.append('status_id') values.append(task_status) - if task_type: + if task_type is not None : fields.append('type_id') values.append(task_type) - if specification_id: + if specification_id is not None : fields.append('specification_id') values.append(specification_id) @@ -189,44 +257,96 @@ class RADatabase: value_placeholders=', '.join('%s' for x in fields), task_id_placeholder='%s') - self.cursor.execute(query, values) + self._executeQuery(query, values) if commit: - self.conn.commit() + self.commit() return self.cursor.rowcount > 0 + def getTaskPredecessorIds(self): + query = '''SELECT * from resource_allocation.task_predecessor tp;''' + items = list(self._executeQuery(query, fetch=_FETCH_ALL)) + predIdDict = {} + for item in items: + taskId = item['task_id'] + if taskId not in predIdDict: + predIdDict[taskId] = [] + predIdDict[taskId].append(item['predecessor_id']) + return predIdDict + + def getTaskSuccessorIds(self): + query = '''SELECT * from resource_allocation.task_predecessor tp;''' + items = list(self._executeQuery(query, fetch=_FETCH_ALL)) + succIdDict = {} + for item in items: + predId = item['predecessor_id'] + if predId not in succIdDict: + succIdDict[predId] = [] + succIdDict[predId].append(item['task_id']) + return succIdDict + + def getTaskPredecessorIdsForTask(self, task_id): + query = '''SELECT * from resource_allocation.task_predecessor tp + WHERE tp.task_id = %s;''' + + items = list(self._executeQuery(query, [task_id], fetch=_FETCH_ALL)) + return [x['predecessor_id'] for x in items] + + def getTaskSuccessorIdsForTask(self, task_): + query = '''SELECT * from resource_allocation.task_predecessor tp + WHERE tp.predecessor_id = %s;''' + + items = list(self._executeQuery(query, [task_], fetch=_FETCH_ALL)) + return [x['task_id'] for x in items] + + def insertTaskPredecessor(self, task_id, predecessor_id, commit=True): + query = '''INSERT INTO resource_allocation.task_predecessor + (task_id, predecessor_id) + VALUES (%s, %s) + RETURNING id;''' + + id = self._executeQuery(query, (task_id, predecessor_id), fetch=_FETCH_ONE)['id'] + if commit: + self.commit() + return id + + def insertTaskPredecessors(self, task_id, predecessor_ids, commit=True): + ids = [self.insertTaskPredecessor(task_id, predecessor_id, False) for predecessor_id in predecessor_ids] + if commit: + self.commit() + return ids + def getSpecifications(self): query = '''SELECT * from resource_allocation.specification;''' - self.cursor.execute(query) - return list(self.cursor.fetchall()) + return list(self._executeQuery(query, fetch=_FETCH_ALL)) def getSpecification(self, specification_id): query = '''SELECT * from resource_allocation.specification spec WHERE spec.id = (%s);''' - self.cursor.execute(query, (specification_id,)) - return list(self.cursor.fetchall()) + return list(self._executeQuery(query, [specification_id], fetch=_FETCH_ALL)) def insertSpecification(self, starttime, endtime, content, commit=True): + logger.info('insertSpecification starttime=%s, endtime=%s' % (starttime, endtime)) query = '''INSERT INTO resource_allocation.specification (starttime, endtime, content) VALUES (%s, %s, %s) RETURNING id;''' - self.cursor.execute(query, (starttime, endtime, content)) - id = self.cursor.fetchone()['id'] + id = self._executeQuery(query, (starttime, endtime, content), fetch=_FETCH_ONE)['id'] if commit: - self.conn.commit() + self.commit() return id def deleteSpecification(self, specification_id, commit=True): + logger.info('deleteSpecification specification_id=%s' % (specification_id)) query = '''DELETE FROM resource_allocation.specification WHERE resource_allocation.specification.id = %s;''' - self.cursor.execute(query, [specification_id]) + self._executeQuery(query, [specification_id]) if commit: - self.conn.commit() + self.commit() return self.cursor.rowcount > 0 def updateSpecification(self, specification_id, starttime=None, endtime=None, content=None, commit=True): @@ -241,7 +361,7 @@ class RADatabase: fields.append('endtime') values.append(endtime) - if content: + if content is not None : fields.append('content') values.append(content) @@ -253,9 +373,9 @@ class RADatabase: value_placeholders=', '.join('%s' for x in fields), id_placeholder='%s') - self.cursor.execute(query, values) + self._executeQuery(query, values) if commit: - self.conn.commit() + self.commit() return self.cursor.rowcount > 0 @@ -264,9 +384,8 @@ class RADatabase: from virtual_instrument.resource_type rt inner join virtual_instrument.unit rtu on rtu.id = rt.unit_id; ''' - self.cursor.execute(query) - return list(self.cursor.fetchall()) + return list(self._executeQuery(query, fetch=_FETCH_ALL)) def getResourceTypeNames(self): return [x['name'] for x in self.getResourceTypes()] @@ -274,8 +393,7 @@ class RADatabase: def getResourceTypeId(self, type_name): query = '''SELECT id from virtual_instrument.resource_type WHERE name = %s;''' - self.cursor.execute(query, [type_name]) - result = self.cursor.fetchone() + result = self._executeQuery(query, [type_name], fetch=_FETCH_ONE) if result: return result['id'] @@ -284,9 +402,8 @@ class RADatabase: def getResourceGroupTypes(self): query = '''SELECT * from virtual_instrument.resource_group_type;''' - self.cursor.execute(query) - return list(self.cursor.fetchall()) + return list(self._executeQuery(query, fetch=_FETCH_ALL)) def getResourceGroupTypeNames(self): return [x['name'] for x in self.getResourceGroupTypes()] @@ -294,8 +411,7 @@ class RADatabase: def getResourceGroupTypeId(self, type_name): query = '''SELECT id from virtual_instrument.resource_group_type WHERE name = %s;''' - self.cursor.execute(query, [type_name]) - result = self.cursor.fetchone() + result = self._executeQuery(query, [type_name], fetch=_FETCH_ONE) if result: return result['id'] @@ -304,9 +420,8 @@ class RADatabase: def getUnits(self): query = '''SELECT * from virtual_instrument.unit;''' - self.cursor.execute(query) - return list(self.cursor.fetchall()) + return list(self._executeQuery(query, fetch=_FETCH_ALL)) def getUnitNames(self): return [x['units'] for x in self.getUnits()] @@ -314,86 +429,535 @@ class RADatabase: def getUnitId(self, unit_name): query = '''SELECT * from virtual_instrument.unit WHERE units = %s;''' - self.cursor.execute(query, [unit_name]) - result = self.cursor.fetchone() + result = self._executeQuery(query, [unit_name], fetch=_FETCH_ONE) if result: return result['id'] - raise KeyError('No such unit: %s Valid values are: %s' % (type_name, ', '.join(self.getUnitNames()))) - - def getResources(self): - query = '''SELECT r.*, rt.name as type, rtu.units as unit - from virtual_instrument.resource r - inner join virtual_instrument.resource_type rt on rt.id = r.type_id - inner join virtual_instrument.unit rtu on rtu.id = rt.unit_id; - ''' - self.cursor.execute(query) + raise KeyError('No such unit: %s Valid values are: %s' % (unit_name, ', '.join(self.getUnitNames()))) + + def getResources(self, resource_ids=None, resource_types=None, include_availability=False): + if include_availability: + query = '''SELECT * from resource_monitoring.resource_view''' + else: + query = '''SELECT * from virtual_instrument.resource_view''' + + conditions = [] + qargs = [] + + if resource_ids is not None: + if isinstance(resource_ids, int): # just a single id + conditions.append('id = %s') + qargs.append(resource_ids) + elif len(resource_ids) == 1: # just a single id from a list + conditions.append('id = %s') + qargs.append(resource_ids[0]) + else: # list of id's + conditions.append('id in %s') + qargs.append(tuple(resource_ids)) + + if resource_types is not None: + if isinstance(resource_types, basestring): + resource_types = [resource_types] + elif not isinstance(resource_types, collections.Iterable): + resource_types = [resource_types] + + # convert any resource_type name to id + resource_type_names = set([x for x in resource_types if isinstance(x, basestring)]) + if resource_type_names: + resource_type_name_to_id = {x['name']:x['id'] for x in self.getResourceTypes()} + resource_types = [resource_type_name_to_id[x] if isinstance(x, basestring) else x + for x in resource_types] + + conditions.append('type_id in %s') + qargs.append(tuple(resource_types)) + + if conditions: + query += ' WHERE ' + ' AND '.join(conditions) + + return list(self._executeQuery(query, qargs, fetch=_FETCH_ALL)) + + def updateResourceAvailability(self, resource_id, active=None, available_capacity=None, total_capacity=None, commit=True): + if active is not None: + query = '''UPDATE resource_monitoring.resource_availability + SET (available) = (%s) + WHERE resource_id = %s;''' + self._executeQuery(query, (active, resource_id)) + + if available_capacity is not None and total_capacity is not None: + query = '''UPDATE resource_monitoring.resource_capacity + SET (available, total) = (%s, %s) + WHERE resource_id = %s;''' + self._executeQuery(query, (available_capacity, total_capacity, resource_id)) + elif available_capacity is not None: + query = '''UPDATE resource_monitoring.resource_capacity + SET (available) = (%s) + WHERE resource_id = %s;''' + self._executeQuery(query, (available_capacity, resource_id)) + elif total_capacity is not None: + query = '''UPDATE resource_monitoring.resource_capacity + SET (total) = (%s) + WHERE resource_id = %s;''' + self._executeQuery(query, (total_capacity, resource_id)) + + if active is not None or available_capacity is not None or total_capacity is not None: + affectedClaims = self.getResourceClaims(resource_ids=resource_id) + logger.info('updateResourceAvailability: affectedClaims=%s' % affectedClaims) + self.validateResourceClaimsStatus(affectedClaims, False) - return list(self.cursor.fetchall()) + if commit: + self.commit() def getResourceGroups(self): query = '''SELECT rg.*, rgt.name as type from virtual_instrument.resource_group rg inner join virtual_instrument.resource_group_type rgt on rgt.id = rg.type_id; ''' - self.cursor.execute(query) - return list(self.cursor.fetchall()) + return list(self._executeQuery(query, fetch=_FETCH_ALL)) + + def getResourceGroupMemberships(self): + '''get a dict containing the resource->group and group->group relations''' + query = '''select + prg.id as resource_group_parent_id, + prg.name as resource_group_parent_name, + crg.id as resource_group_id, + crg.name as resource_group_name + from virtual_instrument.resource_group_to_resource_group rg2rg + left join virtual_instrument.resource_group prg on rg2rg.parent_id = prg.id + inner join virtual_instrument.resource_group crg on rg2rg.child_id = crg.id + ''' + relations = self._executeQuery(query, fetch=_FETCH_ALL) + + rg_items = {} + # loop over list of relations + # for each unique resource_group item create a dict, and add parent_ids to it + for relation in relations: + rg_item_id = relation['resource_group_id'] + if not rg_item_id in rg_items: + rg_item = {k:relation[k] for k in ('resource_group_id', 'resource_group_name')} + rg_item['child_ids'] = [] + rg_item['parent_ids'] = [] + rg_item['resource_ids'] = [] + rg_items[rg_item_id] = rg_item + + parent_id = relation['resource_group_parent_id'] + if parent_id != None: + rg_items[rg_item_id]['parent_ids'].append(parent_id) + + # now that we have a full list (dict.values) of rg_items... + # add a child_id reference to each item's parent + # this gives us a full bidirectional graph + for rg_item in rg_items.values(): + parentIds = rg_item['parent_ids'] + rg_item_id = rg_item['resource_group_id'] + for parentId in parentIds: + if parentId in rg_items: + parentNode = rg_items[parentId] + parentNode['child_ids'].append(rg_item_id) + + query = '''select + prg.id as resource_group_parent_id, + prg.name as resource_group_parent_name, + cr.id as resource_id, + cr.name as resource_name + from virtual_instrument.resource_to_resource_group r2rg + left join virtual_instrument.resource_group prg on r2rg.parent_id = prg.id + inner join virtual_instrument.resource cr on r2rg.child_id = cr.id + ''' + relations = self._executeQuery(query, fetch=_FETCH_ALL) + + r_items = {} + # loop over list of relations + # for each unique resource item create a dict, and add parent_ids to it + for relation in relations: + r_item_id = relation['resource_id'] + if not r_item_id in r_items: + r_item = {k:relation[k] for k in ('resource_id', 'resource_name')} + r_item['parent_group_ids'] = [] + r_items[r_item_id] = r_item + + parent_id = relation['resource_group_parent_id'] + if parent_id != None: + r_items[r_item_id]['parent_group_ids'].append(parent_id) + rg_items[parent_id]['resource_ids'].append(r_item_id) + + result = {'groups': rg_items, + 'resources': r_items } + + return result + + def getResourceClaimPropertyTypes(self): + query = '''SELECT * from resource_allocation.resource_claim_property_type;''' + + return list(self._executeQuery(query, fetch=_FETCH_ALL)) + + def getResourceClaimPropertyTypeNames(self): + return [x['name'] for x in self.getResourceClaimPropertyTypes()] + + def getResourceClaimPropertyTypeId(self, type_name): + query = '''SELECT id from resource_allocation.resource_claim_property_type + WHERE name = %s;''' + result = self._executeQuery(query, [type_name], fetch=_FETCH_ONE) + + if result: + return result['id'] + + raise KeyError('No such resource_claim_property_type: %s Valid values are: %s' % (type_name, ', '.join(self.getResourceClaimPropertyTypeNames()))) + + def getResourceClaimProperties(self, claim_ids=None, task_id=None): + query = '''SELECT rcpv.id, rcpv.resource_claim_id, rcpv.value, rcpv.type_id, rcpv.type_name, sap.number as sap_nr + FROM resource_allocation.resource_claim_property_view rcpv + LEFT JOIN resource_allocation.sap sap on rcpv.sap_id = sap.id''' + + conditions = [] + qargs = [] + + if claim_ids is not None: + if isinstance(claim_ids, int): # just a single id + conditions.append('rcpv.resource_claim_id = %s') + qargs.append(claim_ids) + elif len(claim_ids) == 0: # empty list + return [] + elif len(claim_ids) == 1: # just a single id from a list + conditions.append('rcpv.resource_claim_id = %s') + qargs.append(claim_ids[0]) + else: # list of id's + conditions.append('rcpv.resource_claim_id in %s') + qargs.append(tuple(claim_ids)) + + if task_id is not None: + query += ' JOIN resource_allocation.resource_claim rc on rc.id = rcpv.resource_claim_id' + conditions.append('rc.task_id = %s') + qargs.append(task_id) + + if conditions: + query += ' WHERE ' + ' AND '.join(conditions) + + properties = list(self._executeQuery(query, qargs, fetch=_FETCH_ALL)) + for p in properties: + if p['sap_nr'] is None: + del p['sap_nr'] + + return properties + + def insertResourceClaimProperty(self, claim_id, property_type, value, commit=True): + return self.insertResourceClaimProperties([(claim_id, property_type, value)], commit) + + def insertResourceClaimProperties(self, props, commit=True): + if not props: + return [] + + # first insert unique sap numbers + claim_sap_nrs = list(set([(p[0], p[3]) for p in props if p[3] is not None])) + sap_ids = self.insertSAPNumbers(claim_sap_nrs, False) + + if sap_ids == None: + return None + + # make sap_nr to sap_id mapping per claim_id + claim_id2sap_nr2sap_id = {} + for claim_sap_nr,sap_id in zip(claim_sap_nrs, sap_ids): + claim_id = claim_sap_nr[0] + sap_nr = claim_sap_nr[1] + if claim_id not in claim_id2sap_nr2sap_id: + claim_id2sap_nr2sap_id[claim_id] = {} + claim_id2sap_nr2sap_id[claim_id][sap_nr] = sap_id + + logger.info('insertResourceClaimProperties inserting %d properties' % len(props)) + + # convert all property type strings to id's + type_strings = set([p[1] for p in props if isinstance(p[1], basestring)]) + type_string2id = {t:self.getResourceClaimPropertyTypeId(t) for t in type_strings} + + # finally we have all the info we need, + # so we can build the bulk property insert query + insert_values = ','.join(self.cursor.mogrify('(%s, %s, %s, %s)', + (p[0], + type_string2id[p[1]] if + isinstance(p[1], basestring) else p[1], + p[2], + claim_id2sap_nr2sap_id[p[0]].get(p[3]) if + p[0] in claim_id2sap_nr2sap_id else None)) + for p in props) + + query = '''INSERT INTO resource_allocation.resource_claim_property + (resource_claim_id, type_id, value, sap_id) + VALUES {values} + RETURNING id;'''.format(values=insert_values) + + ids = [x['id'] for x in self._executeQuery(query, fetch=_FETCH_ALL)] + + if [x for x in ids if x < 0]: + logger.error("One or more properties could not be inserted. Rolling back.") + self.rollback() + return None + + if commit: + self.commit() + return ids - def getResourceClaims(self): - query = '''SELECT * from resource_allocation.resource_claim_view''' - self.cursor.execute(query) + def insertSAPNumbers(self, sap_numbers, commit=True): + if not sap_numbers: + return [] - return list(self.cursor.fetchall()) + logger.info('insertSAPNumbers inserting %d sap numbers' % len(sap_numbers)) + + insert_values = ','.join(self.cursor.mogrify('(%s, %s)', rcid_sapnr) for rcid_sapnr in sap_numbers) + + query = '''INSERT INTO resource_allocation.sap + (resource_claim_id, number) + VALUES {values} + RETURNING id;'''.format(values=insert_values) + + sap_ids = [x['id'] for x in self._executeQuery(query, fetch=_FETCH_ALL)] + + if [x for x in sap_ids if x < 0]: + logger.error("One or more sap_nr's could not be inserted. Rolling back.") + self.rollback() + return None + + if commit: + self.commit() + + return sap_ids + + def getResourceClaims(self, claim_ids=None, lower_bound=None, upper_bound=None, resource_ids=None, task_ids=None, status=None, resource_type=None, extended=False, include_properties=False): + extended |= resource_type is not None + query = '''SELECT * from %s''' % ('resource_allocation.resource_claim_extended_view' if extended else 'resource_allocation.resource_claim_view') + + if lower_bound and not isinstance(lower_bound, datetime): + lower_bound = None + + if upper_bound and not isinstance(upper_bound, datetime): + upper_bound = None + + if status is not None and isinstance(status, basestring): + #convert status string to status.id + status = self.getResourceClaimStatusId(status) + + if resource_type is not None and isinstance(resource_type, basestring): + #convert resource_type string to resource_type.id + resource_type = self.getResourceTypeId(resource_type) + + conditions = [] + qargs = [] + + if claim_ids is not None: + if isinstance(claim_ids, int): # just a single id + conditions.append('id = %s') + qargs.append(claim_ids) + elif len(claim_ids) == 1: # just a single id from a list + conditions.append('id = %s') + qargs.append(claim_ids[0]) + else: # list of id's + conditions.append('id in %s') + qargs.append(tuple(claim_ids)) + + if lower_bound: + conditions.append('endtime >= %s') + qargs.append(lower_bound) + + if upper_bound: + conditions.append('starttime <= %s') + qargs.append(upper_bound) + + if resource_ids is not None: + if isinstance(resource_ids, int): # just a single id + conditions.append('resource_id = %s') + qargs.append(resource_ids) + elif len(resource_ids) == 1: # just a single id from a list + conditions.append('resource_id = %s') + qargs.append(resource_ids[0]) + else: # list of id's + conditions.append('resource_id in %s') + qargs.append(tuple(resource_ids)) + + if task_ids is not None: + #if task_id is normal positive we do a normal inclusive filter + #if task_id is negative we do an exclusive filter + if isinstance(task_ids, int): # just a single id + conditions.append('task_id = %s' if task_ids >= 0 else 'task_id != %s') + qargs.append(abs(task_ids)) + else: + inclusive_task_ids = [t for t in task_ids if t >= 0] + exclusive_task_ids = [-t for t in task_ids if t < 0] + + if inclusive_task_ids: + conditions.append('task_id in %s') + qargs.append(tuple(inclusive_task_ids)) + + if exclusive_task_ids: + conditions.append('task_id not in %s') + qargs.append(tuple(exclusive_task_ids)) + + if status is not None: + conditions.append('status_id = %s') + qargs.append(status) + + if resource_type is not None and extended: + conditions.append('resource_type_id = %s') + qargs.append(resource_type) + + if conditions: + query += ' WHERE ' + ' AND '.join(conditions) + + claims = list(self._executeQuery(query, qargs, fetch=_FETCH_ALL)) + + if include_properties and claims: + claimDict = {c['id']:c for c in claims} + claim_ids = claimDict.keys() + properties = self.getResourceClaimProperties(claim_ids=claim_ids) + for p in properties: + try: + claim = claimDict[p['resource_claim_id']] + del p['resource_claim_id'] + if 'sap_nr' in p: + if not 'saps' in claim: + claim['saps'] = {} + if not p['sap_nr'] in claim['saps']: + claim['saps'][p['sap_nr']] = [] + claim['saps'][p['sap_nr']].append(p) + del p['sap_nr'] + else: + if not 'properties' in claim: + claim['properties'] = [] + claim['properties'].append(p) + except KeyError: + pass + + for claim in claims: + if 'saps' in claim: + claim['saps'] = [{'sap_nr':sap_nr, 'properties':props} for sap_nr, props in claim['saps'].items()] + + return claims def getResourceClaim(self, id): query = '''SELECT * from resource_allocation.resource_claim_view rcv where rcv.id = %s; ''' - self.cursor.execute(query, [id]) + result = self._executeQuery(query, [id], fetch=_FETCH_ONE) - result = self.cursor.fetchone() return dict(result) if result else None - def insertResourceClaim(self, resource_id, task_id, starttime, endtime, status, session_id, claim_size, username, user_id, commit=True): - if status and isinstance(status, basestring): - #convert status string to status.id - status = self.getResourceClaimStatusId(status) + def insertResourceClaim(self, resource_id, task_id, starttime, endtime, status, session_id, claim_size, username, user_id, properties=None, commit=True): + # for code re-use: + # put the one claim in a list + # and do a bulk insert of the one-item-list + claim = {'resource_id':resource_id, + 'starttime':starttime, + 'endtime':endtime, + 'status':status, + 'claim_size':1} + + if properties: + claim['properties'] = properties + + result = self.insertResourceClaims(task_id, [claim], session_id, username, user_id, commit) + if result: + return result[0] + + def insertResourceClaims(self, task_id, claims, session_id, username, user_id, commit=True): + '''bulk insert of resource claims for a task + claims is a list of dicts. Each dict is a claim for one resource containing the fields: starttime, endtime, status, claim_size + ''' + logger.info('insertResourceClaims for task_id=%d with %d claim(s)' % (task_id, len(claims))) + + status_strings = set([c['status'] for c in claims if isinstance(c['status'], basestring)]) + if status_strings: + status_string2id = {s:self.getResourceClaimStatusId(s) for s in status_strings} + for c in claims: + if isinstance(c['status'], basestring): + c['status'] = status_string2id[c['status']] + + try: + claim_values = [(c['resource_id'], task_id, c['starttime'], c['endtime'], + c['status'], session_id, c['claim_size'], + username, user_id) for c in claims] + except Exception as e: + logger.error("Invalid claim dict, rolling back. %s" % e) + self.rollback() + return None + + try: + # use psycopg2 mogrify to parse and build the insert values + # this way we can insert many values in one insert query, returning the id's of each inserted row. + # this is much faster than psycopg2's executeMany method + insert_values = ','.join(self.cursor.mogrify('(%s, %s, %s, %s, %s, %s, %s, %s, %s)', cv) for cv in claim_values) + except Exception as e: + logger.error("Invalid input, rolling back: %s\n%s" % (claim_values, e)) + self.rollback() + return None query = '''INSERT INTO resource_allocation.resource_claim (resource_id, task_id, starttime, endtime, status_id, session_id, claim_size, username, user_id) - VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) - RETURNING id;''' + VALUES {values} + RETURNING id;'''.format(values=insert_values) + + claimIds = [x['id'] for x in self._executeQuery(query, fetch=_FETCH_ALL)] + + if not claimIds or [x for x in claimIds if x < 0]: + logger.error("One or more claims cloud not be inserted. Rolling back.") + self.rollback() + return None + + # gather all properties for all claims + # store them as list of (claim_id, prop_type, prop_value, sap_nr) tuples + properties = [] + for claim_id, claim in zip(claimIds, claims): + if 'properties' in claim and len(claim['properties']) > 0: + claim_props = [(claim_id, p['type'], p['value'], p.get('sap_nr')) for p in claim['properties']] + properties += claim_props + + if properties: + property_ids = self.insertResourceClaimProperties(properties, False) + if property_ids == None: + return None + + # get the claims as they were inserted + # and validate them against all other claims + insertedClaims = self.getResourceClaims(claim_ids=claimIds) + self.validateResourceClaimsStatus(insertedClaims, False) - self.cursor.execute(query, (resource_id, task_id, starttime, endtime, status, session_id, claim_size, username, user_id)) - id = self.cursor.fetchone()['id'] if commit: - self.conn.commit() - return id + self.commit() + + logger.info('inserted %d resource claim(s) for task_id=%d' % (len(claimIds), task_id)) + return claimIds def deleteResourceClaim(self, resource_claim_id, commit=True): query = '''DELETE FROM resource_allocation.resource_claim WHERE resource_allocation.resource_claim.id = %s;''' - self.cursor.execute(query, [resource_claim_id]) + self._executeQuery(query, [resource_claim_id]) if commit: - self.conn.commit() + self.commit() return self.cursor.rowcount > 0 - def updateResourceClaim(self, resource_claim_id, resource_id=None, task_id=None, starttime=None, endtime=None, status=None, session_id=None, claim_size=None, username=None, user_id=None, commit=True): - if status and isinstance(status, basestring): + def updateResourceClaim(self, resource_claim_id, resource_id=None, task_id=None, starttime=None, endtime=None, status=None, session_id=None, claim_size=None, username=None, user_id=None, validate=True, commit=True): + return self.updateResourceClaims([resource_claim_id], resource_id, task_id, starttime, endtime, status, session_id, claim_size, username, user_id, validate, commit) + + def updateResourceClaims(self, resource_claim_ids, resource_id=None, task_id=None, starttime=None, endtime=None, status=None, session_id=None, claim_size=None, username=None, user_id=None, validate=True, commit=True): + if not resource_claim_ids: + return + + logger.info("updateResourceClaims for %d claims" % len(resource_claim_ids)) + + if validate: + claimsBeforeUpdate = self.getResourceClaims(resource_claim_ids) + + if status is not None and isinstance(status, basestring): #convert status string to status.id status = self.getResourceClaimStatusId(status) fields = [] values = [] - if resource_id: + if resource_id is not None: fields.append('resource_id') values.append(resource_id) - if task_id: + if task_id is not None: fields.append('task_id') values.append(task_id) @@ -405,107 +969,432 @@ class RADatabase: fields.append('endtime') values.append(endtime) - if status: + if status is not None: fields.append('status_id') values.append(status) - if session_id: + if session_id is not None: fields.append('session_id') values.append(session_id) - if claim_size: + if claim_size is not None: fields.append('claim_size') values.append(claim_size) - if username: + if username is not None: fields.append('username') values.append(username) - if user_id: + if user_id is not None: fields.append('user_id') values.append(user_id) - values.append(resource_claim_id) + values.append(tuple(resource_claim_ids)) query = '''UPDATE resource_allocation.resource_claim SET ({fields}) = ({value_placeholders}) - WHERE resource_allocation.resource_claim.id = {rc_id_placeholder};'''.format(fields=', '.join(fields), - value_placeholders=', '.join('%s' for x in fields), - rc_id_placeholder='%s') + WHERE resource_allocation.resource_claim.id in {rc_ids_placeholder};'''.format(fields=', '.join(fields), + value_placeholders=', '.join('%s' for x in fields), + rc_ids_placeholder='%s') + + self._executeQuery(query, values) + + if validate: + self.validateResourceClaimsStatus(self.getResourceClaims(resource_claim_ids), commit=False) + self.validateResourceClaimsStatusForMovedClaims(claimsBeforeUpdate, commit=False) - self.cursor.execute(query, values) if commit: - self.conn.commit() + self.commit() return self.cursor.rowcount > 0 - def getResourceClaimsForTask(self, task_id): - query = '''SELECT * from resource_allocation.resource_claim_view - WHERE resource_allocation.resource_claim_view.task_id = %s''' - self.cursor.execute(query, [task_id]) - print query - print task_id - return list(self.cursor.fetchall()) + def updateTaskAndResourceClaims(self, task_id, starttime=None, endtime=None, task_status=None, claim_status=None, session_id=None, username=None, user_id=None, commit=True): + claimsBeforeUpdate = self.getResourceClaims(task_ids=task_id) - def updateResourceClaimsForTask(self, task_id, starttime=None, endtime=None, status=None, session_id=None, username=None, user_id=None, commit=True): - if status and isinstance(status, basestring): + if claim_status is not None and isinstance(claim_status, basestring): #convert status string to status.id - status = self.getResourceClaimStatusId(status) + claim_status = self.getResourceClaimStatusId(claim_status) + + updated = True + + if task_status is not None : + updated &= self.updateTask(task_id, task_status=task_status, commit=False) + + if starttime or endtime: + task = self.getTask(task_id) + updated &= self.updateSpecification(task['specification_id'], starttime=starttime, endtime=endtime, commit=False) + + if (starttime or endtime or claim_status is not None or session_id is not None or + username is not None or user_id is not None): + # update the claims as well + # updateResourceClaims also validates the updated claims + claim_ids = [c['id'] for c in claimsBeforeUpdate] + updated &= self.updateResourceClaims(claim_ids, + starttime=starttime, + endtime=endtime, + status=claim_status, + session_id=session_id, + username=username, user_id=user_id, + validate=True, + commit=False) + + # because we moved or changed the status of these claims, + # validate the claims 'underneath' which may have been in conflict + # and which now may be 'freed' + self.validateResourceClaimsStatusForMovedClaims(claimsBeforeUpdate, commit=False) - fields = [] - values = [] + if commit: + self.commit() + + return updated + + def validateResourceClaimsStatusForMovedClaims(self, moved_claims, commit=True): + if not moved_claims: + return + + moved_claim_ids = set([c['id'] for c in moved_claims]) + resource_ids = list(set([c['resource_id'] for c in moved_claims])) + min_starttime = min(c['starttime'] for c in moved_claims) + max_endtime = min(c['endtime'] for c in moved_claims) + + otherClaims = [c for c in self.getResourceClaims(resource_ids=resource_ids, + lower_bound=min_starttime, + upper_bound=max_endtime) + if c['id'] not in moved_claim_ids] + + if otherClaims: + logger.info("validating %d claims which may have been freed" % len(otherClaims)) + self.validateResourceClaimsStatus(otherClaims, commit=commit) + + def validateResourceClaimsStatusForTask(self, task_id, commit=True): + claims = self.getResourceClaims(task_ids=task_id) + return self.validateResourceClaimsStatus(claims, commit) + + def validateResourceClaimsStatus(self, claims, commit=True): + # TODO: this should be a trigger function in the radb itself + if not claims: + return + + claimDict = {c['id']:c for c in claims} + resource_ids = list(set([c['resource_id'] for c in claims])) + task_ids = list(set(c['task_id'] for c in claims)) + min_starttime = min(c['starttime'] for c in claims) + max_endtime = min(c['endtime'] for c in claims) + + logger.info("validating status of %d resource claim(s) for task_id(s) %s" % (len(claims), to_csv_string(task_ids))) + + # cache status_id's for conflift and claimed + claimsStatuses = self.getResourceClaimStatuses() + conflistStatusId = next(cs['id'] for cs in claimsStatuses if cs['name'] == 'conflict') + claimedStatusId = next(cs['id'] for cs in claimsStatuses if cs['name'] == 'claimed') + allocatedStatusId = next(cs['id'] for cs in claimsStatuses if cs['name'] == 'allocated') + + # 'result' dict for new statuses for claims + newClaimStatuses = {conflistStatusId:[], claimedStatusId:[]} + + #get all resources including availability + #convert to id->resource dict + resources = self.getResources(include_availability=True) + resources = {r['id']:r for r in resources} + + # get all claims for given resource_ids, within the given timeframe + otherClaims = self.getResourceClaims(resource_ids=resource_ids, + lower_bound=min_starttime, + upper_bound=max_endtime) + + #group claims per resource + resource2otherClaims = {r_id:[] for r_id in resource_ids} + for claim in otherClaims: + if claim['id'] not in claimDict: + resource2otherClaims[claim['resource_id']].append(claim) + + for claim_id, claim in claimDict.items(): + claimSize = claim['claim_size'] + resource_id = claim['resource_id'] + resource = resources[resource_id] + resourceOtherClaims = resource2otherClaims[resource_id] + totalOtherClaimSize = sum(c['claim_size'] for c in resourceOtherClaims) + + logger.info('resource_id=%s claimSize=%s totalOtherClaimSize=%s total=%s available_capacity=%s' % + (resource_id, + claimSize, + totalOtherClaimSize, + totalOtherClaimSize + claimSize, + resource['available_capacity'])) + + if totalOtherClaimSize + claimSize >= resource['available_capacity']: + newClaimStatuses[conflistStatusId].append(claim_id) + elif claim['status_id'] != allocatedStatusId: + newClaimStatuses[claimedStatusId].append(claim_id) + + if newClaimStatuses: + for status_id, claim_ids in newClaimStatuses.items(): + changed_claim_ids = [c_id for c_id in claim_ids if claimDict[c_id]['status_id'] != status_id] + self.updateResourceClaims(resource_claim_ids=changed_claim_ids, status=status_id, validate=False) + + # update each task + # depending on the task's claims in conflict/other status + for task_id in task_ids: + if self.getResourceClaims(task_ids=task_id, status=conflistStatusId): + # if any claims in conflict -> task: conflict + self.updateTask(task_id=task_id, task_status='conflict', commit=False) + elif self.getTask(task_id)['status'] == 'conflict': + # if no claims in conflict and task was in conflict -> task: prescheduled + self.updateTask(task_id=task_id, task_status='prescheduled', commit=False) - if starttime: - fields.append('starttime') - values.append(starttime) + if commit: + self.commit() - if endtime: - fields.append('endtime') - values.append(endtime) + def insertSpecificationAndTask(self, mom_id, otdb_id, task_status, task_type, starttime, endtime, content, commit=True): + ''' + Insert a new specification and task in one transaction. + Removes existing task with same otdb_id if present in the same transaction. + ''' + try: + task = self.getTask(otdb_id=otdb_id) - if status: - fields.append('status_id') - values.append(status) + if task: + # delete old specification, task, and resource claims using cascaded delete + self.deleteSpecification(task['specification_id'], False) - if session_id: - fields.append('session_id') - values.append(session_id) + specId = self.insertSpecification(starttime, endtime, content, False) + taskId = self.insertTask(mom_id, otdb_id, task_status, task_type, specId, False) - if username: - fields.append('username') - values.append(username) + if specId >= 0 and taskId >= 0: + if commit: + self.commit() + return {'inserted': True, 'specification_id': specId, 'task_id': taskId} + except: + self.rollback() - if user_id: - fields.append('user_id') - values.append(user_id) + return {'inserted': False, 'specification_id': None, 'task_id': None} - values.append(task_id) + def getTaskConflictReasons(self, task_ids=None): + query = '''SELECT * from resource_allocation.task_conflict_reason_view''' - query = '''UPDATE resource_allocation.resource_claim - SET ({fields}) = ({value_placeholders}) - WHERE resource_allocation.resource_claim.task_id = {task_id_placeholder};'''.format(fields=', '.join(fields), - value_placeholders=', '.join('%s' for x in fields), - task_id_placeholder='%s') + conditions = [] + qargs = [] + + if task_ids is not None: + if isinstance(task_ids, int): # just a single id + conditions.append('task_id = %s') + qargs.append(task_ids) + elif len(task_ids) == 1: # just a single id from a list + conditions.append('task_id = %s') + qargs.append(task_ids[0]) + else: # list of id's + conditions.append('task_id in %s') + qargs.append(tuple(task_ids)) + + if conditions: + query += ' WHERE ' + ' AND '.join(conditions) + + conflict_reasons = list(self._executeQuery(query, qargs, fetch=_FETCH_ALL)) + return conflict_reasons + + def insertTaskConflicts(self, task_id, conflict_reason_ids, commit=True): + if not self.cursor: + self._connect() + + insert_values = ','.join(self.cursor.mogrify('(%s, %s)', (task_id, cr_id)) for cr_id in conflict_reason_ids) + + query = '''INSERT INTO resource_allocation.task_conflict_reason + (task_id, conflict_reason_id) + VALUES {values} + RETURNING id;'''.format(values=insert_values) + + ids = [x['id'] for x in self._executeQuery(query, fetch=_FETCH_ALL)] + + if [x for x in ids if x < 0]: + logger.error("One or more conflict reasons could not be inserted. Rolling back.") + self.rollback() + return None - self.cursor.execute(query, values) if commit: - self.conn.commit() + self.commit() + return ids + + + def getResourceClaimConflictReasons(self, claim_ids=None, resource_ids=None, task_ids=None): + query = '''SELECT * from resource_allocation.resource_claim_conflict_reason_view''' + + conditions = [] + qargs = [] + + if claim_ids is not None: + if isinstance(claim_ids, int): # just a single id + conditions.append('id = %s') + qargs.append(claim_ids) + elif len(claim_ids) == 1: # just a single id from a list + conditions.append('id = %s') + qargs.append(claim_ids[0]) + else: # list of id's + conditions.append('id in %s') + qargs.append(tuple(claim_ids)) + + if resource_ids is not None: + if isinstance(resource_ids, int): # just a single id + conditions.append('resource_id = %s') + qargs.append(resource_ids) + elif len(resource_ids) == 1: # just a single id from a list + conditions.append('resource_id = %s') + qargs.append(resource_ids[0]) + else: # list of id's + conditions.append('resource_id in %s') + qargs.append(tuple(resource_ids)) + + if task_ids is not None: + if isinstance(task_ids, int): # just a single id + conditions.append('task_id = %s') + qargs.append(task_ids) + elif len(task_ids) == 1: # just a single id from a list + conditions.append('task_id = %s') + qargs.append(task_ids[0]) + else: # list of id's + conditions.append('task_id in %s') + qargs.append(tuple(task_ids)) + + if conditions: + query += ' WHERE ' + ' AND '.join(conditions) + + conflict_reasons = list(self._executeQuery(query, qargs, fetch=_FETCH_ALL)) + return conflict_reasons + + def insertResourceClaimConflicts(self, claim_id, conflict_reason_ids, commit=True): + if not self.cursor: + self._connect() + + insert_values = ','.join(self.cursor.mogrify('(%s, %s)', (claim_id, cr_id)) for cr_id in conflict_reason_ids) + + query = '''INSERT INTO resource_allocation.resource_claim_conflict_reason + (resource_claim_id, conflict_reason_id) + VALUES {values} + RETURNING id;'''.format(values=insert_values) + + ids = [x['id'] for x in self._executeQuery(query, fetch=_FETCH_ALL)] + + if [x for x in ids if x < 0]: + logger.error("One or more conflict reasons could not be inserted. Rolling back.") + self.rollback() + return None - return self.cursor.rowcount > 0 + if commit: + self.commit() + return ids + + def getResourceUsages(self, claim_ids=None, lower_bound=None, upper_bound=None, resource_ids=None, task_ids=None, status=None, resource_type=None): + claims = self.getResourceClaims(claim_ids=claim_ids, lower_bound=lower_bound, upper_bound=upper_bound, resource_ids=resource_ids, task_ids=task_ids, status=status, resource_type=resource_type) + + #gather start/end events per resource per claim_status + eventsDict = {} + for claim in claims: + event_start = { 'timestamp': claim['starttime'], 'delta': claim['claim_size'] } + event_end = { 'timestamp': claim['endtime'], 'delta': -claim['claim_size'] } + + resource_id = claim['resource_id'] + status = claim['status'] + if not resource_id in eventsDict: + eventsDict[resource_id] = {} + + if not status in eventsDict[resource_id]: + eventsDict[resource_id][status] = [] + + eventsDict[resource_id][status].append(event_start) + eventsDict[resource_id][status].append(event_end) + + # sort events per resource by event timestamp ascending + # and integrate event delta's into usage + all_usages = {} + for resource_id, status_events in eventsDict.items(): + usages = {} + for status, events in status_events.items(): + if events: + usages[status] = [] + prev_usage = { 'timestamp': datetime(1971, 1, 1), 'value': 0 } + + events = sorted(events, key=lambda event: event['timestamp']) + + for event in events: + prev_value = prev_usage['value'] + prev_timestamp = prev_usage['timestamp'] + new_value = prev_value + event['delta'] + usage = { 'timestamp': event['timestamp'], 'value': new_value } + + if prev_timestamp == event['timestamp']: + usages[status][-1]['value'] += event['delta'] + else: + usages[status].append(usage) + + prev_usage = usage + + resource_usages = { 'resource_id': resource_id, 'usages': usages } + all_usages[resource_id] = resource_usages + + resource_ids = all_usages.keys() + resources = self.getResources(resource_ids=resource_ids, include_availability=True) + + for resource in resources: + resource_id = resource['id'] + resource_usages = all_usages[resource_id] + # copy resource capacities + for item in ['total_capacity', 'available_capacity', 'used_capacity']: + try: + resource_usages[item] = 0 + if item in resource: + resource_usages[item] = resource[item] + if item == 'used_capacity': + # and compute unaccounted-for usage, + # which is the actual used_capacity minus the currently allocated total claim size + # defaults to used_capacity if no currently allocated total claim size + resource_usages['misc_used_capacity'] = resource['used_capacity'] + utcnow = datetime.utcnow() + allocated_usages = resource_usages['usages'].get('allocated', []) + past_allocated_usages = sorted([au for au in allocated_usages if au['timestamp'] <= utcnow]) + if past_allocated_usages: + currently_allocated_usage = past_allocated_usages[-1] + resource_usages['misc_used_capacity'] = resource['used_capacity'] - currently_allocated_usage['value'] + except Exception as e: + logger.error(e) + + all_usages_list = all_usages.values() + return all_usages_list if __name__ == '__main__': logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) - db = RADatabase(host='10.149.96.6', password='123456') - #db = RADatabase(host='localhost', password='123456') + # Check the invocation arguments + parser = OptionParser("%prog [options]", + description='runs some test queries on the radb') + parser.add_option_group(dbcredentials.options_group(parser)) + parser.set_defaults(dbcredentials="RADB") + (options, args) = parser.parse_args() + + dbcreds = dbcredentials.parse_options(options) + + logger.info("Using dbcreds: %s" % dbcreds.stringWithHiddenPassword()) + + db = RADatabase(dbcreds=dbcreds, log_queries=True) def resultPrint(method): print '\n-- ' + str(method.__name__) + ' --' print '\n'.join([str(x) for x in method()]) + + #print db.getResourceClaims(task_id=440) + #print + #print db.getResourceClaims(lower_bound=datetime.utcnow() + timedelta(days=9)) + #print + #print db.getResourceClaims(upper_bound=datetime.utcnow() + timedelta(days=19)) + #print + #print db.getResourceClaims(status='allocated') + #print + #print db.getResourceClaims(status='claimed') + #print + #print db.getResourceClaims(resource_type='storage') + #resultPrint(db.getTaskStatuses) #resultPrint(db.getTaskStatusNames) #resultPrint(db.getTaskTypes) @@ -520,59 +1409,204 @@ if __name__ == '__main__': #resultPrint(db.getResourceGroupTypeNames) #resultPrint(db.getResources) #resultPrint(db.getResourceGroups) + #resultPrint(db.getResourceGroupMemberships) #resultPrint(db.getTasks) + #print db.getTaskPredecessorIds() + #print db.getTaskSuccessorIds() #resultPrint(db.getSpecifications) #resultPrint(db.getResourceClaims) - #rcId = db.insertResourceClaim(1, 1, datetime.datetime.utcnow(), datetime.datetime.utcnow() + datetime.timedelta(hours=1), 'CLAIMED', 1, 10, 'einstein', -1, True) + #claims = db.getResourceClaims() + #db.updateTaskAndResourceClaims(claims[0]['task_id'], starttime=claims[1]['starttime'], endtime=claims[1]['endtime']) + #print + #print db.getResourceClaims() #resultPrint(db.getResourceClaims) - #time.sleep(1) - #rcId = db.updateResourceClaim(rcId, starttime=datetime.datetime.utcnow(), status='ALLOCATED') + db.updateResourceAvailability(0, available_capacity=2) + exit(0) + + import pprint + pprint.pprint(db.getTaskConflictReasons()) + db.updateTask(21, task_status='conflict') + db.insertTaskConflicts(21, [1, 2, 3]) + pprint.pprint(db.getTaskConflictReasons()) + db.updateTask(21, task_status='scheduled') + pprint.pprint(db.getTaskConflictReasons()) + db.insertTaskConflicts(21, [1, 2, 3]) + pprint.pprint(db.getTaskConflictReasons()) + + pprint.pprint(db.getResourceClaimConflictReasons(task_ids=22)) + #pprint.pprint(db.getResourceUsages()) + + exit(0) + + for s in db.getSpecifications(): + db.deleteSpecification(s['id']) + + resources = db.getResources() + + #task_id = db.insertSpecificationAndTask(1234, 5678, 600, 0, datetime.utcnow(), datetime.utcnow() + timedelta(hours=1), "", False)['task_id'] + #task = db.getTask(task_id) + + #claim = {'resource_id':resources[0]['id'], + #'starttime':task['starttime'], + #'endtime':task['endtime'], + #'status':'claimed', + #'claim_size':1} + #db.insertResourceClaims(task_id, [claim], 1, 'anonymous', -1, False) + + #claim = {'resource_id':resources[1]['id'], + #'starttime':task['starttime'], + #'endtime':task['endtime'], + #'status':'claimed', + #'claim_size':1, + #'properties':[{'type':'nr_of_is_files', 'value':10},{'type':'nr_of_cs_files', 'value':20}]} + #db.insertResourceClaims(task_id, [claim], 1, 'anonymous', -1, False) + + #claim = {'resource_id':resources[2]['id'], + #'starttime':task['starttime'], + #'endtime':task['endtime'], + #'status':'claimed', + #'claim_size':1, + #'properties':[{'type':'nr_of_is_files', 'value':10, 'sap_nr':0 }, + #{'type':'nr_of_cs_files', 'value':20, 'sap_nr':0}, + #{'type':'nr_of_uv_files', 'value':30, 'sap_nr':1},]} + #db.insertResourceClaims(task_id, [claim], 1, 'anonymous', -1, False) + + #claim = {'resource_id':resources[3]['id'], + #'starttime':task['starttime'], + #'endtime':task['endtime'], + #'status':'claimed', + #'claim_size':1, + #'properties':[{'type':'nr_of_is_files', 'value':15 }, + #{'type':'nr_of_cs_files', 'value':25 }, + #{'type':'nr_of_is_files', 'value':10, 'sap_nr':0 }, + #{'type':'nr_of_cs_files', 'value':20, 'sap_nr':0}, + #{'type':'nr_of_uv_files', 'value':30, 'sap_nr':1},]} + #db.insertResourceClaims(task_id, [claim], 1, 'anonymous', -1, False) + + #db.commit() + #import pprint + #pprint.pprint(db.getResourceClaims(include_properties=True)) + #print '\n'.join(str(x) for x in db.getResourceClaims(include_properties=True)) + + + #c = db.cursor + #query = '''INSERT INTO resource_allocation.resource_claim + #(resource_id, task_id, starttime, endtime, status_id, session_id, claim_size, username, user_id) + #VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) + #RETURNING id;''' + + #print c.mogrify(query, [(0, 0, datetime.utcnow(), datetime.utcnow(), 200, 1, 1, 'piet', 1)]) + #exit(0) + + + #for s in db.getSpecifications(): + #db.deleteSpecification(s['id']) + + from lofar.common.datetimeutils import totalSeconds + begin = datetime.utcnow() + for i in range(5): + stepbegin = datetime.utcnow() + result = db.insertSpecificationAndTask(1234+i, 5678+i, 350, 0, datetime.utcnow() + timedelta(hours=1.25*i), datetime.utcnow() + timedelta(hours=1.25*i+1), "", False) + + #resultPrint(db.getSpecifications) + #resultPrint(db.getTasks) + + task = db.getTask(result['task_id']) + + claims = [{'resource_id':r['id'], + 'starttime':task['starttime'], + 'endtime':task['endtime'], + 'status': ['claimed', 'allocated', 'conflict'][i%3], + 'claim_size':1} for r in resources[:1]] + + for c in claims[:]: + c['properties'] = [{'type':0, 'value':10}, {'type':1, 'value':20}, {'type':2, 'value':30}] + + for i, c in enumerate(claims[:4]): + c['properties'][0]['sap_nr'] = i % 2 + + db.insertResourceClaims(task['id'], claims, 1, 'paulus', 1, False) + + #resultPrint(db.getResourceClaims) + #raw_input() + db.commit() + now = datetime.utcnow() + print totalSeconds(now - begin), totalSeconds(now - stepbegin) + + import pprint + pprint.pprint(db.getResourceUsages(resource_type='storage')) #resultPrint(db.getResourceClaims) + #resultPrint(db.getResourceClaimPropertyTypes) + ##resultPrint(db.getResourceClaimPropertyTypeNames) + ##resultPrint(db.getResourceClaimProperties) - #taskId = db.insertTask(1234, 5678, 'active', 'OBSERVATION', 1) + #print '\n'.join(str(x) for x in db.getResourceClaimProperties()) + #print '\n'.join(str(x) for x in db.getResourceClaimProperties(task_id=task['id'])) + #print '\n'.join(str(x) for x in db.getResourceClaims(include_properties=True)) + + #db.commit() #resultPrint(db.getTasks) + #resultPrint(db.getResourceClaims) - #print db.updateTask(taskId, task_status='scheduled', otdb_id=723, task_type='PIPELINE') + #tasks = db.getTasks() + #db.updateTaskAndResourceClaims(tasks[0]['id'], endtime=tasks[1]['endtime']) #resultPrint(db.getTasks) + #resultPrint(db.getResourceClaims) + #db.updateTaskAndResourceClaims(tasks[0]['id'], endtime=tasks[0]['starttime'] + timedelta(hours=1)) + + #resultPrint(db.getTasks) + #resultPrint(db.getResourceClaims) - #for s in db.getSpecifications(): - #db.updateSpecification(s['id'], datetime.datetime.utcnow(), datetime.datetime.utcnow() + datetime.timedelta(hours=1)) #claims = db.getResourceClaims() #for c in claims: #db.deleteResourceClaim(c['id']) ##resultPrint(db.getResourceClaims) - #tasks = db.getTasks() - #for t in tasks: - #db.deleteTask(t['id']) - ###resultPrint(db.getTasks) - ###resultPrint(db.getResourceClaims) + #predTaskId = None + #for i in range(2): + #specId = db.insertSpecification(datetime.utcnow(), datetime.utcnow() + timedelta(hours=4), "") + #taskId = db.insertTask(1234+i, 5678+i, 600, 0, specId) - import random + #if predTaskId: + #db.insertTaskPredecessor(taskId, predTaskId) + #predTaskId = taskId - #for i in range(20): - #taskId = db.insertTask(1234, 5678, 600, 0, 1) - #for j in range(2*i): - #rcId = db.insertResourceClaim(j, taskId, datetime.datetime.utcnow() + datetime.timedelta(hours=4*i), datetime.datetime.utcnow() + datetime.timedelta(hours=4*i+3.5), 0, 1, 10, 'einstein', -1) + #resources = db.getResources() + #for r in resources: + #rcId = db.insertResourceClaim(r['id'], taskId, datetime.utcnow() + timedelta(hours=2*i), datetime.utcnow() + timedelta(hours=2*(i+1)), 0, 1, 10, 'einstein', -1) - #time.sleep(0.5) - #resultPrint(db.getTasks) - #resultPrint(db.getResourceClaims) + ##tasks = db.getTasks() + ##for t in tasks: + ##db.deleteTask(t['id']) + ####resultPrint(db.getTasks) + ####resultPrint(db.getResourceClaims) + + #import random - ts = db.getTaskStatuses() + ##for i in range(1): + ##taskId = db.insertTask(1234, 5678, 600, 0, 1) + ##for j in range(2*i): + ##rcId = db.insertResourceClaim(j, taskId, datetime.utcnow() + timedelta(hours=4*i), datetime.utcnow() + timedelta(hours=4*i+3.5), 0, 4, 10, 'einstein', -1) - tasks = sorted(db.getTasks(), key=lambda x: x['id']) - for t in tasks: - db.updateTask(t['id'], task_status=ts[random.randint(0, len(ts)-1)]['id']) - time.sleep(0.01) + ##time.sleep(0.5) + + ##resultPrint(db.getTasks) + ##resultPrint(db.getResourceClaims) + + #ts = db.getTaskStatuses() + + #tasks = sorted(db.getTasks(), key=lambda x: x['id']) + #for t in tasks: + #db.updateTask(t['id'], task_status=ts[random.randint(0, len(ts)-1)]['id']) + #time.sleep(0.01) #db.commit() diff --git a/SAS/ResourceAssignment/ResourceAssignmentService/radbbuslistener.py b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radbbuslistener.py similarity index 51% rename from SAS/ResourceAssignment/ResourceAssignmentService/radbbuslistener.py rename to SAS/ResourceAssignment/ResourceAssignmentDatabase/radbbuslistener.py index 2f24be04df015405e25ba2a30980b846955a6c35..fcf3ff0cf918f61af87224ede09814caea4d2eeb 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentService/radbbuslistener.py +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radbbuslistener.py @@ -28,7 +28,7 @@ Typical usage is to derive your own subclass from RADBBusListener and implement """ from lofar.messaging.messagebus import AbstractBusListener -from lofar.sas.resourceassignment.database.config import DEFAULT_BUSNAME +from lofar.sas.resourceassignment.database.config import DEFAULT_NOTIFICATION_BUSNAME, DEFAULT_NOTIFICATION_SUBJECTS from lofar.common.util import waitForInterrupt import qpid.messaging @@ -39,7 +39,7 @@ logger = logging.getLogger(__name__) class RADBBusListener(AbstractBusListener): - def __init__(self, busname=DEFAULT_BUSNAME, subject='RADB.*', broker=None, **kwargs): + def __init__(self, busname=DEFAULT_NOTIFICATION_BUSNAME, subjects=DEFAULT_NOTIFICATION_SUBJECTS, broker=None, **kwargs): """ RADBBusListener listens on the lofar notification message bus and calls (empty) on<SomeMessage> methods when such a message is received. Typical usage is to derive your own subclass from RADBBusListener and implement the specific on<SomeMessage> methods that you are interested in. @@ -51,59 +51,81 @@ class RADBBusListener(AbstractBusListener): numthreads= <int> Number of parallel threads processing messages (default: 1) verbose= <bool> Output extra logging over stdout (default: False) """ - address = "%s/%s" % (busname, subject) + self.subject_prefix = (subjects.split('.')[0]+'.') if '.' in subjects else '' + + address = "%s/%s" % (busname, subjects) super(RADBBusListener, self).__init__(address, broker, **kwargs) + def _handleMessage(self, msg): - logger.debug("RADBBusListener.handleMessage: %s" %str(msg)) - - if msg.subject == 'RADB.TaskUpdated': - self.onTaskUpdated(msg.content) - elif msg.subject == 'RADB.TaskInserted': - self.onTaskInserted(msg.content) - elif msg.subject == 'RADB.TaskDeleted': - self.onTaskDeleted(msg.content) - elif msg.subject == 'RADB.ResourceClaimUpdated': - self.onResourceClaimUpdated(msg.content) - elif msg.subject == 'RADB.ResourceClaimInserted': - self.onResourceClaimInserted(msg.content) - elif msg.subject == 'RADB.ResourceClaimDeleted': - self.onResourceClaimDeleted(msg.content) + logger.info("on%s: %s" % (msg.subject.replace(self.subject_prefix, ''), str(msg.content).replace('\n', ' '))) + + if msg.subject == '%sTaskUpdated' % self.subject_prefix: + self.onTaskUpdated(msg.content.get('old'), msg.content.get('new')) + elif msg.subject == '%sTaskInserted' % self.subject_prefix: + self.onTaskInserted(msg.content.get('new')) + elif msg.subject == '%sTaskDeleted' % self.subject_prefix: + self.onTaskDeleted(msg.content.get('old')) + elif msg.subject == '%sResourceClaimUpdated' % self.subject_prefix: + self.onResourceClaimUpdated(msg.content.get('old'), msg.content.get('new')) + elif msg.subject == '%sResourceClaimInserted' % self.subject_prefix: + self.onResourceClaimInserted(msg.content.get('new')) + elif msg.subject == '%sResourceClaimDeleted' % self.subject_prefix: + self.onResourceClaimDeleted(msg.content.get('old')) + elif msg.subject == '%sResourceAvailabilityUpdated' % self.subject_prefix: + self.onResourceAvailabilityUpdated(msg.content.get('old'), msg.content.get('new')) + elif msg.subject == '%sResourceCapacityUpdated' % self.subject_prefix: + self.onResourceCapacityUpdated(msg.content.get('old'), msg.content.get('new')) else: logger.error("RADBBusListener.handleMessage: unknown subject: %s" %str(msg.subject)) - def onTaskUpdated(self, task): + def onTaskUpdated(self, old_task, new_task): '''onTaskUpdated is called upon receiving a TaskUpdated message. - :param task: dictionary with the updated task''' + :param old_task: dictionary with the task before the update + :param new_task: dictionary with the updated task''' pass - def onTaskInserted(self, task): + def onTaskInserted(self, new_task): '''onTaskInserted is called upon receiving a TaskInserted message. - :param task: dictionary with the inserted task''' + :param new_task: dictionary with the inserted task''' pass - def onTaskDeleted(self, task): + def onTaskDeleted(self, old_task): '''onTaskDeleted is called upon receiving a TaskDeleted message. - :param task: dictionary with the deleted task''' + :param old_task: dictionary with the deleted task''' pass - def onResourceClaimUpdated(self, claim): + def onResourceClaimUpdated(self, old_claim, new_claim): '''onResourceClaimUpdated is called upon receiving a ResourceClaimUpdated message. - :param task: dictionary with the updated claim''' + :param old_claim: dictionary with the claim before the update + :param new_claim: dictionary with the updated claim''' pass - def onResourceClaimInserted(self, claim): + def onResourceClaimInserted(self, new_claim): '''onResourceClaimInserted is called upon receiving a ResourceClaimInserted message. - :param task: dictionary with the inserted claim''' + :param new_claim: dictionary with the inserted claim''' pass - def onResourceClaimDeleted(self, claim): + def onResourceClaimDeleted(self, old_claim): '''onResourceClaimDeleted is called upon receiving a ResourceClaimDeleted message. - :param task: dictionary with the deleted claim''' + :param old_claim: dictionary with the deleted claim''' + pass + + def onResourceAvailabilityUpdated(self, old_availability, new_availability): + '''onResourceAvailabilityUpdated is called upon receiving a ResourceAvailabilityUpdated message. + :param old_availability: dictionary with the resource availability before the update + :param new_availability: dictionary with the updated availability''' pass + def onResourceCapacityUpdated(self, old_capacity, new_capacity): + '''onResourceCapacityUpdated is called upon receiving a ResourceCapacityUpdated message. + :param old_capacity: dictionary with the resource capacity before the update + :param new_capacity: dictionary with the updated capacity''' + pass + + if __name__ == '__main__': - with RADBBusListener(broker='10.149.96.6') as listener: + with RADBBusListener(broker=None) as listener: waitForInterrupt() __all__ = ["RADBBusListener"] diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radbpglistener b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radbpglistener index db2e45bb6980e5df68ba7eac1e21433b3791aab8..468d4529e552730fac4344424c4e47b5580a43f8 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radbpglistener +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radbpglistener @@ -6,18 +6,10 @@ runs the resourceassignment postgres database listener and sends EventMessages t ''' import logging -logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) logger = logging.getLogger(__name__) -from optparse import OptionParser -from lofar.sas.resourceassignment.database import radbpglistener -from lofar.sas.resourceassignment.database.config import DEFAULT_BUSNAME +from lofar.sas.resourceassignment.database.radbpglistener import main if __name__ == '__main__': - # Check the invocation arguments - parser = OptionParser("%prog [options]", - description='runs the resourceassignment postgres database listener and sends EventMessages to the lofar bus') - parser.add_option("-b", "--busname", dest="busname", type="string", default=DEFAULT_BUSNAME, help="Name of the bus exchange on the qpid broker, default: %s" % DEFAULT_BUSNAME) - (options, args) = parser.parse_args() - - radbpglistener.main(busname=options.busname) + logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) + main() diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radbpglistener.py b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radbpglistener.py index 7e8d39b5d96e33c0ca945147110d001842a4e3f4..9ab46514d73afc5f13fed049e05109a999114b29 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radbpglistener.py +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radbpglistener.py @@ -28,52 +28,69 @@ import psycopg2.extras from datetime import datetime import time import json +from optparse import OptionParser from lofar.common.postgres import PostgresListener from lofar.messaging import EventMessage, ToBus -from lofar.sas.resourceassignment.database.config import radb_password, DEFAULT_BUSNAME +from lofar.sas.resourceassignment.database.config import DEFAULT_NOTIFICATION_BUSNAME, DEFAULT_NOTIFICATION_PREFIX +from lofar.common import dbcredentials logger = logging.getLogger(__name__) class RADBPGListener(PostgresListener): def __init__(self, - host='10.149.96.6', #mcu005.control.lofar - database='resourceassignment', - username='resourceassignment', - password=radb_password, - busname=DEFAULT_BUSNAME, + busname=DEFAULT_NOTIFICATION_BUSNAME, + notification_prefix=DEFAULT_NOTIFICATION_PREFIX, + dbcreds=None, broker=None): - super(RADBPGListener, self).__init__(host, database, username, password) + super(RADBPGListener, self).__init__(dbcreds.host, dbcreds.database, dbcreds.user, dbcreds.password) + self.notification_prefix = notification_prefix self.event_bus = ToBus(busname, broker=broker) - self.setupPostgresNotifications('resource_allocation', 'task', view_for_row='task_view') - self.subscribe('task_update', self.onTaskUpdated) - self.subscribe('task_insert', self.onTaskInserted) + self.subscribe('task_update_with_task_view', self.onTaskUpdated) + self.subscribe('task_insert_with_task_view', self.onTaskInserted) self.subscribe('task_delete', self.onTaskDeleted) - self.setupPostgresNotifications('resource_allocation', 'resource_claim', view_for_row='resource_claim_view') - self.subscribe('resource_claim_update', self.onResourceClaimUpdated) - self.subscribe('resource_claim_insert', self.onResourceClaimInserted) + # when the specification starttime and endtime are updated, then that effects the task as well + # so subscribe to specification_update, and use task_view as view_for_row + self.subscribe('specification_update_with_task_view', self.onSpecificationUpdated) + + self.subscribe('resource_claim_update_with_resource_claim_view', self.onResourceClaimUpdated) + self.subscribe('resource_claim_insert_with_resource_claim_view', self.onResourceClaimInserted) self.subscribe('resource_claim_delete', self.onResourceClaimDeleted) + self.subscribe('resource_availability_update', self.onResourceAvailabilityUpdated) + self.subscribe('resource_capacity_update', self.onResourceCapacityUpdated) + def onTaskUpdated(self, payload = None): - self._sendNotification('RADB.TaskUpdated', payload, ['starttime', 'endtime']) + self._sendNotification('TaskUpdated', payload, ['starttime', 'endtime']) def onTaskInserted(self, payload = None): - self._sendNotification('RADB.TaskInserted', payload, ['starttime', 'endtime']) + self._sendNotification('TaskInserted', payload, ['starttime', 'endtime']) def onTaskDeleted(self, payload = None): - self._sendNotification('RADB.TaskDeleted', payload) + self._sendNotification('TaskDeleted', payload) + + def onSpecificationUpdated(self, payload = None): + # when the specification starttime and endtime are updated, then that effects the task as well + # so send a TaskUpdated notification + self._sendNotification('TaskUpdated', payload, ['starttime', 'endtime']) def onResourceClaimUpdated(self, payload = None): - self._sendNotification('RADB.ResourceClaimUpdated', payload, ['starttime', 'endtime']) + self._sendNotification('ResourceClaimUpdated', payload, ['starttime', 'endtime']) def onResourceClaimInserted(self, payload = None): - self._sendNotification('RADB.ResourceClaimInserted', payload, ['starttime', 'endtime']) + self._sendNotification('ResourceClaimInserted', payload, ['starttime', 'endtime']) def onResourceClaimDeleted(self, payload = None): - self._sendNotification('RADB.ResourceClaimDeleted', payload) + self._sendNotification('ResourceClaimDeleted', payload) + + def onResourceAvailabilityUpdated(self, payload = None): + self._sendNotification('ResourceAvailabilityUpdated', payload) + + def onResourceCapacityUpdated(self, payload = None): + self._sendNotification('ResourceCapacityUpdated', payload) def __enter__(self): super(RADBPGListener, self).__enter__() @@ -92,17 +109,21 @@ class RADBPGListener(PostgresListener): So, parse the requested fields, and return them as datetime. ''' try: - for field in fields: - try: - timestampStr = contentDict[field] - if timestampStr.rfind('.') > -1: - timestamp = datetime.strptime(timestampStr, '%Y-%m-%d %H:%M:%S.%f') - else: - timestamp = datetime.strptime(timestampStr, '%Y-%m-%d %H:%M:%S') - - contentDict[field] = timestamp - except Exception as e: - logger.error('Could not convert field \'%s\' to datetime: %s' % (field, e)) + for state in ('old', 'new'): + if state in contentDict: + for field in fields: + try: + if contentDict[state] and field in contentDict[state]: + timestampStr = contentDict[state][field] + formatStr = '%Y-%m-%dT%H:%M:%S' if 'T' in timestampStr else '%Y-%m-%d %H:%M:%S' + if timestampStr.rfind('.') > -1: + formatStr += '.%f' + + timestamp = datetime.strptime(timestampStr, formatStr) + + contentDict[state][field] = timestamp + except Exception as e: + logger.error('Could not convert field \'%s\' to datetime: %s' % (field, e)) return contentDict except Exception as e: @@ -112,6 +133,19 @@ class RADBPGListener(PostgresListener): def _sendNotification(self, subject, payload, timestampFields = None): try: content = json.loads(payload) + + if 'new' in content and content['new'] and 'old' in content and content['old']: + # check if new and old are equal. + # however, new and old can be based on different views, + # so, only check the values for the keys they have in common + new_keys = set(content['new'].keys()) + old_keys = set(content['old'].keys()) + common_keys = new_keys & old_keys + equal_valued_keys = [k for k in common_keys if content['new'][k] == content['old'][k]] + if len(equal_valued_keys) == len(common_keys): + logger.info('new and old values are equal, not sending notification. %s' % (content['new'])) + return + if timestampFields: content = self._formatTimestampsAsIso(timestampFields, content) except Exception as e: @@ -119,20 +153,35 @@ class RADBPGListener(PostgresListener): content=None try: - msg = EventMessage(context=subject, content=content) - logger.info('Sending notification: ' + str(msg).replace('\n', ' ')) + msg = EventMessage(context=self.notification_prefix + subject, content=content) + logger.info('Sending notification %s: %s' % (subject, str(content).replace('\n', ' '))) self.event_bus.send(msg) except Exception as e: logger.error(str(e)) -def main(busname=DEFAULT_BUSNAME): - with RADBPGListener(busname=busname, password=radb_password) as listener: - listener.waitWhileListening() +def main(): + # Check the invocation arguments + parser = OptionParser("%prog [options]", + description='runs the radb postgres listener which listens to changes on some tables in the radb and publishes the changes as notifications on the bus.') + parser.add_option('-q', '--broker', dest='broker', type='string', default=None, help='Address of the qpid broker, default: localhost') + parser.add_option("-b", "--busname", dest="busname", type="string", default=DEFAULT_NOTIFICATION_BUSNAME, help="Name of the publication bus on the qpid broker, [default: %default]") + parser.add_option("-n", "--notification_prefix", dest="notification_prefix", type="string", default=DEFAULT_NOTIFICATION_PREFIX, help="The prefix for all notifications of this publisher, [default: %default]") + parser.add_option_group(dbcredentials.options_group(parser)) + parser.set_defaults(dbcredentials="RADB") + (options, args) = parser.parse_args() -if __name__ == '__main__': logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) - main(busname=DEFAULT_BUSNAME) + dbcreds = dbcredentials.parse_options(options) + logger.info("Using dbcreds: %s" % dbcreds.stringWithHiddenPassword()) + with RADBPGListener(busname=options.busname, + notification_prefix=options.notification_prefix, + dbcreds=dbcreds, + broker=options.broker) as listener: + listener.waitWhileListening() + +if __name__ == '__main__': + main() diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/CMakeLists.txt b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..b06106cd6da76a87a033d71df6658e4c0c434cc6 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/CMakeLists.txt @@ -0,0 +1,11 @@ +# $Id: CMakeLists.txt 32341 2015-08-28 11:59:26Z schaap $ + +set(sql_files add_notifications.sql + add_triggers.sql + add_resource_allocation_statics.sql + add_virtual_instrument.sql + create_database.sql + create_and_populate_database.sql) + +install_files(/share/radb/sql FILES ${sql_files}) + diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_notifications.sql b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_notifications.sql index ba72605e67e61bebe468d12833f175dd44755684..afc072544f1f1edb1f6f9221a1d49afdcbb5f9f6 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_notifications.sql +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_notifications.sql @@ -1,4 +1,10 @@ ---this file was generated by make_radb_postgres_notification_queries() in python module lofar.sas.resourceassignment.database.radbpglistener +--this file was generated by create_add_notifications.sql.py +--it creates triggers and functions which fire postgres notify events upon the given table actions +--these notify events can be listened to implenting a subclass of the PostgresListener in the lofar.common.postgres python module +--for the radb such a subclass has been made, which listens specifically to the notifications defined below +--RADBPGListener in module lofar.sas.resourceassignment.database.radbpglistener +--this RADBPGListener then broadcasts the event on the lofar bus. + DROP TRIGGER IF EXISTS TRIGGER_NOTIFY_NOTIFY_task_INSERT_with_task_view ON resource_allocation.task CASCADE; DROP FUNCTION IF EXISTS resource_allocation.NOTIFY_task_INSERT_with_task_view(); @@ -153,3 +159,44 @@ CREATE TRIGGER TRIGGER_NOTIFY_NOTIFY_resource_claim_DELETE AFTER DELETE ON resource_allocation.resource_claim FOR EACH ROW EXECUTE PROCEDURE resource_allocation.NOTIFY_resource_claim_DELETE(); + + +DROP TRIGGER IF EXISTS TRIGGER_NOTIFY_NOTIFY_resource_availability_UPDATE ON resource_monitoring.resource_availability CASCADE; +DROP FUNCTION IF EXISTS resource_monitoring.NOTIFY_resource_availability_UPDATE(); + + +CREATE OR REPLACE FUNCTION resource_monitoring.NOTIFY_resource_availability_UPDATE() +RETURNS TRIGGER AS $$ +BEGIN +PERFORM pg_notify(CAST('resource_availability_update' AS text), +'{"old":' || row_to_json(OLD)::text || ',"new":' || row_to_json(NEW)::text || '}'); +RETURN NEW; +END; +$$ LANGUAGE plpgsql; + + +CREATE TRIGGER TRIGGER_NOTIFY_NOTIFY_resource_availability_UPDATE +AFTER UPDATE ON resource_monitoring.resource_availability +FOR EACH ROW +EXECUTE PROCEDURE resource_monitoring.NOTIFY_resource_availability_UPDATE(); + + +DROP TRIGGER IF EXISTS TRIGGER_NOTIFY_NOTIFY_resource_capacity_UPDATE ON resource_monitoring.resource_capacity CASCADE; +DROP FUNCTION IF EXISTS resource_monitoring.NOTIFY_resource_capacity_UPDATE(); + + +CREATE OR REPLACE FUNCTION resource_monitoring.NOTIFY_resource_capacity_UPDATE() +RETURNS TRIGGER AS $$ +BEGIN +PERFORM pg_notify(CAST('resource_capacity_update' AS text), +'{"old":' || row_to_json(OLD)::text || ',"new":' || row_to_json(NEW)::text || '}'); +RETURN NEW; +END; +$$ LANGUAGE plpgsql; + + +CREATE TRIGGER TRIGGER_NOTIFY_NOTIFY_resource_capacity_UPDATE +AFTER UPDATE ON resource_monitoring.resource_capacity +FOR EACH ROW +EXECUTE PROCEDURE resource_monitoring.NOTIFY_resource_capacity_UPDATE(); + diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_resource_allocation_statics.sql b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_resource_allocation_statics.sql index d9f9024cc967fe690220fbdd980a36e1fdfb04a3..4717ae0102844187eb069ff0000155a397c87008 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_resource_allocation_statics.sql +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_resource_allocation_statics.sql @@ -7,6 +7,16 @@ INSERT INTO resource_allocation.task_status VALUES (200, 'prepared'), (300, 'app (1150, 'error'), (1200, 'obsolete'); -- This is the list from OTDB, we'll need to merge it with the list from MoM in the future, might use different indexes? INSERT INTO resource_allocation.task_type VALUES (0, 'observation'),(1, 'pipeline'); -- We'll need more types INSERT INTO resource_allocation.resource_claim_status VALUES (0, 'claimed'), (1, 'allocated'), (2, 'conflict'); -INSERT INTO resource_allocation.resource_claim_property_type VALUES (0, 'nr_of_IS_files'),(1, 'nr_of_CS_files'),(2, 'nr_of_UV_files'),(3, 'nr_of_IM_files'),(4, 'nr_of_cores'),(5, 'nr_of_beamlets'),(6, 'nr_of_bits'); +INSERT INTO resource_allocation.resource_claim_property_type VALUES (0, 'nr_of_is_files'),(1, 'nr_of_cs_files'),(2, 'nr_of_uv_files'),(3, 'nr_of_im_files'),(4, 'nr_of_img_files'),(5, 'nr_of_pulp_files'),(6, 'nr_of_cs_stokes'),(7, 'nr_of_is_stokes'),(8, 'is_file_size'),(9, 'cs_file_size'),(10, 'uv_file_size'),(11, 'im_file_size'),(12, 'img_file_size'),(13, 'nr_of_pulp_files'),(14, 'nr_of_tabs'); INSERT INTO resource_allocation.config VALUES (0, 'max_fill_percentage_cep4', '85.00'), (1, 'claim_timeout', '172800'); -- Just some values 172800 is two days in seconds +INSERT INTO resource_allocation.conflict_reason +VALUES +(1, 'Not enough total free storage space'), +(2, 'Storage node inactive'), +(3, 'Number of storage nodes available less than minimum required'), +(4, 'No suitable storage options found'), +(5, 'No storage nodes available'), +(6, 'Not enough available storage nodes for required bandwidth'), +(7, 'Network bandwidth to storage node too high'), +(8, 'Bandwidth required for single file too high'); COMMIT; diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_triggers.sql b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_triggers.sql new file mode 100644 index 0000000000000000000000000000000000000000..d8df06ab62377c8ca80c3a282eb08a0f5a7e6b89 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/add_triggers.sql @@ -0,0 +1,145 @@ +--add triggers and trigger functions to radb (note, there are also the notification triggers in the add_notifications.sql file) + +DROP TRIGGER IF EXISTS trigger_delete_resource_claims_for_approved_task ON resource_allocation.task CASCADE; +DROP FUNCTION IF EXISTS resource_allocation.delete_resource_claims_for_approved_task(); + +CREATE OR REPLACE FUNCTION resource_allocation.delete_resource_claims_for_approved_task() + RETURNS trigger AS +$BODY$ +BEGIN + IF NEW.status_id <> OLD.status_id AND NEW.status_id = 300 THEN + DELETE FROM resource_allocation.resource_claim rc WHERE rc.task_id = NEW.id; + END IF; +RETURN NEW; +END; +$BODY$ + LANGUAGE plpgsql VOLATILE + COST 100; +ALTER FUNCTION resource_allocation.delete_resource_claims_for_approved_task() + OWNER TO resourceassignment; +COMMENT ON FUNCTION resource_allocation.delete_resource_claims_for_approved_task() + IS 'function which is called by task table update trigger, which deletes all the tasks resource claims.'; + +CREATE TRIGGER trigger_delete_resource_claims_for_approved_task + AFTER UPDATE + ON resource_allocation.task + FOR EACH ROW + EXECUTE PROCEDURE resource_allocation.delete_resource_claims_for_approved_task(); +COMMENT ON TRIGGER trigger_delete_resource_claims_for_approved_task ON resource_allocation.task + IS 'task table update trigger, calls the resource_allocation.delete_resource_claims_for_approved_task() function.'; + +--------------------------------------------------------------------------------------------------------------------- + +DROP TRIGGER IF EXISTS trigger_delete_conflict_reasons_after_resource_claim_update ON resource_allocation.resource_claim CASCADE; +DROP FUNCTION IF EXISTS resource_allocation.delete_conflict_reasons_after_resource_claim_update(); + +CREATE OR REPLACE FUNCTION resource_allocation.delete_conflict_reasons_after_resource_claim_update() + RETURNS trigger AS +$BODY$ +BEGIN + IF OLD.status_id = 2 AND NEW.status_id <> 2 THEN --new status is not conflict + DELETE FROM resource_allocation.resource_claim_conflict_reason rccr WHERE rccr.resource_claim_id = NEW.id; + END IF; +RETURN NEW; +END; +$BODY$ + LANGUAGE plpgsql VOLATILE + COST 100; +ALTER FUNCTION resource_allocation.delete_conflict_reasons_after_resource_claim_update() + OWNER TO resourceassignment; +COMMENT ON FUNCTION resource_allocation.delete_conflict_reasons_after_resource_claim_update() + IS 'function which is called by resource_claim table update trigger, which deletes resource_claim_conflict_reasons when the claim status is updated to !conflict.'; + +CREATE TRIGGER trigger_delete_conflict_reasons_after_resource_claim_update + AFTER UPDATE + ON resource_allocation.resource_claim + FOR EACH ROW + EXECUTE PROCEDURE resource_allocation.delete_conflict_reasons_after_resource_claim_update(); + +--------------------------------------------------------------------------------------------------------------------- + +DROP TRIGGER IF EXISTS trigger_before_insert_conflict_reason_do_resource_claim_status_check ON resource_allocation.resource_claim_conflict_reason CASCADE; +DROP FUNCTION IF EXISTS resource_allocation.before_insert_conflict_reason_do_resource_claim_status_check(); + +CREATE OR REPLACE FUNCTION resource_allocation.before_insert_conflict_reason_do_resource_claim_status_check() + RETURNS trigger AS +$BODY$ +BEGIN + -- check if referred resource_claim is in conflict status, else raise + IF (SELECT COUNT(id) FROM resource_allocation.resource_claim rc WHERE rc.id = NEW.resource_claim_id AND rc.status_id = 2) = 0 THEN + RAISE EXCEPTION 'resource_claim has no conflict status'; + END IF; +RETURN NEW; +END; +$BODY$ + LANGUAGE plpgsql VOLATILE + COST 100; +ALTER FUNCTION resource_allocation.before_insert_conflict_reason_do_resource_claim_status_check() + OWNER TO resourceassignment; +COMMENT ON FUNCTION resource_allocation.before_insert_conflict_reason_do_resource_claim_status_check() + IS 'check if referred resource_claim is in conflict status, else raise'; + +CREATE TRIGGER trigger_before_insert_conflict_reason_do_resource_claim_status_check + BEFORE INSERT + ON resource_allocation.resource_claim_conflict_reason + FOR EACH ROW + EXECUTE PROCEDURE resource_allocation.before_insert_conflict_reason_do_resource_claim_status_check(); + +--------------------------------------------------------------------------------------------------------------------- + +DROP TRIGGER IF EXISTS trigger_delete_conflict_reasons_after_task_update ON resource_allocation.task CASCADE; +DROP FUNCTION IF EXISTS resource_allocation.delete_conflict_reasons_after_task_update(); + +CREATE OR REPLACE FUNCTION resource_allocation.delete_conflict_reasons_after_task_update() + RETURNS trigger AS +$BODY$ +BEGIN + IF OLD.status_id = 335 AND NEW.status_id <> 335 THEN --new status is not conflict + DELETE FROM resource_allocation.task_conflict_reason tcr WHERE tcr.task_id = NEW.id; + END IF; +RETURN NEW; +END; +$BODY$ + LANGUAGE plpgsql VOLATILE + COST 100; +ALTER FUNCTION resource_allocation.delete_conflict_reasons_after_task_update() + OWNER TO resourceassignment; +COMMENT ON FUNCTION resource_allocation.delete_conflict_reasons_after_task_update() + IS 'function which is called by task table update trigger, which deletes task_conflict_reasons when the task status is updated to !conflict.'; + +CREATE TRIGGER trigger_delete_conflict_reasons_after_task_update + AFTER UPDATE + ON resource_allocation.task + FOR EACH ROW + EXECUTE PROCEDURE resource_allocation.delete_conflict_reasons_after_task_update(); + +--------------------------------------------------------------------------------------------------------------------- + +DROP TRIGGER IF EXISTS trigger_before_insert_conflict_reason_do_task_status_check ON resource_allocation.task_conflict_reason CASCADE; +DROP FUNCTION IF EXISTS resource_allocation.before_insert_conflict_reason_do_task_status_check(); + +CREATE OR REPLACE FUNCTION resource_allocation.before_insert_conflict_reason_do_task_status_check() + RETURNS trigger AS +$BODY$ +BEGIN + -- check if referred task is in conflict status, else raise + IF (SELECT COUNT(id) FROM resource_allocation.task task WHERE task.id = NEW.task_id AND task.status_id = 335) = 0 THEN + RAISE EXCEPTION 'task has no conflict status'; + END IF; +RETURN NEW; +END; +$BODY$ + LANGUAGE plpgsql VOLATILE + COST 100; +ALTER FUNCTION resource_allocation.before_insert_conflict_reason_do_task_status_check() + OWNER TO resourceassignment; +COMMENT ON FUNCTION resource_allocation.before_insert_conflict_reason_do_task_status_check() + IS 'check if referred task is in conflict status, else raise'; + +CREATE TRIGGER trigger_before_insert_conflict_reason_do_task_status_check + BEFORE INSERT + ON resource_allocation.task_conflict_reason + FOR EACH ROW + EXECUTE PROCEDURE resource_allocation.before_insert_conflict_reason_do_task_status_check(); + +--------------------------------------------------------------------------------------------------------------------- diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_add_notifications.sql.py b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_add_notifications.sql.py new file mode 100755 index 0000000000000000000000000000000000000000..3c5234398c9dda815f1ed213231925041dedb56b --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_add_notifications.sql.py @@ -0,0 +1,51 @@ +#!/usr/bin/python + +# Copyright (C) 2012-2015 ASTRON (Netherlands Institute for Radio Astronomy) +# P.O. Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. + +# $Id: radb.py 33394 2016-01-25 15:53:55Z schaap $ + +''' +TODO: documentation +''' +import logging +import psycopg2 +import psycopg2.extras + +from lofar.common.postgres import makePostgresNotificationQueries + +logger = logging.getLogger(__name__) + +if __name__ == '__main__': + with open('add_notifications.sql', 'wt') as f: + f.write('--this file was generated by create_add_notifications.sql.py\n') + f.write('--it creates triggers and functions which fire postgres notify events upon the given table actions\n') + f.write('--these notify events can be listened to implenting a subclass of the PostgresListener in the lofar.common.postgres python module\n') + f.write('--for the radb such a subclass has been made, which listens specifically to the notifications defined below\n') + f.write('--RADBPGListener in module lofar.sas.resourceassignment.database.radbpglistener\n') + f.write('--this RADBPGListener then broadcasts the event on the lofar bus.\n') + f.write('\n') + + f.writelines(makePostgresNotificationQueries('resource_allocation', 'task', 'INSERT', view_for_row='task_view')) + f.writelines(makePostgresNotificationQueries('resource_allocation', 'task', 'UPDATE', view_for_row='task_view')) + f.writelines(makePostgresNotificationQueries('resource_allocation', 'task', 'DELETE')) + f.writelines(makePostgresNotificationQueries('resource_allocation', 'specification', 'UPDATE', view_for_row='task_view', view_selection_id='specification_id')) + f.writelines(makePostgresNotificationQueries('resource_allocation', 'resource_claim', 'INSERT', view_for_row='resource_claim_view')) + f.writelines(makePostgresNotificationQueries('resource_allocation', 'resource_claim', 'UPDATE', view_for_row='resource_claim_view')) + f.writelines(makePostgresNotificationQueries('resource_allocation', 'resource_claim', 'DELETE')) + f.writelines(makePostgresNotificationQueries('resource_monitoring', 'resource_availability', 'UPDATE')) + f.writelines(makePostgresNotificationQueries('resource_monitoring', 'resource_capacity', 'UPDATE')) diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_add_virtual_instrument.sql.py b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_add_virtual_instrument.sql.py index a7d49b7d03f17b2c20cea31cce79b40fec29bb97..388e1b9d0d89583b1b3feb8987827f91275fad99 100755 --- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_add_virtual_instrument.sql.py +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_add_virtual_instrument.sql.py @@ -134,7 +134,7 @@ with open("add_virtual_instrument.sql", 'w+') as output: for node in cep4numbers + cobaltnumbers: resources += "(%i, 'bandwidth', %i), " % (resource_count, bandwidth_index) resource_to_resource_group += "(DEFAULT, %i, %i), " % (resource_count, node) - resource_capacity += "(DEFAULT, %i, %i, %i), " % (resource_count, 50*1024*1024*1024, 50*1024*1024*1024) ##magic numbers FIXME + resource_capacity += "(DEFAULT, %i, %i, %i), " % (resource_count, 2000000000, 2000000000) ##magic numbers FIXME resource_available += "(DEFAULT, %i, TRUE), " % (resource_count,) resource_count += 1 resources += "(%i, 'processor', %i), " % (resource_count, processor_index) @@ -150,7 +150,7 @@ with open("add_virtual_instrument.sql", 'w+') as output: ## CEP4 bandwidth resources += "(%i, 'cep4bandwidth', %i), " % (resource_count, bandwidth_index) resource_to_resource_group += "(DEFAULT, %i, %i), " % (resource_count, 1) ##magic numbers FIXME - resource_capacity += "(DEFAULT, %i, %i, %i), " % (resource_count, 80*1024*1024*1024, 80*1024*1024*1024) ##magic numbers FIXME + resource_capacity += "(DEFAULT, %i, %i, %i), " % (resource_count, 160000000000, 160000000000) ##magic numbers FIXME resource_available += "(DEFAULT, %i, TRUE), " % (resource_count,) resource_count += 1 ## CEP4 storage diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_and_populate_database.sql b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_and_populate_database.sql new file mode 100644 index 0000000000000000000000000000000000000000..6b11d2f64a5d06dcb360e886611437e8c298b955 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_and_populate_database.sql @@ -0,0 +1,7 @@ +-- master create script to create and populate the radb + +\i create_database.sql +\i add_resource_allocation_statics.sql +\i add_virtual_instrument.sql +\i add_notifications.sql +\i add_triggers.sql diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_database.sql b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_database.sql index 1ee83a39114bfba6a89def9fe3efb42a3261dd29..4fd10e0787527143fb0c2a9a0921dd53d32f055d 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_database.sql +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/sql/create_database.sql @@ -9,20 +9,32 @@ -- CONNECTION LIMIT = -1; -- psql resourceassignment -U resourceassignment -f create_database.sql -W + +BEGIN; + +DROP SCHEMA IF EXISTS virtual_instrument CASCADE; +DROP SCHEMA IF EXISTS resource_monitoring CASCADE; +DROP SCHEMA IF EXISTS resource_allocation CASCADE; + CREATE SCHEMA virtual_instrument; CREATE SCHEMA resource_monitoring; CREATE SCHEMA resource_allocation; -BEGIN; - -- This is insanity, but works, order needs to be the reverse of the CREATE TABLE statements DROP VIEW IF EXISTS virtual_instrument.resource_view CASCADE; DROP VIEW IF EXISTS resource_allocation.task_view CASCADE; DROP VIEW IF EXISTS resource_allocation.resource_claim_view CASCADE; +DROP VIEW IF EXISTS resource_monitoring.resource_view CASCADE; DROP TABLE IF EXISTS resource_allocation.config CASCADE; DROP TABLE IF EXISTS resource_monitoring.resource_group_availability CASCADE; DROP TABLE IF EXISTS resource_monitoring.resource_availability CASCADE; DROP TABLE IF EXISTS resource_monitoring.resource_capacity CASCADE; +DROP TABLE IF EXISTS resource_allocation.resource_claim_property CASCADE; +DROP TABLE IF EXISTS resource_allocation.resource_claim_property_type CASCADE; +DROP TABLE IF EXISTS resource_allocation.sap CASCADE; +DROP TABLE IF EXISTS resource_allocation.conflict_reason CASCADE; +DROP TABLE IF EXISTS resource_allocation.resource_claim_conflict_reason CASCADE; +DROP TABLE IF EXISTS resource_allocation.task_conflict_reason CASCADE; DROP TABLE IF EXISTS resource_allocation.resource_claim CASCADE; DROP TABLE IF EXISTS resource_allocation.resource_claim_status CASCADE; DROP TABLE IF EXISTS resource_allocation.claim_session CASCADE; @@ -159,6 +171,9 @@ CREATE TABLE resource_allocation.claim_session ( ALTER TABLE resource_allocation.claim_session OWNER TO resourceassignment; +--until we use user management, insert one default session_id +INSERT INTO resource_allocation.claim_session(id, username, user_id, starttime, token) VALUES (1, 'anonymous', -1, '2015-04-14', 'foo'); + CREATE TABLE resource_allocation.resource_claim_status ( id serial NOT NULL, name text NOT NULL, @@ -183,6 +198,41 @@ CREATE TABLE resource_allocation.resource_claim ( ALTER TABLE resource_allocation.resource_claim OWNER TO resourceassignment; +CREATE TABLE resource_allocation.conflict_reason ( + id serial NOT NULL, + reason text NOT NULL, + PRIMARY KEY (id) +) WITH (OIDS=FALSE); +ALTER TABLE resource_allocation.conflict_reason + OWNER TO resourceassignment; + +CREATE TABLE resource_allocation.resource_claim_conflict_reason ( + id serial NOT NULL, + resource_claim_id integer NOT NULL REFERENCES resource_allocation.resource_claim ON DELETE CASCADE DEFERRABLE INITIALLY IMMEDIATE, + conflict_reason_id integer NOT NULL REFERENCES resource_allocation.conflict_reason ON DELETE CASCADE DEFERRABLE INITIALLY IMMEDIATE, + PRIMARY KEY (id) +) WITH (OIDS=FALSE); +ALTER TABLE resource_allocation.resource_claim_conflict_reason + OWNER TO resourceassignment; + +CREATE TABLE resource_allocation.task_conflict_reason ( + id serial NOT NULL, + task_id integer NOT NULL REFERENCES resource_allocation.task ON DELETE CASCADE DEFERRABLE INITIALLY IMMEDIATE, + conflict_reason_id integer NOT NULL REFERENCES resource_allocation.conflict_reason ON DELETE CASCADE DEFERRABLE INITIALLY IMMEDIATE, + PRIMARY KEY (id) +) WITH (OIDS=FALSE); +ALTER TABLE resource_allocation.task_conflict_reason + OWNER TO resourceassignment; + +CREATE TABLE resource_allocation.sap ( + id serial NOT NULL, + resource_claim_id integer NOT NULL REFERENCES resource_allocation.resource_claim ON DELETE CASCADE DEFERRABLE INITIALLY IMMEDIATE, + number int NOT NULL, + PRIMARY KEY (id) +) WITH (OIDS=FALSE); +ALTER TABLE resource_allocation.sap + OWNER TO resourceassignment; + CREATE TABLE resource_allocation.resource_claim_property_type ( id serial NOT NULL, name text NOT NULL, @@ -194,8 +244,9 @@ ALTER TABLE resource_allocation.resource_claim_property_type CREATE TABLE resource_allocation.resource_claim_property ( id serial NOT NULL, resource_claim_id integer NOT NULL REFERENCES resource_allocation.resource_claim ON DELETE CASCADE DEFERRABLE INITIALLY IMMEDIATE, + sap_id integer REFERENCES resource_allocation.sap ON DELETE CASCADE DEFERRABLE INITIALLY IMMEDIATE, type_id integer NOT NULL REFERENCES resource_allocation.resource_claim_property_type DEFERRABLE INITIALLY IMMEDIATE, - value int NOT NULL DEFAULT 1, + value bigint NOT NULL DEFAULT 1, PRIMARY KEY (id) ) WITH (OIDS=FALSE); ALTER TABLE resource_allocation.resource_claim_property @@ -249,7 +300,7 @@ CREATE OR REPLACE VIEW resource_allocation.task_view AS JOIN resource_allocation.task_status ts ON ts.id = t.status_id JOIN resource_allocation.task_type tt ON tt.id = t.type_id JOIN resource_allocation.specification s ON s.id = t.specification_id; -ALTER TABLE resource_allocation.task_view +ALTER VIEW resource_allocation.task_view OWNER TO resourceassignment; COMMENT ON VIEW resource_allocation.task_view IS 'plain view on task table including task_status.name task_type.name specification.starttime and specification.endtime and the task predecessor- and successor ids'; @@ -261,43 +312,78 @@ CREATE OR REPLACE VIEW resource_allocation.resource_claim_view AS rcs.name AS status FROM resource_allocation.resource_claim rc JOIN resource_allocation.resource_claim_status rcs ON rcs.id = rc.status_id; -ALTER TABLE resource_allocation.resource_claim_view +ALTER VIEW resource_allocation.resource_claim_view OWNER TO resourceassignment; COMMENT ON VIEW resource_allocation.resource_claim_view IS 'plain view on resource_claim table, including resource_claim_status.name'; CREATE OR REPLACE VIEW virtual_instrument.resource_view AS - SELECT r.id, r.name, r.type_id, rt.name as type_name - FROM virtual_instrument.resource r - JOIN virtual_instrument.resource_type rt ON rt.id = r.type_id; -ALTER TABLE virtual_instrument.resource_view + SELECT r.id, + r.name, + r.type_id, + rt.name AS type_name, + u.id as unit_id, + u.units as unit + FROM virtual_instrument.resource r + JOIN virtual_instrument.resource_type rt ON rt.id = r.type_id + JOIN virtual_instrument.unit u ON rt.unit_id = u.id; +ALTER VIEW virtual_instrument.resource_view OWNER TO resourceassignment; COMMENT ON VIEW virtual_instrument.resource_view - IS 'plain view on resource table including task_type.name'; + IS 'plain view on resource table including task_type.name and units'; CREATE OR REPLACE VIEW resource_allocation.resource_claim_extended_view AS - SELECT rcv.*, rv.name as resource_name, rv.type_id as resource_type_id, rv.name as resource_type_name + SELECT rcv.*, rv.name as resource_name, rv.type_id as resource_type_id, rv.type_name as resource_type_name FROM resource_allocation.resource_claim_view rcv JOIN virtual_instrument.resource_view rv ON rcv.resource_id = rv.id; -ALTER TABLE resource_allocation.resource_claim_extended_view +ALTER VIEW resource_allocation.resource_claim_extended_view OWNER TO resourceassignment; COMMENT ON VIEW resource_allocation.resource_claim_extended_view IS 'extended view on resource_claim table, including resource_claim_status.name and the resource itself'; - CREATE OR REPLACE VIEW resource_allocation.resource_claim_property_view AS - SELECT rcv.*, rcp.type_id as property_type_id, rcpt.name as property_type, rcp.value as property_value - FROM resource_allocation.resource_claim_view rcv - JOIN resource_allocation.resource_claim_property rcp ON rcv.id = rcp.resource_claim_id + SELECT rcp.id, rcp.resource_claim_id, rcp.value, rcp.type_id, + rcpt.name AS type_name, rcp.sap_id + FROM resource_allocation.resource_claim_property rcp JOIN resource_allocation.resource_claim_property_type rcpt ON rcpt.id = rcp.type_id; -ALTER TABLE resource_allocation.resource_claim_property_view +ALTER VIEW resource_allocation.resource_claim_property_view OWNER TO resourceassignment; COMMENT ON VIEW resource_allocation.resource_claim_property_view - IS 'view including resource_claim_properties on resource_claim table for resource_claims with on or more properties'; - - - + IS 'plain view on resource_claim_property table, including resource_claim_property_type.name'; + +CREATE OR REPLACE VIEW resource_monitoring.resource_view AS + SELECT rv.*, + rc.available AS available_capacity, + rc.total - rc.available AS used_capacity, + rc.total AS total_capacity, + ra.available AS active + FROM virtual_instrument.resource_view rv + LEFT JOIN resource_monitoring.resource_capacity rc ON rc.resource_id = rv.id + LEFT JOIN resource_monitoring.resource_availability ra ON ra.resource_id = rv.id; +ALTER VIEW resource_monitoring.resource_view + OWNER TO resourceassignment; +COMMENT ON VIEW resource_monitoring.resource_view + IS 'view on virtual_instrument.resource_view including availability and capacity'; + +CREATE OR REPLACE VIEW resource_allocation.resource_claim_conflict_reason_view AS + SELECT rccr.id, rccr.resource_claim_id, rccr.conflict_reason_id, rc.resource_id, rc.task_id, cr.reason + FROM resource_allocation.resource_claim_conflict_reason rccr + JOIN resource_allocation.conflict_reason cr on cr.id = rccr.conflict_reason_id + JOIN resource_allocation.resource_claim rc on rc.id = rccr.resource_claim_id; +ALTER VIEW resource_allocation.resource_claim_conflict_reason_view + OWNER TO resourceassignment; +COMMENT ON VIEW resource_allocation.resource_claim_conflict_reason_view + IS 'plain view on resource_claim_conflict_reason table including conflict_reason.reason'; + +CREATE OR REPLACE VIEW resource_allocation.task_conflict_reason_view AS + SELECT rccr.id, rccr.task_id, rccr.conflict_reason_id, cr.reason + FROM resource_allocation.task_conflict_reason rccr + JOIN resource_allocation.conflict_reason cr on cr.id = rccr.conflict_reason_id; +ALTER VIEW resource_allocation.task_conflict_reason_view + OWNER TO resourceassignment; +COMMENT ON VIEW resource_allocation.task_conflict_reason_view + IS 'plain view on task_conflict_reason table including conflict_reason.reason'; COMMIT; diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/bin/raewebservice.ini b/SAS/ResourceAssignment/ResourceAssignmentEditor/bin/raewebservice.ini index ad9d81cf8a362f06ee5043ceeb46edf836d338b7..80069bd27deac0a838c861ee9f24542361625013 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/bin/raewebservice.ini +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/bin/raewebservice.ini @@ -1,5 +1,5 @@ [program:raewebservice] -command=/bin/bash -c 'source $LOFARROOT/lofarinit.sh;raewebservice -p 5000' +command=/bin/bash -c 'source $LOFARROOT/lofarinit.sh;raewebservice -p 7412' user=lofarsys stopsignal=INT ; KeyboardInterrupt stopasgroup=true ; bash does not propagate signals diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/CMakeLists.txt b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/CMakeLists.txt index 45ed2dc8a3c8a2e26a1f84afdb55a6d72208f57b..0e9c1f37a64c202c611ebd336fe2ba9e102dadf2 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/CMakeLists.txt +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/CMakeLists.txt @@ -6,6 +6,7 @@ python_install( utils.py radbchangeshandler.py fakedata.py + mom.py DESTINATION lofar/sas/resourceassignment/resourceassignmenteditor) file(GLOB_RECURSE jquery_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} static/js/jquery/*) @@ -16,19 +17,24 @@ file(GLOB_RECURSE angular_resource_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} st file(GLOB_RECURSE angular_ui_grid_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} static/js/angular-ui-grid/*) file(GLOB_RECURSE angular_ui_tree_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} static/js/angular-ui-tree/*) file(GLOB_RECURSE angular_ui_layout_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} static/js/angular-ui-layout/*) +file(GLOB_RECURSE angular_ui_tabs_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} static/js/angular-ui-tabs/*) file(GLOB_RECURSE angular_gantt_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} static/js/angular-gantt/*) file(GLOB_RECURSE angular_moment_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} static/js/angular-moment/*) +file(GLOB_RECURSE jsplumb_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} static/js/jsplumb/*) file(GLOB_RECURSE moment_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} static/js/moment/*) file(GLOB_RECURSE bootstrap_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} static/css/bootstrap.min.css) file(GLOB_RECURSE fonts_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} static/fonts/*) file(GLOB_RECURSE utils_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} static/js/utils/*) +file(GLOB_RECURSE highcharts_files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} static/js/highcharts/*) set(app_files static/favicon.ico static/app/app.js static/app/controllers/datacontroller.js static/app/controllers/gridcontroller.js - static/app/controllers/ganttcontroller.js + static/app/controllers/ganttresourcecontroller.js + static/app/controllers/chartresourceusagecontroller.js + static/app/controllers/ganttprojectcontroller.js static/css/main.css templates/index.html) @@ -41,12 +47,15 @@ set(web_files ${angular_ui_grid_files} ${angular_ui_tree_files} ${angular_ui_layout_files} + ${angular_ui_tabs_files} ${angular_gantt_files} ${angular_moment_files} ${moment_files} + ${jsplumb_files} ${bootstrap_files} ${fonts_files} ${utils_files} + ${highcharts_files} ${app_files}) foreach(web_file ${web_files}) diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/mom.py b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/mom.py new file mode 100644 index 0000000000000000000000000000000000000000..659e1b3e2499681c61f374999c1d3616e07e3087 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/mom.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python + +# mom.py +# +# Copyright (C) 2015 +# ASTRON (Netherlands Institute for Radio Astronomy) +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. +# +# $Id: mom.py 1580 2015-09-30 14:18:57Z loose $ + +""" +TODO: documentation +""" + +import logging + +logger = logging.getLogger(__name__) + +def updateTaskMomDetails(task, momrpc): + '''fill in the task propeties with mom object and project details. + :param task: dictionary or list of dictionaries with the task(s) + :param momrpc: MoM rpc object the query for details''' + def applyDefaults(t): + '''apply sane default values for a task''' + t['name'] = 'Task (sasId: %d)' % t['otdb_id'] + t['project_name'] = '<unknown>' + t['project_mom_id'] = -99 + + tasklist = task if isinstance(task, list) else [task] + + for t in tasklist: + applyDefaults(t) + + if not momrpc: + return + + try: + momIds = ','.join([str(t['mom_id']) for t in tasklist]) + logger.info('momrpc.getProjectDetails(momIds)') + details = momrpc.getProjectDetails(momIds) + logger.info('details=' + str(details)) + + for t in tasklist: + mom_id = str(t['mom_id']) + if mom_id in details: + m = details[mom_id] + t['name'] = m['object_name'] + t['project_name'] = m['project_name'] + t['project_mom_id'] = m['project_mom2id'] + t['project_mom2object_id'] = m['project_mom2objectid'] + t['mom2object_id'] = m['object_mom2objectid'] + t['mom_object_group_id'] = m['object_group_id'] + else: + t['project_name'] = 'OTDB Only' + t['project_mom_id'] = -98 + except Exception as e: + logger.error(str(e)) + diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/radbchangeshandler.py b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/radbchangeshandler.py index 4d8bca9fb6dd1fedae63b0de59ca2e05de7bc355..a03b616714988c5f739846e1290ecff208543b01 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/radbchangeshandler.py +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/radbchangeshandler.py @@ -27,9 +27,13 @@ RADBChangesHandler listens on the lofar notification message bus and calls (empt Typical usage is to derive your own subclass from RADBChangesHandler and implement the specific on<SomeMessage> methods that you are interested in. """ -from lofar.sas.resourceassignment.database.config import DEFAULT_BUSNAME -from lofar.sas.resourceassignment.resourceassignmentservice.radbbuslistener import RADBBusListener +from lofar.sas.resourceassignment.database.config import DEFAULT_NOTIFICATION_BUSNAME, DEFAULT_NOTIFICATION_SUBJECTS +from lofar.sas.resourceassignment.database.radbbuslistener import RADBBusListener from lofar.common.util import waitForInterrupt +from lofar.mom.momqueryservice.momqueryrpc import MoMRPC +from lofar.mom.momqueryservice.config import DEFAULT_BUSNAME as DEFAULT_MOM_BUSNAME +from lofar.mom.momqueryservice.config import DEFAULT_SERVICENAME as DEFAULT_MOM_SERVICENAME +from lofar.sas.resourceassignment.resourceassignmenteditor.mom import updateTaskMomDetails import qpid.messaging import logging @@ -43,10 +47,9 @@ CHANGE_INSERT_TYPE = 'insert' CHANGE_DELETE_TYPE = 'delete' class RADBChangesHandler(RADBBusListener): - def __init__(self, busname=DEFAULT_BUSNAME, subject='RADB.*', broker=None, **kwargs): + def __init__(self, busname=DEFAULT_NOTIFICATION_BUSNAME, subjects=DEFAULT_NOTIFICATION_SUBJECTS, broker=None, momrpc=None, **kwargs): """ RADBChangesHandler listens on the lofar notification message bus and keeps track of all the change notifications. - :param busname: valid Qpid address (default: lofar.ra.notification) :param broker: valid Qpid broker host (default: None, which means localhost) additional parameters in kwargs: options= <dict> Dictionary of options passed to QPID @@ -54,13 +57,13 @@ class RADBChangesHandler(RADBBusListener): numthreads= <int> Number of parallel threads processing messages (default: 1) verbose= <bool> Output extra logging over stdout (default: False) """ - address = "%s/%s" % (busname, subject) - super(RADBChangesHandler, self).__init__(busname=busname, subject=subject, broker=broker, **kwargs) + super(RADBChangesHandler, self).__init__(busname=busname, subjects=subjects, broker=broker, **kwargs) self._changes = [] self._lock = Lock() self._changedCondition = Condition() self._changeNumber = 0L + self._momrpc = momrpc def _handleChange(self, change): '''_handleChange appends a change in the changes list and calls the onChangedCallback. @@ -76,12 +79,12 @@ class RADBChangesHandler(RADBBusListener): with self._changedCondition: self._changedCondition.notifyAll() - def onTaskUpdated(self, task): + def onTaskUpdated(self, old_task, new_task): '''onTaskUpdated is called upon receiving a TaskUpdated message. :param task: dictionary with the updated task''' - task['starttime'] = task['starttime'].datetime() - task['endtime'] = task['endtime'].datetime() - task_change = {'changeType':CHANGE_UPDATE_TYPE, 'objectType':'task', 'value':task} + new_task['starttime'] = new_task['starttime'].datetime() + new_task['endtime'] = new_task['endtime'].datetime() + task_change = {'changeType':CHANGE_UPDATE_TYPE, 'objectType':'task', 'value':new_task} self._handleChange(task_change) def onTaskInserted(self, task): @@ -89,6 +92,7 @@ class RADBChangesHandler(RADBBusListener): :param task: dictionary with the inserted task''' task['starttime'] = task['starttime'].datetime() task['endtime'] = task['endtime'].datetime() + updateTaskMomDetails(task, self._momrpc) task_change = {'changeType':CHANGE_INSERT_TYPE, 'objectType':'task', 'value':task} self._handleChange(task_change) @@ -98,12 +102,12 @@ class RADBChangesHandler(RADBBusListener): task_change = {'changeType':CHANGE_DELETE_TYPE, 'objectType':'task', 'value':task} self._handleChange(task_change) - def onResourceClaimUpdated(self, claim): + def onResourceClaimUpdated(self, old_claim, new_claim): '''onResourceClaimUpdated is called upon receiving a ResourceClaimUpdated message. :param task: dictionary with the updated claim''' - claim['starttime'] = claim['starttime'].datetime() - claim['endtime'] = claim['endtime'].datetime() - claim_change = {'changeType':CHANGE_UPDATE_TYPE, 'objectType':'resourceClaim', 'value':claim} + new_claim['starttime'] = new_claim['starttime'].datetime() + new_claim['endtime'] = new_claim['endtime'].datetime() + claim_change = {'changeType':CHANGE_UPDATE_TYPE, 'objectType':'resourceClaim', 'value':new_claim} self._handleChange(claim_change) def onResourceClaimInserted(self, claim): @@ -120,10 +124,24 @@ class RADBChangesHandler(RADBBusListener): claim_change = {'changeType':CHANGE_DELETE_TYPE, 'objectType':'resourceClaim', 'value':claim} self._handleChange(claim_change) + def onResourceAvailabilityUpdated(self, old_availability, new_availability): + claim_change = {'changeType':CHANGE_UPDATE_TYPE, 'objectType':'resourceAvailability', 'value':new_availability} + self._handleChange(claim_change) + + def onResourceCapacityUpdated(self, old_capacity, new_capacity): + claim_change = {'changeType':CHANGE_UPDATE_TYPE, 'objectType':'resourceCapacity', 'value':new_capacity} + self._handleChange(claim_change) + + def getMostRecentChangeNumber(self): + with self._lock: + if self._changes: + return self._changes[-1]['changeNumber'] + return -1L + def clearChangesBefore(self, timestamp): if isinstance(timestamp, datetime): timestamp = timestamp.isoformat() - + with self._lock: self._changes = [x for x in self._changes if x['timestamp'] >= timestamp] diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/app.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/app.js index 31df09532c8f55417e91ffafa1772e8d2d8dabcf..9785d678969becaab8aeee1de0db47488562ec52 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/app.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/app.js @@ -2,11 +2,14 @@ var app = angular.module('raeApp', ['DataControllerMod', - 'GanttControllerMod', + 'GanttResourceControllerMod', + 'GanttProjectControllerMod', + 'ChartResourceUsageControllerMod', 'GridControllerMod', 'ui.layout', - 'ui.bootstrap.datetimepicker' - ]); + 'ui.bootstrap.datetimepicker', + 'ui.bootstrap.tabs', + 'highcharts-ng']); app.config(['$compileProvider', function ($compileProvider) { $compileProvider.debugInfoEnabled(false); diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/chartresourceusagecontroller.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/chartresourceusagecontroller.js new file mode 100644 index 0000000000000000000000000000000000000000..86e70e4398b5bb3cb4cebb3dba3bc5b53d141adc --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/chartresourceusagecontroller.js @@ -0,0 +1,225 @@ +// $Id:$ + +var chartResourceUsageControllerMod = angular.module('ChartResourceUsageControllerMod', []).config(['$compileProvider', function($compileProvider) { + $compileProvider.debugInfoEnabled(false); // Remove debug info (angularJS >= 1.3) +}]); + +chartResourceUsageControllerMod.controller('ChartResourceUsageController', ['$scope', 'dataService', function($scope, dataService) { + + Highcharts.setOptions({ + global: { + useUTC: false + } + }); + + var self = this; + $scope.dataService = dataService; + + $scope.chartSeries = []; + + $scope.chartConfig = { + options: { + chart: { + type: 'area', + animation: { + duration: 200 + } + }, + plotOptions: { + line: { + stacking: '', + lineWidth: 0, + marker:{enabled:false} + }, + area: { + stacking: 'normal', + lineWidth: 1, + marker: { + symbol: 'diamond' + } + }, + } + }, + xAxis: { + type: 'datetime', + }, + yAxis: { + title: { text: '<unknown>' }, + }, + series: $scope.chartSeries, + title: { + text: 'Resource usage' + }, + credits: { + enabled: false + }, + loading: false + } + + function updateChartLofarTime() { + var lofarTime = $scope.dataService.lofarTime; + + $scope.chartConfig.xAxis.plotLines = [{ + width: 3, + color: '#222222', + zIndex: 100, + value: lofarTime.getTime() + }]; + }; + + $scope.$watch('dataService.lofarTime', updateChartLofarTime); + + function updateChartData() { + var selected_resource_id = $scope.dataService.selected_resource_id; + if(selected_resource_id === undefined) + return; + + var resourceDict = $scope.dataService.resourceDict; + var resourceUsagesDict = $scope.dataService.resourceUsagesDict; + var numResources = $scope.dataService.resources.length; + + if(numResources == 0) { + $scope.chartSeries.splice(0, $scope.chartSeries.length); + $scope.chartConfig.title.text = "No resource available"; + return; + } + + var resource = resourceDict[selected_resource_id]; + + if(!resource || numResources == 0 || !resourceUsagesDict[selected_resource_id]) { + $scope.chartSeries.splice(0, $scope.chartSeries.length); + $scope.chartConfig.title.text = "No resource (usages) available"; + return; + } + + //set title, axis etc + $scope.chartConfig.title.text = resource.name; + $scope.chartConfig.yAxis.title.text = resource.units; + + var status_usages = resourceUsagesDict[selected_resource_id].usages; + + //first scan of all statuses and timestamps in usages for this resource + var statuses = []; + var timestamps = []; + for(var status in status_usages) { + statuses.push(status); + + var usages = status_usages[status]; + for(var usage of usages) { + timestamps.push(usage.timestamp); + } + } + + // the processed statuses are the expected series names, make copy + var expectedSeriesNames = statuses.slice(0); + + if(timestamps.length > 0) { + // make timestamps unique + timestamps = timestamps.filter(function(value, index, arr) { return arr.indexOf(value) == index;}) + + //and sort them + timestamps.sort(function (ts1, ts2) { + if (ts1 > ts2) return 1; + if (ts1 < ts2) return -1; + return 0; + }); + + // loop again over the usages for this resource + // loop in predefined status order, so the chart's series are stacked in the correct order + for(var status of ['conflict', 'claimed', 'allocated']) { + if(!status_usages.hasOwnProperty(status)) + continue; + + usage_data = []; + + var usages = status_usages[status]; + var t_idx = 0, t_length = timestamps.length; + var u_idx = 0, u_length = usages.length; + var u_min_timestamp = usages[0].timestamp; + var u_max_timestamp = usages[u_length-1].timestamp; + while(t_idx < t_length) { + var timestamp = timestamps[t_idx]; + var value = 0; + + if(u_idx < u_length-1 && timestamp >= usages[u_idx+1].timestamp) { + u_idx += 1; + } + + if(u_idx < u_length) { + var usage = usages[u_idx]; + + if(timestamp >= u_min_timestamp && timestamp < u_max_timestamp) { + value = usage.value; + } + } + usage_data.push([timestamp.getTime(), value]); + t_idx += 1; + } + + //make sure the series are in the right order for proper stacking + var seriesIdx = $scope.chartSeries.findIndex(function(series) {return series.name == status}); + if(seriesIdx > -1) { + $scope.chartSeries.splice(seriesIdx, 1); + } + series = {name: status, type: 'area', step: true, lineWidth:0, marker:{enabled:false}, animation:false }; + $scope.chartSeries.push(series); + + series.data = usage_data; + + switch(status) { + case 'claimed': series.color = '#ffa64d'; break; + case 'conflict': series.color = '#ff0000'; break; + case 'allocated': series.color = '#66ff66'; break; + } + } + + //plot area for resource misc_used capacity + //make sure it is the last of the 'area' series so it is at the bottom of the stacked area charts + var misc_used_cap_series_idx = $scope.chartSeries.findIndex(function(series) {return series.name == 'misc used capacity'}); + if(misc_used_cap_series_idx > -1) { + $scope.chartSeries.splice(misc_used_cap_series_idx, 1); + } + + var misc_used_capacity = resourceUsagesDict[selected_resource_id].misc_used_capacity; + if(misc_used_capacity > 0) { + misc_used_cap_series = {name: 'misc used capacity', type: 'area', color: '#aaaaff', lineWidth:1, marker:{enabled:false}, dashStyle:'Dash', animation:false }; + $scope.chartSeries.push(misc_used_cap_series); + misc_used_cap_series.data = timestamps.map(function(t) { return [t.getTime(), misc_used_capacity]; }); + expectedSeriesNames.push('misc used capacity'); + } + + //plot horizontal line for resource total capacity + var tot_cap_series = $scope.chartSeries.find(function(series) {return series.name == 'total capacity'}); + if(!tot_cap_series) { + tot_cap_series = {name: 'total capacity', type: 'line', color: '#ff0000', lineWidth:3, marker:{enabled:false}}; + $scope.chartSeries.push(tot_cap_series); + } + tot_cap_series.data = [[timestamps[0].getTime(), resource.total_capacity], + [timestamps[timestamps.length-1].getTime(), resource.total_capacity]] + expectedSeriesNames.push('total capacity'); + + //plot horizontal line for resource used capacity + var used_cap_series = $scope.chartSeries.find(function(series) {return series.name == 'used capacity'}); + if(!used_cap_series) { + used_cap_series = {name: 'used capacity', type: 'line', color: '#ff9966', lineWidth:3, marker:{enabled:false}, dashStyle:'Dash'}; + $scope.chartSeries.push(used_cap_series); + } + used_cap_series.data = [[timestamps[0].getTime(), resource.used_capacity], + [timestamps[timestamps.length-1].getTime(), resource.used_capacity]] + expectedSeriesNames.push('used capacity'); + } + + + for(var i = $scope.chartSeries.length-1; i >= 0; i--) { + if(!expectedSeriesNames.find(function(s) { return s == $scope.chartSeries[i].name;})) { + $scope.chartSeries.splice(i, 1); + } + } + }; + + $scope.$watch('dataService.selected_resource_id', updateChartData); + $scope.$watch('dataService.resources', updateChartData, true); + $scope.$watch('dataService.resourceUsagesDict', updateChartData, true); +// $scope.$watch('dataService.lofarTime', function() {$scope.options.currentDateValue= $scope.dataService.lofarTime;}); +} +]); diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/datacontroller.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/datacontroller.js index ed3a13a576ccb2cb162175f0cc93a440b3c007f7..06ad0b508e96dae8540f1498bdb1cb72ff4aae90 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/datacontroller.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/datacontroller.js @@ -1,21 +1,24 @@ // $Id$ -angular.module('raeApp').factory("dataService", ['$http', function($http){ +angular.module('raeApp').factory("dataService", ['$http', '$q', function($http, $q){ var self = this; self.tasks = []; self.resources = []; self.resourceGroups = []; self.resourceClaims = []; - self.resourceGroupClaims = []; self.tasktypes = []; self.taskstatustypes = []; + self.editableTaskStatusIds = []; self.taskDict = {}; self.resourceDict = {}; self.resourceGroupsDict = {}; + self.resourceGroupMemberships = {}; self.resourceClaimDict = {}; - self.resourceGroupClaimDict = {}; - self.resourceIdToGroupIdsDict = {}; + self.resourceUsagesDict = {}; + self.tasktypesDict = {}; + + self.momProjects = []; self.momProjectsDict = {}; self.resourcesWithClaims = []; @@ -23,6 +26,43 @@ angular.module('raeApp').factory("dataService", ['$http', function($http){ self.filteredTasks = []; self.filteredTaskDict = {}; + self.taskTimes = {}; + self.resourceClaimTimes = {}; + + self.selected_resource_id; + self.selected_resourceGroup_id; + self.selected_task_id; + self.selected_project_id; + self.selected_resourceClaim_id; + + self.initialLoadComplete = false; + + self.resourceClaimStatusColors = {'claimed':'#ffa64d', + 'conflict':'#ff0000', + 'allocated': '#66ff66', + 'mixed': '#bfbfbf'} + + self.taskStatusColors = {'prepared':'#cccccc', + 'approved':'#8cb3d9', + 'on_hold':'#b34700', + 'conflict':'#ff0000', + 'prescheduled': '#6666ff', + 'scheduled': '#0000ff', + 'queued': '#6666ff', + 'active': '#ffff00', + 'completing': '#99ff33', + 'finished': '#00ff00', + 'aborted': '#cc0000', + 'error': '#990033', + 'obsolete': '#555555'}; + + + + //start with local client time + //lofarTime will be synced with server, + //because local machine might have incorrect clock + self.lofarTime = new Date(Date.now()); + self.toIdBasedDict = function(list) { var dict = {} for(var i = list.length-1; i >=0; i--) { @@ -32,38 +72,29 @@ angular.module('raeApp').factory("dataService", ['$http', function($http){ return dict; }; - self.mapResourcesToGroups = function () { - var dict = {} - var resources = self.resources; - var resourceGroups = self.resourceGroups; - - if(resources.length > 0) { - for(var i = resources.length-1; i >=0; i--) - dict[resources[i].id] = [] - - for(var i = resourceGroups.length-1; i >=0; i--) { - var group = resourceGroups[i]; - var childResourceIds = group.resourceIds; - - for(var j = childResourceIds.length-1; j >=0; j--) { - var childResourceId = childResourceIds[j]; - dict[childResourceId].push(group.id); - } + self.applyChanges = function(existingObj, changedObj) { + for(var prop in changedObj) { + if(existingObj.hasOwnProperty(prop) && + changedObj.hasOwnProperty(prop) && + existingObj[prop] != changedObj[prop]) { + if(existingObj[prop] instanceof Date && changedObj[prop] instanceof String) { + existingObj[prop] = new Date(changedObj[prop]); + } else { + existingObj[prop] = changedObj[prop]; } + } } - - self.resourceIdToGroupIdsDict = dict; }; self.getTasks = function() { + var defer = $q.defer(); + $http.get('/rest/tasks').success(function(result) { //convert datetime strings to Date objects - for(var i = result.tasks.length-1; i >=0; i--) { + for(var i in result.tasks) { var task = result.tasks[i]; task.starttime = new Date(task.starttime); task.endtime = new Date(task.endtime); - - self.getMoMObjectDetailsForTask(task); } self.tasks = result.tasks; @@ -71,27 +102,78 @@ angular.module('raeApp').factory("dataService", ['$http', function($http){ self.filteredTasks = self.tasks; self.filteredTaskDict = self.taskDict; + + self.computeMinMaxTaskTimes(); + + defer.resolve(); }); + + return defer.promise; }; self.putTask = function(task) { $http.put('/rest/tasks/' + task.id, task).error(function(result) { console.log("Error. Could not update task. " + result); + //TODO: revert to old state }) }; + self.computeMinMaxTaskTimes = function() { + var starttimes = self.filteredTasks.map(function(t) { return t.starttime;}); + var endtimes = self.filteredTasks.map(function(t) { return t.endtime;}); + + var minStarttime = new Date(Math.min.apply(null, starttimes)); + var maxEndtime = new Date(Math.max.apply(null, endtimes)); + var fullTimespanInMinutes = (maxEndtime - minStarttime) / (60 * 1000); + + self.taskTimes = { + min: minStarttime, + max: maxEndtime, + fullTimespanInMinutes: fullTimespanInMinutes + }; + }; + self.getResources = function() { - $http.get('/rest/resourceitems').success(function(result) { - self.resources = result.resourceitems; + var defer = $q.defer(); + $http.get('/rest/resources').success(function(result) { + self.resources = result.resources; self.resourceDict = self.toIdBasedDict(self.resources); - self.mapResourcesToGroups(); + + self.selected_resource = self.resources[0]; + + defer.resolve(); + }); + + return defer.promise; + }; + + self.getResourceUsages = function() { + var defer = $q.defer(); + $http.get('/rest/resourceusages').success(function(result) { + //convert datetime strings to Date objects + for(var i in result.resourceusages) { + var resource_usages = result.resourceusages[i].usages; + + for(var status in resource_usages) { + var usages = resource_usages[status]; + for(var usage of usages) { + usage.timestamp = new Date(usage.timestamp); + } + } + self.resourceUsagesDict[result.resourceusages[i].resource_id] = result.resourceusages[i]; + } + + defer.resolve(); }); + + return defer.promise; }; self.getResourceClaims = function() { + var defer = $q.defer(); $http.get('/rest/resourceclaims').success(function(result) { //convert datetime strings to Date objects - for(var i = result.resourceclaims.length-1; i >=0; i--) { + for(var i in result.resourceclaims) { var resourceclaim = result.resourceclaims[i]; resourceclaim.starttime = new Date(resourceclaim.starttime); resourceclaim.endtime = new Date(resourceclaim.endtime); @@ -99,70 +181,159 @@ angular.module('raeApp').factory("dataService", ['$http', function($http){ self.resourceClaims = result.resourceclaims; self.resourceClaimDict = self.toIdBasedDict(self.resourceClaims); + + self.computeMinMaxResourceClaimTimes(); + + defer.resolve(); }); + + return defer.promise; + }; + + self.computeMinMaxResourceClaimTimes = function() { + var starttimes = self.resourceClaims.map(function(rc) { return rc.starttime;}); + var endtimes = self.resourceClaims.map(function(rc) { return rc.endtime;}); + + var minStarttime = new Date(Math.min.apply(null, starttimes)); + var maxEndtime = new Date(Math.max.apply(null, endtimes)); + var fullTimespanInMinutes = (maxEndtime - minStarttime) / (60 * 1000); + + self.resourceClaimTimes = { + min: minStarttime, + max: maxEndtime, + fullTimespanInMinutes: fullTimespanInMinutes + }; }; self.getResourceGroups = function() { + var defer = $q.defer(); $http.get('/rest/resourcegroups').success(function(result) { self.resourceGroups = result.resourcegroups; self.resourceGroupsDict = self.toIdBasedDict(self.resourceGroups); - self.mapResourcesToGroups(); + + defer.resolve(); }); + + return defer.promise; }; - self.getResourceGroupClaims = function() { - $http.get('/rest/resourcegroupclaims').success(function(result) { - //convert datetime strings to Date objects - for(var i = result.resourcegroupclaims.length-1; i >=0; i--) { - var resourcegroupclaim = result.resourcegroupclaims[i]; - resourcegroupclaim.starttime = new Date(resourcegroupclaim.starttime); - resourcegroupclaim.endtime = new Date(resourcegroupclaim.endtime); - } + self.getResourceGroupMemberships = function() { + var defer = $q.defer(); + $http.get('/rest/resourcegroupmemberships').success(function(result) { + self.resourceGroupMemberships = result.resourcegroupmemberships; - self.resourceGroupClaims = result.resourcegroupclaims; - self.resourceGroupClaimDict = self.toIdBasedDict(self.resourceGroupClaims); + defer.resolve(); }); + + return defer.promise; }; self.getTaskTypes = function() { + var defer = $q.defer(); $http.get('/rest/tasktypes').success(function(result) { self.tasktypes = result.tasktypes; + self.tasktypesDict = self.toIdBasedDict(self.tasktypes); + + defer.resolve(); }); + + return defer.promise; }; self.getTaskStatusTypes = function() { + var defer = $q.defer(); $http.get('/rest/taskstatustypes').success(function(result) { self.taskstatustypes = result.taskstatustypes; + + self.editableTaskStatusIds = []; + for(var taskstatustype of self.taskstatustypes) { + if(taskstatustype.name == 'approved' || taskstatustype.name == 'conflict' || taskstatustype.name == 'prescheduled') { + self.editableTaskStatusIds.push(taskstatustype.id); + } + } + + defer.resolve(); }); + + return defer.promise; }; self.getMoMProjects = function() { + var defer = $q.defer(); $http.get('/rest/momprojects').success(function(result) { //convert datetime strings to Date objects var dict = {}; - for(var i = result.momprojects.length-1; i >=0; i--) { + var list = []; + for(var i in result.momprojects) { var momproject = result.momprojects[i]; momproject.statustime = new Date(momproject.statustime); - dict[momproject.mom2id] = momproject; + dict[momproject.mom_id] = momproject; + list.push(momproject); } + + list.sort(function(a, b) { return ((a.name < b.name) ? -1 : ((a.name > b.name) ? 1 : 0)); }); + + self.momProjects = list; self.momProjectsDict = dict; + + defer.resolve(); }); + + return defer.promise; }; self.getMoMObjectDetailsForTask = function(task) { $http.get('/rest/momobjectdetails/'+task.mom_id).success(function(result) { if(result.momobjectdetails) { task.name = result.momobjectdetails.object_name; - task.projectName = result.momobjectdetails.project_name; - task.projectId = result.momobjectdetails.project_mom2id; + task.project_name = result.momobjectdetails.project_name; + task.project_id = result.momobjectdetails.project_mom_id; } }); }; + self._syncLofarTimeWithServer = function() { + $http.get('/rest/lofarTime', {timeout:1000}).success(function(result) { + self.lofarTime = new Date(result.lofarTime); + }); + + setTimeout(self._syncLofarTimeWithServer, 60000); + }; + self._syncLofarTimeWithServer(); self.lastUpdateChangeNumber = undefined; + self.initialLoad = function() { + $http.get('/rest/mostRecentChangeNumber').success(function(result) { + if(result.mostRecentChangeNumber >= 0) { + self.lastUpdateChangeNumber = result.mostRecentChangeNumber; + } + + var nrOfItemsToLoad = 8; + var nrOfItemsLoaded = 0; + var checkInitialLoadCompleteness = function() { + nrOfItemsLoaded += 1; + if(nrOfItemsLoaded >= nrOfItemsToLoad) { + self.initialLoadComplete = true; + } + }; + + self.getMoMProjects().then(checkInitialLoadCompleteness); + self.getTaskTypes().then(checkInitialLoadCompleteness); + self.getTaskStatusTypes().then(checkInitialLoadCompleteness); + self.getTasks().then(checkInitialLoadCompleteness); + self.getResourceGroups().then(checkInitialLoadCompleteness); + self.getResources().then(checkInitialLoadCompleteness); + self.getResourceGroupMemberships().then(checkInitialLoadCompleteness); + self.getResourceClaims().then(checkInitialLoadCompleteness); + + self.getResourceUsages(); + + self.subscribeToUpdates(); + }); + }; + self.subscribeToUpdates = function() { var url = '/rest/updates'; if(self.lastUpdateChangeNumber) { @@ -174,7 +345,8 @@ angular.module('raeApp').factory("dataService", ['$http', function($http){ var changeNumbers = result.changes.map(function(item) { return item.changeNumber; }); self.lastUpdateChangeNumber = changeNumbers.reduce(function(a, b, idx, arr) { return a > b ? a : b; }, undefined); - for(var i = result.changes.length-1; i >=0; i--) { + var anyResourceClaims = false; + for(var i in result.changes) { try { var change = result.changes[i]; @@ -182,16 +354,15 @@ angular.module('raeApp').factory("dataService", ['$http', function($http){ var changedTask = change.value; if(change.changeType == 'update') { var task = self.taskDict[changedTask.id]; - task.status = changedTask.status; - task.mom_id = changedTask.mom_id; - task.otdb_id = changedTask.otdb_id; - task.starttime = new Date(changedTask.starttime); - task.endtime = new Date(changedTask.endtime); - self.getMoMObjectDetailsForTask(task); + if(task) { + self.applyChanges(task, changedTask); + } } else if(change.changeType == 'insert') { - self.getMoMObjectDetailsForTask(changedTask); - self.tasks.push(changedTask); - self.taskDict[changedTask.id] = changedTask; + var task = self.taskDict[changedTask.id]; + if(!task) { + self.tasks.push(changedTask); + self.taskDict[changedTask.id] = changedTask; + } } else if(change.changeType == 'delete') { delete self.taskDict[changedTask.id] for(var k = self.tasks.length-1; k >= 0; k--) { @@ -201,16 +372,22 @@ angular.module('raeApp').factory("dataService", ['$http', function($http){ } } } + + self.computeMinMaxTaskTimes(); } else if(change.objectType == 'resourceClaim') { + anyResourceClaims = true; var changedClaim = change.value; if(change.changeType == 'update') { var claim = self.resourceClaimDict[changedClaim.id]; - claim.status = changedClaim.status; - claim.starttime = new Date(changedClaim.starttime); - claim.endtime = new Date(changedClaim.endtime); + if(claim) { + self.applyChanges(claim, changedClaim); + } } else if(change.changeType == 'insert') { - self.resourceClaims.push(changedClaim); - self.resourceClaimDict[changedClaim.id] = changedClaim; + var claim = self.resourceClaimDict[changedClaim.id]; + if(!claim) { + self.resourceClaims.push(changedClaim); + self.resourceClaimDict[changedClaim.id] = changedClaim; + } } else if(change.changeType == 'delete') { delete self.resourceClaimDict[changedClaim.id] for(var k = self.resourceClaims.length-1; k >= 0; k--) { @@ -220,16 +397,33 @@ angular.module('raeApp').factory("dataService", ['$http', function($http){ } } } - } else if(change.objectType == 'resourceGroupClaim') { - var changedGroupClaim = change.value; - var claim = self.resourceGroupClaimDict[changedGroupClaim.id]; - claim.starttime = new Date(changedGroupClaim.starttime); - claim.endtime = new Date(changedGroupClaim.endtime); + + self.computeMinMaxResourceClaimTimes(); + } else if(change.objectType == 'resourceCapacity') { + if(change.changeType == 'update') { + var changedCapacity = change.value; + var resource = self.resourceDict[changedCapacity.resource_id]; + if(resource) { + resource.available_capacity = changedCapacity.available; + resource.total_capacity = changedCapacity.total; + } + } + } else if(change.objectType == 'resourceAvailability') { + if(change.changeType == 'update') { + var changedAvailability = change.value; + var resource = self.resourceDict[changedAvailability.resource_id]; + if(resource) { + resource.active = changedAvailability.total; + } + } } } catch(err) { console.log(err) } } + if(anyResourceClaims) { + self.getResourceUsages(); + } } catch(err) { console.log(err) } @@ -250,18 +444,25 @@ dataControllerMod.controller('DataController', ['$scope', 'dataService', function($scope, dataService) { var self = this; - self.dataService = dataService; + $scope.dataService = dataService; + $scope.$watch('dataService.filteredTasks', dataService.computeMinMaxTaskTimes); - dataService.getTaskTypes(); - dataService.getTaskStatusTypes(); - dataService.getTasks(); -// dataService.getResourceGroups(); -// dataService.getResourceGroupClaims(); - dataService.getResources(); - dataService.getResourceClaims(); - dataService.getMoMProjects(); + dataService.initialLoad(); - dataService.subscribeToUpdates(); + //clock ticking every second + //updating current lofarTime by the elapsed time since previous tick + //lofarTime is synced every minute with server utc time. + self._prevTick = Date.now(); + self._doTimeTick = function() { + var tick = Date.now(); + var elapsed = tick - self._prevTick; + self._prevTick = tick; + //evalAsync, so lofarTime will be seen by watches + $scope.$evalAsync(function() { dataService.lofarTime = new Date(dataService.lofarTime.getTime() + elapsed); }); + + setTimeout(self._doTimeTick, 1000); + }; + self._doTimeTick(); } ]); diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/ganttcontroller.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/ganttcontroller.js deleted file mode 100644 index 4d1dee7215debee36df24a211589755d2343465a..0000000000000000000000000000000000000000 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/ganttcontroller.js +++ /dev/null @@ -1,257 +0,0 @@ -// $Id: ganttcontroller.js 32761 2015-11-02 11:50:21Z schaap $ - -var ganttControllerMod = angular.module('GanttControllerMod', [ - 'gantt', - 'gantt.sortable', - 'gantt.movable', - 'gantt.drawtask', - 'gantt.tooltips', - 'gantt.bounds', - 'gantt.progress', - 'gantt.table', - 'gantt.tree', - 'gantt.groups', - 'gantt.overlap', - 'gantt.resizeSensor']).config(['$compileProvider', function($compileProvider) { - $compileProvider.debugInfoEnabled(false); // Remove debug info (angularJS >= 1.3) -}]); - -ganttControllerMod.controller('GanttController', ['$scope', 'dataService', function($scope, dataService) { - - var self = this; - self.doInitialCollapse = true; - - $scope.dataService = dataService; - $scope.ganttData = [] - - self.taskStatusColors = {'prepared':'#aaff00', - 'approved':'#ffaa00', - 'on_hold':'#ff0000', - 'conflict':'#ffccaa', - 'prescheduled': '#6666ff', - 'scheduled': '#ff66ff', - 'queued': '#bb6644', - 'active': '#eeffee', - 'completing': '#776688', - 'finished': '#66ff33', - 'aborted': '#ff3366', - 'error': '#ff4488', - 'obsolete': '#555555'} - - $scope.options = { - mode: 'custom', - scale: 'day', - sideMode: 'Tree', - columns: ['model.name', 'starttime', 'endtime'], - treeTableColumns: ['starttime', 'endtime'], - columnsHeaders: {'model.name' : 'Name', 'starttime': 'From', 'endtime': 'To'}, - columnsClasses: {'model.name' : 'gantt-column-name', 'starttime': 'gantt-column-from', 'endtime': 'gantt-column-to'}, - columnsFormatters: { - 'starttime': function(starttime) { - return starttime !== undefined ? starttime.format('lll') : undefined; - }, - 'endtime': function(endtime) { - return endtime !== undefined ? endtime.format('lll') : undefined; - } - }, - treeHeaderContent: '<i class="fa fa-align-justify"></i> {{getHeader()}}', - columnsHeaderContents: { - 'model.name': '<i class="fa fa-align-justify"></i> {{getHeader()}}', - 'starttime': '<i class="fa fa-calendar"></i> {{getHeader()}}', - 'endtime': '<i class="fa fa-calendar"></i> {{getHeader()}}' - }, - autoExpand: 'both', - api: function(api) { - // API Object is used to control methods and events from angular-gantt. - $scope.api = api; - - api.core.on.ready($scope, function () { - api.tasks.on.moveEnd($scope, moveHandler); - api.tasks.on.resizeEnd($scope, moveHandler); - } - ); - } - }; - - function moveHandler(item) - { - var task_id = undefined; - if(item.row.model.id.startsWith('group')) { - var claimGroupId = item.model.id; - var claimGroup = $scope.dataService.resourceGroupClaimDict[claimGroupId]; - task_id = claimGroup.task_id; - } - else { - var claimId = item.model.id; - var claim = $scope.dataService.resourceClaimDict[claimId]; - task_id = claim.task_id; - } - if(task_id) { - var task = $scope.dataService.taskDict[task_id]; - var updatedTask = { - id: task.id, - starttime: item.model.from._d.toISOString(), - endtime: item.model.to._d.toISOString() - }; - $scope.dataService.putTask(updatedTask); - } - }; - - function updateGanttData() { - var ganntRowsDict = {}; - - var resourceGroups = $scope.dataService.resourceGroups; - var numResourceGroups = resourceGroups.length; - - var resourceIdToGroupIdsDict = $scope.dataService.resourceIdToGroupIdsDict; - var resources = $scope.dataService.resources; - var numResources = resources.length; - - var resourceGroupsDict = $scope.dataService.resourceGroupsDict; - var taskDict = $scope.dataService.filteredTaskDict; - - var resourceGroupClaims = $scope.dataService.resourceGroupClaims; - var numResourceGroupClaims = resourceGroupClaims.length; - - var resourceClaims = $scope.dataService.resourceClaims; - var numResourceClaims = resourceClaims.length; - - var resourceDict = $scope.dataService.resourceDict; - - //create rows in gantt for resourceGroups - for(var i = 0; i < numResourceGroups; i++) - { - var resourceGroup = resourceGroups[i]; - var groupRowId = 'group_' + resourceGroup.id; - ganntRowsDict[groupRowId] = { - 'id': groupRowId, - 'name': resourceGroup.name, - 'tasks': [] - }; - } - - //create rows in gantt for resources - //add each resource row to all group rows of which group it is a member - for(var i = 0; i < numResources; i++) - { - var resource = resources[i]; - - if(resourceIdToGroupIdsDict && resourceIdToGroupIdsDict[resource.id] && resourceIdToGroupIdsDict[resource.id].length > 0) { - var groupIds = resourceIdToGroupIdsDict[resource.id]; - var numGroups = groupIds.length; - for(var j = 0; j < numGroups; j++) { - var parentRowId = 'group_' + groupIds[j]; - var resourceRowId = 'resource_' + resource.id + '_group_' + groupIds[j]; - //make resource row child of group row - ganntRowsDict[resourceRowId] = { - 'id': resourceRowId, - 'parent': parentRowId, - 'name': resource.name, - 'tasks': [] - }; - } - } - else - { - //no parent groups, so one individual row - var resourceRowId = 'resource_' + resource.id; - ganntRowsDict[resourceRowId] = { - 'id': resourceRowId, - 'name': resource.name, - 'tasks': [] - }; - } - } - - //now that we have all rows for the gantt... - //assign each groupclaim to its resourcegroup - for(var i = 0; i < numResourceGroupClaims; i++) { - var groupClaim = resourceGroupClaims[i]; - var task = taskDict[groupClaim.task_id]; - - if(task) - { - var groupRowId = 'group_' + groupClaim.resourceGroupId; - var ganntGroupRow = ganntRowsDict[groupRowId]; - - var groupClaimTask = { - id: groupClaim.id, - name: task ? task.name : '<unknown>', - 'from': groupClaim.starttime, - 'to': groupClaim.endtime, - 'color': self.taskStatusColors[task.status] - }; - - if(ganntGroupRow) - ganntGroupRow.tasks.push(groupClaimTask); - } - } - - //and assign each resourceclaim to its resource in each group - for(var i = 0; i < numResourceClaims; i++) { - var claim = resourceClaims[i]; - var task = taskDict[claim.task_id]; - - if(task) - { - if(resourceIdToGroupIdsDict && resourceIdToGroupIdsDict[claim.resource_id] && resourceIdToGroupIdsDict[claim.resource_id].length> 0) { - var groupIds = resourceIdToGroupIdsDict[claim.resource_id]; - var numGroups = groupIds.length; - for(var j = 0; j < numGroups; j++) { - var resourceRowId = 'resource_' + claim.resource_id + '_group_' + groupIds[j]; - var ganntRow = ganntRowsDict[resourceRowId]; - if(ganntRow) - { - var claimTask = { - id: claim.id, - name: task ? task.name : '<unknown>', - 'from': claim.starttime, - 'to': claim.endtime, - 'color': self.taskStatusColors[task.status] - }; - - ganntRow.tasks.push(claimTask); - } - } - } - else { - var resourceRowId = 'resource_' + claim.resource_id; - var ganntRow = ganntRowsDict[resourceRowId]; - if(ganntRow) - { - var claimTask = { - id: claim.id, - name: task ? task.name : '<unknown>', - 'from': claim.starttime, - 'to': claim.endtime, - 'color': self.taskStatusColors[task.status] - }; - - ganntRow.tasks.push(claimTask); - } - } - } - } - - var ganntRows = []; - - for (var groupId in ganntRowsDict) - ganntRows.push(ganntRowsDict[groupId]); - - $scope.ganttData = ganntRows; - - if(self.doInitialCollapse && numResources && numResourceGroups) - { - doInitialCollapse = false; -// setTimeout(function() { $scope.api.tree.collapseAll(); }, 50); - } - }; - - $scope.$watch('dataService.tasks', updateGanttData, true); - $scope.$watch('dataService.resources', updateGanttData); - $scope.$watch('dataService.resourceClaims', updateGanttData, true); - $scope.$watch('dataService.resourceGroups', updateGanttData); - $scope.$watch('dataService.resourceGroupClaims', updateGanttData, true); - $scope.$watch('dataService.filteredTaskDict', updateGanttData); -} -]); diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/ganttprojectcontroller.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/ganttprojectcontroller.js new file mode 100644 index 0000000000000000000000000000000000000000..3df3f7cd392c95fffb60a0573bc9eb1eaeedac98 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/ganttprojectcontroller.js @@ -0,0 +1,215 @@ +// $Id: ganttprojectcontroller.js 32761 2015-11-02 11:50:21Z schaap $ + +var ganttProjectControllerMod = angular.module('GanttProjectControllerMod', [ + 'gantt', + 'gantt.sortable', + 'gantt.movable', + 'gantt.drawtask', + 'gantt.tooltips', + 'gantt.bounds', + 'gantt.progress', + 'gantt.table', + 'gantt.tree', + 'gantt.groups', + 'gantt.dependencies', + 'gantt.overlap', + 'gantt.resizeSensor']).config(['$compileProvider', function($compileProvider) { + $compileProvider.debugInfoEnabled(false); // Remove debug info (angularJS >= 1.3) +}]); + +ganttProjectControllerMod.controller('GanttProjectController', ['$scope', 'dataService', function($scope, dataService) { + + var self = this; + self.doInitialCollapse = true; + + $scope.dataService = dataService; + $scope.ganttData = []; + + self.taskStatusColors = dataService.taskStatusColors; + + $scope.options = { + mode: 'custom', + viewScale: '1 hours', + currentDate: 'line', + currentDateValue: $scope.dataService.lofarTime, + columnMagnet: '1 minutes', + timeFramesMagnet: false, + sideMode: 'Tree', + autoExpand: 'both', + taskOutOfRange: 'truncate', + dependencies: true, + api: function(api) { + // API Object is used to control methods and events from angular-gantt. + $scope.api = api; + + api.core.on.ready($scope, function () { + api.tasks.on.moveEnd($scope, moveHandler); + api.tasks.on.resizeEnd($scope, moveHandler); + } + ); + + api.directives.on.new($scope, function(directiveName, directiveScope, element) { + if (directiveName === 'ganttRow' || directiveName === 'ganttRowLabel' ) { + element.bind('click', function(event) { + if(directiveScope.row.model.project) { + $scope.dataService.selected_project_id = directiveScope.row.model.project.id; + } + }); + } else if (directiveName === 'ganttTask') { + element.bind('click', function(event) { + if(directiveScope.task.model.raTask) { + $scope.dataService.selected_task_id = directiveScope.task.model.raTask.id; + } + }); + } + }); + + api.directives.on.destroy($scope, function(directiveName, directiveScope, element) { + if (directiveName === 'ganttRow' || directiveName === 'ganttRowLabel' || directiveName === 'ganttTask') { + element.unbind('click'); + } + }); + } + }; + + function moveHandler(item) + { + var task_id = item.model.id; + + if(task_id) { + var task = $scope.dataService.taskDict[task_id]; + var updatedTask = { + id: task.id, + starttime: item.model.from._d.toISOString(), + endtime: item.model.to._d.toISOString() + }; + $scope.dataService.putTask(updatedTask); + } + }; + + function updateGanttData() { + if(!dataService.initialLoadComplete) { + return; + } + + var projectsDict = $scope.dataService.momProjectsDict; + var numProjecs = $scope.dataService.momProjects.length; + + var taskDict = $scope.dataService.filteredTaskDict; + var tasks = $scope.dataService.filteredTasks; + var numTasks = tasks.length; + + var tasktypesDict = $scope.dataService.tasktypesDict; + var tasktypes = $scope.dataService.tasktypes; + var numTasktypes = tasktypes.length; + + if(numProjecs == 0 || numTasktypes == 0){ + $scope.ganttData = []; + return; + } + + var editableTaskStatusIds = $scope.dataService.editableTaskStatusIds; + + var ganntRowsDict = {}; + + if(numProjecs > 0 && numTasks > 0 && numTasktypes > 0) { + $scope.options.fromDate = $scope.dataService.taskTimes.minStarttime; + $scope.options.toDate = $scope.dataService.taskTimes.maxEndtime; + var fullTimespanInMinutes = $scope.dataService.taskTimes.fullTimespanInMinutes; + + if(fullTimespanInMinutes > 14*24*60) { + $scope.options.viewScale = '1 days'; + } else if(fullTimespanInMinutes > 7*24*60) { + $scope.options.viewScale = '6 hours'; + } else if(fullTimespanInMinutes > 2*24*60) { + $scope.options.viewScale = '3 hours'; + } else { + $scope.options.viewScale = '1 hours'; + } + + for(var i = 0; i < numTasks; i++) { + var task = tasks[i]; + + var projectRowId = 'project_' + task.project_mom_id; + var ganntProjectRow = ganntRowsDict[projectRowId]; + + if(!ganntProjectRow) { + var project = projectsDict[task.project_mom_id]; + + if(project) { + ganntProjectRow = { + id: projectRowId, + name: project.name, + project: project, + tasks: [] + }; + + ganntRowsDict[projectRowId] = ganntProjectRow; + } + } + + if(ganntProjectRow) { + var typeRowId = 'project_' + task.project_mom_id + '_type_' + task.type_id; + var ganntTypeRow = ganntRowsDict[typeRowId]; + + if(!ganntTypeRow) { + var tasktype = tasktypesDict[task.type_id].name; + + if(tasktype) { + ganntTypeRow = { + id: typeRowId, + parent: projectRowId, + name: tasktype, + project: project, + tasks: [] + }; + + ganntRowsDict[typeRowId] = ganntTypeRow; + } + } + + if(ganntTypeRow) { + var rowTask = { + id: task.id.toString(), + name: task.name, + from: task.starttime, + to: task.endtime, + raTask: task, + color: self.taskStatusColors[task.status], + movable: $.inArray(task.status_id, editableTaskStatusIds) > -1 + }; + + if(task.predecessor_ids && task.predecessor_ids.length > 0) { + rowTask['dependencies'] = []; + for(var predId of task.predecessor_ids) { + rowTask['dependencies'].push({'from': predId}); + } + } + + ganntTypeRow.tasks.push(rowTask); + } + } + } + } + + var ganntRows = []; + + for (var rowId in ganntRowsDict) + ganntRows.push(ganntRowsDict[rowId]); + + ganntRows.sort(function(a, b) { return ((a.name < b.name) ? -1 : ((a.name > b.name) ? 1 : 0)); }); + $scope.ganttData = ganntRows; + }; + + $scope.$watch('dataService.initialLoadComplete', updateGanttData); + $scope.$watch('dataService.tasks', updateGanttData, true); + $scope.$watch('dataService.resources', updateGanttData); + $scope.$watch('dataService.resourceClaims', updateGanttData, true); + $scope.$watch('dataService.resourceGroups', updateGanttData); + $scope.$watch('dataService.resourceGroupMemberships', updateGanttData); + $scope.$watch('dataService.filteredTaskDict', updateGanttData); + $scope.$watch('dataService.momProjectsDict', updateGanttData, true); + $scope.$watch('dataService.taskTimes', updateGanttData, true); + $scope.$watch('dataService.lofarTime', function() {$scope.options.currentDateValue= $scope.dataService.lofarTime;}); +} +]); diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/ganttresourcecontroller.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/ganttresourcecontroller.js new file mode 100644 index 0000000000000000000000000000000000000000..891b665c2f8e4042b98553acab13afd15c2c5242 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/ganttresourcecontroller.js @@ -0,0 +1,411 @@ +// $Id: ganttresourcecontroller.js 32761 2015-11-02 11:50:21Z schaap $ + +var ganttResourceControllerMod = angular.module('GanttResourceControllerMod', [ + 'gantt', + 'gantt.sortable', + 'gantt.movable', + 'gantt.drawtask', + 'gantt.tooltips', + 'gantt.bounds', + 'gantt.progress', + 'gantt.tree', + 'gantt.groups', + 'gantt.overlap', + 'gantt.resizeSensor']).config(['$compileProvider', function($compileProvider) { + $compileProvider.debugInfoEnabled(false); // Remove debug info (angularJS >= 1.3) +}]); + +ganttResourceControllerMod.controller('GanttResourceController', ['$scope', 'dataService', function($scope, dataService) { + + var self = this; + self.doInitialCollapse = true; + + $scope.dataService = dataService; + $scope.ganttData = [] + + self.taskStatusColors = dataService.taskStatusColors; + self.resourceClaimStatusColors = dataService.resourceClaimStatusColors; + + $scope.options = { + mode: 'custom', + viewScale: '1 hours', + currentDate: 'line', + currentDateValue: $scope.dataService.lofarTime, + columnMagnet: '1 minutes', + timeFramesMagnet: false, + sideMode: 'Tree', + autoExpand: 'both', + taskOutOfRange: 'truncate', + api: function(api) { + // API Object is used to control methods and events from angular-gantt. + $scope.api = api; + + api.core.on.ready($scope, function () { + api.tasks.on.moveEnd($scope, moveHandler); + api.tasks.on.resizeEnd($scope, moveHandler); + }); + + api.directives.on.new($scope, function(directiveName, directiveScope, element) { + if (directiveName === 'ganttRow' || directiveName === 'ganttRowLabel' ) { + element.bind('click', function(event) { + if(directiveScope.row.model.resource) { + $scope.dataService.selected_resource_id = directiveScope.row.model.resource.id; + } else if(directiveScope.row.model.resourceGroup) { + $scope.dataService.selected_resourceGroup_id = directiveScope.row.model.resourceGroup.id; + } + }); + } else if (directiveName === 'ganttTask') { + element.bind('click', function(event) { + if(directiveScope.task.model.raTask) { + $scope.dataService.selected_task_id = directiveScope.task.model.raTask.id; + } + if(directiveScope.task.model.claim) { + $scope.dataService.selected_resourceClaim_id = directiveScope.task.model.claim.id; + } + }); + } + }); + + api.directives.on.destroy($scope, function(directiveName, directiveScope, element) { + if (directiveName === 'ganttRow' || directiveName === 'ganttRowLabel' || directiveName === 'ganttTask') { + element.unbind('click'); + } + }); + } + }; + + function moveHandler(item) + { + var task = item.model.raTask; + var updatedTask = { + id: task.id, + starttime: item.model.from._d.toISOString(), + endtime: item.model.to._d.toISOString() + }; + $scope.dataService.putTask(updatedTask); + }; + + function updateGanttData() { + if(!dataService.initialLoadComplete) { + return; + } + + var ganttRowsDict = {}; + + var resourceGroupsDict = $scope.dataService.resourceGroupsDict; + var resourceGroups = $scope.dataService.resourceGroups; + var numResourceGroups = resourceGroups.length; + + var resourceDict = $scope.dataService.resourceDict; + var resources = $scope.dataService.resources; + var numResources = resources.length; + + var resourceGroupMemberships = $scope.dataService.resourceGroupMemberships; + + var taskDict = $scope.dataService.filteredTaskDict; + var numTasks = $scope.dataService.filteredTasks.length; + + var resourceClaimDict = $scope.dataService.resourceClaimDict; + var resourceClaims = $scope.dataService.resourceClaims; + var numResourceClaims = resourceClaims.length; + + if(numResourceGroups == 0 || numResources == 0){ + $scope.ganttData = []; + return; + } + + $scope.options.fromDate = $scope.dataService.resourceClaimTimes.minStarttime; + $scope.options.toDate = $scope.dataService.resourceClaimTimes.maxEndtime; + var fullTimespanInMinutes = $scope.dataService.resourceClaimTimes.fullTimespanInMinutes; + + if(fullTimespanInMinutes > 14*24*60) { + $scope.options.viewScale = '1 days'; + } else if(fullTimespanInMinutes > 7*24*60) { + $scope.options.viewScale = '6 hours'; + } else if(fullTimespanInMinutes > 2*24*60) { + $scope.options.viewScale = '3 hours'; + } else { + $scope.options.viewScale = '1 hours'; + } + + var editableTaskStatusIds = $scope.dataService.editableTaskStatusIds; + + //dict resourceGroup2GanttRows for fast lookup of ganttrows based on groupId + var resourceGroup2GanttRows = {}; + + // recursive method which creates ganttrows for a resourceGroup(Id), + // and its childs, and adds the subtree to the parentRow + var createGanttRowTree = function(groupId, parentRow) { + var resourceGroup = resourceGroupsDict[groupId]; + + if(resourceGroup) { + var groupRowId = 'group_' + groupId; + if(parentRow) { + groupRowId += '_parent' + parentRow.id; + } + + var ganttRow = { + id: groupRowId, + parent: parentRow ? parentRow.id : null, + name: resourceGroup.name, + resourceGroup: resourceGroup, + tasks: [] + }; + + ganttRowsDict[groupRowId] = ganttRow; + + //store ganttRow also in dict resourceGroup2GanttRows for fast lookup based on groupId + if(!resourceGroup2GanttRows.hasOwnProperty(groupId)) { + resourceGroup2GanttRows[groupId] = []; + } + resourceGroup2GanttRows[groupId].push(ganttRow); + + //recurse over the childs + var numChilds = resourceGroupMemberships.groups[groupId].child_ids.length; + for(var i = 0; i < numChilds; i++) { + var childGroupId = resourceGroupMemberships.groups[groupId].child_ids[i]; + createGanttRowTree(childGroupId, ganttRow); + } + } + }; + + //build tree of resourceGroups + //note that one resourceGroup can be a child of multiple parents + if(resourceGroupMemberships.hasOwnProperty('groups')) { + for(var groupId in resourceGroupMemberships.groups) { + if(resourceGroupMemberships.groups[groupId].parent_ids.length == 0) { + //resourceGroup is a root item (no parents) + //so start creating a ganttRow tree for this root and all its descendants + createGanttRowTree(groupId, null); + } + } + } + + //dict resource2GanttRows for fast lookup of ganttrows based on resourceId + var resource2GanttRows = {}; + + //add resources to their parent resourceGroups + //note that one resource can be a child of multiple parent resourceGroups + if(resourceGroupMemberships.hasOwnProperty('resources')) { + for(var resourceId in resourceGroupMemberships.resources) { + var resource = resourceDict[resourceId]; + if(resource) { + //of which parent(s) is this resource a child? + var parentGroupIds = resourceGroupMemberships.resources[resourceId].parent_group_ids; + + //loop over parents + //add a ganttRow for the resource to each parent ganttRow + for(var parentGroupId of parentGroupIds) { + //note that one parentResourceGroup can actually have multiple rows + //since each resourceGroup itself can have multiple parents + var parentGanttRows = resourceGroup2GanttRows[parentGroupId]; + + if(parentGanttRows) { + for(var parentGanttRow of parentGanttRows) { + var resourceGanttRowId = 'resource_' + resource.id + '_' + parentGanttRow.id; + var ganttRow = { + id: resourceGanttRowId, + parent: parentGanttRow.id, + name: resource.name, + tasks: [], + resource: resource + }; + + ganttRowsDict[resourceGanttRowId] = ganttRow; + + //store ganttRow also in dict resource2GanttRows for fast lookup based on groupId + if(!resource2GanttRows.hasOwnProperty(resourceId)) { + resource2GanttRows[resourceId] = []; + } + resource2GanttRows[resourceId].push(ganttRow); + } + } + } + } + } + } + + //there are also resources which are not part of a group + //add these as well. + for(var resourceId in resourceDict) { + var resource = resourceDict[resourceId]; + + if(!resource2GanttRows.hasOwnProperty(resourceId)) { + var resourceGanttRowId = 'resource_' + resource.id; + var ganttRow = { + id: resourceGanttRowId, + name: resource.name, + tasks: [] + }; + + ganttRowsDict[resourceGanttRowId] = ganttRow; + resource2GanttRows[resourceId] = [ganttRow]; + } + } + + if(numResourceClaims > 0 && numTasks > 0) { + //dict resource2Claims for fast lookup of claims based on resourceId + var resource2Claims = {}; + + //and finally assign each resourceclaim to its resource in each group + for(var claim of resourceClaims) { + var resourceId = claim.resource_id; + var task = taskDict[claim.task_id]; + + if(!task) { + continue; + } + + if(!resource2Claims.hasOwnProperty(resourceId)) { + resource2Claims[resourceId] = []; + } + resource2Claims[resourceId].push(claim); + + var ganttRows = resource2GanttRows[resourceId]; + + if(!ganttRows) { + continue; + } + + for(var ganttRow of ganttRows) { + var claimTask = { + id: claim.id, + name: task.name, + from: claim.starttime, + to: claim.endtime, + color: self.taskStatusColors[task.status], + classes: 'claim-status-' + claim.status, + raTask: task, + claim: claim, + movable: $.inArray(task.status_id, editableTaskStatusIds) > -1 + }; + + ganttRow.tasks.push(claimTask); + } + } + + // recursive method which aggregates the properties of the descendants tree + var aggregateDescendants = function(groupId) { + var aggregatedClaims = {}; + + var resourceIds = resourceGroupMemberships.groups[groupId].resource_ids; + + for(var resourceId of resourceIds) { + var claims = resource2Claims[resourceId]; + + if(claims) { + for(var claim of claims) { + var taskId = claim.task_id; + var task = taskDict[taskId]; + if(taskId in aggregatedClaims) { + if(claim.starttime < aggregatedClaims[taskId].starttime) { + aggregatedClaims[taskId].starttime = claim.starttime.getTime() > task.starttime.getTime() ? claim.starttime : task.starttime; + } + if(claim.endtime > aggregatedClaims[taskId].endtime) { + aggregatedClaims[taskId].endtime = claim.endtime.getTime() < task.endtime.getTime() ? claim.endtime: task.endtime; + } + if(claim.status == 'conflict') { + aggregatedClaims[taskId].status = 'conflict'; + } else if(claim.status != aggregatedClaims[taskId].status && aggregatedClaims[taskId].status != 'conflict') { + aggregatedClaims[taskId].status = 'mixed'; + } + } else { + aggregatedClaims[taskId] = { starttime: claim.starttime, + endtime: claim.endtime, + status: claim.status + }; + } + } + } + } + + var childGroupIds = resourceGroupMemberships.groups[groupId].child_ids; + + for(var childGroupId of childGroupIds) { + + var subAggregatedClaims = aggregateDescendants(childGroupId); + + for(var taskId in subAggregatedClaims) { + var subAggregatedClaim = subAggregatedClaims[taskId]; + if(taskId in aggregatedClaims) { + if(subAggregatedClaim.starttime < aggregatedClaims[taskId].starttime) { + aggregatedClaims[taskId].starttime = subAggregatedClaim.starttime; + } + if(subAggregatedClaim.endtime > aggregatedClaims[taskId].endtime) { + aggregatedClaims[taskId].endtime = subAggregatedClaim.endtime; + } + if(subAggregatedClaim.status == 'conflict') { + aggregatedClaims[taskId].status = 'conflict'; + } else if(subAggregatedClaim.status != aggregatedClaims[taskId].status && aggregatedClaims[taskId].status != 'conflict') { + aggregatedClaims[taskId].status = 'mixed'; + } + } else { + aggregatedClaims[taskId] = { starttime: subAggregatedClaim.starttime, + endtime: subAggregatedClaim.endtime, + status: subAggregatedClaim.status }; + } + } + } + + var ganttRows = resourceGroup2GanttRows[groupId]; + for(var ganttRow of ganttRows) { + for(var taskId in aggregatedClaims) { + var aggClaimForTask = aggregatedClaims[taskId]; + var task = taskDict[taskId]; + if(task) { + var claimTask = { + id: 'aggregatedClaimForTask_' + taskId + '_' + ganttRow.id, + name: task.name, + from: aggClaimForTask.starttime, + to: aggClaimForTask.endtime, + color: self.taskStatusColors[task.status], + classes: 'claim-status-' + aggClaimForTask.status, + raTask: task, + movable: $.inArray(task.status_id, editableTaskStatusIds) > -1 + }; + + ganttRow.tasks.push(claimTask); + } + } + } + return aggregatedClaims; + }; + + //now that the whole tree has been built, + //and all resourceClaims are processed + //loop over the root resourceGroup again + //and aggregate the claims of the subtrees + if(resourceGroupMemberships.hasOwnProperty('groups')) { + for(var groupId in resourceGroupMemberships.groups) { + if(resourceGroupMemberships.groups[groupId].parent_ids.length == 0) { + //resourceGroup is a root item (no parents) + //aggregate the claims of the subtrees + aggregateDescendants(groupId); + } + } + } + } + + var ganttRows = []; + + for (var rowId in ganttRowsDict) + ganttRows.push(ganttRowsDict[rowId]); + + $scope.ganttData = ganttRows; + + if(self.doInitialCollapse && numResources && numResourceGroups) + { + doInitialCollapse = false; +// setTimeout(function() { $scope.api.tree.collapseAll(); }, 50); + } + }; + + $scope.$watch('dataService.initialLoadComplete', updateGanttData); + $scope.$watch('dataService.resources', updateGanttData); + $scope.$watch('dataService.resourceClaims', updateGanttData, true); + $scope.$watch('dataService.resourceGroups', updateGanttData); + $scope.$watch('dataService.resourceGroupMemberships', updateGanttData); + $scope.$watch('dataService.filteredTaskDict', updateGanttData, true); + $scope.$watch('dataService.lofarTime', function() {$scope.options.currentDateValue= $scope.dataService.lofarTime;}); +} +]); diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/gridcontroller.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/gridcontroller.js index ffd5d1289f1a8ba94851b7a0f3c11e5b3700801b..421275af2ee5835ef47045a4d583fd2810a6c851 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/gridcontroller.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/app/controllers/gridcontroller.js @@ -2,57 +2,68 @@ var gridControllerMod = angular.module('GridControllerMod', ['ui.grid', 'ui.grid.edit', + 'ui.grid.selection', 'ui.grid.cellNav', - 'ui.grid.resizeColumns'/*, - 'ui.grid.datepicker'*/]); + 'ui.grid.resizeColumns']); gridControllerMod.controller('GridController', ['$scope', 'dataService', 'uiGridConstants', function($scope, dataService, uiGridConstants) { $scope.dataService = dataService; - $scope.$watch('dataService.tasks', function() { - if('tasks' in $scope.dataService && $scope.dataService.tasks.length > 0) - $scope.gridOptions.data = $scope.dataService.tasks; - else - $scope.gridOptions.data = [] - }, true); - $scope.columns = [ { field: 'name', enableCellEdit: false, - width: '*' + width: '15%' }, - { field: 'projectName', + { field: 'project_name', displayName:'Project', enableCellEdit: false, - width: '*', + cellTemplate:'<a target="_blank" href="https://lofar.astron.nl/mom3/user/project/setUpMom2ObjectDetails.do?view=generalinfo&mom2ObjectId={{row.entity.project_mom2object_id}}">{{row.entity[col.field]}}</a>', + width: '15%', filter: { type: uiGridConstants.filter.SELECT, selectOptions: [] } }, + { field: 'mom_id', + displayName: 'MoM ID', + enableCellEdit: false, + cellTemplate:'<a target="_blank" href="https://lofar.astron.nl/mom3/user/project/setUpMom2ObjectDetails.do?view=generalinfo&mom2ObjectId={{row.entity.mom2object_id}}">{{row.entity[col.field]}}</a>', + width: '7.5%' + }, + { field: 'otdb_id', + displayName: 'SAS ID', + enableCellEdit: false, + width: '7.5%' + }, { field: 'starttime', - width: '*', - enableCellEditOnFocus: true, - cellTemplate:'<div style=\'text-align:right\'>{{row.entity[col.field] | date:\'yyyy-MM-dd HH:mm\'}}</div>' + displayName: 'Start', + width: '15%', + enableCellEdit: false, + enableCellEditOnFocus: false, + cellTemplate:'<div style=\'text-align:left\'>{{row.entity[col.field] | date:\'yyyy-MM-dd HH:mm\'}}</div>' // editableCellTemplate: '<div><form name="inputForm"><div ui-grid-edit-datepicker row-field="MODEL_COL_FIELD" ng-class="\'colt\' + col.uid"></div></form></div>' }, - { field: 'endtime', enableCellEdit: true, - width: '*', - enableCellEditOnFocus: true, - cellTemplate:'<div style=\'text-align:right\'>{{row.entity[col.field] | date:\'yyyy-MM-dd HH:mm\'}}</div>' + { field: 'endtime', + displayName: 'End', + width: '15%', + enableCellEdit: false, + enableCellEditOnFocus: false, + cellTemplate:'<div style=\'text-align:left\'>{{row.entity[col.field] | date:\'yyyy-MM-dd HH:mm\'}}</div>' }, { field: 'status', - enableCellEdit: false, - width: '*', + enableCellEdit: true, + width: '12.5%', filter: { type: uiGridConstants.filter.SELECT, selectOptions: [] - } + }, + editableCellTemplate: 'ui-grid/dropdownEditor', + editDropdownOptionsArray: [] }, { field: 'type', enableCellEdit: false, - width: '*', + width: '12.5%', filter: { type: uiGridConstants.filter.SELECT, selectOptions: [] @@ -62,7 +73,13 @@ gridControllerMod.controller('GridController', ['$scope', 'dataService', 'uiGrid enableGridMenu: false, enableSorting: true, enableFiltering: true, + enableCellEdit: false, enableColumnResize: true, + enableRowSelection: true, + enableRowHeaderSelection: true, + enableFullRowSelection: false, + enableSelectionBatchEvent:false, + multiSelect:false, gridMenuShowHideColumns: false, columnDefs: $scope.columns, data: [], @@ -72,10 +89,15 @@ gridControllerMod.controller('GridController', ['$scope', 'dataService', 'uiGrid $scope.gridApi.core.on.rowsRendered($scope, filterTasks); gridApi.edit.on.afterCellEdit($scope,function(rowEntity, colDef, newValue, oldValue){ - console.log('edited row id:' + rowEntity.id + ' Column:' + colDef.name + ' newValue:' + newValue + ' oldValue:' + oldValue); - var task = $scope.dataService.taskDict[rowEntity.id]; - $scope.dataService.putTask(task); + var newTask = { id: task.id, status: task.status }; + $scope.dataService.putTask(newTask); + }); + + gridApi.selection.on.rowSelectionChanged($scope,function(row){ + if(row.entity.id && row.isSelected) { + $scope.dataService.selected_task_id = row.entity.id; + } }); } }; @@ -104,29 +126,48 @@ gridControllerMod.controller('GridController', ['$scope', 'dataService', 'uiGrid function fillColumFilterSelectOptions(options, columnDef) { var columnSelectOptions = []; - for(var i = 0; i < options.length; i++) - { - var option = options[i]; - columnSelectOptions.push({ value: option, label: option }) + if(options) { + for(var i = 0; i < options.length; i++) + { + var option = options[i]; + columnSelectOptions.push({ value: option, label: option }) + } } columnDef.filter.selectOptions = columnSelectOptions; }; + $scope.$watch('dataService.tasks', function() { + if('tasks' in $scope.dataService && $scope.dataService.tasks.length > 0) + $scope.gridOptions.data = $scope.dataService.tasks; + else + $scope.gridOptions.data = [] + + fillProjectsColumFilterSelectOptions(); + }, true); + $scope.$watch('dataService.taskstatustypes', function() { - fillColumFilterSelectOptions($scope.dataService.taskstatustypes, $scope.columns[4]); + taskstatustypenames = $scope.dataService.taskstatustypes.map(function(x) { return x.name; }); + fillColumFilterSelectOptions(taskstatustypenames, $scope.columns[6]); + $scope.columns[6].editDropdownOptionsArray = $scope.dataService.taskstatustypes.map(function(x) { return {id:x.name, value:x.name}; }); }); $scope.$watch('dataService.tasktypes', function() { - fillColumFilterSelectOptions($scope.dataService.tasktypes, $scope.columns[5]); + tasktypenames = $scope.dataService.tasktypes.map(function(x) { return x.name; }); + fillColumFilterSelectOptions(tasktypenames, $scope.columns[7]); }); - $scope.$watch('dataService.momProjectsDict', function() { + function fillProjectsColumFilterSelectOptions() { var projectNames = []; var momProjectsDict = $scope.dataService.momProjectsDict; - for(var key in momProjectsDict) { - if(momProjectsDict.hasOwnProperty(key)) { - var projectName = momProjectsDict[key].name; + var tasks = $scope.dataService.tasks; + //get unique projectIds from tasks + var task_project_ids = tasks.map(function(t) { return t.project_mom_id; }); + task_project_ids = task_project_ids.filter(function(value, index, arr) { return arr.indexOf(value) == index;}) + + for(var project_id of task_project_ids) { + if(momProjectsDict.hasOwnProperty(project_id)) { + var projectName = momProjectsDict[project_id].name; if(!(projectName in projectNames)) { projectNames.push(projectName); } @@ -134,6 +175,16 @@ gridControllerMod.controller('GridController', ['$scope', 'dataService', 'uiGrid } projectNames.sort(); fillColumFilterSelectOptions(projectNames, $scope.columns[1]); + }; + + $scope.$watch('dataService.momProjectsDict', fillProjectsColumFilterSelectOptions); + + $scope.$watch('dataService.selected_task_id', function() { + var taskIdx = $scope.gridOptions.data.findIndex(function(row) {return row.id == dataService.selected_task_id}); + + if(taskIdx > -1) { + $scope.gridApi.selection.selectRow($scope.gridOptions.data[taskIdx]); + } }); } ]); diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/css/bootstrap.min.css b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/css/bootstrap.min.css index d65c66b1ba297eeb3b5976b71c64c736b41bb763..1cb5142aed702a519c1ff2170102f7cd8c4377bf 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/css/bootstrap.min.css +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/css/bootstrap.min.css @@ -1,5 +1,8 @@ /*! - * Bootstrap v3.3.5 (http://getbootstrap.com) + * Bootstrap v3.3.6 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.33px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:3;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */.label,sub,sup{vertical-align:baseline}hr,img{border:0}body,figure{margin:0}.btn-group>.btn-group,.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.dropdown-menu{float:left}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.pre-scrollable{max-height:340px}.fa,.glyphicon{-moz-osx-font-smoothing:grayscale}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}b,optgroup,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0}mark{color:#000;background:#ff0}sub,sup{position:relative;font-size:75%;line-height:0}sup{top:-.5em}sub{bottom:-.25em}img{vertical-align:middle}svg:not(:root){overflow:hidden}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}code,kbd,pre,samp{font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}.glyphicon,address{font-style:normal}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{blockquote,img,pre,tr{page-break-inside:avoid}*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}.btn,.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-warning.active,.btn-warning:active,.btn.active,.btn:active,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover,.form-control,.navbar-toggle,.open>.dropdown-toggle.btn-danger,.open>.dropdown-toggle.btn-default,.open>.dropdown-toggle.btn-info,.open>.dropdown-toggle.btn-primary,.open>.dropdown-toggle.btn-warning{background-image:none}.img-thumbnail,body{background-color:#fff}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-weight:400;line-height:1;-webkit-font-smoothing:antialiased}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before,.glyphicon-btc:before,.glyphicon-xbt:before{content:"\e227"}.glyphicon-jpy:before,.glyphicon-yen:before{content:"\00a5"}.glyphicon-rub:before,.glyphicon-ruble:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}dt,kbd kbd,label{font-weight:700}address,blockquote .small,blockquote footer,blockquote small,dd,dt,pre{line-height:1.42857143}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-inline,.list-unstyled{padding-left:0;list-style:none}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}pre code,table{background-color:transparent}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}dl,ol,ul{margin-top:0}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child,ol ol,ol ul,ul ol,ul ul{margin-bottom:0}address,dl{margin-bottom:20px}ol,ul{margin-bottom:10px}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.container{width:750px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;color:#777}legend,pre{display:block;color:#333}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}code,kbd{padding:2px 4px;font-size:90%}caption,th{text-align:left}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;-webkit-box-shadow:none;box-shadow:none}pre{padding:9.5px;margin:0 0 10px;font-size:13px;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}.container,.container-fluid{margin-right:auto;margin-left:auto}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;border-radius:0}.container,.container-fluid{padding-right:15px;padding-left:15px}.pre-scrollable{overflow-y:scroll}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}caption{padding-top:8px;padding-bottom:8px;color:#777}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset,legend{padding:0;border:0}fieldset{min-width:0;margin:0}legend{width:100%;margin-bottom:20px;font-size:21px;line-height:inherit;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}.form-control,output{font-size:14px;line-height:1.42857143;color:#555;display:block}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}output{padding-top:7px}.form-control{width:100%;height:34px;padding:6px 12px;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .form-control-feedback,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.checkbox-inline.disabled,.checkbox.disabled label,.radio-inline.disabled,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio label,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.form-group-sm .form-control,.input-sm{padding:5px 10px;border-radius:3px;font-size:12px}.input-sm{height:30px;line-height:1.5}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;line-height:1.5}.form-group-lg .form-control,.input-lg{border-radius:6px;padding:10px 16px;font-size:18px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;line-height:1.3333333}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;line-height:1.3333333}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.collapsing,.dropdown,.dropup{position:relative}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .form-control-feedback,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .form-control-feedback,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-control-static,.form-inline .form-group{display:inline-block}.form-inline .control-label,.form-inline .form-group{margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary.active,.btn-primary:active,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success.active,.btn-success:active,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info.active,.btn-info:active,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger.active,.btn-danger:active,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu-right,.dropdown-menu.pull-right{right:0;left:auto}.dropdown-header,.dropdown-menu>li>a{display:block;padding:3px 20px;line-height:1.42857143;white-space:nowrap}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle,.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child,.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child),.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{clear:both;font-weight:400;color:#333}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-left{right:auto;left:0}.dropdown-header{font-size:12px;color:#777}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.nav-justified>.dropdown .dropdown-menu,.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn .caret,.btn-group>.btn:first-child{margin-left:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-radius:4px 4px 0 0}.btn-group-vertical>.btn:last-child:not(:first-child){border-radius:0 0 4px 4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.nav>li,.nav>li>a{display:block;position:relative}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li>a{padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center;margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0;border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-justified>li,.nav-stacked>li{float:none}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar{border-radius:4px}.navbar-header{float:left}.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.carousel-inner,.embed-responsive,.modal,.modal-open,.progress{overflow:hidden}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}.navbar-static-top{z-index:1000;border-width:0 0 1px}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}.progress-bar-striped,.progress-striped .progress-bar,.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}@media (min-width:768px){.navbar-toggle{display:none}.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin:8px -15px}@media (min-width:768px){.navbar-form .form-control-static,.navbar-form .form-group{display:inline-block}.navbar-form .control-label,.navbar-form .form-group{margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.breadcrumb>li,.pagination{display:inline-block}.btn .badge,.btn .label{top:-1px;position:relative}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-radius:4px 4px 0 0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{padding-left:0;margin:20px 0;border-radius:4px}.pager li,.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.badge,.label{font-weight:700;line-height:1;white-space:nowrap;text-align:center}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;color:#fff;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;color:#fff;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.media-object,.thumbnail{display:block}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.jumbotron,.jumbotron .h1,.jumbotron h1{color:inherit}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;background-color:#eee}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.alert,.thumbnail{margin-bottom:20px}.alert .alert-link,.close{font-weight:700}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.modal,.modal-backdrop{top:0;right:0;bottom:0;left:0}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-striped .progress-bar-info,.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.panel-heading>.dropdown .dropdown-toggle,.panel-title,.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-title,.panel>.list-group,.panel>.panel-collapse>.list-group,.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-title{margin-top:0;font-size:16px}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel-group .panel-heading,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.list-group+.panel-footer,.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.popover,.tooltip{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.42857143;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;line-break:auto;text-decoration:none}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal{position:fixed;z-index:1050;display:none;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-size:12px;text-align:left;text-align:start;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px}.tooltip.top-right .tooltip-arrow{left:5px}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{border-width:0 5px 5px;border-bottom-color:#000;top:0}.tooltip.bottom .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.bottom-left .tooltip-arrow{right:5px;margin-top:-5px}.tooltip.bottom-right .tooltip-arrow{left:5px;margin-top:-5px}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-size:14px;text-align:left;text-align:start;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.carousel-caption,.carousel-control{color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.6);text-align:center}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.carousel,.carousel-inner{position:relative}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.left>.arrow:after,.popover.right>.arrow:after{bottom:-10px;content:" "}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;border-right-width:0;border-left-color:#fff}.carousel-inner{width:100%}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px}.carousel-caption .btn,.text-hide{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.fa.fa-pull-left,.fa.pull-left{margin-right:.3em}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.hidden,.visible-lg,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;background-color:transparent;border:0}.affix{position:fixed}@-ms-viewport{width:device-width}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}.visible-xs-block{display:block!important}.visible-xs-inline{display:inline!important}.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}.visible-sm-block{display:block!important}.visible-sm-inline{display:inline!important}.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}.visible-md-block{display:block!important}.visible-md-inline{display:inline!important}.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}.visible-lg-block{display:block!important}.visible-lg-inline{display:inline!important}.visible-lg-inline-block{display:inline-block!important}.hidden-lg{display:none!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}.hidden-print{display:none!important}}.fa,.fa-stack{display:inline-block}/*! + * Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(../fonts/fontawesome-webfont.eot?v=4.5.0);src:url(../fonts/fontawesome-webfont.eot?#iefix&v=4.5.0) format('embedded-opentype'),url(../fonts/fontawesome-webfont.woff2?v=4.5.0) format('woff2'),url(../fonts/fontawesome-webfont.woff?v=4.5.0) format('woff'),url(../fonts/fontawesome-webfont.ttf?v=4.5.0) format('truetype'),url(../fonts/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular) format('svg');font-weight:400;font-style:normal}.fa{font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa.fa-pull-right,.fa.pull-right{margin-left:.3em}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{filter:none}.fa-stack{position:relative;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-close:before,.fa-remove:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-repeat:before,.fa-rotate-right:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-exclamation-triangle:before,.fa-warning:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-floppy-o:before,.fa-save:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-bolt:before,.fa-flash:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-chain-broken:before,.fa-unlink:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"\f150"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"\f151"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"\f152"}.fa-eur:before,.fa-euro:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-inr:before,.fa-rupee:before{content:"\f156"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"\f158"}.fa-krw:before,.fa-won:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-try:before,.fa-turkish-lira:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-bank:before,.fa-institution:before,.fa-university:before{content:"\f19c"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:"\f1c5"}.fa-file-archive-o:before,.fa-file-zip-o:before{content:"\f1c6"}.fa-file-audio-o:before,.fa-file-sound-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-empire:before,.fa-ge:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-paper-plane:before,.fa-send:before{content:"\f1d8"}.fa-paper-plane-o:before,.fa-send-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-bed:before,.fa-hotel:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-y-combinator:before,.fa-yc:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-television:before,.fa-tv:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.angular-ui-tree-empty{border:1px dashed #bbb;min-height:100px;background-color:#e5e5e5;background-image:-webkit-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),-webkit-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-image:-moz-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),-moz-linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-image:linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff),linear-gradient(45deg,#fff 25%,transparent 25%,transparent 75%,#fff 75%,#fff);background-size:60px 60px;background-position:0 0,30px 30px}.gantt-scrollable,.gantt-scrollable-header{border-left:1px solid #ddd;border-right:1px solid #ddd}.gantt-header-row,.gantt-side-header-row{border-top:1px solid #ddd;white-space:nowrap}.gantt-header-row-last,.gantt-side-header-row{border-bottom:1px solid #ddd}.angular-ui-tree-nodes{position:relative;margin:0;padding:0;list-style:none}.angular-ui-tree-nodes .angular-ui-tree-nodes{padding-left:20px}.angular-ui-tree-node,.angular-ui-tree-placeholder{position:relative;margin:0;padding:0;min-height:20px;line-height:20px}.angular-ui-tree-hidden{display:none}.angular-ui-tree-placeholder{margin:5px 0;padding:0;min-height:30px}.gantt-labels-header-row,.gantt-row-label span.gantt-label-text,.gantt-side-header-row{padding-left:12px;padding-right:12px}.angular-ui-tree-handle{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.angular-ui-tree-drag{position:absolute;pointer-events:none;z-index:999;opacity:.8}.gantt{line-height:normal}.gantt-scrollable{overflow-x:auto}.gantt-scrollable-header{overflow-x:hidden}.gantt-header,.gantt-side,.gantt-task{cursor:default;z-index:10}.gantt-header{overflow:hidden}.gantt-row-label{overflow:hidden;white-space:nowrap}.gantt-valign-container{height:100%}.gantt-valign-content{position:relative;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.gantt-side-background{position:absolute;height:100%;width:100%}.gantt-side-background-body{overflow:hidden}.gantt-side-content{position:relative;vertical-align:top;white-space:nowrap;overflow:hidden}.gantt-side-content>div.side-element{display:inline-block}.gantt-header-columns{position:relative;height:100%}.gantt-side{float:left;position:relative}.gantt-header-row{box-sizing:border-box;height:2em}.gantt-header-row .gantt-column-header{position:absolute;border-right:1px solid #ddd;box-sizing:border-box;display:inline-block;height:2em;text-align:center;padding-top:.5em;overflow:hidden;text-overflow:clip}.gantt-header-row .gantt-column-header-last{position:absolute;border-right:none}.gantt-foreground-col,.gantt-foreground-col-current-date,.gantt-foreground-col-nonworkhour{position:absolute;box-sizing:border-box;display:inline-block;height:100%;border-right:1px solid #ddd}.gantt-foreground-col-nonworkhour{background-color:rgba(200,200,200,.3)}.gantt-column-header-last,.gantt-column-last{border-right:none}.gantt-side-background-header{position:relative}.gantt-side-header-row{position:absolute;bottom:0;width:100%;overflow:hidden}.gantt-body{position:relative;height:100%}.gantt-body-rows{overflow-x:hidden;overflow-y:hidden}.gantt-body-background,.gantt-body-foreground{position:absolute;height:100%;width:100%}.gantt-body-columns{position:absolute;height:100%}.gantt-resizer{position:absolute;z-index:1;right:-6px;top:0;width:12px;height:100%}.gantt-resizer-enabled{cursor:ew-resize}.gantt-resizer-display{margin-left:auto;margin-right:auto;width:4px;background-color:#DDD;background-image:-webkit-linear-gradient(0deg,transparent 50%,rgba(255,255,255,.5) 50%);background-image:linear-gradient(90deg,transparent 50%,rgba(255,255,255,.5) 50%);background-size:2px 2px;height:100%}.gantt-timeframe{position:absolute;box-sizing:border-box;height:100%}.gantt-timeframe-non-working{background-color:#d3d3d3;opacity:.3}.gantt-foreground-col-current-date{background-color:green;opacity:.6}.gantt-row-background,.gantt-row-content{position:absolute;width:100%;height:100%}.gantt-row-even>.gantt-row-background{background-color:#EFEFEF}.gantt-row{position:relative}.gantt-row-height{height:2em}.gantt-task,.gantt-task-milestone{position:absolute;margin:auto;top:0;bottom:0;min-width:.6em;height:80%}.gantt-current-date-line,.gantt-task-background,.gantt-task-content,.gantt-task-foreground,.gantt-timespan{height:100%;position:absolute}.gantt-task-background{width:100%;background-color:grey;border-radius:2px}.gantt-task-foreground{width:100%}.gantt-task-content{width:100%;text-align:center;vertical-align:middle;overflow:hidden;white-space:nowrap}.gantt-task-content>span{margin-left:8px;margin-right:8px}.gantt-task-truncated-left{position:absolute;top:0;bottom:0;left:.3em}.gantt-task-truncated-right{position:absolute;top:0;bottom:0;right:.3em}.gantt-task-group-right-main,.gantt-task-group-right-symbol{right:-6px}.gantt-task-truncated-left,.gantt-task-truncated-right{color:#fff;font-size:1.5em;font-weight:bolder}.gantt-timespan{box-sizing:border-box;display:inline-block;color:#000;background-color:rgba(158,158,158,.5);border-left:1px solid rgba(158,158,158,1);border-right:1px solid rgba(158,158,158,1)}.gantt-current-date-line{border:1px dotted green;opacity:.6}.unselectable{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.gantt-task-bounds{height:125%;top:-12.5%;position:absolute;z-index:99;border:1px dashed;pointer-events:none}.gantt-task-bounds-in{border-color:#2E4F2E}.gantt-task-bounds-out{border-color:tomato}.gantt .gantt-body-dependencies{position:absolute;height:100%;width:100%}.gantt .gantt-endpoint.jsplumb-endpoint-anchor{z-index:20;overflow:hidden}.gantt .gantt-endpoint.fallback-endpoint.jsplumb-endpoint-anchor{z-index:auto;overflow:hidden}.gantt .gantt-endpoint-overlay.fallback-endpoint{height:4px;width:40px;top:-2px}.gantt .gantt-endpoint-overlay.start-endpoint.fallback-endpoint{left:-45px;background-image:-webkit-linear-gradient(left,rgba(255,255,255,0),#456);background-image:linear-gradient(to right,rgba(255,255,255,0),#456)}.gantt .gantt-endpoint-overlay.end-endpoint.fallback-endpoint{left:-5px;background-image:-webkit-linear-gradient(right,rgba(255,255,255,0),#456);background-image:linear-gradient(to left,rgba(255,255,255,0),#456)}.gantt .jsplumb-overlay{z-index:20}.gantt .gantt-endpoint-overlay{position:absolute}.gantt .gantt-endpoint-overlay.arrow-right{width:0;height:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000}.gantt .gantt-endpoint-overlay.arrow-right.start-endpoint{top:-5px;left:-11px;border-left-color:#4040a0}.gantt .gantt-endpoint-overlay.arrow-right.end-endpoint{top:-5px;left:6px;border-left-color:#40a040}.gantt-task-group-left-main,.gantt-task-group-left-symbol{left:-6px}.gantt .gantt-endpoint.source-endpoint svg *{fill:#40a040}.gantt .gantt-endpoint.target-endpoint svg *{fill:#4040a0}.gantt-task-group{position:absolute;background:#6388cd;height:30%;top:-25%;bottom:0;margin:auto}.gantt-task-group-left-main,.gantt-task-group-right-main{position:absolute;width:12px;height:100%;background:#6388cd;top:0;bottom:0;margin:auto 0}.gantt-task-group-left-symbol,.gantt-task-group-right-symbol{position:absolute;width:0;height:50%;top:75%;bottom:0;border-left:6px solid transparent;border-right:6px solid transparent;border-top:12px solid #6388cd}.gantt-task-overview{height:40%;top:40%;-webkit-filter:grayscale(.6);filter:grayscale(.6)}.gantt-task-overview .gantt-task-content{display:none}.gantt-labels-header-row{box-sizing:border-box;height:2em;white-space:nowrap;overflow:hidden}.gantt-labels-header-row span{box-sizing:border-box;display:inline-block;height:2em;text-align:center;padding-top:.5em;overflow:hidden;text-overflow:clip}.gantt-labels-header-row-last{border-bottom:1px solid #ddd}.gantt-labels-body,.gantt-labels-header{overflow:hidden}.gantt-task-moving,.gantt-task-resizing{z-index:750!important;opacity:.6;-webkit-filter:grayscale(.7);filter:grayscale(.7)}.gantt-task-overlaps{border:2px solid #e00000}.gantt-task-progress{position:absolute;overflow:hidden;bottom:0;height:6px;border-radius:2px}.gantt-row-label.on-dragging{background-color:#999!important}.gantt-row-label.on-drag-hover{border:1px solid #999}.gantt-table-header{overflow:hidden;position:relative}.gantt-table-header-row{position:absolute;bottom:0;width:100%}.gantt-table-header-row span.gantt-label-text{font-weight:700;white-space:nowrap;display:inline-block;padding-top:.5em;overflow:hidden;text-overflow:clip}div.gantt-table-content{overflow:hidden}.gantt-side-content-table>div.gantt-table-column{display:inline-block;overflow:hidden}.gantt-task-info{position:fixed;background:#fff;border:1px solid rgba(0,0,0,.2);border-radius:4px;box-shadow:0 5px 10px rgba(0,0,0,.2);padding:9px 12px;z-index:999}.gantt-tree-body .gantt-row-label span.gantt-label-text,.gantt-tree-body ol{padding-left:0}.gantt-task-info-content{line-height:1.1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gantt-task-infoArrow:before,.gantt-task-infoArrowR:before{position:absolute;top:100%;width:0;height:0;border-top:8px solid rgba(0,0,0,.1);border-right:8px solid transparent;border-left:8px solid transparent;content:''}.gantt-task-infoArrow:before{left:10px}.gantt-task-infoArrowR:before{right:10px}.gantt-task-infoArrow:after,.gantt-task-infoArrowR:after{position:absolute;top:100%;width:0;height:0;border-top:7px solid #fff;border-right:7px solid transparent;border-left:7px solid transparent;content:''}.gantt-task-infoArrow:after{left:11px}.gantt-task-infoArrowR:after{right:11px}.gantt-row-label-background{position:absolute;width:100%}.gantt-tree-body .gantt-row-label span{margin:0}.gantt-tree-body .gantt-row-label a.gantt-tree-handle-button,.gantt-tree-body .gantt-row-label span.gantt-tree-handle{padding:0;position:relative}.gantt-tree-header{overflow:hidden;position:relative}.gantt-tree-body{overflow:hidden}.gantt-tree-header-row{position:absolute;bottom:0;width:100%}.gantt-tree-header-row span.gantt-label-text{display:inline-block;padding-top:.5em;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:clip}.angular-ui-tree-handle{cursor:inherit;text-decoration:inherit;font-weight:inherit;min-height:inherit;line-height:inherit}.gantt-side-content-tree .gantt-tree-handle-button{pointer-events:auto} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/css/main.css b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/css/main.css index 558fbaf981d1d5e6f442b677be6c4e0886d4e740..b10049662143e7c3e73c7ddec645132e80332618 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/css/main.css +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/css/main.css @@ -22,3 +22,44 @@ .datepicker-wrapper ul { /* visibility: hidden; */ } + +.ui-layout-row > .ui-splitbar { + height: 8px; + background-color: #888888; +} + +.ui-layout-column > .ui-splitbar { + width: 8px; + background-color: #888888; +} + +.gantt-current-date-line { + border: 3px solid #222222; + opacity: 0.7; + z-index: 100000; +} + +.gantt-side { + width: 150px; +} + +.top-stretch { + top: 20px; +} + +.gantt-task.claim-status-claimed { + border-bottom: 4px solid #ffa64d; +} + +.gantt-task.claim-status-conflict { + border-bottom: 4px solid #ff0000; +} + +.gantt-task.claim-status-allocated { + border-bottom: 4px solid #66ff66; +} + +.gantt-task.claim-status-mixed { + border-bottom: 4px solid #bfbfbf; +} + diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-bounds-plugin.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-bounds-plugin.js index 2f3ca952c23d0173c9d428a4d77ffcba89b4c0ee..2d5ba7e2603b96ea0e66876b7d759b16c523c4e3 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-bounds-plugin.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-bounds-plugin.js @@ -1,5 +1,5 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-bounds-plugin.min.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-bounds-plugin.min.js index 02b37d52d55eb131d94ef7b4b130cfea2b6a35b3..24995e231c5920d232157320c036051d274a8d81 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-bounds-plugin.min.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-bounds-plugin.min.js @@ -1,5 +1,5 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-bounds-plugin.min.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-bounds-plugin.min.js.map index 61431d7079c3b732d9bbbead60804115ea63edec..7c5eaf8e9e515d6c0f9d039d5e5fc498d73319ea 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-bounds-plugin.min.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-bounds-plugin.min.js.map @@ -1 +1 @@ -{"version":3,"file":"angular-gantt-bounds-plugin.min.js","sources":["../src/plugins/bounds.js","../src/plugins/bounds/taskBounds.directive.js","../.tmp/generated/plugins/bounds/html2js.js"],"names":["angular","module","directive","moment","$compile","$document","restrict","require","scope","enabled","link","element","attrs","ganttCtrl","api","gantt","options","option","bounds","undefined","directives","on","directiveName","taskScope","taskElement","boundsScope","$new","pluginScope","ifElement","createElement","attr","boundsElement","templateUrl","template","append","tasks","clean","model","est","isMoment","lct","$templateCache","tElement","tAttrs","put","replace","controller","$scope","$element","toggleClass","simplifyMoment","d","unix","$watchGroup","left","task","rowsManager","getPositionByDate","right","css","from","to","bind","raise","$on","destroy","run"],"mappings":"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"} \ No newline at end of file +{"version":3,"sources":["../src/plugins/bounds.js","../src/plugins/bounds/taskBounds.directive.js","../.tmp/generated/plugins/bounds/html2js.js"],"names":["angular","module","directive","moment","$compile","$document","restrict","require","scope","enabled","link","element","attrs","ganttCtrl","api","gantt","options","option","bounds","undefined","directives","on","directiveName","taskScope","taskElement","boundsScope","$new","pluginScope","ifElement","createElement","attr","boundsElement","templateUrl","template","append","tasks","clean","model","est","isMoment","lct","$templateCache","tElement","tAttrs","put","replace","controller","$scope","$element","toggleClass","simplifyMoment","d","unix","$watchGroup","left","task","rowsManager","getPositionByDate","right","css","from","to","bind","raise","$on","destroy","run"],"mappings":"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","file":"angular-gantt-bounds-plugin.min.js"} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.css b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.css new file mode 100644 index 0000000000000000000000000000000000000000..bba088397af8f0d71f5743ee3ab1f50939f35421 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.css @@ -0,0 +1,69 @@ +.gantt .gantt-body-dependencies { + position: absolute; + height: 100%; + width: 100%; +} + +.gantt .gantt-endpoint.jsplumb-endpoint-anchor { + z-index: 20; /* z-index must be higher than tasks z-index */ + overflow: hidden; +} + +.gantt .gantt-endpoint.fallback-endpoint.jsplumb-endpoint-anchor { + z-index: auto; + overflow: hidden; +} + +.gantt .gantt-endpoint-overlay.fallback-endpoint { + height: 4px; + width: 40px; + top: -2px; +} + +.gantt .gantt-endpoint-overlay.start-endpoint.fallback-endpoint { + left: -45px; + background-image:-webkit-linear-gradient(left, rgba(255,255,255,0), #456); + background-image:linear-gradient(to right, rgba(255,255,255,0), #456); +} + +.gantt .gantt-endpoint-overlay.end-endpoint.fallback-endpoint { + left: -5px; + background-image:-webkit-linear-gradient(right, rgba(255,255,255,0), #456); + background-image:linear-gradient(to left, rgba(255,255,255,0), #456); +} + +.gantt .jsplumb-overlay { + z-index: 20; +} + +.gantt .gantt-endpoint-overlay { + position: absolute; +} + +.gantt .gantt-endpoint-overlay.arrow-right { + width: 0; + height: 0; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid black; +} + +.gantt .gantt-endpoint-overlay.arrow-right.start-endpoint { + top: -5px; + left: -11px; + border-left-color: rgb(64, 64, 160); /* blue */ +} + +.gantt .gantt-endpoint-overlay.arrow-right.end-endpoint { + top: -5px; + left: 6px; + border-left-color: rgb(64, 160, 64); /* green */ +} + +.gantt .gantt-endpoint.source-endpoint svg * { + fill: rgb(64, 160, 64); /* green */ +} + +.gantt .gantt-endpoint.target-endpoint svg * { + fill: rgb(64, 64, 160); /* blue */ +} diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.js new file mode 100644 index 0000000000000000000000000000000000000000..6b1c5fe92618ea78ee520ab8327a1653383e5ab7 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.js @@ -0,0 +1,962 @@ +/* +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS +Authors: Marco Schweighauser, Rémi Alvergnat +License: MIT +Homepage: https://www.angular-gantt.com +Github: https://github.com/angular-gantt/angular-gantt.git +*/ +(function() { + 'use strict'; + angular.module('gantt.dependencies', ['gantt', 'gantt.dependencies.templates']).directive('ganttDependencies', ['$timeout', '$document', 'ganttDebounce', 'GanttDependenciesManager', function($timeout, $document, debounce, DependenciesManager) { + return { + restrict: 'E', + require: '^gantt', + scope: { + enabled: '=?', + jsPlumbDefaults: '=?', + endpoints: '=?', + fallbackEndpoints: '=?' + }, + link: function(scope, element, attrs, ganttCtrl) { + var api = ganttCtrl.gantt.api; + + // Load options from global options attribute. + if (scope.options && typeof(scope.options.dependencies) === 'object') { + for (var option in scope.options.dependencies) { + scope[option] = scope.options[option]; + } + } + + if (scope.enabled === undefined) { + scope.enabled = true; + } + + if (scope.jsPlumbDefaults === undefined) { + // https://jsplumbtoolkit.com/community/doc/defaults.html + scope.jsPlumbDefaults = { + Endpoint: ['Dot', {radius: 4}], + EndpointStyle: {fillStyle: '#456', strokeStyle: '#456', lineWidth: 1}, + Connector: 'Flowchart', + ConnectionOverlays: [['Arrow', {location: 1, length: 12, width: 12}]] + }; + } + + function createLeftOverlay() { + return angular.element('<span><span class="gantt-endpoint-overlay start-endpoint arrow-right"></span></span>'); + } + + function createRightOverlay() { + return angular.element('<span><span class="gantt-endpoint-overlay end-endpoint arrow-right"></span></span>'); + } + + function createLeftFallbackOverlay() { + return angular.element('<span><span class="gantt-endpoint-overlay start-endpoint fallback-endpoint"></span></span>'); + } + + function createRightFallbackOverlay() { + return angular.element('<span><span class="gantt-endpoint-overlay end-endpoint fallback-endpoint"></span></span>'); + } + + if (scope.endpoints === undefined) { + scope.endpoints = [ + { + anchor: 'Left', + isSource: false, + isTarget: true, + maxConnections: -1, + cssClass: 'gantt-endpoint start-endpoint target-endpoint', + overlays: [ + ['Custom', {create: createLeftOverlay}] + ] + + }, + { + anchor: 'Right', + isSource: true, + isTarget: false, + maxConnections: -1, + cssClass: 'gantt-endpoint end-endpoint source-endpoint', + overlays: [ + ['Custom', {create: createRightOverlay}] + ] + } + ]; + } + + if (scope.fallbackEndpoints === undefined) { + scope.fallbackEndpoints = [ + { + endpoint: 'Blank', + anchor: 'Left', + isSource: false, + isTarget: true, + maxConnections: 0, + cssClass: 'gantt-endpoint start-endpoint fallback-endpoint', + overlays: [ + ['Custom', {create: createLeftFallbackOverlay}] + ] + }, + { + endpoint: 'Blank', + anchor: 'Right', + isSource: true, + isTarget: false, + maxConnections: 0, + cssClass: 'gantt-endpoint end-endpoint fallback-endpoint', + overlays: [ + ['Custom', {create: createRightFallbackOverlay}] + ] + } + ]; + } + + var manager = new DependenciesManager(ganttCtrl.gantt, scope, api); + + api.directives.on.new(scope, function(directiveName, directiveScope, directiveElement) { + if (directiveName === 'ganttBody') { + manager.plumb.setContainer(directiveElement); + } + }); + + api.tasks.on.add(scope, function(task) { + manager.addDependenciesFromTask(task); + }); + + api.tasks.on.remove(scope, function(task) { + manager.removeDependenciesFromTask(task); + }); + + api.tasks.on.displayed(scope, debounce(function(tasks) { + manager.setTasks(tasks); + manager.refresh(); + })); + + api.rows.on.displayed(scope, function() { + manager.refresh(); + }); + + api.tasks.on.viewChange(scope, function(task) { + if (task.$element) { + manager.plumb.revalidate(task.$element[0]); + } + }); + + api.tasks.on.viewRowChange(scope, function(task) { + manager.setTask(task); + }); + + } + }; + }]); +}()); + + +(function() { + 'use strict'; + + angular.module('gantt.dependencies').factory('GanttDependenciesEvents', [function() { + /** + * Creates a new DependenciesEvents object. + * + * @param manager DependenciesManager object + * @constructor + */ + var DependenciesEvents = function(manager) { + var self = this; + + this.manager = manager; + + // Deny drop on the same task. + var denyDropOnSameTask = function(params) { + return params.sourceId !== params.targetId; + }; + + this.manager.plumb.bind('beforeDrop', denyDropOnSameTask); + + + // Notify the manager that a connection is being created. + this.manager.plumb.bind('connectionDrag', function(connection) { + self.manager.setDraggingConnection(connection); + }); + + this.manager.plumb.bind('connectionDragStop', function() { + self.manager.setDraggingConnection(undefined); + }); + + this.manager.plumb.bind('beforeDrop', function() { + self.manager.setDraggingConnection(undefined); + return true; + }); + + var createConnection = function(info, mouseEvent) { + if (mouseEvent) { + var oldDependency; + if (info.connection.$dependency) { + oldDependency = info.connection.$dependency; + } + + var sourceEndpoint = info.sourceEndpoint; + var targetEndpoint = info.targetEndpoint; + + var sourceModel = sourceEndpoint.$task.model; + + var dependenciesModel = sourceModel.dependencies; + if (dependenciesModel === undefined) { + dependenciesModel = []; + sourceModel.dependencies = dependenciesModel; + } + + var connectionModel = {to: targetEndpoint.$task.model.id}; + dependenciesModel.push(connectionModel); + + if (oldDependency) { + oldDependency.removeFromTaskModel(); + self.manager.removeDependency(oldDependency, true); // Connection will be disconnected later by jsPlumb. + } + + var dependency = self.manager.addDependency(sourceEndpoint.$task, connectionModel); + info.connection.$dependency = dependency; + dependency.connection = info.connection; + + self.manager.api.dependencies.raise.add(dependency); + + } + }; + + var updateConnection = function(info, mouseEvent) { + if (mouseEvent) { + var oldDependency; + if (info.connection.$dependency) { + oldDependency = info.connection.$dependency; + } + + var sourceEndpoint = info.newSourceEndpoint; + var targetEndpoint = info.newTargetEndpoint; + + var sourceModel = sourceEndpoint.$task.model; + + var dependenciesModel = sourceModel.dependencies; + if (dependenciesModel === undefined) { + dependenciesModel = []; + sourceModel.dependencies = dependenciesModel; + } + + var connectionModel = {to: targetEndpoint.$task.model.id}; + dependenciesModel.push(connectionModel); + + if (oldDependency) { + oldDependency.removeFromTaskModel(); + self.manager.removeDependency(oldDependency, true); // Connection will be disconnected later by jsPlumb. + } + + var dependency = self.manager.addDependency(sourceEndpoint.$task, connectionModel); + info.connection.$dependency = dependency; + dependency.connection = info.connection; + + self.manager.api.dependencies.raise.change(dependency, oldDependency); + } + }; + + var deleteConnection = function(info, mouseEvent) { + if (mouseEvent) { + var dependency = info.connection.$dependency; + + dependency.removeFromTaskModel(); + self.manager.removeDependency(dependency, true); // Connection will be disconnected later by jsPlumb. + self.manager.api.dependencies.raise.remove(dependency); + } + }; + + this.manager.plumb.bind('connectionMoved', updateConnection); + this.manager.plumb.bind('connection', createConnection); + this.manager.plumb.bind('connectionDetached', deleteConnection); + + }; + return DependenciesEvents; + }]); +}()); + +/* globals jsPlumb */ +(function() { + 'use strict'; + + angular.module('gantt.dependencies').factory('GanttDependenciesManager', ['GanttDependency', 'GanttDependenciesEvents', 'GanttDependencyTaskMouseHandler', function(Dependency, DependenciesEvents, TaskMouseHandler) { + var DependenciesManager = function(gantt, pluginScope, api) { + var self = this; + + this.gantt = gantt; + this.pluginScope = pluginScope; + this.api = api; + + this.api.registerEvent('dependencies', 'add'); + this.api.registerEvent('dependencies', 'change'); + this.api.registerEvent('dependencies', 'remove'); + + this.plumb = jsPlumb.getInstance(); + this.plumb.importDefaults(this.pluginScope.jsPlumbDefaults); + + this.dependenciesFrom = {}; + this.dependenciesTo = {}; + + this.tasks = {}; + + this.events = new DependenciesEvents(this); + + this.pluginScope.$watch('enabled', function(newValue, oldValue) { + if (newValue !== oldValue) { + self.refresh(); + } + + }); + + this.pluginScope.$watch('jsPlumbDefaults', function(newValue, oldValue) { + if (newValue !== oldValue) { + self.plumb.importDefaults(newValue); + self.refresh(); + } + }, true); + + /** + * Add all dependencies defined from a task. Dependencies will be added only if plugin is enabled. + * + * @param task + */ + this.addDependenciesFromTask = function(task) { + if (this.pluginScope.enabled) { + var taskDependencies = task.model.dependencies; + + if (taskDependencies !== undefined) { + if (!angular.isArray(taskDependencies)) { + taskDependencies = [taskDependencies]; + task.model.dependencies = taskDependencies; + } + + for (var i = 0, l = taskDependencies.length; i < l; i++) { + var dependency = self.addDependency(task, taskDependencies[i]); + dependency.connect(); + } + } + } + }; + + /** + * Remove all dependencies defined for a task. + * + * @param task + * @param keepConnection if true, dependency will not be disconnected. + */ + this.removeDependenciesFromTask = function(task, keepConnection) { + var dependencies = this.getTaskDependencies(task); + + if (dependencies) { + for (var i = 0; i < dependencies.length; i++) { + if (!keepConnection) { + dependencies[i].disconnect(); + } + self.removeDependency(dependencies[i]); + } + } + }; + + /** + * Add definition of a dependency. + * + * @param task Task defining the dependency. + * @param model Model object for the dependency. + */ + this.addDependency = function(task, model) { + var dependency = new Dependency(this, task, model); + + var fromTaskId = dependency.getFromTaskId(); + var toTaskId = dependency.getToTaskId(); + + if (!(fromTaskId in this.dependenciesFrom)) { + this.dependenciesFrom[fromTaskId] = []; + } + if (!(toTaskId in this.dependenciesTo)) { + this.dependenciesTo[toTaskId] = []; + } + + if (fromTaskId) { + this.dependenciesFrom[fromTaskId].push(dependency); + } + + if (toTaskId) { + this.dependenciesTo[toTaskId].push(dependency); + } + + return dependency; + }; + + /** + * Remove definition of a dependency + * + * @param dependency Dependency object + * @param keepConnection if true, dependency will not be disconnected. + */ + this.removeDependency = function(dependency, keepConnection) { + var fromDependencies = this.dependenciesFrom[dependency.getFromTaskId()]; + var fromRemove = []; + var i; + + if (fromDependencies) { + for (i = 0; i < fromDependencies.length; i++) { + if (dependency === fromDependencies[i]) { + fromRemove.push(dependency); + } + } + } + + var toDependencies = this.dependenciesTo[dependency.getToTaskId()]; + var toRemove = []; + + if (toDependencies) { + for (i = 0; i < toDependencies.length; i++) { + if (dependency === toDependencies[i]) { + toRemove.push(dependency); + } + } + } + + for (i = 0; i < fromRemove.length; i++) { + if (!keepConnection) { + fromRemove[i].disconnect(); + } + fromDependencies.splice(fromDependencies.indexOf(dependency), 1); + } + + for (i = 0; i < toRemove.length; i++) { + if (!keepConnection) { + toRemove[i].disconnect(); + } + toDependencies.splice(toDependencies.indexOf(dependency), 1); + } + + if (this.dependenciesFrom[dependency.getFromTaskId()] && + this.dependenciesFrom[dependency.getFromTaskId()].length === 0) { + delete this.dependenciesFrom[dependency.getFromTaskId()]; + } + + if (this.dependenciesTo[dependency.getToTaskId()] && + this.dependenciesTo[dependency.getToTaskId()].length === 0) { + delete this.dependenciesTo[dependency.getToTaskId()]; + } + }; + + this.getTaskDependencies = function(task) { + var dependencies = []; + + var fromDependencies = self.dependenciesFrom[task.model.id]; + if (fromDependencies) { + dependencies = dependencies.concat(fromDependencies); + } + + var toDependencies = self.dependenciesTo[task.model.id]; + if (toDependencies) { + dependencies = dependencies.concat(toDependencies); + } + + return dependencies; + }; + + this.setDraggingConnection = function(connection) { + if (connection) { + self.draggingConnection = connection; + angular.forEach(self.tasks, function(task) { + task.dependencies.mouseHandler.release(); + }); + } else { + self.draggingConnection = undefined; + angular.forEach(self.tasks, function(task) { + task.dependencies.mouseHandler.install(); + }); + } + }; + + var addTaskEndpoints = function(task) { + if (!task.dependencies) { + task.dependencies = {}; + } + + task.dependencies.endpoints = []; + + if (self.pluginScope.endpoints) { + for (var i = 0; i < self.pluginScope.endpoints.length; i++) { + var endpointObject = self.plumb.addEndpoint(task.$element, self.pluginScope.endpoints[i]); + endpointObject.$task = task; + task.dependencies.endpoints.push(endpointObject); + } + } + + }; + + var removeTaskEndpoint = function(task) { + for (var i = 0; i < task.dependencies.endpoints.length; i++) { + var endpointObject = task.dependencies.endpoints[i]; + self.plumb.deleteEndpoint(endpointObject); + endpointObject.$task = undefined; + } + + task.dependencies.endpoints = undefined; + }; + + var addTaskMouseHandler = function(task) { + if (!task.dependencies) { + task.dependencies = {}; + } + + task.dependencies.mouseHandler = new TaskMouseHandler(self, task); + task.dependencies.mouseHandler.install(); + }; + + var removeTaskMouseHandler = function(task) { + task.dependencies.mouseHandler.release(); + task.dependencies.mouseHandler = undefined; + }; + + /** + * Set tasks objects that can be used to display dependencies. + * + * @param tasks + */ + this.setTasks = function(tasks) { + angular.forEach(self.tasks, function(task) { + removeTaskMouseHandler(task); + removeTaskEndpoint(task); + }); + + var newTasks = {}; + for (var i = 0; i < tasks.length; i++) { + var task = tasks[i]; + newTasks[task.model.id] = task; + addTaskEndpoints(task); + addTaskMouseHandler(task); + } + self.tasks = newTasks; + }; + + var disconnectTaskDependencies = function(task) { + var dependencies = self.getTaskDependencies(task); + if (dependencies) { + for (var i = 0; i < dependencies.length; i++) { + dependencies[i].disconnect(); + } + } + return dependencies; + }; + + var connectTaskDependencies = function(task) { + var dependencies = self.getTaskDependencies(task); + if (dependencies) { + for (var i = 0; i < dependencies.length; i++) { + dependencies[i].connect(); + } + } + return dependencies; + }; + + /** + * Set task object in replacement of an existing with the same id. + * + * @param task + */ + this.setTask = function(task) { + self.plumb.setSuspendDrawing(true); + try { + var oldTask = self.tasks[task.model.id]; + if (oldTask !== undefined) { + disconnectTaskDependencies(oldTask); + removeTaskMouseHandler(oldTask); + removeTaskEndpoint(oldTask); + } + self.tasks[task.model.id] = task; + addTaskEndpoints(task); + addTaskMouseHandler(task); + connectTaskDependencies(task); + } finally { + self.plumb.setSuspendDrawing(false, true); + } + }; + + /** + * Retrieve the task from it's id. + * + * @param taskId id of the task element to retrieve. + * @returns {*} + */ + this.getTask = function(taskId) { + return self.tasks[taskId]; + }; + + var getSourceEndpoints = function(task) { + return task.dependencies.endpoints.filter(function(endpoint) { + return endpoint.isSource; + }); + }; + + var getTargetEndpoints = function(task) { + return task.dependencies.endpoints.filter(function(endpoint) { + return endpoint.isTarget; + }); + }; + + /** + * Connects two tasks together using source endpoint from fromTask and target endpoint from toTask. + * + * @param fromTask + * @param toTask + * @param model + * @returns connection object + */ + this.connect = function(fromTask, toTask, model) { + var sourceEndpoints = getSourceEndpoints(fromTask); + var targetEndpoints = getTargetEndpoints(toTask); + if (sourceEndpoints && targetEndpoints) { + var sourceEndpoint; + var targetEndpoint; + + if (model.connectParameters && model.connectParameters.sourceEndpointIndex) { + sourceEndpoint = sourceEndpoints[model.connectParameters.sourceEndpointIndex]; + } else { + sourceEndpoint = sourceEndpoints[0]; + } + + if (model.connectParameters && model.connectParameters.targetEndpointIndex) { + targetEndpoint = targetEndpoints[model.connectParameters.targetEndpointIndex]; + } else { + targetEndpoint = targetEndpoints[0]; + } + + var connection = self.plumb.connect({ + source: sourceEndpoint, + target: targetEndpoint + }, model.connectParameters); + return connection; + } + }; + + /** + * Get all defined dependencies. + * + * @returns {Array} + */ + this.getDependencies = function() { + var allDependencies = []; + + angular.forEach(this.dependenciesFrom, function(dependencies) { + for (var i = 0; i < dependencies.length; i++) { + if (!(dependencies[i] in allDependencies)) { + allDependencies.push(dependencies[i]); + } + } + }); + + return allDependencies; + }; + + /** + * Refresh jsplumb status based on tasks dependencies models. + */ + this.refresh = function(tasks) { + self.plumb.setSuspendDrawing(true); + + try { + var tasksDependencies; + var i; + if (tasks && !angular.isArray(tasks)) { + tasks = [tasks]; + } + + if (tasks === undefined) { + tasks = this.tasks; + tasksDependencies = this.getDependencies(); + } else { + tasksDependencies = []; + angular.forEach(tasks, function(task) { + var taskDependencies = self.getTaskDependencies(task); + angular.forEach(taskDependencies, function(taskDependency) { + if (!(taskDependency in tasksDependencies)) { + tasksDependencies.push(taskDependency); + } + }); + }); + } + + for (i = 0; i < tasksDependencies.length; i++) { + self.removeDependency(tasksDependencies[i]); + } + + angular.forEach(tasks, function(task) { + self.addDependenciesFromTask(task); + }); + } finally { + self.plumb.setSuspendDrawing(false, true); + } + }; + + this.api.registerMethod('dependencies', 'refresh', this.refresh, this); + }; + return DependenciesManager; + }]); +}()); + +(function() { + 'use strict'; + + angular.module('gantt.dependencies').factory('GanttDependency', ['ganttUtils', 'ganttDom', function(utils, dom) { + /** + * Constructor of Dependency object. + * + * @param manager Dependency manager used by this dependency + * @param task Task declaring the dependency + * @param model model of the dependency + * + * @constructor + * + * @see https://jsplumbtoolkit.com/community/apidocs/classes/jsPlumb.html#method_connect + */ + var Dependency = function(manager, task, model) { + var self = this; + + this.manager = manager; + this.task = task; + this.model = model; + this.connection = undefined; + this.fallbackEndpoints = []; + + /** + * Check if this dependency is connected. + * + * @returns {boolean} + */ + this.isConnected = function() { + if (this.connection) { + return true; + } + return false; + }; + + /** + * Disconnect this dependency. + */ + this.disconnect = function() { + if (this.connection) { + if (this.connection.endpoints) { + this.manager.plumb.detach(this.connection); + } + this.connection.$dependency = undefined; + this.connection = undefined; + } + + this.deleteFallbackEndpoints(); + }; + + this.deleteFallbackEndpoints = function() { + if (this.fallbackEndpoints) { + for (var i=0; i<this.fallbackEndpoints.length; i++) { + self.manager.plumb.deleteEndpoint(this.fallbackEndpoints[i]); + } + this.fallbackEndpoints = []; + } + }; + + this.getFromTaskId = function() { + if (this.model.from !== undefined) { + return this.model.from; + } + return this.task.model.id; + }; + + this.getToTaskId = function() { + if (this.model.to !== undefined) { + return this.model.to; + } + return this.task.model.id; + }; + + this.getFromTask = function() { + if (this.model.from !== undefined) { + return this.manager.getTask(this.model.from); + } + return this.task; + }; + + this.getToTask = function() { + if (this.model.to !== undefined) { + return this.manager.getTask(this.model.to); + } + return this.task; + }; + + this.removeFromTaskModel = function() { + var modelIndex = utils.angularIndexOf(this.task.model.dependencies, this.model); + if (modelIndex >= 0) { + this.task.model.dependencies.splice(modelIndex, 1); + } + return modelIndex; + }; + + var isTaskVisible = function(task) { + if (task === undefined || task.$element === undefined) { + return false; + } + var element = task.$element[0]; + return dom.isElementVisible(element); + }; + + /** + * Connect this dependency if both elements are available. + * + * @returns {boolean} + */ + this.connect = function() { + var fromTask = this.getFromTask(); + var toTask = this.getToTask(); + + if (!isTaskVisible(fromTask)) { + fromTask = undefined; + } + + if (!isTaskVisible(toTask)) { + toTask = undefined; + } + + if (fromTask && toTask) { + var connection = this.manager.connect(fromTask, toTask, this.model); + if (connection) { + connection.$dependency = this; + this.connection = connection; + return true; + } + } + + this.deleteFallbackEndpoints(); + if (fromTask !== undefined) { + var toFallbackEndpoint = this.manager.pluginScope.fallbackEndpoints[1]; + this.fallbackEndpoints.push(this.manager.plumb.addEndpoint(fromTask.$element, toFallbackEndpoint)); + } + if (toTask !== undefined) { + var fromFallbackEndpoint = this.manager.pluginScope.fallbackEndpoints[0]; + this.fallbackEndpoints.push(this.manager.plumb.addEndpoint(toTask.$element, fromFallbackEndpoint)); + } + return false; + }; + }; + return Dependency; + }]); +}()); + +(function() { + 'use strict'; + + angular.module('gantt.dependencies').factory('GanttDependencyTaskMouseHandler', ['$timeout', function($timeout) { + var TaskMouseHandler = function(manager, task) { + var self = this; + + this.manager = manager; + this.task = task; + this.installed = false; + this.elementHandlers = []; + + this.display = true; + this.hideEndpointsPromise = undefined; + + /** + * Handler for a single DOM element. + * + * @param element + * @constructor + */ + var ElementHandler = function(element) { + this.element = element; + + this.mouseExitHandler = function() { + $timeout.cancel(self.hideEndpointsPromise); + self.hideEndpointsPromise = $timeout(self.hideEndpoints, 1000, false); + }; + + this.mouseEnterHandler = function() { + $timeout.cancel(self.hideEndpointsPromise); + self.displayEndpoints(); + }; + + this.install = function() { + this.element.bind('mouseenter', this.mouseEnterHandler); + this.element.bind('mouseleave', this.mouseExitHandler); + }; + + this.release = function() { + this.element.unbind('mouseenter', this.mouseEnterHandler); + this.element.unbind('mouseleave', this.mouseExitHandler); + $timeout.cancel(self.hideEndpointsPromise); + }; + + }; + + + + /** + * Install mouse handler for this task, and hide all endpoints. + */ + this.install = function() { + if (!self.installed) { + self.hideEndpoints(); + + self.elementHandlers.push(new ElementHandler(self.task.getContentElement())); + angular.forEach(self.task.dependencies.endpoints, function(endpoint) { + self.elementHandlers.push(new ElementHandler(angular.element(endpoint.canvas))); + }); + + angular.forEach(self.elementHandlers, function(elementHandler) { + elementHandler.install(); + }); + + self.installed = true; + } + }; + + /** + * Release mouse handler for this task, and display all endpoints. + */ + this.release = function() { + if (self.installed) { + angular.forEach(self.elementHandlers, function(elementHandler) { + elementHandler.release(); + }); + + self.elementHandlers = []; + + self.displayEndpoints(); + self.installed = false; + } + }; + + /** + * Display all endpoints for this task. + */ + this.displayEndpoints = function() { + self.display = true; + angular.forEach(self.task.dependencies.endpoints, function(endpoint) { + endpoint.setVisible(true, true, true); + }); + }; + + /** + * Hide all endpoints for this task. + */ + this.hideEndpoints = function() { + angular.forEach(self.task.dependencies.endpoints, function(endpoint) { + endpoint.setVisible(false, true, true); + }); + self.display = false; + }; + }; + return TaskMouseHandler; + }]); +}()); + +angular.module('gantt.dependencies.templates', []).run(['$templateCache', function($templateCache) { + +}]); + +//# sourceMappingURL=angular-gantt-dependencies-plugin.js.map \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.js.map new file mode 100644 index 0000000000000000000000000000000000000000..2a4386467fe7df1533326acd830d29b480660dda --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/plugins/dependencies.js","../src/plugins/dependencies/dependenciesEvents.factory.js","../src/plugins/dependencies/dependenciesManager.factory.js","../src/plugins/dependencies/dependency.factory.js","../src/plugins/dependencies/taskMouseHandler.factory.js","../.tmp/generated/plugins/dependencies/html2js.js"],"names":[],"mappings":"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","file":"angular-gantt-dependencies-plugin.js","sourcesContent":["(function() {\n 'use strict';\n angular.module('gantt.dependencies', ['gantt', 'gantt.dependencies.templates']).directive('ganttDependencies', ['$timeout', '$document', 'ganttDebounce', 'GanttDependenciesManager', function($timeout, $document, debounce, DependenciesManager) {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n jsPlumbDefaults: '=?',\n endpoints: '=?',\n fallbackEndpoints: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.dependencies) === 'object') {\n for (var option in scope.options.dependencies) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.jsPlumbDefaults === undefined) {\n // https://jsplumbtoolkit.com/community/doc/defaults.html\n scope.jsPlumbDefaults = {\n Endpoint: ['Dot', {radius: 4}],\n EndpointStyle: {fillStyle: '#456', strokeStyle: '#456', lineWidth: 1},\n Connector: 'Flowchart',\n ConnectionOverlays: [['Arrow', {location: 1, length: 12, width: 12}]]\n };\n }\n\n function createLeftOverlay() {\n return angular.element('<span><span class=\"gantt-endpoint-overlay start-endpoint arrow-right\"></span></span>');\n }\n\n function createRightOverlay() {\n return angular.element('<span><span class=\"gantt-endpoint-overlay end-endpoint arrow-right\"></span></span>');\n }\n\n function createLeftFallbackOverlay() {\n return angular.element('<span><span class=\"gantt-endpoint-overlay start-endpoint fallback-endpoint\"></span></span>');\n }\n\n function createRightFallbackOverlay() {\n return angular.element('<span><span class=\"gantt-endpoint-overlay end-endpoint fallback-endpoint\"></span></span>');\n }\n\n if (scope.endpoints === undefined) {\n scope.endpoints = [\n {\n anchor: 'Left',\n isSource: false,\n isTarget: true,\n maxConnections: -1,\n cssClass: 'gantt-endpoint start-endpoint target-endpoint',\n overlays: [\n ['Custom', {create: createLeftOverlay}]\n ]\n\n },\n {\n anchor: 'Right',\n isSource: true,\n isTarget: false,\n maxConnections: -1,\n cssClass: 'gantt-endpoint end-endpoint source-endpoint',\n overlays: [\n ['Custom', {create: createRightOverlay}]\n ]\n }\n ];\n }\n\n if (scope.fallbackEndpoints === undefined) {\n scope.fallbackEndpoints = [\n {\n endpoint: 'Blank',\n anchor: 'Left',\n isSource: false,\n isTarget: true,\n maxConnections: 0,\n cssClass: 'gantt-endpoint start-endpoint fallback-endpoint',\n overlays: [\n ['Custom', {create: createLeftFallbackOverlay}]\n ]\n },\n {\n endpoint: 'Blank',\n anchor: 'Right',\n isSource: true,\n isTarget: false,\n maxConnections: 0,\n cssClass: 'gantt-endpoint end-endpoint fallback-endpoint',\n overlays: [\n ['Custom', {create: createRightFallbackOverlay}]\n ]\n }\n ];\n }\n\n var manager = new DependenciesManager(ganttCtrl.gantt, scope, api);\n\n api.directives.on.new(scope, function(directiveName, directiveScope, directiveElement) {\n if (directiveName === 'ganttBody') {\n manager.plumb.setContainer(directiveElement);\n }\n });\n\n api.tasks.on.add(scope, function(task) {\n manager.addDependenciesFromTask(task);\n });\n\n api.tasks.on.remove(scope, function(task) {\n manager.removeDependenciesFromTask(task);\n });\n\n api.tasks.on.displayed(scope, debounce(function(tasks) {\n manager.setTasks(tasks);\n manager.refresh();\n }));\n\n api.rows.on.displayed(scope, function() {\n manager.refresh();\n });\n\n api.tasks.on.viewChange(scope, function(task) {\n if (task.$element) {\n manager.plumb.revalidate(task.$element[0]);\n }\n });\n\n api.tasks.on.viewRowChange(scope, function(task) {\n manager.setTask(task);\n });\n\n }\n };\n }]);\n}());\n\n","(function() {\n 'use strict';\n\n angular.module('gantt.dependencies').factory('GanttDependenciesEvents', [function() {\n /**\n * Creates a new DependenciesEvents object.\n *\n * @param manager DependenciesManager object\n * @constructor\n */\n var DependenciesEvents = function(manager) {\n var self = this;\n\n this.manager = manager;\n\n // Deny drop on the same task.\n var denyDropOnSameTask = function(params) {\n return params.sourceId !== params.targetId;\n };\n\n this.manager.plumb.bind('beforeDrop', denyDropOnSameTask);\n\n\n // Notify the manager that a connection is being created.\n this.manager.plumb.bind('connectionDrag', function(connection) {\n self.manager.setDraggingConnection(connection);\n });\n\n this.manager.plumb.bind('connectionDragStop', function() {\n self.manager.setDraggingConnection(undefined);\n });\n\n this.manager.plumb.bind('beforeDrop', function() {\n self.manager.setDraggingConnection(undefined);\n return true;\n });\n\n var createConnection = function(info, mouseEvent) {\n if (mouseEvent) {\n var oldDependency;\n if (info.connection.$dependency) {\n oldDependency = info.connection.$dependency;\n }\n\n var sourceEndpoint = info.sourceEndpoint;\n var targetEndpoint = info.targetEndpoint;\n\n var sourceModel = sourceEndpoint.$task.model;\n\n var dependenciesModel = sourceModel.dependencies;\n if (dependenciesModel === undefined) {\n dependenciesModel = [];\n sourceModel.dependencies = dependenciesModel;\n }\n\n var connectionModel = {to: targetEndpoint.$task.model.id};\n dependenciesModel.push(connectionModel);\n\n if (oldDependency) {\n oldDependency.removeFromTaskModel();\n self.manager.removeDependency(oldDependency, true); // Connection will be disconnected later by jsPlumb.\n }\n\n var dependency = self.manager.addDependency(sourceEndpoint.$task, connectionModel);\n info.connection.$dependency = dependency;\n dependency.connection = info.connection;\n\n self.manager.api.dependencies.raise.add(dependency);\n\n }\n };\n\n var updateConnection = function(info, mouseEvent) {\n if (mouseEvent) {\n var oldDependency;\n if (info.connection.$dependency) {\n oldDependency = info.connection.$dependency;\n }\n\n var sourceEndpoint = info.newSourceEndpoint;\n var targetEndpoint = info.newTargetEndpoint;\n\n var sourceModel = sourceEndpoint.$task.model;\n\n var dependenciesModel = sourceModel.dependencies;\n if (dependenciesModel === undefined) {\n dependenciesModel = [];\n sourceModel.dependencies = dependenciesModel;\n }\n\n var connectionModel = {to: targetEndpoint.$task.model.id};\n dependenciesModel.push(connectionModel);\n\n if (oldDependency) {\n oldDependency.removeFromTaskModel();\n self.manager.removeDependency(oldDependency, true); // Connection will be disconnected later by jsPlumb.\n }\n\n var dependency = self.manager.addDependency(sourceEndpoint.$task, connectionModel);\n info.connection.$dependency = dependency;\n dependency.connection = info.connection;\n\n self.manager.api.dependencies.raise.change(dependency, oldDependency);\n }\n };\n\n var deleteConnection = function(info, mouseEvent) {\n if (mouseEvent) {\n var dependency = info.connection.$dependency;\n\n dependency.removeFromTaskModel();\n self.manager.removeDependency(dependency, true); // Connection will be disconnected later by jsPlumb.\n self.manager.api.dependencies.raise.remove(dependency);\n }\n };\n\n this.manager.plumb.bind('connectionMoved', updateConnection);\n this.manager.plumb.bind('connection', createConnection);\n this.manager.plumb.bind('connectionDetached', deleteConnection);\n\n };\n return DependenciesEvents;\n }]);\n}());\n","/* globals jsPlumb */\n(function() {\n 'use strict';\n\n angular.module('gantt.dependencies').factory('GanttDependenciesManager', ['GanttDependency', 'GanttDependenciesEvents', 'GanttDependencyTaskMouseHandler', function(Dependency, DependenciesEvents, TaskMouseHandler) {\n var DependenciesManager = function(gantt, pluginScope, api) {\n var self = this;\n\n this.gantt = gantt;\n this.pluginScope = pluginScope;\n this.api = api;\n\n this.api.registerEvent('dependencies', 'add');\n this.api.registerEvent('dependencies', 'change');\n this.api.registerEvent('dependencies', 'remove');\n\n this.plumb = jsPlumb.getInstance();\n this.plumb.importDefaults(this.pluginScope.jsPlumbDefaults);\n\n this.dependenciesFrom = {};\n this.dependenciesTo = {};\n\n this.tasks = {};\n\n this.events = new DependenciesEvents(this);\n\n this.pluginScope.$watch('enabled', function(newValue, oldValue) {\n if (newValue !== oldValue) {\n self.refresh();\n }\n\n });\n\n this.pluginScope.$watch('jsPlumbDefaults', function(newValue, oldValue) {\n if (newValue !== oldValue) {\n self.plumb.importDefaults(newValue);\n self.refresh();\n }\n }, true);\n\n /**\n * Add all dependencies defined from a task. Dependencies will be added only if plugin is enabled.\n *\n * @param task\n */\n this.addDependenciesFromTask = function(task) {\n if (this.pluginScope.enabled) {\n var taskDependencies = task.model.dependencies;\n\n if (taskDependencies !== undefined) {\n if (!angular.isArray(taskDependencies)) {\n taskDependencies = [taskDependencies];\n task.model.dependencies = taskDependencies;\n }\n\n for (var i = 0, l = taskDependencies.length; i < l; i++) {\n var dependency = self.addDependency(task, taskDependencies[i]);\n dependency.connect();\n }\n }\n }\n };\n\n /**\n * Remove all dependencies defined for a task.\n *\n * @param task\n * @param keepConnection if true, dependency will not be disconnected.\n */\n this.removeDependenciesFromTask = function(task, keepConnection) {\n var dependencies = this.getTaskDependencies(task);\n\n if (dependencies) {\n for (var i = 0; i < dependencies.length; i++) {\n if (!keepConnection) {\n dependencies[i].disconnect();\n }\n self.removeDependency(dependencies[i]);\n }\n }\n };\n\n /**\n * Add definition of a dependency.\n *\n * @param task Task defining the dependency.\n * @param model Model object for the dependency.\n */\n this.addDependency = function(task, model) {\n var dependency = new Dependency(this, task, model);\n\n var fromTaskId = dependency.getFromTaskId();\n var toTaskId = dependency.getToTaskId();\n\n if (!(fromTaskId in this.dependenciesFrom)) {\n this.dependenciesFrom[fromTaskId] = [];\n }\n if (!(toTaskId in this.dependenciesTo)) {\n this.dependenciesTo[toTaskId] = [];\n }\n\n if (fromTaskId) {\n this.dependenciesFrom[fromTaskId].push(dependency);\n }\n\n if (toTaskId) {\n this.dependenciesTo[toTaskId].push(dependency);\n }\n\n return dependency;\n };\n\n /**\n * Remove definition of a dependency\n *\n * @param dependency Dependency object\n * @param keepConnection if true, dependency will not be disconnected.\n */\n this.removeDependency = function(dependency, keepConnection) {\n var fromDependencies = this.dependenciesFrom[dependency.getFromTaskId()];\n var fromRemove = [];\n var i;\n\n if (fromDependencies) {\n for (i = 0; i < fromDependencies.length; i++) {\n if (dependency === fromDependencies[i]) {\n fromRemove.push(dependency);\n }\n }\n }\n\n var toDependencies = this.dependenciesTo[dependency.getToTaskId()];\n var toRemove = [];\n\n if (toDependencies) {\n for (i = 0; i < toDependencies.length; i++) {\n if (dependency === toDependencies[i]) {\n toRemove.push(dependency);\n }\n }\n }\n\n for (i = 0; i < fromRemove.length; i++) {\n if (!keepConnection) {\n fromRemove[i].disconnect();\n }\n fromDependencies.splice(fromDependencies.indexOf(dependency), 1);\n }\n\n for (i = 0; i < toRemove.length; i++) {\n if (!keepConnection) {\n toRemove[i].disconnect();\n }\n toDependencies.splice(toDependencies.indexOf(dependency), 1);\n }\n\n if (this.dependenciesFrom[dependency.getFromTaskId()] &&\n this.dependenciesFrom[dependency.getFromTaskId()].length === 0) {\n delete this.dependenciesFrom[dependency.getFromTaskId()];\n }\n\n if (this.dependenciesTo[dependency.getToTaskId()] &&\n this.dependenciesTo[dependency.getToTaskId()].length === 0) {\n delete this.dependenciesTo[dependency.getToTaskId()];\n }\n };\n\n this.getTaskDependencies = function(task) {\n var dependencies = [];\n\n var fromDependencies = self.dependenciesFrom[task.model.id];\n if (fromDependencies) {\n dependencies = dependencies.concat(fromDependencies);\n }\n\n var toDependencies = self.dependenciesTo[task.model.id];\n if (toDependencies) {\n dependencies = dependencies.concat(toDependencies);\n }\n\n return dependencies;\n };\n\n this.setDraggingConnection = function(connection) {\n if (connection) {\n self.draggingConnection = connection;\n angular.forEach(self.tasks, function(task) {\n task.dependencies.mouseHandler.release();\n });\n } else {\n self.draggingConnection = undefined;\n angular.forEach(self.tasks, function(task) {\n task.dependencies.mouseHandler.install();\n });\n }\n };\n\n var addTaskEndpoints = function(task) {\n if (!task.dependencies) {\n task.dependencies = {};\n }\n\n task.dependencies.endpoints = [];\n\n if (self.pluginScope.endpoints) {\n for (var i = 0; i < self.pluginScope.endpoints.length; i++) {\n var endpointObject = self.plumb.addEndpoint(task.$element, self.pluginScope.endpoints[i]);\n endpointObject.$task = task;\n task.dependencies.endpoints.push(endpointObject);\n }\n }\n\n };\n\n var removeTaskEndpoint = function(task) {\n for (var i = 0; i < task.dependencies.endpoints.length; i++) {\n var endpointObject = task.dependencies.endpoints[i];\n self.plumb.deleteEndpoint(endpointObject);\n endpointObject.$task = undefined;\n }\n\n task.dependencies.endpoints = undefined;\n };\n\n var addTaskMouseHandler = function(task) {\n if (!task.dependencies) {\n task.dependencies = {};\n }\n\n task.dependencies.mouseHandler = new TaskMouseHandler(self, task);\n task.dependencies.mouseHandler.install();\n };\n\n var removeTaskMouseHandler = function(task) {\n task.dependencies.mouseHandler.release();\n task.dependencies.mouseHandler = undefined;\n };\n\n /**\n * Set tasks objects that can be used to display dependencies.\n *\n * @param tasks\n */\n this.setTasks = function(tasks) {\n angular.forEach(self.tasks, function(task) {\n removeTaskMouseHandler(task);\n removeTaskEndpoint(task);\n });\n\n var newTasks = {};\n for (var i = 0; i < tasks.length; i++) {\n var task = tasks[i];\n newTasks[task.model.id] = task;\n addTaskEndpoints(task);\n addTaskMouseHandler(task);\n }\n self.tasks = newTasks;\n };\n\n var disconnectTaskDependencies = function(task) {\n var dependencies = self.getTaskDependencies(task);\n if (dependencies) {\n for (var i = 0; i < dependencies.length; i++) {\n dependencies[i].disconnect();\n }\n }\n return dependencies;\n };\n\n var connectTaskDependencies = function(task) {\n var dependencies = self.getTaskDependencies(task);\n if (dependencies) {\n for (var i = 0; i < dependencies.length; i++) {\n dependencies[i].connect();\n }\n }\n return dependencies;\n };\n\n /**\n * Set task object in replacement of an existing with the same id.\n *\n * @param task\n */\n this.setTask = function(task) {\n self.plumb.setSuspendDrawing(true);\n try {\n var oldTask = self.tasks[task.model.id];\n if (oldTask !== undefined) {\n disconnectTaskDependencies(oldTask);\n removeTaskMouseHandler(oldTask);\n removeTaskEndpoint(oldTask);\n }\n self.tasks[task.model.id] = task;\n addTaskEndpoints(task);\n addTaskMouseHandler(task);\n connectTaskDependencies(task);\n } finally {\n self.plumb.setSuspendDrawing(false, true);\n }\n };\n\n /**\n * Retrieve the task from it's id.\n *\n * @param taskId id of the task element to retrieve.\n * @returns {*}\n */\n this.getTask = function(taskId) {\n return self.tasks[taskId];\n };\n\n var getSourceEndpoints = function(task) {\n return task.dependencies.endpoints.filter(function(endpoint) {\n return endpoint.isSource;\n });\n };\n\n var getTargetEndpoints = function(task) {\n return task.dependencies.endpoints.filter(function(endpoint) {\n return endpoint.isTarget;\n });\n };\n\n /**\n * Connects two tasks together using source endpoint from fromTask and target endpoint from toTask.\n *\n * @param fromTask\n * @param toTask\n * @param model\n * @returns connection object\n */\n this.connect = function(fromTask, toTask, model) {\n var sourceEndpoints = getSourceEndpoints(fromTask);\n var targetEndpoints = getTargetEndpoints(toTask);\n if (sourceEndpoints && targetEndpoints) {\n var sourceEndpoint;\n var targetEndpoint;\n\n if (model.connectParameters && model.connectParameters.sourceEndpointIndex) {\n sourceEndpoint = sourceEndpoints[model.connectParameters.sourceEndpointIndex];\n } else {\n sourceEndpoint = sourceEndpoints[0];\n }\n\n if (model.connectParameters && model.connectParameters.targetEndpointIndex) {\n targetEndpoint = targetEndpoints[model.connectParameters.targetEndpointIndex];\n } else {\n targetEndpoint = targetEndpoints[0];\n }\n\n var connection = self.plumb.connect({\n source: sourceEndpoint,\n target: targetEndpoint\n }, model.connectParameters);\n return connection;\n }\n };\n\n /**\n * Get all defined dependencies.\n *\n * @returns {Array}\n */\n this.getDependencies = function() {\n var allDependencies = [];\n\n angular.forEach(this.dependenciesFrom, function(dependencies) {\n for (var i = 0; i < dependencies.length; i++) {\n if (!(dependencies[i] in allDependencies)) {\n allDependencies.push(dependencies[i]);\n }\n }\n });\n\n return allDependencies;\n };\n\n /**\n * Refresh jsplumb status based on tasks dependencies models.\n */\n this.refresh = function(tasks) {\n self.plumb.setSuspendDrawing(true);\n\n try {\n var tasksDependencies;\n var i;\n if (tasks && !angular.isArray(tasks)) {\n tasks = [tasks];\n }\n\n if (tasks === undefined) {\n tasks = this.tasks;\n tasksDependencies = this.getDependencies();\n } else {\n tasksDependencies = [];\n angular.forEach(tasks, function(task) {\n var taskDependencies = self.getTaskDependencies(task);\n angular.forEach(taskDependencies, function(taskDependency) {\n if (!(taskDependency in tasksDependencies)) {\n tasksDependencies.push(taskDependency);\n }\n });\n });\n }\n\n for (i = 0; i < tasksDependencies.length; i++) {\n self.removeDependency(tasksDependencies[i]);\n }\n\n angular.forEach(tasks, function(task) {\n self.addDependenciesFromTask(task);\n });\n } finally {\n self.plumb.setSuspendDrawing(false, true);\n }\n };\n\n this.api.registerMethod('dependencies', 'refresh', this.refresh, this);\n };\n return DependenciesManager;\n }]);\n}());\n","(function() {\n 'use strict';\n\n angular.module('gantt.dependencies').factory('GanttDependency', ['ganttUtils', 'ganttDom', function(utils, dom) {\n /**\n * Constructor of Dependency object.\n * \n * @param manager Dependency manager used by this dependency\n * @param task Task declaring the dependency\n * @param model model of the dependency\n *\n * @constructor\n *\n * @see https://jsplumbtoolkit.com/community/apidocs/classes/jsPlumb.html#method_connect\n */\n var Dependency = function(manager, task, model) {\n var self = this;\n\n this.manager = manager;\n this.task = task;\n this.model = model;\n this.connection = undefined;\n this.fallbackEndpoints = [];\n\n /**\n * Check if this dependency is connected.\n *\n * @returns {boolean}\n */\n this.isConnected = function() {\n if (this.connection) {\n return true;\n }\n return false;\n };\n\n /**\n * Disconnect this dependency.\n */\n this.disconnect = function() {\n if (this.connection) {\n if (this.connection.endpoints) {\n this.manager.plumb.detach(this.connection);\n }\n this.connection.$dependency = undefined;\n this.connection = undefined;\n }\n\n this.deleteFallbackEndpoints();\n };\n\n this.deleteFallbackEndpoints = function() {\n if (this.fallbackEndpoints) {\n for (var i=0; i<this.fallbackEndpoints.length; i++) {\n self.manager.plumb.deleteEndpoint(this.fallbackEndpoints[i]);\n }\n this.fallbackEndpoints = [];\n }\n };\n\n this.getFromTaskId = function() {\n if (this.model.from !== undefined) {\n return this.model.from;\n }\n return this.task.model.id;\n };\n\n this.getToTaskId = function() {\n if (this.model.to !== undefined) {\n return this.model.to;\n }\n return this.task.model.id;\n };\n\n this.getFromTask = function() {\n if (this.model.from !== undefined) {\n return this.manager.getTask(this.model.from);\n }\n return this.task;\n };\n\n this.getToTask = function() {\n if (this.model.to !== undefined) {\n return this.manager.getTask(this.model.to);\n }\n return this.task;\n };\n\n this.removeFromTaskModel = function() {\n var modelIndex = utils.angularIndexOf(this.task.model.dependencies, this.model);\n if (modelIndex >= 0) {\n this.task.model.dependencies.splice(modelIndex, 1);\n }\n return modelIndex;\n };\n\n var isTaskVisible = function(task) {\n if (task === undefined || task.$element === undefined) {\n return false;\n }\n var element = task.$element[0];\n return dom.isElementVisible(element);\n };\n\n /**\n * Connect this dependency if both elements are available.\n *\n * @returns {boolean}\n */\n this.connect = function() {\n var fromTask = this.getFromTask();\n var toTask = this.getToTask();\n\n if (!isTaskVisible(fromTask)) {\n fromTask = undefined;\n }\n\n if (!isTaskVisible(toTask)) {\n toTask = undefined;\n }\n\n if (fromTask && toTask) {\n var connection = this.manager.connect(fromTask, toTask, this.model);\n if (connection) {\n connection.$dependency = this;\n this.connection = connection;\n return true;\n }\n }\n\n this.deleteFallbackEndpoints();\n if (fromTask !== undefined) {\n var toFallbackEndpoint = this.manager.pluginScope.fallbackEndpoints[1];\n this.fallbackEndpoints.push(this.manager.plumb.addEndpoint(fromTask.$element, toFallbackEndpoint));\n }\n if (toTask !== undefined) {\n var fromFallbackEndpoint = this.manager.pluginScope.fallbackEndpoints[0];\n this.fallbackEndpoints.push(this.manager.plumb.addEndpoint(toTask.$element, fromFallbackEndpoint));\n }\n return false;\n };\n };\n return Dependency;\n }]);\n}());\n","(function() {\n 'use strict';\n\n angular.module('gantt.dependencies').factory('GanttDependencyTaskMouseHandler', ['$timeout', function($timeout) {\n var TaskMouseHandler = function(manager, task) {\n var self = this;\n\n this.manager = manager;\n this.task = task;\n this.installed = false;\n this.elementHandlers = [];\n\n this.display = true;\n this.hideEndpointsPromise = undefined;\n\n /**\n * Handler for a single DOM element.\n *\n * @param element\n * @constructor\n */\n var ElementHandler = function(element) {\n this.element = element;\n\n this.mouseExitHandler = function() {\n $timeout.cancel(self.hideEndpointsPromise);\n self.hideEndpointsPromise = $timeout(self.hideEndpoints, 1000, false);\n };\n\n this.mouseEnterHandler = function() {\n $timeout.cancel(self.hideEndpointsPromise);\n self.displayEndpoints();\n };\n\n this.install = function() {\n this.element.bind('mouseenter', this.mouseEnterHandler);\n this.element.bind('mouseleave', this.mouseExitHandler);\n };\n\n this.release = function() {\n this.element.unbind('mouseenter', this.mouseEnterHandler);\n this.element.unbind('mouseleave', this.mouseExitHandler);\n $timeout.cancel(self.hideEndpointsPromise);\n };\n\n };\n\n\n\n /**\n * Install mouse handler for this task, and hide all endpoints.\n */\n this.install = function() {\n if (!self.installed) {\n self.hideEndpoints();\n\n self.elementHandlers.push(new ElementHandler(self.task.getContentElement()));\n angular.forEach(self.task.dependencies.endpoints, function(endpoint) {\n self.elementHandlers.push(new ElementHandler(angular.element(endpoint.canvas)));\n });\n\n angular.forEach(self.elementHandlers, function(elementHandler) {\n elementHandler.install();\n });\n\n self.installed = true;\n }\n };\n\n /**\n * Release mouse handler for this task, and display all endpoints.\n */\n this.release = function() {\n if (self.installed) {\n angular.forEach(self.elementHandlers, function(elementHandler) {\n elementHandler.release();\n });\n\n self.elementHandlers = [];\n\n self.displayEndpoints();\n self.installed = false;\n }\n };\n\n /**\n * Display all endpoints for this task.\n */\n this.displayEndpoints = function() {\n self.display = true;\n angular.forEach(self.task.dependencies.endpoints, function(endpoint) {\n endpoint.setVisible(true, true, true);\n });\n };\n\n /**\n * Hide all endpoints for this task.\n */\n this.hideEndpoints = function() {\n angular.forEach(self.task.dependencies.endpoints, function(endpoint) {\n endpoint.setVisible(false, true, true);\n });\n self.display = false;\n };\n };\n return TaskMouseHandler;\n }]);\n}());\n","angular.module('gantt.dependencies.templates', []).run(['$templateCache', function($templateCache) {\n\n}]);\n"]} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.min.css b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.min.css new file mode 100644 index 0000000000000000000000000000000000000000..b354ad7f880b9e7b833b6d85aeb8c3a4859bb7ef --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.min.css @@ -0,0 +1 @@ +.gantt .gantt-body-dependencies{position:absolute;height:100%;width:100%}.gantt .gantt-endpoint.jsplumb-endpoint-anchor{z-index:20;overflow:hidden}.gantt .gantt-endpoint.fallback-endpoint.jsplumb-endpoint-anchor{z-index:auto;overflow:hidden}.gantt .gantt-endpoint-overlay.fallback-endpoint{height:4px;width:40px;top:-2px}.gantt .gantt-endpoint-overlay.start-endpoint.fallback-endpoint{left:-45px;background-image:-webkit-linear-gradient(left,rgba(255,255,255,0),#456);background-image:linear-gradient(to right,rgba(255,255,255,0),#456)}.gantt .gantt-endpoint-overlay.end-endpoint.fallback-endpoint{left:-5px;background-image:-webkit-linear-gradient(right,rgba(255,255,255,0),#456);background-image:linear-gradient(to left,rgba(255,255,255,0),#456)}.gantt .jsplumb-overlay{z-index:20}.gantt .gantt-endpoint-overlay{position:absolute}.gantt .gantt-endpoint-overlay.arrow-right{width:0;height:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000}.gantt .gantt-endpoint-overlay.arrow-right.start-endpoint{top:-5px;left:-11px;border-left-color:#4040a0}.gantt .gantt-endpoint-overlay.arrow-right.end-endpoint{top:-5px;left:6px;border-left-color:#40a040}.gantt .gantt-endpoint.source-endpoint svg *{fill:#40a040}.gantt .gantt-endpoint.target-endpoint svg *{fill:#4040a0} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.min.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.min.js new file mode 100644 index 0000000000000000000000000000000000000000..9c61af0df89abc70e8949a661c353285cd0254e4 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.min.js @@ -0,0 +1,10 @@ +/* +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS +Authors: Marco Schweighauser, Rémi Alvergnat +License: MIT +Homepage: https://www.angular-gantt.com +Github: https://github.com/angular-gantt/angular-gantt.git +*/ + +!function(){"use strict";angular.module("gantt.dependencies",["gantt","gantt.dependencies.templates"]).directive("ganttDependencies",["$timeout","$document","ganttDebounce","GanttDependenciesManager",function(a,b,c,d){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",jsPlumbDefaults:"=?",endpoints:"=?",fallbackEndpoints:"=?"},link:function(a,b,e,f){function g(){return angular.element('<span><span class="gantt-endpoint-overlay start-endpoint arrow-right"></span></span>')}function h(){return angular.element('<span><span class="gantt-endpoint-overlay end-endpoint arrow-right"></span></span>')}function i(){return angular.element('<span><span class="gantt-endpoint-overlay start-endpoint fallback-endpoint"></span></span>')}function j(){return angular.element('<span><span class="gantt-endpoint-overlay end-endpoint fallback-endpoint"></span></span>')}var k=f.gantt.api;if(a.options&&"object"==typeof a.options.dependencies)for(var l in a.options.dependencies)a[l]=a.options[l];void 0===a.enabled&&(a.enabled=!0),void 0===a.jsPlumbDefaults&&(a.jsPlumbDefaults={Endpoint:["Dot",{radius:4}],EndpointStyle:{fillStyle:"#456",strokeStyle:"#456",lineWidth:1},Connector:"Flowchart",ConnectionOverlays:[["Arrow",{location:1,length:12,width:12}]]}),void 0===a.endpoints&&(a.endpoints=[{anchor:"Left",isSource:!1,isTarget:!0,maxConnections:-1,cssClass:"gantt-endpoint start-endpoint target-endpoint",overlays:[["Custom",{create:g}]]},{anchor:"Right",isSource:!0,isTarget:!1,maxConnections:-1,cssClass:"gantt-endpoint end-endpoint source-endpoint",overlays:[["Custom",{create:h}]]}]),void 0===a.fallbackEndpoints&&(a.fallbackEndpoints=[{endpoint:"Blank",anchor:"Left",isSource:!1,isTarget:!0,maxConnections:0,cssClass:"gantt-endpoint start-endpoint fallback-endpoint",overlays:[["Custom",{create:i}]]},{endpoint:"Blank",anchor:"Right",isSource:!0,isTarget:!1,maxConnections:0,cssClass:"gantt-endpoint end-endpoint fallback-endpoint",overlays:[["Custom",{create:j}]]}]);var m=new d(f.gantt,a,k);k.directives.on["new"](a,function(a,b,c){"ganttBody"===a&&m.plumb.setContainer(c)}),k.tasks.on.add(a,function(a){m.addDependenciesFromTask(a)}),k.tasks.on.remove(a,function(a){m.removeDependenciesFromTask(a)}),k.tasks.on.displayed(a,c(function(a){m.setTasks(a),m.refresh()})),k.rows.on.displayed(a,function(){m.refresh()}),k.tasks.on.viewChange(a,function(a){a.$element&&m.plumb.revalidate(a.$element[0])}),k.tasks.on.viewRowChange(a,function(a){m.setTask(a)})}}}])}(),function(){"use strict";angular.module("gantt.dependencies").factory("GanttDependenciesEvents",[function(){var a=function(a){var b=this;this.manager=a;var c=function(a){return a.sourceId!==a.targetId};this.manager.plumb.bind("beforeDrop",c),this.manager.plumb.bind("connectionDrag",function(a){b.manager.setDraggingConnection(a)}),this.manager.plumb.bind("connectionDragStop",function(){b.manager.setDraggingConnection(void 0)}),this.manager.plumb.bind("beforeDrop",function(){return b.manager.setDraggingConnection(void 0),!0});var d=function(a,c){if(c){var d;a.connection.$dependency&&(d=a.connection.$dependency);var e=a.sourceEndpoint,f=a.targetEndpoint,g=e.$task.model,h=g.dependencies;void 0===h&&(h=[],g.dependencies=h);var i={to:f.$task.model.id};h.push(i),d&&(d.removeFromTaskModel(),b.manager.removeDependency(d,!0));var j=b.manager.addDependency(e.$task,i);a.connection.$dependency=j,j.connection=a.connection,b.manager.api.dependencies.raise.add(j)}},e=function(a,c){if(c){var d;a.connection.$dependency&&(d=a.connection.$dependency);var e=a.newSourceEndpoint,f=a.newTargetEndpoint,g=e.$task.model,h=g.dependencies;void 0===h&&(h=[],g.dependencies=h);var i={to:f.$task.model.id};h.push(i),d&&(d.removeFromTaskModel(),b.manager.removeDependency(d,!0));var j=b.manager.addDependency(e.$task,i);a.connection.$dependency=j,j.connection=a.connection,b.manager.api.dependencies.raise.change(j,d)}},f=function(a,c){if(c){var d=a.connection.$dependency;d.removeFromTaskModel(),b.manager.removeDependency(d,!0),b.manager.api.dependencies.raise.remove(d)}};this.manager.plumb.bind("connectionMoved",e),this.manager.plumb.bind("connection",d),this.manager.plumb.bind("connectionDetached",f)};return a}])}(),function(){"use strict";angular.module("gantt.dependencies").factory("GanttDependenciesManager",["GanttDependency","GanttDependenciesEvents","GanttDependencyTaskMouseHandler",function(a,b,c){var d=function(d,e,f){var g=this;this.gantt=d,this.pluginScope=e,this.api=f,this.api.registerEvent("dependencies","add"),this.api.registerEvent("dependencies","change"),this.api.registerEvent("dependencies","remove"),this.plumb=jsPlumb.getInstance(),this.plumb.importDefaults(this.pluginScope.jsPlumbDefaults),this.dependenciesFrom={},this.dependenciesTo={},this.tasks={},this.events=new b(this),this.pluginScope.$watch("enabled",function(a,b){a!==b&&g.refresh()}),this.pluginScope.$watch("jsPlumbDefaults",function(a,b){a!==b&&(g.plumb.importDefaults(a),g.refresh())},!0),this.addDependenciesFromTask=function(a){if(this.pluginScope.enabled){var b=a.model.dependencies;if(void 0!==b){angular.isArray(b)||(b=[b],a.model.dependencies=b);for(var c=0,d=b.length;d>c;c++){var e=g.addDependency(a,b[c]);e.connect()}}}},this.removeDependenciesFromTask=function(a,b){var c=this.getTaskDependencies(a);if(c)for(var d=0;d<c.length;d++)b||c[d].disconnect(),g.removeDependency(c[d])},this.addDependency=function(b,c){var d=new a(this,b,c),e=d.getFromTaskId(),f=d.getToTaskId();return e in this.dependenciesFrom||(this.dependenciesFrom[e]=[]),f in this.dependenciesTo||(this.dependenciesTo[f]=[]),e&&this.dependenciesFrom[e].push(d),f&&this.dependenciesTo[f].push(d),d},this.removeDependency=function(a,b){var c,d=this.dependenciesFrom[a.getFromTaskId()],e=[];if(d)for(c=0;c<d.length;c++)a===d[c]&&e.push(a);var f=this.dependenciesTo[a.getToTaskId()],g=[];if(f)for(c=0;c<f.length;c++)a===f[c]&&g.push(a);for(c=0;c<e.length;c++)b||e[c].disconnect(),d.splice(d.indexOf(a),1);for(c=0;c<g.length;c++)b||g[c].disconnect(),f.splice(f.indexOf(a),1);this.dependenciesFrom[a.getFromTaskId()]&&0===this.dependenciesFrom[a.getFromTaskId()].length&&delete this.dependenciesFrom[a.getFromTaskId()],this.dependenciesTo[a.getToTaskId()]&&0===this.dependenciesTo[a.getToTaskId()].length&&delete this.dependenciesTo[a.getToTaskId()]},this.getTaskDependencies=function(a){var b=[],c=g.dependenciesFrom[a.model.id];c&&(b=b.concat(c));var d=g.dependenciesTo[a.model.id];return d&&(b=b.concat(d)),b},this.setDraggingConnection=function(a){a?(g.draggingConnection=a,angular.forEach(g.tasks,function(a){a.dependencies.mouseHandler.release()})):(g.draggingConnection=void 0,angular.forEach(g.tasks,function(a){a.dependencies.mouseHandler.install()}))};var h=function(a){if(a.dependencies||(a.dependencies={}),a.dependencies.endpoints=[],g.pluginScope.endpoints)for(var b=0;b<g.pluginScope.endpoints.length;b++){var c=g.plumb.addEndpoint(a.$element,g.pluginScope.endpoints[b]);c.$task=a,a.dependencies.endpoints.push(c)}},i=function(a){for(var b=0;b<a.dependencies.endpoints.length;b++){var c=a.dependencies.endpoints[b];g.plumb.deleteEndpoint(c),c.$task=void 0}a.dependencies.endpoints=void 0},j=function(a){a.dependencies||(a.dependencies={}),a.dependencies.mouseHandler=new c(g,a),a.dependencies.mouseHandler.install()},k=function(a){a.dependencies.mouseHandler.release(),a.dependencies.mouseHandler=void 0};this.setTasks=function(a){angular.forEach(g.tasks,function(a){k(a),i(a)});for(var b={},c=0;c<a.length;c++){var d=a[c];b[d.model.id]=d,h(d),j(d)}g.tasks=b};var l=function(a){var b=g.getTaskDependencies(a);if(b)for(var c=0;c<b.length;c++)b[c].disconnect();return b},m=function(a){var b=g.getTaskDependencies(a);if(b)for(var c=0;c<b.length;c++)b[c].connect();return b};this.setTask=function(a){g.plumb.setSuspendDrawing(!0);try{var b=g.tasks[a.model.id];void 0!==b&&(l(b),k(b),i(b)),g.tasks[a.model.id]=a,h(a),j(a),m(a)}finally{g.plumb.setSuspendDrawing(!1,!0)}},this.getTask=function(a){return g.tasks[a]};var n=function(a){return a.dependencies.endpoints.filter(function(a){return a.isSource})},o=function(a){return a.dependencies.endpoints.filter(function(a){return a.isTarget})};this.connect=function(a,b,c){var d=n(a),e=o(b);if(d&&e){var f,h;f=c.connectParameters&&c.connectParameters.sourceEndpointIndex?d[c.connectParameters.sourceEndpointIndex]:d[0],h=c.connectParameters&&c.connectParameters.targetEndpointIndex?e[c.connectParameters.targetEndpointIndex]:e[0];var i=g.plumb.connect({source:f,target:h},c.connectParameters);return i}},this.getDependencies=function(){var a=[];return angular.forEach(this.dependenciesFrom,function(b){for(var c=0;c<b.length;c++)b[c]in a||a.push(b[c])}),a},this.refresh=function(a){g.plumb.setSuspendDrawing(!0);try{var b,c;a&&!angular.isArray(a)&&(a=[a]),void 0===a?(a=this.tasks,b=this.getDependencies()):(b=[],angular.forEach(a,function(a){var c=g.getTaskDependencies(a);angular.forEach(c,function(a){a in b||b.push(a)})}));for(c=0;c<b.length;c++)g.removeDependency(b[c]);angular.forEach(a,function(a){g.addDependenciesFromTask(a)})}finally{g.plumb.setSuspendDrawing(!1,!0)}},this.api.registerMethod("dependencies","refresh",this.refresh,this)};return d}])}(),function(){"use strict";angular.module("gantt.dependencies").factory("GanttDependency",["ganttUtils","ganttDom",function(a,b){var c=function(c,d,e){var f=this;this.manager=c,this.task=d,this.model=e,this.connection=void 0,this.fallbackEndpoints=[],this.isConnected=function(){return this.connection?!0:!1},this.disconnect=function(){this.connection&&(this.connection.endpoints&&this.manager.plumb.detach(this.connection),this.connection.$dependency=void 0,this.connection=void 0),this.deleteFallbackEndpoints()},this.deleteFallbackEndpoints=function(){if(this.fallbackEndpoints){for(var a=0;a<this.fallbackEndpoints.length;a++)f.manager.plumb.deleteEndpoint(this.fallbackEndpoints[a]);this.fallbackEndpoints=[]}},this.getFromTaskId=function(){return void 0!==this.model.from?this.model.from:this.task.model.id},this.getToTaskId=function(){return void 0!==this.model.to?this.model.to:this.task.model.id},this.getFromTask=function(){return void 0!==this.model.from?this.manager.getTask(this.model.from):this.task},this.getToTask=function(){return void 0!==this.model.to?this.manager.getTask(this.model.to):this.task},this.removeFromTaskModel=function(){var b=a.angularIndexOf(this.task.model.dependencies,this.model);return b>=0&&this.task.model.dependencies.splice(b,1),b};var g=function(a){if(void 0===a||void 0===a.$element)return!1;var c=a.$element[0];return b.isElementVisible(c)};this.connect=function(){var a=this.getFromTask(),b=this.getToTask();if(g(a)||(a=void 0),g(b)||(b=void 0),a&&b){var c=this.manager.connect(a,b,this.model);if(c)return c.$dependency=this,this.connection=c,!0}if(this.deleteFallbackEndpoints(),void 0!==a){var d=this.manager.pluginScope.fallbackEndpoints[1];this.fallbackEndpoints.push(this.manager.plumb.addEndpoint(a.$element,d))}if(void 0!==b){var e=this.manager.pluginScope.fallbackEndpoints[0];this.fallbackEndpoints.push(this.manager.plumb.addEndpoint(b.$element,e))}return!1}};return c}])}(),function(){"use strict";angular.module("gantt.dependencies").factory("GanttDependencyTaskMouseHandler",["$timeout",function(a){var b=function(b,c){var d=this;this.manager=b,this.task=c,this.installed=!1,this.elementHandlers=[],this.display=!0,this.hideEndpointsPromise=void 0;var e=function(b){this.element=b,this.mouseExitHandler=function(){a.cancel(d.hideEndpointsPromise),d.hideEndpointsPromise=a(d.hideEndpoints,1e3,!1)},this.mouseEnterHandler=function(){a.cancel(d.hideEndpointsPromise),d.displayEndpoints()},this.install=function(){this.element.bind("mouseenter",this.mouseEnterHandler),this.element.bind("mouseleave",this.mouseExitHandler)},this.release=function(){this.element.unbind("mouseenter",this.mouseEnterHandler),this.element.unbind("mouseleave",this.mouseExitHandler),a.cancel(d.hideEndpointsPromise)}};this.install=function(){d.installed||(d.hideEndpoints(),d.elementHandlers.push(new e(d.task.getContentElement())),angular.forEach(d.task.dependencies.endpoints,function(a){d.elementHandlers.push(new e(angular.element(a.canvas)))}),angular.forEach(d.elementHandlers,function(a){a.install()}),d.installed=!0)},this.release=function(){d.installed&&(angular.forEach(d.elementHandlers,function(a){a.release()}),d.elementHandlers=[],d.displayEndpoints(),d.installed=!1)},this.displayEndpoints=function(){d.display=!0,angular.forEach(d.task.dependencies.endpoints,function(a){a.setVisible(!0,!0,!0)})},this.hideEndpoints=function(){angular.forEach(d.task.dependencies.endpoints,function(a){a.setVisible(!1,!0,!0)}),d.display=!1}};return b}])}(),angular.module("gantt.dependencies.templates",[]).run(["$templateCache",function(a){}]); +//# sourceMappingURL=angular-gantt-dependencies-plugin.min.js.map \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.min.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.min.js.map new file mode 100644 index 0000000000000000000000000000000000000000..1a9a33ed82a02db68752cea3c343217f758581a0 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-dependencies-plugin.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["../src/plugins/dependencies.js","../src/plugins/dependencies/dependenciesEvents.factory.js","../src/plugins/dependencies/dependenciesManager.factory.js","../src/plugins/dependencies/dependency.factory.js","../src/plugins/dependencies/taskMouseHandler.factory.js","../.tmp/generated/plugins/dependencies/html2js.js"],"names":["angular","module","directive","$timeout","$document","debounce","DependenciesManager","restrict","require","scope","enabled","jsPlumbDefaults","endpoints","fallbackEndpoints","link","element","attrs","ganttCtrl","createLeftOverlay","createRightOverlay","createLeftFallbackOverlay","createRightFallbackOverlay","api","gantt","options","option","dependencies","undefined","Endpoint","radius","EndpointStyle","fillStyle","strokeStyle","lineWidth","Connector","ConnectionOverlays","location","length","width","anchor","isSource","isTarget","maxConnections","cssClass","overlays","create","endpoint","manager","directives","on","directiveName","directiveScope","directiveElement","plumb","setContainer","tasks","add","task","addDependenciesFromTask","remove","removeDependenciesFromTask","displayed","setTasks","refresh","rows","viewChange","$element","revalidate","viewRowChange","setTask","factory","DependenciesEvents","self","this","denyDropOnSameTask","params","sourceId","targetId","bind","connection","setDraggingConnection","createConnection","info","mouseEvent","oldDependency","$dependency","sourceEndpoint","targetEndpoint","sourceModel","$task","model","dependenciesModel","connectionModel","to","id","push","removeFromTaskModel","removeDependency","dependency","addDependency","raise","updateConnection","newSourceEndpoint","newTargetEndpoint","change","deleteConnection","Dependency","TaskMouseHandler","pluginScope","registerEvent","jsPlumb","getInstance","importDefaults","dependenciesFrom","dependenciesTo","events","$watch","newValue","oldValue","taskDependencies","isArray","i","l","connect","keepConnection","getTaskDependencies","disconnect","fromTaskId","getFromTaskId","toTaskId","getToTaskId","fromDependencies","fromRemove","toDependencies","toRemove","splice","indexOf","concat","draggingConnection","forEach","mouseHandler","release","install","addTaskEndpoints","endpointObject","addEndpoint","removeTaskEndpoint","deleteEndpoint","addTaskMouseHandler","removeTaskMouseHandler","newTasks","disconnectTaskDependencies","connectTaskDependencies","setSuspendDrawing","oldTask","getTask","taskId","getSourceEndpoints","filter","getTargetEndpoints","fromTask","toTask","sourceEndpoints","targetEndpoints","connectParameters","sourceEndpointIndex","targetEndpointIndex","source","target","getDependencies","allDependencies","tasksDependencies","taskDependency","registerMethod","utils","dom","isConnected","detach","deleteFallbackEndpoints","from","getFromTask","getToTask","modelIndex","angularIndexOf","isTaskVisible","isElementVisible","toFallbackEndpoint","fromFallbackEndpoint","installed","elementHandlers","display","hideEndpointsPromise","ElementHandler","mouseExitHandler","cancel","hideEndpoints","mouseEnterHandler","displayEndpoints","unbind","getContentElement","canvas","elementHandler","setVisible","run","$templateCache"],"mappings":";;;;;;;;CAAC,WACG,YACAA,SAAQC,OAAO,sBAAuB,QAAS,iCAAiCC,UAAU,qBAAsB,WAAY,YAAa,gBAAiB,2BAA4B,SAASC,EAAUC,EAAWC,EAAUC,GAC1N,OACIC,SAAU,IACVC,QAAS,SACTC,OACIC,QAAS,KACTC,gBAAiB,KACjBC,UAAW,KACXC,kBAAmB,MAEvBC,KAAM,SAASL,EAAOM,EAASC,EAAOC,GAwBlC,QAASC,KACL,MAAOlB,SAAQe,QAAQ,wFAG3B,QAASI,KACL,MAAOnB,SAAQe,QAAQ,sFAG3B,QAASK,KACL,MAAOpB,SAAQe,QAAQ,8FAG3B,QAASM,KACL,MAAOrB,SAAQe,QAAQ,4FApC3B,GAAIO,GAAML,EAAUM,MAAMD,GAG1B,IAAIb,EAAMe,SAAkD,gBAAhCf,GAAMe,QAAoB,aAClD,IAAK,GAAIC,KAAUhB,GAAMe,QAAQE,aAC7BjB,EAAMgB,GAAUhB,EAAMe,QAAQC,EAIhBE,UAAlBlB,EAAMC,UACND,EAAMC,SAAU,GAGUiB,SAA1BlB,EAAME,kBAENF,EAAME,iBACFiB,UAAW,OAAQC,OAAQ,IAC3BC,eAAgBC,UAAW,OAAQC,YAAa,OAAQC,UAAW,GACnEC,UAAW,YACXC,qBAAsB,SAAUC,SAAU,EAAGC,OAAQ,GAAIC,MAAO,QAoBhDX,SAApBlB,EAAMG,YACNH,EAAMG,YAEE2B,OAAQ,OACRC,UAAU,EACVC,UAAU,EACVC,eAAgB,GAChBC,SAAU,gDACVC,WACK,UAAWC,OAAQ3B,OAKxBqB,OAAQ,QACRC,UAAU,EACVC,UAAU,EACVC,eAAgB,GAChBC,SAAU,8CACVC,WACK,UAAWC,OAAQ1B,QAMJQ,SAA5BlB,EAAMI,oBACNJ,EAAMI,oBAEEiC,SAAU,QACVP,OAAQ,OACRC,UAAU,EACVC,UAAU,EACVC,eAAgB,EAChBC,SAAU,kDACVC,WACK,UAAWC,OAAQzB,OAIxB0B,SAAU,QACVP,OAAQ,QACRC,UAAU,EACVC,UAAU,EACVC,eAAgB,EAChBC,SAAU,gDACVC,WACK,UAAWC,OAAQxB,OAMpC,IAAI0B,GAAU,GAAIzC,GAAoBW,EAAUM,MAAOd,EAAOa,EAE9DA,GAAI0B,WAAWC,GAAf3B,OAAsBb,EAAO,SAASyC,EAAeC,EAAgBC,GAC3C,cAAlBF,GACAH,EAAQM,MAAMC,aAAaF,KAInC9B,EAAIiC,MAAMN,GAAGO,IAAI/C,EAAO,SAASgD,GAC7BV,EAAQW,wBAAwBD,KAGpCnC,EAAIiC,MAAMN,GAAGU,OAAOlD,EAAO,SAASgD,GAChCV,EAAQa,2BAA2BH,KAGvCnC,EAAIiC,MAAMN,GAAGY,UAAUpD,EAAOJ,EAAS,SAASkD,GAC5CR,EAAQe,SAASP,GACjBR,EAAQgB,aAGZzC,EAAI0C,KAAKf,GAAGY,UAAUpD,EAAO,WACzBsC,EAAQgB,YAGZzC,EAAIiC,MAAMN,GAAGgB,WAAWxD,EAAO,SAASgD,GAChCA,EAAKS,UACLnB,EAAQM,MAAMc,WAAWV,EAAKS,SAAS,MAI/C5C,EAAIiC,MAAMN,GAAGmB,cAAc3D,EAAO,SAASgD,GACvCV,EAAQsB,QAAQZ,aCzInC,WACG,YAEAzD,SAAQC,OAAO,sBAAsBqE,QAAQ,2BAA4B,WAOrE,GAAIC,GAAqB,SAASxB,GAC9B,GAAIyB,GAAOC,IAEXA,MAAK1B,QAAUA,CAGf,IAAI2B,GAAqB,SAASC,GAC9B,MAAOA,GAAOC,WAAaD,EAAOE,SAGtCJ,MAAK1B,QAAQM,MAAMyB,KAAK,aAAcJ,GAItCD,KAAK1B,QAAQM,MAAMyB,KAAK,iBAAkB,SAASC,GAC/CP,EAAKzB,QAAQiC,sBAAsBD,KAGvCN,KAAK1B,QAAQM,MAAMyB,KAAK,qBAAsB,WAC1CN,EAAKzB,QAAQiC,sBAAsBrD,UAGvC8C,KAAK1B,QAAQM,MAAMyB,KAAK,aAAc,WAElC,MADAN,GAAKzB,QAAQiC,sBAAsBrD,SAC5B,GAGX,IAAIsD,GAAmB,SAASC,EAAMC,GAClC,GAAIA,EAAY,CACZ,GAAIC,EACAF,GAAKH,WAAWM,cAChBD,EAAgBF,EAAKH,WAAWM,YAGpC,IAAIC,GAAiBJ,EAAKI,eACtBC,EAAiBL,EAAKK,eAEtBC,EAAcF,EAAeG,MAAMC,MAEnCC,EAAoBH,EAAY9D,YACVC,UAAtBgE,IACAA,KACAH,EAAY9D,aAAeiE,EAG/B,IAAIC,IAAmBC,GAAIN,EAAeE,MAAMC,MAAMI,GACtDH,GAAkBI,KAAKH,GAEnBR,IACAA,EAAcY,sBACdxB,EAAKzB,QAAQkD,iBAAiBb,GAAe,GAGjD,IAAIc,GAAa1B,EAAKzB,QAAQoD,cAAcb,EAAeG,MAAOG,EAClEV,GAAKH,WAAWM,YAAca,EAC9BA,EAAWnB,WAAaG,EAAKH,WAE7BP,EAAKzB,QAAQzB,IAAII,aAAa0E,MAAM5C,IAAI0C,KAK5CG,EAAmB,SAASnB,EAAMC,GAClC,GAAIA,EAAY,CACZ,GAAIC,EACAF,GAAKH,WAAWM,cAChBD,EAAgBF,EAAKH,WAAWM,YAGpC,IAAIC,GAAiBJ,EAAKoB,kBACtBf,EAAiBL,EAAKqB,kBAEtBf,EAAcF,EAAeG,MAAMC,MAEnCC,EAAoBH,EAAY9D,YACVC,UAAtBgE,IACAA,KACAH,EAAY9D,aAAeiE,EAG/B,IAAIC,IAAmBC,GAAIN,EAAeE,MAAMC,MAAMI,GACtDH,GAAkBI,KAAKH,GAEnBR,IACAA,EAAcY,sBACdxB,EAAKzB,QAAQkD,iBAAiBb,GAAe,GAGjD,IAAIc,GAAa1B,EAAKzB,QAAQoD,cAAcb,EAAeG,MAAOG,EAClEV,GAAKH,WAAWM,YAAca,EAC9BA,EAAWnB,WAAaG,EAAKH,WAE7BP,EAAKzB,QAAQzB,IAAII,aAAa0E,MAAMI,OAAON,EAAYd,KAI3DqB,EAAmB,SAASvB,EAAMC,GAClC,GAAIA,EAAY,CACZ,GAAIe,GAAahB,EAAKH,WAAWM,WAEjCa,GAAWF,sBACXxB,EAAKzB,QAAQkD,iBAAiBC,GAAY,GAC1C1B,EAAKzB,QAAQzB,IAAII,aAAa0E,MAAMzC,OAAOuC,IAInDzB,MAAK1B,QAAQM,MAAMyB,KAAK,kBAAmBuB,GAC3C5B,KAAK1B,QAAQM,MAAMyB,KAAK,aAAcG,GACtCR,KAAK1B,QAAQM,MAAMyB,KAAK,qBAAsB2B,GAGlD,OAAOlC,SCxHd,WACG,YAEAvE,SAAQC,OAAO,sBAAsBqE,QAAQ,4BAA6B,kBAAmB,0BAA2B,kCAAmC,SAASoC,EAAYnC,EAAoBoC,GAChM,GAAIrG,GAAsB,SAASiB,EAAOqF,EAAatF,GACnD,GAAIkD,GAAOC,IAEXA,MAAKlD,MAAQA,EACbkD,KAAKmC,YAAcA,EACnBnC,KAAKnD,IAAMA,EAEXmD,KAAKnD,IAAIuF,cAAc,eAAgB,OACvCpC,KAAKnD,IAAIuF,cAAc,eAAgB,UACvCpC,KAAKnD,IAAIuF,cAAc,eAAgB,UAEvCpC,KAAKpB,MAAQyD,QAAQC,cACrBtC,KAAKpB,MAAM2D,eAAevC,KAAKmC,YAAYjG,iBAE3C8D,KAAKwC,oBACLxC,KAAKyC,kBAELzC,KAAKlB,SAELkB,KAAK0C,OAAS,GAAI5C,GAAmBE,MAErCA,KAAKmC,YAAYQ,OAAO,UAAW,SAASC,EAAUC,GAC9CD,IAAaC,GACb9C,EAAKT,YAKbU,KAAKmC,YAAYQ,OAAO,kBAAmB,SAASC,EAAUC,GACtDD,IAAaC,IACb9C,EAAKnB,MAAM2D,eAAeK,GAC1B7C,EAAKT,aAEV,GAOHU,KAAKf,wBAA0B,SAASD,GACpC,GAAIgB,KAAKmC,YAAYlG,QAAS,CAC1B,GAAI6G,GAAmB9D,EAAKiC,MAAMhE,YAElC,IAAyBC,SAArB4F,EAAgC,CAC3BvH,QAAQwH,QAAQD,KACjBA,GAAoBA,GACpB9D,EAAKiC,MAAMhE,aAAe6F,EAG9B,KAAK,GAAIE,GAAI,EAAGC,EAAIH,EAAiBlF,OAAYqF,EAAJD,EAAOA,IAAK,CACrD,GAAIvB,GAAa1B,EAAK2B,cAAc1C,EAAM8D,EAAiBE,GAC3DvB,GAAWyB,cAY3BlD,KAAKb,2BAA6B,SAASH,EAAMmE,GAC7C,GAAIlG,GAAe+C,KAAKoD,oBAAoBpE,EAE5C,IAAI/B,EACA,IAAK,GAAI+F,GAAI,EAAGA,EAAI/F,EAAaW,OAAQoF,IAChCG,GACDlG,EAAa+F,GAAGK,aAEpBtD,EAAKyB,iBAAiBvE,EAAa+F,KAW/ChD,KAAK0B,cAAgB,SAAS1C,EAAMiC,GAChC,GAAIQ,GAAa,GAAIQ,GAAWjC,KAAMhB,EAAMiC,GAExCqC,EAAa7B,EAAW8B,gBACxBC,EAAW/B,EAAWgC,aAiB1B,OAfMH,KAActD,MAAKwC,mBACrBxC,KAAKwC,iBAAiBc,OAEpBE,IAAYxD,MAAKyC,iBACnBzC,KAAKyC,eAAee,OAGpBF,GACAtD,KAAKwC,iBAAiBc,GAAYhC,KAAKG,GAGvC+B,GACAxD,KAAKyC,eAAee,GAAUlC,KAAKG,GAGhCA,GASXzB,KAAKwB,iBAAmB,SAASC,EAAY0B,GACzC,GAEIH,GAFAU,EAAmB1D,KAAKwC,iBAAiBf,EAAW8B,iBACpDI,IAGJ,IAAID,EACA,IAAKV,EAAI,EAAGA,EAAIU,EAAiB9F,OAAQoF,IACjCvB,IAAeiC,EAAiBV,IAChCW,EAAWrC,KAAKG,EAK5B,IAAImC,GAAiB5D,KAAKyC,eAAehB,EAAWgC,eAChDI,IAEJ,IAAID,EACA,IAAKZ,EAAI,EAAGA,EAAIY,EAAehG,OAAQoF,IAC/BvB,IAAemC,EAAeZ,IAC9Ba,EAASvC,KAAKG,EAK1B,KAAKuB,EAAI,EAAGA,EAAIW,EAAW/F,OAAQoF,IAC1BG,GACDQ,EAAWX,GAAGK,aAElBK,EAAiBI,OAAOJ,EAAiBK,QAAQtC,GAAa,EAGlE,KAAKuB,EAAI,EAAGA,EAAIa,EAASjG,OAAQoF,IACxBG,GACDU,EAASb,GAAGK,aAEhBO,EAAeE,OAAOF,EAAeG,QAAQtC,GAAa,EAG1DzB,MAAKwC,iBAAiBf,EAAW8B,kBAC4B,IAA7DvD,KAAKwC,iBAAiBf,EAAW8B,iBAAiB3F,cAC3CoC,MAAKwC,iBAAiBf,EAAW8B,iBAGxCvD,KAAKyC,eAAehB,EAAWgC,gBAC0B,IAAzDzD,KAAKyC,eAAehB,EAAWgC,eAAe7F,cACvCoC,MAAKyC,eAAehB,EAAWgC,gBAI9CzD,KAAKoD,oBAAsB,SAASpE,GAChC,GAAI/B,MAEAyG,EAAmB3D,EAAKyC,iBAAiBxD,EAAKiC,MAAMI,GACpDqC,KACAzG,EAAeA,EAAa+G,OAAON,GAGvC,IAAIE,GAAiB7D,EAAK0C,eAAezD,EAAKiC,MAAMI,GAKpD,OAJIuC,KACA3G,EAAeA,EAAa+G,OAAOJ,IAGhC3G,GAGX+C,KAAKO,sBAAwB,SAASD,GAC9BA,GACAP,EAAKkE,mBAAqB3D,EAC1B/E,QAAQ2I,QAAQnE,EAAKjB,MAAO,SAASE,GACjCA,EAAK/B,aAAakH,aAAaC,cAGnCrE,EAAKkE,mBAAqB/G,OAC1B3B,QAAQ2I,QAAQnE,EAAKjB,MAAO,SAASE,GACjCA,EAAK/B,aAAakH,aAAaE,aAK3C,IAAIC,GAAmB,SAAStF,GAO5B,GANKA,EAAK/B,eACN+B,EAAK/B,iBAGT+B,EAAK/B,aAAad,aAEd4D,EAAKoC,YAAYhG,UACjB,IAAK,GAAI6G,GAAI,EAAGA,EAAIjD,EAAKoC,YAAYhG,UAAUyB,OAAQoF,IAAK,CACxD,GAAIuB,GAAiBxE,EAAKnB,MAAM4F,YAAYxF,EAAKS,SAAUM,EAAKoC,YAAYhG,UAAU6G,GACtFuB,GAAevD,MAAQhC,EACvBA,EAAK/B,aAAad,UAAUmF,KAAKiD,KAMzCE,EAAqB,SAASzF,GAC9B,IAAK,GAAIgE,GAAI,EAAGA,EAAIhE,EAAK/B,aAAad,UAAUyB,OAAQoF,IAAK,CACzD,GAAIuB,GAAiBvF,EAAK/B,aAAad,UAAU6G,EACjDjD,GAAKnB,MAAM8F,eAAeH,GAC1BA,EAAevD,MAAQ9D,OAG3B8B,EAAK/B,aAAad,UAAYe,QAG9ByH,EAAsB,SAAS3F,GAC1BA,EAAK/B,eACN+B,EAAK/B,iBAGT+B,EAAK/B,aAAakH,aAAe,GAAIjC,GAAiBnC,EAAMf,GAC5DA,EAAK/B,aAAakH,aAAaE,WAG/BO,EAAyB,SAAS5F,GAClCA,EAAK/B,aAAakH,aAAaC,UAC/BpF,EAAK/B,aAAakH,aAAejH,OAQrC8C,MAAKX,SAAW,SAASP,GACrBvD,QAAQ2I,QAAQnE,EAAKjB,MAAO,SAASE,GACjC4F,EAAuB5F,GACvByF,EAAmBzF,IAIvB,KAAK,GADD6F,MACK7B,EAAI,EAAGA,EAAIlE,EAAMlB,OAAQoF,IAAK,CACnC,GAAIhE,GAAOF,EAAMkE,EACjB6B,GAAS7F,EAAKiC,MAAMI,IAAMrC,EAC1BsF,EAAiBtF,GACjB2F,EAAoB3F,GAExBe,EAAKjB,MAAQ+F,EAGjB,IAAIC,GAA6B,SAAS9F,GACtC,GAAI/B,GAAe8C,EAAKqD,oBAAoBpE,EAC5C,IAAI/B,EACA,IAAK,GAAI+F,GAAI,EAAGA,EAAI/F,EAAaW,OAAQoF,IACrC/F,EAAa+F,GAAGK,YAGxB,OAAOpG,IAGP8H,EAA0B,SAAS/F,GACnC,GAAI/B,GAAe8C,EAAKqD,oBAAoBpE,EAC5C,IAAI/B,EACA,IAAK,GAAI+F,GAAI,EAAGA,EAAI/F,EAAaW,OAAQoF,IACrC/F,EAAa+F,GAAGE,SAGxB,OAAOjG,GAQX+C,MAAKJ,QAAU,SAASZ,GACpBe,EAAKnB,MAAMoG,mBAAkB,EAC7B,KACI,GAAIC,GAAUlF,EAAKjB,MAAME,EAAKiC,MAAMI,GACpBnE,UAAZ+H,IACAH,EAA2BG,GAC3BL,EAAuBK,GACvBR,EAAmBQ,IAEvBlF,EAAKjB,MAAME,EAAKiC,MAAMI,IAAMrC,EAC5BsF,EAAiBtF,GACjB2F,EAAoB3F,GACpB+F,EAAwB/F,GAC1B,QACEe,EAAKnB,MAAMoG,mBAAkB,GAAO,KAU5ChF,KAAKkF,QAAU,SAASC,GACpB,MAAOpF,GAAKjB,MAAMqG,GAGtB,IAAIC,GAAqB,SAASpG,GAC9B,MAAOA,GAAK/B,aAAad,UAAUkJ,OAAO,SAAShH,GAC/C,MAAOA,GAASN,YAIpBuH,EAAqB,SAAStG,GAC9B,MAAOA,GAAK/B,aAAad,UAAUkJ,OAAO,SAAShH,GAC/C,MAAOA,GAASL,WAYxBgC,MAAKkD,QAAU,SAASqC,EAAUC,EAAQvE,GACtC,GAAIwE,GAAkBL,EAAmBG,GACrCG,EAAkBJ,EAAmBE,EACzC,IAAIC,GAAmBC,EAAiB,CACpC,GAAI7E,GACAC,CAGAD,GADAI,EAAM0E,mBAAqB1E,EAAM0E,kBAAkBC,oBAClCH,EAAgBxE,EAAM0E,kBAAkBC,qBAExCH,EAAgB,GAIjC3E,EADAG,EAAM0E,mBAAqB1E,EAAM0E,kBAAkBE,oBAClCH,EAAgBzE,EAAM0E,kBAAkBE,qBAExCH,EAAgB,EAGrC,IAAIpF,GAAaP,EAAKnB,MAAMsE,SACxB4C,OAAQjF,EACRkF,OAAQjF,GACTG,EAAM0E,kBACT,OAAOrF,KASfN,KAAKgG,gBAAkB,WACnB,GAAIC,KAUJ,OARA1K,SAAQ2I,QAAQlE,KAAKwC,iBAAkB,SAASvF,GAC5C,IAAK,GAAI+F,GAAI,EAAGA,EAAI/F,EAAaW,OAAQoF,IAC/B/F,EAAa+F,IAAMiD,IACrBA,EAAgB3E,KAAKrE,EAAa+F,MAKvCiD,GAMXjG,KAAKV,QAAU,SAASR,GACpBiB,EAAKnB,MAAMoG,mBAAkB,EAE7B,KACI,GAAIkB,GACAlD,CACAlE,KAAUvD,QAAQwH,QAAQjE,KAC1BA,GAASA,IAGC5B,SAAV4B,GACAA,EAAQkB,KAAKlB,MACboH,EAAoBlG,KAAKgG,oBAEzBE,KACA3K,QAAQ2I,QAAQpF,EAAO,SAASE,GAC5B,GAAI8D,GAAmB/C,EAAKqD,oBAAoBpE,EAChDzD,SAAQ2I,QAAQpB,EAAkB,SAASqD,GACjCA,IAAkBD,IACpBA,EAAkB5E,KAAK6E,OAMvC,KAAKnD,EAAI,EAAGA,EAAIkD,EAAkBtI,OAAQoF,IACtCjD,EAAKyB,iBAAiB0E,EAAkBlD,GAG5CzH,SAAQ2I,QAAQpF,EAAO,SAASE,GAC5Be,EAAKd,wBAAwBD,KAEnC,QACEe,EAAKnB,MAAMoG,mBAAkB,GAAO,KAI5ChF,KAAKnD,IAAIuJ,eAAe,eAAgB,UAAWpG,KAAKV,QAASU,MAErE,OAAOnE,SCpad,WACG,YAEAN,SAAQC,OAAO,sBAAsBqE,QAAQ,mBAAoB,aAAc,WAAY,SAASwG,EAAOC,GAYvG,GAAIrE,GAAa,SAAS3D,EAASU,EAAMiC,GACrC,GAAIlB,GAAOC,IAEXA,MAAK1B,QAAUA,EACf0B,KAAKhB,KAAOA,EACZgB,KAAKiB,MAAQA,EACbjB,KAAKM,WAAapD,OAClB8C,KAAK5D,qBAOL4D,KAAKuG,YAAc,WACf,MAAIvG,MAAKM,YACE,GAEJ,GAMXN,KAAKqD,WAAa,WACVrD,KAAKM,aACDN,KAAKM,WAAWnE,WAChB6D,KAAK1B,QAAQM,MAAM4H,OAAOxG,KAAKM,YAEnCN,KAAKM,WAAWM,YAAc1D,OAC9B8C,KAAKM,WAAapD,QAGtB8C,KAAKyG,2BAGTzG,KAAKyG,wBAA0B,WAC3B,GAAIzG,KAAK5D,kBAAmB,CACxB,IAAK,GAAI4G,GAAE,EAAGA,EAAEhD,KAAK5D,kBAAkBwB,OAAQoF,IAC3CjD,EAAKzB,QAAQM,MAAM8F,eAAe1E,KAAK5D,kBAAkB4G,GAE7DhD,MAAK5D,uBAIb4D,KAAKuD,cAAgB,WACjB,MAAwBrG,UAApB8C,KAAKiB,MAAMyF,KACJ1G,KAAKiB,MAAMyF,KAEf1G,KAAKhB,KAAKiC,MAAMI,IAG3BrB,KAAKyD,YAAc,WACf,MAAsBvG,UAAlB8C,KAAKiB,MAAMG,GACJpB,KAAKiB,MAAMG,GAEfpB,KAAKhB,KAAKiC,MAAMI,IAG3BrB,KAAK2G,YAAc,WACf,MAAwBzJ,UAApB8C,KAAKiB,MAAMyF,KACJ1G,KAAK1B,QAAQ4G,QAAQlF,KAAKiB,MAAMyF,MAEpC1G,KAAKhB,MAGhBgB,KAAK4G,UAAY,WACb,MAAsB1J,UAAlB8C,KAAKiB,MAAMG,GACJpB,KAAK1B,QAAQ4G,QAAQlF,KAAKiB,MAAMG,IAEpCpB,KAAKhB,MAGhBgB,KAAKuB,oBAAsB,WACvB,GAAIsF,GAAaR,EAAMS,eAAe9G,KAAKhB,KAAKiC,MAAMhE,aAAc+C,KAAKiB,MAIzE,OAHI4F,IAAc,GACd7G,KAAKhB,KAAKiC,MAAMhE,aAAa6G,OAAO+C,EAAY,GAE7CA,EAGX,IAAIE,GAAgB,SAAS/H,GACzB,GAAa9B,SAAT8B,GAAwC9B,SAAlB8B,EAAKS,SAC3B,OAAO,CAEX,IAAInD,GAAU0C,EAAKS,SAAS,EAC5B,OAAO6G,GAAIU,iBAAiB1K,GAQhC0D,MAAKkD,QAAU,WACX,GAAIqC,GAAWvF,KAAK2G,cAChBnB,EAASxF,KAAK4G,WAUlB,IARKG,EAAcxB,KACfA,EAAWrI,QAGV6J,EAAcvB,KACfA,EAAStI,QAGTqI,GAAYC,EAAQ,CACpB,GAAIlF,GAAaN,KAAK1B,QAAQ4E,QAAQqC,EAAUC,EAAQxF,KAAKiB,MAC7D,IAAIX,EAGA,MAFAA,GAAWM,YAAcZ,KACzBA,KAAKM,WAAaA,GACX,EAKf,GADAN,KAAKyG,0BACYvJ,SAAbqI,EAAwB,CACxB,GAAI0B,GAAqBjH,KAAK1B,QAAQ6D,YAAY/F,kBAAkB,EACpE4D,MAAK5D,kBAAkBkF,KAAKtB,KAAK1B,QAAQM,MAAM4F,YAAYe,EAAS9F,SAAUwH,IAElF,GAAe/J,SAAXsI,EAAsB,CACtB,GAAI0B,GAAuBlH,KAAK1B,QAAQ6D,YAAY/F,kBAAkB,EACtE4D,MAAK5D,kBAAkBkF,KAAKtB,KAAK1B,QAAQM,MAAM4F,YAAYgB,EAAO/F,SAAUyH,IAEhF,OAAO,GAGf,OAAOjF,SC9Id,WACG,YAEA1G,SAAQC,OAAO,sBAAsBqE,QAAQ,mCAAoC,WAAY,SAASnE,GAClG,GAAIwG,GAAmB,SAAS5D,EAASU,GACrC,GAAIe,GAAOC,IAEXA,MAAK1B,QAAUA,EACf0B,KAAKhB,KAAOA,EACZgB,KAAKmH,WAAY,EACjBnH,KAAKoH,mBAELpH,KAAKqH,SAAU,EACfrH,KAAKsH,qBAAuBpK,MAQ5B,IAAIqK,GAAiB,SAASjL,GAC1B0D,KAAK1D,QAAUA,EAEf0D,KAAKwH,iBAAmB,WACpB9L,EAAS+L,OAAO1H,EAAKuH,sBACrBvH,EAAKuH,qBAAuB5L,EAASqE,EAAK2H,cAAe,KAAM,IAGnE1H,KAAK2H,kBAAoB,WACrBjM,EAAS+L,OAAO1H,EAAKuH,sBACrBvH,EAAK6H,oBAGT5H,KAAKqE,QAAU,WACXrE,KAAK1D,QAAQ+D,KAAK,aAAcL,KAAK2H,mBACrC3H,KAAK1D,QAAQ+D,KAAK,aAAcL,KAAKwH,mBAGzCxH,KAAKoE,QAAU,WACXpE,KAAK1D,QAAQuL,OAAO,aAAc7H,KAAK2H,mBACvC3H,KAAK1D,QAAQuL,OAAO,aAAc7H,KAAKwH,kBACvC9L,EAAS+L,OAAO1H,EAAKuH,uBAU7BtH,MAAKqE,QAAU,WACNtE,EAAKoH,YACNpH,EAAK2H,gBAEL3H,EAAKqH,gBAAgB9F,KAAK,GAAIiG,GAAexH,EAAKf,KAAK8I,sBACvDvM,QAAQ2I,QAAQnE,EAAKf,KAAK/B,aAAad,UAAW,SAASkC,GACvD0B,EAAKqH,gBAAgB9F,KAAK,GAAIiG,GAAehM,QAAQe,QAAQ+B,EAAS0J,YAG1ExM,QAAQ2I,QAAQnE,EAAKqH,gBAAiB,SAASY,GAC3CA,EAAe3D,YAGnBtE,EAAKoH,WAAY,IAOzBnH,KAAKoE,QAAU,WACPrE,EAAKoH,YACL5L,QAAQ2I,QAAQnE,EAAKqH,gBAAiB,SAASY,GAC3CA,EAAe5D,YAGnBrE,EAAKqH,mBAELrH,EAAK6H,mBACL7H,EAAKoH,WAAY,IAOzBnH,KAAK4H,iBAAmB,WACpB7H,EAAKsH,SAAU,EACf9L,QAAQ2I,QAAQnE,EAAKf,KAAK/B,aAAad,UAAW,SAASkC,GACvDA,EAAS4J,YAAW,GAAM,GAAM,MAOxCjI,KAAK0H,cAAgB,WACjBnM,QAAQ2I,QAAQnE,EAAKf,KAAK/B,aAAad,UAAW,SAASkC,GACvDA,EAAS4J,YAAW,GAAO,GAAM,KAErClI,EAAKsH,SAAU,GAGvB,OAAOnF,SCzGf3G,QAAQC,OAAO,mCAAoC0M,KAAK,iBAAkB,SAASC","file":"angular-gantt-dependencies-plugin.min.js"} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-drawtask-plugin.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-drawtask-plugin.js index 9fc44fed43305364d2b527ff02f367a7dafbe5c9..050b3a1327d804e13e9c9bd8b1c01f624c255e43 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-drawtask-plugin.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-drawtask-plugin.js @@ -1,5 +1,5 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com @@ -7,14 +7,14 @@ Github: https://github.com/angular-gantt/angular-gantt.git */ (function(){ 'use strict'; - angular.module('gantt.drawtask', ['gantt']).directive('ganttDrawTask', ['$document', 'ganttMouseOffset', 'moment', function(document, mouseOffset, moment) { + angular.module('gantt.drawtask', ['gantt']).directive('ganttDrawTask', ['$document', 'ganttMouseOffset', 'ganttUtils', 'moment', function(document, mouseOffset, utils, moment) { return { restrict: 'E', require: '^gantt', scope: { enabled: '=?', moveThreshold: '=?', - taskModelFactory: '=taskFactory' + taskModelFactory: '=?taskFactory' }, link: function(scope, element, attrs, ganttCtrl) { var api = ganttCtrl.gantt.api; @@ -27,6 +27,12 @@ Github: https://github.com/angular-gantt/angular-gantt.git scope.moveThreshold = 0; } + if (scope.taskModelFactory === undefined) { + scope.taskModelFactory = function() { + return {}; // New empty task. + }; + } + api.directives.on.new(scope, function(directiveName, directiveScope, element) { if (directiveName === 'ganttRow') { var addNewTask = function(x) { diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-drawtask-plugin.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-drawtask-plugin.js.map index eb4968974e3f51c4ae69b24eccee5b1af37a0944..5df7af466ac4a5b91a85195520af5b3fb49021f3 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-drawtask-plugin.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-drawtask-plugin.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/plugins/drawtask.js","../.tmp/generated/plugins/drawtask/html2js.js"],"names":[],"mappings":"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","file":"angular-gantt-drawtask-plugin.js","sourcesContent":["(function(){\n 'use strict';\n angular.module('gantt.drawtask', ['gantt']).directive('ganttDrawTask', ['$document', 'ganttMouseOffset', 'moment', function(document, mouseOffset, moment) {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n moveThreshold: '=?',\n taskModelFactory: '=taskFactory'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.moveThreshold === undefined) {\n scope.moveThreshold = 0;\n }\n\n api.directives.on.new(scope, function(directiveName, directiveScope, element) {\n if (directiveName === 'ganttRow') {\n var addNewTask = function(x) {\n var startDate = api.core.getDateByPosition(x, true);\n var endDate = moment(startDate);\n\n var taskModel = scope.taskModelFactory();\n taskModel.from = startDate;\n taskModel.to = endDate;\n\n var task = directiveScope.row.addTask(taskModel);\n task.isResizing = true;\n task.updatePosAndSize();\n directiveScope.row.updateVisibleTasks();\n\n directiveScope.row.$scope.$digest();\n };\n\n var deferDrawing = function(startX) {\n var moveTrigger = function(evt) {\n var currentX = mouseOffset.getOffset(evt).x;\n\n if (Math.abs(startX - currentX) >= scope.moveThreshold) {\n element.off('mousemove', moveTrigger);\n addNewTask(startX);\n }\n };\n\n element.on('mousemove', moveTrigger);\n document.one('mouseup', function() {\n element.off('mousemove', moveTrigger);\n });\n };\n\n var drawHandler = function(evt) {\n var evtTarget = (evt.target ? evt.target : evt.srcElement);\n var enabled = angular.isFunction(scope.enabled) ? scope.enabled(evt): scope.enabled;\n if (enabled && evtTarget.className.indexOf('gantt-row') > -1) {\n var x = mouseOffset.getOffset(evt).x;\n\n if (scope.moveThreshold === 0) {\n addNewTask(x, x);\n } else {\n deferDrawing(x);\n }\n }\n };\n\n element.on('mousedown', drawHandler);\n directiveScope.drawTaskHandler = drawHandler;\n }\n });\n\n api.directives.on.destroy(scope, function(directiveName, directiveScope, element) {\n if (directiveName === 'ganttRow') {\n element.off('mousedown', directiveScope.drawTaskHandler);\n delete directiveScope.drawTaskHandler;\n }\n });\n }\n };\n }]);\n}());\n\n","angular.module('gantt.drawtask.templates', []).run(['$templateCache', function($templateCache) {\n\n}]);\n"]} \ No newline at end of file +{"version":3,"sources":["../src/plugins/drawtask.js","../.tmp/generated/plugins/drawtask/html2js.js"],"names":[],"mappings":"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","file":"angular-gantt-drawtask-plugin.js","sourcesContent":["(function(){\n 'use strict';\n angular.module('gantt.drawtask', ['gantt']).directive('ganttDrawTask', ['$document', 'ganttMouseOffset', 'ganttUtils', 'moment', function(document, mouseOffset, utils, moment) {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n moveThreshold: '=?',\n taskModelFactory: '=?taskFactory'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.moveThreshold === undefined) {\n scope.moveThreshold = 0;\n }\n\n if (scope.taskModelFactory === undefined) {\n scope.taskModelFactory = function() {\n return {}; // New empty task.\n };\n }\n\n api.directives.on.new(scope, function(directiveName, directiveScope, element) {\n if (directiveName === 'ganttRow') {\n var addNewTask = function(x) {\n var startDate = api.core.getDateByPosition(x, true);\n var endDate = moment(startDate);\n\n var taskModel = scope.taskModelFactory();\n taskModel.from = startDate;\n taskModel.to = endDate;\n\n var task = directiveScope.row.addTask(taskModel);\n task.isResizing = true;\n task.updatePosAndSize();\n directiveScope.row.updateVisibleTasks();\n\n directiveScope.row.$scope.$digest();\n };\n\n var deferDrawing = function(startX) {\n var moveTrigger = function(evt) {\n var currentX = mouseOffset.getOffset(evt).x;\n\n if (Math.abs(startX - currentX) >= scope.moveThreshold) {\n element.off('mousemove', moveTrigger);\n addNewTask(startX);\n }\n };\n\n element.on('mousemove', moveTrigger);\n document.one('mouseup', function() {\n element.off('mousemove', moveTrigger);\n });\n };\n\n var drawHandler = function(evt) {\n var evtTarget = (evt.target ? evt.target : evt.srcElement);\n var enabled = angular.isFunction(scope.enabled) ? scope.enabled(evt): scope.enabled;\n if (enabled && evtTarget.className.indexOf('gantt-row') > -1) {\n var x = mouseOffset.getOffset(evt).x;\n\n if (scope.moveThreshold === 0) {\n addNewTask(x, x);\n } else {\n deferDrawing(x);\n }\n }\n };\n\n element.on('mousedown', drawHandler);\n directiveScope.drawTaskHandler = drawHandler;\n }\n });\n\n api.directives.on.destroy(scope, function(directiveName, directiveScope, element) {\n if (directiveName === 'ganttRow') {\n element.off('mousedown', directiveScope.drawTaskHandler);\n delete directiveScope.drawTaskHandler;\n }\n });\n }\n };\n }]);\n}());\n\n","angular.module('gantt.drawtask.templates', []).run(['$templateCache', function($templateCache) {\n\n}]);\n"]} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-drawtask-plugin.min.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-drawtask-plugin.min.js index c78fb7c0a15e1219c7219edd43297966fdb2bb94..f53830dde1c8be265bc304d25bd06bd3b11b876e 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-drawtask-plugin.min.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-drawtask-plugin.min.js @@ -1,10 +1,10 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com Github: https://github.com/angular-gantt/angular-gantt.git */ -!function(){"use strict";angular.module("gantt.drawtask",["gantt"]).directive("ganttDrawTask",["$document","ganttMouseOffset","moment",function(a,b,c){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",moveThreshold:"=?",taskModelFactory:"=taskFactory"},link:function(d,e,f,g){var h=g.gantt.api;void 0===d.enabled&&(d.enabled=!0),void 0===d.moveThreshold&&(d.moveThreshold=0),h.directives.on["new"](d,function(e,f,g){if("ganttRow"===e){var i=function(a){var b=h.core.getDateByPosition(a,!0),e=c(b),g=d.taskModelFactory();g.from=b,g.to=e;var i=f.row.addTask(g);i.isResizing=!0,i.updatePosAndSize(),f.row.updateVisibleTasks(),f.row.$scope.$digest()},j=function(c){var e=function(a){var f=b.getOffset(a).x;Math.abs(c-f)>=d.moveThreshold&&(g.off("mousemove",e),i(c))};g.on("mousemove",e),a.one("mouseup",function(){g.off("mousemove",e)})},k=function(a){var c=a.target?a.target:a.srcElement,e=angular.isFunction(d.enabled)?d.enabled(a):d.enabled;if(e&&c.className.indexOf("gantt-row")>-1){var f=b.getOffset(a).x;0===d.moveThreshold?i(f,f):j(f)}};g.on("mousedown",k),f.drawTaskHandler=k}}),h.directives.on.destroy(d,function(a,b,c){"ganttRow"===a&&(c.off("mousedown",b.drawTaskHandler),delete b.drawTaskHandler)})}}}])}(),angular.module("gantt.drawtask.templates",[]).run(["$templateCache",function(a){}]); +!function(){"use strict";angular.module("gantt.drawtask",["gantt"]).directive("ganttDrawTask",["$document","ganttMouseOffset","ganttUtils","moment",function(a,b,c,d){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",moveThreshold:"=?",taskModelFactory:"=?taskFactory"},link:function(c,e,f,g){var h=g.gantt.api;void 0===c.enabled&&(c.enabled=!0),void 0===c.moveThreshold&&(c.moveThreshold=0),void 0===c.taskModelFactory&&(c.taskModelFactory=function(){return{}}),h.directives.on["new"](c,function(e,f,g){if("ganttRow"===e){var i=function(a){var b=h.core.getDateByPosition(a,!0),e=d(b),g=c.taskModelFactory();g.from=b,g.to=e;var i=f.row.addTask(g);i.isResizing=!0,i.updatePosAndSize(),f.row.updateVisibleTasks(),f.row.$scope.$digest()},j=function(d){var e=function(a){var f=b.getOffset(a).x;Math.abs(d-f)>=c.moveThreshold&&(g.off("mousemove",e),i(d))};g.on("mousemove",e),a.one("mouseup",function(){g.off("mousemove",e)})},k=function(a){var d=a.target?a.target:a.srcElement,e=angular.isFunction(c.enabled)?c.enabled(a):c.enabled;if(e&&d.className.indexOf("gantt-row")>-1){var f=b.getOffset(a).x;0===c.moveThreshold?i(f,f):j(f)}};g.on("mousedown",k),f.drawTaskHandler=k}}),h.directives.on.destroy(c,function(a,b,c){"ganttRow"===a&&(c.off("mousedown",b.drawTaskHandler),delete b.drawTaskHandler)})}}}])}(),angular.module("gantt.drawtask.templates",[]).run(["$templateCache",function(a){}]); //# sourceMappingURL=angular-gantt-drawtask-plugin.min.js.map \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-drawtask-plugin.min.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-drawtask-plugin.min.js.map index e06809cd3fb3fac5480d0d7363cefe01ab68b2ff..3877937488855fa55d3280bd36ed2279884d722a 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-drawtask-plugin.min.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-drawtask-plugin.min.js.map @@ -1 +1 @@ -{"version":3,"file":"angular-gantt-drawtask-plugin.min.js","sources":["../src/plugins/drawtask.js","../.tmp/generated/plugins/drawtask/html2js.js"],"names":["angular","module","directive","document","mouseOffset","moment","restrict","require","scope","enabled","moveThreshold","taskModelFactory","link","element","attrs","ganttCtrl","api","gantt","undefined","directives","on","directiveName","directiveScope","addNewTask","x","startDate","core","getDateByPosition","endDate","taskModel","from","to","task","row","addTask","isResizing","updatePosAndSize","updateVisibleTasks","$scope","$digest","deferDrawing","startX","moveTrigger","evt","currentX","getOffset","Math","abs","off","one","drawHandler","evtTarget","target","srcElement","isFunction","className","indexOf","drawTaskHandler","destroy","run","$templateCache"],"mappings":";;;;;;;;CAAC,WACG,YACAA,SAAQC,OAAO,kBAAmB,UAAUC,UAAU,iBAAkB,YAAa,mBAAoB,SAAU,SAASC,EAAUC,EAAaC,GAC/I,OACIC,SAAU,IACVC,QAAS,SACTC,OACIC,QAAS,KACTC,cAAe,KACfC,iBAAkB,gBAEtBC,KAAM,SAASJ,EAAOK,EAASC,EAAOC,GAClC,GAAIC,GAAMD,EAAUE,MAAMD,GAEJE,UAAlBV,EAAMC,UACND,EAAMC,SAAU,GAGQS,SAAxBV,EAAME,gBACNF,EAAME,cAAgB,GAG1BM,EAAIG,WAAWC,GAAfJ,OAAsBR,EAAO,SAASa,EAAeC,EAAgBT,GACjE,GAAsB,aAAlBQ,EAA8B,CAC9B,GAAIE,GAAa,SAASC,GACtB,GAAIC,GAAYT,EAAIU,KAAKC,kBAAkBH,GAAG,GAC1CI,EAAUvB,EAAOoB,GAEjBI,EAAYrB,EAAMG,kBACtBkB,GAAUC,KAAOL,EACjBI,EAAUE,GAAKH,CAEf,IAAII,GAAOV,EAAeW,IAAIC,QAAQL,EACtCG,GAAKG,YAAa,EAClBH,EAAKI,mBACLd,EAAeW,IAAII,qBAEnBf,EAAeW,IAAIK,OAAOC,WAG1BC,EAAe,SAASC,GACxB,GAAIC,GAAc,SAASC,GACvB,GAAIC,GAAWxC,EAAYyC,UAAUF,GAAKnB,CAEtCsB,MAAKC,IAAIN,EAASG,IAAapC,EAAME,gBACrCG,EAAQmC,IAAI,YAAaN,GACzBnB,EAAWkB,IAInB5B,GAAQO,GAAG,YAAasB,GACxBvC,EAAS8C,IAAI,UAAW,WACpBpC,EAAQmC,IAAI,YAAaN,MAI7BQ,EAAc,SAASP,GACvB,GAAIQ,GAAaR,EAAIS,OAAST,EAAIS,OAAST,EAAIU,WAC3C5C,EAAUT,QAAQsD,WAAW9C,EAAMC,SAAWD,EAAMC,QAAQkC,GAAMnC,EAAMC,OAC5E,IAAIA,GAAW0C,EAAUI,UAAUC,QAAQ,aAAe,GAAI,CAC1D,GAAIhC,GAAIpB,EAAYyC,UAAUF,GAAKnB,CAEP,KAAxBhB,EAAME,cACNa,EAAWC,EAAGA,GAEdgB,EAAahB,IAKzBX,GAAQO,GAAG,YAAa8B,GACxB5B,EAAemC,gBAAkBP,KAIzClC,EAAIG,WAAWC,GAAGsC,QAAQlD,EAAO,SAASa,EAAeC,EAAgBT,GAC/C,aAAlBQ,IACAR,EAAQmC,IAAI,YAAa1B,EAAemC,uBACjCnC,GAAemC,2BC9E9CzD,QAAQC,OAAO,+BAAgC0D,KAAK,iBAAkB,SAASC"} \ No newline at end of file +{"version":3,"sources":["../src/plugins/drawtask.js","../.tmp/generated/plugins/drawtask/html2js.js"],"names":["angular","module","directive","document","mouseOffset","utils","moment","restrict","require","scope","enabled","moveThreshold","taskModelFactory","link","element","attrs","ganttCtrl","api","gantt","undefined","directives","on","directiveName","directiveScope","addNewTask","x","startDate","core","getDateByPosition","endDate","taskModel","from","to","task","row","addTask","isResizing","updatePosAndSize","updateVisibleTasks","$scope","$digest","deferDrawing","startX","moveTrigger","evt","currentX","getOffset","Math","abs","off","one","drawHandler","evtTarget","target","srcElement","isFunction","className","indexOf","drawTaskHandler","destroy","run","$templateCache"],"mappings":";;;;;;;;CAAC,WACG,YACAA,SAAQC,OAAO,kBAAmB,UAAUC,UAAU,iBAAkB,YAAa,mBAAoB,aAAc,SAAU,SAASC,EAAUC,EAAaC,EAAOC,GACpK,OACIC,SAAU,IACVC,QAAS,SACTC,OACIC,QAAS,KACTC,cAAe,KACfC,iBAAkB,iBAEtBC,KAAM,SAASJ,EAAOK,EAASC,EAAOC,GAClC,GAAIC,GAAMD,EAAUE,MAAMD,GAEJE,UAAlBV,EAAMC,UACND,EAAMC,SAAU,GAGQS,SAAxBV,EAAME,gBACNF,EAAME,cAAgB,GAGKQ,SAA3BV,EAAMG,mBACNH,EAAMG,iBAAmB,WACrB,WAIRK,EAAIG,WAAWC,GAAfJ,OAAsBR,EAAO,SAASa,EAAeC,EAAgBT,GACjE,GAAsB,aAAlBQ,EAA8B,CAC9B,GAAIE,GAAa,SAASC,GACtB,GAAIC,GAAYT,EAAIU,KAAKC,kBAAkBH,GAAG,GAC1CI,EAAUvB,EAAOoB,GAEjBI,EAAYrB,EAAMG,kBACtBkB,GAAUC,KAAOL,EACjBI,EAAUE,GAAKH,CAEf,IAAII,GAAOV,EAAeW,IAAIC,QAAQL,EACtCG,GAAKG,YAAa,EAClBH,EAAKI,mBACLd,EAAeW,IAAII,qBAEnBf,EAAeW,IAAIK,OAAOC,WAG1BC,EAAe,SAASC,GACxB,GAAIC,GAAc,SAASC,GACvB,GAAIC,GAAWzC,EAAY0C,UAAUF,GAAKnB,CAEtCsB,MAAKC,IAAIN,EAASG,IAAapC,EAAME,gBACrCG,EAAQmC,IAAI,YAAaN,GACzBnB,EAAWkB,IAInB5B,GAAQO,GAAG,YAAasB,GACxBxC,EAAS+C,IAAI,UAAW,WACpBpC,EAAQmC,IAAI,YAAaN,MAI7BQ,EAAc,SAASP,GACvB,GAAIQ,GAAaR,EAAIS,OAAST,EAAIS,OAAST,EAAIU,WAC3C5C,EAAUV,QAAQuD,WAAW9C,EAAMC,SAAWD,EAAMC,QAAQkC,GAAMnC,EAAMC,OAC5E,IAAIA,GAAW0C,EAAUI,UAAUC,QAAQ,aAAe,GAAI,CAC1D,GAAIhC,GAAIrB,EAAY0C,UAAUF,GAAKnB,CAEP,KAAxBhB,EAAME,cACNa,EAAWC,EAAGA,GAEdgB,EAAahB,IAKzBX,GAAQO,GAAG,YAAa8B,GACxB5B,EAAemC,gBAAkBP,KAIzClC,EAAIG,WAAWC,GAAGsC,QAAQlD,EAAO,SAASa,EAAeC,EAAgBT,GAC/C,aAAlBQ,IACAR,EAAQmC,IAAI,YAAa1B,EAAemC,uBACjCnC,GAAemC,2BCpF9C1D,QAAQC,OAAO,+BAAgC2D,KAAK,iBAAkB,SAASC","file":"angular-gantt-drawtask-plugin.min.js"} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-groups-plugin.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-groups-plugin.js index 98b9531b941d5194e7f1913148d913d7ff87f3ae..a73d1f8e737f679a940f24a71ca23310e3168f0f 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-groups-plugin.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-groups-plugin.js @@ -1,5 +1,5 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com @@ -97,18 +97,20 @@ Github: https://github.com/angular-gantt/angular-gantt.git } }; - $scope.gantt.api.tasks.on.change($scope, function(task) { + $scope.gantt.api.tasks.on.viewChange($scope, function(task) { if ($scope.taskGroup !== undefined) { if ($scope.taskGroup.tasks.indexOf(task) > -1) { - $scope.$evalAsync(function() { - updateTaskGroup(); - }); + updateTaskGroup(); + if(!$scope.$$phase && !$scope.$root.$$phase) { + $scope.$digest(); + } } else { var descendants = $scope.pluginScope.hierarchy.descendants($scope.row); if (descendants.indexOf(task.row) > -1) { - $scope.$evalAsync(function() { - updateTaskGroup(); - }); + updateTaskGroup(); + if(!$scope.$$phase && !$scope.$root.$$phase) { + $scope.$digest(); + } } } } @@ -134,11 +136,11 @@ Github: https://github.com/angular-gantt/angular-gantt.git }()); -(function(){ +(function() { 'use strict'; angular.module('gantt').factory('GanttTaskGroup', ['ganttUtils', 'GanttTask', function(utils, Task) { - var TaskGroup = function (row, pluginScope) { + var TaskGroup = function(row, pluginScope) { var self = this; self.row = row; @@ -175,8 +177,12 @@ Github: https://github.com/angular-gantt/angular-gantt.git } }; - angular.forEach(self.descendants, function(descendant) { - angular.forEach(descendant.tasks, function(task) { + for (var i = 0; i < self.descendants.length; i++) { + var tasks = self.descendants[i].tasks; + + for (var j = 0; j < tasks.length; j++) { + var task = tasks[j]; + var taskDisplay = getTaskDisplay(task); if (taskDisplay !== undefined) { self.tasks.push(task); @@ -184,28 +190,38 @@ Github: https://github.com/angular-gantt/angular-gantt.git if (taskDisplay === 'overview') { self.overviewTasks.push(clone); - } else if(taskDisplay === 'promote'){ + } else if (taskDisplay === 'promote') { self.promotedTasks.push(clone); } else { self.showGrouping = true; } } - }); - }); + } + } self.from = undefined; - angular.forEach(self.tasks, function (task) { - if (self.from === undefined || task.model.from < self.from) { - self.from = task.model.from; + if (groupRowGroups) { + self.from = groupRowGroups.from; + } + if (self.from === undefined) { + for (i=0; i<self.tasks.length; i++) { + if (self.from === undefined || self.tasks[i].model.from < self.from) { + self.from = self.tasks[i].model.from; + } } - }); + } self.to = undefined; - angular.forEach(self.tasks, function (task) { - if (self.to === undefined || task.model.to > self.to) { - self.to = task.model.to; + if (groupRowGroups) { + self.to = groupRowGroups.to; + } + if (self.to === undefined) { + for (i=0; i<self.tasks.length; i++) { + if (self.to === undefined || self.tasks[i].model.to > self.to) { + self.to = self.tasks[i].model.to; + } } - }); + } if (self.showGrouping) { self.left = row.rowsManager.gantt.getPositionByDate(self.from); diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-groups-plugin.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-groups-plugin.js.map index 5229dfb7634f3877b8335245683f7fd5b99768dc..26b9dc774e71f162d526a55bf8d4e505a8d7e145 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-groups-plugin.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-groups-plugin.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/plugins/groups.js","../src/plugins/groups/group.controller.js","../src/plugins/groups/taskGroup.directive.js","../src/plugins/groups/taskGroup.factory.js","../src/plugins/groups/taskOverview.directive.js","../.tmp/generated/plugins/groups/html2js.js"],"names":[],"mappings":"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","file":"angular-gantt-groups-plugin.js","sourcesContent":["(function(){\n 'use strict';\n angular.module('gantt.groups', ['gantt', 'gantt.groups.templates']).directive('ganttGroups', ['ganttUtils', 'GanttHierarchy', '$compile', '$document', function(utils, Hierarchy, $compile, $document) {\n // Provides the row sort functionality to any Gantt row\n // Uses the sortableState to share the current row\n\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n display: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.sortable) === 'object') {\n for (var option in scope.options.sortable) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.display === undefined) {\n scope.display = 'group';\n }\n\n scope.hierarchy = new Hierarchy();\n\n function refresh() {\n scope.hierarchy.refresh(ganttCtrl.gantt.rowsManager.filteredRows);\n }\n\n ganttCtrl.gantt.api.registerMethod('groups', 'refresh', refresh, this);\n ganttCtrl.gantt.$scope.$watchCollection('gantt.rowsManager.filteredRows', function() {\n refresh();\n });\n\n api.directives.on.new(scope, function(directiveName, rowScope, rowElement) {\n if (directiveName === 'ganttRow') {\n var taskGroupScope = rowScope.$new();\n taskGroupScope.pluginScope = scope;\n\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'pluginScope.enabled');\n\n var taskGroupElement = $document[0].createElement('gantt-task-group');\n if (attrs.templateUrl !== undefined) {\n angular.element(taskGroupElement).attr('data-template-url', attrs.templateUrl);\n }\n if (attrs.template !== undefined) {\n angular.element(taskGroupElement).attr('data-template', attrs.template);\n }\n\n angular.element(ifElement).append(taskGroupElement);\n\n rowElement.append($compile(ifElement)(taskGroupScope));\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.groups').controller('GanttGroupController', ['$scope', 'GanttTaskGroup', 'ganttUtils', function($scope, TaskGroup, utils) {\n var updateTaskGroup = function() {\n var rowGroups = $scope.row.model.groups;\n\n if (typeof(rowGroups) === 'boolean') {\n rowGroups = {enabled: rowGroups};\n }\n\n var enabledValue = utils.firstProperty([rowGroups], 'enabled', $scope.pluginScope.enabled);\n if (enabledValue) {\n $scope.display = utils.firstProperty([rowGroups], 'display', $scope.pluginScope.display);\n $scope.taskGroup = new TaskGroup($scope.row, $scope.pluginScope);\n\n $scope.row.setFromTo();\n $scope.row.setFromToByValues($scope.taskGroup.from, $scope.taskGroup.to);\n } else {\n $scope.taskGroup = undefined;\n $scope.display = undefined;\n }\n };\n\n $scope.gantt.api.tasks.on.change($scope, function(task) {\n if ($scope.taskGroup !== undefined) {\n if ($scope.taskGroup.tasks.indexOf(task) > -1) {\n $scope.$evalAsync(function() {\n updateTaskGroup();\n });\n } else {\n var descendants = $scope.pluginScope.hierarchy.descendants($scope.row);\n if (descendants.indexOf(task.row) > -1) {\n $scope.$evalAsync(function() {\n updateTaskGroup();\n });\n }\n }\n }\n });\n\n var removeWatch = $scope.pluginScope.$watch('display', updateTaskGroup);\n\n $scope.$watchCollection('gantt.rowsManager.filteredRows', updateTaskGroup);\n\n $scope.gantt.api.columns.on.refresh($scope, updateTaskGroup);\n\n $scope.$on('$destroy', removeWatch);\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.groups').directive('ganttTaskGroup', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTaskGroup', 'plugins/groups/taskGroup.tmpl.html');\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n\n angular.module('gantt').factory('GanttTaskGroup', ['ganttUtils', 'GanttTask', function(utils, Task) {\n var TaskGroup = function (row, pluginScope) {\n var self = this;\n\n self.row = row;\n self.pluginScope = pluginScope;\n\n self.descendants = self.pluginScope.hierarchy.descendants(self.row);\n\n self.tasks = [];\n self.overviewTasks = [];\n self.promotedTasks = [];\n self.showGrouping = false;\n\n var groupRowGroups = self.row.model.groups;\n if (typeof(groupRowGroups) === 'boolean') {\n groupRowGroups = {enabled: groupRowGroups};\n }\n\n var getTaskDisplay = function(task) {\n var taskGroups = task.model.groups;\n if (typeof(taskGroups) === 'boolean') {\n taskGroups = {enabled: taskGroups};\n }\n\n var rowGroups = task.row.model.groups;\n if (typeof(rowGroups) === 'boolean') {\n rowGroups = {enabled: rowGroups};\n }\n\n var enabledValue = utils.firstProperty([taskGroups, rowGroups, groupRowGroups], 'enabled', self.pluginScope.enabled);\n\n if (enabledValue) {\n var display = utils.firstProperty([taskGroups, rowGroups, groupRowGroups], 'display', self.pluginScope.display);\n return display;\n }\n };\n\n angular.forEach(self.descendants, function(descendant) {\n angular.forEach(descendant.tasks, function(task) {\n var taskDisplay = getTaskDisplay(task);\n if (taskDisplay !== undefined) {\n self.tasks.push(task);\n var clone = new Task(self.row, task.model);\n\n if (taskDisplay === 'overview') {\n self.overviewTasks.push(clone);\n } else if(taskDisplay === 'promote'){\n self.promotedTasks.push(clone);\n } else {\n self.showGrouping = true;\n }\n }\n });\n });\n\n self.from = undefined;\n angular.forEach(self.tasks, function (task) {\n if (self.from === undefined || task.model.from < self.from) {\n self.from = task.model.from;\n }\n });\n\n self.to = undefined;\n angular.forEach(self.tasks, function (task) {\n if (self.to === undefined || task.model.to > self.to) {\n self.to = task.model.to;\n }\n });\n\n if (self.showGrouping) {\n self.left = row.rowsManager.gantt.getPositionByDate(self.from);\n self.width = row.rowsManager.gantt.getPositionByDate(self.to) - self.left;\n }\n };\n return TaskGroup;\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttTaskOverview', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTaskOverview', 'plugins/groups/taskOverview.tmpl.html');\n builder.controller = function($scope, $element) {\n $scope.task.$element = $element;\n $scope.task.$scope = $scope;\n $scope.task.updatePosAndSize();\n };\n return builder.build();\n }]);\n}());\n","angular.module('gantt.groups.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/groups/taskGroup.tmpl.html',\n '<div ng-controller=\"GanttGroupController\">\\n' +\n ' <div class=\"gantt-task-group-overview\" ng-if=\"taskGroup.overviewTasks.length > 0\">\\n' +\n ' <gantt-task-overview ng-repeat=\"task in taskGroup.overviewTasks\"></gantt-task-overview>\\n' +\n ' </div>\\n' +\n ' <div class=\"gantt-task-group-promote\" ng-if=\"taskGroup.row._collapsed && taskGroup.promotedTasks.length > 0\">\\n' +\n ' <gantt-task ng-repeat=\"task in taskGroup.promotedTasks\"></gantt-task>\\n' +\n ' </div>\\n' +\n ' <div class=\"gantt-task-group\"\\n' +\n ' ng-if=\"taskGroup.showGrouping\"\\n' +\n ' ng-style=\"{\\'left\\': taskGroup.left + \\'px\\', \\'width\\': taskGroup.width + \\'px\\'}\">\\n' +\n ' <div class=\"gantt-task-group-left-main\"></div>\\n' +\n ' <div class=\"gantt-task-group-right-main\"></div>\\n' +\n ' <div class=\"gantt-task-group-left-symbol\"></div>\\n' +\n ' <div class=\"gantt-task-group-right-symbol\"></div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '\\n' +\n '');\n $templateCache.put('plugins/groups/taskOverview.tmpl.html',\n '<div class=\"gantt-task gantt-task-overview\" ng-class=\"task.model.classes\">\\n' +\n ' <gantt-task-background></gantt-task-background>\\n' +\n ' <gantt-task-content></gantt-task-content>\\n' +\n ' <gantt-task-foreground></gantt-task-foreground>\\n' +\n '</div>\\n' +\n '\\n' +\n '');\n}]);\n"]} \ No newline at end of file +{"version":3,"sources":["../src/plugins/groups.js","../src/plugins/groups/group.controller.js","../src/plugins/groups/taskGroup.directive.js","../src/plugins/groups/taskGroup.factory.js","../src/plugins/groups/taskOverview.directive.js","../.tmp/generated/plugins/groups/html2js.js"],"names":[],"mappings":"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","file":"angular-gantt-groups-plugin.js","sourcesContent":["(function(){\n 'use strict';\n angular.module('gantt.groups', ['gantt', 'gantt.groups.templates']).directive('ganttGroups', ['ganttUtils', 'GanttHierarchy', '$compile', '$document', function(utils, Hierarchy, $compile, $document) {\n // Provides the row sort functionality to any Gantt row\n // Uses the sortableState to share the current row\n\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n display: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.sortable) === 'object') {\n for (var option in scope.options.sortable) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.display === undefined) {\n scope.display = 'group';\n }\n\n scope.hierarchy = new Hierarchy();\n\n function refresh() {\n scope.hierarchy.refresh(ganttCtrl.gantt.rowsManager.filteredRows);\n }\n\n ganttCtrl.gantt.api.registerMethod('groups', 'refresh', refresh, this);\n ganttCtrl.gantt.$scope.$watchCollection('gantt.rowsManager.filteredRows', function() {\n refresh();\n });\n\n api.directives.on.new(scope, function(directiveName, rowScope, rowElement) {\n if (directiveName === 'ganttRow') {\n var taskGroupScope = rowScope.$new();\n taskGroupScope.pluginScope = scope;\n\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'pluginScope.enabled');\n\n var taskGroupElement = $document[0].createElement('gantt-task-group');\n if (attrs.templateUrl !== undefined) {\n angular.element(taskGroupElement).attr('data-template-url', attrs.templateUrl);\n }\n if (attrs.template !== undefined) {\n angular.element(taskGroupElement).attr('data-template', attrs.template);\n }\n\n angular.element(ifElement).append(taskGroupElement);\n\n rowElement.append($compile(ifElement)(taskGroupScope));\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.groups').controller('GanttGroupController', ['$scope', 'GanttTaskGroup', 'ganttUtils', function($scope, TaskGroup, utils) {\n var updateTaskGroup = function() {\n var rowGroups = $scope.row.model.groups;\n\n if (typeof(rowGroups) === 'boolean') {\n rowGroups = {enabled: rowGroups};\n }\n\n var enabledValue = utils.firstProperty([rowGroups], 'enabled', $scope.pluginScope.enabled);\n if (enabledValue) {\n $scope.display = utils.firstProperty([rowGroups], 'display', $scope.pluginScope.display);\n $scope.taskGroup = new TaskGroup($scope.row, $scope.pluginScope);\n\n $scope.row.setFromTo();\n $scope.row.setFromToByValues($scope.taskGroup.from, $scope.taskGroup.to);\n } else {\n $scope.taskGroup = undefined;\n $scope.display = undefined;\n }\n };\n\n $scope.gantt.api.tasks.on.viewChange($scope, function(task) {\n if ($scope.taskGroup !== undefined) {\n if ($scope.taskGroup.tasks.indexOf(task) > -1) {\n updateTaskGroup();\n if(!$scope.$$phase && !$scope.$root.$$phase) {\n $scope.$digest();\n }\n } else {\n var descendants = $scope.pluginScope.hierarchy.descendants($scope.row);\n if (descendants.indexOf(task.row) > -1) {\n updateTaskGroup();\n if(!$scope.$$phase && !$scope.$root.$$phase) {\n $scope.$digest();\n }\n }\n }\n }\n });\n\n var removeWatch = $scope.pluginScope.$watch('display', updateTaskGroup);\n\n $scope.$watchCollection('gantt.rowsManager.filteredRows', updateTaskGroup);\n\n $scope.gantt.api.columns.on.refresh($scope, updateTaskGroup);\n\n $scope.$on('$destroy', removeWatch);\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.groups').directive('ganttTaskGroup', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTaskGroup', 'plugins/groups/taskGroup.tmpl.html');\n return builder.build();\n }]);\n}());\n\n","(function() {\n 'use strict';\n\n angular.module('gantt').factory('GanttTaskGroup', ['ganttUtils', 'GanttTask', function(utils, Task) {\n var TaskGroup = function(row, pluginScope) {\n var self = this;\n\n self.row = row;\n self.pluginScope = pluginScope;\n\n self.descendants = self.pluginScope.hierarchy.descendants(self.row);\n\n self.tasks = [];\n self.overviewTasks = [];\n self.promotedTasks = [];\n self.showGrouping = false;\n\n var groupRowGroups = self.row.model.groups;\n if (typeof(groupRowGroups) === 'boolean') {\n groupRowGroups = {enabled: groupRowGroups};\n }\n\n var getTaskDisplay = function(task) {\n var taskGroups = task.model.groups;\n if (typeof(taskGroups) === 'boolean') {\n taskGroups = {enabled: taskGroups};\n }\n\n var rowGroups = task.row.model.groups;\n if (typeof(rowGroups) === 'boolean') {\n rowGroups = {enabled: rowGroups};\n }\n\n var enabledValue = utils.firstProperty([taskGroups, rowGroups, groupRowGroups], 'enabled', self.pluginScope.enabled);\n\n if (enabledValue) {\n var display = utils.firstProperty([taskGroups, rowGroups, groupRowGroups], 'display', self.pluginScope.display);\n return display;\n }\n };\n\n for (var i = 0; i < self.descendants.length; i++) {\n var tasks = self.descendants[i].tasks;\n\n for (var j = 0; j < tasks.length; j++) {\n var task = tasks[j];\n\n var taskDisplay = getTaskDisplay(task);\n if (taskDisplay !== undefined) {\n self.tasks.push(task);\n var clone = new Task(self.row, task.model);\n\n if (taskDisplay === 'overview') {\n self.overviewTasks.push(clone);\n } else if (taskDisplay === 'promote') {\n self.promotedTasks.push(clone);\n } else {\n self.showGrouping = true;\n }\n }\n }\n }\n\n self.from = undefined;\n if (groupRowGroups) {\n self.from = groupRowGroups.from;\n }\n if (self.from === undefined) {\n for (i=0; i<self.tasks.length; i++) {\n if (self.from === undefined || self.tasks[i].model.from < self.from) {\n self.from = self.tasks[i].model.from;\n }\n }\n }\n\n self.to = undefined;\n if (groupRowGroups) {\n self.to = groupRowGroups.to;\n }\n if (self.to === undefined) {\n for (i=0; i<self.tasks.length; i++) {\n if (self.to === undefined || self.tasks[i].model.to > self.to) {\n self.to = self.tasks[i].model.to;\n }\n }\n }\n\n if (self.showGrouping) {\n self.left = row.rowsManager.gantt.getPositionByDate(self.from);\n self.width = row.rowsManager.gantt.getPositionByDate(self.to) - self.left;\n }\n };\n return TaskGroup;\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttTaskOverview', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTaskOverview', 'plugins/groups/taskOverview.tmpl.html');\n builder.controller = function($scope, $element) {\n $scope.task.$element = $element;\n $scope.task.$scope = $scope;\n $scope.task.updatePosAndSize();\n };\n return builder.build();\n }]);\n}());\n","angular.module('gantt.groups.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/groups/taskGroup.tmpl.html',\n '<div ng-controller=\"GanttGroupController\">\\n' +\n ' <div class=\"gantt-task-group-overview\" ng-if=\"taskGroup.overviewTasks.length > 0\">\\n' +\n ' <gantt-task-overview ng-repeat=\"task in taskGroup.overviewTasks\"></gantt-task-overview>\\n' +\n ' </div>\\n' +\n ' <div class=\"gantt-task-group-promote\" ng-if=\"taskGroup.row._collapsed && taskGroup.promotedTasks.length > 0\">\\n' +\n ' <gantt-task ng-repeat=\"task in taskGroup.promotedTasks\"></gantt-task>\\n' +\n ' </div>\\n' +\n ' <div class=\"gantt-task-group\"\\n' +\n ' ng-if=\"taskGroup.showGrouping\"\\n' +\n ' ng-style=\"{\\'left\\': taskGroup.left + \\'px\\', \\'width\\': taskGroup.width + \\'px\\'}\">\\n' +\n ' <div class=\"gantt-task-group-left-main\"></div>\\n' +\n ' <div class=\"gantt-task-group-right-main\"></div>\\n' +\n ' <div class=\"gantt-task-group-left-symbol\"></div>\\n' +\n ' <div class=\"gantt-task-group-right-symbol\"></div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '\\n' +\n '');\n $templateCache.put('plugins/groups/taskOverview.tmpl.html',\n '<div class=\"gantt-task gantt-task-overview\" ng-class=\"task.model.classes\">\\n' +\n ' <gantt-task-background></gantt-task-background>\\n' +\n ' <gantt-task-content></gantt-task-content>\\n' +\n ' <gantt-task-foreground></gantt-task-foreground>\\n' +\n '</div>\\n' +\n '\\n' +\n '');\n}]);\n"]} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-groups-plugin.min.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-groups-plugin.min.js index ea4f0061a6d5ee73de734c4ca3dab8e978c49be8..14be14165e817b4e8462a73ccb950d7ae629e56f 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-groups-plugin.min.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-groups-plugin.min.js @@ -1,10 +1,10 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com Github: https://github.com/angular-gantt/angular-gantt.git */ -!function(){"use strict";angular.module("gantt.groups",["gantt","gantt.groups.templates"]).directive("ganttGroups",["ganttUtils","GanttHierarchy","$compile","$document",function(a,b,c,d){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",display:"=?"},link:function(a,e,f,g){function h(){a.hierarchy.refresh(g.gantt.rowsManager.filteredRows)}var i=g.gantt.api;if(a.options&&"object"==typeof a.options.sortable)for(var j in a.options.sortable)a[j]=a.options[j];void 0===a.enabled&&(a.enabled=!0),void 0===a.display&&(a.display="group"),a.hierarchy=new b,g.gantt.api.registerMethod("groups","refresh",h,this),g.gantt.$scope.$watchCollection("gantt.rowsManager.filteredRows",function(){h()}),i.directives.on["new"](a,function(b,e,g){if("ganttRow"===b){var h=e.$new();h.pluginScope=a;var i=d[0].createElement("div");angular.element(i).attr("data-ng-if","pluginScope.enabled");var j=d[0].createElement("gantt-task-group");void 0!==f.templateUrl&&angular.element(j).attr("data-template-url",f.templateUrl),void 0!==f.template&&angular.element(j).attr("data-template",f.template),angular.element(i).append(j),g.append(c(i)(h))}})}}}])}(),function(){"use strict";angular.module("gantt.groups").controller("GanttGroupController",["$scope","GanttTaskGroup","ganttUtils",function(a,b,c){var d=function(){var d=a.row.model.groups;"boolean"==typeof d&&(d={enabled:d});var e=c.firstProperty([d],"enabled",a.pluginScope.enabled);e?(a.display=c.firstProperty([d],"display",a.pluginScope.display),a.taskGroup=new b(a.row,a.pluginScope),a.row.setFromTo(),a.row.setFromToByValues(a.taskGroup.from,a.taskGroup.to)):(a.taskGroup=void 0,a.display=void 0)};a.gantt.api.tasks.on.change(a,function(b){if(void 0!==a.taskGroup)if(a.taskGroup.tasks.indexOf(b)>-1)a.$evalAsync(function(){d()});else{var c=a.pluginScope.hierarchy.descendants(a.row);c.indexOf(b.row)>-1&&a.$evalAsync(function(){d()})}});var e=a.pluginScope.$watch("display",d);a.$watchCollection("gantt.rowsManager.filteredRows",d),a.gantt.api.columns.on.refresh(a,d),a.$on("$destroy",e)}])}(),function(){"use strict";angular.module("gantt.groups").directive("ganttTaskGroup",["GanttDirectiveBuilder",function(a){var b=new a("ganttTaskGroup","plugins/groups/taskGroup.tmpl.html");return b.build()}])}(),function(){"use strict";angular.module("gantt").factory("GanttTaskGroup",["ganttUtils","GanttTask",function(a,b){var c=function(c,d){var e=this;e.row=c,e.pluginScope=d,e.descendants=e.pluginScope.hierarchy.descendants(e.row),e.tasks=[],e.overviewTasks=[],e.promotedTasks=[],e.showGrouping=!1;var f=e.row.model.groups;"boolean"==typeof f&&(f={enabled:f});var g=function(b){var c=b.model.groups;"boolean"==typeof c&&(c={enabled:c});var d=b.row.model.groups;"boolean"==typeof d&&(d={enabled:d});var g=a.firstProperty([c,d,f],"enabled",e.pluginScope.enabled);if(g){var h=a.firstProperty([c,d,f],"display",e.pluginScope.display);return h}};angular.forEach(e.descendants,function(a){angular.forEach(a.tasks,function(a){var c=g(a);if(void 0!==c){e.tasks.push(a);var d=new b(e.row,a.model);"overview"===c?e.overviewTasks.push(d):"promote"===c?e.promotedTasks.push(d):e.showGrouping=!0}})}),e.from=void 0,angular.forEach(e.tasks,function(a){(void 0===e.from||a.model.from<e.from)&&(e.from=a.model.from)}),e.to=void 0,angular.forEach(e.tasks,function(a){(void 0===e.to||a.model.to>e.to)&&(e.to=a.model.to)}),e.showGrouping&&(e.left=c.rowsManager.gantt.getPositionByDate(e.from),e.width=c.rowsManager.gantt.getPositionByDate(e.to)-e.left)};return c}])}(),function(){"use strict";angular.module("gantt").directive("ganttTaskOverview",["GanttDirectiveBuilder",function(a){var b=new a("ganttTaskOverview","plugins/groups/taskOverview.tmpl.html");return b.controller=function(a,b){a.task.$element=b,a.task.$scope=a,a.task.updatePosAndSize()},b.build()}])}(),angular.module("gantt.groups.templates",[]).run(["$templateCache",function(a){a.put("plugins/groups/taskGroup.tmpl.html",'<div ng-controller="GanttGroupController">\n <div class="gantt-task-group-overview" ng-if="taskGroup.overviewTasks.length > 0">\n <gantt-task-overview ng-repeat="task in taskGroup.overviewTasks"></gantt-task-overview>\n </div>\n <div class="gantt-task-group-promote" ng-if="taskGroup.row._collapsed && taskGroup.promotedTasks.length > 0">\n <gantt-task ng-repeat="task in taskGroup.promotedTasks"></gantt-task>\n </div>\n <div class="gantt-task-group"\n ng-if="taskGroup.showGrouping"\n ng-style="{\'left\': taskGroup.left + \'px\', \'width\': taskGroup.width + \'px\'}">\n <div class="gantt-task-group-left-main"></div>\n <div class="gantt-task-group-right-main"></div>\n <div class="gantt-task-group-left-symbol"></div>\n <div class="gantt-task-group-right-symbol"></div>\n </div>\n</div>\n\n'),a.put("plugins/groups/taskOverview.tmpl.html",'<div class="gantt-task gantt-task-overview" ng-class="task.model.classes">\n <gantt-task-background></gantt-task-background>\n <gantt-task-content></gantt-task-content>\n <gantt-task-foreground></gantt-task-foreground>\n</div>\n\n')}]); +!function(){"use strict";angular.module("gantt.groups",["gantt","gantt.groups.templates"]).directive("ganttGroups",["ganttUtils","GanttHierarchy","$compile","$document",function(a,b,c,d){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",display:"=?"},link:function(a,e,f,g){function h(){a.hierarchy.refresh(g.gantt.rowsManager.filteredRows)}var i=g.gantt.api;if(a.options&&"object"==typeof a.options.sortable)for(var j in a.options.sortable)a[j]=a.options[j];void 0===a.enabled&&(a.enabled=!0),void 0===a.display&&(a.display="group"),a.hierarchy=new b,g.gantt.api.registerMethod("groups","refresh",h,this),g.gantt.$scope.$watchCollection("gantt.rowsManager.filteredRows",function(){h()}),i.directives.on["new"](a,function(b,e,g){if("ganttRow"===b){var h=e.$new();h.pluginScope=a;var i=d[0].createElement("div");angular.element(i).attr("data-ng-if","pluginScope.enabled");var j=d[0].createElement("gantt-task-group");void 0!==f.templateUrl&&angular.element(j).attr("data-template-url",f.templateUrl),void 0!==f.template&&angular.element(j).attr("data-template",f.template),angular.element(i).append(j),g.append(c(i)(h))}})}}}])}(),function(){"use strict";angular.module("gantt.groups").controller("GanttGroupController",["$scope","GanttTaskGroup","ganttUtils",function(a,b,c){var d=function(){var d=a.row.model.groups;"boolean"==typeof d&&(d={enabled:d});var e=c.firstProperty([d],"enabled",a.pluginScope.enabled);e?(a.display=c.firstProperty([d],"display",a.pluginScope.display),a.taskGroup=new b(a.row,a.pluginScope),a.row.setFromTo(),a.row.setFromToByValues(a.taskGroup.from,a.taskGroup.to)):(a.taskGroup=void 0,a.display=void 0)};a.gantt.api.tasks.on.viewChange(a,function(b){if(void 0!==a.taskGroup)if(a.taskGroup.tasks.indexOf(b)>-1)d(),a.$$phase||a.$root.$$phase||a.$digest();else{var c=a.pluginScope.hierarchy.descendants(a.row);c.indexOf(b.row)>-1&&(d(),a.$$phase||a.$root.$$phase||a.$digest())}});var e=a.pluginScope.$watch("display",d);a.$watchCollection("gantt.rowsManager.filteredRows",d),a.gantt.api.columns.on.refresh(a,d),a.$on("$destroy",e)}])}(),function(){"use strict";angular.module("gantt.groups").directive("ganttTaskGroup",["GanttDirectiveBuilder",function(a){var b=new a("ganttTaskGroup","plugins/groups/taskGroup.tmpl.html");return b.build()}])}(),function(){"use strict";angular.module("gantt").factory("GanttTaskGroup",["ganttUtils","GanttTask",function(a,b){var c=function(c,d){var e=this;e.row=c,e.pluginScope=d,e.descendants=e.pluginScope.hierarchy.descendants(e.row),e.tasks=[],e.overviewTasks=[],e.promotedTasks=[],e.showGrouping=!1;var f=e.row.model.groups;"boolean"==typeof f&&(f={enabled:f});for(var g=function(b){var c=b.model.groups;"boolean"==typeof c&&(c={enabled:c});var d=b.row.model.groups;"boolean"==typeof d&&(d={enabled:d});var g=a.firstProperty([c,d,f],"enabled",e.pluginScope.enabled);if(g){var h=a.firstProperty([c,d,f],"display",e.pluginScope.display);return h}},h=0;h<e.descendants.length;h++)for(var i=e.descendants[h].tasks,j=0;j<i.length;j++){var k=i[j],l=g(k);if(void 0!==l){e.tasks.push(k);var m=new b(e.row,k.model);"overview"===l?e.overviewTasks.push(m):"promote"===l?e.promotedTasks.push(m):e.showGrouping=!0}}if(e.from=void 0,f&&(e.from=f.from),void 0===e.from)for(h=0;h<e.tasks.length;h++)(void 0===e.from||e.tasks[h].model.from<e.from)&&(e.from=e.tasks[h].model.from);if(e.to=void 0,f&&(e.to=f.to),void 0===e.to)for(h=0;h<e.tasks.length;h++)(void 0===e.to||e.tasks[h].model.to>e.to)&&(e.to=e.tasks[h].model.to);e.showGrouping&&(e.left=c.rowsManager.gantt.getPositionByDate(e.from),e.width=c.rowsManager.gantt.getPositionByDate(e.to)-e.left)};return c}])}(),function(){"use strict";angular.module("gantt").directive("ganttTaskOverview",["GanttDirectiveBuilder",function(a){var b=new a("ganttTaskOverview","plugins/groups/taskOverview.tmpl.html");return b.controller=function(a,b){a.task.$element=b,a.task.$scope=a,a.task.updatePosAndSize()},b.build()}])}(),angular.module("gantt.groups.templates",[]).run(["$templateCache",function(a){a.put("plugins/groups/taskGroup.tmpl.html",'<div ng-controller="GanttGroupController">\n <div class="gantt-task-group-overview" ng-if="taskGroup.overviewTasks.length > 0">\n <gantt-task-overview ng-repeat="task in taskGroup.overviewTasks"></gantt-task-overview>\n </div>\n <div class="gantt-task-group-promote" ng-if="taskGroup.row._collapsed && taskGroup.promotedTasks.length > 0">\n <gantt-task ng-repeat="task in taskGroup.promotedTasks"></gantt-task>\n </div>\n <div class="gantt-task-group"\n ng-if="taskGroup.showGrouping"\n ng-style="{\'left\': taskGroup.left + \'px\', \'width\': taskGroup.width + \'px\'}">\n <div class="gantt-task-group-left-main"></div>\n <div class="gantt-task-group-right-main"></div>\n <div class="gantt-task-group-left-symbol"></div>\n <div class="gantt-task-group-right-symbol"></div>\n </div>\n</div>\n\n'),a.put("plugins/groups/taskOverview.tmpl.html",'<div class="gantt-task gantt-task-overview" ng-class="task.model.classes">\n <gantt-task-background></gantt-task-background>\n <gantt-task-content></gantt-task-content>\n <gantt-task-foreground></gantt-task-foreground>\n</div>\n\n')}]); //# sourceMappingURL=angular-gantt-groups-plugin.min.js.map \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-groups-plugin.min.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-groups-plugin.min.js.map index ff26556041d9594058a7503ede7e4fd4c58f9831..40dbc23f3920b71234a5de5963974e056226fe2e 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-groups-plugin.min.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-groups-plugin.min.js.map @@ -1 +1 @@ -{"version":3,"file":"angular-gantt-groups-plugin.min.js","sources":["../src/plugins/groups.js","../src/plugins/groups/group.controller.js","../src/plugins/groups/taskGroup.directive.js","../src/plugins/groups/taskGroup.factory.js","../src/plugins/groups/taskOverview.directive.js","../.tmp/generated/plugins/groups/html2js.js"],"names":["angular","module","directive","utils","Hierarchy","$compile","$document","restrict","require","scope","enabled","display","link","element","attrs","ganttCtrl","refresh","hierarchy","gantt","rowsManager","filteredRows","api","options","option","sortable","undefined","registerMethod","this","$scope","$watchCollection","directives","on","directiveName","rowScope","rowElement","taskGroupScope","$new","pluginScope","ifElement","createElement","attr","taskGroupElement","templateUrl","template","append","controller","TaskGroup","updateTaskGroup","rowGroups","row","model","groups","enabledValue","firstProperty","taskGroup","setFromTo","setFromToByValues","from","to","tasks","change","task","indexOf","$evalAsync","descendants","removeWatch","$watch","columns","$on","Builder","builder","build","factory","Task","self","overviewTasks","promotedTasks","showGrouping","groupRowGroups","getTaskDisplay","taskGroups","forEach","descendant","taskDisplay","push","clone","left","getPositionByDate","width","$element","updatePosAndSize","run","$templateCache","put"],"mappings":"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"} \ No newline at end of file +{"version":3,"sources":["../src/plugins/groups.js","../src/plugins/groups/group.controller.js","../src/plugins/groups/taskGroup.directive.js","../src/plugins/groups/taskGroup.factory.js","../src/plugins/groups/taskOverview.directive.js","../.tmp/generated/plugins/groups/html2js.js"],"names":["angular","module","directive","utils","Hierarchy","$compile","$document","restrict","require","scope","enabled","display","link","element","attrs","ganttCtrl","refresh","hierarchy","gantt","rowsManager","filteredRows","api","options","option","sortable","undefined","registerMethod","this","$scope","$watchCollection","directives","on","directiveName","rowScope","rowElement","taskGroupScope","$new","pluginScope","ifElement","createElement","attr","taskGroupElement","templateUrl","template","append","controller","TaskGroup","updateTaskGroup","rowGroups","row","model","groups","enabledValue","firstProperty","taskGroup","setFromTo","setFromToByValues","from","to","tasks","viewChange","task","indexOf","$$phase","$root","$digest","descendants","removeWatch","$watch","columns","$on","Builder","builder","build","factory","Task","self","overviewTasks","promotedTasks","showGrouping","groupRowGroups","getTaskDisplay","taskGroups","i","length","j","taskDisplay","push","clone","left","getPositionByDate","width","$element","updatePosAndSize","run","$templateCache","put"],"mappings":"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","file":"angular-gantt-groups-plugin.min.js"} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-labels-plugin.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-labels-plugin.js index c01b15d421fd6842d70163f51c4ad79d27c0c128..7046e8dfd4bf8099780ea8040d2f740dd9443b41 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-labels-plugin.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-labels-plugin.js @@ -1,5 +1,5 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com @@ -58,10 +58,10 @@ Github: https://github.com/angular-gantt/angular-gantt.git var labels = ganttCtrl.gantt.side.$element[0].getElementsByClassName('gantt-row-label'); var newSideWidth = 0; - angular.forEach(labels, function (label) { - var width = label.children[0].offsetWidth; + for (var i=0; i<labels.length; i++) { + var width = labels[i].children[0].offsetWidth; newSideWidth = Math.max(newSideWidth, width); - }); + } if (newSideWidth >= 0) { api.side.setWidth(newSideWidth); diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-labels-plugin.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-labels-plugin.js.map index f0b9d063bf6c80ec83ce2304097c6005eb1f7212..6461c6c8d10aa9519490030a0a8c1cab487663be 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-labels-plugin.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-labels-plugin.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/plugins/labels.js","../src/plugins/labels/labelsBody.directive.js","../src/plugins/labels/labelsHeader.directive.js","../src/plugins/labels/sideContentLabels.directive.js","../.tmp/generated/plugins/labels/html2js.js"],"names":[],"mappings":"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","file":"angular-gantt-labels-plugin.js","sourcesContent":["(function(){\n 'use strict';\n angular.module('gantt.labels', ['gantt', 'gantt.labels.templates']).directive('ganttLabels', ['ganttUtils', '$compile', '$document', '$log', function(utils, $compile, $document, $log) {\n // Provides the row sort functionality to any Gantt row\n // Uses the sortableState to share the current row\n\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n header: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n $log.warn('Angular Gantt Labels plugin is deprecated. Please use Table plugin instead.');\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.sortable) === 'object') {\n for (var option in scope.options.sortable) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.header === undefined) {\n scope.header = 'Name';\n }\n\n api.directives.on.new(scope, function(directiveName, sideContentScope, sideContentElement) {\n if (directiveName === 'ganttSideContent') {\n var labelsScope = sideContentScope.$new();\n labelsScope.pluginScope = scope;\n\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'pluginScope.enabled');\n angular.element(ifElement).addClass('side-element');\n\n var labelsElement = $document[0].createElement('gantt-side-content-labels');\n angular.element(ifElement).append(labelsElement);\n\n sideContentElement.append($compile(ifElement)(labelsScope));\n }\n });\n\n function fitSideWidthToLabels() {\n var labels = ganttCtrl.gantt.side.$element[0].getElementsByClassName('gantt-row-label');\n var newSideWidth = 0;\n\n angular.forEach(labels, function (label) {\n var width = label.children[0].offsetWidth;\n newSideWidth = Math.max(newSideWidth, width);\n });\n\n if (newSideWidth >= 0) {\n api.side.setWidth(newSideWidth);\n }\n }\n\n api.registerMethod('labels', 'fitSideWidth', fitSideWidthToLabels, this);\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.labels').directive('ganttLabelsBody', ['GanttDirectiveBuilder', 'ganttLayout', function(Builder, layout) {\n var builder = new Builder('ganttLabelsBody', 'plugins/labels/labelsBody.tmpl.html');\n builder.controller = function($scope) {\n var hScrollBarHeight = layout.getScrollBarHeight();\n\n $scope.getLabelsCss = function() {\n var css = {};\n\n if ($scope.maxHeight) {\n var bodyScrollBarHeight = $scope.gantt.scroll.isHScrollbarVisible() ? hScrollBarHeight : 0;\n css['max-height'] = $scope.maxHeight - bodyScrollBarHeight - $scope.gantt.header.getHeight() + 'px';\n }\n\n return css;\n };\n };\n return builder.build();\n }]);\n}());\n\n\n","(function(){\n 'use strict';\n angular.module('gantt.labels').directive('ganttLabelsHeader', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttLabelsHeader', 'plugins/labels/labelsHeader.tmpl.html');\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.labels').directive('ganttSideContentLabels', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttSideContentLabels', 'plugins/labels/sideContentLabels.tmpl.html');\n return builder.build();\n }]);\n}());\n\n","angular.module('gantt.labels.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/labels/labelsBody.tmpl.html',\n '<div class=\"gantt-labels-body\" ng-style=\"getLabelsCss()\">\\n' +\n ' <div gantt-vertical-scroll-receiver>\\n' +\n ' <div ng-repeat=\"row in gantt.rowsManager.visibleRows track by row.model.id\">\\n' +\n ' <div gantt-row-label\\n' +\n ' class=\"gantt-row-label gantt-row-height\"\\n' +\n ' ng-class=\"row.model.classes\"\\n' +\n ' ng-style=\"{\\'height\\': row.model.height}\">\\n' +\n ' <span class=\"gantt-label-text\">{{row.model.name}}</span>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '');\n $templateCache.put('plugins/labels/labelsHeader.tmpl.html',\n '<div class=\"gantt-labels-header\">\\n' +\n ' <div ng-show=\"gantt.columnsManager.columns.length > 0 && gantt.columnsManager.headers.length > 0\">\\n' +\n ' <div ng-repeat=\"header in gantt.columnsManager.headers\">\\n' +\n ' <div class=\"gantt-row-height\" ng-class=\"{\\'gantt-labels-header-row\\': $last, \\'gantt-labels-header-row-last\\': $last}\"><span>{{$last ? pluginScope.header : \"\"}}</span></div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '');\n $templateCache.put('plugins/labels/sideContentLabels.tmpl.html',\n '<div class=\"gantt-side-content-labels\">\\n' +\n ' <gantt-labels-header>\\n' +\n ' </gantt-labels-header>\\n' +\n ' <gantt-labels-body>\\n' +\n ' </gantt-labels-body>\\n' +\n '</div>\\n' +\n '');\n}]);\n"]} \ No newline at end of file +{"version":3,"sources":["../src/plugins/labels.js","../src/plugins/labels/labelsBody.directive.js","../src/plugins/labels/labelsHeader.directive.js","../src/plugins/labels/sideContentLabels.directive.js","../.tmp/generated/plugins/labels/html2js.js"],"names":[],"mappings":"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","file":"angular-gantt-labels-plugin.js","sourcesContent":["(function(){\n 'use strict';\n angular.module('gantt.labels', ['gantt', 'gantt.labels.templates']).directive('ganttLabels', ['ganttUtils', '$compile', '$document', '$log', function(utils, $compile, $document, $log) {\n // Provides the row sort functionality to any Gantt row\n // Uses the sortableState to share the current row\n\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n header: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n $log.warn('Angular Gantt Labels plugin is deprecated. Please use Table plugin instead.');\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.sortable) === 'object') {\n for (var option in scope.options.sortable) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.header === undefined) {\n scope.header = 'Name';\n }\n\n api.directives.on.new(scope, function(directiveName, sideContentScope, sideContentElement) {\n if (directiveName === 'ganttSideContent') {\n var labelsScope = sideContentScope.$new();\n labelsScope.pluginScope = scope;\n\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'pluginScope.enabled');\n angular.element(ifElement).addClass('side-element');\n\n var labelsElement = $document[0].createElement('gantt-side-content-labels');\n angular.element(ifElement).append(labelsElement);\n\n sideContentElement.append($compile(ifElement)(labelsScope));\n }\n });\n\n function fitSideWidthToLabels() {\n var labels = ganttCtrl.gantt.side.$element[0].getElementsByClassName('gantt-row-label');\n var newSideWidth = 0;\n\n for (var i=0; i<labels.length; i++) {\n var width = labels[i].children[0].offsetWidth;\n newSideWidth = Math.max(newSideWidth, width);\n }\n\n if (newSideWidth >= 0) {\n api.side.setWidth(newSideWidth);\n }\n }\n\n api.registerMethod('labels', 'fitSideWidth', fitSideWidthToLabels, this);\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.labels').directive('ganttLabelsBody', ['GanttDirectiveBuilder', 'ganttLayout', function(Builder, layout) {\n var builder = new Builder('ganttLabelsBody', 'plugins/labels/labelsBody.tmpl.html');\n builder.controller = function($scope) {\n var hScrollBarHeight = layout.getScrollBarHeight();\n\n $scope.getLabelsCss = function() {\n var css = {};\n\n if ($scope.maxHeight) {\n var bodyScrollBarHeight = $scope.gantt.scroll.isHScrollbarVisible() ? hScrollBarHeight : 0;\n css['max-height'] = $scope.maxHeight - bodyScrollBarHeight - $scope.gantt.header.getHeight() + 'px';\n }\n\n return css;\n };\n };\n return builder.build();\n }]);\n}());\n\n\n","(function(){\n 'use strict';\n angular.module('gantt.labels').directive('ganttLabelsHeader', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttLabelsHeader', 'plugins/labels/labelsHeader.tmpl.html');\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.labels').directive('ganttSideContentLabels', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttSideContentLabels', 'plugins/labels/sideContentLabels.tmpl.html');\n return builder.build();\n }]);\n}());\n\n","angular.module('gantt.labels.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/labels/labelsBody.tmpl.html',\n '<div class=\"gantt-labels-body\" ng-style=\"getLabelsCss()\">\\n' +\n ' <div gantt-vertical-scroll-receiver>\\n' +\n ' <div ng-repeat=\"row in gantt.rowsManager.visibleRows track by row.model.id\">\\n' +\n ' <div gantt-row-label\\n' +\n ' class=\"gantt-row-label gantt-row-height\"\\n' +\n ' ng-class=\"row.model.classes\"\\n' +\n ' ng-style=\"{\\'height\\': row.model.height}\">\\n' +\n ' <span class=\"gantt-label-text\">{{row.model.name}}</span>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '');\n $templateCache.put('plugins/labels/labelsHeader.tmpl.html',\n '<div class=\"gantt-labels-header\">\\n' +\n ' <div ng-show=\"gantt.columnsManager.columns.length > 0 && gantt.columnsManager.headers.length > 0\">\\n' +\n ' <div ng-repeat=\"header in gantt.columnsManager.headers\">\\n' +\n ' <div class=\"gantt-row-height\" ng-class=\"{\\'gantt-labels-header-row\\': $last, \\'gantt-labels-header-row-last\\': $last}\"><span>{{$last ? pluginScope.header : \"\"}}</span></div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '');\n $templateCache.put('plugins/labels/sideContentLabels.tmpl.html',\n '<div class=\"gantt-side-content-labels\">\\n' +\n ' <gantt-labels-header>\\n' +\n ' </gantt-labels-header>\\n' +\n ' <gantt-labels-body>\\n' +\n ' </gantt-labels-body>\\n' +\n '</div>\\n' +\n '');\n}]);\n"]} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-labels-plugin.min.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-labels-plugin.min.js index d8cb6afea76426c325f93d647cdc012bf636b86d..e7ec1c5a2f5675bb4b0d7d3f69b5d7d1c0d086fc 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-labels-plugin.min.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-labels-plugin.min.js @@ -1,10 +1,10 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com Github: https://github.com/angular-gantt/angular-gantt.git */ -!function(){"use strict";angular.module("gantt.labels",["gantt","gantt.labels.templates"]).directive("ganttLabels",["ganttUtils","$compile","$document","$log",function(a,b,c,d){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",header:"=?"},link:function(a,e,f,g){function h(){var a=g.gantt.side.$element[0].getElementsByClassName("gantt-row-label"),b=0;angular.forEach(a,function(a){var c=a.children[0].offsetWidth;b=Math.max(b,c)}),b>=0&&i.side.setWidth(b)}var i=g.gantt.api;if(d.warn("Angular Gantt Labels plugin is deprecated. Please use Table plugin instead."),a.options&&"object"==typeof a.options.sortable)for(var j in a.options.sortable)a[j]=a.options[j];void 0===a.enabled&&(a.enabled=!0),void 0===a.header&&(a.header="Name"),i.directives.on["new"](a,function(d,e,f){if("ganttSideContent"===d){var g=e.$new();g.pluginScope=a;var h=c[0].createElement("div");angular.element(h).attr("data-ng-if","pluginScope.enabled"),angular.element(h).addClass("side-element");var i=c[0].createElement("gantt-side-content-labels");angular.element(h).append(i),f.append(b(h)(g))}}),i.registerMethod("labels","fitSideWidth",h,this)}}}])}(),function(){"use strict";angular.module("gantt.labels").directive("ganttLabelsBody",["GanttDirectiveBuilder","ganttLayout",function(a,b){var c=new a("ganttLabelsBody","plugins/labels/labelsBody.tmpl.html");return c.controller=function(a){var c=b.getScrollBarHeight();a.getLabelsCss=function(){var b={};if(a.maxHeight){var d=a.gantt.scroll.isHScrollbarVisible()?c:0;b["max-height"]=a.maxHeight-d-a.gantt.header.getHeight()+"px"}return b}},c.build()}])}(),function(){"use strict";angular.module("gantt.labels").directive("ganttLabelsHeader",["GanttDirectiveBuilder",function(a){var b=new a("ganttLabelsHeader","plugins/labels/labelsHeader.tmpl.html");return b.build()}])}(),function(){"use strict";angular.module("gantt.labels").directive("ganttSideContentLabels",["GanttDirectiveBuilder",function(a){var b=new a("ganttSideContentLabels","plugins/labels/sideContentLabels.tmpl.html");return b.build()}])}(),angular.module("gantt.labels.templates",[]).run(["$templateCache",function(a){a.put("plugins/labels/labelsBody.tmpl.html",'<div class="gantt-labels-body" ng-style="getLabelsCss()">\n <div gantt-vertical-scroll-receiver>\n <div ng-repeat="row in gantt.rowsManager.visibleRows track by row.model.id">\n <div gantt-row-label\n class="gantt-row-label gantt-row-height"\n ng-class="row.model.classes"\n ng-style="{\'height\': row.model.height}">\n <span class="gantt-label-text">{{row.model.name}}</span>\n </div>\n </div>\n </div>\n</div>\n'),a.put("plugins/labels/labelsHeader.tmpl.html",'<div class="gantt-labels-header">\n <div ng-show="gantt.columnsManager.columns.length > 0 && gantt.columnsManager.headers.length > 0">\n <div ng-repeat="header in gantt.columnsManager.headers">\n <div class="gantt-row-height" ng-class="{\'gantt-labels-header-row\': $last, \'gantt-labels-header-row-last\': $last}"><span>{{$last ? pluginScope.header : ""}}</span></div>\n </div>\n </div>\n</div>\n'),a.put("plugins/labels/sideContentLabels.tmpl.html",'<div class="gantt-side-content-labels">\n <gantt-labels-header>\n </gantt-labels-header>\n <gantt-labels-body>\n </gantt-labels-body>\n</div>\n')}]); +!function(){"use strict";angular.module("gantt.labels",["gantt","gantt.labels.templates"]).directive("ganttLabels",["ganttUtils","$compile","$document","$log",function(a,b,c,d){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",header:"=?"},link:function(a,e,f,g){function h(){for(var a=g.gantt.side.$element[0].getElementsByClassName("gantt-row-label"),b=0,c=0;c<a.length;c++){var d=a[c].children[0].offsetWidth;b=Math.max(b,d)}b>=0&&i.side.setWidth(b)}var i=g.gantt.api;if(d.warn("Angular Gantt Labels plugin is deprecated. Please use Table plugin instead."),a.options&&"object"==typeof a.options.sortable)for(var j in a.options.sortable)a[j]=a.options[j];void 0===a.enabled&&(a.enabled=!0),void 0===a.header&&(a.header="Name"),i.directives.on["new"](a,function(d,e,f){if("ganttSideContent"===d){var g=e.$new();g.pluginScope=a;var h=c[0].createElement("div");angular.element(h).attr("data-ng-if","pluginScope.enabled"),angular.element(h).addClass("side-element");var i=c[0].createElement("gantt-side-content-labels");angular.element(h).append(i),f.append(b(h)(g))}}),i.registerMethod("labels","fitSideWidth",h,this)}}}])}(),function(){"use strict";angular.module("gantt.labels").directive("ganttLabelsBody",["GanttDirectiveBuilder","ganttLayout",function(a,b){var c=new a("ganttLabelsBody","plugins/labels/labelsBody.tmpl.html");return c.controller=function(a){var c=b.getScrollBarHeight();a.getLabelsCss=function(){var b={};if(a.maxHeight){var d=a.gantt.scroll.isHScrollbarVisible()?c:0;b["max-height"]=a.maxHeight-d-a.gantt.header.getHeight()+"px"}return b}},c.build()}])}(),function(){"use strict";angular.module("gantt.labels").directive("ganttLabelsHeader",["GanttDirectiveBuilder",function(a){var b=new a("ganttLabelsHeader","plugins/labels/labelsHeader.tmpl.html");return b.build()}])}(),function(){"use strict";angular.module("gantt.labels").directive("ganttSideContentLabels",["GanttDirectiveBuilder",function(a){var b=new a("ganttSideContentLabels","plugins/labels/sideContentLabels.tmpl.html");return b.build()}])}(),angular.module("gantt.labels.templates",[]).run(["$templateCache",function(a){a.put("plugins/labels/labelsBody.tmpl.html",'<div class="gantt-labels-body" ng-style="getLabelsCss()">\n <div gantt-vertical-scroll-receiver>\n <div ng-repeat="row in gantt.rowsManager.visibleRows track by row.model.id">\n <div gantt-row-label\n class="gantt-row-label gantt-row-height"\n ng-class="row.model.classes"\n ng-style="{\'height\': row.model.height}">\n <span class="gantt-label-text">{{row.model.name}}</span>\n </div>\n </div>\n </div>\n</div>\n'),a.put("plugins/labels/labelsHeader.tmpl.html",'<div class="gantt-labels-header">\n <div ng-show="gantt.columnsManager.columns.length > 0 && gantt.columnsManager.headers.length > 0">\n <div ng-repeat="header in gantt.columnsManager.headers">\n <div class="gantt-row-height" ng-class="{\'gantt-labels-header-row\': $last, \'gantt-labels-header-row-last\': $last}"><span>{{$last ? pluginScope.header : ""}}</span></div>\n </div>\n </div>\n</div>\n'),a.put("plugins/labels/sideContentLabels.tmpl.html",'<div class="gantt-side-content-labels">\n <gantt-labels-header>\n </gantt-labels-header>\n <gantt-labels-body>\n </gantt-labels-body>\n</div>\n')}]); //# sourceMappingURL=angular-gantt-labels-plugin.min.js.map \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-labels-plugin.min.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-labels-plugin.min.js.map index 35b051c3a9c331c707835b71b5b71692c4b40bfc..43149e43ddd8686c66402e7546f6ba25ecd43b53 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-labels-plugin.min.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-labels-plugin.min.js.map @@ -1 +1 @@ -{"version":3,"file":"angular-gantt-labels-plugin.min.js","sources":["../src/plugins/labels.js","../src/plugins/labels/labelsBody.directive.js","../src/plugins/labels/labelsHeader.directive.js","../src/plugins/labels/sideContentLabels.directive.js","../.tmp/generated/plugins/labels/html2js.js"],"names":["angular","module","directive","utils","$compile","$document","$log","restrict","require","scope","enabled","header","link","element","attrs","ganttCtrl","fitSideWidthToLabels","labels","gantt","side","$element","getElementsByClassName","newSideWidth","forEach","label","width","children","offsetWidth","Math","max","api","setWidth","warn","options","option","sortable","undefined","directives","on","directiveName","sideContentScope","sideContentElement","labelsScope","$new","pluginScope","ifElement","createElement","attr","addClass","labelsElement","append","registerMethod","this","Builder","layout","builder","controller","$scope","hScrollBarHeight","getScrollBarHeight","getLabelsCss","css","maxHeight","bodyScrollBarHeight","scroll","isHScrollbarVisible","getHeight","build","run","$templateCache","put"],"mappings":";;;;;;;;CAAC,WACG,YACAA,SAAQC,OAAO,gBAAiB,QAAS,2BAA2BC,UAAU,eAAgB,aAAc,WAAY,YAAa,OAAQ,SAASC,EAAOC,EAAUC,EAAWC,GAI9K,OACIC,SAAU,IACVC,QAAS,SACTC,OACIC,QAAS,KACTC,OAAQ,MAEZC,KAAM,SAASH,EAAOI,EAASC,EAAOC,GAoClC,QAASC,KACL,GAAIC,GAASF,EAAUG,MAAMC,KAAKC,SAAS,GAAGC,uBAAuB,mBACjEC,EAAe,CAEnBtB,SAAQuB,QAAQN,EAAQ,SAAUO,GAC9B,GAAIC,GAAQD,EAAME,SAAS,GAAGC,WAC9BL,GAAeM,KAAKC,IAAIP,EAAcG,KAGtCH,GAAgB,GAChBQ,EAAIX,KAAKY,SAAST,GA7C1B,GAAIQ,GAAMf,EAAUG,MAAMY,GAK1B,IAHAxB,EAAK0B,KAAK,+EAGNvB,EAAMwB,SAA8C,gBAA5BxB,GAAMwB,QAAgB,SAC9C,IAAK,GAAIC,KAAUzB,GAAMwB,QAAQE,SAC7B1B,EAAMyB,GAAUzB,EAAMwB,QAAQC,EAIhBE,UAAlB3B,EAAMC,UACND,EAAMC,SAAU,GAGC0B,SAAjB3B,EAAME,SACNF,EAAME,OAAS,QAGnBmB,EAAIO,WAAWC,GAAfR,OAAsBrB,EAAO,SAAS8B,EAAeC,EAAkBC,GACnE,GAAsB,qBAAlBF,EAAsC,CACtC,GAAIG,GAAcF,EAAiBG,MACnCD,GAAYE,YAAcnC,CAE1B,IAAIoC,GAAYxC,EAAU,GAAGyC,cAAc,MAC3C9C,SAAQa,QAAQgC,GAAWE,KAAK,aAAc,uBAC9C/C,QAAQa,QAAQgC,GAAWG,SAAS,eAEpC,IAAIC,GAAgB5C,EAAU,GAAGyC,cAAc,4BAC/C9C,SAAQa,QAAQgC,GAAWK,OAAOD,GAElCR,EAAmBS,OAAO9C,EAASyC,GAAWH,OAkBtDZ,EAAIqB,eAAe,SAAU,eAAgBnC,EAAsBoC,cC/DlF,WACG,YACApD,SAAQC,OAAO,gBAAgBC,UAAU,mBAAoB,wBAAyB,cAAe,SAASmD,EAASC,GACnH,GAAIC,GAAU,GAAIF,GAAQ,kBAAmB,sCAe7C,OAdAE,GAAQC,WAAa,SAASC,GAC1B,GAAIC,GAAmBJ,EAAOK,oBAE9BF,GAAOG,aAAe,WAClB,GAAIC,KAEJ,IAAIJ,EAAOK,UAAW,CAClB,GAAIC,GAAsBN,EAAOvC,MAAM8C,OAAOC,sBAAwBP,EAAmB,CACzFG,GAAI,cAAgBJ,EAAOK,UAAYC,EAAsBN,EAAOvC,MAAMP,OAAOuD,YAAc,KAGnG,MAAOL,KAGRN,EAAQY,cClBtB,WACG,YACAnE,SAAQC,OAAO,gBAAgBC,UAAU,qBAAsB,wBAAyB,SAASmD,GAC7F,GAAIE,GAAU,GAAIF,GAAQ,oBAAqB,wCAC/C,OAAOE,GAAQY,cCJtB,WACG,YACAnE,SAAQC,OAAO,gBAAgBC,UAAU,0BAA2B,wBAAyB,SAASmD,GAClG,GAAIE,GAAU,GAAIF,GAAQ,yBAA0B,6CACpD,OAAOE,GAAQY,cCJvBnE,QAAQC,OAAO,6BAA8BmE,KAAK,iBAAkB,SAASC,GACzEA,EAAeC,IAAI,sCACf,0gBAaJD,EAAeC,IAAI,wCACf,gbAQJD,EAAeC,IAAI,6CACf"} \ No newline at end of file +{"version":3,"sources":["../src/plugins/labels.js","../src/plugins/labels/labelsBody.directive.js","../src/plugins/labels/labelsHeader.directive.js","../src/plugins/labels/sideContentLabels.directive.js","../.tmp/generated/plugins/labels/html2js.js"],"names":["angular","module","directive","utils","$compile","$document","$log","restrict","require","scope","enabled","header","link","element","attrs","ganttCtrl","fitSideWidthToLabels","labels","gantt","side","$element","getElementsByClassName","newSideWidth","i","length","width","children","offsetWidth","Math","max","api","setWidth","warn","options","option","sortable","undefined","directives","on","directiveName","sideContentScope","sideContentElement","labelsScope","$new","pluginScope","ifElement","createElement","attr","addClass","labelsElement","append","registerMethod","this","Builder","layout","builder","controller","$scope","hScrollBarHeight","getScrollBarHeight","getLabelsCss","css","maxHeight","bodyScrollBarHeight","scroll","isHScrollbarVisible","getHeight","build","run","$templateCache","put"],"mappings":";;;;;;;;CAAC,WACG,YACAA,SAAQC,OAAO,gBAAiB,QAAS,2BAA2BC,UAAU,eAAgB,aAAc,WAAY,YAAa,OAAQ,SAASC,EAAOC,EAAUC,EAAWC,GAI9K,OACIC,SAAU,IACVC,QAAS,SACTC,OACIC,QAAS,KACTC,OAAQ,MAEZC,KAAM,SAASH,EAAOI,EAASC,EAAOC,GAoClC,QAASC,KAIL,IAAK,GAHDC,GAASF,EAAUG,MAAMC,KAAKC,SAAS,GAAGC,uBAAuB,mBACjEC,EAAe,EAEVC,EAAE,EAAGA,EAAEN,EAAOO,OAAQD,IAAK,CAChC,GAAIE,GAAQR,EAAOM,GAAGG,SAAS,GAAGC,WAClCL,GAAeM,KAAKC,IAAIP,EAAcG,GAGtCH,GAAgB,GAChBQ,EAAIX,KAAKY,SAAST,GA7C1B,GAAIQ,GAAMf,EAAUG,MAAMY,GAK1B,IAHAxB,EAAK0B,KAAK,+EAGNvB,EAAMwB,SAA8C,gBAA5BxB,GAAMwB,QAAgB,SAC9C,IAAK,GAAIC,KAAUzB,GAAMwB,QAAQE,SAC7B1B,EAAMyB,GAAUzB,EAAMwB,QAAQC,EAIhBE,UAAlB3B,EAAMC,UACND,EAAMC,SAAU,GAGC0B,SAAjB3B,EAAME,SACNF,EAAME,OAAS,QAGnBmB,EAAIO,WAAWC,GAAfR,OAAsBrB,EAAO,SAAS8B,EAAeC,EAAkBC,GACnE,GAAsB,qBAAlBF,EAAsC,CACtC,GAAIG,GAAcF,EAAiBG,MACnCD,GAAYE,YAAcnC,CAE1B,IAAIoC,GAAYxC,EAAU,GAAGyC,cAAc,MAC3C9C,SAAQa,QAAQgC,GAAWE,KAAK,aAAc,uBAC9C/C,QAAQa,QAAQgC,GAAWG,SAAS,eAEpC,IAAIC,GAAgB5C,EAAU,GAAGyC,cAAc,4BAC/C9C,SAAQa,QAAQgC,GAAWK,OAAOD,GAElCR,EAAmBS,OAAO9C,EAASyC,GAAWH,OAkBtDZ,EAAIqB,eAAe,SAAU,eAAgBnC,EAAsBoC,cC/DlF,WACG,YACApD,SAAQC,OAAO,gBAAgBC,UAAU,mBAAoB,wBAAyB,cAAe,SAASmD,EAASC,GACnH,GAAIC,GAAU,GAAIF,GAAQ,kBAAmB,sCAe7C,OAdAE,GAAQC,WAAa,SAASC,GAC1B,GAAIC,GAAmBJ,EAAOK,oBAE9BF,GAAOG,aAAe,WAClB,GAAIC,KAEJ,IAAIJ,EAAOK,UAAW,CAClB,GAAIC,GAAsBN,EAAOvC,MAAM8C,OAAOC,sBAAwBP,EAAmB,CACzFG,GAAI,cAAgBJ,EAAOK,UAAYC,EAAsBN,EAAOvC,MAAMP,OAAOuD,YAAc,KAGnG,MAAOL,KAGRN,EAAQY,cClBtB,WACG,YACAnE,SAAQC,OAAO,gBAAgBC,UAAU,qBAAsB,wBAAyB,SAASmD,GAC7F,GAAIE,GAAU,GAAIF,GAAQ,oBAAqB,wCAC/C,OAAOE,GAAQY,cCJtB,WACG,YACAnE,SAAQC,OAAO,gBAAgBC,UAAU,0BAA2B,wBAAyB,SAASmD,GAClG,GAAIE,GAAU,GAAIF,GAAQ,yBAA0B,6CACpD,OAAOE,GAAQY,cCJvBnE,QAAQC,OAAO,6BAA8BmE,KAAK,iBAAkB,SAASC,GACzEA,EAAeC,IAAI,sCACf,0gBAaJD,EAAeC,IAAI,wCACf,gbAQJD,EAAeC,IAAI,6CACf","file":"angular-gantt-labels-plugin.min.js"} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-movable-plugin.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-movable-plugin.js index caa0bd7461794a7bb4c285917ade41b7e838e79d..024d4199276fee624b8ea816454781615826f855 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-movable-plugin.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-movable-plugin.js @@ -1,5 +1,5 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com @@ -7,6 +7,8 @@ Github: https://github.com/angular-gantt/angular-gantt.git */ (function(){ 'use strict'; + + /* jshint latedef: false */ angular.module('gantt.movable', ['gantt']).directive('ganttMovable', ['ganttMouseButton', 'ganttMouseOffset', 'ganttSmartEvent', 'ganttMovableOptions', 'ganttUtils', 'ganttDom', '$window', '$document', '$timeout', function(mouseButton, mouseOffset, smartEvent, movableOptions, utils, dom, $window, $document, $timeout) { // Provides moving and resizing of tasks @@ -76,16 +78,16 @@ Github: https://github.com/angular-gantt/angular-gantt.git var taskMovable = taskScope.task.model.movable; var rowMovable = taskScope.task.row.model.movable; - if (typeof(taskMovable) === 'boolean') { + if (typeof(taskMovable) === 'boolean' || angular.isFunction(taskMovable)) { taskMovable = {enabled: taskMovable}; } - if (typeof(rowMovable) === 'boolean') { + if (typeof(rowMovable) === 'boolean' || angular.isFunction(rowMovable)) { rowMovable = {enabled: rowMovable}; } var enabledValue = utils.firstProperty([taskMovable, rowMovable], 'enabled', scope.enabled); - var enabled = angular.isFunction(enabledValue) ? enabledValue(evt): enabledValue; + var enabled = angular.isFunction(enabledValue) ? enabledValue(evt, taskScope.task): enabledValue; if (enabled) { var taskOffsetX = mouseOffset.getOffsetForElement(foregroundElement[0], evt).x; var mode = getMoveMode(taskOffsetX); @@ -103,16 +105,16 @@ Github: https://github.com/angular-gantt/angular-gantt.git var taskMovable = taskScope.task.model.movable; var rowMovable = taskScope.task.row.model.movable; - if (typeof(taskMovable) === 'boolean') { + if (typeof(taskMovable) === 'boolean' || angular.isFunction(taskMovable)) { taskMovable = {enabled: taskMovable}; } - if (typeof(rowMovable) === 'boolean') { + if (typeof(rowMovable) === 'boolean' || angular.isFunction(rowMovable)) { rowMovable = {enabled: rowMovable}; } var enabledValue = utils.firstProperty([taskMovable, rowMovable], 'enabled', scope.enabled); - var enabled = angular.isFunction(enabledValue) ? enabledValue(evt): enabledValue; + var enabled = angular.isFunction(enabledValue) ? enabledValue(evt, taskScope.task): enabledValue; if (enabled && !taskScope.task.isMoving) { var taskOffsetX = mouseOffset.getOffsetForElement(foregroundElement[0], evt).x; var mode = getMoveMode(taskOffsetX); @@ -147,11 +149,11 @@ Github: https://github.com/angular-gantt/angular-gantt.git var taskMovable = taskScope.task.model.movable; var rowMovable = taskScope.task.row.model.movable; - if (typeof(taskMovable) === 'boolean') { + if (typeof(taskMovable) === 'boolean' || angular.isFunction(taskMovable)) { taskMovable = {enabled: taskMovable}; } - if (typeof(rowMovable) === 'boolean') { + if (typeof(rowMovable) === 'boolean' || angular.isFunction(rowMovable)) { rowMovable = {enabled: rowMovable}; } @@ -180,8 +182,6 @@ Github: https://github.com/angular-gantt/angular-gantt.git if (targetRow !== undefined && sourceRow !== targetRow) { targetRow.moveTaskToRow(taskScope.task, true); - sourceRow.$scope.$digest(); - targetRow.$scope.$digest(); taskHasBeenChanged = true; } } @@ -402,7 +402,12 @@ Github: https://github.com/angular-gantt/angular-gantt.git getBackgroundElement.removeClass('gantt-task-resizing'); if (taskScope.task.originalModel !== undefined) { - angular.extend(taskScope.task.originalModel, taskScope.task.model); + + taskScope.task.originalModel.from = taskScope.task.model.from; + taskScope.task.originalModel.to = taskScope.task.model.to; + taskScope.task.originalModel.lct = taskScope.task.model.lct; + taskScope.task.originalModel.est = taskScope.task.model.est; + taskScope.task.model = taskScope.task.originalModel; if (taskScope.task.row.model.id !== taskScope.task.originalRow.model.id) { var targetRow = taskScope.task.row; @@ -475,7 +480,7 @@ Github: https://github.com/angular-gantt/angular-gantt.git return { initialize: function(options) { - options.enabled = options.enabled !== undefined ? !!options.enabled : true; + options.enabled = options.enabled !== undefined ? options.enabled : true; options.allowMoving = options.allowMoving !== undefined ? !!options.allowMoving : true; options.allowResizing = options.allowResizing !== undefined ? !!options.allowResizing : true; options.allowRowSwitching = options.allowRowSwitching !== undefined ? !!options.allowRowSwitching : true; diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-movable-plugin.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-movable-plugin.js.map index e98d1c565f7646542386628ba54caa4a43e19baf..e09330c60eab80628354ea5547a44a83dc6105bd 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-movable-plugin.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-movable-plugin.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/plugins/movable.js","../src/plugins/movable/movableOptions.factory.js","../.tmp/generated/plugins/movable/html2js.js"],"names":[],"mappings":"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","file":"angular-gantt-movable-plugin.js","sourcesContent":["(function(){\n 'use strict';\n angular.module('gantt.movable', ['gantt']).directive('ganttMovable', ['ganttMouseButton', 'ganttMouseOffset', 'ganttSmartEvent', 'ganttMovableOptions', 'ganttUtils', 'ganttDom', '$window', '$document', '$timeout',\n function(mouseButton, mouseOffset, smartEvent, movableOptions, utils, dom, $window, $document, $timeout) {\n // Provides moving and resizing of tasks\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n allowMoving: '=?',\n allowResizing: '=?',\n allowRowSwitching: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.movable) === 'object') {\n for (var option in scope.options.movable) {\n scope[option] = scope.options[option];\n }\n }\n\n movableOptions.initialize(scope);\n\n api.registerEvent('tasks', 'move');\n api.registerEvent('tasks', 'moveBegin');\n api.registerEvent('tasks', 'moveEnd');\n api.registerEvent('tasks', 'resize');\n api.registerEvent('tasks', 'resizeBegin');\n api.registerEvent('tasks', 'resizeEnd');\n api.registerEvent('tasks', 'change');\n\n var _hasTouch = ('ontouchstart' in $window) || $window.DocumentTouch && $document[0] instanceof $window.DocumentTouch;\n var _pressEvents = 'touchstart mousedown';\n var _moveEvents = 'touchmove mousemove';\n var _releaseEvents = 'touchend mouseup';\n\n var taskWithSmallWidth = 15;\n var resizeAreaWidthBig = 5;\n var resizeAreaWidthSmall = 3;\n var scrollSpeed = 15;\n var scrollTriggerDistance = 5;\n var mouseStartOffsetX;\n var moveStartX;\n\n api.directives.on.new(scope, function(directiveName, taskScope, taskElement) {\n if (directiveName === 'ganttTask') {\n var windowElement = angular.element($window);\n var ganttBodyElement = taskScope.row.rowsManager.gantt.body.$element;\n var ganttScrollElement = taskScope.row.rowsManager.gantt.scroll.$element;\n\n var taskHasBeenChanged = false;\n var taskHasBeenMovedFromAnotherRow = false;\n var scrollInterval;\n\n var foregroundElement = taskScope.task.getForegroundElement();\n\n // IE<11 doesn't support `pointer-events: none`\n // So task content element must be added to support moving properly.\n var contentElement = taskScope.task.getContentElement();\n\n var onPressEvents = function(evt) {\n evt.preventDefault();\n if (_hasTouch) {\n evt = mouseOffset.getTouch(evt);\n }\n var taskMovable = taskScope.task.model.movable;\n var rowMovable = taskScope.task.row.model.movable;\n\n if (typeof(taskMovable) === 'boolean') {\n taskMovable = {enabled: taskMovable};\n }\n\n if (typeof(rowMovable) === 'boolean') {\n rowMovable = {enabled: rowMovable};\n }\n\n var enabledValue = utils.firstProperty([taskMovable, rowMovable], 'enabled', scope.enabled);\n var enabled = angular.isFunction(enabledValue) ? enabledValue(evt): enabledValue;\n if (enabled) {\n var taskOffsetX = mouseOffset.getOffsetForElement(foregroundElement[0], evt).x;\n var mode = getMoveMode(taskOffsetX);\n if (mode !== '' && mouseButton.getButton(evt) === 1) {\n var bodyOffsetX = mouseOffset.getOffsetForElement(ganttBodyElement[0], evt).x;\n enableMoveMode(mode, bodyOffsetX);\n }\n taskScope.$digest();\n }\n };\n foregroundElement.on(_pressEvents, onPressEvents);\n contentElement.on(_pressEvents, onPressEvents);\n\n var onMousemove = function (evt) {\n var taskMovable = taskScope.task.model.movable;\n var rowMovable = taskScope.task.row.model.movable;\n\n if (typeof(taskMovable) === 'boolean') {\n taskMovable = {enabled: taskMovable};\n }\n\n if (typeof(rowMovable) === 'boolean') {\n rowMovable = {enabled: rowMovable};\n }\n\n var enabledValue = utils.firstProperty([taskMovable, rowMovable], 'enabled', scope.enabled);\n var enabled = angular.isFunction(enabledValue) ? enabledValue(evt): enabledValue;\n if (enabled && !taskScope.task.isMoving) {\n var taskOffsetX = mouseOffset.getOffsetForElement(foregroundElement[0], evt).x;\n var mode = getMoveMode(taskOffsetX);\n if (mode !== '' && mode !== 'M') {\n foregroundElement.css('cursor', getCursor(mode));\n contentElement.css('cursor', getCursor(mode));\n } else {\n foregroundElement.css('cursor', '');\n contentElement.css('cursor', '');\n }\n }\n };\n foregroundElement.on('mousemove', onMousemove);\n contentElement.on('mousemove', onMousemove);\n\n var handleMove = function(evt) {\n if (taskScope.task.isMoving && !taskScope.destroyed) {\n clearScrollInterval();\n moveTask(evt);\n scrollScreen(evt);\n }\n };\n\n var moveTask = function(evt) {\n var oldTaskHasBeenChanged = taskHasBeenChanged;\n\n var mousePos = mouseOffset.getOffsetForElement(ganttBodyElement[0], evt);\n var x = mousePos.x;\n taskScope.task.mouseOffsetX = x;\n var taskOutOfRange = taskScope.task.row.rowsManager.gantt.options.value('taskOutOfRange');\n\n var taskMovable = taskScope.task.model.movable;\n var rowMovable = taskScope.task.row.model.movable;\n\n if (typeof(taskMovable) === 'boolean') {\n taskMovable = {enabled: taskMovable};\n }\n\n if (typeof(rowMovable) === 'boolean') {\n rowMovable = {enabled: rowMovable};\n }\n\n if (taskScope.task.moveMode === 'M') {\n var allowRowSwitching = utils.firstProperty([taskMovable, rowMovable], 'allowRowSwitching', scope.allowRowSwitching);\n if (allowRowSwitching) {\n var scrollRect = ganttScrollElement[0].getBoundingClientRect();\n var rowCenterLeft = scrollRect.left + scrollRect.width / 2;\n var ganttBody = angular.element($document[0].querySelectorAll('.gantt-body'));\n ganttBody.css('pointer-events', 'auto'); // pointer-events must be enabled for following to work.\n var targetRowElement = dom.findElementFromPoint(rowCenterLeft, evt.clientY, function(element) {\n return angular.element(element).hasClass('gantt-row');\n });\n ganttBody.css('pointer-events', '');\n\n var rows = ganttCtrl.gantt.rowsManager.rows;\n var targetRow;\n for (var i= 0, l=rows.length; i<l; i++) {\n if (targetRowElement === rows[i].$element[0]) {\n targetRow = rows[i];\n break;\n }\n }\n\n var sourceRow = taskScope.task.row;\n\n if (targetRow !== undefined && sourceRow !== targetRow) {\n targetRow.moveTaskToRow(taskScope.task, true);\n sourceRow.$scope.$digest();\n targetRow.$scope.$digest();\n taskHasBeenChanged = true;\n }\n }\n\n var allowMoving = utils.firstProperty([taskMovable, rowMovable], 'allowMoving', scope.allowMoving);\n if (allowMoving) {\n x = x - mouseStartOffsetX;\n\n if (taskOutOfRange !== 'truncate') {\n if (x < 0) {\n x = 0;\n } else if (x + taskScope.task.width >= taskScope.gantt.width) {\n x = taskScope.gantt.width - taskScope.task.width;\n }\n }\n\n taskScope.task.moveTo(x, true);\n taskScope.$digest();\n\n if (taskHasBeenChanged) {\n taskScope.row.rowsManager.gantt.api.tasks.raise.move(taskScope.task);\n }\n taskHasBeenChanged = true;\n }\n } else if (taskScope.task.moveMode === 'E') {\n if (x <= taskScope.task.left) {\n x = taskScope.task.left;\n taskScope.task.moveMode = 'W';\n setGlobalCursor(getCursor(taskScope.task.moveMode ));\n }\n\n if (taskOutOfRange !== 'truncate' && x >= taskScope.gantt.width) {\n x = taskScope.gantt.width;\n }\n\n taskScope.task.setTo(x, true);\n taskScope.$digest();\n\n if (taskHasBeenChanged) {\n taskScope.row.rowsManager.gantt.api.tasks.raise.resize(taskScope.task);\n }\n taskHasBeenChanged = true;\n } else {\n if (x > taskScope.task.left + taskScope.task.width) {\n x = taskScope.task.left + taskScope.task.width;\n taskScope.task.moveMode = 'E';\n setGlobalCursor(getCursor(taskScope.task.moveMode ));\n }\n\n if (taskOutOfRange !== 'truncate' && x < 0) {\n x = 0;\n }\n\n taskScope.task.setFrom(x, true);\n taskScope.$digest();\n\n if (taskHasBeenChanged) {\n taskScope.row.rowsManager.gantt.api.tasks.raise.resize(taskScope.task);\n }\n taskHasBeenChanged = true;\n }\n\n if (!oldTaskHasBeenChanged && taskHasBeenChanged && !taskHasBeenMovedFromAnotherRow) {\n var backgroundElement = taskScope.task.getBackgroundElement();\n if (taskScope.task.moveMode === 'M') {\n backgroundElement.addClass('gantt-task-moving');\n taskScope.row.rowsManager.gantt.api.tasks.raise.moveBegin(taskScope.task);\n } else {\n backgroundElement.addClass('gantt-task-resizing');\n taskScope.row.rowsManager.gantt.api.tasks.raise.resizeBegin(taskScope.task);\n }\n }\n };\n\n var scrollScreen = function(evt) {\n var mousePos = mouseOffset.getOffsetForElement(ganttBodyElement[0], evt);\n var leftScreenBorder = ganttScrollElement[0].scrollLeft;\n var screenWidth = ganttScrollElement[0].offsetWidth;\n var scrollWidth = ganttScrollElement[0].scrollWidth;\n var rightScreenBorder = leftScreenBorder + screenWidth;\n var keepOnScrolling = false;\n\n if (mousePos.x < moveStartX) {\n // Scroll to the left\n if (leftScreenBorder > 0 && mousePos.x <= leftScreenBorder + scrollTriggerDistance) {\n mousePos.x -= scrollSpeed;\n keepOnScrolling = true;\n taskScope.row.rowsManager.gantt.api.scroll.left(scrollSpeed);\n }\n } else {\n // Scroll to the right\n if (rightScreenBorder < scrollWidth && mousePos.x >= rightScreenBorder - scrollTriggerDistance) {\n mousePos.x += scrollSpeed;\n keepOnScrolling = true;\n taskScope.row.rowsManager.gantt.api.scroll.right(scrollSpeed);\n }\n }\n\n if (keepOnScrolling) {\n scrollInterval = $timeout(function() {\n handleMove(evt);\n }, 100, true);\n }\n };\n\n var clearScrollInterval = function() {\n if (scrollInterval !== undefined) {\n $timeout.cancel(scrollInterval);\n scrollInterval = undefined;\n }\n };\n\n var getMoveMode = function(x) {\n var distance = 0;\n\n\n var taskMovable = taskScope.task.model.movable;\n var rowMovable = taskScope.task.row.model.movable;\n\n if (typeof(taskMovable) === 'boolean') {\n taskMovable = {enabled: taskMovable};\n }\n\n if (typeof(rowMovable) === 'boolean') {\n rowMovable = {enabled: rowMovable};\n }\n\n var allowResizing = utils.firstProperty([taskMovable, rowMovable], 'allowResizing', scope.allowResizing);\n var allowRowSwitching = utils.firstProperty([taskMovable, rowMovable], 'allowRowSwitching', scope.allowRowSwitching);\n var allowMoving = utils.firstProperty([taskMovable, rowMovable], 'allowMoving', scope.allowMoving);\n\n // Define resize&move area. Make sure the move area does not get too small.\n if (allowResizing) {\n distance = foregroundElement[0].offsetWidth < taskWithSmallWidth ? resizeAreaWidthSmall : resizeAreaWidthBig;\n }\n\n if (allowResizing && x > foregroundElement[0].offsetWidth - distance) {\n return 'E';\n } else if (allowResizing && x < distance) {\n return 'W';\n } else if ((allowMoving || allowRowSwitching) && x >= distance && x <= foregroundElement[0].offsetWidth - distance) {\n return 'M';\n } else {\n return '';\n }\n };\n\n var getCursor = function(mode) {\n switch (mode) {\n case 'E':\n return 'e-resize';\n case 'W':\n return 'w-resize';\n case 'M':\n return 'move';\n }\n };\n\n var setGlobalCursor = function(cursor) {\n taskElement.css('cursor', cursor);\n angular.element($document[0].body).css({\n '-moz-user-select': cursor === '' ? '': '-moz-none',\n '-webkit-user-select': cursor === '' ? '': 'none',\n '-ms-user-select': cursor === '' ? '': 'none',\n 'user-select': cursor === '' ? '': 'none',\n 'cursor': cursor\n });\n };\n\n var enableMoveMode = function(mode, x) {\n // Clone taskModel\n if (taskScope.task.originalModel === undefined) {\n taskScope.task.originalRow = taskScope.task.row;\n taskScope.task.originalModel = taskScope.task.model;\n taskScope.task.model = angular.copy(taskScope.task.originalModel);\n }\n\n // Init mouse start variables\n if (!taskHasBeenMovedFromAnotherRow) {\n moveStartX = x;\n mouseStartOffsetX = x - taskScope.task.modelLeft;\n }\n\n // Init task move\n taskHasBeenChanged = false;\n taskScope.task.moveMode = mode;\n taskScope.task.isMoving = true;\n taskScope.task.active = true;\n\n // Add move event handler\n var taskMoveHandler = function(evt) {\n evt.stopImmediatePropagation();\n if (_hasTouch) {\n evt = mouseOffset.getTouch(evt);\n }\n\n handleMove(evt);\n };\n var moveSmartEvent = smartEvent(taskScope, windowElement, _moveEvents, taskMoveHandler);\n moveSmartEvent.bind();\n\n // Remove move event handler on mouse up / touch end\n smartEvent(taskScope, windowElement, _releaseEvents, function(evt) {\n if (_hasTouch) {\n evt = mouseOffset.getTouch(evt);\n }\n moveSmartEvent.unbind();\n disableMoveMode(evt);\n taskScope.$digest();\n }).bindOnce();\n\n setGlobalCursor(getCursor(mode));\n };\n\n var disableMoveMode = function() {\n var getBackgroundElement = taskScope.task.getBackgroundElement();\n getBackgroundElement.removeClass('gantt-task-moving');\n getBackgroundElement.removeClass('gantt-task-resizing');\n\n if (taskScope.task.originalModel !== undefined) {\n angular.extend(taskScope.task.originalModel, taskScope.task.model);\n taskScope.task.model = taskScope.task.originalModel;\n if (taskScope.task.row.model.id !== taskScope.task.originalRow.model.id) {\n var targetRow = taskScope.task.row;\n targetRow.removeTask(taskScope.task.model.id, false, true);\n taskScope.task.row = taskScope.task.originalRow;\n targetRow.moveTaskToRow(taskScope.task, false);\n }\n delete taskScope.task.originalModel;\n delete taskScope.task.originalRow;\n\n taskScope.$apply();\n }\n\n taskHasBeenMovedFromAnotherRow = false;\n taskScope.task.isMoving = false;\n taskScope.task.active = false;\n\n // Stop any active auto scroll\n clearScrollInterval();\n\n // Set mouse cursor back to default\n setGlobalCursor('');\n\n // Raise task changed event\n if (taskHasBeenChanged === true) {\n // Raise move end event\n if (taskScope.task.moveMode === 'M') {\n taskScope.row.rowsManager.gantt.api.tasks.raise.moveEnd(taskScope.task);\n } else {\n taskScope.row.rowsManager.gantt.api.tasks.raise.resizeEnd(taskScope.task);\n }\n\n taskHasBeenChanged = false;\n taskScope.task.row.sortTasks(); // Sort tasks so they have the right z-order\n taskScope.row.rowsManager.gantt.api.tasks.raise.change(taskScope.task);\n }\n\n taskScope.task.moveMode = undefined;\n };\n\n // Stop scroll cycle (if running) when scope is destroyed.\n // This is needed when the task is moved to a new row during scroll because\n // the old scope will continue to scroll otherwise\n taskScope.$on('$destroy', function() {\n taskScope.destroyed = true;\n clearScrollInterval();\n });\n\n if (taskScope.task.isResizing) {\n taskHasBeenMovedFromAnotherRow = true;\n enableMoveMode('E', taskScope.task.mouseOffsetX);\n delete taskScope.task.isResizing;\n } else if (taskScope.task.isMoving) {\n // In case the task has been moved to another row a new controller is is created by angular.\n // Enable the move mode again if this was the case.\n taskHasBeenMovedFromAnotherRow = true;\n enableMoveMode('M', taskScope.task.mouseOffsetX);\n }\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.movable').factory('ganttMovableOptions', [function() {\n return {\n initialize: function(options) {\n\n options.enabled = options.enabled !== undefined ? !!options.enabled : true;\n options.allowMoving = options.allowMoving !== undefined ? !!options.allowMoving : true;\n options.allowResizing = options.allowResizing !== undefined ? !!options.allowResizing : true;\n options.allowRowSwitching = options.allowRowSwitching !== undefined ? !!options.allowRowSwitching : true;\n\n return options;\n }\n };\n }]);\n}());\n\n","angular.module('gantt.movable.templates', []).run(['$templateCache', function($templateCache) {\n\n}]);\n"]} \ No newline at end of file +{"version":3,"sources":["../src/plugins/movable.js","../src/plugins/movable/movableOptions.factory.js","../.tmp/generated/plugins/movable/html2js.js"],"names":[],"mappings":"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","file":"angular-gantt-movable-plugin.js","sourcesContent":["(function(){\n 'use strict';\n\n /* jshint latedef: false */\n angular.module('gantt.movable', ['gantt']).directive('ganttMovable', ['ganttMouseButton', 'ganttMouseOffset', 'ganttSmartEvent', 'ganttMovableOptions', 'ganttUtils', 'ganttDom', '$window', '$document', '$timeout',\n function(mouseButton, mouseOffset, smartEvent, movableOptions, utils, dom, $window, $document, $timeout) {\n // Provides moving and resizing of tasks\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n allowMoving: '=?',\n allowResizing: '=?',\n allowRowSwitching: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.movable) === 'object') {\n for (var option in scope.options.movable) {\n scope[option] = scope.options[option];\n }\n }\n\n movableOptions.initialize(scope);\n\n api.registerEvent('tasks', 'move');\n api.registerEvent('tasks', 'moveBegin');\n api.registerEvent('tasks', 'moveEnd');\n api.registerEvent('tasks', 'resize');\n api.registerEvent('tasks', 'resizeBegin');\n api.registerEvent('tasks', 'resizeEnd');\n api.registerEvent('tasks', 'change');\n\n var _hasTouch = ('ontouchstart' in $window) || $window.DocumentTouch && $document[0] instanceof $window.DocumentTouch;\n var _pressEvents = 'touchstart mousedown';\n var _moveEvents = 'touchmove mousemove';\n var _releaseEvents = 'touchend mouseup';\n\n var taskWithSmallWidth = 15;\n var resizeAreaWidthBig = 5;\n var resizeAreaWidthSmall = 3;\n var scrollSpeed = 15;\n var scrollTriggerDistance = 5;\n var mouseStartOffsetX;\n var moveStartX;\n\n api.directives.on.new(scope, function(directiveName, taskScope, taskElement) {\n if (directiveName === 'ganttTask') {\n var windowElement = angular.element($window);\n var ganttBodyElement = taskScope.row.rowsManager.gantt.body.$element;\n var ganttScrollElement = taskScope.row.rowsManager.gantt.scroll.$element;\n\n var taskHasBeenChanged = false;\n var taskHasBeenMovedFromAnotherRow = false;\n var scrollInterval;\n\n var foregroundElement = taskScope.task.getForegroundElement();\n\n // IE<11 doesn't support `pointer-events: none`\n // So task content element must be added to support moving properly.\n var contentElement = taskScope.task.getContentElement();\n\n var onPressEvents = function(evt) {\n evt.preventDefault();\n if (_hasTouch) {\n evt = mouseOffset.getTouch(evt);\n }\n var taskMovable = taskScope.task.model.movable;\n var rowMovable = taskScope.task.row.model.movable;\n\n if (typeof(taskMovable) === 'boolean' || angular.isFunction(taskMovable)) {\n taskMovable = {enabled: taskMovable};\n }\n\n if (typeof(rowMovable) === 'boolean' || angular.isFunction(rowMovable)) {\n rowMovable = {enabled: rowMovable};\n }\n\n var enabledValue = utils.firstProperty([taskMovable, rowMovable], 'enabled', scope.enabled);\n var enabled = angular.isFunction(enabledValue) ? enabledValue(evt, taskScope.task): enabledValue;\n if (enabled) {\n var taskOffsetX = mouseOffset.getOffsetForElement(foregroundElement[0], evt).x;\n var mode = getMoveMode(taskOffsetX);\n if (mode !== '' && mouseButton.getButton(evt) === 1) {\n var bodyOffsetX = mouseOffset.getOffsetForElement(ganttBodyElement[0], evt).x;\n enableMoveMode(mode, bodyOffsetX);\n }\n taskScope.$digest();\n }\n };\n foregroundElement.on(_pressEvents, onPressEvents);\n contentElement.on(_pressEvents, onPressEvents);\n\n var onMousemove = function (evt) {\n var taskMovable = taskScope.task.model.movable;\n var rowMovable = taskScope.task.row.model.movable;\n\n if (typeof(taskMovable) === 'boolean' || angular.isFunction(taskMovable)) {\n taskMovable = {enabled: taskMovable};\n }\n\n if (typeof(rowMovable) === 'boolean' || angular.isFunction(rowMovable)) {\n rowMovable = {enabled: rowMovable};\n }\n\n var enabledValue = utils.firstProperty([taskMovable, rowMovable], 'enabled', scope.enabled);\n var enabled = angular.isFunction(enabledValue) ? enabledValue(evt, taskScope.task): enabledValue;\n if (enabled && !taskScope.task.isMoving) {\n var taskOffsetX = mouseOffset.getOffsetForElement(foregroundElement[0], evt).x;\n var mode = getMoveMode(taskOffsetX);\n if (mode !== '' && mode !== 'M') {\n foregroundElement.css('cursor', getCursor(mode));\n contentElement.css('cursor', getCursor(mode));\n } else {\n foregroundElement.css('cursor', '');\n contentElement.css('cursor', '');\n }\n }\n };\n foregroundElement.on('mousemove', onMousemove);\n contentElement.on('mousemove', onMousemove);\n\n var handleMove = function(evt) {\n if (taskScope.task.isMoving && !taskScope.destroyed) {\n clearScrollInterval();\n moveTask(evt);\n scrollScreen(evt);\n }\n };\n\n var moveTask = function(evt) {\n var oldTaskHasBeenChanged = taskHasBeenChanged;\n\n var mousePos = mouseOffset.getOffsetForElement(ganttBodyElement[0], evt);\n var x = mousePos.x;\n taskScope.task.mouseOffsetX = x;\n var taskOutOfRange = taskScope.task.row.rowsManager.gantt.options.value('taskOutOfRange');\n\n var taskMovable = taskScope.task.model.movable;\n var rowMovable = taskScope.task.row.model.movable;\n\n if (typeof(taskMovable) === 'boolean' || angular.isFunction(taskMovable)) {\n taskMovable = {enabled: taskMovable};\n }\n\n if (typeof(rowMovable) === 'boolean' || angular.isFunction(rowMovable)) {\n rowMovable = {enabled: rowMovable};\n }\n\n if (taskScope.task.moveMode === 'M') {\n var allowRowSwitching = utils.firstProperty([taskMovable, rowMovable], 'allowRowSwitching', scope.allowRowSwitching);\n if (allowRowSwitching) {\n var scrollRect = ganttScrollElement[0].getBoundingClientRect();\n var rowCenterLeft = scrollRect.left + scrollRect.width / 2;\n var ganttBody = angular.element($document[0].querySelectorAll('.gantt-body'));\n ganttBody.css('pointer-events', 'auto'); // pointer-events must be enabled for following to work.\n var targetRowElement = dom.findElementFromPoint(rowCenterLeft, evt.clientY, function(element) {\n return angular.element(element).hasClass('gantt-row');\n });\n ganttBody.css('pointer-events', '');\n\n var rows = ganttCtrl.gantt.rowsManager.rows;\n var targetRow;\n for (var i= 0, l=rows.length; i<l; i++) {\n if (targetRowElement === rows[i].$element[0]) {\n targetRow = rows[i];\n break;\n }\n }\n\n var sourceRow = taskScope.task.row;\n\n if (targetRow !== undefined && sourceRow !== targetRow) {\n targetRow.moveTaskToRow(taskScope.task, true);\n taskHasBeenChanged = true;\n }\n }\n\n var allowMoving = utils.firstProperty([taskMovable, rowMovable], 'allowMoving', scope.allowMoving);\n if (allowMoving) {\n x = x - mouseStartOffsetX;\n\n if (taskOutOfRange !== 'truncate') {\n if (x < 0) {\n x = 0;\n } else if (x + taskScope.task.width >= taskScope.gantt.width) {\n x = taskScope.gantt.width - taskScope.task.width;\n }\n }\n\n taskScope.task.moveTo(x, true);\n taskScope.$digest();\n\n if (taskHasBeenChanged) {\n taskScope.row.rowsManager.gantt.api.tasks.raise.move(taskScope.task);\n }\n taskHasBeenChanged = true;\n }\n } else if (taskScope.task.moveMode === 'E') {\n if (x <= taskScope.task.left) {\n x = taskScope.task.left;\n taskScope.task.moveMode = 'W';\n setGlobalCursor(getCursor(taskScope.task.moveMode ));\n }\n\n if (taskOutOfRange !== 'truncate' && x >= taskScope.gantt.width) {\n x = taskScope.gantt.width;\n }\n\n taskScope.task.setTo(x, true);\n taskScope.$digest();\n\n if (taskHasBeenChanged) {\n taskScope.row.rowsManager.gantt.api.tasks.raise.resize(taskScope.task);\n }\n taskHasBeenChanged = true;\n } else {\n if (x > taskScope.task.left + taskScope.task.width) {\n x = taskScope.task.left + taskScope.task.width;\n taskScope.task.moveMode = 'E';\n setGlobalCursor(getCursor(taskScope.task.moveMode ));\n }\n\n if (taskOutOfRange !== 'truncate' && x < 0) {\n x = 0;\n }\n\n taskScope.task.setFrom(x, true);\n taskScope.$digest();\n\n if (taskHasBeenChanged) {\n taskScope.row.rowsManager.gantt.api.tasks.raise.resize(taskScope.task);\n }\n taskHasBeenChanged = true;\n }\n\n if (!oldTaskHasBeenChanged && taskHasBeenChanged && !taskHasBeenMovedFromAnotherRow) {\n var backgroundElement = taskScope.task.getBackgroundElement();\n if (taskScope.task.moveMode === 'M') {\n backgroundElement.addClass('gantt-task-moving');\n taskScope.row.rowsManager.gantt.api.tasks.raise.moveBegin(taskScope.task);\n } else {\n backgroundElement.addClass('gantt-task-resizing');\n taskScope.row.rowsManager.gantt.api.tasks.raise.resizeBegin(taskScope.task);\n }\n }\n };\n\n var scrollScreen = function(evt) {\n var mousePos = mouseOffset.getOffsetForElement(ganttBodyElement[0], evt);\n var leftScreenBorder = ganttScrollElement[0].scrollLeft;\n var screenWidth = ganttScrollElement[0].offsetWidth;\n var scrollWidth = ganttScrollElement[0].scrollWidth;\n var rightScreenBorder = leftScreenBorder + screenWidth;\n var keepOnScrolling = false;\n\n if (mousePos.x < moveStartX) {\n // Scroll to the left\n if (leftScreenBorder > 0 && mousePos.x <= leftScreenBorder + scrollTriggerDistance) {\n mousePos.x -= scrollSpeed;\n keepOnScrolling = true;\n taskScope.row.rowsManager.gantt.api.scroll.left(scrollSpeed);\n }\n } else {\n // Scroll to the right\n if (rightScreenBorder < scrollWidth && mousePos.x >= rightScreenBorder - scrollTriggerDistance) {\n mousePos.x += scrollSpeed;\n keepOnScrolling = true;\n taskScope.row.rowsManager.gantt.api.scroll.right(scrollSpeed);\n }\n }\n\n if (keepOnScrolling) {\n scrollInterval = $timeout(function() {\n handleMove(evt);\n }, 100, true);\n }\n };\n\n var clearScrollInterval = function() {\n if (scrollInterval !== undefined) {\n $timeout.cancel(scrollInterval);\n scrollInterval = undefined;\n }\n };\n\n var getMoveMode = function(x) {\n var distance = 0;\n\n\n var taskMovable = taskScope.task.model.movable;\n var rowMovable = taskScope.task.row.model.movable;\n\n if (typeof(taskMovable) === 'boolean') {\n taskMovable = {enabled: taskMovable};\n }\n\n if (typeof(rowMovable) === 'boolean') {\n rowMovable = {enabled: rowMovable};\n }\n\n var allowResizing = utils.firstProperty([taskMovable, rowMovable], 'allowResizing', scope.allowResizing);\n var allowRowSwitching = utils.firstProperty([taskMovable, rowMovable], 'allowRowSwitching', scope.allowRowSwitching);\n var allowMoving = utils.firstProperty([taskMovable, rowMovable], 'allowMoving', scope.allowMoving);\n\n // Define resize&move area. Make sure the move area does not get too small.\n if (allowResizing) {\n distance = foregroundElement[0].offsetWidth < taskWithSmallWidth ? resizeAreaWidthSmall : resizeAreaWidthBig;\n }\n\n if (allowResizing && x > foregroundElement[0].offsetWidth - distance) {\n return 'E';\n } else if (allowResizing && x < distance) {\n return 'W';\n } else if ((allowMoving || allowRowSwitching) && x >= distance && x <= foregroundElement[0].offsetWidth - distance) {\n return 'M';\n } else {\n return '';\n }\n };\n\n var getCursor = function(mode) {\n switch (mode) {\n case 'E':\n return 'e-resize';\n case 'W':\n return 'w-resize';\n case 'M':\n return 'move';\n }\n };\n\n var setGlobalCursor = function(cursor) {\n taskElement.css('cursor', cursor);\n angular.element($document[0].body).css({\n '-moz-user-select': cursor === '' ? '': '-moz-none',\n '-webkit-user-select': cursor === '' ? '': 'none',\n '-ms-user-select': cursor === '' ? '': 'none',\n 'user-select': cursor === '' ? '': 'none',\n 'cursor': cursor\n });\n };\n\n var enableMoveMode = function(mode, x) {\n // Clone taskModel\n if (taskScope.task.originalModel === undefined) {\n taskScope.task.originalRow = taskScope.task.row;\n taskScope.task.originalModel = taskScope.task.model;\n taskScope.task.model = angular.copy(taskScope.task.originalModel);\n }\n\n // Init mouse start variables\n if (!taskHasBeenMovedFromAnotherRow) {\n moveStartX = x;\n mouseStartOffsetX = x - taskScope.task.modelLeft;\n }\n\n // Init task move\n taskHasBeenChanged = false;\n taskScope.task.moveMode = mode;\n taskScope.task.isMoving = true;\n taskScope.task.active = true;\n\n // Add move event handler\n var taskMoveHandler = function(evt) {\n evt.stopImmediatePropagation();\n if (_hasTouch) {\n evt = mouseOffset.getTouch(evt);\n }\n\n handleMove(evt);\n };\n var moveSmartEvent = smartEvent(taskScope, windowElement, _moveEvents, taskMoveHandler);\n moveSmartEvent.bind();\n\n // Remove move event handler on mouse up / touch end\n smartEvent(taskScope, windowElement, _releaseEvents, function(evt) {\n if (_hasTouch) {\n evt = mouseOffset.getTouch(evt);\n }\n moveSmartEvent.unbind();\n disableMoveMode(evt);\n taskScope.$digest();\n }).bindOnce();\n\n setGlobalCursor(getCursor(mode));\n };\n\n var disableMoveMode = function() {\n var getBackgroundElement = taskScope.task.getBackgroundElement();\n getBackgroundElement.removeClass('gantt-task-moving');\n getBackgroundElement.removeClass('gantt-task-resizing');\n\n if (taskScope.task.originalModel !== undefined) {\n\n taskScope.task.originalModel.from = taskScope.task.model.from;\n taskScope.task.originalModel.to = taskScope.task.model.to;\n taskScope.task.originalModel.lct = taskScope.task.model.lct;\n taskScope.task.originalModel.est = taskScope.task.model.est;\n\n taskScope.task.model = taskScope.task.originalModel;\n if (taskScope.task.row.model.id !== taskScope.task.originalRow.model.id) {\n var targetRow = taskScope.task.row;\n targetRow.removeTask(taskScope.task.model.id, false, true);\n taskScope.task.row = taskScope.task.originalRow;\n targetRow.moveTaskToRow(taskScope.task, false);\n }\n delete taskScope.task.originalModel;\n delete taskScope.task.originalRow;\n\n taskScope.$apply();\n }\n\n taskHasBeenMovedFromAnotherRow = false;\n taskScope.task.isMoving = false;\n taskScope.task.active = false;\n\n // Stop any active auto scroll\n clearScrollInterval();\n\n // Set mouse cursor back to default\n setGlobalCursor('');\n\n // Raise task changed event\n if (taskHasBeenChanged === true) {\n // Raise move end event\n if (taskScope.task.moveMode === 'M') {\n taskScope.row.rowsManager.gantt.api.tasks.raise.moveEnd(taskScope.task);\n } else {\n taskScope.row.rowsManager.gantt.api.tasks.raise.resizeEnd(taskScope.task);\n }\n\n taskHasBeenChanged = false;\n taskScope.task.row.sortTasks(); // Sort tasks so they have the right z-order\n taskScope.row.rowsManager.gantt.api.tasks.raise.change(taskScope.task);\n }\n\n taskScope.task.moveMode = undefined;\n };\n\n // Stop scroll cycle (if running) when scope is destroyed.\n // This is needed when the task is moved to a new row during scroll because\n // the old scope will continue to scroll otherwise\n taskScope.$on('$destroy', function() {\n taskScope.destroyed = true;\n clearScrollInterval();\n });\n\n if (taskScope.task.isResizing) {\n taskHasBeenMovedFromAnotherRow = true;\n enableMoveMode('E', taskScope.task.mouseOffsetX);\n delete taskScope.task.isResizing;\n } else if (taskScope.task.isMoving) {\n // In case the task has been moved to another row a new controller is is created by angular.\n // Enable the move mode again if this was the case.\n taskHasBeenMovedFromAnotherRow = true;\n enableMoveMode('M', taskScope.task.mouseOffsetX);\n }\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.movable').factory('ganttMovableOptions', [function() {\n return {\n initialize: function(options) {\n\n options.enabled = options.enabled !== undefined ? options.enabled : true;\n options.allowMoving = options.allowMoving !== undefined ? !!options.allowMoving : true;\n options.allowResizing = options.allowResizing !== undefined ? !!options.allowResizing : true;\n options.allowRowSwitching = options.allowRowSwitching !== undefined ? !!options.allowRowSwitching : true;\n\n return options;\n }\n };\n }]);\n}());\n\n","angular.module('gantt.movable.templates', []).run(['$templateCache', function($templateCache) {\n\n}]);\n"]} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-movable-plugin.min.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-movable-plugin.min.js index cdf50c9d69773f1d0e4f2f9fa6d05c60c83c09e7..bf11f86c3d844ab34092918b04e50291e3406f0a 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-movable-plugin.min.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-movable-plugin.min.js @@ -1,10 +1,10 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com Github: https://github.com/angular-gantt/angular-gantt.git */ -!function(){"use strict";angular.module("gantt.movable",["gantt"]).directive("ganttMovable",["ganttMouseButton","ganttMouseOffset","ganttSmartEvent","ganttMovableOptions","ganttUtils","ganttDom","$window","$document","$timeout",function(a,b,c,d,e,f,g,h,i){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",allowMoving:"=?",allowResizing:"=?",allowRowSwitching:"=?"},link:function(j,k,l,m){var n=m.gantt.api;if(j.options&&"object"==typeof j.options.movable)for(var o in j.options.movable)j[o]=j.options[o];d.initialize(j),n.registerEvent("tasks","move"),n.registerEvent("tasks","moveBegin"),n.registerEvent("tasks","moveEnd"),n.registerEvent("tasks","resize"),n.registerEvent("tasks","resizeBegin"),n.registerEvent("tasks","resizeEnd"),n.registerEvent("tasks","change");var p,q,r="ontouchstart"in g||g.DocumentTouch&&h[0]instanceof g.DocumentTouch,s="touchstart mousedown",t="touchmove mousemove",u="touchend mouseup",v=15,w=5,x=3,y=15,z=5;n.directives.on["new"](j,function(d,k,l){if("ganttTask"===d){var n,o=angular.element(g),A=k.row.rowsManager.gantt.body.$element,B=k.row.rowsManager.gantt.scroll.$element,C=!1,D=!1,E=k.task.getForegroundElement(),F=k.task.getContentElement(),G=function(c){c.preventDefault(),r&&(c=b.getTouch(c));var d=k.task.model.movable,f=k.task.row.model.movable;"boolean"==typeof d&&(d={enabled:d}),"boolean"==typeof f&&(f={enabled:f});var g=e.firstProperty([d,f],"enabled",j.enabled),h=angular.isFunction(g)?g(c):g;if(h){var i=b.getOffsetForElement(E[0],c).x,l=M(i);if(""!==l&&1===a.getButton(c)){var m=b.getOffsetForElement(A[0],c).x;P(l,m)}k.$digest()}};E.on(s,G),F.on(s,G);var H=function(a){var c=k.task.model.movable,d=k.task.row.model.movable;"boolean"==typeof c&&(c={enabled:c}),"boolean"==typeof d&&(d={enabled:d});var f=e.firstProperty([c,d],"enabled",j.enabled),g=angular.isFunction(f)?f(a):f;if(g&&!k.task.isMoving){var h=b.getOffsetForElement(E[0],a).x,i=M(h);""!==i&&"M"!==i?(E.css("cursor",N(i)),F.css("cursor",N(i))):(E.css("cursor",""),F.css("cursor",""))}};E.on("mousemove",H),F.on("mousemove",H);var I=function(a){k.task.isMoving&&!k.destroyed&&(L(),J(a),K(a))},J=function(a){var c=C,d=b.getOffsetForElement(A[0],a),g=d.x;k.task.mouseOffsetX=g;var i=k.task.row.rowsManager.gantt.options.value("taskOutOfRange"),l=k.task.model.movable,n=k.task.row.model.movable;if("boolean"==typeof l&&(l={enabled:l}),"boolean"==typeof n&&(n={enabled:n}),"M"===k.task.moveMode){var o=e.firstProperty([l,n],"allowRowSwitching",j.allowRowSwitching);if(o){var q=B[0].getBoundingClientRect(),r=q.left+q.width/2,s=angular.element(h[0].querySelectorAll(".gantt-body"));s.css("pointer-events","auto");var t=f.findElementFromPoint(r,a.clientY,function(a){return angular.element(a).hasClass("gantt-row")});s.css("pointer-events","");for(var u,v=m.gantt.rowsManager.rows,w=0,x=v.length;x>w;w++)if(t===v[w].$element[0]){u=v[w];break}var y=k.task.row;void 0!==u&&y!==u&&(u.moveTaskToRow(k.task,!0),y.$scope.$digest(),u.$scope.$digest(),C=!0)}var z=e.firstProperty([l,n],"allowMoving",j.allowMoving);z&&(g-=p,"truncate"!==i&&(0>g?g=0:g+k.task.width>=k.gantt.width&&(g=k.gantt.width-k.task.width)),k.task.moveTo(g,!0),k.$digest(),C&&k.row.rowsManager.gantt.api.tasks.raise.move(k.task),C=!0)}else"E"===k.task.moveMode?(g<=k.task.left&&(g=k.task.left,k.task.moveMode="W",O(N(k.task.moveMode))),"truncate"!==i&&g>=k.gantt.width&&(g=k.gantt.width),k.task.setTo(g,!0),k.$digest(),C&&k.row.rowsManager.gantt.api.tasks.raise.resize(k.task),C=!0):(g>k.task.left+k.task.width&&(g=k.task.left+k.task.width,k.task.moveMode="E",O(N(k.task.moveMode))),"truncate"!==i&&0>g&&(g=0),k.task.setFrom(g,!0),k.$digest(),C&&k.row.rowsManager.gantt.api.tasks.raise.resize(k.task),C=!0);if(!c&&C&&!D){var E=k.task.getBackgroundElement();"M"===k.task.moveMode?(E.addClass("gantt-task-moving"),k.row.rowsManager.gantt.api.tasks.raise.moveBegin(k.task)):(E.addClass("gantt-task-resizing"),k.row.rowsManager.gantt.api.tasks.raise.resizeBegin(k.task))}},K=function(a){var c=b.getOffsetForElement(A[0],a),d=B[0].scrollLeft,e=B[0].offsetWidth,f=B[0].scrollWidth,g=d+e,h=!1;c.x<q?d>0&&c.x<=d+z&&(c.x-=y,h=!0,k.row.rowsManager.gantt.api.scroll.left(y)):f>g&&c.x>=g-z&&(c.x+=y,h=!0,k.row.rowsManager.gantt.api.scroll.right(y)),h&&(n=i(function(){I(a)},100,!0))},L=function(){void 0!==n&&(i.cancel(n),n=void 0)},M=function(a){var b=0,c=k.task.model.movable,d=k.task.row.model.movable;"boolean"==typeof c&&(c={enabled:c}),"boolean"==typeof d&&(d={enabled:d});var f=e.firstProperty([c,d],"allowResizing",j.allowResizing),g=e.firstProperty([c,d],"allowRowSwitching",j.allowRowSwitching),h=e.firstProperty([c,d],"allowMoving",j.allowMoving);return f&&(b=E[0].offsetWidth<v?x:w),f&&a>E[0].offsetWidth-b?"E":f&&b>a?"W":(h||g)&&a>=b&&a<=E[0].offsetWidth-b?"M":""},N=function(a){switch(a){case"E":return"e-resize";case"W":return"w-resize";case"M":return"move"}},O=function(a){l.css("cursor",a),angular.element(h[0].body).css({"-moz-user-select":""===a?"":"-moz-none","-webkit-user-select":""===a?"":"none","-ms-user-select":""===a?"":"none","user-select":""===a?"":"none",cursor:a})},P=function(a,d){void 0===k.task.originalModel&&(k.task.originalRow=k.task.row,k.task.originalModel=k.task.model,k.task.model=angular.copy(k.task.originalModel)),D||(q=d,p=d-k.task.modelLeft),C=!1,k.task.moveMode=a,k.task.isMoving=!0,k.task.active=!0;var e=function(a){a.stopImmediatePropagation(),r&&(a=b.getTouch(a)),I(a)},f=c(k,o,t,e);f.bind(),c(k,o,u,function(a){r&&(a=b.getTouch(a)),f.unbind(),Q(a),k.$digest()}).bindOnce(),O(N(a))},Q=function(){var a=k.task.getBackgroundElement();if(a.removeClass("gantt-task-moving"),a.removeClass("gantt-task-resizing"),void 0!==k.task.originalModel){if(angular.extend(k.task.originalModel,k.task.model),k.task.model=k.task.originalModel,k.task.row.model.id!==k.task.originalRow.model.id){var b=k.task.row;b.removeTask(k.task.model.id,!1,!0),k.task.row=k.task.originalRow,b.moveTaskToRow(k.task,!1)}delete k.task.originalModel,delete k.task.originalRow,k.$apply()}D=!1,k.task.isMoving=!1,k.task.active=!1,L(),O(""),C===!0&&("M"===k.task.moveMode?k.row.rowsManager.gantt.api.tasks.raise.moveEnd(k.task):k.row.rowsManager.gantt.api.tasks.raise.resizeEnd(k.task),C=!1,k.task.row.sortTasks(),k.row.rowsManager.gantt.api.tasks.raise.change(k.task)),k.task.moveMode=void 0};k.$on("$destroy",function(){k.destroyed=!0,L()}),k.task.isResizing?(D=!0,P("E",k.task.mouseOffsetX),delete k.task.isResizing):k.task.isMoving&&(D=!0,P("M",k.task.mouseOffsetX))}})}}}])}(),function(){"use strict";angular.module("gantt.movable").factory("ganttMovableOptions",[function(){return{initialize:function(a){return a.enabled=void 0!==a.enabled?!!a.enabled:!0,a.allowMoving=void 0!==a.allowMoving?!!a.allowMoving:!0,a.allowResizing=void 0!==a.allowResizing?!!a.allowResizing:!0,a.allowRowSwitching=void 0!==a.allowRowSwitching?!!a.allowRowSwitching:!0,a}}}])}(),angular.module("gantt.movable.templates",[]).run(["$templateCache",function(a){}]); +!function(){"use strict";angular.module("gantt.movable",["gantt"]).directive("ganttMovable",["ganttMouseButton","ganttMouseOffset","ganttSmartEvent","ganttMovableOptions","ganttUtils","ganttDom","$window","$document","$timeout",function(a,b,c,d,e,f,g,h,i){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",allowMoving:"=?",allowResizing:"=?",allowRowSwitching:"=?"},link:function(j,k,l,m){var n=m.gantt.api;if(j.options&&"object"==typeof j.options.movable)for(var o in j.options.movable)j[o]=j.options[o];d.initialize(j),n.registerEvent("tasks","move"),n.registerEvent("tasks","moveBegin"),n.registerEvent("tasks","moveEnd"),n.registerEvent("tasks","resize"),n.registerEvent("tasks","resizeBegin"),n.registerEvent("tasks","resizeEnd"),n.registerEvent("tasks","change");var p,q,r="ontouchstart"in g||g.DocumentTouch&&h[0]instanceof g.DocumentTouch,s="touchstart mousedown",t="touchmove mousemove",u="touchend mouseup",v=15,w=5,x=3,y=15,z=5;n.directives.on["new"](j,function(d,k,l){if("ganttTask"===d){var n,o=angular.element(g),A=k.row.rowsManager.gantt.body.$element,B=k.row.rowsManager.gantt.scroll.$element,C=!1,D=!1,E=k.task.getForegroundElement(),F=k.task.getContentElement(),G=function(c){c.preventDefault(),r&&(c=b.getTouch(c));var d=k.task.model.movable,f=k.task.row.model.movable;("boolean"==typeof d||angular.isFunction(d))&&(d={enabled:d}),("boolean"==typeof f||angular.isFunction(f))&&(f={enabled:f});var g=e.firstProperty([d,f],"enabled",j.enabled),h=angular.isFunction(g)?g(c,k.task):g;if(h){var i=b.getOffsetForElement(E[0],c).x,l=M(i);if(""!==l&&1===a.getButton(c)){var m=b.getOffsetForElement(A[0],c).x;P(l,m)}k.$digest()}};E.on(s,G),F.on(s,G);var H=function(a){var c=k.task.model.movable,d=k.task.row.model.movable;("boolean"==typeof c||angular.isFunction(c))&&(c={enabled:c}),("boolean"==typeof d||angular.isFunction(d))&&(d={enabled:d});var f=e.firstProperty([c,d],"enabled",j.enabled),g=angular.isFunction(f)?f(a,k.task):f;if(g&&!k.task.isMoving){var h=b.getOffsetForElement(E[0],a).x,i=M(h);""!==i&&"M"!==i?(E.css("cursor",N(i)),F.css("cursor",N(i))):(E.css("cursor",""),F.css("cursor",""))}};E.on("mousemove",H),F.on("mousemove",H);var I=function(a){k.task.isMoving&&!k.destroyed&&(L(),J(a),K(a))},J=function(a){var c=C,d=b.getOffsetForElement(A[0],a),g=d.x;k.task.mouseOffsetX=g;var i=k.task.row.rowsManager.gantt.options.value("taskOutOfRange"),l=k.task.model.movable,n=k.task.row.model.movable;if(("boolean"==typeof l||angular.isFunction(l))&&(l={enabled:l}),("boolean"==typeof n||angular.isFunction(n))&&(n={enabled:n}),"M"===k.task.moveMode){var o=e.firstProperty([l,n],"allowRowSwitching",j.allowRowSwitching);if(o){var q=B[0].getBoundingClientRect(),r=q.left+q.width/2,s=angular.element(h[0].querySelectorAll(".gantt-body"));s.css("pointer-events","auto");var t=f.findElementFromPoint(r,a.clientY,function(a){return angular.element(a).hasClass("gantt-row")});s.css("pointer-events","");for(var u,v=m.gantt.rowsManager.rows,w=0,x=v.length;x>w;w++)if(t===v[w].$element[0]){u=v[w];break}var y=k.task.row;void 0!==u&&y!==u&&(u.moveTaskToRow(k.task,!0),C=!0)}var z=e.firstProperty([l,n],"allowMoving",j.allowMoving);z&&(g-=p,"truncate"!==i&&(0>g?g=0:g+k.task.width>=k.gantt.width&&(g=k.gantt.width-k.task.width)),k.task.moveTo(g,!0),k.$digest(),C&&k.row.rowsManager.gantt.api.tasks.raise.move(k.task),C=!0)}else"E"===k.task.moveMode?(g<=k.task.left&&(g=k.task.left,k.task.moveMode="W",O(N(k.task.moveMode))),"truncate"!==i&&g>=k.gantt.width&&(g=k.gantt.width),k.task.setTo(g,!0),k.$digest(),C&&k.row.rowsManager.gantt.api.tasks.raise.resize(k.task),C=!0):(g>k.task.left+k.task.width&&(g=k.task.left+k.task.width,k.task.moveMode="E",O(N(k.task.moveMode))),"truncate"!==i&&0>g&&(g=0),k.task.setFrom(g,!0),k.$digest(),C&&k.row.rowsManager.gantt.api.tasks.raise.resize(k.task),C=!0);if(!c&&C&&!D){var E=k.task.getBackgroundElement();"M"===k.task.moveMode?(E.addClass("gantt-task-moving"),k.row.rowsManager.gantt.api.tasks.raise.moveBegin(k.task)):(E.addClass("gantt-task-resizing"),k.row.rowsManager.gantt.api.tasks.raise.resizeBegin(k.task))}},K=function(a){var c=b.getOffsetForElement(A[0],a),d=B[0].scrollLeft,e=B[0].offsetWidth,f=B[0].scrollWidth,g=d+e,h=!1;c.x<q?d>0&&c.x<=d+z&&(c.x-=y,h=!0,k.row.rowsManager.gantt.api.scroll.left(y)):f>g&&c.x>=g-z&&(c.x+=y,h=!0,k.row.rowsManager.gantt.api.scroll.right(y)),h&&(n=i(function(){I(a)},100,!0))},L=function(){void 0!==n&&(i.cancel(n),n=void 0)},M=function(a){var b=0,c=k.task.model.movable,d=k.task.row.model.movable;"boolean"==typeof c&&(c={enabled:c}),"boolean"==typeof d&&(d={enabled:d});var f=e.firstProperty([c,d],"allowResizing",j.allowResizing),g=e.firstProperty([c,d],"allowRowSwitching",j.allowRowSwitching),h=e.firstProperty([c,d],"allowMoving",j.allowMoving);return f&&(b=E[0].offsetWidth<v?x:w),f&&a>E[0].offsetWidth-b?"E":f&&b>a?"W":(h||g)&&a>=b&&a<=E[0].offsetWidth-b?"M":""},N=function(a){switch(a){case"E":return"e-resize";case"W":return"w-resize";case"M":return"move"}},O=function(a){l.css("cursor",a),angular.element(h[0].body).css({"-moz-user-select":""===a?"":"-moz-none","-webkit-user-select":""===a?"":"none","-ms-user-select":""===a?"":"none","user-select":""===a?"":"none",cursor:a})},P=function(a,d){void 0===k.task.originalModel&&(k.task.originalRow=k.task.row,k.task.originalModel=k.task.model,k.task.model=angular.copy(k.task.originalModel)),D||(q=d,p=d-k.task.modelLeft),C=!1,k.task.moveMode=a,k.task.isMoving=!0,k.task.active=!0;var e=function(a){a.stopImmediatePropagation(),r&&(a=b.getTouch(a)),I(a)},f=c(k,o,t,e);f.bind(),c(k,o,u,function(a){r&&(a=b.getTouch(a)),f.unbind(),Q(a),k.$digest()}).bindOnce(),O(N(a))},Q=function(){var a=k.task.getBackgroundElement();if(a.removeClass("gantt-task-moving"),a.removeClass("gantt-task-resizing"),void 0!==k.task.originalModel){if(k.task.originalModel.from=k.task.model.from,k.task.originalModel.to=k.task.model.to,k.task.originalModel.lct=k.task.model.lct,k.task.originalModel.est=k.task.model.est,k.task.model=k.task.originalModel,k.task.row.model.id!==k.task.originalRow.model.id){var b=k.task.row;b.removeTask(k.task.model.id,!1,!0),k.task.row=k.task.originalRow,b.moveTaskToRow(k.task,!1)}delete k.task.originalModel,delete k.task.originalRow,k.$apply()}D=!1,k.task.isMoving=!1,k.task.active=!1,L(),O(""),C===!0&&("M"===k.task.moveMode?k.row.rowsManager.gantt.api.tasks.raise.moveEnd(k.task):k.row.rowsManager.gantt.api.tasks.raise.resizeEnd(k.task),C=!1,k.task.row.sortTasks(),k.row.rowsManager.gantt.api.tasks.raise.change(k.task)),k.task.moveMode=void 0};k.$on("$destroy",function(){k.destroyed=!0,L()}),k.task.isResizing?(D=!0,P("E",k.task.mouseOffsetX),delete k.task.isResizing):k.task.isMoving&&(D=!0,P("M",k.task.mouseOffsetX))}})}}}])}(),function(){"use strict";angular.module("gantt.movable").factory("ganttMovableOptions",[function(){return{initialize:function(a){return a.enabled=void 0!==a.enabled?a.enabled:!0,a.allowMoving=void 0!==a.allowMoving?!!a.allowMoving:!0,a.allowResizing=void 0!==a.allowResizing?!!a.allowResizing:!0,a.allowRowSwitching=void 0!==a.allowRowSwitching?!!a.allowRowSwitching:!0,a}}}])}(),angular.module("gantt.movable.templates",[]).run(["$templateCache",function(a){}]); //# sourceMappingURL=angular-gantt-movable-plugin.min.js.map \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-movable-plugin.min.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-movable-plugin.min.js.map index 04d573d6e8fa8273e7beb7751a29884f34fad925..79e2dd9f8c7bf8a70101b242c108b2ce0f91b0b2 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-movable-plugin.min.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-movable-plugin.min.js.map @@ -1 +1 @@ -{"version":3,"file":"angular-gantt-movable-plugin.min.js","sources":["../src/plugins/movable.js","../src/plugins/movable/movableOptions.factory.js","../.tmp/generated/plugins/movable/html2js.js"],"names":["angular","module","directive","mouseButton","mouseOffset","smartEvent","movableOptions","utils","dom","$window","$document","$timeout","restrict","require","scope","enabled","allowMoving","allowResizing","allowRowSwitching","link","element","attrs","ganttCtrl","api","gantt","options","option","movable","initialize","registerEvent","mouseStartOffsetX","moveStartX","_hasTouch","DocumentTouch","_pressEvents","_moveEvents","_releaseEvents","taskWithSmallWidth","resizeAreaWidthBig","resizeAreaWidthSmall","scrollSpeed","scrollTriggerDistance","directives","on","directiveName","taskScope","taskElement","scrollInterval","windowElement","ganttBodyElement","row","rowsManager","body","$element","ganttScrollElement","scroll","taskHasBeenChanged","taskHasBeenMovedFromAnotherRow","foregroundElement","task","getForegroundElement","contentElement","getContentElement","onPressEvents","evt","preventDefault","getTouch","taskMovable","model","rowMovable","enabledValue","firstProperty","isFunction","taskOffsetX","getOffsetForElement","x","mode","getMoveMode","getButton","bodyOffsetX","enableMoveMode","$digest","onMousemove","isMoving","css","getCursor","handleMove","destroyed","clearScrollInterval","moveTask","scrollScreen","oldTaskHasBeenChanged","mousePos","mouseOffsetX","taskOutOfRange","value","moveMode","scrollRect","getBoundingClientRect","rowCenterLeft","left","width","ganttBody","querySelectorAll","targetRowElement","findElementFromPoint","clientY","hasClass","targetRow","rows","i","l","length","sourceRow","undefined","moveTaskToRow","$scope","moveTo","tasks","raise","move","setGlobalCursor","setTo","resize","setFrom","backgroundElement","getBackgroundElement","addClass","moveBegin","resizeBegin","leftScreenBorder","scrollLeft","screenWidth","offsetWidth","scrollWidth","rightScreenBorder","keepOnScrolling","right","cancel","distance","cursor","-moz-user-select","-webkit-user-select","-ms-user-select","user-select","originalModel","originalRow","copy","modelLeft","active","taskMoveHandler","stopImmediatePropagation","moveSmartEvent","bind","unbind","disableMoveMode","bindOnce","removeClass","extend","id","removeTask","$apply","moveEnd","resizeEnd","sortTasks","change","$on","isResizing","factory","run","$templateCache"],"mappings":"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"} \ No newline at end of file +{"version":3,"sources":["../src/plugins/movable.js","../src/plugins/movable/movableOptions.factory.js","../.tmp/generated/plugins/movable/html2js.js"],"names":["angular","module","directive","mouseButton","mouseOffset","smartEvent","movableOptions","utils","dom","$window","$document","$timeout","restrict","require","scope","enabled","allowMoving","allowResizing","allowRowSwitching","link","element","attrs","ganttCtrl","api","gantt","options","option","movable","initialize","registerEvent","mouseStartOffsetX","moveStartX","_hasTouch","DocumentTouch","_pressEvents","_moveEvents","_releaseEvents","taskWithSmallWidth","resizeAreaWidthBig","resizeAreaWidthSmall","scrollSpeed","scrollTriggerDistance","directives","on","directiveName","taskScope","taskElement","scrollInterval","windowElement","ganttBodyElement","row","rowsManager","body","$element","ganttScrollElement","scroll","taskHasBeenChanged","taskHasBeenMovedFromAnotherRow","foregroundElement","task","getForegroundElement","contentElement","getContentElement","onPressEvents","evt","preventDefault","getTouch","taskMovable","model","rowMovable","isFunction","enabledValue","firstProperty","taskOffsetX","getOffsetForElement","x","mode","getMoveMode","getButton","bodyOffsetX","enableMoveMode","$digest","onMousemove","isMoving","css","getCursor","handleMove","destroyed","clearScrollInterval","moveTask","scrollScreen","oldTaskHasBeenChanged","mousePos","mouseOffsetX","taskOutOfRange","value","moveMode","scrollRect","getBoundingClientRect","rowCenterLeft","left","width","ganttBody","querySelectorAll","targetRowElement","findElementFromPoint","clientY","hasClass","targetRow","rows","i","l","length","sourceRow","undefined","moveTaskToRow","moveTo","tasks","raise","move","setGlobalCursor","setTo","resize","setFrom","backgroundElement","getBackgroundElement","addClass","moveBegin","resizeBegin","leftScreenBorder","scrollLeft","screenWidth","offsetWidth","scrollWidth","rightScreenBorder","keepOnScrolling","right","cancel","distance","cursor","-moz-user-select","-webkit-user-select","-ms-user-select","user-select","originalModel","originalRow","copy","modelLeft","active","taskMoveHandler","stopImmediatePropagation","moveSmartEvent","bind","unbind","disableMoveMode","bindOnce","removeClass","from","to","lct","est","id","removeTask","$apply","moveEnd","resizeEnd","sortTasks","change","$on","isResizing","factory","run","$templateCache"],"mappings":"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","file":"angular-gantt-movable-plugin.min.js"} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-overlap-plugin.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-overlap-plugin.js index d80a72aa07275bc98d115700ea8d41c1ee8a9ad0..ac5957442b8559fb8c48544f0c50197cd5bf17ce 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-overlap-plugin.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-overlap-plugin.js @@ -1,5 +1,5 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com @@ -13,7 +13,6 @@ Github: https://github.com/angular-gantt/angular-gantt.git require: '^gantt', scope: { enabled: '=?' - // Add other option attributes for this plugin }, link: function(scope, element, attrs, ganttCtrl) { var api = ganttCtrl.gantt.api; @@ -22,78 +21,79 @@ Github: https://github.com/angular-gantt/angular-gantt.git scope.enabled = true; } - if (scope.enabled){ - api.tasks.on.change(scope, function (task) { - // on every task change check for overlaps - scope.handleOverlaps(task); - }); + function getStartEnd(task) { + var start, end; + + if (task.model.from.isBefore(task.model.to)) { + start = task.model.from; + end = task.model.to; + } else { + start = task.model.to; + end = task.model.from; + } + + return [start, end]; } - var overlapsTasks = {}; + function getRange(task) { + var startEnd = getStartEnd(task); + return moment().range(startEnd[0], startEnd[1]); + } - scope.handleOverlaps = function (changedTask) { - // Get all the tasks in the row. - var allTasks = changedTask.row.tasks; + function handleTaskOverlap(overlapsList, task) { + if (!(task.model.id in overlapsList)) { + task.$element.addClass('gantt-task-overlaps'); + overlapsList[task.model.id] = task; + } + } + function handleTaskNonOverlaps(overlapsList, allTasks) { + for(var i=0, l=allTasks.length; i<l; i++) { + var task = allTasks[i]; + if (!(task.model.id in overlapsList)) { + task.$element.removeClass('gantt-task-overlaps'); + } + } + } + + function handleOverlaps(row) { + // Tasks are sorted by start date when added to row + var allTasks = row.tasks; var newOverlapsTasks = {}; - var removedOverlapsTasks = {}; - angular.forEach(allTasks, function(task) { - removedOverlapsTasks[task.model.id] = task; - }); + if (allTasks.length > 1) { + var previousTask = allTasks[0]; + var previousRange = getRange(previousTask); - // set overlaps flag to each task that overlaps other task. - angular.forEach(allTasks,function(currentTask){ - var currentStart,currentEnd; - if (currentTask.model.from.isBefore(currentTask.model.to)){ - currentStart = currentTask.model.from; - currentEnd = currentTask.model.to; - } else { - currentStart = currentTask.model.to; - currentEnd = currentTask.model.from; - } - var currentRange = moment().range(currentStart, currentEnd); - angular.forEach(allTasks,function(task){ - if (currentTask.model.id !== task.model.id){ - var start,end; - if (task.model.from.isBefore(task.model.to)){ - start = task.model.from; - end = task.model.to; - } else { - start = task.model.to; - end = task.model.from; - } - var range = moment().range(start, end); - if (range.overlaps(currentRange)){ - if (!overlapsTasks.hasOwnProperty(task.model.id)) { - newOverlapsTasks[task.model.id] = task; - } - delete removedOverlapsTasks[task.model.id]; - if (!overlapsTasks.hasOwnProperty(currentTask.model.id)) { - newOverlapsTasks[currentTask.model.id] = currentTask; - } - delete removedOverlapsTasks[currentTask.model.id]; - } + for (var i = 1, l = allTasks.length; i < l; i++) { + var task = allTasks[i]; + var range = getRange(task); + + if (range.overlaps(previousRange)) { + handleTaskOverlap(newOverlapsTasks, task); + handleTaskOverlap(newOverlapsTasks, previousTask); } - }); - }); - angular.forEach(removedOverlapsTasks, function(task) { - if (task.$element){ - task.$element.removeClass('gantt-task-overlaps'); - } - delete overlapsTasks[task.model.id]; + if (previousTask.left+previousTask.width < task.left+task.width) { + previousTask = task; + previousRange = range; + } + } + } + + handleTaskNonOverlaps(newOverlapsTasks, allTasks); + } + + if (scope.enabled){ + api.tasks.on.change(scope, function(task) { + handleOverlaps(task.row); }); - angular.forEach(newOverlapsTasks, function(task) { - if (task.$element){ - task.$element.addClass('gantt-task-overlaps'); - } - overlapsTasks[task.model.id] = task; + api.tasks.on.rowChange(scope, function(task, oldRow) { + handleOverlaps(oldRow); }); + } - overlapsTasks = newOverlapsTasks; - }; } }; }]); diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-overlap-plugin.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-overlap-plugin.js.map index c9d940e3aa4bb15ebf8c710a732c4a5d13de5b2b..794d82097b0c6bb3cff976451e498fbc00ec8ffb 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-overlap-plugin.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-overlap-plugin.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/plugins/overlap.js","../.tmp/generated/plugins/overlap/html2js.js"],"names":[],"mappings":"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","file":"angular-gantt-overlap-plugin.js","sourcesContent":["(function(){\n 'use strict';\n angular.module('gantt.overlap', ['gantt', 'gantt.overlap.templates']).directive('ganttOverlap', ['moment',function(moment) {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?'\n // Add other option attributes for this plugin\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.enabled){\n api.tasks.on.change(scope, function (task) {\n // on every task change check for overlaps\n scope.handleOverlaps(task);\n });\n }\n\n var overlapsTasks = {};\n\n scope.handleOverlaps = function (changedTask) {\n // Get all the tasks in the row.\n var allTasks = changedTask.row.tasks;\n\n var newOverlapsTasks = {};\n var removedOverlapsTasks = {};\n\n angular.forEach(allTasks, function(task) {\n removedOverlapsTasks[task.model.id] = task;\n });\n\n // set overlaps flag to each task that overlaps other task.\n angular.forEach(allTasks,function(currentTask){\n var currentStart,currentEnd;\n if (currentTask.model.from.isBefore(currentTask.model.to)){\n currentStart = currentTask.model.from;\n currentEnd = currentTask.model.to;\n } else {\n currentStart = currentTask.model.to;\n currentEnd = currentTask.model.from;\n }\n var currentRange = moment().range(currentStart, currentEnd);\n angular.forEach(allTasks,function(task){\n if (currentTask.model.id !== task.model.id){\n var start,end;\n if (task.model.from.isBefore(task.model.to)){\n start = task.model.from;\n end = task.model.to;\n } else {\n start = task.model.to;\n end = task.model.from;\n }\n var range = moment().range(start, end);\n if (range.overlaps(currentRange)){\n if (!overlapsTasks.hasOwnProperty(task.model.id)) {\n newOverlapsTasks[task.model.id] = task;\n }\n delete removedOverlapsTasks[task.model.id];\n if (!overlapsTasks.hasOwnProperty(currentTask.model.id)) {\n newOverlapsTasks[currentTask.model.id] = currentTask;\n }\n delete removedOverlapsTasks[currentTask.model.id];\n }\n }\n });\n });\n\n angular.forEach(removedOverlapsTasks, function(task) {\n if (task.$element){\n task.$element.removeClass('gantt-task-overlaps');\n }\n delete overlapsTasks[task.model.id];\n });\n\n angular.forEach(newOverlapsTasks, function(task) {\n if (task.$element){\n task.$element.addClass('gantt-task-overlaps');\n }\n overlapsTasks[task.model.id] = task;\n });\n\n overlapsTasks = newOverlapsTasks;\n };\n }\n };\n }]);\n}());\n\n","angular.module('gantt.overlap.templates', []).run(['$templateCache', function($templateCache) {\n\n}]);\n"]} \ No newline at end of file +{"version":3,"sources":["../src/plugins/overlap.js","../.tmp/generated/plugins/overlap/html2js.js"],"names":[],"mappings":"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","file":"angular-gantt-overlap-plugin.js","sourcesContent":["(function(){\n 'use strict';\n angular.module('gantt.overlap', ['gantt', 'gantt.overlap.templates']).directive('ganttOverlap', ['moment',function(moment) {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n function getStartEnd(task) {\n var start, end;\n\n if (task.model.from.isBefore(task.model.to)) {\n start = task.model.from;\n end = task.model.to;\n } else {\n start = task.model.to;\n end = task.model.from;\n }\n\n return [start, end];\n }\n\n function getRange(task) {\n var startEnd = getStartEnd(task);\n return moment().range(startEnd[0], startEnd[1]);\n }\n\n function handleTaskOverlap(overlapsList, task) {\n if (!(task.model.id in overlapsList)) {\n task.$element.addClass('gantt-task-overlaps');\n overlapsList[task.model.id] = task;\n }\n }\n\n function handleTaskNonOverlaps(overlapsList, allTasks) {\n for(var i=0, l=allTasks.length; i<l; i++) {\n var task = allTasks[i];\n if (!(task.model.id in overlapsList)) {\n task.$element.removeClass('gantt-task-overlaps');\n }\n }\n }\n\n function handleOverlaps(row) {\n // Tasks are sorted by start date when added to row\n var allTasks = row.tasks;\n var newOverlapsTasks = {};\n\n if (allTasks.length > 1) {\n var previousTask = allTasks[0];\n var previousRange = getRange(previousTask);\n\n for (var i = 1, l = allTasks.length; i < l; i++) {\n var task = allTasks[i];\n var range = getRange(task);\n\n if (range.overlaps(previousRange)) {\n handleTaskOverlap(newOverlapsTasks, task);\n handleTaskOverlap(newOverlapsTasks, previousTask);\n }\n\n if (previousTask.left+previousTask.width < task.left+task.width) {\n previousTask = task;\n previousRange = range;\n }\n }\n }\n\n handleTaskNonOverlaps(newOverlapsTasks, allTasks);\n }\n\n if (scope.enabled){\n api.tasks.on.change(scope, function(task) {\n handleOverlaps(task.row);\n });\n\n api.tasks.on.rowChange(scope, function(task, oldRow) {\n handleOverlaps(oldRow);\n });\n }\n\n }\n };\n }]);\n}());\n\n","angular.module('gantt.overlap.templates', []).run(['$templateCache', function($templateCache) {\n\n}]);\n"]} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-overlap-plugin.min.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-overlap-plugin.min.js index da9623624046bca8ba8cb9a0861908e41a419cd6..68fd8a4352293625e5154979a01a980e2c2d6fab 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-overlap-plugin.min.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-overlap-plugin.min.js @@ -1,10 +1,10 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com Github: https://github.com/angular-gantt/angular-gantt.git */ -!function(){"use strict";angular.module("gantt.overlap",["gantt","gantt.overlap.templates"]).directive("ganttOverlap",["moment",function(a){return{restrict:"E",require:"^gantt",scope:{enabled:"=?"},link:function(b,c,d,e){var f=e.gantt.api;void 0===b.enabled&&(b.enabled=!0),b.enabled&&f.tasks.on.change(b,function(a){b.handleOverlaps(a)});var g={};b.handleOverlaps=function(b){var c=b.row.tasks,d={},e={};angular.forEach(c,function(a){e[a.model.id]=a}),angular.forEach(c,function(b){var f,h;b.model.from.isBefore(b.model.to)?(f=b.model.from,h=b.model.to):(f=b.model.to,h=b.model.from);var i=a().range(f,h);angular.forEach(c,function(c){if(b.model.id!==c.model.id){var f,h;c.model.from.isBefore(c.model.to)?(f=c.model.from,h=c.model.to):(f=c.model.to,h=c.model.from);var j=a().range(f,h);j.overlaps(i)&&(g.hasOwnProperty(c.model.id)||(d[c.model.id]=c),delete e[c.model.id],g.hasOwnProperty(b.model.id)||(d[b.model.id]=b),delete e[b.model.id])}})}),angular.forEach(e,function(a){a.$element&&a.$element.removeClass("gantt-task-overlaps"),delete g[a.model.id]}),angular.forEach(d,function(a){a.$element&&a.$element.addClass("gantt-task-overlaps"),g[a.model.id]=a}),g=d}}}}])}(),angular.module("gantt.overlap.templates",[]).run(["$templateCache",function(a){}]); +!function(){"use strict";angular.module("gantt.overlap",["gantt","gantt.overlap.templates"]).directive("ganttOverlap",["moment",function(a){return{restrict:"E",require:"^gantt",scope:{enabled:"=?"},link:function(b,c,d,e){function f(a){var b,c;return a.model.from.isBefore(a.model.to)?(b=a.model.from,c=a.model.to):(b=a.model.to,c=a.model.from),[b,c]}function g(b){var c=f(b);return a().range(c[0],c[1])}function h(a,b){b.model.id in a||(b.$element.addClass("gantt-task-overlaps"),a[b.model.id]=b)}function i(a,b){for(var c=0,d=b.length;d>c;c++){var e=b[c];e.model.id in a||e.$element.removeClass("gantt-task-overlaps")}}function j(a){var b=a.tasks,c={};if(b.length>1)for(var d=b[0],e=g(d),f=1,j=b.length;j>f;f++){var k=b[f],l=g(k);l.overlaps(e)&&(h(c,k),h(c,d)),d.left+d.width<k.left+k.width&&(d=k,e=l)}i(c,b)}var k=e.gantt.api;void 0===b.enabled&&(b.enabled=!0),b.enabled&&(k.tasks.on.change(b,function(a){j(a.row)}),k.tasks.on.rowChange(b,function(a,b){j(b)}))}}}])}(),angular.module("gantt.overlap.templates",[]).run(["$templateCache",function(a){}]); //# sourceMappingURL=angular-gantt-overlap-plugin.min.js.map \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-overlap-plugin.min.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-overlap-plugin.min.js.map index bab966f703511d5435ecd3e53d998bd4c1498868..fb878f09c0d85fca5a5d5cd432454540932d253e 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-overlap-plugin.min.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-overlap-plugin.min.js.map @@ -1 +1 @@ -{"version":3,"file":"angular-gantt-overlap-plugin.min.js","sources":["../src/plugins/overlap.js","../.tmp/generated/plugins/overlap/html2js.js"],"names":["angular","module","directive","moment","restrict","require","scope","enabled","link","element","attrs","ganttCtrl","api","gantt","undefined","tasks","on","change","task","handleOverlaps","overlapsTasks","changedTask","allTasks","row","newOverlapsTasks","removedOverlapsTasks","forEach","model","id","currentTask","currentStart","currentEnd","from","isBefore","to","currentRange","range","start","end","overlaps","hasOwnProperty","$element","removeClass","addClass","run","$templateCache"],"mappings":";;;;;;;;CAAC,WACG,YACAA,SAAQC,OAAO,iBAAkB,QAAS,4BAA4BC,UAAU,gBAAiB,SAAS,SAASC,GAC/G,OACIC,SAAU,IACVC,QAAS,SACTC,OACIC,QAAS,MAGbC,KAAM,SAASF,EAAOG,EAASC,EAAOC,GAClC,GAAIC,GAAMD,EAAUE,MAAMD,GAEJE,UAAlBR,EAAMC,UACND,EAAMC,SAAU,GAGhBD,EAAMC,SACNK,EAAIG,MAAMC,GAAGC,OAAOX,EAAO,SAAUY,GAEjCZ,EAAMa,eAAeD,IAI7B,IAAIE,KAEJd,GAAMa,eAAiB,SAAUE,GAE7B,GAAIC,GAAWD,EAAYE,IAAIR,MAE3BS,KACAC,IAEJzB,SAAQ0B,QAAQJ,EAAU,SAASJ,GAC/BO,EAAqBP,EAAKS,MAAMC,IAAMV,IAI1ClB,QAAQ0B,QAAQJ,EAAS,SAASO,GAC9B,GAAIC,GAAaC,CACbF,GAAYF,MAAMK,KAAKC,SAASJ,EAAYF,MAAMO,KAClDJ,EAAeD,EAAYF,MAAMK,KACjCD,EAAaF,EAAYF,MAAMO,KAE/BJ,EAAeD,EAAYF,MAAMO,GACjCH,EAAaF,EAAYF,MAAMK,KAEnC,IAAIG,GAAehC,IAASiC,MAAMN,EAAcC,EAChD/B,SAAQ0B,QAAQJ,EAAS,SAASJ,GAC9B,GAAIW,EAAYF,MAAMC,KAAOV,EAAKS,MAAMC,GAAG,CACvC,GAAIS,GAAMC,CACNpB,GAAKS,MAAMK,KAAKC,SAASf,EAAKS,MAAMO,KACpCG,EAAQnB,EAAKS,MAAMK,KACnBM,EAAMpB,EAAKS,MAAMO,KAEjBG,EAAQnB,EAAKS,MAAMO,GACnBI,EAAMpB,EAAKS,MAAMK,KAErB,IAAII,GAAQjC,IAASiC,MAAMC,EAAOC,EAC9BF,GAAMG,SAASJ,KACVf,EAAcoB,eAAetB,EAAKS,MAAMC,MACzCJ,EAAiBN,EAAKS,MAAMC,IAAMV,SAE/BO,GAAqBP,EAAKS,MAAMC,IAClCR,EAAcoB,eAAeX,EAAYF,MAAMC,MAChDJ,EAAiBK,EAAYF,MAAMC,IAAMC,SAEtCJ,GAAqBI,EAAYF,MAAMC,UAM9D5B,QAAQ0B,QAAQD,EAAsB,SAASP,GACzCA,EAAKuB,UACPvB,EAAKuB,SAASC,YAAY,6BAEnBtB,GAAcF,EAAKS,MAAMC,MAGpC5B,QAAQ0B,QAAQF,EAAkB,SAASN,GACrCA,EAAKuB,UACPvB,EAAKuB,SAASE,SAAS,uBAEvBvB,EAAcF,EAAKS,MAAMC,IAAMV,IAGnCE,EAAgBI,WCvFpCxB,QAAQC,OAAO,8BAA+B2C,KAAK,iBAAkB,SAASC"} \ No newline at end of file +{"version":3,"sources":["../src/plugins/overlap.js","../.tmp/generated/plugins/overlap/html2js.js"],"names":["angular","module","directive","moment","restrict","require","scope","enabled","link","element","attrs","ganttCtrl","getStartEnd","task","start","end","model","from","isBefore","to","getRange","startEnd","range","handleTaskOverlap","overlapsList","id","$element","addClass","handleTaskNonOverlaps","allTasks","i","l","length","removeClass","handleOverlaps","row","tasks","newOverlapsTasks","previousTask","previousRange","overlaps","left","width","api","gantt","undefined","on","change","rowChange","oldRow","run","$templateCache"],"mappings":";;;;;;;;CAAC,WACG,YACAA,SAAQC,OAAO,iBAAkB,QAAS,4BAA4BC,UAAU,gBAAiB,SAAS,SAASC,GAC/G,OACIC,SAAU,IACVC,QAAS,SACTC,OACIC,QAAS,MAEbC,KAAM,SAASF,EAAOG,EAASC,EAAOC,GAOlC,QAASC,GAAYC,GACjB,GAAIC,GAAOC,CAUX,OARIF,GAAKG,MAAMC,KAAKC,SAASL,EAAKG,MAAMG,KACpCL,EAAQD,EAAKG,MAAMC,KACnBF,EAAMF,EAAKG,MAAMG,KAEjBL,EAAQD,EAAKG,MAAMG,GACnBJ,EAAMF,EAAKG,MAAMC,OAGbH,EAAOC,GAGnB,QAASK,GAASP,GACd,GAAIQ,GAAWT,EAAYC,EAC3B,OAAOV,KAASmB,MAAMD,EAAS,GAAIA,EAAS,IAGhD,QAASE,GAAkBC,EAAcX,GAC/BA,EAAKG,MAAMS,KAAMD,KACnBX,EAAKa,SAASC,SAAS,uBACvBH,EAAaX,EAAKG,MAAMS,IAAMZ,GAItC,QAASe,GAAsBJ,EAAcK,GACzC,IAAI,GAAIC,GAAE,EAAGC,EAAEF,EAASG,OAAUD,EAAFD,EAAKA,IAAK,CACtC,GAAIjB,GAAOgB,EAASC,EACdjB,GAAKG,MAAMS,KAAMD,IACnBX,EAAKa,SAASO,YAAY,wBAKtC,QAASC,GAAeC,GAEpB,GAAIN,GAAWM,EAAIC,MACfC,IAEJ,IAAIR,EAASG,OAAS,EAIlB,IAAK,GAHDM,GAAeT,EAAS,GACxBU,EAAgBnB,EAASkB,GAEpBR,EAAI,EAAGC,EAAIF,EAASG,OAAYD,EAAJD,EAAOA,IAAK,CAC7C,GAAIjB,GAAOgB,EAASC,GAChBR,EAAQF,EAASP,EAEjBS,GAAMkB,SAASD,KACfhB,EAAkBc,EAAkBxB,GACpCU,EAAkBc,EAAkBC,IAGpCA,EAAaG,KAAKH,EAAaI,MAAQ7B,EAAK4B,KAAK5B,EAAK6B,QACtDJ,EAAezB,EACf0B,EAAgBjB,GAK5BM,EAAsBS,EAAkBR,GAlE5C,GAAIc,GAAMhC,EAAUiC,MAAMD,GAEJE,UAAlBvC,EAAMC,UACND,EAAMC,SAAU,GAkEhBD,EAAMC,UACNoC,EAAIP,MAAMU,GAAGC,OAAOzC,EAAO,SAASO,GAChCqB,EAAerB,EAAKsB,OAGxBQ,EAAIP,MAAMU,GAAGE,UAAU1C,EAAO,SAASO,EAAMoC,GACzCf,EAAee,cCrFvCjD,QAAQC,OAAO,8BAA+BiD,KAAK,iBAAkB,SAASC","file":"angular-gantt-overlap-plugin.min.js"} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.css b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.css index 326e1d867d55f2ec40ff3e5a179472bb455377e6..3cdefe62a7b7801ac6cc9deeffac911e49a5ea77 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.css +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.css @@ -15,6 +15,76 @@ border-color: #FF6347; } +.gantt .gantt-body-dependencies { + position: absolute; + height: 100%; + width: 100%; +} + +.gantt .gantt-endpoint.jsplumb-endpoint-anchor { + z-index: 20; /* z-index must be higher than tasks z-index */ + overflow: hidden; +} + +.gantt .gantt-endpoint.fallback-endpoint.jsplumb-endpoint-anchor { + z-index: auto; + overflow: hidden; +} + +.gantt .gantt-endpoint-overlay.fallback-endpoint { + height: 4px; + width: 40px; + top: -2px; +} + +.gantt .gantt-endpoint-overlay.start-endpoint.fallback-endpoint { + left: -45px; + background-image:-webkit-linear-gradient(left, rgba(255,255,255,0), #456); + background-image:linear-gradient(to right, rgba(255,255,255,0), #456); +} + +.gantt .gantt-endpoint-overlay.end-endpoint.fallback-endpoint { + left: -5px; + background-image:-webkit-linear-gradient(right, rgba(255,255,255,0), #456); + background-image:linear-gradient(to left, rgba(255,255,255,0), #456); +} + +.gantt .jsplumb-overlay { + z-index: 20; +} + +.gantt .gantt-endpoint-overlay { + position: absolute; +} + +.gantt .gantt-endpoint-overlay.arrow-right { + width: 0; + height: 0; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid black; +} + +.gantt .gantt-endpoint-overlay.arrow-right.start-endpoint { + top: -5px; + left: -11px; + border-left-color: rgb(64, 64, 160); /* blue */ +} + +.gantt .gantt-endpoint-overlay.arrow-right.end-endpoint { + top: -5px; + left: 6px; + border-left-color: rgb(64, 160, 64); /* green */ +} + +.gantt .gantt-endpoint.source-endpoint svg * { + fill: rgb(64, 160, 64); /* green */ +} + +.gantt .gantt-endpoint.target-endpoint svg * { + fill: rgb(64, 64, 160); /* blue */ +} + .gantt-task-group { position: absolute; diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.js index 33b4af1c9f61073de5e4245e8af31083998a2da4..5071f4854c1a7e637daf469e9a83035cc0bb8fa6 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.js @@ -1,5 +1,5 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com @@ -61,16 +61,162 @@ Github: https://github.com/angular-gantt/angular-gantt.git }()); +(function() { + 'use strict'; + angular.module('gantt.dependencies', ['gantt', 'gantt.dependencies.templates']).directive('ganttDependencies', ['$timeout', '$document', 'ganttDebounce', 'GanttDependenciesManager', function($timeout, $document, debounce, DependenciesManager) { + return { + restrict: 'E', + require: '^gantt', + scope: { + enabled: '=?', + jsPlumbDefaults: '=?', + endpoints: '=?', + fallbackEndpoints: '=?' + }, + link: function(scope, element, attrs, ganttCtrl) { + var api = ganttCtrl.gantt.api; + + // Load options from global options attribute. + if (scope.options && typeof(scope.options.dependencies) === 'object') { + for (var option in scope.options.dependencies) { + scope[option] = scope.options[option]; + } + } + + if (scope.enabled === undefined) { + scope.enabled = true; + } + + if (scope.jsPlumbDefaults === undefined) { + // https://jsplumbtoolkit.com/community/doc/defaults.html + scope.jsPlumbDefaults = { + Endpoint: ['Dot', {radius: 4}], + EndpointStyle: {fillStyle: '#456', strokeStyle: '#456', lineWidth: 1}, + Connector: ['Flowchart', {midpoint:0.975, stub:16}], + ConnectionOverlays: [['Arrow', {location: 1, length: 12, width: 12}]] + }; + } + + function createLeftOverlay() { + return angular.element('<span><span class="gantt-endpoint-overlay start-endpoint arrow-right"></span></span>'); + } + + function createRightOverlay() { + return angular.element('<span><span class="gantt-endpoint-overlay end-endpoint arrow-right"></span></span>'); + } + + function createLeftFallbackOverlay() { + return angular.element('<span><span class="gantt-endpoint-overlay start-endpoint fallback-endpoint"></span></span>'); + } + + function createRightFallbackOverlay() { + return angular.element('<span><span class="gantt-endpoint-overlay end-endpoint fallback-endpoint"></span></span>'); + } + + if (scope.endpoints === undefined) { + scope.endpoints = [ + { + anchor: 'Left', + isSource: false, + isTarget: true, + maxConnections: -1, + cssClass: 'gantt-endpoint start-endpoint target-endpoint', + overlays: [ + ['Custom', {create: createLeftOverlay}] + ] + + }, + { + anchor: 'Right', + isSource: true, + isTarget: false, + maxConnections: -1, + cssClass: 'gantt-endpoint end-endpoint source-endpoint', + overlays: [ + ['Custom', {create: createRightOverlay}] + ] + } + ]; + } + + if (scope.fallbackEndpoints === undefined) { + scope.fallbackEndpoints = [ + { + endpoint: 'Blank', + anchor: 'Left', + isSource: false, + isTarget: true, + maxConnections: 0, + cssClass: 'gantt-endpoint start-endpoint fallback-endpoint', + overlays: [ + ['Custom', {create: createLeftFallbackOverlay}] + ] + }, + { + endpoint: 'Blank', + anchor: 'Right', + isSource: true, + isTarget: false, + maxConnections: 0, + cssClass: 'gantt-endpoint end-endpoint fallback-endpoint', + overlays: [ + ['Custom', {create: createRightFallbackOverlay}] + ] + } + ]; + } + + var manager = new DependenciesManager(ganttCtrl.gantt, scope, api); + + api.directives.on.new(scope, function(directiveName, directiveScope, directiveElement) { + if (directiveName === 'ganttBody') { + manager.plumb.setContainer(directiveElement); + } + }); + + api.tasks.on.add(scope, function(task) { + manager.addDependenciesFromTask(task); + }); + + api.tasks.on.remove(scope, function(task) { + manager.removeDependenciesFromTask(task); + }); + + api.tasks.on.displayed(scope, debounce(function(tasks) { + manager.setTasks(tasks); + manager.refresh(); + })); + + api.rows.on.displayed(scope, function() { + manager.refresh(); + }); + + api.tasks.on.viewChange(scope, function(task) { + if (task.$element) { + manager.plumb.revalidate(task.$element[0]); + } + }); + + api.tasks.on.viewRowChange(scope, function(task) { + manager.setTask(task); + }); + + } + }; + }]); +}()); + + (function(){ 'use strict'; - angular.module('gantt.drawtask', ['gantt']).directive('ganttDrawTask', ['$document', 'ganttMouseOffset', 'moment', function(document, mouseOffset, moment) { + angular.module('gantt.drawtask', ['gantt']).directive('ganttDrawTask', ['$document', 'ganttMouseOffset', 'ganttUtils', 'moment', function(document, mouseOffset, utils, moment) { return { restrict: 'E', require: '^gantt', scope: { enabled: '=?', moveThreshold: '=?', - taskModelFactory: '=taskFactory' + taskModelFactory: '=?taskFactory' }, link: function(scope, element, attrs, ganttCtrl) { var api = ganttCtrl.gantt.api; @@ -83,6 +229,12 @@ Github: https://github.com/angular-gantt/angular-gantt.git scope.moveThreshold = 0; } + if (scope.taskModelFactory === undefined) { + scope.taskModelFactory = function() { + return {}; // New empty task. + }; + } + api.directives.on.new(scope, function(directiveName, directiveScope, element) { if (directiveName === 'ganttRow') { var addNewTask = function(x) { @@ -270,10 +422,10 @@ Github: https://github.com/angular-gantt/angular-gantt.git var labels = ganttCtrl.gantt.side.$element[0].getElementsByClassName('gantt-row-label'); var newSideWidth = 0; - angular.forEach(labels, function (label) { - var width = label.children[0].offsetWidth; + for (var i=0; i<labels.length; i++) { + var width = labels[i].children[0].offsetWidth; newSideWidth = Math.max(newSideWidth, width); - }); + } if (newSideWidth >= 0) { api.side.setWidth(newSideWidth); @@ -289,6 +441,8 @@ Github: https://github.com/angular-gantt/angular-gantt.git (function(){ 'use strict'; + + /* jshint latedef: false */ angular.module('gantt.movable', ['gantt']).directive('ganttMovable', ['ganttMouseButton', 'ganttMouseOffset', 'ganttSmartEvent', 'ganttMovableOptions', 'ganttUtils', 'ganttDom', '$window', '$document', '$timeout', function(mouseButton, mouseOffset, smartEvent, movableOptions, utils, dom, $window, $document, $timeout) { // Provides moving and resizing of tasks @@ -358,16 +512,16 @@ Github: https://github.com/angular-gantt/angular-gantt.git var taskMovable = taskScope.task.model.movable; var rowMovable = taskScope.task.row.model.movable; - if (typeof(taskMovable) === 'boolean') { + if (typeof(taskMovable) === 'boolean' || angular.isFunction(taskMovable)) { taskMovable = {enabled: taskMovable}; } - if (typeof(rowMovable) === 'boolean') { + if (typeof(rowMovable) === 'boolean' || angular.isFunction(rowMovable)) { rowMovable = {enabled: rowMovable}; } var enabledValue = utils.firstProperty([taskMovable, rowMovable], 'enabled', scope.enabled); - var enabled = angular.isFunction(enabledValue) ? enabledValue(evt): enabledValue; + var enabled = angular.isFunction(enabledValue) ? enabledValue(evt, taskScope.task): enabledValue; if (enabled) { var taskOffsetX = mouseOffset.getOffsetForElement(foregroundElement[0], evt).x; var mode = getMoveMode(taskOffsetX); @@ -385,16 +539,16 @@ Github: https://github.com/angular-gantt/angular-gantt.git var taskMovable = taskScope.task.model.movable; var rowMovable = taskScope.task.row.model.movable; - if (typeof(taskMovable) === 'boolean') { + if (typeof(taskMovable) === 'boolean' || angular.isFunction(taskMovable)) { taskMovable = {enabled: taskMovable}; } - if (typeof(rowMovable) === 'boolean') { + if (typeof(rowMovable) === 'boolean' || angular.isFunction(rowMovable)) { rowMovable = {enabled: rowMovable}; } var enabledValue = utils.firstProperty([taskMovable, rowMovable], 'enabled', scope.enabled); - var enabled = angular.isFunction(enabledValue) ? enabledValue(evt): enabledValue; + var enabled = angular.isFunction(enabledValue) ? enabledValue(evt, taskScope.task): enabledValue; if (enabled && !taskScope.task.isMoving) { var taskOffsetX = mouseOffset.getOffsetForElement(foregroundElement[0], evt).x; var mode = getMoveMode(taskOffsetX); @@ -429,11 +583,11 @@ Github: https://github.com/angular-gantt/angular-gantt.git var taskMovable = taskScope.task.model.movable; var rowMovable = taskScope.task.row.model.movable; - if (typeof(taskMovable) === 'boolean') { + if (typeof(taskMovable) === 'boolean' || angular.isFunction(taskMovable)) { taskMovable = {enabled: taskMovable}; } - if (typeof(rowMovable) === 'boolean') { + if (typeof(rowMovable) === 'boolean' || angular.isFunction(rowMovable)) { rowMovable = {enabled: rowMovable}; } @@ -462,8 +616,6 @@ Github: https://github.com/angular-gantt/angular-gantt.git if (targetRow !== undefined && sourceRow !== targetRow) { targetRow.moveTaskToRow(taskScope.task, true); - sourceRow.$scope.$digest(); - targetRow.$scope.$digest(); taskHasBeenChanged = true; } } @@ -684,7 +836,12 @@ Github: https://github.com/angular-gantt/angular-gantt.git getBackgroundElement.removeClass('gantt-task-resizing'); if (taskScope.task.originalModel !== undefined) { - angular.extend(taskScope.task.originalModel, taskScope.task.model); + + taskScope.task.originalModel.from = taskScope.task.model.from; + taskScope.task.originalModel.to = taskScope.task.model.to; + taskScope.task.originalModel.lct = taskScope.task.model.lct; + taskScope.task.originalModel.est = taskScope.task.model.est; + taskScope.task.model = taskScope.task.originalModel; if (taskScope.task.row.model.id !== taskScope.task.originalRow.model.id) { var targetRow = taskScope.task.row; @@ -759,7 +916,6 @@ Github: https://github.com/angular-gantt/angular-gantt.git require: '^gantt', scope: { enabled: '=?' - // Add other option attributes for this plugin }, link: function(scope, element, attrs, ganttCtrl) { var api = ganttCtrl.gantt.api; @@ -768,78 +924,79 @@ Github: https://github.com/angular-gantt/angular-gantt.git scope.enabled = true; } - if (scope.enabled){ - api.tasks.on.change(scope, function (task) { - // on every task change check for overlaps - scope.handleOverlaps(task); - }); + function getStartEnd(task) { + var start, end; + + if (task.model.from.isBefore(task.model.to)) { + start = task.model.from; + end = task.model.to; + } else { + start = task.model.to; + end = task.model.from; + } + + return [start, end]; + } + + function getRange(task) { + var startEnd = getStartEnd(task); + return moment().range(startEnd[0], startEnd[1]); } - var overlapsTasks = {}; + function handleTaskOverlap(overlapsList, task) { + if (!(task.model.id in overlapsList)) { + task.$element.addClass('gantt-task-overlaps'); + overlapsList[task.model.id] = task; + } + } - scope.handleOverlaps = function (changedTask) { - // Get all the tasks in the row. - var allTasks = changedTask.row.tasks; + function handleTaskNonOverlaps(overlapsList, allTasks) { + for(var i=0, l=allTasks.length; i<l; i++) { + var task = allTasks[i]; + if (!(task.model.id in overlapsList)) { + task.$element.removeClass('gantt-task-overlaps'); + } + } + } + function handleOverlaps(row) { + // Tasks are sorted by start date when added to row + var allTasks = row.tasks; var newOverlapsTasks = {}; - var removedOverlapsTasks = {}; - angular.forEach(allTasks, function(task) { - removedOverlapsTasks[task.model.id] = task; - }); + if (allTasks.length > 1) { + var previousTask = allTasks[0]; + var previousRange = getRange(previousTask); - // set overlaps flag to each task that overlaps other task. - angular.forEach(allTasks,function(currentTask){ - var currentStart,currentEnd; - if (currentTask.model.from.isBefore(currentTask.model.to)){ - currentStart = currentTask.model.from; - currentEnd = currentTask.model.to; - } else { - currentStart = currentTask.model.to; - currentEnd = currentTask.model.from; - } - var currentRange = moment().range(currentStart, currentEnd); - angular.forEach(allTasks,function(task){ - if (currentTask.model.id !== task.model.id){ - var start,end; - if (task.model.from.isBefore(task.model.to)){ - start = task.model.from; - end = task.model.to; - } else { - start = task.model.to; - end = task.model.from; - } - var range = moment().range(start, end); - if (range.overlaps(currentRange)){ - if (!overlapsTasks.hasOwnProperty(task.model.id)) { - newOverlapsTasks[task.model.id] = task; - } - delete removedOverlapsTasks[task.model.id]; - if (!overlapsTasks.hasOwnProperty(currentTask.model.id)) { - newOverlapsTasks[currentTask.model.id] = currentTask; - } - delete removedOverlapsTasks[currentTask.model.id]; - } + for (var i = 1, l = allTasks.length; i < l; i++) { + var task = allTasks[i]; + var range = getRange(task); + + if (range.overlaps(previousRange)) { + handleTaskOverlap(newOverlapsTasks, task); + handleTaskOverlap(newOverlapsTasks, previousTask); } - }); - }); - angular.forEach(removedOverlapsTasks, function(task) { - if (task.$element){ - task.$element.removeClass('gantt-task-overlaps'); - } - delete overlapsTasks[task.model.id]; + if (previousTask.left+previousTask.width < task.left+task.width) { + previousTask = task; + previousRange = range; + } + } + } + + handleTaskNonOverlaps(newOverlapsTasks, allTasks); + } + + if (scope.enabled){ + api.tasks.on.change(scope, function(task) { + handleOverlaps(task.row); }); - angular.forEach(newOverlapsTasks, function(task) { - if (task.$element){ - task.$element.addClass('gantt-task-overlaps'); - } - overlapsTasks[task.model.id] = task; + api.tasks.on.rowChange(scope, function(task, oldRow) { + handleOverlaps(oldRow); }); + } - overlapsTasks = newOverlapsTasks; - }; } }; }]); @@ -938,6 +1095,8 @@ Github: https://github.com/angular-gantt/angular-gantt.git } var rendered = false; + var sensor; + api.core.on.rendered(scope, function() { rendered = true; if (sensor !== undefined) { @@ -949,7 +1108,6 @@ Github: https://github.com/angular-gantt/angular-gantt.git } }); - var sensor; scope.$watch('enabled', function(newValue) { if (rendered) { if (newValue && sensor === undefined) { @@ -1180,7 +1338,8 @@ Github: https://github.com/angular-gantt/angular-gantt.git scope: { enabled: '=?', dateFormat: '=?', - content: '=?' + content: '=?', + delay: '=?' }, link: function(scope, element, attrs, ganttCtrl) { var api = ganttCtrl.gantt.api; @@ -1198,6 +1357,9 @@ Github: https://github.com/angular-gantt/angular-gantt.git if (scope.dateFormat === undefined) { scope.dateFormat = 'MMM DD, HH:mm'; } + if (scope.delay === undefined) { + scope.delay = 500; + } if (scope.content === undefined) { scope.content = '{{task.model.name}}</br>'+ '<small>'+ @@ -1363,182 +1525,1006 @@ Github: https://github.com/angular-gantt/angular-gantt.git }()); -(function(){ +(function() { 'use strict'; - angular.module('gantt.groups').controller('GanttGroupController', ['$scope', 'GanttTaskGroup', 'ganttUtils', function($scope, TaskGroup, utils) { - var updateTaskGroup = function() { - var rowGroups = $scope.row.model.groups; - - if (typeof(rowGroups) === 'boolean') { - rowGroups = {enabled: rowGroups}; - } - var enabledValue = utils.firstProperty([rowGroups], 'enabled', $scope.pluginScope.enabled); - if (enabledValue) { - $scope.display = utils.firstProperty([rowGroups], 'display', $scope.pluginScope.display); - $scope.taskGroup = new TaskGroup($scope.row, $scope.pluginScope); + angular.module('gantt.dependencies').factory('GanttDependenciesEvents', [function() { + /** + * Creates a new DependenciesEvents object. + * + * @param manager DependenciesManager object + * @constructor + */ + var DependenciesEvents = function(manager) { + var self = this; - $scope.row.setFromTo(); - $scope.row.setFromToByValues($scope.taskGroup.from, $scope.taskGroup.to); - } else { - $scope.taskGroup = undefined; - $scope.display = undefined; - } - }; + this.manager = manager; - $scope.gantt.api.tasks.on.change($scope, function(task) { - if ($scope.taskGroup !== undefined) { - if ($scope.taskGroup.tasks.indexOf(task) > -1) { - $scope.$evalAsync(function() { - updateTaskGroup(); - }); - } else { - var descendants = $scope.pluginScope.hierarchy.descendants($scope.row); - if (descendants.indexOf(task.row) > -1) { - $scope.$evalAsync(function() { - updateTaskGroup(); - }); - } - } - } - }); + // Deny drop on the same task. + var denyDropOnSameTask = function(params) { + return params.sourceId !== params.targetId; + }; - var removeWatch = $scope.pluginScope.$watch('display', updateTaskGroup); + this.manager.plumb.bind('beforeDrop', denyDropOnSameTask); - $scope.$watchCollection('gantt.rowsManager.filteredRows', updateTaskGroup); - $scope.gantt.api.columns.on.refresh($scope, updateTaskGroup); + // Notify the manager that a connection is being created. + this.manager.plumb.bind('connectionDrag', function(connection) { + self.manager.setDraggingConnection(connection); + }); - $scope.$on('$destroy', removeWatch); - }]); -}()); + this.manager.plumb.bind('connectionDragStop', function() { + self.manager.setDraggingConnection(undefined); + }); + this.manager.plumb.bind('beforeDrop', function() { + self.manager.setDraggingConnection(undefined); + return true; + }); -(function(){ - 'use strict'; - angular.module('gantt.groups').directive('ganttTaskGroup', ['GanttDirectiveBuilder', function(Builder) { - var builder = new Builder('ganttTaskGroup', 'plugins/groups/taskGroup.tmpl.html'); - return builder.build(); - }]); -}()); + var createConnection = function(info, mouseEvent) { + if (mouseEvent) { + var oldDependency; + if (info.connection.$dependency) { + oldDependency = info.connection.$dependency; + } + var sourceEndpoint = info.sourceEndpoint; + var targetEndpoint = info.targetEndpoint; -(function(){ - 'use strict'; + var sourceModel = sourceEndpoint.$task.model; - angular.module('gantt').factory('GanttTaskGroup', ['ganttUtils', 'GanttTask', function(utils, Task) { - var TaskGroup = function (row, pluginScope) { - var self = this; + var dependenciesModel = sourceModel.dependencies; + if (dependenciesModel === undefined) { + dependenciesModel = []; + sourceModel.dependencies = dependenciesModel; + } - self.row = row; - self.pluginScope = pluginScope; + var connectionModel = {to: targetEndpoint.$task.model.id}; + dependenciesModel.push(connectionModel); - self.descendants = self.pluginScope.hierarchy.descendants(self.row); + if (oldDependency) { + oldDependency.removeFromTaskModel(); + self.manager.removeDependency(oldDependency, true); // Connection will be disconnected later by jsPlumb. + } - self.tasks = []; - self.overviewTasks = []; - self.promotedTasks = []; - self.showGrouping = false; + var dependency = self.manager.addDependency(sourceEndpoint.$task, connectionModel); + info.connection.$dependency = dependency; + dependency.connection = info.connection; - var groupRowGroups = self.row.model.groups; - if (typeof(groupRowGroups) === 'boolean') { - groupRowGroups = {enabled: groupRowGroups}; - } + self.manager.api.dependencies.raise.add(dependency); - var getTaskDisplay = function(task) { - var taskGroups = task.model.groups; - if (typeof(taskGroups) === 'boolean') { - taskGroups = {enabled: taskGroups}; } + }; - var rowGroups = task.row.model.groups; - if (typeof(rowGroups) === 'boolean') { - rowGroups = {enabled: rowGroups}; - } + var updateConnection = function(info, mouseEvent) { + if (mouseEvent) { + var oldDependency; + if (info.connection.$dependency) { + oldDependency = info.connection.$dependency; + } - var enabledValue = utils.firstProperty([taskGroups, rowGroups, groupRowGroups], 'enabled', self.pluginScope.enabled); + var sourceEndpoint = info.newSourceEndpoint; + var targetEndpoint = info.newTargetEndpoint; - if (enabledValue) { - var display = utils.firstProperty([taskGroups, rowGroups, groupRowGroups], 'display', self.pluginScope.display); - return display; - } - }; + var sourceModel = sourceEndpoint.$task.model; - angular.forEach(self.descendants, function(descendant) { - angular.forEach(descendant.tasks, function(task) { - var taskDisplay = getTaskDisplay(task); - if (taskDisplay !== undefined) { - self.tasks.push(task); - var clone = new Task(self.row, task.model); + var dependenciesModel = sourceModel.dependencies; + if (dependenciesModel === undefined) { + dependenciesModel = []; + sourceModel.dependencies = dependenciesModel; + } - if (taskDisplay === 'overview') { - self.overviewTasks.push(clone); - } else if(taskDisplay === 'promote'){ - self.promotedTasks.push(clone); - } else { - self.showGrouping = true; - } + var connectionModel = {to: targetEndpoint.$task.model.id}; + dependenciesModel.push(connectionModel); + + if (oldDependency) { + oldDependency.removeFromTaskModel(); + self.manager.removeDependency(oldDependency, true); // Connection will be disconnected later by jsPlumb. } - }); - }); - self.from = undefined; - angular.forEach(self.tasks, function (task) { - if (self.from === undefined || task.model.from < self.from) { - self.from = task.model.from; + var dependency = self.manager.addDependency(sourceEndpoint.$task, connectionModel); + info.connection.$dependency = dependency; + dependency.connection = info.connection; + + self.manager.api.dependencies.raise.change(dependency, oldDependency); } - }); + }; - self.to = undefined; - angular.forEach(self.tasks, function (task) { - if (self.to === undefined || task.model.to > self.to) { - self.to = task.model.to; + var deleteConnection = function(info, mouseEvent) { + if (mouseEvent) { + var dependency = info.connection.$dependency; + + dependency.removeFromTaskModel(); + self.manager.removeDependency(dependency, true); // Connection will be disconnected later by jsPlumb. + self.manager.api.dependencies.raise.remove(dependency); } - }); + }; - if (self.showGrouping) { - self.left = row.rowsManager.gantt.getPositionByDate(self.from); - self.width = row.rowsManager.gantt.getPositionByDate(self.to) - self.left; - } - }; - return TaskGroup; - }]); -}()); + this.manager.plumb.bind('connectionMoved', updateConnection); + this.manager.plumb.bind('connection', createConnection); + this.manager.plumb.bind('connectionDetached', deleteConnection); -(function(){ - 'use strict'; - angular.module('gantt').directive('ganttTaskOverview', ['GanttDirectiveBuilder', function(Builder) { - var builder = new Builder('ganttTaskOverview', 'plugins/groups/taskOverview.tmpl.html'); - builder.controller = function($scope, $element) { - $scope.task.$element = $element; - $scope.task.$scope = $scope; - $scope.task.updatePosAndSize(); }; - return builder.build(); + return DependenciesEvents; }]); }()); -(function(){ +/* globals jsPlumb */ +(function() { 'use strict'; - angular.module('gantt.labels').directive('ganttLabelsBody', ['GanttDirectiveBuilder', 'ganttLayout', function(Builder, layout) { - var builder = new Builder('ganttLabelsBody', 'plugins/labels/labelsBody.tmpl.html'); - builder.controller = function($scope) { - var hScrollBarHeight = layout.getScrollBarHeight(); - $scope.getLabelsCss = function() { - var css = {}; + angular.module('gantt.dependencies').factory('GanttDependenciesManager', ['GanttDependency', 'GanttDependenciesEvents', 'GanttDependencyTaskMouseHandler', function(Dependency, DependenciesEvents, TaskMouseHandler) { + var DependenciesManager = function(gantt, pluginScope, api) { + var self = this; - if ($scope.maxHeight) { - var bodyScrollBarHeight = $scope.gantt.scroll.isHScrollbarVisible() ? hScrollBarHeight : 0; - css['max-height'] = $scope.maxHeight - bodyScrollBarHeight - $scope.gantt.header.getHeight() + 'px'; - } + this.gantt = gantt; + this.pluginScope = pluginScope; + this.api = api; - return css; - }; - }; - return builder.build(); - }]); -}()); + this.api.registerEvent('dependencies', 'add'); + this.api.registerEvent('dependencies', 'change'); + this.api.registerEvent('dependencies', 'remove'); + + this.plumb = jsPlumb.getInstance(); + this.plumb.importDefaults(this.pluginScope.jsPlumbDefaults); + + this.dependenciesFrom = {}; + this.dependenciesTo = {}; + + this.tasks = {}; + + this.events = new DependenciesEvents(this); + + this.pluginScope.$watch('enabled', function(newValue, oldValue) { + if (newValue !== oldValue) { + self.refresh(); + } + + }); + + this.pluginScope.$watch('jsPlumbDefaults', function(newValue, oldValue) { + if (newValue !== oldValue) { + self.plumb.importDefaults(newValue); + self.refresh(); + } + }, true); + + /** + * Add all dependencies defined from a task. Dependencies will be added only if plugin is enabled. + * + * @param task + */ + this.addDependenciesFromTask = function(task) { + if (this.pluginScope.enabled) { + var taskDependencies = task.model.dependencies; + + if (taskDependencies !== undefined) { + if (!angular.isArray(taskDependencies)) { + taskDependencies = [taskDependencies]; + task.model.dependencies = taskDependencies; + } + + for (var i = 0, l = taskDependencies.length; i < l; i++) { + var dependency = self.addDependency(task, taskDependencies[i]); + dependency.connect(); + } + } + } + }; + + /** + * Remove all dependencies defined for a task. + * + * @param task + * @param keepConnection if true, dependency will not be disconnected. + */ + this.removeDependenciesFromTask = function(task, keepConnection) { + var dependencies = this.getTaskDependencies(task); + + if (dependencies) { + for (var i = 0; i < dependencies.length; i++) { + if (!keepConnection) { + dependencies[i].disconnect(); + } + self.removeDependency(dependencies[i]); + } + } + }; + + /** + * Add definition of a dependency. + * + * @param task Task defining the dependency. + * @param model Model object for the dependency. + */ + this.addDependency = function(task, model) { + var dependency = new Dependency(this, task, model); + + var fromTaskId = dependency.getFromTaskId(); + var toTaskId = dependency.getToTaskId(); + + if (!(fromTaskId in this.dependenciesFrom)) { + this.dependenciesFrom[fromTaskId] = []; + } + if (!(toTaskId in this.dependenciesTo)) { + this.dependenciesTo[toTaskId] = []; + } + + if (fromTaskId) { + this.dependenciesFrom[fromTaskId].push(dependency); + } + + if (toTaskId) { + this.dependenciesTo[toTaskId].push(dependency); + } + + return dependency; + }; + + /** + * Remove definition of a dependency + * + * @param dependency Dependency object + * @param keepConnection if true, dependency will not be disconnected. + */ + this.removeDependency = function(dependency, keepConnection) { + var fromDependencies = this.dependenciesFrom[dependency.getFromTaskId()]; + var fromRemove = []; + var i; + + if (fromDependencies) { + for (i = 0; i < fromDependencies.length; i++) { + if (dependency === fromDependencies[i]) { + fromRemove.push(dependency); + } + } + } + + var toDependencies = this.dependenciesTo[dependency.getToTaskId()]; + var toRemove = []; + + if (toDependencies) { + for (i = 0; i < toDependencies.length; i++) { + if (dependency === toDependencies[i]) { + toRemove.push(dependency); + } + } + } + + for (i = 0; i < fromRemove.length; i++) { + if (!keepConnection) { + fromRemove[i].disconnect(); + } + fromDependencies.splice(fromDependencies.indexOf(dependency), 1); + } + + for (i = 0; i < toRemove.length; i++) { + if (!keepConnection) { + toRemove[i].disconnect(); + } + toDependencies.splice(toDependencies.indexOf(dependency), 1); + } + + if (this.dependenciesFrom[dependency.getFromTaskId()] && + this.dependenciesFrom[dependency.getFromTaskId()].length === 0) { + delete this.dependenciesFrom[dependency.getFromTaskId()]; + } + + if (this.dependenciesTo[dependency.getToTaskId()] && + this.dependenciesTo[dependency.getToTaskId()].length === 0) { + delete this.dependenciesTo[dependency.getToTaskId()]; + } + }; + + this.getTaskDependencies = function(task) { + var dependencies = []; + + var fromDependencies = self.dependenciesFrom[task.model.id]; + if (fromDependencies) { + dependencies = dependencies.concat(fromDependencies); + } + + var toDependencies = self.dependenciesTo[task.model.id]; + if (toDependencies) { + dependencies = dependencies.concat(toDependencies); + } + + return dependencies; + }; + + this.setDraggingConnection = function(connection) { + if (connection) { + self.draggingConnection = connection; + angular.forEach(self.tasks, function(task) { + task.dependencies.mouseHandler.release(); + }); + } else { + self.draggingConnection = undefined; + angular.forEach(self.tasks, function(task) { + task.dependencies.mouseHandler.install(); + }); + } + }; + + var addTaskEndpoints = function(task) { + if (!task.dependencies) { + task.dependencies = {}; + } + + task.dependencies.endpoints = []; + + if (self.pluginScope.endpoints) { + for (var i = 0; i < self.pluginScope.endpoints.length; i++) { + var endpointObject = self.plumb.addEndpoint(task.$element, self.pluginScope.endpoints[i]); + endpointObject.$task = task; + task.dependencies.endpoints.push(endpointObject); + } + } + + }; + + var removeTaskEndpoint = function(task) { + for (var i = 0; i < task.dependencies.endpoints.length; i++) { + var endpointObject = task.dependencies.endpoints[i]; + self.plumb.deleteEndpoint(endpointObject); + endpointObject.$task = undefined; + } + + task.dependencies.endpoints = undefined; + }; + + var addTaskMouseHandler = function(task) { + if (!task.dependencies) { + task.dependencies = {}; + } + + task.dependencies.mouseHandler = new TaskMouseHandler(self, task); + task.dependencies.mouseHandler.install(); + }; + + var removeTaskMouseHandler = function(task) { + task.dependencies.mouseHandler.release(); + task.dependencies.mouseHandler = undefined; + }; + + /** + * Set tasks objects that can be used to display dependencies. + * + * @param tasks + */ + this.setTasks = function(tasks) { + angular.forEach(self.tasks, function(task) { + removeTaskMouseHandler(task); + removeTaskEndpoint(task); + }); + + var newTasks = {}; + for (var i = 0; i < tasks.length; i++) { + var task = tasks[i]; + newTasks[task.model.id] = task; + addTaskEndpoints(task); + addTaskMouseHandler(task); + } + self.tasks = newTasks; + }; + + var disconnectTaskDependencies = function(task) { + var dependencies = self.getTaskDependencies(task); + if (dependencies) { + for (var i = 0; i < dependencies.length; i++) { + dependencies[i].disconnect(); + } + } + return dependencies; + }; + + var connectTaskDependencies = function(task) { + var dependencies = self.getTaskDependencies(task); + if (dependencies) { + for (var i = 0; i < dependencies.length; i++) { + dependencies[i].connect(); + } + } + return dependencies; + }; + + /** + * Set task object in replacement of an existing with the same id. + * + * @param task + */ + this.setTask = function(task) { + self.plumb.setSuspendDrawing(true); + try { + var oldTask = self.tasks[task.model.id]; + if (oldTask !== undefined) { + disconnectTaskDependencies(oldTask); + removeTaskMouseHandler(oldTask); + removeTaskEndpoint(oldTask); + } + self.tasks[task.model.id] = task; + addTaskEndpoints(task); + addTaskMouseHandler(task); + connectTaskDependencies(task); + } finally { + self.plumb.setSuspendDrawing(false, true); + } + }; + + /** + * Retrieve the task from it's id. + * + * @param taskId id of the task element to retrieve. + * @returns {*} + */ + this.getTask = function(taskId) { + return self.tasks[taskId]; + }; + + var getSourceEndpoints = function(task) { + return task.dependencies.endpoints.filter(function(endpoint) { + return endpoint.isSource; + }); + }; + + var getTargetEndpoints = function(task) { + return task.dependencies.endpoints.filter(function(endpoint) { + return endpoint.isTarget; + }); + }; + + /** + * Connects two tasks together using source endpoint from fromTask and target endpoint from toTask. + * + * @param fromTask + * @param toTask + * @param model + * @returns connection object + */ + this.connect = function(fromTask, toTask, model) { + var sourceEndpoints = getSourceEndpoints(fromTask); + var targetEndpoints = getTargetEndpoints(toTask); + if (sourceEndpoints && targetEndpoints) { + var sourceEndpoint; + var targetEndpoint; + + if (model.connectParameters && model.connectParameters.sourceEndpointIndex) { + sourceEndpoint = sourceEndpoints[model.connectParameters.sourceEndpointIndex]; + } else { + sourceEndpoint = sourceEndpoints[0]; + } + + if (model.connectParameters && model.connectParameters.targetEndpointIndex) { + targetEndpoint = targetEndpoints[model.connectParameters.targetEndpointIndex]; + } else { + targetEndpoint = targetEndpoints[0]; + } + + var connection = self.plumb.connect({ + source: sourceEndpoint, + target: targetEndpoint + }, model.connectParameters); + return connection; + } + }; + + /** + * Get all defined dependencies. + * + * @returns {Array} + */ + this.getDependencies = function() { + var allDependencies = []; + + angular.forEach(this.dependenciesFrom, function(dependencies) { + for (var i = 0; i < dependencies.length; i++) { + if (!(dependencies[i] in allDependencies)) { + allDependencies.push(dependencies[i]); + } + } + }); + + return allDependencies; + }; + + /** + * Refresh jsplumb status based on tasks dependencies models. + */ + this.refresh = function(tasks) { + self.plumb.setSuspendDrawing(true); + + try { + var tasksDependencies; + var i; + if (tasks && !angular.isArray(tasks)) { + tasks = [tasks]; + } + + if (tasks === undefined) { + tasks = this.tasks; + tasksDependencies = this.getDependencies(); + } else { + tasksDependencies = []; + angular.forEach(tasks, function(task) { + var taskDependencies = self.getTaskDependencies(task); + angular.forEach(taskDependencies, function(taskDependency) { + if (!(taskDependency in tasksDependencies)) { + tasksDependencies.push(taskDependency); + } + }); + }); + } + + for (i = 0; i < tasksDependencies.length; i++) { + self.removeDependency(tasksDependencies[i]); + } + + angular.forEach(tasks, function(task) { + self.addDependenciesFromTask(task); + }); + } finally { + self.plumb.setSuspendDrawing(false, true); + } + }; + + this.api.registerMethod('dependencies', 'refresh', this.refresh, this); + }; + return DependenciesManager; + }]); +}()); + +(function() { + 'use strict'; + + angular.module('gantt.dependencies').factory('GanttDependency', ['ganttUtils', 'ganttDom', function(utils, dom) { + /** + * Constructor of Dependency object. + * + * @param manager Dependency manager used by this dependency + * @param task Task declaring the dependency + * @param model model of the dependency + * + * @constructor + * + * @see https://jsplumbtoolkit.com/community/apidocs/classes/jsPlumb.html#method_connect + */ + var Dependency = function(manager, task, model) { + var self = this; + + this.manager = manager; + this.task = task; + this.model = model; + this.connection = undefined; + this.fallbackEndpoints = []; + + /** + * Check if this dependency is connected. + * + * @returns {boolean} + */ + this.isConnected = function() { + if (this.connection) { + return true; + } + return false; + }; + + /** + * Disconnect this dependency. + */ + this.disconnect = function() { + if (this.connection) { + if (this.connection.endpoints) { + this.manager.plumb.detach(this.connection); + } + this.connection.$dependency = undefined; + this.connection = undefined; + } + + this.deleteFallbackEndpoints(); + }; + + this.deleteFallbackEndpoints = function() { + if (this.fallbackEndpoints) { + for (var i=0; i<this.fallbackEndpoints.length; i++) { + self.manager.plumb.deleteEndpoint(this.fallbackEndpoints[i]); + } + this.fallbackEndpoints = []; + } + }; + + this.getFromTaskId = function() { + if (this.model.from !== undefined) { + return this.model.from; + } + return this.task.model.id; + }; + + this.getToTaskId = function() { + if (this.model.to !== undefined) { + return this.model.to; + } + return this.task.model.id; + }; + + this.getFromTask = function() { + if (this.model.from !== undefined) { + return this.manager.getTask(this.model.from); + } + return this.task; + }; + + this.getToTask = function() { + if (this.model.to !== undefined) { + return this.manager.getTask(this.model.to); + } + return this.task; + }; + + this.removeFromTaskModel = function() { + var modelIndex = utils.angularIndexOf(this.task.model.dependencies, this.model); + if (modelIndex >= 0) { + this.task.model.dependencies.splice(modelIndex, 1); + } + return modelIndex; + }; + + var isTaskVisible = function(task) { + if (task === undefined || task.$element === undefined) { + return false; + } + var element = task.$element[0]; + return dom.isElementVisible(element); + }; + + /** + * Connect this dependency if both elements are available. + * + * @returns {boolean} + */ + this.connect = function() { + var fromTask = this.getFromTask(); + var toTask = this.getToTask(); + + if (!isTaskVisible(fromTask)) { + fromTask = undefined; + } + + if (!isTaskVisible(toTask)) { + toTask = undefined; + } + + if (fromTask && toTask) { + var connection = this.manager.connect(fromTask, toTask, this.model); + if (connection) { + connection.$dependency = this; + this.connection = connection; + return true; + } + } + + this.deleteFallbackEndpoints(); + if (fromTask !== undefined) { + var toFallbackEndpoint = this.manager.pluginScope.fallbackEndpoints[1]; + this.fallbackEndpoints.push(this.manager.plumb.addEndpoint(fromTask.$element, toFallbackEndpoint)); + } + if (toTask !== undefined) { + var fromFallbackEndpoint = this.manager.pluginScope.fallbackEndpoints[0]; + this.fallbackEndpoints.push(this.manager.plumb.addEndpoint(toTask.$element, fromFallbackEndpoint)); + } + return false; + }; + }; + return Dependency; + }]); +}()); + +(function() { + 'use strict'; + + angular.module('gantt.dependencies').factory('GanttDependencyTaskMouseHandler', ['$timeout', function($timeout) { + var TaskMouseHandler = function(manager, task) { + var self = this; + + this.manager = manager; + this.task = task; + this.installed = false; + this.elementHandlers = []; + + this.display = true; + this.hideEndpointsPromise = undefined; + + /** + * Handler for a single DOM element. + * + * @param element + * @constructor + */ + var ElementHandler = function(element) { + this.element = element; + + this.mouseExitHandler = function() { + $timeout.cancel(self.hideEndpointsPromise); + self.hideEndpointsPromise = $timeout(self.hideEndpoints, 1000, false); + }; + + this.mouseEnterHandler = function() { + $timeout.cancel(self.hideEndpointsPromise); + self.displayEndpoints(); + }; + + this.install = function() { +//JS: quick 'fix' to make sure we have read-only dependencies. We don't want the webscheduler to add/remove dependencies yet. +// this.element.bind('mouseenter', this.mouseEnterHandler); +// this.element.bind('mouseleave', this.mouseExitHandler); + }; + + this.release = function() { +//JS: quick 'fix' to make sure we have read-only dependencies. We don't want the webscheduler to add/remove dependencies yet. +// this.element.unbind('mouseenter', this.mouseEnterHandler); +// this.element.unbind('mouseleave', this.mouseExitHandler); + $timeout.cancel(self.hideEndpointsPromise); + }; + + }; + + + + /** + * Install mouse handler for this task, and hide all endpoints. + */ + this.install = function() { + if (!self.installed) { + self.hideEndpoints(); + +//JS: quick 'fix' to make sure we have read-only dependencies. We don't want the webscheduler to add/remove dependencies yet. +// self.elementHandlers.push(new ElementHandler(self.task.getContentElement())); +// angular.forEach(self.task.dependencies.endpoints, function(endpoint) { +// self.elementHandlers.push(new ElementHandler(angular.element(endpoint.canvas))); +// }); +// +// angular.forEach(self.elementHandlers, function(elementHandler) { +// elementHandler.install(); +// }); + + self.installed = true; + } + }; + + /** + * Release mouse handler for this task, and display all endpoints. + */ + this.release = function() { + if (self.installed) { +//JS: quick 'fix' to make sure we have read-only dependencies. We don't want the webscheduler to add/remove dependencies yet. +// angular.forEach(self.elementHandlers, function(elementHandler) { +// elementHandler.release(); +// }); +// +// self.elementHandlers = []; +// +// self.displayEndpoints(); + self.installed = false; + } + }; + + /** + * Display all endpoints for this task. + */ + this.displayEndpoints = function() { + self.display = true; + angular.forEach(self.task.dependencies.endpoints, function(endpoint) { + endpoint.setVisible(true, true, true); + }); + }; + + /** + * Hide all endpoints for this task. + */ + this.hideEndpoints = function() { + angular.forEach(self.task.dependencies.endpoints, function(endpoint) { + endpoint.setVisible(false, true, true); + }); + self.display = false; + }; + }; + return TaskMouseHandler; + }]); +}()); + +(function(){ + 'use strict'; + angular.module('gantt.groups').controller('GanttGroupController', ['$scope', 'GanttTaskGroup', 'ganttUtils', function($scope, TaskGroup, utils) { + var updateTaskGroup = function() { + var rowGroups = $scope.row.model.groups; + + if (typeof(rowGroups) === 'boolean') { + rowGroups = {enabled: rowGroups}; + } + + var enabledValue = utils.firstProperty([rowGroups], 'enabled', $scope.pluginScope.enabled); + if (enabledValue) { + $scope.display = utils.firstProperty([rowGroups], 'display', $scope.pluginScope.display); + $scope.taskGroup = new TaskGroup($scope.row, $scope.pluginScope); + + $scope.row.setFromTo(); + $scope.row.setFromToByValues($scope.taskGroup.from, $scope.taskGroup.to); + } else { + $scope.taskGroup = undefined; + $scope.display = undefined; + } + }; + + $scope.gantt.api.tasks.on.viewChange($scope, function(task) { + if ($scope.taskGroup !== undefined) { + if ($scope.taskGroup.tasks.indexOf(task) > -1) { + updateTaskGroup(); + if(!$scope.$$phase && !$scope.$root.$$phase) { + $scope.$digest(); + } + } else { + var descendants = $scope.pluginScope.hierarchy.descendants($scope.row); + if (descendants.indexOf(task.row) > -1) { + updateTaskGroup(); + if(!$scope.$$phase && !$scope.$root.$$phase) { + $scope.$digest(); + } + } + } + } + }); + + var removeWatch = $scope.pluginScope.$watch('display', updateTaskGroup); + + $scope.$watchCollection('gantt.rowsManager.filteredRows', updateTaskGroup); + + $scope.gantt.api.columns.on.refresh($scope, updateTaskGroup); + + $scope.$on('$destroy', removeWatch); + }]); +}()); + + +(function(){ + 'use strict'; + angular.module('gantt.groups').directive('ganttTaskGroup', ['GanttDirectiveBuilder', function(Builder) { + var builder = new Builder('ganttTaskGroup', 'plugins/groups/taskGroup.tmpl.html'); + return builder.build(); + }]); +}()); + + +(function() { + 'use strict'; + + angular.module('gantt').factory('GanttTaskGroup', ['ganttUtils', 'GanttTask', function(utils, Task) { + var TaskGroup = function(row, pluginScope) { + var self = this; + + self.row = row; + self.pluginScope = pluginScope; + + self.descendants = self.pluginScope.hierarchy.descendants(self.row); + + self.tasks = []; + self.overviewTasks = []; + self.promotedTasks = []; + self.showGrouping = false; + + var groupRowGroups = self.row.model.groups; + if (typeof(groupRowGroups) === 'boolean') { + groupRowGroups = {enabled: groupRowGroups}; + } + + var getTaskDisplay = function(task) { + var taskGroups = task.model.groups; + if (typeof(taskGroups) === 'boolean') { + taskGroups = {enabled: taskGroups}; + } + + var rowGroups = task.row.model.groups; + if (typeof(rowGroups) === 'boolean') { + rowGroups = {enabled: rowGroups}; + } + + var enabledValue = utils.firstProperty([taskGroups, rowGroups, groupRowGroups], 'enabled', self.pluginScope.enabled); + + if (enabledValue) { + var display = utils.firstProperty([taskGroups, rowGroups, groupRowGroups], 'display', self.pluginScope.display); + return display; + } + }; + + for (var i = 0; i < self.descendants.length; i++) { + var tasks = self.descendants[i].tasks; + + for (var j = 0; j < tasks.length; j++) { + var task = tasks[j]; + + var taskDisplay = getTaskDisplay(task); + if (taskDisplay !== undefined) { + self.tasks.push(task); + var clone = new Task(self.row, task.model); + + if (taskDisplay === 'overview') { + self.overviewTasks.push(clone); + } else if (taskDisplay === 'promote') { + self.promotedTasks.push(clone); + } else { + self.showGrouping = true; + } + } + } + } + + self.from = undefined; + if (groupRowGroups) { + self.from = groupRowGroups.from; + } + if (self.from === undefined) { + for (i=0; i<self.tasks.length; i++) { + if (self.from === undefined || self.tasks[i].model.from < self.from) { + self.from = self.tasks[i].model.from; + } + } + } + + self.to = undefined; + if (groupRowGroups) { + self.to = groupRowGroups.to; + } + if (self.to === undefined) { + for (i=0; i<self.tasks.length; i++) { + if (self.to === undefined || self.tasks[i].model.to > self.to) { + self.to = self.tasks[i].model.to; + } + } + } + + if (self.showGrouping) { + self.left = row.rowsManager.gantt.getPositionByDate(self.from); + self.width = row.rowsManager.gantt.getPositionByDate(self.to) - self.left; + } + }; + return TaskGroup; + }]); +}()); + +(function(){ + 'use strict'; + angular.module('gantt').directive('ganttTaskOverview', ['GanttDirectiveBuilder', function(Builder) { + var builder = new Builder('ganttTaskOverview', 'plugins/groups/taskOverview.tmpl.html'); + builder.controller = function($scope, $element) { + $scope.task.$element = $element; + $scope.task.$scope = $scope; + $scope.task.updatePosAndSize(); + }; + return builder.build(); + }]); +}()); + +(function(){ + 'use strict'; + angular.module('gantt.labels').directive('ganttLabelsBody', ['GanttDirectiveBuilder', 'ganttLayout', function(Builder, layout) { + var builder = new Builder('ganttLabelsBody', 'plugins/labels/labelsBody.tmpl.html'); + builder.controller = function($scope) { + var hScrollBarHeight = layout.getScrollBarHeight(); + + $scope.getLabelsCss = function() { + var css = {}; + + if ($scope.maxHeight) { + var bodyScrollBarHeight = $scope.gantt.scroll.isHScrollbarVisible() ? hScrollBarHeight : 0; + css['max-height'] = $scope.maxHeight - bodyScrollBarHeight - $scope.gantt.header.getHeight() + 'px'; + } + + return css; + }; + }; + return builder.build(); + }]); +}()); @@ -1566,7 +2552,7 @@ Github: https://github.com/angular-gantt/angular-gantt.git return { initialize: function(options) { - options.enabled = options.enabled !== undefined ? !!options.enabled : true; + options.enabled = options.enabled !== undefined ? options.enabled : true; options.allowMoving = options.allowMoving !== undefined ? !!options.allowMoving : true; options.allowResizing = options.allowResizing !== undefined ? !!options.allowResizing : true; options.allowRowSwitching = options.allowRowSwitching !== undefined ? !!options.allowRowSwitching : true; @@ -1766,24 +2752,58 @@ Github: https://github.com/angular-gantt/angular-gantt.git var showTooltipPromise; var visible = false; var mouseEnterX; + var mouseMoveHandler; - $scope.getFromLabel = function() { - var taskTooltips = $scope.task.model.tooltips; - var rowTooltips = $scope.task.row.model.tooltips; + var getViewPortWidth = function() { + var d = $document[0]; + return d.documentElement.clientWidth || d.documentElement.getElementById('body')[0].clientWidth; + }; - if (typeof(taskTooltips) === 'boolean') { - taskTooltips = {enabled: taskTooltips}; + var updateTooltip = function(x) { + // Check if info is overlapping with view port + if (x + $element[0].offsetWidth > getViewPortWidth()) { + $element.css('left', (x + 20 - $element[0].offsetWidth) + 'px'); + $scope.isRightAligned = true; + } else { + $element.css('left', (x - 20) + 'px'); + $scope.isRightAligned = false; } + }; - if (typeof(rowTooltips) === 'boolean') { - rowTooltips = {enabled: rowTooltips}; - } + var showTooltip = function(x) { + visible = true; + mouseMoveHandler.bind(); - var dateFormat = utils.firstProperty([taskTooltips, rowTooltips], 'dateFormat', $scope.pluginScope.dateFormat); - return $scope.task.model.from.format(dateFormat); + $scope.displayed = true; + + $scope.$evalAsync(function() { + var restoreNgHide; + if ($element.hasClass('ng-hide')) { + $element.removeClass('ng-hide'); + restoreNgHide = true; + } + $scope.elementHeight = $element[0].offsetHeight; + if (restoreNgHide) { + $element.addClass('ng-hide'); + } + $scope.taskRect = parentElement[0].getBoundingClientRect(); + updateTooltip(x); + }); }; - $scope.getToLabel = function() { + var hideTooltip = function() { + visible = false; + mouseMoveHandler.unbind(); + $scope.$evalAsync(function() { + $scope.displayed = false; + }); + }; + + var displayTooltip = function(newValue, showDelayed) { + if (showTooltipPromise) { + $timeout.cancel(showTooltipPromise); + } + var taskTooltips = $scope.task.model.tooltips; var rowTooltips = $scope.task.row.model.tooltips; @@ -1795,11 +2815,23 @@ Github: https://github.com/angular-gantt/angular-gantt.git rowTooltips = {enabled: rowTooltips}; } - var dateFormat = utils.firstProperty([taskTooltips, rowTooltips], 'dateFormat', $scope.pluginScope.dateFormat); - return $scope.task.model.to.format(dateFormat); + var enabled = utils.firstProperty([taskTooltips, rowTooltips], 'enabled', $scope.pluginScope.enabled); + if (enabled && !visible && mouseEnterX !== undefined && newValue) { + if (showDelayed) { + showTooltipPromise = $timeout(function() { + showTooltip(mouseEnterX); + }, $scope.pluginScope.delay, false); + } else { + showTooltip(mouseEnterX); + } + } else if (!newValue) { + if (!$scope.task.active) { + hideTooltip(); + } + } }; - var mouseMoveHandler = smartEvent($scope, bodyElement, 'mousemove', debounce(function(e) { + mouseMoveHandler = smartEvent($scope, bodyElement, 'mousemove', debounce(function(e) { if (!visible) { mouseEnterX = e.clientX; displayTooltip(true, false); @@ -1819,6 +2851,37 @@ Github: https://github.com/angular-gantt/angular-gantt.git } }, 5, false)); + $scope.getFromLabel = function() { + var taskTooltips = $scope.task.model.tooltips; + var rowTooltips = $scope.task.row.model.tooltips; + + if (typeof(taskTooltips) === 'boolean') { + taskTooltips = {enabled: taskTooltips}; + } + + if (typeof(rowTooltips) === 'boolean') { + rowTooltips = {enabled: rowTooltips}; + } + + var dateFormat = utils.firstProperty([taskTooltips, rowTooltips], 'dateFormat', $scope.pluginScope.dateFormat); + return $scope.task.model.from.format(dateFormat); + }; + + $scope.getToLabel = function() { + var taskTooltips = $scope.task.model.tooltips; + var rowTooltips = $scope.task.row.model.tooltips; + + if (typeof(taskTooltips) === 'boolean') { + taskTooltips = {enabled: taskTooltips}; + } + + if (typeof(rowTooltips) === 'boolean') { + rowTooltips = {enabled: rowTooltips}; + } + + var dateFormat = utils.firstProperty([taskTooltips, rowTooltips], 'dateFormat', $scope.pluginScope.dateFormat); + return $scope.task.model.to.format(dateFormat); + }; $scope.task.getContentElement().bind('mousemove', function(evt) { mouseEnterX = evt.clientX; @@ -1859,83 +2922,6 @@ Github: https://github.com/angular-gantt/angular-gantt.git }); } - var displayTooltip = function(newValue, showDelayed) { - if (showTooltipPromise) { - $timeout.cancel(showTooltipPromise); - } - - var taskTooltips = $scope.task.model.tooltips; - var rowTooltips = $scope.task.row.model.tooltips; - - if (typeof(taskTooltips) === 'boolean') { - taskTooltips = {enabled: taskTooltips}; - } - - if (typeof(rowTooltips) === 'boolean') { - rowTooltips = {enabled: rowTooltips}; - } - - var enabled = utils.firstProperty([taskTooltips, rowTooltips], 'enabled', $scope.pluginScope.enabled); - if (enabled && !visible && mouseEnterX !== undefined && newValue) { - if (showDelayed) { - showTooltipPromise = $timeout(function() { - showTooltip(mouseEnterX); - }, 500, false); - } else { - showTooltip(mouseEnterX); - } - } else if (!newValue) { - if (!$scope.task.active) { - hideTooltip(); - } - } - }; - - var showTooltip = function(x) { - visible = true; - mouseMoveHandler.bind(); - - $scope.displayed = true; - - $scope.$evalAsync(function() { - var restoreNgHide; - if ($element.hasClass('ng-hide')) { - $element.removeClass('ng-hide'); - restoreNgHide = true; - } - $scope.elementHeight = $element[0].offsetHeight; - if (restoreNgHide) { - $element.addClass('ng-hide'); - } - $scope.taskRect = parentElement[0].getBoundingClientRect(); - updateTooltip(x); - }); - }; - - var getViewPortWidth = function() { - var d = $document[0]; - return d.documentElement.clientWidth || d.documentElement.getElementById('body')[0].clientWidth; - }; - - var updateTooltip = function(x) { - // Check if info is overlapping with view port - if (x + $element[0].offsetWidth > getViewPortWidth()) { - $element.css('left', (x + 20 - $element[0].offsetWidth) + 'px'); - $scope.isRightAligned = true; - } else { - $element.css('left', (x - 20) + 'px'); - $scope.isRightAligned = false; - } - }; - - var hideTooltip = function() { - visible = false; - mouseMoveHandler.unbind(); - $scope.$evalAsync(function() { - $scope.displayed = false; - }); - }; - if ($scope.task.isMoving) { // Display tooltip because task has been moved to a new row displayTooltip(true, false); @@ -1971,7 +2957,7 @@ Github: https://github.com/angular-gantt/angular-gantt.git }()); -(function(){ +(function() { 'use strict'; angular.module('gantt.tree').controller('GanttTreeController', ['$scope', '$filter', 'GanttHierarchy', function($scope, $filter, Hierarchy) { $scope.rootRows = []; @@ -1990,12 +2976,12 @@ Github: https://github.com/angular-gantt/angular-gantt.git hierarchy.refresh(sortedRows); var leaves = []; - angular.forEach(sortedRows, function(row) { - var children = hierarchy.children(row); - if (!children || children.length === 0) { - leaves.push(row); - } - }); + for (var i = 0; i < sortedRows.length; i++) { + var children = hierarchy.children(sortedRows[i]); + if (!children || children.length === 0) { + leaves.push(sortedRows[i]); + } + } var filteredLeaves = $filter('filter')(leaves, filterRow, filterRowComparator); @@ -2006,7 +2992,7 @@ Github: https://github.com/angular-gantt/angular-gantt.git var descendants = hierarchy.descendants(row); - for (var i=0; i < descendants.length; i++) { + for (var i = 0; i < descendants.length; i++) { if (filteredLeaves.indexOf(descendants[i]) > -1) { return true; } @@ -2046,35 +3032,34 @@ Github: https://github.com/angular-gantt/angular-gantt.git var hasParent = false; - angular.forEach(rows, function(row) { - var rowParent = $scope.parent(row); + for (var i=0; i<rows.length; i++) { + var rowParent = $scope.parent(rows[i]); if (rowParent === undefined) { - rootRows.push(row); + rootRows.push(rows[i]); } else { hasParent = true; } - }); + } var handleChildren = function(row) { sortedRows.push(row); var children = $scope.children(row); - if (children !== undefined && children.length > 0) { var sortedChildren = children.sort(function(a, b) { return rows.indexOf(a) - rows.indexOf(b); }); - angular.forEach(sortedChildren, function(child) { - handleChildren(child); - }); + for (var i=0;i<sortedChildren.length;i++) { + handleChildren(sortedChildren[i]); + } } }; - angular.forEach(rootRows, function(row) { - handleChildren(row); - }); + for (i=0; i<rootRows.length; i++) { + handleChildren(rootRows[i]); + } return sortedRows; }; @@ -2183,11 +3168,11 @@ Github: https://github.com/angular-gantt/angular-gantt.git $scope.nodeScopes = {}; }]).controller('GanttUiTreeController', ['$scope', function($scope) { var collapseAll = function() { - $scope.collapseAll(); + $scope.$broadcast('angular-ui-tree:collapse-all'); }; var expandAll = function() { - $scope.expandAll(); + $scope.$broadcast('angular-ui-tree:expand-all'); }; $scope.gantt.api.registerMethod('tree', 'collapseAll', collapseAll, $scope); @@ -2205,7 +3190,7 @@ Github: https://github.com/angular-gantt/angular-gantt.git var visibleRows = $scope.row.rowsManager.filteredRows; var filteredChildrenRows = []; - for (var i=0; i < newValue.length; i++) { + for (var i = 0; i < newValue.length; i++) { var childRow = newValue[i]; if (visibleRows.indexOf(childRow) > -1) { filteredChildrenRows.push(childRow); @@ -2218,7 +3203,7 @@ Github: https://github.com/angular-gantt/angular-gantt.git } }); - $scope.isCollapseDisabled = function(){ + $scope.isCollapseDisabled = function() { return !$scope.$parent.childrenRows || $scope.$parent.childrenRows.length === 0; }; @@ -2294,6 +3279,10 @@ angular.module('gantt.bounds.templates', []).run(['$templateCache', function($te ''); }]); +angular.module('gantt.dependencies.templates', []).run(['$templateCache', function($templateCache) { + +}]); + angular.module('gantt.drawtask.templates', []).run(['$templateCache', function($templateCache) { }]); @@ -2492,4 +3481,4 @@ angular.module('gantt.tree.templates', []).run(['$templateCache', function($temp ''); }]); -//# sourceMappingURL=angular-gantt-plugins.js.map \ No newline at end of file +//# sourceMappingURL=angular-gantt-plugins.js.map diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.js.map index ad5cc01d12599da5e33f0c6290ba948fb1459cd9..1cede45326d9a4fb9ed5fb940e6f90c7348d86f5 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/plugins/bounds.js","../src/plugins/drawtask.js","../src/plugins/groups.js","../src/plugins/labels.js","../src/plugins/movable.js","../src/plugins/overlap.js","../src/plugins/progress.js","../src/plugins/resizeSensor.js","../src/plugins/sortable.js","../src/plugins/table.js","../src/plugins/tooltips.js","../src/plugins/tree.js","../src/plugins/bounds/taskBounds.directive.js","../src/plugins/groups/group.controller.js","../src/plugins/groups/taskGroup.directive.js","../src/plugins/groups/taskGroup.factory.js","../src/plugins/groups/taskOverview.directive.js","../src/plugins/labels/labelsBody.directive.js","../src/plugins/labels/labelsHeader.directive.js","../src/plugins/labels/sideContentLabels.directive.js","../src/plugins/movable/movableOptions.factory.js","../src/plugins/progress/taskProgress.directive.js","../src/plugins/table/sideContentTable.directive.js","../src/plugins/table/tableColumn.controller.js","../src/plugins/table/tableColumnRow.controller.js","../src/plugins/tooltips/tooltip.directive.js","../src/plugins/tree/rowTreeLabel.directive.js","../src/plugins/tree/sideContentTree.directive.js","../src/plugins/tree/tree.controller.js","../src/plugins/tree/treeBody.directive.js","../src/plugins/tree/treeHeader.directive.js","../.tmp/generated/plugins/bounds/html2js.js","../.tmp/generated/plugins/drawtask/html2js.js","../.tmp/generated/plugins/groups/html2js.js","../.tmp/generated/plugins/labels/html2js.js","../.tmp/generated/plugins/movable/html2js.js","../.tmp/generated/plugins/overlap/html2js.js","../.tmp/generated/plugins/progress/html2js.js","../.tmp/generated/plugins/resizeSensor/html2js.js","../.tmp/generated/plugins/sortable/html2js.js","../.tmp/generated/plugins/table/html2js.js","../.tmp/generated/plugins/tooltips/html2js.js","../.tmp/generated/plugins/tree/html2js.js"],"names":[],"mappings":"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","file":"angular-gantt-plugins.js","sourcesContent":["(function(){\n 'use strict';\n angular.module('gantt.bounds', ['gantt', 'gantt.bounds.templates']).directive('ganttBounds', ['moment', '$compile', '$document', function(moment, $compile, $document) {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.bounds) === 'object') {\n for (var option in scope.options.bounds) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n api.directives.on.new(scope, function(directiveName, taskScope, taskElement) {\n if (directiveName === 'ganttTask') {\n var boundsScope = taskScope.$new();\n boundsScope.pluginScope = scope;\n\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'task.model.est && task.model.lct && pluginScope.enabled');\n var boundsElement = $document[0].createElement('gantt-task-bounds');\n if (attrs.templateUrl !== undefined) {\n angular.element(boundsElement).attr('data-template-url', attrs.templateUrl);\n }\n if (attrs.template !== undefined) {\n angular.element(boundsElement).attr('data-template', attrs.template);\n }\n angular.element(ifElement).append(boundsElement);\n taskElement.append($compile(ifElement)(boundsScope));\n }\n });\n\n api.tasks.on.clean(scope, function(model) {\n if (model.est !== undefined && !moment.isMoment(model.est)) {\n model.est = moment(model.est); //Earliest Start Time\n }\n if (model.lct !== undefined && !moment.isMoment(model.lct)) {\n model.lct = moment(model.lct); //Latest Completion Time\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.drawtask', ['gantt']).directive('ganttDrawTask', ['$document', 'ganttMouseOffset', 'moment', function(document, mouseOffset, moment) {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n moveThreshold: '=?',\n taskModelFactory: '=taskFactory'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.moveThreshold === undefined) {\n scope.moveThreshold = 0;\n }\n\n api.directives.on.new(scope, function(directiveName, directiveScope, element) {\n if (directiveName === 'ganttRow') {\n var addNewTask = function(x) {\n var startDate = api.core.getDateByPosition(x, true);\n var endDate = moment(startDate);\n\n var taskModel = scope.taskModelFactory();\n taskModel.from = startDate;\n taskModel.to = endDate;\n\n var task = directiveScope.row.addTask(taskModel);\n task.isResizing = true;\n task.updatePosAndSize();\n directiveScope.row.updateVisibleTasks();\n\n directiveScope.row.$scope.$digest();\n };\n\n var deferDrawing = function(startX) {\n var moveTrigger = function(evt) {\n var currentX = mouseOffset.getOffset(evt).x;\n\n if (Math.abs(startX - currentX) >= scope.moveThreshold) {\n element.off('mousemove', moveTrigger);\n addNewTask(startX);\n }\n };\n\n element.on('mousemove', moveTrigger);\n document.one('mouseup', function() {\n element.off('mousemove', moveTrigger);\n });\n };\n\n var drawHandler = function(evt) {\n var evtTarget = (evt.target ? evt.target : evt.srcElement);\n var enabled = angular.isFunction(scope.enabled) ? scope.enabled(evt): scope.enabled;\n if (enabled && evtTarget.className.indexOf('gantt-row') > -1) {\n var x = mouseOffset.getOffset(evt).x;\n\n if (scope.moveThreshold === 0) {\n addNewTask(x, x);\n } else {\n deferDrawing(x);\n }\n }\n };\n\n element.on('mousedown', drawHandler);\n directiveScope.drawTaskHandler = drawHandler;\n }\n });\n\n api.directives.on.destroy(scope, function(directiveName, directiveScope, element) {\n if (directiveName === 'ganttRow') {\n element.off('mousedown', directiveScope.drawTaskHandler);\n delete directiveScope.drawTaskHandler;\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.groups', ['gantt', 'gantt.groups.templates']).directive('ganttGroups', ['ganttUtils', 'GanttHierarchy', '$compile', '$document', function(utils, Hierarchy, $compile, $document) {\n // Provides the row sort functionality to any Gantt row\n // Uses the sortableState to share the current row\n\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n display: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.sortable) === 'object') {\n for (var option in scope.options.sortable) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.display === undefined) {\n scope.display = 'group';\n }\n\n scope.hierarchy = new Hierarchy();\n\n function refresh() {\n scope.hierarchy.refresh(ganttCtrl.gantt.rowsManager.filteredRows);\n }\n\n ganttCtrl.gantt.api.registerMethod('groups', 'refresh', refresh, this);\n ganttCtrl.gantt.$scope.$watchCollection('gantt.rowsManager.filteredRows', function() {\n refresh();\n });\n\n api.directives.on.new(scope, function(directiveName, rowScope, rowElement) {\n if (directiveName === 'ganttRow') {\n var taskGroupScope = rowScope.$new();\n taskGroupScope.pluginScope = scope;\n\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'pluginScope.enabled');\n\n var taskGroupElement = $document[0].createElement('gantt-task-group');\n if (attrs.templateUrl !== undefined) {\n angular.element(taskGroupElement).attr('data-template-url', attrs.templateUrl);\n }\n if (attrs.template !== undefined) {\n angular.element(taskGroupElement).attr('data-template', attrs.template);\n }\n\n angular.element(ifElement).append(taskGroupElement);\n\n rowElement.append($compile(ifElement)(taskGroupScope));\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.labels', ['gantt', 'gantt.labels.templates']).directive('ganttLabels', ['ganttUtils', '$compile', '$document', '$log', function(utils, $compile, $document, $log) {\n // Provides the row sort functionality to any Gantt row\n // Uses the sortableState to share the current row\n\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n header: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n $log.warn('Angular Gantt Labels plugin is deprecated. Please use Table plugin instead.');\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.sortable) === 'object') {\n for (var option in scope.options.sortable) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.header === undefined) {\n scope.header = 'Name';\n }\n\n api.directives.on.new(scope, function(directiveName, sideContentScope, sideContentElement) {\n if (directiveName === 'ganttSideContent') {\n var labelsScope = sideContentScope.$new();\n labelsScope.pluginScope = scope;\n\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'pluginScope.enabled');\n angular.element(ifElement).addClass('side-element');\n\n var labelsElement = $document[0].createElement('gantt-side-content-labels');\n angular.element(ifElement).append(labelsElement);\n\n sideContentElement.append($compile(ifElement)(labelsScope));\n }\n });\n\n function fitSideWidthToLabels() {\n var labels = ganttCtrl.gantt.side.$element[0].getElementsByClassName('gantt-row-label');\n var newSideWidth = 0;\n\n angular.forEach(labels, function (label) {\n var width = label.children[0].offsetWidth;\n newSideWidth = Math.max(newSideWidth, width);\n });\n\n if (newSideWidth >= 0) {\n api.side.setWidth(newSideWidth);\n }\n }\n\n api.registerMethod('labels', 'fitSideWidth', fitSideWidthToLabels, this);\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.movable', ['gantt']).directive('ganttMovable', ['ganttMouseButton', 'ganttMouseOffset', 'ganttSmartEvent', 'ganttMovableOptions', 'ganttUtils', 'ganttDom', '$window', '$document', '$timeout',\n function(mouseButton, mouseOffset, smartEvent, movableOptions, utils, dom, $window, $document, $timeout) {\n // Provides moving and resizing of tasks\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n allowMoving: '=?',\n allowResizing: '=?',\n allowRowSwitching: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.movable) === 'object') {\n for (var option in scope.options.movable) {\n scope[option] = scope.options[option];\n }\n }\n\n movableOptions.initialize(scope);\n\n api.registerEvent('tasks', 'move');\n api.registerEvent('tasks', 'moveBegin');\n api.registerEvent('tasks', 'moveEnd');\n api.registerEvent('tasks', 'resize');\n api.registerEvent('tasks', 'resizeBegin');\n api.registerEvent('tasks', 'resizeEnd');\n api.registerEvent('tasks', 'change');\n\n var _hasTouch = ('ontouchstart' in $window) || $window.DocumentTouch && $document[0] instanceof $window.DocumentTouch;\n var _pressEvents = 'touchstart mousedown';\n var _moveEvents = 'touchmove mousemove';\n var _releaseEvents = 'touchend mouseup';\n\n var taskWithSmallWidth = 15;\n var resizeAreaWidthBig = 5;\n var resizeAreaWidthSmall = 3;\n var scrollSpeed = 15;\n var scrollTriggerDistance = 5;\n var mouseStartOffsetX;\n var moveStartX;\n\n api.directives.on.new(scope, function(directiveName, taskScope, taskElement) {\n if (directiveName === 'ganttTask') {\n var windowElement = angular.element($window);\n var ganttBodyElement = taskScope.row.rowsManager.gantt.body.$element;\n var ganttScrollElement = taskScope.row.rowsManager.gantt.scroll.$element;\n\n var taskHasBeenChanged = false;\n var taskHasBeenMovedFromAnotherRow = false;\n var scrollInterval;\n\n var foregroundElement = taskScope.task.getForegroundElement();\n\n // IE<11 doesn't support `pointer-events: none`\n // So task content element must be added to support moving properly.\n var contentElement = taskScope.task.getContentElement();\n\n var onPressEvents = function(evt) {\n evt.preventDefault();\n if (_hasTouch) {\n evt = mouseOffset.getTouch(evt);\n }\n var taskMovable = taskScope.task.model.movable;\n var rowMovable = taskScope.task.row.model.movable;\n\n if (typeof(taskMovable) === 'boolean') {\n taskMovable = {enabled: taskMovable};\n }\n\n if (typeof(rowMovable) === 'boolean') {\n rowMovable = {enabled: rowMovable};\n }\n\n var enabledValue = utils.firstProperty([taskMovable, rowMovable], 'enabled', scope.enabled);\n var enabled = angular.isFunction(enabledValue) ? enabledValue(evt): enabledValue;\n if (enabled) {\n var taskOffsetX = mouseOffset.getOffsetForElement(foregroundElement[0], evt).x;\n var mode = getMoveMode(taskOffsetX);\n if (mode !== '' && mouseButton.getButton(evt) === 1) {\n var bodyOffsetX = mouseOffset.getOffsetForElement(ganttBodyElement[0], evt).x;\n enableMoveMode(mode, bodyOffsetX);\n }\n taskScope.$digest();\n }\n };\n foregroundElement.on(_pressEvents, onPressEvents);\n contentElement.on(_pressEvents, onPressEvents);\n\n var onMousemove = function (evt) {\n var taskMovable = taskScope.task.model.movable;\n var rowMovable = taskScope.task.row.model.movable;\n\n if (typeof(taskMovable) === 'boolean') {\n taskMovable = {enabled: taskMovable};\n }\n\n if (typeof(rowMovable) === 'boolean') {\n rowMovable = {enabled: rowMovable};\n }\n\n var enabledValue = utils.firstProperty([taskMovable, rowMovable], 'enabled', scope.enabled);\n var enabled = angular.isFunction(enabledValue) ? enabledValue(evt): enabledValue;\n if (enabled && !taskScope.task.isMoving) {\n var taskOffsetX = mouseOffset.getOffsetForElement(foregroundElement[0], evt).x;\n var mode = getMoveMode(taskOffsetX);\n if (mode !== '' && mode !== 'M') {\n foregroundElement.css('cursor', getCursor(mode));\n contentElement.css('cursor', getCursor(mode));\n } else {\n foregroundElement.css('cursor', '');\n contentElement.css('cursor', '');\n }\n }\n };\n foregroundElement.on('mousemove', onMousemove);\n contentElement.on('mousemove', onMousemove);\n\n var handleMove = function(evt) {\n if (taskScope.task.isMoving && !taskScope.destroyed) {\n clearScrollInterval();\n moveTask(evt);\n scrollScreen(evt);\n }\n };\n\n var moveTask = function(evt) {\n var oldTaskHasBeenChanged = taskHasBeenChanged;\n\n var mousePos = mouseOffset.getOffsetForElement(ganttBodyElement[0], evt);\n var x = mousePos.x;\n taskScope.task.mouseOffsetX = x;\n var taskOutOfRange = taskScope.task.row.rowsManager.gantt.options.value('taskOutOfRange');\n\n var taskMovable = taskScope.task.model.movable;\n var rowMovable = taskScope.task.row.model.movable;\n\n if (typeof(taskMovable) === 'boolean') {\n taskMovable = {enabled: taskMovable};\n }\n\n if (typeof(rowMovable) === 'boolean') {\n rowMovable = {enabled: rowMovable};\n }\n\n if (taskScope.task.moveMode === 'M') {\n var allowRowSwitching = utils.firstProperty([taskMovable, rowMovable], 'allowRowSwitching', scope.allowRowSwitching);\n if (allowRowSwitching) {\n var scrollRect = ganttScrollElement[0].getBoundingClientRect();\n var rowCenterLeft = scrollRect.left + scrollRect.width / 2;\n var ganttBody = angular.element($document[0].querySelectorAll('.gantt-body'));\n ganttBody.css('pointer-events', 'auto'); // pointer-events must be enabled for following to work.\n var targetRowElement = dom.findElementFromPoint(rowCenterLeft, evt.clientY, function(element) {\n return angular.element(element).hasClass('gantt-row');\n });\n ganttBody.css('pointer-events', '');\n\n var rows = ganttCtrl.gantt.rowsManager.rows;\n var targetRow;\n for (var i= 0, l=rows.length; i<l; i++) {\n if (targetRowElement === rows[i].$element[0]) {\n targetRow = rows[i];\n break;\n }\n }\n\n var sourceRow = taskScope.task.row;\n\n if (targetRow !== undefined && sourceRow !== targetRow) {\n targetRow.moveTaskToRow(taskScope.task, true);\n sourceRow.$scope.$digest();\n targetRow.$scope.$digest();\n taskHasBeenChanged = true;\n }\n }\n\n var allowMoving = utils.firstProperty([taskMovable, rowMovable], 'allowMoving', scope.allowMoving);\n if (allowMoving) {\n x = x - mouseStartOffsetX;\n\n if (taskOutOfRange !== 'truncate') {\n if (x < 0) {\n x = 0;\n } else if (x + taskScope.task.width >= taskScope.gantt.width) {\n x = taskScope.gantt.width - taskScope.task.width;\n }\n }\n\n taskScope.task.moveTo(x, true);\n taskScope.$digest();\n\n if (taskHasBeenChanged) {\n taskScope.row.rowsManager.gantt.api.tasks.raise.move(taskScope.task);\n }\n taskHasBeenChanged = true;\n }\n } else if (taskScope.task.moveMode === 'E') {\n if (x <= taskScope.task.left) {\n x = taskScope.task.left;\n taskScope.task.moveMode = 'W';\n setGlobalCursor(getCursor(taskScope.task.moveMode ));\n }\n\n if (taskOutOfRange !== 'truncate' && x >= taskScope.gantt.width) {\n x = taskScope.gantt.width;\n }\n\n taskScope.task.setTo(x, true);\n taskScope.$digest();\n\n if (taskHasBeenChanged) {\n taskScope.row.rowsManager.gantt.api.tasks.raise.resize(taskScope.task);\n }\n taskHasBeenChanged = true;\n } else {\n if (x > taskScope.task.left + taskScope.task.width) {\n x = taskScope.task.left + taskScope.task.width;\n taskScope.task.moveMode = 'E';\n setGlobalCursor(getCursor(taskScope.task.moveMode ));\n }\n\n if (taskOutOfRange !== 'truncate' && x < 0) {\n x = 0;\n }\n\n taskScope.task.setFrom(x, true);\n taskScope.$digest();\n\n if (taskHasBeenChanged) {\n taskScope.row.rowsManager.gantt.api.tasks.raise.resize(taskScope.task);\n }\n taskHasBeenChanged = true;\n }\n\n if (!oldTaskHasBeenChanged && taskHasBeenChanged && !taskHasBeenMovedFromAnotherRow) {\n var backgroundElement = taskScope.task.getBackgroundElement();\n if (taskScope.task.moveMode === 'M') {\n backgroundElement.addClass('gantt-task-moving');\n taskScope.row.rowsManager.gantt.api.tasks.raise.moveBegin(taskScope.task);\n } else {\n backgroundElement.addClass('gantt-task-resizing');\n taskScope.row.rowsManager.gantt.api.tasks.raise.resizeBegin(taskScope.task);\n }\n }\n };\n\n var scrollScreen = function(evt) {\n var mousePos = mouseOffset.getOffsetForElement(ganttBodyElement[0], evt);\n var leftScreenBorder = ganttScrollElement[0].scrollLeft;\n var screenWidth = ganttScrollElement[0].offsetWidth;\n var scrollWidth = ganttScrollElement[0].scrollWidth;\n var rightScreenBorder = leftScreenBorder + screenWidth;\n var keepOnScrolling = false;\n\n if (mousePos.x < moveStartX) {\n // Scroll to the left\n if (leftScreenBorder > 0 && mousePos.x <= leftScreenBorder + scrollTriggerDistance) {\n mousePos.x -= scrollSpeed;\n keepOnScrolling = true;\n taskScope.row.rowsManager.gantt.api.scroll.left(scrollSpeed);\n }\n } else {\n // Scroll to the right\n if (rightScreenBorder < scrollWidth && mousePos.x >= rightScreenBorder - scrollTriggerDistance) {\n mousePos.x += scrollSpeed;\n keepOnScrolling = true;\n taskScope.row.rowsManager.gantt.api.scroll.right(scrollSpeed);\n }\n }\n\n if (keepOnScrolling) {\n scrollInterval = $timeout(function() {\n handleMove(evt);\n }, 100, true);\n }\n };\n\n var clearScrollInterval = function() {\n if (scrollInterval !== undefined) {\n $timeout.cancel(scrollInterval);\n scrollInterval = undefined;\n }\n };\n\n var getMoveMode = function(x) {\n var distance = 0;\n\n\n var taskMovable = taskScope.task.model.movable;\n var rowMovable = taskScope.task.row.model.movable;\n\n if (typeof(taskMovable) === 'boolean') {\n taskMovable = {enabled: taskMovable};\n }\n\n if (typeof(rowMovable) === 'boolean') {\n rowMovable = {enabled: rowMovable};\n }\n\n var allowResizing = utils.firstProperty([taskMovable, rowMovable], 'allowResizing', scope.allowResizing);\n var allowRowSwitching = utils.firstProperty([taskMovable, rowMovable], 'allowRowSwitching', scope.allowRowSwitching);\n var allowMoving = utils.firstProperty([taskMovable, rowMovable], 'allowMoving', scope.allowMoving);\n\n // Define resize&move area. Make sure the move area does not get too small.\n if (allowResizing) {\n distance = foregroundElement[0].offsetWidth < taskWithSmallWidth ? resizeAreaWidthSmall : resizeAreaWidthBig;\n }\n\n if (allowResizing && x > foregroundElement[0].offsetWidth - distance) {\n return 'E';\n } else if (allowResizing && x < distance) {\n return 'W';\n } else if ((allowMoving || allowRowSwitching) && x >= distance && x <= foregroundElement[0].offsetWidth - distance) {\n return 'M';\n } else {\n return '';\n }\n };\n\n var getCursor = function(mode) {\n switch (mode) {\n case 'E':\n return 'e-resize';\n case 'W':\n return 'w-resize';\n case 'M':\n return 'move';\n }\n };\n\n var setGlobalCursor = function(cursor) {\n taskElement.css('cursor', cursor);\n angular.element($document[0].body).css({\n '-moz-user-select': cursor === '' ? '': '-moz-none',\n '-webkit-user-select': cursor === '' ? '': 'none',\n '-ms-user-select': cursor === '' ? '': 'none',\n 'user-select': cursor === '' ? '': 'none',\n 'cursor': cursor\n });\n };\n\n var enableMoveMode = function(mode, x) {\n // Clone taskModel\n if (taskScope.task.originalModel === undefined) {\n taskScope.task.originalRow = taskScope.task.row;\n taskScope.task.originalModel = taskScope.task.model;\n taskScope.task.model = angular.copy(taskScope.task.originalModel);\n }\n\n // Init mouse start variables\n if (!taskHasBeenMovedFromAnotherRow) {\n moveStartX = x;\n mouseStartOffsetX = x - taskScope.task.modelLeft;\n }\n\n // Init task move\n taskHasBeenChanged = false;\n taskScope.task.moveMode = mode;\n taskScope.task.isMoving = true;\n taskScope.task.active = true;\n\n // Add move event handler\n var taskMoveHandler = function(evt) {\n evt.stopImmediatePropagation();\n if (_hasTouch) {\n evt = mouseOffset.getTouch(evt);\n }\n\n handleMove(evt);\n };\n var moveSmartEvent = smartEvent(taskScope, windowElement, _moveEvents, taskMoveHandler);\n moveSmartEvent.bind();\n\n // Remove move event handler on mouse up / touch end\n smartEvent(taskScope, windowElement, _releaseEvents, function(evt) {\n if (_hasTouch) {\n evt = mouseOffset.getTouch(evt);\n }\n moveSmartEvent.unbind();\n disableMoveMode(evt);\n taskScope.$digest();\n }).bindOnce();\n\n setGlobalCursor(getCursor(mode));\n };\n\n var disableMoveMode = function() {\n var getBackgroundElement = taskScope.task.getBackgroundElement();\n getBackgroundElement.removeClass('gantt-task-moving');\n getBackgroundElement.removeClass('gantt-task-resizing');\n\n if (taskScope.task.originalModel !== undefined) {\n angular.extend(taskScope.task.originalModel, taskScope.task.model);\n taskScope.task.model = taskScope.task.originalModel;\n if (taskScope.task.row.model.id !== taskScope.task.originalRow.model.id) {\n var targetRow = taskScope.task.row;\n targetRow.removeTask(taskScope.task.model.id, false, true);\n taskScope.task.row = taskScope.task.originalRow;\n targetRow.moveTaskToRow(taskScope.task, false);\n }\n delete taskScope.task.originalModel;\n delete taskScope.task.originalRow;\n\n taskScope.$apply();\n }\n\n taskHasBeenMovedFromAnotherRow = false;\n taskScope.task.isMoving = false;\n taskScope.task.active = false;\n\n // Stop any active auto scroll\n clearScrollInterval();\n\n // Set mouse cursor back to default\n setGlobalCursor('');\n\n // Raise task changed event\n if (taskHasBeenChanged === true) {\n // Raise move end event\n if (taskScope.task.moveMode === 'M') {\n taskScope.row.rowsManager.gantt.api.tasks.raise.moveEnd(taskScope.task);\n } else {\n taskScope.row.rowsManager.gantt.api.tasks.raise.resizeEnd(taskScope.task);\n }\n\n taskHasBeenChanged = false;\n taskScope.task.row.sortTasks(); // Sort tasks so they have the right z-order\n taskScope.row.rowsManager.gantt.api.tasks.raise.change(taskScope.task);\n }\n\n taskScope.task.moveMode = undefined;\n };\n\n // Stop scroll cycle (if running) when scope is destroyed.\n // This is needed when the task is moved to a new row during scroll because\n // the old scope will continue to scroll otherwise\n taskScope.$on('$destroy', function() {\n taskScope.destroyed = true;\n clearScrollInterval();\n });\n\n if (taskScope.task.isResizing) {\n taskHasBeenMovedFromAnotherRow = true;\n enableMoveMode('E', taskScope.task.mouseOffsetX);\n delete taskScope.task.isResizing;\n } else if (taskScope.task.isMoving) {\n // In case the task has been moved to another row a new controller is is created by angular.\n // Enable the move mode again if this was the case.\n taskHasBeenMovedFromAnotherRow = true;\n enableMoveMode('M', taskScope.task.mouseOffsetX);\n }\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.overlap', ['gantt', 'gantt.overlap.templates']).directive('ganttOverlap', ['moment',function(moment) {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?'\n // Add other option attributes for this plugin\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.enabled){\n api.tasks.on.change(scope, function (task) {\n // on every task change check for overlaps\n scope.handleOverlaps(task);\n });\n }\n\n var overlapsTasks = {};\n\n scope.handleOverlaps = function (changedTask) {\n // Get all the tasks in the row.\n var allTasks = changedTask.row.tasks;\n\n var newOverlapsTasks = {};\n var removedOverlapsTasks = {};\n\n angular.forEach(allTasks, function(task) {\n removedOverlapsTasks[task.model.id] = task;\n });\n\n // set overlaps flag to each task that overlaps other task.\n angular.forEach(allTasks,function(currentTask){\n var currentStart,currentEnd;\n if (currentTask.model.from.isBefore(currentTask.model.to)){\n currentStart = currentTask.model.from;\n currentEnd = currentTask.model.to;\n } else {\n currentStart = currentTask.model.to;\n currentEnd = currentTask.model.from;\n }\n var currentRange = moment().range(currentStart, currentEnd);\n angular.forEach(allTasks,function(task){\n if (currentTask.model.id !== task.model.id){\n var start,end;\n if (task.model.from.isBefore(task.model.to)){\n start = task.model.from;\n end = task.model.to;\n } else {\n start = task.model.to;\n end = task.model.from;\n }\n var range = moment().range(start, end);\n if (range.overlaps(currentRange)){\n if (!overlapsTasks.hasOwnProperty(task.model.id)) {\n newOverlapsTasks[task.model.id] = task;\n }\n delete removedOverlapsTasks[task.model.id];\n if (!overlapsTasks.hasOwnProperty(currentTask.model.id)) {\n newOverlapsTasks[currentTask.model.id] = currentTask;\n }\n delete removedOverlapsTasks[currentTask.model.id];\n }\n }\n });\n });\n\n angular.forEach(removedOverlapsTasks, function(task) {\n if (task.$element){\n task.$element.removeClass('gantt-task-overlaps');\n }\n delete overlapsTasks[task.model.id];\n });\n\n angular.forEach(newOverlapsTasks, function(task) {\n if (task.$element){\n task.$element.addClass('gantt-task-overlaps');\n }\n overlapsTasks[task.model.id] = task;\n });\n\n overlapsTasks = newOverlapsTasks;\n };\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.progress', ['gantt', 'gantt.progress.templates']).directive('ganttProgress', ['moment', '$compile', '$document', function(moment, $compile, $document) {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.progress) === 'object') {\n for (var option in scope.options.progress) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n api.directives.on.new(scope, function(directiveName, taskScope, taskElement) {\n if (directiveName === 'ganttTaskBackground') {\n var progressScope = taskScope.$new();\n progressScope.pluginScope = scope;\n\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'task.model.progress !== undefined && pluginScope.enabled');\n\n var progressElement = $document[0].createElement('gantt-task-progress');\n if (attrs.templateUrl !== undefined) {\n angular.element(progressElement).attr('data-template-url', attrs.templateUrl);\n }\n if (attrs.template !== undefined) {\n angular.element(progressElement).attr('data-template', attrs.template);\n }\n angular.element(ifElement).append(progressElement);\n taskElement.append($compile(ifElement)(progressScope));\n }\n });\n\n api.tasks.on.clean(scope, function(model) {\n if (model.est !== undefined && !moment.isMoment(model.est)) {\n model.est = moment(model.est); //Earliest Start Time\n }\n\n if (model.lct !== undefined && !moment.isMoment(model.lct)) {\n model.lct = moment(model.lct); //Latest Completion Time\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n /* global ResizeSensor: false */\n /* global ElementQueries: false */\n 'use strict';\n angular.module('gantt.resizeSensor', ['gantt']).directive('ganttResizeSensor', [function() {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.progress) === 'object') {\n for (var option in scope.options.progress) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n function buildSensor() {\n var ganttElement = element.parent().parent().parent()[0].querySelectorAll('div.gantt')[0];\n return new ResizeSensor(ganttElement, function() {\n ganttCtrl.gantt.$scope.ganttElementWidth = ganttElement.clientWidth;\n ganttCtrl.gantt.$scope.$apply();\n });\n }\n\n var rendered = false;\n api.core.on.rendered(scope, function() {\n rendered = true;\n if (sensor !== undefined) {\n sensor.detach();\n }\n if (scope.enabled) {\n ElementQueries.update();\n sensor = buildSensor();\n }\n });\n\n var sensor;\n scope.$watch('enabled', function(newValue) {\n if (rendered) {\n if (newValue && sensor === undefined) {\n ElementQueries.update();\n sensor = buildSensor();\n } else if (!newValue && sensor !== undefined) {\n sensor.detach();\n sensor = undefined;\n }\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n\n var moduleName = 'gantt.sortable';\n var directiveName = 'ganttSortable';\n var pluginDependencies = [\n 'gantt',\n {module:'ang-drag-drop', url:'https://github.com/ganarajpr/angular-dragdrop.git#master'}\n ];\n\n var failedDependencies = [];\n var loadedDependencies = [];\n var failedDependency;\n\n for (var i = 0, l = pluginDependencies.length; i < l; i++) {\n var currentDependency = pluginDependencies[i];\n try {\n if (angular.isString(currentDependency)) {\n currentDependency = {module: currentDependency};\n pluginDependencies[i] = currentDependency;\n }\n angular.module(currentDependency.module);\n loadedDependencies.push(currentDependency.module);\n } catch (e) {\n currentDependency.exception = e;\n failedDependencies.push(currentDependency);\n }\n }\n\n if (failedDependencies.length > 0) {\n angular.module(moduleName, []).directive(directiveName, ['$log', function($log) {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?'\n },\n link: function() {\n $log.warn(moduleName + ' module can\\'t require some dependencies:');\n for (var i= 0,l =failedDependencies.length; i<l; i++) {\n failedDependency = failedDependencies[i];\n\n var errorMessage = failedDependency.module;\n if (failedDependency.url) {\n errorMessage += ' (' + failedDependency.url + ')';\n }\n if (failedDependency.exception && failedDependency.exception.message) {\n errorMessage += ': ' + failedDependency.exception.message;\n }\n\n $log.warn(errorMessage);\n }\n $log.warn(directiveName + ' plugin directive won\\'t be available');\n }\n };\n }]);\n } else {\n angular.module(moduleName, loadedDependencies).directive(directiveName, ['ganttUtils', '$compile', function(utils, $compile) {\n // Provides the row sort functionality to any Gantt row\n // Uses the sortableState to share the current row\n\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.sortable) === 'object') {\n for (var option in scope.options.sortable) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n api.directives.on.new(scope, function(directiveName, rowScope, rowElement) {\n if (directiveName === 'ganttRowLabel' && rowElement.attr('drag') === undefined) {\n rowScope.checkDraggable = function() {\n var rowSortable = rowScope.row.model.sortable;\n\n if (typeof(rowSortable) === 'boolean') {\n rowSortable = {enabled: rowSortable};\n }\n\n return utils.firstProperty([rowSortable], 'enabled', scope.enabled);\n };\n\n rowScope.onDropSuccess = function() {\n rowScope.$evalAsync();\n };\n\n rowScope.onDrop = function(evt, data) {\n var row = rowScope.row.rowsManager.rowsMap[data.id];\n if (row !== rowScope) {\n rowScope.row.rowsManager.moveRow(row, rowScope.row);\n rowScope.$evalAsync();\n }\n };\n\n rowElement.attr('ui-draggable', '{{checkDraggable()}}');\n rowElement.attr('drag-channel', '\\'sortable\\'');\n rowElement.attr('ui-on-drop', 'onDrop($event, $data)');\n rowElement.attr('on-drop-success', 'onDropSuccess()');\n\n rowElement.attr('drop-channel', '\\'sortable\\'');\n rowElement.attr('drag', 'row.model');\n\n $compile(rowElement)(rowScope);\n }\n });\n\n }\n };\n }]);\n }\n\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.table', ['gantt', 'gantt.table.templates']).directive('ganttTable', ['ganttUtils', '$compile', '$document', function(utils, $compile, $document) {\n // Provides the row sort functionality to any Gantt row\n // Uses the sortableState to share the current row\n\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n columns: '=?',\n headers: '=?',\n classes: '=?',\n contents: '=?',\n headerContents: '=?',\n formatters: '=?',\n headerFormatter: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.sortable) === 'object') {\n for (var option in scope.options.sortable) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.columns === undefined) {\n scope.columns = ['model.name'];\n }\n\n if (scope.headers === undefined) {\n scope.headers = {'model.name': 'Name'};\n }\n\n if (scope.contents === undefined) {\n scope.contents = {};\n }\n\n if (scope.headerContents === undefined) {\n scope.headerContents = {};\n }\n\n if (scope.classes === undefined) {\n scope.classes = {};\n }\n\n if (scope.formatters === undefined) {\n scope.formatters = {};\n }\n\n api.directives.on.new(scope, function(directiveName, sideContentScope, sideContentElement) {\n if (directiveName === 'ganttSideContent') {\n var tableScope = sideContentScope.$new();\n tableScope.pluginScope = scope;\n\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'pluginScope.enabled');\n angular.element(ifElement).addClass('side-element');\n\n var tableElement = $document[0].createElement('gantt-side-content-table');\n angular.element(ifElement).append(tableElement);\n\n sideContentElement.append($compile(ifElement)(tableScope));\n }\n });\n\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.tooltips', ['gantt', 'gantt.tooltips.templates']).directive('ganttTooltips', ['$compile', '$document', function($compile, $document) {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n dateFormat: '=?',\n content: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.tooltips) === 'object') {\n for (var option in scope.options.tooltips) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n if (scope.dateFormat === undefined) {\n scope.dateFormat = 'MMM DD, HH:mm';\n }\n if (scope.content === undefined) {\n scope.content = '{{task.model.name}}</br>'+\n '<small>'+\n '{{task.isMilestone() === true && getFromLabel() || getFromLabel() + \\' - \\' + getToLabel()}}'+\n '</small>';\n }\n\n scope.api = api;\n\n api.directives.on.new(scope, function(directiveName, taskScope, taskElement) {\n if (directiveName === 'ganttTask') {\n var tooltipScope = taskScope.$new();\n\n tooltipScope.pluginScope = scope;\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'pluginScope.enabled');\n\n var tooltipElement = $document[0].createElement('gantt-tooltip');\n if (attrs.templateUrl !== undefined) {\n angular.element(tooltipElement).attr('data-template-url', attrs.templateUrl);\n }\n if (attrs.template !== undefined) {\n angular.element(tooltipElement).attr('data-template', attrs.template);\n }\n\n angular.element(ifElement).append(tooltipElement);\n taskElement.append($compile(ifElement)(tooltipScope));\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.tree', ['gantt', 'gantt.tree.templates', 'ui.tree']).directive('ganttTree', ['ganttUtils', '$compile', '$document', function(utils, $compile, $document) {\n // Provides the row sort functionality to any Gantt row\n // Uses the sortableState to share the current row\n\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n header: '=?',\n content: '=?',\n headerContent: '=?',\n keepAncestorOnFilterRow: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.sortable) === 'object') {\n for (var option in scope.options.sortable) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.header === undefined) {\n scope.header = 'Name';\n }\n\n if (scope.headerContent === undefined) {\n scope.headerContent = '{{getHeader()}}';\n }\n\n if (scope.keepAncestorOnFilterRow === undefined) {\n scope.keepAncestorOnFilterRow = false;\n }\n\n api.directives.on.new(scope, function(directiveName, sideContentScope, sideContentElement) {\n if (directiveName === 'ganttSideContent') {\n var labelsScope = sideContentScope.$new();\n labelsScope.pluginScope = scope;\n\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'pluginScope.enabled');\n angular.element(ifElement).addClass('side-element');\n\n var labelsElement = $document[0].createElement('gantt-side-content-tree');\n angular.element(ifElement).append(labelsElement);\n\n sideContentElement.append($compile(ifElement)(labelsScope));\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.bounds').directive('ganttTaskBounds', ['$templateCache', 'moment', function($templateCache, moment) {\n // Displays a box representing the earliest allowable start time and latest completion time for a job\n\n return {\n restrict: 'E',\n templateUrl: function(tElement, tAttrs) {\n var templateUrl;\n if (tAttrs.templateUrl === undefined) {\n templateUrl = 'plugins/bounds/taskBounds.tmpl.html';\n } else {\n templateUrl = tAttrs.templateUrl;\n }\n if (tAttrs.template) {\n $templateCache.put(templateUrl, tAttrs.template);\n }\n return templateUrl;\n },\n replace: true,\n scope: true,\n controller: ['$scope', '$element', function($scope, $element) {\n $element.toggleClass('ng-hide', true);\n\n $scope.simplifyMoment = function(d) {\n return moment.isMoment(d) ? d.unix() : d;\n };\n\n $scope.$watchGroup(['simplifyMoment(task.model.est)', 'simplifyMoment(task.model.lct)', 'task.left', 'task.width'], function() {\n var left = $scope.task.rowsManager.gantt.getPositionByDate($scope.task.model.est);\n var right = $scope.task.rowsManager.gantt.getPositionByDate($scope.task.model.lct);\n\n $element.css('left', left - $scope.task.left + 'px');\n $element.css('width', right - left + 'px');\n\n $element.toggleClass('gantt-task-bounds-in', false);\n $element.toggleClass('gantt-task-bounds-out', false);\n if ($scope.task.model.est === undefined || $scope.task.model.lct === undefined) {\n $element.toggleClass('gantt-task-bounds-in', true);\n } else if ($scope.task.model.est > $scope.task.model.from) {\n $element.toggleClass('gantt-task-bounds-out', true);\n }\n else if ($scope.task.model.lct < $scope.task.model.to) {\n $element.toggleClass('gantt-task-bounds-out', true);\n } else {\n $element.toggleClass('gantt-task-bounds-in', true);\n }\n });\n\n $scope.task.$element.bind('mouseenter', function() {\n $element.toggleClass('ng-hide', false);\n });\n\n $scope.task.$element.bind('mouseleave', function() {\n $element.toggleClass('ng-hide', true);\n });\n\n $scope.task.rowsManager.gantt.api.directives.raise.new('ganttBounds', $scope, $element);\n $scope.$on('$destroy', function() {\n $scope.task.rowsManager.gantt.api.directives.raise.destroy('ganttBounds', $scope, $element);\n });\n }]\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.groups').controller('GanttGroupController', ['$scope', 'GanttTaskGroup', 'ganttUtils', function($scope, TaskGroup, utils) {\n var updateTaskGroup = function() {\n var rowGroups = $scope.row.model.groups;\n\n if (typeof(rowGroups) === 'boolean') {\n rowGroups = {enabled: rowGroups};\n }\n\n var enabledValue = utils.firstProperty([rowGroups], 'enabled', $scope.pluginScope.enabled);\n if (enabledValue) {\n $scope.display = utils.firstProperty([rowGroups], 'display', $scope.pluginScope.display);\n $scope.taskGroup = new TaskGroup($scope.row, $scope.pluginScope);\n\n $scope.row.setFromTo();\n $scope.row.setFromToByValues($scope.taskGroup.from, $scope.taskGroup.to);\n } else {\n $scope.taskGroup = undefined;\n $scope.display = undefined;\n }\n };\n\n $scope.gantt.api.tasks.on.change($scope, function(task) {\n if ($scope.taskGroup !== undefined) {\n if ($scope.taskGroup.tasks.indexOf(task) > -1) {\n $scope.$evalAsync(function() {\n updateTaskGroup();\n });\n } else {\n var descendants = $scope.pluginScope.hierarchy.descendants($scope.row);\n if (descendants.indexOf(task.row) > -1) {\n $scope.$evalAsync(function() {\n updateTaskGroup();\n });\n }\n }\n }\n });\n\n var removeWatch = $scope.pluginScope.$watch('display', updateTaskGroup);\n\n $scope.$watchCollection('gantt.rowsManager.filteredRows', updateTaskGroup);\n\n $scope.gantt.api.columns.on.refresh($scope, updateTaskGroup);\n\n $scope.$on('$destroy', removeWatch);\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.groups').directive('ganttTaskGroup', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTaskGroup', 'plugins/groups/taskGroup.tmpl.html');\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n\n angular.module('gantt').factory('GanttTaskGroup', ['ganttUtils', 'GanttTask', function(utils, Task) {\n var TaskGroup = function (row, pluginScope) {\n var self = this;\n\n self.row = row;\n self.pluginScope = pluginScope;\n\n self.descendants = self.pluginScope.hierarchy.descendants(self.row);\n\n self.tasks = [];\n self.overviewTasks = [];\n self.promotedTasks = [];\n self.showGrouping = false;\n\n var groupRowGroups = self.row.model.groups;\n if (typeof(groupRowGroups) === 'boolean') {\n groupRowGroups = {enabled: groupRowGroups};\n }\n\n var getTaskDisplay = function(task) {\n var taskGroups = task.model.groups;\n if (typeof(taskGroups) === 'boolean') {\n taskGroups = {enabled: taskGroups};\n }\n\n var rowGroups = task.row.model.groups;\n if (typeof(rowGroups) === 'boolean') {\n rowGroups = {enabled: rowGroups};\n }\n\n var enabledValue = utils.firstProperty([taskGroups, rowGroups, groupRowGroups], 'enabled', self.pluginScope.enabled);\n\n if (enabledValue) {\n var display = utils.firstProperty([taskGroups, rowGroups, groupRowGroups], 'display', self.pluginScope.display);\n return display;\n }\n };\n\n angular.forEach(self.descendants, function(descendant) {\n angular.forEach(descendant.tasks, function(task) {\n var taskDisplay = getTaskDisplay(task);\n if (taskDisplay !== undefined) {\n self.tasks.push(task);\n var clone = new Task(self.row, task.model);\n\n if (taskDisplay === 'overview') {\n self.overviewTasks.push(clone);\n } else if(taskDisplay === 'promote'){\n self.promotedTasks.push(clone);\n } else {\n self.showGrouping = true;\n }\n }\n });\n });\n\n self.from = undefined;\n angular.forEach(self.tasks, function (task) {\n if (self.from === undefined || task.model.from < self.from) {\n self.from = task.model.from;\n }\n });\n\n self.to = undefined;\n angular.forEach(self.tasks, function (task) {\n if (self.to === undefined || task.model.to > self.to) {\n self.to = task.model.to;\n }\n });\n\n if (self.showGrouping) {\n self.left = row.rowsManager.gantt.getPositionByDate(self.from);\n self.width = row.rowsManager.gantt.getPositionByDate(self.to) - self.left;\n }\n };\n return TaskGroup;\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttTaskOverview', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTaskOverview', 'plugins/groups/taskOverview.tmpl.html');\n builder.controller = function($scope, $element) {\n $scope.task.$element = $element;\n $scope.task.$scope = $scope;\n $scope.task.updatePosAndSize();\n };\n return builder.build();\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt.labels').directive('ganttLabelsBody', ['GanttDirectiveBuilder', 'ganttLayout', function(Builder, layout) {\n var builder = new Builder('ganttLabelsBody', 'plugins/labels/labelsBody.tmpl.html');\n builder.controller = function($scope) {\n var hScrollBarHeight = layout.getScrollBarHeight();\n\n $scope.getLabelsCss = function() {\n var css = {};\n\n if ($scope.maxHeight) {\n var bodyScrollBarHeight = $scope.gantt.scroll.isHScrollbarVisible() ? hScrollBarHeight : 0;\n css['max-height'] = $scope.maxHeight - bodyScrollBarHeight - $scope.gantt.header.getHeight() + 'px';\n }\n\n return css;\n };\n };\n return builder.build();\n }]);\n}());\n\n\n","(function(){\n 'use strict';\n angular.module('gantt.labels').directive('ganttLabelsHeader', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttLabelsHeader', 'plugins/labels/labelsHeader.tmpl.html');\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.labels').directive('ganttSideContentLabels', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttSideContentLabels', 'plugins/labels/sideContentLabels.tmpl.html');\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.movable').factory('ganttMovableOptions', [function() {\n return {\n initialize: function(options) {\n\n options.enabled = options.enabled !== undefined ? !!options.enabled : true;\n options.allowMoving = options.allowMoving !== undefined ? !!options.allowMoving : true;\n options.allowResizing = options.allowResizing !== undefined ? !!options.allowResizing : true;\n options.allowRowSwitching = options.allowRowSwitching !== undefined ? !!options.allowRowSwitching : true;\n\n return options;\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.progress').directive('ganttTaskProgress', ['$templateCache', function($templateCache) {\n return {\n restrict: 'E',\n requires: '^ganttTask',\n templateUrl: function(tElement, tAttrs) {\n var templateUrl;\n if (tAttrs.templateUrl === undefined) {\n templateUrl = 'plugins/progress/taskProgress.tmpl.html';\n } else {\n templateUrl = tAttrs.templateUrl;\n }\n if (tAttrs.template !== undefined) {\n $templateCache.put(templateUrl, tAttrs.template);\n }\n return templateUrl;\n },\n replace: true,\n scope: true,\n controller: ['$scope', '$element', function($scope, $element) {\n $scope.getClasses = function() {\n var classes = [];\n\n if (typeof($scope.task.model.progress) === 'object') {\n classes = $scope.task.model.progress.classes;\n }\n\n return classes;\n };\n\n $scope.getCss = function() {\n var css = {};\n\n var progress;\n if ($scope.task.model.progress !== undefined) {\n if (typeof($scope.task.model.progress) === 'object') {\n progress = $scope.task.model.progress;\n } else {\n progress = {percent: $scope.task.model.progress};\n }\n }\n\n if (progress) {\n if (progress.color) {\n css['background-color'] = progress.color;\n } else {\n css['background-color'] = '#6BC443';\n }\n\n css.width = progress.percent + '%';\n }\n\n return css;\n };\n\n $scope.task.rowsManager.gantt.api.directives.raise.new('ganttTaskProgress', $scope, $element);\n $scope.$on('$destroy', function() {\n $scope.task.rowsManager.gantt.api.directives.raise.destroy('ganttTaskProgress', $scope, $element);\n });\n }]\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.table').directive('ganttSideContentTable', ['GanttDirectiveBuilder', 'ganttLayout', function(Builder, layout) {\n var builder = new Builder('ganttSideContentTable', 'plugins/table/sideContentTable.tmpl.html');\n builder.controller = function($scope) {\n var hScrollBarHeight = layout.getScrollBarHeight();\n\n $scope.getMaxHeightCss = function() {\n var css = {};\n\n if ($scope.maxHeight) {\n var bodyScrollBarHeight = $scope.gantt.scroll.isHScrollbarVisible() ? hScrollBarHeight : 0;\n css['max-height'] = $scope.maxHeight - bodyScrollBarHeight - $scope.gantt.header.getHeight() + 'px';\n }\n\n return css;\n };\n };\n return builder.build();\n }]);\n}());\n\n","(function() {\n 'use strict';\n angular.module('gantt.table').controller('TableColumnController', ['$scope', function($scope) {\n $scope.getHeader = function() {\n var header = $scope.pluginScope.headers[$scope.column];\n if (header !== undefined) {\n return header;\n }\n if ($scope.pluginScope.headerFormatter !== undefined) {\n header = $scope.pluginScope.headerFormatter($scope.column);\n }\n if (header !== undefined) {\n return header;\n }\n return header;\n };\n\n $scope.getHeaderContent = function() {\n var headerContent = $scope.pluginScope.headerContents[$scope.column];\n if (headerContent === undefined) {\n return '{{getHeader()}}';\n }\n return headerContent;\n };\n\n $scope.getClass = function() {\n return $scope.pluginScope.classes[$scope.column];\n };\n }]);\n}());\n\n","(function() {\n 'use strict';\n angular.module('gantt.table').controller('TableColumnRowController', ['$scope', function($scope) {\n $scope.getValue = function() {\n var value = $scope.$eval($scope.column, $scope.row);\n\n var formatter = $scope.pluginScope.formatters[$scope.column];\n if (formatter !== undefined) {\n value = formatter(value, $scope.column, $scope.row);\n }\n\n return value;\n };\n\n $scope.getRowContent = function() {\n var content;\n if ($scope.row.model.columnContents) {\n content = $scope.row.model.columnContents[$scope.column];\n }\n if (content === undefined && $scope.column === 'model.name') {\n content = $scope.row.model.content;\n }\n if (content === undefined) {\n content = $scope.pluginScope.contents[$scope.column];\n }\n if (content === undefined && $scope.column === 'model.name') {\n content = $scope.row.rowsManager.gantt.options.value('rowContent');\n }\n if (content === undefined && $scope.pluginScope.content !== undefined) {\n content = $scope.pluginScope.content;\n }\n if (content === undefined) {\n return '{{getValue()}}';\n }\n return content;\n };\n }]);\n}());\n\n","(function() {\n 'use strict';\n angular.module('gantt.tooltips').directive('ganttTooltip', ['$log','$timeout', '$compile', '$document', '$templateCache', 'ganttDebounce', 'ganttSmartEvent', function($log, $timeout, $compile, $document, $templateCache, debounce, smartEvent) {\n // This tooltip displays more information about a task\n\n return {\n restrict: 'E',\n templateUrl: function(tElement, tAttrs) {\n var templateUrl;\n if (tAttrs.templateUrl === undefined) {\n templateUrl = 'plugins/tooltips/tooltip.tmpl.html';\n } else {\n templateUrl = tAttrs.templateUrl;\n }\n if (tAttrs.template !== undefined) {\n $templateCache.put(templateUrl, tAttrs.template);\n }\n return templateUrl;\n },\n scope: true,\n replace: true,\n controller: ['$scope', '$element', 'ganttUtils', function($scope, $element, utils) {\n var bodyElement = angular.element($document[0].body);\n var parentElement = $scope.task.$element;\n var showTooltipPromise;\n var visible = false;\n var mouseEnterX;\n\n $scope.getFromLabel = function() {\n var taskTooltips = $scope.task.model.tooltips;\n var rowTooltips = $scope.task.row.model.tooltips;\n\n if (typeof(taskTooltips) === 'boolean') {\n taskTooltips = {enabled: taskTooltips};\n }\n\n if (typeof(rowTooltips) === 'boolean') {\n rowTooltips = {enabled: rowTooltips};\n }\n\n var dateFormat = utils.firstProperty([taskTooltips, rowTooltips], 'dateFormat', $scope.pluginScope.dateFormat);\n return $scope.task.model.from.format(dateFormat);\n };\n\n $scope.getToLabel = function() {\n var taskTooltips = $scope.task.model.tooltips;\n var rowTooltips = $scope.task.row.model.tooltips;\n\n if (typeof(taskTooltips) === 'boolean') {\n taskTooltips = {enabled: taskTooltips};\n }\n\n if (typeof(rowTooltips) === 'boolean') {\n rowTooltips = {enabled: rowTooltips};\n }\n\n var dateFormat = utils.firstProperty([taskTooltips, rowTooltips], 'dateFormat', $scope.pluginScope.dateFormat);\n return $scope.task.model.to.format(dateFormat);\n };\n\n var mouseMoveHandler = smartEvent($scope, bodyElement, 'mousemove', debounce(function(e) {\n if (!visible) {\n mouseEnterX = e.clientX;\n displayTooltip(true, false);\n } else {\n // check if mouse goes outside the parent\n if(\n !$scope.taskRect ||\n e.clientX < $scope.taskRect.left ||\n e.clientX > $scope.taskRect.right ||\n e.clientY > $scope.taskRect.bottom ||\n e.clientY < $scope.taskRect.top\n ) {\n displayTooltip(false, false);\n }\n\n updateTooltip(e.clientX);\n }\n }, 5, false));\n\n\n $scope.task.getContentElement().bind('mousemove', function(evt) {\n mouseEnterX = evt.clientX;\n });\n\n $scope.task.getContentElement().bind('mouseenter', function(evt) {\n mouseEnterX = evt.clientX;\n displayTooltip(true, true);\n });\n\n $scope.task.getContentElement().bind('mouseleave', function() {\n displayTooltip(false);\n });\n\n if ($scope.pluginScope.api.tasks.on.moveBegin) {\n $scope.pluginScope.api.tasks.on.moveBegin($scope, function(task) {\n if (task === $scope.task) {\n displayTooltip(true);\n }\n });\n\n $scope.pluginScope.api.tasks.on.moveEnd($scope, function(task) {\n if (task === $scope.task) {\n displayTooltip(false);\n }\n });\n\n $scope.pluginScope.api.tasks.on.resizeBegin($scope, function(task) {\n if (task === $scope.task) {\n displayTooltip(true);\n }\n });\n\n $scope.pluginScope.api.tasks.on.resizeEnd($scope, function(task) {\n if (task === $scope.task) {\n displayTooltip(false);\n }\n });\n }\n\n var displayTooltip = function(newValue, showDelayed) {\n if (showTooltipPromise) {\n $timeout.cancel(showTooltipPromise);\n }\n\n var taskTooltips = $scope.task.model.tooltips;\n var rowTooltips = $scope.task.row.model.tooltips;\n\n if (typeof(taskTooltips) === 'boolean') {\n taskTooltips = {enabled: taskTooltips};\n }\n\n if (typeof(rowTooltips) === 'boolean') {\n rowTooltips = {enabled: rowTooltips};\n }\n\n var enabled = utils.firstProperty([taskTooltips, rowTooltips], 'enabled', $scope.pluginScope.enabled);\n if (enabled && !visible && mouseEnterX !== undefined && newValue) {\n if (showDelayed) {\n showTooltipPromise = $timeout(function() {\n showTooltip(mouseEnterX);\n }, 500, false);\n } else {\n showTooltip(mouseEnterX);\n }\n } else if (!newValue) {\n if (!$scope.task.active) {\n hideTooltip();\n }\n }\n };\n\n var showTooltip = function(x) {\n visible = true;\n mouseMoveHandler.bind();\n\n $scope.displayed = true;\n\n $scope.$evalAsync(function() {\n var restoreNgHide;\n if ($element.hasClass('ng-hide')) {\n $element.removeClass('ng-hide');\n restoreNgHide = true;\n }\n $scope.elementHeight = $element[0].offsetHeight;\n if (restoreNgHide) {\n $element.addClass('ng-hide');\n }\n $scope.taskRect = parentElement[0].getBoundingClientRect();\n updateTooltip(x);\n });\n };\n\n var getViewPortWidth = function() {\n var d = $document[0];\n return d.documentElement.clientWidth || d.documentElement.getElementById('body')[0].clientWidth;\n };\n\n var updateTooltip = function(x) {\n // Check if info is overlapping with view port\n if (x + $element[0].offsetWidth > getViewPortWidth()) {\n $element.css('left', (x + 20 - $element[0].offsetWidth) + 'px');\n $scope.isRightAligned = true;\n } else {\n $element.css('left', (x - 20) + 'px');\n $scope.isRightAligned = false;\n }\n };\n\n var hideTooltip = function() {\n visible = false;\n mouseMoveHandler.unbind();\n $scope.$evalAsync(function() {\n $scope.displayed = false;\n });\n };\n\n if ($scope.task.isMoving) {\n // Display tooltip because task has been moved to a new row\n displayTooltip(true, false);\n }\n\n $scope.gantt.api.directives.raise.new('ganttTooltip', $scope, $element);\n $scope.$on('$destroy', function() {\n $scope.gantt.api.directives.raise.destroy('ganttTooltip', $scope, $element);\n });\n }]\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.tree').directive('ganttRowTreeLabel', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttRowTreeLabel');\n builder.restrict = 'A';\n builder.templateUrl = undefined;\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.tree').directive('ganttSideContentTree', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttSideContentTree', 'plugins/tree/sideContentTree.tmpl.html');\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.tree').controller('GanttTreeController', ['$scope', '$filter', 'GanttHierarchy', function($scope, $filter, Hierarchy) {\n $scope.rootRows = [];\n\n $scope.getHeader = function() {\n return $scope.pluginScope.header;\n };\n\n var hierarchy = new Hierarchy();\n\n $scope.pluginScope.$watchGroup(['keepAncestorOnFilterRow', 'enabled'], function(value) {\n var keepAncestor = value[0] && value[1];\n\n if (keepAncestor) {\n var filterImpl = function(sortedRows, filterRow, filterRowComparator) {\n hierarchy.refresh(sortedRows);\n\n var leaves = [];\n angular.forEach(sortedRows, function(row) {\n var children = hierarchy.children(row);\n if (!children || children.length === 0) {\n leaves.push(row);\n }\n });\n\n var filteredLeaves = $filter('filter')(leaves, filterRow, filterRowComparator);\n\n var filterRowKeepAncestor = function(row) {\n if (filteredLeaves.indexOf(row) > -1) {\n return true;\n }\n\n var descendants = hierarchy.descendants(row);\n\n for (var i=0; i < descendants.length; i++) {\n if (filteredLeaves.indexOf(descendants[i]) > -1) {\n return true;\n }\n }\n\n return false;\n };\n\n return $filter('filter')(sortedRows, filterRowKeepAncestor, filterRowComparator);\n };\n $scope.gantt.rowsManager.setFilterImpl(filterImpl);\n } else {\n $scope.gantt.rowsManager.setFilterImpl(false);\n }\n });\n\n var isVisible = function(row) {\n var parentRow = $scope.parent(row);\n while (parentRow !== undefined) {\n if (parentRow !== undefined && parentRow._collapsed) {\n return false;\n }\n parentRow = $scope.parent(parentRow);\n }\n return true;\n };\n\n var filterRowsFunction = function(rows) {\n return rows.filter(function(row) {\n return isVisible(row);\n });\n };\n\n var sortRowsFunction = function(rows) {\n var sortedRows = [];\n var rootRows = [];\n\n var hasParent = false;\n\n angular.forEach(rows, function(row) {\n var rowParent = $scope.parent(row);\n if (rowParent === undefined) {\n rootRows.push(row);\n } else {\n hasParent = true;\n }\n });\n\n var handleChildren = function(row) {\n sortedRows.push(row);\n var children = $scope.children(row);\n\n\n\n if (children !== undefined && children.length > 0) {\n var sortedChildren = children.sort(function(a, b) {\n return rows.indexOf(a) - rows.indexOf(b);\n });\n\n angular.forEach(sortedChildren, function(child) {\n handleChildren(child);\n });\n }\n };\n\n angular.forEach(rootRows, function(row) {\n handleChildren(row);\n });\n\n return sortedRows;\n };\n $scope.gantt.api.rows.addRowSorter(sortRowsFunction);\n $scope.gantt.api.rows.addRowFilter(filterRowsFunction);\n\n $scope.$on('$destroy', function() {\n $scope.gantt.api.rows.removeRowSorter(sortRowsFunction);\n $scope.gantt.api.rows.removeRowFilter(filterRowsFunction);\n });\n\n var refresh = function() {\n $scope.rootRows = hierarchy.refresh($scope.gantt.rowsManager.filteredRows);\n\n if ($scope.gantt.rowsManager.filteredRows.length > 0) {\n $scope.gantt.api.rows.sort();\n $scope.gantt.api.rows.refresh();\n }\n };\n\n $scope.gantt.api.rows.on.remove($scope, refresh);\n $scope.gantt.api.rows.on.add($scope, refresh);\n\n var isRowCollapsed = function(rowId) {\n var row;\n if (typeof rowId === 'string') {\n row = $scope.gantt.rowsManager.rowsMap[rowId];\n } else {\n row = rowId;\n }\n if (row === undefined) {\n return undefined;\n }\n if (row._collapsed === undefined) {\n return false;\n }\n return row._collapsed;\n };\n\n var expandRow = function(rowId) {\n var row;\n if (typeof rowId === 'string') {\n row = $scope.gantt.rowsManager.rowsMap[rowId];\n } else {\n row = rowId;\n }\n if (row === undefined) {\n return;\n }\n\n var rowScope = $scope.nodeScopes[row.model.id];\n if (rowScope.collapsed) {\n rowScope.toggle();\n }\n };\n\n var collapseRow = function(rowId) {\n var row;\n if (typeof rowId === 'string') {\n row = $scope.gantt.rowsManager.rowsMap[rowId];\n } else {\n row = rowId;\n }\n if (row === undefined) {\n return;\n }\n\n var rowScope = $scope.nodeScopes[row.model.id];\n if (!rowScope.collapsed) {\n rowScope.toggle();\n }\n };\n\n var getHierarchy = function() {\n return hierarchy;\n };\n\n $scope.getHeaderContent = function() {\n return $scope.pluginScope.headerContent;\n };\n\n $scope.gantt.api.registerMethod('tree', 'refresh', refresh, this);\n $scope.gantt.api.registerMethod('tree', 'isCollapsed', isRowCollapsed, this);\n $scope.gantt.api.registerMethod('tree', 'expand', expandRow, this);\n $scope.gantt.api.registerMethod('tree', 'collapse', collapseRow, this);\n\n $scope.gantt.api.registerEvent('tree', 'collapsed');\n\n $scope.gantt.api.registerMethod('tree', 'getHierarchy', getHierarchy, this);\n\n $scope.$watchCollection('gantt.rowsManager.filteredRows', function() {\n refresh();\n });\n\n $scope.children = function(row) {\n if (row === undefined) {\n return $scope.rootRows;\n }\n return hierarchy.children(row);\n };\n\n $scope.parent = function(row) {\n return hierarchy.parent(row);\n };\n\n $scope.nodeScopes = {};\n }]).controller('GanttUiTreeController', ['$scope', function($scope) {\n var collapseAll = function() {\n $scope.collapseAll();\n };\n\n var expandAll = function() {\n $scope.expandAll();\n };\n\n $scope.gantt.api.registerMethod('tree', 'collapseAll', collapseAll, $scope);\n $scope.gantt.api.registerMethod('tree', 'expandAll', expandAll, $scope);\n }]).controller('GanttTreeNodeController', ['$scope', function($scope) {\n $scope.$parent.nodeScopes[$scope.row.model.id] = $scope;\n $scope.$on('$destroy', function() {\n delete $scope.$parent.nodeScopes[$scope.row.model.id];\n });\n\n $scope.$watch('children(row)', function(newValue) {\n if (newValue) {\n // Children rows may have been filtered out\n // So we need to filter the raw hierarchy before displaying children in tree.\n var visibleRows = $scope.row.rowsManager.filteredRows;\n\n var filteredChildrenRows = [];\n for (var i=0; i < newValue.length; i++) {\n var childRow = newValue[i];\n if (visibleRows.indexOf(childRow) > -1) {\n filteredChildrenRows.push(childRow);\n }\n }\n\n $scope.$parent.childrenRows = filteredChildrenRows;\n } else {\n $scope.$parent.childrenRows = newValue;\n }\n });\n\n $scope.isCollapseDisabled = function(){\n return !$scope.$parent.childrenRows || $scope.$parent.childrenRows.length === 0;\n };\n\n $scope.getValue = function() {\n return $scope.row.model.name;\n };\n\n $scope.getRowContent = function() {\n if ($scope.row.model.content !== undefined) {\n return $scope.row.model.content;\n }\n if ($scope.pluginScope.content !== undefined) {\n return $scope.pluginScope.content;\n }\n\n var content = $scope.row.rowsManager.gantt.options.value('rowContent');\n if (content === undefined) {\n content = '{{row.model.name}}';\n }\n return content;\n };\n\n $scope.$watch('collapsed', function(newValue) {\n if ($scope.$modelValue._collapsed !== newValue) {\n var oldValue = $scope.$modelValue._collapsed;\n $scope.$modelValue._collapsed = newValue; // $modelValue contains the Row object\n if (oldValue !== undefined && newValue !== oldValue) {\n $scope.gantt.api.tree.raise.collapsed($scope, $scope.$modelValue, newValue);\n $scope.gantt.api.rows.refresh();\n }\n }\n });\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.tree').directive('ganttTreeBody', ['GanttDirectiveBuilder', 'ganttLayout', function(Builder, layout) {\n var builder = new Builder('ganttTreeBody', 'plugins/tree/treeBody.tmpl.html');\n builder.controller = function($scope) {\n var hScrollBarHeight = layout.getScrollBarHeight();\n\n $scope.getLabelsCss = function() {\n var css = {};\n\n if ($scope.maxHeight) {\n var bodyScrollBarHeight = $scope.gantt.scroll.isHScrollbarVisible() ? hScrollBarHeight : 0;\n css['max-height'] = $scope.maxHeight - bodyScrollBarHeight - $scope.gantt.header.getHeight() + 'px';\n }\n\n return css;\n };\n };\n return builder.build();\n }]);\n}());\n\n\n","(function(){\n 'use strict';\n angular.module('gantt.tree').directive('ganttTreeHeader', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTreeHeader', 'plugins/tree/treeHeader.tmpl.html');\n return builder.build();\n }]);\n}());\n\n","angular.module('gantt.bounds.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/bounds/taskBounds.tmpl.html',\n '<div ng-cloak class=\"gantt-task-bounds\" ng-style=\"getCss()\" ng-class=\"getClass()\"></div>\\n' +\n '');\n}]);\n","angular.module('gantt.drawtask.templates', []).run(['$templateCache', function($templateCache) {\n\n}]);\n","angular.module('gantt.groups.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/groups/taskGroup.tmpl.html',\n '<div ng-controller=\"GanttGroupController\">\\n' +\n ' <div class=\"gantt-task-group-overview\" ng-if=\"taskGroup.overviewTasks.length > 0\">\\n' +\n ' <gantt-task-overview ng-repeat=\"task in taskGroup.overviewTasks\"></gantt-task-overview>\\n' +\n ' </div>\\n' +\n ' <div class=\"gantt-task-group-promote\" ng-if=\"taskGroup.row._collapsed && taskGroup.promotedTasks.length > 0\">\\n' +\n ' <gantt-task ng-repeat=\"task in taskGroup.promotedTasks\"></gantt-task>\\n' +\n ' </div>\\n' +\n ' <div class=\"gantt-task-group\"\\n' +\n ' ng-if=\"taskGroup.showGrouping\"\\n' +\n ' ng-style=\"{\\'left\\': taskGroup.left + \\'px\\', \\'width\\': taskGroup.width + \\'px\\'}\">\\n' +\n ' <div class=\"gantt-task-group-left-main\"></div>\\n' +\n ' <div class=\"gantt-task-group-right-main\"></div>\\n' +\n ' <div class=\"gantt-task-group-left-symbol\"></div>\\n' +\n ' <div class=\"gantt-task-group-right-symbol\"></div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '\\n' +\n '');\n $templateCache.put('plugins/groups/taskOverview.tmpl.html',\n '<div class=\"gantt-task gantt-task-overview\" ng-class=\"task.model.classes\">\\n' +\n ' <gantt-task-background></gantt-task-background>\\n' +\n ' <gantt-task-content></gantt-task-content>\\n' +\n ' <gantt-task-foreground></gantt-task-foreground>\\n' +\n '</div>\\n' +\n '\\n' +\n '');\n}]);\n","angular.module('gantt.labels.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/labels/labelsBody.tmpl.html',\n '<div class=\"gantt-labels-body\" ng-style=\"getLabelsCss()\">\\n' +\n ' <div gantt-vertical-scroll-receiver>\\n' +\n ' <div ng-repeat=\"row in gantt.rowsManager.visibleRows track by row.model.id\">\\n' +\n ' <div gantt-row-label\\n' +\n ' class=\"gantt-row-label gantt-row-height\"\\n' +\n ' ng-class=\"row.model.classes\"\\n' +\n ' ng-style=\"{\\'height\\': row.model.height}\">\\n' +\n ' <span class=\"gantt-label-text\">{{row.model.name}}</span>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '');\n $templateCache.put('plugins/labels/labelsHeader.tmpl.html',\n '<div class=\"gantt-labels-header\">\\n' +\n ' <div ng-show=\"gantt.columnsManager.columns.length > 0 && gantt.columnsManager.headers.length > 0\">\\n' +\n ' <div ng-repeat=\"header in gantt.columnsManager.headers\">\\n' +\n ' <div class=\"gantt-row-height\" ng-class=\"{\\'gantt-labels-header-row\\': $last, \\'gantt-labels-header-row-last\\': $last}\"><span>{{$last ? pluginScope.header : \"\"}}</span></div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '');\n $templateCache.put('plugins/labels/sideContentLabels.tmpl.html',\n '<div class=\"gantt-side-content-labels\">\\n' +\n ' <gantt-labels-header>\\n' +\n ' </gantt-labels-header>\\n' +\n ' <gantt-labels-body>\\n' +\n ' </gantt-labels-body>\\n' +\n '</div>\\n' +\n '');\n}]);\n","angular.module('gantt.movable.templates', []).run(['$templateCache', function($templateCache) {\n\n}]);\n","angular.module('gantt.overlap.templates', []).run(['$templateCache', function($templateCache) {\n\n}]);\n","angular.module('gantt.progress.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/progress/taskProgress.tmpl.html',\n '<div ng-cloak class=\"gantt-task-progress\" ng-style=\"getCss()\" ng-class=\"getClasses()\"></div>\\n' +\n '');\n}]);\n","angular.module('gantt.resizeSensor.templates', []).run(['$templateCache', function($templateCache) {\n\n}]);\n","angular.module('gantt.sortable.templates', []).run(['$templateCache', function($templateCache) {\n\n}]);\n","angular.module('gantt.table.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/table/sideContentTable.tmpl.html',\n '<div class=\"gantt-side-content-table\">\\n' +\n '\\n' +\n ' <div class=\"gantt-table-column {{getClass()}}\" ng-repeat=\"column in pluginScope.columns\" ng-controller=\"TableColumnController\">\\n' +\n '\\n' +\n ' <div class=\"gantt-table-header\" ng-style=\"{height: ganttHeaderHeight + \\'px\\'}\">\\n' +\n ' <div ng-show=\"ganttHeaderHeight\" class=\"gantt-row-label-header gantt-row-label gantt-table-row gantt-table-header-row\">\\n' +\n ' <span class=\"gantt-label-text\" gantt-bind-compile-html=\"getHeaderContent()\"/>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n '\\n' +\n ' <div class=\"gantt-table-content\" ng-style=\"getMaxHeightCss()\">\\n' +\n ' <div gantt-vertical-scroll-receiver>\\n' +\n ' <div class=\"gantt-table-row\" ng-repeat=\"row in gantt.rowsManager.visibleRows track by row.model.id\" ng-controller=\"TableColumnRowController\">\\n' +\n ' <div gantt-row-label class=\"gantt-row-label gantt-row-height\" ng-class=\"row.model.classes\" ng-style=\"{\\'height\\': row.model.height}\">\\n' +\n ' <div class=\"gantt-valign-container\">\\n' +\n ' <div class=\"gantt-valign-content\">\\n' +\n ' <span class=\"gantt-label-text\" gantt-bind-compile-html=\"getRowContent()\"></span>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n '\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '');\n}]);\n","angular.module('gantt.tooltips.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/tooltips/tooltip.tmpl.html',\n '<div ng-cloak\\n' +\n ' class=\"gantt-task-info\"\\n' +\n ' ng-show=\"displayed\"\\n' +\n ' ng-class=\"isRightAligned ? \\'gantt-task-infoArrowR\\' : \\'gantt-task-infoArrow\\'\"\\n' +\n ' ng-style=\"{top: taskRect.top + \\'px\\', marginTop: -elementHeight - 8 + \\'px\\'}\">\\n' +\n ' <div class=\"gantt-task-info-content\">\\n' +\n ' <div gantt-bind-compile-html=\"pluginScope.content\"></div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '');\n}]);\n","angular.module('gantt.tree.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/tree/sideContentTree.tmpl.html',\n '<div class=\"gantt-side-content-tree\" ng-controller=\"GanttTreeController\">\\n' +\n ' <gantt-tree-header>\\n' +\n ' </gantt-tree-header>\\n' +\n ' <gantt-tree-body>\\n' +\n ' </gantt-tree-body>\\n' +\n '</div>\\n' +\n '');\n $templateCache.put('plugins/tree/treeBody.tmpl.html',\n '<div class=\"gantt-tree-body\" ng-style=\"getLabelsCss()\">\\n' +\n ' <div gantt-vertical-scroll-receiver>\\n' +\n ' <div class=\"gantt-row-label-background\">\\n' +\n ' <div class=\"gantt-row-label gantt-row-height\"\\n' +\n ' ng-class=\"row.model.classes\"\\n' +\n ' ng-style=\"{\\'height\\': row.model.height}\"\\n' +\n ' ng-repeat=\"row in gantt.rowsManager.visibleRows track by row.model.id\">\\n' +\n ' \\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' <div ui-tree ng-controller=\"GanttUiTreeController\" data-drag-enabled=\"false\" data-empty-place-holder-enabled=\"false\">\\n' +\n ' <ol class=\"gantt-tree-root\" ui-tree-nodes ng-model=\"rootRows\">\\n' +\n ' <li ng-repeat=\"row in rootRows\" ui-tree-node\\n' +\n ' ng-include=\"\\'plugins/tree/treeBodyChildren.tmpl.html\\'\">\\n' +\n ' </li>\\n' +\n ' </ol>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '');\n $templateCache.put('plugins/tree/treeBodyChildren.tmpl.html',\n '<div ng-controller=\"GanttTreeNodeController\"\\n' +\n ' class=\"gantt-row-label gantt-row-height\"\\n' +\n ' ng-class=\"row.model.classes\"\\n' +\n ' ng-style=\"{\\'height\\': row.model.height}\">\\n' +\n ' <div class=\"gantt-valign-container\">\\n' +\n ' <div class=\"gantt-valign-content\">\\n' +\n ' <a ng-disabled=\"isCollapseDisabled()\" data-nodrag\\n' +\n ' class=\"gantt-tree-handle-button btn btn-xs\"\\n' +\n ' ng-class=\"{\\'gantt-tree-collapsed\\': collapsed, \\'gantt-tree-expanded\\': !collapsed}\"\\n' +\n ' ng-click=\"!isCollapseDisabled() && toggle()\"><span\\n' +\n ' class=\"gantt-tree-handle glyphicon glyphicon-chevron-down\"\\n' +\n ' ng-class=\"{\\n' +\n ' \\'glyphicon-chevron-right\\': collapsed, \\'glyphicon-chevron-down\\': !collapsed,\\n' +\n ' \\'gantt-tree-collapsed\\': collapsed, \\'gantt-tree-expanded\\': !collapsed}\"></span>\\n' +\n ' </a>\\n' +\n ' <span gantt-row-label class=\"gantt-label-text\" gantt-bind-compile-html=\"getRowContent()\"/>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '<ol ui-tree-nodes ng-class=\"{hidden: collapsed}\" ng-model=\"childrenRows\">\\n' +\n ' <li ng-repeat=\"row in childrenRows\" ui-tree-node>\\n' +\n ' <div ng-include=\"\\'plugins/tree/treeBodyChildren.tmpl.html\\'\"></div>\\n' +\n ' </li>\\n' +\n '</ol>\\n' +\n '');\n $templateCache.put('plugins/tree/treeHeader.tmpl.html',\n '<div class=\"gantt-tree-header\" ng-style=\"{height: $parent.ganttHeaderHeight + \\'px\\'}\">\\n' +\n ' <div ng-if=\"$parent.ganttHeaderHeight\" class=\"gantt-row-label gantt-row-label-header gantt-tree-row gantt-tree-header-row\"><span class=\"gantt-label-text\" gantt-bind-compile-html=\"getHeaderContent()\"/></div>\\n' +\n '</div>\\n' +\n '');\n}]);\n"]} \ No newline at end of file +{"version":3,"sources":["../src/plugins/bounds.js","../src/plugins/dependencies.js","../src/plugins/drawtask.js","../src/plugins/groups.js","../src/plugins/labels.js","../src/plugins/movable.js","../src/plugins/overlap.js","../src/plugins/progress.js","../src/plugins/resizeSensor.js","../src/plugins/sortable.js","../src/plugins/table.js","../src/plugins/tooltips.js","../src/plugins/tree.js","../src/plugins/bounds/taskBounds.directive.js","../src/plugins/dependencies/dependenciesEvents.factory.js","../src/plugins/dependencies/dependenciesManager.factory.js","../src/plugins/dependencies/dependency.factory.js","../src/plugins/dependencies/taskMouseHandler.factory.js","../src/plugins/groups/group.controller.js","../src/plugins/groups/taskGroup.directive.js","../src/plugins/groups/taskGroup.factory.js","../src/plugins/groups/taskOverview.directive.js","../src/plugins/labels/labelsBody.directive.js","../src/plugins/labels/labelsHeader.directive.js","../src/plugins/labels/sideContentLabels.directive.js","../src/plugins/movable/movableOptions.factory.js","../src/plugins/progress/taskProgress.directive.js","../src/plugins/table/sideContentTable.directive.js","../src/plugins/table/tableColumn.controller.js","../src/plugins/table/tableColumnRow.controller.js","../src/plugins/tooltips/tooltip.directive.js","../src/plugins/tree/rowTreeLabel.directive.js","../src/plugins/tree/sideContentTree.directive.js","../src/plugins/tree/tree.controller.js","../src/plugins/tree/treeBody.directive.js","../src/plugins/tree/treeHeader.directive.js","../.tmp/generated/plugins/bounds/html2js.js","../.tmp/generated/plugins/dependencies/html2js.js","../.tmp/generated/plugins/drawtask/html2js.js","../.tmp/generated/plugins/groups/html2js.js","../.tmp/generated/plugins/labels/html2js.js","../.tmp/generated/plugins/movable/html2js.js","../.tmp/generated/plugins/overlap/html2js.js","../.tmp/generated/plugins/progress/html2js.js","../.tmp/generated/plugins/resizeSensor/html2js.js","../.tmp/generated/plugins/sortable/html2js.js","../.tmp/generated/plugins/table/html2js.js","../.tmp/generated/plugins/tooltips/html2js.js","../.tmp/generated/plugins/tree/html2js.js"],"names":[],"mappings":";;;;;;;AAAA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,IAAI,SAAS,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC5K,QAAQ,MAAM,CAAC,CAAC;AAChB,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;AAC1B,YAAY,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE;AAC9B,YAAY,KAAK,CAAC,CAAC,CAAC;AACpB,gBAAgB,OAAO,CAAC,CAAC,IAAI;AAC7B,YAAY,EAAE;AACd,YAAY,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9D,gBAAgB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9C;AACA,gBAAgB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;AAC9D,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACjF,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9D,wBAAwB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE;AAC9D,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,oBAAoB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,gBAAgB,CAAC;AACjB;AACA,gBAAgB,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAC9F,oBAAoB,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;AACxD,wBAAwB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,GAAG;AAC3D,wBAAwB,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;AACxD;AACA,wBAAwB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,GAAG;AAC1E,wBAAwB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,GAAG;AACjI,wBAAwB,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG;AAC5F,wBAAwB,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9D,4BAA4B,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE;AACxG,wBAAwB,CAAC;AACzB,wBAAwB,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC3D,4BAA4B,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE;AACjG,wBAAwB,CAAC;AACzB,wBAAwB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,EAAE;AACzE,wBAAwB,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW,GAAG;AAC7E,oBAAoB,CAAC;AACrB,gBAAgB,GAAG;AACnB;AACA,gBAAgB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3D,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;AACjF,wBAAwB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI;AAC7E,oBAAoB,CAAC;AACrB,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;AACjF,wBAAwB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI;AAChF,oBAAoB,CAAC;AACrB,gBAAgB,GAAG;AACnB,YAAY,CAAC;AACb,QAAQ,EAAE;AACV,IAAI,IAAI;AACR,KAAK;AACL;;ACtDA,CAAC,QAAQ,EAAE,CAAC,CAAC;AACb,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,IAAI,SAAS,EAAE,iBAAiB,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,wBAAwB,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;AACxP,QAAQ,MAAM,CAAC,CAAC;AAChB,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;AAC1B,YAAY,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE;AAC9B,YAAY,KAAK,CAAC,CAAC,CAAC;AACpB,gBAAgB,OAAO,CAAC,CAAC,KAAK;AAC9B,gBAAgB,eAAe,CAAC,CAAC,KAAK;AACtC,gBAAgB,SAAS,CAAC,CAAC,KAAK;AAChC,gBAAgB,iBAAiB,CAAC,CAAC,IAAI;AACvC,YAAY,EAAE;AACd,YAAY,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9D,gBAAgB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9C;AACA,gBAAgB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;AAC9D,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACvF,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;AACpE,wBAAwB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE;AAC9D,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,oBAAoB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC1D,oBAAoB,EAAE,CAAC,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI;AAC7E,oBAAoB,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;AAC7C,wBAAwB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG;AACvD,wBAAwB,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;AAC9F,wBAAwB,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE;AAC/C,wBAAwB,kBAAkB,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG;AAC7F,oBAAoB,EAAE;AACtB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,QAAQ,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAC9C,oBAAoB,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI;AACnI,gBAAgB,CAAC;AACjB;AACA,gBAAgB,QAAQ,CAAC,kBAAkB,EAAE,CAAC,CAAC;AAC/C,oBAAoB,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI;AACjI,gBAAgB,CAAC;AACjB;AACA,gBAAgB,QAAQ,CAAC,yBAAyB,EAAE,CAAC,CAAC;AACtD,oBAAoB,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,IAAI,IAAI,GAAG,IAAI,IAAI;AACzI,gBAAgB,CAAC;AACjB;AACA,gBAAgB,QAAQ,CAAC,0BAA0B,EAAE,CAAC,CAAC;AACvD,oBAAoB,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,IAAI,IAAI,GAAG,IAAI,IAAI;AACvI,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACpD,oBAAoB,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AACvC,wBAAwB,CAAC;AACzB,4BAA4B,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE;AAC3C,4BAA4B,QAAQ,CAAC,CAAC,KAAK,CAAC;AAC5C,4BAA4B,QAAQ,CAAC,CAAC,IAAI,CAAC;AAC3C,4BAA4B,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,4BAA4B,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE;AACtF,4BAA4B,QAAQ,CAAC,CAAC,CAAC;AACvC,gCAAgC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,iBAAiB,EAAE;AACvE,4BAA4B,CAAC;AAC7B;AACA,wBAAwB,EAAE;AAC1B,wBAAwB,CAAC;AACzB,4BAA4B,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE;AAC5C,4BAA4B,QAAQ,CAAC,CAAC,IAAI,CAAC;AAC3C,4BAA4B,QAAQ,CAAC,CAAC,KAAK,CAAC;AAC5C,4BAA4B,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,4BAA4B,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE;AACpF,4BAA4B,QAAQ,CAAC,CAAC,CAAC;AACvC,gCAAgC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,kBAAkB,EAAE;AACxE,4BAA4B,CAAC;AAC7B,wBAAwB,CAAC;AACzB,oBAAoB,EAAE;AACtB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC5D,oBAAoB,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;AAC/C,wBAAwB,CAAC;AACzB,4BAA4B,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE;AAC9C,4BAA4B,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE;AAC3C,4BAA4B,QAAQ,CAAC,CAAC,KAAK,CAAC;AAC5C,4BAA4B,QAAQ,CAAC,CAAC,IAAI,CAAC;AAC3C,4BAA4B,cAAc,CAAC,CAAC,CAAC,CAAC;AAC9C,4BAA4B,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE;AACxF,4BAA4B,QAAQ,CAAC,CAAC,CAAC;AACvC,gCAAgC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,yBAAyB,EAAE;AAC/E,4BAA4B,CAAC;AAC7B,wBAAwB,EAAE;AAC1B,wBAAwB,CAAC;AACzB,4BAA4B,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE;AAC9C,4BAA4B,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE;AAC5C,4BAA4B,QAAQ,CAAC,CAAC,IAAI,CAAC;AAC3C,4BAA4B,QAAQ,CAAC,CAAC,KAAK,CAAC;AAC5C,4BAA4B,cAAc,CAAC,CAAC,CAAC,CAAC;AAC9C,4BAA4B,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE;AACtF,4BAA4B,QAAQ,CAAC,CAAC,CAAC;AACvC,gCAAgC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,0BAA0B,EAAE;AAChF,4BAA4B,CAAC;AAC7B,wBAAwB,CAAC;AACzB,oBAAoB,EAAE;AACtB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE;AACnF;AACA,gBAAgB,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,cAAc,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;AACxG,oBAAoB,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;AACxD,wBAAwB,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,EAAE;AACrE,oBAAoB,CAAC;AACrB,gBAAgB,GAAG;AACnB;AACA,gBAAgB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACxD,oBAAoB,OAAO,CAAC,uBAAuB,CAAC,IAAI,EAAE;AAC1D,gBAAgB,GAAG;AACnB;AACA,gBAAgB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3D,oBAAoB,OAAO,CAAC,0BAA0B,CAAC,IAAI,EAAE;AAC7D,gBAAgB,GAAG;AACnB;AACA,gBAAgB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACxE,oBAAoB,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE;AAC5C,oBAAoB,OAAO,CAAC,OAAO,GAAG;AACtC,gBAAgB,IAAI;AACpB;AACA,gBAAgB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACzD,oBAAoB,OAAO,CAAC,OAAO,GAAG;AACtC,gBAAgB,GAAG;AACnB;AACA,gBAAgB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/D,oBAAoB,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;AACxC,wBAAwB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,GAAG;AACnE,oBAAoB,CAAC;AACrB,gBAAgB,GAAG;AACnB;AACA,gBAAgB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAClE,oBAAoB,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE;AAC1C,gBAAgB,GAAG;AACnB;AACA,YAAY,CAAC;AACb,QAAQ,EAAE;AACV,IAAI,IAAI;AACR,KAAK;AACL;;AChJA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,IAAI,SAAS,EAAE,aAAa,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACrL,QAAQ,MAAM,CAAC,CAAC;AAChB,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;AAC1B,YAAY,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE;AAC9B,YAAY,KAAK,CAAC,CAAC,CAAC;AACpB,gBAAgB,OAAO,CAAC,CAAC,KAAK;AAC9B,gBAAgB,aAAa,CAAC,CAAC,KAAK;AACpC,gBAAgB,gBAAgB,CAAC,CAAC,GAAG,WAAW,CAAC;AACjD,YAAY,EAAE;AACd,YAAY,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9D,gBAAgB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9C;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,oBAAoB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACxD,oBAAoB,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC3D,oBAAoB,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACzD,wBAAwB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;AACrD,oBAAoB,EAAE;AACtB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/F,oBAAoB,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvD,wBAAwB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,4BAA4B,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AAChF,4BAA4B,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE;AAC5D;AACA,4BAA4B,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,GAAG;AACrE,4BAA4B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,4BAA4B,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;AACnD;AACA,4BAA4B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE;AAC7E,4BAA4B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,4BAA4B,IAAI,CAAC,gBAAgB,GAAG;AACpD,4BAA4B,cAAc,CAAC,GAAG,CAAC,kBAAkB,GAAG;AACpE;AACA,4BAA4B,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG;AAChE,wBAAwB,EAAE;AAC1B;AACA,wBAAwB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7D,4BAA4B,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7D,gCAAgC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;AAC5E;AACA,gCAAgC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;AACzF,oCAAoC,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,WAAW,EAAE;AAC1E,oCAAoC,UAAU,CAAC,MAAM,EAAE;AACvD,gCAAgC,CAAC;AACjC,4BAA4B,EAAE;AAC9B;AACA,4BAA4B,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,WAAW,EAAE;AACjE,4BAA4B,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChE,gCAAgC,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,WAAW,EAAE;AACtE,4BAA4B,GAAG;AAC/B,wBAAwB,EAAE;AAC1B;AACA,wBAAwB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AACzD,4BAA4B,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE;AACvF,4BAA4B,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;AAChH,4BAA4B,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3F,gCAAgC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;AACrE;AACA,gCAAgC,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,oCAAoC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AACrD,gCAAgC,CAAC,CAAC,IAAI,CAAC,CAAC;AACxC,oCAAoC,YAAY,CAAC,CAAC,EAAE;AACpD,gCAAgC,CAAC;AACjC,4BAA4B,CAAC;AAC7B,wBAAwB,EAAE;AAC1B;AACA,wBAAwB,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,WAAW,EAAE;AAC7D,wBAAwB,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC;AACrE,oBAAoB,CAAC;AACrB,gBAAgB,GAAG;AACnB;AACA,gBAAgB,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACnG,oBAAoB,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvD,wBAAwB,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE;AACjF,wBAAwB,MAAM,CAAC,cAAc,CAAC,eAAe,CAAC;AAC9D,oBAAoB,CAAC;AACrB,gBAAgB,GAAG;AACnB,YAAY,CAAC;AACb,QAAQ,EAAE;AACV,IAAI,IAAI;AACR,KAAK;AACL;;AC3FA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,IAAI,SAAS,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC5M,QAAQ,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG;AAC/D,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG;AAC1D;AACA,QAAQ,MAAM,CAAC,CAAC;AAChB,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;AAC1B,YAAY,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE;AAC9B,YAAY,KAAK,CAAC,CAAC,CAAC;AACpB,gBAAgB,OAAO,CAAC,CAAC,KAAK;AAC9B,gBAAgB,OAAO,CAAC,CAAC,IAAI;AAC7B,YAAY,EAAE;AACd,YAAY,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9D,gBAAgB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9C;AACA,gBAAgB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;AAC9D,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACnF,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AAChE,wBAAwB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE;AAC9D,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,oBAAoB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,oBAAoB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;AAC5C,gBAAgB,CAAC;AACjB;AACA,gBAAgB,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,GAAG;AAClD;AACA,gBAAgB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;AACpC,oBAAoB,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE;AACtF,gBAAgB,CAAC;AACjB;AACA,gBAAgB,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE;AACvF,gBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtG,oBAAoB,OAAO,GAAG;AAC9B,gBAAgB,GAAG;AACnB;AACA,gBAAgB,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AAC5F,oBAAoB,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvD,wBAAwB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,GAAG;AAC7D,wBAAwB,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3D;AACA,wBAAwB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,GAAG;AAC1E,wBAAwB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,OAAO,GAAG;AAC7F;AACA,wBAAwB,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG;AAC9F,wBAAwB,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9D,4BAA4B,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE;AAC3G,wBAAwB,CAAC;AACzB,wBAAwB,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC3D,4BAA4B,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE;AACpG,wBAAwB,CAAC;AACzB;AACA,wBAAwB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,gBAAgB,EAAE;AAC5E;AACA,wBAAwB,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,cAAc,GAAG;AAC/E,oBAAoB,CAAC;AACrB,gBAAgB,GAAG;AACnB,YAAY,CAAC;AACb,QAAQ,EAAE;AACV,IAAI,IAAI;AACR,KAAK;AACL;;ACnEA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,IAAI,SAAS,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7L,QAAQ,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG;AAC/D,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG;AAC1D;AACA,QAAQ,MAAM,CAAC,CAAC;AAChB,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;AAC1B,YAAY,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE;AAC9B,YAAY,KAAK,CAAC,CAAC,CAAC;AACpB,gBAAgB,OAAO,CAAC,CAAC,KAAK;AAC9B,gBAAgB,MAAM,CAAC,CAAC,IAAI;AAC5B,YAAY,EAAE;AACd,YAAY,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9D,gBAAgB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9C;AACA,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI;AACzG;AACA,gBAAgB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;AAC9D,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACnF,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AAChE,wBAAwB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE;AAC9D,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,oBAAoB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACjD,oBAAoB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AAC1C,gBAAgB,CAAC;AACjB;AACA,gBAAgB,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,gBAAgB,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAC5G,oBAAoB,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;AAC/D,wBAAwB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,EAAE,GAAG,GAAG;AAClE,wBAAwB,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;AACxD;AACA,wBAAwB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,GAAG;AAC1E,wBAAwB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,OAAO,GAAG;AAC7F,wBAAwB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,GAAG;AAC5E;AACA,wBAAwB,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG;AACpG,wBAAwB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,EAAE;AACzE;AACA,wBAAwB,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW,GAAG;AACpF,oBAAoB,CAAC;AACrB,gBAAgB,GAAG;AACnB;AACA,gBAAgB,QAAQ,CAAC,oBAAoB,EAAE,CAAC,CAAC;AACjD,oBAAoB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,sBAAsB,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG;AAC5G,oBAAoB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC;AACA,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACzD,wBAAwB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,WAAW,CAAC;AACtE,wBAAwB,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE;AACrE,oBAAoB,CAAC;AACrB;AACA,oBAAoB,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,wBAAwB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;AACxD,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,oBAAoB,CAAC,CAAC,IAAI,EAAE;AACzF,YAAY,CAAC;AACb,QAAQ,EAAE;AACV,IAAI,IAAI;AACR,KAAK;AACL;;ACpEA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB;AACA,IAAI,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE;AAC/B,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,IAAI,SAAS,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE;AACzN,QAAQ,QAAQ,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAClH,YAAY,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK;AACpD,YAAY,MAAM,CAAC,CAAC;AACpB,gBAAgB,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;AAC9B,gBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE;AAClC,gBAAgB,KAAK,CAAC,CAAC,CAAC;AACxB,oBAAoB,OAAO,CAAC,CAAC,KAAK;AAClC,oBAAoB,WAAW,CAAC,CAAC,KAAK;AACtC,oBAAoB,aAAa,CAAC,CAAC,KAAK;AACxC,oBAAoB,iBAAiB,CAAC,CAAC,IAAI;AAC3C,gBAAgB,EAAE;AAClB,gBAAgB,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAClE,oBAAoB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;AAClD;AACA,oBAAoB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;AAClE,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACtF,wBAAwB,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AACnE,4BAA4B,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE;AAClE,wBAAwB,CAAC;AACzB,oBAAoB,CAAC;AACrB;AACA,oBAAoB,cAAc,CAAC,UAAU,CAAC,KAAK,EAAE;AACrD;AACA,oBAAoB,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,GAAG;AACvD,oBAAoB,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,GAAG;AAC5D,oBAAoB,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,GAAG;AAC1D,oBAAoB,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,GAAG;AACzD,oBAAoB,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,WAAW,GAAG;AAC9D,oBAAoB,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,GAAG;AAC5D,oBAAoB,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,GAAG;AACzD;AACA,oBAAoB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;AAC1I,oBAAoB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,EAAE;AAC9D,oBAAoB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE;AAC5D,oBAAoB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE;AAC5D;AACA,oBAAoB,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,oBAAoB,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,oBAAoB,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,oBAAoB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;AACzC,oBAAoB,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;AAClD,oBAAoB,GAAG,CAAC,iBAAiB,CAAC;AAC1C,oBAAoB,GAAG,CAAC,UAAU,CAAC;AACnC;AACA,oBAAoB,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAClG,wBAAwB,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;AAC5D,4BAA4B,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE;AACzE,4BAA4B,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;AACjG,4BAA4B,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC;AACrG;AACA,4BAA4B,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3D,4BAA4B,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC,KAAK,CAAC;AACvE,4BAA4B,GAAG,CAAC,cAAc,CAAC;AAC/C;AACA,4BAA4B,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,oBAAoB,GAAG;AAC1F;AACA,4BAA4B,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;AAC3E,4BAA4B,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;AAChG,4BAA4B,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,GAAG;AACpF;AACA,4BAA4B,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,gCAAgC,GAAG,CAAC,cAAc,GAAG;AACrD,gCAAgC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAChD,oCAAoC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE;AACpE,gCAAgC,CAAC;AACjC,gCAAgC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AAC/E,gCAAgC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;AAClF;AACA,gCAAgC,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;AAC3G,oCAAoC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;AACzE,gCAAgC,CAAC;AACjC;AACA,gCAAgC,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;AACzG,oCAAoC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE;AACvE,gCAAgC,CAAC;AACjC;AACA,gCAAgC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE;AAC5H,gCAAgC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC;AACjI,gCAAgC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9C,oCAAoC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACnH,oCAAoC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE;AACxE,oCAAoC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1F,wCAAwC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACtH,wCAAwC,cAAc,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE;AAC1E,oCAAoC,CAAC;AACrC,oCAAoC,SAAS,EAAE,MAAM,GAAG;AACxD,gCAAgC,CAAC;AACjC,4BAA4B,EAAE;AAC9B,4BAA4B,iBAAiB,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE;AAC9E,4BAA4B,cAAc,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE;AAC3E;AACA,4BAA4B,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9D,gCAAgC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AAC/E,gCAAgC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;AAClF;AACA,gCAAgC,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;AAC3G,oCAAoC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;AACzE,gCAAgC,CAAC;AACjC;AACA,gCAAgC,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;AACzG,oCAAoC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE;AACvE,gCAAgC,CAAC;AACjC;AACA,gCAAgC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE;AAC5H,gCAAgC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC;AACjI,gCAAgC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC1E,oCAAoC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AACnH,oCAAoC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE;AACxE,oCAAoC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACtE,wCAAwC,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,GAAG;AACzF,wCAAwC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,GAAG;AACtF,oCAAoC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5C,wCAAwC,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,IAAI;AAC5E,wCAAwC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,IAAI;AACzE,oCAAoC,CAAC;AACrC,gCAAgC,CAAC;AACjC,4BAA4B,EAAE;AAC9B,4BAA4B,iBAAiB,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,WAAW,EAAE;AAC3E,4BAA4B,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,WAAW,EAAE;AACxE;AACA,4BAA4B,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5D,gCAAgC,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;AACtF,oCAAoC,mBAAmB,GAAG;AAC1D,oCAAoC,QAAQ,CAAC,GAAG,EAAE;AAClD,oCAAoC,YAAY,CAAC,GAAG,EAAE;AACtD,gCAAgC,CAAC;AACjC,4BAA4B,EAAE;AAC9B;AACA,4BAA4B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,gCAAgC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,kBAAkB,CAAC;AAC/E;AACA,gCAAgC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;AACzG,gCAAgC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AACnD,gCAAgC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,gCAAgC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,cAAc,GAAG;AAC1H;AACA,gCAAgC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AAC/E,gCAAgC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;AAClF;AACA,gCAAgC,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;AAC3G,oCAAoC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;AACzE,gCAAgC,CAAC;AACjC;AACA,gCAAgC,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;AACzG,oCAAoC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE;AACvE,gCAAgC,CAAC;AACjC;AACA,gCAAgC,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACtE,oCAAoC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,iBAAiB,EAAE;AACzJ,oCAAoC,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC5D,wCAAwC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAAE,qBAAqB,GAAG;AACvG,wCAAwC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACnG,wCAAwC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,EAAE,gBAAgB,GAAG,KAAK,CAAC,IAAI,IAAI;AACtH,wCAAwC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC;AACzI,wCAAwC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACvI,4CAA4C,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,GAAG;AAClG,wCAAwC,GAAG;AAC3C,wCAAwC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI;AAC5E;AACA,wCAAwC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;AACpF,wCAAwC,GAAG,CAAC,SAAS,CAAC;AACtD,wCAAwC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACjF,4CAA4C,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;AAC3F,gDAAgD,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE;AACpE,gDAAgD,KAAK,CAAC;AACtD,4CAA4C,CAAC;AAC7C,wCAAwC,CAAC;AACzC;AACA,wCAAwC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;AAC3E;AACA,wCAAwC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACjG,4CAA4C,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;AAC1F,4CAA4C,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;AACtE,wCAAwC,CAAC;AACzC,oCAAoC,CAAC;AACrC;AACA,oCAAoC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE;AACvI,oCAAoC,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AACtD,wCAAwC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC;AAClE;AACA,wCAAwC,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC5E,4CAA4C,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,gDAAgD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,4CAA4C,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3G,gDAAgD,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;AACjG,4CAA4C,CAAC;AAC7C,wCAAwC,CAAC;AACzC;AACA,wCAAwC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AACvE,wCAAwC,SAAS,EAAE,MAAM,GAAG;AAC5D;AACA,wCAAwC,EAAE,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;AACjE,4CAA4C,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;AACjH,wCAAwC,CAAC;AACzC,wCAAwC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;AAClE,oCAAoC,CAAC;AACrC,gCAAgC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC7E,oCAAoC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnE,wCAAwC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;AAChE,wCAAwC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AACtE,wCAAwC,eAAe,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG;AAC7F,oCAAoC,CAAC;AACrC;AACA,oCAAoC,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;AACtG,wCAAwC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;AAClE,oCAAoC,CAAC;AACrC;AACA,oCAAoC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AAClE,oCAAoC,SAAS,EAAE,MAAM,GAAG;AACxD;AACA,oCAAoC,EAAE,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAC7D,wCAAwC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE;AAC/G,oCAAoC,CAAC;AACrC,oCAAoC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,gCAAgC,CAAC,CAAC,IAAI,CAAC,CAAC;AACxC,oCAAoC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACzF,wCAAwC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;AACvF,wCAAwC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AACtE,wCAAwC,eAAe,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG;AAC7F,oCAAoC,CAAC;AACrC;AACA,oCAAoC,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjF,wCAAwC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,oCAAoC,CAAC;AACrC;AACA,oCAAoC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AACpE,oCAAoC,SAAS,EAAE,MAAM,GAAG;AACxD;AACA,oCAAoC,EAAE,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAC7D,wCAAwC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE;AAC/G,oCAAoC,CAAC;AACrC,oCAAoC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;AAC9D,gCAAgC,CAAC;AACjC;AACA,gCAAgC,EAAE,CAAC,EAAE,qBAAqB,CAAC,EAAE,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC;AACtH,oCAAoC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,oBAAoB,GAAG;AAClG,oCAAoC,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC1E,wCAAwC,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG;AACxF,wCAAwC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE;AAClH,oCAAoC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5C,wCAAwC,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG;AAC1F,wCAAwC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE;AACpH,oCAAoC,CAAC;AACrC,gCAAgC,CAAC;AACjC,4BAA4B,EAAE;AAC9B;AACA,4BAA4B,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9D,gCAAgC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE;AACzG,gCAAgC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAAE,UAAU,CAAC;AACxF,gCAAgC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAAE,WAAW,CAAC;AACpF,gCAAgC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAAE,WAAW,CAAC;AACpF,gCAAgC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC;AACvF,gCAAgC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5D;AACA,gCAAgC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AAC9D,oCAAoC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI;AACzD,oCAAoC,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;AACzH,wCAAwC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC;AAClE,wCAAwC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,wCAAwC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE;AACrG,oCAAoC,CAAC;AACrC,gCAAgC,CAAC,CAAC,IAAI,CAAC,CAAC;AACxC,oCAAoC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK;AAC1D,oCAAoC,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;AACrI,wCAAwC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC;AAClE,wCAAwC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,wCAAwC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE;AACtG,oCAAoC,CAAC;AACrC,gCAAgC,CAAC;AACjC;AACA,gCAAgC,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;AACtD,oCAAoC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC1E,wCAAwC,UAAU,CAAC,GAAG,EAAE;AACxD,oCAAoC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;AAClD,gCAAgC,CAAC;AACjC,4BAA4B,EAAE;AAC9B;AACA,4BAA4B,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAClE,gCAAgC,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACnE,oCAAoC,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE;AACpE,oCAAoC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/D,gCAAgC,CAAC;AACjC,4BAA4B,EAAE;AAC9B;AACA,4BAA4B,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3D,gCAAgC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD;AACA;AACA,gCAAgC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AAC/E,gCAAgC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;AAClF;AACA,gCAAgC,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AACxE,oCAAoC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;AACzE,gCAAgC,CAAC;AACjC;AACA,gCAAgC,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AACvE,oCAAoC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE;AACvE,gCAAgC,CAAC;AACjC;AACA,gCAAgC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,aAAa,EAAE;AACzI,gCAAgC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,iBAAiB,EAAE;AACrJ,gCAAgC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE;AACnI;AACA,gCAAgC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3G,gCAAgC,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;AACpD,oCAAoC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,kBAAkB,CAAC;AACjJ,gCAAgC,CAAC;AACjC;AACA,gCAAgC,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvG,oCAAoC,MAAM,CAAC,CAAC,CAAC,EAAE;AAC/C,gCAAgC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC3E,oCAAoC,MAAM,CAAC,CAAC,CAAC,EAAE;AAC/C,gCAAgC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AACrJ,oCAAoC,MAAM,CAAC,CAAC,CAAC,EAAE;AAC/C,gCAAgC,CAAC,CAAC,IAAI,CAAC,CAAC;AACxC,oCAAoC,MAAM,CAAC,GAAG;AAC9C,gCAAgC,CAAC;AACjC,4BAA4B,EAAE;AAC9B;AACA,4BAA4B,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5D,gCAAgC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,oCAAoC,IAAI,CAAC,CAAC,CAAC,EAAE;AAC7C,wCAAwC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;AAC1D,oCAAoC,IAAI,CAAC,CAAC,CAAC,EAAE;AAC7C,wCAAwC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;AAC1D,oCAAoC,IAAI,CAAC,CAAC,CAAC,EAAE;AAC7C,wCAAwC,MAAM,CAAC,CAAC,IAAI,EAAE;AACtD,gCAAgC,CAAC;AACjC,4BAA4B,EAAE;AAC9B;AACA,4BAA4B,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AACpE,gCAAgC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE;AAClE,gCAAgC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE;AACxE,iCAAiC,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE;AACrF,iCAAiC,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;AACnF,iCAAiC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;AAC/E,iCAAiC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE;AAC3E,iCAAiC,CAAC,MAAM,EAAE,CAAC,MAAM;AACjD,iCAAiC,GAAG;AACpC,4BAA4B,EAAE;AAC9B;AACA,4BAA4B,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpE,gCAAgC,EAAE,CAAC,KAAK,CAAC,SAAS;AAClD,gCAAgC,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACjF,oCAAoC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;AACpF,oCAAoC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;AACxF,oCAAoC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE;AACtG,gCAAgC,CAAC;AACjC;AACA,gCAAgC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS;AAC7D,gCAAgC,EAAE,CAAC,EAAE,8BAA8B,CAAC,CAAC,CAAC;AACtE,oCAAoC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,oCAAoC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;AACrF,gCAAgC,CAAC;AACjC;AACA,gCAAgC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;AACjD,gCAAgC,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3D,gCAAgC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,gCAAgC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,gCAAgC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7D;AACA,gCAAgC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO;AACzD,gCAAgC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AACrE,oCAAoC,GAAG,CAAC,wBAAwB,GAAG;AACnE,oCAAoC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AACpD,wCAAwC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE;AACxE,oCAAoC,CAAC;AACrC;AACA,oCAAoC,UAAU,CAAC,GAAG,EAAE;AACpD,gCAAgC,EAAE;AAClC,gCAAgC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,CAAC,WAAW,CAAC,CAAC,eAAe,EAAE;AACxH,gCAAgC,cAAc,CAAC,IAAI,GAAG;AACtD;AACA,gCAAgC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG;AACpF,gCAAgC,UAAU,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,CAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AACpG,oCAAoC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AACpD,wCAAwC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE;AACxE,oCAAoC,CAAC;AACrC,oCAAoC,cAAc,CAAC,MAAM,GAAG;AAC5D,oCAAoC,eAAe,CAAC,GAAG,EAAE;AACzD,oCAAoC,SAAS,EAAE,MAAM,GAAG;AACxD,gCAAgC,GAAG,QAAQ,GAAG;AAC9C;AACA,gCAAgC,eAAe,CAAC,SAAS,CAAC,IAAI,GAAG;AACjE,4BAA4B,EAAE;AAC9B;AACA,4BAA4B,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC9D,gCAAgC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,oBAAoB,GAAG;AACjG,gCAAgC,oBAAoB,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG;AACtF,gCAAgC,oBAAoB,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG;AACxF;AACA,gCAAgC,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACjF;AACA,oCAAoC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAClG,oCAAoC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AAC9F,oCAAoC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAChG,oCAAoC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AAChG;AACA,oCAAoC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC;AACxF,oCAAoC,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9G,wCAAwC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;AAC3E,wCAAwC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;AACnG,wCAAwC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;AACxF,wCAAwC,SAAS,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE;AACvF,oCAAoC,CAAC;AACrC,oCAAoC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC;AACxE,oCAAoC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC;AACtE;AACA,oCAAoC,SAAS,EAAE,KAAK,GAAG;AACvD,gCAAgC,CAAC;AACjC;AACA,gCAAgC,8BAA8B,CAAC,CAAC,CAAC,KAAK,CAAC;AACvE,gCAAgC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;AAChE,gCAAgC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAC9D;AACA,gCAAgC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM;AAC9D,gCAAgC,mBAAmB,GAAG;AACtD;AACA,gCAAgC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO;AACnE,gCAAgC,eAAe,KAAK;AACpD;AACA,gCAAgC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK;AAC3D,gCAAgC,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAClE,oCAAoC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK;AAC3D,oCAAoC,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC1E,wCAAwC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE;AAChH,oCAAoC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5C,wCAAwC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE;AAClH,oCAAoC,CAAC;AACrC;AACA,oCAAoC,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/D,oCAAoC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK;AAChH,oCAAoC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE;AAC3G,gCAAgC,CAAC;AACjC;AACA,gCAAgC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AACpE,4BAA4B,EAAE;AAC9B;AACA,4BAA4B,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC;AACtF,4BAA4B,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO;AACvG,4BAA4B,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS;AAC9E,4BAA4B,SAAS,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AAClE,gCAAgC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3D,gCAAgC,mBAAmB,GAAG;AACtD,4BAA4B,GAAG;AAC/B;AACA,4BAA4B,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAC5D,gCAAgC,8BAA8B,CAAC,CAAC,CAAC,IAAI,CAAC;AACtE,gCAAgC,cAAc,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE;AACjF,gCAAgC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC;AACjE,4BAA4B,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AACjE,gCAAgC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC;AAC5H,gCAAgC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;AACnF,gCAAgC,8BAA8B,CAAC,CAAC,CAAC,IAAI,CAAC;AACtE,gCAAgC,cAAc,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE;AACjF,4BAA4B,CAAC;AAC7B,wBAAwB,CAAC;AACzB,oBAAoB,GAAG;AACvB,gBAAgB,CAAC;AACjB,YAAY,EAAE;AACd,QAAQ,IAAI;AACZ,KAAK;AACL;;ACndA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,IAAI,SAAS,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAChI,QAAQ,MAAM,CAAC,CAAC;AAChB,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;AAC1B,YAAY,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE;AAC9B,YAAY,KAAK,CAAC,CAAC,CAAC;AACpB,gBAAgB,OAAO,CAAC,CAAC,IAAI;AAC7B,YAAY,EAAE;AACd,YAAY,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9D,gBAAgB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9C;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,oBAAoB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,gBAAgB,CAAC;AACjB;AACA,gBAAgB,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,oBAAoB,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC;AACnC;AACA,oBAAoB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;AAClE,wBAAwB,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAChD,wBAAwB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AAC5C,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5B,wBAAwB,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AAC9C,wBAAwB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAC9C,oBAAoB,CAAC;AACrB;AACA,oBAAoB,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE;AACxC,gBAAgB,CAAC;AACjB;AACA,gBAAgB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACzC,oBAAoB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE;AACrD,oBAAoB,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG;AACpE,gBAAgB,CAAC;AACjB;AACA,gBAAgB,QAAQ,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAChE,oBAAoB,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;AAC3D,wBAAwB,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG;AACtE,wBAAwB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3D,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,QAAQ,CAAC,qBAAqB,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AACxE,oBAAoB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC/D,wBAAwB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE;AAC/C,wBAAwB,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC;AAC/D,4BAA4B,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG;AAC7E,wBAAwB,CAAC;AACzB,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,oBAAoB,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG;AACvE,oBAAoB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7C,oBAAoB,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG;AAC9C;AACA,oBAAoB,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,wBAAwB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE;AACvD,wBAAwB,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,EAAE;AACnE;AACA,wBAAwB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC1E,4BAA4B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE;AACnD,4BAA4B,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE;AACvD;AACA,4BAA4B,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;AAChE,gCAAgC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,IAAI,EAAE;AAC1E,gCAAgC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,YAAY,EAAE;AAClF,4BAA4B,CAAC;AAC7B;AACA,4BAA4B,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9F,gCAAgC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,gCAAgC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC;AACtD,4BAA4B,CAAC;AAC7B,wBAAwB,CAAC;AACzB,oBAAoB,CAAC;AACrB;AACA,oBAAoB,qBAAqB,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE;AACtE,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE;AACnC,oBAAoB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/D,wBAAwB,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE;AACjD,oBAAoB,GAAG;AACvB;AACA,oBAAoB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAC1E,wBAAwB,cAAc,CAAC,MAAM,EAAE;AAC/C,oBAAoB,GAAG;AACvB,gBAAgB,CAAC;AACjB;AACA,YAAY,CAAC;AACb,QAAQ,EAAE;AACV,IAAI,IAAI;AACR,KAAK;AACL;;AC7FA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,IAAI,SAAS,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAClL,QAAQ,MAAM,CAAC,CAAC;AAChB,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;AAC1B,YAAY,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE;AAC9B,YAAY,KAAK,CAAC,CAAC,CAAC;AACpB,gBAAgB,OAAO,CAAC,CAAC,IAAI;AAC7B,YAAY,EAAE;AACd,YAAY,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9D,gBAAgB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9C;AACA,gBAAgB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;AAC9D,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACnF,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AAChE,wBAAwB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE;AAC9D,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,oBAAoB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,gBAAgB,CAAC;AACjB;AACA,gBAAgB,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAC9F,oBAAoB,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC;AAClE,wBAAwB,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,GAAG;AAC7D,wBAAwB,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1D;AACA,wBAAwB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,GAAG;AAC1E,wBAAwB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,GAAG;AAClI;AACA,wBAAwB,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG;AAChG,wBAAwB,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9D,4BAA4B,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE;AAC1G,wBAAwB,CAAC;AACzB,wBAAwB,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC3D,4BAA4B,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE;AACnG,wBAAwB,CAAC;AACzB,wBAAwB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,eAAe,EAAE;AAC3E,wBAAwB,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,aAAa,GAAG;AAC/E,oBAAoB,CAAC;AACrB,gBAAgB,GAAG;AACnB;AACA,gBAAgB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3D,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;AACjF,wBAAwB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI;AAC5E,oBAAoB,CAAC;AACrB;AACA,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;AACjF,wBAAwB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI;AAC/E,oBAAoB,CAAC;AACrB,gBAAgB,GAAG;AACnB,YAAY,CAAC;AACb,QAAQ,EAAE;AACV,IAAI,IAAI;AACR,KAAK;AACL;;ACxDA,CAAC,QAAQ,GAAG;AACZ,IAAI,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,EAAE;AACpC,IAAI,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,EAAE;AACtC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,EAAE,KAAK,IAAI,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChG,QAAQ,MAAM,CAAC,CAAC;AAChB,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;AAC1B,YAAY,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE;AAC9B,YAAY,KAAK,CAAC,CAAC,CAAC;AACpB,gBAAgB,OAAO,CAAC,CAAC,IAAI;AAC7B,YAAY,EAAE;AACd,YAAY,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9D,gBAAgB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9C;AACA,gBAAgB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;AAC9D,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACnF,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AAChE,wBAAwB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE;AAC9D,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,oBAAoB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,gBAAgB,CAAC;AACjB;AACA,gBAAgB,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;AACxC,oBAAoB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,gBAAgB,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE;AAC9G,oBAAoB,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtE,wBAAwB,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC;AAC5F,wBAAwB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG;AACxD,oBAAoB,GAAG;AACvB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;AACrC,gBAAgB,GAAG,CAAC,MAAM,CAAC;AAC3B;AACA,gBAAgB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACxD,oBAAoB,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AACpC,oBAAoB,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC/C,wBAAwB,MAAM,CAAC,MAAM,GAAG;AACxC,oBAAoB,CAAC;AACrB,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACxC,wBAAwB,cAAc,CAAC,MAAM,GAAG;AAChD,wBAAwB,MAAM,CAAC,CAAC,CAAC,WAAW,GAAG;AAC/C,oBAAoB,CAAC;AACrB,gBAAgB,GAAG;AACnB;AACA,gBAAgB,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC5D,oBAAoB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AACnC,wBAAwB,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC/D,4BAA4B,cAAc,CAAC,MAAM,GAAG;AACpD,4BAA4B,MAAM,CAAC,CAAC,CAAC,WAAW,GAAG;AACnD,wBAAwB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACvE,4BAA4B,MAAM,CAAC,MAAM,GAAG;AAC5C,4BAA4B,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/C,wBAAwB,CAAC;AACzB,oBAAoB,CAAC;AACrB,gBAAgB,GAAG;AACnB,YAAY,CAAC;AACb,QAAQ,EAAE;AACV,IAAI,IAAI;AACR,KAAK;AACL;;AC9DA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB;AACA,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE;AACtC,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE;AACxC,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAC9B,QAAQ,CAAC,KAAK,EAAE;AAChB,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE;AAChG,IAAI,EAAE;AACN;AACA,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG;AAChC,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAG;AAChC,IAAI,GAAG,CAAC,gBAAgB,CAAC;AACzB;AACA,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAChE,QAAQ,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAAE;AACtD,QAAQ,GAAG,CAAC,CAAC;AACb,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC,CAAC;AACtD,gBAAgB,iBAAiB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,iBAAiB,EAAE;AAChE,gBAAgB,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC;AAC1D,YAAY,CAAC;AACb,YAAY,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE;AACrD,YAAY,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE;AAC9D,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrB,YAAY,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,YAAY,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,EAAE;AACvD,QAAQ,CAAC;AACT,IAAI,CAAC;AACL;AACA,IAAI,EAAE,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxC,QAAQ,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,SAAS,CAAC,aAAa,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;AACzF,YAAY,MAAM,CAAC,CAAC;AACpB,gBAAgB,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;AAC9B,gBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE;AAClC,gBAAgB,KAAK,CAAC,CAAC,CAAC;AACxB,oBAAoB,OAAO,CAAC,CAAC,IAAI;AACjC,gBAAgB,EAAE;AAClB,gBAAgB,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAClC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,IAAI;AACxF,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC3E,wBAAwB,gBAAgB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAAE;AACjE;AACA,wBAAwB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC;AACnE,wBAAwB,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC;AACnD,4BAA4B,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;AAC9E,wBAAwB,CAAC;AACzB,wBAAwB,EAAE,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,EAAE,CAAC,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/F,4BAA4B,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,OAAO,CAAC;AACtF,wBAAwB,CAAC;AACzB;AACA,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE;AAChD,oBAAoB,CAAC;AACrB,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,SAAS,GAAG;AACvF,gBAAgB,CAAC;AACjB,YAAY,EAAE;AACd,QAAQ,IAAI;AACZ,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AACZ,QAAQ,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,kBAAkB,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACtI,YAAY,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG;AACnE,YAAY,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG;AAC9D;AACA,YAAY,MAAM,CAAC,CAAC;AACpB,gBAAgB,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;AAC9B,gBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE;AAClC,gBAAgB,KAAK,CAAC,CAAC,CAAC;AACxB,oBAAoB,OAAO,CAAC,CAAC,IAAI;AACjC,gBAAgB,EAAE;AAClB,gBAAgB,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAClE,oBAAoB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;AAClD;AACA,oBAAoB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;AAClE,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACvF,wBAAwB,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpE,4BAA4B,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE;AAClE,wBAAwB,CAAC;AACzB,oBAAoB,CAAC;AACrB;AACA,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACtD,wBAAwB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7C,oBAAoB,CAAC;AACrB;AACA,oBAAoB,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AAChG,wBAAwB,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACzG,4BAA4B,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAClE,gCAAgC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;AAC9E;AACA,gCAAgC,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AACxE,oCAAoC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;AACzE,gCAAgC,CAAC;AACjC;AACA,gCAAgC,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE;AACpG,4BAA4B,EAAE;AAC9B;AACA,4BAA4B,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACjE,gCAAgC,QAAQ,EAAE,SAAS,GAAG;AACtD,4BAA4B,EAAE;AAC9B;AACA,4BAA4B,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACnE,gCAAgC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE;AACpF,gCAAgC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvD,oCAAoC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE;AACxF,oCAAoC,QAAQ,EAAE,SAAS,GAAG;AAC1D,gCAAgC,CAAC;AACjC,4BAA4B,EAAE;AAC9B;AACA,4BAA4B,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,cAAc,OAAO;AACpF,4BAA4B,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,QAAQ,KAAK;AAC5E,4BAA4B,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;AACnF,4BAA4B,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,aAAa,KAAK;AAClF;AACA,4BAA4B,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,QAAQ,KAAK;AAC5E,4BAA4B,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG;AACjE;AACA,4BAA4B,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE;AAC3D,wBAAwB,CAAC;AACzB,oBAAoB,GAAG;AACvB;AACA,gBAAgB,CAAC;AACjB,YAAY,EAAE;AACd,QAAQ,IAAI;AACZ,IAAI,CAAC;AACL;AACA,KAAK;AACL;;AC3HA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,IAAI,SAAS,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC5K,QAAQ,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG;AAC/D,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG;AAC1D;AACA,QAAQ,MAAM,CAAC,CAAC;AAChB,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;AAC1B,YAAY,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE;AAC9B,YAAY,KAAK,CAAC,CAAC,CAAC;AACpB,gBAAgB,OAAO,CAAC,CAAC,KAAK;AAC9B,gBAAgB,OAAO,CAAC,CAAC,KAAK;AAC9B,gBAAgB,OAAO,CAAC,CAAC,KAAK;AAC9B,gBAAgB,OAAO,CAAC,CAAC,KAAK;AAC9B,gBAAgB,QAAQ,CAAC,CAAC,KAAK;AAC/B,gBAAgB,cAAc,CAAC,CAAC,KAAK;AACrC,gBAAgB,UAAU,CAAC,CAAC,KAAK;AACjC,gBAAgB,eAAe,CAAC,CAAC,IAAI;AACrC,YAAY,EAAE;AACd,YAAY,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9D,gBAAgB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9C;AACA,gBAAgB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;AAC9D,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACnF,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AAChE,wBAAwB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE;AAC9D,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,oBAAoB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,oBAAoB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,GAAG;AACnD,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,oBAAoB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,GAAG;AAC3D,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACnD,oBAAoB,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG;AACxC,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACzD,oBAAoB,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG;AAC9C,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,oBAAoB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;AACvC,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACrD,oBAAoB,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG;AAC1C,gBAAgB,CAAC;AACjB;AACA,gBAAgB,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,gBAAgB,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAC5G,oBAAoB,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;AAC/D,wBAAwB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,EAAE,GAAG,GAAG;AACjE,wBAAwB,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;AACvD;AACA,wBAAwB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,GAAG;AAC1E,wBAAwB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,OAAO,GAAG;AAC7F,wBAAwB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,GAAG;AAC5E;AACA,wBAAwB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG;AAClG,wBAAwB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,YAAY,EAAE;AACxE;AACA,wBAAwB,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,UAAU,GAAG;AACnF,oBAAoB,CAAC;AACrB,gBAAgB,GAAG;AACnB;AACA,YAAY,CAAC;AACb,QAAQ,EAAE;AACV,IAAI,IAAI;AACR,KAAK;AACL;;AC7EA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,IAAI,SAAS,EAAE,aAAa,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAChK,QAAQ,MAAM,CAAC,CAAC;AAChB,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;AAC1B,YAAY,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE;AAC9B,YAAY,KAAK,CAAC,CAAC,CAAC;AACpB,gBAAgB,OAAO,CAAC,CAAC,KAAK;AAC9B,gBAAgB,UAAU,CAAC,CAAC,KAAK;AACjC,gBAAgB,OAAO,CAAC,CAAC,KAAK;AAC9B,gBAAgB,KAAK,CAAC,CAAC,IAAI;AAC3B,YAAY,EAAE;AACd,YAAY,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9D,gBAAgB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9C;AACA,gBAAgB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;AAC9D,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACnF,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AAChE,wBAAwB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE;AAC9D,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,oBAAoB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,gBAAgB,CAAC;AACjB,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACrD,oBAAoB,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;AACvD,gBAAgB,CAAC;AACjB,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAChD,oBAAoB,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;AACtC,gBAAgB,CAAC;AACjB,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,oBAAoB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,GAAG;AAC/D,oCAAoC,EAAE,KAAK,GAAG;AAC9C,oCAAoC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,MAAM;AACnI,oCAAoC,GAAG,KAAK,GAAG;AAC/C,gBAAgB,CAAC;AACjB;AACA,gBAAgB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAChC;AACA,gBAAgB,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAC9F,oBAAoB,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;AACxD,wBAAwB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,GAAG;AAC5D;AACA,wBAAwB,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;AACzD,wBAAwB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,GAAG;AAC1E,wBAAwB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,OAAO,GAAG;AAC7F;AACA,wBAAwB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,OAAO,GAAG;AACzF,wBAAwB,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9D,4BAA4B,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE;AACzG,wBAAwB,CAAC;AACzB,wBAAwB,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC3D,4BAA4B,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE;AAClG,wBAAwB,CAAC;AACzB;AACA,wBAAwB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,cAAc,EAAE;AAC1E,wBAAwB,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,YAAY,GAAG;AAC9E,oBAAoB,CAAC;AACrB,gBAAgB,GAAG;AACnB,YAAY,CAAC;AACb,QAAQ,EAAE;AACV,IAAI,IAAI;AACR,KAAK;AACL;;AChEA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AACpL,QAAQ,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG;AAC/D,QAAQ,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG;AAC1D;AACA,QAAQ,MAAM,CAAC,CAAC;AAChB,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;AAC1B,YAAY,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE;AAC9B,YAAY,KAAK,CAAC,CAAC,CAAC;AACpB,gBAAgB,OAAO,CAAC,CAAC,KAAK;AAC9B,gBAAgB,MAAM,CAAC,CAAC,KAAK;AAC7B,gBAAgB,OAAO,CAAC,CAAC,KAAK;AAC9B,gBAAgB,aAAa,CAAC,CAAC,KAAK;AACpC,gBAAgB,uBAAuB,CAAC,CAAC,IAAI;AAC7C,YAAY,EAAE;AACd,YAAY,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9D,gBAAgB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;AAC9C;AACA,gBAAgB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;AAC9D,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACnF,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;AAChE,wBAAwB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE;AAC9D,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,oBAAoB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACjD,oBAAoB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AAC1C,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACxD,oBAAoB,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,MAAM;AAC5D,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAClE,oBAAoB,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1D,gBAAgB,CAAC;AACjB;AACA,gBAAgB,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,gBAAgB,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAC5G,oBAAoB,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC;AAC/D,wBAAwB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,EAAE,GAAG,GAAG;AAClE,wBAAwB,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;AACxD;AACA,wBAAwB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,GAAG;AAC1E,wBAAwB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,OAAO,GAAG;AAC7F,wBAAwB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,GAAG;AAC5E;AACA,wBAAwB,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG;AAClG,wBAAwB,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,EAAE;AACzE;AACA,wBAAwB,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE,WAAW,GAAG;AACpF,oBAAoB,CAAC;AACrB,gBAAgB,GAAG;AACnB,YAAY,CAAC;AACb,QAAQ,EAAE;AACV,IAAI,IAAI;AACR,KAAK;AACL;;AC7DA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE,eAAe,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/H,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;AAC7G;AACA,QAAQ,MAAM,CAAC,CAAC;AAChB,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;AAC1B,YAAY,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACrD,gBAAgB,GAAG,CAAC,WAAW,CAAC;AAChC,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACvD,oBAAoB,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE;AACxE,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC;AACxB,oBAAoB,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;AACrD,gBAAgB,CAAC;AACjB,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtC,oBAAoB,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE;AACrE,gBAAgB,CAAC;AACjB,gBAAgB,MAAM,CAAC,WAAW,CAAC;AACnC,YAAY,EAAE;AACd,YAAY,OAAO,CAAC,CAAC,IAAI,CAAC;AAC1B,YAAY,KAAK,CAAC,CAAC,IAAI,CAAC;AACxB,YAAY,UAAU,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3E,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE;AACtD;AACA,gBAAgB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,oBAAoB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,gBAAgB,EAAE;AAClB;AACA,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChJ,oBAAoB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;AACtG,oBAAoB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;AACvG;AACA,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG;AACzE,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG;AAC/D;AACA,oBAAoB,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE;AACxE,oBAAoB,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE;AACzE,oBAAoB,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACrG,wBAAwB,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE;AAC3E,oBAAoB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAChF,wBAAwB,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE;AAC5E,oBAAoB,CAAC;AACrB,oBAAoB,IAAI,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5E,wBAAwB,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE;AAC5E,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5B,wBAAwB,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE;AAC3E,oBAAoB,CAAC;AACrB,gBAAgB,GAAG;AACnB;AACA,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AACpE,oBAAoB,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE;AAC3D,gBAAgB,GAAG;AACnB;AACA,gBAAgB,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AACpE,oBAAoB,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE;AAC1D,gBAAgB,GAAG;AACnB;AACA,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE;AACxG,gBAAgB,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AACnD,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE;AAChH,gBAAgB,GAAG;AACnB,YAAY,EAAE;AACd,QAAQ,EAAE;AACV,IAAI,IAAI;AACR,KAAK;AACL;;ACjEA,CAAC,QAAQ,EAAE,CAAC,CAAC;AACb,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB;AACA,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,GAAG,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACzF,QAAQ,GAAG;AACX,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC;AACnD,SAAS,CAAC;AACV,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,MAAM;AACpD,SAAS,CAAC,CAAC,CAAC,WAAW;AACvB,SAAS,EAAE;AACX,QAAQ,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACpD,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5B;AACA,YAAY,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AACnC;AACA,YAAY,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AAC1C,YAAY,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AACvD,gBAAgB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC3D,YAAY,EAAE;AACd;AACA,YAAY,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,kBAAkB,EAAE;AACtE;AACA;AACA,YAAY,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;AACrE,YAAY,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;AAC5E,gBAAgB,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,UAAU,EAAE;AAC/D,YAAY,GAAG;AACf;AACA,YAAY,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtE,gBAAgB,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,SAAS,EAAE;AAC9D,YAAY,GAAG;AACf;AACA,YAAY,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC9D,gBAAgB,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,SAAS,EAAE;AAC9D,gBAAgB,MAAM,CAAC,IAAI,CAAC;AAC5B,YAAY,GAAG;AACf;AACA,YAAY,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AAC/D,gBAAgB,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AACjC,oBAAoB,GAAG,CAAC,aAAa,CAAC;AACtC,oBAAoB,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AACtD,wBAAwB,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC;AACpE,oBAAoB,CAAC;AACrB;AACA,oBAAoB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;AAC7D,oBAAoB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;AAC7D;AACA,oBAAoB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC;AACjE;AACA,oBAAoB,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC;AACrE,oBAAoB,EAAE,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC1D,wBAAwB,iBAAiB,CAAC,CAAC,CAAC,GAAG;AAC/C,wBAAwB,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC;AACrE,oBAAoB,CAAC;AACrB;AACA,oBAAoB,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;AAC9E,oBAAoB,iBAAiB,CAAC,IAAI,CAAC,eAAe,EAAE;AAC5D;AACA,oBAAoB,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;AACxC,wBAAwB,aAAa,CAAC,mBAAmB,GAAG;AAC5D,wBAAwB,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC;AAChI,oBAAoB,CAAC;AACrB;AACA,oBAAoB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,eAAe,EAAE;AACvG,oBAAoB,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;AAC7D,oBAAoB,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;AAC5D;AACA,oBAAoB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE;AACxE;AACA,gBAAgB,CAAC;AACjB,YAAY,EAAE;AACd;AACA,YAAY,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AAC/D,gBAAgB,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AACjC,oBAAoB,GAAG,CAAC,aAAa,CAAC;AACtC,oBAAoB,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AACtD,wBAAwB,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC;AACpE,oBAAoB,CAAC;AACrB;AACA,oBAAoB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC;AAChE,oBAAoB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC;AAChE;AACA,oBAAoB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC;AACjE;AACA,oBAAoB,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC;AACrE,oBAAoB,EAAE,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC1D,wBAAwB,iBAAiB,CAAC,CAAC,CAAC,GAAG;AAC/C,wBAAwB,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC;AACrE,oBAAoB,CAAC;AACrB;AACA,oBAAoB,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;AAC9E,oBAAoB,iBAAiB,CAAC,IAAI,CAAC,eAAe,EAAE;AAC5D;AACA,oBAAoB,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;AACxC,wBAAwB,aAAa,CAAC,mBAAmB,GAAG;AAC5D,wBAAwB,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC;AAChI,oBAAoB,CAAC;AACrB;AACA,oBAAoB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,eAAe,EAAE;AACvG,oBAAoB,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;AAC7D,oBAAoB,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;AAC5D;AACA,oBAAoB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,aAAa,EAAE;AAC1F,gBAAgB,CAAC;AACjB,YAAY,EAAE;AACd;AACA,YAAY,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AAC/D,gBAAgB,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AACjC,oBAAoB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC;AACjE;AACA,oBAAoB,UAAU,CAAC,mBAAmB,GAAG;AACrD,oBAAoB,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC;AACzH,oBAAoB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE;AAC3E,gBAAgB,CAAC;AACjB,YAAY,EAAE;AACd;AACA,YAAY,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe,EAAE,CAAC,gBAAgB,EAAE;AACzE,YAAY,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,gBAAgB,EAAE;AACpE,YAAY,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,kBAAkB,EAAE,CAAC,gBAAgB,EAAE;AAC5E;AACA,QAAQ,EAAE;AACV,QAAQ,MAAM,CAAC,kBAAkB,CAAC;AAClC,IAAI,IAAI;AACR,KAAK;;AC3HL,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AACrB,CAAC,QAAQ,EAAE,CAAC,CAAC;AACb,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB;AACA,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,GAAG,OAAO,EAAE,wBAAwB,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,uBAAuB,EAAE,CAAC,CAAC,+BAA+B,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,kBAAkB,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAC3N,QAAQ,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACrE,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5B;AACA,YAAY,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/B,YAAY,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;AAC3C,YAAY,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAC3B;AACA,YAAY,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC,GAAG,GAAG;AAC1D,YAAY,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,GAAG;AAC7D,YAAY,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,GAAG;AAC7D;AACA,YAAY,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,GAAG;AAC/C,YAAY,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE;AACxE;AACA,YAAY,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG;AACvC,YAAY,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG;AACrC;AACA,YAAY,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG;AAC5B;AACA,YAAY,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,EAAE;AACvD;AACA,YAAY,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC7E,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC5C,oBAAoB,IAAI,CAAC,OAAO,GAAG;AACnC,gBAAgB,CAAC;AACjB;AACA,YAAY,GAAG;AACf;AACA,YAAY,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AACrF,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC5C,oBAAoB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE;AACxD,oBAAoB,IAAI,CAAC,OAAO,GAAG;AACnC,gBAAgB,CAAC;AACjB,YAAY,EAAE,CAAC,IAAI,EAAE;AACrB;AACA,YAAY,GAAG;AACf,aAAa,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC;AAC9G,aAAa,CAAC;AACd,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI;AAC1B,aAAa,EAAE;AACf,YAAY,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3D,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/C,oBAAoB,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;AACnE;AACA,oBAAoB,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACzD,wBAAwB,EAAE,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;AACjE,4BAA4B,gBAAgB,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE;AAClE,4BAA4B,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB,CAAC;AACvE,wBAAwB,CAAC;AACzB;AACA,wBAAwB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAClF,4BAA4B,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,gBAAgB,CAAC,CAAC,GAAG;AAC3F,4BAA4B,UAAU,CAAC,OAAO,GAAG;AACjD,wBAAwB,CAAC;AACzB,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB,YAAY,EAAE;AACd;AACA,YAAY,GAAG;AACf,aAAa,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1D,aAAa,CAAC;AACd,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI;AAC1B,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC;AAClF,aAAa,EAAE;AACf,YAAY,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;AAC9E,gBAAgB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE;AAClE;AACA,gBAAgB,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;AACnC,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACnE,wBAAwB,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;AAC9C,4BAA4B,YAAY,CAAC,CAAC,EAAE,UAAU,GAAG;AACzD,wBAAwB,CAAC;AACzB,wBAAwB,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,GAAG;AAC/D,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB,YAAY,EAAE;AACd;AACA,YAAY,GAAG;AACf,aAAa,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;AAC9C,aAAa,CAAC;AACd,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;AACxD,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC;AAC5D,aAAa,EAAE;AACf,YAAY,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACxD,gBAAgB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE;AACnE;AACA,gBAAgB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,aAAa,GAAG;AAC5D,gBAAgB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,GAAG;AACxD;AACA,gBAAgB,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;AAC7D,oBAAoB,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG;AAC3D,gBAAgB,CAAC;AACjB,gBAAgB,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;AACzD,oBAAoB,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG;AACvD,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AACjC,oBAAoB,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AACvE,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC/B,oBAAoB,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE;AACnE,gBAAgB,CAAC;AACjB;AACA,gBAAgB,MAAM,CAAC,UAAU,CAAC;AAClC,YAAY,EAAE;AACd;AACA,YAAY,GAAG;AACf,aAAa,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU;AAChD,aAAa,CAAC;AACd,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,MAAM;AAClD,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC;AAClF,aAAa,EAAE;AACf,YAAY,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;AAC1E,gBAAgB,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,aAAa,IAAI;AACzF,gBAAgB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG;AACpC,gBAAgB,GAAG,CAAC,CAAC,CAAC;AACtB;AACA,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;AACvC,oBAAoB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACnE,wBAAwB,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC;AACjE,4BAA4B,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE;AACxD,wBAAwB,CAAC;AACzB,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,WAAW,IAAI;AACnF,gBAAgB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG;AAClC;AACA,gBAAgB,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;AACrC,oBAAoB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACjE,wBAAwB,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;AAC/D,4BAA4B,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE;AACtD,wBAAwB,CAAC;AACzB,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACzD,oBAAoB,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;AAC1C,wBAAwB,UAAU,CAAC,CAAC,EAAE,UAAU,GAAG;AACnD,oBAAoB,CAAC;AACrB,oBAAoB,gBAAgB,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE;AACrF,gBAAgB,CAAC;AACjB;AACA,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACvD,oBAAoB,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;AAC1C,wBAAwB,QAAQ,CAAC,CAAC,EAAE,UAAU,GAAG;AACjD,oBAAoB,CAAC;AACrB,oBAAoB,cAAc,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE;AACjF,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,aAAa,GAAG,CAAC,EAAE;AACxE,oBAAoB,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,aAAa,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACrF,oBAAoB,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,aAAa,IAAI;AAC7E,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,WAAW,GAAG,CAAC,EAAE;AACpE,oBAAoB,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,WAAW,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACjF,oBAAoB,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,WAAW,IAAI;AACzE,gBAAgB,CAAC;AACjB,YAAY,EAAE;AACd;AACA,YAAY,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACvD,gBAAgB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG;AACtC;AACA,gBAAgB,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;AAC5E,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;AACvC,oBAAoB,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,gBAAgB,EAAE;AACzE,gBAAgB,CAAC;AACjB;AACA,gBAAgB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;AACxE,gBAAgB,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;AACrC,oBAAoB,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,cAAc,EAAE;AACvE,gBAAgB,CAAC;AACjB;AACA,gBAAgB,MAAM,CAAC,YAAY,CAAC;AACpC,YAAY,EAAE;AACd;AACA,YAAY,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;AAC/D,gBAAgB,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AACjC,oBAAoB,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,UAAU,CAAC;AACzD,oBAAoB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAChE,wBAAwB,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,GAAG;AACjE,oBAAoB,GAAG;AACvB,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC;AACxB,oBAAoB,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,oBAAoB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAChE,wBAAwB,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,GAAG;AACjE,oBAAoB,GAAG;AACvB,gBAAgB,CAAC;AACjB,YAAY,EAAE;AACd;AACA,YAAY,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,gBAAgB,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;AACzC,oBAAoB,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG;AAC3C,gBAAgB,CAAC;AACjB;AACA,gBAAgB,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG;AACjD;AACA,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;AACjD,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACjF,wBAAwB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,GAAG;AAClH,wBAAwB,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,wBAAwB,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,EAAE;AACzE,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB;AACA,YAAY,EAAE;AACd;AACA,YAAY,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACrD,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC9E,oBAAoB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE;AACxE,oBAAoB,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,EAAE;AAC9D,oBAAoB,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,gBAAgB,CAAC;AACjB;AACA,gBAAgB,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,YAAY,EAAE;AACd;AACA,YAAY,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACtD,gBAAgB,EAAE,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;AACzC,oBAAoB,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG;AAC3C,gBAAgB,CAAC;AACjB;AACA,gBAAgB,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;AAClF,gBAAgB,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,GAAG;AACzD,YAAY,EAAE;AACd;AACA,YAAY,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACzD,gBAAgB,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,OAAO,GAAG;AACzD,gBAAgB,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3D,YAAY,EAAE;AACd;AACA,YAAY,GAAG;AACf,aAAa,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC;AAC1E,aAAa,CAAC;AACd,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK;AAC3B,aAAa,EAAE;AACf,YAAY,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7C,gBAAgB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5D,oBAAoB,sBAAsB,CAAC,IAAI,EAAE;AACjD,oBAAoB,kBAAkB,CAAC,IAAI,EAAE;AAC7C,gBAAgB,GAAG;AACnB;AACA,gBAAgB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG;AAClC,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACxD,oBAAoB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE;AACxC,oBAAoB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACnD,oBAAoB,gBAAgB,CAAC,IAAI,EAAE;AAC3C,oBAAoB,mBAAmB,CAAC,IAAI,EAAE;AAC9C,gBAAgB,CAAC;AACjB,gBAAgB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AACtC,YAAY,EAAE;AACd;AACA,YAAY,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7D,gBAAgB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE;AAClE,gBAAgB,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;AACnC,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACnE,wBAAwB,YAAY,CAAC,CAAC,EAAE,UAAU,GAAG;AACrD,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB,gBAAgB,MAAM,CAAC,YAAY,CAAC;AACpC,YAAY,EAAE;AACd;AACA,YAAY,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1D,gBAAgB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE;AAClE,gBAAgB,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;AACnC,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACnE,wBAAwB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG;AAClD,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB,gBAAgB,MAAM,CAAC,YAAY,CAAC;AACpC,YAAY,EAAE;AACd;AACA,YAAY,GAAG;AACf,aAAa,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAC9E,aAAa,CAAC;AACd,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI;AAC1B,aAAa,EAAE;AACf,YAAY,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3C,gBAAgB,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE;AACnD,gBAAgB,GAAG,CAAC,CAAC;AACrB,oBAAoB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;AAC5D,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAChD,wBAAwB,0BAA0B,CAAC,OAAO,EAAE;AAC5D,wBAAwB,sBAAsB,CAAC,OAAO,EAAE;AACxD,wBAAwB,kBAAkB,CAAC,OAAO,EAAE;AACpD,oBAAoB,CAAC;AACrB,oBAAoB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,oBAAoB,gBAAgB,CAAC,IAAI,EAAE;AAC3C,oBAAoB,mBAAmB,CAAC,IAAI,EAAE;AAC9C,oBAAoB,uBAAuB,CAAC,IAAI,EAAE;AAClD,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC;AAC3B,oBAAoB,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;AAC9D,gBAAgB,CAAC;AACjB,YAAY,EAAE;AACd;AACA,YAAY,GAAG;AACf,aAAa,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9C,aAAa,CAAC;AACd,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC;AAChE,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG;AAC3B,aAAa,EAAE;AACf,YAAY,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7C,gBAAgB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AAC1C,YAAY,EAAE;AACd;AACA,YAAY,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACrD,gBAAgB,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC9E,oBAAoB,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAC7C,gBAAgB,GAAG;AACnB,YAAY,EAAE;AACd;AACA,YAAY,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACrD,gBAAgB,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC9E,oBAAoB,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAC7C,gBAAgB,GAAG;AACnB,YAAY,EAAE;AACd;AACA,YAAY,GAAG;AACf,aAAa,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;AAC/G,aAAa,CAAC;AACd,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ;AAC9B,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM;AAC5B,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK;AAC3B,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM;AACzC,aAAa,EAAE;AACf,YAAY,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9D,gBAAgB,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE;AACnE,gBAAgB,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;AACjE,gBAAgB,EAAE,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;AACzD,oBAAoB,GAAG,CAAC,cAAc,CAAC;AACvC,oBAAoB,GAAG,CAAC,cAAc,CAAC;AACvC;AACA,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,CAAC;AACjG,wBAAwB,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,iBAAiB,CAAC,mBAAmB,EAAE;AACtG,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5B,wBAAwB,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE;AAC5D,oBAAoB,CAAC;AACrB;AACA,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,CAAC;AACjG,wBAAwB,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,iBAAiB,CAAC,mBAAmB,EAAE;AACtG,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5B,wBAAwB,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE;AAC5D,oBAAoB,CAAC;AACrB;AACA,oBAAoB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;AACzD,wBAAwB,MAAM,CAAC,CAAC,cAAc,CAAC;AAC/C,wBAAwB,MAAM,CAAC,CAAC,cAAc;AAC9C,oBAAoB,EAAE,CAAC,KAAK,CAAC,iBAAiB,EAAE;AAChD,oBAAoB,MAAM,CAAC,UAAU,CAAC;AACtC,gBAAgB,CAAC;AACjB,YAAY,EAAE;AACd;AACA,YAAY,GAAG;AACf,aAAa,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC;AAC5C,aAAa,CAAC;AACd,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC;AAC/B,aAAa,EAAE;AACf,YAAY,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC/C,gBAAgB,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG;AACzC;AACA,gBAAgB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;AAC/E,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACnE,wBAAwB,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;AACpE,4BAA4B,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG;AAClE,wBAAwB,CAAC;AACzB,oBAAoB,CAAC;AACrB,gBAAgB,GAAG;AACnB;AACA,gBAAgB,MAAM,CAAC,eAAe,CAAC;AACvC,YAAY,EAAE;AACd;AACA,YAAY,GAAG;AACf,aAAa,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC;AACzE,aAAa,EAAE;AACf,YAAY,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5C,gBAAgB,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE;AACnD;AACA,gBAAgB,GAAG,CAAC,CAAC;AACrB,oBAAoB,GAAG,CAAC,iBAAiB,CAAC;AAC1C,oBAAoB,GAAG,CAAC,CAAC,CAAC;AAC1B,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;AAC3D,wBAAwB,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;AACxC,oBAAoB,CAAC;AACrB;AACA,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9C,wBAAwB,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;AAC3C,wBAAwB,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,GAAG;AACnE,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5B,wBAAwB,iBAAiB,CAAC,CAAC,CAAC,GAAG;AAC/C,wBAAwB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/D,4BAA4B,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE;AAClF,4BAA4B,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;AACxF,gCAAgC,EAAE,CAAC,GAAG,cAAc,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAC7E,oCAAoC,iBAAiB,CAAC,IAAI,CAAC,cAAc,EAAE;AAC3E,gCAAgC,CAAC;AACjC,4BAA4B,GAAG;AAC/B,wBAAwB,GAAG;AAC3B,oBAAoB,CAAC;AACrB;AACA,oBAAoB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACpE,wBAAwB,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,GAAG;AACpE,oBAAoB,CAAC;AACrB;AACA,oBAAoB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC3D,wBAAwB,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE;AAC3D,oBAAoB,GAAG;AACvB,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC;AAC3B,oBAAoB,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;AAC9D,gBAAgB,CAAC;AACjB,YAAY,EAAE;AACd;AACA,YAAY,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE;AACnF,QAAQ,EAAE;AACV,QAAQ,MAAM,CAAC,mBAAmB,CAAC;AACnC,IAAI,IAAI;AACR,KAAK;;ACtaL,CAAC,QAAQ,EAAE,CAAC,CAAC;AACb,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB;AACA,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,GAAG,OAAO,EAAE,eAAe,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACrH,QAAQ,GAAG;AACX,SAAS,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;AAC5C,SAAS,CAAC,CAAC;AACX,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU;AACpE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU;AACpD,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU;AAC/C,SAAS,CAAC;AACV,SAAS,CAAC,CAAC,CAAC,WAAW;AACvB,SAAS,CAAC;AACV,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc;AAChG,SAAS,EAAE;AACX,QAAQ,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACzD,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5B;AACA,YAAY,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AACnC,YAAY,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7B,YAAY,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/B,YAAY,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AACxC,YAAY,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG;AACxC;AACA,YAAY,GAAG;AACf,aAAa,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,SAAS,CAAC;AACrD,aAAa,CAAC;AACd,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;AACjC,aAAa,EAAE;AACf,YAAY,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC3C,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACtC,oBAAoB,MAAM,CAAC,IAAI,CAAC;AAChC,gBAAgB,CAAC;AACjB,gBAAgB,MAAM,CAAC,KAAK,CAAC;AAC7B,YAAY,EAAE;AACd;AACA,YAAY,GAAG;AACf,aAAa,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;AAC1C,aAAa,EAAE;AACf,YAAY,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC1C,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AACtC,oBAAoB,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;AACpD,wBAAwB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE;AACnE,oBAAoB,CAAC;AACrB,oBAAoB,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,oBAAoB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AAChD,gBAAgB,CAAC;AACjB;AACA,gBAAgB,IAAI,CAAC,uBAAuB,GAAG;AAC/C,YAAY,EAAE;AACd;AACA,YAAY,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvD,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAC7C,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACzE,wBAAwB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG;AACrF,oBAAoB,CAAC;AACrB,oBAAoB,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG;AAChD,gBAAgB,CAAC;AACjB,YAAY,EAAE;AACd;AACA,YAAY,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC7C,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACpD,oBAAoB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAC3C,gBAAgB,CAAC;AACjB,gBAAgB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AAC1C,YAAY,EAAE;AACd;AACA,YAAY,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC3C,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,oBAAoB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AACzC,gBAAgB,CAAC;AACjB,gBAAgB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AAC1C,YAAY,EAAE;AACd;AACA,YAAY,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC3C,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACpD,oBAAoB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;AACjE,gBAAgB,CAAC;AACjB,gBAAgB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,YAAY,EAAE;AACd;AACA,YAAY,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACzC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,oBAAoB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;AAC/D,gBAAgB,CAAC;AACjB,gBAAgB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AACjC,YAAY,EAAE;AACd;AACA,YAAY,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACnD,gBAAgB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE;AAChG,gBAAgB,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,oBAAoB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;AACvE,gBAAgB,CAAC;AACjB,gBAAgB,MAAM,CAAC,UAAU,CAAC;AAClC,YAAY,EAAE;AACd;AACA,YAAY,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAChD,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACxE,oBAAoB,MAAM,CAAC,KAAK,CAAC;AACjC,gBAAgB,CAAC;AACjB,gBAAgB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE;AAC/C,gBAAgB,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE;AACrD,YAAY,EAAE;AACd;AACA,YAAY,GAAG;AACf,aAAa,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC;AACtE,aAAa,CAAC;AACd,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;AACjC,aAAa,EAAE;AACf,YAAY,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvC,gBAAgB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG;AAClD,gBAAgB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG;AAC9C;AACA,gBAAgB,EAAE,CAAC,EAAE,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC/C,oBAAoB,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;AACzC,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,EAAE,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC;AAC7C,oBAAoB,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACvC,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AACzC,oBAAoB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE;AACxF,oBAAoB,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AACrC,wBAAwB,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AACtD,wBAAwB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC;AACrD,wBAAwB,MAAM,CAAC,IAAI,CAAC;AACpC,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,IAAI,CAAC,uBAAuB,GAAG;AAC/C,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC7C,oBAAoB,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,EAAE;AAC3F,oBAAoB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,kBAAkB,GAAG;AACvH,gBAAgB,CAAC;AACjB,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC3C,oBAAoB,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,EAAE;AAC7F,oBAAoB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,oBAAoB,GAAG;AACvH,gBAAgB,CAAC;AACjB,gBAAgB,MAAM,CAAC,KAAK,CAAC;AAC7B,YAAY,EAAE;AACd,QAAQ,EAAE;AACV,QAAQ,MAAM,CAAC,UAAU,CAAC;AAC1B,IAAI,IAAI;AACR,KAAK;;AChJL,CAAC,QAAQ,EAAE,CAAC,CAAC;AACb,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB;AACA,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,GAAG,OAAO,EAAE,+BAA+B,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AACrH,QAAQ,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACxD,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5B;AACA,YAAY,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AACnC,YAAY,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7B,YAAY,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AACnC,YAAY,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG;AACtC;AACA,YAAY,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAChC,YAAY,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD;AACA,YAAY,GAAG;AACf,aAAa,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;AAChD,aAAa,CAAC;AACd,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO;AAC7B,aAAa,CAAC,CAAC,CAAC,WAAW;AAC3B,aAAa,EAAE;AACf,YAAY,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACpD,gBAAgB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AACvC;AACA,gBAAgB,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACpD,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;AAC/D,oBAAoB,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE;AAC1F,gBAAgB,EAAE;AAClB;AACA,gBAAgB,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACrD,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;AAC/D,oBAAoB,IAAI,CAAC,gBAAgB,GAAG;AAC5C,gBAAgB,EAAE;AAClB;AACA,gBAAgB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC3C,oBAAoB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE;AAC5E,oBAAoB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAC3E,gBAAgB,EAAE;AAClB;AACA,gBAAgB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC3C,oBAAoB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE;AAC9E,oBAAoB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE;AAC7E,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE;AAC/D,gBAAgB,EAAE;AAClB;AACA,YAAY,EAAE;AACd;AACA;AACA;AACA,YAAY,GAAG;AACf,aAAa,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;AAC3E,aAAa,EAAE;AACf,YAAY,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvC,gBAAgB,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AACtC,oBAAoB,IAAI,CAAC,aAAa,GAAG;AACzC;AACA,oBAAoB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,KAAK;AACjG,oBAAoB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC1F,wBAAwB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAI;AACxG,oBAAoB,GAAG;AACvB;AACA,oBAAoB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;AACpF,wBAAwB,cAAc,CAAC,OAAO,GAAG;AACjD,oBAAoB,GAAG;AACvB;AACA,oBAAoB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1C,gBAAgB,CAAC;AACjB,YAAY,EAAE;AACd;AACA,YAAY,GAAG;AACf,aAAa,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;AAC9E,aAAa,EAAE;AACf,YAAY,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvC,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AACrC,oBAAoB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC;AACpF,wBAAwB,cAAc,CAAC,OAAO,GAAG;AACjD,oBAAoB,GAAG;AACvB;AACA,oBAAoB,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG;AAC9C;AACA,oBAAoB,IAAI,CAAC,gBAAgB,GAAG;AAC5C,oBAAoB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3C,gBAAgB,CAAC;AACjB,YAAY,EAAE;AACd;AACA,YAAY,GAAG;AACf,aAAa,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AACnD,aAAa,EAAE;AACf,YAAY,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChD,gBAAgB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACpC,gBAAgB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtF,oBAAoB,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;AAC1D,gBAAgB,GAAG;AACnB,YAAY,EAAE;AACd;AACA,YAAY,GAAG;AACf,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AAChD,aAAa,EAAE;AACf,YAAY,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC7C,gBAAgB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtF,oBAAoB,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;AAC3D,gBAAgB,GAAG;AACnB,gBAAgB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACrC,YAAY,EAAE;AACd,QAAQ,EAAE;AACV,QAAQ,MAAM,CAAC,gBAAgB,CAAC;AAChC,IAAI,IAAI;AACR,KAAK;;AC3GL,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,UAAU,EAAE,oBAAoB,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AACrJ,QAAQ,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC1C,YAAY,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;AACpD;AACA,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAClD,gBAAgB,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE;AACjD,YAAY,CAAC;AACb;AACA,YAAY,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE;AACvG,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;AAC/B,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE;AACzG,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE;AACjF;AACA,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,GAAG;AACvC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE;AACzF,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC;AACpB,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7C,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3C,YAAY,CAAC;AACb,QAAQ,EAAE;AACV;AACA,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACrE,YAAY,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACjD,gBAAgB,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChE,oBAAoB,eAAe,GAAG;AACtC,oBAAoB,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;AAClE,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG;AACzC,oBAAoB,CAAC;AACrB,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC;AACxB,oBAAoB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,EAAE;AAC3F,oBAAoB,EAAE,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,wBAAwB,eAAe,GAAG;AAC1C,wBAAwB,EAAE,GAAG,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;AACtE,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG;AAC7C,wBAAwB,CAAC;AACzB,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB,YAAY,CAAC;AACb,QAAQ,GAAG;AACX;AACA,QAAQ,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,eAAe,EAAE;AAChF;AACA,QAAQ,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,eAAe,EAAE;AACnF;AACA,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,eAAe,EAAE;AACrE;AACA,QAAQ,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,WAAW,EAAE;AAC5C,IAAI,IAAI;AACR,KAAK;AACL;;ACnDA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE,cAAc,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5G,QAAQ,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,GAAG;AAC1F,QAAQ,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG;AAC/B,IAAI,IAAI;AACR,KAAK;AACL;;ACPA,CAAC,QAAQ,EAAE,CAAC,CAAC;AACb,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB;AACA,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,GAAG,OAAO,EAAE,cAAc,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AACzG,QAAQ,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AACpD,YAAY,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5B;AACA,YAAY,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAC3B,YAAY,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;AAC3C;AACA,YAAY,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE;AAChF;AACA,YAAY,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG;AAC5B,YAAY,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG;AACpC,YAAY,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG;AACpC,YAAY,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;AACtC;AACA,YAAY,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;AACvD,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AACvD,gBAAgB,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE;AAC3D,YAAY,CAAC;AACb;AACA,YAAY,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACjD,gBAAgB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;AACnD,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AACvD,oBAAoB,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE;AACvD,gBAAgB,CAAC;AACjB;AACA,gBAAgB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;AACtD,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AACtD,oBAAoB,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE;AACrD,gBAAgB,CAAC;AACjB;AACA,gBAAgB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;AACrI;AACA,gBAAgB,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;AACnC,oBAAoB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;AACpI,oBAAoB,MAAM,CAAC,OAAO,CAAC;AACnC,gBAAgB,CAAC;AACjB,YAAY,EAAE;AACd;AACA,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC/D,gBAAgB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC;AACtD;AACA,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACxD,oBAAoB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE;AACxC;AACA,oBAAoB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE;AAC3D,oBAAoB,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACpD,wBAAwB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;AAC9C,wBAAwB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE;AACnE;AACA,wBAAwB,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACzD,4BAA4B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE;AAC3D,wBAAwB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAC/D,4BAA4B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE;AAC3D,wBAAwB,CAAC,CAAC,IAAI,CAAC,CAAC;AAChC,4BAA4B,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,wBAAwB,CAAC;AACzB,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB,YAAY,CAAC;AACb;AACA,YAAY,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AAClC,YAAY,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;AACjC,gBAAgB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC;AAChD,YAAY,CAAC;AACb,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC1C,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACrD,oBAAoB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1F,wBAAwB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC;AAC7D,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB,YAAY,CAAC;AACb;AACA,YAAY,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAChC,YAAY,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;AACjC,gBAAgB,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC;AAC5C,YAAY,CAAC;AACb,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACxC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACrD,oBAAoB,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AACpF,wBAAwB,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC;AACzD,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB,YAAY,CAAC;AACb;AACA,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;AACpC,gBAAgB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE;AAC/E,gBAAgB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AAC1F,YAAY,CAAC;AACb,QAAQ,EAAE;AACV,QAAQ,MAAM,CAAC,SAAS,CAAC;AACzB,IAAI,IAAI;AACR,KAAK;;AC9FL,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,GAAG,SAAS,EAAE,iBAAiB,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACxG,QAAQ,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,GAAG;AAChG,QAAQ,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AACzD,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC5C,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACxC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,GAAG;AAC3C,QAAQ,EAAE;AACV,QAAQ,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG;AAC/B,IAAI,IAAI;AACR,KAAK;;ACXL,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE,eAAe,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACpI,QAAQ,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG;AAC5F,QAAQ,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AAC/C,YAAY,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,kBAAkB,GAAG;AAC/D;AACA,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC9C,gBAAgB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;AAC7B;AACA,gBAAgB,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AACvC,oBAAoB,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/G,oBAAoB,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;AACxH,gBAAgB,CAAC;AACjB;AACA,gBAAgB,MAAM,CAAC,GAAG,CAAC;AAC3B,YAAY,EAAE;AACd,QAAQ,EAAE;AACV,QAAQ,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG;AAC/B,IAAI,IAAI;AACR,KAAK;AACL;AACA;;ACtBA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE,iBAAiB,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/G,QAAQ,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,GAAG;AAChG,QAAQ,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG;AAC/B,IAAI,IAAI;AACR,KAAK;AACL;;ACPA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE,sBAAsB,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AACpH,QAAQ,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,GAAG;AAC1G,QAAQ,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG;AAC/B,IAAI,IAAI;AACR,KAAK;AACL;;ACPA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,GAAG,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChF,QAAQ,MAAM,CAAC,CAAC;AAChB,YAAY,UAAU,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3C;AACA,gBAAgB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACzF,gBAAgB,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;AACvG,gBAAgB,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7G,gBAAgB,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC;AACzH;AACA,gBAAgB,MAAM,CAAC,OAAO,CAAC;AAC/B,YAAY,CAAC;AACb,QAAQ,EAAE;AACV,IAAI,IAAI;AACR,KAAK;AACL;;AChBA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,GAAG,SAAS,EAAE,iBAAiB,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;AACjH,QAAQ,MAAM,CAAC,CAAC;AAChB,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;AAC1B,YAAY,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE;AACnC,YAAY,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACrD,gBAAgB,GAAG,CAAC,WAAW,CAAC;AAChC,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACvD,oBAAoB,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE;AAC5E,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC;AACxB,oBAAoB,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;AACrD,gBAAgB,CAAC;AACjB,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACpD,oBAAoB,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE;AACrE,gBAAgB,CAAC;AACjB,gBAAgB,MAAM,CAAC,WAAW,CAAC;AACnC,YAAY,EAAE;AACd,YAAY,OAAO,CAAC,CAAC,IAAI,CAAC;AAC1B,YAAY,KAAK,CAAC,CAAC,IAAI,CAAC;AACxB,YAAY,UAAU,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3E,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChD,oBAAoB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;AACrC;AACA,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1E,wBAAwB,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;AACrE,oBAAoB,CAAC;AACrB;AACA,oBAAoB,MAAM,CAAC,OAAO,CAAC;AACnC,gBAAgB,EAAE;AAClB;AACA,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC5C,oBAAoB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;AACjC;AACA,oBAAoB,GAAG,CAAC,QAAQ,CAAC;AACjC,oBAAoB,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACnE,wBAAwB,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9E,4BAA4B,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;AAClE,wBAAwB,CAAC,CAAC,IAAI,CAAC,CAAC;AAChC,4BAA4B,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AAC7E,wBAAwB,CAAC;AACzB,oBAAoB,CAAC;AACrB;AACA,oBAAoB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AACnC,wBAAwB,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7C,4BAA4B,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;AACrE,wBAAwB,CAAC,CAAC,IAAI,CAAC,CAAC;AAChC,4BAA4B,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE;AAChE,wBAAwB,CAAC;AACzB;AACA,wBAAwB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;AAC3D,oBAAoB,CAAC;AACrB;AACA,oBAAoB,MAAM,CAAC,GAAG,CAAC;AAC/B,gBAAgB,EAAE;AAClB;AACA,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,iBAAiB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE;AAC9G,gBAAgB,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AACnD,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE;AACtH,gBAAgB,GAAG;AACnB,YAAY,EAAE;AACd,QAAQ,EAAE;AACV,IAAI,IAAI;AACR,KAAK;AACL;;AChEA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG,SAAS,EAAE,qBAAqB,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACzI,QAAQ,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,GAAG;AACvG,QAAQ,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AAC/C,YAAY,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,kBAAkB,GAAG;AAC/D;AACA,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACjD,gBAAgB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;AAC7B;AACA,gBAAgB,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AACvC,oBAAoB,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/G,oBAAoB,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;AACxH,gBAAgB,CAAC;AACjB;AACA,gBAAgB,MAAM,CAAC,GAAG,CAAC;AAC3B,YAAY,EAAE;AACd,QAAQ,EAAE;AACV,QAAQ,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG;AAC/B,IAAI,IAAI;AACR,KAAK;AACL;;ACrBA,CAAC,QAAQ,EAAE,CAAC,CAAC;AACb,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG,UAAU,EAAE,qBAAqB,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AACnG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvC,YAAY,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE;AACnE,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACvC,gBAAgB,MAAM,CAAC,MAAM,CAAC;AAC9B,YAAY,CAAC;AACb,YAAY,EAAE,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACnE,gBAAgB,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,eAAe,EAAE,KAAK,CAAC,MAAM,EAAE;AAC3E,YAAY,CAAC;AACb,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACvC,gBAAgB,MAAM,CAAC,MAAM,CAAC;AAC9B,YAAY,CAAC;AACb,YAAY,MAAM,CAAC,MAAM,CAAC;AAC1B,QAAQ,EAAE;AACV;AACA,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC9C,YAAY,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,EAAE;AACjF,YAAY,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9C,gBAAgB,MAAM,CAAC,GAAG,SAAS,MAAM;AACzC,YAAY,CAAC;AACb,YAAY,MAAM,CAAC,aAAa,CAAC;AACjC,QAAQ,EAAE;AACV;AACA,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtC,YAAY,MAAM,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE;AAC7D,QAAQ,EAAE;AACV,IAAI,IAAI;AACR,KAAK;AACL;;AC9BA,CAAC,QAAQ,EAAE,CAAC,CAAC;AACb,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG,UAAU,EAAE,wBAAwB,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AACtG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtC,YAAY,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;AAChE;AACA,YAAY,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE;AACzE,YAAY,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC1C,gBAAgB,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;AACpE,YAAY,CAAC;AACb;AACA,YAAY,MAAM,CAAC,KAAK,CAAC;AACzB,QAAQ,EAAE;AACV;AACA,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC3C,YAAY,GAAG,CAAC,OAAO,CAAC;AACxB,YAAY,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;AAClD,gBAAgB,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,EAAE;AACzE,YAAY,CAAC;AACb,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1E,gBAAgB,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;AACnD,YAAY,CAAC;AACb,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACxC,gBAAgB,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE;AACrE,YAAY,CAAC;AACb,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1E,gBAAgB,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG;AACnF,YAAY,CAAC;AACb,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACpF,gBAAgB,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC;AACrD,YAAY,CAAC;AACb,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACxC,gBAAgB,MAAM,CAAC,GAAG,QAAQ,MAAM;AACxC,YAAY,CAAC;AACb,YAAY,MAAM,CAAC,OAAO,CAAC;AAC3B,QAAQ,EAAE;AACV,IAAI,IAAI;AACR,KAAK;AACL;;ACtCA,CAAC,QAAQ,EAAE,CAAC,CAAC;AACb,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,GAAG,SAAS,EAAE,YAAY,EAAE,CAAC,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;AACvP,QAAQ,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;AAC9D;AACA,QAAQ,MAAM,CAAC,CAAC;AAChB,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;AAC1B,YAAY,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AACrD,gBAAgB,GAAG,CAAC,WAAW,CAAC;AAChC,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACvD,oBAAoB,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE;AACvE,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC;AACxB,oBAAoB,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;AACrD,gBAAgB,CAAC;AACjB,gBAAgB,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACpD,oBAAoB,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE;AACrE,gBAAgB,CAAC;AACjB,gBAAgB,MAAM,CAAC,WAAW,CAAC;AACnC,YAAY,EAAE;AACd,YAAY,KAAK,CAAC,CAAC,IAAI,CAAC;AACxB,YAAY,OAAO,CAAC,CAAC,IAAI,CAAC;AAC1B,YAAY,UAAU,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAChG,gBAAgB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE;AACrE,gBAAgB,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC;AACzD,gBAAgB,GAAG,CAAC,kBAAkB,CAAC;AACvC,gBAAgB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACpC,gBAAgB,GAAG,CAAC,WAAW,CAAC;AAChC,gBAAgB,GAAG,CAAC,gBAAgB,CAAC;AACrC;AACA,gBAAgB,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACnD,oBAAoB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE;AACzC,oBAAoB,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,cAAc,EAAE,IAAI,GAAG,CAAC,EAAE,WAAW,CAAC;AACpH,gBAAgB,EAAE;AAClB;AACA,gBAAgB,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,oBAAoB,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;AAClE,oBAAoB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC;AAC3E,wBAAwB,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG;AACxF,wBAAwB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5B,wBAAwB,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG;AAC9D,wBAAwB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC;AACtD,oBAAoB,CAAC;AACrB,gBAAgB,EAAE;AAClB;AACA,gBAAgB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,oBAAoB,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACnC,oBAAoB,gBAAgB,CAAC,IAAI,GAAG;AAC5C;AACA,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5C;AACA,oBAAoB,CAAC,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;AAClD,wBAAwB,GAAG,CAAC,aAAa,CAAC;AAC1C,wBAAwB,EAAE,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC;AAC3D,4BAA4B,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,GAAG;AAC5D,4BAA4B,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,wBAAwB,CAAC;AACzB,wBAAwB,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,YAAY,CAAC;AACxE,wBAAwB,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;AAC5C,4BAA4B,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,GAAG;AACzD,wBAAwB,CAAC;AACzB,wBAAwB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,qBAAqB,GAAG;AACnF,wBAAwB,aAAa,CAAC,CAAC,EAAE;AACzC,oBAAoB,GAAG;AACvB,gBAAgB,EAAE;AAClB;AACA,gBAAgB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC9C,oBAAoB,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACpC,oBAAoB,gBAAgB,CAAC,MAAM,GAAG;AAC9C,oBAAoB,CAAC,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;AAClD,wBAAwB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AACjD,oBAAoB,GAAG;AACvB,gBAAgB,EAAE;AAClB;AACA,gBAAgB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AACtE,oBAAoB,EAAE,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;AAC7C,wBAAwB,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE;AAC5D,oBAAoB,CAAC;AACrB;AACA,oBAAoB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;AAClE,oBAAoB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;AACrE;AACA,oBAAoB,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAC7D,wBAAwB,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE;AAC/D,oBAAoB,CAAC;AACrB;AACA,oBAAoB,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAC5D,wBAAwB,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;AAC7D,oBAAoB,CAAC;AACrB;AACA,oBAAoB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE;AAC1H,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvF,wBAAwB,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAC1C,4BAA4B,kBAAkB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtE,gCAAgC,WAAW,CAAC,WAAW,EAAE;AACzD,4BAA4B,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE;AAChE,wBAAwB,CAAC,CAAC,IAAI,CAAC,CAAC;AAChC,4BAA4B,WAAW,CAAC,WAAW,EAAE;AACrD,wBAAwB,CAAC;AACzB,oBAAoB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC3C,wBAAwB,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAClD,4BAA4B,WAAW,GAAG;AAC1C,wBAAwB,CAAC;AACzB,oBAAoB,CAAC;AACrB,gBAAgB,EAAE;AAClB;AACA,gBAAgB,gBAAgB,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACtG,oBAAoB,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACnC,wBAAwB,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAChD,wBAAwB,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE;AACpD,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC;AAC5B,wBAAwB,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM;AACjE,wBAAwB,EAAE,CAAC;AAC3B,4BAA4B,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE;AAC/C,4BAA4B,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC/D,4BAA4B,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AAChE,4BAA4B,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACjE,4BAA4B,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG;AAC3D,wBAAwB,CAAC,CAAC,CAAC;AAC3B,4BAA4B,cAAc,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE;AACzD,wBAAwB,CAAC;AACzB;AACA,wBAAwB,aAAa,CAAC,CAAC,CAAC,OAAO,EAAE;AACjD,oBAAoB,CAAC;AACrB,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG;AAC9B;AACA,gBAAgB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAClD,oBAAoB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;AAClE,oBAAoB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;AACrE;AACA,oBAAoB,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAC7D,wBAAwB,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE;AAC/D,oBAAoB,CAAC;AACrB;AACA,oBAAoB,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAC5D,wBAAwB,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;AAC7D,oBAAoB,CAAC;AACrB;AACA,oBAAoB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE;AACnI,oBAAoB,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AACrE,gBAAgB,EAAE;AAClB;AACA,gBAAgB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChD,oBAAoB,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;AAClE,oBAAoB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;AACrE;AACA,oBAAoB,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAC7D,wBAAwB,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE;AAC/D,oBAAoB,CAAC;AACrB;AACA,oBAAoB,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAC5D,wBAAwB,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;AAC7D,oBAAoB,CAAC;AACrB;AACA,oBAAoB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE;AACnI,oBAAoB,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE;AACnE,gBAAgB,EAAE;AAClB;AACA,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AACjF,oBAAoB,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;AAC9C,gBAAgB,GAAG;AACnB;AACA,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,EAAE,UAAU,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAClF,oBAAoB,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;AAC9C,oBAAoB,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;AAC/C,gBAAgB,GAAG;AACnB;AACA,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,EAAE,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC/E,oBAAoB,cAAc,CAAC,KAAK,EAAE;AAC1C,gBAAgB,GAAG;AACnB;AACA,gBAAgB,EAAE,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;AAChE,oBAAoB,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACtF,wBAAwB,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,4BAA4B,cAAc,CAAC,IAAI,EAAE;AACjD,wBAAwB,CAAC;AACzB,oBAAoB,GAAG;AACvB;AACA,oBAAoB,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACpF,wBAAwB,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,4BAA4B,cAAc,CAAC,KAAK,EAAE;AAClD,wBAAwB,CAAC;AACzB,oBAAoB,GAAG;AACvB;AACA,oBAAoB,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACxF,wBAAwB,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,4BAA4B,cAAc,CAAC,IAAI,EAAE;AACjD,wBAAwB,CAAC;AACzB,oBAAoB,GAAG;AACvB;AACA,oBAAoB,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACtF,wBAAwB,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,4BAA4B,cAAc,CAAC,KAAK,EAAE;AAClD,wBAAwB,CAAC;AACzB,oBAAoB,GAAG;AACvB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC3C,oBAAoB,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG;AAC/E,oBAAoB,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE;AAChD,gBAAgB,CAAC;AACjB;AACA,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE;AACxF,gBAAgB,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AACnD,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE;AAChG,gBAAgB,GAAG;AACnB,YAAY,EAAE;AACd,QAAQ,EAAE;AACV,IAAI,IAAI;AACR,KAAK;AACL;;AClNA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,GAAG,SAAS,EAAE,iBAAiB,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAC7G,QAAQ,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,iBAAiB,GAAG;AACvD,QAAQ,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;AAC/B,QAAQ,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;AACxC,QAAQ,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG;AAC/B,IAAI,IAAI;AACR,KAAK;AACL;;ACTA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,GAAG,SAAS,EAAE,oBAAoB,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAChH,QAAQ,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,GAAG;AACpG,QAAQ,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG;AAC/B,IAAI,IAAI;AACR,KAAK;AACL;;ACPA,CAAC,QAAQ,EAAE,CAAC,CAAC;AACb,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU,EAAE,mBAAmB,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AACjJ,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG;AAC7B;AACA,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvC,YAAY,MAAM,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC;AAC7C,QAAQ,EAAE;AACV;AACA,QAAQ,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,GAAG;AACxC;AACA,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,UAAU,GAAG,uBAAuB,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAChG,YAAY,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE;AACpD;AACA,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;AAC/B,gBAAgB,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;AACvF,oBAAoB,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE;AAClD;AACA,oBAAoB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG;AACpC,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACjE,wBAAwB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,GAAG;AACzE,wBAAwB,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE,4BAA4B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG;AACvD,wBAAwB,CAAC;AACzB,oBAAoB,CAAC;AACrB;AACA,oBAAoB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,mBAAmB,EAAE;AACnG;AACA,oBAAoB,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,wBAAwB,EAAE,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D,4BAA4B,MAAM,CAAC,IAAI,CAAC;AACxC,wBAAwB,CAAC;AACzB;AACA,wBAAwB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE;AACrE;AACA,wBAAwB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACtE,4BAA4B,EAAE,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9E,gCAAgC,MAAM,CAAC,IAAI,CAAC;AAC5C,4BAA4B,CAAC;AAC7B,wBAAwB,CAAC;AACzB;AACA,wBAAwB,MAAM,CAAC,KAAK,CAAC;AACrC,oBAAoB,EAAE;AACtB;AACA,oBAAoB,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,qBAAqB,CAAC,CAAC,mBAAmB,EAAE;AACrG,gBAAgB,EAAE;AAClB,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC,UAAU,EAAE;AACnE,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC;AACpB,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC,KAAK,EAAE;AAC9D,YAAY,CAAC;AACb,QAAQ,GAAG;AACX;AACA,QAAQ,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AACvC,YAAY,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE;AAC/C,YAAY,KAAK,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC7C,gBAAgB,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;AACtE,oBAAoB,MAAM,CAAC,KAAK,CAAC;AACjC,gBAAgB,CAAC;AACjB,gBAAgB,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE;AACrD,YAAY,CAAC;AACb,YAAY,MAAM,CAAC,IAAI,CAAC;AACxB,QAAQ,EAAE;AACV;AACA,QAAQ,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACjD,YAAY,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9C,gBAAgB,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE;AACtC,YAAY,GAAG;AACf,QAAQ,EAAE;AACV;AACA,QAAQ,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,YAAY,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG;AAChC,YAAY,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG;AAC9B;AACA,YAAY,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAClC;AACA,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC/C,gBAAgB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG;AACvD,gBAAgB,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC9C,oBAAoB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG;AAC3C,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC;AACxB,oBAAoB,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AACrC,gBAAgB,CAAC;AACjB,YAAY,CAAC;AACb;AACA,YAAY,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAChD,gBAAgB,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE;AACrC,gBAAgB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE;AACpD;AACA;AACA,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpE,oBAAoB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvE,wBAAwB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE;AACjE,oBAAoB,GAAG;AACvB;AACA,oBAAoB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;AAC/D,wBAAwB,cAAc,CAAC,cAAc,CAAC,CAAC,GAAG;AAC1D,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB,YAAY,EAAE;AACd;AACA,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC/C,gBAAgB,cAAc,CAAC,QAAQ,CAAC,CAAC,GAAG;AAC5C,YAAY,CAAC;AACb;AACA,YAAY,MAAM,CAAC,UAAU,CAAC;AAC9B,QAAQ,EAAE;AACV,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE;AAC7D,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE;AAC/D;AACA,QAAQ,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC3C,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE;AACpE,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,kBAAkB,EAAE;AACtE,QAAQ,GAAG;AACX;AACA,QAAQ,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAClC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE;AACvF;AACA,YAAY,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG;AAC7C,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG;AAChD,YAAY,CAAC;AACb,QAAQ,EAAE;AACV;AACA,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE;AACzD,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE;AACtD;AACA,QAAQ,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9C,YAAY,GAAG,CAAC,GAAG,CAAC;AACpB,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5C,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE;AAC9D,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC;AACpB,gBAAgB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5B,YAAY,CAAC;AACb,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACpC,gBAAgB,MAAM,CAAC,SAAS,CAAC;AACjC,YAAY,CAAC;AACb,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC/C,gBAAgB,MAAM,CAAC,KAAK,CAAC;AAC7B,YAAY,CAAC;AACb,YAAY,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;AAClC,QAAQ,EAAE;AACV;AACA,QAAQ,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACzC,YAAY,GAAG,CAAC,GAAG,CAAC;AACpB,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5C,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE;AAC9D,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC;AACpB,gBAAgB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5B,YAAY,CAAC;AACb,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACpC,gBAAgB,MAAM,CAAC;AACvB,YAAY,CAAC;AACb;AACA,YAAY,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE;AAC3D,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;AACrC,gBAAgB,QAAQ,CAAC,MAAM,GAAG;AAClC,YAAY,CAAC;AACb,QAAQ,EAAE;AACV;AACA,QAAQ,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3C,YAAY,GAAG,CAAC,GAAG,CAAC;AACpB,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5C,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE;AAC9D,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC;AACpB,gBAAgB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5B,YAAY,CAAC;AACb,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACpC,gBAAgB,MAAM,CAAC;AACvB,YAAY,CAAC;AACb;AACA,YAAY,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE;AAC3D,YAAY,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;AACtC,gBAAgB,QAAQ,CAAC,MAAM,GAAG;AAClC,YAAY,CAAC;AACb,QAAQ,EAAE;AACV;AACA,QAAQ,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACvC,YAAY,MAAM,CAAC,SAAS,CAAC;AAC7B,QAAQ,EAAE;AACV;AACA,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC9C,YAAY,MAAM,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC;AACpD,QAAQ,EAAE;AACV;AACA,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE;AAC1E,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,cAAc,CAAC,CAAC,IAAI,EAAE;AACrF,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE;AAC3E,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE;AAC/E;AACA,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,GAAG;AAC5D;AACA,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE;AACpF;AACA,QAAQ,CAAC,KAAK,EAAE,eAAe,EAAE,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC9E,YAAY,OAAO,GAAG;AACtB,QAAQ,GAAG;AACX;AACA,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AACzC,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACpC,gBAAgB,MAAM,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;AACvC,YAAY,CAAC;AACb,YAAY,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE;AAC3C,QAAQ,EAAE;AACV;AACA,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AACvC,YAAY,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE;AACzC,QAAQ,EAAE;AACV;AACA,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG;AAC/B,IAAI,IAAI,UAAU,EAAE,qBAAqB,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AACzE,QAAQ,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtC,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG;AAC9D,QAAQ,EAAE;AACV;AACA,QAAQ,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACpC,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG;AAC5D,QAAQ,EAAE;AACV;AACA,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE;AACpF,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE;AAChF,IAAI,IAAI,UAAU,EAAE,uBAAuB,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AAC3E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAChE,QAAQ,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC3C,YAAY,MAAM,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE;AAClE,QAAQ,GAAG;AACX;AACA,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC3D,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC3B,gBAAgB,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG;AAC3D,gBAAgB,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC;AAC7F,gBAAgB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,YAAY,CAAC;AACtE;AACA,gBAAgB,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG;AAC9C,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAC3D,oBAAoB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE;AAC/C,oBAAoB,EAAE,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,wBAAwB,oBAAoB,CAAC,IAAI,CAAC,QAAQ,EAAE;AAC5D,oBAAoB,CAAC;AACrB,gBAAgB,CAAC;AACjB;AACA,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,oBAAoB,CAAC;AACnE,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC;AACpB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;AACvD,YAAY,CAAC;AACb,QAAQ,GAAG;AACX;AACA,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAChD,YAAY,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5F,QAAQ,EAAE;AACV;AACA,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AACtC,YAAY,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;AACzC,QAAQ,EAAE;AACV;AACA,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC3C,YAAY,EAAE,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACzD,gBAAgB,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC;AAChD,YAAY,CAAC;AACb,YAAY,EAAE,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AAC3D,gBAAgB,MAAM,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC;AAClD,YAAY,CAAC;AACb;AACA,YAAY,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG;AACnF,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;AACxC,gBAAgB,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI;AAC/C,YAAY,CAAC;AACb,YAAY,MAAM,CAAC,OAAO,CAAC;AAC3B,QAAQ,EAAE;AACV;AACA,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AACvD,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC7D,gBAAgB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC;AAC7D,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM;AAChG,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtE,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,QAAQ,EAAE;AAChG,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG;AACpD,gBAAgB,CAAC;AACjB,YAAY,CAAC;AACb,QAAQ,GAAG;AACX,IAAI,IAAI;AACR,KAAK;AACL;;ACzRA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,GAAG,SAAS,EAAE,aAAa,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;AAChI,QAAQ,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG;AACtF,QAAQ,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AAC/C,YAAY,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,kBAAkB,GAAG;AAC/D;AACA,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC9C,gBAAgB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;AAC7B;AACA,gBAAgB,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AACvC,oBAAoB,GAAG,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/G,oBAAoB,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;AACxH,gBAAgB,CAAC;AACjB;AACA,gBAAgB,MAAM,CAAC,GAAG,CAAC;AAC3B,YAAY,EAAE;AACd,QAAQ,EAAE;AACV,QAAQ,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG;AAC/B,IAAI,IAAI;AACR,KAAK;AACL;AACA;;ACtBA,CAAC,QAAQ,GAAG;AACZ,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;AACjB,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,GAAG,SAAS,EAAE,eAAe,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3G,QAAQ,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG;AAC1F,QAAQ,MAAM,CAAC,OAAO,CAAC,KAAK,GAAG;AAC/B,IAAI,IAAI;AACR,KAAK;AACL;;ACPA,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;AAC9F,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE;AAC7D,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACtG,QAAQ,IAAI;AACZ,IAAI;;ACJJ,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;AACpG;AACA,IAAI;;ACFJ,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;AAChG;AACA,IAAI;;ACFJ,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;AAC9F,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE;AAC5D,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,oBAAoB,GAAG,CAAC,CAAC,CAAC,CAAC;AACxD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACpG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7G,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACxB,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC/H,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3F,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACxB,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE,SAAS,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;AACrD,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,KAAK,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAC3G,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACpE,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACrE,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACtE,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACvE,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACxB,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACpB,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;AACd,QAAQ,IAAI;AACZ,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE;AAC/D,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;AACxF,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;AACjE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3D,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;AACjE,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACpB,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;AACd,QAAQ,IAAI;AACZ,IAAI;;AC5BJ,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;AAC9F,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE;AAC7D,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC;AACvE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;AACtD,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AAClG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,QAAQ,CAAC,iBAAiB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AACvE,QAAQ,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3D,QAAQ,CAAC,iBAAiB,EAAE,CAAC,KAAK,KAAK,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;AACzE,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACtF,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAChC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5B,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACxB,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACpB,QAAQ,IAAI;AACZ,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE;AAC/D,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AAC/C,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACpH,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;AAC9E,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACvM,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5B,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACxB,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACpB,QAAQ,IAAI;AACZ,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE;AACpE,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AACrD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AACvC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AACxC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACrC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACtC,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACpB,QAAQ,IAAI;AACZ,IAAI;;AChCJ,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;AAC/F;AACA,IAAI;;ACFJ,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;AAC/F;AACA,IAAI;;ACFJ,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;AAChG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE;AACjE,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1G,QAAQ,IAAI;AACZ,IAAI;;ACJJ,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;AACpG;AACA,IAAI;;ACFJ,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;AAChG;AACA,IAAI;;ACFJ,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;AAC7F,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE;AAClE,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;AACpD,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;AACd,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,qBAAqB,GAAG,CAAC,CAAC,CAAC,CAAC;AACjJ,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;AACd,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AACtG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AACjJ,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,gBAAgB,MAAM,CAAC,CAAC,CAAC,CAAC;AAC3G,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAChC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5B,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;AACd,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,CAAC,CAAC,CAAC,CAAC;AACpF,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9D,QAAQ,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,wBAAwB,GAAG,CAAC,CAAC,CAAC,CAAC;AAC3K,QAAQ,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,KAAK,KAAK,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;AACvK,QAAQ,CAAC,wBAAwB,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAC1E,QAAQ,CAAC,4BAA4B,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;AAC5E,QAAQ,CAAC,gCAAgC,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9H,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAChD,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5C,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACxC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACpC,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAChC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5B,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;AACd,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACxB,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACpB,QAAQ,IAAI;AACZ,IAAI;;AC7BJ,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;AAChG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE;AAC5D,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3B,QAAQ,CAAC,KAAK,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1C,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;AACtC,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC;AACnG,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AACnG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;AACvD,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/E,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACxB,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACpB,QAAQ,IAAI;AACZ,IAAI;;ACZJ,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;AAC5F,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE;AAChE,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,UAAU,EAAE,mBAAmB,GAAG,CAAC,CAAC,CAAC,CAAC;AACvF,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AACrC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AACtC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACnC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACpC,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACpB,QAAQ,IAAI;AACZ,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE;AACzD,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC;AACrE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;AACtD,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC;AAC9D,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AACvE,QAAQ,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3D,QAAQ,CAAC,iBAAiB,EAAE,CAAC,KAAK,KAAK,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AACxE,QAAQ,CAAC,iBAAiB,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;AACtG,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACpC,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAChC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5B,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;AAC3I,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;AACxF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1E,QAAQ,CAAC,oBAAoB,EAAE,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;AAC3F,QAAQ,CAAC,gBAAgB,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACnC,QAAQ,CAAC,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/B,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5B,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACxB,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACpB,QAAQ,IAAI;AACZ,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE;AACjE,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,UAAU,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1D,QAAQ,CAAC,KAAK,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3D,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/C,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,KAAK,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;AAC7D,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AACtD,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;AACxD,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3E,QAAQ,CAAC,eAAe,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACxE,QAAQ,CAAC,eAAe,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;AAClH,QAAQ,CAAC,eAAe,EAAE,CAAC,KAAK,GAAG,kBAAkB,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/E,QAAQ,CAAC,gBAAgB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACxF,QAAQ,CAAC,gBAAgB,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;AACzC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7G,QAAQ,CAAC,gBAAgB,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChH,QAAQ,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9B,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,MAAM,CAAC,CAAC,CAAC,CAAC;AACpH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5B,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACxB,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACpB,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;AACvF,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACnE,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1F,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACvB,QAAQ,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AACnB,QAAQ,IAAI;AACZ,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE;AAC3D,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AACrG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,gBAAgB,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAChO,QAAQ,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AACpB,QAAQ,IAAI;AACZ,IAAI","file":"angular-gantt-plugins.js","sourcesContent":["(function(){\n 'use strict';\n angular.module('gantt.bounds', ['gantt', 'gantt.bounds.templates']).directive('ganttBounds', ['moment', '$compile', '$document', function(moment, $compile, $document) {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.bounds) === 'object') {\n for (var option in scope.options.bounds) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n api.directives.on.new(scope, function(directiveName, taskScope, taskElement) {\n if (directiveName === 'ganttTask') {\n var boundsScope = taskScope.$new();\n boundsScope.pluginScope = scope;\n\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'task.model.est && task.model.lct && pluginScope.enabled');\n var boundsElement = $document[0].createElement('gantt-task-bounds');\n if (attrs.templateUrl !== undefined) {\n angular.element(boundsElement).attr('data-template-url', attrs.templateUrl);\n }\n if (attrs.template !== undefined) {\n angular.element(boundsElement).attr('data-template', attrs.template);\n }\n angular.element(ifElement).append(boundsElement);\n taskElement.append($compile(ifElement)(boundsScope));\n }\n });\n\n api.tasks.on.clean(scope, function(model) {\n if (model.est !== undefined && !moment.isMoment(model.est)) {\n model.est = moment(model.est); //Earliest Start Time\n }\n if (model.lct !== undefined && !moment.isMoment(model.lct)) {\n model.lct = moment(model.lct); //Latest Completion Time\n }\n });\n }\n };\n }]);\n}());\n\n","(function() {\n 'use strict';\n angular.module('gantt.dependencies', ['gantt', 'gantt.dependencies.templates']).directive('ganttDependencies', ['$timeout', '$document', 'ganttDebounce', 'GanttDependenciesManager', function($timeout, $document, debounce, DependenciesManager) {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n jsPlumbDefaults: '=?',\n endpoints: '=?',\n fallbackEndpoints: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.dependencies) === 'object') {\n for (var option in scope.options.dependencies) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.jsPlumbDefaults === undefined) {\n // https://jsplumbtoolkit.com/community/doc/defaults.html\n scope.jsPlumbDefaults = {\n Endpoint: ['Dot', {radius: 4}],\n EndpointStyle: {fillStyle: '#456', strokeStyle: '#456', lineWidth: 1},\n Connector: 'Flowchart',\n ConnectionOverlays: [['Arrow', {location: 1, length: 12, width: 12}]]\n };\n }\n\n function createLeftOverlay() {\n return angular.element('<span><span class=\"gantt-endpoint-overlay start-endpoint arrow-right\"></span></span>');\n }\n\n function createRightOverlay() {\n return angular.element('<span><span class=\"gantt-endpoint-overlay end-endpoint arrow-right\"></span></span>');\n }\n\n function createLeftFallbackOverlay() {\n return angular.element('<span><span class=\"gantt-endpoint-overlay start-endpoint fallback-endpoint\"></span></span>');\n }\n\n function createRightFallbackOverlay() {\n return angular.element('<span><span class=\"gantt-endpoint-overlay end-endpoint fallback-endpoint\"></span></span>');\n }\n\n if (scope.endpoints === undefined) {\n scope.endpoints = [\n {\n anchor: 'Left',\n isSource: false,\n isTarget: true,\n maxConnections: -1,\n cssClass: 'gantt-endpoint start-endpoint target-endpoint',\n overlays: [\n ['Custom', {create: createLeftOverlay}]\n ]\n\n },\n {\n anchor: 'Right',\n isSource: true,\n isTarget: false,\n maxConnections: -1,\n cssClass: 'gantt-endpoint end-endpoint source-endpoint',\n overlays: [\n ['Custom', {create: createRightOverlay}]\n ]\n }\n ];\n }\n\n if (scope.fallbackEndpoints === undefined) {\n scope.fallbackEndpoints = [\n {\n endpoint: 'Blank',\n anchor: 'Left',\n isSource: false,\n isTarget: true,\n maxConnections: 0,\n cssClass: 'gantt-endpoint start-endpoint fallback-endpoint',\n overlays: [\n ['Custom', {create: createLeftFallbackOverlay}]\n ]\n },\n {\n endpoint: 'Blank',\n anchor: 'Right',\n isSource: true,\n isTarget: false,\n maxConnections: 0,\n cssClass: 'gantt-endpoint end-endpoint fallback-endpoint',\n overlays: [\n ['Custom', {create: createRightFallbackOverlay}]\n ]\n }\n ];\n }\n\n var manager = new DependenciesManager(ganttCtrl.gantt, scope, api);\n\n api.directives.on.new(scope, function(directiveName, directiveScope, directiveElement) {\n if (directiveName === 'ganttBody') {\n manager.plumb.setContainer(directiveElement);\n }\n });\n\n api.tasks.on.add(scope, function(task) {\n manager.addDependenciesFromTask(task);\n });\n\n api.tasks.on.remove(scope, function(task) {\n manager.removeDependenciesFromTask(task);\n });\n\n api.tasks.on.displayed(scope, debounce(function(tasks) {\n manager.setTasks(tasks);\n manager.refresh();\n }));\n\n api.rows.on.displayed(scope, function() {\n manager.refresh();\n });\n\n api.tasks.on.viewChange(scope, function(task) {\n if (task.$element) {\n manager.plumb.revalidate(task.$element[0]);\n }\n });\n\n api.tasks.on.viewRowChange(scope, function(task) {\n manager.setTask(task);\n });\n\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.drawtask', ['gantt']).directive('ganttDrawTask', ['$document', 'ganttMouseOffset', 'ganttUtils', 'moment', function(document, mouseOffset, utils, moment) {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n moveThreshold: '=?',\n taskModelFactory: '=?taskFactory'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.moveThreshold === undefined) {\n scope.moveThreshold = 0;\n }\n\n if (scope.taskModelFactory === undefined) {\n scope.taskModelFactory = function() {\n return {}; // New empty task.\n };\n }\n\n api.directives.on.new(scope, function(directiveName, directiveScope, element) {\n if (directiveName === 'ganttRow') {\n var addNewTask = function(x) {\n var startDate = api.core.getDateByPosition(x, true);\n var endDate = moment(startDate);\n\n var taskModel = scope.taskModelFactory();\n taskModel.from = startDate;\n taskModel.to = endDate;\n\n var task = directiveScope.row.addTask(taskModel);\n task.isResizing = true;\n task.updatePosAndSize();\n directiveScope.row.updateVisibleTasks();\n\n directiveScope.row.$scope.$digest();\n };\n\n var deferDrawing = function(startX) {\n var moveTrigger = function(evt) {\n var currentX = mouseOffset.getOffset(evt).x;\n\n if (Math.abs(startX - currentX) >= scope.moveThreshold) {\n element.off('mousemove', moveTrigger);\n addNewTask(startX);\n }\n };\n\n element.on('mousemove', moveTrigger);\n document.one('mouseup', function() {\n element.off('mousemove', moveTrigger);\n });\n };\n\n var drawHandler = function(evt) {\n var evtTarget = (evt.target ? evt.target : evt.srcElement);\n var enabled = angular.isFunction(scope.enabled) ? scope.enabled(evt): scope.enabled;\n if (enabled && evtTarget.className.indexOf('gantt-row') > -1) {\n var x = mouseOffset.getOffset(evt).x;\n\n if (scope.moveThreshold === 0) {\n addNewTask(x, x);\n } else {\n deferDrawing(x);\n }\n }\n };\n\n element.on('mousedown', drawHandler);\n directiveScope.drawTaskHandler = drawHandler;\n }\n });\n\n api.directives.on.destroy(scope, function(directiveName, directiveScope, element) {\n if (directiveName === 'ganttRow') {\n element.off('mousedown', directiveScope.drawTaskHandler);\n delete directiveScope.drawTaskHandler;\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.groups', ['gantt', 'gantt.groups.templates']).directive('ganttGroups', ['ganttUtils', 'GanttHierarchy', '$compile', '$document', function(utils, Hierarchy, $compile, $document) {\n // Provides the row sort functionality to any Gantt row\n // Uses the sortableState to share the current row\n\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n display: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.sortable) === 'object') {\n for (var option in scope.options.sortable) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.display === undefined) {\n scope.display = 'group';\n }\n\n scope.hierarchy = new Hierarchy();\n\n function refresh() {\n scope.hierarchy.refresh(ganttCtrl.gantt.rowsManager.filteredRows);\n }\n\n ganttCtrl.gantt.api.registerMethod('groups', 'refresh', refresh, this);\n ganttCtrl.gantt.$scope.$watchCollection('gantt.rowsManager.filteredRows', function() {\n refresh();\n });\n\n api.directives.on.new(scope, function(directiveName, rowScope, rowElement) {\n if (directiveName === 'ganttRow') {\n var taskGroupScope = rowScope.$new();\n taskGroupScope.pluginScope = scope;\n\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'pluginScope.enabled');\n\n var taskGroupElement = $document[0].createElement('gantt-task-group');\n if (attrs.templateUrl !== undefined) {\n angular.element(taskGroupElement).attr('data-template-url', attrs.templateUrl);\n }\n if (attrs.template !== undefined) {\n angular.element(taskGroupElement).attr('data-template', attrs.template);\n }\n\n angular.element(ifElement).append(taskGroupElement);\n\n rowElement.append($compile(ifElement)(taskGroupScope));\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.labels', ['gantt', 'gantt.labels.templates']).directive('ganttLabels', ['ganttUtils', '$compile', '$document', '$log', function(utils, $compile, $document, $log) {\n // Provides the row sort functionality to any Gantt row\n // Uses the sortableState to share the current row\n\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n header: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n $log.warn('Angular Gantt Labels plugin is deprecated. Please use Table plugin instead.');\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.sortable) === 'object') {\n for (var option in scope.options.sortable) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.header === undefined) {\n scope.header = 'Name';\n }\n\n api.directives.on.new(scope, function(directiveName, sideContentScope, sideContentElement) {\n if (directiveName === 'ganttSideContent') {\n var labelsScope = sideContentScope.$new();\n labelsScope.pluginScope = scope;\n\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'pluginScope.enabled');\n angular.element(ifElement).addClass('side-element');\n\n var labelsElement = $document[0].createElement('gantt-side-content-labels');\n angular.element(ifElement).append(labelsElement);\n\n sideContentElement.append($compile(ifElement)(labelsScope));\n }\n });\n\n function fitSideWidthToLabels() {\n var labels = ganttCtrl.gantt.side.$element[0].getElementsByClassName('gantt-row-label');\n var newSideWidth = 0;\n\n for (var i=0; i<labels.length; i++) {\n var width = labels[i].children[0].offsetWidth;\n newSideWidth = Math.max(newSideWidth, width);\n }\n\n if (newSideWidth >= 0) {\n api.side.setWidth(newSideWidth);\n }\n }\n\n api.registerMethod('labels', 'fitSideWidth', fitSideWidthToLabels, this);\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n\n /* jshint latedef: false */\n angular.module('gantt.movable', ['gantt']).directive('ganttMovable', ['ganttMouseButton', 'ganttMouseOffset', 'ganttSmartEvent', 'ganttMovableOptions', 'ganttUtils', 'ganttDom', '$window', '$document', '$timeout',\n function(mouseButton, mouseOffset, smartEvent, movableOptions, utils, dom, $window, $document, $timeout) {\n // Provides moving and resizing of tasks\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n allowMoving: '=?',\n allowResizing: '=?',\n allowRowSwitching: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.movable) === 'object') {\n for (var option in scope.options.movable) {\n scope[option] = scope.options[option];\n }\n }\n\n movableOptions.initialize(scope);\n\n api.registerEvent('tasks', 'move');\n api.registerEvent('tasks', 'moveBegin');\n api.registerEvent('tasks', 'moveEnd');\n api.registerEvent('tasks', 'resize');\n api.registerEvent('tasks', 'resizeBegin');\n api.registerEvent('tasks', 'resizeEnd');\n api.registerEvent('tasks', 'change');\n\n var _hasTouch = ('ontouchstart' in $window) || $window.DocumentTouch && $document[0] instanceof $window.DocumentTouch;\n var _pressEvents = 'touchstart mousedown';\n var _moveEvents = 'touchmove mousemove';\n var _releaseEvents = 'touchend mouseup';\n\n var taskWithSmallWidth = 15;\n var resizeAreaWidthBig = 5;\n var resizeAreaWidthSmall = 3;\n var scrollSpeed = 15;\n var scrollTriggerDistance = 5;\n var mouseStartOffsetX;\n var moveStartX;\n\n api.directives.on.new(scope, function(directiveName, taskScope, taskElement) {\n if (directiveName === 'ganttTask') {\n var windowElement = angular.element($window);\n var ganttBodyElement = taskScope.row.rowsManager.gantt.body.$element;\n var ganttScrollElement = taskScope.row.rowsManager.gantt.scroll.$element;\n\n var taskHasBeenChanged = false;\n var taskHasBeenMovedFromAnotherRow = false;\n var scrollInterval;\n\n var foregroundElement = taskScope.task.getForegroundElement();\n\n // IE<11 doesn't support `pointer-events: none`\n // So task content element must be added to support moving properly.\n var contentElement = taskScope.task.getContentElement();\n\n var onPressEvents = function(evt) {\n evt.preventDefault();\n if (_hasTouch) {\n evt = mouseOffset.getTouch(evt);\n }\n var taskMovable = taskScope.task.model.movable;\n var rowMovable = taskScope.task.row.model.movable;\n\n if (typeof(taskMovable) === 'boolean' || angular.isFunction(taskMovable)) {\n taskMovable = {enabled: taskMovable};\n }\n\n if (typeof(rowMovable) === 'boolean' || angular.isFunction(rowMovable)) {\n rowMovable = {enabled: rowMovable};\n }\n\n var enabledValue = utils.firstProperty([taskMovable, rowMovable], 'enabled', scope.enabled);\n var enabled = angular.isFunction(enabledValue) ? enabledValue(evt, taskScope.task): enabledValue;\n if (enabled) {\n var taskOffsetX = mouseOffset.getOffsetForElement(foregroundElement[0], evt).x;\n var mode = getMoveMode(taskOffsetX);\n if (mode !== '' && mouseButton.getButton(evt) === 1) {\n var bodyOffsetX = mouseOffset.getOffsetForElement(ganttBodyElement[0], evt).x;\n enableMoveMode(mode, bodyOffsetX);\n }\n taskScope.$digest();\n }\n };\n foregroundElement.on(_pressEvents, onPressEvents);\n contentElement.on(_pressEvents, onPressEvents);\n\n var onMousemove = function (evt) {\n var taskMovable = taskScope.task.model.movable;\n var rowMovable = taskScope.task.row.model.movable;\n\n if (typeof(taskMovable) === 'boolean' || angular.isFunction(taskMovable)) {\n taskMovable = {enabled: taskMovable};\n }\n\n if (typeof(rowMovable) === 'boolean' || angular.isFunction(rowMovable)) {\n rowMovable = {enabled: rowMovable};\n }\n\n var enabledValue = utils.firstProperty([taskMovable, rowMovable], 'enabled', scope.enabled);\n var enabled = angular.isFunction(enabledValue) ? enabledValue(evt, taskScope.task): enabledValue;\n if (enabled && !taskScope.task.isMoving) {\n var taskOffsetX = mouseOffset.getOffsetForElement(foregroundElement[0], evt).x;\n var mode = getMoveMode(taskOffsetX);\n if (mode !== '' && mode !== 'M') {\n foregroundElement.css('cursor', getCursor(mode));\n contentElement.css('cursor', getCursor(mode));\n } else {\n foregroundElement.css('cursor', '');\n contentElement.css('cursor', '');\n }\n }\n };\n foregroundElement.on('mousemove', onMousemove);\n contentElement.on('mousemove', onMousemove);\n\n var handleMove = function(evt) {\n if (taskScope.task.isMoving && !taskScope.destroyed) {\n clearScrollInterval();\n moveTask(evt);\n scrollScreen(evt);\n }\n };\n\n var moveTask = function(evt) {\n var oldTaskHasBeenChanged = taskHasBeenChanged;\n\n var mousePos = mouseOffset.getOffsetForElement(ganttBodyElement[0], evt);\n var x = mousePos.x;\n taskScope.task.mouseOffsetX = x;\n var taskOutOfRange = taskScope.task.row.rowsManager.gantt.options.value('taskOutOfRange');\n\n var taskMovable = taskScope.task.model.movable;\n var rowMovable = taskScope.task.row.model.movable;\n\n if (typeof(taskMovable) === 'boolean' || angular.isFunction(taskMovable)) {\n taskMovable = {enabled: taskMovable};\n }\n\n if (typeof(rowMovable) === 'boolean' || angular.isFunction(rowMovable)) {\n rowMovable = {enabled: rowMovable};\n }\n\n if (taskScope.task.moveMode === 'M') {\n var allowRowSwitching = utils.firstProperty([taskMovable, rowMovable], 'allowRowSwitching', scope.allowRowSwitching);\n if (allowRowSwitching) {\n var scrollRect = ganttScrollElement[0].getBoundingClientRect();\n var rowCenterLeft = scrollRect.left + scrollRect.width / 2;\n var ganttBody = angular.element($document[0].querySelectorAll('.gantt-body'));\n ganttBody.css('pointer-events', 'auto'); // pointer-events must be enabled for following to work.\n var targetRowElement = dom.findElementFromPoint(rowCenterLeft, evt.clientY, function(element) {\n return angular.element(element).hasClass('gantt-row');\n });\n ganttBody.css('pointer-events', '');\n\n var rows = ganttCtrl.gantt.rowsManager.rows;\n var targetRow;\n for (var i= 0, l=rows.length; i<l; i++) {\n if (targetRowElement === rows[i].$element[0]) {\n targetRow = rows[i];\n break;\n }\n }\n\n var sourceRow = taskScope.task.row;\n\n if (targetRow !== undefined && sourceRow !== targetRow) {\n targetRow.moveTaskToRow(taskScope.task, true);\n taskHasBeenChanged = true;\n }\n }\n\n var allowMoving = utils.firstProperty([taskMovable, rowMovable], 'allowMoving', scope.allowMoving);\n if (allowMoving) {\n x = x - mouseStartOffsetX;\n\n if (taskOutOfRange !== 'truncate') {\n if (x < 0) {\n x = 0;\n } else if (x + taskScope.task.width >= taskScope.gantt.width) {\n x = taskScope.gantt.width - taskScope.task.width;\n }\n }\n\n taskScope.task.moveTo(x, true);\n taskScope.$digest();\n\n if (taskHasBeenChanged) {\n taskScope.row.rowsManager.gantt.api.tasks.raise.move(taskScope.task);\n }\n taskHasBeenChanged = true;\n }\n } else if (taskScope.task.moveMode === 'E') {\n if (x <= taskScope.task.left) {\n x = taskScope.task.left;\n taskScope.task.moveMode = 'W';\n setGlobalCursor(getCursor(taskScope.task.moveMode ));\n }\n\n if (taskOutOfRange !== 'truncate' && x >= taskScope.gantt.width) {\n x = taskScope.gantt.width;\n }\n\n taskScope.task.setTo(x, true);\n taskScope.$digest();\n\n if (taskHasBeenChanged) {\n taskScope.row.rowsManager.gantt.api.tasks.raise.resize(taskScope.task);\n }\n taskHasBeenChanged = true;\n } else {\n if (x > taskScope.task.left + taskScope.task.width) {\n x = taskScope.task.left + taskScope.task.width;\n taskScope.task.moveMode = 'E';\n setGlobalCursor(getCursor(taskScope.task.moveMode ));\n }\n\n if (taskOutOfRange !== 'truncate' && x < 0) {\n x = 0;\n }\n\n taskScope.task.setFrom(x, true);\n taskScope.$digest();\n\n if (taskHasBeenChanged) {\n taskScope.row.rowsManager.gantt.api.tasks.raise.resize(taskScope.task);\n }\n taskHasBeenChanged = true;\n }\n\n if (!oldTaskHasBeenChanged && taskHasBeenChanged && !taskHasBeenMovedFromAnotherRow) {\n var backgroundElement = taskScope.task.getBackgroundElement();\n if (taskScope.task.moveMode === 'M') {\n backgroundElement.addClass('gantt-task-moving');\n taskScope.row.rowsManager.gantt.api.tasks.raise.moveBegin(taskScope.task);\n } else {\n backgroundElement.addClass('gantt-task-resizing');\n taskScope.row.rowsManager.gantt.api.tasks.raise.resizeBegin(taskScope.task);\n }\n }\n };\n\n var scrollScreen = function(evt) {\n var mousePos = mouseOffset.getOffsetForElement(ganttBodyElement[0], evt);\n var leftScreenBorder = ganttScrollElement[0].scrollLeft;\n var screenWidth = ganttScrollElement[0].offsetWidth;\n var scrollWidth = ganttScrollElement[0].scrollWidth;\n var rightScreenBorder = leftScreenBorder + screenWidth;\n var keepOnScrolling = false;\n\n if (mousePos.x < moveStartX) {\n // Scroll to the left\n if (leftScreenBorder > 0 && mousePos.x <= leftScreenBorder + scrollTriggerDistance) {\n mousePos.x -= scrollSpeed;\n keepOnScrolling = true;\n taskScope.row.rowsManager.gantt.api.scroll.left(scrollSpeed);\n }\n } else {\n // Scroll to the right\n if (rightScreenBorder < scrollWidth && mousePos.x >= rightScreenBorder - scrollTriggerDistance) {\n mousePos.x += scrollSpeed;\n keepOnScrolling = true;\n taskScope.row.rowsManager.gantt.api.scroll.right(scrollSpeed);\n }\n }\n\n if (keepOnScrolling) {\n scrollInterval = $timeout(function() {\n handleMove(evt);\n }, 100, true);\n }\n };\n\n var clearScrollInterval = function() {\n if (scrollInterval !== undefined) {\n $timeout.cancel(scrollInterval);\n scrollInterval = undefined;\n }\n };\n\n var getMoveMode = function(x) {\n var distance = 0;\n\n\n var taskMovable = taskScope.task.model.movable;\n var rowMovable = taskScope.task.row.model.movable;\n\n if (typeof(taskMovable) === 'boolean') {\n taskMovable = {enabled: taskMovable};\n }\n\n if (typeof(rowMovable) === 'boolean') {\n rowMovable = {enabled: rowMovable};\n }\n\n var allowResizing = utils.firstProperty([taskMovable, rowMovable], 'allowResizing', scope.allowResizing);\n var allowRowSwitching = utils.firstProperty([taskMovable, rowMovable], 'allowRowSwitching', scope.allowRowSwitching);\n var allowMoving = utils.firstProperty([taskMovable, rowMovable], 'allowMoving', scope.allowMoving);\n\n // Define resize&move area. Make sure the move area does not get too small.\n if (allowResizing) {\n distance = foregroundElement[0].offsetWidth < taskWithSmallWidth ? resizeAreaWidthSmall : resizeAreaWidthBig;\n }\n\n if (allowResizing && x > foregroundElement[0].offsetWidth - distance) {\n return 'E';\n } else if (allowResizing && x < distance) {\n return 'W';\n } else if ((allowMoving || allowRowSwitching) && x >= distance && x <= foregroundElement[0].offsetWidth - distance) {\n return 'M';\n } else {\n return '';\n }\n };\n\n var getCursor = function(mode) {\n switch (mode) {\n case 'E':\n return 'e-resize';\n case 'W':\n return 'w-resize';\n case 'M':\n return 'move';\n }\n };\n\n var setGlobalCursor = function(cursor) {\n taskElement.css('cursor', cursor);\n angular.element($document[0].body).css({\n '-moz-user-select': cursor === '' ? '': '-moz-none',\n '-webkit-user-select': cursor === '' ? '': 'none',\n '-ms-user-select': cursor === '' ? '': 'none',\n 'user-select': cursor === '' ? '': 'none',\n 'cursor': cursor\n });\n };\n\n var enableMoveMode = function(mode, x) {\n // Clone taskModel\n if (taskScope.task.originalModel === undefined) {\n taskScope.task.originalRow = taskScope.task.row;\n taskScope.task.originalModel = taskScope.task.model;\n taskScope.task.model = angular.copy(taskScope.task.originalModel);\n }\n\n // Init mouse start variables\n if (!taskHasBeenMovedFromAnotherRow) {\n moveStartX = x;\n mouseStartOffsetX = x - taskScope.task.modelLeft;\n }\n\n // Init task move\n taskHasBeenChanged = false;\n taskScope.task.moveMode = mode;\n taskScope.task.isMoving = true;\n taskScope.task.active = true;\n\n // Add move event handler\n var taskMoveHandler = function(evt) {\n evt.stopImmediatePropagation();\n if (_hasTouch) {\n evt = mouseOffset.getTouch(evt);\n }\n\n handleMove(evt);\n };\n var moveSmartEvent = smartEvent(taskScope, windowElement, _moveEvents, taskMoveHandler);\n moveSmartEvent.bind();\n\n // Remove move event handler on mouse up / touch end\n smartEvent(taskScope, windowElement, _releaseEvents, function(evt) {\n if (_hasTouch) {\n evt = mouseOffset.getTouch(evt);\n }\n moveSmartEvent.unbind();\n disableMoveMode(evt);\n taskScope.$digest();\n }).bindOnce();\n\n setGlobalCursor(getCursor(mode));\n };\n\n var disableMoveMode = function() {\n var getBackgroundElement = taskScope.task.getBackgroundElement();\n getBackgroundElement.removeClass('gantt-task-moving');\n getBackgroundElement.removeClass('gantt-task-resizing');\n\n if (taskScope.task.originalModel !== undefined) {\n\n taskScope.task.originalModel.from = taskScope.task.model.from;\n taskScope.task.originalModel.to = taskScope.task.model.to;\n taskScope.task.originalModel.lct = taskScope.task.model.lct;\n taskScope.task.originalModel.est = taskScope.task.model.est;\n\n taskScope.task.model = taskScope.task.originalModel;\n if (taskScope.task.row.model.id !== taskScope.task.originalRow.model.id) {\n var targetRow = taskScope.task.row;\n targetRow.removeTask(taskScope.task.model.id, false, true);\n taskScope.task.row = taskScope.task.originalRow;\n targetRow.moveTaskToRow(taskScope.task, false);\n }\n delete taskScope.task.originalModel;\n delete taskScope.task.originalRow;\n\n taskScope.$apply();\n }\n\n taskHasBeenMovedFromAnotherRow = false;\n taskScope.task.isMoving = false;\n taskScope.task.active = false;\n\n // Stop any active auto scroll\n clearScrollInterval();\n\n // Set mouse cursor back to default\n setGlobalCursor('');\n\n // Raise task changed event\n if (taskHasBeenChanged === true) {\n // Raise move end event\n if (taskScope.task.moveMode === 'M') {\n taskScope.row.rowsManager.gantt.api.tasks.raise.moveEnd(taskScope.task);\n } else {\n taskScope.row.rowsManager.gantt.api.tasks.raise.resizeEnd(taskScope.task);\n }\n\n taskHasBeenChanged = false;\n taskScope.task.row.sortTasks(); // Sort tasks so they have the right z-order\n taskScope.row.rowsManager.gantt.api.tasks.raise.change(taskScope.task);\n }\n\n taskScope.task.moveMode = undefined;\n };\n\n // Stop scroll cycle (if running) when scope is destroyed.\n // This is needed when the task is moved to a new row during scroll because\n // the old scope will continue to scroll otherwise\n taskScope.$on('$destroy', function() {\n taskScope.destroyed = true;\n clearScrollInterval();\n });\n\n if (taskScope.task.isResizing) {\n taskHasBeenMovedFromAnotherRow = true;\n enableMoveMode('E', taskScope.task.mouseOffsetX);\n delete taskScope.task.isResizing;\n } else if (taskScope.task.isMoving) {\n // In case the task has been moved to another row a new controller is is created by angular.\n // Enable the move mode again if this was the case.\n taskHasBeenMovedFromAnotherRow = true;\n enableMoveMode('M', taskScope.task.mouseOffsetX);\n }\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.overlap', ['gantt', 'gantt.overlap.templates']).directive('ganttOverlap', ['moment',function(moment) {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n function getStartEnd(task) {\n var start, end;\n\n if (task.model.from.isBefore(task.model.to)) {\n start = task.model.from;\n end = task.model.to;\n } else {\n start = task.model.to;\n end = task.model.from;\n }\n\n return [start, end];\n }\n\n function getRange(task) {\n var startEnd = getStartEnd(task);\n return moment().range(startEnd[0], startEnd[1]);\n }\n\n function handleTaskOverlap(overlapsList, task) {\n if (!(task.model.id in overlapsList)) {\n task.$element.addClass('gantt-task-overlaps');\n overlapsList[task.model.id] = task;\n }\n }\n\n function handleTaskNonOverlaps(overlapsList, allTasks) {\n for(var i=0, l=allTasks.length; i<l; i++) {\n var task = allTasks[i];\n if (!(task.model.id in overlapsList)) {\n task.$element.removeClass('gantt-task-overlaps');\n }\n }\n }\n\n function handleOverlaps(row) {\n // Tasks are sorted by start date when added to row\n var allTasks = row.tasks;\n var newOverlapsTasks = {};\n\n if (allTasks.length > 1) {\n var previousTask = allTasks[0];\n var previousRange = getRange(previousTask);\n\n for (var i = 1, l = allTasks.length; i < l; i++) {\n var task = allTasks[i];\n var range = getRange(task);\n\n if (range.overlaps(previousRange)) {\n handleTaskOverlap(newOverlapsTasks, task);\n handleTaskOverlap(newOverlapsTasks, previousTask);\n }\n\n if (previousTask.left+previousTask.width < task.left+task.width) {\n previousTask = task;\n previousRange = range;\n }\n }\n }\n\n handleTaskNonOverlaps(newOverlapsTasks, allTasks);\n }\n\n if (scope.enabled){\n api.tasks.on.change(scope, function(task) {\n handleOverlaps(task.row);\n });\n\n api.tasks.on.rowChange(scope, function(task, oldRow) {\n handleOverlaps(oldRow);\n });\n }\n\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.progress', ['gantt', 'gantt.progress.templates']).directive('ganttProgress', ['moment', '$compile', '$document', function(moment, $compile, $document) {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.progress) === 'object') {\n for (var option in scope.options.progress) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n api.directives.on.new(scope, function(directiveName, taskScope, taskElement) {\n if (directiveName === 'ganttTaskBackground') {\n var progressScope = taskScope.$new();\n progressScope.pluginScope = scope;\n\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'task.model.progress !== undefined && pluginScope.enabled');\n\n var progressElement = $document[0].createElement('gantt-task-progress');\n if (attrs.templateUrl !== undefined) {\n angular.element(progressElement).attr('data-template-url', attrs.templateUrl);\n }\n if (attrs.template !== undefined) {\n angular.element(progressElement).attr('data-template', attrs.template);\n }\n angular.element(ifElement).append(progressElement);\n taskElement.append($compile(ifElement)(progressScope));\n }\n });\n\n api.tasks.on.clean(scope, function(model) {\n if (model.est !== undefined && !moment.isMoment(model.est)) {\n model.est = moment(model.est); //Earliest Start Time\n }\n\n if (model.lct !== undefined && !moment.isMoment(model.lct)) {\n model.lct = moment(model.lct); //Latest Completion Time\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n /* global ResizeSensor: false */\n /* global ElementQueries: false */\n 'use strict';\n angular.module('gantt.resizeSensor', ['gantt']).directive('ganttResizeSensor', [function() {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.progress) === 'object') {\n for (var option in scope.options.progress) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n function buildSensor() {\n var ganttElement = element.parent().parent().parent()[0].querySelectorAll('div.gantt')[0];\n return new ResizeSensor(ganttElement, function() {\n ganttCtrl.gantt.$scope.ganttElementWidth = ganttElement.clientWidth;\n ganttCtrl.gantt.$scope.$apply();\n });\n }\n\n var rendered = false;\n var sensor;\n\n api.core.on.rendered(scope, function() {\n rendered = true;\n if (sensor !== undefined) {\n sensor.detach();\n }\n if (scope.enabled) {\n ElementQueries.update();\n sensor = buildSensor();\n }\n });\n\n scope.$watch('enabled', function(newValue) {\n if (rendered) {\n if (newValue && sensor === undefined) {\n ElementQueries.update();\n sensor = buildSensor();\n } else if (!newValue && sensor !== undefined) {\n sensor.detach();\n sensor = undefined;\n }\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n\n var moduleName = 'gantt.sortable';\n var directiveName = 'ganttSortable';\n var pluginDependencies = [\n 'gantt',\n {module:'ang-drag-drop', url:'https://github.com/ganarajpr/angular-dragdrop.git#master'}\n ];\n\n var failedDependencies = [];\n var loadedDependencies = [];\n var failedDependency;\n\n for (var i = 0, l = pluginDependencies.length; i < l; i++) {\n var currentDependency = pluginDependencies[i];\n try {\n if (angular.isString(currentDependency)) {\n currentDependency = {module: currentDependency};\n pluginDependencies[i] = currentDependency;\n }\n angular.module(currentDependency.module);\n loadedDependencies.push(currentDependency.module);\n } catch (e) {\n currentDependency.exception = e;\n failedDependencies.push(currentDependency);\n }\n }\n\n if (failedDependencies.length > 0) {\n angular.module(moduleName, []).directive(directiveName, ['$log', function($log) {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?'\n },\n link: function() {\n $log.warn(moduleName + ' module can\\'t require some dependencies:');\n for (var i= 0,l =failedDependencies.length; i<l; i++) {\n failedDependency = failedDependencies[i];\n\n var errorMessage = failedDependency.module;\n if (failedDependency.url) {\n errorMessage += ' (' + failedDependency.url + ')';\n }\n if (failedDependency.exception && failedDependency.exception.message) {\n errorMessage += ': ' + failedDependency.exception.message;\n }\n\n $log.warn(errorMessage);\n }\n $log.warn(directiveName + ' plugin directive won\\'t be available');\n }\n };\n }]);\n } else {\n angular.module(moduleName, loadedDependencies).directive(directiveName, ['ganttUtils', '$compile', function(utils, $compile) {\n // Provides the row sort functionality to any Gantt row\n // Uses the sortableState to share the current row\n\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.sortable) === 'object') {\n for (var option in scope.options.sortable) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n api.directives.on.new(scope, function(directiveName, rowScope, rowElement) {\n if (directiveName === 'ganttRowLabel' && rowElement.attr('drag') === undefined) {\n rowScope.checkDraggable = function() {\n var rowSortable = rowScope.row.model.sortable;\n\n if (typeof(rowSortable) === 'boolean') {\n rowSortable = {enabled: rowSortable};\n }\n\n return utils.firstProperty([rowSortable], 'enabled', scope.enabled);\n };\n\n rowScope.onDropSuccess = function() {\n rowScope.$evalAsync();\n };\n\n rowScope.onDrop = function(evt, data) {\n var row = rowScope.row.rowsManager.rowsMap[data.id];\n if (row !== rowScope) {\n rowScope.row.rowsManager.moveRow(row, rowScope.row);\n rowScope.$evalAsync();\n }\n };\n\n rowElement.attr('ui-draggable', '{{checkDraggable()}}');\n rowElement.attr('drag-channel', '\\'sortable\\'');\n rowElement.attr('ui-on-drop', 'onDrop($event, $data)');\n rowElement.attr('on-drop-success', 'onDropSuccess()');\n\n rowElement.attr('drop-channel', '\\'sortable\\'');\n rowElement.attr('drag', 'row.model');\n\n $compile(rowElement)(rowScope);\n }\n });\n\n }\n };\n }]);\n }\n\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.table', ['gantt', 'gantt.table.templates']).directive('ganttTable', ['ganttUtils', '$compile', '$document', function(utils, $compile, $document) {\n // Provides the row sort functionality to any Gantt row\n // Uses the sortableState to share the current row\n\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n columns: '=?',\n headers: '=?',\n classes: '=?',\n contents: '=?',\n headerContents: '=?',\n formatters: '=?',\n headerFormatter: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.sortable) === 'object') {\n for (var option in scope.options.sortable) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.columns === undefined) {\n scope.columns = ['model.name'];\n }\n\n if (scope.headers === undefined) {\n scope.headers = {'model.name': 'Name'};\n }\n\n if (scope.contents === undefined) {\n scope.contents = {};\n }\n\n if (scope.headerContents === undefined) {\n scope.headerContents = {};\n }\n\n if (scope.classes === undefined) {\n scope.classes = {};\n }\n\n if (scope.formatters === undefined) {\n scope.formatters = {};\n }\n\n api.directives.on.new(scope, function(directiveName, sideContentScope, sideContentElement) {\n if (directiveName === 'ganttSideContent') {\n var tableScope = sideContentScope.$new();\n tableScope.pluginScope = scope;\n\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'pluginScope.enabled');\n angular.element(ifElement).addClass('side-element');\n\n var tableElement = $document[0].createElement('gantt-side-content-table');\n angular.element(ifElement).append(tableElement);\n\n sideContentElement.append($compile(ifElement)(tableScope));\n }\n });\n\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.tooltips', ['gantt', 'gantt.tooltips.templates']).directive('ganttTooltips', ['$compile', '$document', function($compile, $document) {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n dateFormat: '=?',\n content: '=?',\n delay: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.tooltips) === 'object') {\n for (var option in scope.options.tooltips) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n if (scope.dateFormat === undefined) {\n scope.dateFormat = 'MMM DD, HH:mm';\n }\n if (scope.delay === undefined) {\n scope.delay = 500;\n }\n if (scope.content === undefined) {\n scope.content = '{{task.model.name}}</br>'+\n '<small>'+\n '{{task.isMilestone() === true && getFromLabel() || getFromLabel() + \\' - \\' + getToLabel()}}'+\n '</small>';\n }\n\n scope.api = api;\n\n api.directives.on.new(scope, function(directiveName, taskScope, taskElement) {\n if (directiveName === 'ganttTask') {\n var tooltipScope = taskScope.$new();\n\n tooltipScope.pluginScope = scope;\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'pluginScope.enabled');\n\n var tooltipElement = $document[0].createElement('gantt-tooltip');\n if (attrs.templateUrl !== undefined) {\n angular.element(tooltipElement).attr('data-template-url', attrs.templateUrl);\n }\n if (attrs.template !== undefined) {\n angular.element(tooltipElement).attr('data-template', attrs.template);\n }\n\n angular.element(ifElement).append(tooltipElement);\n taskElement.append($compile(ifElement)(tooltipScope));\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.tree', ['gantt', 'gantt.tree.templates', 'ui.tree']).directive('ganttTree', ['ganttUtils', '$compile', '$document', function(utils, $compile, $document) {\n // Provides the row sort functionality to any Gantt row\n // Uses the sortableState to share the current row\n\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n header: '=?',\n content: '=?',\n headerContent: '=?',\n keepAncestorOnFilterRow: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.sortable) === 'object') {\n for (var option in scope.options.sortable) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.header === undefined) {\n scope.header = 'Name';\n }\n\n if (scope.headerContent === undefined) {\n scope.headerContent = '{{getHeader()}}';\n }\n\n if (scope.keepAncestorOnFilterRow === undefined) {\n scope.keepAncestorOnFilterRow = false;\n }\n\n api.directives.on.new(scope, function(directiveName, sideContentScope, sideContentElement) {\n if (directiveName === 'ganttSideContent') {\n var labelsScope = sideContentScope.$new();\n labelsScope.pluginScope = scope;\n\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'pluginScope.enabled');\n angular.element(ifElement).addClass('side-element');\n\n var labelsElement = $document[0].createElement('gantt-side-content-tree');\n angular.element(ifElement).append(labelsElement);\n\n sideContentElement.append($compile(ifElement)(labelsScope));\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.bounds').directive('ganttTaskBounds', ['$templateCache', 'moment', function($templateCache, moment) {\n // Displays a box representing the earliest allowable start time and latest completion time for a job\n\n return {\n restrict: 'E',\n templateUrl: function(tElement, tAttrs) {\n var templateUrl;\n if (tAttrs.templateUrl === undefined) {\n templateUrl = 'plugins/bounds/taskBounds.tmpl.html';\n } else {\n templateUrl = tAttrs.templateUrl;\n }\n if (tAttrs.template) {\n $templateCache.put(templateUrl, tAttrs.template);\n }\n return templateUrl;\n },\n replace: true,\n scope: true,\n controller: ['$scope', '$element', function($scope, $element) {\n $element.toggleClass('ng-hide', true);\n\n $scope.simplifyMoment = function(d) {\n return moment.isMoment(d) ? d.unix() : d;\n };\n\n $scope.$watchGroup(['simplifyMoment(task.model.est)', 'simplifyMoment(task.model.lct)', 'task.left', 'task.width'], function() {\n var left = $scope.task.rowsManager.gantt.getPositionByDate($scope.task.model.est);\n var right = $scope.task.rowsManager.gantt.getPositionByDate($scope.task.model.lct);\n\n $element.css('left', left - $scope.task.left + 'px');\n $element.css('width', right - left + 'px');\n\n $element.toggleClass('gantt-task-bounds-in', false);\n $element.toggleClass('gantt-task-bounds-out', false);\n if ($scope.task.model.est === undefined || $scope.task.model.lct === undefined) {\n $element.toggleClass('gantt-task-bounds-in', true);\n } else if ($scope.task.model.est > $scope.task.model.from) {\n $element.toggleClass('gantt-task-bounds-out', true);\n }\n else if ($scope.task.model.lct < $scope.task.model.to) {\n $element.toggleClass('gantt-task-bounds-out', true);\n } else {\n $element.toggleClass('gantt-task-bounds-in', true);\n }\n });\n\n $scope.task.$element.bind('mouseenter', function() {\n $element.toggleClass('ng-hide', false);\n });\n\n $scope.task.$element.bind('mouseleave', function() {\n $element.toggleClass('ng-hide', true);\n });\n\n $scope.task.rowsManager.gantt.api.directives.raise.new('ganttBounds', $scope, $element);\n $scope.$on('$destroy', function() {\n $scope.task.rowsManager.gantt.api.directives.raise.destroy('ganttBounds', $scope, $element);\n });\n }]\n };\n }]);\n}());\n\n","(function() {\n 'use strict';\n\n angular.module('gantt.dependencies').factory('GanttDependenciesEvents', [function() {\n /**\n * Creates a new DependenciesEvents object.\n *\n * @param manager DependenciesManager object\n * @constructor\n */\n var DependenciesEvents = function(manager) {\n var self = this;\n\n this.manager = manager;\n\n // Deny drop on the same task.\n var denyDropOnSameTask = function(params) {\n return params.sourceId !== params.targetId;\n };\n\n this.manager.plumb.bind('beforeDrop', denyDropOnSameTask);\n\n\n // Notify the manager that a connection is being created.\n this.manager.plumb.bind('connectionDrag', function(connection) {\n self.manager.setDraggingConnection(connection);\n });\n\n this.manager.plumb.bind('connectionDragStop', function() {\n self.manager.setDraggingConnection(undefined);\n });\n\n this.manager.plumb.bind('beforeDrop', function() {\n self.manager.setDraggingConnection(undefined);\n return true;\n });\n\n var createConnection = function(info, mouseEvent) {\n if (mouseEvent) {\n var oldDependency;\n if (info.connection.$dependency) {\n oldDependency = info.connection.$dependency;\n }\n\n var sourceEndpoint = info.sourceEndpoint;\n var targetEndpoint = info.targetEndpoint;\n\n var sourceModel = sourceEndpoint.$task.model;\n\n var dependenciesModel = sourceModel.dependencies;\n if (dependenciesModel === undefined) {\n dependenciesModel = [];\n sourceModel.dependencies = dependenciesModel;\n }\n\n var connectionModel = {to: targetEndpoint.$task.model.id};\n dependenciesModel.push(connectionModel);\n\n if (oldDependency) {\n oldDependency.removeFromTaskModel();\n self.manager.removeDependency(oldDependency, true); // Connection will be disconnected later by jsPlumb.\n }\n\n var dependency = self.manager.addDependency(sourceEndpoint.$task, connectionModel);\n info.connection.$dependency = dependency;\n dependency.connection = info.connection;\n\n self.manager.api.dependencies.raise.add(dependency);\n\n }\n };\n\n var updateConnection = function(info, mouseEvent) {\n if (mouseEvent) {\n var oldDependency;\n if (info.connection.$dependency) {\n oldDependency = info.connection.$dependency;\n }\n\n var sourceEndpoint = info.newSourceEndpoint;\n var targetEndpoint = info.newTargetEndpoint;\n\n var sourceModel = sourceEndpoint.$task.model;\n\n var dependenciesModel = sourceModel.dependencies;\n if (dependenciesModel === undefined) {\n dependenciesModel = [];\n sourceModel.dependencies = dependenciesModel;\n }\n\n var connectionModel = {to: targetEndpoint.$task.model.id};\n dependenciesModel.push(connectionModel);\n\n if (oldDependency) {\n oldDependency.removeFromTaskModel();\n self.manager.removeDependency(oldDependency, true); // Connection will be disconnected later by jsPlumb.\n }\n\n var dependency = self.manager.addDependency(sourceEndpoint.$task, connectionModel);\n info.connection.$dependency = dependency;\n dependency.connection = info.connection;\n\n self.manager.api.dependencies.raise.change(dependency, oldDependency);\n }\n };\n\n var deleteConnection = function(info, mouseEvent) {\n if (mouseEvent) {\n var dependency = info.connection.$dependency;\n\n dependency.removeFromTaskModel();\n self.manager.removeDependency(dependency, true); // Connection will be disconnected later by jsPlumb.\n self.manager.api.dependencies.raise.remove(dependency);\n }\n };\n\n this.manager.plumb.bind('connectionMoved', updateConnection);\n this.manager.plumb.bind('connection', createConnection);\n this.manager.plumb.bind('connectionDetached', deleteConnection);\n\n };\n return DependenciesEvents;\n }]);\n}());\n","/* globals jsPlumb */\n(function() {\n 'use strict';\n\n angular.module('gantt.dependencies').factory('GanttDependenciesManager', ['GanttDependency', 'GanttDependenciesEvents', 'GanttDependencyTaskMouseHandler', function(Dependency, DependenciesEvents, TaskMouseHandler) {\n var DependenciesManager = function(gantt, pluginScope, api) {\n var self = this;\n\n this.gantt = gantt;\n this.pluginScope = pluginScope;\n this.api = api;\n\n this.api.registerEvent('dependencies', 'add');\n this.api.registerEvent('dependencies', 'change');\n this.api.registerEvent('dependencies', 'remove');\n\n this.plumb = jsPlumb.getInstance();\n this.plumb.importDefaults(this.pluginScope.jsPlumbDefaults);\n\n this.dependenciesFrom = {};\n this.dependenciesTo = {};\n\n this.tasks = {};\n\n this.events = new DependenciesEvents(this);\n\n this.pluginScope.$watch('enabled', function(newValue, oldValue) {\n if (newValue !== oldValue) {\n self.refresh();\n }\n\n });\n\n this.pluginScope.$watch('jsPlumbDefaults', function(newValue, oldValue) {\n if (newValue !== oldValue) {\n self.plumb.importDefaults(newValue);\n self.refresh();\n }\n }, true);\n\n /**\n * Add all dependencies defined from a task. Dependencies will be added only if plugin is enabled.\n *\n * @param task\n */\n this.addDependenciesFromTask = function(task) {\n if (this.pluginScope.enabled) {\n var taskDependencies = task.model.dependencies;\n\n if (taskDependencies !== undefined) {\n if (!angular.isArray(taskDependencies)) {\n taskDependencies = [taskDependencies];\n task.model.dependencies = taskDependencies;\n }\n\n for (var i = 0, l = taskDependencies.length; i < l; i++) {\n var dependency = self.addDependency(task, taskDependencies[i]);\n dependency.connect();\n }\n }\n }\n };\n\n /**\n * Remove all dependencies defined for a task.\n *\n * @param task\n * @param keepConnection if true, dependency will not be disconnected.\n */\n this.removeDependenciesFromTask = function(task, keepConnection) {\n var dependencies = this.getTaskDependencies(task);\n\n if (dependencies) {\n for (var i = 0; i < dependencies.length; i++) {\n if (!keepConnection) {\n dependencies[i].disconnect();\n }\n self.removeDependency(dependencies[i]);\n }\n }\n };\n\n /**\n * Add definition of a dependency.\n *\n * @param task Task defining the dependency.\n * @param model Model object for the dependency.\n */\n this.addDependency = function(task, model) {\n var dependency = new Dependency(this, task, model);\n\n var fromTaskId = dependency.getFromTaskId();\n var toTaskId = dependency.getToTaskId();\n\n if (!(fromTaskId in this.dependenciesFrom)) {\n this.dependenciesFrom[fromTaskId] = [];\n }\n if (!(toTaskId in this.dependenciesTo)) {\n this.dependenciesTo[toTaskId] = [];\n }\n\n if (fromTaskId) {\n this.dependenciesFrom[fromTaskId].push(dependency);\n }\n\n if (toTaskId) {\n this.dependenciesTo[toTaskId].push(dependency);\n }\n\n return dependency;\n };\n\n /**\n * Remove definition of a dependency\n *\n * @param dependency Dependency object\n * @param keepConnection if true, dependency will not be disconnected.\n */\n this.removeDependency = function(dependency, keepConnection) {\n var fromDependencies = this.dependenciesFrom[dependency.getFromTaskId()];\n var fromRemove = [];\n var i;\n\n if (fromDependencies) {\n for (i = 0; i < fromDependencies.length; i++) {\n if (dependency === fromDependencies[i]) {\n fromRemove.push(dependency);\n }\n }\n }\n\n var toDependencies = this.dependenciesTo[dependency.getToTaskId()];\n var toRemove = [];\n\n if (toDependencies) {\n for (i = 0; i < toDependencies.length; i++) {\n if (dependency === toDependencies[i]) {\n toRemove.push(dependency);\n }\n }\n }\n\n for (i = 0; i < fromRemove.length; i++) {\n if (!keepConnection) {\n fromRemove[i].disconnect();\n }\n fromDependencies.splice(fromDependencies.indexOf(dependency), 1);\n }\n\n for (i = 0; i < toRemove.length; i++) {\n if (!keepConnection) {\n toRemove[i].disconnect();\n }\n toDependencies.splice(toDependencies.indexOf(dependency), 1);\n }\n\n if (this.dependenciesFrom[dependency.getFromTaskId()] &&\n this.dependenciesFrom[dependency.getFromTaskId()].length === 0) {\n delete this.dependenciesFrom[dependency.getFromTaskId()];\n }\n\n if (this.dependenciesTo[dependency.getToTaskId()] &&\n this.dependenciesTo[dependency.getToTaskId()].length === 0) {\n delete this.dependenciesTo[dependency.getToTaskId()];\n }\n };\n\n this.getTaskDependencies = function(task) {\n var dependencies = [];\n\n var fromDependencies = self.dependenciesFrom[task.model.id];\n if (fromDependencies) {\n dependencies = dependencies.concat(fromDependencies);\n }\n\n var toDependencies = self.dependenciesTo[task.model.id];\n if (toDependencies) {\n dependencies = dependencies.concat(toDependencies);\n }\n\n return dependencies;\n };\n\n this.setDraggingConnection = function(connection) {\n if (connection) {\n self.draggingConnection = connection;\n angular.forEach(self.tasks, function(task) {\n task.dependencies.mouseHandler.release();\n });\n } else {\n self.draggingConnection = undefined;\n angular.forEach(self.tasks, function(task) {\n task.dependencies.mouseHandler.install();\n });\n }\n };\n\n var addTaskEndpoints = function(task) {\n if (!task.dependencies) {\n task.dependencies = {};\n }\n\n task.dependencies.endpoints = [];\n\n if (self.pluginScope.endpoints) {\n for (var i = 0; i < self.pluginScope.endpoints.length; i++) {\n var endpointObject = self.plumb.addEndpoint(task.$element, self.pluginScope.endpoints[i]);\n endpointObject.$task = task;\n task.dependencies.endpoints.push(endpointObject);\n }\n }\n\n };\n\n var removeTaskEndpoint = function(task) {\n for (var i = 0; i < task.dependencies.endpoints.length; i++) {\n var endpointObject = task.dependencies.endpoints[i];\n self.plumb.deleteEndpoint(endpointObject);\n endpointObject.$task = undefined;\n }\n\n task.dependencies.endpoints = undefined;\n };\n\n var addTaskMouseHandler = function(task) {\n if (!task.dependencies) {\n task.dependencies = {};\n }\n\n task.dependencies.mouseHandler = new TaskMouseHandler(self, task);\n task.dependencies.mouseHandler.install();\n };\n\n var removeTaskMouseHandler = function(task) {\n task.dependencies.mouseHandler.release();\n task.dependencies.mouseHandler = undefined;\n };\n\n /**\n * Set tasks objects that can be used to display dependencies.\n *\n * @param tasks\n */\n this.setTasks = function(tasks) {\n angular.forEach(self.tasks, function(task) {\n removeTaskMouseHandler(task);\n removeTaskEndpoint(task);\n });\n\n var newTasks = {};\n for (var i = 0; i < tasks.length; i++) {\n var task = tasks[i];\n newTasks[task.model.id] = task;\n addTaskEndpoints(task);\n addTaskMouseHandler(task);\n }\n self.tasks = newTasks;\n };\n\n var disconnectTaskDependencies = function(task) {\n var dependencies = self.getTaskDependencies(task);\n if (dependencies) {\n for (var i = 0; i < dependencies.length; i++) {\n dependencies[i].disconnect();\n }\n }\n return dependencies;\n };\n\n var connectTaskDependencies = function(task) {\n var dependencies = self.getTaskDependencies(task);\n if (dependencies) {\n for (var i = 0; i < dependencies.length; i++) {\n dependencies[i].connect();\n }\n }\n return dependencies;\n };\n\n /**\n * Set task object in replacement of an existing with the same id.\n *\n * @param task\n */\n this.setTask = function(task) {\n self.plumb.setSuspendDrawing(true);\n try {\n var oldTask = self.tasks[task.model.id];\n if (oldTask !== undefined) {\n disconnectTaskDependencies(oldTask);\n removeTaskMouseHandler(oldTask);\n removeTaskEndpoint(oldTask);\n }\n self.tasks[task.model.id] = task;\n addTaskEndpoints(task);\n addTaskMouseHandler(task);\n connectTaskDependencies(task);\n } finally {\n self.plumb.setSuspendDrawing(false, true);\n }\n };\n\n /**\n * Retrieve the task from it's id.\n *\n * @param taskId id of the task element to retrieve.\n * @returns {*}\n */\n this.getTask = function(taskId) {\n return self.tasks[taskId];\n };\n\n var getSourceEndpoints = function(task) {\n return task.dependencies.endpoints.filter(function(endpoint) {\n return endpoint.isSource;\n });\n };\n\n var getTargetEndpoints = function(task) {\n return task.dependencies.endpoints.filter(function(endpoint) {\n return endpoint.isTarget;\n });\n };\n\n /**\n * Connects two tasks together using source endpoint from fromTask and target endpoint from toTask.\n *\n * @param fromTask\n * @param toTask\n * @param model\n * @returns connection object\n */\n this.connect = function(fromTask, toTask, model) {\n var sourceEndpoints = getSourceEndpoints(fromTask);\n var targetEndpoints = getTargetEndpoints(toTask);\n if (sourceEndpoints && targetEndpoints) {\n var sourceEndpoint;\n var targetEndpoint;\n\n if (model.connectParameters && model.connectParameters.sourceEndpointIndex) {\n sourceEndpoint = sourceEndpoints[model.connectParameters.sourceEndpointIndex];\n } else {\n sourceEndpoint = sourceEndpoints[0];\n }\n\n if (model.connectParameters && model.connectParameters.targetEndpointIndex) {\n targetEndpoint = targetEndpoints[model.connectParameters.targetEndpointIndex];\n } else {\n targetEndpoint = targetEndpoints[0];\n }\n\n var connection = self.plumb.connect({\n source: sourceEndpoint,\n target: targetEndpoint\n }, model.connectParameters);\n return connection;\n }\n };\n\n /**\n * Get all defined dependencies.\n *\n * @returns {Array}\n */\n this.getDependencies = function() {\n var allDependencies = [];\n\n angular.forEach(this.dependenciesFrom, function(dependencies) {\n for (var i = 0; i < dependencies.length; i++) {\n if (!(dependencies[i] in allDependencies)) {\n allDependencies.push(dependencies[i]);\n }\n }\n });\n\n return allDependencies;\n };\n\n /**\n * Refresh jsplumb status based on tasks dependencies models.\n */\n this.refresh = function(tasks) {\n self.plumb.setSuspendDrawing(true);\n\n try {\n var tasksDependencies;\n var i;\n if (tasks && !angular.isArray(tasks)) {\n tasks = [tasks];\n }\n\n if (tasks === undefined) {\n tasks = this.tasks;\n tasksDependencies = this.getDependencies();\n } else {\n tasksDependencies = [];\n angular.forEach(tasks, function(task) {\n var taskDependencies = self.getTaskDependencies(task);\n angular.forEach(taskDependencies, function(taskDependency) {\n if (!(taskDependency in tasksDependencies)) {\n tasksDependencies.push(taskDependency);\n }\n });\n });\n }\n\n for (i = 0; i < tasksDependencies.length; i++) {\n self.removeDependency(tasksDependencies[i]);\n }\n\n angular.forEach(tasks, function(task) {\n self.addDependenciesFromTask(task);\n });\n } finally {\n self.plumb.setSuspendDrawing(false, true);\n }\n };\n\n this.api.registerMethod('dependencies', 'refresh', this.refresh, this);\n };\n return DependenciesManager;\n }]);\n}());\n","(function() {\n 'use strict';\n\n angular.module('gantt.dependencies').factory('GanttDependency', ['ganttUtils', 'ganttDom', function(utils, dom) {\n /**\n * Constructor of Dependency object.\n * \n * @param manager Dependency manager used by this dependency\n * @param task Task declaring the dependency\n * @param model model of the dependency\n *\n * @constructor\n *\n * @see https://jsplumbtoolkit.com/community/apidocs/classes/jsPlumb.html#method_connect\n */\n var Dependency = function(manager, task, model) {\n var self = this;\n\n this.manager = manager;\n this.task = task;\n this.model = model;\n this.connection = undefined;\n this.fallbackEndpoints = [];\n\n /**\n * Check if this dependency is connected.\n *\n * @returns {boolean}\n */\n this.isConnected = function() {\n if (this.connection) {\n return true;\n }\n return false;\n };\n\n /**\n * Disconnect this dependency.\n */\n this.disconnect = function() {\n if (this.connection) {\n if (this.connection.endpoints) {\n this.manager.plumb.detach(this.connection);\n }\n this.connection.$dependency = undefined;\n this.connection = undefined;\n }\n\n this.deleteFallbackEndpoints();\n };\n\n this.deleteFallbackEndpoints = function() {\n if (this.fallbackEndpoints) {\n for (var i=0; i<this.fallbackEndpoints.length; i++) {\n self.manager.plumb.deleteEndpoint(this.fallbackEndpoints[i]);\n }\n this.fallbackEndpoints = [];\n }\n };\n\n this.getFromTaskId = function() {\n if (this.model.from !== undefined) {\n return this.model.from;\n }\n return this.task.model.id;\n };\n\n this.getToTaskId = function() {\n if (this.model.to !== undefined) {\n return this.model.to;\n }\n return this.task.model.id;\n };\n\n this.getFromTask = function() {\n if (this.model.from !== undefined) {\n return this.manager.getTask(this.model.from);\n }\n return this.task;\n };\n\n this.getToTask = function() {\n if (this.model.to !== undefined) {\n return this.manager.getTask(this.model.to);\n }\n return this.task;\n };\n\n this.removeFromTaskModel = function() {\n var modelIndex = utils.angularIndexOf(this.task.model.dependencies, this.model);\n if (modelIndex >= 0) {\n this.task.model.dependencies.splice(modelIndex, 1);\n }\n return modelIndex;\n };\n\n var isTaskVisible = function(task) {\n if (task === undefined || task.$element === undefined) {\n return false;\n }\n var element = task.$element[0];\n return dom.isElementVisible(element);\n };\n\n /**\n * Connect this dependency if both elements are available.\n *\n * @returns {boolean}\n */\n this.connect = function() {\n var fromTask = this.getFromTask();\n var toTask = this.getToTask();\n\n if (!isTaskVisible(fromTask)) {\n fromTask = undefined;\n }\n\n if (!isTaskVisible(toTask)) {\n toTask = undefined;\n }\n\n if (fromTask && toTask) {\n var connection = this.manager.connect(fromTask, toTask, this.model);\n if (connection) {\n connection.$dependency = this;\n this.connection = connection;\n return true;\n }\n }\n\n this.deleteFallbackEndpoints();\n if (fromTask !== undefined) {\n var toFallbackEndpoint = this.manager.pluginScope.fallbackEndpoints[1];\n this.fallbackEndpoints.push(this.manager.plumb.addEndpoint(fromTask.$element, toFallbackEndpoint));\n }\n if (toTask !== undefined) {\n var fromFallbackEndpoint = this.manager.pluginScope.fallbackEndpoints[0];\n this.fallbackEndpoints.push(this.manager.plumb.addEndpoint(toTask.$element, fromFallbackEndpoint));\n }\n return false;\n };\n };\n return Dependency;\n }]);\n}());\n","(function() {\n 'use strict';\n\n angular.module('gantt.dependencies').factory('GanttDependencyTaskMouseHandler', ['$timeout', function($timeout) {\n var TaskMouseHandler = function(manager, task) {\n var self = this;\n\n this.manager = manager;\n this.task = task;\n this.installed = false;\n this.elementHandlers = [];\n\n this.display = true;\n this.hideEndpointsPromise = undefined;\n\n /**\n * Handler for a single DOM element.\n *\n * @param element\n * @constructor\n */\n var ElementHandler = function(element) {\n this.element = element;\n\n this.mouseExitHandler = function() {\n $timeout.cancel(self.hideEndpointsPromise);\n self.hideEndpointsPromise = $timeout(self.hideEndpoints, 1000, false);\n };\n\n this.mouseEnterHandler = function() {\n $timeout.cancel(self.hideEndpointsPromise);\n self.displayEndpoints();\n };\n\n this.install = function() {\n this.element.bind('mouseenter', this.mouseEnterHandler);\n this.element.bind('mouseleave', this.mouseExitHandler);\n };\n\n this.release = function() {\n this.element.unbind('mouseenter', this.mouseEnterHandler);\n this.element.unbind('mouseleave', this.mouseExitHandler);\n $timeout.cancel(self.hideEndpointsPromise);\n };\n\n };\n\n\n\n /**\n * Install mouse handler for this task, and hide all endpoints.\n */\n this.install = function() {\n if (!self.installed) {\n self.hideEndpoints();\n\n self.elementHandlers.push(new ElementHandler(self.task.getContentElement()));\n angular.forEach(self.task.dependencies.endpoints, function(endpoint) {\n self.elementHandlers.push(new ElementHandler(angular.element(endpoint.canvas)));\n });\n\n angular.forEach(self.elementHandlers, function(elementHandler) {\n elementHandler.install();\n });\n\n self.installed = true;\n }\n };\n\n /**\n * Release mouse handler for this task, and display all endpoints.\n */\n this.release = function() {\n if (self.installed) {\n angular.forEach(self.elementHandlers, function(elementHandler) {\n elementHandler.release();\n });\n\n self.elementHandlers = [];\n\n self.displayEndpoints();\n self.installed = false;\n }\n };\n\n /**\n * Display all endpoints for this task.\n */\n this.displayEndpoints = function() {\n self.display = true;\n angular.forEach(self.task.dependencies.endpoints, function(endpoint) {\n endpoint.setVisible(true, true, true);\n });\n };\n\n /**\n * Hide all endpoints for this task.\n */\n this.hideEndpoints = function() {\n angular.forEach(self.task.dependencies.endpoints, function(endpoint) {\n endpoint.setVisible(false, true, true);\n });\n self.display = false;\n };\n };\n return TaskMouseHandler;\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt.groups').controller('GanttGroupController', ['$scope', 'GanttTaskGroup', 'ganttUtils', function($scope, TaskGroup, utils) {\n var updateTaskGroup = function() {\n var rowGroups = $scope.row.model.groups;\n\n if (typeof(rowGroups) === 'boolean') {\n rowGroups = {enabled: rowGroups};\n }\n\n var enabledValue = utils.firstProperty([rowGroups], 'enabled', $scope.pluginScope.enabled);\n if (enabledValue) {\n $scope.display = utils.firstProperty([rowGroups], 'display', $scope.pluginScope.display);\n $scope.taskGroup = new TaskGroup($scope.row, $scope.pluginScope);\n\n $scope.row.setFromTo();\n $scope.row.setFromToByValues($scope.taskGroup.from, $scope.taskGroup.to);\n } else {\n $scope.taskGroup = undefined;\n $scope.display = undefined;\n }\n };\n\n $scope.gantt.api.tasks.on.viewChange($scope, function(task) {\n if ($scope.taskGroup !== undefined) {\n if ($scope.taskGroup.tasks.indexOf(task) > -1) {\n updateTaskGroup();\n if(!$scope.$$phase && !$scope.$root.$$phase) {\n $scope.$digest();\n }\n } else {\n var descendants = $scope.pluginScope.hierarchy.descendants($scope.row);\n if (descendants.indexOf(task.row) > -1) {\n updateTaskGroup();\n if(!$scope.$$phase && !$scope.$root.$$phase) {\n $scope.$digest();\n }\n }\n }\n }\n });\n\n var removeWatch = $scope.pluginScope.$watch('display', updateTaskGroup);\n\n $scope.$watchCollection('gantt.rowsManager.filteredRows', updateTaskGroup);\n\n $scope.gantt.api.columns.on.refresh($scope, updateTaskGroup);\n\n $scope.$on('$destroy', removeWatch);\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.groups').directive('ganttTaskGroup', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTaskGroup', 'plugins/groups/taskGroup.tmpl.html');\n return builder.build();\n }]);\n}());\n\n","(function() {\n 'use strict';\n\n angular.module('gantt').factory('GanttTaskGroup', ['ganttUtils', 'GanttTask', function(utils, Task) {\n var TaskGroup = function(row, pluginScope) {\n var self = this;\n\n self.row = row;\n self.pluginScope = pluginScope;\n\n self.descendants = self.pluginScope.hierarchy.descendants(self.row);\n\n self.tasks = [];\n self.overviewTasks = [];\n self.promotedTasks = [];\n self.showGrouping = false;\n\n var groupRowGroups = self.row.model.groups;\n if (typeof(groupRowGroups) === 'boolean') {\n groupRowGroups = {enabled: groupRowGroups};\n }\n\n var getTaskDisplay = function(task) {\n var taskGroups = task.model.groups;\n if (typeof(taskGroups) === 'boolean') {\n taskGroups = {enabled: taskGroups};\n }\n\n var rowGroups = task.row.model.groups;\n if (typeof(rowGroups) === 'boolean') {\n rowGroups = {enabled: rowGroups};\n }\n\n var enabledValue = utils.firstProperty([taskGroups, rowGroups, groupRowGroups], 'enabled', self.pluginScope.enabled);\n\n if (enabledValue) {\n var display = utils.firstProperty([taskGroups, rowGroups, groupRowGroups], 'display', self.pluginScope.display);\n return display;\n }\n };\n\n for (var i = 0; i < self.descendants.length; i++) {\n var tasks = self.descendants[i].tasks;\n\n for (var j = 0; j < tasks.length; j++) {\n var task = tasks[j];\n\n var taskDisplay = getTaskDisplay(task);\n if (taskDisplay !== undefined) {\n self.tasks.push(task);\n var clone = new Task(self.row, task.model);\n\n if (taskDisplay === 'overview') {\n self.overviewTasks.push(clone);\n } else if (taskDisplay === 'promote') {\n self.promotedTasks.push(clone);\n } else {\n self.showGrouping = true;\n }\n }\n }\n }\n\n self.from = undefined;\n if (groupRowGroups) {\n self.from = groupRowGroups.from;\n }\n if (self.from === undefined) {\n for (i=0; i<self.tasks.length; i++) {\n if (self.from === undefined || self.tasks[i].model.from < self.from) {\n self.from = self.tasks[i].model.from;\n }\n }\n }\n\n self.to = undefined;\n if (groupRowGroups) {\n self.to = groupRowGroups.to;\n }\n if (self.to === undefined) {\n for (i=0; i<self.tasks.length; i++) {\n if (self.to === undefined || self.tasks[i].model.to > self.to) {\n self.to = self.tasks[i].model.to;\n }\n }\n }\n\n if (self.showGrouping) {\n self.left = row.rowsManager.gantt.getPositionByDate(self.from);\n self.width = row.rowsManager.gantt.getPositionByDate(self.to) - self.left;\n }\n };\n return TaskGroup;\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttTaskOverview', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTaskOverview', 'plugins/groups/taskOverview.tmpl.html');\n builder.controller = function($scope, $element) {\n $scope.task.$element = $element;\n $scope.task.$scope = $scope;\n $scope.task.updatePosAndSize();\n };\n return builder.build();\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt.labels').directive('ganttLabelsBody', ['GanttDirectiveBuilder', 'ganttLayout', function(Builder, layout) {\n var builder = new Builder('ganttLabelsBody', 'plugins/labels/labelsBody.tmpl.html');\n builder.controller = function($scope) {\n var hScrollBarHeight = layout.getScrollBarHeight();\n\n $scope.getLabelsCss = function() {\n var css = {};\n\n if ($scope.maxHeight) {\n var bodyScrollBarHeight = $scope.gantt.scroll.isHScrollbarVisible() ? hScrollBarHeight : 0;\n css['max-height'] = $scope.maxHeight - bodyScrollBarHeight - $scope.gantt.header.getHeight() + 'px';\n }\n\n return css;\n };\n };\n return builder.build();\n }]);\n}());\n\n\n","(function(){\n 'use strict';\n angular.module('gantt.labels').directive('ganttLabelsHeader', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttLabelsHeader', 'plugins/labels/labelsHeader.tmpl.html');\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.labels').directive('ganttSideContentLabels', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttSideContentLabels', 'plugins/labels/sideContentLabels.tmpl.html');\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.movable').factory('ganttMovableOptions', [function() {\n return {\n initialize: function(options) {\n\n options.enabled = options.enabled !== undefined ? options.enabled : true;\n options.allowMoving = options.allowMoving !== undefined ? !!options.allowMoving : true;\n options.allowResizing = options.allowResizing !== undefined ? !!options.allowResizing : true;\n options.allowRowSwitching = options.allowRowSwitching !== undefined ? !!options.allowRowSwitching : true;\n\n return options;\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.progress').directive('ganttTaskProgress', ['$templateCache', function($templateCache) {\n return {\n restrict: 'E',\n requires: '^ganttTask',\n templateUrl: function(tElement, tAttrs) {\n var templateUrl;\n if (tAttrs.templateUrl === undefined) {\n templateUrl = 'plugins/progress/taskProgress.tmpl.html';\n } else {\n templateUrl = tAttrs.templateUrl;\n }\n if (tAttrs.template !== undefined) {\n $templateCache.put(templateUrl, tAttrs.template);\n }\n return templateUrl;\n },\n replace: true,\n scope: true,\n controller: ['$scope', '$element', function($scope, $element) {\n $scope.getClasses = function() {\n var classes = [];\n\n if (typeof($scope.task.model.progress) === 'object') {\n classes = $scope.task.model.progress.classes;\n }\n\n return classes;\n };\n\n $scope.getCss = function() {\n var css = {};\n\n var progress;\n if ($scope.task.model.progress !== undefined) {\n if (typeof($scope.task.model.progress) === 'object') {\n progress = $scope.task.model.progress;\n } else {\n progress = {percent: $scope.task.model.progress};\n }\n }\n\n if (progress) {\n if (progress.color) {\n css['background-color'] = progress.color;\n } else {\n css['background-color'] = '#6BC443';\n }\n\n css.width = progress.percent + '%';\n }\n\n return css;\n };\n\n $scope.task.rowsManager.gantt.api.directives.raise.new('ganttTaskProgress', $scope, $element);\n $scope.$on('$destroy', function() {\n $scope.task.rowsManager.gantt.api.directives.raise.destroy('ganttTaskProgress', $scope, $element);\n });\n }]\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.table').directive('ganttSideContentTable', ['GanttDirectiveBuilder', 'ganttLayout', function(Builder, layout) {\n var builder = new Builder('ganttSideContentTable', 'plugins/table/sideContentTable.tmpl.html');\n builder.controller = function($scope) {\n var hScrollBarHeight = layout.getScrollBarHeight();\n\n $scope.getMaxHeightCss = function() {\n var css = {};\n\n if ($scope.maxHeight) {\n var bodyScrollBarHeight = $scope.gantt.scroll.isHScrollbarVisible() ? hScrollBarHeight : 0;\n css['max-height'] = $scope.maxHeight - bodyScrollBarHeight - $scope.gantt.header.getHeight() + 'px';\n }\n\n return css;\n };\n };\n return builder.build();\n }]);\n}());\n\n","(function() {\n 'use strict';\n angular.module('gantt.table').controller('TableColumnController', ['$scope', function($scope) {\n $scope.getHeader = function() {\n var header = $scope.pluginScope.headers[$scope.column];\n if (header !== undefined) {\n return header;\n }\n if ($scope.pluginScope.headerFormatter !== undefined) {\n header = $scope.pluginScope.headerFormatter($scope.column);\n }\n if (header !== undefined) {\n return header;\n }\n return header;\n };\n\n $scope.getHeaderContent = function() {\n var headerContent = $scope.pluginScope.headerContents[$scope.column];\n if (headerContent === undefined) {\n return '{{getHeader()}}';\n }\n return headerContent;\n };\n\n $scope.getClass = function() {\n return $scope.pluginScope.classes[$scope.column];\n };\n }]);\n}());\n\n","(function() {\n 'use strict';\n angular.module('gantt.table').controller('TableColumnRowController', ['$scope', function($scope) {\n $scope.getValue = function() {\n var value = $scope.$eval($scope.column, $scope.row);\n\n var formatter = $scope.pluginScope.formatters[$scope.column];\n if (formatter !== undefined) {\n value = formatter(value, $scope.column, $scope.row);\n }\n\n return value;\n };\n\n $scope.getRowContent = function() {\n var content;\n if ($scope.row.model.columnContents) {\n content = $scope.row.model.columnContents[$scope.column];\n }\n if (content === undefined && $scope.column === 'model.name') {\n content = $scope.row.model.content;\n }\n if (content === undefined) {\n content = $scope.pluginScope.contents[$scope.column];\n }\n if (content === undefined && $scope.column === 'model.name') {\n content = $scope.row.rowsManager.gantt.options.value('rowContent');\n }\n if (content === undefined && $scope.pluginScope.content !== undefined) {\n content = $scope.pluginScope.content;\n }\n if (content === undefined) {\n return '{{getValue()}}';\n }\n return content;\n };\n }]);\n}());\n\n","(function() {\n 'use strict';\n angular.module('gantt.tooltips').directive('ganttTooltip', ['$log','$timeout', '$compile', '$document', '$templateCache', 'ganttDebounce', 'ganttSmartEvent', function($log, $timeout, $compile, $document, $templateCache, debounce, smartEvent) {\n // This tooltip displays more information about a task\n\n return {\n restrict: 'E',\n templateUrl: function(tElement, tAttrs) {\n var templateUrl;\n if (tAttrs.templateUrl === undefined) {\n templateUrl = 'plugins/tooltips/tooltip.tmpl.html';\n } else {\n templateUrl = tAttrs.templateUrl;\n }\n if (tAttrs.template !== undefined) {\n $templateCache.put(templateUrl, tAttrs.template);\n }\n return templateUrl;\n },\n scope: true,\n replace: true,\n controller: ['$scope', '$element', 'ganttUtils', function($scope, $element, utils) {\n var bodyElement = angular.element($document[0].body);\n var parentElement = $scope.task.$element;\n var showTooltipPromise;\n var visible = false;\n var mouseEnterX;\n var mouseMoveHandler;\n\n var getViewPortWidth = function() {\n var d = $document[0];\n return d.documentElement.clientWidth || d.documentElement.getElementById('body')[0].clientWidth;\n };\n\n var updateTooltip = function(x) {\n // Check if info is overlapping with view port\n if (x + $element[0].offsetWidth > getViewPortWidth()) {\n $element.css('left', (x + 20 - $element[0].offsetWidth) + 'px');\n $scope.isRightAligned = true;\n } else {\n $element.css('left', (x - 20) + 'px');\n $scope.isRightAligned = false;\n }\n };\n\n var showTooltip = function(x) {\n visible = true;\n mouseMoveHandler.bind();\n\n $scope.displayed = true;\n\n $scope.$evalAsync(function() {\n var restoreNgHide;\n if ($element.hasClass('ng-hide')) {\n $element.removeClass('ng-hide');\n restoreNgHide = true;\n }\n $scope.elementHeight = $element[0].offsetHeight;\n if (restoreNgHide) {\n $element.addClass('ng-hide');\n }\n $scope.taskRect = parentElement[0].getBoundingClientRect();\n updateTooltip(x);\n });\n };\n\n var hideTooltip = function() {\n visible = false;\n mouseMoveHandler.unbind();\n $scope.$evalAsync(function() {\n $scope.displayed = false;\n });\n };\n\n var displayTooltip = function(newValue, showDelayed) {\n if (showTooltipPromise) {\n $timeout.cancel(showTooltipPromise);\n }\n\n var taskTooltips = $scope.task.model.tooltips;\n var rowTooltips = $scope.task.row.model.tooltips;\n\n if (typeof(taskTooltips) === 'boolean') {\n taskTooltips = {enabled: taskTooltips};\n }\n\n if (typeof(rowTooltips) === 'boolean') {\n rowTooltips = {enabled: rowTooltips};\n }\n\n var enabled = utils.firstProperty([taskTooltips, rowTooltips], 'enabled', $scope.pluginScope.enabled);\n if (enabled && !visible && mouseEnterX !== undefined && newValue) {\n if (showDelayed) {\n showTooltipPromise = $timeout(function() {\n showTooltip(mouseEnterX);\n }, $scope.pluginScope.delay, false);\n } else {\n showTooltip(mouseEnterX);\n }\n } else if (!newValue) {\n if (!$scope.task.active) {\n hideTooltip();\n }\n }\n };\n\n mouseMoveHandler = smartEvent($scope, bodyElement, 'mousemove', debounce(function(e) {\n if (!visible) {\n mouseEnterX = e.clientX;\n displayTooltip(true, false);\n } else {\n // check if mouse goes outside the parent\n if(\n !$scope.taskRect ||\n e.clientX < $scope.taskRect.left ||\n e.clientX > $scope.taskRect.right ||\n e.clientY > $scope.taskRect.bottom ||\n e.clientY < $scope.taskRect.top\n ) {\n displayTooltip(false, false);\n }\n\n updateTooltip(e.clientX);\n }\n }, 5, false));\n\n $scope.getFromLabel = function() {\n var taskTooltips = $scope.task.model.tooltips;\n var rowTooltips = $scope.task.row.model.tooltips;\n\n if (typeof(taskTooltips) === 'boolean') {\n taskTooltips = {enabled: taskTooltips};\n }\n\n if (typeof(rowTooltips) === 'boolean') {\n rowTooltips = {enabled: rowTooltips};\n }\n\n var dateFormat = utils.firstProperty([taskTooltips, rowTooltips], 'dateFormat', $scope.pluginScope.dateFormat);\n return $scope.task.model.from.format(dateFormat);\n };\n\n $scope.getToLabel = function() {\n var taskTooltips = $scope.task.model.tooltips;\n var rowTooltips = $scope.task.row.model.tooltips;\n\n if (typeof(taskTooltips) === 'boolean') {\n taskTooltips = {enabled: taskTooltips};\n }\n\n if (typeof(rowTooltips) === 'boolean') {\n rowTooltips = {enabled: rowTooltips};\n }\n\n var dateFormat = utils.firstProperty([taskTooltips, rowTooltips], 'dateFormat', $scope.pluginScope.dateFormat);\n return $scope.task.model.to.format(dateFormat);\n };\n\n $scope.task.getContentElement().bind('mousemove', function(evt) {\n mouseEnterX = evt.clientX;\n });\n\n $scope.task.getContentElement().bind('mouseenter', function(evt) {\n mouseEnterX = evt.clientX;\n displayTooltip(true, true);\n });\n\n $scope.task.getContentElement().bind('mouseleave', function() {\n displayTooltip(false);\n });\n\n if ($scope.pluginScope.api.tasks.on.moveBegin) {\n $scope.pluginScope.api.tasks.on.moveBegin($scope, function(task) {\n if (task === $scope.task) {\n displayTooltip(true);\n }\n });\n\n $scope.pluginScope.api.tasks.on.moveEnd($scope, function(task) {\n if (task === $scope.task) {\n displayTooltip(false);\n }\n });\n\n $scope.pluginScope.api.tasks.on.resizeBegin($scope, function(task) {\n if (task === $scope.task) {\n displayTooltip(true);\n }\n });\n\n $scope.pluginScope.api.tasks.on.resizeEnd($scope, function(task) {\n if (task === $scope.task) {\n displayTooltip(false);\n }\n });\n }\n\n if ($scope.task.isMoving) {\n // Display tooltip because task has been moved to a new row\n displayTooltip(true, false);\n }\n\n $scope.gantt.api.directives.raise.new('ganttTooltip', $scope, $element);\n $scope.$on('$destroy', function() {\n $scope.gantt.api.directives.raise.destroy('ganttTooltip', $scope, $element);\n });\n }]\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.tree').directive('ganttRowTreeLabel', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttRowTreeLabel');\n builder.restrict = 'A';\n builder.templateUrl = undefined;\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.tree').directive('ganttSideContentTree', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttSideContentTree', 'plugins/tree/sideContentTree.tmpl.html');\n return builder.build();\n }]);\n}());\n\n","(function() {\n 'use strict';\n angular.module('gantt.tree').controller('GanttTreeController', ['$scope', '$filter', 'GanttHierarchy', function($scope, $filter, Hierarchy) {\n $scope.rootRows = [];\n\n $scope.getHeader = function() {\n return $scope.pluginScope.header;\n };\n\n var hierarchy = new Hierarchy();\n\n $scope.pluginScope.$watchGroup(['keepAncestorOnFilterRow', 'enabled'], function(value) {\n var keepAncestor = value[0] && value[1];\n\n if (keepAncestor) {\n var filterImpl = function(sortedRows, filterRow, filterRowComparator) {\n hierarchy.refresh(sortedRows);\n\n var leaves = [];\n for (var i = 0; i < sortedRows.length; i++) {\n var children = hierarchy.children(sortedRows[i]);\n if (!children || children.length === 0) {\n leaves.push(sortedRows[i]);\n }\n }\n\n var filteredLeaves = $filter('filter')(leaves, filterRow, filterRowComparator);\n\n var filterRowKeepAncestor = function(row) {\n if (filteredLeaves.indexOf(row) > -1) {\n return true;\n }\n\n var descendants = hierarchy.descendants(row);\n\n for (var i = 0; i < descendants.length; i++) {\n if (filteredLeaves.indexOf(descendants[i]) > -1) {\n return true;\n }\n }\n\n return false;\n };\n\n return $filter('filter')(sortedRows, filterRowKeepAncestor, filterRowComparator);\n };\n $scope.gantt.rowsManager.setFilterImpl(filterImpl);\n } else {\n $scope.gantt.rowsManager.setFilterImpl(false);\n }\n });\n\n var isVisible = function(row) {\n var parentRow = $scope.parent(row);\n while (parentRow !== undefined) {\n if (parentRow !== undefined && parentRow._collapsed) {\n return false;\n }\n parentRow = $scope.parent(parentRow);\n }\n return true;\n };\n\n var filterRowsFunction = function(rows) {\n return rows.filter(function(row) {\n return isVisible(row);\n });\n };\n\n var sortRowsFunction = function(rows) {\n var sortedRows = [];\n var rootRows = [];\n\n var hasParent = false;\n\n for (var i=0; i<rows.length; i++) {\n var rowParent = $scope.parent(rows[i]);\n if (rowParent === undefined) {\n rootRows.push(rows[i]);\n } else {\n hasParent = true;\n }\n }\n\n var handleChildren = function(row) {\n sortedRows.push(row);\n var children = $scope.children(row);\n\n\n if (children !== undefined && children.length > 0) {\n var sortedChildren = children.sort(function(a, b) {\n return rows.indexOf(a) - rows.indexOf(b);\n });\n\n for (var i=0;i<sortedChildren.length;i++) {\n handleChildren(sortedChildren[i]);\n }\n }\n };\n\n for (i=0; i<rootRows.length; i++) {\n handleChildren(rootRows[i]);\n }\n\n return sortedRows;\n };\n $scope.gantt.api.rows.addRowSorter(sortRowsFunction);\n $scope.gantt.api.rows.addRowFilter(filterRowsFunction);\n\n $scope.$on('$destroy', function() {\n $scope.gantt.api.rows.removeRowSorter(sortRowsFunction);\n $scope.gantt.api.rows.removeRowFilter(filterRowsFunction);\n });\n\n var refresh = function() {\n $scope.rootRows = hierarchy.refresh($scope.gantt.rowsManager.filteredRows);\n\n if ($scope.gantt.rowsManager.filteredRows.length > 0) {\n $scope.gantt.api.rows.sort();\n $scope.gantt.api.rows.refresh();\n }\n };\n\n $scope.gantt.api.rows.on.remove($scope, refresh);\n $scope.gantt.api.rows.on.add($scope, refresh);\n\n var isRowCollapsed = function(rowId) {\n var row;\n if (typeof rowId === 'string') {\n row = $scope.gantt.rowsManager.rowsMap[rowId];\n } else {\n row = rowId;\n }\n if (row === undefined) {\n return undefined;\n }\n if (row._collapsed === undefined) {\n return false;\n }\n return row._collapsed;\n };\n\n var expandRow = function(rowId) {\n var row;\n if (typeof rowId === 'string') {\n row = $scope.gantt.rowsManager.rowsMap[rowId];\n } else {\n row = rowId;\n }\n if (row === undefined) {\n return;\n }\n\n var rowScope = $scope.nodeScopes[row.model.id];\n if (rowScope.collapsed) {\n rowScope.toggle();\n }\n };\n\n var collapseRow = function(rowId) {\n var row;\n if (typeof rowId === 'string') {\n row = $scope.gantt.rowsManager.rowsMap[rowId];\n } else {\n row = rowId;\n }\n if (row === undefined) {\n return;\n }\n\n var rowScope = $scope.nodeScopes[row.model.id];\n if (!rowScope.collapsed) {\n rowScope.toggle();\n }\n };\n\n var getHierarchy = function() {\n return hierarchy;\n };\n\n $scope.getHeaderContent = function() {\n return $scope.pluginScope.headerContent;\n };\n\n $scope.gantt.api.registerMethod('tree', 'refresh', refresh, this);\n $scope.gantt.api.registerMethod('tree', 'isCollapsed', isRowCollapsed, this);\n $scope.gantt.api.registerMethod('tree', 'expand', expandRow, this);\n $scope.gantt.api.registerMethod('tree', 'collapse', collapseRow, this);\n\n $scope.gantt.api.registerEvent('tree', 'collapsed');\n\n $scope.gantt.api.registerMethod('tree', 'getHierarchy', getHierarchy, this);\n\n $scope.$watchCollection('gantt.rowsManager.filteredRows', function() {\n refresh();\n });\n\n $scope.children = function(row) {\n if (row === undefined) {\n return $scope.rootRows;\n }\n return hierarchy.children(row);\n };\n\n $scope.parent = function(row) {\n return hierarchy.parent(row);\n };\n\n $scope.nodeScopes = {};\n }]).controller('GanttUiTreeController', ['$scope', function($scope) {\n var collapseAll = function() {\n $scope.$broadcast('angular-ui-tree:collapse-all');\n };\n\n var expandAll = function() {\n $scope.$broadcast('angular-ui-tree:expand-all');\n };\n\n $scope.gantt.api.registerMethod('tree', 'collapseAll', collapseAll, $scope);\n $scope.gantt.api.registerMethod('tree', 'expandAll', expandAll, $scope);\n }]).controller('GanttTreeNodeController', ['$scope', function($scope) {\n $scope.$parent.nodeScopes[$scope.row.model.id] = $scope;\n $scope.$on('$destroy', function() {\n delete $scope.$parent.nodeScopes[$scope.row.model.id];\n });\n\n $scope.$watch('children(row)', function(newValue) {\n if (newValue) {\n // Children rows may have been filtered out\n // So we need to filter the raw hierarchy before displaying children in tree.\n var visibleRows = $scope.row.rowsManager.filteredRows;\n\n var filteredChildrenRows = [];\n for (var i = 0; i < newValue.length; i++) {\n var childRow = newValue[i];\n if (visibleRows.indexOf(childRow) > -1) {\n filteredChildrenRows.push(childRow);\n }\n }\n\n $scope.$parent.childrenRows = filteredChildrenRows;\n } else {\n $scope.$parent.childrenRows = newValue;\n }\n });\n\n $scope.isCollapseDisabled = function() {\n return !$scope.$parent.childrenRows || $scope.$parent.childrenRows.length === 0;\n };\n\n $scope.getValue = function() {\n return $scope.row.model.name;\n };\n\n $scope.getRowContent = function() {\n if ($scope.row.model.content !== undefined) {\n return $scope.row.model.content;\n }\n if ($scope.pluginScope.content !== undefined) {\n return $scope.pluginScope.content;\n }\n\n var content = $scope.row.rowsManager.gantt.options.value('rowContent');\n if (content === undefined) {\n content = '{{row.model.name}}';\n }\n return content;\n };\n\n $scope.$watch('collapsed', function(newValue) {\n if ($scope.$modelValue._collapsed !== newValue) {\n var oldValue = $scope.$modelValue._collapsed;\n $scope.$modelValue._collapsed = newValue; // $modelValue contains the Row object\n if (oldValue !== undefined && newValue !== oldValue) {\n $scope.gantt.api.tree.raise.collapsed($scope, $scope.$modelValue, newValue);\n $scope.gantt.api.rows.refresh();\n }\n }\n });\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.tree').directive('ganttTreeBody', ['GanttDirectiveBuilder', 'ganttLayout', function(Builder, layout) {\n var builder = new Builder('ganttTreeBody', 'plugins/tree/treeBody.tmpl.html');\n builder.controller = function($scope) {\n var hScrollBarHeight = layout.getScrollBarHeight();\n\n $scope.getLabelsCss = function() {\n var css = {};\n\n if ($scope.maxHeight) {\n var bodyScrollBarHeight = $scope.gantt.scroll.isHScrollbarVisible() ? hScrollBarHeight : 0;\n css['max-height'] = $scope.maxHeight - bodyScrollBarHeight - $scope.gantt.header.getHeight() + 'px';\n }\n\n return css;\n };\n };\n return builder.build();\n }]);\n}());\n\n\n","(function(){\n 'use strict';\n angular.module('gantt.tree').directive('ganttTreeHeader', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTreeHeader', 'plugins/tree/treeHeader.tmpl.html');\n return builder.build();\n }]);\n}());\n\n","angular.module('gantt.bounds.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/bounds/taskBounds.tmpl.html',\n '<div ng-cloak class=\"gantt-task-bounds\" ng-style=\"getCss()\" ng-class=\"getClass()\"></div>\\n' +\n '');\n}]);\n","angular.module('gantt.dependencies.templates', []).run(['$templateCache', function($templateCache) {\n\n}]);\n","angular.module('gantt.drawtask.templates', []).run(['$templateCache', function($templateCache) {\n\n}]);\n","angular.module('gantt.groups.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/groups/taskGroup.tmpl.html',\n '<div ng-controller=\"GanttGroupController\">\\n' +\n ' <div class=\"gantt-task-group-overview\" ng-if=\"taskGroup.overviewTasks.length > 0\">\\n' +\n ' <gantt-task-overview ng-repeat=\"task in taskGroup.overviewTasks\"></gantt-task-overview>\\n' +\n ' </div>\\n' +\n ' <div class=\"gantt-task-group-promote\" ng-if=\"taskGroup.row._collapsed && taskGroup.promotedTasks.length > 0\">\\n' +\n ' <gantt-task ng-repeat=\"task in taskGroup.promotedTasks\"></gantt-task>\\n' +\n ' </div>\\n' +\n ' <div class=\"gantt-task-group\"\\n' +\n ' ng-if=\"taskGroup.showGrouping\"\\n' +\n ' ng-style=\"{\\'left\\': taskGroup.left + \\'px\\', \\'width\\': taskGroup.width + \\'px\\'}\">\\n' +\n ' <div class=\"gantt-task-group-left-main\"></div>\\n' +\n ' <div class=\"gantt-task-group-right-main\"></div>\\n' +\n ' <div class=\"gantt-task-group-left-symbol\"></div>\\n' +\n ' <div class=\"gantt-task-group-right-symbol\"></div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '\\n' +\n '');\n $templateCache.put('plugins/groups/taskOverview.tmpl.html',\n '<div class=\"gantt-task gantt-task-overview\" ng-class=\"task.model.classes\">\\n' +\n ' <gantt-task-background></gantt-task-background>\\n' +\n ' <gantt-task-content></gantt-task-content>\\n' +\n ' <gantt-task-foreground></gantt-task-foreground>\\n' +\n '</div>\\n' +\n '\\n' +\n '');\n}]);\n","angular.module('gantt.labels.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/labels/labelsBody.tmpl.html',\n '<div class=\"gantt-labels-body\" ng-style=\"getLabelsCss()\">\\n' +\n ' <div gantt-vertical-scroll-receiver>\\n' +\n ' <div ng-repeat=\"row in gantt.rowsManager.visibleRows track by row.model.id\">\\n' +\n ' <div gantt-row-label\\n' +\n ' class=\"gantt-row-label gantt-row-height\"\\n' +\n ' ng-class=\"row.model.classes\"\\n' +\n ' ng-style=\"{\\'height\\': row.model.height}\">\\n' +\n ' <span class=\"gantt-label-text\">{{row.model.name}}</span>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '');\n $templateCache.put('plugins/labels/labelsHeader.tmpl.html',\n '<div class=\"gantt-labels-header\">\\n' +\n ' <div ng-show=\"gantt.columnsManager.columns.length > 0 && gantt.columnsManager.headers.length > 0\">\\n' +\n ' <div ng-repeat=\"header in gantt.columnsManager.headers\">\\n' +\n ' <div class=\"gantt-row-height\" ng-class=\"{\\'gantt-labels-header-row\\': $last, \\'gantt-labels-header-row-last\\': $last}\"><span>{{$last ? pluginScope.header : \"\"}}</span></div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '');\n $templateCache.put('plugins/labels/sideContentLabels.tmpl.html',\n '<div class=\"gantt-side-content-labels\">\\n' +\n ' <gantt-labels-header>\\n' +\n ' </gantt-labels-header>\\n' +\n ' <gantt-labels-body>\\n' +\n ' </gantt-labels-body>\\n' +\n '</div>\\n' +\n '');\n}]);\n","angular.module('gantt.movable.templates', []).run(['$templateCache', function($templateCache) {\n\n}]);\n","angular.module('gantt.overlap.templates', []).run(['$templateCache', function($templateCache) {\n\n}]);\n","angular.module('gantt.progress.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/progress/taskProgress.tmpl.html',\n '<div ng-cloak class=\"gantt-task-progress\" ng-style=\"getCss()\" ng-class=\"getClasses()\"></div>\\n' +\n '');\n}]);\n","angular.module('gantt.resizeSensor.templates', []).run(['$templateCache', function($templateCache) {\n\n}]);\n","angular.module('gantt.sortable.templates', []).run(['$templateCache', function($templateCache) {\n\n}]);\n","angular.module('gantt.table.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/table/sideContentTable.tmpl.html',\n '<div class=\"gantt-side-content-table\">\\n' +\n '\\n' +\n ' <div class=\"gantt-table-column {{getClass()}}\" ng-repeat=\"column in pluginScope.columns\" ng-controller=\"TableColumnController\">\\n' +\n '\\n' +\n ' <div class=\"gantt-table-header\" ng-style=\"{height: ganttHeaderHeight + \\'px\\'}\">\\n' +\n ' <div ng-show=\"ganttHeaderHeight\" class=\"gantt-row-label-header gantt-row-label gantt-table-row gantt-table-header-row\">\\n' +\n ' <span class=\"gantt-label-text\" gantt-bind-compile-html=\"getHeaderContent()\"/>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n '\\n' +\n ' <div class=\"gantt-table-content\" ng-style=\"getMaxHeightCss()\">\\n' +\n ' <div gantt-vertical-scroll-receiver>\\n' +\n ' <div class=\"gantt-table-row\" ng-repeat=\"row in gantt.rowsManager.visibleRows track by row.model.id\" ng-controller=\"TableColumnRowController\">\\n' +\n ' <div gantt-row-label class=\"gantt-row-label gantt-row-height\" ng-class=\"row.model.classes\" ng-style=\"{\\'height\\': row.model.height}\">\\n' +\n ' <div class=\"gantt-valign-container\">\\n' +\n ' <div class=\"gantt-valign-content\">\\n' +\n ' <span class=\"gantt-label-text\" gantt-bind-compile-html=\"getRowContent()\"></span>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n '\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '');\n}]);\n","angular.module('gantt.tooltips.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/tooltips/tooltip.tmpl.html',\n '<div ng-cloak\\n' +\n ' class=\"gantt-task-info\"\\n' +\n ' ng-show=\"displayed\"\\n' +\n ' ng-class=\"isRightAligned ? \\'gantt-task-infoArrowR\\' : \\'gantt-task-infoArrow\\'\"\\n' +\n ' ng-style=\"{top: taskRect.top + \\'px\\', marginTop: -elementHeight - 8 + \\'px\\'}\">\\n' +\n ' <div class=\"gantt-task-info-content\">\\n' +\n ' <div gantt-bind-compile-html=\"pluginScope.content\"></div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '');\n}]);\n","angular.module('gantt.tree.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/tree/sideContentTree.tmpl.html',\n '<div class=\"gantt-side-content-tree\" ng-controller=\"GanttTreeController\">\\n' +\n ' <gantt-tree-header>\\n' +\n ' </gantt-tree-header>\\n' +\n ' <gantt-tree-body>\\n' +\n ' </gantt-tree-body>\\n' +\n '</div>\\n' +\n '');\n $templateCache.put('plugins/tree/treeBody.tmpl.html',\n '<div class=\"gantt-tree-body\" ng-style=\"getLabelsCss()\">\\n' +\n ' <div gantt-vertical-scroll-receiver>\\n' +\n ' <div class=\"gantt-row-label-background\">\\n' +\n ' <div class=\"gantt-row-label gantt-row-height\"\\n' +\n ' ng-class=\"row.model.classes\"\\n' +\n ' ng-style=\"{\\'height\\': row.model.height}\"\\n' +\n ' ng-repeat=\"row in gantt.rowsManager.visibleRows track by row.model.id\">\\n' +\n ' \\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' <div ui-tree ng-controller=\"GanttUiTreeController\" data-drag-enabled=\"false\" data-empty-place-holder-enabled=\"false\">\\n' +\n ' <ol class=\"gantt-tree-root\" ui-tree-nodes ng-model=\"rootRows\">\\n' +\n ' <li ng-repeat=\"row in rootRows\" ui-tree-node\\n' +\n ' ng-include=\"\\'plugins/tree/treeBodyChildren.tmpl.html\\'\">\\n' +\n ' </li>\\n' +\n ' </ol>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '');\n $templateCache.put('plugins/tree/treeBodyChildren.tmpl.html',\n '<div ng-controller=\"GanttTreeNodeController\"\\n' +\n ' class=\"gantt-row-label gantt-row-height\"\\n' +\n ' ng-class=\"row.model.classes\"\\n' +\n ' ng-style=\"{\\'height\\': row.model.height}\">\\n' +\n ' <div class=\"gantt-valign-container\">\\n' +\n ' <div class=\"gantt-valign-content\">\\n' +\n ' <a ng-disabled=\"isCollapseDisabled()\" data-nodrag\\n' +\n ' class=\"gantt-tree-handle-button btn btn-xs\"\\n' +\n ' ng-class=\"{\\'gantt-tree-collapsed\\': collapsed, \\'gantt-tree-expanded\\': !collapsed}\"\\n' +\n ' ng-click=\"!isCollapseDisabled() && toggle()\"><span\\n' +\n ' class=\"gantt-tree-handle glyphicon glyphicon-chevron-down\"\\n' +\n ' ng-class=\"{\\n' +\n ' \\'glyphicon-chevron-right\\': collapsed, \\'glyphicon-chevron-down\\': !collapsed,\\n' +\n ' \\'gantt-tree-collapsed\\': collapsed, \\'gantt-tree-expanded\\': !collapsed}\"></span>\\n' +\n ' </a>\\n' +\n ' <span gantt-row-label class=\"gantt-label-text\" gantt-bind-compile-html=\"getRowContent()\"/>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '<ol ui-tree-nodes ng-class=\"{hidden: collapsed}\" ng-model=\"childrenRows\">\\n' +\n ' <li ng-repeat=\"row in childrenRows\" ui-tree-node>\\n' +\n ' <div ng-include=\"\\'plugins/tree/treeBodyChildren.tmpl.html\\'\"></div>\\n' +\n ' </li>\\n' +\n '</ol>\\n' +\n '');\n $templateCache.put('plugins/tree/treeHeader.tmpl.html',\n '<div class=\"gantt-tree-header\" ng-style=\"{height: $parent.ganttHeaderHeight + \\'px\\'}\">\\n' +\n ' <div ng-if=\"$parent.ganttHeaderHeight\" class=\"gantt-row-label gantt-row-label-header gantt-tree-row gantt-tree-header-row\"><span class=\"gantt-label-text\" gantt-bind-compile-html=\"getHeaderContent()\"/></div>\\n' +\n '</div>\\n' +\n '');\n}]);\n"]} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.min.css b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.min.css index 952c1d16fb453a930f1562b4fd5a5be7abdf730d..5c3dc3931166ae2f5955b67d6cd10b71545a800b 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.min.css +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.min.css @@ -1 +1 @@ -.gantt-task-group-left-main,.gantt-task-group-left-symbol{left:-6px}.gantt-task-group-right-main,.gantt-task-group-right-symbol{right:-6px}.gantt-task-bounds{height:125%;top:-12.5%;position:absolute;z-index:99;border:1px dashed;pointer-events:none}.gantt-task-bounds-in{border-color:#2E4F2E}.gantt-task-bounds-out{border-color:tomato}.gantt-task-group{position:absolute;background:#6388cd;height:30%;top:-25%;bottom:0;margin:auto}.gantt-task-group-left-main,.gantt-task-group-right-main{position:absolute;width:12px;height:100%;background:#6388cd;top:0;bottom:0;margin:auto 0}.gantt-task-group-left-symbol,.gantt-task-group-right-symbol{position:absolute;width:0;height:50%;top:75%;bottom:0;border-left:6px solid transparent;border-right:6px solid transparent;border-top:12px solid #6388cd}.gantt-task-overview{height:40%;top:40%;-webkit-filter:grayscale(.6);filter:grayscale(.6)}.gantt-task-overview .gantt-task-content{display:none}.gantt-labels-header-row{box-sizing:border-box;padding-left:12px;padding-right:12px;height:2em;white-space:nowrap;overflow:hidden}.gantt-labels-header-row span{box-sizing:border-box;display:inline-block;height:2em;text-align:center;padding-top:.5em;overflow:hidden;text-overflow:clip}.gantt-labels-header-row-last{border-bottom:1px solid #ddd}.gantt-labels-body,.gantt-labels-header{overflow:hidden}.gantt-task-moving,.gantt-task-resizing{z-index:750!important;opacity:.6;-webkit-filter:grayscale(.7);filter:grayscale(.7)}.gantt-task-overlaps{border:2px solid #e00000}.gantt-task-progress{position:absolute;overflow:hidden;bottom:0;height:6px;border-radius:2px}.gantt-row-label.on-dragging{background-color:#999!important}.gantt-row-label.on-drag-hover{border:1px solid #999}.gantt-table-header{overflow:hidden;position:relative}.gantt-table-header-row{position:absolute;bottom:0;width:100%}.gantt-table-header-row span.gantt-label-text{font-weight:700;white-space:nowrap;display:inline-block;padding-top:.5em;overflow:hidden;text-overflow:clip}div.gantt-table-content{overflow:hidden}.gantt-side-content-table>div.gantt-table-column{display:inline-block;overflow:hidden}.gantt-task-info{position:fixed;background:#fff;border:1px solid rgba(0,0,0,.2);border-radius:4px;box-shadow:0 5px 10px rgba(0,0,0,.2);padding:9px 12px;z-index:999}.gantt-tree-body .gantt-row-label span.gantt-label-text,.gantt-tree-body ol{padding-left:0}.gantt-task-info-content{line-height:1.1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gantt-task-infoArrow:before,.gantt-task-infoArrowR:before{position:absolute;top:100%;width:0;height:0;border-top:8px solid rgba(0,0,0,.1);border-right:8px solid transparent;border-left:8px solid transparent;content:''}.gantt-task-infoArrow:before{left:10px}.gantt-task-infoArrowR:before{right:10px}.gantt-task-infoArrow:after,.gantt-task-infoArrowR:after{position:absolute;top:100%;width:0;height:0;border-top:7px solid #fff;border-right:7px solid transparent;border-left:7px solid transparent;content:''}.gantt-task-infoArrow:after{left:11px}.gantt-task-infoArrowR:after{right:11px}.gantt-row-label-background{position:absolute;width:100%}.gantt-tree-body .gantt-row-label span{margin:0}.gantt-tree-body .gantt-row-label a.gantt-tree-handle-button,.gantt-tree-body .gantt-row-label span.gantt-tree-handle{padding:0;position:relative}.gantt-tree-header{overflow:hidden;position:relative}.gantt-tree-body{overflow:hidden}.gantt-tree-header-row{position:absolute;bottom:0;width:100%}.gantt-tree-header-row span.gantt-label-text{display:inline-block;padding-top:.5em;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:clip}.angular-ui-tree-handle{cursor:inherit;text-decoration:inherit;font-weight:inherit;min-height:inherit;line-height:inherit}.gantt-side-content-tree .gantt-tree-handle-button{pointer-events:auto} \ No newline at end of file +.gantt-task-group-right-main,.gantt-task-group-right-symbol{right:-6px}.gantt-task-bounds{height:125%;top:-12.5%;position:absolute;z-index:99;border:1px dashed;pointer-events:none}.gantt-task-bounds-in{border-color:#2E4F2E}.gantt-task-bounds-out{border-color:tomato}.gantt .gantt-body-dependencies{position:absolute;height:100%;width:100%}.gantt .gantt-endpoint.jsplumb-endpoint-anchor{z-index:20;overflow:hidden}.gantt .gantt-endpoint.fallback-endpoint.jsplumb-endpoint-anchor{z-index:auto;overflow:hidden}.gantt .gantt-endpoint-overlay.fallback-endpoint{height:4px;width:40px;top:-2px}.gantt .gantt-endpoint-overlay.start-endpoint.fallback-endpoint{left:-45px;background-image:-webkit-linear-gradient(left,rgba(255,255,255,0),#456);background-image:linear-gradient(to right,rgba(255,255,255,0),#456)}.gantt .gantt-endpoint-overlay.end-endpoint.fallback-endpoint{left:-5px;background-image:-webkit-linear-gradient(right,rgba(255,255,255,0),#456);background-image:linear-gradient(to left,rgba(255,255,255,0),#456)}.gantt .jsplumb-overlay{z-index:20}.gantt .gantt-endpoint-overlay{position:absolute}.gantt .gantt-endpoint-overlay.arrow-right{width:0;height:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000}.gantt .gantt-endpoint-overlay.arrow-right.start-endpoint{top:-5px;left:-11px;border-left-color:#4040a0}.gantt .gantt-endpoint-overlay.arrow-right.end-endpoint{top:-5px;left:6px;border-left-color:#40a040}.gantt-task-group-left-main,.gantt-task-group-left-symbol{left:-6px}.gantt .gantt-endpoint.source-endpoint svg *{fill:#40a040}.gantt .gantt-endpoint.target-endpoint svg *{fill:#4040a0}.gantt-task-group{position:absolute;background:#6388cd;height:30%;top:-25%;bottom:0;margin:auto}.gantt-task-group-left-main,.gantt-task-group-right-main{position:absolute;width:12px;height:100%;background:#6388cd;top:0;bottom:0;margin:auto 0}.gantt-task-group-left-symbol,.gantt-task-group-right-symbol{position:absolute;width:0;height:50%;top:75%;bottom:0;border-left:6px solid transparent;border-right:6px solid transparent;border-top:12px solid #6388cd}.gantt-task-overview{height:40%;top:40%;-webkit-filter:grayscale(.6);filter:grayscale(.6)}.gantt-task-overview .gantt-task-content{display:none}.gantt-labels-header-row{box-sizing:border-box;padding-left:12px;padding-right:12px;height:2em;white-space:nowrap;overflow:hidden}.gantt-labels-header-row span{box-sizing:border-box;display:inline-block;height:2em;text-align:center;padding-top:.5em;overflow:hidden;text-overflow:clip}.gantt-labels-header-row-last{border-bottom:1px solid #ddd}.gantt-labels-body,.gantt-labels-header{overflow:hidden}.gantt-task-moving,.gantt-task-resizing{z-index:750!important;opacity:.6;-webkit-filter:grayscale(.7);filter:grayscale(.7)}.gantt-task-overlaps{border:2px solid #e00000}.gantt-task-progress{position:absolute;overflow:hidden;bottom:0;height:6px;border-radius:2px}.gantt-row-label.on-dragging{background-color:#999!important}.gantt-row-label.on-drag-hover{border:1px solid #999}.gantt-table-header{overflow:hidden;position:relative}.gantt-table-header-row{position:absolute;bottom:0;width:100%}.gantt-table-header-row span.gantt-label-text{font-weight:700;white-space:nowrap;display:inline-block;padding-top:.5em;overflow:hidden;text-overflow:clip}div.gantt-table-content{overflow:hidden}.gantt-side-content-table>div.gantt-table-column{display:inline-block;overflow:hidden}.gantt-task-info{position:fixed;background:#fff;border:1px solid rgba(0,0,0,.2);border-radius:4px;box-shadow:0 5px 10px rgba(0,0,0,.2);padding:9px 12px;z-index:999}.gantt-tree-body .gantt-row-label span.gantt-label-text,.gantt-tree-body ol{padding-left:0}.gantt-task-info-content{line-height:1.1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gantt-task-infoArrow:before,.gantt-task-infoArrowR:before{position:absolute;top:100%;width:0;height:0;border-top:8px solid rgba(0,0,0,.1);border-right:8px solid transparent;border-left:8px solid transparent;content:''}.gantt-task-infoArrow:before{left:10px}.gantt-task-infoArrowR:before{right:10px}.gantt-task-infoArrow:after,.gantt-task-infoArrowR:after{position:absolute;top:100%;width:0;height:0;border-top:7px solid #fff;border-right:7px solid transparent;border-left:7px solid transparent;content:''}.gantt-task-infoArrow:after{left:11px}.gantt-task-infoArrowR:after{right:11px}.gantt-row-label-background{position:absolute;width:100%}.gantt-tree-body .gantt-row-label span{margin:0}.gantt-tree-body .gantt-row-label a.gantt-tree-handle-button,.gantt-tree-body .gantt-row-label span.gantt-tree-handle{padding:0;position:relative}.gantt-tree-header{overflow:hidden;position:relative}.gantt-tree-body{overflow:hidden}.gantt-tree-header-row{position:absolute;bottom:0;width:100%}.gantt-tree-header-row span.gantt-label-text{display:inline-block;padding-top:.5em;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:clip}.angular-ui-tree-handle{cursor:inherit;text-decoration:inherit;font-weight:inherit;min-height:inherit;line-height:inherit}.gantt-side-content-tree .gantt-tree-handle-button{pointer-events:auto} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.min.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.min.js index 24a99f7ea7f8705965753cfded65597ec7fab3e4..060ca9496008821cd66585e45764b4606ff81cf1 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.min.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.min.js @@ -1,11 +1,11 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com Github: https://github.com/angular-gantt/angular-gantt.git */ -!function(){"use strict";angular.module("gantt.bounds",["gantt","gantt.bounds.templates"]).directive("ganttBounds",["moment","$compile","$document",function(a,b,c){return{restrict:"E",require:"^gantt",scope:{enabled:"=?"},link:function(d,e,f,g){var h=g.gantt.api;if(d.options&&"object"==typeof d.options.bounds)for(var i in d.options.bounds)d[i]=d.options[i];void 0===d.enabled&&(d.enabled=!0),h.directives.on["new"](d,function(a,e,g){if("ganttTask"===a){var h=e.$new();h.pluginScope=d;var i=c[0].createElement("div");angular.element(i).attr("data-ng-if","task.model.est && task.model.lct && pluginScope.enabled");var j=c[0].createElement("gantt-task-bounds");void 0!==f.templateUrl&&angular.element(j).attr("data-template-url",f.templateUrl),void 0!==f.template&&angular.element(j).attr("data-template",f.template),angular.element(i).append(j),g.append(b(i)(h))}}),h.tasks.on.clean(d,function(b){void 0===b.est||a.isMoment(b.est)||(b.est=a(b.est)),void 0===b.lct||a.isMoment(b.lct)||(b.lct=a(b.lct))})}}}])}(),function(){"use strict";angular.module("gantt.drawtask",["gantt"]).directive("ganttDrawTask",["$document","ganttMouseOffset","moment",function(a,b,c){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",moveThreshold:"=?",taskModelFactory:"=taskFactory"},link:function(d,e,f,g){var h=g.gantt.api;void 0===d.enabled&&(d.enabled=!0),void 0===d.moveThreshold&&(d.moveThreshold=0),h.directives.on["new"](d,function(e,f,g){if("ganttRow"===e){var i=function(a){var b=h.core.getDateByPosition(a,!0),e=c(b),g=d.taskModelFactory();g.from=b,g.to=e;var i=f.row.addTask(g);i.isResizing=!0,i.updatePosAndSize(),f.row.updateVisibleTasks(),f.row.$scope.$digest()},j=function(c){var e=function(a){var f=b.getOffset(a).x;Math.abs(c-f)>=d.moveThreshold&&(g.off("mousemove",e),i(c))};g.on("mousemove",e),a.one("mouseup",function(){g.off("mousemove",e)})},k=function(a){var c=a.target?a.target:a.srcElement,e=angular.isFunction(d.enabled)?d.enabled(a):d.enabled;if(e&&c.className.indexOf("gantt-row")>-1){var f=b.getOffset(a).x;0===d.moveThreshold?i(f,f):j(f)}};g.on("mousedown",k),f.drawTaskHandler=k}}),h.directives.on.destroy(d,function(a,b,c){"ganttRow"===a&&(c.off("mousedown",b.drawTaskHandler),delete b.drawTaskHandler)})}}}])}(),function(){"use strict";angular.module("gantt.groups",["gantt","gantt.groups.templates"]).directive("ganttGroups",["ganttUtils","GanttHierarchy","$compile","$document",function(a,b,c,d){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",display:"=?"},link:function(a,e,f,g){function h(){a.hierarchy.refresh(g.gantt.rowsManager.filteredRows)}var i=g.gantt.api;if(a.options&&"object"==typeof a.options.sortable)for(var j in a.options.sortable)a[j]=a.options[j];void 0===a.enabled&&(a.enabled=!0),void 0===a.display&&(a.display="group"),a.hierarchy=new b,g.gantt.api.registerMethod("groups","refresh",h,this),g.gantt.$scope.$watchCollection("gantt.rowsManager.filteredRows",function(){h()}),i.directives.on["new"](a,function(b,e,g){if("ganttRow"===b){var h=e.$new();h.pluginScope=a;var i=d[0].createElement("div");angular.element(i).attr("data-ng-if","pluginScope.enabled");var j=d[0].createElement("gantt-task-group");void 0!==f.templateUrl&&angular.element(j).attr("data-template-url",f.templateUrl),void 0!==f.template&&angular.element(j).attr("data-template",f.template),angular.element(i).append(j),g.append(c(i)(h))}})}}}])}(),function(){"use strict";angular.module("gantt.labels",["gantt","gantt.labels.templates"]).directive("ganttLabels",["ganttUtils","$compile","$document","$log",function(a,b,c,d){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",header:"=?"},link:function(a,e,f,g){function h(){var a=g.gantt.side.$element[0].getElementsByClassName("gantt-row-label"),b=0;angular.forEach(a,function(a){var c=a.children[0].offsetWidth;b=Math.max(b,c)}),b>=0&&i.side.setWidth(b)}var i=g.gantt.api;if(d.warn("Angular Gantt Labels plugin is deprecated. Please use Table plugin instead."),a.options&&"object"==typeof a.options.sortable)for(var j in a.options.sortable)a[j]=a.options[j];void 0===a.enabled&&(a.enabled=!0),void 0===a.header&&(a.header="Name"),i.directives.on["new"](a,function(d,e,f){if("ganttSideContent"===d){var g=e.$new();g.pluginScope=a;var h=c[0].createElement("div");angular.element(h).attr("data-ng-if","pluginScope.enabled"),angular.element(h).addClass("side-element");var i=c[0].createElement("gantt-side-content-labels");angular.element(h).append(i),f.append(b(h)(g))}}),i.registerMethod("labels","fitSideWidth",h,this)}}}])}(),function(){"use strict";angular.module("gantt.movable",["gantt"]).directive("ganttMovable",["ganttMouseButton","ganttMouseOffset","ganttSmartEvent","ganttMovableOptions","ganttUtils","ganttDom","$window","$document","$timeout",function(a,b,c,d,e,f,g,h,i){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",allowMoving:"=?",allowResizing:"=?",allowRowSwitching:"=?"},link:function(j,k,l,m){var n=m.gantt.api;if(j.options&&"object"==typeof j.options.movable)for(var o in j.options.movable)j[o]=j.options[o];d.initialize(j),n.registerEvent("tasks","move"),n.registerEvent("tasks","moveBegin"),n.registerEvent("tasks","moveEnd"),n.registerEvent("tasks","resize"),n.registerEvent("tasks","resizeBegin"),n.registerEvent("tasks","resizeEnd"),n.registerEvent("tasks","change");var p,q,r="ontouchstart"in g||g.DocumentTouch&&h[0]instanceof g.DocumentTouch,s="touchstart mousedown",t="touchmove mousemove",u="touchend mouseup",v=15,w=5,x=3,y=15,z=5;n.directives.on["new"](j,function(d,k,l){if("ganttTask"===d){var n,o=angular.element(g),A=k.row.rowsManager.gantt.body.$element,B=k.row.rowsManager.gantt.scroll.$element,C=!1,D=!1,E=k.task.getForegroundElement(),F=k.task.getContentElement(),G=function(c){c.preventDefault(),r&&(c=b.getTouch(c));var d=k.task.model.movable,f=k.task.row.model.movable;"boolean"==typeof d&&(d={enabled:d}),"boolean"==typeof f&&(f={enabled:f});var g=e.firstProperty([d,f],"enabled",j.enabled),h=angular.isFunction(g)?g(c):g;if(h){var i=b.getOffsetForElement(E[0],c).x,l=M(i);if(""!==l&&1===a.getButton(c)){var m=b.getOffsetForElement(A[0],c).x;P(l,m)}k.$digest()}};E.on(s,G),F.on(s,G);var H=function(a){var c=k.task.model.movable,d=k.task.row.model.movable;"boolean"==typeof c&&(c={enabled:c}),"boolean"==typeof d&&(d={enabled:d});var f=e.firstProperty([c,d],"enabled",j.enabled),g=angular.isFunction(f)?f(a):f;if(g&&!k.task.isMoving){var h=b.getOffsetForElement(E[0],a).x,i=M(h);""!==i&&"M"!==i?(E.css("cursor",N(i)),F.css("cursor",N(i))):(E.css("cursor",""),F.css("cursor",""))}};E.on("mousemove",H),F.on("mousemove",H);var I=function(a){k.task.isMoving&&!k.destroyed&&(L(),J(a),K(a))},J=function(a){var c=C,d=b.getOffsetForElement(A[0],a),g=d.x;k.task.mouseOffsetX=g;var i=k.task.row.rowsManager.gantt.options.value("taskOutOfRange"),l=k.task.model.movable,n=k.task.row.model.movable;if("boolean"==typeof l&&(l={enabled:l}),"boolean"==typeof n&&(n={enabled:n}),"M"===k.task.moveMode){var o=e.firstProperty([l,n],"allowRowSwitching",j.allowRowSwitching);if(o){var q=B[0].getBoundingClientRect(),r=q.left+q.width/2,s=angular.element(h[0].querySelectorAll(".gantt-body"));s.css("pointer-events","auto");var t=f.findElementFromPoint(r,a.clientY,function(a){return angular.element(a).hasClass("gantt-row")});s.css("pointer-events","");for(var u,v=m.gantt.rowsManager.rows,w=0,x=v.length;x>w;w++)if(t===v[w].$element[0]){u=v[w];break}var y=k.task.row;void 0!==u&&y!==u&&(u.moveTaskToRow(k.task,!0),y.$scope.$digest(),u.$scope.$digest(),C=!0)}var z=e.firstProperty([l,n],"allowMoving",j.allowMoving);z&&(g-=p,"truncate"!==i&&(0>g?g=0:g+k.task.width>=k.gantt.width&&(g=k.gantt.width-k.task.width)),k.task.moveTo(g,!0),k.$digest(),C&&k.row.rowsManager.gantt.api.tasks.raise.move(k.task),C=!0)}else"E"===k.task.moveMode?(g<=k.task.left&&(g=k.task.left,k.task.moveMode="W",O(N(k.task.moveMode))),"truncate"!==i&&g>=k.gantt.width&&(g=k.gantt.width),k.task.setTo(g,!0),k.$digest(),C&&k.row.rowsManager.gantt.api.tasks.raise.resize(k.task),C=!0):(g>k.task.left+k.task.width&&(g=k.task.left+k.task.width,k.task.moveMode="E",O(N(k.task.moveMode))),"truncate"!==i&&0>g&&(g=0),k.task.setFrom(g,!0),k.$digest(),C&&k.row.rowsManager.gantt.api.tasks.raise.resize(k.task),C=!0);if(!c&&C&&!D){var E=k.task.getBackgroundElement();"M"===k.task.moveMode?(E.addClass("gantt-task-moving"),k.row.rowsManager.gantt.api.tasks.raise.moveBegin(k.task)):(E.addClass("gantt-task-resizing"),k.row.rowsManager.gantt.api.tasks.raise.resizeBegin(k.task))}},K=function(a){var c=b.getOffsetForElement(A[0],a),d=B[0].scrollLeft,e=B[0].offsetWidth,f=B[0].scrollWidth,g=d+e,h=!1;c.x<q?d>0&&c.x<=d+z&&(c.x-=y,h=!0,k.row.rowsManager.gantt.api.scroll.left(y)):f>g&&c.x>=g-z&&(c.x+=y,h=!0,k.row.rowsManager.gantt.api.scroll.right(y)),h&&(n=i(function(){I(a)},100,!0))},L=function(){void 0!==n&&(i.cancel(n),n=void 0)},M=function(a){var b=0,c=k.task.model.movable,d=k.task.row.model.movable;"boolean"==typeof c&&(c={enabled:c}),"boolean"==typeof d&&(d={enabled:d});var f=e.firstProperty([c,d],"allowResizing",j.allowResizing),g=e.firstProperty([c,d],"allowRowSwitching",j.allowRowSwitching),h=e.firstProperty([c,d],"allowMoving",j.allowMoving);return f&&(b=E[0].offsetWidth<v?x:w),f&&a>E[0].offsetWidth-b?"E":f&&b>a?"W":(h||g)&&a>=b&&a<=E[0].offsetWidth-b?"M":""},N=function(a){switch(a){case"E":return"e-resize";case"W":return"w-resize";case"M":return"move"}},O=function(a){l.css("cursor",a),angular.element(h[0].body).css({"-moz-user-select":""===a?"":"-moz-none","-webkit-user-select":""===a?"":"none","-ms-user-select":""===a?"":"none","user-select":""===a?"":"none",cursor:a})},P=function(a,d){void 0===k.task.originalModel&&(k.task.originalRow=k.task.row,k.task.originalModel=k.task.model,k.task.model=angular.copy(k.task.originalModel)),D||(q=d,p=d-k.task.modelLeft),C=!1,k.task.moveMode=a,k.task.isMoving=!0,k.task.active=!0;var e=function(a){a.stopImmediatePropagation(),r&&(a=b.getTouch(a)),I(a)},f=c(k,o,t,e);f.bind(),c(k,o,u,function(a){r&&(a=b.getTouch(a)),f.unbind(),Q(a),k.$digest()}).bindOnce(),O(N(a))},Q=function(){var a=k.task.getBackgroundElement();if(a.removeClass("gantt-task-moving"),a.removeClass("gantt-task-resizing"),void 0!==k.task.originalModel){if(angular.extend(k.task.originalModel,k.task.model),k.task.model=k.task.originalModel,k.task.row.model.id!==k.task.originalRow.model.id){var b=k.task.row;b.removeTask(k.task.model.id,!1,!0),k.task.row=k.task.originalRow,b.moveTaskToRow(k.task,!1)}delete k.task.originalModel,delete k.task.originalRow,k.$apply()}D=!1,k.task.isMoving=!1,k.task.active=!1,L(),O(""),C===!0&&("M"===k.task.moveMode?k.row.rowsManager.gantt.api.tasks.raise.moveEnd(k.task):k.row.rowsManager.gantt.api.tasks.raise.resizeEnd(k.task),C=!1,k.task.row.sortTasks(),k.row.rowsManager.gantt.api.tasks.raise.change(k.task)),k.task.moveMode=void 0};k.$on("$destroy",function(){k.destroyed=!0,L()}),k.task.isResizing?(D=!0,P("E",k.task.mouseOffsetX),delete k.task.isResizing):k.task.isMoving&&(D=!0,P("M",k.task.mouseOffsetX))}})}}}])}(),function(){"use strict";angular.module("gantt.overlap",["gantt","gantt.overlap.templates"]).directive("ganttOverlap",["moment",function(a){return{restrict:"E",require:"^gantt",scope:{enabled:"=?"},link:function(b,c,d,e){var f=e.gantt.api;void 0===b.enabled&&(b.enabled=!0),b.enabled&&f.tasks.on.change(b,function(a){b.handleOverlaps(a)});var g={};b.handleOverlaps=function(b){var c=b.row.tasks,d={},e={};angular.forEach(c,function(a){e[a.model.id]=a}),angular.forEach(c,function(b){var f,h;b.model.from.isBefore(b.model.to)?(f=b.model.from,h=b.model.to):(f=b.model.to,h=b.model.from);var i=a().range(f,h);angular.forEach(c,function(c){if(b.model.id!==c.model.id){var f,h;c.model.from.isBefore(c.model.to)?(f=c.model.from,h=c.model.to):(f=c.model.to,h=c.model.from);var j=a().range(f,h);j.overlaps(i)&&(g.hasOwnProperty(c.model.id)||(d[c.model.id]=c),delete e[c.model.id],g.hasOwnProperty(b.model.id)||(d[b.model.id]=b),delete e[b.model.id])}})}),angular.forEach(e,function(a){a.$element&&a.$element.removeClass("gantt-task-overlaps"),delete g[a.model.id]}),angular.forEach(d,function(a){a.$element&&a.$element.addClass("gantt-task-overlaps"),g[a.model.id]=a}),g=d}}}}])}(),function(){"use strict";angular.module("gantt.progress",["gantt","gantt.progress.templates"]).directive("ganttProgress",["moment","$compile","$document",function(a,b,c){return{restrict:"E",require:"^gantt",scope:{enabled:"=?"},link:function(d,e,f,g){var h=g.gantt.api;if(d.options&&"object"==typeof d.options.progress)for(var i in d.options.progress)d[i]=d.options[i];void 0===d.enabled&&(d.enabled=!0),h.directives.on["new"](d,function(a,e,g){if("ganttTaskBackground"===a){var h=e.$new();h.pluginScope=d;var i=c[0].createElement("div");angular.element(i).attr("data-ng-if","task.model.progress !== undefined && pluginScope.enabled");var j=c[0].createElement("gantt-task-progress");void 0!==f.templateUrl&&angular.element(j).attr("data-template-url",f.templateUrl),void 0!==f.template&&angular.element(j).attr("data-template",f.template),angular.element(i).append(j),g.append(b(i)(h))}}),h.tasks.on.clean(d,function(b){void 0===b.est||a.isMoment(b.est)||(b.est=a(b.est)),void 0===b.lct||a.isMoment(b.lct)||(b.lct=a(b.lct))})}}}])}(),function(){"use strict";angular.module("gantt.resizeSensor",["gantt"]).directive("ganttResizeSensor",[function(){return{restrict:"E",require:"^gantt",scope:{enabled:"=?"},link:function(a,b,c,d){function e(){var a=b.parent().parent().parent()[0].querySelectorAll("div.gantt")[0];return new ResizeSensor(a,function(){d.gantt.$scope.ganttElementWidth=a.clientWidth,d.gantt.$scope.$apply()})}var f=d.gantt.api;if(a.options&&"object"==typeof a.options.progress)for(var g in a.options.progress)a[g]=a.options[g];void 0===a.enabled&&(a.enabled=!0);var h=!1;f.core.on.rendered(a,function(){h=!0,void 0!==i&&i.detach(),a.enabled&&(ElementQueries.update(),i=e())});var i;a.$watch("enabled",function(a){h&&(a&&void 0===i?(ElementQueries.update(),i=e()):a||void 0===i||(i.detach(),i=void 0))})}}}])}(),function(){"use strict";for(var a,b="gantt.sortable",c="ganttSortable",d=["gantt",{module:"ang-drag-drop",url:"https://github.com/ganarajpr/angular-dragdrop.git#master"}],e=[],f=[],g=0,h=d.length;h>g;g++){var i=d[g];try{angular.isString(i)&&(i={module:i},d[g]=i),angular.module(i.module),f.push(i.module)}catch(j){i.exception=j,e.push(i)}}e.length>0?angular.module(b,[]).directive(c,["$log",function(d){return{restrict:"E",require:"^gantt",scope:{enabled:"=?"},link:function(){d.warn(b+" module can't require some dependencies:");for(var f=0,g=e.length;g>f;f++){a=e[f];var h=a.module;a.url&&(h+=" ("+a.url+")"),a.exception&&a.exception.message&&(h+=": "+a.exception.message),d.warn(h)}d.warn(c+" plugin directive won't be available")}}}]):angular.module(b,f).directive(c,["ganttUtils","$compile",function(a,b){return{restrict:"E",require:"^gantt",scope:{enabled:"=?"},link:function(c,d,e,f){var g=f.gantt.api;if(c.options&&"object"==typeof c.options.sortable)for(var h in c.options.sortable)c[h]=c.options[h];void 0===c.enabled&&(c.enabled=!0),g.directives.on["new"](c,function(d,e,f){"ganttRowLabel"===d&&void 0===f.attr("drag")&&(e.checkDraggable=function(){var b=e.row.model.sortable;return"boolean"==typeof b&&(b={enabled:b}),a.firstProperty([b],"enabled",c.enabled)},e.onDropSuccess=function(){e.$evalAsync()},e.onDrop=function(a,b){var c=e.row.rowsManager.rowsMap[b.id];c!==e&&(e.row.rowsManager.moveRow(c,e.row),e.$evalAsync())},f.attr("ui-draggable","{{checkDraggable()}}"),f.attr("drag-channel","'sortable'"),f.attr("ui-on-drop","onDrop($event, $data)"),f.attr("on-drop-success","onDropSuccess()"),f.attr("drop-channel","'sortable'"),f.attr("drag","row.model"),b(f)(e))})}}}])}(),function(){"use strict";angular.module("gantt.table",["gantt","gantt.table.templates"]).directive("ganttTable",["ganttUtils","$compile","$document",function(a,b,c){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",columns:"=?",headers:"=?",classes:"=?",contents:"=?",headerContents:"=?",formatters:"=?",headerFormatter:"=?"},link:function(a,d,e,f){var g=f.gantt.api;if(a.options&&"object"==typeof a.options.sortable)for(var h in a.options.sortable)a[h]=a.options[h];void 0===a.enabled&&(a.enabled=!0),void 0===a.columns&&(a.columns=["model.name"]),void 0===a.headers&&(a.headers={"model.name":"Name"}),void 0===a.contents&&(a.contents={}),void 0===a.headerContents&&(a.headerContents={}),void 0===a.classes&&(a.classes={}),void 0===a.formatters&&(a.formatters={}),g.directives.on["new"](a,function(d,e,f){if("ganttSideContent"===d){var g=e.$new();g.pluginScope=a;var h=c[0].createElement("div");angular.element(h).attr("data-ng-if","pluginScope.enabled"),angular.element(h).addClass("side-element");var i=c[0].createElement("gantt-side-content-table");angular.element(h).append(i),f.append(b(h)(g))}})}}}])}(),function(){"use strict";angular.module("gantt.tooltips",["gantt","gantt.tooltips.templates"]).directive("ganttTooltips",["$compile","$document",function(a,b){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",dateFormat:"=?",content:"=?"},link:function(c,d,e,f){var g=f.gantt.api;if(c.options&&"object"==typeof c.options.tooltips)for(var h in c.options.tooltips)c[h]=c.options[h];void 0===c.enabled&&(c.enabled=!0),void 0===c.dateFormat&&(c.dateFormat="MMM DD, HH:mm"),void 0===c.content&&(c.content="{{task.model.name}}</br><small>{{task.isMilestone() === true && getFromLabel() || getFromLabel() + ' - ' + getToLabel()}}</small>"),c.api=g,g.directives.on["new"](c,function(d,f,g){if("ganttTask"===d){var h=f.$new();h.pluginScope=c;var i=b[0].createElement("div");angular.element(i).attr("data-ng-if","pluginScope.enabled");var j=b[0].createElement("gantt-tooltip");void 0!==e.templateUrl&&angular.element(j).attr("data-template-url",e.templateUrl),void 0!==e.template&&angular.element(j).attr("data-template",e.template),angular.element(i).append(j),g.append(a(i)(h))}})}}}])}(),function(){"use strict";angular.module("gantt.tree",["gantt","gantt.tree.templates","ui.tree"]).directive("ganttTree",["ganttUtils","$compile","$document",function(a,b,c){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",header:"=?",content:"=?",headerContent:"=?",keepAncestorOnFilterRow:"=?"},link:function(a,d,e,f){var g=f.gantt.api;if(a.options&&"object"==typeof a.options.sortable)for(var h in a.options.sortable)a[h]=a.options[h];void 0===a.enabled&&(a.enabled=!0),void 0===a.header&&(a.header="Name"),void 0===a.headerContent&&(a.headerContent="{{getHeader()}}"),void 0===a.keepAncestorOnFilterRow&&(a.keepAncestorOnFilterRow=!1),g.directives.on["new"](a,function(d,e,f){if("ganttSideContent"===d){var g=e.$new();g.pluginScope=a;var h=c[0].createElement("div");angular.element(h).attr("data-ng-if","pluginScope.enabled"),angular.element(h).addClass("side-element");var i=c[0].createElement("gantt-side-content-tree");angular.element(h).append(i),f.append(b(h)(g))}})}}}])}(),function(){"use strict";angular.module("gantt.bounds").directive("ganttTaskBounds",["$templateCache","moment",function(a,b){return{restrict:"E",templateUrl:function(b,c){var d;return d=void 0===c.templateUrl?"plugins/bounds/taskBounds.tmpl.html":c.templateUrl,c.template&&a.put(d,c.template),d},replace:!0,scope:!0,controller:["$scope","$element",function(a,c){c.toggleClass("ng-hide",!0),a.simplifyMoment=function(a){return b.isMoment(a)?a.unix():a},a.$watchGroup(["simplifyMoment(task.model.est)","simplifyMoment(task.model.lct)","task.left","task.width"],function(){var b=a.task.rowsManager.gantt.getPositionByDate(a.task.model.est),d=a.task.rowsManager.gantt.getPositionByDate(a.task.model.lct);c.css("left",b-a.task.left+"px"),c.css("width",d-b+"px"),c.toggleClass("gantt-task-bounds-in",!1),c.toggleClass("gantt-task-bounds-out",!1),void 0===a.task.model.est||void 0===a.task.model.lct?c.toggleClass("gantt-task-bounds-in",!0):a.task.model.est>a.task.model.from?c.toggleClass("gantt-task-bounds-out",!0):a.task.model.lct<a.task.model.to?c.toggleClass("gantt-task-bounds-out",!0):c.toggleClass("gantt-task-bounds-in",!0)}),a.task.$element.bind("mouseenter",function(){c.toggleClass("ng-hide",!1)}),a.task.$element.bind("mouseleave",function(){c.toggleClass("ng-hide",!0)}),a.task.rowsManager.gantt.api.directives.raise["new"]("ganttBounds",a,c),a.$on("$destroy",function(){a.task.rowsManager.gantt.api.directives.raise.destroy("ganttBounds",a,c)})}]}}])}(),function(){"use strict";angular.module("gantt.groups").controller("GanttGroupController",["$scope","GanttTaskGroup","ganttUtils",function(a,b,c){var d=function(){var d=a.row.model.groups;"boolean"==typeof d&&(d={enabled:d});var e=c.firstProperty([d],"enabled",a.pluginScope.enabled);e?(a.display=c.firstProperty([d],"display",a.pluginScope.display),a.taskGroup=new b(a.row,a.pluginScope),a.row.setFromTo(),a.row.setFromToByValues(a.taskGroup.from,a.taskGroup.to)):(a.taskGroup=void 0,a.display=void 0)};a.gantt.api.tasks.on.change(a,function(b){if(void 0!==a.taskGroup)if(a.taskGroup.tasks.indexOf(b)>-1)a.$evalAsync(function(){d()});else{var c=a.pluginScope.hierarchy.descendants(a.row);c.indexOf(b.row)>-1&&a.$evalAsync(function(){d()})}});var e=a.pluginScope.$watch("display",d);a.$watchCollection("gantt.rowsManager.filteredRows",d),a.gantt.api.columns.on.refresh(a,d),a.$on("$destroy",e)}])}(),function(){"use strict";angular.module("gantt.groups").directive("ganttTaskGroup",["GanttDirectiveBuilder",function(a){var b=new a("ganttTaskGroup","plugins/groups/taskGroup.tmpl.html");return b.build()}])}(),function(){"use strict";angular.module("gantt").factory("GanttTaskGroup",["ganttUtils","GanttTask",function(a,b){var c=function(c,d){var e=this;e.row=c,e.pluginScope=d,e.descendants=e.pluginScope.hierarchy.descendants(e.row),e.tasks=[],e.overviewTasks=[],e.promotedTasks=[],e.showGrouping=!1;var f=e.row.model.groups;"boolean"==typeof f&&(f={enabled:f});var g=function(b){var c=b.model.groups;"boolean"==typeof c&&(c={enabled:c});var d=b.row.model.groups;"boolean"==typeof d&&(d={enabled:d});var g=a.firstProperty([c,d,f],"enabled",e.pluginScope.enabled);if(g){var h=a.firstProperty([c,d,f],"display",e.pluginScope.display);return h}};angular.forEach(e.descendants,function(a){angular.forEach(a.tasks,function(a){var c=g(a);if(void 0!==c){e.tasks.push(a);var d=new b(e.row,a.model);"overview"===c?e.overviewTasks.push(d):"promote"===c?e.promotedTasks.push(d):e.showGrouping=!0}})}),e.from=void 0,angular.forEach(e.tasks,function(a){(void 0===e.from||a.model.from<e.from)&&(e.from=a.model.from)}),e.to=void 0,angular.forEach(e.tasks,function(a){(void 0===e.to||a.model.to>e.to)&&(e.to=a.model.to)}),e.showGrouping&&(e.left=c.rowsManager.gantt.getPositionByDate(e.from),e.width=c.rowsManager.gantt.getPositionByDate(e.to)-e.left)};return c}])}(),function(){"use strict";angular.module("gantt").directive("ganttTaskOverview",["GanttDirectiveBuilder",function(a){var b=new a("ganttTaskOverview","plugins/groups/taskOverview.tmpl.html");return b.controller=function(a,b){a.task.$element=b,a.task.$scope=a,a.task.updatePosAndSize()},b.build()}])}(),function(){"use strict";angular.module("gantt.labels").directive("ganttLabelsBody",["GanttDirectiveBuilder","ganttLayout",function(a,b){var c=new a("ganttLabelsBody","plugins/labels/labelsBody.tmpl.html");return c.controller=function(a){var c=b.getScrollBarHeight();a.getLabelsCss=function(){var b={};if(a.maxHeight){var d=a.gantt.scroll.isHScrollbarVisible()?c:0;b["max-height"]=a.maxHeight-d-a.gantt.header.getHeight()+"px"}return b}},c.build()}])}(),function(){"use strict";angular.module("gantt.labels").directive("ganttLabelsHeader",["GanttDirectiveBuilder",function(a){var b=new a("ganttLabelsHeader","plugins/labels/labelsHeader.tmpl.html");return b.build()}])}(),function(){"use strict";angular.module("gantt.labels").directive("ganttSideContentLabels",["GanttDirectiveBuilder",function(a){var b=new a("ganttSideContentLabels","plugins/labels/sideContentLabels.tmpl.html");return b.build()}])}(),function(){"use strict";angular.module("gantt.movable").factory("ganttMovableOptions",[function(){return{initialize:function(a){return a.enabled=void 0!==a.enabled?!!a.enabled:!0,a.allowMoving=void 0!==a.allowMoving?!!a.allowMoving:!0,a.allowResizing=void 0!==a.allowResizing?!!a.allowResizing:!0,a.allowRowSwitching=void 0!==a.allowRowSwitching?!!a.allowRowSwitching:!0,a}}}])}(),function(){"use strict";angular.module("gantt.progress").directive("ganttTaskProgress",["$templateCache",function(a){return{restrict:"E",requires:"^ganttTask",templateUrl:function(b,c){var d;return d=void 0===c.templateUrl?"plugins/progress/taskProgress.tmpl.html":c.templateUrl,void 0!==c.template&&a.put(d,c.template),d},replace:!0,scope:!0,controller:["$scope","$element",function(a,b){a.getClasses=function(){var b=[];return"object"==typeof a.task.model.progress&&(b=a.task.model.progress.classes),b},a.getCss=function(){var b,c={};return void 0!==a.task.model.progress&&(b="object"==typeof a.task.model.progress?a.task.model.progress:{percent:a.task.model.progress}),b&&(b.color?c["background-color"]=b.color:c["background-color"]="#6BC443",c.width=b.percent+"%"),c},a.task.rowsManager.gantt.api.directives.raise["new"]("ganttTaskProgress",a,b),a.$on("$destroy",function(){a.task.rowsManager.gantt.api.directives.raise.destroy("ganttTaskProgress",a,b)})}]}}])}(),function(){"use strict";angular.module("gantt.table").directive("ganttSideContentTable",["GanttDirectiveBuilder","ganttLayout",function(a,b){var c=new a("ganttSideContentTable","plugins/table/sideContentTable.tmpl.html");return c.controller=function(a){var c=b.getScrollBarHeight();a.getMaxHeightCss=function(){var b={};if(a.maxHeight){var d=a.gantt.scroll.isHScrollbarVisible()?c:0;b["max-height"]=a.maxHeight-d-a.gantt.header.getHeight()+"px"}return b}},c.build()}])}(),function(){"use strict";angular.module("gantt.table").controller("TableColumnController",["$scope",function(a){a.getHeader=function(){var b=a.pluginScope.headers[a.column];return void 0!==b?b:(void 0!==a.pluginScope.headerFormatter&&(b=a.pluginScope.headerFormatter(a.column)),void 0!==b?b:b)},a.getHeaderContent=function(){var b=a.pluginScope.headerContents[a.column];return void 0===b?"{{getHeader()}}":b},a.getClass=function(){return a.pluginScope.classes[a.column]}}])}(),function(){"use strict";angular.module("gantt.table").controller("TableColumnRowController",["$scope",function(a){a.getValue=function(){var b=a.$eval(a.column,a.row),c=a.pluginScope.formatters[a.column];return void 0!==c&&(b=c(b,a.column,a.row)),b},a.getRowContent=function(){var b;return a.row.model.columnContents&&(b=a.row.model.columnContents[a.column]),void 0===b&&"model.name"===a.column&&(b=a.row.model.content),void 0===b&&(b=a.pluginScope.contents[a.column]),void 0===b&&"model.name"===a.column&&(b=a.row.rowsManager.gantt.options.value("rowContent")),void 0===b&&void 0!==a.pluginScope.content&&(b=a.pluginScope.content),void 0===b?"{{getValue()}}":b}}])}(),function(){"use strict";angular.module("gantt.tooltips").directive("ganttTooltip",["$log","$timeout","$compile","$document","$templateCache","ganttDebounce","ganttSmartEvent",function(a,b,c,d,e,f,g){return{restrict:"E",templateUrl:function(a,b){var c;return c=void 0===b.templateUrl?"plugins/tooltips/tooltip.tmpl.html":b.templateUrl,void 0!==b.template&&e.put(c,b.template),c},scope:!0,replace:!0,controller:["$scope","$element","ganttUtils",function(a,c,e){var h,i,j=angular.element(d[0].body),k=a.task.$element,l=!1;a.getFromLabel=function(){var b=a.task.model.tooltips,c=a.task.row.model.tooltips;"boolean"==typeof b&&(b={enabled:b}),"boolean"==typeof c&&(c={enabled:c});var d=e.firstProperty([b,c],"dateFormat",a.pluginScope.dateFormat);return a.task.model.from.format(d)},a.getToLabel=function(){var b=a.task.model.tooltips,c=a.task.row.model.tooltips;"boolean"==typeof b&&(b={enabled:b}),"boolean"==typeof c&&(c={enabled:c});var d=e.firstProperty([b,c],"dateFormat",a.pluginScope.dateFormat);return a.task.model.to.format(d)};var m=g(a,j,"mousemove",f(function(b){l?((!a.taskRect||b.clientX<a.taskRect.left||b.clientX>a.taskRect.right||b.clientY>a.taskRect.bottom||b.clientY<a.taskRect.top)&&n(!1,!1),q(b.clientX)):(i=b.clientX,n(!0,!1))},5,!1));a.task.getContentElement().bind("mousemove",function(a){i=a.clientX}),a.task.getContentElement().bind("mouseenter",function(a){i=a.clientX,n(!0,!0)}),a.task.getContentElement().bind("mouseleave",function(){n(!1)}),a.pluginScope.api.tasks.on.moveBegin&&(a.pluginScope.api.tasks.on.moveBegin(a,function(b){b===a.task&&n(!0)}),a.pluginScope.api.tasks.on.moveEnd(a,function(b){b===a.task&&n(!1)}),a.pluginScope.api.tasks.on.resizeBegin(a,function(b){b===a.task&&n(!0)}),a.pluginScope.api.tasks.on.resizeEnd(a,function(b){b===a.task&&n(!1)}));var n=function(c,d){h&&b.cancel(h);var f=a.task.model.tooltips,g=a.task.row.model.tooltips;"boolean"==typeof f&&(f={enabled:f}),"boolean"==typeof g&&(g={enabled:g});var j=e.firstProperty([f,g],"enabled",a.pluginScope.enabled);j&&!l&&void 0!==i&&c?d?h=b(function(){o(i)},500,!1):o(i):c||a.task.active||r()},o=function(b){l=!0,m.bind(),a.displayed=!0,a.$evalAsync(function(){var d;c.hasClass("ng-hide")&&(c.removeClass("ng-hide"),d=!0),a.elementHeight=c[0].offsetHeight,d&&c.addClass("ng-hide"),a.taskRect=k[0].getBoundingClientRect(),q(b)})},p=function(){var a=d[0];return a.documentElement.clientWidth||a.documentElement.getElementById("body")[0].clientWidth},q=function(b){b+c[0].offsetWidth>p()?(c.css("left",b+20-c[0].offsetWidth+"px"),a.isRightAligned=!0):(c.css("left",b-20+"px"),a.isRightAligned=!1)},r=function(){l=!1,m.unbind(),a.$evalAsync(function(){a.displayed=!1})};a.task.isMoving&&n(!0,!1),a.gantt.api.directives.raise["new"]("ganttTooltip",a,c),a.$on("$destroy",function(){a.gantt.api.directives.raise.destroy("ganttTooltip",a,c)})}]}}])}(),function(){"use strict";angular.module("gantt.tree").directive("ganttRowTreeLabel",["GanttDirectiveBuilder",function(a){var b=new a("ganttRowTreeLabel");return b.restrict="A",b.templateUrl=void 0,b.build()}])}(),function(){"use strict";angular.module("gantt.tree").directive("ganttSideContentTree",["GanttDirectiveBuilder",function(a){var b=new a("ganttSideContentTree","plugins/tree/sideContentTree.tmpl.html");return b.build()}])}(),function(){"use strict";angular.module("gantt.tree").controller("GanttTreeController",["$scope","$filter","GanttHierarchy",function(a,b,c){a.rootRows=[],a.getHeader=function(){return a.pluginScope.header};var d=new c;a.pluginScope.$watchGroup(["keepAncestorOnFilterRow","enabled"],function(c){var e=c[0]&&c[1];if(e){var f=function(a,c,e){d.refresh(a);var f=[];angular.forEach(a,function(a){var b=d.children(a);b&&0!==b.length||f.push(a)});var g=b("filter")(f,c,e),h=function(a){if(g.indexOf(a)>-1)return!0;for(var b=d.descendants(a),c=0;c<b.length;c++)if(g.indexOf(b[c])>-1)return!0;return!1};return b("filter")(a,h,e)};a.gantt.rowsManager.setFilterImpl(f)}else a.gantt.rowsManager.setFilterImpl(!1)});var e=function(b){for(var c=a.parent(b);void 0!==c;){if(void 0!==c&&c._collapsed)return!1;c=a.parent(c)}return!0},f=function(a){return a.filter(function(a){return e(a)})},g=function(b){var c=[],d=[],e=!1;angular.forEach(b,function(b){var c=a.parent(b);void 0===c?d.push(b):e=!0});var f=function(d){c.push(d);var e=a.children(d);if(void 0!==e&&e.length>0){var g=e.sort(function(a,c){return b.indexOf(a)-b.indexOf(c)});angular.forEach(g,function(a){f(a)})}};return angular.forEach(d,function(a){f(a)}),c};a.gantt.api.rows.addRowSorter(g),a.gantt.api.rows.addRowFilter(f),a.$on("$destroy",function(){a.gantt.api.rows.removeRowSorter(g),a.gantt.api.rows.removeRowFilter(f)});var h=function(){a.rootRows=d.refresh(a.gantt.rowsManager.filteredRows),a.gantt.rowsManager.filteredRows.length>0&&(a.gantt.api.rows.sort(),a.gantt.api.rows.refresh())};a.gantt.api.rows.on.remove(a,h),a.gantt.api.rows.on.add(a,h);var i=function(b){var c;return c="string"==typeof b?a.gantt.rowsManager.rowsMap[b]:b,void 0===c?void 0:void 0===c._collapsed?!1:c._collapsed},j=function(b){var c;if(c="string"==typeof b?a.gantt.rowsManager.rowsMap[b]:b,void 0!==c){var d=a.nodeScopes[c.model.id];d.collapsed&&d.toggle()}},k=function(b){ -var c;if(c="string"==typeof b?a.gantt.rowsManager.rowsMap[b]:b,void 0!==c){var d=a.nodeScopes[c.model.id];d.collapsed||d.toggle()}},l=function(){return d};a.getHeaderContent=function(){return a.pluginScope.headerContent},a.gantt.api.registerMethod("tree","refresh",h,this),a.gantt.api.registerMethod("tree","isCollapsed",i,this),a.gantt.api.registerMethod("tree","expand",j,this),a.gantt.api.registerMethod("tree","collapse",k,this),a.gantt.api.registerEvent("tree","collapsed"),a.gantt.api.registerMethod("tree","getHierarchy",l,this),a.$watchCollection("gantt.rowsManager.filteredRows",function(){h()}),a.children=function(b){return void 0===b?a.rootRows:d.children(b)},a.parent=function(a){return d.parent(a)},a.nodeScopes={}}]).controller("GanttUiTreeController",["$scope",function(a){var b=function(){a.collapseAll()},c=function(){a.expandAll()};a.gantt.api.registerMethod("tree","collapseAll",b,a),a.gantt.api.registerMethod("tree","expandAll",c,a)}]).controller("GanttTreeNodeController",["$scope",function(a){a.$parent.nodeScopes[a.row.model.id]=a,a.$on("$destroy",function(){delete a.$parent.nodeScopes[a.row.model.id]}),a.$watch("children(row)",function(b){if(b){for(var c=a.row.rowsManager.filteredRows,d=[],e=0;e<b.length;e++){var f=b[e];c.indexOf(f)>-1&&d.push(f)}a.$parent.childrenRows=d}else a.$parent.childrenRows=b}),a.isCollapseDisabled=function(){return!a.$parent.childrenRows||0===a.$parent.childrenRows.length},a.getValue=function(){return a.row.model.name},a.getRowContent=function(){if(void 0!==a.row.model.content)return a.row.model.content;if(void 0!==a.pluginScope.content)return a.pluginScope.content;var b=a.row.rowsManager.gantt.options.value("rowContent");return void 0===b&&(b="{{row.model.name}}"),b},a.$watch("collapsed",function(b){if(a.$modelValue._collapsed!==b){var c=a.$modelValue._collapsed;a.$modelValue._collapsed=b,void 0!==c&&b!==c&&(a.gantt.api.tree.raise.collapsed(a,a.$modelValue,b),a.gantt.api.rows.refresh())}})}])}(),function(){"use strict";angular.module("gantt.tree").directive("ganttTreeBody",["GanttDirectiveBuilder","ganttLayout",function(a,b){var c=new a("ganttTreeBody","plugins/tree/treeBody.tmpl.html");return c.controller=function(a){var c=b.getScrollBarHeight();a.getLabelsCss=function(){var b={};if(a.maxHeight){var d=a.gantt.scroll.isHScrollbarVisible()?c:0;b["max-height"]=a.maxHeight-d-a.gantt.header.getHeight()+"px"}return b}},c.build()}])}(),function(){"use strict";angular.module("gantt.tree").directive("ganttTreeHeader",["GanttDirectiveBuilder",function(a){var b=new a("ganttTreeHeader","plugins/tree/treeHeader.tmpl.html");return b.build()}])}(),angular.module("gantt.bounds.templates",[]).run(["$templateCache",function(a){a.put("plugins/bounds/taskBounds.tmpl.html",'<div ng-cloak class="gantt-task-bounds" ng-style="getCss()" ng-class="getClass()"></div>\n')}]),angular.module("gantt.drawtask.templates",[]).run(["$templateCache",function(a){}]),angular.module("gantt.groups.templates",[]).run(["$templateCache",function(a){a.put("plugins/groups/taskGroup.tmpl.html",'<div ng-controller="GanttGroupController">\n <div class="gantt-task-group-overview" ng-if="taskGroup.overviewTasks.length > 0">\n <gantt-task-overview ng-repeat="task in taskGroup.overviewTasks"></gantt-task-overview>\n </div>\n <div class="gantt-task-group-promote" ng-if="taskGroup.row._collapsed && taskGroup.promotedTasks.length > 0">\n <gantt-task ng-repeat="task in taskGroup.promotedTasks"></gantt-task>\n </div>\n <div class="gantt-task-group"\n ng-if="taskGroup.showGrouping"\n ng-style="{\'left\': taskGroup.left + \'px\', \'width\': taskGroup.width + \'px\'}">\n <div class="gantt-task-group-left-main"></div>\n <div class="gantt-task-group-right-main"></div>\n <div class="gantt-task-group-left-symbol"></div>\n <div class="gantt-task-group-right-symbol"></div>\n </div>\n</div>\n\n'),a.put("plugins/groups/taskOverview.tmpl.html",'<div class="gantt-task gantt-task-overview" ng-class="task.model.classes">\n <gantt-task-background></gantt-task-background>\n <gantt-task-content></gantt-task-content>\n <gantt-task-foreground></gantt-task-foreground>\n</div>\n\n')}]),angular.module("gantt.labels.templates",[]).run(["$templateCache",function(a){a.put("plugins/labels/labelsBody.tmpl.html",'<div class="gantt-labels-body" ng-style="getLabelsCss()">\n <div gantt-vertical-scroll-receiver>\n <div ng-repeat="row in gantt.rowsManager.visibleRows track by row.model.id">\n <div gantt-row-label\n class="gantt-row-label gantt-row-height"\n ng-class="row.model.classes"\n ng-style="{\'height\': row.model.height}">\n <span class="gantt-label-text">{{row.model.name}}</span>\n </div>\n </div>\n </div>\n</div>\n'),a.put("plugins/labels/labelsHeader.tmpl.html",'<div class="gantt-labels-header">\n <div ng-show="gantt.columnsManager.columns.length > 0 && gantt.columnsManager.headers.length > 0">\n <div ng-repeat="header in gantt.columnsManager.headers">\n <div class="gantt-row-height" ng-class="{\'gantt-labels-header-row\': $last, \'gantt-labels-header-row-last\': $last}"><span>{{$last ? pluginScope.header : ""}}</span></div>\n </div>\n </div>\n</div>\n'),a.put("plugins/labels/sideContentLabels.tmpl.html",'<div class="gantt-side-content-labels">\n <gantt-labels-header>\n </gantt-labels-header>\n <gantt-labels-body>\n </gantt-labels-body>\n</div>\n')}]),angular.module("gantt.movable.templates",[]).run(["$templateCache",function(a){}]),angular.module("gantt.overlap.templates",[]).run(["$templateCache",function(a){}]),angular.module("gantt.progress.templates",[]).run(["$templateCache",function(a){a.put("plugins/progress/taskProgress.tmpl.html",'<div ng-cloak class="gantt-task-progress" ng-style="getCss()" ng-class="getClasses()"></div>\n')}]),angular.module("gantt.resizeSensor.templates",[]).run(["$templateCache",function(a){}]),angular.module("gantt.sortable.templates",[]).run(["$templateCache",function(a){}]),angular.module("gantt.table.templates",[]).run(["$templateCache",function(a){a.put("plugins/table/sideContentTable.tmpl.html",'<div class="gantt-side-content-table">\n\n <div class="gantt-table-column {{getClass()}}" ng-repeat="column in pluginScope.columns" ng-controller="TableColumnController">\n\n <div class="gantt-table-header" ng-style="{height: ganttHeaderHeight + \'px\'}">\n <div ng-show="ganttHeaderHeight" class="gantt-row-label-header gantt-row-label gantt-table-row gantt-table-header-row">\n <span class="gantt-label-text" gantt-bind-compile-html="getHeaderContent()"/>\n </div>\n </div>\n\n <div class="gantt-table-content" ng-style="getMaxHeightCss()">\n <div gantt-vertical-scroll-receiver>\n <div class="gantt-table-row" ng-repeat="row in gantt.rowsManager.visibleRows track by row.model.id" ng-controller="TableColumnRowController">\n <div gantt-row-label class="gantt-row-label gantt-row-height" ng-class="row.model.classes" ng-style="{\'height\': row.model.height}">\n <div class="gantt-valign-container">\n <div class="gantt-valign-content">\n <span class="gantt-label-text" gantt-bind-compile-html="getRowContent()"></span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n</div>\n')}]),angular.module("gantt.tooltips.templates",[]).run(["$templateCache",function(a){a.put("plugins/tooltips/tooltip.tmpl.html",'<div ng-cloak\n class="gantt-task-info"\n ng-show="displayed"\n ng-class="isRightAligned ? \'gantt-task-infoArrowR\' : \'gantt-task-infoArrow\'"\n ng-style="{top: taskRect.top + \'px\', marginTop: -elementHeight - 8 + \'px\'}">\n <div class="gantt-task-info-content">\n <div gantt-bind-compile-html="pluginScope.content"></div>\n </div>\n</div>\n')}]),angular.module("gantt.tree.templates",[]).run(["$templateCache",function(a){a.put("plugins/tree/sideContentTree.tmpl.html",'<div class="gantt-side-content-tree" ng-controller="GanttTreeController">\n <gantt-tree-header>\n </gantt-tree-header>\n <gantt-tree-body>\n </gantt-tree-body>\n</div>\n'),a.put("plugins/tree/treeBody.tmpl.html",'<div class="gantt-tree-body" ng-style="getLabelsCss()">\n <div gantt-vertical-scroll-receiver>\n <div class="gantt-row-label-background">\n <div class="gantt-row-label gantt-row-height"\n ng-class="row.model.classes"\n ng-style="{\'height\': row.model.height}"\n ng-repeat="row in gantt.rowsManager.visibleRows track by row.model.id">\n \n </div>\n </div>\n <div ui-tree ng-controller="GanttUiTreeController" data-drag-enabled="false" data-empty-place-holder-enabled="false">\n <ol class="gantt-tree-root" ui-tree-nodes ng-model="rootRows">\n <li ng-repeat="row in rootRows" ui-tree-node\n ng-include="\'plugins/tree/treeBodyChildren.tmpl.html\'">\n </li>\n </ol>\n </div>\n </div>\n</div>\n'),a.put("plugins/tree/treeBodyChildren.tmpl.html",'<div ng-controller="GanttTreeNodeController"\n class="gantt-row-label gantt-row-height"\n ng-class="row.model.classes"\n ng-style="{\'height\': row.model.height}">\n <div class="gantt-valign-container">\n <div class="gantt-valign-content">\n <a ng-disabled="isCollapseDisabled()" data-nodrag\n class="gantt-tree-handle-button btn btn-xs"\n ng-class="{\'gantt-tree-collapsed\': collapsed, \'gantt-tree-expanded\': !collapsed}"\n ng-click="!isCollapseDisabled() && toggle()"><span\n class="gantt-tree-handle glyphicon glyphicon-chevron-down"\n ng-class="{\n \'glyphicon-chevron-right\': collapsed, \'glyphicon-chevron-down\': !collapsed,\n \'gantt-tree-collapsed\': collapsed, \'gantt-tree-expanded\': !collapsed}"></span>\n </a>\n <span gantt-row-label class="gantt-label-text" gantt-bind-compile-html="getRowContent()"/>\n </div>\n </div>\n</div>\n<ol ui-tree-nodes ng-class="{hidden: collapsed}" ng-model="childrenRows">\n <li ng-repeat="row in childrenRows" ui-tree-node>\n <div ng-include="\'plugins/tree/treeBodyChildren.tmpl.html\'"></div>\n </li>\n</ol>\n'),a.put("plugins/tree/treeHeader.tmpl.html",'<div class="gantt-tree-header" ng-style="{height: $parent.ganttHeaderHeight + \'px\'}">\n <div ng-if="$parent.ganttHeaderHeight" class="gantt-row-label gantt-row-label-header gantt-tree-row gantt-tree-header-row"><span class="gantt-label-text" gantt-bind-compile-html="getHeaderContent()"/></div>\n</div>\n')}]); +!function(){"use strict";angular.module("gantt.bounds",["gantt","gantt.bounds.templates"]).directive("ganttBounds",["moment","$compile","$document",function(a,b,c){return{restrict:"E",require:"^gantt",scope:{enabled:"=?"},link:function(d,e,f,g){var h=g.gantt.api;if(d.options&&"object"==typeof d.options.bounds)for(var i in d.options.bounds)d[i]=d.options[i];void 0===d.enabled&&(d.enabled=!0),h.directives.on["new"](d,function(a,e,g){if("ganttTask"===a){var h=e.$new();h.pluginScope=d;var i=c[0].createElement("div");angular.element(i).attr("data-ng-if","task.model.est && task.model.lct && pluginScope.enabled");var j=c[0].createElement("gantt-task-bounds");void 0!==f.templateUrl&&angular.element(j).attr("data-template-url",f.templateUrl),void 0!==f.template&&angular.element(j).attr("data-template",f.template),angular.element(i).append(j),g.append(b(i)(h))}}),h.tasks.on.clean(d,function(b){void 0===b.est||a.isMoment(b.est)||(b.est=a(b.est)),void 0===b.lct||a.isMoment(b.lct)||(b.lct=a(b.lct))})}}}])}(),function(){"use strict";angular.module("gantt.dependencies",["gantt","gantt.dependencies.templates"]).directive("ganttDependencies",["$timeout","$document","ganttDebounce","GanttDependenciesManager",function(a,b,c,d){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",jsPlumbDefaults:"=?",endpoints:"=?",fallbackEndpoints:"=?"},link:function(a,b,e,f){function g(){return angular.element('<span><span class="gantt-endpoint-overlay start-endpoint arrow-right"></span></span>')}function h(){return angular.element('<span><span class="gantt-endpoint-overlay end-endpoint arrow-right"></span></span>')}function i(){return angular.element('<span><span class="gantt-endpoint-overlay start-endpoint fallback-endpoint"></span></span>')}function j(){return angular.element('<span><span class="gantt-endpoint-overlay end-endpoint fallback-endpoint"></span></span>')}var k=f.gantt.api;if(a.options&&"object"==typeof a.options.dependencies)for(var l in a.options.dependencies)a[l]=a.options[l];void 0===a.enabled&&(a.enabled=!0),void 0===a.jsPlumbDefaults&&(a.jsPlumbDefaults={Endpoint:["Dot",{radius:4}],EndpointStyle:{fillStyle:"#456",strokeStyle:"#456",lineWidth:1},Connector:"Flowchart",ConnectionOverlays:[["Arrow",{location:1,length:12,width:12}]]}),void 0===a.endpoints&&(a.endpoints=[{anchor:"Left",isSource:!1,isTarget:!0,maxConnections:-1,cssClass:"gantt-endpoint start-endpoint target-endpoint",overlays:[["Custom",{create:g}]]},{anchor:"Right",isSource:!0,isTarget:!1,maxConnections:-1,cssClass:"gantt-endpoint end-endpoint source-endpoint",overlays:[["Custom",{create:h}]]}]),void 0===a.fallbackEndpoints&&(a.fallbackEndpoints=[{endpoint:"Blank",anchor:"Left",isSource:!1,isTarget:!0,maxConnections:0,cssClass:"gantt-endpoint start-endpoint fallback-endpoint",overlays:[["Custom",{create:i}]]},{endpoint:"Blank",anchor:"Right",isSource:!0,isTarget:!1,maxConnections:0,cssClass:"gantt-endpoint end-endpoint fallback-endpoint",overlays:[["Custom",{create:j}]]}]);var m=new d(f.gantt,a,k);k.directives.on["new"](a,function(a,b,c){"ganttBody"===a&&m.plumb.setContainer(c)}),k.tasks.on.add(a,function(a){m.addDependenciesFromTask(a)}),k.tasks.on.remove(a,function(a){m.removeDependenciesFromTask(a)}),k.tasks.on.displayed(a,c(function(a){m.setTasks(a),m.refresh()})),k.rows.on.displayed(a,function(){m.refresh()}),k.tasks.on.viewChange(a,function(a){a.$element&&m.plumb.revalidate(a.$element[0])}),k.tasks.on.viewRowChange(a,function(a){m.setTask(a)})}}}])}(),function(){"use strict";angular.module("gantt.drawtask",["gantt"]).directive("ganttDrawTask",["$document","ganttMouseOffset","ganttUtils","moment",function(a,b,c,d){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",moveThreshold:"=?",taskModelFactory:"=?taskFactory"},link:function(c,e,f,g){var h=g.gantt.api;void 0===c.enabled&&(c.enabled=!0),void 0===c.moveThreshold&&(c.moveThreshold=0),void 0===c.taskModelFactory&&(c.taskModelFactory=function(){return{}}),h.directives.on["new"](c,function(e,f,g){if("ganttRow"===e){var i=function(a){var b=h.core.getDateByPosition(a,!0),e=d(b),g=c.taskModelFactory();g.from=b,g.to=e;var i=f.row.addTask(g);i.isResizing=!0,i.updatePosAndSize(),f.row.updateVisibleTasks(),f.row.$scope.$digest()},j=function(d){var e=function(a){var f=b.getOffset(a).x;Math.abs(d-f)>=c.moveThreshold&&(g.off("mousemove",e),i(d))};g.on("mousemove",e),a.one("mouseup",function(){g.off("mousemove",e)})},k=function(a){var d=a.target?a.target:a.srcElement,e=angular.isFunction(c.enabled)?c.enabled(a):c.enabled;if(e&&d.className.indexOf("gantt-row")>-1){var f=b.getOffset(a).x;0===c.moveThreshold?i(f,f):j(f)}};g.on("mousedown",k),f.drawTaskHandler=k}}),h.directives.on.destroy(c,function(a,b,c){"ganttRow"===a&&(c.off("mousedown",b.drawTaskHandler),delete b.drawTaskHandler)})}}}])}(),function(){"use strict";angular.module("gantt.groups",["gantt","gantt.groups.templates"]).directive("ganttGroups",["ganttUtils","GanttHierarchy","$compile","$document",function(a,b,c,d){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",display:"=?"},link:function(a,e,f,g){function h(){a.hierarchy.refresh(g.gantt.rowsManager.filteredRows)}var i=g.gantt.api;if(a.options&&"object"==typeof a.options.sortable)for(var j in a.options.sortable)a[j]=a.options[j];void 0===a.enabled&&(a.enabled=!0),void 0===a.display&&(a.display="group"),a.hierarchy=new b,g.gantt.api.registerMethod("groups","refresh",h,this),g.gantt.$scope.$watchCollection("gantt.rowsManager.filteredRows",function(){h()}),i.directives.on["new"](a,function(b,e,g){if("ganttRow"===b){var h=e.$new();h.pluginScope=a;var i=d[0].createElement("div");angular.element(i).attr("data-ng-if","pluginScope.enabled");var j=d[0].createElement("gantt-task-group");void 0!==f.templateUrl&&angular.element(j).attr("data-template-url",f.templateUrl),void 0!==f.template&&angular.element(j).attr("data-template",f.template),angular.element(i).append(j),g.append(c(i)(h))}})}}}])}(),function(){"use strict";angular.module("gantt.labels",["gantt","gantt.labels.templates"]).directive("ganttLabels",["ganttUtils","$compile","$document","$log",function(a,b,c,d){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",header:"=?"},link:function(a,e,f,g){function h(){for(var a=g.gantt.side.$element[0].getElementsByClassName("gantt-row-label"),b=0,c=0;c<a.length;c++){var d=a[c].children[0].offsetWidth;b=Math.max(b,d)}b>=0&&i.side.setWidth(b)}var i=g.gantt.api;if(d.warn("Angular Gantt Labels plugin is deprecated. Please use Table plugin instead."),a.options&&"object"==typeof a.options.sortable)for(var j in a.options.sortable)a[j]=a.options[j];void 0===a.enabled&&(a.enabled=!0),void 0===a.header&&(a.header="Name"),i.directives.on["new"](a,function(d,e,f){if("ganttSideContent"===d){var g=e.$new();g.pluginScope=a;var h=c[0].createElement("div");angular.element(h).attr("data-ng-if","pluginScope.enabled"),angular.element(h).addClass("side-element");var i=c[0].createElement("gantt-side-content-labels");angular.element(h).append(i),f.append(b(h)(g))}}),i.registerMethod("labels","fitSideWidth",h,this)}}}])}(),function(){"use strict";angular.module("gantt.movable",["gantt"]).directive("ganttMovable",["ganttMouseButton","ganttMouseOffset","ganttSmartEvent","ganttMovableOptions","ganttUtils","ganttDom","$window","$document","$timeout",function(a,b,c,d,e,f,g,h,i){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",allowMoving:"=?",allowResizing:"=?",allowRowSwitching:"=?"},link:function(j,k,l,m){var n=m.gantt.api;if(j.options&&"object"==typeof j.options.movable)for(var o in j.options.movable)j[o]=j.options[o];d.initialize(j),n.registerEvent("tasks","move"),n.registerEvent("tasks","moveBegin"),n.registerEvent("tasks","moveEnd"),n.registerEvent("tasks","resize"),n.registerEvent("tasks","resizeBegin"),n.registerEvent("tasks","resizeEnd"),n.registerEvent("tasks","change");var p,q,r="ontouchstart"in g||g.DocumentTouch&&h[0]instanceof g.DocumentTouch,s="touchstart mousedown",t="touchmove mousemove",u="touchend mouseup",v=15,w=5,x=3,y=15,z=5;n.directives.on["new"](j,function(d,k,l){if("ganttTask"===d){var n,o=angular.element(g),A=k.row.rowsManager.gantt.body.$element,B=k.row.rowsManager.gantt.scroll.$element,C=!1,D=!1,E=k.task.getForegroundElement(),F=k.task.getContentElement(),G=function(c){c.preventDefault(),r&&(c=b.getTouch(c));var d=k.task.model.movable,f=k.task.row.model.movable;("boolean"==typeof d||angular.isFunction(d))&&(d={enabled:d}),("boolean"==typeof f||angular.isFunction(f))&&(f={enabled:f});var g=e.firstProperty([d,f],"enabled",j.enabled),h=angular.isFunction(g)?g(c,k.task):g;if(h){var i=b.getOffsetForElement(E[0],c).x,l=M(i);if(""!==l&&1===a.getButton(c)){var m=b.getOffsetForElement(A[0],c).x;P(l,m)}k.$digest()}};E.on(s,G),F.on(s,G);var H=function(a){var c=k.task.model.movable,d=k.task.row.model.movable;("boolean"==typeof c||angular.isFunction(c))&&(c={enabled:c}),("boolean"==typeof d||angular.isFunction(d))&&(d={enabled:d});var f=e.firstProperty([c,d],"enabled",j.enabled),g=angular.isFunction(f)?f(a,k.task):f;if(g&&!k.task.isMoving){var h=b.getOffsetForElement(E[0],a).x,i=M(h);""!==i&&"M"!==i?(E.css("cursor",N(i)),F.css("cursor",N(i))):(E.css("cursor",""),F.css("cursor",""))}};E.on("mousemove",H),F.on("mousemove",H);var I=function(a){k.task.isMoving&&!k.destroyed&&(L(),J(a),K(a))},J=function(a){var c=C,d=b.getOffsetForElement(A[0],a),g=d.x;k.task.mouseOffsetX=g;var i=k.task.row.rowsManager.gantt.options.value("taskOutOfRange"),l=k.task.model.movable,n=k.task.row.model.movable;if(("boolean"==typeof l||angular.isFunction(l))&&(l={enabled:l}),("boolean"==typeof n||angular.isFunction(n))&&(n={enabled:n}),"M"===k.task.moveMode){var o=e.firstProperty([l,n],"allowRowSwitching",j.allowRowSwitching);if(o){var q=B[0].getBoundingClientRect(),r=q.left+q.width/2,s=angular.element(h[0].querySelectorAll(".gantt-body"));s.css("pointer-events","auto");var t=f.findElementFromPoint(r,a.clientY,function(a){return angular.element(a).hasClass("gantt-row")});s.css("pointer-events","");for(var u,v=m.gantt.rowsManager.rows,w=0,x=v.length;x>w;w++)if(t===v[w].$element[0]){u=v[w];break}var y=k.task.row;void 0!==u&&y!==u&&(u.moveTaskToRow(k.task,!0),C=!0)}var z=e.firstProperty([l,n],"allowMoving",j.allowMoving);z&&(g-=p,"truncate"!==i&&(0>g?g=0:g+k.task.width>=k.gantt.width&&(g=k.gantt.width-k.task.width)),k.task.moveTo(g,!0),k.$digest(),C&&k.row.rowsManager.gantt.api.tasks.raise.move(k.task),C=!0)}else"E"===k.task.moveMode?(g<=k.task.left&&(g=k.task.left,k.task.moveMode="W",O(N(k.task.moveMode))),"truncate"!==i&&g>=k.gantt.width&&(g=k.gantt.width),k.task.setTo(g,!0),k.$digest(),C&&k.row.rowsManager.gantt.api.tasks.raise.resize(k.task),C=!0):(g>k.task.left+k.task.width&&(g=k.task.left+k.task.width,k.task.moveMode="E",O(N(k.task.moveMode))),"truncate"!==i&&0>g&&(g=0),k.task.setFrom(g,!0),k.$digest(),C&&k.row.rowsManager.gantt.api.tasks.raise.resize(k.task),C=!0);if(!c&&C&&!D){var E=k.task.getBackgroundElement();"M"===k.task.moveMode?(E.addClass("gantt-task-moving"),k.row.rowsManager.gantt.api.tasks.raise.moveBegin(k.task)):(E.addClass("gantt-task-resizing"),k.row.rowsManager.gantt.api.tasks.raise.resizeBegin(k.task))}},K=function(a){var c=b.getOffsetForElement(A[0],a),d=B[0].scrollLeft,e=B[0].offsetWidth,f=B[0].scrollWidth,g=d+e,h=!1;c.x<q?d>0&&c.x<=d+z&&(c.x-=y,h=!0,k.row.rowsManager.gantt.api.scroll.left(y)):f>g&&c.x>=g-z&&(c.x+=y,h=!0,k.row.rowsManager.gantt.api.scroll.right(y)),h&&(n=i(function(){I(a)},100,!0))},L=function(){void 0!==n&&(i.cancel(n),n=void 0)},M=function(a){var b=0,c=k.task.model.movable,d=k.task.row.model.movable;"boolean"==typeof c&&(c={enabled:c}),"boolean"==typeof d&&(d={enabled:d});var f=e.firstProperty([c,d],"allowResizing",j.allowResizing),g=e.firstProperty([c,d],"allowRowSwitching",j.allowRowSwitching),h=e.firstProperty([c,d],"allowMoving",j.allowMoving);return f&&(b=E[0].offsetWidth<v?x:w),f&&a>E[0].offsetWidth-b?"E":f&&b>a?"W":(h||g)&&a>=b&&a<=E[0].offsetWidth-b?"M":""},N=function(a){switch(a){case"E":return"e-resize";case"W":return"w-resize";case"M":return"move"}},O=function(a){l.css("cursor",a),angular.element(h[0].body).css({"-moz-user-select":""===a?"":"-moz-none","-webkit-user-select":""===a?"":"none","-ms-user-select":""===a?"":"none","user-select":""===a?"":"none",cursor:a})},P=function(a,d){void 0===k.task.originalModel&&(k.task.originalRow=k.task.row,k.task.originalModel=k.task.model,k.task.model=angular.copy(k.task.originalModel)),D||(q=d,p=d-k.task.modelLeft),C=!1,k.task.moveMode=a,k.task.isMoving=!0,k.task.active=!0;var e=function(a){a.stopImmediatePropagation(),r&&(a=b.getTouch(a)),I(a)},f=c(k,o,t,e);f.bind(),c(k,o,u,function(a){r&&(a=b.getTouch(a)),f.unbind(),Q(a),k.$digest()}).bindOnce(),O(N(a))},Q=function(){var a=k.task.getBackgroundElement();if(a.removeClass("gantt-task-moving"),a.removeClass("gantt-task-resizing"),void 0!==k.task.originalModel){if(k.task.originalModel.from=k.task.model.from,k.task.originalModel.to=k.task.model.to,k.task.originalModel.lct=k.task.model.lct,k.task.originalModel.est=k.task.model.est,k.task.model=k.task.originalModel,k.task.row.model.id!==k.task.originalRow.model.id){var b=k.task.row;b.removeTask(k.task.model.id,!1,!0),k.task.row=k.task.originalRow,b.moveTaskToRow(k.task,!1)}delete k.task.originalModel,delete k.task.originalRow,k.$apply()}D=!1,k.task.isMoving=!1,k.task.active=!1,L(),O(""),C===!0&&("M"===k.task.moveMode?k.row.rowsManager.gantt.api.tasks.raise.moveEnd(k.task):k.row.rowsManager.gantt.api.tasks.raise.resizeEnd(k.task),C=!1,k.task.row.sortTasks(),k.row.rowsManager.gantt.api.tasks.raise.change(k.task)),k.task.moveMode=void 0};k.$on("$destroy",function(){k.destroyed=!0,L()}),k.task.isResizing?(D=!0,P("E",k.task.mouseOffsetX),delete k.task.isResizing):k.task.isMoving&&(D=!0,P("M",k.task.mouseOffsetX))}})}}}])}(),function(){"use strict";angular.module("gantt.overlap",["gantt","gantt.overlap.templates"]).directive("ganttOverlap",["moment",function(a){return{restrict:"E",require:"^gantt",scope:{enabled:"=?"},link:function(b,c,d,e){function f(a){var b,c;return a.model.from.isBefore(a.model.to)?(b=a.model.from,c=a.model.to):(b=a.model.to,c=a.model.from),[b,c]}function g(b){var c=f(b);return a().range(c[0],c[1])}function h(a,b){b.model.id in a||(b.$element.addClass("gantt-task-overlaps"),a[b.model.id]=b)}function i(a,b){for(var c=0,d=b.length;d>c;c++){var e=b[c];e.model.id in a||e.$element.removeClass("gantt-task-overlaps")}}function j(a){var b=a.tasks,c={};if(b.length>1)for(var d=b[0],e=g(d),f=1,j=b.length;j>f;f++){var k=b[f],l=g(k);l.overlaps(e)&&(h(c,k),h(c,d)),d.left+d.width<k.left+k.width&&(d=k,e=l)}i(c,b)}var k=e.gantt.api;void 0===b.enabled&&(b.enabled=!0),b.enabled&&(k.tasks.on.change(b,function(a){j(a.row)}),k.tasks.on.rowChange(b,function(a,b){j(b)}))}}}])}(),function(){"use strict";angular.module("gantt.progress",["gantt","gantt.progress.templates"]).directive("ganttProgress",["moment","$compile","$document",function(a,b,c){return{restrict:"E",require:"^gantt",scope:{enabled:"=?"},link:function(d,e,f,g){var h=g.gantt.api;if(d.options&&"object"==typeof d.options.progress)for(var i in d.options.progress)d[i]=d.options[i];void 0===d.enabled&&(d.enabled=!0),h.directives.on["new"](d,function(a,e,g){if("ganttTaskBackground"===a){var h=e.$new();h.pluginScope=d;var i=c[0].createElement("div");angular.element(i).attr("data-ng-if","task.model.progress !== undefined && pluginScope.enabled");var j=c[0].createElement("gantt-task-progress");void 0!==f.templateUrl&&angular.element(j).attr("data-template-url",f.templateUrl),void 0!==f.template&&angular.element(j).attr("data-template",f.template),angular.element(i).append(j),g.append(b(i)(h))}}),h.tasks.on.clean(d,function(b){void 0===b.est||a.isMoment(b.est)||(b.est=a(b.est)),void 0===b.lct||a.isMoment(b.lct)||(b.lct=a(b.lct))})}}}])}(),function(){"use strict";angular.module("gantt.resizeSensor",["gantt"]).directive("ganttResizeSensor",[function(){return{restrict:"E",require:"^gantt",scope:{enabled:"=?"},link:function(a,b,c,d){function e(){var a=b.parent().parent().parent()[0].querySelectorAll("div.gantt")[0];return new ResizeSensor(a,function(){d.gantt.$scope.ganttElementWidth=a.clientWidth,d.gantt.$scope.$apply()})}var f=d.gantt.api;if(a.options&&"object"==typeof a.options.progress)for(var g in a.options.progress)a[g]=a.options[g];void 0===a.enabled&&(a.enabled=!0);var h,i=!1;f.core.on.rendered(a,function(){i=!0,void 0!==h&&h.detach(),a.enabled&&(ElementQueries.update(),h=e())}),a.$watch("enabled",function(a){i&&(a&&void 0===h?(ElementQueries.update(),h=e()):a||void 0===h||(h.detach(),h=void 0))})}}}])}(),function(){"use strict";for(var a,b="gantt.sortable",c="ganttSortable",d=["gantt",{module:"ang-drag-drop",url:"https://github.com/ganarajpr/angular-dragdrop.git#master"}],e=[],f=[],g=0,h=d.length;h>g;g++){var i=d[g];try{angular.isString(i)&&(i={module:i},d[g]=i),angular.module(i.module),f.push(i.module)}catch(j){i.exception=j,e.push(i)}}e.length>0?angular.module(b,[]).directive(c,["$log",function(d){return{restrict:"E",require:"^gantt",scope:{enabled:"=?"},link:function(){d.warn(b+" module can't require some dependencies:");for(var f=0,g=e.length;g>f;f++){a=e[f];var h=a.module;a.url&&(h+=" ("+a.url+")"),a.exception&&a.exception.message&&(h+=": "+a.exception.message),d.warn(h)}d.warn(c+" plugin directive won't be available")}}}]):angular.module(b,f).directive(c,["ganttUtils","$compile",function(a,b){return{restrict:"E",require:"^gantt",scope:{enabled:"=?"},link:function(c,d,e,f){var g=f.gantt.api;if(c.options&&"object"==typeof c.options.sortable)for(var h in c.options.sortable)c[h]=c.options[h];void 0===c.enabled&&(c.enabled=!0),g.directives.on["new"](c,function(d,e,f){"ganttRowLabel"===d&&void 0===f.attr("drag")&&(e.checkDraggable=function(){var b=e.row.model.sortable;return"boolean"==typeof b&&(b={enabled:b}),a.firstProperty([b],"enabled",c.enabled)},e.onDropSuccess=function(){e.$evalAsync()},e.onDrop=function(a,b){var c=e.row.rowsManager.rowsMap[b.id];c!==e&&(e.row.rowsManager.moveRow(c,e.row),e.$evalAsync())},f.attr("ui-draggable","{{checkDraggable()}}"),f.attr("drag-channel","'sortable'"),f.attr("ui-on-drop","onDrop($event, $data)"),f.attr("on-drop-success","onDropSuccess()"),f.attr("drop-channel","'sortable'"),f.attr("drag","row.model"),b(f)(e))})}}}])}(),function(){"use strict";angular.module("gantt.table",["gantt","gantt.table.templates"]).directive("ganttTable",["ganttUtils","$compile","$document",function(a,b,c){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",columns:"=?",headers:"=?",classes:"=?",contents:"=?",headerContents:"=?",formatters:"=?",headerFormatter:"=?"},link:function(a,d,e,f){var g=f.gantt.api;if(a.options&&"object"==typeof a.options.sortable)for(var h in a.options.sortable)a[h]=a.options[h];void 0===a.enabled&&(a.enabled=!0),void 0===a.columns&&(a.columns=["model.name"]),void 0===a.headers&&(a.headers={"model.name":"Name"}),void 0===a.contents&&(a.contents={}),void 0===a.headerContents&&(a.headerContents={}),void 0===a.classes&&(a.classes={}),void 0===a.formatters&&(a.formatters={}),g.directives.on["new"](a,function(d,e,f){if("ganttSideContent"===d){var g=e.$new();g.pluginScope=a;var h=c[0].createElement("div");angular.element(h).attr("data-ng-if","pluginScope.enabled"),angular.element(h).addClass("side-element");var i=c[0].createElement("gantt-side-content-table");angular.element(h).append(i),f.append(b(h)(g))}})}}}])}(),function(){"use strict";angular.module("gantt.tooltips",["gantt","gantt.tooltips.templates"]).directive("ganttTooltips",["$compile","$document",function(a,b){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",dateFormat:"=?",content:"=?",delay:"=?"},link:function(c,d,e,f){var g=f.gantt.api;if(c.options&&"object"==typeof c.options.tooltips)for(var h in c.options.tooltips)c[h]=c.options[h];void 0===c.enabled&&(c.enabled=!0),void 0===c.dateFormat&&(c.dateFormat="MMM DD, HH:mm"),void 0===c.delay&&(c.delay=500),void 0===c.content&&(c.content="{{task.model.name}}</br><small>{{task.isMilestone() === true && getFromLabel() || getFromLabel() + ' - ' + getToLabel()}}</small>"),c.api=g,g.directives.on["new"](c,function(d,f,g){if("ganttTask"===d){var h=f.$new();h.pluginScope=c;var i=b[0].createElement("div");angular.element(i).attr("data-ng-if","pluginScope.enabled");var j=b[0].createElement("gantt-tooltip");void 0!==e.templateUrl&&angular.element(j).attr("data-template-url",e.templateUrl),void 0!==e.template&&angular.element(j).attr("data-template",e.template),angular.element(i).append(j),g.append(a(i)(h))}})}}}])}(),function(){"use strict";angular.module("gantt.tree",["gantt","gantt.tree.templates","ui.tree"]).directive("ganttTree",["ganttUtils","$compile","$document",function(a,b,c){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",header:"=?",content:"=?",headerContent:"=?",keepAncestorOnFilterRow:"=?"},link:function(a,d,e,f){var g=f.gantt.api;if(a.options&&"object"==typeof a.options.sortable)for(var h in a.options.sortable)a[h]=a.options[h];void 0===a.enabled&&(a.enabled=!0),void 0===a.header&&(a.header="Name"),void 0===a.headerContent&&(a.headerContent="{{getHeader()}}"),void 0===a.keepAncestorOnFilterRow&&(a.keepAncestorOnFilterRow=!1),g.directives.on["new"](a,function(d,e,f){if("ganttSideContent"===d){var g=e.$new();g.pluginScope=a;var h=c[0].createElement("div");angular.element(h).attr("data-ng-if","pluginScope.enabled"),angular.element(h).addClass("side-element");var i=c[0].createElement("gantt-side-content-tree");angular.element(h).append(i),f.append(b(h)(g))}})}}}])}(),function(){"use strict";angular.module("gantt.bounds").directive("ganttTaskBounds",["$templateCache","moment",function(a,b){return{restrict:"E",templateUrl:function(b,c){var d;return d=void 0===c.templateUrl?"plugins/bounds/taskBounds.tmpl.html":c.templateUrl,c.template&&a.put(d,c.template),d},replace:!0,scope:!0,controller:["$scope","$element",function(a,c){c.toggleClass("ng-hide",!0),a.simplifyMoment=function(a){return b.isMoment(a)?a.unix():a},a.$watchGroup(["simplifyMoment(task.model.est)","simplifyMoment(task.model.lct)","task.left","task.width"],function(){var b=a.task.rowsManager.gantt.getPositionByDate(a.task.model.est),d=a.task.rowsManager.gantt.getPositionByDate(a.task.model.lct);c.css("left",b-a.task.left+"px"),c.css("width",d-b+"px"),c.toggleClass("gantt-task-bounds-in",!1),c.toggleClass("gantt-task-bounds-out",!1),void 0===a.task.model.est||void 0===a.task.model.lct?c.toggleClass("gantt-task-bounds-in",!0):a.task.model.est>a.task.model.from?c.toggleClass("gantt-task-bounds-out",!0):a.task.model.lct<a.task.model.to?c.toggleClass("gantt-task-bounds-out",!0):c.toggleClass("gantt-task-bounds-in",!0)}),a.task.$element.bind("mouseenter",function(){c.toggleClass("ng-hide",!1)}),a.task.$element.bind("mouseleave",function(){c.toggleClass("ng-hide",!0)}),a.task.rowsManager.gantt.api.directives.raise["new"]("ganttBounds",a,c),a.$on("$destroy",function(){a.task.rowsManager.gantt.api.directives.raise.destroy("ganttBounds",a,c)})}]}}])}(),function(){"use strict";angular.module("gantt.dependencies").factory("GanttDependenciesEvents",[function(){var a=function(a){var b=this;this.manager=a;var c=function(a){return a.sourceId!==a.targetId};this.manager.plumb.bind("beforeDrop",c),this.manager.plumb.bind("connectionDrag",function(a){b.manager.setDraggingConnection(a)}),this.manager.plumb.bind("connectionDragStop",function(){b.manager.setDraggingConnection(void 0)}),this.manager.plumb.bind("beforeDrop",function(){return b.manager.setDraggingConnection(void 0),!0});var d=function(a,c){if(c){var d;a.connection.$dependency&&(d=a.connection.$dependency);var e=a.sourceEndpoint,f=a.targetEndpoint,g=e.$task.model,h=g.dependencies;void 0===h&&(h=[],g.dependencies=h);var i={to:f.$task.model.id};h.push(i),d&&(d.removeFromTaskModel(),b.manager.removeDependency(d,!0));var j=b.manager.addDependency(e.$task,i);a.connection.$dependency=j,j.connection=a.connection,b.manager.api.dependencies.raise.add(j)}},e=function(a,c){if(c){var d;a.connection.$dependency&&(d=a.connection.$dependency);var e=a.newSourceEndpoint,f=a.newTargetEndpoint,g=e.$task.model,h=g.dependencies;void 0===h&&(h=[],g.dependencies=h);var i={to:f.$task.model.id};h.push(i),d&&(d.removeFromTaskModel(),b.manager.removeDependency(d,!0));var j=b.manager.addDependency(e.$task,i);a.connection.$dependency=j,j.connection=a.connection,b.manager.api.dependencies.raise.change(j,d)}},f=function(a,c){if(c){var d=a.connection.$dependency;d.removeFromTaskModel(),b.manager.removeDependency(d,!0),b.manager.api.dependencies.raise.remove(d)}};this.manager.plumb.bind("connectionMoved",e),this.manager.plumb.bind("connection",d),this.manager.plumb.bind("connectionDetached",f)};return a}])}(),function(){"use strict";angular.module("gantt.dependencies").factory("GanttDependenciesManager",["GanttDependency","GanttDependenciesEvents","GanttDependencyTaskMouseHandler",function(a,b,c){var d=function(d,e,f){var g=this;this.gantt=d,this.pluginScope=e,this.api=f,this.api.registerEvent("dependencies","add"),this.api.registerEvent("dependencies","change"),this.api.registerEvent("dependencies","remove"),this.plumb=jsPlumb.getInstance(),this.plumb.importDefaults(this.pluginScope.jsPlumbDefaults),this.dependenciesFrom={},this.dependenciesTo={},this.tasks={},this.events=new b(this),this.pluginScope.$watch("enabled",function(a,b){a!==b&&g.refresh()}),this.pluginScope.$watch("jsPlumbDefaults",function(a,b){a!==b&&(g.plumb.importDefaults(a),g.refresh())},!0),this.addDependenciesFromTask=function(a){if(this.pluginScope.enabled){var b=a.model.dependencies;if(void 0!==b){angular.isArray(b)||(b=[b],a.model.dependencies=b);for(var c=0,d=b.length;d>c;c++){var e=g.addDependency(a,b[c]);e.connect()}}}},this.removeDependenciesFromTask=function(a,b){var c=this.getTaskDependencies(a);if(c)for(var d=0;d<c.length;d++)b||c[d].disconnect(),g.removeDependency(c[d])},this.addDependency=function(b,c){var d=new a(this,b,c),e=d.getFromTaskId(),f=d.getToTaskId();return e in this.dependenciesFrom||(this.dependenciesFrom[e]=[]),f in this.dependenciesTo||(this.dependenciesTo[f]=[]),e&&this.dependenciesFrom[e].push(d),f&&this.dependenciesTo[f].push(d),d},this.removeDependency=function(a,b){var c,d=this.dependenciesFrom[a.getFromTaskId()],e=[];if(d)for(c=0;c<d.length;c++)a===d[c]&&e.push(a);var f=this.dependenciesTo[a.getToTaskId()],g=[];if(f)for(c=0;c<f.length;c++)a===f[c]&&g.push(a);for(c=0;c<e.length;c++)b||e[c].disconnect(),d.splice(d.indexOf(a),1);for(c=0;c<g.length;c++)b||g[c].disconnect(),f.splice(f.indexOf(a),1);this.dependenciesFrom[a.getFromTaskId()]&&0===this.dependenciesFrom[a.getFromTaskId()].length&&delete this.dependenciesFrom[a.getFromTaskId()],this.dependenciesTo[a.getToTaskId()]&&0===this.dependenciesTo[a.getToTaskId()].length&&delete this.dependenciesTo[a.getToTaskId()]},this.getTaskDependencies=function(a){var b=[],c=g.dependenciesFrom[a.model.id];c&&(b=b.concat(c));var d=g.dependenciesTo[a.model.id];return d&&(b=b.concat(d)),b},this.setDraggingConnection=function(a){a?(g.draggingConnection=a,angular.forEach(g.tasks,function(a){a.dependencies.mouseHandler.release()})):(g.draggingConnection=void 0,angular.forEach(g.tasks,function(a){a.dependencies.mouseHandler.install()}))};var h=function(a){if(a.dependencies||(a.dependencies={}),a.dependencies.endpoints=[],g.pluginScope.endpoints)for(var b=0;b<g.pluginScope.endpoints.length;b++){var c=g.plumb.addEndpoint(a.$element,g.pluginScope.endpoints[b]);c.$task=a,a.dependencies.endpoints.push(c)}},i=function(a){for(var b=0;b<a.dependencies.endpoints.length;b++){var c=a.dependencies.endpoints[b];g.plumb.deleteEndpoint(c),c.$task=void 0}a.dependencies.endpoints=void 0},j=function(a){a.dependencies||(a.dependencies={}),a.dependencies.mouseHandler=new c(g,a),a.dependencies.mouseHandler.install()},k=function(a){a.dependencies.mouseHandler.release(),a.dependencies.mouseHandler=void 0};this.setTasks=function(a){angular.forEach(g.tasks,function(a){k(a),i(a)});for(var b={},c=0;c<a.length;c++){var d=a[c];b[d.model.id]=d,h(d),j(d)}g.tasks=b};var l=function(a){var b=g.getTaskDependencies(a);if(b)for(var c=0;c<b.length;c++)b[c].disconnect();return b},m=function(a){var b=g.getTaskDependencies(a);if(b)for(var c=0;c<b.length;c++)b[c].connect();return b};this.setTask=function(a){g.plumb.setSuspendDrawing(!0);try{var b=g.tasks[a.model.id];void 0!==b&&(l(b),k(b),i(b)),g.tasks[a.model.id]=a,h(a),j(a),m(a)}finally{g.plumb.setSuspendDrawing(!1,!0)}},this.getTask=function(a){return g.tasks[a]};var n=function(a){return a.dependencies.endpoints.filter(function(a){return a.isSource})},o=function(a){return a.dependencies.endpoints.filter(function(a){return a.isTarget})};this.connect=function(a,b,c){var d=n(a),e=o(b);if(d&&e){var f,h;f=c.connectParameters&&c.connectParameters.sourceEndpointIndex?d[c.connectParameters.sourceEndpointIndex]:d[0],h=c.connectParameters&&c.connectParameters.targetEndpointIndex?e[c.connectParameters.targetEndpointIndex]:e[0];var i=g.plumb.connect({source:f,target:h},c.connectParameters);return i}},this.getDependencies=function(){var a=[];return angular.forEach(this.dependenciesFrom,function(b){for(var c=0;c<b.length;c++)b[c]in a||a.push(b[c])}),a},this.refresh=function(a){g.plumb.setSuspendDrawing(!0);try{var b,c;a&&!angular.isArray(a)&&(a=[a]),void 0===a?(a=this.tasks,b=this.getDependencies()):(b=[],angular.forEach(a,function(a){var c=g.getTaskDependencies(a);angular.forEach(c,function(a){a in b||b.push(a)})}));for(c=0;c<b.length;c++)g.removeDependency(b[c]);angular.forEach(a,function(a){g.addDependenciesFromTask(a)})}finally{g.plumb.setSuspendDrawing(!1,!0)}},this.api.registerMethod("dependencies","refresh",this.refresh,this)};return d}])}(),function(){"use strict";angular.module("gantt.dependencies").factory("GanttDependency",["ganttUtils","ganttDom",function(a,b){var c=function(c,d,e){var f=this;this.manager=c,this.task=d,this.model=e,this.connection=void 0,this.fallbackEndpoints=[],this.isConnected=function(){return this.connection?!0:!1},this.disconnect=function(){this.connection&&(this.connection.endpoints&&this.manager.plumb.detach(this.connection),this.connection.$dependency=void 0,this.connection=void 0),this.deleteFallbackEndpoints()},this.deleteFallbackEndpoints=function(){if(this.fallbackEndpoints){for(var a=0;a<this.fallbackEndpoints.length;a++)f.manager.plumb.deleteEndpoint(this.fallbackEndpoints[a]);this.fallbackEndpoints=[]}},this.getFromTaskId=function(){return void 0!==this.model.from?this.model.from:this.task.model.id},this.getToTaskId=function(){return void 0!==this.model.to?this.model.to:this.task.model.id},this.getFromTask=function(){return void 0!==this.model.from?this.manager.getTask(this.model.from):this.task},this.getToTask=function(){return void 0!==this.model.to?this.manager.getTask(this.model.to):this.task},this.removeFromTaskModel=function(){var b=a.angularIndexOf(this.task.model.dependencies,this.model);return b>=0&&this.task.model.dependencies.splice(b,1),b};var g=function(a){if(void 0===a||void 0===a.$element)return!1;var c=a.$element[0];return b.isElementVisible(c)};this.connect=function(){var a=this.getFromTask(),b=this.getToTask();if(g(a)||(a=void 0),g(b)||(b=void 0),a&&b){var c=this.manager.connect(a,b,this.model);if(c)return c.$dependency=this,this.connection=c,!0}if(this.deleteFallbackEndpoints(),void 0!==a){var d=this.manager.pluginScope.fallbackEndpoints[1];this.fallbackEndpoints.push(this.manager.plumb.addEndpoint(a.$element,d))}if(void 0!==b){var e=this.manager.pluginScope.fallbackEndpoints[0];this.fallbackEndpoints.push(this.manager.plumb.addEndpoint(b.$element,e))}return!1}};return c}])}(),function(){"use strict";angular.module("gantt.dependencies").factory("GanttDependencyTaskMouseHandler",["$timeout",function(a){var b=function(b,c){var d=this;this.manager=b,this.task=c,this.installed=!1,this.elementHandlers=[],this.display=!0,this.hideEndpointsPromise=void 0;var e=function(b){this.element=b,this.mouseExitHandler=function(){a.cancel(d.hideEndpointsPromise),d.hideEndpointsPromise=a(d.hideEndpoints,1e3,!1)},this.mouseEnterHandler=function(){a.cancel(d.hideEndpointsPromise), +d.displayEndpoints()},this.install=function(){this.element.bind("mouseenter",this.mouseEnterHandler),this.element.bind("mouseleave",this.mouseExitHandler)},this.release=function(){this.element.unbind("mouseenter",this.mouseEnterHandler),this.element.unbind("mouseleave",this.mouseExitHandler),a.cancel(d.hideEndpointsPromise)}};this.install=function(){d.installed||(d.hideEndpoints(),d.elementHandlers.push(new e(d.task.getContentElement())),angular.forEach(d.task.dependencies.endpoints,function(a){d.elementHandlers.push(new e(angular.element(a.canvas)))}),angular.forEach(d.elementHandlers,function(a){a.install()}),d.installed=!0)},this.release=function(){d.installed&&(angular.forEach(d.elementHandlers,function(a){a.release()}),d.elementHandlers=[],d.displayEndpoints(),d.installed=!1)},this.displayEndpoints=function(){d.display=!0,angular.forEach(d.task.dependencies.endpoints,function(a){a.setVisible(!0,!0,!0)})},this.hideEndpoints=function(){angular.forEach(d.task.dependencies.endpoints,function(a){a.setVisible(!1,!0,!0)}),d.display=!1}};return b}])}(),function(){"use strict";angular.module("gantt.groups").controller("GanttGroupController",["$scope","GanttTaskGroup","ganttUtils",function(a,b,c){var d=function(){var d=a.row.model.groups;"boolean"==typeof d&&(d={enabled:d});var e=c.firstProperty([d],"enabled",a.pluginScope.enabled);e?(a.display=c.firstProperty([d],"display",a.pluginScope.display),a.taskGroup=new b(a.row,a.pluginScope),a.row.setFromTo(),a.row.setFromToByValues(a.taskGroup.from,a.taskGroup.to)):(a.taskGroup=void 0,a.display=void 0)};a.gantt.api.tasks.on.viewChange(a,function(b){if(void 0!==a.taskGroup)if(a.taskGroup.tasks.indexOf(b)>-1)d(),a.$$phase||a.$root.$$phase||a.$digest();else{var c=a.pluginScope.hierarchy.descendants(a.row);c.indexOf(b.row)>-1&&(d(),a.$$phase||a.$root.$$phase||a.$digest())}});var e=a.pluginScope.$watch("display",d);a.$watchCollection("gantt.rowsManager.filteredRows",d),a.gantt.api.columns.on.refresh(a,d),a.$on("$destroy",e)}])}(),function(){"use strict";angular.module("gantt.groups").directive("ganttTaskGroup",["GanttDirectiveBuilder",function(a){var b=new a("ganttTaskGroup","plugins/groups/taskGroup.tmpl.html");return b.build()}])}(),function(){"use strict";angular.module("gantt").factory("GanttTaskGroup",["ganttUtils","GanttTask",function(a,b){var c=function(c,d){var e=this;e.row=c,e.pluginScope=d,e.descendants=e.pluginScope.hierarchy.descendants(e.row),e.tasks=[],e.overviewTasks=[],e.promotedTasks=[],e.showGrouping=!1;var f=e.row.model.groups;"boolean"==typeof f&&(f={enabled:f});for(var g=function(b){var c=b.model.groups;"boolean"==typeof c&&(c={enabled:c});var d=b.row.model.groups;"boolean"==typeof d&&(d={enabled:d});var g=a.firstProperty([c,d,f],"enabled",e.pluginScope.enabled);if(g){var h=a.firstProperty([c,d,f],"display",e.pluginScope.display);return h}},h=0;h<e.descendants.length;h++)for(var i=e.descendants[h].tasks,j=0;j<i.length;j++){var k=i[j],l=g(k);if(void 0!==l){e.tasks.push(k);var m=new b(e.row,k.model);"overview"===l?e.overviewTasks.push(m):"promote"===l?e.promotedTasks.push(m):e.showGrouping=!0}}if(e.from=void 0,f&&(e.from=f.from),void 0===e.from)for(h=0;h<e.tasks.length;h++)(void 0===e.from||e.tasks[h].model.from<e.from)&&(e.from=e.tasks[h].model.from);if(e.to=void 0,f&&(e.to=f.to),void 0===e.to)for(h=0;h<e.tasks.length;h++)(void 0===e.to||e.tasks[h].model.to>e.to)&&(e.to=e.tasks[h].model.to);e.showGrouping&&(e.left=c.rowsManager.gantt.getPositionByDate(e.from),e.width=c.rowsManager.gantt.getPositionByDate(e.to)-e.left)};return c}])}(),function(){"use strict";angular.module("gantt").directive("ganttTaskOverview",["GanttDirectiveBuilder",function(a){var b=new a("ganttTaskOverview","plugins/groups/taskOverview.tmpl.html");return b.controller=function(a,b){a.task.$element=b,a.task.$scope=a,a.task.updatePosAndSize()},b.build()}])}(),function(){"use strict";angular.module("gantt.labels").directive("ganttLabelsBody",["GanttDirectiveBuilder","ganttLayout",function(a,b){var c=new a("ganttLabelsBody","plugins/labels/labelsBody.tmpl.html");return c.controller=function(a){var c=b.getScrollBarHeight();a.getLabelsCss=function(){var b={};if(a.maxHeight){var d=a.gantt.scroll.isHScrollbarVisible()?c:0;b["max-height"]=a.maxHeight-d-a.gantt.header.getHeight()+"px"}return b}},c.build()}])}(),function(){"use strict";angular.module("gantt.labels").directive("ganttLabelsHeader",["GanttDirectiveBuilder",function(a){var b=new a("ganttLabelsHeader","plugins/labels/labelsHeader.tmpl.html");return b.build()}])}(),function(){"use strict";angular.module("gantt.labels").directive("ganttSideContentLabels",["GanttDirectiveBuilder",function(a){var b=new a("ganttSideContentLabels","plugins/labels/sideContentLabels.tmpl.html");return b.build()}])}(),function(){"use strict";angular.module("gantt.movable").factory("ganttMovableOptions",[function(){return{initialize:function(a){return a.enabled=void 0!==a.enabled?a.enabled:!0,a.allowMoving=void 0!==a.allowMoving?!!a.allowMoving:!0,a.allowResizing=void 0!==a.allowResizing?!!a.allowResizing:!0,a.allowRowSwitching=void 0!==a.allowRowSwitching?!!a.allowRowSwitching:!0,a}}}])}(),function(){"use strict";angular.module("gantt.progress").directive("ganttTaskProgress",["$templateCache",function(a){return{restrict:"E",requires:"^ganttTask",templateUrl:function(b,c){var d;return d=void 0===c.templateUrl?"plugins/progress/taskProgress.tmpl.html":c.templateUrl,void 0!==c.template&&a.put(d,c.template),d},replace:!0,scope:!0,controller:["$scope","$element",function(a,b){a.getClasses=function(){var b=[];return"object"==typeof a.task.model.progress&&(b=a.task.model.progress.classes),b},a.getCss=function(){var b,c={};return void 0!==a.task.model.progress&&(b="object"==typeof a.task.model.progress?a.task.model.progress:{percent:a.task.model.progress}),b&&(b.color?c["background-color"]=b.color:c["background-color"]="#6BC443",c.width=b.percent+"%"),c},a.task.rowsManager.gantt.api.directives.raise["new"]("ganttTaskProgress",a,b),a.$on("$destroy",function(){a.task.rowsManager.gantt.api.directives.raise.destroy("ganttTaskProgress",a,b)})}]}}])}(),function(){"use strict";angular.module("gantt.table").directive("ganttSideContentTable",["GanttDirectiveBuilder","ganttLayout",function(a,b){var c=new a("ganttSideContentTable","plugins/table/sideContentTable.tmpl.html");return c.controller=function(a){var c=b.getScrollBarHeight();a.getMaxHeightCss=function(){var b={};if(a.maxHeight){var d=a.gantt.scroll.isHScrollbarVisible()?c:0;b["max-height"]=a.maxHeight-d-a.gantt.header.getHeight()+"px"}return b}},c.build()}])}(),function(){"use strict";angular.module("gantt.table").controller("TableColumnController",["$scope",function(a){a.getHeader=function(){var b=a.pluginScope.headers[a.column];return void 0!==b?b:(void 0!==a.pluginScope.headerFormatter&&(b=a.pluginScope.headerFormatter(a.column)),void 0!==b?b:b)},a.getHeaderContent=function(){var b=a.pluginScope.headerContents[a.column];return void 0===b?"{{getHeader()}}":b},a.getClass=function(){return a.pluginScope.classes[a.column]}}])}(),function(){"use strict";angular.module("gantt.table").controller("TableColumnRowController",["$scope",function(a){a.getValue=function(){var b=a.$eval(a.column,a.row),c=a.pluginScope.formatters[a.column];return void 0!==c&&(b=c(b,a.column,a.row)),b},a.getRowContent=function(){var b;return a.row.model.columnContents&&(b=a.row.model.columnContents[a.column]),void 0===b&&"model.name"===a.column&&(b=a.row.model.content),void 0===b&&(b=a.pluginScope.contents[a.column]),void 0===b&&"model.name"===a.column&&(b=a.row.rowsManager.gantt.options.value("rowContent")),void 0===b&&void 0!==a.pluginScope.content&&(b=a.pluginScope.content),void 0===b?"{{getValue()}}":b}}])}(),function(){"use strict";angular.module("gantt.tooltips").directive("ganttTooltip",["$log","$timeout","$compile","$document","$templateCache","ganttDebounce","ganttSmartEvent",function(a,b,c,d,e,f,g){return{restrict:"E",templateUrl:function(a,b){var c;return c=void 0===b.templateUrl?"plugins/tooltips/tooltip.tmpl.html":b.templateUrl,void 0!==b.template&&e.put(c,b.template),c},scope:!0,replace:!0,controller:["$scope","$element","ganttUtils",function(a,c,e){var h,i,j,k=angular.element(d[0].body),l=a.task.$element,m=!1,n=function(){var a=d[0];return a.documentElement.clientWidth||a.documentElement.getElementById("body")[0].clientWidth},o=function(b){b+c[0].offsetWidth>n()?(c.css("left",b+20-c[0].offsetWidth+"px"),a.isRightAligned=!0):(c.css("left",b-20+"px"),a.isRightAligned=!1)},p=function(b){m=!0,j.bind(),a.displayed=!0,a.$evalAsync(function(){var d;c.hasClass("ng-hide")&&(c.removeClass("ng-hide"),d=!0),a.elementHeight=c[0].offsetHeight,d&&c.addClass("ng-hide"),a.taskRect=l[0].getBoundingClientRect(),o(b)})},q=function(){m=!1,j.unbind(),a.$evalAsync(function(){a.displayed=!1})},r=function(c,d){h&&b.cancel(h);var f=a.task.model.tooltips,g=a.task.row.model.tooltips;"boolean"==typeof f&&(f={enabled:f}),"boolean"==typeof g&&(g={enabled:g});var j=e.firstProperty([f,g],"enabled",a.pluginScope.enabled);j&&!m&&void 0!==i&&c?d?h=b(function(){p(i)},a.pluginScope.delay,!1):p(i):c||a.task.active||q()};j=g(a,k,"mousemove",f(function(b){m?((!a.taskRect||b.clientX<a.taskRect.left||b.clientX>a.taskRect.right||b.clientY>a.taskRect.bottom||b.clientY<a.taskRect.top)&&r(!1,!1),o(b.clientX)):(i=b.clientX,r(!0,!1))},5,!1)),a.getFromLabel=function(){var b=a.task.model.tooltips,c=a.task.row.model.tooltips;"boolean"==typeof b&&(b={enabled:b}),"boolean"==typeof c&&(c={enabled:c});var d=e.firstProperty([b,c],"dateFormat",a.pluginScope.dateFormat);return a.task.model.from.format(d)},a.getToLabel=function(){var b=a.task.model.tooltips,c=a.task.row.model.tooltips;"boolean"==typeof b&&(b={enabled:b}),"boolean"==typeof c&&(c={enabled:c});var d=e.firstProperty([b,c],"dateFormat",a.pluginScope.dateFormat);return a.task.model.to.format(d)},a.task.getContentElement().bind("mousemove",function(a){i=a.clientX}),a.task.getContentElement().bind("mouseenter",function(a){i=a.clientX,r(!0,!0)}),a.task.getContentElement().bind("mouseleave",function(){r(!1)}),a.pluginScope.api.tasks.on.moveBegin&&(a.pluginScope.api.tasks.on.moveBegin(a,function(b){b===a.task&&r(!0)}),a.pluginScope.api.tasks.on.moveEnd(a,function(b){b===a.task&&r(!1)}),a.pluginScope.api.tasks.on.resizeBegin(a,function(b){b===a.task&&r(!0)}),a.pluginScope.api.tasks.on.resizeEnd(a,function(b){b===a.task&&r(!1)})),a.task.isMoving&&r(!0,!1),a.gantt.api.directives.raise["new"]("ganttTooltip",a,c),a.$on("$destroy",function(){a.gantt.api.directives.raise.destroy("ganttTooltip",a,c)})}]}}])}(),function(){"use strict";angular.module("gantt.tree").directive("ganttRowTreeLabel",["GanttDirectiveBuilder",function(a){var b=new a("ganttRowTreeLabel");return b.restrict="A",b.templateUrl=void 0,b.build()}])}(),function(){"use strict";angular.module("gantt.tree").directive("ganttSideContentTree",["GanttDirectiveBuilder",function(a){var b=new a("ganttSideContentTree","plugins/tree/sideContentTree.tmpl.html");return b.build()}])}(),function(){"use strict";angular.module("gantt.tree").controller("GanttTreeController",["$scope","$filter","GanttHierarchy",function(a,b,c){a.rootRows=[],a.getHeader=function(){return a.pluginScope.header};var d=new c;a.pluginScope.$watchGroup(["keepAncestorOnFilterRow","enabled"],function(c){var e=c[0]&&c[1];if(e){var f=function(a,c,e){d.refresh(a);for(var f=[],g=0;g<a.length;g++){var h=d.children(a[g]);h&&0!==h.length||f.push(a[g])}var i=b("filter")(f,c,e),j=function(a){if(i.indexOf(a)>-1)return!0;for(var b=d.descendants(a),c=0;c<b.length;c++)if(i.indexOf(b[c])>-1)return!0;return!1};return b("filter")(a,j,e)};a.gantt.rowsManager.setFilterImpl(f)}else a.gantt.rowsManager.setFilterImpl(!1)});var e=function(b){for(var c=a.parent(b);void 0!==c;){if(void 0!==c&&c._collapsed)return!1;c=a.parent(c)}return!0},f=function(a){return a.filter(function(a){return e(a)})},g=function(b){for(var c=[],d=[],e=!1,f=0;f<b.length;f++){var g=a.parent(b[f]);void 0===g?d.push(b[f]):e=!0}var h=function(d){c.push(d);var e=a.children(d);if(void 0!==e&&e.length>0)for(var f=e.sort(function(a,c){return b.indexOf(a)-b.indexOf(c)}),g=0;g<f.length;g++)h(f[g])};for(f=0;f<d.length;f++)h(d[f]);return c};a.gantt.api.rows.addRowSorter(g),a.gantt.api.rows.addRowFilter(f),a.$on("$destroy",function(){a.gantt.api.rows.removeRowSorter(g),a.gantt.api.rows.removeRowFilter(f)});var h=function(){a.rootRows=d.refresh(a.gantt.rowsManager.filteredRows),a.gantt.rowsManager.filteredRows.length>0&&(a.gantt.api.rows.sort(),a.gantt.api.rows.refresh())};a.gantt.api.rows.on.remove(a,h),a.gantt.api.rows.on.add(a,h);var i=function(b){var c;return c="string"==typeof b?a.gantt.rowsManager.rowsMap[b]:b,void 0!==c?void 0===c._collapsed?!1:c._collapsed:void 0},j=function(b){var c;if(c="string"==typeof b?a.gantt.rowsManager.rowsMap[b]:b,void 0!==c){var d=a.nodeScopes[c.model.id];d.collapsed&&d.toggle()}},k=function(b){var c;if(c="string"==typeof b?a.gantt.rowsManager.rowsMap[b]:b,void 0!==c){var d=a.nodeScopes[c.model.id];d.collapsed||d.toggle()}},l=function(){return d};a.getHeaderContent=function(){return a.pluginScope.headerContent},a.gantt.api.registerMethod("tree","refresh",h,this),a.gantt.api.registerMethod("tree","isCollapsed",i,this),a.gantt.api.registerMethod("tree","expand",j,this),a.gantt.api.registerMethod("tree","collapse",k,this),a.gantt.api.registerEvent("tree","collapsed"),a.gantt.api.registerMethod("tree","getHierarchy",l,this),a.$watchCollection("gantt.rowsManager.filteredRows",function(){h()}),a.children=function(b){return void 0===b?a.rootRows:d.children(b)},a.parent=function(a){return d.parent(a)},a.nodeScopes={}}]).controller("GanttUiTreeController",["$scope",function(a){var b=function(){a.$broadcast("angular-ui-tree:collapse-all")},c=function(){a.$broadcast("angular-ui-tree:expand-all")};a.gantt.api.registerMethod("tree","collapseAll",b,a),a.gantt.api.registerMethod("tree","expandAll",c,a)}]).controller("GanttTreeNodeController",["$scope",function(a){a.$parent.nodeScopes[a.row.model.id]=a,a.$on("$destroy",function(){delete a.$parent.nodeScopes[a.row.model.id]}),a.$watch("children(row)",function(b){if(b){for(var c=a.row.rowsManager.filteredRows,d=[],e=0;e<b.length;e++){var f=b[e];c.indexOf(f)>-1&&d.push(f)}a.$parent.childrenRows=d}else a.$parent.childrenRows=b}),a.isCollapseDisabled=function(){return!a.$parent.childrenRows||0===a.$parent.childrenRows.length},a.getValue=function(){return a.row.model.name},a.getRowContent=function(){if(void 0!==a.row.model.content)return a.row.model.content;if(void 0!==a.pluginScope.content)return a.pluginScope.content;var b=a.row.rowsManager.gantt.options.value("rowContent");return void 0===b&&(b="{{row.model.name}}"),b},a.$watch("collapsed",function(b){if(a.$modelValue._collapsed!==b){var c=a.$modelValue._collapsed;a.$modelValue._collapsed=b,void 0!==c&&b!==c&&(a.gantt.api.tree.raise.collapsed(a,a.$modelValue,b),a.gantt.api.rows.refresh())}})}])}(),function(){"use strict";angular.module("gantt.tree").directive("ganttTreeBody",["GanttDirectiveBuilder","ganttLayout",function(a,b){var c=new a("ganttTreeBody","plugins/tree/treeBody.tmpl.html");return c.controller=function(a){var c=b.getScrollBarHeight();a.getLabelsCss=function(){var b={};if(a.maxHeight){var d=a.gantt.scroll.isHScrollbarVisible()?c:0;b["max-height"]=a.maxHeight-d-a.gantt.header.getHeight()+"px"}return b}},c.build()}])}(),function(){"use strict";angular.module("gantt.tree").directive("ganttTreeHeader",["GanttDirectiveBuilder",function(a){var b=new a("ganttTreeHeader","plugins/tree/treeHeader.tmpl.html");return b.build()}])}(),angular.module("gantt.bounds.templates",[]).run(["$templateCache",function(a){a.put("plugins/bounds/taskBounds.tmpl.html",'<div ng-cloak class="gantt-task-bounds" ng-style="getCss()" ng-class="getClass()"></div>\n')}]),angular.module("gantt.dependencies.templates",[]).run(["$templateCache",function(a){}]),angular.module("gantt.drawtask.templates",[]).run(["$templateCache",function(a){}]),angular.module("gantt.groups.templates",[]).run(["$templateCache",function(a){a.put("plugins/groups/taskGroup.tmpl.html",'<div ng-controller="GanttGroupController">\n <div class="gantt-task-group-overview" ng-if="taskGroup.overviewTasks.length > 0">\n <gantt-task-overview ng-repeat="task in taskGroup.overviewTasks"></gantt-task-overview>\n </div>\n <div class="gantt-task-group-promote" ng-if="taskGroup.row._collapsed && taskGroup.promotedTasks.length > 0">\n <gantt-task ng-repeat="task in taskGroup.promotedTasks"></gantt-task>\n </div>\n <div class="gantt-task-group"\n ng-if="taskGroup.showGrouping"\n ng-style="{\'left\': taskGroup.left + \'px\', \'width\': taskGroup.width + \'px\'}">\n <div class="gantt-task-group-left-main"></div>\n <div class="gantt-task-group-right-main"></div>\n <div class="gantt-task-group-left-symbol"></div>\n <div class="gantt-task-group-right-symbol"></div>\n </div>\n</div>\n\n'),a.put("plugins/groups/taskOverview.tmpl.html",'<div class="gantt-task gantt-task-overview" ng-class="task.model.classes">\n <gantt-task-background></gantt-task-background>\n <gantt-task-content></gantt-task-content>\n <gantt-task-foreground></gantt-task-foreground>\n</div>\n\n')}]),angular.module("gantt.labels.templates",[]).run(["$templateCache",function(a){a.put("plugins/labels/labelsBody.tmpl.html",'<div class="gantt-labels-body" ng-style="getLabelsCss()">\n <div gantt-vertical-scroll-receiver>\n <div ng-repeat="row in gantt.rowsManager.visibleRows track by row.model.id">\n <div gantt-row-label\n class="gantt-row-label gantt-row-height"\n ng-class="row.model.classes"\n ng-style="{\'height\': row.model.height}">\n <span class="gantt-label-text">{{row.model.name}}</span>\n </div>\n </div>\n </div>\n</div>\n'),a.put("plugins/labels/labelsHeader.tmpl.html",'<div class="gantt-labels-header">\n <div ng-show="gantt.columnsManager.columns.length > 0 && gantt.columnsManager.headers.length > 0">\n <div ng-repeat="header in gantt.columnsManager.headers">\n <div class="gantt-row-height" ng-class="{\'gantt-labels-header-row\': $last, \'gantt-labels-header-row-last\': $last}"><span>{{$last ? pluginScope.header : ""}}</span></div>\n </div>\n </div>\n</div>\n'),a.put("plugins/labels/sideContentLabels.tmpl.html",'<div class="gantt-side-content-labels">\n <gantt-labels-header>\n </gantt-labels-header>\n <gantt-labels-body>\n </gantt-labels-body>\n</div>\n')}]),angular.module("gantt.movable.templates",[]).run(["$templateCache",function(a){}]),angular.module("gantt.overlap.templates",[]).run(["$templateCache",function(a){}]),angular.module("gantt.progress.templates",[]).run(["$templateCache",function(a){a.put("plugins/progress/taskProgress.tmpl.html",'<div ng-cloak class="gantt-task-progress" ng-style="getCss()" ng-class="getClasses()"></div>\n')}]),angular.module("gantt.resizeSensor.templates",[]).run(["$templateCache",function(a){}]),angular.module("gantt.sortable.templates",[]).run(["$templateCache",function(a){}]),angular.module("gantt.table.templates",[]).run(["$templateCache",function(a){a.put("plugins/table/sideContentTable.tmpl.html",'<div class="gantt-side-content-table">\n\n <div class="gantt-table-column {{getClass()}}" ng-repeat="column in pluginScope.columns" ng-controller="TableColumnController">\n\n <div class="gantt-table-header" ng-style="{height: ganttHeaderHeight + \'px\'}">\n <div ng-show="ganttHeaderHeight" class="gantt-row-label-header gantt-row-label gantt-table-row gantt-table-header-row">\n <span class="gantt-label-text" gantt-bind-compile-html="getHeaderContent()"/>\n </div>\n </div>\n\n <div class="gantt-table-content" ng-style="getMaxHeightCss()">\n <div gantt-vertical-scroll-receiver>\n <div class="gantt-table-row" ng-repeat="row in gantt.rowsManager.visibleRows track by row.model.id" ng-controller="TableColumnRowController">\n <div gantt-row-label class="gantt-row-label gantt-row-height" ng-class="row.model.classes" ng-style="{\'height\': row.model.height}">\n <div class="gantt-valign-container">\n <div class="gantt-valign-content">\n <span class="gantt-label-text" gantt-bind-compile-html="getRowContent()"></span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n</div>\n')}]),angular.module("gantt.tooltips.templates",[]).run(["$templateCache",function(a){a.put("plugins/tooltips/tooltip.tmpl.html",'<div ng-cloak\n class="gantt-task-info"\n ng-show="displayed"\n ng-class="isRightAligned ? \'gantt-task-infoArrowR\' : \'gantt-task-infoArrow\'"\n ng-style="{top: taskRect.top + \'px\', marginTop: -elementHeight - 8 + \'px\'}">\n <div class="gantt-task-info-content">\n <div gantt-bind-compile-html="pluginScope.content"></div>\n </div>\n</div>\n')}]),angular.module("gantt.tree.templates",[]).run(["$templateCache",function(a){a.put("plugins/tree/sideContentTree.tmpl.html",'<div class="gantt-side-content-tree" ng-controller="GanttTreeController">\n <gantt-tree-header>\n </gantt-tree-header>\n <gantt-tree-body>\n </gantt-tree-body>\n</div>\n'),a.put("plugins/tree/treeBody.tmpl.html",'<div class="gantt-tree-body" ng-style="getLabelsCss()">\n <div gantt-vertical-scroll-receiver>\n <div class="gantt-row-label-background">\n <div class="gantt-row-label gantt-row-height"\n ng-class="row.model.classes"\n ng-style="{\'height\': row.model.height}"\n ng-repeat="row in gantt.rowsManager.visibleRows track by row.model.id">\n \n </div>\n </div>\n <div ui-tree ng-controller="GanttUiTreeController" data-drag-enabled="false" data-empty-place-holder-enabled="false">\n <ol class="gantt-tree-root" ui-tree-nodes ng-model="rootRows">\n <li ng-repeat="row in rootRows" ui-tree-node\n ng-include="\'plugins/tree/treeBodyChildren.tmpl.html\'">\n </li>\n </ol>\n </div>\n </div>\n</div>\n'),a.put("plugins/tree/treeBodyChildren.tmpl.html",'<div ng-controller="GanttTreeNodeController"\n class="gantt-row-label gantt-row-height"\n ng-class="row.model.classes"\n ng-style="{\'height\': row.model.height}">\n <div class="gantt-valign-container">\n <div class="gantt-valign-content">\n <a ng-disabled="isCollapseDisabled()" data-nodrag\n class="gantt-tree-handle-button btn btn-xs"\n ng-class="{\'gantt-tree-collapsed\': collapsed, \'gantt-tree-expanded\': !collapsed}"\n ng-click="!isCollapseDisabled() && toggle()"><span\n class="gantt-tree-handle glyphicon glyphicon-chevron-down"\n ng-class="{\n \'glyphicon-chevron-right\': collapsed, \'glyphicon-chevron-down\': !collapsed,\n \'gantt-tree-collapsed\': collapsed, \'gantt-tree-expanded\': !collapsed}"></span>\n </a>\n <span gantt-row-label class="gantt-label-text" gantt-bind-compile-html="getRowContent()"/>\n </div>\n </div>\n</div>\n<ol ui-tree-nodes ng-class="{hidden: collapsed}" ng-model="childrenRows">\n <li ng-repeat="row in childrenRows" ui-tree-node>\n <div ng-include="\'plugins/tree/treeBodyChildren.tmpl.html\'"></div>\n </li>\n</ol>\n'),a.put("plugins/tree/treeHeader.tmpl.html",'<div class="gantt-tree-header" ng-style="{height: $parent.ganttHeaderHeight + \'px\'}">\n <div ng-if="$parent.ganttHeaderHeight" class="gantt-row-label gantt-row-label-header gantt-tree-row gantt-tree-header-row"><span class="gantt-label-text" gantt-bind-compile-html="getHeaderContent()"/></div>\n</div>\n')}]); //# sourceMappingURL=angular-gantt-plugins.min.js.map \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.min.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.min.js.map index 6ceabdd9de1c0fa94f794c9e0872b551cd1484fe..894a233c611c252256ac8c67494383b70d220060 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.min.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-plugins.min.js.map @@ -1 +1 @@ -{"version":3,"file":"angular-gantt-plugins.min.js","sources":["../src/plugins/bounds.js","../src/plugins/drawtask.js","../src/plugins/groups.js","../src/plugins/labels.js","../src/plugins/movable.js","../src/plugins/overlap.js","../src/plugins/progress.js","../src/plugins/resizeSensor.js","../src/plugins/sortable.js","../src/plugins/table.js","../src/plugins/tooltips.js","../src/plugins/tree.js","../src/plugins/bounds/taskBounds.directive.js","../src/plugins/groups/group.controller.js","../src/plugins/groups/taskGroup.directive.js","../src/plugins/groups/taskGroup.factory.js","../src/plugins/groups/taskOverview.directive.js","../src/plugins/labels/labelsBody.directive.js","../src/plugins/labels/labelsHeader.directive.js","../src/plugins/labels/sideContentLabels.directive.js","../src/plugins/movable/movableOptions.factory.js","../src/plugins/progress/taskProgress.directive.js","../src/plugins/table/sideContentTable.directive.js","../src/plugins/table/tableColumn.controller.js","../src/plugins/table/tableColumnRow.controller.js","../src/plugins/tooltips/tooltip.directive.js","../src/plugins/tree/rowTreeLabel.directive.js","../src/plugins/tree/sideContentTree.directive.js","../src/plugins/tree/tree.controller.js","../src/plugins/tree/treeBody.directive.js","../src/plugins/tree/treeHeader.directive.js","../.tmp/generated/plugins/bounds/html2js.js","../.tmp/generated/plugins/drawtask/html2js.js","../.tmp/generated/plugins/groups/html2js.js","../.tmp/generated/plugins/labels/html2js.js","../.tmp/generated/plugins/movable/html2js.js","../.tmp/generated/plugins/overlap/html2js.js","../.tmp/generated/plugins/progress/html2js.js","../.tmp/generated/plugins/resizeSensor/html2js.js","../.tmp/generated/plugins/sortable/html2js.js","../.tmp/generated/plugins/table/html2js.js","../.tmp/generated/plugins/tooltips/html2js.js","../.tmp/generated/plugins/tree/html2js.js"],"names":["angular","module","directive","moment","$compile","$document","restrict","require","scope","enabled","link","element","attrs","ganttCtrl","api","gantt","options","option","bounds","undefined","directives","on","directiveName","taskScope","taskElement","boundsScope","$new","pluginScope","ifElement","createElement","attr","boundsElement","templateUrl","template","append","tasks","clean","model","est","isMoment","lct","document","mouseOffset","moveThreshold","taskModelFactory","directiveScope","addNewTask","x","startDate","core","getDateByPosition","endDate","taskModel","from","to","task","row","addTask","isResizing","updatePosAndSize","updateVisibleTasks","$scope","$digest","deferDrawing","startX","moveTrigger","evt","currentX","getOffset","Math","abs","off","one","drawHandler","evtTarget","target","srcElement","isFunction","className","indexOf","drawTaskHandler","destroy","utils","Hierarchy","display","refresh","hierarchy","rowsManager","filteredRows","sortable","registerMethod","this","$watchCollection","rowScope","rowElement","taskGroupScope","taskGroupElement","$log","header","fitSideWidthToLabels","labels","side","$element","getElementsByClassName","newSideWidth","forEach","label","width","children","offsetWidth","max","setWidth","warn","sideContentScope","sideContentElement","labelsScope","addClass","labelsElement","mouseButton","smartEvent","movableOptions","dom","$window","$timeout","allowMoving","allowResizing","allowRowSwitching","movable","initialize","registerEvent","mouseStartOffsetX","moveStartX","_hasTouch","DocumentTouch","_pressEvents","_moveEvents","_releaseEvents","taskWithSmallWidth","resizeAreaWidthBig","resizeAreaWidthSmall","scrollSpeed","scrollTriggerDistance","scrollInterval","windowElement","ganttBodyElement","body","ganttScrollElement","scroll","taskHasBeenChanged","taskHasBeenMovedFromAnotherRow","foregroundElement","getForegroundElement","contentElement","getContentElement","onPressEvents","preventDefault","getTouch","taskMovable","rowMovable","enabledValue","firstProperty","taskOffsetX","getOffsetForElement","mode","getMoveMode","getButton","bodyOffsetX","enableMoveMode","onMousemove","isMoving","css","getCursor","handleMove","destroyed","clearScrollInterval","moveTask","scrollScreen","oldTaskHasBeenChanged","mousePos","mouseOffsetX","taskOutOfRange","value","moveMode","scrollRect","getBoundingClientRect","rowCenterLeft","left","ganttBody","querySelectorAll","targetRowElement","findElementFromPoint","clientY","hasClass","targetRow","rows","i","l","length","sourceRow","moveTaskToRow","moveTo","raise","move","setGlobalCursor","setTo","resize","setFrom","backgroundElement","getBackgroundElement","moveBegin","resizeBegin","leftScreenBorder","scrollLeft","screenWidth","scrollWidth","rightScreenBorder","keepOnScrolling","right","cancel","distance","cursor","-moz-user-select","-webkit-user-select","-ms-user-select","user-select","originalModel","originalRow","copy","modelLeft","active","taskMoveHandler","stopImmediatePropagation","moveSmartEvent","bind","unbind","disableMoveMode","bindOnce","removeClass","extend","id","removeTask","$apply","moveEnd","resizeEnd","sortTasks","change","$on","handleOverlaps","overlapsTasks","changedTask","allTasks","newOverlapsTasks","removedOverlapsTasks","currentTask","currentStart","currentEnd","isBefore","currentRange","range","start","end","overlaps","hasOwnProperty","progress","progressScope","progressElement","buildSensor","ganttElement","parent","ResizeSensor","ganttElementWidth","clientWidth","rendered","sensor","detach","ElementQueries","update","$watch","newValue","failedDependency","moduleName","pluginDependencies","url","failedDependencies","loadedDependencies","currentDependency","isString","push","e","exception","errorMessage","message","checkDraggable","rowSortable","onDropSuccess","$evalAsync","onDrop","data","rowsMap","moveRow","columns","headers","classes","contents","headerContents","formatters","headerFormatter","model.name","tableScope","tableElement","dateFormat","content","tooltips","tooltipScope","tooltipElement","headerContent","keepAncestorOnFilterRow","$templateCache","tElement","tAttrs","put","replace","controller","toggleClass","simplifyMoment","d","unix","$watchGroup","getPositionByDate","TaskGroup","updateTaskGroup","rowGroups","groups","taskGroup","setFromTo","setFromToByValues","descendants","removeWatch","Builder","builder","build","factory","Task","self","overviewTasks","promotedTasks","showGrouping","groupRowGroups","getTaskDisplay","taskGroups","descendant","taskDisplay","clone","layout","hScrollBarHeight","getScrollBarHeight","getLabelsCss","maxHeight","bodyScrollBarHeight","isHScrollbarVisible","getHeight","requires","getClasses","getCss","percent","color","getMaxHeightCss","getHeader","column","getHeaderContent","getClass","getValue","$eval","formatter","getRowContent","columnContents","debounce","showTooltipPromise","mouseEnterX","bodyElement","parentElement","visible","getFromLabel","taskTooltips","rowTooltips","format","getToLabel","mouseMoveHandler","taskRect","clientX","bottom","top","displayTooltip","updateTooltip","showDelayed","showTooltip","hideTooltip","displayed","restoreNgHide","elementHeight","offsetHeight","getViewPortWidth","documentElement","getElementById","isRightAligned","$filter","rootRows","keepAncestor","filterImpl","sortedRows","filterRow","filterRowComparator","leaves","filteredLeaves","filterRowKeepAncestor","setFilterImpl","isVisible","parentRow","_collapsed","filterRowsFunction","filter","sortRowsFunction","hasParent","rowParent","handleChildren","sortedChildren","sort","a","b","child","addRowSorter","addRowFilter","removeRowSorter","removeRowFilter","remove","add","isRowCollapsed","rowId","expandRow","nodeScopes","collapsed","toggle","collapseRow","getHierarchy","collapseAll","expandAll","$parent","visibleRows","filteredChildrenRows","childRow","childrenRows","isCollapseDisabled","name","$modelValue","oldValue","tree","run"],"mappings":"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"} \ No newline at end of file +{"version":3,"sources":["../src/plugins/bounds.js","../src/plugins/dependencies.js","../src/plugins/drawtask.js","../src/plugins/groups.js","../src/plugins/labels.js","../src/plugins/movable.js","../src/plugins/overlap.js","../src/plugins/progress.js","../src/plugins/resizeSensor.js","../src/plugins/sortable.js","../src/plugins/table.js","../src/plugins/tooltips.js","../src/plugins/tree.js","../src/plugins/bounds/taskBounds.directive.js","../src/plugins/dependencies/dependenciesEvents.factory.js","../src/plugins/dependencies/dependenciesManager.factory.js","../src/plugins/dependencies/dependency.factory.js","../src/plugins/dependencies/taskMouseHandler.factory.js","../src/plugins/groups/group.controller.js","../src/plugins/groups/taskGroup.directive.js","../src/plugins/groups/taskGroup.factory.js","../src/plugins/groups/taskOverview.directive.js","../src/plugins/labels/labelsBody.directive.js","../src/plugins/labels/labelsHeader.directive.js","../src/plugins/labels/sideContentLabels.directive.js","../src/plugins/movable/movableOptions.factory.js","../src/plugins/progress/taskProgress.directive.js","../src/plugins/table/sideContentTable.directive.js","../src/plugins/table/tableColumn.controller.js","../src/plugins/table/tableColumnRow.controller.js","../src/plugins/tooltips/tooltip.directive.js","../src/plugins/tree/rowTreeLabel.directive.js","../src/plugins/tree/sideContentTree.directive.js","../src/plugins/tree/tree.controller.js","../src/plugins/tree/treeBody.directive.js","../src/plugins/tree/treeHeader.directive.js","../.tmp/generated/plugins/bounds/html2js.js","../.tmp/generated/plugins/dependencies/html2js.js","../.tmp/generated/plugins/drawtask/html2js.js","../.tmp/generated/plugins/groups/html2js.js","../.tmp/generated/plugins/labels/html2js.js","../.tmp/generated/plugins/movable/html2js.js","../.tmp/generated/plugins/overlap/html2js.js","../.tmp/generated/plugins/progress/html2js.js","../.tmp/generated/plugins/resizeSensor/html2js.js","../.tmp/generated/plugins/sortable/html2js.js","../.tmp/generated/plugins/table/html2js.js","../.tmp/generated/plugins/tooltips/html2js.js","../.tmp/generated/plugins/tree/html2js.js"],"names":["angular","module","directive","moment","$compile","$document","restrict","require","scope","enabled","link","element","attrs","ganttCtrl","api","gantt","options","option","bounds","undefined","directives","on","directiveName","taskScope","taskElement","boundsScope","$new","pluginScope","ifElement","createElement","attr","boundsElement","templateUrl","template","append","tasks","clean","model","est","isMoment","lct","$timeout","debounce","DependenciesManager","jsPlumbDefaults","endpoints","fallbackEndpoints","createLeftOverlay","createRightOverlay","createLeftFallbackOverlay","createRightFallbackOverlay","dependencies","Endpoint","radius","EndpointStyle","fillStyle","strokeStyle","lineWidth","Connector","ConnectionOverlays","location","length","width","anchor","isSource","isTarget","maxConnections","cssClass","overlays","create","endpoint","manager","directiveScope","directiveElement","plumb","setContainer","add","task","addDependenciesFromTask","remove","removeDependenciesFromTask","displayed","setTasks","refresh","rows","viewChange","$element","revalidate","viewRowChange","setTask","document","mouseOffset","utils","moveThreshold","taskModelFactory","addNewTask","x","startDate","core","getDateByPosition","endDate","taskModel","from","to","row","addTask","isResizing","updatePosAndSize","updateVisibleTasks","$scope","$digest","deferDrawing","startX","moveTrigger","evt","currentX","getOffset","Math","abs","off","one","drawHandler","evtTarget","target","srcElement","isFunction","className","indexOf","drawTaskHandler","destroy","Hierarchy","display","hierarchy","rowsManager","filteredRows","sortable","registerMethod","this","$watchCollection","rowScope","rowElement","taskGroupScope","taskGroupElement","$log","header","fitSideWidthToLabels","labels","side","getElementsByClassName","newSideWidth","i","children","offsetWidth","max","setWidth","warn","sideContentScope","sideContentElement","labelsScope","addClass","labelsElement","mouseButton","smartEvent","movableOptions","dom","$window","allowMoving","allowResizing","allowRowSwitching","movable","initialize","registerEvent","mouseStartOffsetX","moveStartX","_hasTouch","DocumentTouch","_pressEvents","_moveEvents","_releaseEvents","taskWithSmallWidth","resizeAreaWidthBig","resizeAreaWidthSmall","scrollSpeed","scrollTriggerDistance","scrollInterval","windowElement","ganttBodyElement","body","ganttScrollElement","scroll","taskHasBeenChanged","taskHasBeenMovedFromAnotherRow","foregroundElement","getForegroundElement","contentElement","getContentElement","onPressEvents","preventDefault","getTouch","taskMovable","rowMovable","enabledValue","firstProperty","taskOffsetX","getOffsetForElement","mode","getMoveMode","getButton","bodyOffsetX","enableMoveMode","onMousemove","isMoving","css","getCursor","handleMove","destroyed","clearScrollInterval","moveTask","scrollScreen","oldTaskHasBeenChanged","mousePos","mouseOffsetX","taskOutOfRange","value","moveMode","scrollRect","getBoundingClientRect","rowCenterLeft","left","ganttBody","querySelectorAll","targetRowElement","findElementFromPoint","clientY","hasClass","targetRow","l","sourceRow","moveTaskToRow","moveTo","raise","move","setGlobalCursor","setTo","resize","setFrom","backgroundElement","getBackgroundElement","moveBegin","resizeBegin","leftScreenBorder","scrollLeft","screenWidth","scrollWidth","rightScreenBorder","keepOnScrolling","right","cancel","distance","cursor","-moz-user-select","-webkit-user-select","-ms-user-select","user-select","originalModel","originalRow","copy","modelLeft","active","taskMoveHandler","stopImmediatePropagation","moveSmartEvent","bind","unbind","disableMoveMode","bindOnce","removeClass","id","removeTask","$apply","moveEnd","resizeEnd","sortTasks","change","$on","getStartEnd","start","end","isBefore","getRange","startEnd","range","handleTaskOverlap","overlapsList","handleTaskNonOverlaps","allTasks","handleOverlaps","newOverlapsTasks","previousTask","previousRange","overlaps","rowChange","oldRow","progress","progressScope","progressElement","buildSensor","ganttElement","parent","ResizeSensor","ganttElementWidth","clientWidth","sensor","rendered","detach","ElementQueries","update","$watch","newValue","failedDependency","moduleName","pluginDependencies","url","failedDependencies","loadedDependencies","currentDependency","isString","push","e","exception","errorMessage","message","checkDraggable","rowSortable","onDropSuccess","$evalAsync","onDrop","data","rowsMap","moveRow","columns","headers","classes","contents","headerContents","formatters","headerFormatter","model.name","tableScope","tableElement","dateFormat","content","delay","tooltips","tooltipScope","tooltipElement","headerContent","keepAncestorOnFilterRow","$templateCache","tElement","tAttrs","put","replace","controller","toggleClass","simplifyMoment","d","unix","$watchGroup","getPositionByDate","factory","DependenciesEvents","self","denyDropOnSameTask","params","sourceId","targetId","connection","setDraggingConnection","createConnection","info","mouseEvent","oldDependency","$dependency","sourceEndpoint","targetEndpoint","sourceModel","$task","dependenciesModel","connectionModel","removeFromTaskModel","removeDependency","dependency","addDependency","updateConnection","newSourceEndpoint","newTargetEndpoint","deleteConnection","Dependency","TaskMouseHandler","jsPlumb","getInstance","importDefaults","dependenciesFrom","dependenciesTo","events","oldValue","taskDependencies","isArray","connect","keepConnection","getTaskDependencies","disconnect","fromTaskId","getFromTaskId","toTaskId","getToTaskId","fromDependencies","fromRemove","toDependencies","toRemove","splice","concat","draggingConnection","forEach","mouseHandler","release","install","addTaskEndpoints","endpointObject","addEndpoint","removeTaskEndpoint","deleteEndpoint","addTaskMouseHandler","removeTaskMouseHandler","newTasks","disconnectTaskDependencies","connectTaskDependencies","setSuspendDrawing","oldTask","getTask","taskId","getSourceEndpoints","filter","getTargetEndpoints","fromTask","toTask","sourceEndpoints","targetEndpoints","connectParameters","sourceEndpointIndex","targetEndpointIndex","source","getDependencies","allDependencies","tasksDependencies","taskDependency","isConnected","deleteFallbackEndpoints","getFromTask","getToTask","modelIndex","angularIndexOf","isTaskVisible","isElementVisible","toFallbackEndpoint","fromFallbackEndpoint","installed","elementHandlers","hideEndpointsPromise","ElementHandler","mouseExitHandler","hideEndpoints","mouseEnterHandler","displayEndpoints","canvas","elementHandler","setVisible","TaskGroup","updateTaskGroup","rowGroups","groups","taskGroup","setFromTo","setFromToByValues","$$phase","$root","descendants","removeWatch","Builder","builder","build","Task","overviewTasks","promotedTasks","showGrouping","groupRowGroups","getTaskDisplay","taskGroups","j","taskDisplay","clone","layout","hScrollBarHeight","getScrollBarHeight","getLabelsCss","maxHeight","bodyScrollBarHeight","isHScrollbarVisible","getHeight","requires","getClasses","getCss","percent","color","getMaxHeightCss","getHeader","column","getHeaderContent","getClass","getValue","$eval","formatter","getRowContent","columnContents","showTooltipPromise","mouseEnterX","mouseMoveHandler","bodyElement","parentElement","visible","getViewPortWidth","documentElement","getElementById","updateTooltip","isRightAligned","showTooltip","restoreNgHide","elementHeight","offsetHeight","taskRect","hideTooltip","displayTooltip","showDelayed","taskTooltips","rowTooltips","clientX","bottom","top","getFromLabel","format","getToLabel","$filter","rootRows","keepAncestor","filterImpl","sortedRows","filterRow","filterRowComparator","leaves","filteredLeaves","filterRowKeepAncestor","setFilterImpl","isVisible","parentRow","_collapsed","filterRowsFunction","sortRowsFunction","hasParent","rowParent","handleChildren","sortedChildren","sort","a","b","addRowSorter","addRowFilter","removeRowSorter","removeRowFilter","isRowCollapsed","rowId","expandRow","nodeScopes","collapsed","toggle","collapseRow","getHierarchy","collapseAll","$broadcast","expandAll","$parent","visibleRows","filteredChildrenRows","childRow","childrenRows","isCollapseDisabled","name","$modelValue","tree","run"],"mappings":"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","file":"angular-gantt-plugins.min.js"} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-progress-plugin.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-progress-plugin.js index 2d655e3d6cae8f58ff8d8cd14315b50308577443..e7cf4fbed6b547743fc512c012944a968a72385a 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-progress-plugin.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-progress-plugin.js @@ -1,5 +1,5 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-progress-plugin.min.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-progress-plugin.min.js index 76bbbf85ec5a9d67202b22a895c0d3e3f6cc8b07..54bf3202b2188a115d76c557758188c1a79a1a81 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-progress-plugin.min.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-progress-plugin.min.js @@ -1,5 +1,5 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-progress-plugin.min.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-progress-plugin.min.js.map index 35ff4131de3ba454b5c89464a55ad11b85e1bece..88da5fafe34612fef4cf3ab1c8379b39a15a5ea1 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-progress-plugin.min.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-progress-plugin.min.js.map @@ -1 +1 @@ -{"version":3,"file":"angular-gantt-progress-plugin.min.js","sources":["../src/plugins/progress.js","../src/plugins/progress/taskProgress.directive.js","../.tmp/generated/plugins/progress/html2js.js"],"names":["angular","module","directive","moment","$compile","$document","restrict","require","scope","enabled","link","element","attrs","ganttCtrl","api","gantt","options","option","progress","undefined","directives","on","directiveName","taskScope","taskElement","progressScope","$new","pluginScope","ifElement","createElement","attr","progressElement","templateUrl","template","append","tasks","clean","model","est","isMoment","lct","$templateCache","requires","tElement","tAttrs","put","replace","controller","$scope","$element","getClasses","classes","task","getCss","css","percent","color","width","rowsManager","raise","$on","destroy","run"],"mappings":";;;;;;;;CAAC,WACG,YACAA,SAAQC,OAAO,kBAAmB,QAAS,6BAA6BC,UAAU,iBAAkB,SAAU,WAAY,YAAa,SAASC,EAAQC,EAAUC,GAC9J,OACIC,SAAU,IACVC,QAAS,SACTC,OACIC,QAAS,MAEbC,KAAM,SAASF,EAAOG,EAASC,EAAOC,GAClC,GAAIC,GAAMD,EAAUE,MAAMD,GAG1B,IAAIN,EAAMQ,SAA8C,gBAA5BR,GAAMQ,QAAgB,SAC9C,IAAK,GAAIC,KAAUT,GAAMQ,QAAQE,SAC7BV,EAAMS,GAAUT,EAAMQ,QAAQC,EAIhBE,UAAlBX,EAAMC,UACND,EAAMC,SAAU,GAGpBK,EAAIM,WAAWC,GAAfP,OAAsBN,EAAO,SAASc,EAAeC,EAAWC,GAC5D,GAAsB,wBAAlBF,EAAyC,CACzC,GAAIG,GAAgBF,EAAUG,MAC9BD,GAAcE,YAAcnB,CAE5B,IAAIoB,GAAYvB,EAAU,GAAGwB,cAAc,MAC3C7B,SAAQW,QAAQiB,GAAWE,KAAK,aAAc,2DAE9C,IAAIC,GAAkB1B,EAAU,GAAGwB,cAAc,sBACvBV,UAAtBP,EAAMoB,aACNhC,QAAQW,QAAQoB,GAAiBD,KAAK,oBAAqBlB,EAAMoB,aAE9Cb,SAAnBP,EAAMqB,UACNjC,QAAQW,QAAQoB,GAAiBD,KAAK,gBAAiBlB,EAAMqB,UAEjEjC,QAAQW,QAAQiB,GAAWM,OAAOH,GAClCP,EAAYU,OAAO9B,EAASwB,GAAWH,OAI/CX,EAAIqB,MAAMd,GAAGe,MAAM5B,EAAO,SAAS6B,GACblB,SAAdkB,EAAMC,KAAsBnC,EAAOoC,SAASF,EAAMC,OAClDD,EAAMC,IAAMnC,EAAOkC,EAAMC,MAGXnB,SAAdkB,EAAMG,KAAsBrC,EAAOoC,SAASF,EAAMG,OAClDH,EAAMG,IAAMrC,EAAOkC,EAAMG,gBCjDhD,WACG,YACAxC,SAAQC,OAAO,kBAAkBC,UAAU,qBAAsB,iBAAkB,SAASuC,GACxF,OACInC,SAAU,IACVoC,SAAU,aACVV,YAAa,SAASW,EAAUC,GAC5B,GAAIZ,EASJ,OAPIA,GADuBb,SAAvByB,EAAOZ,YACO,0CAEAY,EAAOZ,YAEDb,SAApByB,EAAOX,UACPQ,EAAeI,IAAIb,EAAaY,EAAOX,UAEpCD,GAEXc,SAAS,EACTtC,OAAO,EACPuC,YAAa,SAAU,WAAY,SAASC,EAAQC,GAChDD,EAAOE,WAAa,WAChB,GAAIC,KAMJ,OAJ2C,gBAAhCH,GAAOI,KAAKf,MAAc,WACjCc,EAAUH,EAAOI,KAAKf,MAAMnB,SAASiC,SAGlCA,GAGXH,EAAOK,OAAS,WACZ,GAEInC,GAFAoC,IAqBJ,OAlBmCnC,UAA/B6B,EAAOI,KAAKf,MAAMnB,WAEdA,EADuC,gBAAhC8B,GAAOI,KAAKf,MAAc,SACtBW,EAAOI,KAAKf,MAAMnB,UAEjBqC,QAASP,EAAOI,KAAKf,MAAMnB,WAI3CA,IACIA,EAASsC,MACTF,EAAI,oBAAsBpC,EAASsC,MAEnCF,EAAI,oBAAsB,UAG9BA,EAAIG,MAAQvC,EAASqC,QAAU,KAG5BD,GAGXN,EAAOI,KAAKM,YAAY3C,MAAMD,IAAIM,WAAWuC,MAA7CX,OAAuD,oBAAqBA,EAAQC,GACpFD,EAAOY,IAAI,WAAY,WACnBZ,EAAOI,KAAKM,YAAY3C,MAAMD,IAAIM,WAAWuC,MAAME,QAAQ,oBAAqBb,EAAQC,cC1D5GjD,QAAQC,OAAO,+BAAgC6D,KAAK,iBAAkB,SAASrB,GAC3EA,EAAeI,IAAI,0CACf"} \ No newline at end of file +{"version":3,"sources":["../src/plugins/progress.js","../src/plugins/progress/taskProgress.directive.js","../.tmp/generated/plugins/progress/html2js.js"],"names":["angular","module","directive","moment","$compile","$document","restrict","require","scope","enabled","link","element","attrs","ganttCtrl","api","gantt","options","option","progress","undefined","directives","on","directiveName","taskScope","taskElement","progressScope","$new","pluginScope","ifElement","createElement","attr","progressElement","templateUrl","template","append","tasks","clean","model","est","isMoment","lct","$templateCache","requires","tElement","tAttrs","put","replace","controller","$scope","$element","getClasses","classes","task","getCss","css","percent","color","width","rowsManager","raise","$on","destroy","run"],"mappings":";;;;;;;;CAAC,WACG,YACAA,SAAQC,OAAO,kBAAmB,QAAS,6BAA6BC,UAAU,iBAAkB,SAAU,WAAY,YAAa,SAASC,EAAQC,EAAUC,GAC9J,OACIC,SAAU,IACVC,QAAS,SACTC,OACIC,QAAS,MAEbC,KAAM,SAASF,EAAOG,EAASC,EAAOC,GAClC,GAAIC,GAAMD,EAAUE,MAAMD,GAG1B,IAAIN,EAAMQ,SAA8C,gBAA5BR,GAAMQ,QAAgB,SAC9C,IAAK,GAAIC,KAAUT,GAAMQ,QAAQE,SAC7BV,EAAMS,GAAUT,EAAMQ,QAAQC,EAIhBE,UAAlBX,EAAMC,UACND,EAAMC,SAAU,GAGpBK,EAAIM,WAAWC,GAAfP,OAAsBN,EAAO,SAASc,EAAeC,EAAWC,GAC5D,GAAsB,wBAAlBF,EAAyC,CACzC,GAAIG,GAAgBF,EAAUG,MAC9BD,GAAcE,YAAcnB,CAE5B,IAAIoB,GAAYvB,EAAU,GAAGwB,cAAc,MAC3C7B,SAAQW,QAAQiB,GAAWE,KAAK,aAAc,2DAE9C,IAAIC,GAAkB1B,EAAU,GAAGwB,cAAc,sBACvBV,UAAtBP,EAAMoB,aACNhC,QAAQW,QAAQoB,GAAiBD,KAAK,oBAAqBlB,EAAMoB,aAE9Cb,SAAnBP,EAAMqB,UACNjC,QAAQW,QAAQoB,GAAiBD,KAAK,gBAAiBlB,EAAMqB,UAEjEjC,QAAQW,QAAQiB,GAAWM,OAAOH,GAClCP,EAAYU,OAAO9B,EAASwB,GAAWH,OAI/CX,EAAIqB,MAAMd,GAAGe,MAAM5B,EAAO,SAAS6B,GACblB,SAAdkB,EAAMC,KAAsBnC,EAAOoC,SAASF,EAAMC,OAClDD,EAAMC,IAAMnC,EAAOkC,EAAMC,MAGXnB,SAAdkB,EAAMG,KAAsBrC,EAAOoC,SAASF,EAAMG,OAClDH,EAAMG,IAAMrC,EAAOkC,EAAMG,gBCjDhD,WACG,YACAxC,SAAQC,OAAO,kBAAkBC,UAAU,qBAAsB,iBAAkB,SAASuC,GACxF,OACInC,SAAU,IACVoC,SAAU,aACVV,YAAa,SAASW,EAAUC,GAC5B,GAAIZ,EASJ,OAPIA,GADuBb,SAAvByB,EAAOZ,YACO,0CAEAY,EAAOZ,YAEDb,SAApByB,EAAOX,UACPQ,EAAeI,IAAIb,EAAaY,EAAOX,UAEpCD,GAEXc,SAAS,EACTtC,OAAO,EACPuC,YAAa,SAAU,WAAY,SAASC,EAAQC,GAChDD,EAAOE,WAAa,WAChB,GAAIC,KAMJ,OAJ2C,gBAAhCH,GAAOI,KAAKf,MAAc,WACjCc,EAAUH,EAAOI,KAAKf,MAAMnB,SAASiC,SAGlCA,GAGXH,EAAOK,OAAS,WACZ,GAEInC,GAFAoC,IAqBJ,OAlBmCnC,UAA/B6B,EAAOI,KAAKf,MAAMnB,WAEdA,EADuC,gBAAhC8B,GAAOI,KAAKf,MAAc,SACtBW,EAAOI,KAAKf,MAAMnB,UAEjBqC,QAASP,EAAOI,KAAKf,MAAMnB,WAI3CA,IACIA,EAASsC,MACTF,EAAI,oBAAsBpC,EAASsC,MAEnCF,EAAI,oBAAsB,UAG9BA,EAAIG,MAAQvC,EAASqC,QAAU,KAG5BD,GAGXN,EAAOI,KAAKM,YAAY3C,MAAMD,IAAIM,WAAWuC,MAA7CX,OAAuD,oBAAqBA,EAAQC,GACpFD,EAAOY,IAAI,WAAY,WACnBZ,EAAOI,KAAKM,YAAY3C,MAAMD,IAAIM,WAAWuC,MAAME,QAAQ,oBAAqBb,EAAQC,cC1D5GjD,QAAQC,OAAO,+BAAgC6D,KAAK,iBAAkB,SAASrB,GAC3EA,EAAeI,IAAI,0CACf","file":"angular-gantt-progress-plugin.min.js"} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-resizeSensor-plugin.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-resizeSensor-plugin.js index e23bbdf0e6c843a8fadb094f1c8b52fb01b684af..b6231f4cc66c32409a369f86aaea95a3b5a550f7 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-resizeSensor-plugin.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-resizeSensor-plugin.js @@ -1,5 +1,5 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com @@ -39,6 +39,8 @@ Github: https://github.com/angular-gantt/angular-gantt.git } var rendered = false; + var sensor; + api.core.on.rendered(scope, function() { rendered = true; if (sensor !== undefined) { @@ -50,7 +52,6 @@ Github: https://github.com/angular-gantt/angular-gantt.git } }); - var sensor; scope.$watch('enabled', function(newValue) { if (rendered) { if (newValue && sensor === undefined) { diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-resizeSensor-plugin.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-resizeSensor-plugin.js.map index 8a4e134b3541e362d1ea7bd6d3f8a36523e201b7..0dc7bbccfe8b51bda80c2b7636740731a794b78c 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-resizeSensor-plugin.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-resizeSensor-plugin.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/plugins/resizeSensor.js","../.tmp/generated/plugins/resizeSensor/html2js.js"],"names":[],"mappings":"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","file":"angular-gantt-resizeSensor-plugin.js","sourcesContent":["(function(){\n /* global ResizeSensor: false */\n /* global ElementQueries: false */\n 'use strict';\n angular.module('gantt.resizeSensor', ['gantt']).directive('ganttResizeSensor', [function() {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.progress) === 'object') {\n for (var option in scope.options.progress) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n function buildSensor() {\n var ganttElement = element.parent().parent().parent()[0].querySelectorAll('div.gantt')[0];\n return new ResizeSensor(ganttElement, function() {\n ganttCtrl.gantt.$scope.ganttElementWidth = ganttElement.clientWidth;\n ganttCtrl.gantt.$scope.$apply();\n });\n }\n\n var rendered = false;\n api.core.on.rendered(scope, function() {\n rendered = true;\n if (sensor !== undefined) {\n sensor.detach();\n }\n if (scope.enabled) {\n ElementQueries.update();\n sensor = buildSensor();\n }\n });\n\n var sensor;\n scope.$watch('enabled', function(newValue) {\n if (rendered) {\n if (newValue && sensor === undefined) {\n ElementQueries.update();\n sensor = buildSensor();\n } else if (!newValue && sensor !== undefined) {\n sensor.detach();\n sensor = undefined;\n }\n }\n });\n }\n };\n }]);\n}());\n\n","angular.module('gantt.resizeSensor.templates', []).run(['$templateCache', function($templateCache) {\n\n}]);\n"]} \ No newline at end of file +{"version":3,"sources":["../src/plugins/resizeSensor.js","../.tmp/generated/plugins/resizeSensor/html2js.js"],"names":[],"mappings":"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","file":"angular-gantt-resizeSensor-plugin.js","sourcesContent":["(function(){\n /* global ResizeSensor: false */\n /* global ElementQueries: false */\n 'use strict';\n angular.module('gantt.resizeSensor', ['gantt']).directive('ganttResizeSensor', [function() {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.progress) === 'object') {\n for (var option in scope.options.progress) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n function buildSensor() {\n var ganttElement = element.parent().parent().parent()[0].querySelectorAll('div.gantt')[0];\n return new ResizeSensor(ganttElement, function() {\n ganttCtrl.gantt.$scope.ganttElementWidth = ganttElement.clientWidth;\n ganttCtrl.gantt.$scope.$apply();\n });\n }\n\n var rendered = false;\n var sensor;\n\n api.core.on.rendered(scope, function() {\n rendered = true;\n if (sensor !== undefined) {\n sensor.detach();\n }\n if (scope.enabled) {\n ElementQueries.update();\n sensor = buildSensor();\n }\n });\n\n scope.$watch('enabled', function(newValue) {\n if (rendered) {\n if (newValue && sensor === undefined) {\n ElementQueries.update();\n sensor = buildSensor();\n } else if (!newValue && sensor !== undefined) {\n sensor.detach();\n sensor = undefined;\n }\n }\n });\n }\n };\n }]);\n}());\n\n","angular.module('gantt.resizeSensor.templates', []).run(['$templateCache', function($templateCache) {\n\n}]);\n"]} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-resizeSensor-plugin.min.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-resizeSensor-plugin.min.js index d5bd7e5abc4a7bd6bc9c13887ba58e6b76ab6954..869f38c99165b97be40cce2543ef169379dd41b4 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-resizeSensor-plugin.min.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-resizeSensor-plugin.min.js @@ -1,10 +1,10 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com Github: https://github.com/angular-gantt/angular-gantt.git */ -!function(){"use strict";angular.module("gantt.resizeSensor",["gantt"]).directive("ganttResizeSensor",[function(){return{restrict:"E",require:"^gantt",scope:{enabled:"=?"},link:function(a,b,c,d){function e(){var a=b.parent().parent().parent()[0].querySelectorAll("div.gantt")[0];return new ResizeSensor(a,function(){d.gantt.$scope.ganttElementWidth=a.clientWidth,d.gantt.$scope.$apply()})}var f=d.gantt.api;if(a.options&&"object"==typeof a.options.progress)for(var g in a.options.progress)a[g]=a.options[g];void 0===a.enabled&&(a.enabled=!0);var h=!1;f.core.on.rendered(a,function(){h=!0,void 0!==i&&i.detach(),a.enabled&&(ElementQueries.update(),i=e())});var i;a.$watch("enabled",function(a){h&&(a&&void 0===i?(ElementQueries.update(),i=e()):a||void 0===i||(i.detach(),i=void 0))})}}}])}(),angular.module("gantt.resizeSensor.templates",[]).run(["$templateCache",function(a){}]); +!function(){"use strict";angular.module("gantt.resizeSensor",["gantt"]).directive("ganttResizeSensor",[function(){return{restrict:"E",require:"^gantt",scope:{enabled:"=?"},link:function(a,b,c,d){function e(){var a=b.parent().parent().parent()[0].querySelectorAll("div.gantt")[0];return new ResizeSensor(a,function(){d.gantt.$scope.ganttElementWidth=a.clientWidth,d.gantt.$scope.$apply()})}var f=d.gantt.api;if(a.options&&"object"==typeof a.options.progress)for(var g in a.options.progress)a[g]=a.options[g];void 0===a.enabled&&(a.enabled=!0);var h,i=!1;f.core.on.rendered(a,function(){i=!0,void 0!==h&&h.detach(),a.enabled&&(ElementQueries.update(),h=e())}),a.$watch("enabled",function(a){i&&(a&&void 0===h?(ElementQueries.update(),h=e()):a||void 0===h||(h.detach(),h=void 0))})}}}])}(),angular.module("gantt.resizeSensor.templates",[]).run(["$templateCache",function(a){}]); //# sourceMappingURL=angular-gantt-resizeSensor-plugin.min.js.map \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-resizeSensor-plugin.min.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-resizeSensor-plugin.min.js.map index b49d1df8f99643294291241aa1fe7f4cc2e236f2..93e06b9cdcd0a57ed6224b790b24a501fb41ab17 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-resizeSensor-plugin.min.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-resizeSensor-plugin.min.js.map @@ -1 +1 @@ -{"version":3,"file":"angular-gantt-resizeSensor-plugin.min.js","sources":["../src/plugins/resizeSensor.js","../.tmp/generated/plugins/resizeSensor/html2js.js"],"names":["angular","module","directive","restrict","require","scope","enabled","link","element","attrs","ganttCtrl","buildSensor","ganttElement","parent","querySelectorAll","ResizeSensor","gantt","$scope","ganttElementWidth","clientWidth","$apply","api","options","option","progress","undefined","rendered","core","on","sensor","detach","ElementQueries","update","$watch","newValue","run","$templateCache"],"mappings":";;;;;;;;CAAC,WAGG,YACAA,SAAQC,OAAO,sBAAuB,UAAUC,UAAU,qBAAsB,WAC5E,OACIC,SAAU,IACVC,QAAS,SACTC,OACIC,QAAS,MAEbC,KAAM,SAASF,EAAOG,EAASC,EAAOC,GAclC,QAASC,KACL,GAAIC,GAAeJ,EAAQK,SAASA,SAASA,SAAS,GAAGC,iBAAiB,aAAa,EACvF,OAAO,IAAIC,cAAaH,EAAc,WAClCF,EAAUM,MAAMC,OAAOC,kBAAoBN,EAAaO,YACxDT,EAAUM,MAAMC,OAAOG,WAjB/B,GAAIC,GAAMX,EAAUM,MAAMK,GAG1B,IAAIhB,EAAMiB,SAA8C,gBAA5BjB,GAAMiB,QAAgB,SAC9C,IAAK,GAAIC,KAAUlB,GAAMiB,QAAQE,SAC7BnB,EAAMkB,GAAUlB,EAAMiB,QAAQC,EAIhBE,UAAlBpB,EAAMC,UACND,EAAMC,SAAU,EAWpB,IAAIoB,IAAW,CACfL,GAAIM,KAAKC,GAAGF,SAASrB,EAAO,WACxBqB,GAAW,EACID,SAAXI,GACAA,EAAOC,SAEPzB,EAAMC,UACNyB,eAAeC,SACfH,EAASlB,MAIjB,IAAIkB,EACJxB,GAAM4B,OAAO,UAAW,SAASC,GACzBR,IACIQ,GAAuBT,SAAXI,GACZE,eAAeC,SACfH,EAASlB,KACDuB,GAAuBT,SAAXI,IACpBA,EAAOC,SACPD,EAASJ,mBCrDrCzB,QAAQC,OAAO,mCAAoCkC,KAAK,iBAAkB,SAASC"} \ No newline at end of file +{"version":3,"sources":["../src/plugins/resizeSensor.js","../.tmp/generated/plugins/resizeSensor/html2js.js"],"names":["angular","module","directive","restrict","require","scope","enabled","link","element","attrs","ganttCtrl","buildSensor","ganttElement","parent","querySelectorAll","ResizeSensor","gantt","$scope","ganttElementWidth","clientWidth","$apply","api","options","option","progress","undefined","sensor","rendered","core","on","detach","ElementQueries","update","$watch","newValue","run","$templateCache"],"mappings":";;;;;;;;CAAC,WAGG,YACAA,SAAQC,OAAO,sBAAuB,UAAUC,UAAU,qBAAsB,WAC5E,OACIC,SAAU,IACVC,QAAS,SACTC,OACIC,QAAS,MAEbC,KAAM,SAASF,EAAOG,EAASC,EAAOC,GAclC,QAASC,KACL,GAAIC,GAAeJ,EAAQK,SAASA,SAASA,SAAS,GAAGC,iBAAiB,aAAa,EACvF,OAAO,IAAIC,cAAaH,EAAc,WAClCF,EAAUM,MAAMC,OAAOC,kBAAoBN,EAAaO,YACxDT,EAAUM,MAAMC,OAAOG,WAjB/B,GAAIC,GAAMX,EAAUM,MAAMK,GAG1B,IAAIhB,EAAMiB,SAA8C,gBAA5BjB,GAAMiB,QAAgB,SAC9C,IAAK,GAAIC,KAAUlB,GAAMiB,QAAQE,SAC7BnB,EAAMkB,GAAUlB,EAAMiB,QAAQC,EAIhBE,UAAlBpB,EAAMC,UACND,EAAMC,SAAU,EAWpB,IACIoB,GADAC,GAAW,CAGfN,GAAIO,KAAKC,GAAGF,SAAStB,EAAO,WACxBsB,GAAW,EACIF,SAAXC,GACAA,EAAOI,SAEPzB,EAAMC,UACNyB,eAAeC,SACfN,EAASf,OAIjBN,EAAM4B,OAAO,UAAW,SAASC,GACzBP,IACIO,GAAuBT,SAAXC,GACZK,eAAeC,SACfN,EAASf,KACDuB,GAAuBT,SAAXC,IACpBA,EAAOI,SACPJ,EAASD,mBCtDrCzB,QAAQC,OAAO,mCAAoCkC,KAAK,iBAAkB,SAASC","file":"angular-gantt-resizeSensor-plugin.min.js"} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-sortable-plugin.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-sortable-plugin.js index 6e52f11ea83947b0e5db1a169ba8cb39bc06e02f..7d864f8d56a8241b3767f8dcca58a032e74ecc13 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-sortable-plugin.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-sortable-plugin.js @@ -1,5 +1,5 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-sortable-plugin.min.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-sortable-plugin.min.js index 61851fafdcfb804fb5c00dca7ceceb16a2f7e6e0..a70793b2cb35c471e2b4d0925a79df258d9a028c 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-sortable-plugin.min.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-sortable-plugin.min.js @@ -1,5 +1,5 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-sortable-plugin.min.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-sortable-plugin.min.js.map index d2a3a98db21b76cd15c9c8a81cc019ff52ea6160..7a53b4db05416236a549dc170031abb1c0cf0540 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-sortable-plugin.min.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-sortable-plugin.min.js.map @@ -1 +1 @@ -{"version":3,"file":"angular-gantt-sortable-plugin.min.js","sources":["../src/plugins/sortable.js","../.tmp/generated/plugins/sortable/html2js.js"],"names":["failedDependency","moduleName","directiveName","pluginDependencies","module","url","failedDependencies","loadedDependencies","i","l","length","currentDependency","angular","isString","push","e","exception","directive","$log","restrict","require","scope","enabled","link","warn","errorMessage","message","utils","$compile","element","attrs","ganttCtrl","api","gantt","options","option","sortable","undefined","directives","on","rowScope","rowElement","attr","checkDraggable","rowSortable","row","model","firstProperty","onDropSuccess","$evalAsync","onDrop","evt","data","rowsManager","rowsMap","id","moveRow","run","$templateCache"],"mappings":";;;;;;;;CAAC,WACG,YAaA,KAAK,GAFDA,GATAC,EAAa,iBACbC,EAAgB,gBAChBC,GACA,SACCC,OAAO,gBAAiBC,IAAI,6DAG7BC,KACAC,KAGKC,EAAI,EAAGC,EAAIN,EAAmBO,OAAYD,EAAJD,EAAOA,IAAK,CACvD,GAAIG,GAAoBR,EAAmBK,EAC3C,KACQI,QAAQC,SAASF,KACjBA,GAAqBP,OAAQO,GAC7BR,EAAmBK,GAAKG,GAE5BC,QAAQR,OAAOO,EAAkBP,QACjCG,EAAmBO,KAAKH,EAAkBP,QAC5C,MAAOW,GACLJ,EAAkBK,UAAYD,EAC9BT,EAAmBQ,KAAKH,IAI5BL,EAAmBI,OAAS,EAC5BE,QAAQR,OAAOH,MAAgBgB,UAAUf,GAAgB,OAAQ,SAASgB,GACtE,OACIC,SAAU,IACVC,QAAS,SACTC,OACIC,QAAS,MAEbC,KAAM,WACFL,EAAKM,KAAKvB,EAAa,2CACvB,KAAK,GAAIO,GAAG,EAAEC,EAAGH,EAAmBI,OAAUD,EAAFD,EAAKA,IAAK,CAClDR,EAAmBM,EAAmBE,EAEtC,IAAIiB,GAAezB,EAAiBI,MAChCJ,GAAiBK,MACjBoB,GAAgB,KAAOzB,EAAiBK,IAAM,KAE9CL,EAAiBgB,WAAahB,EAAiBgB,UAAUU,UACzDD,GAAgB,KAAOzB,EAAiBgB,UAAUU,SAGtDR,EAAKM,KAAKC,GAEdP,EAAKM,KAAKtB,EAAgB,6CAKtCU,QAAQR,OAAOH,EAAYM,GAAoBU,UAAUf,GAAgB,aAAc,WAAY,SAASyB,EAAOC,GAI/G,OACIT,SAAU,IACVC,QAAS,SACTC,OACIC,QAAS,MAEbC,KAAM,SAASF,EAAOQ,EAASC,EAAOC,GAClC,GAAIC,GAAMD,EAAUE,MAAMD,GAG1B,IAAIX,EAAMa,SAA8C,gBAA5Bb,GAAMa,QAAgB,SAC9C,IAAK,GAAIC,KAAUd,GAAMa,QAAQE,SAC7Bf,EAAMc,GAAUd,EAAMa,QAAQC,EAIhBE,UAAlBhB,EAAMC,UACND,EAAMC,SAAU,GAGpBU,EAAIM,WAAWC,GAAfP,OAAsBX,EAAO,SAASnB,EAAesC,EAAUC,GACrC,kBAAlBvC,GAAiEmC,SAA5BI,EAAWC,KAAK,UACrDF,EAASG,eAAiB,WACtB,GAAIC,GAAcJ,EAASK,IAAIC,MAAMV,QAMrC,OAJ4B,iBAAlB,KACNQ,GAAetB,QAASsB,IAGrBjB,EAAMoB,eAAeH,GAAc,UAAWvB,EAAMC,UAG/DkB,EAASQ,cAAgB,WACrBR,EAASS,cAGbT,EAASU,OAAS,SAASC,EAAKC,GAC5B,GAAIP,GAAML,EAASK,IAAIQ,YAAYC,QAAQF,EAAKG,GAC5CV,KAAQL,IACRA,EAASK,IAAIQ,YAAYG,QAAQX,EAAKL,EAASK,KAC/CL,EAASS,eAIjBR,EAAWC,KAAK,eAAgB,wBAChCD,EAAWC,KAAK,eAAgB,cAChCD,EAAWC,KAAK,aAAc,yBAC9BD,EAAWC,KAAK,kBAAmB,mBAEnCD,EAAWC,KAAK,eAAgB,cAChCD,EAAWC,KAAK,OAAQ,aAExBd,EAASa,GAAYD,cCjHjD5B,QAAQR,OAAO,+BAAgCqD,KAAK,iBAAkB,SAASC"} \ No newline at end of file +{"version":3,"sources":["../src/plugins/sortable.js","../.tmp/generated/plugins/sortable/html2js.js"],"names":["failedDependency","moduleName","directiveName","pluginDependencies","module","url","failedDependencies","loadedDependencies","i","l","length","currentDependency","angular","isString","push","e","exception","directive","$log","restrict","require","scope","enabled","link","warn","errorMessage","message","utils","$compile","element","attrs","ganttCtrl","api","gantt","options","option","sortable","undefined","directives","on","rowScope","rowElement","attr","checkDraggable","rowSortable","row","model","firstProperty","onDropSuccess","$evalAsync","onDrop","evt","data","rowsManager","rowsMap","id","moveRow","run","$templateCache"],"mappings":";;;;;;;;CAAC,WACG,YAaA,KAAK,GAFDA,GATAC,EAAa,iBACbC,EAAgB,gBAChBC,GACA,SACCC,OAAO,gBAAiBC,IAAI,6DAG7BC,KACAC,KAGKC,EAAI,EAAGC,EAAIN,EAAmBO,OAAYD,EAAJD,EAAOA,IAAK,CACvD,GAAIG,GAAoBR,EAAmBK,EAC3C,KACQI,QAAQC,SAASF,KACjBA,GAAqBP,OAAQO,GAC7BR,EAAmBK,GAAKG,GAE5BC,QAAQR,OAAOO,EAAkBP,QACjCG,EAAmBO,KAAKH,EAAkBP,QAC5C,MAAOW,GACLJ,EAAkBK,UAAYD,EAC9BT,EAAmBQ,KAAKH,IAI5BL,EAAmBI,OAAS,EAC5BE,QAAQR,OAAOH,MAAgBgB,UAAUf,GAAgB,OAAQ,SAASgB,GACtE,OACIC,SAAU,IACVC,QAAS,SACTC,OACIC,QAAS,MAEbC,KAAM,WACFL,EAAKM,KAAKvB,EAAa,2CACvB,KAAK,GAAIO,GAAG,EAAEC,EAAGH,EAAmBI,OAAUD,EAAFD,EAAKA,IAAK,CAClDR,EAAmBM,EAAmBE,EAEtC,IAAIiB,GAAezB,EAAiBI,MAChCJ,GAAiBK,MACjBoB,GAAgB,KAAOzB,EAAiBK,IAAM,KAE9CL,EAAiBgB,WAAahB,EAAiBgB,UAAUU,UACzDD,GAAgB,KAAOzB,EAAiBgB,UAAUU,SAGtDR,EAAKM,KAAKC,GAEdP,EAAKM,KAAKtB,EAAgB,6CAKtCU,QAAQR,OAAOH,EAAYM,GAAoBU,UAAUf,GAAgB,aAAc,WAAY,SAASyB,EAAOC,GAI/G,OACIT,SAAU,IACVC,QAAS,SACTC,OACIC,QAAS,MAEbC,KAAM,SAASF,EAAOQ,EAASC,EAAOC,GAClC,GAAIC,GAAMD,EAAUE,MAAMD,GAG1B,IAAIX,EAAMa,SAA8C,gBAA5Bb,GAAMa,QAAgB,SAC9C,IAAK,GAAIC,KAAUd,GAAMa,QAAQE,SAC7Bf,EAAMc,GAAUd,EAAMa,QAAQC,EAIhBE,UAAlBhB,EAAMC,UACND,EAAMC,SAAU,GAGpBU,EAAIM,WAAWC,GAAfP,OAAsBX,EAAO,SAASnB,EAAesC,EAAUC,GACrC,kBAAlBvC,GAAiEmC,SAA5BI,EAAWC,KAAK,UACrDF,EAASG,eAAiB,WACtB,GAAIC,GAAcJ,EAASK,IAAIC,MAAMV,QAMrC,OAJ4B,iBAAlB,KACNQ,GAAetB,QAASsB,IAGrBjB,EAAMoB,eAAeH,GAAc,UAAWvB,EAAMC,UAG/DkB,EAASQ,cAAgB,WACrBR,EAASS,cAGbT,EAASU,OAAS,SAASC,EAAKC,GAC5B,GAAIP,GAAML,EAASK,IAAIQ,YAAYC,QAAQF,EAAKG,GAC5CV,KAAQL,IACRA,EAASK,IAAIQ,YAAYG,QAAQX,EAAKL,EAASK,KAC/CL,EAASS,eAIjBR,EAAWC,KAAK,eAAgB,wBAChCD,EAAWC,KAAK,eAAgB,cAChCD,EAAWC,KAAK,aAAc,yBAC9BD,EAAWC,KAAK,kBAAmB,mBAEnCD,EAAWC,KAAK,eAAgB,cAChCD,EAAWC,KAAK,OAAQ,aAExBd,EAASa,GAAYD,cCjHjD5B,QAAQR,OAAO,+BAAgCqD,KAAK,iBAAkB,SAASC","file":"angular-gantt-sortable-plugin.min.js"} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-table-plugin.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-table-plugin.js index 5eb61e4de3b564995d1c87295b9738fae263e038..59e4729ff15483934e9e19f217b4695797c26ebe 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-table-plugin.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-table-plugin.js @@ -1,5 +1,5 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-table-plugin.min.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-table-plugin.min.js index 0e24a59e9d22bb33a69e97938eb82c5e791dc1ef..d47ef07e86a98b431777868ec9e2a1c00f05111b 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-table-plugin.min.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-table-plugin.min.js @@ -1,5 +1,5 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-table-plugin.min.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-table-plugin.min.js.map index c2786946f7ee6160615256ed37e397be3f6434e9..d79ca931f39b4e0ac84445a24d4edef22ea56346 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-table-plugin.min.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-table-plugin.min.js.map @@ -1 +1 @@ -{"version":3,"file":"angular-gantt-table-plugin.min.js","sources":["../src/plugins/table.js","../src/plugins/table/sideContentTable.directive.js","../src/plugins/table/tableColumn.controller.js","../src/plugins/table/tableColumnRow.controller.js","../.tmp/generated/plugins/table/html2js.js"],"names":["angular","module","directive","utils","$compile","$document","restrict","require","scope","enabled","columns","headers","classes","contents","headerContents","formatters","headerFormatter","link","element","attrs","ganttCtrl","api","gantt","options","option","sortable","undefined","model.name","directives","on","directiveName","sideContentScope","sideContentElement","tableScope","$new","pluginScope","ifElement","createElement","attr","addClass","tableElement","append","Builder","layout","builder","controller","$scope","hScrollBarHeight","getScrollBarHeight","getMaxHeightCss","css","maxHeight","bodyScrollBarHeight","scroll","isHScrollbarVisible","header","getHeight","build","getHeader","column","getHeaderContent","headerContent","getClass","getValue","value","$eval","row","formatter","getRowContent","content","model","columnContents","rowsManager","run","$templateCache","put"],"mappings":"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"} \ No newline at end of file +{"version":3,"sources":["../src/plugins/table.js","../src/plugins/table/sideContentTable.directive.js","../src/plugins/table/tableColumn.controller.js","../src/plugins/table/tableColumnRow.controller.js","../.tmp/generated/plugins/table/html2js.js"],"names":["angular","module","directive","utils","$compile","$document","restrict","require","scope","enabled","columns","headers","classes","contents","headerContents","formatters","headerFormatter","link","element","attrs","ganttCtrl","api","gantt","options","option","sortable","undefined","model.name","directives","on","directiveName","sideContentScope","sideContentElement","tableScope","$new","pluginScope","ifElement","createElement","attr","addClass","tableElement","append","Builder","layout","builder","controller","$scope","hScrollBarHeight","getScrollBarHeight","getMaxHeightCss","css","maxHeight","bodyScrollBarHeight","scroll","isHScrollbarVisible","header","getHeight","build","getHeader","column","getHeaderContent","headerContent","getClass","getValue","value","$eval","row","formatter","getRowContent","content","model","columnContents","rowsManager","run","$templateCache","put"],"mappings":"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","file":"angular-gantt-table-plugin.min.js"} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tooltips-plugin.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tooltips-plugin.js index 9ae4c70ff2880f55dadf581e6306c5af76643445..8a49857b645cbc3366e3284d00baebbdad957808 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tooltips-plugin.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tooltips-plugin.js @@ -1,5 +1,5 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com @@ -14,7 +14,8 @@ Github: https://github.com/angular-gantt/angular-gantt.git scope: { enabled: '=?', dateFormat: '=?', - content: '=?' + content: '=?', + delay: '=?' }, link: function(scope, element, attrs, ganttCtrl) { var api = ganttCtrl.gantt.api; @@ -32,6 +33,9 @@ Github: https://github.com/angular-gantt/angular-gantt.git if (scope.dateFormat === undefined) { scope.dateFormat = 'MMM DD, HH:mm'; } + if (scope.delay === undefined) { + scope.delay = 500; + } if (scope.content === undefined) { scope.content = '{{task.model.name}}</br>'+ '<small>'+ @@ -94,24 +98,58 @@ Github: https://github.com/angular-gantt/angular-gantt.git var showTooltipPromise; var visible = false; var mouseEnterX; + var mouseMoveHandler; - $scope.getFromLabel = function() { - var taskTooltips = $scope.task.model.tooltips; - var rowTooltips = $scope.task.row.model.tooltips; + var getViewPortWidth = function() { + var d = $document[0]; + return d.documentElement.clientWidth || d.documentElement.getElementById('body')[0].clientWidth; + }; - if (typeof(taskTooltips) === 'boolean') { - taskTooltips = {enabled: taskTooltips}; + var updateTooltip = function(x) { + // Check if info is overlapping with view port + if (x + $element[0].offsetWidth > getViewPortWidth()) { + $element.css('left', (x + 20 - $element[0].offsetWidth) + 'px'); + $scope.isRightAligned = true; + } else { + $element.css('left', (x - 20) + 'px'); + $scope.isRightAligned = false; } + }; - if (typeof(rowTooltips) === 'boolean') { - rowTooltips = {enabled: rowTooltips}; - } + var showTooltip = function(x) { + visible = true; + mouseMoveHandler.bind(); - var dateFormat = utils.firstProperty([taskTooltips, rowTooltips], 'dateFormat', $scope.pluginScope.dateFormat); - return $scope.task.model.from.format(dateFormat); + $scope.displayed = true; + + $scope.$evalAsync(function() { + var restoreNgHide; + if ($element.hasClass('ng-hide')) { + $element.removeClass('ng-hide'); + restoreNgHide = true; + } + $scope.elementHeight = $element[0].offsetHeight; + if (restoreNgHide) { + $element.addClass('ng-hide'); + } + $scope.taskRect = parentElement[0].getBoundingClientRect(); + updateTooltip(x); + }); }; - $scope.getToLabel = function() { + var hideTooltip = function() { + visible = false; + mouseMoveHandler.unbind(); + $scope.$evalAsync(function() { + $scope.displayed = false; + }); + }; + + var displayTooltip = function(newValue, showDelayed) { + if (showTooltipPromise) { + $timeout.cancel(showTooltipPromise); + } + var taskTooltips = $scope.task.model.tooltips; var rowTooltips = $scope.task.row.model.tooltips; @@ -123,11 +161,23 @@ Github: https://github.com/angular-gantt/angular-gantt.git rowTooltips = {enabled: rowTooltips}; } - var dateFormat = utils.firstProperty([taskTooltips, rowTooltips], 'dateFormat', $scope.pluginScope.dateFormat); - return $scope.task.model.to.format(dateFormat); + var enabled = utils.firstProperty([taskTooltips, rowTooltips], 'enabled', $scope.pluginScope.enabled); + if (enabled && !visible && mouseEnterX !== undefined && newValue) { + if (showDelayed) { + showTooltipPromise = $timeout(function() { + showTooltip(mouseEnterX); + }, $scope.pluginScope.delay, false); + } else { + showTooltip(mouseEnterX); + } + } else if (!newValue) { + if (!$scope.task.active) { + hideTooltip(); + } + } }; - var mouseMoveHandler = smartEvent($scope, bodyElement, 'mousemove', debounce(function(e) { + mouseMoveHandler = smartEvent($scope, bodyElement, 'mousemove', debounce(function(e) { if (!visible) { mouseEnterX = e.clientX; displayTooltip(true, false); @@ -147,6 +197,37 @@ Github: https://github.com/angular-gantt/angular-gantt.git } }, 5, false)); + $scope.getFromLabel = function() { + var taskTooltips = $scope.task.model.tooltips; + var rowTooltips = $scope.task.row.model.tooltips; + + if (typeof(taskTooltips) === 'boolean') { + taskTooltips = {enabled: taskTooltips}; + } + + if (typeof(rowTooltips) === 'boolean') { + rowTooltips = {enabled: rowTooltips}; + } + + var dateFormat = utils.firstProperty([taskTooltips, rowTooltips], 'dateFormat', $scope.pluginScope.dateFormat); + return $scope.task.model.from.format(dateFormat); + }; + + $scope.getToLabel = function() { + var taskTooltips = $scope.task.model.tooltips; + var rowTooltips = $scope.task.row.model.tooltips; + + if (typeof(taskTooltips) === 'boolean') { + taskTooltips = {enabled: taskTooltips}; + } + + if (typeof(rowTooltips) === 'boolean') { + rowTooltips = {enabled: rowTooltips}; + } + + var dateFormat = utils.firstProperty([taskTooltips, rowTooltips], 'dateFormat', $scope.pluginScope.dateFormat); + return $scope.task.model.to.format(dateFormat); + }; $scope.task.getContentElement().bind('mousemove', function(evt) { mouseEnterX = evt.clientX; @@ -187,83 +268,6 @@ Github: https://github.com/angular-gantt/angular-gantt.git }); } - var displayTooltip = function(newValue, showDelayed) { - if (showTooltipPromise) { - $timeout.cancel(showTooltipPromise); - } - - var taskTooltips = $scope.task.model.tooltips; - var rowTooltips = $scope.task.row.model.tooltips; - - if (typeof(taskTooltips) === 'boolean') { - taskTooltips = {enabled: taskTooltips}; - } - - if (typeof(rowTooltips) === 'boolean') { - rowTooltips = {enabled: rowTooltips}; - } - - var enabled = utils.firstProperty([taskTooltips, rowTooltips], 'enabled', $scope.pluginScope.enabled); - if (enabled && !visible && mouseEnterX !== undefined && newValue) { - if (showDelayed) { - showTooltipPromise = $timeout(function() { - showTooltip(mouseEnterX); - }, 500, false); - } else { - showTooltip(mouseEnterX); - } - } else if (!newValue) { - if (!$scope.task.active) { - hideTooltip(); - } - } - }; - - var showTooltip = function(x) { - visible = true; - mouseMoveHandler.bind(); - - $scope.displayed = true; - - $scope.$evalAsync(function() { - var restoreNgHide; - if ($element.hasClass('ng-hide')) { - $element.removeClass('ng-hide'); - restoreNgHide = true; - } - $scope.elementHeight = $element[0].offsetHeight; - if (restoreNgHide) { - $element.addClass('ng-hide'); - } - $scope.taskRect = parentElement[0].getBoundingClientRect(); - updateTooltip(x); - }); - }; - - var getViewPortWidth = function() { - var d = $document[0]; - return d.documentElement.clientWidth || d.documentElement.getElementById('body')[0].clientWidth; - }; - - var updateTooltip = function(x) { - // Check if info is overlapping with view port - if (x + $element[0].offsetWidth > getViewPortWidth()) { - $element.css('left', (x + 20 - $element[0].offsetWidth) + 'px'); - $scope.isRightAligned = true; - } else { - $element.css('left', (x - 20) + 'px'); - $scope.isRightAligned = false; - } - }; - - var hideTooltip = function() { - visible = false; - mouseMoveHandler.unbind(); - $scope.$evalAsync(function() { - $scope.displayed = false; - }); - }; - if ($scope.task.isMoving) { // Display tooltip because task has been moved to a new row displayTooltip(true, false); diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tooltips-plugin.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tooltips-plugin.js.map index 6e1cb376b7450e2656793bfa382f5d563cda1afc..527b0c78bff9916de368d22fe96166c5432eba00 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tooltips-plugin.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tooltips-plugin.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/plugins/tooltips.js","../src/plugins/tooltips/tooltip.directive.js","../.tmp/generated/plugins/tooltips/html2js.js"],"names":[],"mappings":"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","file":"angular-gantt-tooltips-plugin.js","sourcesContent":["(function(){\n 'use strict';\n angular.module('gantt.tooltips', ['gantt', 'gantt.tooltips.templates']).directive('ganttTooltips', ['$compile', '$document', function($compile, $document) {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n dateFormat: '=?',\n content: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.tooltips) === 'object') {\n for (var option in scope.options.tooltips) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n if (scope.dateFormat === undefined) {\n scope.dateFormat = 'MMM DD, HH:mm';\n }\n if (scope.content === undefined) {\n scope.content = '{{task.model.name}}</br>'+\n '<small>'+\n '{{task.isMilestone() === true && getFromLabel() || getFromLabel() + \\' - \\' + getToLabel()}}'+\n '</small>';\n }\n\n scope.api = api;\n\n api.directives.on.new(scope, function(directiveName, taskScope, taskElement) {\n if (directiveName === 'ganttTask') {\n var tooltipScope = taskScope.$new();\n\n tooltipScope.pluginScope = scope;\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'pluginScope.enabled');\n\n var tooltipElement = $document[0].createElement('gantt-tooltip');\n if (attrs.templateUrl !== undefined) {\n angular.element(tooltipElement).attr('data-template-url', attrs.templateUrl);\n }\n if (attrs.template !== undefined) {\n angular.element(tooltipElement).attr('data-template', attrs.template);\n }\n\n angular.element(ifElement).append(tooltipElement);\n taskElement.append($compile(ifElement)(tooltipScope));\n }\n });\n }\n };\n }]);\n}());\n\n","(function() {\n 'use strict';\n angular.module('gantt.tooltips').directive('ganttTooltip', ['$log','$timeout', '$compile', '$document', '$templateCache', 'ganttDebounce', 'ganttSmartEvent', function($log, $timeout, $compile, $document, $templateCache, debounce, smartEvent) {\n // This tooltip displays more information about a task\n\n return {\n restrict: 'E',\n templateUrl: function(tElement, tAttrs) {\n var templateUrl;\n if (tAttrs.templateUrl === undefined) {\n templateUrl = 'plugins/tooltips/tooltip.tmpl.html';\n } else {\n templateUrl = tAttrs.templateUrl;\n }\n if (tAttrs.template !== undefined) {\n $templateCache.put(templateUrl, tAttrs.template);\n }\n return templateUrl;\n },\n scope: true,\n replace: true,\n controller: ['$scope', '$element', 'ganttUtils', function($scope, $element, utils) {\n var bodyElement = angular.element($document[0].body);\n var parentElement = $scope.task.$element;\n var showTooltipPromise;\n var visible = false;\n var mouseEnterX;\n\n $scope.getFromLabel = function() {\n var taskTooltips = $scope.task.model.tooltips;\n var rowTooltips = $scope.task.row.model.tooltips;\n\n if (typeof(taskTooltips) === 'boolean') {\n taskTooltips = {enabled: taskTooltips};\n }\n\n if (typeof(rowTooltips) === 'boolean') {\n rowTooltips = {enabled: rowTooltips};\n }\n\n var dateFormat = utils.firstProperty([taskTooltips, rowTooltips], 'dateFormat', $scope.pluginScope.dateFormat);\n return $scope.task.model.from.format(dateFormat);\n };\n\n $scope.getToLabel = function() {\n var taskTooltips = $scope.task.model.tooltips;\n var rowTooltips = $scope.task.row.model.tooltips;\n\n if (typeof(taskTooltips) === 'boolean') {\n taskTooltips = {enabled: taskTooltips};\n }\n\n if (typeof(rowTooltips) === 'boolean') {\n rowTooltips = {enabled: rowTooltips};\n }\n\n var dateFormat = utils.firstProperty([taskTooltips, rowTooltips], 'dateFormat', $scope.pluginScope.dateFormat);\n return $scope.task.model.to.format(dateFormat);\n };\n\n var mouseMoveHandler = smartEvent($scope, bodyElement, 'mousemove', debounce(function(e) {\n if (!visible) {\n mouseEnterX = e.clientX;\n displayTooltip(true, false);\n } else {\n // check if mouse goes outside the parent\n if(\n !$scope.taskRect ||\n e.clientX < $scope.taskRect.left ||\n e.clientX > $scope.taskRect.right ||\n e.clientY > $scope.taskRect.bottom ||\n e.clientY < $scope.taskRect.top\n ) {\n displayTooltip(false, false);\n }\n\n updateTooltip(e.clientX);\n }\n }, 5, false));\n\n\n $scope.task.getContentElement().bind('mousemove', function(evt) {\n mouseEnterX = evt.clientX;\n });\n\n $scope.task.getContentElement().bind('mouseenter', function(evt) {\n mouseEnterX = evt.clientX;\n displayTooltip(true, true);\n });\n\n $scope.task.getContentElement().bind('mouseleave', function() {\n displayTooltip(false);\n });\n\n if ($scope.pluginScope.api.tasks.on.moveBegin) {\n $scope.pluginScope.api.tasks.on.moveBegin($scope, function(task) {\n if (task === $scope.task) {\n displayTooltip(true);\n }\n });\n\n $scope.pluginScope.api.tasks.on.moveEnd($scope, function(task) {\n if (task === $scope.task) {\n displayTooltip(false);\n }\n });\n\n $scope.pluginScope.api.tasks.on.resizeBegin($scope, function(task) {\n if (task === $scope.task) {\n displayTooltip(true);\n }\n });\n\n $scope.pluginScope.api.tasks.on.resizeEnd($scope, function(task) {\n if (task === $scope.task) {\n displayTooltip(false);\n }\n });\n }\n\n var displayTooltip = function(newValue, showDelayed) {\n if (showTooltipPromise) {\n $timeout.cancel(showTooltipPromise);\n }\n\n var taskTooltips = $scope.task.model.tooltips;\n var rowTooltips = $scope.task.row.model.tooltips;\n\n if (typeof(taskTooltips) === 'boolean') {\n taskTooltips = {enabled: taskTooltips};\n }\n\n if (typeof(rowTooltips) === 'boolean') {\n rowTooltips = {enabled: rowTooltips};\n }\n\n var enabled = utils.firstProperty([taskTooltips, rowTooltips], 'enabled', $scope.pluginScope.enabled);\n if (enabled && !visible && mouseEnterX !== undefined && newValue) {\n if (showDelayed) {\n showTooltipPromise = $timeout(function() {\n showTooltip(mouseEnterX);\n }, 500, false);\n } else {\n showTooltip(mouseEnterX);\n }\n } else if (!newValue) {\n if (!$scope.task.active) {\n hideTooltip();\n }\n }\n };\n\n var showTooltip = function(x) {\n visible = true;\n mouseMoveHandler.bind();\n\n $scope.displayed = true;\n\n $scope.$evalAsync(function() {\n var restoreNgHide;\n if ($element.hasClass('ng-hide')) {\n $element.removeClass('ng-hide');\n restoreNgHide = true;\n }\n $scope.elementHeight = $element[0].offsetHeight;\n if (restoreNgHide) {\n $element.addClass('ng-hide');\n }\n $scope.taskRect = parentElement[0].getBoundingClientRect();\n updateTooltip(x);\n });\n };\n\n var getViewPortWidth = function() {\n var d = $document[0];\n return d.documentElement.clientWidth || d.documentElement.getElementById('body')[0].clientWidth;\n };\n\n var updateTooltip = function(x) {\n // Check if info is overlapping with view port\n if (x + $element[0].offsetWidth > getViewPortWidth()) {\n $element.css('left', (x + 20 - $element[0].offsetWidth) + 'px');\n $scope.isRightAligned = true;\n } else {\n $element.css('left', (x - 20) + 'px');\n $scope.isRightAligned = false;\n }\n };\n\n var hideTooltip = function() {\n visible = false;\n mouseMoveHandler.unbind();\n $scope.$evalAsync(function() {\n $scope.displayed = false;\n });\n };\n\n if ($scope.task.isMoving) {\n // Display tooltip because task has been moved to a new row\n displayTooltip(true, false);\n }\n\n $scope.gantt.api.directives.raise.new('ganttTooltip', $scope, $element);\n $scope.$on('$destroy', function() {\n $scope.gantt.api.directives.raise.destroy('ganttTooltip', $scope, $element);\n });\n }]\n };\n }]);\n}());\n\n","angular.module('gantt.tooltips.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/tooltips/tooltip.tmpl.html',\n '<div ng-cloak\\n' +\n ' class=\"gantt-task-info\"\\n' +\n ' ng-show=\"displayed\"\\n' +\n ' ng-class=\"isRightAligned ? \\'gantt-task-infoArrowR\\' : \\'gantt-task-infoArrow\\'\"\\n' +\n ' ng-style=\"{top: taskRect.top + \\'px\\', marginTop: -elementHeight - 8 + \\'px\\'}\">\\n' +\n ' <div class=\"gantt-task-info-content\">\\n' +\n ' <div gantt-bind-compile-html=\"pluginScope.content\"></div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '');\n}]);\n"]} \ No newline at end of file +{"version":3,"sources":["../src/plugins/tooltips.js","../src/plugins/tooltips/tooltip.directive.js","../.tmp/generated/plugins/tooltips/html2js.js"],"names":[],"mappings":"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","file":"angular-gantt-tooltips-plugin.js","sourcesContent":["(function(){\n 'use strict';\n angular.module('gantt.tooltips', ['gantt', 'gantt.tooltips.templates']).directive('ganttTooltips', ['$compile', '$document', function($compile, $document) {\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n dateFormat: '=?',\n content: '=?',\n delay: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.tooltips) === 'object') {\n for (var option in scope.options.tooltips) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n if (scope.dateFormat === undefined) {\n scope.dateFormat = 'MMM DD, HH:mm';\n }\n if (scope.delay === undefined) {\n scope.delay = 500;\n }\n if (scope.content === undefined) {\n scope.content = '{{task.model.name}}</br>'+\n '<small>'+\n '{{task.isMilestone() === true && getFromLabel() || getFromLabel() + \\' - \\' + getToLabel()}}'+\n '</small>';\n }\n\n scope.api = api;\n\n api.directives.on.new(scope, function(directiveName, taskScope, taskElement) {\n if (directiveName === 'ganttTask') {\n var tooltipScope = taskScope.$new();\n\n tooltipScope.pluginScope = scope;\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'pluginScope.enabled');\n\n var tooltipElement = $document[0].createElement('gantt-tooltip');\n if (attrs.templateUrl !== undefined) {\n angular.element(tooltipElement).attr('data-template-url', attrs.templateUrl);\n }\n if (attrs.template !== undefined) {\n angular.element(tooltipElement).attr('data-template', attrs.template);\n }\n\n angular.element(ifElement).append(tooltipElement);\n taskElement.append($compile(ifElement)(tooltipScope));\n }\n });\n }\n };\n }]);\n}());\n\n","(function() {\n 'use strict';\n angular.module('gantt.tooltips').directive('ganttTooltip', ['$log','$timeout', '$compile', '$document', '$templateCache', 'ganttDebounce', 'ganttSmartEvent', function($log, $timeout, $compile, $document, $templateCache, debounce, smartEvent) {\n // This tooltip displays more information about a task\n\n return {\n restrict: 'E',\n templateUrl: function(tElement, tAttrs) {\n var templateUrl;\n if (tAttrs.templateUrl === undefined) {\n templateUrl = 'plugins/tooltips/tooltip.tmpl.html';\n } else {\n templateUrl = tAttrs.templateUrl;\n }\n if (tAttrs.template !== undefined) {\n $templateCache.put(templateUrl, tAttrs.template);\n }\n return templateUrl;\n },\n scope: true,\n replace: true,\n controller: ['$scope', '$element', 'ganttUtils', function($scope, $element, utils) {\n var bodyElement = angular.element($document[0].body);\n var parentElement = $scope.task.$element;\n var showTooltipPromise;\n var visible = false;\n var mouseEnterX;\n var mouseMoveHandler;\n\n var getViewPortWidth = function() {\n var d = $document[0];\n return d.documentElement.clientWidth || d.documentElement.getElementById('body')[0].clientWidth;\n };\n\n var updateTooltip = function(x) {\n // Check if info is overlapping with view port\n if (x + $element[0].offsetWidth > getViewPortWidth()) {\n $element.css('left', (x + 20 - $element[0].offsetWidth) + 'px');\n $scope.isRightAligned = true;\n } else {\n $element.css('left', (x - 20) + 'px');\n $scope.isRightAligned = false;\n }\n };\n\n var showTooltip = function(x) {\n visible = true;\n mouseMoveHandler.bind();\n\n $scope.displayed = true;\n\n $scope.$evalAsync(function() {\n var restoreNgHide;\n if ($element.hasClass('ng-hide')) {\n $element.removeClass('ng-hide');\n restoreNgHide = true;\n }\n $scope.elementHeight = $element[0].offsetHeight;\n if (restoreNgHide) {\n $element.addClass('ng-hide');\n }\n $scope.taskRect = parentElement[0].getBoundingClientRect();\n updateTooltip(x);\n });\n };\n\n var hideTooltip = function() {\n visible = false;\n mouseMoveHandler.unbind();\n $scope.$evalAsync(function() {\n $scope.displayed = false;\n });\n };\n\n var displayTooltip = function(newValue, showDelayed) {\n if (showTooltipPromise) {\n $timeout.cancel(showTooltipPromise);\n }\n\n var taskTooltips = $scope.task.model.tooltips;\n var rowTooltips = $scope.task.row.model.tooltips;\n\n if (typeof(taskTooltips) === 'boolean') {\n taskTooltips = {enabled: taskTooltips};\n }\n\n if (typeof(rowTooltips) === 'boolean') {\n rowTooltips = {enabled: rowTooltips};\n }\n\n var enabled = utils.firstProperty([taskTooltips, rowTooltips], 'enabled', $scope.pluginScope.enabled);\n if (enabled && !visible && mouseEnterX !== undefined && newValue) {\n if (showDelayed) {\n showTooltipPromise = $timeout(function() {\n showTooltip(mouseEnterX);\n }, $scope.pluginScope.delay, false);\n } else {\n showTooltip(mouseEnterX);\n }\n } else if (!newValue) {\n if (!$scope.task.active) {\n hideTooltip();\n }\n }\n };\n\n mouseMoveHandler = smartEvent($scope, bodyElement, 'mousemove', debounce(function(e) {\n if (!visible) {\n mouseEnterX = e.clientX;\n displayTooltip(true, false);\n } else {\n // check if mouse goes outside the parent\n if(\n !$scope.taskRect ||\n e.clientX < $scope.taskRect.left ||\n e.clientX > $scope.taskRect.right ||\n e.clientY > $scope.taskRect.bottom ||\n e.clientY < $scope.taskRect.top\n ) {\n displayTooltip(false, false);\n }\n\n updateTooltip(e.clientX);\n }\n }, 5, false));\n\n $scope.getFromLabel = function() {\n var taskTooltips = $scope.task.model.tooltips;\n var rowTooltips = $scope.task.row.model.tooltips;\n\n if (typeof(taskTooltips) === 'boolean') {\n taskTooltips = {enabled: taskTooltips};\n }\n\n if (typeof(rowTooltips) === 'boolean') {\n rowTooltips = {enabled: rowTooltips};\n }\n\n var dateFormat = utils.firstProperty([taskTooltips, rowTooltips], 'dateFormat', $scope.pluginScope.dateFormat);\n return $scope.task.model.from.format(dateFormat);\n };\n\n $scope.getToLabel = function() {\n var taskTooltips = $scope.task.model.tooltips;\n var rowTooltips = $scope.task.row.model.tooltips;\n\n if (typeof(taskTooltips) === 'boolean') {\n taskTooltips = {enabled: taskTooltips};\n }\n\n if (typeof(rowTooltips) === 'boolean') {\n rowTooltips = {enabled: rowTooltips};\n }\n\n var dateFormat = utils.firstProperty([taskTooltips, rowTooltips], 'dateFormat', $scope.pluginScope.dateFormat);\n return $scope.task.model.to.format(dateFormat);\n };\n\n $scope.task.getContentElement().bind('mousemove', function(evt) {\n mouseEnterX = evt.clientX;\n });\n\n $scope.task.getContentElement().bind('mouseenter', function(evt) {\n mouseEnterX = evt.clientX;\n displayTooltip(true, true);\n });\n\n $scope.task.getContentElement().bind('mouseleave', function() {\n displayTooltip(false);\n });\n\n if ($scope.pluginScope.api.tasks.on.moveBegin) {\n $scope.pluginScope.api.tasks.on.moveBegin($scope, function(task) {\n if (task === $scope.task) {\n displayTooltip(true);\n }\n });\n\n $scope.pluginScope.api.tasks.on.moveEnd($scope, function(task) {\n if (task === $scope.task) {\n displayTooltip(false);\n }\n });\n\n $scope.pluginScope.api.tasks.on.resizeBegin($scope, function(task) {\n if (task === $scope.task) {\n displayTooltip(true);\n }\n });\n\n $scope.pluginScope.api.tasks.on.resizeEnd($scope, function(task) {\n if (task === $scope.task) {\n displayTooltip(false);\n }\n });\n }\n\n if ($scope.task.isMoving) {\n // Display tooltip because task has been moved to a new row\n displayTooltip(true, false);\n }\n\n $scope.gantt.api.directives.raise.new('ganttTooltip', $scope, $element);\n $scope.$on('$destroy', function() {\n $scope.gantt.api.directives.raise.destroy('ganttTooltip', $scope, $element);\n });\n }]\n };\n }]);\n}());\n\n","angular.module('gantt.tooltips.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/tooltips/tooltip.tmpl.html',\n '<div ng-cloak\\n' +\n ' class=\"gantt-task-info\"\\n' +\n ' ng-show=\"displayed\"\\n' +\n ' ng-class=\"isRightAligned ? \\'gantt-task-infoArrowR\\' : \\'gantt-task-infoArrow\\'\"\\n' +\n ' ng-style=\"{top: taskRect.top + \\'px\\', marginTop: -elementHeight - 8 + \\'px\\'}\">\\n' +\n ' <div class=\"gantt-task-info-content\">\\n' +\n ' <div gantt-bind-compile-html=\"pluginScope.content\"></div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '');\n}]);\n"]} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tooltips-plugin.min.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tooltips-plugin.min.js index 3a3b48485d89bb8a86b1c98e68baf65e482b7be2..7cbd43770e6e4599f6d10d1c6dd858edfd5d70c2 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tooltips-plugin.min.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tooltips-plugin.min.js @@ -1,10 +1,10 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com Github: https://github.com/angular-gantt/angular-gantt.git */ -!function(){"use strict";angular.module("gantt.tooltips",["gantt","gantt.tooltips.templates"]).directive("ganttTooltips",["$compile","$document",function(a,b){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",dateFormat:"=?",content:"=?"},link:function(c,d,e,f){var g=f.gantt.api;if(c.options&&"object"==typeof c.options.tooltips)for(var h in c.options.tooltips)c[h]=c.options[h];void 0===c.enabled&&(c.enabled=!0),void 0===c.dateFormat&&(c.dateFormat="MMM DD, HH:mm"),void 0===c.content&&(c.content="{{task.model.name}}</br><small>{{task.isMilestone() === true && getFromLabel() || getFromLabel() + ' - ' + getToLabel()}}</small>"),c.api=g,g.directives.on["new"](c,function(d,f,g){if("ganttTask"===d){var h=f.$new();h.pluginScope=c;var i=b[0].createElement("div");angular.element(i).attr("data-ng-if","pluginScope.enabled");var j=b[0].createElement("gantt-tooltip");void 0!==e.templateUrl&&angular.element(j).attr("data-template-url",e.templateUrl),void 0!==e.template&&angular.element(j).attr("data-template",e.template),angular.element(i).append(j),g.append(a(i)(h))}})}}}])}(),function(){"use strict";angular.module("gantt.tooltips").directive("ganttTooltip",["$log","$timeout","$compile","$document","$templateCache","ganttDebounce","ganttSmartEvent",function(a,b,c,d,e,f,g){return{restrict:"E",templateUrl:function(a,b){var c;return c=void 0===b.templateUrl?"plugins/tooltips/tooltip.tmpl.html":b.templateUrl,void 0!==b.template&&e.put(c,b.template),c},scope:!0,replace:!0,controller:["$scope","$element","ganttUtils",function(a,c,e){var h,i,j=angular.element(d[0].body),k=a.task.$element,l=!1;a.getFromLabel=function(){var b=a.task.model.tooltips,c=a.task.row.model.tooltips;"boolean"==typeof b&&(b={enabled:b}),"boolean"==typeof c&&(c={enabled:c});var d=e.firstProperty([b,c],"dateFormat",a.pluginScope.dateFormat);return a.task.model.from.format(d)},a.getToLabel=function(){var b=a.task.model.tooltips,c=a.task.row.model.tooltips;"boolean"==typeof b&&(b={enabled:b}),"boolean"==typeof c&&(c={enabled:c});var d=e.firstProperty([b,c],"dateFormat",a.pluginScope.dateFormat);return a.task.model.to.format(d)};var m=g(a,j,"mousemove",f(function(b){l?((!a.taskRect||b.clientX<a.taskRect.left||b.clientX>a.taskRect.right||b.clientY>a.taskRect.bottom||b.clientY<a.taskRect.top)&&n(!1,!1),q(b.clientX)):(i=b.clientX,n(!0,!1))},5,!1));a.task.getContentElement().bind("mousemove",function(a){i=a.clientX}),a.task.getContentElement().bind("mouseenter",function(a){i=a.clientX,n(!0,!0)}),a.task.getContentElement().bind("mouseleave",function(){n(!1)}),a.pluginScope.api.tasks.on.moveBegin&&(a.pluginScope.api.tasks.on.moveBegin(a,function(b){b===a.task&&n(!0)}),a.pluginScope.api.tasks.on.moveEnd(a,function(b){b===a.task&&n(!1)}),a.pluginScope.api.tasks.on.resizeBegin(a,function(b){b===a.task&&n(!0)}),a.pluginScope.api.tasks.on.resizeEnd(a,function(b){b===a.task&&n(!1)}));var n=function(c,d){h&&b.cancel(h);var f=a.task.model.tooltips,g=a.task.row.model.tooltips;"boolean"==typeof f&&(f={enabled:f}),"boolean"==typeof g&&(g={enabled:g});var j=e.firstProperty([f,g],"enabled",a.pluginScope.enabled);j&&!l&&void 0!==i&&c?d?h=b(function(){o(i)},500,!1):o(i):c||a.task.active||r()},o=function(b){l=!0,m.bind(),a.displayed=!0,a.$evalAsync(function(){var d;c.hasClass("ng-hide")&&(c.removeClass("ng-hide"),d=!0),a.elementHeight=c[0].offsetHeight,d&&c.addClass("ng-hide"),a.taskRect=k[0].getBoundingClientRect(),q(b)})},p=function(){var a=d[0];return a.documentElement.clientWidth||a.documentElement.getElementById("body")[0].clientWidth},q=function(b){b+c[0].offsetWidth>p()?(c.css("left",b+20-c[0].offsetWidth+"px"),a.isRightAligned=!0):(c.css("left",b-20+"px"),a.isRightAligned=!1)},r=function(){l=!1,m.unbind(),a.$evalAsync(function(){a.displayed=!1})};a.task.isMoving&&n(!0,!1),a.gantt.api.directives.raise["new"]("ganttTooltip",a,c),a.$on("$destroy",function(){a.gantt.api.directives.raise.destroy("ganttTooltip",a,c)})}]}}])}(),angular.module("gantt.tooltips.templates",[]).run(["$templateCache",function(a){a.put("plugins/tooltips/tooltip.tmpl.html",'<div ng-cloak\n class="gantt-task-info"\n ng-show="displayed"\n ng-class="isRightAligned ? \'gantt-task-infoArrowR\' : \'gantt-task-infoArrow\'"\n ng-style="{top: taskRect.top + \'px\', marginTop: -elementHeight - 8 + \'px\'}">\n <div class="gantt-task-info-content">\n <div gantt-bind-compile-html="pluginScope.content"></div>\n </div>\n</div>\n')}]); +!function(){"use strict";angular.module("gantt.tooltips",["gantt","gantt.tooltips.templates"]).directive("ganttTooltips",["$compile","$document",function(a,b){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",dateFormat:"=?",content:"=?",delay:"=?"},link:function(c,d,e,f){var g=f.gantt.api;if(c.options&&"object"==typeof c.options.tooltips)for(var h in c.options.tooltips)c[h]=c.options[h];void 0===c.enabled&&(c.enabled=!0),void 0===c.dateFormat&&(c.dateFormat="MMM DD, HH:mm"),void 0===c.delay&&(c.delay=500),void 0===c.content&&(c.content="{{task.model.name}}</br><small>{{task.isMilestone() === true && getFromLabel() || getFromLabel() + ' - ' + getToLabel()}}</small>"),c.api=g,g.directives.on["new"](c,function(d,f,g){if("ganttTask"===d){var h=f.$new();h.pluginScope=c;var i=b[0].createElement("div");angular.element(i).attr("data-ng-if","pluginScope.enabled");var j=b[0].createElement("gantt-tooltip");void 0!==e.templateUrl&&angular.element(j).attr("data-template-url",e.templateUrl),void 0!==e.template&&angular.element(j).attr("data-template",e.template),angular.element(i).append(j),g.append(a(i)(h))}})}}}])}(),function(){"use strict";angular.module("gantt.tooltips").directive("ganttTooltip",["$log","$timeout","$compile","$document","$templateCache","ganttDebounce","ganttSmartEvent",function(a,b,c,d,e,f,g){return{restrict:"E",templateUrl:function(a,b){var c;return c=void 0===b.templateUrl?"plugins/tooltips/tooltip.tmpl.html":b.templateUrl,void 0!==b.template&&e.put(c,b.template),c},scope:!0,replace:!0,controller:["$scope","$element","ganttUtils",function(a,c,e){var h,i,j,k=angular.element(d[0].body),l=a.task.$element,m=!1,n=function(){var a=d[0];return a.documentElement.clientWidth||a.documentElement.getElementById("body")[0].clientWidth},o=function(b){b+c[0].offsetWidth>n()?(c.css("left",b+20-c[0].offsetWidth+"px"),a.isRightAligned=!0):(c.css("left",b-20+"px"),a.isRightAligned=!1)},p=function(b){m=!0,j.bind(),a.displayed=!0,a.$evalAsync(function(){var d;c.hasClass("ng-hide")&&(c.removeClass("ng-hide"),d=!0),a.elementHeight=c[0].offsetHeight,d&&c.addClass("ng-hide"),a.taskRect=l[0].getBoundingClientRect(),o(b)})},q=function(){m=!1,j.unbind(),a.$evalAsync(function(){a.displayed=!1})},r=function(c,d){h&&b.cancel(h);var f=a.task.model.tooltips,g=a.task.row.model.tooltips;"boolean"==typeof f&&(f={enabled:f}),"boolean"==typeof g&&(g={enabled:g});var j=e.firstProperty([f,g],"enabled",a.pluginScope.enabled);j&&!m&&void 0!==i&&c?d?h=b(function(){p(i)},a.pluginScope.delay,!1):p(i):c||a.task.active||q()};j=g(a,k,"mousemove",f(function(b){m?((!a.taskRect||b.clientX<a.taskRect.left||b.clientX>a.taskRect.right||b.clientY>a.taskRect.bottom||b.clientY<a.taskRect.top)&&r(!1,!1),o(b.clientX)):(i=b.clientX,r(!0,!1))},5,!1)),a.getFromLabel=function(){var b=a.task.model.tooltips,c=a.task.row.model.tooltips;"boolean"==typeof b&&(b={enabled:b}),"boolean"==typeof c&&(c={enabled:c});var d=e.firstProperty([b,c],"dateFormat",a.pluginScope.dateFormat);return a.task.model.from.format(d)},a.getToLabel=function(){var b=a.task.model.tooltips,c=a.task.row.model.tooltips;"boolean"==typeof b&&(b={enabled:b}),"boolean"==typeof c&&(c={enabled:c});var d=e.firstProperty([b,c],"dateFormat",a.pluginScope.dateFormat);return a.task.model.to.format(d)},a.task.getContentElement().bind("mousemove",function(a){i=a.clientX}),a.task.getContentElement().bind("mouseenter",function(a){i=a.clientX,r(!0,!0)}),a.task.getContentElement().bind("mouseleave",function(){r(!1)}),a.pluginScope.api.tasks.on.moveBegin&&(a.pluginScope.api.tasks.on.moveBegin(a,function(b){b===a.task&&r(!0)}),a.pluginScope.api.tasks.on.moveEnd(a,function(b){b===a.task&&r(!1)}),a.pluginScope.api.tasks.on.resizeBegin(a,function(b){b===a.task&&r(!0)}),a.pluginScope.api.tasks.on.resizeEnd(a,function(b){b===a.task&&r(!1)})),a.task.isMoving&&r(!0,!1),a.gantt.api.directives.raise["new"]("ganttTooltip",a,c),a.$on("$destroy",function(){a.gantt.api.directives.raise.destroy("ganttTooltip",a,c)})}]}}])}(),angular.module("gantt.tooltips.templates",[]).run(["$templateCache",function(a){a.put("plugins/tooltips/tooltip.tmpl.html",'<div ng-cloak\n class="gantt-task-info"\n ng-show="displayed"\n ng-class="isRightAligned ? \'gantt-task-infoArrowR\' : \'gantt-task-infoArrow\'"\n ng-style="{top: taskRect.top + \'px\', marginTop: -elementHeight - 8 + \'px\'}">\n <div class="gantt-task-info-content">\n <div gantt-bind-compile-html="pluginScope.content"></div>\n </div>\n</div>\n')}]); //# sourceMappingURL=angular-gantt-tooltips-plugin.min.js.map \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tooltips-plugin.min.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tooltips-plugin.min.js.map index 4771b387cb27197c4a3aac51f94056ed708851e5..61c4f4f94332ba6077ebf8a2445a5f70c2aea370 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tooltips-plugin.min.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tooltips-plugin.min.js.map @@ -1 +1 @@ -{"version":3,"file":"angular-gantt-tooltips-plugin.min.js","sources":["../src/plugins/tooltips.js","../src/plugins/tooltips/tooltip.directive.js","../.tmp/generated/plugins/tooltips/html2js.js"],"names":["angular","module","directive","$compile","$document","restrict","require","scope","enabled","dateFormat","content","link","element","attrs","ganttCtrl","api","gantt","options","option","tooltips","undefined","directives","on","directiveName","taskScope","taskElement","tooltipScope","$new","pluginScope","ifElement","createElement","attr","tooltipElement","templateUrl","template","append","$log","$timeout","$templateCache","debounce","smartEvent","tElement","tAttrs","put","replace","controller","$scope","$element","utils","showTooltipPromise","mouseEnterX","bodyElement","body","parentElement","task","visible","getFromLabel","taskTooltips","model","rowTooltips","row","firstProperty","from","format","getToLabel","to","mouseMoveHandler","e","taskRect","clientX","left","right","clientY","bottom","top","displayTooltip","updateTooltip","getContentElement","bind","evt","tasks","moveBegin","moveEnd","resizeBegin","resizeEnd","newValue","showDelayed","cancel","showTooltip","active","hideTooltip","x","displayed","$evalAsync","restoreNgHide","hasClass","removeClass","elementHeight","offsetHeight","addClass","getBoundingClientRect","getViewPortWidth","d","documentElement","clientWidth","getElementById","offsetWidth","css","isRightAligned","unbind","isMoving","raise","$on","destroy","run"],"mappings":"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"} \ No newline at end of file +{"version":3,"sources":["../src/plugins/tooltips.js","../src/plugins/tooltips/tooltip.directive.js","../.tmp/generated/plugins/tooltips/html2js.js"],"names":["angular","module","directive","$compile","$document","restrict","require","scope","enabled","dateFormat","content","delay","link","element","attrs","ganttCtrl","api","gantt","options","option","tooltips","undefined","directives","on","directiveName","taskScope","taskElement","tooltipScope","$new","pluginScope","ifElement","createElement","attr","tooltipElement","templateUrl","template","append","$log","$timeout","$templateCache","debounce","smartEvent","tElement","tAttrs","put","replace","controller","$scope","$element","utils","showTooltipPromise","mouseEnterX","mouseMoveHandler","bodyElement","body","parentElement","task","visible","getViewPortWidth","d","documentElement","clientWidth","getElementById","updateTooltip","x","offsetWidth","css","isRightAligned","showTooltip","bind","displayed","$evalAsync","restoreNgHide","hasClass","removeClass","elementHeight","offsetHeight","addClass","taskRect","getBoundingClientRect","hideTooltip","unbind","displayTooltip","newValue","showDelayed","cancel","taskTooltips","model","rowTooltips","row","firstProperty","active","e","clientX","left","right","clientY","bottom","top","getFromLabel","from","format","getToLabel","to","getContentElement","evt","tasks","moveBegin","moveEnd","resizeBegin","resizeEnd","isMoving","raise","$on","destroy","run"],"mappings":"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","file":"angular-gantt-tooltips-plugin.min.js"} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tree-plugin.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tree-plugin.js index e8b06b129678ea2aad48aead6301ea67c8a4da14..79ba9cd7ff297ce8d1ced33a30f7d015e8522205 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tree-plugin.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tree-plugin.js @@ -1,5 +1,5 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com @@ -88,7 +88,7 @@ Github: https://github.com/angular-gantt/angular-gantt.git }()); -(function(){ +(function() { 'use strict'; angular.module('gantt.tree').controller('GanttTreeController', ['$scope', '$filter', 'GanttHierarchy', function($scope, $filter, Hierarchy) { $scope.rootRows = []; @@ -107,12 +107,12 @@ Github: https://github.com/angular-gantt/angular-gantt.git hierarchy.refresh(sortedRows); var leaves = []; - angular.forEach(sortedRows, function(row) { - var children = hierarchy.children(row); - if (!children || children.length === 0) { - leaves.push(row); - } - }); + for (var i = 0; i < sortedRows.length; i++) { + var children = hierarchy.children(sortedRows[i]); + if (!children || children.length === 0) { + leaves.push(sortedRows[i]); + } + } var filteredLeaves = $filter('filter')(leaves, filterRow, filterRowComparator); @@ -123,7 +123,7 @@ Github: https://github.com/angular-gantt/angular-gantt.git var descendants = hierarchy.descendants(row); - for (var i=0; i < descendants.length; i++) { + for (var i = 0; i < descendants.length; i++) { if (filteredLeaves.indexOf(descendants[i]) > -1) { return true; } @@ -163,35 +163,34 @@ Github: https://github.com/angular-gantt/angular-gantt.git var hasParent = false; - angular.forEach(rows, function(row) { - var rowParent = $scope.parent(row); + for (var i=0; i<rows.length; i++) { + var rowParent = $scope.parent(rows[i]); if (rowParent === undefined) { - rootRows.push(row); + rootRows.push(rows[i]); } else { hasParent = true; } - }); + } var handleChildren = function(row) { sortedRows.push(row); var children = $scope.children(row); - if (children !== undefined && children.length > 0) { var sortedChildren = children.sort(function(a, b) { return rows.indexOf(a) - rows.indexOf(b); }); - angular.forEach(sortedChildren, function(child) { - handleChildren(child); - }); + for (var i=0;i<sortedChildren.length;i++) { + handleChildren(sortedChildren[i]); + } } }; - angular.forEach(rootRows, function(row) { - handleChildren(row); - }); + for (i=0; i<rootRows.length; i++) { + handleChildren(rootRows[i]); + } return sortedRows; }; @@ -300,11 +299,11 @@ Github: https://github.com/angular-gantt/angular-gantt.git $scope.nodeScopes = {}; }]).controller('GanttUiTreeController', ['$scope', function($scope) { var collapseAll = function() { - $scope.collapseAll(); + $scope.$broadcast('angular-ui-tree:collapse-all'); }; var expandAll = function() { - $scope.expandAll(); + $scope.$broadcast('angular-ui-tree:expand-all'); }; $scope.gantt.api.registerMethod('tree', 'collapseAll', collapseAll, $scope); @@ -322,7 +321,7 @@ Github: https://github.com/angular-gantt/angular-gantt.git var visibleRows = $scope.row.rowsManager.filteredRows; var filteredChildrenRows = []; - for (var i=0; i < newValue.length; i++) { + for (var i = 0; i < newValue.length; i++) { var childRow = newValue[i]; if (visibleRows.indexOf(childRow) > -1) { filteredChildrenRows.push(childRow); @@ -335,7 +334,7 @@ Github: https://github.com/angular-gantt/angular-gantt.git } }); - $scope.isCollapseDisabled = function(){ + $scope.isCollapseDisabled = function() { return !$scope.$parent.childrenRows || $scope.$parent.childrenRows.length === 0; }; diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tree-plugin.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tree-plugin.js.map index 6c0ecde24e934ef5a6665ed39ef51f51dc5ddde7..3e89e6e3d8851a762511f300d1438052bfe81b20 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tree-plugin.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tree-plugin.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/plugins/tree.js","../src/plugins/tree/rowTreeLabel.directive.js","../src/plugins/tree/sideContentTree.directive.js","../src/plugins/tree/tree.controller.js","../src/plugins/tree/treeBody.directive.js","../src/plugins/tree/treeHeader.directive.js","../.tmp/generated/plugins/tree/html2js.js"],"names":[],"mappings":"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","file":"angular-gantt-tree-plugin.js","sourcesContent":["(function(){\n 'use strict';\n angular.module('gantt.tree', ['gantt', 'gantt.tree.templates', 'ui.tree']).directive('ganttTree', ['ganttUtils', '$compile', '$document', function(utils, $compile, $document) {\n // Provides the row sort functionality to any Gantt row\n // Uses the sortableState to share the current row\n\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n header: '=?',\n content: '=?',\n headerContent: '=?',\n keepAncestorOnFilterRow: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.sortable) === 'object') {\n for (var option in scope.options.sortable) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.header === undefined) {\n scope.header = 'Name';\n }\n\n if (scope.headerContent === undefined) {\n scope.headerContent = '{{getHeader()}}';\n }\n\n if (scope.keepAncestorOnFilterRow === undefined) {\n scope.keepAncestorOnFilterRow = false;\n }\n\n api.directives.on.new(scope, function(directiveName, sideContentScope, sideContentElement) {\n if (directiveName === 'ganttSideContent') {\n var labelsScope = sideContentScope.$new();\n labelsScope.pluginScope = scope;\n\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'pluginScope.enabled');\n angular.element(ifElement).addClass('side-element');\n\n var labelsElement = $document[0].createElement('gantt-side-content-tree');\n angular.element(ifElement).append(labelsElement);\n\n sideContentElement.append($compile(ifElement)(labelsScope));\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.tree').directive('ganttRowTreeLabel', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttRowTreeLabel');\n builder.restrict = 'A';\n builder.templateUrl = undefined;\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.tree').directive('ganttSideContentTree', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttSideContentTree', 'plugins/tree/sideContentTree.tmpl.html');\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.tree').controller('GanttTreeController', ['$scope', '$filter', 'GanttHierarchy', function($scope, $filter, Hierarchy) {\n $scope.rootRows = [];\n\n $scope.getHeader = function() {\n return $scope.pluginScope.header;\n };\n\n var hierarchy = new Hierarchy();\n\n $scope.pluginScope.$watchGroup(['keepAncestorOnFilterRow', 'enabled'], function(value) {\n var keepAncestor = value[0] && value[1];\n\n if (keepAncestor) {\n var filterImpl = function(sortedRows, filterRow, filterRowComparator) {\n hierarchy.refresh(sortedRows);\n\n var leaves = [];\n angular.forEach(sortedRows, function(row) {\n var children = hierarchy.children(row);\n if (!children || children.length === 0) {\n leaves.push(row);\n }\n });\n\n var filteredLeaves = $filter('filter')(leaves, filterRow, filterRowComparator);\n\n var filterRowKeepAncestor = function(row) {\n if (filteredLeaves.indexOf(row) > -1) {\n return true;\n }\n\n var descendants = hierarchy.descendants(row);\n\n for (var i=0; i < descendants.length; i++) {\n if (filteredLeaves.indexOf(descendants[i]) > -1) {\n return true;\n }\n }\n\n return false;\n };\n\n return $filter('filter')(sortedRows, filterRowKeepAncestor, filterRowComparator);\n };\n $scope.gantt.rowsManager.setFilterImpl(filterImpl);\n } else {\n $scope.gantt.rowsManager.setFilterImpl(false);\n }\n });\n\n var isVisible = function(row) {\n var parentRow = $scope.parent(row);\n while (parentRow !== undefined) {\n if (parentRow !== undefined && parentRow._collapsed) {\n return false;\n }\n parentRow = $scope.parent(parentRow);\n }\n return true;\n };\n\n var filterRowsFunction = function(rows) {\n return rows.filter(function(row) {\n return isVisible(row);\n });\n };\n\n var sortRowsFunction = function(rows) {\n var sortedRows = [];\n var rootRows = [];\n\n var hasParent = false;\n\n angular.forEach(rows, function(row) {\n var rowParent = $scope.parent(row);\n if (rowParent === undefined) {\n rootRows.push(row);\n } else {\n hasParent = true;\n }\n });\n\n var handleChildren = function(row) {\n sortedRows.push(row);\n var children = $scope.children(row);\n\n\n\n if (children !== undefined && children.length > 0) {\n var sortedChildren = children.sort(function(a, b) {\n return rows.indexOf(a) - rows.indexOf(b);\n });\n\n angular.forEach(sortedChildren, function(child) {\n handleChildren(child);\n });\n }\n };\n\n angular.forEach(rootRows, function(row) {\n handleChildren(row);\n });\n\n return sortedRows;\n };\n $scope.gantt.api.rows.addRowSorter(sortRowsFunction);\n $scope.gantt.api.rows.addRowFilter(filterRowsFunction);\n\n $scope.$on('$destroy', function() {\n $scope.gantt.api.rows.removeRowSorter(sortRowsFunction);\n $scope.gantt.api.rows.removeRowFilter(filterRowsFunction);\n });\n\n var refresh = function() {\n $scope.rootRows = hierarchy.refresh($scope.gantt.rowsManager.filteredRows);\n\n if ($scope.gantt.rowsManager.filteredRows.length > 0) {\n $scope.gantt.api.rows.sort();\n $scope.gantt.api.rows.refresh();\n }\n };\n\n $scope.gantt.api.rows.on.remove($scope, refresh);\n $scope.gantt.api.rows.on.add($scope, refresh);\n\n var isRowCollapsed = function(rowId) {\n var row;\n if (typeof rowId === 'string') {\n row = $scope.gantt.rowsManager.rowsMap[rowId];\n } else {\n row = rowId;\n }\n if (row === undefined) {\n return undefined;\n }\n if (row._collapsed === undefined) {\n return false;\n }\n return row._collapsed;\n };\n\n var expandRow = function(rowId) {\n var row;\n if (typeof rowId === 'string') {\n row = $scope.gantt.rowsManager.rowsMap[rowId];\n } else {\n row = rowId;\n }\n if (row === undefined) {\n return;\n }\n\n var rowScope = $scope.nodeScopes[row.model.id];\n if (rowScope.collapsed) {\n rowScope.toggle();\n }\n };\n\n var collapseRow = function(rowId) {\n var row;\n if (typeof rowId === 'string') {\n row = $scope.gantt.rowsManager.rowsMap[rowId];\n } else {\n row = rowId;\n }\n if (row === undefined) {\n return;\n }\n\n var rowScope = $scope.nodeScopes[row.model.id];\n if (!rowScope.collapsed) {\n rowScope.toggle();\n }\n };\n\n var getHierarchy = function() {\n return hierarchy;\n };\n\n $scope.getHeaderContent = function() {\n return $scope.pluginScope.headerContent;\n };\n\n $scope.gantt.api.registerMethod('tree', 'refresh', refresh, this);\n $scope.gantt.api.registerMethod('tree', 'isCollapsed', isRowCollapsed, this);\n $scope.gantt.api.registerMethod('tree', 'expand', expandRow, this);\n $scope.gantt.api.registerMethod('tree', 'collapse', collapseRow, this);\n\n $scope.gantt.api.registerEvent('tree', 'collapsed');\n\n $scope.gantt.api.registerMethod('tree', 'getHierarchy', getHierarchy, this);\n\n $scope.$watchCollection('gantt.rowsManager.filteredRows', function() {\n refresh();\n });\n\n $scope.children = function(row) {\n if (row === undefined) {\n return $scope.rootRows;\n }\n return hierarchy.children(row);\n };\n\n $scope.parent = function(row) {\n return hierarchy.parent(row);\n };\n\n $scope.nodeScopes = {};\n }]).controller('GanttUiTreeController', ['$scope', function($scope) {\n var collapseAll = function() {\n $scope.collapseAll();\n };\n\n var expandAll = function() {\n $scope.expandAll();\n };\n\n $scope.gantt.api.registerMethod('tree', 'collapseAll', collapseAll, $scope);\n $scope.gantt.api.registerMethod('tree', 'expandAll', expandAll, $scope);\n }]).controller('GanttTreeNodeController', ['$scope', function($scope) {\n $scope.$parent.nodeScopes[$scope.row.model.id] = $scope;\n $scope.$on('$destroy', function() {\n delete $scope.$parent.nodeScopes[$scope.row.model.id];\n });\n\n $scope.$watch('children(row)', function(newValue) {\n if (newValue) {\n // Children rows may have been filtered out\n // So we need to filter the raw hierarchy before displaying children in tree.\n var visibleRows = $scope.row.rowsManager.filteredRows;\n\n var filteredChildrenRows = [];\n for (var i=0; i < newValue.length; i++) {\n var childRow = newValue[i];\n if (visibleRows.indexOf(childRow) > -1) {\n filteredChildrenRows.push(childRow);\n }\n }\n\n $scope.$parent.childrenRows = filteredChildrenRows;\n } else {\n $scope.$parent.childrenRows = newValue;\n }\n });\n\n $scope.isCollapseDisabled = function(){\n return !$scope.$parent.childrenRows || $scope.$parent.childrenRows.length === 0;\n };\n\n $scope.getValue = function() {\n return $scope.row.model.name;\n };\n\n $scope.getRowContent = function() {\n if ($scope.row.model.content !== undefined) {\n return $scope.row.model.content;\n }\n if ($scope.pluginScope.content !== undefined) {\n return $scope.pluginScope.content;\n }\n\n var content = $scope.row.rowsManager.gantt.options.value('rowContent');\n if (content === undefined) {\n content = '{{row.model.name}}';\n }\n return content;\n };\n\n $scope.$watch('collapsed', function(newValue) {\n if ($scope.$modelValue._collapsed !== newValue) {\n var oldValue = $scope.$modelValue._collapsed;\n $scope.$modelValue._collapsed = newValue; // $modelValue contains the Row object\n if (oldValue !== undefined && newValue !== oldValue) {\n $scope.gantt.api.tree.raise.collapsed($scope, $scope.$modelValue, newValue);\n $scope.gantt.api.rows.refresh();\n }\n }\n });\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.tree').directive('ganttTreeBody', ['GanttDirectiveBuilder', 'ganttLayout', function(Builder, layout) {\n var builder = new Builder('ganttTreeBody', 'plugins/tree/treeBody.tmpl.html');\n builder.controller = function($scope) {\n var hScrollBarHeight = layout.getScrollBarHeight();\n\n $scope.getLabelsCss = function() {\n var css = {};\n\n if ($scope.maxHeight) {\n var bodyScrollBarHeight = $scope.gantt.scroll.isHScrollbarVisible() ? hScrollBarHeight : 0;\n css['max-height'] = $scope.maxHeight - bodyScrollBarHeight - $scope.gantt.header.getHeight() + 'px';\n }\n\n return css;\n };\n };\n return builder.build();\n }]);\n}());\n\n\n","(function(){\n 'use strict';\n angular.module('gantt.tree').directive('ganttTreeHeader', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTreeHeader', 'plugins/tree/treeHeader.tmpl.html');\n return builder.build();\n }]);\n}());\n\n","angular.module('gantt.tree.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/tree/sideContentTree.tmpl.html',\n '<div class=\"gantt-side-content-tree\" ng-controller=\"GanttTreeController\">\\n' +\n ' <gantt-tree-header>\\n' +\n ' </gantt-tree-header>\\n' +\n ' <gantt-tree-body>\\n' +\n ' </gantt-tree-body>\\n' +\n '</div>\\n' +\n '');\n $templateCache.put('plugins/tree/treeBody.tmpl.html',\n '<div class=\"gantt-tree-body\" ng-style=\"getLabelsCss()\">\\n' +\n ' <div gantt-vertical-scroll-receiver>\\n' +\n ' <div class=\"gantt-row-label-background\">\\n' +\n ' <div class=\"gantt-row-label gantt-row-height\"\\n' +\n ' ng-class=\"row.model.classes\"\\n' +\n ' ng-style=\"{\\'height\\': row.model.height}\"\\n' +\n ' ng-repeat=\"row in gantt.rowsManager.visibleRows track by row.model.id\">\\n' +\n ' \\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' <div ui-tree ng-controller=\"GanttUiTreeController\" data-drag-enabled=\"false\" data-empty-place-holder-enabled=\"false\">\\n' +\n ' <ol class=\"gantt-tree-root\" ui-tree-nodes ng-model=\"rootRows\">\\n' +\n ' <li ng-repeat=\"row in rootRows\" ui-tree-node\\n' +\n ' ng-include=\"\\'plugins/tree/treeBodyChildren.tmpl.html\\'\">\\n' +\n ' </li>\\n' +\n ' </ol>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '');\n $templateCache.put('plugins/tree/treeBodyChildren.tmpl.html',\n '<div ng-controller=\"GanttTreeNodeController\"\\n' +\n ' class=\"gantt-row-label gantt-row-height\"\\n' +\n ' ng-class=\"row.model.classes\"\\n' +\n ' ng-style=\"{\\'height\\': row.model.height}\">\\n' +\n ' <div class=\"gantt-valign-container\">\\n' +\n ' <div class=\"gantt-valign-content\">\\n' +\n ' <a ng-disabled=\"isCollapseDisabled()\" data-nodrag\\n' +\n ' class=\"gantt-tree-handle-button btn btn-xs\"\\n' +\n ' ng-class=\"{\\'gantt-tree-collapsed\\': collapsed, \\'gantt-tree-expanded\\': !collapsed}\"\\n' +\n ' ng-click=\"!isCollapseDisabled() && toggle()\"><span\\n' +\n ' class=\"gantt-tree-handle glyphicon glyphicon-chevron-down\"\\n' +\n ' ng-class=\"{\\n' +\n ' \\'glyphicon-chevron-right\\': collapsed, \\'glyphicon-chevron-down\\': !collapsed,\\n' +\n ' \\'gantt-tree-collapsed\\': collapsed, \\'gantt-tree-expanded\\': !collapsed}\"></span>\\n' +\n ' </a>\\n' +\n ' <span gantt-row-label class=\"gantt-label-text\" gantt-bind-compile-html=\"getRowContent()\"/>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '<ol ui-tree-nodes ng-class=\"{hidden: collapsed}\" ng-model=\"childrenRows\">\\n' +\n ' <li ng-repeat=\"row in childrenRows\" ui-tree-node>\\n' +\n ' <div ng-include=\"\\'plugins/tree/treeBodyChildren.tmpl.html\\'\"></div>\\n' +\n ' </li>\\n' +\n '</ol>\\n' +\n '');\n $templateCache.put('plugins/tree/treeHeader.tmpl.html',\n '<div class=\"gantt-tree-header\" ng-style=\"{height: $parent.ganttHeaderHeight + \\'px\\'}\">\\n' +\n ' <div ng-if=\"$parent.ganttHeaderHeight\" class=\"gantt-row-label gantt-row-label-header gantt-tree-row gantt-tree-header-row\"><span class=\"gantt-label-text\" gantt-bind-compile-html=\"getHeaderContent()\"/></div>\\n' +\n '</div>\\n' +\n '');\n}]);\n"]} \ No newline at end of file +{"version":3,"sources":["../src/plugins/tree.js","../src/plugins/tree/rowTreeLabel.directive.js","../src/plugins/tree/sideContentTree.directive.js","../src/plugins/tree/tree.controller.js","../src/plugins/tree/treeBody.directive.js","../src/plugins/tree/treeHeader.directive.js","../.tmp/generated/plugins/tree/html2js.js"],"names":[],"mappings":"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","file":"angular-gantt-tree-plugin.js","sourcesContent":["(function(){\n 'use strict';\n angular.module('gantt.tree', ['gantt', 'gantt.tree.templates', 'ui.tree']).directive('ganttTree', ['ganttUtils', '$compile', '$document', function(utils, $compile, $document) {\n // Provides the row sort functionality to any Gantt row\n // Uses the sortableState to share the current row\n\n return {\n restrict: 'E',\n require: '^gantt',\n scope: {\n enabled: '=?',\n header: '=?',\n content: '=?',\n headerContent: '=?',\n keepAncestorOnFilterRow: '=?'\n },\n link: function(scope, element, attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n\n // Load options from global options attribute.\n if (scope.options && typeof(scope.options.sortable) === 'object') {\n for (var option in scope.options.sortable) {\n scope[option] = scope.options[option];\n }\n }\n\n if (scope.enabled === undefined) {\n scope.enabled = true;\n }\n\n if (scope.header === undefined) {\n scope.header = 'Name';\n }\n\n if (scope.headerContent === undefined) {\n scope.headerContent = '{{getHeader()}}';\n }\n\n if (scope.keepAncestorOnFilterRow === undefined) {\n scope.keepAncestorOnFilterRow = false;\n }\n\n api.directives.on.new(scope, function(directiveName, sideContentScope, sideContentElement) {\n if (directiveName === 'ganttSideContent') {\n var labelsScope = sideContentScope.$new();\n labelsScope.pluginScope = scope;\n\n var ifElement = $document[0].createElement('div');\n angular.element(ifElement).attr('data-ng-if', 'pluginScope.enabled');\n angular.element(ifElement).addClass('side-element');\n\n var labelsElement = $document[0].createElement('gantt-side-content-tree');\n angular.element(ifElement).append(labelsElement);\n\n sideContentElement.append($compile(ifElement)(labelsScope));\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.tree').directive('ganttRowTreeLabel', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttRowTreeLabel');\n builder.restrict = 'A';\n builder.templateUrl = undefined;\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.tree').directive('ganttSideContentTree', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttSideContentTree', 'plugins/tree/sideContentTree.tmpl.html');\n return builder.build();\n }]);\n}());\n\n","(function() {\n 'use strict';\n angular.module('gantt.tree').controller('GanttTreeController', ['$scope', '$filter', 'GanttHierarchy', function($scope, $filter, Hierarchy) {\n $scope.rootRows = [];\n\n $scope.getHeader = function() {\n return $scope.pluginScope.header;\n };\n\n var hierarchy = new Hierarchy();\n\n $scope.pluginScope.$watchGroup(['keepAncestorOnFilterRow', 'enabled'], function(value) {\n var keepAncestor = value[0] && value[1];\n\n if (keepAncestor) {\n var filterImpl = function(sortedRows, filterRow, filterRowComparator) {\n hierarchy.refresh(sortedRows);\n\n var leaves = [];\n for (var i = 0; i < sortedRows.length; i++) {\n var children = hierarchy.children(sortedRows[i]);\n if (!children || children.length === 0) {\n leaves.push(sortedRows[i]);\n }\n }\n\n var filteredLeaves = $filter('filter')(leaves, filterRow, filterRowComparator);\n\n var filterRowKeepAncestor = function(row) {\n if (filteredLeaves.indexOf(row) > -1) {\n return true;\n }\n\n var descendants = hierarchy.descendants(row);\n\n for (var i = 0; i < descendants.length; i++) {\n if (filteredLeaves.indexOf(descendants[i]) > -1) {\n return true;\n }\n }\n\n return false;\n };\n\n return $filter('filter')(sortedRows, filterRowKeepAncestor, filterRowComparator);\n };\n $scope.gantt.rowsManager.setFilterImpl(filterImpl);\n } else {\n $scope.gantt.rowsManager.setFilterImpl(false);\n }\n });\n\n var isVisible = function(row) {\n var parentRow = $scope.parent(row);\n while (parentRow !== undefined) {\n if (parentRow !== undefined && parentRow._collapsed) {\n return false;\n }\n parentRow = $scope.parent(parentRow);\n }\n return true;\n };\n\n var filterRowsFunction = function(rows) {\n return rows.filter(function(row) {\n return isVisible(row);\n });\n };\n\n var sortRowsFunction = function(rows) {\n var sortedRows = [];\n var rootRows = [];\n\n var hasParent = false;\n\n for (var i=0; i<rows.length; i++) {\n var rowParent = $scope.parent(rows[i]);\n if (rowParent === undefined) {\n rootRows.push(rows[i]);\n } else {\n hasParent = true;\n }\n }\n\n var handleChildren = function(row) {\n sortedRows.push(row);\n var children = $scope.children(row);\n\n\n if (children !== undefined && children.length > 0) {\n var sortedChildren = children.sort(function(a, b) {\n return rows.indexOf(a) - rows.indexOf(b);\n });\n\n for (var i=0;i<sortedChildren.length;i++) {\n handleChildren(sortedChildren[i]);\n }\n }\n };\n\n for (i=0; i<rootRows.length; i++) {\n handleChildren(rootRows[i]);\n }\n\n return sortedRows;\n };\n $scope.gantt.api.rows.addRowSorter(sortRowsFunction);\n $scope.gantt.api.rows.addRowFilter(filterRowsFunction);\n\n $scope.$on('$destroy', function() {\n $scope.gantt.api.rows.removeRowSorter(sortRowsFunction);\n $scope.gantt.api.rows.removeRowFilter(filterRowsFunction);\n });\n\n var refresh = function() {\n $scope.rootRows = hierarchy.refresh($scope.gantt.rowsManager.filteredRows);\n\n if ($scope.gantt.rowsManager.filteredRows.length > 0) {\n $scope.gantt.api.rows.sort();\n $scope.gantt.api.rows.refresh();\n }\n };\n\n $scope.gantt.api.rows.on.remove($scope, refresh);\n $scope.gantt.api.rows.on.add($scope, refresh);\n\n var isRowCollapsed = function(rowId) {\n var row;\n if (typeof rowId === 'string') {\n row = $scope.gantt.rowsManager.rowsMap[rowId];\n } else {\n row = rowId;\n }\n if (row === undefined) {\n return undefined;\n }\n if (row._collapsed === undefined) {\n return false;\n }\n return row._collapsed;\n };\n\n var expandRow = function(rowId) {\n var row;\n if (typeof rowId === 'string') {\n row = $scope.gantt.rowsManager.rowsMap[rowId];\n } else {\n row = rowId;\n }\n if (row === undefined) {\n return;\n }\n\n var rowScope = $scope.nodeScopes[row.model.id];\n if (rowScope.collapsed) {\n rowScope.toggle();\n }\n };\n\n var collapseRow = function(rowId) {\n var row;\n if (typeof rowId === 'string') {\n row = $scope.gantt.rowsManager.rowsMap[rowId];\n } else {\n row = rowId;\n }\n if (row === undefined) {\n return;\n }\n\n var rowScope = $scope.nodeScopes[row.model.id];\n if (!rowScope.collapsed) {\n rowScope.toggle();\n }\n };\n\n var getHierarchy = function() {\n return hierarchy;\n };\n\n $scope.getHeaderContent = function() {\n return $scope.pluginScope.headerContent;\n };\n\n $scope.gantt.api.registerMethod('tree', 'refresh', refresh, this);\n $scope.gantt.api.registerMethod('tree', 'isCollapsed', isRowCollapsed, this);\n $scope.gantt.api.registerMethod('tree', 'expand', expandRow, this);\n $scope.gantt.api.registerMethod('tree', 'collapse', collapseRow, this);\n\n $scope.gantt.api.registerEvent('tree', 'collapsed');\n\n $scope.gantt.api.registerMethod('tree', 'getHierarchy', getHierarchy, this);\n\n $scope.$watchCollection('gantt.rowsManager.filteredRows', function() {\n refresh();\n });\n\n $scope.children = function(row) {\n if (row === undefined) {\n return $scope.rootRows;\n }\n return hierarchy.children(row);\n };\n\n $scope.parent = function(row) {\n return hierarchy.parent(row);\n };\n\n $scope.nodeScopes = {};\n }]).controller('GanttUiTreeController', ['$scope', function($scope) {\n var collapseAll = function() {\n $scope.$broadcast('angular-ui-tree:collapse-all');\n };\n\n var expandAll = function() {\n $scope.$broadcast('angular-ui-tree:expand-all');\n };\n\n $scope.gantt.api.registerMethod('tree', 'collapseAll', collapseAll, $scope);\n $scope.gantt.api.registerMethod('tree', 'expandAll', expandAll, $scope);\n }]).controller('GanttTreeNodeController', ['$scope', function($scope) {\n $scope.$parent.nodeScopes[$scope.row.model.id] = $scope;\n $scope.$on('$destroy', function() {\n delete $scope.$parent.nodeScopes[$scope.row.model.id];\n });\n\n $scope.$watch('children(row)', function(newValue) {\n if (newValue) {\n // Children rows may have been filtered out\n // So we need to filter the raw hierarchy before displaying children in tree.\n var visibleRows = $scope.row.rowsManager.filteredRows;\n\n var filteredChildrenRows = [];\n for (var i = 0; i < newValue.length; i++) {\n var childRow = newValue[i];\n if (visibleRows.indexOf(childRow) > -1) {\n filteredChildrenRows.push(childRow);\n }\n }\n\n $scope.$parent.childrenRows = filteredChildrenRows;\n } else {\n $scope.$parent.childrenRows = newValue;\n }\n });\n\n $scope.isCollapseDisabled = function() {\n return !$scope.$parent.childrenRows || $scope.$parent.childrenRows.length === 0;\n };\n\n $scope.getValue = function() {\n return $scope.row.model.name;\n };\n\n $scope.getRowContent = function() {\n if ($scope.row.model.content !== undefined) {\n return $scope.row.model.content;\n }\n if ($scope.pluginScope.content !== undefined) {\n return $scope.pluginScope.content;\n }\n\n var content = $scope.row.rowsManager.gantt.options.value('rowContent');\n if (content === undefined) {\n content = '{{row.model.name}}';\n }\n return content;\n };\n\n $scope.$watch('collapsed', function(newValue) {\n if ($scope.$modelValue._collapsed !== newValue) {\n var oldValue = $scope.$modelValue._collapsed;\n $scope.$modelValue._collapsed = newValue; // $modelValue contains the Row object\n if (oldValue !== undefined && newValue !== oldValue) {\n $scope.gantt.api.tree.raise.collapsed($scope, $scope.$modelValue, newValue);\n $scope.gantt.api.rows.refresh();\n }\n }\n });\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt.tree').directive('ganttTreeBody', ['GanttDirectiveBuilder', 'ganttLayout', function(Builder, layout) {\n var builder = new Builder('ganttTreeBody', 'plugins/tree/treeBody.tmpl.html');\n builder.controller = function($scope) {\n var hScrollBarHeight = layout.getScrollBarHeight();\n\n $scope.getLabelsCss = function() {\n var css = {};\n\n if ($scope.maxHeight) {\n var bodyScrollBarHeight = $scope.gantt.scroll.isHScrollbarVisible() ? hScrollBarHeight : 0;\n css['max-height'] = $scope.maxHeight - bodyScrollBarHeight - $scope.gantt.header.getHeight() + 'px';\n }\n\n return css;\n };\n };\n return builder.build();\n }]);\n}());\n\n\n","(function(){\n 'use strict';\n angular.module('gantt.tree').directive('ganttTreeHeader', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTreeHeader', 'plugins/tree/treeHeader.tmpl.html');\n return builder.build();\n }]);\n}());\n\n","angular.module('gantt.tree.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('plugins/tree/sideContentTree.tmpl.html',\n '<div class=\"gantt-side-content-tree\" ng-controller=\"GanttTreeController\">\\n' +\n ' <gantt-tree-header>\\n' +\n ' </gantt-tree-header>\\n' +\n ' <gantt-tree-body>\\n' +\n ' </gantt-tree-body>\\n' +\n '</div>\\n' +\n '');\n $templateCache.put('plugins/tree/treeBody.tmpl.html',\n '<div class=\"gantt-tree-body\" ng-style=\"getLabelsCss()\">\\n' +\n ' <div gantt-vertical-scroll-receiver>\\n' +\n ' <div class=\"gantt-row-label-background\">\\n' +\n ' <div class=\"gantt-row-label gantt-row-height\"\\n' +\n ' ng-class=\"row.model.classes\"\\n' +\n ' ng-style=\"{\\'height\\': row.model.height}\"\\n' +\n ' ng-repeat=\"row in gantt.rowsManager.visibleRows track by row.model.id\">\\n' +\n ' \\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' <div ui-tree ng-controller=\"GanttUiTreeController\" data-drag-enabled=\"false\" data-empty-place-holder-enabled=\"false\">\\n' +\n ' <ol class=\"gantt-tree-root\" ui-tree-nodes ng-model=\"rootRows\">\\n' +\n ' <li ng-repeat=\"row in rootRows\" ui-tree-node\\n' +\n ' ng-include=\"\\'plugins/tree/treeBodyChildren.tmpl.html\\'\">\\n' +\n ' </li>\\n' +\n ' </ol>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '');\n $templateCache.put('plugins/tree/treeBodyChildren.tmpl.html',\n '<div ng-controller=\"GanttTreeNodeController\"\\n' +\n ' class=\"gantt-row-label gantt-row-height\"\\n' +\n ' ng-class=\"row.model.classes\"\\n' +\n ' ng-style=\"{\\'height\\': row.model.height}\">\\n' +\n ' <div class=\"gantt-valign-container\">\\n' +\n ' <div class=\"gantt-valign-content\">\\n' +\n ' <a ng-disabled=\"isCollapseDisabled()\" data-nodrag\\n' +\n ' class=\"gantt-tree-handle-button btn btn-xs\"\\n' +\n ' ng-class=\"{\\'gantt-tree-collapsed\\': collapsed, \\'gantt-tree-expanded\\': !collapsed}\"\\n' +\n ' ng-click=\"!isCollapseDisabled() && toggle()\"><span\\n' +\n ' class=\"gantt-tree-handle glyphicon glyphicon-chevron-down\"\\n' +\n ' ng-class=\"{\\n' +\n ' \\'glyphicon-chevron-right\\': collapsed, \\'glyphicon-chevron-down\\': !collapsed,\\n' +\n ' \\'gantt-tree-collapsed\\': collapsed, \\'gantt-tree-expanded\\': !collapsed}\"></span>\\n' +\n ' </a>\\n' +\n ' <span gantt-row-label class=\"gantt-label-text\" gantt-bind-compile-html=\"getRowContent()\"/>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n '</div>\\n' +\n '<ol ui-tree-nodes ng-class=\"{hidden: collapsed}\" ng-model=\"childrenRows\">\\n' +\n ' <li ng-repeat=\"row in childrenRows\" ui-tree-node>\\n' +\n ' <div ng-include=\"\\'plugins/tree/treeBodyChildren.tmpl.html\\'\"></div>\\n' +\n ' </li>\\n' +\n '</ol>\\n' +\n '');\n $templateCache.put('plugins/tree/treeHeader.tmpl.html',\n '<div class=\"gantt-tree-header\" ng-style=\"{height: $parent.ganttHeaderHeight + \\'px\\'}\">\\n' +\n ' <div ng-if=\"$parent.ganttHeaderHeight\" class=\"gantt-row-label gantt-row-label-header gantt-tree-row gantt-tree-header-row\"><span class=\"gantt-label-text\" gantt-bind-compile-html=\"getHeaderContent()\"/></div>\\n' +\n '</div>\\n' +\n '');\n}]);\n"]} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tree-plugin.min.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tree-plugin.min.js index 640ab79fefa6e90618801fabe90532ae51fa6960..d834cbb35bd3ca6e077252d3efcf3ab22ea67bad 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tree-plugin.min.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tree-plugin.min.js @@ -1,10 +1,10 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com Github: https://github.com/angular-gantt/angular-gantt.git */ -!function(){"use strict";angular.module("gantt.tree",["gantt","gantt.tree.templates","ui.tree"]).directive("ganttTree",["ganttUtils","$compile","$document",function(a,b,c){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",header:"=?",content:"=?",headerContent:"=?",keepAncestorOnFilterRow:"=?"},link:function(a,d,e,f){var g=f.gantt.api;if(a.options&&"object"==typeof a.options.sortable)for(var h in a.options.sortable)a[h]=a.options[h];void 0===a.enabled&&(a.enabled=!0),void 0===a.header&&(a.header="Name"),void 0===a.headerContent&&(a.headerContent="{{getHeader()}}"),void 0===a.keepAncestorOnFilterRow&&(a.keepAncestorOnFilterRow=!1),g.directives.on["new"](a,function(d,e,f){if("ganttSideContent"===d){var g=e.$new();g.pluginScope=a;var h=c[0].createElement("div");angular.element(h).attr("data-ng-if","pluginScope.enabled"),angular.element(h).addClass("side-element");var i=c[0].createElement("gantt-side-content-tree");angular.element(h).append(i),f.append(b(h)(g))}})}}}])}(),function(){"use strict";angular.module("gantt.tree").directive("ganttRowTreeLabel",["GanttDirectiveBuilder",function(a){var b=new a("ganttRowTreeLabel");return b.restrict="A",b.templateUrl=void 0,b.build()}])}(),function(){"use strict";angular.module("gantt.tree").directive("ganttSideContentTree",["GanttDirectiveBuilder",function(a){var b=new a("ganttSideContentTree","plugins/tree/sideContentTree.tmpl.html");return b.build()}])}(),function(){"use strict";angular.module("gantt.tree").controller("GanttTreeController",["$scope","$filter","GanttHierarchy",function(a,b,c){a.rootRows=[],a.getHeader=function(){return a.pluginScope.header};var d=new c;a.pluginScope.$watchGroup(["keepAncestorOnFilterRow","enabled"],function(c){var e=c[0]&&c[1];if(e){var f=function(a,c,e){d.refresh(a);var f=[];angular.forEach(a,function(a){var b=d.children(a);b&&0!==b.length||f.push(a)});var g=b("filter")(f,c,e),h=function(a){if(g.indexOf(a)>-1)return!0;for(var b=d.descendants(a),c=0;c<b.length;c++)if(g.indexOf(b[c])>-1)return!0;return!1};return b("filter")(a,h,e)};a.gantt.rowsManager.setFilterImpl(f)}else a.gantt.rowsManager.setFilterImpl(!1)});var e=function(b){for(var c=a.parent(b);void 0!==c;){if(void 0!==c&&c._collapsed)return!1;c=a.parent(c)}return!0},f=function(a){return a.filter(function(a){return e(a)})},g=function(b){var c=[],d=[],e=!1;angular.forEach(b,function(b){var c=a.parent(b);void 0===c?d.push(b):e=!0});var f=function(d){c.push(d);var e=a.children(d);if(void 0!==e&&e.length>0){var g=e.sort(function(a,c){return b.indexOf(a)-b.indexOf(c)});angular.forEach(g,function(a){f(a)})}};return angular.forEach(d,function(a){f(a)}),c};a.gantt.api.rows.addRowSorter(g),a.gantt.api.rows.addRowFilter(f),a.$on("$destroy",function(){a.gantt.api.rows.removeRowSorter(g),a.gantt.api.rows.removeRowFilter(f)});var h=function(){a.rootRows=d.refresh(a.gantt.rowsManager.filteredRows),a.gantt.rowsManager.filteredRows.length>0&&(a.gantt.api.rows.sort(),a.gantt.api.rows.refresh())};a.gantt.api.rows.on.remove(a,h),a.gantt.api.rows.on.add(a,h);var i=function(b){var c;return c="string"==typeof b?a.gantt.rowsManager.rowsMap[b]:b,void 0===c?void 0:void 0===c._collapsed?!1:c._collapsed},j=function(b){var c;if(c="string"==typeof b?a.gantt.rowsManager.rowsMap[b]:b,void 0!==c){var d=a.nodeScopes[c.model.id];d.collapsed&&d.toggle()}},k=function(b){var c;if(c="string"==typeof b?a.gantt.rowsManager.rowsMap[b]:b,void 0!==c){var d=a.nodeScopes[c.model.id];d.collapsed||d.toggle()}},l=function(){return d};a.getHeaderContent=function(){return a.pluginScope.headerContent},a.gantt.api.registerMethod("tree","refresh",h,this),a.gantt.api.registerMethod("tree","isCollapsed",i,this),a.gantt.api.registerMethod("tree","expand",j,this),a.gantt.api.registerMethod("tree","collapse",k,this),a.gantt.api.registerEvent("tree","collapsed"),a.gantt.api.registerMethod("tree","getHierarchy",l,this),a.$watchCollection("gantt.rowsManager.filteredRows",function(){h()}),a.children=function(b){return void 0===b?a.rootRows:d.children(b)},a.parent=function(a){return d.parent(a)},a.nodeScopes={}}]).controller("GanttUiTreeController",["$scope",function(a){var b=function(){a.collapseAll()},c=function(){a.expandAll()};a.gantt.api.registerMethod("tree","collapseAll",b,a),a.gantt.api.registerMethod("tree","expandAll",c,a)}]).controller("GanttTreeNodeController",["$scope",function(a){a.$parent.nodeScopes[a.row.model.id]=a,a.$on("$destroy",function(){delete a.$parent.nodeScopes[a.row.model.id]}),a.$watch("children(row)",function(b){if(b){for(var c=a.row.rowsManager.filteredRows,d=[],e=0;e<b.length;e++){var f=b[e];c.indexOf(f)>-1&&d.push(f)}a.$parent.childrenRows=d}else a.$parent.childrenRows=b}),a.isCollapseDisabled=function(){return!a.$parent.childrenRows||0===a.$parent.childrenRows.length},a.getValue=function(){return a.row.model.name},a.getRowContent=function(){if(void 0!==a.row.model.content)return a.row.model.content;if(void 0!==a.pluginScope.content)return a.pluginScope.content;var b=a.row.rowsManager.gantt.options.value("rowContent");return void 0===b&&(b="{{row.model.name}}"),b},a.$watch("collapsed",function(b){if(a.$modelValue._collapsed!==b){var c=a.$modelValue._collapsed;a.$modelValue._collapsed=b,void 0!==c&&b!==c&&(a.gantt.api.tree.raise.collapsed(a,a.$modelValue,b),a.gantt.api.rows.refresh())}})}])}(),function(){"use strict";angular.module("gantt.tree").directive("ganttTreeBody",["GanttDirectiveBuilder","ganttLayout",function(a,b){var c=new a("ganttTreeBody","plugins/tree/treeBody.tmpl.html");return c.controller=function(a){var c=b.getScrollBarHeight();a.getLabelsCss=function(){var b={};if(a.maxHeight){var d=a.gantt.scroll.isHScrollbarVisible()?c:0;b["max-height"]=a.maxHeight-d-a.gantt.header.getHeight()+"px"}return b}},c.build()}])}(),function(){"use strict";angular.module("gantt.tree").directive("ganttTreeHeader",["GanttDirectiveBuilder",function(a){var b=new a("ganttTreeHeader","plugins/tree/treeHeader.tmpl.html");return b.build()}])}(),angular.module("gantt.tree.templates",[]).run(["$templateCache",function(a){a.put("plugins/tree/sideContentTree.tmpl.html",'<div class="gantt-side-content-tree" ng-controller="GanttTreeController">\n <gantt-tree-header>\n </gantt-tree-header>\n <gantt-tree-body>\n </gantt-tree-body>\n</div>\n'),a.put("plugins/tree/treeBody.tmpl.html",'<div class="gantt-tree-body" ng-style="getLabelsCss()">\n <div gantt-vertical-scroll-receiver>\n <div class="gantt-row-label-background">\n <div class="gantt-row-label gantt-row-height"\n ng-class="row.model.classes"\n ng-style="{\'height\': row.model.height}"\n ng-repeat="row in gantt.rowsManager.visibleRows track by row.model.id">\n \n </div>\n </div>\n <div ui-tree ng-controller="GanttUiTreeController" data-drag-enabled="false" data-empty-place-holder-enabled="false">\n <ol class="gantt-tree-root" ui-tree-nodes ng-model="rootRows">\n <li ng-repeat="row in rootRows" ui-tree-node\n ng-include="\'plugins/tree/treeBodyChildren.tmpl.html\'">\n </li>\n </ol>\n </div>\n </div>\n</div>\n'),a.put("plugins/tree/treeBodyChildren.tmpl.html",'<div ng-controller="GanttTreeNodeController"\n class="gantt-row-label gantt-row-height"\n ng-class="row.model.classes"\n ng-style="{\'height\': row.model.height}">\n <div class="gantt-valign-container">\n <div class="gantt-valign-content">\n <a ng-disabled="isCollapseDisabled()" data-nodrag\n class="gantt-tree-handle-button btn btn-xs"\n ng-class="{\'gantt-tree-collapsed\': collapsed, \'gantt-tree-expanded\': !collapsed}"\n ng-click="!isCollapseDisabled() && toggle()"><span\n class="gantt-tree-handle glyphicon glyphicon-chevron-down"\n ng-class="{\n \'glyphicon-chevron-right\': collapsed, \'glyphicon-chevron-down\': !collapsed,\n \'gantt-tree-collapsed\': collapsed, \'gantt-tree-expanded\': !collapsed}"></span>\n </a>\n <span gantt-row-label class="gantt-label-text" gantt-bind-compile-html="getRowContent()"/>\n </div>\n </div>\n</div>\n<ol ui-tree-nodes ng-class="{hidden: collapsed}" ng-model="childrenRows">\n <li ng-repeat="row in childrenRows" ui-tree-node>\n <div ng-include="\'plugins/tree/treeBodyChildren.tmpl.html\'"></div>\n </li>\n</ol>\n'),a.put("plugins/tree/treeHeader.tmpl.html",'<div class="gantt-tree-header" ng-style="{height: $parent.ganttHeaderHeight + \'px\'}">\n <div ng-if="$parent.ganttHeaderHeight" class="gantt-row-label gantt-row-label-header gantt-tree-row gantt-tree-header-row"><span class="gantt-label-text" gantt-bind-compile-html="getHeaderContent()"/></div>\n</div>\n')}]); +!function(){"use strict";angular.module("gantt.tree",["gantt","gantt.tree.templates","ui.tree"]).directive("ganttTree",["ganttUtils","$compile","$document",function(a,b,c){return{restrict:"E",require:"^gantt",scope:{enabled:"=?",header:"=?",content:"=?",headerContent:"=?",keepAncestorOnFilterRow:"=?"},link:function(a,d,e,f){var g=f.gantt.api;if(a.options&&"object"==typeof a.options.sortable)for(var h in a.options.sortable)a[h]=a.options[h];void 0===a.enabled&&(a.enabled=!0),void 0===a.header&&(a.header="Name"),void 0===a.headerContent&&(a.headerContent="{{getHeader()}}"),void 0===a.keepAncestorOnFilterRow&&(a.keepAncestorOnFilterRow=!1),g.directives.on["new"](a,function(d,e,f){if("ganttSideContent"===d){var g=e.$new();g.pluginScope=a;var h=c[0].createElement("div");angular.element(h).attr("data-ng-if","pluginScope.enabled"),angular.element(h).addClass("side-element");var i=c[0].createElement("gantt-side-content-tree");angular.element(h).append(i),f.append(b(h)(g))}})}}}])}(),function(){"use strict";angular.module("gantt.tree").directive("ganttRowTreeLabel",["GanttDirectiveBuilder",function(a){var b=new a("ganttRowTreeLabel");return b.restrict="A",b.templateUrl=void 0,b.build()}])}(),function(){"use strict";angular.module("gantt.tree").directive("ganttSideContentTree",["GanttDirectiveBuilder",function(a){var b=new a("ganttSideContentTree","plugins/tree/sideContentTree.tmpl.html");return b.build()}])}(),function(){"use strict";angular.module("gantt.tree").controller("GanttTreeController",["$scope","$filter","GanttHierarchy",function(a,b,c){a.rootRows=[],a.getHeader=function(){return a.pluginScope.header};var d=new c;a.pluginScope.$watchGroup(["keepAncestorOnFilterRow","enabled"],function(c){var e=c[0]&&c[1];if(e){var f=function(a,c,e){d.refresh(a);for(var f=[],g=0;g<a.length;g++){var h=d.children(a[g]);h&&0!==h.length||f.push(a[g])}var i=b("filter")(f,c,e),j=function(a){if(i.indexOf(a)>-1)return!0;for(var b=d.descendants(a),c=0;c<b.length;c++)if(i.indexOf(b[c])>-1)return!0;return!1};return b("filter")(a,j,e)};a.gantt.rowsManager.setFilterImpl(f)}else a.gantt.rowsManager.setFilterImpl(!1)});var e=function(b){for(var c=a.parent(b);void 0!==c;){if(void 0!==c&&c._collapsed)return!1;c=a.parent(c)}return!0},f=function(a){return a.filter(function(a){return e(a)})},g=function(b){for(var c=[],d=[],e=!1,f=0;f<b.length;f++){var g=a.parent(b[f]);void 0===g?d.push(b[f]):e=!0}var h=function(d){c.push(d);var e=a.children(d);if(void 0!==e&&e.length>0)for(var f=e.sort(function(a,c){return b.indexOf(a)-b.indexOf(c)}),g=0;g<f.length;g++)h(f[g])};for(f=0;f<d.length;f++)h(d[f]);return c};a.gantt.api.rows.addRowSorter(g),a.gantt.api.rows.addRowFilter(f),a.$on("$destroy",function(){a.gantt.api.rows.removeRowSorter(g),a.gantt.api.rows.removeRowFilter(f)});var h=function(){a.rootRows=d.refresh(a.gantt.rowsManager.filteredRows),a.gantt.rowsManager.filteredRows.length>0&&(a.gantt.api.rows.sort(),a.gantt.api.rows.refresh())};a.gantt.api.rows.on.remove(a,h),a.gantt.api.rows.on.add(a,h);var i=function(b){var c;return c="string"==typeof b?a.gantt.rowsManager.rowsMap[b]:b,void 0!==c?void 0===c._collapsed?!1:c._collapsed:void 0},j=function(b){var c;if(c="string"==typeof b?a.gantt.rowsManager.rowsMap[b]:b,void 0!==c){var d=a.nodeScopes[c.model.id];d.collapsed&&d.toggle()}},k=function(b){var c;if(c="string"==typeof b?a.gantt.rowsManager.rowsMap[b]:b,void 0!==c){var d=a.nodeScopes[c.model.id];d.collapsed||d.toggle()}},l=function(){return d};a.getHeaderContent=function(){return a.pluginScope.headerContent},a.gantt.api.registerMethod("tree","refresh",h,this),a.gantt.api.registerMethod("tree","isCollapsed",i,this),a.gantt.api.registerMethod("tree","expand",j,this),a.gantt.api.registerMethod("tree","collapse",k,this),a.gantt.api.registerEvent("tree","collapsed"),a.gantt.api.registerMethod("tree","getHierarchy",l,this),a.$watchCollection("gantt.rowsManager.filteredRows",function(){h()}),a.children=function(b){return void 0===b?a.rootRows:d.children(b)},a.parent=function(a){return d.parent(a)},a.nodeScopes={}}]).controller("GanttUiTreeController",["$scope",function(a){var b=function(){a.$broadcast("angular-ui-tree:collapse-all")},c=function(){a.$broadcast("angular-ui-tree:expand-all")};a.gantt.api.registerMethod("tree","collapseAll",b,a),a.gantt.api.registerMethod("tree","expandAll",c,a)}]).controller("GanttTreeNodeController",["$scope",function(a){a.$parent.nodeScopes[a.row.model.id]=a,a.$on("$destroy",function(){delete a.$parent.nodeScopes[a.row.model.id]}),a.$watch("children(row)",function(b){if(b){for(var c=a.row.rowsManager.filteredRows,d=[],e=0;e<b.length;e++){var f=b[e];c.indexOf(f)>-1&&d.push(f)}a.$parent.childrenRows=d}else a.$parent.childrenRows=b}),a.isCollapseDisabled=function(){return!a.$parent.childrenRows||0===a.$parent.childrenRows.length},a.getValue=function(){return a.row.model.name},a.getRowContent=function(){if(void 0!==a.row.model.content)return a.row.model.content;if(void 0!==a.pluginScope.content)return a.pluginScope.content;var b=a.row.rowsManager.gantt.options.value("rowContent");return void 0===b&&(b="{{row.model.name}}"),b},a.$watch("collapsed",function(b){if(a.$modelValue._collapsed!==b){var c=a.$modelValue._collapsed;a.$modelValue._collapsed=b,void 0!==c&&b!==c&&(a.gantt.api.tree.raise.collapsed(a,a.$modelValue,b),a.gantt.api.rows.refresh())}})}])}(),function(){"use strict";angular.module("gantt.tree").directive("ganttTreeBody",["GanttDirectiveBuilder","ganttLayout",function(a,b){var c=new a("ganttTreeBody","plugins/tree/treeBody.tmpl.html");return c.controller=function(a){var c=b.getScrollBarHeight();a.getLabelsCss=function(){var b={};if(a.maxHeight){var d=a.gantt.scroll.isHScrollbarVisible()?c:0;b["max-height"]=a.maxHeight-d-a.gantt.header.getHeight()+"px"}return b}},c.build()}])}(),function(){"use strict";angular.module("gantt.tree").directive("ganttTreeHeader",["GanttDirectiveBuilder",function(a){var b=new a("ganttTreeHeader","plugins/tree/treeHeader.tmpl.html");return b.build()}])}(),angular.module("gantt.tree.templates",[]).run(["$templateCache",function(a){a.put("plugins/tree/sideContentTree.tmpl.html",'<div class="gantt-side-content-tree" ng-controller="GanttTreeController">\n <gantt-tree-header>\n </gantt-tree-header>\n <gantt-tree-body>\n </gantt-tree-body>\n</div>\n'),a.put("plugins/tree/treeBody.tmpl.html",'<div class="gantt-tree-body" ng-style="getLabelsCss()">\n <div gantt-vertical-scroll-receiver>\n <div class="gantt-row-label-background">\n <div class="gantt-row-label gantt-row-height"\n ng-class="row.model.classes"\n ng-style="{\'height\': row.model.height}"\n ng-repeat="row in gantt.rowsManager.visibleRows track by row.model.id">\n \n </div>\n </div>\n <div ui-tree ng-controller="GanttUiTreeController" data-drag-enabled="false" data-empty-place-holder-enabled="false">\n <ol class="gantt-tree-root" ui-tree-nodes ng-model="rootRows">\n <li ng-repeat="row in rootRows" ui-tree-node\n ng-include="\'plugins/tree/treeBodyChildren.tmpl.html\'">\n </li>\n </ol>\n </div>\n </div>\n</div>\n'),a.put("plugins/tree/treeBodyChildren.tmpl.html",'<div ng-controller="GanttTreeNodeController"\n class="gantt-row-label gantt-row-height"\n ng-class="row.model.classes"\n ng-style="{\'height\': row.model.height}">\n <div class="gantt-valign-container">\n <div class="gantt-valign-content">\n <a ng-disabled="isCollapseDisabled()" data-nodrag\n class="gantt-tree-handle-button btn btn-xs"\n ng-class="{\'gantt-tree-collapsed\': collapsed, \'gantt-tree-expanded\': !collapsed}"\n ng-click="!isCollapseDisabled() && toggle()"><span\n class="gantt-tree-handle glyphicon glyphicon-chevron-down"\n ng-class="{\n \'glyphicon-chevron-right\': collapsed, \'glyphicon-chevron-down\': !collapsed,\n \'gantt-tree-collapsed\': collapsed, \'gantt-tree-expanded\': !collapsed}"></span>\n </a>\n <span gantt-row-label class="gantt-label-text" gantt-bind-compile-html="getRowContent()"/>\n </div>\n </div>\n</div>\n<ol ui-tree-nodes ng-class="{hidden: collapsed}" ng-model="childrenRows">\n <li ng-repeat="row in childrenRows" ui-tree-node>\n <div ng-include="\'plugins/tree/treeBodyChildren.tmpl.html\'"></div>\n </li>\n</ol>\n'),a.put("plugins/tree/treeHeader.tmpl.html",'<div class="gantt-tree-header" ng-style="{height: $parent.ganttHeaderHeight + \'px\'}">\n <div ng-if="$parent.ganttHeaderHeight" class="gantt-row-label gantt-row-label-header gantt-tree-row gantt-tree-header-row"><span class="gantt-label-text" gantt-bind-compile-html="getHeaderContent()"/></div>\n</div>\n')}]); //# sourceMappingURL=angular-gantt-tree-plugin.min.js.map \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tree-plugin.min.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tree-plugin.min.js.map index d51d6226f5800db51324923aae3a8c98a1b25518..d7c61f1bc0bf279af43e23d75ad24e6dd4e5366d 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tree-plugin.min.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt-tree-plugin.min.js.map @@ -1 +1 @@ -{"version":3,"file":"angular-gantt-tree-plugin.min.js","sources":["../src/plugins/tree.js","../src/plugins/tree/rowTreeLabel.directive.js","../src/plugins/tree/sideContentTree.directive.js","../src/plugins/tree/tree.controller.js","../src/plugins/tree/treeBody.directive.js","../src/plugins/tree/treeHeader.directive.js","../.tmp/generated/plugins/tree/html2js.js"],"names":["angular","module","directive","utils","$compile","$document","restrict","require","scope","enabled","header","content","headerContent","keepAncestorOnFilterRow","link","element","attrs","ganttCtrl","api","gantt","options","option","sortable","undefined","directives","on","directiveName","sideContentScope","sideContentElement","labelsScope","$new","pluginScope","ifElement","createElement","attr","addClass","labelsElement","append","Builder","builder","templateUrl","build","controller","$scope","$filter","Hierarchy","rootRows","getHeader","hierarchy","$watchGroup","value","keepAncestor","filterImpl","sortedRows","filterRow","filterRowComparator","refresh","leaves","forEach","row","children","length","push","filteredLeaves","filterRowKeepAncestor","indexOf","descendants","i","rowsManager","setFilterImpl","isVisible","parentRow","parent","_collapsed","filterRowsFunction","rows","filter","sortRowsFunction","hasParent","rowParent","handleChildren","sortedChildren","sort","a","b","child","addRowSorter","addRowFilter","$on","removeRowSorter","removeRowFilter","filteredRows","remove","add","isRowCollapsed","rowId","rowsMap","expandRow","rowScope","nodeScopes","model","id","collapsed","toggle","collapseRow","getHierarchy","getHeaderContent","registerMethod","this","registerEvent","$watchCollection","collapseAll","expandAll","$parent","$watch","newValue","visibleRows","filteredChildrenRows","childRow","childrenRows","isCollapseDisabled","getValue","name","getRowContent","$modelValue","oldValue","tree","raise","layout","hScrollBarHeight","getScrollBarHeight","getLabelsCss","css","maxHeight","bodyScrollBarHeight","scroll","isHScrollbarVisible","getHeight","run","$templateCache","put"],"mappings":"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"} \ No newline at end of file +{"version":3,"sources":["../src/plugins/tree.js","../src/plugins/tree/rowTreeLabel.directive.js","../src/plugins/tree/sideContentTree.directive.js","../src/plugins/tree/tree.controller.js","../src/plugins/tree/treeBody.directive.js","../src/plugins/tree/treeHeader.directive.js","../.tmp/generated/plugins/tree/html2js.js"],"names":["angular","module","directive","utils","$compile","$document","restrict","require","scope","enabled","header","content","headerContent","keepAncestorOnFilterRow","link","element","attrs","ganttCtrl","api","gantt","options","option","sortable","undefined","directives","on","directiveName","sideContentScope","sideContentElement","labelsScope","$new","pluginScope","ifElement","createElement","attr","addClass","labelsElement","append","Builder","builder","templateUrl","build","controller","$scope","$filter","Hierarchy","rootRows","getHeader","hierarchy","$watchGroup","value","keepAncestor","filterImpl","sortedRows","filterRow","filterRowComparator","refresh","leaves","i","length","children","push","filteredLeaves","filterRowKeepAncestor","row","indexOf","descendants","rowsManager","setFilterImpl","isVisible","parentRow","parent","_collapsed","filterRowsFunction","rows","filter","sortRowsFunction","hasParent","rowParent","handleChildren","sortedChildren","sort","a","b","addRowSorter","addRowFilter","$on","removeRowSorter","removeRowFilter","filteredRows","remove","add","isRowCollapsed","rowId","rowsMap","expandRow","rowScope","nodeScopes","model","id","collapsed","toggle","collapseRow","getHierarchy","getHeaderContent","registerMethod","this","registerEvent","$watchCollection","collapseAll","$broadcast","expandAll","$parent","$watch","newValue","visibleRows","filteredChildrenRows","childRow","childrenRows","isCollapseDisabled","getValue","name","getRowContent","$modelValue","oldValue","tree","raise","layout","hScrollBarHeight","getScrollBarHeight","getLabelsCss","css","maxHeight","bodyScrollBarHeight","scroll","isHScrollbarVisible","getHeight","run","$templateCache","put"],"mappings":";;;;;;;;CAAC,WACG,YACAA,SAAQC,OAAO,cAAe,QAAS,uBAAwB,YAAYC,UAAU,aAAc,aAAc,WAAY,YAAa,SAASC,EAAOC,EAAUC,GAIhK,OACIC,SAAU,IACVC,QAAS,SACTC,OACIC,QAAS,KACTC,OAAQ,KACRC,QAAS,KACTC,cAAe,KACfC,wBAAyB,MAE7BC,KAAM,SAASN,EAAOO,EAASC,EAAOC,GAClC,GAAIC,GAAMD,EAAUE,MAAMD,GAG1B,IAAIV,EAAMY,SAA8C,gBAA5BZ,GAAMY,QAAgB,SAC9C,IAAK,GAAIC,KAAUb,GAAMY,QAAQE,SAC7Bd,EAAMa,GAAUb,EAAMY,QAAQC,EAIhBE,UAAlBf,EAAMC,UACND,EAAMC,SAAU,GAGCc,SAAjBf,EAAME,SACNF,EAAME,OAAS,QAGSa,SAAxBf,EAAMI,gBACNJ,EAAMI,cAAgB,mBAGYW,SAAlCf,EAAMK,0BACNL,EAAMK,yBAA0B,GAGpCK,EAAIM,WAAWC,GAAfP,OAAsBV,EAAO,SAASkB,EAAeC,EAAkBC,GACnE,GAAsB,qBAAlBF,EAAsC,CACtC,GAAIG,GAAcF,EAAiBG,MACnCD,GAAYE,YAAcvB,CAE1B,IAAIwB,GAAY3B,EAAU,GAAG4B,cAAc,MAC3CjC,SAAQe,QAAQiB,GAAWE,KAAK,aAAc,uBAC9ClC,QAAQe,QAAQiB,GAAWG,SAAS,eAEpC,IAAIC,GAAgB/B,EAAU,GAAG4B,cAAc,0BAC/CjC,SAAQe,QAAQiB,GAAWK,OAAOD,GAElCR,EAAmBS,OAAOjC,EAAS4B,GAAWH,eCtDrE,WACG,YACA7B,SAAQC,OAAO,cAAcC,UAAU,qBAAsB,wBAAyB,SAASoC,GAC3F,GAAIC,GAAU,GAAID,GAAQ,oBAG1B,OAFAC,GAAQjC,SAAW,IACnBiC,EAAQC,YAAcjB,OACfgB,EAAQE,cCNtB,WACG,YACAzC,SAAQC,OAAO,cAAcC,UAAU,wBAAyB,wBAAyB,SAASoC,GAC9F,GAAIC,GAAU,GAAID,GAAQ,uBAAwB,yCAClD,OAAOC,GAAQE,cCJtB,WACG,YACAzC,SAAQC,OAAO,cAAcyC,WAAW,uBAAwB,SAAU,UAAW,iBAAkB,SAASC,EAAQC,EAASC,GAC7HF,EAAOG,YAEPH,EAAOI,UAAY,WACf,MAAOJ,GAAOZ,YAAYrB,OAG9B,IAAIsC,GAAY,GAAIH,EAEpBF,GAAOZ,YAAYkB,aAAa,0BAA2B,WAAY,SAASC,GAC5E,GAAIC,GAAeD,EAAM,IAAMA,EAAM,EAErC,IAAIC,EAAc,CACd,GAAIC,GAAa,SAASC,EAAYC,EAAWC,GAC7CP,EAAUQ,QAAQH,EAGlB,KAAK,GADDI,MACKC,EAAI,EAAGA,EAAIL,EAAWM,OAAQD,IAAK,CACxC,GAAIE,GAAWZ,EAAUY,SAASP,EAAWK,GACxCE,IAAgC,IAApBA,EAASD,QACtBF,EAAOI,KAAKR,EAAWK,IAI/B,GAAII,GAAiBlB,EAAQ,UAAUa,EAAQH,EAAWC,GAEtDQ,EAAwB,SAASC,GACjC,GAAIF,EAAeG,QAAQD,GAAO,GAC9B,OAAO,CAKX,KAAK,GAFDE,GAAclB,EAAUkB,YAAYF,GAE/BN,EAAI,EAAGA,EAAIQ,EAAYP,OAAQD,IACpC,GAAII,EAAeG,QAAQC,EAAYR,IAAM,GACzC,OAAO,CAIf,QAAO,EAGX,OAAOd,GAAQ,UAAUS,EAAYU,EAAuBR,GAEhEZ,GAAOxB,MAAMgD,YAAYC,cAAchB,OAEvCT,GAAOxB,MAAMgD,YAAYC,eAAc,IAI/C,IAAIC,GAAY,SAASL,GAErB,IADA,GAAIM,GAAY3B,EAAO4B,OAAOP,GACTzC,SAAd+C,GAAyB,CAC5B,GAAkB/C,SAAd+C,GAA2BA,EAAUE,WACrC,OAAO,CAEXF,GAAY3B,EAAO4B,OAAOD,GAE9B,OAAO,GAGPG,EAAqB,SAASC,GAC9B,MAAOA,GAAKC,OAAO,SAASX,GACxB,MAAOK,GAAUL,MAIrBY,EAAmB,SAASF,GAM5B,IAAK,GALDrB,MACAP,KAEA+B,GAAY,EAEPnB,EAAE,EAAGA,EAAEgB,EAAKf,OAAQD,IAAK,CAC9B,GAAIoB,GAAYnC,EAAO4B,OAAOG,EAAKhB,GACjBnC,UAAduD,EACAhC,EAASe,KAAKa,EAAKhB,IAEnBmB,GAAY,EAIpB,GAAIE,GAAiB,SAASf,GAC1BX,EAAWQ,KAAKG,EAChB,IAAIJ,GAAWjB,EAAOiB,SAASI,EAG/B,IAAiBzC,SAAbqC,GAA0BA,EAASD,OAAS,EAK5C,IAAK,GAJDqB,GAAiBpB,EAASqB,KAAK,SAASC,EAAGC,GAC3C,MAAOT,GAAKT,QAAQiB,GAAKR,EAAKT,QAAQkB,KAGjCzB,EAAE,EAAEA,EAAEsB,EAAerB,OAAOD,IACjCqB,EAAeC,EAAetB,IAK1C,KAAKA,EAAE,EAAGA,EAAEZ,EAASa,OAAQD,IACzBqB,EAAejC,EAASY,GAG5B,OAAOL,GAEXV,GAAOxB,MAAMD,IAAIwD,KAAKU,aAAaR,GACnCjC,EAAOxB,MAAMD,IAAIwD,KAAKW,aAAaZ,GAEnC9B,EAAO2C,IAAI,WAAY,WACnB3C,EAAOxB,MAAMD,IAAIwD,KAAKa,gBAAgBX,GACtCjC,EAAOxB,MAAMD,IAAIwD,KAAKc,gBAAgBf,IAG1C,IAAIjB,GAAU,WACVb,EAAOG,SAAWE,EAAUQ,QAAQb,EAAOxB,MAAMgD,YAAYsB,cAEzD9C,EAAOxB,MAAMgD,YAAYsB,aAAa9B,OAAS,IAC/ChB,EAAOxB,MAAMD,IAAIwD,KAAKO,OACtBtC,EAAOxB,MAAMD,IAAIwD,KAAKlB,WAI9Bb,GAAOxB,MAAMD,IAAIwD,KAAKjD,GAAGiE,OAAO/C,EAAQa,GACxCb,EAAOxB,MAAMD,IAAIwD,KAAKjD,GAAGkE,IAAIhD,EAAQa,EAErC,IAAIoC,GAAiB,SAASC,GAC1B,GAAI7B,EAMJ,OAJIA,GADiB,gBAAV6B,GACDlD,EAAOxB,MAAMgD,YAAY2B,QAAQD,GAEjCA,EAEEtE,SAARyC,EAGmBzC,SAAnByC,EAAIQ,YACG,EAEJR,EAAIQ,WANX,QASAuB,EAAY,SAASF,GACrB,GAAI7B,EAMJ,IAJIA,EADiB,gBAAV6B,GACDlD,EAAOxB,MAAMgD,YAAY2B,QAAQD,GAEjCA,EAEEtE,SAARyC,EAAJ,CAIA,GAAIgC,GAAWrD,EAAOsD,WAAWjC,EAAIkC,MAAMC,GACvCH,GAASI,WACTJ,EAASK,WAIbC,EAAc,SAAST,GACvB,GAAI7B,EAMJ,IAJIA,EADiB,gBAAV6B,GACDlD,EAAOxB,MAAMgD,YAAY2B,QAAQD,GAEjCA,EAEEtE,SAARyC,EAAJ,CAIA,GAAIgC,GAAWrD,EAAOsD,WAAWjC,EAAIkC,MAAMC,GACtCH,GAASI,WACVJ,EAASK,WAIbE,EAAe,WACf,MAAOvD,GAGXL,GAAO6D,iBAAmB,WACtB,MAAO7D,GAAOZ,YAAYnB,eAG9B+B,EAAOxB,MAAMD,IAAIuF,eAAe,OAAQ,UAAWjD,EAASkD,MAC5D/D,EAAOxB,MAAMD,IAAIuF,eAAe,OAAQ,cAAeb,EAAgBc,MACvE/D,EAAOxB,MAAMD,IAAIuF,eAAe,OAAQ,SAAUV,EAAWW,MAC7D/D,EAAOxB,MAAMD,IAAIuF,eAAe,OAAQ,WAAYH,EAAaI,MAEjE/D,EAAOxB,MAAMD,IAAIyF,cAAc,OAAQ,aAEvChE,EAAOxB,MAAMD,IAAIuF,eAAe,OAAQ,eAAgBF,EAAcG,MAEtE/D,EAAOiE,iBAAiB,iCAAkC,WACtDpD,MAGJb,EAAOiB,SAAW,SAASI,GACvB,MAAYzC,UAARyC,EACOrB,EAAOG,SAEXE,EAAUY,SAASI,IAG9BrB,EAAO4B,OAAS,SAASP,GACrB,MAAOhB,GAAUuB,OAAOP,IAG5BrB,EAAOsD,iBACPvD,WAAW,yBAA0B,SAAU,SAASC,GACxD,GAAIkE,GAAc,WACdlE,EAAOmE,WAAW,iCAGlBC,EAAY,WACZpE,EAAOmE,WAAW,8BAGtBnE,GAAOxB,MAAMD,IAAIuF,eAAe,OAAQ,cAAeI,EAAalE,GACpEA,EAAOxB,MAAMD,IAAIuF,eAAe,OAAQ,YAAaM,EAAWpE,MAChED,WAAW,2BAA4B,SAAU,SAASC,GAC1DA,EAAOqE,QAAQf,WAAWtD,EAAOqB,IAAIkC,MAAMC,IAAMxD,EACjDA,EAAO2C,IAAI,WAAY,iBACZ3C,GAAOqE,QAAQf,WAAWtD,EAAOqB,IAAIkC,MAAMC,MAGtDxD,EAAOsE,OAAO,gBAAiB,SAASC,GACpC,GAAIA,EAAU,CAMV,IAAK,GAHDC,GAAcxE,EAAOqB,IAAIG,YAAYsB,aAErC2B,KACK1D,EAAI,EAAGA,EAAIwD,EAASvD,OAAQD,IAAK,CACtC,GAAI2D,GAAWH,EAASxD,EACpByD,GAAYlD,QAAQoD,GAAY,IAChCD,EAAqBvD,KAAKwD,GAIlC1E,EAAOqE,QAAQM,aAAeF,MAE9BzE,GAAOqE,QAAQM,aAAeJ,IAItCvE,EAAO4E,mBAAqB,WACxB,OAAQ5E,EAAOqE,QAAQM,cAAuD,IAAvC3E,EAAOqE,QAAQM,aAAa3D,QAGvEhB,EAAO6E,SAAW,WACd,MAAO7E,GAAOqB,IAAIkC,MAAMuB,MAG5B9E,EAAO+E,cAAgB,WACnB,GAAiCnG,SAA7BoB,EAAOqB,IAAIkC,MAAMvF,QACjB,MAAOgC,GAAOqB,IAAIkC,MAAMvF,OAE5B,IAAmCY,SAA/BoB,EAAOZ,YAAYpB,QACnB,MAAOgC,GAAOZ,YAAYpB,OAG9B,IAAIA,GAAUgC,EAAOqB,IAAIG,YAAYhD,MAAMC,QAAQ8B,MAAM,aAIzD,OAHgB3B,UAAZZ,IACAA,EAAU,sBAEPA,GAGXgC,EAAOsE,OAAO,YAAa,SAASC,GAChC,GAAIvE,EAAOgF,YAAYnD,aAAe0C,EAAU,CAC5C,GAAIU,GAAWjF,EAAOgF,YAAYnD,UAClC7B,GAAOgF,YAAYnD,WAAa0C,EACf3F,SAAbqG,GAA0BV,IAAaU,IACvCjF,EAAOxB,MAAMD,IAAI2G,KAAKC,MAAM1B,UAAUzD,EAAQA,EAAOgF,YAAaT,GAClEvE,EAAOxB,MAAMD,IAAIwD,KAAKlB,oBCnRzC,WACG,YACAxD,SAAQC,OAAO,cAAcC,UAAU,iBAAkB,wBAAyB,cAAe,SAASoC,EAASyF,GAC/G,GAAIxF,GAAU,GAAID,GAAQ,gBAAiB,kCAe3C,OAdAC,GAAQG,WAAa,SAASC,GAC1B,GAAIqF,GAAmBD,EAAOE,oBAE9BtF,GAAOuF,aAAe,WAClB,GAAIC,KAEJ,IAAIxF,EAAOyF,UAAW,CAClB,GAAIC,GAAsB1F,EAAOxB,MAAMmH,OAAOC,sBAAwBP,EAAmB,CACzFG,GAAI,cAAgBxF,EAAOyF,UAAYC,EAAsB1F,EAAOxB,MAAMT,OAAO8H,YAAc,KAGnG,MAAOL,KAGR5F,EAAQE,cClBtB,WACG,YACAzC,SAAQC,OAAO,cAAcC,UAAU,mBAAoB,wBAAyB,SAASoC,GACzF,GAAIC,GAAU,GAAID,GAAQ,kBAAmB,oCAC7C,OAAOC,GAAQE,cCJvBzC,QAAQC,OAAO,2BAA4BwI,KAAK,iBAAkB,SAASC,GACvEA,EAAeC,IAAI,yCACf,yLAOJD,EAAeC,IAAI,kCACf,23BAoBJD,EAAeC,IAAI,0CACf,6tCAyBJD,EAAeC,IAAI,oCACf","file":"angular-gantt-tree-plugin.min.js"} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.css b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.css index f090362cfbd15d5e290dc8afe03252a9d1c4b61e..1cc83012e3f9b0cd5213e6b321cb45e7bd36bcfe 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.css +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.css @@ -2,25 +2,6 @@ line-height: normal; } -.gantt-side-content, -.gantt-body { - pointer-events: none; -} - -.gantt-side-background, -.gantt-body-background, -.gantt-row { - pointer-events: auto; -} - -.gantt a, -.gantt input, -.gantt *[ng-click], -.gantt *[data-ng-click], -.gantt *[x-ng-click] { - pointer-events: auto; -} - .gantt-scrollable { overflow-x: auto; border-left: 1px solid #dddddd; @@ -37,6 +18,7 @@ .gantt-side, .gantt-task { cursor: default; + z-index: 10; /* Tasks are displayed over everything else */ } .gantt-header { @@ -61,7 +43,6 @@ position: relative; top: 50%; -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); transform: translateY(-50%); } @@ -172,6 +153,7 @@ .gantt-body-rows { overflow-x: hidden; + overflow-y: hidden; } .gantt-body-background { @@ -271,11 +253,8 @@ margin: auto; top: 0; bottom: 0; - width: 0.6em !important; + min-width: 0.6em; height: 80%; - - background-color: grey; - border-radius: 0.3em; } .gantt-task-background { diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.js index dd8a4c7a3f9695481f3d1edf55d17f8ae37c15aa..39ee90f4a2f467fc4bbcf29343e0c885b63b42ef 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.js @@ -1,5 +1,5 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com @@ -109,6 +109,14 @@ Github: https://github.com/angular-gantt/angular-gantt.git this.apiId = utils.newId(); }; + function registerEventWithAngular(eventId, handler, gantt, _this) { + return $rootScope.$on(eventId, function() { + var args = Array.prototype.slice.call(arguments); + args.splice(0, 1); //remove evt argument + handler.apply(_this ? _this : gantt.api, args); + }); + } + /** * @ngdoc function * @name gantt.class:suppressEvents @@ -233,14 +241,6 @@ Github: https://github.com/angular-gantt/angular-gantt.git }; }; - function registerEventWithAngular(eventId, handler, gantt, _this) { - return $rootScope.$on(eventId, function() { - var args = Array.prototype.slice.call(arguments); - args.splice(0, 1); //remove evt argument - handler.apply(_this ? _this : gantt.api, args); - }); - } - /** * @ngdoc function * @name registerEventsFromObject @@ -422,6 +422,7 @@ Github: https://github.com/angular-gantt/angular-gantt.git this.default = options.default; this.color = options.color; this.classes = options.classes; + this.internal = options.internal; }; TimeFrame.prototype.updateView = function() { @@ -672,23 +673,25 @@ Github: https://github.com/angular-gantt/angular-gantt.git var timeFrames = []; var dateFrames = filterDateFrames(this.dateFrames, date); - angular.forEach(dateFrames, function(dateFrame) { - if (dateFrame !== undefined) { - angular.forEach(dateFrame.targets, function(timeFrameMappingName) { - var timeFrameMapping = this.timeFrameMappings[timeFrameMappingName]; + for (var i=0; i < dateFrames.length; i++) { + if (dateFrames[i] !== undefined) { + var targets = dateFrames[i].targets; + + for (var j=0; j < targets.length; j++) { + var timeFrameMapping = this.timeFrameMappings[targets[j]]; if (timeFrameMapping !== undefined) { // If a timeFrame mapping is found timeFrames.push(timeFrameMapping.getTimeFrames()); } else { // If no timeFrame mapping is found, try using direct timeFrame - var timeFrame = this.timeFrames[timeFrameMappingName]; + var timeFrame = this.timeFrames[targets[j]]; if (timeFrame !== undefined) { timeFrames.push(timeFrame); } } - }, this); + } } - }, this); + } var dateYear = date.year(); var dateMonth = date.month(); @@ -703,52 +706,48 @@ Github: https://github.com/angular-gantt/angular-gantt.git }); } - angular.forEach(timeFrames, function(timeFrame) { - timeFrame = timeFrame.clone(); + for (i=0; i < timeFrames.length; i++) { + var cTimeFrame = timeFrames[i].clone(); - if (timeFrame.start !== undefined) { - timeFrame.start.year(dateYear); - timeFrame.start.month(dateMonth); - timeFrame.start.date(dateDate); + if (cTimeFrame.start !== undefined) { + cTimeFrame.start.year(dateYear); + cTimeFrame.start.month(dateMonth); + cTimeFrame.start.date(dateDate); } - if (timeFrame.end !== undefined) { - timeFrame.end.year(dateYear); - timeFrame.end.month(dateMonth); - timeFrame.end.date(dateDate); + if (cTimeFrame.end !== undefined) { + cTimeFrame.end.year(dateYear); + cTimeFrame.end.month(dateMonth); + cTimeFrame.end.date(dateDate); - if (moment(timeFrame.end).startOf('day') === timeFrame.end) { - timeFrame.end.add(1, 'day'); + if (moment(cTimeFrame.end).startOf('day') === cTimeFrame.end) { + cTimeFrame.end.add(1, 'day'); } } - validatedTimeFrames.push(timeFrame); - }); + validatedTimeFrames.push(cTimeFrame); + } return validatedTimeFrames; }; /** - * Solve timeFrames using two rules. - * - * 1) If at least one working timeFrame is defined, everything outside - * defined timeFrames is considered as non-working. Else it's considered - * as working. + * Solve timeFrames. * - * 2) Smaller timeFrames have priority over larger one. + * Smaller timeFrames have priority over larger one. * * @param {array} timeFrames Array of timeFrames to solve * @param {moment} startDate * @param {moment} endDate */ Calendar.prototype.solve = function(timeFrames, startDate, endDate) { - var defaultWorking = timeFrames.length === 0; var color; var classes; var minDate; var maxDate; - angular.forEach(timeFrames, function(timeFrame) { + for (var i=0; i<timeFrames.length; i++) { + var timeFrame = timeFrames[i]; if (minDate === undefined || minDate > timeFrame.start) { minDate = timeFrame.start; } @@ -764,7 +763,7 @@ Github: https://github.com/angular-gantt/angular-gantt.git } classes = classes.concat(timeFrame.classes); } - }); + } if (startDate === undefined) { startDate = minDate; @@ -774,66 +773,89 @@ Github: https://github.com/angular-gantt/angular-gantt.git endDate = maxDate; } - var solvedTimeFrames = [new TimeFrame({start: startDate, end: endDate, working: defaultWorking, magnet: false, color: color, classes: classes})]; + var solvedTimeFrames = [new TimeFrame({start: startDate, end: endDate, internal: true})]; timeFrames = $filter('filter')(timeFrames, function(timeFrame) { return (timeFrame.start === undefined || timeFrame.start < endDate) && (timeFrame.end === undefined || timeFrame.end > startDate); }); + for (i=0; i<timeFrames.length; i++) { + var cTimeFrame = timeFrames[i]; + if (!cTimeFrame.start) { + cTimeFrame.start = startDate; + } + if (!cTimeFrame.end) { + cTimeFrame.end = endDate; + } + } + var orderedTimeFrames = $filter('orderBy')(timeFrames, function(timeFrame) { return -timeFrame.getDuration(); }); - angular.forEach(orderedTimeFrames, function(timeFrame) { + var k; + for (i=0; i<orderedTimeFrames.length; i++) { + var oTimeFrame = orderedTimeFrames[i]; + var tmpSolvedTimeFrames = solvedTimeFrames.slice(); - var i=0; + k=0; var dispatched = false; var treated = false; - angular.forEach(solvedTimeFrames, function(solvedTimeFrame) { + + for (var j=0; j<solvedTimeFrames.length; j++) { + var sTimeFrame = solvedTimeFrames[j]; + if (!treated) { - if (timeFrame.end > solvedTimeFrame.start && timeFrame.start < solvedTimeFrame.end) { + if (!oTimeFrame.end && !oTimeFrame.start) { + // timeFrame is infinite. + tmpSolvedTimeFrames.splice(k, 0, oTimeFrame); + treated = true; + dispatched = false; + } else if (oTimeFrame.end > sTimeFrame.start && oTimeFrame.start < sTimeFrame.end) { // timeFrame is included in this solvedTimeFrame. // solvedTimeFrame:|ssssssssssssssssssssssssssssssssss| // timeFrame: |tttttt| // result:|sssssssss|tttttt|sssssssssssssssss| - var newSolvedTimeFrame = solvedTimeFrame.clone(); + var newSolvedTimeFrame = sTimeFrame.clone(); - solvedTimeFrame.end = moment(timeFrame.start); - newSolvedTimeFrame.start = moment(timeFrame.end); + sTimeFrame.end = moment(oTimeFrame.start); + newSolvedTimeFrame.start = moment(oTimeFrame.end); - tmpSolvedTimeFrames.splice(i + 1, 0, timeFrame.clone(), newSolvedTimeFrame); + tmpSolvedTimeFrames.splice(k + 1, 0, oTimeFrame.clone(), newSolvedTimeFrame); treated = true; dispatched = false; - } else if (!dispatched && timeFrame.start < solvedTimeFrame.end) { + } else if (!dispatched && oTimeFrame.start < sTimeFrame.end) { // timeFrame is dispatched on two solvedTimeFrame. // First part // solvedTimeFrame:|sssssssssssssssssssssssssssssssssss|s+1;s+1;s+1;s+1;s+1;s+1| // timeFrame: |tttttt| // result:|sssssssssssssssssssssssssssssss|tttttt|;s+1;s+1;s+1;s+1;s+1| - solvedTimeFrame.end = moment(timeFrame.start); - tmpSolvedTimeFrames.splice(i + 1, 0, timeFrame.clone()); + sTimeFrame.end = moment(oTimeFrame.start); + tmpSolvedTimeFrames.splice(k + 1, 0, oTimeFrame.clone()); dispatched = true; - } else if (dispatched && timeFrame.end > solvedTimeFrame.start) { + } else if (dispatched && oTimeFrame.end > sTimeFrame.start) { // timeFrame is dispatched on two solvedTimeFrame. // Second part - solvedTimeFrame.start = moment(timeFrame.end); + sTimeFrame.start = moment(oTimeFrame.end); dispatched = false; treated = true; } - i++; + k++; } - }); + } solvedTimeFrames = tmpSolvedTimeFrames; - }); + } solvedTimeFrames = $filter('filter')(solvedTimeFrames, function(timeFrame) { - return (timeFrame.start === undefined || timeFrame.start < endDate) && (timeFrame.end === undefined || timeFrame.end > startDate); + return !timeFrame.internal && + (timeFrame.start === undefined || timeFrame.start < endDate) && + (timeFrame.end === undefined || timeFrame.end > startDate); }); return solvedTimeFrames; @@ -941,16 +963,26 @@ Github: https://github.com/angular-gantt/angular-gantt.git var self = this; if (self.calendar !== undefined && (self.timeFramesNonWorkingMode !== 'hidden' || self.timeFramesWorkingMode !== 'hidden')) { - var buildPushTimeFrames = function(timeFrames, startDate, endDate) { - return function(timeFrame) { - var start = timeFrame.start; + var cDate = self.date; + var cDateStartOfDay = moment(cDate).startOf('day'); + var cDateNextDay = cDateStartOfDay.add(1, 'day'); + var i; + while (cDate < self.endDate) { + var timeFrames = self.calendar.getTimeFrames(cDate); + var nextCDate = moment.min(cDateNextDay, self.endDate); + timeFrames = self.calendar.solve(timeFrames, cDate, nextCDate); + var cTimeFrames = []; + for (i=0; i < timeFrames.length; i++) { + var cTimeFrame = timeFrames[i]; + + var start = cTimeFrame.start; if (start === undefined) { - start = startDate; + start = cDate; } - var end = timeFrame.end; + var end = cTimeFrame.end; if (end === undefined) { - end = endDate; + end = nextCDate; } if (start < self.date) { @@ -961,24 +993,13 @@ Github: https://github.com/angular-gantt/angular-gantt.git end = self.endDate; } - timeFrame = timeFrame.clone(); + cTimeFrame = cTimeFrame.clone(); - timeFrame.start = moment(start); - timeFrame.end = moment(end); - - timeFrames.push(timeFrame); - }; - }; + cTimeFrame.start = moment(start); + cTimeFrame.end = moment(end); - var cDate = self.date; - var cDateStartOfDay = moment(cDate).startOf('day'); - var cDateNextDay = cDateStartOfDay.add(1, 'day'); - while (cDate < self.endDate) { - var timeFrames = self.calendar.getTimeFrames(cDate); - var nextCDate = moment.min(cDateNextDay, self.endDate); - timeFrames = self.calendar.solve(timeFrames, cDate, nextCDate); - var cTimeFrames = []; - angular.forEach(timeFrames, buildPushTimeFrames(cTimeFrames, cDate, nextCDate)); + cTimeFrames.push(cTimeFrame); + } self.timeFrames = self.timeFrames.concat(cTimeFrames); var cDateKey = getDateKey(cDate); @@ -989,7 +1010,9 @@ Github: https://github.com/angular-gantt/angular-gantt.git cDateNextDay = cDateStartOfDay.add(1, 'day'); } - angular.forEach(self.timeFrames, function(timeFrame) { + for (i=0; i < self.timeFrames.length; i++) { + var timeFrame = self.timeFrames[i]; + var positionDuration = timeFrame.start.diff(self.date, 'milliseconds'); var position = positionDuration / self.duration * self.width; @@ -1011,16 +1034,17 @@ Github: https://github.com/angular-gantt/angular-gantt.git timeFrame.left = position; timeFrame.width = timeFramePosition; timeFrame.originalSize = {left: timeFrame.left, width: timeFrame.width}; - }); + } if (self.timeFramesNonWorkingMode === 'cropped' || self.timeFramesWorkingMode === 'cropped') { var timeFramesWidth = 0; - angular.forEach(self.timeFrames, function(timeFrame) { - if (!timeFrame.working && self.timeFramesNonWorkingMode !== 'cropped' || - timeFrame.working && self.timeFramesWorkingMode !== 'cropped') { - timeFramesWidth += timeFrame.width; + for (var j=0; j < self.timeFrames.length; j++) { + var aTimeFrame = self.timeFrames[j]; + if (!aTimeFrame.working && self.timeFramesNonWorkingMode !== 'cropped' || + aTimeFrame.working && self.timeFramesWorkingMode !== 'cropped') { + timeFramesWidth += aTimeFrame.width; } - }); + } if (timeFramesWidth !== self.width) { var croppedRatio = self.width / timeFramesWidth; @@ -1029,24 +1053,26 @@ Github: https://github.com/angular-gantt/angular-gantt.git var allCropped = true; - angular.forEach(self.timeFrames, function(timeFrame) { - if (!timeFrame.working && self.timeFramesNonWorkingMode !== 'cropped' || - timeFrame.working && self.timeFramesWorkingMode !== 'cropped') { - timeFrame.left = (timeFrame.left - croppedWidth) * croppedRatio; - timeFrame.width = timeFrame.width * croppedRatio; - timeFrame.originalSize.left = (timeFrame.originalSize.left - originalCroppedWidth) * croppedRatio; - timeFrame.originalSize.width = timeFrame.originalSize.width * croppedRatio; - timeFrame.cropped = false; + for (j=0; j < self.timeFrames.length; j++) { + var bTimeFrame = self.timeFrames[j]; + + if (!bTimeFrame.working && self.timeFramesNonWorkingMode !== 'cropped' || + bTimeFrame.working && self.timeFramesWorkingMode !== 'cropped') { + bTimeFrame.left = (bTimeFrame.left - croppedWidth) * croppedRatio; + bTimeFrame.width = bTimeFrame.width * croppedRatio; + bTimeFrame.originalSize.left = (bTimeFrame.originalSize.left - originalCroppedWidth) * croppedRatio; + bTimeFrame.originalSize.width = bTimeFrame.originalSize.width * croppedRatio; + bTimeFrame.cropped = false; allCropped = false; } else { - croppedWidth += timeFrame.width; - originalCroppedWidth += timeFrame.originalSize.width; - timeFrame.left = undefined; - timeFrame.width = 0; - timeFrame.originalSize = {left: undefined, width: 0}; - timeFrame.cropped = true; + croppedWidth += bTimeFrame.width; + originalCroppedWidth += bTimeFrame.originalSize.width; + bTimeFrame.left = undefined; + bTimeFrame.width = 0; + bTimeFrame.originalSize = {left: undefined, width: 0}; + bTimeFrame.cropped = true; } - }); + } self.cropped = allCropped; } else { @@ -1251,129 +1277,141 @@ Github: https://github.com/angular-gantt/angular-gantt.git (function() { 'use strict'; - angular.module('gantt').factory('GanttColumnGenerator', ['GanttColumn', 'moment', function(Column, moment) { - var ColumnGenerator = function(columnsManager) { - var self = this; - + angular.module('gantt').factory('GanttColumnBuilder', ['GanttColumn', function(Column) { + // Builder for columns, based of data given by column generator and columnsManager. + var ColumnBuilder = function(columnsManager) { this.columnsManager = columnsManager; + }; - // Generates one column for each time unit between the given from and to date. - self.generate = function(from, to, maximumWidth, leftOffset, reverse) { - if (!to && !maximumWidth) { - throw 'to or maximumWidth must be defined'; - } + ColumnBuilder.prototype.newColumn = function(date, endDate, left, width) { + var calendar = this.columnsManager.gantt.calendar; + var timeFramesWorkingMode = this.columnsManager.gantt.options.value('timeFramesWorkingMode'); + var timeFramesNonWorkingMode = this.columnsManager.gantt.options.value('timeFramesNonWorkingMode'); - var viewScale = self.columnsManager.gantt.options.value('viewScale'); - viewScale = viewScale.trim(); - if (viewScale.charAt(viewScale.length - 1) === 's') { - viewScale = viewScale.substring(0, viewScale.length - 1); - } - var viewScaleValue; - var viewScaleUnit; - var splittedViewScale; + return new Column(date, endDate, left, width, calendar, timeFramesWorkingMode, timeFramesNonWorkingMode); + }; - if (viewScale) { - splittedViewScale = viewScale.split(' '); - } - if (splittedViewScale && splittedViewScale.length > 1) { - viewScaleValue = parseFloat(splittedViewScale[0]); - viewScaleUnit = splittedViewScale[splittedViewScale.length - 1]; - } else { - viewScaleValue = 1; - viewScaleUnit = viewScale; - } + return ColumnBuilder; + }]); +}()); - var calendar = self.columnsManager.gantt.calendar; - var timeFramesWorkingMode = self.columnsManager.gantt.options.value('timeFramesWorkingMode'); - var timeFramesNonWorkingMode = self.columnsManager.gantt.options.value('timeFramesNonWorkingMode'); - var columnWidth = self.columnsManager.getColumnsWidth(); - var excludeTo = false; - from = moment(from).startOf(viewScaleUnit); - if (to) { - excludeTo = isToDateToExclude(to); - to = moment(to).startOf(viewScaleUnit); - } +(function() { + 'use strict'; + angular.module('gantt').service('GanttColumnGenerator', ['moment', function(moment) { - var date = moment(from).startOf(viewScaleUnit); - if (reverse) { - date.add(-viewScaleValue, viewScaleUnit); + // Columns are generated including or excluding the to date. + // If the To date is the first day of month and the time is 00:00 then no new column is generated for this month. + + var isToDateToExclude = function(to, value, unit) { + return moment(to).add(value, unit).startOf(unit) === to; + }; + + + var getFirstValue = function(unit) { + if (['hour', 'minute', 'second', 'millisecond'].indexOf(unit) >= 0) { + return 0; + } + }; + + var ensureNoUnitOverflow = function(unit, startDate, endDate) { + var v1 = startDate.get(unit); + var v2 = endDate.get(unit); + var firstValue = getFirstValue(unit); + if (firstValue !== undefined && v2 !== firstValue && v2 < v1) { + endDate.set(unit, firstValue); + } + }; + + // Generates one column for each time unit between the given from and to date. + this.generate = function(builder, from, to, viewScale, columnWidth, maximumWidth, leftOffset, reverse) { + if (!to && !maximumWidth) { + throw 'to or maximumWidth must be defined'; + } + + viewScale = viewScale.trim(); + if (viewScale.charAt(viewScale.length - 1) === 's') { + viewScale = viewScale.substring(0, viewScale.length - 1); + } + var viewScaleValue; + var viewScaleUnit; + var splittedViewScale; + + if (viewScale) { + splittedViewScale = viewScale.split(' '); + } + if (splittedViewScale && splittedViewScale.length > 1) { + viewScaleValue = parseFloat(splittedViewScale[0]); + viewScaleUnit = splittedViewScale[splittedViewScale.length - 1]; + } else { + viewScaleValue = 1; + viewScaleUnit = viewScale; + } + + var excludeTo = false; + from = moment(from).startOf(viewScaleUnit); + if (to) { + excludeTo = isToDateToExclude(to); + to = moment(to).startOf(viewScaleUnit); + } + + var left = 0; + var date = moment(from).startOf(viewScaleUnit); + if (reverse) { + date.add(-viewScaleValue, viewScaleUnit); + left -= columnWidth; + } + var generatedCols = []; + + while (true) { + if (maximumWidth && Math.abs(left) > maximumWidth + columnWidth) { + break; } - var generatedCols = []; - var left = 0; - while (true) { - if (maximumWidth && Math.abs(left) > maximumWidth + columnWidth) { - break; - } + var startDate = moment(date); + var endDate = moment(startDate).add(viewScaleValue, viewScaleUnit); + ensureNoUnitOverflow(viewScaleUnit, startDate, endDate); + + var column = builder.newColumn(startDate, endDate, leftOffset ? left + leftOffset : left, columnWidth); - var startDate = moment(date); - var endDate = moment(startDate).add(viewScaleValue, viewScaleUnit); - ensureNoUnitOverflow(viewScaleUnit, startDate, endDate); + if (!column.cropped) { + generatedCols.push(column); + if (reverse) { + left -= columnWidth; + } else { + left += columnWidth; + } - var column = new Column(startDate, endDate, leftOffset ? left + leftOffset : left, columnWidth, calendar, timeFramesWorkingMode, timeFramesNonWorkingMode); - if (!column.cropped) { - generatedCols.push(column); + if (to) { if (reverse) { - left -= columnWidth; + if (excludeTo && date < to || !excludeTo && date <= to) { + break; + } } else { - left += columnWidth; - } - - if (to) { - if (reverse) { - if (excludeTo && date < to || !excludeTo && date <= to) { - break; - } - } else { - if (excludeTo && date > to || !excludeTo && date >= to) { - break; - } + if (excludeTo && date > to || !excludeTo && date >= to) { + break; } } } - if (reverse) { - date.add(-viewScaleValue, viewScaleUnit); - ensureNoUnitOverflow(viewScaleUnit, date, startDate); - } else { - date.add(viewScaleValue, viewScaleUnit); - ensureNoUnitOverflow(viewScaleUnit, startDate, date); - } } - if (reverse) { - if (isToDateToExclude(from, viewScaleValue, viewScaleUnit)) { - generatedCols.shift(); - } - generatedCols.reverse(); + date.add(-viewScaleValue, viewScaleUnit); + ensureNoUnitOverflow(viewScaleUnit, date, startDate); + } else { + date.add(viewScaleValue, viewScaleUnit); + ensureNoUnitOverflow(viewScaleUnit, startDate, date); } + } - return generatedCols; - }; - - // Columns are generated including or excluding the to date. - // If the To date is the first day of month and the time is 00:00 then no new column is generated for this month. - - var isToDateToExclude = function(to, value, unit) { - return moment(to).add(value, unit).startOf(unit) === to; - }; - - var ensureNoUnitOverflow = function(unit, startDate, endDate) { - var v1 = startDate.get(unit); - var v2 = endDate.get(unit); - var firstValue = getFirstValue(unit); - if (firstValue !== undefined && v2 !== firstValue && v2 < v1) { - endDate.set(unit, firstValue); + if (reverse) { + if (isToDateToExclude(from, viewScaleValue, viewScaleUnit)) { + generatedCols.shift(); } - }; + generatedCols.reverse(); + } - var getFirstValue = function(unit) { - if (['hour', 'minute', 'second', 'millisecond'].indexOf(unit) >= 0) { - return 0; - } - }; + return generatedCols; }; - return ColumnGenerator; }]); }()); @@ -1383,9 +1421,9 @@ Github: https://github.com/angular-gantt/angular-gantt.git // Used to display the Gantt grid and header. // The columns are generated by the column generator. - var ColumnHeader = function(date, viewScaleValue, viewScaleUnit, left, width, labelFormat) { - var startDate = moment(date); - var endDate = moment(startDate).add(viewScaleValue, viewScaleUnit); + var ColumnHeader = function(startDate, endDate, viewScaleUnit, left, width, labelFormat) { + startDate = moment(startDate); + endDate = moment(endDate); var column = new Column(startDate, endDate, left, width); column.unit = viewScaleUnit; @@ -1400,7 +1438,7 @@ Github: https://github.com/angular-gantt/angular-gantt.git (function(){ 'use strict'; - angular.module('gantt').factory('GanttColumnsManager', ['GanttColumnGenerator', 'GanttHeaderGenerator', '$filter', '$timeout', 'ganttLayout', 'ganttBinarySearch', 'moment', function(ColumnGenerator, HeaderGenerator, $filter, $timeout, layout, bs, moment) { + angular.module('gantt').factory('GanttColumnsManager', ['GanttColumnGenerator', 'GanttColumnBuilder', 'GanttHeadersGenerator', '$filter', '$timeout', 'ganttLayout', 'ganttBinarySearch', 'moment', function(ColumnGenerator, ColumnBuilder, HeadersGenerator, $filter, $timeout, layout, bs, moment) { var ColumnsManager = function(gantt) { var self = this; @@ -1419,6 +1457,8 @@ Github: https://github.com/angular-gantt/angular-gantt.git this.scrollAnchor = undefined; + this.columnBuilder = new ColumnBuilder(this); + // Add a watcher if a view related setting changed from outside of the Gantt. Update the gantt accordingly if so. // All those changes need a recalculation of the header columns this.gantt.$scope.$watchGroup(['viewScale', 'columnWidth', 'timeFramesWorkingMode', 'timeFramesNonWorkingMode', 'fromDate', 'toDate', 'autoExpand', 'taskOutOfRange'], function(newValues, oldValues) { @@ -1549,11 +1589,8 @@ Github: https://github.com/angular-gantt/angular-gantt.git this.from = from; this.to = to; - var columnGenerator = new ColumnGenerator(this); - var headerGenerator = new HeaderGenerator(this); - - this.columns = columnGenerator.generate(from, to); - this.headers = headerGenerator.generate(this.columns); + this.columns = ColumnGenerator.generate(this.columnBuilder, from, to, this.gantt.options.value('viewScale'), this.getColumnsWidth()); + this.headers = HeadersGenerator.generate(this); this.previousColumns = []; this.nextColumns = []; @@ -1637,7 +1674,7 @@ Github: https://github.com/angular-gantt/angular-gantt.git var columns = bs.get(extendedColumns, date, function(c) { return c.date; }, true); - return columns[0] !== undefined ? columns[0] : columns[1]; + return columns[0] === undefined ? columns[1] : columns[0]; }; // Returns the column at the given position x (in em) @@ -1671,9 +1708,9 @@ Github: https://github.com/angular-gantt/angular-gantt.git var widthFactor = newWidth / currentWidth; layout.setColumnsWidthFactor(columns, widthFactor); - angular.forEach(headers, function(header) { - layout.setColumnsWidthFactor(header, widthFactor); - }); + for (var i=0; i< headers.length; i++) { + layout.setColumnsWidthFactor(headers[i], widthFactor); + } // previous and next columns will be generated again on need. previousColumns.splice(0, this.previousColumns.length); nextColumns.splice(0, this.nextColumns.length); @@ -1687,7 +1724,7 @@ Github: https://github.com/angular-gantt/angular-gantt.git ColumnsManager.prototype.getColumnsWidth = function() { var columnWidth = this.gantt.options.value('columnWidth'); if (columnWidth === undefined) { - if (this.gantt.width <= 0) { + if (!this.gantt.width || this.gantt.width <= 0) { columnWidth = 20; } else { columnWidth = this.gantt.width / this.columns.length; @@ -1701,12 +1738,14 @@ Github: https://github.com/angular-gantt/angular-gantt.git }; ColumnsManager.prototype.expandExtendedColumnsForPosition = function(x) { + var viewScale; if (x < 0) { var firstColumn = this.getFirstColumn(); var from = firstColumn.date; var firstExtendedColumn = this.getFirstColumn(true); if (!firstExtendedColumn || firstExtendedColumn.left > x) { - this.previousColumns = new ColumnGenerator(this).generate(from, undefined, -x, -this.getColumnsWidth(), true); + viewScale = this.gantt.options.value('viewScale'); + this.previousColumns = ColumnGenerator.generate(this.columnBuilder, from, undefined, viewScale, this.getColumnsWidth(), -x, 0, true); } return true; } else if (x > this.gantt.width) { @@ -1714,7 +1753,8 @@ Github: https://github.com/angular-gantt/angular-gantt.git var endDate = lastColumn.getDateByPosition(lastColumn.width); var lastExtendedColumn = this.getLastColumn(true); if (!lastExtendedColumn || lastExtendedColumn.left + lastExtendedColumn.width < x) { - this.nextColumns = new ColumnGenerator(this).generate(endDate, undefined, x - this.gantt.width, this.gantt.width, false); + viewScale = this.gantt.options.value('viewScale'); + this.nextColumns = ColumnGenerator.generate(this.columnBuilder, endDate, undefined, viewScale, this.getColumnsWidth(), x - this.gantt.width, this.gantt.width, false); } return true; } @@ -1734,16 +1774,19 @@ Github: https://github.com/angular-gantt/angular-gantt.git endDate = lastColumn.getDateByPosition(lastColumn.width); } + var viewScale; if (from && date < from) { var firstExtendedColumn = this.getFirstColumn(true); if (!firstExtendedColumn || firstExtendedColumn.date > date) { - this.previousColumns = new ColumnGenerator(this).generate(from, date, undefined, 0, true); + viewScale = this.gantt.options.value('viewScale'); + this.previousColumns = ColumnGenerator.generate(this.columnBuilder, from, date, viewScale, this.getColumnsWidth(), undefined, 0, true); } return true; } else if (endDate && date >= endDate) { var lastExtendedColumn = this.getLastColumn(true); if (!lastExtendedColumn || lastExtendedColumn.date < endDate) { - this.nextColumns = new ColumnGenerator(this).generate(endDate, date, undefined, this.gantt.width, false); + viewScale = this.gantt.options.value('viewScale'); + this.nextColumns = ColumnGenerator.generate(this.columnBuilder, endDate, date, viewScale, this.getColumnsWidth(), undefined, this.gantt.width, false); } return true; } @@ -1759,20 +1802,20 @@ Github: https://github.com/angular-gantt/angular-gantt.git this.visibleColumns = $filter('ganttColumnLimit')(this.columns, this.gantt); this.visibleHeaders = []; - angular.forEach(this.headers, function(header) { - this.visibleHeaders.push($filter('ganttColumnLimit')(header, this.gantt)); - }, this); + for (var i=0; i< this.headers.length; i++) { + this.visibleHeaders.push($filter('ganttColumnLimit')(this.headers[i], this.gantt)); + } if (includeViews) { - angular.forEach(this.visibleColumns, function(c) { - c.updateView(); - }); - - angular.forEach(this.visibleHeaders, function(headerRow) { - angular.forEach(headerRow, function(header) { - header.updateView(); - }); - }); + for (i=0; i<this.visibleColumns.length; i++) { + this.visibleColumns[i].updateView(); + } + for (i=0; i<this.visibleHeaders.length; i++) { + var headerRow = this.visibleHeaders[i]; + for (var j=0; j<headerRow.length; j++) { + headerRow[j].updateView(); + } + } } var currentDateValue = this.gantt.options.value('currentDateValue'); @@ -1842,11 +1885,10 @@ Github: https://github.com/angular-gantt/angular-gantt.git (function(){ 'use strict'; - angular.module('gantt').factory('GanttHeaderGenerator', ['GanttColumnHeader', function(ColumnHeader) { - var generateHeader = function(columnsManager, columns, viewScale) { + angular.module('gantt').service('GanttHeadersGenerator', ['GanttColumnHeader', 'moment', function(ColumnHeader, moment) { + var generateHeader = function(columnsManager, viewScale) { var generatedHeaders = []; var header; - var prevColDateVal; var viewScaleValue; var viewScaleUnit; @@ -1863,78 +1905,90 @@ Github: https://github.com/angular-gantt/angular-gantt.git viewScaleUnit = viewScale; } - for (var i = 0, l = columns.length; i < l; i++) { - var col = columns[i]; - var colDateVal = col.date.get(viewScaleUnit); - if (i === 0 || prevColDateVal !== colDateVal) { - prevColDateVal = colDateVal; + var currentColumn = columnsManager.columns[0]; + var currentDate = moment(currentColumn.date).startOf(viewScaleUnit); + + var maximumDate = moment(columnsManager.columns[columnsManager.columns.length - 1].endDate); + + while (true) { + var currentPosition = currentColumn.getPositionByDate(currentDate); + + var endDate = moment.min(moment(currentDate).add(viewScaleValue, viewScaleUnit), maximumDate); + + var column = columnsManager.getColumnByDate(endDate, true); + + var left = column.getPositionByDate(endDate); + + var width = left - currentPosition; + + if (width > 0) { var labelFormat = columnsManager.getHeaderFormat(viewScaleUnit); - header = new ColumnHeader(col.date, viewScaleValue, viewScaleUnit, col.originalSize.left, col.originalSize.width, labelFormat); - header.left = col.left; - header.width = col.width; + header = new ColumnHeader(currentDate, endDate, viewScaleUnit, currentPosition, width, labelFormat); generatedHeaders.push(header); - } else { - header.originalSize.width += col.originalSize.width; - header.width += col.width; } + + if (endDate.isSame(maximumDate) || endDate.isAfter(maximumDate)) { + break; + } + + currentColumn = column; + currentDate = endDate; } - return generatedHeaders; + return generatedHeaders; }; - return function(columnsManager) { - this.generate = function(columns) { - var units = []; - if (columnsManager.gantt.options.value('headers') === undefined) { - var viewScale = columnsManager.gantt.options.value('viewScale'); - viewScale = viewScale.trim(); - if (viewScale.charAt(viewScale.length - 1) === 's') { - viewScale = viewScale.substring(0, viewScale.length - 1); - } - - var viewScaleUnit; - var splittedViewScale; + this.generate = function(columnsManager) { + var units = []; + if (columnsManager.gantt.options.value('headers') === undefined) { + var viewScale = columnsManager.gantt.options.value('viewScale'); + viewScale = viewScale.trim(); + if (viewScale.charAt(viewScale.length - 1) === 's') { + viewScale = viewScale.substring(0, viewScale.length - 1); + } - if (viewScale) { - splittedViewScale = viewScale.split(' '); - } - if (splittedViewScale && splittedViewScale.length > 1) { - viewScaleUnit = splittedViewScale[splittedViewScale.length - 1]; - } else { - viewScaleUnit = viewScale; - } + var viewScaleUnit; + var splittedViewScale; - if (['quarter','month'].indexOf(viewScaleUnit) > -1) { - units.push('year'); - } - if (['day', 'week'].indexOf(viewScaleUnit) > -1) { - units.push('month'); - } - if (['day'].indexOf(viewScaleUnit) > -1) { - units.push('week'); - } - if (['hour'].indexOf(viewScaleUnit) > -1) { - units.push('day'); - } - if (['minute', 'second'].indexOf(viewScaleUnit) > -1) { - units.push('hour'); - } - if (['second'].indexOf(viewScaleUnit) > -1) { - units.push('minute'); - } - units.push(viewScale); + if (viewScale) { + splittedViewScale = viewScale.split(' '); + } + if (splittedViewScale && splittedViewScale.length > 1) { + viewScaleUnit = splittedViewScale[splittedViewScale.length - 1]; } else { - units = columnsManager.gantt.options.value('headers'); + viewScaleUnit = viewScale; } - var headers = []; - angular.forEach(units, function(unit) { - headers.push(generateHeader(columnsManager, columns, unit)); - }); + if (['quarter','month'].indexOf(viewScaleUnit) > -1) { + units.push('year'); + } + if (['day', 'week'].indexOf(viewScaleUnit) > -1) { + units.push('month'); + } + if (['day'].indexOf(viewScaleUnit) > -1) { + units.push('week'); + } + if (['hour'].indexOf(viewScaleUnit) > -1) { + units.push('day'); + } + if (['minute', 'second'].indexOf(viewScaleUnit) > -1) { + units.push('hour'); + } + if (['second'].indexOf(viewScaleUnit) > -1) { + units.push('minute'); + } + units.push(viewScale); + } else { + units = columnsManager.gantt.options.value('headers'); + } - return headers; - }; + var headers = []; + for (var i=0; i<units.length; i++) { + headers.push(generateHeader(columnsManager, units[i])); + } + + return headers; }; }]); }()); @@ -2127,11 +2181,11 @@ Github: https://github.com/angular-gantt/angular-gantt.git // DEPRECATED var removedRows = []; - angular.forEach(oldData, function(removedRow) { - if (toRemoveIds.indexOf(removedRow.id) > -1) { - removedRows.push(removedRow); + for(i = 0, l = oldData.length; i < l; i++){ + if (toRemoveIds.indexOf(oldData[i].id) > -1) { + removedRows.push(oldData[i]); } - }); + } self.api.data.raise.remove(removedRows); } } @@ -2461,6 +2515,10 @@ Github: https://github.com/angular-gantt/angular-gantt.git task.updatePosAndSize(); this.updateVisibleTasks(); + oldRow.$scope.$digest(); + task.row.$scope.$digest(); + + this.rowsManager.gantt.api.tasks.raise.viewRowChange(task, oldRow); if (!viewOnly) { this.rowsManager.gantt.api.tasks.raise.rowChange(task, oldRow); } @@ -2621,7 +2679,7 @@ Github: https://github.com/angular-gantt/angular-gantt.git }()); -(function(){ +(function() { 'use strict'; angular.module('gantt').factory('GanttRowsManager', ['GanttRow', 'ganttArrays', '$filter', '$timeout', 'moment', function(Row, arrays, $filter, $timeout, moment) { var RowsManager = function(gantt) { @@ -2694,14 +2752,19 @@ Github: https://github.com/angular-gantt/angular-gantt.git this.gantt.api.registerEvent('tasks', 'viewChange'); this.gantt.api.registerEvent('tasks', 'rowChange'); + this.gantt.api.registerEvent('tasks', 'viewRowChange'); this.gantt.api.registerEvent('tasks', 'remove'); this.gantt.api.registerEvent('tasks', 'filter'); + this.gantt.api.registerEvent('tasks', 'displayed'); + this.gantt.api.registerEvent('rows', 'add'); this.gantt.api.registerEvent('rows', 'change'); this.gantt.api.registerEvent('rows', 'remove'); this.gantt.api.registerEvent('rows', 'move'); + this.gantt.api.registerEvent('rows', 'displayed'); + this.gantt.api.registerEvent('rows', 'filter'); this.updateVisibleObjects(); @@ -2737,7 +2800,7 @@ Github: https://github.com/angular-gantt/angular-gantt.git } var toRemoveIds = arrays.getRemovedIds(rowModel.tasks, row.model.tasks); - for (i= 0, l=toRemoveIds.length; i<l; i++) { + for (i = 0, l = toRemoveIds.length; i < l; i++) { var toRemoveId = toRemoveIds[i]; row.removeTask(toRemoveId); } @@ -2770,18 +2833,20 @@ Github: https://github.com/angular-gantt/angular-gantt.git } if (!isUpdate) { - var watcher = this.gantt.$scope.$watchCollection(function() {return rowModel.tasks;}, function(newTasks, oldTasks) { + var watcher = this.gantt.$scope.$watchCollection(function() { + return rowModel.tasks; + }, function(newTasks, oldTasks) { if (newTasks !== oldTasks) { var i, l; var toRemoveIds = arrays.getRemovedIds(newTasks, oldTasks); - for (i= 0, l = toRemoveIds.length; i<l; i++) { + for (i = 0, l = toRemoveIds.length; i < l; i++) { var toRemove = toRemoveIds[i]; row.removeTask(toRemove); } if (newTasks !== undefined) { - for (i= 0, l = newTasks.length; i<l; i++) { + for (i = 0, l = newTasks.length; i < l; i++) { var toAdd = newTasks[i]; row.addTask(toAdd); } @@ -2831,7 +2896,7 @@ Github: https://github.com/angular-gantt/angular-gantt.git this.customFilteredRows = []; this.visibleRows = []; - for (var i= 0, l=this.rowsTaskWatchers.length; i<l; i++) { + for (var i = 0, l = this.rowsTaskWatchers.length; i < l; i++) { var deregisterFunction = this.rowsTaskWatchers[i]; deregisterFunction(); } @@ -2871,9 +2936,9 @@ Github: https://github.com/angular-gantt/angular-gantt.git }; RowsManager.prototype.applyCustomRowSorters = function(sortedRows) { - angular.forEach(this.customRowSorters, function(sorterFunction) { - sortedRows = sorterFunction(sortedRows); - }); + for (var i = 0; i < this.customRowSorters.length; i++) { + sortedRows = this.customRowSorters[i](sortedRows); + } return sortedRows; }; @@ -2882,9 +2947,7 @@ Github: https://github.com/angular-gantt/angular-gantt.git */ RowsManager.prototype.applySort = function() { var data = this.gantt.$scope.data; - while(data > 0) { - data.pop(); - } + data.splice(0, data.length); // empty data. var rows = []; for (var i = 0, l = this.sortedRows.length; i < l; i++) { data.push(this.sortedRows[i].model); @@ -2933,11 +2996,11 @@ Github: https://github.com/angular-gantt/angular-gantt.git var filterRowComparator = this.gantt.options.value('filterRowComparator'); if (typeof(filterRowComparator) === 'function') { - //fix issue this.gantt is undefined - // - var gantt = this.gantt; + //fix issue this.gantt is undefined + // + var gantt = this.gantt; filterRowComparator = function(actual, expected) { - //fix actual.model is undefined + //fix actual.model is undefined return gantt.options.value('filterRowComparator')(actual, expected); }; } @@ -2952,6 +3015,9 @@ Github: https://github.com/angular-gantt/angular-gantt.git // TODO: Implement rowLimit like columnLimit to enhance performance for gantt with many rows this.visibleRows = this.customFilteredRows; + + this.gantt.api.rows.raise.displayed(this.sortedRows, this.filteredRows, this.visibleRows); + if (raiseEvent) { this.gantt.api.rows.raise.filter(this.sortedRows, this.filteredRows); } @@ -2969,9 +3035,9 @@ Github: https://github.com/angular-gantt/angular-gantt.git }; RowsManager.prototype.applyCustomRowFilters = function(filteredRows) { - angular.forEach(this.customRowFilters, function(filterFunction) { - filteredRows = filterFunction(filteredRows); - }); + for (var i = 0; i < this.customRowFilters.length; i++) { + filteredRows = this.customRowFilters[i](filteredRows); + } return filteredRows; }; @@ -2987,18 +3053,23 @@ Github: https://github.com/angular-gantt/angular-gantt.git var oldFilteredTasks = []; var filteredTasks = []; var tasks = []; + var visibleTasks = []; - angular.forEach(this.rows, function(row) { + for (var i = 0; i < this.rows.length; i++) { + var row = this.rows[i]; oldFilteredTasks = oldFilteredTasks.concat(row.filteredTasks); row.updateVisibleTasks(); filteredTasks = filteredTasks.concat(row.filteredTasks); + visibleTasks = visibleTasks.concat(row.visibleTasks); tasks = tasks.concat(row.tasks); - }); + } + + this.gantt.api.tasks.raise.displayed(tasks, filteredTasks, visibleTasks); var filterEvent = !angular.equals(oldFilteredTasks, filteredTasks); if (filterEvent) { - this.gantt.api.tasks.raise.filter(tasks, filteredTasks); + this.gantt.api.tasks.raise.filter(tasks, filteredTasks, visibleTasks); } }; @@ -3013,11 +3084,11 @@ Github: https://github.com/angular-gantt/angular-gantt.git from = from ? moment(from) : from; var minRowFrom = from; - angular.forEach(this.rows, function(row) { - if (minRowFrom === undefined || minRowFrom > row.from) { - minRowFrom = row.from; + for (var i = 0; i < this.rows.length; i++) { + if (minRowFrom === undefined || minRowFrom > this.rows[i].from) { + minRowFrom = this.rows[i]; } - }); + } if (minRowFrom && (!from || minRowFrom < from)) { return minRowFrom; } @@ -3028,11 +3099,11 @@ Github: https://github.com/angular-gantt/angular-gantt.git to = to ? moment(to) : to; var maxRowTo = to; - angular.forEach(this.rows, function(row) { - if (maxRowTo === undefined || maxRowTo < row.to) { - maxRowTo = row.to; + for (var i = 0; i < this.rows.length; i++) { + if (maxRowTo === undefined || maxRowTo < this.rows[i].to) { + maxRowTo = this.rows[i].to; } - }); + } var toDate = this.gantt.options.value('toDate'); if (maxRowTo && (!toDate || maxRowTo > toDate)) { return maxRowTo; @@ -3042,21 +3113,21 @@ Github: https://github.com/angular-gantt/angular-gantt.git RowsManager.prototype.getDefaultFrom = function() { var defaultFrom; - angular.forEach(this.rows, function(row) { - if (defaultFrom === undefined || row.from < defaultFrom) { - defaultFrom = row.from; + for (var i = 0; i < this.rows.length; i++) { + if (defaultFrom === undefined || this.rows[i].from < defaultFrom) { + defaultFrom = this.rows[i].from; } - }); + } return defaultFrom; }; RowsManager.prototype.getDefaultTo = function() { var defaultTo; - angular.forEach(this.rows, function(row) { - if (defaultTo === undefined || row.to > defaultTo) { - defaultTo = row.to; + for (var i = 0; i < this.rows.length; i++) { + if (defaultTo === undefined || this.rows[i].to > defaultTo) { + defaultTo = this.rows[i].to; } - }); + } return defaultTo; }; @@ -3084,7 +3155,7 @@ Github: https://github.com/angular-gantt/angular-gantt.git var lastColumn = this.rowsManager.gantt.columnsManager.getLastColumn(); return (firstColumn === undefined || this.model.to < firstColumn.date || - lastColumn === undefined || this.model.from > lastColumn.endDate); + lastColumn === undefined || this.model.from > lastColumn.endDate); }; // Updates the pos and size of the task according to the from - to date @@ -3163,9 +3234,10 @@ Github: https://github.com/angular-gantt/angular-gantt.git if (this.model.priority > 0) { var priority = this.model.priority; - angular.forEach(this.$element.children(), function(element) { - angular.element(element).css('z-index', priority); - }); + var children = this.$element.children(); + for (var i = 0; i < children.length; i++) { + angular.element(children[i]).css('z-index', priority); + } } this.$element.toggleClass('gantt-task-milestone', this.isMilestone()); @@ -3377,7 +3449,19 @@ Github: https://github.com/angular-gantt/angular-gantt.git }; Scroll.prototype.getBordersWidth = function() { - return this.$element === undefined ? undefined : (this.$element[0].offsetWidth - this.$element[0].clientWidth); + if (this.$element === undefined) { + return undefined; + } + + if (this.$element[0].clientWidth) { + return this.$element[0].offsetWidth - this.$element[0].clientWidth; + } else { + //fix for IE11 + var borderLeft = window.getComputedStyle(this.$element[0]).getPropertyValue('border-left-width') ? window.getComputedStyle(this.$element[0]).getPropertyValue('border-left-width').match(/\d+/)[0] : 0; + var borderRight = window.getComputedStyle(this.$element[0]).getPropertyValue('border-right-width') ? window.getComputedStyle(this.$element[0]).getPropertyValue('border-right-width').match(/\d+/)[0] : 0; + + return parseInt(borderLeft) + parseInt(borderRight); + } }; Scroll.prototype.getBordersHeight = function() { @@ -3443,7 +3527,6 @@ Github: https://github.com/angular-gantt/angular-gantt.git }]); }()); - (function(){ 'use strict'; @@ -3458,6 +3541,8 @@ Github: https://github.com/angular-gantt/angular-gantt.git if (this.$element.css('width') !== undefined) { this.$element.css('width', ''); } + } + if (this.$element !== undefined) { width = this.$element[0].offsetWidth; } if (width !== undefined) { @@ -3798,11 +3883,11 @@ Github: https://github.com/angular-gantt/angular-gantt.git }]); }()); -(function(){ +(function() { 'use strict'; angular.module('gantt').factory('GanttHierarchy', [function() { - var Hierarchy = function () { + var Hierarchy = function() { var self = this; var nameToRow = {}; @@ -3847,12 +3932,16 @@ Github: https://github.com/angular-gantt/angular-gantt.git nameToParent = {}; idToParent = {}; - angular.forEach(rows, function(row) { + var row; + + for (var i = 0; i < rows.length; i++) { + row = rows[i]; nameToRow[row.model.name] = row; idToRow[row.model.id] = row; - }); + } - angular.forEach(rows, function(row) { + for (i = 0; i < rows.length; i++) { + row = rows[i]; if (row.model.parent !== undefined) { var parentRow = nameToRow[row.model.parent]; if (parentRow === undefined) { @@ -3865,7 +3954,9 @@ Github: https://github.com/angular-gantt/angular-gantt.git } if (row.model.children !== undefined) { - angular.forEach(row.model.children, function(childRowNameOrId) { + var children = row.model.children; + for (var j = 0; j<children.length; j++) { + var childRowNameOrId = children[j]; var childRow = nameToRow[childRowNameOrId]; if (childRow === undefined) { childRow = idToRow[childRowNameOrId]; @@ -3874,16 +3965,17 @@ Github: https://github.com/angular-gantt/angular-gantt.git if (childRow !== undefined) { registerChildRow(row, childRow); } - }); + } } - }); + } var rootRows = []; - angular.forEach(rows, function(row) { + for (i = 0; i < rows.length; i++) { + row = rows[i]; if (self.parent(row) === undefined) { rootRows.push(row); } - }); + } return rootRows; }; @@ -3899,10 +3991,10 @@ Github: https://github.com/angular-gantt/angular-gantt.git var children = self.children(row); descendants.push.apply(descendants, children); if (children !== undefined) { - angular.forEach(children, function(child) { - var childDescendants = self.descendants(child); + for (var i=0; i<children.length; i++) { + var childDescendants = self.descendants(children[i]); descendants.push.apply(descendants, childDescendants); - }); + } } return descendants; @@ -3950,6 +4042,14 @@ Github: https://github.com/angular-gantt/angular-gantt.git } return defaultValue; }, + angularIndexOf: function(arr, obj) { + for (var i = 0; i < arr.length; i++) { + if (angular.equals(arr[i], obj)) { + return i; + } + } + return -1; + }, random4: function() { return Math.floor((1 + Math.random()) * 0x10000) .toString(16) @@ -4066,41 +4166,29 @@ Github: https://github.com/angular-gantt/angular-gantt.git $scope.enabled = true; } - $attrs.$observe('ganttResizerEnabled', function(value) { - $scope.enabled = $parse(value)(); - }); + function getWidth() { + return ganttCtrl.gantt.options.value($attrs.resizerWidth); + } - $scope.$watch('enabled', function (value) { - if (value === undefined) { - value = true; - } + function setWidth(width) { + if (width !== getWidth()) { + ganttCtrl.gantt.options.set($attrs.resizerWidth, width); - $element.toggleClass('gantt-resizer-enabled', value); + if (eventTopic !== undefined) { + api[eventTopic].raise.resize(width); + } - if (value) { - $element.on('dblclick', dblclick); - $element.on('mousedown', mousedown); - } else { - $element.off('dblclick', dblclick); - $element.off('mousedown', mousedown); + $timeout(function() { + ganttCtrl.gantt.columnsManager.updateColumnsMeta(); + }); } - }); + } function dblclick(event) { event.preventDefault(); setWidth(undefined); } - function mousedown(event) { - event.preventDefault(); - - if (eventTopic !== undefined) { - api[eventTopic].raise.resizeBegin(getWidth()); - } - $document.on('mousemove', mousemove); - $document.on('mouseup', mouseup); - } - function mousemove(event) { $scope.$evalAsync(function (){ var offset = mouseOffset.getOffsetForElement($scope.targetElement[0], event); @@ -4118,6 +4206,37 @@ Github: https://github.com/angular-gantt/angular-gantt.git $document.unbind('mouseup', mouseup); } + + function mousedown(event) { + event.preventDefault(); + + if (eventTopic !== undefined) { + api[eventTopic].raise.resizeBegin(getWidth()); + } + $document.on('mousemove', mousemove); + $document.on('mouseup', mouseup); + } + + $attrs.$observe('ganttResizerEnabled', function(value) { + $scope.enabled = $parse(value)(); + }); + + $scope.$watch('enabled', function (value) { + if (value === undefined) { + value = true; + } + + $element.toggleClass('gantt-resizer-enabled', value); + + if (value) { + $element.on('dblclick', dblclick); + $element.on('mousedown', mousedown); + } else { + $element.off('dblclick', dblclick); + $element.off('mousedown', mousedown); + } + }); + $scope.$watch(function() { return getWidth(); }, function(newValue, oldValue) { @@ -4132,24 +4251,6 @@ Github: https://github.com/angular-gantt/angular-gantt.git } }); - function setWidth(width) { - if (width !== getWidth()) { - ganttCtrl.gantt.options.set($attrs.resizerWidth, width); - - if (eventTopic !== undefined) { - api[eventTopic].raise.resize(width); - } - - $timeout(function() { - ganttCtrl.gantt.columnsManager.updateColumnsMeta(); - }); - } - } - - function getWidth() { - return ganttCtrl.gantt.options.value($attrs.resizerWidth); - } - if (eventTopic) { api.registerEvent(eventTopic, 'resize'); api.registerEvent(eventTopic, 'resizeBegin'); @@ -4844,7 +4945,7 @@ Github: https://github.com/angular-gantt/angular-gantt.git $scope.gantt.api.directives.raise.destroy(directiveName, $scope, $element, $attrs, controller); }); - $scope.$evalAsync(function() { + $scope.$applyAsync(function() { $scope.gantt.api.directives.raise.new(directiveName, $scope, $element, $attrs, controller); }); }] @@ -4931,6 +5032,9 @@ Github: https://github.com/angular-gantt/angular-gantt.git } return found; + }, + isElementVisible: function(element) { + return element.offsetParent !== undefined && element.offsetParent !== null; } }; }]); @@ -5065,15 +5169,17 @@ Github: https://github.com/angular-gantt/angular-gantt.git originalLeftOffset = 0; } - angular.forEach(columns, function(column) { + for (var i=0; i<columns.length; i++) { + var column = columns[i]; column.left = (widthFactor * (column.originalSize.left + originalLeftOffset)) - originalLeftOffset; column.width = widthFactor * column.originalSize.width; - angular.forEach(column.timeFrames, function(timeFrame) { + for (var j=0; j<column.timeFrames.length; j++) { + var timeFrame = column.timeFrames[j]; timeFrame.left = widthFactor * timeFrame.originalSize.left; timeFrame.width = widthFactor * timeFrame.originalSize.width; - }); - }); + } + } } }; }]); diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.js.map index ec8dab7c65e903987c5e41dd72eeb05ac968694b..1d8255ad1393ffddf740f3b3f19fc1c5c7de7d55 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/core/gantt.directive.js","../src/core/logic/api/api.factory.js","../src/core/logic/api/options.factory.js","../src/core/logic/calendar/calendar.factory.js","../src/core/logic/calendar/currentDateManager.factory.js","../src/core/logic/column/column.factory.js","../src/core/logic/column/columnGenerator.factory.js","../src/core/logic/column/columnHeader.factory.js","../src/core/logic/column/columnsManager.factory.js","../src/core/logic/column/headerGenerator.factory.js","../src/core/logic/gantt.factory.js","../src/core/logic/model/objectModel.factory.js","../src/core/logic/row/row.factory.js","../src/core/logic/row/rowHeader.factory.js","../src/core/logic/row/rowsManager.factory.js","../src/core/logic/task/task.factory.js","../src/core/logic/template/body.factory.js","../src/core/logic/template/bodyBackground.factory.js","../src/core/logic/template/bodyColumns.factory.js","../src/core/logic/template/bodyForeground.factory.js","../src/core/logic/template/bodyRows.factory.js","../src/core/logic/template/header.factory.js","../src/core/logic/template/headerColumns.factory.js","../src/core/logic/template/scroll.factory.js","../src/core/logic/template/side.factory.js","../src/core/logic/timespan/timespan.factory.js","../src/core/logic/timespan/timespansManager.factory.js","../src/core/logic/util/arrays.service.js","../src/core/logic/util/binarySearch.service.js","../src/core/logic/util/hierarchy.factory.js","../src/core/logic/util/utils.service.js","../src/core/ui/limit/columnLimit.filter.js","../src/core/ui/limit/taskLimit.filter.js","../src/core/ui/resizer/resizer.directive.js","../src/core/ui/scroll/horizontalScrollReceiver.directive.js","../src/core/ui/scroll/scrollManager.directive.js","../src/core/ui/scroll/scrollSender.directive.js","../src/core/ui/scroll/scrollable.directive.js","../src/core/ui/scroll/verticalScrollReceiver.directive.js","../src/core/ui/size/elementHeightListener.directive.js","../src/core/ui/size/elementWidthListener.directive.js","../src/core/ui/template/body.directive.js","../src/core/ui/template/bodyBackground.directive.js","../src/core/ui/template/bodyColumns.directive.js","../src/core/ui/template/bodyForeground.directive.js","../src/core/ui/template/bodyRows.directive.js","../src/core/ui/template/column.directive.js","../src/core/ui/template/columnHeader.directive.js","../src/core/ui/template/header.directive.js","../src/core/ui/template/headerColumns.directive.js","../src/core/ui/template/row.directive.js","../src/core/ui/template/rowBackground.directive.js","../src/core/ui/template/rowLabel.directive.js","../src/core/ui/template/scrollableHeader.directive.js","../src/core/ui/template/side.directive.js","../src/core/ui/template/sideBackground.directive.js","../src/core/ui/template/sideContent.directive.js","../src/core/ui/template/task.directive.js","../src/core/ui/template/taskBackground.directive.js","../src/core/ui/template/taskContent.directive.js","../src/core/ui/template/taskForeground.directive.js","../src/core/ui/template/timeFrame.directive.js","../src/core/ui/template/timespan.directive.js","../src/core/ui/util/debounce.factory.js","../src/core/ui/util/directiveBuilder.service.js","../src/core/ui/util/dom.service.js","../src/core/ui/util/enableNgAnimate.service.js","../src/core/ui/util/ganttBindHtmlCompile.directive.js","../src/core/ui/util/layout.service.js","../src/core/ui/util/mouseButton.service.js","../src/core/ui/util/mouseOffset.service.js","../src/core/ui/util/smartEvent.factory.js","../.tmp/generated/core/html2js.js"],"names":[],"mappings":"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","file":"angular-gantt.js","sourcesContent":["(function(){\n 'use strict';\n angular.module('gantt', ['gantt.templates', 'angularMoment'])\n .directive('gantt', ['Gantt', 'ganttEnableNgAnimate', '$timeout', '$templateCache', function(Gantt, enableNgAnimate, $timeout, $templateCache) {\n return {\n restrict: 'A',\n transclude: true,\n templateUrl: function(tElement, tAttrs) {\n var templateUrl;\n if (tAttrs.templateUrl === undefined) {\n templateUrl = 'template/gantt.tmpl.html';\n } else {\n templateUrl = tAttrs.templateUrl;\n }\n if (tAttrs.template !== undefined) {\n $templateCache.put(templateUrl, tAttrs.template);\n }\n return templateUrl;\n },\n scope: {\n sortMode: '=?',\n filterTask: '=?',\n filterTaskComparator: '=?',\n filterRow: '=?',\n filterRowComparator: '=?',\n viewScale: '=?',\n columnWidth: '=?',\n expandToFit: '=?',\n shrinkToFit: '=?',\n showSide: '=?',\n allowSideResizing: '=?',\n fromDate: '=?',\n toDate: '=?',\n currentDateValue: '=?',\n currentDate: '=?',\n daily: '=?',\n autoExpand: '=?',\n taskOutOfRange: '=?',\n taskContent: '=?',\n rowContent: '=?',\n maxHeight: '=?',\n sideWidth: '=?',\n headers: '=?',\n headersFormats: '=?',\n timeFrames: '=?',\n dateFrames: '=?',\n timeFramesWorkingMode: '=?',\n timeFramesNonWorkingMode: '=?',\n timespans: '=?',\n columnMagnet: '=?',\n shiftColumnMagnet: '=?',\n timeFramesMagnet: '=?',\n data: '=?',\n api: '=?',\n options: '=?'\n },\n controller: ['$scope', '$element', function($scope, $element) {\n for (var option in $scope.options) {\n $scope[option] = $scope.options[option];\n }\n\n // Disable animation if ngAnimate is present, as it drops down performance.\n enableNgAnimate($element, false);\n\n $scope.gantt = new Gantt($scope, $element);\n this.gantt = $scope.gantt;\n }],\n link: function(scope, element) {\n scope.gantt.api.directives.raise.new('gantt', scope, element);\n scope.$on('$destroy', function() {\n scope.gantt.api.directives.raise.destroy('gantt', scope, element);\n });\n\n $timeout(function() {\n scope.gantt.initialized();\n });\n }\n };\n }]);\n}());\n\n","// This file is adapted from Angular UI ngGrid project\n// MIT License\n// https://github.com/angular-ui/ng-grid/blob/v3.0.0-rc.20/src/js/core/factories/GridApi.js\n(function() {\n 'use strict';\n\n angular.module('gantt')\n .factory('GanttApi', ['$q', '$rootScope', 'ganttUtils',\n function($q, $rootScope, utils) {\n /**\n * @ngdoc function\n * @name gantt.class:GanttApi\n * @description GanttApi provides the ability to register public methods events inside the gantt and allow\n * for other components to use the api via featureName.raise.methodName and featureName.on.eventName(function(args){}.\n * @param {object} gantt gantt that owns api\n */\n var GanttApi = function GanttApi(gantt) {\n this.gantt = gantt;\n this.listeners = [];\n this.apiId = utils.newId();\n };\n\n /**\n * @ngdoc function\n * @name gantt.class:suppressEvents\n * @methodOf gantt.class:GanttApi\n * @description Used to execute a function while disabling the specified event listeners.\n * Disables the listenerFunctions, executes the callbackFn, and then enables\n * the listenerFunctions again\n * @param {object} listenerFuncs listenerFunc or array of listenerFuncs to suppress. These must be the same\n * functions that were used in the .on.eventName method\n * @param {object} callBackFn function to execute\n * @example\n * <pre>\n * var navigate = function (newRowCol, oldRowCol){\n * //do something on navigate\n * }\n *\n * ganttApi.cellNav.on.navigate(scope,navigate);\n *\n *\n * //call the scrollTo event and suppress our navigate listener\n * //scrollTo will still raise the event for other listeners\n * ganttApi.suppressEvents(navigate, function(){\n * ganttApi.cellNav.scrollTo(aRow, aCol);\n * });\n *\n * </pre>\n */\n GanttApi.prototype.suppressEvents = function(listenerFuncs, callBackFn) {\n var self = this;\n var listeners = angular.isArray(listenerFuncs) ? listenerFuncs : [listenerFuncs];\n\n //find all registered listeners\n var foundListeners = [];\n listeners.forEach(function(l) {\n foundListeners = self.listeners.filter(function(lstnr) {\n return l === lstnr.handler;\n });\n });\n\n //deregister all the listeners\n foundListeners.forEach(function(l) {\n l.dereg();\n });\n\n callBackFn();\n\n //reregister all the listeners\n foundListeners.forEach(function(l) {\n l.dereg = registerEventWithAngular(l.eventId, l.handler, self.gantt, l._this);\n });\n\n };\n\n /**\n * @ngdoc function\n * @name registerEvent\n * @methodOf gantt.class:GanttApi\n * @description Registers a new event for the given feature. The event will get a\n * .raise and .on prepended to it\n * <br>\n * .raise.eventName() - takes no arguments\n * <br/>\n * <br/>\n * .on.eventName(scope, callBackFn, _this)\n * <br/>\n * scope - a scope reference to add a deregister call to the scopes .$on('destroy')\n * <br/>\n * callBackFn - The function to call\n * <br/>\n * _this - optional this context variable for callbackFn. If omitted, gantt.api will be used for the context\n * <br/>\n * .on.eventName returns a dereg funtion that will remove the listener. It's not necessary to use it as the listener\n * will be removed when the scope is destroyed.\n * @param {string} featureName name of the feature that raises the event\n * @param {string} eventName name of the event\n */\n GanttApi.prototype.registerEvent = function(featureName, eventName) {\n var self = this;\n if (!self[featureName]) {\n self[featureName] = {};\n }\n\n var feature = self[featureName];\n if (!feature.on) {\n feature.on = {};\n feature.raise = {};\n }\n\n var eventId = 'event:gantt:' + this.apiId + ':' + featureName + ':' + eventName;\n\n // Creating raise event method featureName.raise.eventName\n feature.raise[eventName] = function() {\n $rootScope.$emit.apply($rootScope, [eventId].concat(Array.prototype.slice.call(arguments)));\n };\n\n // Creating on event method featureName.oneventName\n feature.on[eventName] = function(scope, handler, _this) {\n var deregAngularOn = registerEventWithAngular(eventId, handler, self.gantt, _this);\n\n //track our listener so we can turn off and on\n var listener = {\n handler: handler,\n dereg: deregAngularOn,\n eventId: eventId,\n scope: scope,\n _this: _this\n };\n self.listeners.push(listener);\n\n var removeListener = function() {\n listener.dereg();\n var index = self.listeners.indexOf(listener);\n self.listeners.splice(index, 1);\n };\n\n //destroy tracking when scope is destroyed\n scope.$on('$destroy', function() {\n removeListener();\n });\n\n return removeListener;\n };\n };\n\n function registerEventWithAngular(eventId, handler, gantt, _this) {\n return $rootScope.$on(eventId, function() {\n var args = Array.prototype.slice.call(arguments);\n args.splice(0, 1); //remove evt argument\n handler.apply(_this ? _this : gantt.api, args);\n });\n }\n\n /**\n * @ngdoc function\n * @name registerEventsFromObject\n * @methodOf gantt.class:GanttApi\n * @description Registers features and events from a simple objectMap.\n * eventObjectMap must be in this format (multiple features allowed)\n * <pre>\n * {featureName:\n * {\n * eventNameOne:function(args){},\n * eventNameTwo:function(args){}\n * }\n * }\n * </pre>\n * @param {object} eventObjectMap map of feature/event names\n */\n GanttApi.prototype.registerEventsFromObject = function(eventObjectMap) {\n var self = this;\n var features = [];\n angular.forEach(eventObjectMap, function(featProp, featPropName) {\n var feature = {name: featPropName, events: []};\n angular.forEach(featProp, function(prop, propName) {\n feature.events.push(propName);\n });\n features.push(feature);\n });\n\n features.forEach(function(feature) {\n feature.events.forEach(function(event) {\n self.registerEvent(feature.name, event);\n });\n });\n\n };\n\n /**\n * @ngdoc function\n * @name registerMethod\n * @methodOf gantt.class:GanttApi\n * @description Registers a new event for the given feature\n * @param {string} featureName name of the feature\n * @param {string} methodName name of the method\n * @param {object} callBackFn function to execute\n * @param {object} _this binds callBackFn 'this' to _this. Defaults to ganttApi.gantt\n */\n GanttApi.prototype.registerMethod = function(featureName, methodName, callBackFn, _this) {\n if (!this[featureName]) {\n this[featureName] = {};\n }\n\n var feature = this[featureName];\n\n feature[methodName] = utils.createBoundedWrapper(_this || this.gantt, callBackFn);\n };\n\n /**\n * @ngdoc function\n * @name registerMethodsFromObject\n * @methodOf gantt.class:GanttApi\n * @description Registers features and methods from a simple objectMap.\n * eventObjectMap must be in this format (multiple features allowed)\n * <br>\n * {featureName:\n * {\n * methodNameOne:function(args){},\n * methodNameTwo:function(args){}\n * }\n * @param {object} eventObjectMap map of feature/event names\n * @param {object} _this binds this to _this for all functions. Defaults to ganttApi.gantt\n */\n GanttApi.prototype.registerMethodsFromObject = function(methodMap, _this) {\n var self = this;\n var features = [];\n angular.forEach(methodMap, function(featProp, featPropName) {\n var feature = {name: featPropName, methods: []};\n angular.forEach(featProp, function(prop, propName) {\n feature.methods.push({name: propName, fn: prop});\n });\n features.push(feature);\n });\n\n features.forEach(function(feature) {\n feature.methods.forEach(function(method) {\n self.registerMethod(feature.name, method.name, method.fn, _this);\n });\n });\n\n };\n\n return GanttApi;\n\n }]);\n\n})();\n","(function() {\n 'use strict';\n angular.module('gantt').factory('GanttOptions', [function() {\n var GanttOptions = function(values, defaultValues) {\n this.defaultValues = defaultValues;\n this.values = values;\n\n this.defaultValue = function(optionName) {\n var defaultValue = this.defaultValues[optionName];\n if (angular.isFunction(defaultValue)) {\n defaultValue = defaultValue();\n }\n\n return defaultValue;\n };\n\n this.sanitize = function(optionName, optionValue) {\n if (!optionValue) {\n var defaultValue = this.defaultValue(optionName);\n if (defaultValue !== undefined) {\n if (optionValue !== undefined && typeof defaultValue === 'boolean') {\n return optionValue;\n }\n\n return defaultValue;\n }\n }\n\n return optionValue;\n };\n\n this.value = function(optionName) {\n return this.sanitize(optionName, this.values[optionName]);\n };\n\n this.set = function(optionName, optionValue) {\n this.values[optionName] = optionValue;\n };\n\n this.initialize = function() {\n for (var optionName in this.values) {\n var optionValue = this.values[optionName];\n if (this.values.hasOwnProperty(optionName)) {\n this.values[optionName] = this.value(optionName, optionValue);\n }\n }\n return this.values;\n };\n };\n\n return GanttOptions;\n }]);\n}());\n","(function(){\n 'use strict';\n /**\n * Calendar factory is used to define working periods, non working periods, and other specific period of time,\n * and retrieve effective timeFrames for each day of the gantt.\n */\n angular.module('gantt').factory('GanttCalendar', ['$filter', 'moment', function($filter, moment) {\n /**\n * TimeFrame represents time frame in any day. parameters are given using options object.\n *\n * @param {moment|string} start start of timeFrame. If a string is given, it will be parsed as a moment.\n * @param {moment|string} end end of timeFrame. If a string is given, it will be parsed as a moment.\n * @param {boolean} working is this timeFrame flagged as working.\n * @param {boolean} magnet is this timeFrame will magnet.\n * @param {boolean} default is this timeFrame will be used as default.\n * @param {color} css color attached to this timeFrame.\n * @param {string} classes css classes attached to this timeFrame.\n *\n * @constructor\n */\n var TimeFrame = function(options) {\n if (options === undefined) {\n options = {};\n }\n\n this.start = options.start;\n this.end = options.end;\n this.working = options.working;\n this.magnet = options.magnet !== undefined ? options.magnet : true;\n this.default = options.default;\n this.color = options.color;\n this.classes = options.classes;\n };\n\n TimeFrame.prototype.updateView = function() {\n if (this.$element) {\n var cssStyles = {};\n\n if (this.left !== undefined) {\n cssStyles.left = this.left + 'px';\n } else {\n cssStyles.left = '';\n }\n if (this.width !== undefined) {\n cssStyles.width = this.width + 'px';\n } else {\n cssStyles.width = '';\n }\n\n if (this.color !== undefined) {\n cssStyles['background-color'] = this.color;\n } else {\n cssStyles['background-color'] = '';\n }\n\n this.$element.css(cssStyles);\n\n var classes = ['gantt-timeframe' + (this.working ? '' : '-non') + '-working'];\n if (this.classes) {\n classes = classes.concat(this.classes);\n }\n for (var i = 0, l = classes.length; i < l; i++) {\n this.$element.toggleClass(classes[i], true);\n }\n }\n };\n\n TimeFrame.prototype.getDuration = function() {\n if (this.end !== undefined && this.start !== undefined) {\n return this.end.diff(this.start, 'milliseconds');\n }\n };\n\n TimeFrame.prototype.clone = function() {\n return new TimeFrame(this);\n };\n\n /**\n * TimeFrameMapping defines how timeFrames will be placed for each days. parameters are given using options object.\n *\n * @param {function} func a function with date parameter, that will be evaluated for each distinct day of the gantt.\n * this function must return an array of timeFrame names to apply.\n * @constructor\n */\n var TimeFrameMapping = function(func) {\n this.func = func;\n };\n\n TimeFrameMapping.prototype.getTimeFrames = function(date) {\n var ret = this.func(date);\n if (!(ret instanceof Array)) {\n ret = [ret];\n }\n return ret;\n };\n\n TimeFrameMapping.prototype.clone = function() {\n return new TimeFrameMapping(this.func);\n };\n\n /**\n * A DateFrame is date range that will use a specific TimeFrameMapping, configured using a function (evaluator),\n * a date (date) or a date range (start, end). parameters are given using options object.\n *\n * @param {function} evaluator a function with date parameter, that will be evaluated for each distinct day of the gantt.\n * this function must return a boolean representing matching of this dateFrame or not.\n * @param {moment} date date of dateFrame.\n * @param {moment} start start of date frame.\n * @param {moment} end end of date frame.\n * @param {array} targets array of TimeFrameMappings/TimeFrames names to use for this date frame.\n * @param {boolean} default is this dateFrame will be used as default.\n * @constructor\n */\n var DateFrame = function(options) {\n this.evaluator = options.evaluator;\n if (options.date) {\n this.start = moment(options.date).startOf('day');\n this.end = moment(options.date).endOf('day');\n } else {\n this.start = options.start;\n this.end = options.end;\n }\n if (options.targets instanceof Array) {\n this.targets = options.targets;\n } else {\n this.targets = [options.targets];\n }\n this.default = options.default;\n };\n\n DateFrame.prototype.dateMatch = function(date) {\n if (this.evaluator) {\n return this.evaluator(date);\n } else if (this.start && this.end) {\n return date >= this.start && date <= this.end;\n } else {\n return false;\n }\n };\n\n DateFrame.prototype.clone = function() {\n return new DateFrame(this);\n };\n\n\n\n /**\n * Register TimeFrame, TimeFrameMapping and DateMapping objects into Calendar object,\n * and use Calendar#getTimeFrames(date) function to retrieve effective timeFrames for a specific day.\n *\n * @constructor\n */\n var Calendar = function() {\n this.timeFrames = {};\n this.timeFrameMappings = {};\n this.dateFrames = {};\n };\n\n /**\n * Remove all objects.\n */\n Calendar.prototype.clear = function() {\n this.timeFrames = {};\n this.timeFrameMappings = {};\n this.dateFrames = {};\n };\n\n /**\n * Register TimeFrame objects.\n *\n * @param {object} timeFrames with names of timeFrames for keys and TimeFrame objects for values.\n */\n Calendar.prototype.registerTimeFrames = function(timeFrames) {\n angular.forEach(timeFrames, function(timeFrame, name) {\n this.timeFrames[name] = new TimeFrame(timeFrame);\n }, this);\n };\n\n /**\n * Removes TimeFrame objects.\n *\n * @param {array} timeFrames names of timeFrames to remove.\n */\n Calendar.prototype.removeTimeFrames = function(timeFrames) {\n angular.forEach(timeFrames, function(name) {\n delete this.timeFrames[name];\n }, this);\n };\n\n /**\n * Remove all TimeFrame objects.\n */\n Calendar.prototype.clearTimeFrames = function() {\n this.timeFrames = {};\n };\n\n /**\n * Register TimeFrameMapping objects.\n *\n * @param {object} mappings object with names of timeFrames mappings for keys and TimeFrameMapping objects for values.\n */\n Calendar.prototype.registerTimeFrameMappings = function(mappings) {\n angular.forEach(mappings, function(timeFrameMapping, name) {\n this.timeFrameMappings[name] = new TimeFrameMapping(timeFrameMapping);\n }, this);\n };\n\n /**\n * Removes TimeFrameMapping objects.\n *\n * @param {array} mappings names of timeFrame mappings to remove.\n */\n Calendar.prototype.removeTimeFrameMappings = function(mappings) {\n angular.forEach(mappings, function(name) {\n delete this.timeFrameMappings[name];\n }, this);\n };\n\n /**\n * Removes all TimeFrameMapping objects.\n */\n Calendar.prototype.clearTimeFrameMappings = function() {\n this.timeFrameMappings = {};\n };\n\n /**\n * Register DateFrame objects.\n *\n * @param {object} dateFrames object with names of dateFrames for keys and DateFrame objects for values.\n */\n Calendar.prototype.registerDateFrames = function(dateFrames) {\n angular.forEach(dateFrames, function(dateFrame, name) {\n this.dateFrames[name] = new DateFrame(dateFrame);\n }, this);\n };\n\n /**\n * Remove DateFrame objects.\n *\n * @param {array} mappings names of date frames to remove.\n */\n Calendar.prototype.removeDateFrames = function(dateFrames) {\n angular.forEach(dateFrames, function(name) {\n delete this.dateFrames[name];\n }, this);\n };\n\n /**\n * Removes all DateFrame objects.\n */\n Calendar.prototype.clearDateFrames = function() {\n this.dateFrames = {};\n };\n\n var filterDateFrames = function(inputDateFrames, date) {\n var dateFrames = [];\n angular.forEach(inputDateFrames, function(dateFrame) {\n if (dateFrame.dateMatch(date)) {\n dateFrames.push(dateFrame);\n }\n });\n if (dateFrames.length === 0) {\n angular.forEach(inputDateFrames, function(dateFrame) {\n if (dateFrame.default) {\n dateFrames.push(dateFrame);\n }\n });\n }\n return dateFrames;\n };\n\n /**\n * Retrieves TimeFrame objects for a given date, using whole configuration for this Calendar object.\n *\n * @param {moment} date\n *\n * @return {array} an array of TimeFrame objects.\n */\n Calendar.prototype.getTimeFrames = function(date) {\n var timeFrames = [];\n var dateFrames = filterDateFrames(this.dateFrames, date);\n\n angular.forEach(dateFrames, function(dateFrame) {\n if (dateFrame !== undefined) {\n angular.forEach(dateFrame.targets, function(timeFrameMappingName) {\n var timeFrameMapping = this.timeFrameMappings[timeFrameMappingName];\n if (timeFrameMapping !== undefined) {\n // If a timeFrame mapping is found\n timeFrames.push(timeFrameMapping.getTimeFrames());\n } else {\n // If no timeFrame mapping is found, try using direct timeFrame\n var timeFrame = this.timeFrames[timeFrameMappingName];\n if (timeFrame !== undefined) {\n timeFrames.push(timeFrame);\n }\n }\n }, this);\n }\n }, this);\n\n var dateYear = date.year();\n var dateMonth = date.month();\n var dateDate = date.date();\n\n var validatedTimeFrames = [];\n if (timeFrames.length === 0) {\n angular.forEach(this.timeFrames, function(timeFrame) {\n if (timeFrame.default) {\n timeFrames.push(timeFrame);\n }\n });\n }\n\n angular.forEach(timeFrames, function(timeFrame) {\n timeFrame = timeFrame.clone();\n\n if (timeFrame.start !== undefined) {\n timeFrame.start.year(dateYear);\n timeFrame.start.month(dateMonth);\n timeFrame.start.date(dateDate);\n }\n\n if (timeFrame.end !== undefined) {\n timeFrame.end.year(dateYear);\n timeFrame.end.month(dateMonth);\n timeFrame.end.date(dateDate);\n\n if (moment(timeFrame.end).startOf('day') === timeFrame.end) {\n timeFrame.end.add(1, 'day');\n }\n }\n\n validatedTimeFrames.push(timeFrame);\n });\n\n return validatedTimeFrames;\n };\n\n /**\n * Solve timeFrames using two rules.\n *\n * 1) If at least one working timeFrame is defined, everything outside\n * defined timeFrames is considered as non-working. Else it's considered\n * as working.\n *\n * 2) Smaller timeFrames have priority over larger one.\n *\n * @param {array} timeFrames Array of timeFrames to solve\n * @param {moment} startDate\n * @param {moment} endDate\n */\n Calendar.prototype.solve = function(timeFrames, startDate, endDate) {\n var defaultWorking = timeFrames.length === 0;\n var color;\n var classes;\n var minDate;\n var maxDate;\n\n angular.forEach(timeFrames, function(timeFrame) {\n if (minDate === undefined || minDate > timeFrame.start) {\n minDate = timeFrame.start;\n }\n if (maxDate === undefined || maxDate < timeFrame.end) {\n maxDate = timeFrame.end;\n }\n if (color === undefined && timeFrame.color) {\n color = timeFrame.color;\n }\n if (timeFrame.classes !== undefined) {\n if (classes === undefined) {\n classes = [];\n }\n classes = classes.concat(timeFrame.classes);\n }\n });\n\n if (startDate === undefined) {\n startDate = minDate;\n }\n\n if (endDate === undefined) {\n endDate = maxDate;\n }\n\n var solvedTimeFrames = [new TimeFrame({start: startDate, end: endDate, working: defaultWorking, magnet: false, color: color, classes: classes})];\n\n timeFrames = $filter('filter')(timeFrames, function(timeFrame) {\n return (timeFrame.start === undefined || timeFrame.start < endDate) && (timeFrame.end === undefined || timeFrame.end > startDate);\n });\n\n var orderedTimeFrames = $filter('orderBy')(timeFrames, function(timeFrame) {\n return -timeFrame.getDuration();\n });\n\n angular.forEach(orderedTimeFrames, function(timeFrame) {\n var tmpSolvedTimeFrames = solvedTimeFrames.slice();\n\n var i=0;\n var dispatched = false;\n var treated = false;\n angular.forEach(solvedTimeFrames, function(solvedTimeFrame) {\n if (!treated) {\n if (timeFrame.end > solvedTimeFrame.start && timeFrame.start < solvedTimeFrame.end) {\n // timeFrame is included in this solvedTimeFrame.\n // solvedTimeFrame:|ssssssssssssssssssssssssssssssssss|\n // timeFrame: |tttttt|\n // result:|sssssssss|tttttt|sssssssssssssssss|\n\n var newSolvedTimeFrame = solvedTimeFrame.clone();\n\n solvedTimeFrame.end = moment(timeFrame.start);\n newSolvedTimeFrame.start = moment(timeFrame.end);\n\n tmpSolvedTimeFrames.splice(i + 1, 0, timeFrame.clone(), newSolvedTimeFrame);\n treated = true;\n dispatched = false;\n } else if (!dispatched && timeFrame.start < solvedTimeFrame.end) {\n // timeFrame is dispatched on two solvedTimeFrame.\n // First part\n // solvedTimeFrame:|sssssssssssssssssssssssssssssssssss|s+1;s+1;s+1;s+1;s+1;s+1|\n // timeFrame: |tttttt|\n // result:|sssssssssssssssssssssssssssssss|tttttt|;s+1;s+1;s+1;s+1;s+1|\n\n solvedTimeFrame.end = moment(timeFrame.start);\n tmpSolvedTimeFrames.splice(i + 1, 0, timeFrame.clone());\n\n dispatched = true;\n } else if (dispatched && timeFrame.end > solvedTimeFrame.start) {\n // timeFrame is dispatched on two solvedTimeFrame.\n // Second part\n\n solvedTimeFrame.start = moment(timeFrame.end);\n dispatched = false;\n treated = true;\n }\n i++;\n }\n });\n\n solvedTimeFrames = tmpSolvedTimeFrames;\n });\n\n solvedTimeFrames = $filter('filter')(solvedTimeFrames, function(timeFrame) {\n return (timeFrame.start === undefined || timeFrame.start < endDate) && (timeFrame.end === undefined || timeFrame.end > startDate);\n });\n\n return solvedTimeFrames;\n\n };\n\n return Calendar;\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttCurrentDateManager', ['moment', function(moment) {\n var GanttCurrentDateManager = function(gantt) {\n var self = this;\n\n this.gantt = gantt;\n\n this.date = undefined;\n this.position = undefined;\n this.currentDateColumn = undefined;\n\n this.gantt.$scope.simplifyMoment = function(d) {\n return moment.isMoment(d) ? d.unix() : d;\n };\n\n this.gantt.$scope.$watchGroup(['currentDate', 'simplifyMoment(currentDateValue)'], function(newValues, oldValues) {\n if (newValues !== oldValues) {\n self.setCurrentDate(self.gantt.options.value('currentDateValue'));\n }\n });\n };\n\n GanttCurrentDateManager.prototype.setCurrentDate = function(currentDate) {\n this.date = currentDate;\n var oldColumn = this.currentDateColumn;\n var newColumn;\n\n if (this.date !== undefined && this.gantt.options.value('currentDate') === 'column') {\n newColumn = this.gantt.columnsManager.getColumnByDate(this.date, true);\n }\n this.currentDateColumn = newColumn;\n\n if (oldColumn !== newColumn) {\n if (oldColumn !== undefined) {\n oldColumn.currentDate = false;\n oldColumn.updateView();\n }\n if (newColumn !== undefined) {\n newColumn.currentDate = true;\n newColumn.updateView();\n }\n }\n\n this.position = this.gantt.getPositionByDate(this.date, true);\n };\n return GanttCurrentDateManager;\n }]);\n}());\n","(function() {\n 'use strict';\n angular.module('gantt').factory('GanttColumn', ['moment', function(moment) {\n // Used to display the Gantt grid and header.\n // The columns are generated by the column generator.\n var Column = function(date, endDate, left, width, calendar, timeFramesWorkingMode, timeFramesNonWorkingMode) {\n this.date = date;\n this.endDate = endDate;\n this.left = left;\n this.width = width;\n this.calendar = calendar;\n this.duration = this.endDate.diff(this.date, 'milliseconds');\n this.timeFramesWorkingMode = timeFramesWorkingMode;\n this.timeFramesNonWorkingMode = timeFramesNonWorkingMode;\n this.timeFrames = [];\n this.currentDate = false;\n this.visibleTimeFrames = [];\n this.daysTimeFrames = {};\n this.cropped = false;\n this.originalSize = {left: this.left, width: this.width};\n this.updateTimeFrames();\n };\n\n var getDateKey = function(date) {\n return date.year() + '-' + date.month() + '-' + date.date();\n };\n\n Column.prototype.updateView = function() {\n if (this.$element) {\n if (this.currentDate) {\n this.$element.addClass('gantt-foreground-col-current-date');\n } else {\n this.$element.removeClass('gantt-foreground-col-current-date');\n }\n\n this.$element.css({'left': this.left + 'px', 'width': this.width + 'px'});\n\n for (var i = 0, l = this.timeFrames.length; i < l; i++) {\n this.timeFrames[i].updateView();\n }\n }\n };\n\n Column.prototype.updateTimeFrames = function() {\n var self = this;\n\n if (self.calendar !== undefined && (self.timeFramesNonWorkingMode !== 'hidden' || self.timeFramesWorkingMode !== 'hidden')) {\n var buildPushTimeFrames = function(timeFrames, startDate, endDate) {\n return function(timeFrame) {\n var start = timeFrame.start;\n if (start === undefined) {\n start = startDate;\n }\n\n var end = timeFrame.end;\n if (end === undefined) {\n end = endDate;\n }\n\n if (start < self.date) {\n start = self.date;\n }\n\n if (end > self.endDate) {\n end = self.endDate;\n }\n\n timeFrame = timeFrame.clone();\n\n timeFrame.start = moment(start);\n timeFrame.end = moment(end);\n\n timeFrames.push(timeFrame);\n };\n };\n\n var cDate = self.date;\n var cDateStartOfDay = moment(cDate).startOf('day');\n var cDateNextDay = cDateStartOfDay.add(1, 'day');\n while (cDate < self.endDate) {\n var timeFrames = self.calendar.getTimeFrames(cDate);\n var nextCDate = moment.min(cDateNextDay, self.endDate);\n timeFrames = self.calendar.solve(timeFrames, cDate, nextCDate);\n var cTimeFrames = [];\n angular.forEach(timeFrames, buildPushTimeFrames(cTimeFrames, cDate, nextCDate));\n self.timeFrames = self.timeFrames.concat(cTimeFrames);\n\n var cDateKey = getDateKey(cDate);\n self.daysTimeFrames[cDateKey] = cTimeFrames;\n\n cDate = nextCDate;\n cDateStartOfDay = moment(cDate).startOf('day');\n cDateNextDay = cDateStartOfDay.add(1, 'day');\n }\n\n angular.forEach(self.timeFrames, function(timeFrame) {\n var positionDuration = timeFrame.start.diff(self.date, 'milliseconds');\n var position = positionDuration / self.duration * self.width;\n\n var timeFrameDuration = timeFrame.end.diff(timeFrame.start, 'milliseconds');\n var timeFramePosition = timeFrameDuration / self.duration * self.width;\n\n var hidden = false;\n if (timeFrame.working && self.timeFramesWorkingMode !== 'visible') {\n hidden = true;\n } else if (!timeFrame.working && self.timeFramesNonWorkingMode !== 'visible') {\n hidden = true;\n }\n\n if (!hidden) {\n self.visibleTimeFrames.push(timeFrame);\n }\n\n timeFrame.hidden = hidden;\n timeFrame.left = position;\n timeFrame.width = timeFramePosition;\n timeFrame.originalSize = {left: timeFrame.left, width: timeFrame.width};\n });\n\n if (self.timeFramesNonWorkingMode === 'cropped' || self.timeFramesWorkingMode === 'cropped') {\n var timeFramesWidth = 0;\n angular.forEach(self.timeFrames, function(timeFrame) {\n if (!timeFrame.working && self.timeFramesNonWorkingMode !== 'cropped' ||\n timeFrame.working && self.timeFramesWorkingMode !== 'cropped') {\n timeFramesWidth += timeFrame.width;\n }\n });\n\n if (timeFramesWidth !== self.width) {\n var croppedRatio = self.width / timeFramesWidth;\n var croppedWidth = 0;\n var originalCroppedWidth = 0;\n\n var allCropped = true;\n\n angular.forEach(self.timeFrames, function(timeFrame) {\n if (!timeFrame.working && self.timeFramesNonWorkingMode !== 'cropped' ||\n timeFrame.working && self.timeFramesWorkingMode !== 'cropped') {\n timeFrame.left = (timeFrame.left - croppedWidth) * croppedRatio;\n timeFrame.width = timeFrame.width * croppedRatio;\n timeFrame.originalSize.left = (timeFrame.originalSize.left - originalCroppedWidth) * croppedRatio;\n timeFrame.originalSize.width = timeFrame.originalSize.width * croppedRatio;\n timeFrame.cropped = false;\n allCropped = false;\n } else {\n croppedWidth += timeFrame.width;\n originalCroppedWidth += timeFrame.originalSize.width;\n timeFrame.left = undefined;\n timeFrame.width = 0;\n timeFrame.originalSize = {left: undefined, width: 0};\n timeFrame.cropped = true;\n }\n });\n\n self.cropped = allCropped;\n } else {\n self.cropped = false;\n }\n }\n }\n };\n\n Column.prototype.clone = function() {\n return new Column(moment(this.date), moment(this.endDate), this.left, this.width, this.calendar);\n };\n\n Column.prototype.containsDate = function(date) {\n return date > this.date && date <= this.endDate;\n };\n\n Column.prototype.equals = function(other) {\n return this.date === other.date;\n };\n\n Column.prototype.roundTo = function(date, unit, offset, midpoint) {\n // Waiting merge of https://github.com/moment/moment/pull/1794\n if (unit === 'day') {\n // Inconsistency in units in momentJS.\n unit = 'date';\n }\n\n offset = offset || 1;\n var value = date.get(unit);\n\n switch (midpoint) {\n case 'up':\n value = Math.ceil(value / offset);\n break;\n case 'down':\n value = Math.floor(value / offset);\n break;\n default:\n value = Math.round(value / offset);\n break;\n }\n\n var units = ['millisecond', 'second', 'minute', 'hour', 'date', 'month', 'year'];\n date.set(unit, value * offset);\n\n var indexOf = units.indexOf(unit);\n for (var i = 0; i < indexOf; i++) {\n date.set(units[i], 0);\n }\n\n return date;\n };\n\n Column.prototype.getMagnetDate = function(date, magnetValue, magnetUnit, timeFramesMagnet) {\n if (magnetValue > 0 && magnetUnit !== undefined) {\n var initialDate = date;\n date = moment(date);\n\n if (magnetUnit === 'column') {\n // Snap to column borders only.\n var position = this.getPositionByDate(date);\n\n if (position < this.width / 2) {\n date = moment(this.date);\n } else {\n date = moment(this.endDate);\n }\n } else {\n // Round the value\n date = this.roundTo(date, magnetUnit, magnetValue);\n\n // Snap to column borders if date overflows.\n if (date < this.date) {\n date = moment(this.date);\n } else if (date > this.endDate) {\n date = moment(this.endDate);\n }\n }\n\n if (timeFramesMagnet) {\n var maxTimeFrameDiff = Math.abs(initialDate.diff(date, 'milliseconds'));\n var currentTimeFrameDiff;\n\n for (var i=0; i<this.timeFrames.length; i++) {\n var timeFrame = this.timeFrames[i];\n if (timeFrame.magnet) {\n var previousTimeFrame = this.timeFrames[i-1];\n var nextTimeFrame = this.timeFrames[i+1];\n var timeFrameDiff;\n\n if (previousTimeFrame === undefined || previousTimeFrame.working !== timeFrame.working) {\n timeFrameDiff = Math.abs(initialDate.diff(timeFrame.start, 'milliseconds'));\n if (timeFrameDiff < maxTimeFrameDiff && (currentTimeFrameDiff === undefined || timeFrameDiff < currentTimeFrameDiff)) {\n currentTimeFrameDiff = timeFrameDiff;\n date = timeFrame.start;\n }\n }\n\n if (nextTimeFrame === undefined || nextTimeFrame.working !== timeFrame.working) {\n timeFrameDiff = Math.abs(initialDate.diff(timeFrame.end, 'milliseconds'));\n if (timeFrameDiff < maxTimeFrameDiff && (currentTimeFrameDiff === undefined || timeFrameDiff < currentTimeFrameDiff)) {\n currentTimeFrameDiff = timeFrameDiff;\n date = timeFrame.end;\n }\n }\n }\n }\n }\n }\n return date;\n };\n\n Column.prototype.getDateByPositionUsingTimeFrames = function(position) {\n for (var i = 0, l = this.timeFrames.length; i < l; i++) {\n // TODO: performance optimization could be done.\n var timeFrame = this.timeFrames[i];\n if (!timeFrame.cropped && position >= timeFrame.left && position <= timeFrame.left + timeFrame.width) {\n var positionDuration = timeFrame.getDuration() / timeFrame.width * (position - timeFrame.left);\n var date = moment(timeFrame.start).add(positionDuration, 'milliseconds');\n return date;\n }\n }\n };\n\n Column.prototype.getDateByPosition = function(position, magnetValue, magnetUnit, timeFramesMagnet) {\n var positionDuration;\n var date;\n\n if (position < 0) {\n position = 0;\n }\n if (position > this.width) {\n position = this.width;\n }\n\n if (this.timeFramesNonWorkingMode === 'cropped' || this.timeFramesWorkingMode === 'cropped') {\n date = this.getDateByPositionUsingTimeFrames(position);\n }\n\n if (date === undefined) {\n positionDuration = this.duration / this.width * position;\n date = moment(this.date).add(positionDuration, 'milliseconds');\n }\n\n date = this.getMagnetDate(date, magnetValue, magnetUnit, timeFramesMagnet);\n\n return date;\n };\n\n Column.prototype.getDayTimeFrame = function(date) {\n var dtf = this.daysTimeFrames[getDateKey(date)];\n if (dtf === undefined) {\n return [];\n }\n return dtf;\n };\n\n Column.prototype.getPositionByDate = function(date) {\n var positionDuration;\n var position;\n\n if (this.timeFramesNonWorkingMode === 'cropped' || this.timeFramesWorkingMode === 'cropped') {\n var croppedDate = date;\n var timeFrames = this.getDayTimeFrame(croppedDate);\n for (var i = 0; i < timeFrames.length; i++) {\n var timeFrame = timeFrames[i];\n if (croppedDate >= timeFrame.start && croppedDate <= timeFrame.end) {\n if (timeFrame.cropped) {\n if (timeFrames.length > i + 1) {\n croppedDate = timeFrames[i + 1].start;\n } else {\n croppedDate = timeFrame.end;\n }\n } else {\n positionDuration = croppedDate.diff(timeFrame.start, 'milliseconds');\n position = positionDuration / timeFrame.getDuration() * timeFrame.width;\n return this.left + timeFrame.left + position;\n }\n }\n }\n }\n\n positionDuration = date.diff(this.date, 'milliseconds');\n position = positionDuration / this.duration * this.width;\n\n if (position < 0) {\n position = 0;\n }\n\n if (position > this.width) {\n position = this.width;\n }\n\n return this.left + position;\n };\n\n return Column;\n }]);\n}());\n\n","(function() {\n 'use strict';\n angular.module('gantt').factory('GanttColumnGenerator', ['GanttColumn', 'moment', function(Column, moment) {\n var ColumnGenerator = function(columnsManager) {\n var self = this;\n\n this.columnsManager = columnsManager;\n\n // Generates one column for each time unit between the given from and to date.\n self.generate = function(from, to, maximumWidth, leftOffset, reverse) {\n if (!to && !maximumWidth) {\n throw 'to or maximumWidth must be defined';\n }\n\n var viewScale = self.columnsManager.gantt.options.value('viewScale');\n viewScale = viewScale.trim();\n if (viewScale.charAt(viewScale.length - 1) === 's') {\n viewScale = viewScale.substring(0, viewScale.length - 1);\n }\n var viewScaleValue;\n var viewScaleUnit;\n var splittedViewScale;\n\n if (viewScale) {\n splittedViewScale = viewScale.split(' ');\n }\n if (splittedViewScale && splittedViewScale.length > 1) {\n viewScaleValue = parseFloat(splittedViewScale[0]);\n viewScaleUnit = splittedViewScale[splittedViewScale.length - 1];\n } else {\n viewScaleValue = 1;\n viewScaleUnit = viewScale;\n }\n\n var calendar = self.columnsManager.gantt.calendar;\n var timeFramesWorkingMode = self.columnsManager.gantt.options.value('timeFramesWorkingMode');\n var timeFramesNonWorkingMode = self.columnsManager.gantt.options.value('timeFramesNonWorkingMode');\n var columnWidth = self.columnsManager.getColumnsWidth();\n\n var excludeTo = false;\n from = moment(from).startOf(viewScaleUnit);\n if (to) {\n excludeTo = isToDateToExclude(to);\n to = moment(to).startOf(viewScaleUnit);\n }\n\n var date = moment(from).startOf(viewScaleUnit);\n if (reverse) {\n date.add(-viewScaleValue, viewScaleUnit);\n }\n var generatedCols = [];\n var left = 0;\n\n while (true) {\n if (maximumWidth && Math.abs(left) > maximumWidth + columnWidth) {\n break;\n }\n\n var startDate = moment(date);\n var endDate = moment(startDate).add(viewScaleValue, viewScaleUnit);\n ensureNoUnitOverflow(viewScaleUnit, startDate, endDate);\n\n var column = new Column(startDate, endDate, leftOffset ? left + leftOffset : left, columnWidth, calendar, timeFramesWorkingMode, timeFramesNonWorkingMode);\n if (!column.cropped) {\n generatedCols.push(column);\n if (reverse) {\n left -= columnWidth;\n } else {\n left += columnWidth;\n }\n\n if (to) {\n if (reverse) {\n if (excludeTo && date < to || !excludeTo && date <= to) {\n break;\n }\n } else {\n if (excludeTo && date > to || !excludeTo && date >= to) {\n break;\n }\n }\n }\n }\n if (reverse) {\n date.add(-viewScaleValue, viewScaleUnit);\n ensureNoUnitOverflow(viewScaleUnit, date, startDate);\n } else {\n date.add(viewScaleValue, viewScaleUnit);\n ensureNoUnitOverflow(viewScaleUnit, startDate, date);\n }\n }\n\n if (reverse) {\n if (isToDateToExclude(from, viewScaleValue, viewScaleUnit)) {\n generatedCols.shift();\n }\n generatedCols.reverse();\n }\n\n return generatedCols;\n };\n\n // Columns are generated including or excluding the to date.\n // If the To date is the first day of month and the time is 00:00 then no new column is generated for this month.\n\n var isToDateToExclude = function(to, value, unit) {\n return moment(to).add(value, unit).startOf(unit) === to;\n };\n\n var ensureNoUnitOverflow = function(unit, startDate, endDate) {\n var v1 = startDate.get(unit);\n var v2 = endDate.get(unit);\n var firstValue = getFirstValue(unit);\n if (firstValue !== undefined && v2 !== firstValue && v2 < v1) {\n endDate.set(unit, firstValue);\n }\n };\n\n var getFirstValue = function(unit) {\n if (['hour', 'minute', 'second', 'millisecond'].indexOf(unit) >= 0) {\n return 0;\n }\n };\n };\n return ColumnGenerator;\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttColumnHeader', [ 'moment', 'GanttColumn', function(moment, Column) {\n // Used to display the Gantt grid and header.\n // The columns are generated by the column generator.\n\n var ColumnHeader = function(date, viewScaleValue, viewScaleUnit, left, width, labelFormat) {\n var startDate = moment(date);\n var endDate = moment(startDate).add(viewScaleValue, viewScaleUnit);\n\n var column = new Column(startDate, endDate, left, width);\n column.unit = viewScaleUnit;\n column.label = angular.isFunction(labelFormat) ? labelFormat(column): startDate.format(labelFormat);\n\n return column;\n };\n return ColumnHeader;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttColumnsManager', ['GanttColumnGenerator', 'GanttHeaderGenerator', '$filter', '$timeout', 'ganttLayout', 'ganttBinarySearch', 'moment', function(ColumnGenerator, HeaderGenerator, $filter, $timeout, layout, bs, moment) {\n var ColumnsManager = function(gantt) {\n var self = this;\n\n this.gantt = gantt;\n\n this.from = undefined;\n this.to = undefined;\n\n this.columns = [];\n this.visibleColumns = [];\n this.previousColumns = [];\n this.nextColumns = [];\n\n this.headers = [];\n this.visibleHeaders = [];\n\n this.scrollAnchor = undefined;\n\n // Add a watcher if a view related setting changed from outside of the Gantt. Update the gantt accordingly if so.\n // All those changes need a recalculation of the header columns\n this.gantt.$scope.$watchGroup(['viewScale', 'columnWidth', 'timeFramesWorkingMode', 'timeFramesNonWorkingMode', 'fromDate', 'toDate', 'autoExpand', 'taskOutOfRange'], function(newValues, oldValues) {\n if (newValues !== oldValues && self.gantt.rendered) {\n self.generateColumns();\n }\n });\n\n this.gantt.$scope.$watchCollection('headers', function(newValues, oldValues) {\n if (newValues !== oldValues && self.gantt.rendered) {\n self.generateColumns();\n }\n });\n\n this.gantt.$scope.$watchCollection('headersFormats', function(newValues, oldValues) {\n if (newValues !== oldValues && self.gantt.rendered) {\n self.generateColumns();\n }\n });\n\n this.gantt.$scope.$watchGroup(['ganttElementWidth', 'showSide', 'sideWidth', 'maxHeight', 'daily'], function(newValues, oldValues) {\n if (newValues !== oldValues && self.gantt.rendered) {\n self.updateColumnsMeta();\n }\n });\n\n this.gantt.api.data.on.load(this.gantt.$scope, function() {\n if ((self.from === undefined || self.to === undefined ||\n self.from > self.gantt.rowsManager.getDefaultFrom() ||\n self.to < self.gantt.rowsManager.getDefaultTo()) && self.gantt.rendered) {\n self.generateColumns();\n }\n\n self.gantt.rowsManager.sortRows();\n });\n\n this.gantt.api.data.on.remove(this.gantt.$scope, function() {\n self.gantt.rowsManager.sortRows();\n });\n\n this.gantt.api.registerMethod('columns', 'clear', this.clearColumns, this);\n this.gantt.api.registerMethod('columns', 'generate', this.generateColumns, this);\n this.gantt.api.registerMethod('columns', 'refresh', this.updateColumnsMeta, this);\n this.gantt.api.registerMethod('columns', 'getColumnsWidth', this.getColumnsWidth, this);\n this.gantt.api.registerMethod('columns', 'getColumnsWidthToFit', this.getColumnsWidthToFit, this);\n this.gantt.api.registerMethod('columns', 'getDateRange', this.getDateRange, this);\n\n this.gantt.api.registerEvent('columns', 'clear');\n this.gantt.api.registerEvent('columns', 'generate');\n this.gantt.api.registerEvent('columns', 'refresh');\n };\n\n ColumnsManager.prototype.setScrollAnchor = function() {\n if (this.gantt.scroll.$element && this.columns.length > 0) {\n var el = this.gantt.scroll.$element[0];\n var center = el.scrollLeft + el.offsetWidth / 2;\n\n this.scrollAnchor = this.gantt.getDateByPosition(center);\n }\n };\n\n ColumnsManager.prototype.scrollToScrollAnchor = function() {\n var self = this;\n\n if (this.columns.length > 0 && this.scrollAnchor !== undefined) {\n // Ugly but prevents screen flickering (unlike $timeout)\n this.gantt.$scope.$$postDigest(function() {\n self.gantt.api.scroll.toDate(self.scrollAnchor);\n });\n }\n };\n\n ColumnsManager.prototype.clearColumns = function() {\n this.setScrollAnchor();\n\n this.from = undefined;\n this.to = undefined;\n\n this.columns = [];\n this.visibleColumns = [];\n this.previousColumns = [];\n this.nextColumns = [];\n\n this.headers = [];\n this.visibleHeaders = [];\n\n this.gantt.api.columns.raise.clear();\n };\n\n ColumnsManager.prototype.generateColumns = function(from, to) {\n if (!from) {\n from = this.gantt.options.value('fromDate');\n }\n\n if (!to) {\n to = this.gantt.options.value('toDate');\n }\n\n if (!from || (moment.isMoment(from) && !from.isValid())) {\n from = this.gantt.rowsManager.getDefaultFrom();\n if (!from) {\n return false;\n }\n }\n\n if (!to || (moment.isMoment(to) && !to.isValid())) {\n to = this.gantt.rowsManager.getDefaultTo();\n if (!to) {\n return false;\n }\n }\n\n if (from !== undefined && !moment.isMoment(from)) {\n from = moment(from);\n }\n\n if (to !== undefined && !moment.isMoment(to)) {\n to = moment(to);\n }\n\n if (this.gantt.options.value('taskOutOfRange') === 'expand') {\n from = this.gantt.rowsManager.getExpandedFrom(from);\n to = this.gantt.rowsManager.getExpandedTo(to);\n }\n\n this.setScrollAnchor();\n\n this.from = from;\n this.to = to;\n\n var columnGenerator = new ColumnGenerator(this);\n var headerGenerator = new HeaderGenerator(this);\n\n this.columns = columnGenerator.generate(from, to);\n this.headers = headerGenerator.generate(this.columns);\n this.previousColumns = [];\n this.nextColumns = [];\n\n this.updateColumnsMeta();\n this.scrollToScrollAnchor();\n\n this.gantt.api.columns.raise.generate(this.columns, this.headers);\n };\n\n ColumnsManager.prototype.updateColumnsMeta = function() {\n this.gantt.isRefreshingColumns = true;\n\n var lastColumn = this.getLastColumn();\n this.gantt.originalWidth = lastColumn !== undefined ? lastColumn.originalSize.left + lastColumn.originalSize.width : 0;\n\n var columnsWidthChanged = this.updateColumnsWidths(this.columns, this.headers, this.previousColumns, this.nextColumns);\n\n this.gantt.width = lastColumn !== undefined ? lastColumn.left + lastColumn.width : 0;\n\n var showSide = this.gantt.options.value('showSide');\n var sideShown = this.gantt.side.isShown();\n var sideVisibilityChanged = showSide !== sideShown;\n\n if (sideVisibilityChanged && !showSide) {\n // Prevent unnecessary v-scrollbar if side is hidden here\n this.gantt.side.show(false);\n }\n\n this.gantt.rowsManager.updateTasksPosAndSize();\n this.gantt.timespansManager.updateTimespansPosAndSize();\n\n this.updateVisibleColumns(columnsWidthChanged);\n\n this.gantt.rowsManager.updateVisibleObjects();\n\n var currentDateValue = this.gantt.options.value('currentDateValue');\n this.gantt.currentDateManager.setCurrentDate(currentDateValue);\n\n if (sideVisibilityChanged && showSide) {\n // Prevent unnecessary v-scrollbar if side is shown here\n this.gantt.side.show(true);\n }\n\n this.gantt.isRefreshingColumns = false;\n this.gantt.api.columns.raise.refresh(this.columns, this.headers);\n };\n\n // Returns the last Gantt column or undefined\n ColumnsManager.prototype.getLastColumn = function(extended) {\n var columns = this.columns;\n if (extended) {\n columns = this.nextColumns;\n }\n if (columns && columns.length > 0) {\n return columns[columns.length - 1];\n } else {\n return undefined;\n }\n };\n\n // Returns the first Gantt column or undefined\n ColumnsManager.prototype.getFirstColumn = function(extended) {\n var columns = this.columns;\n if (extended) {\n columns = this.previousColumns;\n }\n\n if (columns && columns.length > 0) {\n return columns[0];\n } else {\n return undefined;\n }\n };\n\n // Returns the column at the given or next possible date\n ColumnsManager.prototype.getColumnByDate = function(date, disableExpand) {\n if (!disableExpand) {\n this.expandExtendedColumnsForDate(date);\n }\n var extendedColumns = this.previousColumns.concat(this.columns, this.nextColumns);\n var columns = bs.get(extendedColumns, date, function(c) {\n return c.date;\n }, true);\n return columns[0] !== undefined ? columns[0] : columns[1];\n };\n\n // Returns the column at the given position x (in em)\n ColumnsManager.prototype.getColumnByPosition = function(x, disableExpand) {\n if (!disableExpand) {\n this.expandExtendedColumnsForPosition(x);\n }\n var extendedColumns = this.previousColumns.concat(this.columns, this.nextColumns);\n var columns = bs.get(extendedColumns, x, function(c) {\n return c.left;\n }, true);\n return columns[0] === undefined ? columns[1]: columns[0];\n };\n\n ColumnsManager.prototype.updateColumnsWidths = function(columns, headers, previousColumns, nextColumns) {\n var columnWidth = this.gantt.options.value('columnWidth');\n var expandToFit = this.gantt.options.value('expandToFit');\n var shrinkToFit = this.gantt.options.value('shrinkToFit');\n\n if (columnWidth === undefined || expandToFit || shrinkToFit) {\n var newWidth = this.gantt.getBodyAvailableWidth();\n\n var lastColumn = this.gantt.columnsManager.getLastColumn(false);\n if (lastColumn !== undefined) {\n var currentWidth = lastColumn.originalSize.left + lastColumn.originalSize.width;\n\n if (expandToFit && currentWidth < newWidth ||\n shrinkToFit && currentWidth > newWidth ||\n columnWidth === undefined\n ) {\n var widthFactor = newWidth / currentWidth;\n\n layout.setColumnsWidthFactor(columns, widthFactor);\n angular.forEach(headers, function(header) {\n layout.setColumnsWidthFactor(header, widthFactor);\n });\n // previous and next columns will be generated again on need.\n previousColumns.splice(0, this.previousColumns.length);\n nextColumns.splice(0, this.nextColumns.length);\n return true;\n }\n }\n }\n return false;\n };\n\n ColumnsManager.prototype.getColumnsWidth = function() {\n var columnWidth = this.gantt.options.value('columnWidth');\n if (columnWidth === undefined) {\n if (this.gantt.width <= 0) {\n columnWidth = 20;\n } else {\n columnWidth = this.gantt.width / this.columns.length;\n }\n }\n return columnWidth;\n };\n\n ColumnsManager.prototype.getColumnsWidthToFit = function() {\n return this.gantt.getBodyAvailableWidth() / this.columns.length;\n };\n\n ColumnsManager.prototype.expandExtendedColumnsForPosition = function(x) {\n if (x < 0) {\n var firstColumn = this.getFirstColumn();\n var from = firstColumn.date;\n var firstExtendedColumn = this.getFirstColumn(true);\n if (!firstExtendedColumn || firstExtendedColumn.left > x) {\n this.previousColumns = new ColumnGenerator(this).generate(from, undefined, -x, -this.getColumnsWidth(), true);\n }\n return true;\n } else if (x > this.gantt.width) {\n var lastColumn = this.getLastColumn();\n var endDate = lastColumn.getDateByPosition(lastColumn.width);\n var lastExtendedColumn = this.getLastColumn(true);\n if (!lastExtendedColumn || lastExtendedColumn.left + lastExtendedColumn.width < x) {\n this.nextColumns = new ColumnGenerator(this).generate(endDate, undefined, x - this.gantt.width, this.gantt.width, false);\n }\n return true;\n }\n return false;\n };\n\n ColumnsManager.prototype.expandExtendedColumnsForDate = function(date) {\n var firstColumn = this.getFirstColumn();\n var from;\n if (firstColumn) {\n from = firstColumn.date;\n }\n\n var lastColumn = this.getLastColumn();\n var endDate;\n if (lastColumn) {\n endDate = lastColumn.getDateByPosition(lastColumn.width);\n }\n\n if (from && date < from) {\n var firstExtendedColumn = this.getFirstColumn(true);\n if (!firstExtendedColumn || firstExtendedColumn.date > date) {\n this.previousColumns = new ColumnGenerator(this).generate(from, date, undefined, 0, true);\n }\n return true;\n } else if (endDate && date >= endDate) {\n var lastExtendedColumn = this.getLastColumn(true);\n if (!lastExtendedColumn || lastExtendedColumn.date < endDate) {\n this.nextColumns = new ColumnGenerator(this).generate(endDate, date, undefined, this.gantt.width, false);\n }\n return true;\n }\n return false;\n };\n\n // Returns the number of active headers\n ColumnsManager.prototype.getActiveHeadersCount = function() {\n return this.headers.length;\n };\n\n ColumnsManager.prototype.updateVisibleColumns = function(includeViews) {\n this.visibleColumns = $filter('ganttColumnLimit')(this.columns, this.gantt);\n\n this.visibleHeaders = [];\n angular.forEach(this.headers, function(header) {\n this.visibleHeaders.push($filter('ganttColumnLimit')(header, this.gantt));\n }, this);\n\n if (includeViews) {\n angular.forEach(this.visibleColumns, function(c) {\n c.updateView();\n });\n\n angular.forEach(this.visibleHeaders, function(headerRow) {\n angular.forEach(headerRow, function(header) {\n header.updateView();\n });\n });\n }\n\n var currentDateValue = this.gantt.options.value('currentDateValue');\n this.gantt.currentDateManager.setCurrentDate(currentDateValue);\n };\n\n var defaultHeadersFormats = {'year': 'YYYY', 'quarter': '[Q]Q YYYY', month: 'MMMM YYYY', week: 'w', day: 'D', hour: 'H', minute:'HH:mm'};\n var defaultDayHeadersFormats = {day: 'LL', hour: 'H', minute:'HH:mm'};\n var defaultYearHeadersFormats = {'year': 'YYYY', 'quarter': '[Q]Q', month: 'MMMM'};\n\n ColumnsManager.prototype.getHeaderFormat = function(unit) {\n var format;\n var headersFormats = this.gantt.options.value('headersFormats');\n if (headersFormats !== undefined) {\n format = headersFormats[unit];\n }\n if (format === undefined) {\n var viewScale = this.gantt.options.value('viewScale');\n viewScale = viewScale.trim();\n if (viewScale.charAt(viewScale.length - 1) === 's') {\n viewScale = viewScale.substring(0, viewScale.length - 1);\n }\n\n var viewScaleUnit;\n var splittedViewScale;\n\n if (viewScale) {\n splittedViewScale = viewScale.split(' ');\n }\n if (splittedViewScale && splittedViewScale.length > 1) {\n viewScaleUnit = splittedViewScale[splittedViewScale.length - 1];\n } else {\n viewScaleUnit = viewScale;\n }\n\n if (['millisecond', 'second', 'minute', 'hour'].indexOf(viewScaleUnit) > -1) {\n format = defaultDayHeadersFormats[unit];\n } else if (['month', 'quarter', 'year'].indexOf(viewScaleUnit) > -1) {\n format = defaultYearHeadersFormats[unit];\n }\n if (format === undefined) {\n format = defaultHeadersFormats[unit];\n }\n }\n return format;\n };\n\n ColumnsManager.prototype.getDateRange = function(visibleOnly) {\n var firstColumn, lastColumn;\n\n if (visibleOnly) {\n if (this.visibleColumns && this.visibleColumns.length > 0) {\n firstColumn = this.visibleColumns[0];\n lastColumn = this.visibleColumns[this.visibleColumns.length - 1];\n }\n } else {\n firstColumn = this.getFirstColumn();\n lastColumn = this.getLastColumn();\n }\n\n return firstColumn && lastColumn ? [firstColumn.date, lastColumn.endDate]: undefined;\n };\n\n return ColumnsManager;\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttHeaderGenerator', ['GanttColumnHeader', function(ColumnHeader) {\n var generateHeader = function(columnsManager, columns, viewScale) {\n var generatedHeaders = [];\n var header;\n var prevColDateVal;\n\n var viewScaleValue;\n var viewScaleUnit;\n var splittedViewScale;\n\n if (viewScale) {\n splittedViewScale = viewScale.split(' ');\n }\n if (splittedViewScale && splittedViewScale.length > 1) {\n viewScaleValue = parseFloat(splittedViewScale[0]);\n viewScaleUnit = splittedViewScale[splittedViewScale.length - 1];\n } else {\n viewScaleValue = 1;\n viewScaleUnit = viewScale;\n }\n\n for (var i = 0, l = columns.length; i < l; i++) {\n var col = columns[i];\n var colDateVal = col.date.get(viewScaleUnit);\n if (i === 0 || prevColDateVal !== colDateVal) {\n prevColDateVal = colDateVal;\n var labelFormat = columnsManager.getHeaderFormat(viewScaleUnit);\n\n header = new ColumnHeader(col.date, viewScaleValue, viewScaleUnit, col.originalSize.left, col.originalSize.width, labelFormat);\n header.left = col.left;\n header.width = col.width;\n generatedHeaders.push(header);\n } else {\n header.originalSize.width += col.originalSize.width;\n header.width += col.width;\n }\n }\n return generatedHeaders;\n\n };\n\n return function(columnsManager) {\n this.generate = function(columns) {\n var units = [];\n if (columnsManager.gantt.options.value('headers') === undefined) {\n var viewScale = columnsManager.gantt.options.value('viewScale');\n viewScale = viewScale.trim();\n if (viewScale.charAt(viewScale.length - 1) === 's') {\n viewScale = viewScale.substring(0, viewScale.length - 1);\n }\n\n var viewScaleUnit;\n var splittedViewScale;\n\n if (viewScale) {\n splittedViewScale = viewScale.split(' ');\n }\n if (splittedViewScale && splittedViewScale.length > 1) {\n viewScaleUnit = splittedViewScale[splittedViewScale.length - 1];\n } else {\n viewScaleUnit = viewScale;\n }\n\n if (['quarter','month'].indexOf(viewScaleUnit) > -1) {\n units.push('year');\n }\n if (['day', 'week'].indexOf(viewScaleUnit) > -1) {\n units.push('month');\n }\n if (['day'].indexOf(viewScaleUnit) > -1) {\n units.push('week');\n }\n if (['hour'].indexOf(viewScaleUnit) > -1) {\n units.push('day');\n }\n if (['minute', 'second'].indexOf(viewScaleUnit) > -1) {\n units.push('hour');\n }\n if (['second'].indexOf(viewScaleUnit) > -1) {\n units.push('minute');\n }\n units.push(viewScale);\n } else {\n units = columnsManager.gantt.options.value('headers');\n }\n\n var headers = [];\n angular.forEach(units, function(unit) {\n headers.push(generateHeader(columnsManager, columns, unit));\n });\n\n return headers;\n };\n };\n }]);\n}());\n\n","(function() {\n 'use strict';\n angular.module('gantt').factory('Gantt', [\n 'GanttApi', 'GanttOptions', 'GanttCalendar', 'GanttScroll', 'GanttBody', 'GanttRowHeader', 'GanttHeader', 'GanttSide', 'GanttObjectModel', 'GanttRowsManager', 'GanttColumnsManager', 'GanttTimespansManager', 'GanttCurrentDateManager', 'ganttArrays', 'moment', '$document', '$timeout',\n function(GanttApi, Options, Calendar, Scroll, Body, RowHeader, Header, Side, ObjectModel, RowsManager, ColumnsManager, TimespansManager, CurrentDateManager, arrays, moment, $document, $timeout) {\n // Gantt logic. Manages the columns, rows and sorting functionality.\n var Gantt = function($scope, $element) {\n var self = this;\n\n this.$scope = $scope;\n this.$element = $element;\n\n this.options = new Options($scope, {\n 'api': angular.noop,\n 'data': [],\n 'timespans': [],\n 'viewScale': 'day',\n 'columnMagnet': '15 minutes',\n 'timeFramesMagnet': true,\n 'showSide': true,\n 'allowSideResizing': true,\n 'currentDate': 'line',\n 'currentDateValue': moment,\n 'autoExpand': 'none',\n 'taskOutOfRange': 'truncate',\n 'taskContent': '{{task.model.name}}',\n 'rowContent': '{{row.model.name}}',\n 'maxHeight': 0,\n 'timeFrames': [],\n 'dateFrames': [],\n 'timeFramesWorkingMode': 'hidden',\n 'timeFramesNonWorkingMode': 'visible'\n });\n\n this.api = new GanttApi(this);\n\n this.api.registerEvent('core', 'ready');\n this.api.registerEvent('core', 'rendered');\n\n this.api.registerEvent('directives', 'controller');\n this.api.registerEvent('directives', 'preLink');\n this.api.registerEvent('directives', 'postLink');\n this.api.registerEvent('directives', 'new');\n this.api.registerEvent('directives', 'destroy');\n\n this.api.registerEvent('data', 'change');\n this.api.registerEvent('data', 'load');\n this.api.registerEvent('data', 'remove');\n this.api.registerEvent('data', 'clear');\n\n this.api.registerMethod('core', 'getDateByPosition', this.getDateByPosition, this);\n this.api.registerMethod('core', 'getPositionByDate', this.getPositionByDate, this);\n\n this.api.registerMethod('data', 'load', this.loadData, this);\n this.api.registerMethod('data', 'remove', this.removeData, this);\n this.api.registerMethod('data', 'clear', this.clearData, this);\n this.api.registerMethod('data', 'get', this.getData, this);\n\n this.calendar = new Calendar(this);\n this.calendar.registerTimeFrames(this.options.value('timeFrames'));\n this.calendar.registerDateFrames(this.options.value('dateFrames'));\n\n this.api.registerMethod('timeframes', 'registerTimeFrames', this.calendar.registerTimeFrames, this.calendar);\n this.api.registerMethod('timeframes', 'clearTimeframes', this.calendar.clearTimeFrames, this.calendar);\n this.api.registerMethod('timeframes', 'registerDateFrames', this.calendar.registerDateFrames, this.calendar);\n this.api.registerMethod('timeframes', 'clearDateFrames', this.calendar.clearDateFrames, this.calendar);\n this.api.registerMethod('timeframes', 'registerTimeFrameMappings', this.calendar.registerTimeFrameMappings, this.calendar);\n this.api.registerMethod('timeframes', 'clearTimeFrameMappings', this.calendar.clearTimeFrameMappings, this.calendar);\n\n $scope.$watchGroup(['timeFrames', 'dateFrames'], function(newValues, oldValues) {\n if (newValues !== oldValues) {\n var timeFrames = newValues[0];\n var dateFrames = newValues[1];\n\n var oldTimeFrames = oldValues[0];\n var oldDateFrames = oldValues[1];\n\n var framesChanged = false;\n\n if (!angular.equals(timeFrames, oldTimeFrames)) {\n self.calendar.clearTimeFrames();\n self.calendar.registerTimeFrames(timeFrames);\n framesChanged = true;\n }\n\n if (!angular.equals(dateFrames, oldDateFrames)) {\n self.calendar.clearDateFrames();\n self.calendar.registerDateFrames(dateFrames);\n framesChanged = true;\n }\n\n if (framesChanged) {\n self.columnsManager.generateColumns();\n }\n }\n });\n\n $scope.$watch('columnMagnet', function() {\n var splittedColumnMagnet;\n var columnMagnet = self.options.value('columnMagnet');\n if (columnMagnet) {\n splittedColumnMagnet = columnMagnet.trim().split(' ');\n }\n if (splittedColumnMagnet && splittedColumnMagnet.length > 1) {\n self.columnMagnetValue = parseFloat(splittedColumnMagnet[0]);\n self.columnMagnetUnit = moment.normalizeUnits(splittedColumnMagnet[splittedColumnMagnet.length - 1]);\n } else {\n self.columnMagnetValue = 1;\n self.columnMagnetUnit = moment.normalizeUnits(columnMagnet);\n }\n });\n\n $scope.$watchGroup(['shiftColumnMagnet', 'viewScale'], function() {\n var splittedColumnMagnet;\n var shiftColumnMagnet = self.options.value('shiftColumnMagnet');\n if (shiftColumnMagnet) {\n splittedColumnMagnet = shiftColumnMagnet.trim().split(' ');\n }\n if (splittedColumnMagnet !== undefined && splittedColumnMagnet.length > 1) {\n self.shiftColumnMagnetValue = parseFloat(splittedColumnMagnet[0]);\n self.shiftColumnMagnetUnit = moment.normalizeUnits(splittedColumnMagnet[splittedColumnMagnet.length - 1]);\n } else {\n self.shiftColumnMagnetValue = 1;\n self.shiftColumnMagnetUnit = moment.normalizeUnits(shiftColumnMagnet);\n }\n });\n\n var keyHandler = function(e) {\n self.shiftKey = e.shiftKey;\n return true;\n };\n\n $document.on('keyup keydown', keyHandler);\n\n $scope.$on('$destroy', function() {\n $document.off('keyup keydown', keyHandler);\n });\n\n this.scroll = new Scroll(this);\n this.body = new Body(this);\n this.header = new Header(this);\n this.side = new Side(this);\n\n this.objectModel = new ObjectModel(this.api);\n\n this.rowsManager = new RowsManager(this);\n this.columnsManager = new ColumnsManager(this);\n this.timespansManager = new TimespansManager(this);\n this.currentDateManager = new CurrentDateManager(this);\n\n this.originalWidth = 0;\n this.width = 0;\n\n if (angular.isFunction(this.$scope.api)) {\n this.$scope.api(this.api);\n }\n\n var hasRowModelOrderChanged = function(data1, data2) {\n if (data2 === undefined || data1.length !== data2.length) {\n return true;\n }\n\n for (var i = 0, l = data1.length; i < l; i++) {\n if (data1[i].id !== data2[i].id) {\n return true;\n }\n }\n\n return false;\n };\n\n $scope.$watchCollection('data', function(newData, oldData) {\n if (oldData !== undefined) {\n var toRemoveIds = arrays.getRemovedIds(newData, oldData);\n if (toRemoveIds.length === oldData.length) {\n self.rowsManager.removeAll();\n\n // DEPRECATED\n self.api.data.raise.clear();\n } else {\n for (var i = 0, l = toRemoveIds.length; i < l; i++) {\n var toRemoveId = toRemoveIds[i];\n self.rowsManager.removeRow(toRemoveId);\n }\n\n // DEPRECATED\n var removedRows = [];\n angular.forEach(oldData, function(removedRow) {\n if (toRemoveIds.indexOf(removedRow.id) > -1) {\n removedRows.push(removedRow);\n }\n });\n self.api.data.raise.remove(removedRows);\n }\n }\n\n if (newData !== undefined) {\n var modelOrderChanged = hasRowModelOrderChanged(newData, oldData);\n\n if (modelOrderChanged) {\n self.rowsManager.resetNonModelLists();\n }\n\n for (var j = 0, k = newData.length; j < k; j++) {\n var rowData = newData[j];\n self.rowsManager.addRow(rowData, modelOrderChanged);\n }\n\n self.api.data.raise.change(newData, oldData);\n\n // DEPRECATED\n self.api.data.raise.load(newData);\n }\n });\n };\n\n // Returns the exact column date at the given position x (in em)\n Gantt.prototype.getDateByPosition = function(x, magnet, disableExpand) {\n var column = this.columnsManager.getColumnByPosition(x, disableExpand);\n if (column !== undefined) {\n var magnetValue;\n var magnetUnit;\n if (magnet) {\n if (this.shiftKey) {\n if (this.shiftColumnMagnetValue !== undefined && this.shiftColumnMagnetUnit !== undefined) {\n magnetValue = this.shiftColumnMagnetValue;\n magnetUnit = this.shiftColumnMagnetUnit;\n } else {\n var viewScale = this.options.value('viewScale');\n viewScale = viewScale.trim();\n var viewScaleValue;\n var viewScaleUnit;\n var splittedViewScale;\n\n if (viewScale) {\n splittedViewScale = viewScale.split(' ');\n }\n if (splittedViewScale && splittedViewScale.length > 1) {\n viewScaleValue = parseFloat(splittedViewScale[0]);\n viewScaleUnit = moment.normalizeUnits(splittedViewScale[splittedViewScale.length - 1]);\n } else {\n viewScaleValue = 1;\n viewScaleUnit = moment.normalizeUnits(viewScale);\n }\n magnetValue = viewScaleValue * 0.25;\n magnetUnit = viewScaleUnit;\n }\n } else {\n magnetValue = this.columnMagnetValue;\n magnetUnit = this.columnMagnetUnit;\n }\n }\n\n return column.getDateByPosition(x - column.left, magnetValue, magnetUnit, this.options.value('timeFramesMagnet'));\n } else {\n return undefined;\n }\n };\n\n Gantt.prototype.getBodyAvailableWidth = function() {\n var scrollWidth = this.getWidth() - this.side.getWidth();\n var borderWidth = this.scroll.getBordersWidth();\n var availableWidth = scrollWidth - (borderWidth !== undefined ? this.scroll.getBordersWidth() : 0);\n // Remove 1 pixel because of rounding issue in some cases.\n availableWidth = availableWidth - 1;\n return availableWidth;\n };\n\n // Returns the position inside the Gantt calculated by the given date\n Gantt.prototype.getPositionByDate = function(date, disableExpand) {\n if (date === undefined) {\n return undefined;\n }\n\n if (!moment.isMoment(moment)) {\n date = moment(date);\n }\n\n var column = this.columnsManager.getColumnByDate(date, disableExpand);\n if (column !== undefined) {\n return column.getPositionByDate(date);\n } else {\n return undefined;\n }\n };\n\n // DEPRECATED - Use $data instead.\n Gantt.prototype.loadData = function(data) {\n if (!angular.isArray(data)) {\n data = data !== undefined ? [data] : [];\n }\n\n if (this.$scope.data === undefined) {\n this.$scope.data = data;\n } else {\n for (var i = 0, l = data.length; i < l; i++) {\n var row = data[i];\n\n var j = arrays.indexOfId(this.$scope.data, row.id);\n if (j > -1) {\n this.$scope.data[j] = row;\n } else {\n this.$scope.data.push(row);\n }\n }\n }\n\n var w = this.side.getWidth();\n if (w > 0) {\n this.options.set('sideWidth', w);\n }\n };\n\n Gantt.prototype.getData = function() {\n return this.$scope.data;\n };\n\n // DEPRECATED - Use $data instead.\n Gantt.prototype.removeData = function(data) {\n if (!angular.isArray(data)) {\n data = data !== undefined ? [data] : [];\n }\n\n if (this.$scope.data !== undefined) {\n for (var i = 0, l = data.length; i < l; i++) {\n var rowToRemove = data[i];\n\n var j = arrays.indexOfId(this.$scope.data, rowToRemove.id);\n if (j > -1) {\n if (rowToRemove.tasks === undefined || rowToRemove.tasks.length === 0) {\n // Remove complete row\n this.$scope.data.splice(j, 1);\n } else {\n // Remove single tasks\n var row = this.$scope.data[j];\n for (var ti = 0, tl = rowToRemove.tasks.length; ti < tl; ti++) {\n var taskToRemove = rowToRemove.tasks[ti];\n\n var tj = arrays.indexOfId(row.tasks, taskToRemove.id);\n if (tj > -1) {\n row.tasks.splice(tj, 1);\n }\n }\n }\n }\n }\n }\n };\n\n // DEPRECATED - Use $data instead.\n Gantt.prototype.clearData = function() {\n this.$scope.data = undefined;\n };\n\n Gantt.prototype.getWidth = function() {\n return this.$scope.ganttElementWidth;\n };\n\n Gantt.prototype.initialized = function() {\n // Gantt is initialized. Signal that the Gantt is ready.\n this.api.core.raise.ready(this.api);\n\n this.rendered = true;\n this.columnsManager.generateColumns();\n\n var gantt = this;\n var renderedFunction = function() {\n var w = gantt.side.getWidth();\n if (w > 0) {\n gantt.options.set('sideWidth', w);\n }\n gantt.api.core.raise.rendered(gantt.api);\n };\n $timeout(renderedFunction);\n };\n\n return Gantt;\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttObjectModel', ['ganttUtils', 'moment', function(utils, moment) {\n var ObjectModel = function(api) {\n this.api = api;\n\n this.api.registerEvent('tasks', 'clean');\n this.api.registerEvent('rows', 'clean');\n this.api.registerEvent('timespans', 'clean');\n };\n\n ObjectModel.prototype.cleanTask = function(model) {\n if (model.id === undefined) {\n model.id = utils.randomUuid();\n }\n\n if (model.from !== undefined && !moment.isMoment(model.from)) {\n model.from = moment(model.from);\n }\n\n if (model.to !== undefined && !moment.isMoment(model.to)) {\n model.to = moment(model.to);\n }\n\n this.api.tasks.raise.clean(model);\n };\n\n ObjectModel.prototype.cleanRow = function(model) {\n if (model.id === undefined) {\n model.id = utils.randomUuid();\n }\n\n if (model.from !== undefined && !moment.isMoment(model.from)) {\n model.from = moment(model.from);\n }\n\n if (model.to !== undefined && !moment.isMoment(model.to)) {\n model.to = moment(model.to);\n }\n\n this.api.rows.raise.clean(model);\n };\n\n ObjectModel.prototype.cleanTimespan = function(model) {\n if (model.id === undefined) {\n model.id = utils.randomUuid();\n }\n\n if (model.from !== undefined && !moment.isMoment(model.from)) {\n model.from = moment(model.from);\n }\n\n if (model.to !== undefined && !moment.isMoment(model.to)) {\n model.to = moment(model.to);\n }\n\n this.api.timespans.raise.clean(model);\n };\n\n return ObjectModel;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttRow', ['GanttTask', 'moment', '$filter', function(Task, moment, $filter) {\n var Row = function(rowsManager, model) {\n this.rowsManager = rowsManager;\n this.model = model;\n\n this.from = undefined;\n this.to = undefined;\n\n this.tasksMap = {};\n this.tasks = [];\n this.filteredTasks = [];\n this.visibleTasks = [];\n };\n\n Row.prototype.addTaskImpl = function(task, viewOnly) {\n this.tasksMap[task.model.id] = task;\n this.tasks.push(task);\n\n if (!viewOnly) {\n if (this.model.tasks === undefined) {\n this.model.tasks = [];\n }\n if (this.model.tasks.indexOf(task.model) === -1) {\n this.model.tasks.push(task.model);\n }\n }\n\n };\n\n // Adds a task to a specific row. Merges the task if there is already one with the same id\n Row.prototype.addTask = function(taskModel, viewOnly) {\n // Copy to new task (add) or merge with existing (update)\n var task, isUpdate = false;\n\n this.rowsManager.gantt.objectModel.cleanTask(taskModel);\n if (taskModel.id in this.tasksMap) {\n task = this.tasksMap[taskModel.id];\n if (task.model === taskModel) {\n return task;\n }\n task.model = taskModel;\n isUpdate = true;\n } else {\n task = new Task(this, taskModel);\n this.addTaskImpl(task, viewOnly);\n }\n\n this.sortTasks();\n this.setFromToByTask(task);\n\n if (!viewOnly) {\n if (isUpdate) {\n this.rowsManager.gantt.api.tasks.raise.change(task);\n } else {\n this.rowsManager.gantt.api.tasks.raise.add(task);\n }\n }\n\n return task;\n };\n\n // Removes the task from the existing row and adds it to he current one\n Row.prototype.moveTaskToRow = function(task, viewOnly) {\n var oldRow = task.row;\n oldRow.removeTask(task.model.id, viewOnly, true);\n\n task.row = this;\n this.addTaskImpl(task, viewOnly);\n\n this.sortTasks();\n this.setFromToByTask(task);\n\n task.updatePosAndSize();\n this.updateVisibleTasks();\n\n if (!viewOnly) {\n this.rowsManager.gantt.api.tasks.raise.rowChange(task, oldRow);\n }\n };\n\n Row.prototype.updateVisibleTasks = function() {\n var filterTask = this.rowsManager.gantt.options.value('filterTask');\n if (filterTask) {\n if (typeof(filterTask) === 'object') {\n filterTask = {model: filterTask};\n }\n\n var filterTaskComparator = this.rowsManager.gantt.options.value('filterTaskComparator');\n if (typeof(filterTaskComparator) === 'function') {\n filterTaskComparator = function(actual, expected) {\n return filterTaskComparator(actual.model, expected.model);\n };\n }\n\n this.filteredTasks = $filter('filter')(this.tasks, filterTask, filterTaskComparator);\n } else {\n this.filteredTasks = this.tasks.slice(0);\n }\n this.visibleTasks = $filter('ganttTaskLimit')(this.filteredTasks, this.rowsManager.gantt);\n };\n\n Row.prototype.updateTasksPosAndSize = function() {\n for (var j = 0, k = this.tasks.length; j < k; j++) {\n this.tasks[j].updatePosAndSize();\n }\n };\n\n // Remove the specified task from the row\n Row.prototype.removeTask = function(taskId, viewOnly, silent) {\n if (taskId in this.tasksMap) {\n var removedTask = this.tasksMap[taskId];\n var task;\n var i;\n\n for (i = this.tasks.length - 1; i >= 0; i--) {\n task = this.tasks[i];\n if (task.model.id === taskId) {\n this.tasks.splice(i, 1); // Remove from array\n\n // Update earliest or latest date info as this may change\n if (this.from - task.model.from === 0 || this.to - task.model.to === 0) {\n this.setFromTo();\n }\n\n break;\n }\n }\n\n for (i = this.filteredTasks.length - 1; i >= 0; i--) {\n task = this.filteredTasks[i];\n if (task.model.id === taskId) {\n this.filteredTasks.splice(i, 1); // Remove from filtered array\n break;\n }\n }\n\n for (i = this.visibleTasks.length - 1; i >= 0; i--) {\n task = this.visibleTasks[i];\n if (task.model.id === taskId) {\n this.visibleTasks.splice(i, 1); // Remove from visible array\n break;\n }\n }\n\n if (!viewOnly) {\n delete this.tasksMap[taskId]; // Remove from map\n\n if (this.model.tasks !== undefined) {\n var taskIndex = this.model.tasks.indexOf(removedTask.model);\n if (taskIndex > -1) {\n this.model.tasks.splice(taskIndex, 1);\n }\n }\n\n if (!silent) {\n this.rowsManager.gantt.api.tasks.raise.remove(removedTask);\n }\n }\n\n return removedTask;\n }\n };\n\n Row.prototype.removeAllTasks = function() {\n this.from = undefined;\n this.to = undefined;\n\n this.tasksMap = {};\n this.tasks = [];\n this.filteredTasks = [];\n this.visibleTasks = [];\n };\n\n // Calculate the earliest from and latest to date of all tasks in a row\n Row.prototype.setFromTo = function() {\n this.from = undefined;\n this.to = undefined;\n for (var j = 0, k = this.tasks.length; j < k; j++) {\n this.setFromToByTask(this.tasks[j]);\n }\n };\n\n Row.prototype.setFromToByTask = function(task) {\n this.setFromToByValues(task.model.from, task.model.to);\n };\n\n Row.prototype.setFromToByValues = function(from, to) {\n if (from !== undefined) {\n if (this.from === undefined) {\n this.from = moment(from);\n } else if (from < this.from) {\n this.from = moment(from);\n }\n }\n\n if (to !== undefined) {\n if (this.to === undefined) {\n this.to = moment(to);\n } else if (to > this.to) {\n this.to = moment(to);\n }\n }\n\n };\n\n Row.prototype.sortTasks = function() {\n this.tasks.sort(function(t1, t2) {\n return t1.left - t2.left;\n });\n };\n\n Row.prototype.clone = function() {\n var clone = new Row(this.rowsManager, angular.copy(this));\n for (var i = 0, l = this.tasks.length; i < l; i++) {\n clone.addTask(this.tasks[i].model);\n }\n return clone;\n };\n\n return Row;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttRowHeader', [function() {\n var RowHeader = function(gantt) {\n this.gantt = gantt;\n };\n return RowHeader;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttRowsManager', ['GanttRow', 'ganttArrays', '$filter', '$timeout', 'moment', function(Row, arrays, $filter, $timeout, moment) {\n var RowsManager = function(gantt) {\n var self = this;\n\n this.gantt = gantt;\n\n this.rowsMap = {};\n this.rows = [];\n this.sortedRows = [];\n this.filteredRows = [];\n this.customFilteredRows = [];\n this.visibleRows = [];\n this.rowsTaskWatchers = [];\n\n this._defaultFilterImpl = function(sortedRows, filterRow, filterRowComparator) {\n return $filter('filter')(sortedRows, filterRow, filterRowComparator);\n };\n this.filterImpl = this._defaultFilterImpl;\n\n this.customRowSorters = [];\n this.customRowFilters = [];\n\n this.gantt.$scope.$watchGroup(['filterTask', 'filterTaskComparator'], function(newValues, oldValues) {\n if (newValues !== oldValues) {\n self.updateVisibleTasks();\n }\n });\n\n this.gantt.$scope.$watchGroup(['filterRow', 'filterRowComparator'], function(newValues, oldValues) {\n if (newValues !== oldValues) {\n self.updateVisibleRows();\n }\n });\n\n this.gantt.$scope.$watch('sortMode', function(newValue, oldValue) {\n if (newValue !== oldValue) {\n self.sortRows();\n }\n });\n\n // Listen to vertical scrollbar visibility changes to update columns width\n var _oldVScrollbarVisible = this.gantt.scroll.isVScrollbarVisible();\n this.gantt.$scope.$watchGroup(['maxHeight', 'gantt.rowsManager.visibleRows.length'], function(newValue, oldValue) {\n if (newValue !== oldValue) {\n $timeout(function() {\n var newVScrollbarVisible = self.gantt.scroll.isVScrollbarVisible();\n if (newVScrollbarVisible !== _oldVScrollbarVisible) {\n _oldVScrollbarVisible = newVScrollbarVisible;\n self.gantt.columnsManager.updateColumnsMeta();\n }\n });\n }\n });\n\n this.gantt.api.registerMethod('rows', 'sort', RowsManager.prototype.sortRows, this);\n this.gantt.api.registerMethod('rows', 'applySort', RowsManager.prototype.applySort, this);\n this.gantt.api.registerMethod('rows', 'refresh', RowsManager.prototype.updateVisibleObjects, this);\n\n this.gantt.api.registerMethod('rows', 'removeRowSorter', RowsManager.prototype.removeCustomRowSorter, this);\n this.gantt.api.registerMethod('rows', 'addRowSorter', RowsManager.prototype.addCustomRowSorter, this);\n\n this.gantt.api.registerMethod('rows', 'removeRowFilter', RowsManager.prototype.removeCustomRowFilter, this);\n this.gantt.api.registerMethod('rows', 'addRowFilter', RowsManager.prototype.addCustomRowFilter, this);\n\n this.gantt.api.registerMethod('rows', 'setFilterImpl', RowsManager.prototype.setFilterImpl, this);\n\n this.gantt.api.registerEvent('tasks', 'add');\n this.gantt.api.registerEvent('tasks', 'change');\n this.gantt.api.registerEvent('tasks', 'viewChange');\n\n this.gantt.api.registerEvent('tasks', 'rowChange');\n this.gantt.api.registerEvent('tasks', 'remove');\n this.gantt.api.registerEvent('tasks', 'filter');\n\n this.gantt.api.registerEvent('rows', 'add');\n this.gantt.api.registerEvent('rows', 'change');\n this.gantt.api.registerEvent('rows', 'remove');\n this.gantt.api.registerEvent('rows', 'move');\n\n this.gantt.api.registerEvent('rows', 'filter');\n\n this.updateVisibleObjects();\n };\n\n RowsManager.prototype.resetNonModelLists = function() {\n this.rows = [];\n this.sortedRows = [];\n this.filteredRows = [];\n this.customFilteredRows = [];\n this.visibleRows = [];\n };\n\n RowsManager.prototype.addRow = function(rowModel, modelOrderChanged) {\n // Copy to new row (add) or merge with existing (update)\n var row, i, l, isUpdate = false;\n\n this.gantt.objectModel.cleanRow(rowModel);\n\n if (rowModel.id in this.rowsMap) {\n row = this.rowsMap[rowModel.id];\n\n if (modelOrderChanged) {\n this.rows.push(row);\n this.sortedRows.push(row);\n this.filteredRows.push(row);\n this.customFilteredRows.push(row);\n this.visibleRows.push(row);\n }\n\n if (row.model === rowModel) {\n return;\n }\n\n var toRemoveIds = arrays.getRemovedIds(rowModel.tasks, row.model.tasks);\n for (i= 0, l=toRemoveIds.length; i<l; i++) {\n var toRemoveId = toRemoveIds[i];\n row.removeTask(toRemoveId);\n }\n\n row.model = rowModel;\n isUpdate = true;\n } else {\n row = new Row(this, rowModel);\n this.rowsMap[rowModel.id] = row;\n this.rows.push(row);\n this.sortedRows.push(row);\n this.filteredRows.push(row);\n this.customFilteredRows.push(row);\n this.visibleRows.push(row);\n }\n\n if (rowModel.tasks !== undefined && rowModel.tasks.length > 0) {\n for (i = 0, l = rowModel.tasks.length; i < l; i++) {\n var taskModel = rowModel.tasks[i];\n row.addTask(taskModel);\n }\n\n row.updateVisibleTasks();\n }\n\n if (isUpdate) {\n this.gantt.api.rows.raise.change(row);\n } else {\n this.gantt.api.rows.raise.add(row);\n }\n\n if (!isUpdate) {\n var watcher = this.gantt.$scope.$watchCollection(function() {return rowModel.tasks;}, function(newTasks, oldTasks) {\n if (newTasks !== oldTasks) {\n var i, l;\n\n var toRemoveIds = arrays.getRemovedIds(newTasks, oldTasks);\n for (i= 0, l = toRemoveIds.length; i<l; i++) {\n var toRemove = toRemoveIds[i];\n row.removeTask(toRemove);\n }\n\n if (newTasks !== undefined) {\n for (i= 0, l = newTasks.length; i<l; i++) {\n var toAdd = newTasks[i];\n row.addTask(toAdd);\n }\n\n row.updateVisibleTasks();\n }\n }\n });\n\n this.rowsTaskWatchers.push(watcher);\n }\n\n return isUpdate;\n };\n\n RowsManager.prototype.removeRow = function(rowId) {\n if (rowId in this.rowsMap) {\n delete this.rowsMap[rowId]; // Remove from map\n\n var removedRow;\n var row;\n\n var indexOf = arrays.indexOfId(this.rows, rowId, ['model', 'id']);\n if (indexOf > -1) {\n removedRow = this.rows.splice(indexOf, 1)[0]; // Remove from array\n var deregisterFunction = this.rowsTaskWatchers.splice(indexOf, 1)[0]; // Remove watcher\n deregisterFunction();\n }\n\n arrays.removeId(this.sortedRows, rowId, ['model', 'id']);\n arrays.removeId(this.filteredRows, rowId, ['model', 'id']);\n arrays.removeId(this.customFilteredRows, rowId, ['model', 'id']);\n arrays.removeId(this.visibleRows, rowId, ['model', 'id']);\n\n this.gantt.api.rows.raise.remove(removedRow);\n return row;\n }\n\n return undefined;\n };\n\n RowsManager.prototype.removeAll = function() {\n this.rowsMap = {};\n this.rows = [];\n this.sortedRows = [];\n this.filteredRows = [];\n this.customFilteredRows = [];\n this.visibleRows = [];\n\n for (var i= 0, l=this.rowsTaskWatchers.length; i<l; i++) {\n var deregisterFunction = this.rowsTaskWatchers[i];\n deregisterFunction();\n }\n this.rowsTaskWatchers = [];\n };\n\n RowsManager.prototype.sortRows = function() {\n var expression = this.gantt.options.value('sortMode');\n\n if (expression !== undefined) {\n var reverse = false;\n if (angular.isString(expression) && expression.charAt(0) === '-') {\n reverse = true;\n expression = expression.substr(1);\n }\n\n var angularOrderBy = $filter('orderBy');\n this.sortedRows = angularOrderBy(this.rows, expression, reverse);\n } else {\n this.sortedRows = this.rows.slice();\n }\n\n this.sortedRows = this.applyCustomRowSorters(this.sortedRows);\n\n this.updateVisibleRows();\n };\n\n RowsManager.prototype.removeCustomRowSorter = function(sorterFunction) {\n var i = this.customRowSorters.indexOf(sorterFunction);\n if (i > -1) {\n this.customRowSorters.splice(i, 1);\n }\n };\n\n RowsManager.prototype.addCustomRowSorter = function(sorterFunction) {\n this.customRowSorters.push(sorterFunction);\n };\n\n RowsManager.prototype.applyCustomRowSorters = function(sortedRows) {\n angular.forEach(this.customRowSorters, function(sorterFunction) {\n sortedRows = sorterFunction(sortedRows);\n });\n return sortedRows;\n };\n\n /**\n * Applies current view sort to data model.\n */\n RowsManager.prototype.applySort = function() {\n var data = this.gantt.$scope.data;\n while(data > 0) {\n data.pop();\n }\n var rows = [];\n for (var i = 0, l = this.sortedRows.length; i < l; i++) {\n data.push(this.sortedRows[i].model);\n rows.push(this.sortedRows[i]);\n }\n\n this.rows = rows;\n };\n\n RowsManager.prototype.moveRow = function(row, targetRow) {\n var sortMode = this.gantt.options.value('sortMode');\n if (sortMode !== undefined) {\n // Apply current sort to model\n this.applySort();\n this.gantt.options.set('sortMode', undefined);\n }\n\n var targetRowIndex = this.rows.indexOf(targetRow);\n var rowIndex = this.rows.indexOf(row);\n\n if (targetRowIndex > -1 && rowIndex > -1 && targetRowIndex !== rowIndex) {\n arrays.moveToIndex(this.rows, rowIndex, targetRowIndex);\n arrays.moveToIndex(this.rowsTaskWatchers, rowIndex, targetRowIndex);\n arrays.moveToIndex(this.gantt.$scope.data, rowIndex, targetRowIndex);\n\n this.gantt.api.rows.raise.change(row);\n this.gantt.api.rows.raise.move(row, rowIndex, targetRowIndex);\n\n this.updateVisibleObjects();\n this.sortRows();\n }\n };\n\n RowsManager.prototype.updateVisibleObjects = function() {\n this.updateVisibleRows();\n this.updateVisibleTasks();\n };\n\n RowsManager.prototype.updateVisibleRows = function() {\n var oldFilteredRows = this.filteredRows;\n var filterRow = this.gantt.options.value('filterRow');\n if (filterRow) {\n if (typeof(filterRow) === 'object') {\n filterRow = {model: filterRow};\n }\n\n var filterRowComparator = this.gantt.options.value('filterRowComparator');\n if (typeof(filterRowComparator) === 'function') {\n\t\t\t\t\t//fix issue this.gantt is undefined\n\t\t\t\t\t//\n\t\t\t\t\tvar gantt = this.gantt;\n filterRowComparator = function(actual, expected) {\n\t\t\t\t\t\t//fix actual.model is undefined\n return gantt.options.value('filterRowComparator')(actual, expected);\n };\n }\n\n this.filteredRows = this.filterImpl(this.sortedRows, filterRow, filterRowComparator);\n } else {\n this.filteredRows = this.sortedRows.slice(0);\n }\n\n var raiseEvent = !angular.equals(oldFilteredRows, this.filteredRows);\n this.customFilteredRows = this.applyCustomRowFilters(this.filteredRows);\n\n // TODO: Implement rowLimit like columnLimit to enhance performance for gantt with many rows\n this.visibleRows = this.customFilteredRows;\n if (raiseEvent) {\n this.gantt.api.rows.raise.filter(this.sortedRows, this.filteredRows);\n }\n };\n\n RowsManager.prototype.removeCustomRowFilter = function(filterFunction) {\n var i = this.customRowFilters.indexOf(filterFunction);\n if (i > -1) {\n this.customRowFilters.splice(i, 1);\n }\n };\n\n RowsManager.prototype.addCustomRowFilter = function(filterFunction) {\n this.customRowFilters.push(filterFunction);\n };\n\n RowsManager.prototype.applyCustomRowFilters = function(filteredRows) {\n angular.forEach(this.customRowFilters, function(filterFunction) {\n filteredRows = filterFunction(filteredRows);\n });\n return filteredRows;\n };\n\n RowsManager.prototype.setFilterImpl = function(filterImpl) {\n if (!filterImpl) {\n this.filterImpl = this._defaultFilterImpl;\n } else {\n this.filterImpl = filterImpl;\n }\n };\n\n RowsManager.prototype.updateVisibleTasks = function() {\n var oldFilteredTasks = [];\n var filteredTasks = [];\n var tasks = [];\n\n angular.forEach(this.rows, function(row) {\n oldFilteredTasks = oldFilteredTasks.concat(row.filteredTasks);\n row.updateVisibleTasks();\n filteredTasks = filteredTasks.concat(row.filteredTasks);\n tasks = tasks.concat(row.tasks);\n });\n\n var filterEvent = !angular.equals(oldFilteredTasks, filteredTasks);\n\n if (filterEvent) {\n this.gantt.api.tasks.raise.filter(tasks, filteredTasks);\n }\n };\n\n // Update the position/size of all tasks in the Gantt\n RowsManager.prototype.updateTasksPosAndSize = function() {\n for (var i = 0, l = this.rows.length; i < l; i++) {\n this.rows[i].updateTasksPosAndSize();\n }\n };\n\n RowsManager.prototype.getExpandedFrom = function(from) {\n from = from ? moment(from) : from;\n\n var minRowFrom = from;\n angular.forEach(this.rows, function(row) {\n if (minRowFrom === undefined || minRowFrom > row.from) {\n minRowFrom = row.from;\n }\n });\n if (minRowFrom && (!from || minRowFrom < from)) {\n return minRowFrom;\n }\n return from;\n };\n\n RowsManager.prototype.getExpandedTo = function(to) {\n to = to ? moment(to) : to;\n\n var maxRowTo = to;\n angular.forEach(this.rows, function(row) {\n if (maxRowTo === undefined || maxRowTo < row.to) {\n maxRowTo = row.to;\n }\n });\n var toDate = this.gantt.options.value('toDate');\n if (maxRowTo && (!toDate || maxRowTo > toDate)) {\n return maxRowTo;\n }\n return to;\n };\n\n RowsManager.prototype.getDefaultFrom = function() {\n var defaultFrom;\n angular.forEach(this.rows, function(row) {\n if (defaultFrom === undefined || row.from < defaultFrom) {\n defaultFrom = row.from;\n }\n });\n return defaultFrom;\n };\n\n RowsManager.prototype.getDefaultTo = function() {\n var defaultTo;\n angular.forEach(this.rows, function(row) {\n if (defaultTo === undefined || row.to > defaultTo) {\n defaultTo = row.to;\n }\n });\n return defaultTo;\n };\n\n return RowsManager;\n }]);\n}());\n","(function() {\n 'use strict';\n angular.module('gantt').factory('GanttTask', ['moment', function(moment) {\n var Task = function(row, model) {\n this.rowsManager = row.rowsManager;\n this.row = row;\n this.model = model;\n this.truncatedLeft = false;\n this.truncatedRight = false;\n };\n\n Task.prototype.isMilestone = function() {\n return !this.model.to || this.model.from - this.model.to === 0;\n };\n\n Task.prototype.isOutOfRange = function() {\n var firstColumn = this.rowsManager.gantt.columnsManager.getFirstColumn();\n var lastColumn = this.rowsManager.gantt.columnsManager.getLastColumn();\n\n return (firstColumn === undefined || this.model.to < firstColumn.date ||\n lastColumn === undefined || this.model.from > lastColumn.endDate);\n };\n\n // Updates the pos and size of the task according to the from - to date\n Task.prototype.updatePosAndSize = function() {\n var oldViewLeft = this.left;\n var oldViewWidth = this.width;\n var oldTruncatedRight = this.truncatedRight;\n var oldTruncatedLeft = this.truncatedLeft;\n\n if (!this.isMoving && this.isOutOfRange()) {\n this.modelLeft = undefined;\n this.modelWidth = undefined;\n } else {\n this.modelLeft = this.rowsManager.gantt.getPositionByDate(this.model.from);\n this.modelWidth = this.rowsManager.gantt.getPositionByDate(this.model.to) - this.modelLeft;\n }\n\n var lastColumn = this.rowsManager.gantt.columnsManager.getLastColumn();\n var maxModelLeft = lastColumn ? lastColumn.left + lastColumn.width : 0;\n\n var modelLeft = this.modelLeft;\n var modelWidth = this.modelWidth;\n\n if (this.rowsManager.gantt.options.value('daily')) {\n modelLeft = this.rowsManager.gantt.getPositionByDate(moment(this.model.from).startOf('day'));\n modelWidth = this.rowsManager.gantt.getPositionByDate(moment(this.model.to).endOf('day')) - modelLeft;\n }\n\n if (modelLeft === undefined || modelWidth === undefined ||\n modelLeft + modelWidth < 0 || modelLeft > maxModelLeft) {\n this.left = undefined;\n this.width = undefined;\n } else {\n this.left = Math.min(Math.max(modelLeft, 0), this.rowsManager.gantt.width);\n if (modelLeft < 0) {\n this.truncatedLeft = true;\n if (modelWidth + modelLeft > this.rowsManager.gantt.width) {\n this.truncatedRight = true;\n this.width = this.rowsManager.gantt.width;\n } else {\n this.truncatedRight = false;\n this.width = modelWidth + modelLeft;\n }\n } else if (modelWidth + modelLeft > this.rowsManager.gantt.width) {\n this.truncatedRight = true;\n this.truncatedLeft = false;\n this.width = this.rowsManager.gantt.width - modelLeft;\n } else {\n this.truncatedLeft = false;\n this.truncatedRight = false;\n this.width = modelWidth;\n }\n\n if (this.width < 0) {\n this.left = this.left + this.width;\n this.width = -this.width;\n }\n }\n\n this.updateView();\n if (!this.rowsManager.gantt.isRefreshingColumns &&\n (oldViewLeft !== this.left ||\n oldViewWidth !== this.width ||\n oldTruncatedRight !== this.truncatedRight ||\n oldTruncatedLeft !== this.truncatedLeft)) {\n this.rowsManager.gantt.api.tasks.raise.viewChange(this);\n }\n };\n\n Task.prototype.updateView = function() {\n if (this.$element) {\n if (this.left === undefined || this.width === undefined) {\n this.$element.css('display', 'none');\n } else {\n this.$element.css({'left': this.left + 'px', 'width': this.width + 'px', 'display': ''});\n\n if (this.model.priority > 0) {\n var priority = this.model.priority;\n angular.forEach(this.$element.children(), function(element) {\n angular.element(element).css('z-index', priority);\n });\n }\n\n this.$element.toggleClass('gantt-task-milestone', this.isMilestone());\n }\n }\n };\n\n Task.prototype.getBackgroundElement = function() {\n if (this.$element !== undefined) {\n var backgroundElement = this.$element[0].querySelector('.gantt-task-background');\n if (backgroundElement !== undefined) {\n backgroundElement = angular.element(backgroundElement);\n }\n return backgroundElement;\n }\n };\n\n Task.prototype.getContentElement = function() {\n if (this.$element !== undefined) {\n var contentElement = this.$element[0].querySelector('.gantt-task-content');\n if (contentElement !== undefined) {\n contentElement = angular.element(contentElement);\n }\n return contentElement;\n }\n };\n\n Task.prototype.getForegroundElement = function() {\n if (this.$element !== undefined) {\n var foregroundElement = this.$element[0].querySelector('.gantt-task-foreground');\n if (foregroundElement !== undefined) {\n foregroundElement = angular.element(foregroundElement);\n }\n return foregroundElement;\n }\n };\n\n // Expands the start of the task to the specified position (in em)\n Task.prototype.setFrom = function(x, magnetEnabled) {\n this.model.from = this.rowsManager.gantt.getDateByPosition(x, magnetEnabled);\n this.row.setFromTo();\n this.updatePosAndSize();\n };\n\n // Expands the end of the task to the specified position (in em)\n Task.prototype.setTo = function(x, magnetEnabled) {\n this.model.to = this.rowsManager.gantt.getDateByPosition(x, magnetEnabled);\n this.row.setFromTo();\n this.updatePosAndSize();\n };\n\n // Moves the task to the specified position (in em)\n Task.prototype.moveTo = function(x, magnetEnabled) {\n var newTaskRight;\n var newTaskLeft;\n if (x > this.modelLeft) {\n // Driven by right/to side.\n this.model.to = this.rowsManager.gantt.getDateByPosition(x + this.modelWidth, magnetEnabled);\n newTaskRight = this.rowsManager.gantt.getPositionByDate(this.model.to);\n newTaskLeft = newTaskRight - this.modelWidth;\n this.model.from = this.rowsManager.gantt.getDateByPosition(newTaskLeft, false);\n } else {\n // Drive by left/from side.\n this.model.from = this.rowsManager.gantt.getDateByPosition(x, magnetEnabled);\n newTaskLeft = this.rowsManager.gantt.getPositionByDate(this.model.from);\n newTaskRight = newTaskLeft + this.modelWidth;\n this.model.to = this.rowsManager.gantt.getDateByPosition(newTaskRight, false);\n }\n\n this.row.setFromTo();\n this.updatePosAndSize();\n };\n\n Task.prototype.clone = function() {\n return new Task(this.row, angular.copy(this.model));\n };\n\n return Task;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttBody', ['GanttBodyColumns', 'GanttBodyRows', 'GanttBodyBackground', 'GanttBodyForeground', function(BodyColumns, BodyRows, BodyBackground, BodyForeground) {\n var Body= function(gantt) {\n this.gantt = gantt;\n\n this.background = new BodyBackground(this);\n this.foreground = new BodyForeground(this);\n this.columns = new BodyColumns(this);\n this.rows = new BodyRows(this);\n };\n return Body;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttBodyBackground', [function() {\n var GanttBodyBackground = function(body) {\n this.body = body;\n };\n return GanttBodyBackground;\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttBodyColumns', [function() {\n var BodyColumns = function(body) {\n this.body = body;\n };\n return BodyColumns;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttBodyForeground', [function() {\n var GanttBodyForeground = function(body) {\n this.body = body;\n };\n return GanttBodyForeground;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttBodyRows', [function() {\n var BodyRows = function(body) {\n this.body = body;\n };\n return BodyRows;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttHeader', ['GanttHeaderColumns', function(HeaderColumns) {\n var Header = function(gantt) {\n this.gantt = gantt;\n this.columns = new HeaderColumns(this);\n\n this.getHeight = function() {\n return this.$element[0].offsetHeight;\n };\n };\n return Header;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttHeaderColumns', [function() {\n var HeaderColumns = function($element) {\n this.$element = $element;\n };\n return HeaderColumns;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttScroll', [function() {\n var Scroll = function(gantt) {\n this.gantt = gantt;\n\n this.gantt.api.registerEvent('scroll', 'scroll');\n\n this.gantt.api.registerMethod('scroll', 'to', Scroll.prototype.scrollTo, this);\n this.gantt.api.registerMethod('scroll', 'toDate', Scroll.prototype.scrollToDate, this);\n this.gantt.api.registerMethod('scroll', 'left', Scroll.prototype.scrollToLeft, this);\n this.gantt.api.registerMethod('scroll', 'right', Scroll.prototype.scrollToRight, this);\n\n this.gantt.api.registerMethod('scroll', 'setWidth', Scroll.prototype.setWidth, this);\n };\n\n Scroll.prototype.getScrollLeft = function() {\n if (this.$element === undefined) {\n return undefined;\n } else {\n if (this.cachedScrollLeft === undefined) {\n this.cachedScrollLeft = this.$element[0].scrollLeft;\n }\n\n return this.cachedScrollLeft;\n }\n };\n\n Scroll.prototype.getScrollWidth = function() {\n return this.$element === undefined ? undefined : this.$element[0].scrollWidth;\n };\n\n Scroll.prototype.getWidth = function() {\n return this.$element === undefined ? undefined : this.$element[0].offsetWidth;\n };\n\n Scroll.prototype.setWidth = function(width) {\n if (this.$element[0]) {\n this.$element[0].offsetWidth = width;\n }\n };\n\n Scroll.prototype.getBordersWidth = function() {\n return this.$element === undefined ? undefined : (this.$element[0].offsetWidth - this.$element[0].clientWidth);\n };\n\n Scroll.prototype.getBordersHeight = function() {\n return this.$element === undefined ? undefined : (this.$element[0].offsetHeight - this.$element[0].clientHeight);\n };\n\n Scroll.prototype.isVScrollbarVisible = function () {\n if (this.$element !== undefined) {\n return this.$element[0].scrollHeight > this.$element[0].offsetHeight;\n }\n };\n\n Scroll.prototype.isHScrollbarVisible = function () {\n if (this.$element !== undefined) {\n return this.$element[0].scrollWidth > this.$element[0].offsetWidth;\n }\n };\n\n /**\n * Scroll to a position\n *\n * @param {number} position Position to scroll to.\n */\n Scroll.prototype.scrollTo = function(position) {\n this.$element[0].scrollLeft = position;\n this.$element.triggerHandler('scroll');\n };\n\n /**\n * Scroll to the left side\n *\n * @param {number} offset Offset to scroll.\n */\n Scroll.prototype.scrollToLeft = function(offset) {\n this.$element[0].scrollLeft -= offset;\n this.$element.triggerHandler('scroll');\n };\n\n /**\n * Scroll to the right side\n *\n * @param {number} offset Offset to scroll.\n */\n Scroll.prototype.scrollToRight = function(offset) {\n this.$element[0].scrollLeft += offset;\n this.$element.triggerHandler('scroll');\n };\n\n /**\n * Scroll to a date\n *\n * @param {moment} date moment to scroll to.\n */\n Scroll.prototype.scrollToDate = function(date) {\n var position = this.gantt.getPositionByDate(date);\n\n if (position !== undefined) {\n this.$element[0].scrollLeft = position - this.$element[0].offsetWidth / 2;\n }\n };\n\n return Scroll;\n }]);\n}());\n\n","(function(){\n 'use strict';\n\n angular.module('gantt').factory('GanttSide', [function() {\n var Side= function(gantt) {\n this.gantt = gantt;\n };\n Side.prototype.getWidth = function() {\n if (this.gantt.options.value('showSide')) {\n var width = this.gantt.options.value('sideWidth');\n if (width === undefined && this.$element !== undefined) {\n if (this.$element.css('width') !== undefined) {\n this.$element.css('width', '');\n }\n width = this.$element[0].offsetWidth;\n }\n if (width !== undefined) {\n return width;\n }\n }\n return 0;\n };\n Side.prototype.show = function(value) {\n if (this.$element !== undefined) {\n this.$element.toggleClass('ng-hide', !value);\n }\n };\n Side.prototype.isShown = function() {\n if (this.$element !== undefined) {\n return !this.$element.hasClass('ng-hide');\n }\n };\n\n return Side;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttTimespan', [function() {\n var Timespan = function(gantt, model) {\n this.gantt = gantt;\n this.model = model;\n };\n\n // Updates the pos and size of the timespan according to the from - to date\n Timespan.prototype.updatePosAndSize = function() {\n this.modelLeft = this.gantt.getPositionByDate(this.model.from);\n this.modelWidth = this.gantt.getPositionByDate(this.model.to) - this.modelLeft;\n\n var lastColumn = this.gantt.columnsManager.getLastColumn();\n var maxModelLeft = lastColumn ? lastColumn.left + lastColumn.width : 0;\n\n if (this.modelLeft + this.modelWidth < 0 || this.modelLeft > maxModelLeft) {\n this.left = undefined;\n this.width = undefined;\n } else {\n this.left = Math.min(Math.max(this.modelLeft, 0), this.gantt.width);\n if (this.modelLeft < 0) {\n this.truncatedLeft = true;\n if (this.modelWidth + this.modelLeft > this.gantt.width) {\n this.truncatedRight = true;\n this.width = this.gantt.width;\n } else {\n this.truncatedRight = false;\n this.width = this.modelWidth + this.modelLeft;\n }\n } else if (this.modelWidth + this.modelLeft > this.gantt.width) {\n this.truncatedRight = true;\n this.truncatedLeft = false;\n this.width = this.gantt.width - this.modelLeft;\n } else {\n this.truncatedLeft = false;\n this.truncatedRight = false;\n this.width = this.modelWidth;\n }\n\n if (this.width < 0) {\n this.left = this.left + this.width;\n this.width = -this.width;\n }\n }\n\n\n this.updateView();\n };\n\n Timespan.prototype.updateView = function() {\n if (this.$element) {\n if (this.left === undefined || this.width === undefined) {\n this.$element.css('display', 'none');\n } else {\n this.$element.css('display', '');\n this.$element.css('left', this.left + 'px');\n this.$element.css('width', this.width + 'px');\n }\n }\n };\n\n // Expands the start of the timespan to the specified position (in em)\n Timespan.prototype.setFrom = function(x) {\n this.from = this.gantt.getDateByPosition(x);\n this.updatePosAndSize();\n };\n\n // Expands the end of the timespan to the specified position (in em)\n Timespan.prototype.setTo = function(x) {\n this.to = this.gantt.getDateByPosition(x);\n this.updatePosAndSize();\n };\n\n // Moves the timespan to the specified position (in em)\n Timespan.prototype.moveTo = function(x) {\n this.from = this.gantt.getDateByPosition(x);\n this.to = this.gantt.getDateByPosition(x + this.width);\n this.updatePosAndSize();\n };\n\n Timespan.prototype.clone = function() {\n return new Timespan(this.gantt, angular.copy(this.model));\n };\n\n return Timespan;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttTimespansManager', ['GanttTimespan', function(Timespan) {\n var GanttTimespansManager = function(gantt) {\n var self = this;\n\n this.gantt = gantt;\n\n this.timespansMap = {};\n this.timespans = [];\n\n this.gantt.$scope.$watchCollection('timespans', function(newValue) {\n self.clearTimespans();\n self.loadTimespans(newValue);\n });\n\n this.gantt.api.registerMethod('timespans', 'load', this.loadTimespans, this);\n this.gantt.api.registerMethod('timespans', 'remove', this.removeTimespans, this);\n this.gantt.api.registerMethod('timespans', 'clear', this.clearTimespans, this);\n\n this.gantt.api.registerEvent('timespans', 'add');\n this.gantt.api.registerEvent('timespans', 'remove');\n this.gantt.api.registerEvent('timespans', 'change');\n };\n\n // Adds or updates timespans\n GanttTimespansManager.prototype.loadTimespans = function(timespans) {\n if (!angular.isArray(timespans)) {\n timespans = timespans !== undefined ? [timespans] : [];\n }\n\n this.gantt.$scope.timespans = timespans;\n for (var i = 0, l = timespans.length; i < l; i++) {\n var timespanModel = timespans[i];\n this.gantt.objectModel.cleanTimespan(timespanModel);\n this.loadTimespan(timespanModel);\n }\n };\n\n // Adds a timespan or merges the timespan if there is already one with the same id\n GanttTimespansManager.prototype.loadTimespan = function(timespanModel) {\n // Copy to new timespan (add) or merge with existing (update)\n var timespan, isUpdate = false;\n\n if (timespanModel.id in this.timespansMap) {\n timespan = this.timespansMap[timespanModel.id];\n timespan.model = timespanModel;\n isUpdate = true;\n this.gantt.api.timespans.raise.change(timespan);\n } else {\n timespan = new Timespan(this.gantt, timespanModel);\n this.timespansMap[timespanModel.id] = timespan;\n this.timespans.push(timespan);\n this.gantt.api.timespans.raise.add(timespan);\n }\n\n timespan.updatePosAndSize();\n return isUpdate;\n };\n\n GanttTimespansManager.prototype.removeTimespans = function(timespans) {\n if (!angular.isArray(timespans)) {\n timespans = [timespans];\n }\n\n for (var i = 0, l = timespans.length; i < l; i++) {\n var timespanData = timespans[i];\n // Delete the timespan\n this.removeTimespan(timespanData.id);\n }\n this.updateVisibleObjects();\n };\n\n GanttTimespansManager.prototype.removeTimespan = function(timespanId) {\n if (timespanId in this.timespansMap) {\n delete this.timespansMap[timespanId]; // Remove from map\n\n var removedTimespan;\n var timespan;\n for (var i = this.timespans.length - 1; i >= 0; i--) {\n timespan = this.timespans[i];\n if (timespan.model.id === timespanId) {\n removedTimespan = timespan;\n this.timespans.splice(i, 1); // Remove from array\n break;\n }\n }\n\n this.gantt.api.timespans.raise.remove(removedTimespan);\n return removedTimespan;\n }\n\n return undefined;\n };\n\n // Removes all timespans\n GanttTimespansManager.prototype.clearTimespans = function() {\n this.timespansMap = {};\n this.timespans = [];\n };\n\n GanttTimespansManager.prototype.updateTimespansPosAndSize = function() {\n for (var i = 0, l = this.timespans.length; i < l; i++) {\n this.timespans[i].updatePosAndSize();\n }\n };\n\n return GanttTimespansManager;\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').service('ganttArrays', [function() {\n return {\n moveToIndex: function(array, oldIndex, newIndex) {\n if (newIndex >= array.length) {\n var k = newIndex - array.length;\n while ((k--) + 1) {\n array.push(undefined);\n }\n }\n array.splice(newIndex, 0, array.splice(oldIndex, 1)[0]);\n return array;\n },\n getRemovedIds: function(newArray, oldArray, idProperty) {\n if (idProperty === undefined) {\n idProperty = 'id';\n }\n\n var i, l;\n var removedIds = [];\n\n if (oldArray !== undefined) {\n for (i = 0, l = oldArray.length; i < l; i++) {\n removedIds.push(oldArray[i][idProperty]);\n }\n }\n\n if (newArray !== undefined) {\n for (i = 0, l = newArray.length; i < l; i++) {\n var newObject = newArray[i];\n\n if (newObject[idProperty] !== undefined) {\n var newObjectIndex = removedIds.indexOf(newObject[idProperty]);\n if (newObjectIndex > -1) {\n removedIds.splice(newObjectIndex, 1);\n }\n }\n }\n }\n\n return removedIds;\n },\n indexOfId: function(array, value, idProperties) {\n var i;\n if (idProperties === undefined) {\n idProperties = 'id';\n } else if (idProperties instanceof Array) {\n for (i = array.length - 1; i >= 0; i--) {\n var arrayValue = array[i];\n for (var k = 0, l = idProperties.length; k < l; k++) {\n arrayValue = arrayValue[idProperties[k]];\n }\n if (arrayValue === value) {\n return i;\n }\n }\n return -1;\n }\n for (i = array.length - 1; i >= 0; i--) {\n if (array[i][idProperties] === value) {\n return i;\n }\n }\n return -1;\n },\n removeId: function(array, value, idProperties) {\n var indexOf = this.indexOfId(array, value, idProperties);\n if (indexOf > -1) {\n return array.splice(indexOf, 1)[0];\n }\n },\n remove: function(array, value) {\n var index = array.indexOf(value);\n if (index > -1) {\n array.splice(index, 1);\n return true;\n }\n return false;\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').service('ganttBinarySearch', [ function() {\n // Returns the object on the left and right in an array using the given cmp function.\n // The compare function defined which property of the value to compare (e.g.: c => c.left)\n\n return {\n getIndicesOnly: function(input, value, comparer, strict) {\n var lo = -1, hi = input.length;\n while (hi - lo > 1) {\n var mid = Math.floor((lo + hi) / 2);\n if (strict ? comparer(input[mid]) < value : comparer(input[mid]) <= value) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n if (!strict && input[lo] !== undefined && comparer(input[lo]) === value) {\n hi = lo;\n }\n return [lo, hi];\n },\n get: function(input, value, comparer, strict) {\n var res = this.getIndicesOnly(input, value, comparer, strict);\n return [input[res[0]], input[res[1]]];\n }\n };\n }]);\n}());\n","(function(){\n 'use strict';\n\n angular.module('gantt').factory('GanttHierarchy', [function() {\n var Hierarchy = function () {\n var self = this;\n\n var nameToRow = {};\n\n var idToRow = {};\n\n var nameToChildren = {};\n var idToChildren = {};\n\n var nameToParent = {};\n var idToParent = {};\n\n var registerChildRow = function(row, childRow) {\n if (childRow !== undefined) {\n var nameChildren = nameToChildren[row.model.name];\n if (nameChildren === undefined) {\n nameChildren = [];\n nameToChildren[row.model.name] = nameChildren;\n }\n nameChildren.push(childRow);\n\n\n var idChildren = idToChildren[row.model.id];\n if (idChildren === undefined) {\n idChildren = [];\n idToChildren[row.model.id] = idChildren;\n }\n idChildren.push(childRow);\n\n nameToParent[childRow.model.name] = row;\n idToParent[childRow.model.id] = row;\n }\n };\n\n this.refresh = function(rows) {\n nameToRow = {};\n idToRow = {};\n\n nameToChildren = {};\n idToChildren = {};\n\n nameToParent = {};\n idToParent = {};\n\n angular.forEach(rows, function(row) {\n nameToRow[row.model.name] = row;\n idToRow[row.model.id] = row;\n });\n\n angular.forEach(rows, function(row) {\n if (row.model.parent !== undefined) {\n var parentRow = nameToRow[row.model.parent];\n if (parentRow === undefined) {\n parentRow = idToRow[row.model.parent];\n }\n\n if (parentRow !== undefined) {\n registerChildRow(parentRow, row);\n }\n }\n\n if (row.model.children !== undefined) {\n angular.forEach(row.model.children, function(childRowNameOrId) {\n var childRow = nameToRow[childRowNameOrId];\n if (childRow === undefined) {\n childRow = idToRow[childRowNameOrId];\n }\n\n if (childRow !== undefined) {\n registerChildRow(row, childRow);\n }\n });\n }\n });\n\n var rootRows = [];\n angular.forEach(rows, function(row) {\n if (self.parent(row) === undefined) {\n rootRows.push(row);\n }\n });\n\n return rootRows;\n };\n\n this.children = function(row) {\n var children = idToChildren[row.model.id];\n return children;\n };\n\n this.descendants = function(row) {\n var descendants = [];\n\n var children = self.children(row);\n descendants.push.apply(descendants, children);\n if (children !== undefined) {\n angular.forEach(children, function(child) {\n var childDescendants = self.descendants(child);\n descendants.push.apply(descendants, childDescendants);\n });\n }\n\n return descendants;\n };\n\n this.parent = function(row) {\n var parent = idToParent[row.model.id];\n return parent;\n };\n\n this.ancestors = function(row) {\n var ancestors = [];\n\n var parent = self.parent(row);\n while (parent !== undefined) {\n ancestors.push(parent);\n parent = self.parent(parent);\n }\n\n return ancestors;\n };\n };\n\n return Hierarchy;\n }]);\n}());\n","(function() {\n 'use strict';\n angular.module('gantt').service('ganttUtils', [function() {\n return {\n createBoundedWrapper: function(object, method) {\n return function() {\n return method.apply(object, arguments);\n };\n },\n firstProperty: function(objects, propertyName, defaultValue) {\n for (var i = 0, l = objects.length; i < l; i++) {\n var object = objects[i];\n if (object !== undefined && propertyName in object) {\n if (object[propertyName] !== undefined) {\n return object[propertyName];\n }\n }\n }\n return defaultValue;\n },\n random4: function() {\n return Math.floor((1 + Math.random()) * 0x10000)\n .toString(16)\n .substring(1);\n },\n randomUuid: function() {\n return this.random4() + this.random4() + '-' + this.random4() + '-' + this.random4() + '-' +\n this.random4() + '-' + this.random4() + this.random4() + this.random4();\n },\n newId: (function() {\n var seedId = new Date().getTime();\n return function() {\n return seedId += 1;\n };\n })()\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').filter('ganttColumnLimit', [ 'ganttBinarySearch', function(bs) {\n // Returns only the columns which are visible on the screen\n var leftComparator = function(c) {\n return c.left;\n };\n\n return function(input, gantt) {\n var scrollLeft = gantt.scroll.getScrollLeft();\n var scrollContainerWidth = gantt.getWidth() - gantt.side.getWidth();\n\n if (scrollContainerWidth > 0) {\n var start = bs.getIndicesOnly(input, scrollLeft, leftComparator)[0];\n var end = bs.getIndicesOnly(input, scrollLeft + scrollContainerWidth, leftComparator)[1];\n return input.slice(start, end);\n } else {\n return input.slice();\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').filter('ganttTaskLimit', [function() {\n // Returns only the tasks which are visible on the screen\n // Use the task width and position to decide if a task is still visible\n\n return function(input, gantt) {\n var firstColumn = gantt.columnsManager.getFirstColumn();\n var lastColumn = gantt.columnsManager.getLastColumn();\n\n if (firstColumn !== undefined && lastColumn !== undefined) {\n var fromDate = firstColumn.date;\n var toDate = lastColumn.endDate;\n\n var res = [];\n\n var scrollLeft = gantt.scroll.getScrollLeft();\n var scrollContainerWidth = gantt.getWidth() - gantt.side.getWidth();\n\n for (var i = 0, l = input.length; i < l; i++) {\n var task = input[i];\n\n if (task.active) {\n res.push(task);\n } else {\n // If the task can be drawn with gantt columns only.\n if (task.model.to >= fromDate && task.model.from <= toDate) {\n\n if (task.left === undefined) {\n task.updatePosAndSize();\n }\n\n // If task has a visible part on the screen\n if (!scrollContainerWidth ||\n task.left >= scrollLeft && task.left <= scrollLeft + scrollContainerWidth ||\n task.left + task.width >= scrollLeft && task.left + task.width <= scrollLeft + scrollContainerWidth ||\n task.left < scrollLeft && task.left + task.width > scrollLeft + scrollContainerWidth) {\n\n res.push(task);\n }\n }\n }\n }\n\n return res;\n } else {\n return input.splice();\n }\n };\n }]);\n}());\n\n","(function() {\n 'use strict';\n\n angular.module('gantt').directive('ganttResizer', ['$document', '$parse', '$timeout', 'ganttMouseOffset', function($document, $parse, $timeout, mouseOffset) {\n return {\n restrict: 'A',\n require: '^gantt',\n scope: {\n targetElement: '=ganttResizer',\n enabled: '@?ganttResizerEnabled'\n },\n link: function ($scope, $element, $attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n var eventTopic = $attrs.ganttResizerEventTopic;\n\n if ($scope.enabled === undefined) {\n $scope.enabled = true;\n }\n\n $attrs.$observe('ganttResizerEnabled', function(value) {\n $scope.enabled = $parse(value)();\n });\n\n $scope.$watch('enabled', function (value) {\n if (value === undefined) {\n value = true;\n }\n\n $element.toggleClass('gantt-resizer-enabled', value);\n\n if (value) {\n $element.on('dblclick', dblclick);\n $element.on('mousedown', mousedown);\n } else {\n $element.off('dblclick', dblclick);\n $element.off('mousedown', mousedown);\n }\n });\n\n function dblclick(event) {\n event.preventDefault();\n setWidth(undefined);\n }\n\n function mousedown(event) {\n event.preventDefault();\n\n if (eventTopic !== undefined) {\n api[eventTopic].raise.resizeBegin(getWidth());\n }\n $document.on('mousemove', mousemove);\n $document.on('mouseup', mouseup);\n }\n\n function mousemove(event) {\n $scope.$evalAsync(function (){\n var offset = mouseOffset.getOffsetForElement($scope.targetElement[0], event);\n var maxWidth = ganttCtrl.gantt.getWidth()-ganttCtrl.gantt.scroll.getBordersWidth();\n var width = Math.min(Math.max(offset.x, 0), maxWidth);\n setWidth(width);\n });\n }\n\n function mouseup() {\n if (eventTopic !== undefined) {\n api[eventTopic].raise.resizeEnd(getWidth());\n }\n $document.unbind('mousemove', mousemove);\n $document.unbind('mouseup', mouseup);\n }\n\n $scope.$watch(function() {\n return getWidth();\n }, function(newValue, oldValue) {\n if (newValue !== oldValue) {\n $scope.targetElement.css('width', newValue + 'px');\n // Setting width again is required when min-width of max-width is set on targetElement.\n // This avoid going to a smaller or bigger value than targetElement capabilities.\n // Call of 'offsetWidth' is slow. Behaviour needs to be improved.\n if ($scope.targetElement[0].offsetWidth > 0) {\n setWidth($scope.targetElement[0].offsetWidth);\n }\n }\n });\n\n function setWidth(width) {\n if (width !== getWidth()) {\n ganttCtrl.gantt.options.set($attrs.resizerWidth, width);\n\n if (eventTopic !== undefined) {\n api[eventTopic].raise.resize(width);\n }\n\n $timeout(function() {\n ganttCtrl.gantt.columnsManager.updateColumnsMeta();\n });\n }\n }\n\n function getWidth() {\n return ganttCtrl.gantt.options.value($attrs.resizerWidth);\n }\n\n if (eventTopic) {\n api.registerEvent(eventTopic, 'resize');\n api.registerEvent(eventTopic, 'resizeBegin');\n api.registerEvent(eventTopic, 'resizeEnd');\n api.registerMethod(eventTopic, 'setWidth', setWidth, this);\n api.registerMethod(eventTopic, 'getWidth', getWidth, this);\n }\n }\n };\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttHorizontalScrollReceiver', function() {\n // The element with this attribute will scroll at the same time as the scrollSender element\n\n return {\n restrict: 'A',\n require: '^ganttScrollManager',\n link: function(scope, element, attrs, ganttScrollManagerCtrl) {\n ganttScrollManagerCtrl.registerHorizontalReceiver(element);\n }\n };\n });\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttScrollManager', function() {\n // The element with this attribute will scroll at the same time as the scrollSender element\n\n return {\n restrict: 'A',\n scope: {},\n controller: ['$scope', function($scope) {\n $scope.horizontal = [];\n $scope.vertical = [];\n\n this.registerVerticalReceiver = function (element) {\n element.css('position', 'relative');\n $scope.vertical.push(element[0]);\n };\n\n this.registerHorizontalReceiver = function (element) {\n element.css('position', 'relative');\n $scope.horizontal.push(element[0]);\n };\n\n this.getHorizontalRecievers = function() {\n return $scope.horizontal;\n };\n\n this.getVerticalRecievers = function() {\n return $scope.vertical;\n };\n }]\n };\n });\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttScrollSender', [function() {\n // Updates the element which are registered for the horizontal or vertical scroll event\n\n return {\n restrict: 'A',\n require: ['^gantt', '^ganttScrollManager'],\n link: function(scope, element, attrs, controllers) {\n var el = element[0];\n\n var updateListeners = function() {\n var i, l;\n\n var vertical = controllers[1].getVerticalRecievers();\n for (i = 0, l = vertical.length; i < l; i++) {\n var vElement = vertical[i];\n if (vElement.parentNode.scrollTop !== el.scrollTop) {\n vElement.parentNode.scrollTop = el.scrollTop;\n }\n }\n\n var horizontal = controllers[1].getHorizontalRecievers();\n for (i = 0, l = horizontal.length; i < l; i++) {\n var hElement = horizontal[i];\n if (hElement.parentNode.scrollLeft !== el.scrollLeft) {\n hElement.parentNode.scrollLeft = el.scrollLeft;\n }\n }\n };\n\n element.bind('scroll', updateListeners);\n\n scope.$watch(function() {\n return controllers[0].gantt.width;\n }, function(newValue, oldValue) {\n if (newValue !== oldValue) {\n var horizontal = controllers[1].getHorizontalRecievers();\n for (var i = 0, l = horizontal.length; i < l; i++) {\n var hElement = horizontal[i];\n hElement.style.width = newValue + 'px';\n }\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttScrollable', ['GanttDirectiveBuilder', '$timeout', 'ganttDebounce', 'moment', function(Builder, $timeout, debounce, moment) {\n var builder = new Builder('ganttScrollable');\n builder.controller = function($scope, $element) {\n $scope.gantt.scroll.$element = $element;\n var lastScrollLeft;\n var autoExpandTimer;\n\n var autoExpandColumns = function(el, date, direction) {\n var autoExpand = $scope.gantt.options.value('autoExpand');\n if (autoExpand !== 'both' && autoExpand !== true && autoExpand !== direction) {\n return;\n }\n\n var from, to;\n\n var viewScale = $scope.gantt.options.value('viewScale');\n viewScale = viewScale.trim();\n if (viewScale.charAt(viewScale.length - 1) === 's') {\n viewScale = viewScale.substring(0, viewScale.length - 1);\n }\n var viewScaleValue;\n var viewScaleUnit;\n var splittedViewScale;\n\n if (viewScale) {\n splittedViewScale = viewScale.split(' ');\n }\n if (splittedViewScale && splittedViewScale.length > 1) {\n viewScaleValue = parseFloat(splittedViewScale[0]);\n viewScaleUnit = splittedViewScale[splittedViewScale.length - 1];\n } else {\n viewScaleValue = 1;\n viewScaleUnit = viewScale;\n }\n\n if (direction === 'left') {\n from = moment(date).add(-5 * viewScaleValue, viewScaleUnit);\n $scope.fromDate = from;\n } else {\n to = moment(date).add(5 * viewScaleValue, viewScaleUnit);\n $scope.toDate = to;\n }\n\n $scope.gantt.api.scroll.raise.scroll(el.scrollLeft, date, direction);\n };\n\n $element.bind('scroll', debounce(function() {\n var el = $element[0];\n var currentScrollLeft = el.scrollLeft;\n var direction;\n var date;\n\n $scope.gantt.scroll.cachedScrollLeft = currentScrollLeft;\n $scope.gantt.columnsManager.updateVisibleColumns();\n $scope.gantt.rowsManager.updateVisibleObjects();\n\n if (currentScrollLeft < lastScrollLeft && currentScrollLeft === 0) {\n direction = 'left';\n date = $scope.gantt.columnsManager.from;\n } else if (currentScrollLeft > lastScrollLeft && el.offsetWidth + currentScrollLeft >= el.scrollWidth - 1) {\n direction = 'right';\n date = $scope.gantt.columnsManager.to;\n }\n\n lastScrollLeft = currentScrollLeft;\n\n if (date !== undefined) {\n if (autoExpandTimer) {\n $timeout.cancel(autoExpandTimer);\n }\n\n autoExpandTimer = $timeout(function() {\n autoExpandColumns(el, date, direction);\n }, 300);\n } else {\n $scope.gantt.api.scroll.raise.scroll(currentScrollLeft);\n }\n }, 5));\n\n $scope.getScrollableCss = function() {\n var css = {};\n\n var maxHeight = $scope.gantt.options.value('maxHeight');\n if (maxHeight > 0) {\n css['max-height'] = maxHeight - $scope.gantt.header.getHeight() + 'px';\n css['overflow-y'] = 'auto';\n\n if ($scope.gantt.scroll.isVScrollbarVisible()) {\n css['border-right'] = 'none';\n }\n }\n\n var columnWidth = this.gantt.options.value('columnWidth');\n var bodySmallerThanGantt = $scope.gantt.width === 0 ? false: $scope.gantt.width < $scope.gantt.getWidth() - $scope.gantt.side.getWidth();\n if (columnWidth !== undefined && bodySmallerThanGantt) {\n css.width = ($scope.gantt.width + this.gantt.scroll.getBordersWidth()) + 'px';\n }\n\n return css;\n };\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttVerticalScrollReceiver', function() {\n // The element with this attribute will scroll at the same time as the scrollSender element\n\n return {\n restrict: 'A',\n require: '^ganttScrollManager',\n link: function(scope, element, attrs, ganttScrollManagerCtrl) {\n ganttScrollManagerCtrl.registerVerticalReceiver(element);\n }\n };\n });\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttElementHeightListener', [function() {\n return {\n restrict: 'A',\n controller: ['$scope', '$element', '$attrs', function($scope, $element, $attrs) {\n var scopeVariable = $attrs.ganttElementHeightListener;\n if (scopeVariable === '') {\n scopeVariable = 'ganttElementHeight';\n }\n\n var effectiveScope = $scope;\n\n while(scopeVariable.indexOf('$parent.') === 0) {\n scopeVariable = scopeVariable.substring('$parent.'.length);\n effectiveScope = effectiveScope.$parent;\n }\n\n effectiveScope.$watch(function() {\n return $element[0].offsetHeight;\n }, function(newValue) {\n if (newValue > 0) {\n effectiveScope[scopeVariable] = newValue;\n }\n });\n }]\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttElementWidthListener', [function() {\n return {\n restrict: 'A',\n controller: ['$scope', '$element', '$attrs', function($scope, $element, $attrs) {\n var scopeVariable = $attrs.ganttElementWidthListener;\n if (scopeVariable === '') {\n scopeVariable = 'ganttElementWidth';\n }\n\n var effectiveScope = $scope;\n\n while(scopeVariable.indexOf('$parent.') === 0) {\n scopeVariable = scopeVariable.substring('$parent.'.length);\n effectiveScope = effectiveScope.$parent;\n }\n\n effectiveScope.$watch(function() {\n return $element[0].offsetWidth;\n }, function(newValue) {\n if (newValue > 0) {\n effectiveScope[scopeVariable] = newValue;\n }\n });\n }]\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttBody', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttBody');\n builder.controller = function($scope, $element) {\n $scope.gantt.body.$element = $element;\n $scope.gantt.body.$scope = $scope;\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttBodyBackground', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttBodyBackground');\n builder.controller = function($scope, $element) {\n $scope.gantt.body.background.$element = $element;\n $scope.gantt.body.background.$scope = $scope;\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttBodyColumns', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttBodyColumns');\n builder.controller = function($scope, $element) {\n $scope.gantt.body.columns.$element = $element;\n $scope.gantt.body.background.$scope = $scope;\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttBodyForeground', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttBodyForeground');\n builder.controller = function($scope, $element) {\n $scope.gantt.body.foreground.$element = $element;\n $scope.gantt.body.foreground.$scope = $scope;\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttBodyRows', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttBodyRows');\n builder.controller = function($scope, $element) {\n $scope.gantt.body.rows.$element = $element;\n $scope.gantt.body.rows.$scope = $scope;\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttColumn', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttColumn');\n builder.controller = function($scope, $element) {\n $scope.column.$element = $element;\n $scope.column.$scope = $scope;\n $scope.column.updateView();\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttColumnHeader', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttColumnHeader');\n builder.controller = function($scope, $element) {\n $scope.column.$element = $element;\n $scope.column.$scope = $scope;\n $scope.column.updateView();\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttHeader', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttHeader');\n builder.controller = function($scope, $element) {\n $scope.gantt.header.$element = $element;\n $scope.gantt.header.$scope = $scope;\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttHeaderColumns', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttHeaderColumns');\n builder.controller = function($scope, $element) {\n $scope.gantt.header.columns.$element = $element;\n $scope.gantt.header.columns.$scope = $scope;\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttRow', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttRow');\n builder.controller = function($scope, $element) {\n $scope.row.$element = $element;\n $scope.row.$scope = $scope;\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttRowBackground', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttRowBackground');\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttRowLabel', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttRowLabel');\n builder.restrict = 'A';\n builder.templateUrl = undefined;\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttScrollableHeader', ['GanttDirectiveBuilder', 'ganttLayout', function(Builder, layout) {\n var builder = new Builder('ganttScrollableHeader');\n builder.controller = function($scope) {\n var scrollBarWidth = layout.getScrollBarWidth();\n //var oldMaxHeightActivated = false;\n $scope.getScrollableHeaderCss = function() {\n var css = {};\n\n var maxHeightActivated = $scope.gantt.scroll.isVScrollbarVisible();\n var vScrollbarWidth = maxHeightActivated ? scrollBarWidth: 0;\n var columnWidth = this.gantt.options.value('columnWidth');\n var bodySmallerThanGantt = $scope.gantt.width === 0 ? false: $scope.gantt.width < $scope.gantt.getWidth() - $scope.gantt.side.getWidth();\n\n if (columnWidth !== undefined && bodySmallerThanGantt) {\n css.width = ($scope.gantt.width - vScrollbarWidth + this.gantt.scroll.getBordersWidth()) + 'px';\n } else if (maxHeightActivated) {\n css.width = $scope.gantt.getWidth() - $scope.gantt.side.getWidth() - vScrollbarWidth + 'px';\n }\n\n /*\n if (oldMaxHeightActivated !== maxHeightActivated) {\n oldMaxHeightActivated = maxHeightActivated;\n $scope.gantt.columnsManager.updateColumnsMeta();\n }\n */\n\n return css;\n };\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttSide', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttSide');\n builder.controller = function($scope, $element) {\n $scope.gantt.side.$element = $element;\n $scope.gantt.side.$scope = $scope;\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttSideBackground', ['GanttDirectiveBuilder', 'ganttLayout', function(Builder, layout) {\n var builder = new Builder('ganttSideBackground');\n builder.controller = function($scope) {\n var hScrollBarHeight = layout.getScrollBarHeight();\n\n $scope.getMaxHeightCss = function() {\n var css = {};\n\n if ($scope.maxHeight) {\n var bodyScrollBarHeight = $scope.gantt.scroll.isHScrollbarVisible() ? hScrollBarHeight : 0;\n css['max-height'] = $scope.maxHeight - bodyScrollBarHeight - $scope.gantt.header.getHeight() + 'px';\n }\n\n return css;\n };\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttSideContent', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttSideContent');\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttTask', ['GanttDirectiveBuilder', 'moment', function(Builder, moment) {\n var builder = new Builder('ganttTask');\n builder.controller = function($scope, $element) {\n $scope.task.$element = $element;\n $scope.task.$scope = $scope;\n\n $scope.getTaskContent = function() {\n if ($scope.task.model.content !== undefined) {\n return $scope.task.model.content;\n }\n return $scope.task.rowsManager.gantt.options.value('taskContent');\n };\n\n $scope.simplifyMoment = function(d) {\n return moment.isMoment(d) ? d.unix() : d;\n };\n\n $scope.$watchGroup(['simplifyMoment(task.model.from)', 'simplifyMoment(task.model.to)'], function() {\n $scope.task.updatePosAndSize();\n });\n };\n return builder.build();\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttTaskBackground', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTaskBackground');\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttTaskContent', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTaskContent');\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttTaskForeground', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTaskForeground');\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttTimeFrame', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTimeFrame');\n builder.controller = function($scope, $element) {\n $scope.timeFrame.$element = $element;\n $scope.timeFrame.$scope = $scope;\n $scope.timeFrame.updateView();\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttTimespan', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTimespan');\n builder.controller = function($scope, $element) {\n $scope.timespan.$element = $element;\n $scope.timespan.$scope = $scope;\n $scope.timespan.updateView();\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('ganttDebounce', ['$timeout', function($timeout) {\n function debounce(fn, timeout, invokeApply) {\n var nthCall = 0;\n return function() {\n var self = this;\n var argz = arguments;\n nthCall++;\n var later = (function(version) {\n return function() {\n if (version === nthCall) {\n return fn.apply(self, argz);\n }\n };\n })(nthCall);\n return $timeout(later, timeout, invokeApply === undefined ? true: invokeApply);\n };\n }\n\n return debounce;\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').service('GanttDirectiveBuilder', ['$templateCache', function($templateCache) {\n var DirectiveBuilder = function DirectiveBuilder(directiveName, templateUrl, require, restrict) {\n var self = this;\n\n this.directiveName = directiveName;\n this.templateUrl = templateUrl === undefined ? 'template/' + directiveName + '.tmpl.html' : templateUrl;\n this.require = require === undefined ? '^gantt' : require;\n this.restrict = restrict === undefined ? 'E' : restrict;\n this.scope = false;\n this.transclude = true;\n this.replace = true;\n\n this.build = function() {\n var directiveName = self.directiveName;\n var templateUrl = self.templateUrl;\n var controllerFunction = self.controller;\n\n var directive = {\n restrict: self.restrict,\n require: self.require,\n transclude: self.transclude,\n replace: self.replace,\n scope: self.scope,\n templateUrl: function(tElement, tAttrs) {\n if (tAttrs.templateUrl !== undefined) {\n templateUrl = tAttrs.templateUrl;\n }\n if (tAttrs.template !== undefined) {\n $templateCache.put(templateUrl, tAttrs.template);\n }\n return templateUrl;\n },\n compile: function () {\n return {\n pre: function preLink(scope, iElement, iAttrs, controller) {\n scope.gantt.api.directives.raise.preLink(directiveName, scope, iElement, iAttrs, controller);\n },\n post: function postLink(scope, iElement, iAttrs, controller) {\n scope.gantt.api.directives.raise.postLink(directiveName, scope, iElement, iAttrs, controller);\n\n }\n };\n },\n controller: ['$scope', '$element', '$attrs', function($scope, $element, $attrs) {\n var controller = this;\n\n if (controllerFunction !== undefined) {\n controllerFunction($scope, $element, $attrs, controller);\n }\n\n $scope.gantt.api.directives.raise.controller(directiveName, $scope, $element, $attrs, controller);\n $scope.$on('$destroy', function() {\n $scope.gantt.api.directives.raise.destroy(directiveName, $scope, $element, $attrs, controller);\n });\n\n $scope.$evalAsync(function() {\n $scope.gantt.api.directives.raise.new(directiveName, $scope, $element, $attrs, controller);\n });\n }]\n };\n\n if (!templateUrl) {\n delete directive.templateUrl;\n delete directive.replace;\n delete directive.transclude;\n }\n\n return directive;\n };\n };\n\n return DirectiveBuilder;\n }]);\n}());\n","(function() {\n 'use strict';\n angular.module('gantt').service('ganttDom', ['$document', function($document) {\n return {\n elementFromPoint: function(x, y) {\n return $document[0].elementFromPoint(x, y);\n },\n elementsFromPoint: function(x, y, depth) {\n var elements = [], previousPointerEvents = [], cDepth = 0, current, i, l, d;\n\n // get all elements via elementFromPoint, and remove them from hit-testing in order\n while ((current = this.elementFromPoint(x, y)) && elements.indexOf(current) === -1 && current !== null &&\n (depth === undefined || cDepth < depth)) {\n\n // push the element and its current style\n elements.push(current);\n previousPointerEvents.push({\n value: current.style.getPropertyValue('visibility'),\n priority: current.style.getPropertyPriority('visibility')\n });\n\n // add \"pointer-events: none\", to get to the underlying element\n current.style.setProperty('visibility', 'hidden', 'important');\n\n cDepth++;\n }\n\n // restore the previous pointer-events values\n for (i = 0, l = previousPointerEvents.length; i < l; i++) {\n d = previousPointerEvents[i];\n elements[i].style.setProperty('visibility', d.value ? d.value : '', d.priority);\n }\n\n return elements;\n },\n findElementFromPoint: function(x, y, checkFunction) {\n var elements = [], previousPointerEvents = [], cDepth = 0, current, found, i, l, d;\n\n // get all elements via elementFromPoint, and remove them from hit-testing in order\n while ((current = this.elementFromPoint(x, y)) && elements.indexOf(current) === -1 && current !== null) {\n\n // push the element and its current style\n elements.push(current);\n previousPointerEvents.push({\n value: current.style.getPropertyValue('visibility'),\n priority: current.style.getPropertyPriority('visibility')\n });\n\n // add \"visibility: hidden\", to get to the underlying element.\n // Would be better with pointer-events: none, but IE<11 doesn't support this.\n current.style.setProperty('visibility', 'hidden', 'important');\n\n cDepth++;\n\n if (checkFunction(current)) {\n found = current;\n break;\n }\n }\n\n // restore the previous pointer-events values\n for (i = 0, l = previousPointerEvents.length; i < l; i++) {\n d = previousPointerEvents[i];\n elements[i].style.setProperty('visibility', d.value ? d.value : '', d.priority);\n }\n\n return found;\n }\n };\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').service('ganttEnableNgAnimate', ['$injector', function($injector) {\n var ngAnimate;\n try {\n ngAnimate = $injector.get('$animate');\n } catch (e) {\n }\n\n if (ngAnimate !== undefined) {\n return function(element, enabled) {\n if (angular.version.major >= 1 && angular.version.minor >= 4) {\n // AngularJS 1.4 breaking change, arguments are flipped.\n ngAnimate.enabled(element, enabled);\n } else {\n ngAnimate.enabled(enabled, element);\n }\n\n };\n } else {\n return angular.noop;\n }\n\n\n }]);\n}());\n\n","(function() {\n 'use strict';\n angular.module('gantt').directive('ganttBindCompileHtml', ['$compile', function($compile) {\n return {\n restrict: 'A',\n require: '^gantt',\n link: function(scope, element, attrs, ganttCtrl) {\n scope.scope = ganttCtrl.gantt.$scope.$parent;\n scope.$watch(function() {\n return scope.$eval(attrs.ganttBindCompileHtml);\n }, function(value) {\n element.html(value);\n $compile(element.contents())(scope);\n });\n }\n };\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').service('ganttLayout', ['$document', function($document) {\n return {\n /**\n * Compute the width of scrollbar.\n *\n * @returns {number} width of the scrollbar, in px.\n */\n getScrollBarWidth: function() {\n var inner = $document[0].createElement('p');\n inner.style.width = '100%';\n inner.style.height = '200px';\n\n var outer = $document[0].createElement('div');\n outer.style.position = 'absolute';\n outer.style.top = '0px';\n outer.style.left = '0px';\n outer.style.visibility = 'hidden';\n outer.style.width = '200px';\n outer.style.height = '150px';\n outer.style.overflow = 'hidden';\n outer.appendChild (inner);\n\n $document[0].body.appendChild (outer);\n\n var w1 = inner.offsetWidth;\n outer.style.overflow = 'scroll';\n\n var w2 = inner.offsetWidth;\n if (w1 === w2) {\n w2 = outer.clientWidth;\n }\n\n $document[0].body.removeChild (outer);\n\n return (w1 - w2);\n },\n /**\n * Compute the height of scrollbar.\n *\n * @returns {number} height of the scrollbar, in px.\n */\n getScrollBarHeight: function() {\n var inner = $document[0].createElement('p');\n inner.style.width = '200px;';\n inner.style.height = '100%';\n\n var outer = $document[0].createElement('div');\n outer.style.position = 'absolute';\n outer.style.top = '0px';\n outer.style.left = '0px';\n outer.style.visibility = 'hidden';\n outer.style.width = '150px';\n outer.style.height = '200px';\n outer.style.overflow = 'hidden';\n outer.appendChild (inner);\n\n $document[0].body.appendChild (outer);\n\n var h1 = inner.offsetHeight;\n outer.style.overflow = 'scroll';\n\n var h2 = inner.offsetHeight;\n if (h1 === h2) {\n h2 = outer.clientHeight;\n }\n\n $document[0].body.removeChild (outer);\n\n return (h1 - h2);\n },\n\n setColumnsWidthFactor: function(columns, widthFactor, originalLeftOffset) {\n if (!columns) {\n return;\n }\n\n if (!originalLeftOffset) {\n originalLeftOffset = 0;\n }\n\n angular.forEach(columns, function(column) {\n column.left = (widthFactor * (column.originalSize.left + originalLeftOffset)) - originalLeftOffset;\n column.width = widthFactor * column.originalSize.width;\n\n angular.forEach(column.timeFrames, function(timeFrame) {\n timeFrame.left = widthFactor * timeFrame.originalSize.left;\n timeFrame.width = widthFactor * timeFrame.originalSize.width;\n });\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').service('ganttMouseButton', [ function() {\n // Mouse button cross browser normalization\n\n return {\n getButton: function(e) {\n e = e || window.event;\n\n if (!e.which) {\n if (e.button === undefined) {\n return 1;\n }\n return e.button < 2 ? 1 : e.button === 4 ? 2 : 3;\n } else {\n return e.which;\n }\n }\n };\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').service('ganttMouseOffset', [ function() {\n // Mouse offset support for lesser browsers (read IE 8)\n\n return {\n getTouch: function(evt) {\n if (evt.touches !== undefined) {\n return evt.touches[0];\n }\n return evt;\n },\n getOffset: function(evt) {\n if (evt.offsetX && evt.offsetY) {\n return { x: evt.offsetX, y: evt.offsetY };\n }\n if (evt.layerX && evt.layerY) {\n return { x: evt.layerX, y: evt.layerY };\n }\n return this.getOffsetForElement(evt.target, evt);\n },\n getOffsetForElement: function(el, evt) {\n var bb = el.getBoundingClientRect();\n return { x: evt.clientX - bb.left, y: evt.clientY - bb.top };\n }\n };\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').factory('ganttSmartEvent', [function() {\n // Auto released the binding when the scope is destroyed. Use if an event is registered on another element than the scope.\n\n function smartEvent($scope, $element, event, fn) {\n $scope.$on('$destroy', function() {\n $element.unbind(event, fn);\n });\n\n return {\n bindOnce: function() {\n $element.one(event, fn);\n },\n bind: function() {\n $element.bind(event, fn);\n },\n unbind: function() {\n $element.unbind(event, fn);\n }\n };\n }\n\n return smartEvent;\n }]);\n}());\n","angular.module('gantt.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('template/gantt.tmpl.html',\n '<div class=\"gantt unselectable\" ng-cloak gantt-scroll-manager gantt-element-width-listener=\"ganttElementWidth\">\\n' +\n ' <gantt-side>\\n' +\n ' <gantt-side-background>\\n' +\n ' </gantt-side-background>\\n' +\n ' <gantt-side-content>\\n' +\n ' </gantt-side-content>\\n' +\n ' <div gantt-resizer=\"gantt.side.$element\" gantt-resizer-event-topic=\"side\" gantt-resizer-enabled=\"{{$parent.gantt.options.value(\\'allowSideResizing\\')}}\" resizer-width=\"sideWidth\" class=\"gantt-resizer\">\\n' +\n ' <div ng-show=\"$parent.gantt.options.value(\\'allowSideResizing\\')\" class=\"gantt-resizer-display\"></div>\\n' +\n ' </div>\\n' +\n ' </gantt-side>\\n' +\n ' <gantt-scrollable-header>\\n' +\n ' <gantt-header gantt-element-height-listener=\"$parent.ganttHeaderHeight\">\\n' +\n ' <gantt-header-columns>\\n' +\n ' <div ng-repeat=\"header in gantt.columnsManager.visibleHeaders track by $index\">\\n' +\n ' <div class=\"gantt-header-row\" ng-class=\"{\\'gantt-header-row-last\\': $last, \\'gantt-header-row-first\\': $first}\">\\n' +\n ' <gantt-column-header ng-repeat=\"column in header\"></gantt-column-header>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </gantt-header-columns>\\n' +\n ' </gantt-header>\\n' +\n ' </gantt-scrollable-header>\\n' +\n ' <gantt-scrollable>\\n' +\n ' <gantt-body>\\n' +\n ' <gantt-body-background>\\n' +\n ' <gantt-row-background ng-repeat=\"row in gantt.rowsManager.visibleRows track by row.model.id\"></gantt-row-background>\\n' +\n ' </gantt-body-background>\\n' +\n ' <gantt-body-foreground>\\n' +\n ' <div class=\"gantt-current-date-line\" ng-show=\"currentDate === \\'line\\' && gantt.currentDateManager.position >= 0 && gantt.currentDateManager.position <= gantt.width\" ng-style=\"{\\'left\\': gantt.currentDateManager.position + \\'px\\' }\"></div>\\n' +\n ' </gantt-body-foreground>\\n' +\n ' <gantt-body-columns>\\n' +\n ' <gantt-column ng-repeat=\"column in gantt.columnsManager.visibleColumns\">\\n' +\n ' <gantt-time-frame ng-repeat=\"timeFrame in column.visibleTimeFrames\"></gantt-time-frame>\\n' +\n ' </gantt-column>\\n' +\n ' </gantt-body-columns>\\n' +\n ' <div ng-if=\"gantt.columnsManager.visibleColumns == 0\" style=\"background-color: #808080\"></div>\\n' +\n ' <gantt-body-rows>\\n' +\n ' <gantt-timespan ng-repeat=\"timespan in gantt.timespansManager.timespans track by timespan.model.id\"></gantt-timespan>\\n' +\n ' <gantt-row ng-repeat=\"row in gantt.rowsManager.visibleRows track by row.model.id\">\\n' +\n ' <gantt-task ng-repeat=\"task in row.visibleTasks track by task.model.id\">\\n' +\n ' </gantt-task>\\n' +\n ' </gantt-row>\\n' +\n ' </gantt-body-rows>\\n' +\n ' </gantt-body>\\n' +\n ' </gantt-scrollable>\\n' +\n '\\n' +\n ' <!-- Plugins -->\\n' +\n ' <ng-transclude></ng-transclude>\\n' +\n '\\n' +\n ' <!--\\n' +\n ' ******* Inline templates *******\\n' +\n ' You can specify your own templates by either changing the default ones below or by\\n' +\n ' adding an attribute template-url=\"<url to your template>\" on the specific element.\\n' +\n ' -->\\n' +\n '\\n' +\n ' <!-- Body template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttBody.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-body\" ng-style=\"{\\'width\\': gantt.width > 0 ? gantt.width +\\'px\\' : undefined}\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Header template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttHeader.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-header\"\\n' +\n ' ng-show=\"gantt.columnsManager.columns.length > 0 && gantt.columnsManager.headers.length > 0\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Side template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttSide.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-side\" style=\"width: auto;\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Side content template-->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttSideContent.tmpl.html\">\\n' +\n ' <div class=\"gantt-side-content\">\\n' +\n ' </div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Header columns template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttHeaderColumns.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-header-columns\"\\n' +\n ' gantt-horizontal-scroll-receiver></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttColumnHeader.tmpl.html\">\\n' +\n ' <div class=\"gantt-column-header\" ng-class=\"{\\'gantt-column-header-last\\': $last, \\'gantt-column-header-first\\': $first}\">{{::column.label}}</div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Body background template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttBodyBackground.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-body-background\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Body foreground template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttBodyForeground.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-body-foreground\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Body columns template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttBodyColumns.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-body-columns\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttColumn.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-column gantt-foreground-col\" ng-class=\"{\\'gantt-column-last\\': $last, \\'gantt-column-first\\': $first}\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttTimeFrame.tmpl.html\">\\n' +\n ' <div class=\"gantt-timeframe\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Scrollable template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttScrollable.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-scrollable\" gantt-scroll-sender ng-style=\"getScrollableCss()\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttScrollableHeader.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-scrollable-header\" ng-style=\"getScrollableHeaderCss()\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Rows template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttBodyRows.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-body-rows\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Timespan template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttTimespan.tmpl.html\">\\n' +\n ' <div class=\"gantt-timespan\" ng-class=\"timespan.model.classes\">\\n' +\n ' </div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Task template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttTask.tmpl.html\">\\n' +\n ' <div class=\"gantt-task\" ng-class=\"task.model.classes\">\\n' +\n ' <gantt-task-background></gantt-task-background>\\n' +\n ' <gantt-task-foreground></gantt-task-foreground>\\n' +\n ' <gantt-task-content></gantt-task-content>\\n' +\n ' </div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttTaskBackground.tmpl.html\">\\n' +\n ' <div class=\"gantt-task-background\" ng-style=\"{\\'background-color\\': task.model.color}\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttTaskForeground.tmpl.html\">\\n' +\n ' <div class=\"gantt-task-foreground\">\\n' +\n ' <div ng-if=\"task.truncatedRight\" class=\"gantt-task-truncated-right\">></div>\\n' +\n ' <div ng-if=\"task.truncatedLeft\" class=\"gantt-task-truncated-left\"><</div>\\n' +\n ' </div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Task content template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttTaskContent.tmpl.html\">\\n' +\n ' <div class=\"gantt-task-content\" unselectable=\"on\"><span unselectable=\"on\" gantt-bind-compile-html=\"getTaskContent()\"/></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n '\\n' +\n ' <!-- Row background template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttRowBackground.tmpl.html\">\\n' +\n ' <div class=\"gantt-row gantt-row-height\"\\n' +\n ' ng-class=\"row.model.classes\"\\n' +\n ' ng-class-odd=\"\\'gantt-row-odd\\'\"\\n' +\n ' ng-class-even=\"\\'gantt-row-even\\'\"\\n' +\n ' ng-style=\"{\\'height\\': row.model.height}\">\\n' +\n ' <div class=\"gantt-row-background\"\\n' +\n ' ng-style=\"{\\'background-color\\': row.model.color}\">\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Row template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttRow.tmpl.html\">\\n' +\n ' <div class=\"gantt-row gantt-row-height\"\\n' +\n ' ng-class=\"row.model.classes\"\\n' +\n ' ng-class-odd=\"\\'gantt-row-odd\\'\"\\n' +\n ' ng-class-even=\"\\'gantt-row-even\\'\"\\n' +\n ' ng-style=\"{\\'height\\': row.model.height}\">\\n' +\n ' <div ng-transclude class=\"gantt-row-content\"></div>\\n' +\n ' </div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Side background template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttSideBackground.tmpl.html\">\\n' +\n ' <div class=\"gantt-side-background\">\\n' +\n ' <div class=\"gantt-side-background-header\" ng-style=\"{height: $parent.ganttHeaderHeight + \\'px\\'}\">\\n' +\n ' <div ng-show=\"$parent.ganttHeaderHeight\" class=\"gantt-header-row gantt-side-header-row\"></div>\\n' +\n ' </div>\\n' +\n ' <div class=\"gantt-side-background-body\" ng-style=\"getMaxHeightCss()\">\\n' +\n ' <div gantt-vertical-scroll-receiver>\\n' +\n ' <div class=\"gantt-row gantt-row-height \"\\n' +\n ' ng-class-odd=\"\\'gantt-row-odd\\'\"\\n' +\n ' ng-class-even=\"\\'gantt-row-even\\'\"\\n' +\n ' ng-class=\"row.model.classes\"\\n' +\n ' ng-repeat=\"row in gantt.rowsManager.visibleRows track by row.model.id\"\\n' +\n ' ng-style=\"{\\'height\\': row.model.height}\">\\n' +\n ' <div gantt-row-label class=\"gantt-row-label gantt-row-background\"\\n' +\n ' ng-style=\"{\\'background-color\\': row.model.color}\">\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </script>\\n' +\n '</div>\\n' +\n '');\n}]);\n"]} \ No newline at end of file +{"version":3,"sources":["../src/core/gantt.directive.js","../src/core/logic/api/api.factory.js","../src/core/logic/api/options.factory.js","../src/core/logic/calendar/calendar.factory.js","../src/core/logic/calendar/currentDateManager.factory.js","../src/core/logic/column/column.factory.js","../src/core/logic/column/columnBuilder.factory.js","../src/core/logic/column/columnGenerator.service.js","../src/core/logic/column/columnHeader.factory.js","../src/core/logic/column/columnsManager.factory.js","../src/core/logic/column/headersGenerator.service.js","../src/core/logic/gantt.factory.js","../src/core/logic/model/objectModel.factory.js","../src/core/logic/row/row.factory.js","../src/core/logic/row/rowHeader.factory.js","../src/core/logic/row/rowsManager.factory.js","../src/core/logic/task/task.factory.js","../src/core/logic/template/body.factory.js","../src/core/logic/template/bodyBackground.factory.js","../src/core/logic/template/bodyColumns.factory.js","../src/core/logic/template/bodyForeground.factory.js","../src/core/logic/template/bodyRows.factory.js","../src/core/logic/template/header.factory.js","../src/core/logic/template/headerColumns.factory.js","../src/core/logic/template/scroll.factory.js","../src/core/logic/template/side.factory.js","../src/core/logic/timespan/timespan.factory.js","../src/core/logic/timespan/timespansManager.factory.js","../src/core/logic/util/arrays.service.js","../src/core/logic/util/binarySearch.service.js","../src/core/logic/util/hierarchy.factory.js","../src/core/logic/util/utils.service.js","../src/core/ui/limit/columnLimit.filter.js","../src/core/ui/limit/taskLimit.filter.js","../src/core/ui/resizer/resizer.directive.js","../src/core/ui/scroll/horizontalScrollReceiver.directive.js","../src/core/ui/scroll/scrollManager.directive.js","../src/core/ui/scroll/scrollSender.directive.js","../src/core/ui/scroll/scrollable.directive.js","../src/core/ui/scroll/verticalScrollReceiver.directive.js","../src/core/ui/size/elementHeightListener.directive.js","../src/core/ui/size/elementWidthListener.directive.js","../src/core/ui/template/body.directive.js","../src/core/ui/template/bodyBackground.directive.js","../src/core/ui/template/bodyColumns.directive.js","../src/core/ui/template/bodyForeground.directive.js","../src/core/ui/template/bodyRows.directive.js","../src/core/ui/template/column.directive.js","../src/core/ui/template/columnHeader.directive.js","../src/core/ui/template/header.directive.js","../src/core/ui/template/headerColumns.directive.js","../src/core/ui/template/row.directive.js","../src/core/ui/template/rowBackground.directive.js","../src/core/ui/template/rowLabel.directive.js","../src/core/ui/template/scrollableHeader.directive.js","../src/core/ui/template/side.directive.js","../src/core/ui/template/sideBackground.directive.js","../src/core/ui/template/sideContent.directive.js","../src/core/ui/template/task.directive.js","../src/core/ui/template/taskBackground.directive.js","../src/core/ui/template/taskContent.directive.js","../src/core/ui/template/taskForeground.directive.js","../src/core/ui/template/timeFrame.directive.js","../src/core/ui/template/timespan.directive.js","../src/core/ui/util/debounce.factory.js","../src/core/ui/util/directiveBuilder.service.js","../src/core/ui/util/dom.service.js","../src/core/ui/util/enableNgAnimate.service.js","../src/core/ui/util/ganttBindHtmlCompile.directive.js","../src/core/ui/util/layout.service.js","../src/core/ui/util/mouseButton.service.js","../src/core/ui/util/mouseOffset.service.js","../src/core/ui/util/smartEvent.factory.js","../.tmp/generated/core/html2js.js"],"names":[],"mappings":"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","file":"angular-gantt.js","sourcesContent":["(function(){\n 'use strict';\n angular.module('gantt', ['gantt.templates', 'angularMoment'])\n .directive('gantt', ['Gantt', 'ganttEnableNgAnimate', '$timeout', '$templateCache', function(Gantt, enableNgAnimate, $timeout, $templateCache) {\n return {\n restrict: 'A',\n transclude: true,\n templateUrl: function(tElement, tAttrs) {\n var templateUrl;\n if (tAttrs.templateUrl === undefined) {\n templateUrl = 'template/gantt.tmpl.html';\n } else {\n templateUrl = tAttrs.templateUrl;\n }\n if (tAttrs.template !== undefined) {\n $templateCache.put(templateUrl, tAttrs.template);\n }\n return templateUrl;\n },\n scope: {\n sortMode: '=?',\n filterTask: '=?',\n filterTaskComparator: '=?',\n filterRow: '=?',\n filterRowComparator: '=?',\n viewScale: '=?',\n columnWidth: '=?',\n expandToFit: '=?',\n shrinkToFit: '=?',\n showSide: '=?',\n allowSideResizing: '=?',\n fromDate: '=?',\n toDate: '=?',\n currentDateValue: '=?',\n currentDate: '=?',\n daily: '=?',\n autoExpand: '=?',\n taskOutOfRange: '=?',\n taskContent: '=?',\n rowContent: '=?',\n maxHeight: '=?',\n sideWidth: '=?',\n headers: '=?',\n headersFormats: '=?',\n timeFrames: '=?',\n dateFrames: '=?',\n timeFramesWorkingMode: '=?',\n timeFramesNonWorkingMode: '=?',\n timespans: '=?',\n columnMagnet: '=?',\n shiftColumnMagnet: '=?',\n timeFramesMagnet: '=?',\n data: '=?',\n api: '=?',\n options: '=?'\n },\n controller: ['$scope', '$element', function($scope, $element) {\n for (var option in $scope.options) {\n $scope[option] = $scope.options[option];\n }\n\n // Disable animation if ngAnimate is present, as it drops down performance.\n enableNgAnimate($element, false);\n\n $scope.gantt = new Gantt($scope, $element);\n this.gantt = $scope.gantt;\n }],\n link: function(scope, element) {\n scope.gantt.api.directives.raise.new('gantt', scope, element);\n scope.$on('$destroy', function() {\n scope.gantt.api.directives.raise.destroy('gantt', scope, element);\n });\n\n $timeout(function() {\n scope.gantt.initialized();\n });\n }\n };\n }]);\n}());\n\n","// This file is adapted from Angular UI ngGrid project\n// MIT License\n// https://github.com/angular-ui/ng-grid/blob/v3.0.0-rc.20/src/js/core/factories/GridApi.js\n(function() {\n 'use strict';\n\n angular.module('gantt')\n .factory('GanttApi', ['$q', '$rootScope', 'ganttUtils',\n function($q, $rootScope, utils) {\n /**\n * @ngdoc function\n * @name gantt.class:GanttApi\n * @description GanttApi provides the ability to register public methods events inside the gantt and allow\n * for other components to use the api via featureName.raise.methodName and featureName.on.eventName(function(args){}.\n * @param {object} gantt gantt that owns api\n */\n var GanttApi = function GanttApi(gantt) {\n this.gantt = gantt;\n this.listeners = [];\n this.apiId = utils.newId();\n };\n\n function registerEventWithAngular(eventId, handler, gantt, _this) {\n return $rootScope.$on(eventId, function() {\n var args = Array.prototype.slice.call(arguments);\n args.splice(0, 1); //remove evt argument\n handler.apply(_this ? _this : gantt.api, args);\n });\n }\n\n /**\n * @ngdoc function\n * @name gantt.class:suppressEvents\n * @methodOf gantt.class:GanttApi\n * @description Used to execute a function while disabling the specified event listeners.\n * Disables the listenerFunctions, executes the callbackFn, and then enables\n * the listenerFunctions again\n * @param {object} listenerFuncs listenerFunc or array of listenerFuncs to suppress. These must be the same\n * functions that were used in the .on.eventName method\n * @param {object} callBackFn function to execute\n * @example\n * <pre>\n * var navigate = function (newRowCol, oldRowCol){\n * //do something on navigate\n * }\n *\n * ganttApi.cellNav.on.navigate(scope,navigate);\n *\n *\n * //call the scrollTo event and suppress our navigate listener\n * //scrollTo will still raise the event for other listeners\n * ganttApi.suppressEvents(navigate, function(){\n * ganttApi.cellNav.scrollTo(aRow, aCol);\n * });\n *\n * </pre>\n */\n GanttApi.prototype.suppressEvents = function(listenerFuncs, callBackFn) {\n var self = this;\n var listeners = angular.isArray(listenerFuncs) ? listenerFuncs : [listenerFuncs];\n\n //find all registered listeners\n var foundListeners = [];\n listeners.forEach(function(l) {\n foundListeners = self.listeners.filter(function(lstnr) {\n return l === lstnr.handler;\n });\n });\n\n //deregister all the listeners\n foundListeners.forEach(function(l) {\n l.dereg();\n });\n\n callBackFn();\n\n //reregister all the listeners\n foundListeners.forEach(function(l) {\n l.dereg = registerEventWithAngular(l.eventId, l.handler, self.gantt, l._this);\n });\n\n };\n\n /**\n * @ngdoc function\n * @name registerEvent\n * @methodOf gantt.class:GanttApi\n * @description Registers a new event for the given feature. The event will get a\n * .raise and .on prepended to it\n * <br>\n * .raise.eventName() - takes no arguments\n * <br/>\n * <br/>\n * .on.eventName(scope, callBackFn, _this)\n * <br/>\n * scope - a scope reference to add a deregister call to the scopes .$on('destroy')\n * <br/>\n * callBackFn - The function to call\n * <br/>\n * _this - optional this context variable for callbackFn. If omitted, gantt.api will be used for the context\n * <br/>\n * .on.eventName returns a dereg funtion that will remove the listener. It's not necessary to use it as the listener\n * will be removed when the scope is destroyed.\n * @param {string} featureName name of the feature that raises the event\n * @param {string} eventName name of the event\n */\n GanttApi.prototype.registerEvent = function(featureName, eventName) {\n var self = this;\n if (!self[featureName]) {\n self[featureName] = {};\n }\n\n var feature = self[featureName];\n if (!feature.on) {\n feature.on = {};\n feature.raise = {};\n }\n\n var eventId = 'event:gantt:' + this.apiId + ':' + featureName + ':' + eventName;\n\n // Creating raise event method featureName.raise.eventName\n feature.raise[eventName] = function() {\n $rootScope.$emit.apply($rootScope, [eventId].concat(Array.prototype.slice.call(arguments)));\n };\n\n // Creating on event method featureName.oneventName\n feature.on[eventName] = function(scope, handler, _this) {\n var deregAngularOn = registerEventWithAngular(eventId, handler, self.gantt, _this);\n\n //track our listener so we can turn off and on\n var listener = {\n handler: handler,\n dereg: deregAngularOn,\n eventId: eventId,\n scope: scope,\n _this: _this\n };\n self.listeners.push(listener);\n\n var removeListener = function() {\n listener.dereg();\n var index = self.listeners.indexOf(listener);\n self.listeners.splice(index, 1);\n };\n\n //destroy tracking when scope is destroyed\n scope.$on('$destroy', function() {\n removeListener();\n });\n\n return removeListener;\n };\n };\n\n /**\n * @ngdoc function\n * @name registerEventsFromObject\n * @methodOf gantt.class:GanttApi\n * @description Registers features and events from a simple objectMap.\n * eventObjectMap must be in this format (multiple features allowed)\n * <pre>\n * {featureName:\n * {\n * eventNameOne:function(args){},\n * eventNameTwo:function(args){}\n * }\n * }\n * </pre>\n * @param {object} eventObjectMap map of feature/event names\n */\n GanttApi.prototype.registerEventsFromObject = function(eventObjectMap) {\n var self = this;\n var features = [];\n angular.forEach(eventObjectMap, function(featProp, featPropName) {\n var feature = {name: featPropName, events: []};\n angular.forEach(featProp, function(prop, propName) {\n feature.events.push(propName);\n });\n features.push(feature);\n });\n\n features.forEach(function(feature) {\n feature.events.forEach(function(event) {\n self.registerEvent(feature.name, event);\n });\n });\n\n };\n\n /**\n * @ngdoc function\n * @name registerMethod\n * @methodOf gantt.class:GanttApi\n * @description Registers a new event for the given feature\n * @param {string} featureName name of the feature\n * @param {string} methodName name of the method\n * @param {object} callBackFn function to execute\n * @param {object} _this binds callBackFn 'this' to _this. Defaults to ganttApi.gantt\n */\n GanttApi.prototype.registerMethod = function(featureName, methodName, callBackFn, _this) {\n if (!this[featureName]) {\n this[featureName] = {};\n }\n\n var feature = this[featureName];\n\n feature[methodName] = utils.createBoundedWrapper(_this || this.gantt, callBackFn);\n };\n\n /**\n * @ngdoc function\n * @name registerMethodsFromObject\n * @methodOf gantt.class:GanttApi\n * @description Registers features and methods from a simple objectMap.\n * eventObjectMap must be in this format (multiple features allowed)\n * <br>\n * {featureName:\n * {\n * methodNameOne:function(args){},\n * methodNameTwo:function(args){}\n * }\n * @param {object} eventObjectMap map of feature/event names\n * @param {object} _this binds this to _this for all functions. Defaults to ganttApi.gantt\n */\n GanttApi.prototype.registerMethodsFromObject = function(methodMap, _this) {\n var self = this;\n var features = [];\n angular.forEach(methodMap, function(featProp, featPropName) {\n var feature = {name: featPropName, methods: []};\n angular.forEach(featProp, function(prop, propName) {\n feature.methods.push({name: propName, fn: prop});\n });\n features.push(feature);\n });\n\n features.forEach(function(feature) {\n feature.methods.forEach(function(method) {\n self.registerMethod(feature.name, method.name, method.fn, _this);\n });\n });\n\n };\n\n return GanttApi;\n\n }]);\n\n})();\n","(function() {\n 'use strict';\n angular.module('gantt').factory('GanttOptions', [function() {\n var GanttOptions = function(values, defaultValues) {\n this.defaultValues = defaultValues;\n this.values = values;\n\n this.defaultValue = function(optionName) {\n var defaultValue = this.defaultValues[optionName];\n if (angular.isFunction(defaultValue)) {\n defaultValue = defaultValue();\n }\n\n return defaultValue;\n };\n\n this.sanitize = function(optionName, optionValue) {\n if (!optionValue) {\n var defaultValue = this.defaultValue(optionName);\n if (defaultValue !== undefined) {\n if (optionValue !== undefined && typeof defaultValue === 'boolean') {\n return optionValue;\n }\n\n return defaultValue;\n }\n }\n\n return optionValue;\n };\n\n this.value = function(optionName) {\n return this.sanitize(optionName, this.values[optionName]);\n };\n\n this.set = function(optionName, optionValue) {\n this.values[optionName] = optionValue;\n };\n\n this.initialize = function() {\n for (var optionName in this.values) {\n var optionValue = this.values[optionName];\n if (this.values.hasOwnProperty(optionName)) {\n this.values[optionName] = this.value(optionName, optionValue);\n }\n }\n return this.values;\n };\n };\n\n return GanttOptions;\n }]);\n}());\n","(function(){\n 'use strict';\n /**\n * Calendar factory is used to define working periods, non working periods, and other specific period of time,\n * and retrieve effective timeFrames for each day of the gantt.\n */\n angular.module('gantt').factory('GanttCalendar', ['$filter', 'moment', function($filter, moment) {\n /**\n * TimeFrame represents time frame in any day. parameters are given using options object.\n *\n * @param {moment|string} start start of timeFrame. If a string is given, it will be parsed as a moment.\n * @param {moment|string} end end of timeFrame. If a string is given, it will be parsed as a moment.\n * @param {boolean} working is this timeFrame flagged as working.\n * @param {boolean} magnet is this timeFrame will magnet.\n * @param {boolean} default is this timeFrame will be used as default.\n * @param {color} css color attached to this timeFrame.\n * @param {string} classes css classes attached to this timeFrame.\n *\n * @constructor\n */\n var TimeFrame = function(options) {\n if (options === undefined) {\n options = {};\n }\n\n this.start = options.start;\n this.end = options.end;\n this.working = options.working;\n this.magnet = options.magnet !== undefined ? options.magnet : true;\n this.default = options.default;\n this.color = options.color;\n this.classes = options.classes;\n this.internal = options.internal;\n };\n\n TimeFrame.prototype.updateView = function() {\n if (this.$element) {\n var cssStyles = {};\n\n if (this.left !== undefined) {\n cssStyles.left = this.left + 'px';\n } else {\n cssStyles.left = '';\n }\n if (this.width !== undefined) {\n cssStyles.width = this.width + 'px';\n } else {\n cssStyles.width = '';\n }\n\n if (this.color !== undefined) {\n cssStyles['background-color'] = this.color;\n } else {\n cssStyles['background-color'] = '';\n }\n\n this.$element.css(cssStyles);\n\n var classes = ['gantt-timeframe' + (this.working ? '' : '-non') + '-working'];\n if (this.classes) {\n classes = classes.concat(this.classes);\n }\n for (var i = 0, l = classes.length; i < l; i++) {\n this.$element.toggleClass(classes[i], true);\n }\n }\n };\n\n TimeFrame.prototype.getDuration = function() {\n if (this.end !== undefined && this.start !== undefined) {\n return this.end.diff(this.start, 'milliseconds');\n }\n };\n\n TimeFrame.prototype.clone = function() {\n return new TimeFrame(this);\n };\n\n /**\n * TimeFrameMapping defines how timeFrames will be placed for each days. parameters are given using options object.\n *\n * @param {function} func a function with date parameter, that will be evaluated for each distinct day of the gantt.\n * this function must return an array of timeFrame names to apply.\n * @constructor\n */\n var TimeFrameMapping = function(func) {\n this.func = func;\n };\n\n TimeFrameMapping.prototype.getTimeFrames = function(date) {\n var ret = this.func(date);\n if (!(ret instanceof Array)) {\n ret = [ret];\n }\n return ret;\n };\n\n TimeFrameMapping.prototype.clone = function() {\n return new TimeFrameMapping(this.func);\n };\n\n /**\n * A DateFrame is date range that will use a specific TimeFrameMapping, configured using a function (evaluator),\n * a date (date) or a date range (start, end). parameters are given using options object.\n *\n * @param {function} evaluator a function with date parameter, that will be evaluated for each distinct day of the gantt.\n * this function must return a boolean representing matching of this dateFrame or not.\n * @param {moment} date date of dateFrame.\n * @param {moment} start start of date frame.\n * @param {moment} end end of date frame.\n * @param {array} targets array of TimeFrameMappings/TimeFrames names to use for this date frame.\n * @param {boolean} default is this dateFrame will be used as default.\n * @constructor\n */\n var DateFrame = function(options) {\n this.evaluator = options.evaluator;\n if (options.date) {\n this.start = moment(options.date).startOf('day');\n this.end = moment(options.date).endOf('day');\n } else {\n this.start = options.start;\n this.end = options.end;\n }\n if (options.targets instanceof Array) {\n this.targets = options.targets;\n } else {\n this.targets = [options.targets];\n }\n this.default = options.default;\n };\n\n DateFrame.prototype.dateMatch = function(date) {\n if (this.evaluator) {\n return this.evaluator(date);\n } else if (this.start && this.end) {\n return date >= this.start && date <= this.end;\n } else {\n return false;\n }\n };\n\n DateFrame.prototype.clone = function() {\n return new DateFrame(this);\n };\n\n\n\n /**\n * Register TimeFrame, TimeFrameMapping and DateMapping objects into Calendar object,\n * and use Calendar#getTimeFrames(date) function to retrieve effective timeFrames for a specific day.\n *\n * @constructor\n */\n var Calendar = function() {\n this.timeFrames = {};\n this.timeFrameMappings = {};\n this.dateFrames = {};\n };\n\n /**\n * Remove all objects.\n */\n Calendar.prototype.clear = function() {\n this.timeFrames = {};\n this.timeFrameMappings = {};\n this.dateFrames = {};\n };\n\n /**\n * Register TimeFrame objects.\n *\n * @param {object} timeFrames with names of timeFrames for keys and TimeFrame objects for values.\n */\n Calendar.prototype.registerTimeFrames = function(timeFrames) {\n angular.forEach(timeFrames, function(timeFrame, name) {\n this.timeFrames[name] = new TimeFrame(timeFrame);\n }, this);\n };\n\n /**\n * Removes TimeFrame objects.\n *\n * @param {array} timeFrames names of timeFrames to remove.\n */\n Calendar.prototype.removeTimeFrames = function(timeFrames) {\n angular.forEach(timeFrames, function(name) {\n delete this.timeFrames[name];\n }, this);\n };\n\n /**\n * Remove all TimeFrame objects.\n */\n Calendar.prototype.clearTimeFrames = function() {\n this.timeFrames = {};\n };\n\n /**\n * Register TimeFrameMapping objects.\n *\n * @param {object} mappings object with names of timeFrames mappings for keys and TimeFrameMapping objects for values.\n */\n Calendar.prototype.registerTimeFrameMappings = function(mappings) {\n angular.forEach(mappings, function(timeFrameMapping, name) {\n this.timeFrameMappings[name] = new TimeFrameMapping(timeFrameMapping);\n }, this);\n };\n\n /**\n * Removes TimeFrameMapping objects.\n *\n * @param {array} mappings names of timeFrame mappings to remove.\n */\n Calendar.prototype.removeTimeFrameMappings = function(mappings) {\n angular.forEach(mappings, function(name) {\n delete this.timeFrameMappings[name];\n }, this);\n };\n\n /**\n * Removes all TimeFrameMapping objects.\n */\n Calendar.prototype.clearTimeFrameMappings = function() {\n this.timeFrameMappings = {};\n };\n\n /**\n * Register DateFrame objects.\n *\n * @param {object} dateFrames object with names of dateFrames for keys and DateFrame objects for values.\n */\n Calendar.prototype.registerDateFrames = function(dateFrames) {\n angular.forEach(dateFrames, function(dateFrame, name) {\n this.dateFrames[name] = new DateFrame(dateFrame);\n }, this);\n };\n\n /**\n * Remove DateFrame objects.\n *\n * @param {array} mappings names of date frames to remove.\n */\n Calendar.prototype.removeDateFrames = function(dateFrames) {\n angular.forEach(dateFrames, function(name) {\n delete this.dateFrames[name];\n }, this);\n };\n\n /**\n * Removes all DateFrame objects.\n */\n Calendar.prototype.clearDateFrames = function() {\n this.dateFrames = {};\n };\n\n var filterDateFrames = function(inputDateFrames, date) {\n var dateFrames = [];\n angular.forEach(inputDateFrames, function(dateFrame) {\n if (dateFrame.dateMatch(date)) {\n dateFrames.push(dateFrame);\n }\n });\n if (dateFrames.length === 0) {\n angular.forEach(inputDateFrames, function(dateFrame) {\n if (dateFrame.default) {\n dateFrames.push(dateFrame);\n }\n });\n }\n return dateFrames;\n };\n\n /**\n * Retrieves TimeFrame objects for a given date, using whole configuration for this Calendar object.\n *\n * @param {moment} date\n *\n * @return {array} an array of TimeFrame objects.\n */\n Calendar.prototype.getTimeFrames = function(date) {\n var timeFrames = [];\n var dateFrames = filterDateFrames(this.dateFrames, date);\n\n for (var i=0; i < dateFrames.length; i++) {\n if (dateFrames[i] !== undefined) {\n var targets = dateFrames[i].targets;\n\n for (var j=0; j < targets.length; j++) {\n var timeFrameMapping = this.timeFrameMappings[targets[j]];\n if (timeFrameMapping !== undefined) {\n // If a timeFrame mapping is found\n timeFrames.push(timeFrameMapping.getTimeFrames());\n } else {\n // If no timeFrame mapping is found, try using direct timeFrame\n var timeFrame = this.timeFrames[targets[j]];\n if (timeFrame !== undefined) {\n timeFrames.push(timeFrame);\n }\n }\n }\n }\n }\n\n var dateYear = date.year();\n var dateMonth = date.month();\n var dateDate = date.date();\n\n var validatedTimeFrames = [];\n if (timeFrames.length === 0) {\n angular.forEach(this.timeFrames, function(timeFrame) {\n if (timeFrame.default) {\n timeFrames.push(timeFrame);\n }\n });\n }\n\n for (i=0; i < timeFrames.length; i++) {\n var cTimeFrame = timeFrames[i].clone();\n\n if (cTimeFrame.start !== undefined) {\n cTimeFrame.start.year(dateYear);\n cTimeFrame.start.month(dateMonth);\n cTimeFrame.start.date(dateDate);\n }\n\n if (cTimeFrame.end !== undefined) {\n cTimeFrame.end.year(dateYear);\n cTimeFrame.end.month(dateMonth);\n cTimeFrame.end.date(dateDate);\n\n if (moment(cTimeFrame.end).startOf('day') === cTimeFrame.end) {\n cTimeFrame.end.add(1, 'day');\n }\n }\n\n validatedTimeFrames.push(cTimeFrame);\n }\n\n return validatedTimeFrames;\n };\n\n /**\n * Solve timeFrames.\n *\n * Smaller timeFrames have priority over larger one.\n *\n * @param {array} timeFrames Array of timeFrames to solve\n * @param {moment} startDate\n * @param {moment} endDate\n */\n Calendar.prototype.solve = function(timeFrames, startDate, endDate) {\n var color;\n var classes;\n var minDate;\n var maxDate;\n\n for (var i=0; i<timeFrames.length; i++) {\n var timeFrame = timeFrames[i];\n if (minDate === undefined || minDate > timeFrame.start) {\n minDate = timeFrame.start;\n }\n if (maxDate === undefined || maxDate < timeFrame.end) {\n maxDate = timeFrame.end;\n }\n if (color === undefined && timeFrame.color) {\n color = timeFrame.color;\n }\n if (timeFrame.classes !== undefined) {\n if (classes === undefined) {\n classes = [];\n }\n classes = classes.concat(timeFrame.classes);\n }\n }\n\n if (startDate === undefined) {\n startDate = minDate;\n }\n\n if (endDate === undefined) {\n endDate = maxDate;\n }\n\n var solvedTimeFrames = [new TimeFrame({start: startDate, end: endDate, internal: true})];\n\n timeFrames = $filter('filter')(timeFrames, function(timeFrame) {\n return (timeFrame.start === undefined || timeFrame.start < endDate) && (timeFrame.end === undefined || timeFrame.end > startDate);\n });\n\n for (i=0; i<timeFrames.length; i++) {\n var cTimeFrame = timeFrames[i];\n if (!cTimeFrame.start) {\n cTimeFrame.start = startDate;\n }\n if (!cTimeFrame.end) {\n cTimeFrame.end = endDate;\n }\n }\n\n var orderedTimeFrames = $filter('orderBy')(timeFrames, function(timeFrame) {\n return -timeFrame.getDuration();\n });\n\n var k;\n for (i=0; i<orderedTimeFrames.length; i++) {\n var oTimeFrame = orderedTimeFrames[i];\n\n var tmpSolvedTimeFrames = solvedTimeFrames.slice();\n\n k=0;\n var dispatched = false;\n var treated = false;\n\n for (var j=0; j<solvedTimeFrames.length; j++) {\n var sTimeFrame = solvedTimeFrames[j];\n\n if (!treated) {\n if (!oTimeFrame.end && !oTimeFrame.start) {\n // timeFrame is infinite.\n tmpSolvedTimeFrames.splice(k, 0, oTimeFrame);\n treated = true;\n dispatched = false;\n } else if (oTimeFrame.end > sTimeFrame.start && oTimeFrame.start < sTimeFrame.end) {\n // timeFrame is included in this solvedTimeFrame.\n // solvedTimeFrame:|ssssssssssssssssssssssssssssssssss|\n // timeFrame: |tttttt|\n // result:|sssssssss|tttttt|sssssssssssssssss|\n\n var newSolvedTimeFrame = sTimeFrame.clone();\n\n sTimeFrame.end = moment(oTimeFrame.start);\n newSolvedTimeFrame.start = moment(oTimeFrame.end);\n\n tmpSolvedTimeFrames.splice(k + 1, 0, oTimeFrame.clone(), newSolvedTimeFrame);\n treated = true;\n dispatched = false;\n } else if (!dispatched && oTimeFrame.start < sTimeFrame.end) {\n // timeFrame is dispatched on two solvedTimeFrame.\n // First part\n // solvedTimeFrame:|sssssssssssssssssssssssssssssssssss|s+1;s+1;s+1;s+1;s+1;s+1|\n // timeFrame: |tttttt|\n // result:|sssssssssssssssssssssssssssssss|tttttt|;s+1;s+1;s+1;s+1;s+1|\n\n sTimeFrame.end = moment(oTimeFrame.start);\n tmpSolvedTimeFrames.splice(k + 1, 0, oTimeFrame.clone());\n\n dispatched = true;\n } else if (dispatched && oTimeFrame.end > sTimeFrame.start) {\n // timeFrame is dispatched on two solvedTimeFrame.\n // Second part\n\n sTimeFrame.start = moment(oTimeFrame.end);\n dispatched = false;\n treated = true;\n }\n k++;\n }\n }\n\n solvedTimeFrames = tmpSolvedTimeFrames;\n }\n\n solvedTimeFrames = $filter('filter')(solvedTimeFrames, function(timeFrame) {\n return !timeFrame.internal &&\n (timeFrame.start === undefined || timeFrame.start < endDate) &&\n (timeFrame.end === undefined || timeFrame.end > startDate);\n });\n\n return solvedTimeFrames;\n\n };\n\n return Calendar;\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttCurrentDateManager', ['moment', function(moment) {\n var GanttCurrentDateManager = function(gantt) {\n var self = this;\n\n this.gantt = gantt;\n\n this.date = undefined;\n this.position = undefined;\n this.currentDateColumn = undefined;\n\n this.gantt.$scope.simplifyMoment = function(d) {\n return moment.isMoment(d) ? d.unix() : d;\n };\n\n this.gantt.$scope.$watchGroup(['currentDate', 'simplifyMoment(currentDateValue)'], function(newValues, oldValues) {\n if (newValues !== oldValues) {\n self.setCurrentDate(self.gantt.options.value('currentDateValue'));\n }\n });\n };\n\n GanttCurrentDateManager.prototype.setCurrentDate = function(currentDate) {\n this.date = currentDate;\n var oldColumn = this.currentDateColumn;\n var newColumn;\n\n if (this.date !== undefined && this.gantt.options.value('currentDate') === 'column') {\n newColumn = this.gantt.columnsManager.getColumnByDate(this.date, true);\n }\n this.currentDateColumn = newColumn;\n\n if (oldColumn !== newColumn) {\n if (oldColumn !== undefined) {\n oldColumn.currentDate = false;\n oldColumn.updateView();\n }\n if (newColumn !== undefined) {\n newColumn.currentDate = true;\n newColumn.updateView();\n }\n }\n\n this.position = this.gantt.getPositionByDate(this.date, true);\n };\n return GanttCurrentDateManager;\n }]);\n}());\n","(function() {\n 'use strict';\n angular.module('gantt').factory('GanttColumn', ['moment', function(moment) {\n // Used to display the Gantt grid and header.\n // The columns are generated by the column generator.\n var Column = function(date, endDate, left, width, calendar, timeFramesWorkingMode, timeFramesNonWorkingMode) {\n this.date = date;\n this.endDate = endDate;\n this.left = left;\n this.width = width;\n this.calendar = calendar;\n this.duration = this.endDate.diff(this.date, 'milliseconds');\n this.timeFramesWorkingMode = timeFramesWorkingMode;\n this.timeFramesNonWorkingMode = timeFramesNonWorkingMode;\n this.timeFrames = [];\n this.currentDate = false;\n this.visibleTimeFrames = [];\n this.daysTimeFrames = {};\n this.cropped = false;\n this.originalSize = {left: this.left, width: this.width};\n this.updateTimeFrames();\n };\n\n var getDateKey = function(date) {\n return date.year() + '-' + date.month() + '-' + date.date();\n };\n\n Column.prototype.updateView = function() {\n if (this.$element) {\n if (this.currentDate) {\n this.$element.addClass('gantt-foreground-col-current-date');\n } else {\n this.$element.removeClass('gantt-foreground-col-current-date');\n }\n\n this.$element.css({'left': this.left + 'px', 'width': this.width + 'px'});\n\n for (var i = 0, l = this.timeFrames.length; i < l; i++) {\n this.timeFrames[i].updateView();\n }\n }\n };\n\n Column.prototype.updateTimeFrames = function() {\n var self = this;\n\n if (self.calendar !== undefined && (self.timeFramesNonWorkingMode !== 'hidden' || self.timeFramesWorkingMode !== 'hidden')) {\n var cDate = self.date;\n var cDateStartOfDay = moment(cDate).startOf('day');\n var cDateNextDay = cDateStartOfDay.add(1, 'day');\n var i;\n while (cDate < self.endDate) {\n var timeFrames = self.calendar.getTimeFrames(cDate);\n var nextCDate = moment.min(cDateNextDay, self.endDate);\n timeFrames = self.calendar.solve(timeFrames, cDate, nextCDate);\n var cTimeFrames = [];\n for (i=0; i < timeFrames.length; i++) {\n var cTimeFrame = timeFrames[i];\n\n var start = cTimeFrame.start;\n if (start === undefined) {\n start = cDate;\n }\n\n var end = cTimeFrame.end;\n if (end === undefined) {\n end = nextCDate;\n }\n\n if (start < self.date) {\n start = self.date;\n }\n\n if (end > self.endDate) {\n end = self.endDate;\n }\n\n cTimeFrame = cTimeFrame.clone();\n\n cTimeFrame.start = moment(start);\n cTimeFrame.end = moment(end);\n\n cTimeFrames.push(cTimeFrame);\n }\n self.timeFrames = self.timeFrames.concat(cTimeFrames);\n\n var cDateKey = getDateKey(cDate);\n self.daysTimeFrames[cDateKey] = cTimeFrames;\n\n cDate = nextCDate;\n cDateStartOfDay = moment(cDate).startOf('day');\n cDateNextDay = cDateStartOfDay.add(1, 'day');\n }\n\n for (i=0; i < self.timeFrames.length; i++) {\n var timeFrame = self.timeFrames[i];\n\n var positionDuration = timeFrame.start.diff(self.date, 'milliseconds');\n var position = positionDuration / self.duration * self.width;\n\n var timeFrameDuration = timeFrame.end.diff(timeFrame.start, 'milliseconds');\n var timeFramePosition = timeFrameDuration / self.duration * self.width;\n\n var hidden = false;\n if (timeFrame.working && self.timeFramesWorkingMode !== 'visible') {\n hidden = true;\n } else if (!timeFrame.working && self.timeFramesNonWorkingMode !== 'visible') {\n hidden = true;\n }\n\n if (!hidden) {\n self.visibleTimeFrames.push(timeFrame);\n }\n\n timeFrame.hidden = hidden;\n timeFrame.left = position;\n timeFrame.width = timeFramePosition;\n timeFrame.originalSize = {left: timeFrame.left, width: timeFrame.width};\n }\n\n if (self.timeFramesNonWorkingMode === 'cropped' || self.timeFramesWorkingMode === 'cropped') {\n var timeFramesWidth = 0;\n for (var j=0; j < self.timeFrames.length; j++) {\n var aTimeFrame = self.timeFrames[j];\n if (!aTimeFrame.working && self.timeFramesNonWorkingMode !== 'cropped' ||\n aTimeFrame.working && self.timeFramesWorkingMode !== 'cropped') {\n timeFramesWidth += aTimeFrame.width;\n }\n }\n\n if (timeFramesWidth !== self.width) {\n var croppedRatio = self.width / timeFramesWidth;\n var croppedWidth = 0;\n var originalCroppedWidth = 0;\n\n var allCropped = true;\n\n for (j=0; j < self.timeFrames.length; j++) {\n var bTimeFrame = self.timeFrames[j];\n\n if (!bTimeFrame.working && self.timeFramesNonWorkingMode !== 'cropped' ||\n bTimeFrame.working && self.timeFramesWorkingMode !== 'cropped') {\n bTimeFrame.left = (bTimeFrame.left - croppedWidth) * croppedRatio;\n bTimeFrame.width = bTimeFrame.width * croppedRatio;\n bTimeFrame.originalSize.left = (bTimeFrame.originalSize.left - originalCroppedWidth) * croppedRatio;\n bTimeFrame.originalSize.width = bTimeFrame.originalSize.width * croppedRatio;\n bTimeFrame.cropped = false;\n allCropped = false;\n } else {\n croppedWidth += bTimeFrame.width;\n originalCroppedWidth += bTimeFrame.originalSize.width;\n bTimeFrame.left = undefined;\n bTimeFrame.width = 0;\n bTimeFrame.originalSize = {left: undefined, width: 0};\n bTimeFrame.cropped = true;\n }\n }\n\n self.cropped = allCropped;\n } else {\n self.cropped = false;\n }\n }\n }\n };\n\n Column.prototype.clone = function() {\n return new Column(moment(this.date), moment(this.endDate), this.left, this.width, this.calendar);\n };\n\n Column.prototype.containsDate = function(date) {\n return date > this.date && date <= this.endDate;\n };\n\n Column.prototype.equals = function(other) {\n return this.date === other.date;\n };\n\n Column.prototype.roundTo = function(date, unit, offset, midpoint) {\n // Waiting merge of https://github.com/moment/moment/pull/1794\n if (unit === 'day') {\n // Inconsistency in units in momentJS.\n unit = 'date';\n }\n\n offset = offset || 1;\n var value = date.get(unit);\n\n switch (midpoint) {\n case 'up':\n value = Math.ceil(value / offset);\n break;\n case 'down':\n value = Math.floor(value / offset);\n break;\n default:\n value = Math.round(value / offset);\n break;\n }\n\n var units = ['millisecond', 'second', 'minute', 'hour', 'date', 'month', 'year'];\n date.set(unit, value * offset);\n\n var indexOf = units.indexOf(unit);\n for (var i = 0; i < indexOf; i++) {\n date.set(units[i], 0);\n }\n\n return date;\n };\n\n Column.prototype.getMagnetDate = function(date, magnetValue, magnetUnit, timeFramesMagnet) {\n if (magnetValue > 0 && magnetUnit !== undefined) {\n var initialDate = date;\n date = moment(date);\n\n if (magnetUnit === 'column') {\n // Snap to column borders only.\n var position = this.getPositionByDate(date);\n\n if (position < this.width / 2) {\n date = moment(this.date);\n } else {\n date = moment(this.endDate);\n }\n } else {\n // Round the value\n date = this.roundTo(date, magnetUnit, magnetValue);\n\n // Snap to column borders if date overflows.\n if (date < this.date) {\n date = moment(this.date);\n } else if (date > this.endDate) {\n date = moment(this.endDate);\n }\n }\n\n if (timeFramesMagnet) {\n var maxTimeFrameDiff = Math.abs(initialDate.diff(date, 'milliseconds'));\n var currentTimeFrameDiff;\n\n for (var i=0; i<this.timeFrames.length; i++) {\n var timeFrame = this.timeFrames[i];\n if (timeFrame.magnet) {\n var previousTimeFrame = this.timeFrames[i-1];\n var nextTimeFrame = this.timeFrames[i+1];\n var timeFrameDiff;\n\n if (previousTimeFrame === undefined || previousTimeFrame.working !== timeFrame.working) {\n timeFrameDiff = Math.abs(initialDate.diff(timeFrame.start, 'milliseconds'));\n if (timeFrameDiff < maxTimeFrameDiff && (currentTimeFrameDiff === undefined || timeFrameDiff < currentTimeFrameDiff)) {\n currentTimeFrameDiff = timeFrameDiff;\n date = timeFrame.start;\n }\n }\n\n if (nextTimeFrame === undefined || nextTimeFrame.working !== timeFrame.working) {\n timeFrameDiff = Math.abs(initialDate.diff(timeFrame.end, 'milliseconds'));\n if (timeFrameDiff < maxTimeFrameDiff && (currentTimeFrameDiff === undefined || timeFrameDiff < currentTimeFrameDiff)) {\n currentTimeFrameDiff = timeFrameDiff;\n date = timeFrame.end;\n }\n }\n }\n }\n }\n }\n return date;\n };\n\n Column.prototype.getDateByPositionUsingTimeFrames = function(position) {\n for (var i = 0, l = this.timeFrames.length; i < l; i++) {\n // TODO: performance optimization could be done.\n var timeFrame = this.timeFrames[i];\n if (!timeFrame.cropped && position >= timeFrame.left && position <= timeFrame.left + timeFrame.width) {\n var positionDuration = timeFrame.getDuration() / timeFrame.width * (position - timeFrame.left);\n var date = moment(timeFrame.start).add(positionDuration, 'milliseconds');\n return date;\n }\n }\n };\n\n Column.prototype.getDateByPosition = function(position, magnetValue, magnetUnit, timeFramesMagnet) {\n var positionDuration;\n var date;\n\n if (position < 0) {\n position = 0;\n }\n if (position > this.width) {\n position = this.width;\n }\n\n if (this.timeFramesNonWorkingMode === 'cropped' || this.timeFramesWorkingMode === 'cropped') {\n date = this.getDateByPositionUsingTimeFrames(position);\n }\n\n if (date === undefined) {\n positionDuration = this.duration / this.width * position;\n date = moment(this.date).add(positionDuration, 'milliseconds');\n }\n\n date = this.getMagnetDate(date, magnetValue, magnetUnit, timeFramesMagnet);\n\n return date;\n };\n\n Column.prototype.getDayTimeFrame = function(date) {\n var dtf = this.daysTimeFrames[getDateKey(date)];\n if (dtf === undefined) {\n return [];\n }\n return dtf;\n };\n\n Column.prototype.getPositionByDate = function(date) {\n var positionDuration;\n var position;\n\n if (this.timeFramesNonWorkingMode === 'cropped' || this.timeFramesWorkingMode === 'cropped') {\n var croppedDate = date;\n var timeFrames = this.getDayTimeFrame(croppedDate);\n for (var i = 0; i < timeFrames.length; i++) {\n var timeFrame = timeFrames[i];\n if (croppedDate >= timeFrame.start && croppedDate <= timeFrame.end) {\n if (timeFrame.cropped) {\n if (timeFrames.length > i + 1) {\n croppedDate = timeFrames[i + 1].start;\n } else {\n croppedDate = timeFrame.end;\n }\n } else {\n positionDuration = croppedDate.diff(timeFrame.start, 'milliseconds');\n position = positionDuration / timeFrame.getDuration() * timeFrame.width;\n return this.left + timeFrame.left + position;\n }\n }\n }\n }\n\n positionDuration = date.diff(this.date, 'milliseconds');\n position = positionDuration / this.duration * this.width;\n\n if (position < 0) {\n position = 0;\n }\n\n if (position > this.width) {\n position = this.width;\n }\n\n return this.left + position;\n };\n\n return Column;\n }]);\n}());\n\n","(function() {\n 'use strict';\n angular.module('gantt').factory('GanttColumnBuilder', ['GanttColumn', function(Column) {\n // Builder for columns, based of data given by column generator and columnsManager.\n var ColumnBuilder = function(columnsManager) {\n this.columnsManager = columnsManager;\n };\n\n ColumnBuilder.prototype.newColumn = function(date, endDate, left, width) {\n var calendar = this.columnsManager.gantt.calendar;\n var timeFramesWorkingMode = this.columnsManager.gantt.options.value('timeFramesWorkingMode');\n var timeFramesNonWorkingMode = this.columnsManager.gantt.options.value('timeFramesNonWorkingMode');\n\n return new Column(date, endDate, left, width, calendar, timeFramesWorkingMode, timeFramesNonWorkingMode);\n };\n\n return ColumnBuilder;\n }]);\n}());\n\n","(function() {\n 'use strict';\n angular.module('gantt').service('GanttColumnGenerator', ['moment', function(moment) {\n\n // Columns are generated including or excluding the to date.\n // If the To date is the first day of month and the time is 00:00 then no new column is generated for this month.\n\n var isToDateToExclude = function(to, value, unit) {\n return moment(to).add(value, unit).startOf(unit) === to;\n };\n\n\n var getFirstValue = function(unit) {\n if (['hour', 'minute', 'second', 'millisecond'].indexOf(unit) >= 0) {\n return 0;\n }\n };\n\n var ensureNoUnitOverflow = function(unit, startDate, endDate) {\n var v1 = startDate.get(unit);\n var v2 = endDate.get(unit);\n var firstValue = getFirstValue(unit);\n if (firstValue !== undefined && v2 !== firstValue && v2 < v1) {\n endDate.set(unit, firstValue);\n }\n };\n\n // Generates one column for each time unit between the given from and to date.\n this.generate = function(builder, from, to, viewScale, columnWidth, maximumWidth, leftOffset, reverse) {\n if (!to && !maximumWidth) {\n throw 'to or maximumWidth must be defined';\n }\n\n viewScale = viewScale.trim();\n if (viewScale.charAt(viewScale.length - 1) === 's') {\n viewScale = viewScale.substring(0, viewScale.length - 1);\n }\n var viewScaleValue;\n var viewScaleUnit;\n var splittedViewScale;\n\n if (viewScale) {\n splittedViewScale = viewScale.split(' ');\n }\n if (splittedViewScale && splittedViewScale.length > 1) {\n viewScaleValue = parseFloat(splittedViewScale[0]);\n viewScaleUnit = splittedViewScale[splittedViewScale.length - 1];\n } else {\n viewScaleValue = 1;\n viewScaleUnit = viewScale;\n }\n\n var excludeTo = false;\n from = moment(from).startOf(viewScaleUnit);\n if (to) {\n excludeTo = isToDateToExclude(to);\n to = moment(to).startOf(viewScaleUnit);\n }\n\n var left = 0;\n var date = moment(from).startOf(viewScaleUnit);\n if (reverse) {\n date.add(-viewScaleValue, viewScaleUnit);\n left -= columnWidth;\n }\n var generatedCols = [];\n\n while (true) {\n if (maximumWidth && Math.abs(left) > maximumWidth + columnWidth) {\n break;\n }\n\n var startDate = moment(date);\n var endDate = moment(startDate).add(viewScaleValue, viewScaleUnit);\n ensureNoUnitOverflow(viewScaleUnit, startDate, endDate);\n\n var column = builder.newColumn(startDate, endDate, leftOffset ? left + leftOffset : left, columnWidth);\n\n if (!column.cropped) {\n generatedCols.push(column);\n if (reverse) {\n left -= columnWidth;\n } else {\n left += columnWidth;\n }\n\n if (to) {\n if (reverse) {\n if (excludeTo && date < to || !excludeTo && date <= to) {\n break;\n }\n } else {\n if (excludeTo && date > to || !excludeTo && date >= to) {\n break;\n }\n }\n }\n }\n if (reverse) {\n date.add(-viewScaleValue, viewScaleUnit);\n ensureNoUnitOverflow(viewScaleUnit, date, startDate);\n } else {\n date.add(viewScaleValue, viewScaleUnit);\n ensureNoUnitOverflow(viewScaleUnit, startDate, date);\n }\n }\n\n if (reverse) {\n if (isToDateToExclude(from, viewScaleValue, viewScaleUnit)) {\n generatedCols.shift();\n }\n generatedCols.reverse();\n }\n\n return generatedCols;\n };\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttColumnHeader', [ 'moment', 'GanttColumn', function(moment, Column) {\n // Used to display the Gantt grid and header.\n // The columns are generated by the column generator.\n\n var ColumnHeader = function(startDate, endDate, viewScaleUnit, left, width, labelFormat) {\n startDate = moment(startDate);\n endDate = moment(endDate);\n\n var column = new Column(startDate, endDate, left, width);\n column.unit = viewScaleUnit;\n column.label = angular.isFunction(labelFormat) ? labelFormat(column): startDate.format(labelFormat);\n\n return column;\n };\n return ColumnHeader;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttColumnsManager', ['GanttColumnGenerator', 'GanttColumnBuilder', 'GanttHeadersGenerator', '$filter', '$timeout', 'ganttLayout', 'ganttBinarySearch', 'moment', function(ColumnGenerator, ColumnBuilder, HeadersGenerator, $filter, $timeout, layout, bs, moment) {\n var ColumnsManager = function(gantt) {\n var self = this;\n\n this.gantt = gantt;\n\n this.from = undefined;\n this.to = undefined;\n\n this.columns = [];\n this.visibleColumns = [];\n this.previousColumns = [];\n this.nextColumns = [];\n\n this.headers = [];\n this.visibleHeaders = [];\n\n this.scrollAnchor = undefined;\n\n this.columnBuilder = new ColumnBuilder(this);\n\n // Add a watcher if a view related setting changed from outside of the Gantt. Update the gantt accordingly if so.\n // All those changes need a recalculation of the header columns\n this.gantt.$scope.$watchGroup(['viewScale', 'columnWidth', 'timeFramesWorkingMode', 'timeFramesNonWorkingMode', 'fromDate', 'toDate', 'autoExpand', 'taskOutOfRange'], function(newValues, oldValues) {\n if (newValues !== oldValues && self.gantt.rendered) {\n self.generateColumns();\n }\n });\n\n this.gantt.$scope.$watchCollection('headers', function(newValues, oldValues) {\n if (newValues !== oldValues && self.gantt.rendered) {\n self.generateColumns();\n }\n });\n\n this.gantt.$scope.$watchCollection('headersFormats', function(newValues, oldValues) {\n if (newValues !== oldValues && self.gantt.rendered) {\n self.generateColumns();\n }\n });\n\n this.gantt.$scope.$watchGroup(['ganttElementWidth', 'showSide', 'sideWidth', 'maxHeight', 'daily'], function(newValues, oldValues) {\n if (newValues !== oldValues && self.gantt.rendered) {\n self.updateColumnsMeta();\n }\n });\n\n this.gantt.api.data.on.load(this.gantt.$scope, function() {\n if ((self.from === undefined || self.to === undefined ||\n self.from > self.gantt.rowsManager.getDefaultFrom() ||\n self.to < self.gantt.rowsManager.getDefaultTo()) && self.gantt.rendered) {\n self.generateColumns();\n }\n\n self.gantt.rowsManager.sortRows();\n });\n\n this.gantt.api.data.on.remove(this.gantt.$scope, function() {\n self.gantt.rowsManager.sortRows();\n });\n\n this.gantt.api.registerMethod('columns', 'clear', this.clearColumns, this);\n this.gantt.api.registerMethod('columns', 'generate', this.generateColumns, this);\n this.gantt.api.registerMethod('columns', 'refresh', this.updateColumnsMeta, this);\n this.gantt.api.registerMethod('columns', 'getColumnsWidth', this.getColumnsWidth, this);\n this.gantt.api.registerMethod('columns', 'getColumnsWidthToFit', this.getColumnsWidthToFit, this);\n this.gantt.api.registerMethod('columns', 'getDateRange', this.getDateRange, this);\n\n this.gantt.api.registerEvent('columns', 'clear');\n this.gantt.api.registerEvent('columns', 'generate');\n this.gantt.api.registerEvent('columns', 'refresh');\n };\n\n ColumnsManager.prototype.setScrollAnchor = function() {\n if (this.gantt.scroll.$element && this.columns.length > 0) {\n var el = this.gantt.scroll.$element[0];\n var center = el.scrollLeft + el.offsetWidth / 2;\n\n this.scrollAnchor = this.gantt.getDateByPosition(center);\n }\n };\n\n ColumnsManager.prototype.scrollToScrollAnchor = function() {\n var self = this;\n\n if (this.columns.length > 0 && this.scrollAnchor !== undefined) {\n // Ugly but prevents screen flickering (unlike $timeout)\n this.gantt.$scope.$$postDigest(function() {\n self.gantt.api.scroll.toDate(self.scrollAnchor);\n });\n }\n };\n\n ColumnsManager.prototype.clearColumns = function() {\n this.setScrollAnchor();\n\n this.from = undefined;\n this.to = undefined;\n\n this.columns = [];\n this.visibleColumns = [];\n this.previousColumns = [];\n this.nextColumns = [];\n\n this.headers = [];\n this.visibleHeaders = [];\n\n this.gantt.api.columns.raise.clear();\n };\n\n ColumnsManager.prototype.generateColumns = function(from, to) {\n if (!from) {\n from = this.gantt.options.value('fromDate');\n }\n\n if (!to) {\n to = this.gantt.options.value('toDate');\n }\n\n if (!from || (moment.isMoment(from) && !from.isValid())) {\n from = this.gantt.rowsManager.getDefaultFrom();\n if (!from) {\n return false;\n }\n }\n\n if (!to || (moment.isMoment(to) && !to.isValid())) {\n to = this.gantt.rowsManager.getDefaultTo();\n if (!to) {\n return false;\n }\n }\n\n if (from !== undefined && !moment.isMoment(from)) {\n from = moment(from);\n }\n\n if (to !== undefined && !moment.isMoment(to)) {\n to = moment(to);\n }\n\n if (this.gantt.options.value('taskOutOfRange') === 'expand') {\n from = this.gantt.rowsManager.getExpandedFrom(from);\n to = this.gantt.rowsManager.getExpandedTo(to);\n }\n\n this.setScrollAnchor();\n\n this.from = from;\n this.to = to;\n\n this.columns = ColumnGenerator.generate(this.columnBuilder, from, to, this.gantt.options.value('viewScale'), this.getColumnsWidth());\n this.headers = HeadersGenerator.generate(this);\n this.previousColumns = [];\n this.nextColumns = [];\n\n this.updateColumnsMeta();\n this.scrollToScrollAnchor();\n\n this.gantt.api.columns.raise.generate(this.columns, this.headers);\n };\n\n ColumnsManager.prototype.updateColumnsMeta = function() {\n this.gantt.isRefreshingColumns = true;\n\n var lastColumn = this.getLastColumn();\n this.gantt.originalWidth = lastColumn !== undefined ? lastColumn.originalSize.left + lastColumn.originalSize.width : 0;\n\n var columnsWidthChanged = this.updateColumnsWidths(this.columns, this.headers, this.previousColumns, this.nextColumns);\n\n this.gantt.width = lastColumn !== undefined ? lastColumn.left + lastColumn.width : 0;\n\n var showSide = this.gantt.options.value('showSide');\n var sideShown = this.gantt.side.isShown();\n var sideVisibilityChanged = showSide !== sideShown;\n\n if (sideVisibilityChanged && !showSide) {\n // Prevent unnecessary v-scrollbar if side is hidden here\n this.gantt.side.show(false);\n }\n\n this.gantt.rowsManager.updateTasksPosAndSize();\n this.gantt.timespansManager.updateTimespansPosAndSize();\n\n this.updateVisibleColumns(columnsWidthChanged);\n\n this.gantt.rowsManager.updateVisibleObjects();\n\n var currentDateValue = this.gantt.options.value('currentDateValue');\n this.gantt.currentDateManager.setCurrentDate(currentDateValue);\n\n if (sideVisibilityChanged && showSide) {\n // Prevent unnecessary v-scrollbar if side is shown here\n this.gantt.side.show(true);\n }\n\n this.gantt.isRefreshingColumns = false;\n this.gantt.api.columns.raise.refresh(this.columns, this.headers);\n };\n\n // Returns the last Gantt column or undefined\n ColumnsManager.prototype.getLastColumn = function(extended) {\n var columns = this.columns;\n if (extended) {\n columns = this.nextColumns;\n }\n if (columns && columns.length > 0) {\n return columns[columns.length - 1];\n } else {\n return undefined;\n }\n };\n\n // Returns the first Gantt column or undefined\n ColumnsManager.prototype.getFirstColumn = function(extended) {\n var columns = this.columns;\n if (extended) {\n columns = this.previousColumns;\n }\n\n if (columns && columns.length > 0) {\n return columns[0];\n } else {\n return undefined;\n }\n };\n\n // Returns the column at the given or next possible date\n ColumnsManager.prototype.getColumnByDate = function(date, disableExpand) {\n if (!disableExpand) {\n this.expandExtendedColumnsForDate(date);\n }\n var extendedColumns = this.previousColumns.concat(this.columns, this.nextColumns);\n var columns = bs.get(extendedColumns, date, function(c) {\n return c.date;\n }, true);\n return columns[0] === undefined ? columns[1] : columns[0];\n };\n\n // Returns the column at the given position x (in em)\n ColumnsManager.prototype.getColumnByPosition = function(x, disableExpand) {\n if (!disableExpand) {\n this.expandExtendedColumnsForPosition(x);\n }\n var extendedColumns = this.previousColumns.concat(this.columns, this.nextColumns);\n var columns = bs.get(extendedColumns, x, function(c) {\n return c.left;\n }, true);\n return columns[0] === undefined ? columns[1]: columns[0];\n };\n\n ColumnsManager.prototype.updateColumnsWidths = function(columns, headers, previousColumns, nextColumns) {\n var columnWidth = this.gantt.options.value('columnWidth');\n var expandToFit = this.gantt.options.value('expandToFit');\n var shrinkToFit = this.gantt.options.value('shrinkToFit');\n\n if (columnWidth === undefined || expandToFit || shrinkToFit) {\n var newWidth = this.gantt.getBodyAvailableWidth();\n\n var lastColumn = this.gantt.columnsManager.getLastColumn(false);\n if (lastColumn !== undefined) {\n var currentWidth = lastColumn.originalSize.left + lastColumn.originalSize.width;\n\n if (expandToFit && currentWidth < newWidth ||\n shrinkToFit && currentWidth > newWidth ||\n columnWidth === undefined\n ) {\n var widthFactor = newWidth / currentWidth;\n\n layout.setColumnsWidthFactor(columns, widthFactor);\n for (var i=0; i< headers.length; i++) {\n layout.setColumnsWidthFactor(headers[i], widthFactor);\n }\n // previous and next columns will be generated again on need.\n previousColumns.splice(0, this.previousColumns.length);\n nextColumns.splice(0, this.nextColumns.length);\n return true;\n }\n }\n }\n return false;\n };\n\n ColumnsManager.prototype.getColumnsWidth = function() {\n var columnWidth = this.gantt.options.value('columnWidth');\n if (columnWidth === undefined) {\n if (!this.gantt.width || this.gantt.width <= 0) {\n columnWidth = 20;\n } else {\n columnWidth = this.gantt.width / this.columns.length;\n }\n }\n return columnWidth;\n };\n\n ColumnsManager.prototype.getColumnsWidthToFit = function() {\n return this.gantt.getBodyAvailableWidth() / this.columns.length;\n };\n\n ColumnsManager.prototype.expandExtendedColumnsForPosition = function(x) {\n var viewScale;\n if (x < 0) {\n var firstColumn = this.getFirstColumn();\n var from = firstColumn.date;\n var firstExtendedColumn = this.getFirstColumn(true);\n if (!firstExtendedColumn || firstExtendedColumn.left > x) {\n viewScale = this.gantt.options.value('viewScale');\n this.previousColumns = ColumnGenerator.generate(this.columnBuilder, from, undefined, viewScale, this.getColumnsWidth(), -x, 0, true);\n }\n return true;\n } else if (x > this.gantt.width) {\n var lastColumn = this.getLastColumn();\n var endDate = lastColumn.getDateByPosition(lastColumn.width);\n var lastExtendedColumn = this.getLastColumn(true);\n if (!lastExtendedColumn || lastExtendedColumn.left + lastExtendedColumn.width < x) {\n viewScale = this.gantt.options.value('viewScale');\n this.nextColumns = ColumnGenerator.generate(this.columnBuilder, endDate, undefined, viewScale, this.getColumnsWidth(), x - this.gantt.width, this.gantt.width, false);\n }\n return true;\n }\n return false;\n };\n\n ColumnsManager.prototype.expandExtendedColumnsForDate = function(date) {\n var firstColumn = this.getFirstColumn();\n var from;\n if (firstColumn) {\n from = firstColumn.date;\n }\n\n var lastColumn = this.getLastColumn();\n var endDate;\n if (lastColumn) {\n endDate = lastColumn.getDateByPosition(lastColumn.width);\n }\n\n var viewScale;\n if (from && date < from) {\n var firstExtendedColumn = this.getFirstColumn(true);\n if (!firstExtendedColumn || firstExtendedColumn.date > date) {\n viewScale = this.gantt.options.value('viewScale');\n this.previousColumns = ColumnGenerator.generate(this.columnBuilder, from, date, viewScale, this.getColumnsWidth(), undefined, 0, true);\n }\n return true;\n } else if (endDate && date >= endDate) {\n var lastExtendedColumn = this.getLastColumn(true);\n if (!lastExtendedColumn || lastExtendedColumn.date < endDate) {\n viewScale = this.gantt.options.value('viewScale');\n this.nextColumns = ColumnGenerator.generate(this.columnBuilder, endDate, date, viewScale, this.getColumnsWidth(), undefined, this.gantt.width, false);\n }\n return true;\n }\n return false;\n };\n\n // Returns the number of active headers\n ColumnsManager.prototype.getActiveHeadersCount = function() {\n return this.headers.length;\n };\n\n ColumnsManager.prototype.updateVisibleColumns = function(includeViews) {\n this.visibleColumns = $filter('ganttColumnLimit')(this.columns, this.gantt);\n\n this.visibleHeaders = [];\n for (var i=0; i< this.headers.length; i++) {\n this.visibleHeaders.push($filter('ganttColumnLimit')(this.headers[i], this.gantt));\n }\n\n if (includeViews) {\n for (i=0; i<this.visibleColumns.length; i++) {\n this.visibleColumns[i].updateView();\n }\n for (i=0; i<this.visibleHeaders.length; i++) {\n var headerRow = this.visibleHeaders[i];\n for (var j=0; j<headerRow.length; j++) {\n headerRow[j].updateView();\n }\n }\n }\n\n var currentDateValue = this.gantt.options.value('currentDateValue');\n this.gantt.currentDateManager.setCurrentDate(currentDateValue);\n };\n\n var defaultHeadersFormats = {'year': 'YYYY', 'quarter': '[Q]Q YYYY', month: 'MMMM YYYY', week: 'w', day: 'D', hour: 'H', minute:'HH:mm'};\n var defaultDayHeadersFormats = {day: 'LL', hour: 'H', minute:'HH:mm'};\n var defaultYearHeadersFormats = {'year': 'YYYY', 'quarter': '[Q]Q', month: 'MMMM'};\n\n ColumnsManager.prototype.getHeaderFormat = function(unit) {\n var format;\n var headersFormats = this.gantt.options.value('headersFormats');\n if (headersFormats !== undefined) {\n format = headersFormats[unit];\n }\n if (format === undefined) {\n var viewScale = this.gantt.options.value('viewScale');\n viewScale = viewScale.trim();\n if (viewScale.charAt(viewScale.length - 1) === 's') {\n viewScale = viewScale.substring(0, viewScale.length - 1);\n }\n\n var viewScaleUnit;\n var splittedViewScale;\n\n if (viewScale) {\n splittedViewScale = viewScale.split(' ');\n }\n if (splittedViewScale && splittedViewScale.length > 1) {\n viewScaleUnit = splittedViewScale[splittedViewScale.length - 1];\n } else {\n viewScaleUnit = viewScale;\n }\n\n if (['millisecond', 'second', 'minute', 'hour'].indexOf(viewScaleUnit) > -1) {\n format = defaultDayHeadersFormats[unit];\n } else if (['month', 'quarter', 'year'].indexOf(viewScaleUnit) > -1) {\n format = defaultYearHeadersFormats[unit];\n }\n if (format === undefined) {\n format = defaultHeadersFormats[unit];\n }\n }\n return format;\n };\n\n ColumnsManager.prototype.getDateRange = function(visibleOnly) {\n var firstColumn, lastColumn;\n\n if (visibleOnly) {\n if (this.visibleColumns && this.visibleColumns.length > 0) {\n firstColumn = this.visibleColumns[0];\n lastColumn = this.visibleColumns[this.visibleColumns.length - 1];\n }\n } else {\n firstColumn = this.getFirstColumn();\n lastColumn = this.getLastColumn();\n }\n\n return firstColumn && lastColumn ? [firstColumn.date, lastColumn.endDate]: undefined;\n };\n\n return ColumnsManager;\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').service('GanttHeadersGenerator', ['GanttColumnHeader', 'moment', function(ColumnHeader, moment) {\n var generateHeader = function(columnsManager, viewScale) {\n var generatedHeaders = [];\n var header;\n\n var viewScaleValue;\n var viewScaleUnit;\n var splittedViewScale;\n\n if (viewScale) {\n splittedViewScale = viewScale.split(' ');\n }\n if (splittedViewScale && splittedViewScale.length > 1) {\n viewScaleValue = parseFloat(splittedViewScale[0]);\n viewScaleUnit = splittedViewScale[splittedViewScale.length - 1];\n } else {\n viewScaleValue = 1;\n viewScaleUnit = viewScale;\n }\n\n var currentColumn = columnsManager.columns[0];\n var currentDate = moment(currentColumn.date).startOf(viewScaleUnit);\n\n var maximumDate = moment(columnsManager.columns[columnsManager.columns.length - 1].endDate);\n\n while (true) {\n var currentPosition = currentColumn.getPositionByDate(currentDate);\n\n var endDate = moment.min(moment(currentDate).add(viewScaleValue, viewScaleUnit), maximumDate);\n\n var column = columnsManager.getColumnByDate(endDate, true);\n\n var left = column.getPositionByDate(endDate);\n\n var width = left - currentPosition;\n\n if (width > 0) {\n var labelFormat = columnsManager.getHeaderFormat(viewScaleUnit);\n\n header = new ColumnHeader(currentDate, endDate, viewScaleUnit, currentPosition, width, labelFormat);\n generatedHeaders.push(header);\n }\n\n if (endDate.isSame(maximumDate) || endDate.isAfter(maximumDate)) {\n break;\n }\n\n currentColumn = column;\n currentDate = endDate;\n }\n\n return generatedHeaders;\n };\n\n this.generate = function(columnsManager) {\n var units = [];\n if (columnsManager.gantt.options.value('headers') === undefined) {\n var viewScale = columnsManager.gantt.options.value('viewScale');\n viewScale = viewScale.trim();\n if (viewScale.charAt(viewScale.length - 1) === 's') {\n viewScale = viewScale.substring(0, viewScale.length - 1);\n }\n\n var viewScaleUnit;\n var splittedViewScale;\n\n if (viewScale) {\n splittedViewScale = viewScale.split(' ');\n }\n if (splittedViewScale && splittedViewScale.length > 1) {\n viewScaleUnit = splittedViewScale[splittedViewScale.length - 1];\n } else {\n viewScaleUnit = viewScale;\n }\n\n if (['quarter','month'].indexOf(viewScaleUnit) > -1) {\n units.push('year');\n }\n if (['day', 'week'].indexOf(viewScaleUnit) > -1) {\n units.push('month');\n }\n if (['day'].indexOf(viewScaleUnit) > -1) {\n units.push('week');\n }\n if (['hour'].indexOf(viewScaleUnit) > -1) {\n units.push('day');\n }\n if (['minute', 'second'].indexOf(viewScaleUnit) > -1) {\n units.push('hour');\n }\n if (['second'].indexOf(viewScaleUnit) > -1) {\n units.push('minute');\n }\n units.push(viewScale);\n } else {\n units = columnsManager.gantt.options.value('headers');\n }\n\n var headers = [];\n for (var i=0; i<units.length; i++) {\n headers.push(generateHeader(columnsManager, units[i]));\n }\n\n return headers;\n };\n }]);\n}());\n\n","(function() {\n 'use strict';\n angular.module('gantt').factory('Gantt', [\n 'GanttApi', 'GanttOptions', 'GanttCalendar', 'GanttScroll', 'GanttBody', 'GanttRowHeader', 'GanttHeader', 'GanttSide', 'GanttObjectModel', 'GanttRowsManager', 'GanttColumnsManager', 'GanttTimespansManager', 'GanttCurrentDateManager', 'ganttArrays', 'moment', '$document', '$timeout',\n function(GanttApi, Options, Calendar, Scroll, Body, RowHeader, Header, Side, ObjectModel, RowsManager, ColumnsManager, TimespansManager, CurrentDateManager, arrays, moment, $document, $timeout) {\n // Gantt logic. Manages the columns, rows and sorting functionality.\n var Gantt = function($scope, $element) {\n var self = this;\n\n this.$scope = $scope;\n this.$element = $element;\n\n this.options = new Options($scope, {\n 'api': angular.noop,\n 'data': [],\n 'timespans': [],\n 'viewScale': 'day',\n 'columnMagnet': '15 minutes',\n 'timeFramesMagnet': true,\n 'showSide': true,\n 'allowSideResizing': true,\n 'currentDate': 'line',\n 'currentDateValue': moment,\n 'autoExpand': 'none',\n 'taskOutOfRange': 'truncate',\n 'taskContent': '{{task.model.name}}',\n 'rowContent': '{{row.model.name}}',\n 'maxHeight': 0,\n 'timeFrames': [],\n 'dateFrames': [],\n 'timeFramesWorkingMode': 'hidden',\n 'timeFramesNonWorkingMode': 'visible'\n });\n\n this.api = new GanttApi(this);\n\n this.api.registerEvent('core', 'ready');\n this.api.registerEvent('core', 'rendered');\n\n this.api.registerEvent('directives', 'controller');\n this.api.registerEvent('directives', 'preLink');\n this.api.registerEvent('directives', 'postLink');\n this.api.registerEvent('directives', 'new');\n this.api.registerEvent('directives', 'destroy');\n\n this.api.registerEvent('data', 'change');\n this.api.registerEvent('data', 'load');\n this.api.registerEvent('data', 'remove');\n this.api.registerEvent('data', 'clear');\n\n this.api.registerMethod('core', 'getDateByPosition', this.getDateByPosition, this);\n this.api.registerMethod('core', 'getPositionByDate', this.getPositionByDate, this);\n\n this.api.registerMethod('data', 'load', this.loadData, this);\n this.api.registerMethod('data', 'remove', this.removeData, this);\n this.api.registerMethod('data', 'clear', this.clearData, this);\n this.api.registerMethod('data', 'get', this.getData, this);\n\n this.calendar = new Calendar(this);\n this.calendar.registerTimeFrames(this.options.value('timeFrames'));\n this.calendar.registerDateFrames(this.options.value('dateFrames'));\n\n this.api.registerMethod('timeframes', 'registerTimeFrames', this.calendar.registerTimeFrames, this.calendar);\n this.api.registerMethod('timeframes', 'clearTimeframes', this.calendar.clearTimeFrames, this.calendar);\n this.api.registerMethod('timeframes', 'registerDateFrames', this.calendar.registerDateFrames, this.calendar);\n this.api.registerMethod('timeframes', 'clearDateFrames', this.calendar.clearDateFrames, this.calendar);\n this.api.registerMethod('timeframes', 'registerTimeFrameMappings', this.calendar.registerTimeFrameMappings, this.calendar);\n this.api.registerMethod('timeframes', 'clearTimeFrameMappings', this.calendar.clearTimeFrameMappings, this.calendar);\n\n $scope.$watchGroup(['timeFrames', 'dateFrames'], function(newValues, oldValues) {\n if (newValues !== oldValues) {\n var timeFrames = newValues[0];\n var dateFrames = newValues[1];\n\n var oldTimeFrames = oldValues[0];\n var oldDateFrames = oldValues[1];\n\n var framesChanged = false;\n\n if (!angular.equals(timeFrames, oldTimeFrames)) {\n self.calendar.clearTimeFrames();\n self.calendar.registerTimeFrames(timeFrames);\n framesChanged = true;\n }\n\n if (!angular.equals(dateFrames, oldDateFrames)) {\n self.calendar.clearDateFrames();\n self.calendar.registerDateFrames(dateFrames);\n framesChanged = true;\n }\n\n if (framesChanged) {\n self.columnsManager.generateColumns();\n }\n }\n });\n\n $scope.$watch('columnMagnet', function() {\n var splittedColumnMagnet;\n var columnMagnet = self.options.value('columnMagnet');\n if (columnMagnet) {\n splittedColumnMagnet = columnMagnet.trim().split(' ');\n }\n if (splittedColumnMagnet && splittedColumnMagnet.length > 1) {\n self.columnMagnetValue = parseFloat(splittedColumnMagnet[0]);\n self.columnMagnetUnit = moment.normalizeUnits(splittedColumnMagnet[splittedColumnMagnet.length - 1]);\n } else {\n self.columnMagnetValue = 1;\n self.columnMagnetUnit = moment.normalizeUnits(columnMagnet);\n }\n });\n\n $scope.$watchGroup(['shiftColumnMagnet', 'viewScale'], function() {\n var splittedColumnMagnet;\n var shiftColumnMagnet = self.options.value('shiftColumnMagnet');\n if (shiftColumnMagnet) {\n splittedColumnMagnet = shiftColumnMagnet.trim().split(' ');\n }\n if (splittedColumnMagnet !== undefined && splittedColumnMagnet.length > 1) {\n self.shiftColumnMagnetValue = parseFloat(splittedColumnMagnet[0]);\n self.shiftColumnMagnetUnit = moment.normalizeUnits(splittedColumnMagnet[splittedColumnMagnet.length - 1]);\n } else {\n self.shiftColumnMagnetValue = 1;\n self.shiftColumnMagnetUnit = moment.normalizeUnits(shiftColumnMagnet);\n }\n });\n\n var keyHandler = function(e) {\n self.shiftKey = e.shiftKey;\n return true;\n };\n\n $document.on('keyup keydown', keyHandler);\n\n $scope.$on('$destroy', function() {\n $document.off('keyup keydown', keyHandler);\n });\n\n this.scroll = new Scroll(this);\n this.body = new Body(this);\n this.header = new Header(this);\n this.side = new Side(this);\n\n this.objectModel = new ObjectModel(this.api);\n\n this.rowsManager = new RowsManager(this);\n this.columnsManager = new ColumnsManager(this);\n this.timespansManager = new TimespansManager(this);\n this.currentDateManager = new CurrentDateManager(this);\n\n this.originalWidth = 0;\n this.width = 0;\n\n if (angular.isFunction(this.$scope.api)) {\n this.$scope.api(this.api);\n }\n\n var hasRowModelOrderChanged = function(data1, data2) {\n if (data2 === undefined || data1.length !== data2.length) {\n return true;\n }\n\n for (var i = 0, l = data1.length; i < l; i++) {\n if (data1[i].id !== data2[i].id) {\n return true;\n }\n }\n\n return false;\n };\n\n $scope.$watchCollection('data', function(newData, oldData) {\n if (oldData !== undefined) {\n var toRemoveIds = arrays.getRemovedIds(newData, oldData);\n if (toRemoveIds.length === oldData.length) {\n self.rowsManager.removeAll();\n\n // DEPRECATED\n self.api.data.raise.clear();\n } else {\n for (var i = 0, l = toRemoveIds.length; i < l; i++) {\n var toRemoveId = toRemoveIds[i];\n self.rowsManager.removeRow(toRemoveId);\n }\n\n // DEPRECATED\n var removedRows = [];\n for(i = 0, l = oldData.length; i < l; i++){\n if (toRemoveIds.indexOf(oldData[i].id) > -1) {\n removedRows.push(oldData[i]);\n }\n }\n self.api.data.raise.remove(removedRows);\n }\n }\n\n if (newData !== undefined) {\n var modelOrderChanged = hasRowModelOrderChanged(newData, oldData);\n\n if (modelOrderChanged) {\n self.rowsManager.resetNonModelLists();\n }\n\n for (var j = 0, k = newData.length; j < k; j++) {\n var rowData = newData[j];\n self.rowsManager.addRow(rowData, modelOrderChanged);\n }\n\n self.api.data.raise.change(newData, oldData);\n\n // DEPRECATED\n self.api.data.raise.load(newData);\n }\n });\n };\n\n // Returns the exact column date at the given position x (in em)\n Gantt.prototype.getDateByPosition = function(x, magnet, disableExpand) {\n var column = this.columnsManager.getColumnByPosition(x, disableExpand);\n if (column !== undefined) {\n var magnetValue;\n var magnetUnit;\n if (magnet) {\n if (this.shiftKey) {\n if (this.shiftColumnMagnetValue !== undefined && this.shiftColumnMagnetUnit !== undefined) {\n magnetValue = this.shiftColumnMagnetValue;\n magnetUnit = this.shiftColumnMagnetUnit;\n } else {\n var viewScale = this.options.value('viewScale');\n viewScale = viewScale.trim();\n var viewScaleValue;\n var viewScaleUnit;\n var splittedViewScale;\n\n if (viewScale) {\n splittedViewScale = viewScale.split(' ');\n }\n if (splittedViewScale && splittedViewScale.length > 1) {\n viewScaleValue = parseFloat(splittedViewScale[0]);\n viewScaleUnit = moment.normalizeUnits(splittedViewScale[splittedViewScale.length - 1]);\n } else {\n viewScaleValue = 1;\n viewScaleUnit = moment.normalizeUnits(viewScale);\n }\n magnetValue = viewScaleValue * 0.25;\n magnetUnit = viewScaleUnit;\n }\n } else {\n magnetValue = this.columnMagnetValue;\n magnetUnit = this.columnMagnetUnit;\n }\n }\n\n return column.getDateByPosition(x - column.left, magnetValue, magnetUnit, this.options.value('timeFramesMagnet'));\n } else {\n return undefined;\n }\n };\n\n Gantt.prototype.getBodyAvailableWidth = function() {\n var scrollWidth = this.getWidth() - this.side.getWidth();\n var borderWidth = this.scroll.getBordersWidth();\n var availableWidth = scrollWidth - (borderWidth !== undefined ? this.scroll.getBordersWidth() : 0);\n // Remove 1 pixel because of rounding issue in some cases.\n availableWidth = availableWidth - 1;\n return availableWidth;\n };\n\n // Returns the position inside the Gantt calculated by the given date\n Gantt.prototype.getPositionByDate = function(date, disableExpand) {\n if (date === undefined) {\n return undefined;\n }\n\n if (!moment.isMoment(moment)) {\n date = moment(date);\n }\n\n var column = this.columnsManager.getColumnByDate(date, disableExpand);\n if (column !== undefined) {\n return column.getPositionByDate(date);\n } else {\n return undefined;\n }\n };\n\n // DEPRECATED - Use $data instead.\n Gantt.prototype.loadData = function(data) {\n if (!angular.isArray(data)) {\n data = data !== undefined ? [data] : [];\n }\n\n if (this.$scope.data === undefined) {\n this.$scope.data = data;\n } else {\n for (var i = 0, l = data.length; i < l; i++) {\n var row = data[i];\n\n var j = arrays.indexOfId(this.$scope.data, row.id);\n if (j > -1) {\n this.$scope.data[j] = row;\n } else {\n this.$scope.data.push(row);\n }\n }\n }\n\n var w = this.side.getWidth();\n if (w > 0) {\n this.options.set('sideWidth', w);\n }\n };\n\n Gantt.prototype.getData = function() {\n return this.$scope.data;\n };\n\n // DEPRECATED - Use $data instead.\n Gantt.prototype.removeData = function(data) {\n if (!angular.isArray(data)) {\n data = data !== undefined ? [data] : [];\n }\n\n if (this.$scope.data !== undefined) {\n for (var i = 0, l = data.length; i < l; i++) {\n var rowToRemove = data[i];\n\n var j = arrays.indexOfId(this.$scope.data, rowToRemove.id);\n if (j > -1) {\n if (rowToRemove.tasks === undefined || rowToRemove.tasks.length === 0) {\n // Remove complete row\n this.$scope.data.splice(j, 1);\n } else {\n // Remove single tasks\n var row = this.$scope.data[j];\n for (var ti = 0, tl = rowToRemove.tasks.length; ti < tl; ti++) {\n var taskToRemove = rowToRemove.tasks[ti];\n\n var tj = arrays.indexOfId(row.tasks, taskToRemove.id);\n if (tj > -1) {\n row.tasks.splice(tj, 1);\n }\n }\n }\n }\n }\n }\n };\n\n // DEPRECATED - Use $data instead.\n Gantt.prototype.clearData = function() {\n this.$scope.data = undefined;\n };\n\n Gantt.prototype.getWidth = function() {\n return this.$scope.ganttElementWidth;\n };\n\n Gantt.prototype.initialized = function() {\n // Gantt is initialized. Signal that the Gantt is ready.\n this.api.core.raise.ready(this.api);\n\n this.rendered = true;\n this.columnsManager.generateColumns();\n\n var gantt = this;\n var renderedFunction = function() {\n var w = gantt.side.getWidth();\n if (w > 0) {\n gantt.options.set('sideWidth', w);\n }\n gantt.api.core.raise.rendered(gantt.api);\n };\n $timeout(renderedFunction);\n };\n\n return Gantt;\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttObjectModel', ['ganttUtils', 'moment', function(utils, moment) {\n var ObjectModel = function(api) {\n this.api = api;\n\n this.api.registerEvent('tasks', 'clean');\n this.api.registerEvent('rows', 'clean');\n this.api.registerEvent('timespans', 'clean');\n };\n\n ObjectModel.prototype.cleanTask = function(model) {\n if (model.id === undefined) {\n model.id = utils.randomUuid();\n }\n\n if (model.from !== undefined && !moment.isMoment(model.from)) {\n model.from = moment(model.from);\n }\n\n if (model.to !== undefined && !moment.isMoment(model.to)) {\n model.to = moment(model.to);\n }\n\n this.api.tasks.raise.clean(model);\n };\n\n ObjectModel.prototype.cleanRow = function(model) {\n if (model.id === undefined) {\n model.id = utils.randomUuid();\n }\n\n if (model.from !== undefined && !moment.isMoment(model.from)) {\n model.from = moment(model.from);\n }\n\n if (model.to !== undefined && !moment.isMoment(model.to)) {\n model.to = moment(model.to);\n }\n\n this.api.rows.raise.clean(model);\n };\n\n ObjectModel.prototype.cleanTimespan = function(model) {\n if (model.id === undefined) {\n model.id = utils.randomUuid();\n }\n\n if (model.from !== undefined && !moment.isMoment(model.from)) {\n model.from = moment(model.from);\n }\n\n if (model.to !== undefined && !moment.isMoment(model.to)) {\n model.to = moment(model.to);\n }\n\n this.api.timespans.raise.clean(model);\n };\n\n return ObjectModel;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttRow', ['GanttTask', 'moment', '$filter', function(Task, moment, $filter) {\n var Row = function(rowsManager, model) {\n this.rowsManager = rowsManager;\n this.model = model;\n\n this.from = undefined;\n this.to = undefined;\n\n this.tasksMap = {};\n this.tasks = [];\n this.filteredTasks = [];\n this.visibleTasks = [];\n };\n\n Row.prototype.addTaskImpl = function(task, viewOnly) {\n this.tasksMap[task.model.id] = task;\n this.tasks.push(task);\n\n if (!viewOnly) {\n if (this.model.tasks === undefined) {\n this.model.tasks = [];\n }\n if (this.model.tasks.indexOf(task.model) === -1) {\n this.model.tasks.push(task.model);\n }\n }\n\n };\n\n // Adds a task to a specific row. Merges the task if there is already one with the same id\n Row.prototype.addTask = function(taskModel, viewOnly) {\n // Copy to new task (add) or merge with existing (update)\n var task, isUpdate = false;\n\n this.rowsManager.gantt.objectModel.cleanTask(taskModel);\n if (taskModel.id in this.tasksMap) {\n task = this.tasksMap[taskModel.id];\n if (task.model === taskModel) {\n return task;\n }\n task.model = taskModel;\n isUpdate = true;\n } else {\n task = new Task(this, taskModel);\n this.addTaskImpl(task, viewOnly);\n }\n\n this.sortTasks();\n this.setFromToByTask(task);\n\n if (!viewOnly) {\n if (isUpdate) {\n this.rowsManager.gantt.api.tasks.raise.change(task);\n } else {\n this.rowsManager.gantt.api.tasks.raise.add(task);\n }\n }\n\n return task;\n };\n\n // Removes the task from the existing row and adds it to he current one\n Row.prototype.moveTaskToRow = function(task, viewOnly) {\n var oldRow = task.row;\n oldRow.removeTask(task.model.id, viewOnly, true);\n\n task.row = this;\n this.addTaskImpl(task, viewOnly);\n\n this.sortTasks();\n this.setFromToByTask(task);\n\n task.updatePosAndSize();\n this.updateVisibleTasks();\n\n oldRow.$scope.$digest();\n task.row.$scope.$digest();\n\n this.rowsManager.gantt.api.tasks.raise.viewRowChange(task, oldRow);\n if (!viewOnly) {\n this.rowsManager.gantt.api.tasks.raise.rowChange(task, oldRow);\n }\n };\n\n Row.prototype.updateVisibleTasks = function() {\n var filterTask = this.rowsManager.gantt.options.value('filterTask');\n if (filterTask) {\n if (typeof(filterTask) === 'object') {\n filterTask = {model: filterTask};\n }\n\n var filterTaskComparator = this.rowsManager.gantt.options.value('filterTaskComparator');\n if (typeof(filterTaskComparator) === 'function') {\n filterTaskComparator = function(actual, expected) {\n return filterTaskComparator(actual.model, expected.model);\n };\n }\n\n this.filteredTasks = $filter('filter')(this.tasks, filterTask, filterTaskComparator);\n } else {\n this.filteredTasks = this.tasks.slice(0);\n }\n this.visibleTasks = $filter('ganttTaskLimit')(this.filteredTasks, this.rowsManager.gantt);\n };\n\n Row.prototype.updateTasksPosAndSize = function() {\n for (var j = 0, k = this.tasks.length; j < k; j++) {\n this.tasks[j].updatePosAndSize();\n }\n };\n\n // Remove the specified task from the row\n Row.prototype.removeTask = function(taskId, viewOnly, silent) {\n if (taskId in this.tasksMap) {\n var removedTask = this.tasksMap[taskId];\n var task;\n var i;\n\n for (i = this.tasks.length - 1; i >= 0; i--) {\n task = this.tasks[i];\n if (task.model.id === taskId) {\n this.tasks.splice(i, 1); // Remove from array\n\n // Update earliest or latest date info as this may change\n if (this.from - task.model.from === 0 || this.to - task.model.to === 0) {\n this.setFromTo();\n }\n\n break;\n }\n }\n\n for (i = this.filteredTasks.length - 1; i >= 0; i--) {\n task = this.filteredTasks[i];\n if (task.model.id === taskId) {\n this.filteredTasks.splice(i, 1); // Remove from filtered array\n break;\n }\n }\n\n for (i = this.visibleTasks.length - 1; i >= 0; i--) {\n task = this.visibleTasks[i];\n if (task.model.id === taskId) {\n this.visibleTasks.splice(i, 1); // Remove from visible array\n break;\n }\n }\n\n if (!viewOnly) {\n delete this.tasksMap[taskId]; // Remove from map\n\n if (this.model.tasks !== undefined) {\n var taskIndex = this.model.tasks.indexOf(removedTask.model);\n if (taskIndex > -1) {\n this.model.tasks.splice(taskIndex, 1);\n }\n }\n\n if (!silent) {\n this.rowsManager.gantt.api.tasks.raise.remove(removedTask);\n }\n }\n\n return removedTask;\n }\n };\n\n Row.prototype.removeAllTasks = function() {\n this.from = undefined;\n this.to = undefined;\n\n this.tasksMap = {};\n this.tasks = [];\n this.filteredTasks = [];\n this.visibleTasks = [];\n };\n\n // Calculate the earliest from and latest to date of all tasks in a row\n Row.prototype.setFromTo = function() {\n this.from = undefined;\n this.to = undefined;\n for (var j = 0, k = this.tasks.length; j < k; j++) {\n this.setFromToByTask(this.tasks[j]);\n }\n };\n\n Row.prototype.setFromToByTask = function(task) {\n this.setFromToByValues(task.model.from, task.model.to);\n };\n\n Row.prototype.setFromToByValues = function(from, to) {\n if (from !== undefined) {\n if (this.from === undefined) {\n this.from = moment(from);\n } else if (from < this.from) {\n this.from = moment(from);\n }\n }\n\n if (to !== undefined) {\n if (this.to === undefined) {\n this.to = moment(to);\n } else if (to > this.to) {\n this.to = moment(to);\n }\n }\n\n };\n\n Row.prototype.sortTasks = function() {\n this.tasks.sort(function(t1, t2) {\n return t1.left - t2.left;\n });\n };\n\n Row.prototype.clone = function() {\n var clone = new Row(this.rowsManager, angular.copy(this));\n for (var i = 0, l = this.tasks.length; i < l; i++) {\n clone.addTask(this.tasks[i].model);\n }\n return clone;\n };\n\n return Row;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttRowHeader', [function() {\n var RowHeader = function(gantt) {\n this.gantt = gantt;\n };\n return RowHeader;\n }]);\n}());\n\n","(function() {\n 'use strict';\n angular.module('gantt').factory('GanttRowsManager', ['GanttRow', 'ganttArrays', '$filter', '$timeout', 'moment', function(Row, arrays, $filter, $timeout, moment) {\n var RowsManager = function(gantt) {\n var self = this;\n\n this.gantt = gantt;\n\n this.rowsMap = {};\n this.rows = [];\n this.sortedRows = [];\n this.filteredRows = [];\n this.customFilteredRows = [];\n this.visibleRows = [];\n this.rowsTaskWatchers = [];\n\n this._defaultFilterImpl = function(sortedRows, filterRow, filterRowComparator) {\n return $filter('filter')(sortedRows, filterRow, filterRowComparator);\n };\n this.filterImpl = this._defaultFilterImpl;\n\n this.customRowSorters = [];\n this.customRowFilters = [];\n\n this.gantt.$scope.$watchGroup(['filterTask', 'filterTaskComparator'], function(newValues, oldValues) {\n if (newValues !== oldValues) {\n self.updateVisibleTasks();\n }\n });\n\n this.gantt.$scope.$watchGroup(['filterRow', 'filterRowComparator'], function(newValues, oldValues) {\n if (newValues !== oldValues) {\n self.updateVisibleRows();\n }\n });\n\n this.gantt.$scope.$watch('sortMode', function(newValue, oldValue) {\n if (newValue !== oldValue) {\n self.sortRows();\n }\n });\n\n // Listen to vertical scrollbar visibility changes to update columns width\n var _oldVScrollbarVisible = this.gantt.scroll.isVScrollbarVisible();\n this.gantt.$scope.$watchGroup(['maxHeight', 'gantt.rowsManager.visibleRows.length'], function(newValue, oldValue) {\n if (newValue !== oldValue) {\n $timeout(function() {\n var newVScrollbarVisible = self.gantt.scroll.isVScrollbarVisible();\n if (newVScrollbarVisible !== _oldVScrollbarVisible) {\n _oldVScrollbarVisible = newVScrollbarVisible;\n self.gantt.columnsManager.updateColumnsMeta();\n }\n });\n }\n });\n\n this.gantt.api.registerMethod('rows', 'sort', RowsManager.prototype.sortRows, this);\n this.gantt.api.registerMethod('rows', 'applySort', RowsManager.prototype.applySort, this);\n this.gantt.api.registerMethod('rows', 'refresh', RowsManager.prototype.updateVisibleObjects, this);\n\n this.gantt.api.registerMethod('rows', 'removeRowSorter', RowsManager.prototype.removeCustomRowSorter, this);\n this.gantt.api.registerMethod('rows', 'addRowSorter', RowsManager.prototype.addCustomRowSorter, this);\n\n this.gantt.api.registerMethod('rows', 'removeRowFilter', RowsManager.prototype.removeCustomRowFilter, this);\n this.gantt.api.registerMethod('rows', 'addRowFilter', RowsManager.prototype.addCustomRowFilter, this);\n\n this.gantt.api.registerMethod('rows', 'setFilterImpl', RowsManager.prototype.setFilterImpl, this);\n\n this.gantt.api.registerEvent('tasks', 'add');\n this.gantt.api.registerEvent('tasks', 'change');\n this.gantt.api.registerEvent('tasks', 'viewChange');\n\n this.gantt.api.registerEvent('tasks', 'rowChange');\n this.gantt.api.registerEvent('tasks', 'viewRowChange');\n this.gantt.api.registerEvent('tasks', 'remove');\n this.gantt.api.registerEvent('tasks', 'filter');\n\n this.gantt.api.registerEvent('tasks', 'displayed');\n\n this.gantt.api.registerEvent('rows', 'add');\n this.gantt.api.registerEvent('rows', 'change');\n this.gantt.api.registerEvent('rows', 'remove');\n this.gantt.api.registerEvent('rows', 'move');\n\n this.gantt.api.registerEvent('rows', 'displayed');\n\n this.gantt.api.registerEvent('rows', 'filter');\n\n this.updateVisibleObjects();\n };\n\n RowsManager.prototype.resetNonModelLists = function() {\n this.rows = [];\n this.sortedRows = [];\n this.filteredRows = [];\n this.customFilteredRows = [];\n this.visibleRows = [];\n };\n\n RowsManager.prototype.addRow = function(rowModel, modelOrderChanged) {\n // Copy to new row (add) or merge with existing (update)\n var row, i, l, isUpdate = false;\n\n this.gantt.objectModel.cleanRow(rowModel);\n\n if (rowModel.id in this.rowsMap) {\n row = this.rowsMap[rowModel.id];\n\n if (modelOrderChanged) {\n this.rows.push(row);\n this.sortedRows.push(row);\n this.filteredRows.push(row);\n this.customFilteredRows.push(row);\n this.visibleRows.push(row);\n }\n\n if (row.model === rowModel) {\n return;\n }\n\n var toRemoveIds = arrays.getRemovedIds(rowModel.tasks, row.model.tasks);\n for (i = 0, l = toRemoveIds.length; i < l; i++) {\n var toRemoveId = toRemoveIds[i];\n row.removeTask(toRemoveId);\n }\n\n row.model = rowModel;\n isUpdate = true;\n } else {\n row = new Row(this, rowModel);\n this.rowsMap[rowModel.id] = row;\n this.rows.push(row);\n this.sortedRows.push(row);\n this.filteredRows.push(row);\n this.customFilteredRows.push(row);\n this.visibleRows.push(row);\n }\n\n if (rowModel.tasks !== undefined && rowModel.tasks.length > 0) {\n for (i = 0, l = rowModel.tasks.length; i < l; i++) {\n var taskModel = rowModel.tasks[i];\n row.addTask(taskModel);\n }\n\n row.updateVisibleTasks();\n }\n\n if (isUpdate) {\n this.gantt.api.rows.raise.change(row);\n } else {\n this.gantt.api.rows.raise.add(row);\n }\n\n if (!isUpdate) {\n var watcher = this.gantt.$scope.$watchCollection(function() {\n return rowModel.tasks;\n }, function(newTasks, oldTasks) {\n if (newTasks !== oldTasks) {\n var i, l;\n\n var toRemoveIds = arrays.getRemovedIds(newTasks, oldTasks);\n for (i = 0, l = toRemoveIds.length; i < l; i++) {\n var toRemove = toRemoveIds[i];\n row.removeTask(toRemove);\n }\n\n if (newTasks !== undefined) {\n for (i = 0, l = newTasks.length; i < l; i++) {\n var toAdd = newTasks[i];\n row.addTask(toAdd);\n }\n\n row.updateVisibleTasks();\n }\n }\n });\n\n this.rowsTaskWatchers.push(watcher);\n }\n\n return isUpdate;\n };\n\n RowsManager.prototype.removeRow = function(rowId) {\n if (rowId in this.rowsMap) {\n delete this.rowsMap[rowId]; // Remove from map\n\n var removedRow;\n var row;\n\n var indexOf = arrays.indexOfId(this.rows, rowId, ['model', 'id']);\n if (indexOf > -1) {\n removedRow = this.rows.splice(indexOf, 1)[0]; // Remove from array\n var deregisterFunction = this.rowsTaskWatchers.splice(indexOf, 1)[0]; // Remove watcher\n deregisterFunction();\n }\n\n arrays.removeId(this.sortedRows, rowId, ['model', 'id']);\n arrays.removeId(this.filteredRows, rowId, ['model', 'id']);\n arrays.removeId(this.customFilteredRows, rowId, ['model', 'id']);\n arrays.removeId(this.visibleRows, rowId, ['model', 'id']);\n\n this.gantt.api.rows.raise.remove(removedRow);\n return row;\n }\n\n return undefined;\n };\n\n RowsManager.prototype.removeAll = function() {\n this.rowsMap = {};\n this.rows = [];\n this.sortedRows = [];\n this.filteredRows = [];\n this.customFilteredRows = [];\n this.visibleRows = [];\n\n for (var i = 0, l = this.rowsTaskWatchers.length; i < l; i++) {\n var deregisterFunction = this.rowsTaskWatchers[i];\n deregisterFunction();\n }\n this.rowsTaskWatchers = [];\n };\n\n RowsManager.prototype.sortRows = function() {\n var expression = this.gantt.options.value('sortMode');\n\n if (expression !== undefined) {\n var reverse = false;\n if (angular.isString(expression) && expression.charAt(0) === '-') {\n reverse = true;\n expression = expression.substr(1);\n }\n\n var angularOrderBy = $filter('orderBy');\n this.sortedRows = angularOrderBy(this.rows, expression, reverse);\n } else {\n this.sortedRows = this.rows.slice();\n }\n\n this.sortedRows = this.applyCustomRowSorters(this.sortedRows);\n\n this.updateVisibleRows();\n };\n\n RowsManager.prototype.removeCustomRowSorter = function(sorterFunction) {\n var i = this.customRowSorters.indexOf(sorterFunction);\n if (i > -1) {\n this.customRowSorters.splice(i, 1);\n }\n };\n\n RowsManager.prototype.addCustomRowSorter = function(sorterFunction) {\n this.customRowSorters.push(sorterFunction);\n };\n\n RowsManager.prototype.applyCustomRowSorters = function(sortedRows) {\n for (var i = 0; i < this.customRowSorters.length; i++) {\n sortedRows = this.customRowSorters[i](sortedRows);\n }\n return sortedRows;\n };\n\n /**\n * Applies current view sort to data model.\n */\n RowsManager.prototype.applySort = function() {\n var data = this.gantt.$scope.data;\n data.splice(0, data.length); // empty data.\n var rows = [];\n for (var i = 0, l = this.sortedRows.length; i < l; i++) {\n data.push(this.sortedRows[i].model);\n rows.push(this.sortedRows[i]);\n }\n\n this.rows = rows;\n };\n\n RowsManager.prototype.moveRow = function(row, targetRow) {\n var sortMode = this.gantt.options.value('sortMode');\n if (sortMode !== undefined) {\n // Apply current sort to model\n this.applySort();\n this.gantt.options.set('sortMode', undefined);\n }\n\n var targetRowIndex = this.rows.indexOf(targetRow);\n var rowIndex = this.rows.indexOf(row);\n\n if (targetRowIndex > -1 && rowIndex > -1 && targetRowIndex !== rowIndex) {\n arrays.moveToIndex(this.rows, rowIndex, targetRowIndex);\n arrays.moveToIndex(this.rowsTaskWatchers, rowIndex, targetRowIndex);\n arrays.moveToIndex(this.gantt.$scope.data, rowIndex, targetRowIndex);\n\n this.gantt.api.rows.raise.change(row);\n this.gantt.api.rows.raise.move(row, rowIndex, targetRowIndex);\n\n this.updateVisibleObjects();\n this.sortRows();\n }\n };\n\n RowsManager.prototype.updateVisibleObjects = function() {\n this.updateVisibleRows();\n this.updateVisibleTasks();\n };\n\n RowsManager.prototype.updateVisibleRows = function() {\n var oldFilteredRows = this.filteredRows;\n var filterRow = this.gantt.options.value('filterRow');\n if (filterRow) {\n if (typeof(filterRow) === 'object') {\n filterRow = {model: filterRow};\n }\n\n var filterRowComparator = this.gantt.options.value('filterRowComparator');\n if (typeof(filterRowComparator) === 'function') {\n //fix issue this.gantt is undefined\n //\n var gantt = this.gantt;\n filterRowComparator = function(actual, expected) {\n //fix actual.model is undefined\n return gantt.options.value('filterRowComparator')(actual, expected);\n };\n }\n\n this.filteredRows = this.filterImpl(this.sortedRows, filterRow, filterRowComparator);\n } else {\n this.filteredRows = this.sortedRows.slice(0);\n }\n\n var raiseEvent = !angular.equals(oldFilteredRows, this.filteredRows);\n this.customFilteredRows = this.applyCustomRowFilters(this.filteredRows);\n\n // TODO: Implement rowLimit like columnLimit to enhance performance for gantt with many rows\n this.visibleRows = this.customFilteredRows;\n\n this.gantt.api.rows.raise.displayed(this.sortedRows, this.filteredRows, this.visibleRows);\n\n if (raiseEvent) {\n this.gantt.api.rows.raise.filter(this.sortedRows, this.filteredRows);\n }\n };\n\n RowsManager.prototype.removeCustomRowFilter = function(filterFunction) {\n var i = this.customRowFilters.indexOf(filterFunction);\n if (i > -1) {\n this.customRowFilters.splice(i, 1);\n }\n };\n\n RowsManager.prototype.addCustomRowFilter = function(filterFunction) {\n this.customRowFilters.push(filterFunction);\n };\n\n RowsManager.prototype.applyCustomRowFilters = function(filteredRows) {\n for (var i = 0; i < this.customRowFilters.length; i++) {\n filteredRows = this.customRowFilters[i](filteredRows);\n }\n return filteredRows;\n };\n\n RowsManager.prototype.setFilterImpl = function(filterImpl) {\n if (!filterImpl) {\n this.filterImpl = this._defaultFilterImpl;\n } else {\n this.filterImpl = filterImpl;\n }\n };\n\n RowsManager.prototype.updateVisibleTasks = function() {\n var oldFilteredTasks = [];\n var filteredTasks = [];\n var tasks = [];\n var visibleTasks = [];\n\n for (var i = 0; i < this.rows.length; i++) {\n var row = this.rows[i];\n oldFilteredTasks = oldFilteredTasks.concat(row.filteredTasks);\n row.updateVisibleTasks();\n filteredTasks = filteredTasks.concat(row.filteredTasks);\n visibleTasks = visibleTasks.concat(row.visibleTasks);\n tasks = tasks.concat(row.tasks);\n }\n\n this.gantt.api.tasks.raise.displayed(tasks, filteredTasks, visibleTasks);\n\n var filterEvent = !angular.equals(oldFilteredTasks, filteredTasks);\n\n if (filterEvent) {\n this.gantt.api.tasks.raise.filter(tasks, filteredTasks, visibleTasks);\n }\n };\n\n // Update the position/size of all tasks in the Gantt\n RowsManager.prototype.updateTasksPosAndSize = function() {\n for (var i = 0, l = this.rows.length; i < l; i++) {\n this.rows[i].updateTasksPosAndSize();\n }\n };\n\n RowsManager.prototype.getExpandedFrom = function(from) {\n from = from ? moment(from) : from;\n\n var minRowFrom = from;\n for (var i = 0; i < this.rows.length; i++) {\n if (minRowFrom === undefined || minRowFrom > this.rows[i].from) {\n minRowFrom = this.rows[i];\n }\n }\n if (minRowFrom && (!from || minRowFrom < from)) {\n return minRowFrom;\n }\n return from;\n };\n\n RowsManager.prototype.getExpandedTo = function(to) {\n to = to ? moment(to) : to;\n\n var maxRowTo = to;\n for (var i = 0; i < this.rows.length; i++) {\n if (maxRowTo === undefined || maxRowTo < this.rows[i].to) {\n maxRowTo = this.rows[i].to;\n }\n }\n var toDate = this.gantt.options.value('toDate');\n if (maxRowTo && (!toDate || maxRowTo > toDate)) {\n return maxRowTo;\n }\n return to;\n };\n\n RowsManager.prototype.getDefaultFrom = function() {\n var defaultFrom;\n for (var i = 0; i < this.rows.length; i++) {\n if (defaultFrom === undefined || this.rows[i].from < defaultFrom) {\n defaultFrom = this.rows[i].from;\n }\n }\n return defaultFrom;\n };\n\n RowsManager.prototype.getDefaultTo = function() {\n var defaultTo;\n for (var i = 0; i < this.rows.length; i++) {\n if (defaultTo === undefined || this.rows[i].to > defaultTo) {\n defaultTo = this.rows[i].to;\n }\n }\n return defaultTo;\n };\n\n return RowsManager;\n }]);\n}());\n","(function() {\n 'use strict';\n angular.module('gantt').factory('GanttTask', ['moment', function(moment) {\n var Task = function(row, model) {\n this.rowsManager = row.rowsManager;\n this.row = row;\n this.model = model;\n this.truncatedLeft = false;\n this.truncatedRight = false;\n };\n\n Task.prototype.isMilestone = function() {\n return !this.model.to || this.model.from - this.model.to === 0;\n };\n\n Task.prototype.isOutOfRange = function() {\n var firstColumn = this.rowsManager.gantt.columnsManager.getFirstColumn();\n var lastColumn = this.rowsManager.gantt.columnsManager.getLastColumn();\n\n return (firstColumn === undefined || this.model.to < firstColumn.date ||\n lastColumn === undefined || this.model.from > lastColumn.endDate);\n };\n\n // Updates the pos and size of the task according to the from - to date\n Task.prototype.updatePosAndSize = function() {\n var oldViewLeft = this.left;\n var oldViewWidth = this.width;\n var oldTruncatedRight = this.truncatedRight;\n var oldTruncatedLeft = this.truncatedLeft;\n\n if (!this.isMoving && this.isOutOfRange()) {\n this.modelLeft = undefined;\n this.modelWidth = undefined;\n } else {\n this.modelLeft = this.rowsManager.gantt.getPositionByDate(this.model.from);\n this.modelWidth = this.rowsManager.gantt.getPositionByDate(this.model.to) - this.modelLeft;\n }\n\n var lastColumn = this.rowsManager.gantt.columnsManager.getLastColumn();\n var maxModelLeft = lastColumn ? lastColumn.left + lastColumn.width : 0;\n\n var modelLeft = this.modelLeft;\n var modelWidth = this.modelWidth;\n\n if (this.rowsManager.gantt.options.value('daily')) {\n modelLeft = this.rowsManager.gantt.getPositionByDate(moment(this.model.from).startOf('day'));\n modelWidth = this.rowsManager.gantt.getPositionByDate(moment(this.model.to).endOf('day')) - modelLeft;\n }\n\n if (modelLeft === undefined || modelWidth === undefined ||\n modelLeft + modelWidth < 0 || modelLeft > maxModelLeft) {\n this.left = undefined;\n this.width = undefined;\n } else {\n this.left = Math.min(Math.max(modelLeft, 0), this.rowsManager.gantt.width);\n if (modelLeft < 0) {\n this.truncatedLeft = true;\n if (modelWidth + modelLeft > this.rowsManager.gantt.width) {\n this.truncatedRight = true;\n this.width = this.rowsManager.gantt.width;\n } else {\n this.truncatedRight = false;\n this.width = modelWidth + modelLeft;\n }\n } else if (modelWidth + modelLeft > this.rowsManager.gantt.width) {\n this.truncatedRight = true;\n this.truncatedLeft = false;\n this.width = this.rowsManager.gantt.width - modelLeft;\n } else {\n this.truncatedLeft = false;\n this.truncatedRight = false;\n this.width = modelWidth;\n }\n\n if (this.width < 0) {\n this.left = this.left + this.width;\n this.width = -this.width;\n }\n }\n\n this.updateView();\n if (!this.rowsManager.gantt.isRefreshingColumns &&\n (oldViewLeft !== this.left ||\n oldViewWidth !== this.width ||\n oldTruncatedRight !== this.truncatedRight ||\n oldTruncatedLeft !== this.truncatedLeft)) {\n this.rowsManager.gantt.api.tasks.raise.viewChange(this);\n }\n };\n\n Task.prototype.updateView = function() {\n if (this.$element) {\n if (this.left === undefined || this.width === undefined) {\n this.$element.css('display', 'none');\n } else {\n this.$element.css({'left': this.left + 'px', 'width': this.width + 'px', 'display': ''});\n\n if (this.model.priority > 0) {\n var priority = this.model.priority;\n var children = this.$element.children();\n for (var i = 0; i < children.length; i++) {\n angular.element(children[i]).css('z-index', priority);\n }\n }\n\n this.$element.toggleClass('gantt-task-milestone', this.isMilestone());\n }\n }\n };\n\n Task.prototype.getBackgroundElement = function() {\n if (this.$element !== undefined) {\n var backgroundElement = this.$element[0].querySelector('.gantt-task-background');\n if (backgroundElement !== undefined) {\n backgroundElement = angular.element(backgroundElement);\n }\n return backgroundElement;\n }\n };\n\n Task.prototype.getContentElement = function() {\n if (this.$element !== undefined) {\n var contentElement = this.$element[0].querySelector('.gantt-task-content');\n if (contentElement !== undefined) {\n contentElement = angular.element(contentElement);\n }\n return contentElement;\n }\n };\n\n Task.prototype.getForegroundElement = function() {\n if (this.$element !== undefined) {\n var foregroundElement = this.$element[0].querySelector('.gantt-task-foreground');\n if (foregroundElement !== undefined) {\n foregroundElement = angular.element(foregroundElement);\n }\n return foregroundElement;\n }\n };\n\n // Expands the start of the task to the specified position (in em)\n Task.prototype.setFrom = function(x, magnetEnabled) {\n this.model.from = this.rowsManager.gantt.getDateByPosition(x, magnetEnabled);\n this.row.setFromTo();\n this.updatePosAndSize();\n };\n\n // Expands the end of the task to the specified position (in em)\n Task.prototype.setTo = function(x, magnetEnabled) {\n this.model.to = this.rowsManager.gantt.getDateByPosition(x, magnetEnabled);\n this.row.setFromTo();\n this.updatePosAndSize();\n };\n\n // Moves the task to the specified position (in em)\n Task.prototype.moveTo = function(x, magnetEnabled) {\n var newTaskRight;\n var newTaskLeft;\n if (x > this.modelLeft) {\n // Driven by right/to side.\n this.model.to = this.rowsManager.gantt.getDateByPosition(x + this.modelWidth, magnetEnabled);\n newTaskRight = this.rowsManager.gantt.getPositionByDate(this.model.to);\n newTaskLeft = newTaskRight - this.modelWidth;\n this.model.from = this.rowsManager.gantt.getDateByPosition(newTaskLeft, false);\n } else {\n // Drive by left/from side.\n this.model.from = this.rowsManager.gantt.getDateByPosition(x, magnetEnabled);\n newTaskLeft = this.rowsManager.gantt.getPositionByDate(this.model.from);\n newTaskRight = newTaskLeft + this.modelWidth;\n this.model.to = this.rowsManager.gantt.getDateByPosition(newTaskRight, false);\n }\n\n this.row.setFromTo();\n this.updatePosAndSize();\n };\n\n Task.prototype.clone = function() {\n return new Task(this.row, angular.copy(this.model));\n };\n\n return Task;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttBody', ['GanttBodyColumns', 'GanttBodyRows', 'GanttBodyBackground', 'GanttBodyForeground', function(BodyColumns, BodyRows, BodyBackground, BodyForeground) {\n var Body= function(gantt) {\n this.gantt = gantt;\n\n this.background = new BodyBackground(this);\n this.foreground = new BodyForeground(this);\n this.columns = new BodyColumns(this);\n this.rows = new BodyRows(this);\n };\n return Body;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttBodyBackground', [function() {\n var GanttBodyBackground = function(body) {\n this.body = body;\n };\n return GanttBodyBackground;\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttBodyColumns', [function() {\n var BodyColumns = function(body) {\n this.body = body;\n };\n return BodyColumns;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttBodyForeground', [function() {\n var GanttBodyForeground = function(body) {\n this.body = body;\n };\n return GanttBodyForeground;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttBodyRows', [function() {\n var BodyRows = function(body) {\n this.body = body;\n };\n return BodyRows;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttHeader', ['GanttHeaderColumns', function(HeaderColumns) {\n var Header = function(gantt) {\n this.gantt = gantt;\n this.columns = new HeaderColumns(this);\n\n this.getHeight = function() {\n return this.$element[0].offsetHeight;\n };\n };\n return Header;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttHeaderColumns', [function() {\n var HeaderColumns = function($element) {\n this.$element = $element;\n };\n return HeaderColumns;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttScroll', [function() {\n var Scroll = function(gantt) {\n this.gantt = gantt;\n\n this.gantt.api.registerEvent('scroll', 'scroll');\n\n this.gantt.api.registerMethod('scroll', 'to', Scroll.prototype.scrollTo, this);\n this.gantt.api.registerMethod('scroll', 'toDate', Scroll.prototype.scrollToDate, this);\n this.gantt.api.registerMethod('scroll', 'left', Scroll.prototype.scrollToLeft, this);\n this.gantt.api.registerMethod('scroll', 'right', Scroll.prototype.scrollToRight, this);\n\n this.gantt.api.registerMethod('scroll', 'setWidth', Scroll.prototype.setWidth, this);\n };\n\n Scroll.prototype.getScrollLeft = function() {\n if (this.$element === undefined) {\n return undefined;\n } else {\n if (this.cachedScrollLeft === undefined) {\n this.cachedScrollLeft = this.$element[0].scrollLeft;\n }\n\n return this.cachedScrollLeft;\n }\n };\n\n Scroll.prototype.getScrollWidth = function() {\n return this.$element === undefined ? undefined : this.$element[0].scrollWidth;\n };\n\n Scroll.prototype.getWidth = function() {\n return this.$element === undefined ? undefined : this.$element[0].offsetWidth;\n };\n\n Scroll.prototype.setWidth = function(width) {\n if (this.$element[0]) {\n this.$element[0].offsetWidth = width;\n }\n };\n\n Scroll.prototype.getBordersWidth = function() {\n if (this.$element === undefined) {\n return undefined;\n }\n\n if (this.$element[0].clientWidth) {\n return this.$element[0].offsetWidth - this.$element[0].clientWidth;\n } else {\n //fix for IE11\n var borderLeft = window.getComputedStyle(this.$element[0]).getPropertyValue('border-left-width') ? window.getComputedStyle(this.$element[0]).getPropertyValue('border-left-width').match(/\\d+/)[0] : 0;\n var borderRight = window.getComputedStyle(this.$element[0]).getPropertyValue('border-right-width') ? window.getComputedStyle(this.$element[0]).getPropertyValue('border-right-width').match(/\\d+/)[0] : 0;\n\n return parseInt(borderLeft) + parseInt(borderRight);\n }\n };\n\n Scroll.prototype.getBordersHeight = function() {\n return this.$element === undefined ? undefined : (this.$element[0].offsetHeight - this.$element[0].clientHeight);\n };\n\n Scroll.prototype.isVScrollbarVisible = function () {\n if (this.$element !== undefined) {\n return this.$element[0].scrollHeight > this.$element[0].offsetHeight;\n }\n };\n\n Scroll.prototype.isHScrollbarVisible = function () {\n if (this.$element !== undefined) {\n return this.$element[0].scrollWidth > this.$element[0].offsetWidth;\n }\n };\n\n /**\n * Scroll to a position\n *\n * @param {number} position Position to scroll to.\n */\n Scroll.prototype.scrollTo = function(position) {\n this.$element[0].scrollLeft = position;\n this.$element.triggerHandler('scroll');\n };\n\n /**\n * Scroll to the left side\n *\n * @param {number} offset Offset to scroll.\n */\n Scroll.prototype.scrollToLeft = function(offset) {\n this.$element[0].scrollLeft -= offset;\n this.$element.triggerHandler('scroll');\n };\n\n /**\n * Scroll to the right side\n *\n * @param {number} offset Offset to scroll.\n */\n Scroll.prototype.scrollToRight = function(offset) {\n this.$element[0].scrollLeft += offset;\n this.$element.triggerHandler('scroll');\n };\n\n /**\n * Scroll to a date\n *\n * @param {moment} date moment to scroll to.\n */\n Scroll.prototype.scrollToDate = function(date) {\n var position = this.gantt.getPositionByDate(date);\n\n if (position !== undefined) {\n this.$element[0].scrollLeft = position - this.$element[0].offsetWidth / 2;\n }\n };\n\n return Scroll;\n }]);\n}());\n","(function(){\n 'use strict';\n\n angular.module('gantt').factory('GanttSide', [function() {\n var Side= function(gantt) {\n this.gantt = gantt;\n };\n Side.prototype.getWidth = function() {\n if (this.gantt.options.value('showSide')) {\n var width = this.gantt.options.value('sideWidth');\n if (width === undefined && this.$element !== undefined) {\n if (this.$element.css('width') !== undefined) {\n this.$element.css('width', '');\n }\n }\n if (this.$element !== undefined) {\n width = this.$element[0].offsetWidth;\n }\n if (width !== undefined) {\n return width;\n }\n }\n return 0;\n };\n Side.prototype.show = function(value) {\n if (this.$element !== undefined) {\n this.$element.toggleClass('ng-hide', !value);\n }\n };\n Side.prototype.isShown = function() {\n if (this.$element !== undefined) {\n return !this.$element.hasClass('ng-hide');\n }\n };\n\n return Side;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttTimespan', [function() {\n var Timespan = function(gantt, model) {\n this.gantt = gantt;\n this.model = model;\n };\n\n // Updates the pos and size of the timespan according to the from - to date\n Timespan.prototype.updatePosAndSize = function() {\n this.modelLeft = this.gantt.getPositionByDate(this.model.from);\n this.modelWidth = this.gantt.getPositionByDate(this.model.to) - this.modelLeft;\n\n var lastColumn = this.gantt.columnsManager.getLastColumn();\n var maxModelLeft = lastColumn ? lastColumn.left + lastColumn.width : 0;\n\n if (this.modelLeft + this.modelWidth < 0 || this.modelLeft > maxModelLeft) {\n this.left = undefined;\n this.width = undefined;\n } else {\n this.left = Math.min(Math.max(this.modelLeft, 0), this.gantt.width);\n if (this.modelLeft < 0) {\n this.truncatedLeft = true;\n if (this.modelWidth + this.modelLeft > this.gantt.width) {\n this.truncatedRight = true;\n this.width = this.gantt.width;\n } else {\n this.truncatedRight = false;\n this.width = this.modelWidth + this.modelLeft;\n }\n } else if (this.modelWidth + this.modelLeft > this.gantt.width) {\n this.truncatedRight = true;\n this.truncatedLeft = false;\n this.width = this.gantt.width - this.modelLeft;\n } else {\n this.truncatedLeft = false;\n this.truncatedRight = false;\n this.width = this.modelWidth;\n }\n\n if (this.width < 0) {\n this.left = this.left + this.width;\n this.width = -this.width;\n }\n }\n\n\n this.updateView();\n };\n\n Timespan.prototype.updateView = function() {\n if (this.$element) {\n if (this.left === undefined || this.width === undefined) {\n this.$element.css('display', 'none');\n } else {\n this.$element.css('display', '');\n this.$element.css('left', this.left + 'px');\n this.$element.css('width', this.width + 'px');\n }\n }\n };\n\n // Expands the start of the timespan to the specified position (in em)\n Timespan.prototype.setFrom = function(x) {\n this.from = this.gantt.getDateByPosition(x);\n this.updatePosAndSize();\n };\n\n // Expands the end of the timespan to the specified position (in em)\n Timespan.prototype.setTo = function(x) {\n this.to = this.gantt.getDateByPosition(x);\n this.updatePosAndSize();\n };\n\n // Moves the timespan to the specified position (in em)\n Timespan.prototype.moveTo = function(x) {\n this.from = this.gantt.getDateByPosition(x);\n this.to = this.gantt.getDateByPosition(x + this.width);\n this.updatePosAndSize();\n };\n\n Timespan.prototype.clone = function() {\n return new Timespan(this.gantt, angular.copy(this.model));\n };\n\n return Timespan;\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('GanttTimespansManager', ['GanttTimespan', function(Timespan) {\n var GanttTimespansManager = function(gantt) {\n var self = this;\n\n this.gantt = gantt;\n\n this.timespansMap = {};\n this.timespans = [];\n\n this.gantt.$scope.$watchCollection('timespans', function(newValue) {\n self.clearTimespans();\n self.loadTimespans(newValue);\n });\n\n this.gantt.api.registerMethod('timespans', 'load', this.loadTimespans, this);\n this.gantt.api.registerMethod('timespans', 'remove', this.removeTimespans, this);\n this.gantt.api.registerMethod('timespans', 'clear', this.clearTimespans, this);\n\n this.gantt.api.registerEvent('timespans', 'add');\n this.gantt.api.registerEvent('timespans', 'remove');\n this.gantt.api.registerEvent('timespans', 'change');\n };\n\n // Adds or updates timespans\n GanttTimespansManager.prototype.loadTimespans = function(timespans) {\n if (!angular.isArray(timespans)) {\n timespans = timespans !== undefined ? [timespans] : [];\n }\n\n this.gantt.$scope.timespans = timespans;\n for (var i = 0, l = timespans.length; i < l; i++) {\n var timespanModel = timespans[i];\n this.gantt.objectModel.cleanTimespan(timespanModel);\n this.loadTimespan(timespanModel);\n }\n };\n\n // Adds a timespan or merges the timespan if there is already one with the same id\n GanttTimespansManager.prototype.loadTimespan = function(timespanModel) {\n // Copy to new timespan (add) or merge with existing (update)\n var timespan, isUpdate = false;\n\n if (timespanModel.id in this.timespansMap) {\n timespan = this.timespansMap[timespanModel.id];\n timespan.model = timespanModel;\n isUpdate = true;\n this.gantt.api.timespans.raise.change(timespan);\n } else {\n timespan = new Timespan(this.gantt, timespanModel);\n this.timespansMap[timespanModel.id] = timespan;\n this.timespans.push(timespan);\n this.gantt.api.timespans.raise.add(timespan);\n }\n\n timespan.updatePosAndSize();\n return isUpdate;\n };\n\n GanttTimespansManager.prototype.removeTimespans = function(timespans) {\n if (!angular.isArray(timespans)) {\n timespans = [timespans];\n }\n\n for (var i = 0, l = timespans.length; i < l; i++) {\n var timespanData = timespans[i];\n // Delete the timespan\n this.removeTimespan(timespanData.id);\n }\n this.updateVisibleObjects();\n };\n\n GanttTimespansManager.prototype.removeTimespan = function(timespanId) {\n if (timespanId in this.timespansMap) {\n delete this.timespansMap[timespanId]; // Remove from map\n\n var removedTimespan;\n var timespan;\n for (var i = this.timespans.length - 1; i >= 0; i--) {\n timespan = this.timespans[i];\n if (timespan.model.id === timespanId) {\n removedTimespan = timespan;\n this.timespans.splice(i, 1); // Remove from array\n break;\n }\n }\n\n this.gantt.api.timespans.raise.remove(removedTimespan);\n return removedTimespan;\n }\n\n return undefined;\n };\n\n // Removes all timespans\n GanttTimespansManager.prototype.clearTimespans = function() {\n this.timespansMap = {};\n this.timespans = [];\n };\n\n GanttTimespansManager.prototype.updateTimespansPosAndSize = function() {\n for (var i = 0, l = this.timespans.length; i < l; i++) {\n this.timespans[i].updatePosAndSize();\n }\n };\n\n return GanttTimespansManager;\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').service('ganttArrays', [function() {\n return {\n moveToIndex: function(array, oldIndex, newIndex) {\n if (newIndex >= array.length) {\n var k = newIndex - array.length;\n while ((k--) + 1) {\n array.push(undefined);\n }\n }\n array.splice(newIndex, 0, array.splice(oldIndex, 1)[0]);\n return array;\n },\n getRemovedIds: function(newArray, oldArray, idProperty) {\n if (idProperty === undefined) {\n idProperty = 'id';\n }\n\n var i, l;\n var removedIds = [];\n\n if (oldArray !== undefined) {\n for (i = 0, l = oldArray.length; i < l; i++) {\n removedIds.push(oldArray[i][idProperty]);\n }\n }\n\n if (newArray !== undefined) {\n for (i = 0, l = newArray.length; i < l; i++) {\n var newObject = newArray[i];\n\n if (newObject[idProperty] !== undefined) {\n var newObjectIndex = removedIds.indexOf(newObject[idProperty]);\n if (newObjectIndex > -1) {\n removedIds.splice(newObjectIndex, 1);\n }\n }\n }\n }\n\n return removedIds;\n },\n indexOfId: function(array, value, idProperties) {\n var i;\n if (idProperties === undefined) {\n idProperties = 'id';\n } else if (idProperties instanceof Array) {\n for (i = array.length - 1; i >= 0; i--) {\n var arrayValue = array[i];\n for (var k = 0, l = idProperties.length; k < l; k++) {\n arrayValue = arrayValue[idProperties[k]];\n }\n if (arrayValue === value) {\n return i;\n }\n }\n return -1;\n }\n for (i = array.length - 1; i >= 0; i--) {\n if (array[i][idProperties] === value) {\n return i;\n }\n }\n return -1;\n },\n removeId: function(array, value, idProperties) {\n var indexOf = this.indexOfId(array, value, idProperties);\n if (indexOf > -1) {\n return array.splice(indexOf, 1)[0];\n }\n },\n remove: function(array, value) {\n var index = array.indexOf(value);\n if (index > -1) {\n array.splice(index, 1);\n return true;\n }\n return false;\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').service('ganttBinarySearch', [ function() {\n // Returns the object on the left and right in an array using the given cmp function.\n // The compare function defined which property of the value to compare (e.g.: c => c.left)\n\n return {\n getIndicesOnly: function(input, value, comparer, strict) {\n var lo = -1, hi = input.length;\n while (hi - lo > 1) {\n var mid = Math.floor((lo + hi) / 2);\n if (strict ? comparer(input[mid]) < value : comparer(input[mid]) <= value) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n if (!strict && input[lo] !== undefined && comparer(input[lo]) === value) {\n hi = lo;\n }\n return [lo, hi];\n },\n get: function(input, value, comparer, strict) {\n var res = this.getIndicesOnly(input, value, comparer, strict);\n return [input[res[0]], input[res[1]]];\n }\n };\n }]);\n}());\n","(function() {\n 'use strict';\n\n angular.module('gantt').factory('GanttHierarchy', [function() {\n var Hierarchy = function() {\n var self = this;\n\n var nameToRow = {};\n\n var idToRow = {};\n\n var nameToChildren = {};\n var idToChildren = {};\n\n var nameToParent = {};\n var idToParent = {};\n\n var registerChildRow = function(row, childRow) {\n if (childRow !== undefined) {\n var nameChildren = nameToChildren[row.model.name];\n if (nameChildren === undefined) {\n nameChildren = [];\n nameToChildren[row.model.name] = nameChildren;\n }\n nameChildren.push(childRow);\n\n\n var idChildren = idToChildren[row.model.id];\n if (idChildren === undefined) {\n idChildren = [];\n idToChildren[row.model.id] = idChildren;\n }\n idChildren.push(childRow);\n\n nameToParent[childRow.model.name] = row;\n idToParent[childRow.model.id] = row;\n }\n };\n\n this.refresh = function(rows) {\n nameToRow = {};\n idToRow = {};\n\n nameToChildren = {};\n idToChildren = {};\n\n nameToParent = {};\n idToParent = {};\n\n var row;\n\n for (var i = 0; i < rows.length; i++) {\n row = rows[i];\n nameToRow[row.model.name] = row;\n idToRow[row.model.id] = row;\n }\n\n for (i = 0; i < rows.length; i++) {\n row = rows[i];\n if (row.model.parent !== undefined) {\n var parentRow = nameToRow[row.model.parent];\n if (parentRow === undefined) {\n parentRow = idToRow[row.model.parent];\n }\n\n if (parentRow !== undefined) {\n registerChildRow(parentRow, row);\n }\n }\n\n if (row.model.children !== undefined) {\n var children = row.model.children;\n for (var j = 0; j<children.length; j++) {\n var childRowNameOrId = children[j];\n var childRow = nameToRow[childRowNameOrId];\n if (childRow === undefined) {\n childRow = idToRow[childRowNameOrId];\n }\n\n if (childRow !== undefined) {\n registerChildRow(row, childRow);\n }\n }\n }\n }\n\n var rootRows = [];\n for (i = 0; i < rows.length; i++) {\n row = rows[i];\n if (self.parent(row) === undefined) {\n rootRows.push(row);\n }\n }\n\n return rootRows;\n };\n\n this.children = function(row) {\n var children = idToChildren[row.model.id];\n return children;\n };\n\n this.descendants = function(row) {\n var descendants = [];\n\n var children = self.children(row);\n descendants.push.apply(descendants, children);\n if (children !== undefined) {\n for (var i=0; i<children.length; i++) {\n var childDescendants = self.descendants(children[i]);\n descendants.push.apply(descendants, childDescendants);\n }\n }\n\n return descendants;\n };\n\n this.parent = function(row) {\n var parent = idToParent[row.model.id];\n return parent;\n };\n\n this.ancestors = function(row) {\n var ancestors = [];\n\n var parent = self.parent(row);\n while (parent !== undefined) {\n ancestors.push(parent);\n parent = self.parent(parent);\n }\n\n return ancestors;\n };\n };\n\n return Hierarchy;\n }]);\n}());\n","(function() {\n 'use strict';\n angular.module('gantt').service('ganttUtils', [function() {\n return {\n createBoundedWrapper: function(object, method) {\n return function() {\n return method.apply(object, arguments);\n };\n },\n firstProperty: function(objects, propertyName, defaultValue) {\n for (var i = 0, l = objects.length; i < l; i++) {\n var object = objects[i];\n if (object !== undefined && propertyName in object) {\n if (object[propertyName] !== undefined) {\n return object[propertyName];\n }\n }\n }\n return defaultValue;\n },\n angularIndexOf: function(arr, obj) {\n for (var i = 0; i < arr.length; i++) {\n if (angular.equals(arr[i], obj)) {\n return i;\n }\n }\n return -1;\n },\n random4: function() {\n return Math.floor((1 + Math.random()) * 0x10000)\n .toString(16)\n .substring(1);\n },\n randomUuid: function() {\n return this.random4() + this.random4() + '-' + this.random4() + '-' + this.random4() + '-' +\n this.random4() + '-' + this.random4() + this.random4() + this.random4();\n },\n newId: (function() {\n var seedId = new Date().getTime();\n return function() {\n return seedId += 1;\n };\n })()\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').filter('ganttColumnLimit', [ 'ganttBinarySearch', function(bs) {\n // Returns only the columns which are visible on the screen\n var leftComparator = function(c) {\n return c.left;\n };\n\n return function(input, gantt) {\n var scrollLeft = gantt.scroll.getScrollLeft();\n var scrollContainerWidth = gantt.getWidth() - gantt.side.getWidth();\n\n if (scrollContainerWidth > 0) {\n var start = bs.getIndicesOnly(input, scrollLeft, leftComparator)[0];\n var end = bs.getIndicesOnly(input, scrollLeft + scrollContainerWidth, leftComparator)[1];\n return input.slice(start, end);\n } else {\n return input.slice();\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').filter('ganttTaskLimit', [function() {\n // Returns only the tasks which are visible on the screen\n // Use the task width and position to decide if a task is still visible\n\n return function(input, gantt) {\n var firstColumn = gantt.columnsManager.getFirstColumn();\n var lastColumn = gantt.columnsManager.getLastColumn();\n\n if (firstColumn !== undefined && lastColumn !== undefined) {\n var fromDate = firstColumn.date;\n var toDate = lastColumn.endDate;\n\n var res = [];\n\n var scrollLeft = gantt.scroll.getScrollLeft();\n var scrollContainerWidth = gantt.getWidth() - gantt.side.getWidth();\n\n for (var i = 0, l = input.length; i < l; i++) {\n var task = input[i];\n\n if (task.active) {\n res.push(task);\n } else {\n // If the task can be drawn with gantt columns only.\n if (task.model.to >= fromDate && task.model.from <= toDate) {\n\n if (task.left === undefined) {\n task.updatePosAndSize();\n }\n\n // If task has a visible part on the screen\n if (!scrollContainerWidth ||\n task.left >= scrollLeft && task.left <= scrollLeft + scrollContainerWidth ||\n task.left + task.width >= scrollLeft && task.left + task.width <= scrollLeft + scrollContainerWidth ||\n task.left < scrollLeft && task.left + task.width > scrollLeft + scrollContainerWidth) {\n\n res.push(task);\n }\n }\n }\n }\n\n return res;\n } else {\n return input.splice();\n }\n };\n }]);\n}());\n\n","(function() {\n 'use strict';\n\n angular.module('gantt').directive('ganttResizer', ['$document', '$parse', '$timeout', 'ganttMouseOffset', function($document, $parse, $timeout, mouseOffset) {\n return {\n restrict: 'A',\n require: '^gantt',\n scope: {\n targetElement: '=ganttResizer',\n enabled: '@?ganttResizerEnabled'\n },\n link: function ($scope, $element, $attrs, ganttCtrl) {\n var api = ganttCtrl.gantt.api;\n var eventTopic = $attrs.ganttResizerEventTopic;\n\n if ($scope.enabled === undefined) {\n $scope.enabled = true;\n }\n\n function getWidth() {\n return ganttCtrl.gantt.options.value($attrs.resizerWidth);\n }\n\n function setWidth(width) {\n if (width !== getWidth()) {\n ganttCtrl.gantt.options.set($attrs.resizerWidth, width);\n\n if (eventTopic !== undefined) {\n api[eventTopic].raise.resize(width);\n }\n\n $timeout(function() {\n ganttCtrl.gantt.columnsManager.updateColumnsMeta();\n });\n }\n }\n\n function dblclick(event) {\n event.preventDefault();\n setWidth(undefined);\n }\n\n function mousemove(event) {\n $scope.$evalAsync(function (){\n var offset = mouseOffset.getOffsetForElement($scope.targetElement[0], event);\n var maxWidth = ganttCtrl.gantt.getWidth()-ganttCtrl.gantt.scroll.getBordersWidth();\n var width = Math.min(Math.max(offset.x, 0), maxWidth);\n setWidth(width);\n });\n }\n\n function mouseup() {\n if (eventTopic !== undefined) {\n api[eventTopic].raise.resizeEnd(getWidth());\n }\n $document.unbind('mousemove', mousemove);\n $document.unbind('mouseup', mouseup);\n }\n\n\n function mousedown(event) {\n event.preventDefault();\n\n if (eventTopic !== undefined) {\n api[eventTopic].raise.resizeBegin(getWidth());\n }\n $document.on('mousemove', mousemove);\n $document.on('mouseup', mouseup);\n }\n\n $attrs.$observe('ganttResizerEnabled', function(value) {\n $scope.enabled = $parse(value)();\n });\n\n $scope.$watch('enabled', function (value) {\n if (value === undefined) {\n value = true;\n }\n\n $element.toggleClass('gantt-resizer-enabled', value);\n\n if (value) {\n $element.on('dblclick', dblclick);\n $element.on('mousedown', mousedown);\n } else {\n $element.off('dblclick', dblclick);\n $element.off('mousedown', mousedown);\n }\n });\n\n $scope.$watch(function() {\n return getWidth();\n }, function(newValue, oldValue) {\n if (newValue !== oldValue) {\n $scope.targetElement.css('width', newValue + 'px');\n // Setting width again is required when min-width of max-width is set on targetElement.\n // This avoid going to a smaller or bigger value than targetElement capabilities.\n // Call of 'offsetWidth' is slow. Behaviour needs to be improved.\n if ($scope.targetElement[0].offsetWidth > 0) {\n setWidth($scope.targetElement[0].offsetWidth);\n }\n }\n });\n\n if (eventTopic) {\n api.registerEvent(eventTopic, 'resize');\n api.registerEvent(eventTopic, 'resizeBegin');\n api.registerEvent(eventTopic, 'resizeEnd');\n api.registerMethod(eventTopic, 'setWidth', setWidth, this);\n api.registerMethod(eventTopic, 'getWidth', getWidth, this);\n }\n }\n };\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttHorizontalScrollReceiver', function() {\n // The element with this attribute will scroll at the same time as the scrollSender element\n\n return {\n restrict: 'A',\n require: '^ganttScrollManager',\n link: function(scope, element, attrs, ganttScrollManagerCtrl) {\n ganttScrollManagerCtrl.registerHorizontalReceiver(element);\n }\n };\n });\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttScrollManager', function() {\n // The element with this attribute will scroll at the same time as the scrollSender element\n\n return {\n restrict: 'A',\n scope: {},\n controller: ['$scope', function($scope) {\n $scope.horizontal = [];\n $scope.vertical = [];\n\n this.registerVerticalReceiver = function (element) {\n element.css('position', 'relative');\n $scope.vertical.push(element[0]);\n };\n\n this.registerHorizontalReceiver = function (element) {\n element.css('position', 'relative');\n $scope.horizontal.push(element[0]);\n };\n\n this.getHorizontalRecievers = function() {\n return $scope.horizontal;\n };\n\n this.getVerticalRecievers = function() {\n return $scope.vertical;\n };\n }]\n };\n });\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttScrollSender', [function() {\n // Updates the element which are registered for the horizontal or vertical scroll event\n\n return {\n restrict: 'A',\n require: ['^gantt', '^ganttScrollManager'],\n link: function(scope, element, attrs, controllers) {\n var el = element[0];\n\n var updateListeners = function() {\n var i, l;\n\n var vertical = controllers[1].getVerticalRecievers();\n for (i = 0, l = vertical.length; i < l; i++) {\n var vElement = vertical[i];\n if (vElement.parentNode.scrollTop !== el.scrollTop) {\n vElement.parentNode.scrollTop = el.scrollTop;\n }\n }\n\n var horizontal = controllers[1].getHorizontalRecievers();\n for (i = 0, l = horizontal.length; i < l; i++) {\n var hElement = horizontal[i];\n if (hElement.parentNode.scrollLeft !== el.scrollLeft) {\n hElement.parentNode.scrollLeft = el.scrollLeft;\n }\n }\n };\n\n element.bind('scroll', updateListeners);\n\n scope.$watch(function() {\n return controllers[0].gantt.width;\n }, function(newValue, oldValue) {\n if (newValue !== oldValue) {\n var horizontal = controllers[1].getHorizontalRecievers();\n for (var i = 0, l = horizontal.length; i < l; i++) {\n var hElement = horizontal[i];\n hElement.style.width = newValue + 'px';\n }\n }\n });\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttScrollable', ['GanttDirectiveBuilder', '$timeout', 'ganttDebounce', 'moment', function(Builder, $timeout, debounce, moment) {\n var builder = new Builder('ganttScrollable');\n builder.controller = function($scope, $element) {\n $scope.gantt.scroll.$element = $element;\n var lastScrollLeft;\n var autoExpandTimer;\n\n var autoExpandColumns = function(el, date, direction) {\n var autoExpand = $scope.gantt.options.value('autoExpand');\n if (autoExpand !== 'both' && autoExpand !== true && autoExpand !== direction) {\n return;\n }\n\n var from, to;\n\n var viewScale = $scope.gantt.options.value('viewScale');\n viewScale = viewScale.trim();\n if (viewScale.charAt(viewScale.length - 1) === 's') {\n viewScale = viewScale.substring(0, viewScale.length - 1);\n }\n var viewScaleValue;\n var viewScaleUnit;\n var splittedViewScale;\n\n if (viewScale) {\n splittedViewScale = viewScale.split(' ');\n }\n if (splittedViewScale && splittedViewScale.length > 1) {\n viewScaleValue = parseFloat(splittedViewScale[0]);\n viewScaleUnit = splittedViewScale[splittedViewScale.length - 1];\n } else {\n viewScaleValue = 1;\n viewScaleUnit = viewScale;\n }\n\n if (direction === 'left') {\n from = moment(date).add(-5 * viewScaleValue, viewScaleUnit);\n $scope.fromDate = from;\n } else {\n to = moment(date).add(5 * viewScaleValue, viewScaleUnit);\n $scope.toDate = to;\n }\n\n $scope.gantt.api.scroll.raise.scroll(el.scrollLeft, date, direction);\n };\n\n $element.bind('scroll', debounce(function() {\n var el = $element[0];\n var currentScrollLeft = el.scrollLeft;\n var direction;\n var date;\n\n $scope.gantt.scroll.cachedScrollLeft = currentScrollLeft;\n $scope.gantt.columnsManager.updateVisibleColumns();\n $scope.gantt.rowsManager.updateVisibleObjects();\n\n if (currentScrollLeft < lastScrollLeft && currentScrollLeft === 0) {\n direction = 'left';\n date = $scope.gantt.columnsManager.from;\n } else if (currentScrollLeft > lastScrollLeft && el.offsetWidth + currentScrollLeft >= el.scrollWidth - 1) {\n direction = 'right';\n date = $scope.gantt.columnsManager.to;\n }\n\n lastScrollLeft = currentScrollLeft;\n\n if (date !== undefined) {\n if (autoExpandTimer) {\n $timeout.cancel(autoExpandTimer);\n }\n\n autoExpandTimer = $timeout(function() {\n autoExpandColumns(el, date, direction);\n }, 300);\n } else {\n $scope.gantt.api.scroll.raise.scroll(currentScrollLeft);\n }\n }, 5));\n\n $scope.getScrollableCss = function() {\n var css = {};\n\n var maxHeight = $scope.gantt.options.value('maxHeight');\n if (maxHeight > 0) {\n css['max-height'] = maxHeight - $scope.gantt.header.getHeight() + 'px';\n css['overflow-y'] = 'auto';\n\n if ($scope.gantt.scroll.isVScrollbarVisible()) {\n css['border-right'] = 'none';\n }\n }\n\n var columnWidth = this.gantt.options.value('columnWidth');\n var bodySmallerThanGantt = $scope.gantt.width === 0 ? false: $scope.gantt.width < $scope.gantt.getWidth() - $scope.gantt.side.getWidth();\n if (columnWidth !== undefined && bodySmallerThanGantt) {\n css.width = ($scope.gantt.width + this.gantt.scroll.getBordersWidth()) + 'px';\n }\n\n return css;\n };\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttVerticalScrollReceiver', function() {\n // The element with this attribute will scroll at the same time as the scrollSender element\n\n return {\n restrict: 'A',\n require: '^ganttScrollManager',\n link: function(scope, element, attrs, ganttScrollManagerCtrl) {\n ganttScrollManagerCtrl.registerVerticalReceiver(element);\n }\n };\n });\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttElementHeightListener', [function() {\n return {\n restrict: 'A',\n controller: ['$scope', '$element', '$attrs', function($scope, $element, $attrs) {\n var scopeVariable = $attrs.ganttElementHeightListener;\n if (scopeVariable === '') {\n scopeVariable = 'ganttElementHeight';\n }\n\n var effectiveScope = $scope;\n\n while(scopeVariable.indexOf('$parent.') === 0) {\n scopeVariable = scopeVariable.substring('$parent.'.length);\n effectiveScope = effectiveScope.$parent;\n }\n\n effectiveScope.$watch(function() {\n return $element[0].offsetHeight;\n }, function(newValue) {\n if (newValue > 0) {\n effectiveScope[scopeVariable] = newValue;\n }\n });\n }]\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttElementWidthListener', [function() {\n return {\n restrict: 'A',\n controller: ['$scope', '$element', '$attrs', function($scope, $element, $attrs) {\n var scopeVariable = $attrs.ganttElementWidthListener;\n if (scopeVariable === '') {\n scopeVariable = 'ganttElementWidth';\n }\n\n var effectiveScope = $scope;\n\n while(scopeVariable.indexOf('$parent.') === 0) {\n scopeVariable = scopeVariable.substring('$parent.'.length);\n effectiveScope = effectiveScope.$parent;\n }\n\n effectiveScope.$watch(function() {\n return $element[0].offsetWidth;\n }, function(newValue) {\n if (newValue > 0) {\n effectiveScope[scopeVariable] = newValue;\n }\n });\n }]\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttBody', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttBody');\n builder.controller = function($scope, $element) {\n $scope.gantt.body.$element = $element;\n $scope.gantt.body.$scope = $scope;\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttBodyBackground', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttBodyBackground');\n builder.controller = function($scope, $element) {\n $scope.gantt.body.background.$element = $element;\n $scope.gantt.body.background.$scope = $scope;\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttBodyColumns', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttBodyColumns');\n builder.controller = function($scope, $element) {\n $scope.gantt.body.columns.$element = $element;\n $scope.gantt.body.background.$scope = $scope;\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttBodyForeground', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttBodyForeground');\n builder.controller = function($scope, $element) {\n $scope.gantt.body.foreground.$element = $element;\n $scope.gantt.body.foreground.$scope = $scope;\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttBodyRows', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttBodyRows');\n builder.controller = function($scope, $element) {\n $scope.gantt.body.rows.$element = $element;\n $scope.gantt.body.rows.$scope = $scope;\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttColumn', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttColumn');\n builder.controller = function($scope, $element) {\n $scope.column.$element = $element;\n $scope.column.$scope = $scope;\n $scope.column.updateView();\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttColumnHeader', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttColumnHeader');\n builder.controller = function($scope, $element) {\n $scope.column.$element = $element;\n $scope.column.$scope = $scope;\n $scope.column.updateView();\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttHeader', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttHeader');\n builder.controller = function($scope, $element) {\n $scope.gantt.header.$element = $element;\n $scope.gantt.header.$scope = $scope;\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttHeaderColumns', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttHeaderColumns');\n builder.controller = function($scope, $element) {\n $scope.gantt.header.columns.$element = $element;\n $scope.gantt.header.columns.$scope = $scope;\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttRow', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttRow');\n builder.controller = function($scope, $element) {\n $scope.row.$element = $element;\n $scope.row.$scope = $scope;\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttRowBackground', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttRowBackground');\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttRowLabel', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttRowLabel');\n builder.restrict = 'A';\n builder.templateUrl = undefined;\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttScrollableHeader', ['GanttDirectiveBuilder', 'ganttLayout', function(Builder, layout) {\n var builder = new Builder('ganttScrollableHeader');\n builder.controller = function($scope) {\n var scrollBarWidth = layout.getScrollBarWidth();\n //var oldMaxHeightActivated = false;\n $scope.getScrollableHeaderCss = function() {\n var css = {};\n\n var maxHeightActivated = $scope.gantt.scroll.isVScrollbarVisible();\n var vScrollbarWidth = maxHeightActivated ? scrollBarWidth: 0;\n var columnWidth = this.gantt.options.value('columnWidth');\n var bodySmallerThanGantt = $scope.gantt.width === 0 ? false: $scope.gantt.width < $scope.gantt.getWidth() - $scope.gantt.side.getWidth();\n\n if (columnWidth !== undefined && bodySmallerThanGantt) {\n css.width = ($scope.gantt.width - vScrollbarWidth + this.gantt.scroll.getBordersWidth()) + 'px';\n } else if (maxHeightActivated) {\n css.width = $scope.gantt.getWidth() - $scope.gantt.side.getWidth() - vScrollbarWidth + 'px';\n }\n\n /*\n if (oldMaxHeightActivated !== maxHeightActivated) {\n oldMaxHeightActivated = maxHeightActivated;\n $scope.gantt.columnsManager.updateColumnsMeta();\n }\n */\n\n return css;\n };\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttSide', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttSide');\n builder.controller = function($scope, $element) {\n $scope.gantt.side.$element = $element;\n $scope.gantt.side.$scope = $scope;\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttSideBackground', ['GanttDirectiveBuilder', 'ganttLayout', function(Builder, layout) {\n var builder = new Builder('ganttSideBackground');\n builder.controller = function($scope) {\n var hScrollBarHeight = layout.getScrollBarHeight();\n\n $scope.getMaxHeightCss = function() {\n var css = {};\n\n if ($scope.maxHeight) {\n var bodyScrollBarHeight = $scope.gantt.scroll.isHScrollbarVisible() ? hScrollBarHeight : 0;\n css['max-height'] = $scope.maxHeight - bodyScrollBarHeight - $scope.gantt.header.getHeight() + 'px';\n }\n\n return css;\n };\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttSideContent', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttSideContent');\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttTask', ['GanttDirectiveBuilder', 'moment', function(Builder, moment) {\n var builder = new Builder('ganttTask');\n builder.controller = function($scope, $element) {\n $scope.task.$element = $element;\n $scope.task.$scope = $scope;\n\n $scope.getTaskContent = function() {\n if ($scope.task.model.content !== undefined) {\n return $scope.task.model.content;\n }\n return $scope.task.rowsManager.gantt.options.value('taskContent');\n };\n\n $scope.simplifyMoment = function(d) {\n return moment.isMoment(d) ? d.unix() : d;\n };\n\n $scope.$watchGroup(['simplifyMoment(task.model.from)', 'simplifyMoment(task.model.to)'], function() {\n $scope.task.updatePosAndSize();\n });\n };\n return builder.build();\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttTaskBackground', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTaskBackground');\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttTaskContent', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTaskContent');\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttTaskForeground', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTaskForeground');\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttTimeFrame', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTimeFrame');\n builder.controller = function($scope, $element) {\n $scope.timeFrame.$element = $element;\n $scope.timeFrame.$scope = $scope;\n $scope.timeFrame.updateView();\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').directive('ganttTimespan', ['GanttDirectiveBuilder', function(Builder) {\n var builder = new Builder('ganttTimespan');\n builder.controller = function($scope, $element) {\n $scope.timespan.$element = $element;\n $scope.timespan.$scope = $scope;\n $scope.timespan.updateView();\n };\n return builder.build();\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').factory('ganttDebounce', ['$timeout', function($timeout) {\n function debounce(fn, timeout, invokeApply) {\n var nthCall = 0;\n return function() {\n var self = this;\n var argz = arguments;\n nthCall++;\n var later = (function(version) {\n return function() {\n if (version === nthCall) {\n return fn.apply(self, argz);\n }\n };\n })(nthCall);\n return $timeout(later, timeout, invokeApply === undefined ? true: invokeApply);\n };\n }\n\n return debounce;\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').service('GanttDirectiveBuilder', ['$templateCache', function($templateCache) {\n var DirectiveBuilder = function DirectiveBuilder(directiveName, templateUrl, require, restrict) {\n var self = this;\n\n this.directiveName = directiveName;\n this.templateUrl = templateUrl === undefined ? 'template/' + directiveName + '.tmpl.html' : templateUrl;\n this.require = require === undefined ? '^gantt' : require;\n this.restrict = restrict === undefined ? 'E' : restrict;\n this.scope = false;\n this.transclude = true;\n this.replace = true;\n\n this.build = function() {\n var directiveName = self.directiveName;\n var templateUrl = self.templateUrl;\n var controllerFunction = self.controller;\n\n var directive = {\n restrict: self.restrict,\n require: self.require,\n transclude: self.transclude,\n replace: self.replace,\n scope: self.scope,\n templateUrl: function(tElement, tAttrs) {\n if (tAttrs.templateUrl !== undefined) {\n templateUrl = tAttrs.templateUrl;\n }\n if (tAttrs.template !== undefined) {\n $templateCache.put(templateUrl, tAttrs.template);\n }\n return templateUrl;\n },\n compile: function () {\n return {\n pre: function preLink(scope, iElement, iAttrs, controller) {\n scope.gantt.api.directives.raise.preLink(directiveName, scope, iElement, iAttrs, controller);\n },\n post: function postLink(scope, iElement, iAttrs, controller) {\n scope.gantt.api.directives.raise.postLink(directiveName, scope, iElement, iAttrs, controller);\n\n }\n };\n },\n controller: ['$scope', '$element', '$attrs', function($scope, $element, $attrs) {\n var controller = this;\n\n if (controllerFunction !== undefined) {\n controllerFunction($scope, $element, $attrs, controller);\n }\n\n $scope.gantt.api.directives.raise.controller(directiveName, $scope, $element, $attrs, controller);\n $scope.$on('$destroy', function() {\n $scope.gantt.api.directives.raise.destroy(directiveName, $scope, $element, $attrs, controller);\n });\n\n $scope.$applyAsync(function() {\n $scope.gantt.api.directives.raise.new(directiveName, $scope, $element, $attrs, controller);\n });\n }]\n };\n\n if (!templateUrl) {\n delete directive.templateUrl;\n delete directive.replace;\n delete directive.transclude;\n }\n\n return directive;\n };\n };\n\n return DirectiveBuilder;\n }]);\n}());\n","(function() {\n 'use strict';\n angular.module('gantt').service('ganttDom', ['$document', function($document) {\n return {\n elementFromPoint: function(x, y) {\n return $document[0].elementFromPoint(x, y);\n },\n elementsFromPoint: function(x, y, depth) {\n var elements = [], previousPointerEvents = [], cDepth = 0, current, i, l, d;\n\n // get all elements via elementFromPoint, and remove them from hit-testing in order\n while ((current = this.elementFromPoint(x, y)) && elements.indexOf(current) === -1 && current !== null &&\n (depth === undefined || cDepth < depth)) {\n\n // push the element and its current style\n elements.push(current);\n previousPointerEvents.push({\n value: current.style.getPropertyValue('visibility'),\n priority: current.style.getPropertyPriority('visibility')\n });\n\n // add \"pointer-events: none\", to get to the underlying element\n current.style.setProperty('visibility', 'hidden', 'important');\n\n cDepth++;\n }\n\n // restore the previous pointer-events values\n for (i = 0, l = previousPointerEvents.length; i < l; i++) {\n d = previousPointerEvents[i];\n elements[i].style.setProperty('visibility', d.value ? d.value : '', d.priority);\n }\n\n return elements;\n },\n findElementFromPoint: function(x, y, checkFunction) {\n var elements = [], previousPointerEvents = [], cDepth = 0, current, found, i, l, d;\n\n // get all elements via elementFromPoint, and remove them from hit-testing in order\n while ((current = this.elementFromPoint(x, y)) && elements.indexOf(current) === -1 && current !== null) {\n\n // push the element and its current style\n elements.push(current);\n previousPointerEvents.push({\n value: current.style.getPropertyValue('visibility'),\n priority: current.style.getPropertyPriority('visibility')\n });\n\n // add \"visibility: hidden\", to get to the underlying element.\n // Would be better with pointer-events: none, but IE<11 doesn't support this.\n current.style.setProperty('visibility', 'hidden', 'important');\n\n cDepth++;\n\n if (checkFunction(current)) {\n found = current;\n break;\n }\n }\n\n // restore the previous pointer-events values\n for (i = 0, l = previousPointerEvents.length; i < l; i++) {\n d = previousPointerEvents[i];\n elements[i].style.setProperty('visibility', d.value ? d.value : '', d.priority);\n }\n\n return found;\n },\n isElementVisible: function(element) {\n return element.offsetParent !== undefined && element.offsetParent !== null;\n }\n };\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').service('ganttEnableNgAnimate', ['$injector', function($injector) {\n var ngAnimate;\n try {\n ngAnimate = $injector.get('$animate');\n } catch (e) {\n }\n\n if (ngAnimate !== undefined) {\n return function(element, enabled) {\n if (angular.version.major >= 1 && angular.version.minor >= 4) {\n // AngularJS 1.4 breaking change, arguments are flipped.\n ngAnimate.enabled(element, enabled);\n } else {\n ngAnimate.enabled(enabled, element);\n }\n\n };\n } else {\n return angular.noop;\n }\n\n\n }]);\n}());\n\n","(function() {\n 'use strict';\n angular.module('gantt').directive('ganttBindCompileHtml', ['$compile', function($compile) {\n return {\n restrict: 'A',\n require: '^gantt',\n link: function(scope, element, attrs, ganttCtrl) {\n scope.scope = ganttCtrl.gantt.$scope.$parent;\n scope.$watch(function() {\n return scope.$eval(attrs.ganttBindCompileHtml);\n }, function(value) {\n element.html(value);\n $compile(element.contents())(scope);\n });\n }\n };\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').service('ganttLayout', ['$document', function($document) {\n return {\n /**\n * Compute the width of scrollbar.\n *\n * @returns {number} width of the scrollbar, in px.\n */\n getScrollBarWidth: function() {\n var inner = $document[0].createElement('p');\n inner.style.width = '100%';\n inner.style.height = '200px';\n\n var outer = $document[0].createElement('div');\n outer.style.position = 'absolute';\n outer.style.top = '0px';\n outer.style.left = '0px';\n outer.style.visibility = 'hidden';\n outer.style.width = '200px';\n outer.style.height = '150px';\n outer.style.overflow = 'hidden';\n outer.appendChild (inner);\n\n $document[0].body.appendChild (outer);\n\n var w1 = inner.offsetWidth;\n outer.style.overflow = 'scroll';\n\n var w2 = inner.offsetWidth;\n if (w1 === w2) {\n w2 = outer.clientWidth;\n }\n\n $document[0].body.removeChild (outer);\n\n return (w1 - w2);\n },\n /**\n * Compute the height of scrollbar.\n *\n * @returns {number} height of the scrollbar, in px.\n */\n getScrollBarHeight: function() {\n var inner = $document[0].createElement('p');\n inner.style.width = '200px;';\n inner.style.height = '100%';\n\n var outer = $document[0].createElement('div');\n outer.style.position = 'absolute';\n outer.style.top = '0px';\n outer.style.left = '0px';\n outer.style.visibility = 'hidden';\n outer.style.width = '150px';\n outer.style.height = '200px';\n outer.style.overflow = 'hidden';\n outer.appendChild (inner);\n\n $document[0].body.appendChild (outer);\n\n var h1 = inner.offsetHeight;\n outer.style.overflow = 'scroll';\n\n var h2 = inner.offsetHeight;\n if (h1 === h2) {\n h2 = outer.clientHeight;\n }\n\n $document[0].body.removeChild (outer);\n\n return (h1 - h2);\n },\n\n setColumnsWidthFactor: function(columns, widthFactor, originalLeftOffset) {\n if (!columns) {\n return;\n }\n\n if (!originalLeftOffset) {\n originalLeftOffset = 0;\n }\n\n for (var i=0; i<columns.length; i++) {\n var column = columns[i];\n column.left = (widthFactor * (column.originalSize.left + originalLeftOffset)) - originalLeftOffset;\n column.width = widthFactor * column.originalSize.width;\n\n for (var j=0; j<column.timeFrames.length; j++) {\n var timeFrame = column.timeFrames[j];\n timeFrame.left = widthFactor * timeFrame.originalSize.left;\n timeFrame.width = widthFactor * timeFrame.originalSize.width;\n }\n }\n }\n };\n }]);\n}());\n\n","(function(){\n 'use strict';\n angular.module('gantt').service('ganttMouseButton', [ function() {\n // Mouse button cross browser normalization\n\n return {\n getButton: function(e) {\n e = e || window.event;\n\n if (!e.which) {\n if (e.button === undefined) {\n return 1;\n }\n return e.button < 2 ? 1 : e.button === 4 ? 2 : 3;\n } else {\n return e.which;\n }\n }\n };\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').service('ganttMouseOffset', [ function() {\n // Mouse offset support for lesser browsers (read IE 8)\n\n return {\n getTouch: function(evt) {\n if (evt.touches !== undefined) {\n return evt.touches[0];\n }\n return evt;\n },\n getOffset: function(evt) {\n if (evt.offsetX && evt.offsetY) {\n return { x: evt.offsetX, y: evt.offsetY };\n }\n if (evt.layerX && evt.layerY) {\n return { x: evt.layerX, y: evt.layerY };\n }\n return this.getOffsetForElement(evt.target, evt);\n },\n getOffsetForElement: function(el, evt) {\n var bb = el.getBoundingClientRect();\n return { x: evt.clientX - bb.left, y: evt.clientY - bb.top };\n }\n };\n }]);\n}());\n","(function(){\n 'use strict';\n angular.module('gantt').factory('ganttSmartEvent', [function() {\n // Auto released the binding when the scope is destroyed. Use if an event is registered on another element than the scope.\n\n function smartEvent($scope, $element, event, fn) {\n $scope.$on('$destroy', function() {\n $element.unbind(event, fn);\n });\n\n return {\n bindOnce: function() {\n $element.one(event, fn);\n },\n bind: function() {\n $element.bind(event, fn);\n },\n unbind: function() {\n $element.unbind(event, fn);\n }\n };\n }\n\n return smartEvent;\n }]);\n}());\n","angular.module('gantt.templates', []).run(['$templateCache', function($templateCache) {\n $templateCache.put('template/gantt.tmpl.html',\n '<div class=\"gantt unselectable\" ng-cloak gantt-scroll-manager gantt-element-width-listener=\"ganttElementWidth\">\\n' +\n ' <gantt-side>\\n' +\n ' <gantt-side-background>\\n' +\n ' </gantt-side-background>\\n' +\n ' <gantt-side-content>\\n' +\n ' </gantt-side-content>\\n' +\n ' <div gantt-resizer=\"gantt.side.$element\" gantt-resizer-event-topic=\"side\" gantt-resizer-enabled=\"{{$parent.gantt.options.value(\\'allowSideResizing\\')}}\" resizer-width=\"sideWidth\" class=\"gantt-resizer\">\\n' +\n ' <div ng-show=\"$parent.gantt.options.value(\\'allowSideResizing\\')\" class=\"gantt-resizer-display\"></div>\\n' +\n ' </div>\\n' +\n ' </gantt-side>\\n' +\n ' <gantt-scrollable-header>\\n' +\n ' <gantt-header gantt-element-height-listener=\"$parent.ganttHeaderHeight\">\\n' +\n ' <gantt-header-columns>\\n' +\n ' <div ng-repeat=\"header in gantt.columnsManager.visibleHeaders track by $index\">\\n' +\n ' <div class=\"gantt-header-row\" ng-class=\"{\\'gantt-header-row-last\\': $last, \\'gantt-header-row-first\\': $first}\">\\n' +\n ' <gantt-column-header ng-repeat=\"column in header\"></gantt-column-header>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </gantt-header-columns>\\n' +\n ' </gantt-header>\\n' +\n ' </gantt-scrollable-header>\\n' +\n ' <gantt-scrollable>\\n' +\n ' <gantt-body>\\n' +\n ' <gantt-body-background>\\n' +\n ' <gantt-row-background ng-repeat=\"row in gantt.rowsManager.visibleRows track by row.model.id\"></gantt-row-background>\\n' +\n ' </gantt-body-background>\\n' +\n ' <gantt-body-foreground>\\n' +\n ' <div class=\"gantt-current-date-line\" ng-show=\"currentDate === \\'line\\' && gantt.currentDateManager.position >= 0 && gantt.currentDateManager.position <= gantt.width\" ng-style=\"{\\'left\\': gantt.currentDateManager.position + \\'px\\' }\"></div>\\n' +\n ' </gantt-body-foreground>\\n' +\n ' <gantt-body-columns>\\n' +\n ' <gantt-column ng-repeat=\"column in gantt.columnsManager.visibleColumns\">\\n' +\n ' <gantt-time-frame ng-repeat=\"timeFrame in column.visibleTimeFrames\"></gantt-time-frame>\\n' +\n ' </gantt-column>\\n' +\n ' </gantt-body-columns>\\n' +\n ' <div ng-if=\"gantt.columnsManager.visibleColumns == 0\" style=\"background-color: #808080\"></div>\\n' +\n ' <gantt-body-rows>\\n' +\n ' <gantt-timespan ng-repeat=\"timespan in gantt.timespansManager.timespans track by timespan.model.id\"></gantt-timespan>\\n' +\n ' <gantt-row ng-repeat=\"row in gantt.rowsManager.visibleRows track by row.model.id\">\\n' +\n ' <gantt-task ng-repeat=\"task in row.visibleTasks track by task.model.id\">\\n' +\n ' </gantt-task>\\n' +\n ' </gantt-row>\\n' +\n ' </gantt-body-rows>\\n' +\n ' </gantt-body>\\n' +\n ' </gantt-scrollable>\\n' +\n '\\n' +\n ' <!-- Plugins -->\\n' +\n ' <ng-transclude></ng-transclude>\\n' +\n '\\n' +\n ' <!--\\n' +\n ' ******* Inline templates *******\\n' +\n ' You can specify your own templates by either changing the default ones below or by\\n' +\n ' adding an attribute template-url=\"<url to your template>\" on the specific element.\\n' +\n ' -->\\n' +\n '\\n' +\n ' <!-- Body template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttBody.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-body\" ng-style=\"{\\'width\\': gantt.width > 0 ? gantt.width +\\'px\\' : undefined}\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Header template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttHeader.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-header\"\\n' +\n ' ng-show=\"gantt.columnsManager.columns.length > 0 && gantt.columnsManager.headers.length > 0\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Side template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttSide.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-side\" style=\"width: auto;\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Side content template-->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttSideContent.tmpl.html\">\\n' +\n ' <div class=\"gantt-side-content\">\\n' +\n ' </div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Header columns template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttHeaderColumns.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-header-columns\"\\n' +\n ' gantt-horizontal-scroll-receiver></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttColumnHeader.tmpl.html\">\\n' +\n ' <div class=\"gantt-column-header\" ng-class=\"{\\'gantt-column-header-last\\': $last, \\'gantt-column-header-first\\': $first}\">{{::column.label}}</div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Body background template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttBodyBackground.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-body-background\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Body foreground template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttBodyForeground.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-body-foreground\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Body columns template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttBodyColumns.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-body-columns\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttColumn.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-column gantt-foreground-col\" ng-class=\"{\\'gantt-column-last\\': $last, \\'gantt-column-first\\': $first}\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttTimeFrame.tmpl.html\">\\n' +\n ' <div class=\"gantt-timeframe\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Scrollable template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttScrollable.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-scrollable\" gantt-scroll-sender ng-style=\"getScrollableCss()\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttScrollableHeader.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-scrollable-header\" ng-style=\"getScrollableHeaderCss()\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Rows template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttBodyRows.tmpl.html\">\\n' +\n ' <div ng-transclude class=\"gantt-body-rows\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Timespan template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttTimespan.tmpl.html\">\\n' +\n ' <div class=\"gantt-timespan\" ng-class=\"timespan.model.classes\">\\n' +\n ' </div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Task template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttTask.tmpl.html\">\\n' +\n ' <div class=\"gantt-task\" ng-class=\"task.model.classes\">\\n' +\n ' <gantt-task-background></gantt-task-background>\\n' +\n ' <gantt-task-foreground></gantt-task-foreground>\\n' +\n ' <gantt-task-content></gantt-task-content>\\n' +\n ' </div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttTaskBackground.tmpl.html\">\\n' +\n ' <div class=\"gantt-task-background\" ng-style=\"{\\'background-color\\': task.model.color}\"></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttTaskForeground.tmpl.html\">\\n' +\n ' <div class=\"gantt-task-foreground\">\\n' +\n ' <div ng-if=\"task.truncatedRight\" class=\"gantt-task-truncated-right\">></div>\\n' +\n ' <div ng-if=\"task.truncatedLeft\" class=\"gantt-task-truncated-left\"><</div>\\n' +\n ' </div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Task content template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttTaskContent.tmpl.html\">\\n' +\n ' <div class=\"gantt-task-content\" unselectable=\"on\"><span unselectable=\"on\" gantt-bind-compile-html=\"getTaskContent()\"/></div>\\n' +\n ' </script>\\n' +\n '\\n' +\n '\\n' +\n ' <!-- Row background template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttRowBackground.tmpl.html\">\\n' +\n ' <div class=\"gantt-row gantt-row-height\"\\n' +\n ' ng-class=\"row.model.classes\"\\n' +\n ' ng-class-odd=\"\\'gantt-row-odd\\'\"\\n' +\n ' ng-class-even=\"\\'gantt-row-even\\'\"\\n' +\n ' ng-style=\"{\\'height\\': row.model.height}\">\\n' +\n ' <div class=\"gantt-row-background\"\\n' +\n ' ng-style=\"{\\'background-color\\': row.model.color}\">\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Row template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttRow.tmpl.html\">\\n' +\n ' <div class=\"gantt-row gantt-row-height\"\\n' +\n ' ng-class=\"row.model.classes\"\\n' +\n ' ng-class-odd=\"\\'gantt-row-odd\\'\"\\n' +\n ' ng-class-even=\"\\'gantt-row-even\\'\"\\n' +\n ' ng-style=\"{\\'height\\': row.model.height}\">\\n' +\n ' <div ng-transclude class=\"gantt-row-content\"></div>\\n' +\n ' </div>\\n' +\n ' </script>\\n' +\n '\\n' +\n ' <!-- Side background template -->\\n' +\n ' <script type=\"text/ng-template\" id=\"template/ganttSideBackground.tmpl.html\">\\n' +\n ' <div class=\"gantt-side-background\">\\n' +\n ' <div class=\"gantt-side-background-header\" ng-style=\"{height: $parent.ganttHeaderHeight + \\'px\\'}\">\\n' +\n ' <div ng-show=\"$parent.ganttHeaderHeight\" class=\"gantt-header-row gantt-side-header-row\"></div>\\n' +\n ' </div>\\n' +\n ' <div class=\"gantt-side-background-body\" ng-style=\"getMaxHeightCss()\">\\n' +\n ' <div gantt-vertical-scroll-receiver>\\n' +\n ' <div class=\"gantt-row gantt-row-height \"\\n' +\n ' ng-class-odd=\"\\'gantt-row-odd\\'\"\\n' +\n ' ng-class-even=\"\\'gantt-row-even\\'\"\\n' +\n ' ng-class=\"row.model.classes\"\\n' +\n ' ng-repeat=\"row in gantt.rowsManager.visibleRows track by row.model.id\"\\n' +\n ' ng-style=\"{\\'height\\': row.model.height}\">\\n' +\n ' <div gantt-row-label class=\"gantt-row-label gantt-row-background\"\\n' +\n ' ng-style=\"{\\'background-color\\': row.model.color}\">\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </div>\\n' +\n ' </script>\\n' +\n '</div>\\n' +\n '');\n}]);\n"]} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.min.css b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.min.css index 3667d0991a998dda066ecbd3f26f29cf67dfd8c6..f2cc6eaaa664338a01bc956e2ca04db48be3c616 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.min.css +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.min.css @@ -1 +1 @@ -.gantt-scrollable,.gantt-scrollable-header{border-left:1px solid #ddd;border-right:1px solid #ddd}.gantt-row-label span.gantt-label-text,.gantt-side-header-row{padding-left:12px;padding-right:12px}.gantt-header-row,.gantt-side-header-row{border-top:1px solid #ddd;white-space:nowrap}.gantt-header-row-last,.gantt-side-header-row{border-bottom:1px solid #ddd}.gantt{line-height:normal}.gantt-body,.gantt-side-content{pointer-events:none}.gantt [data-ng-click],.gantt [ng-click],.gantt [x-ng-click],.gantt a,.gantt input,.gantt-body-background,.gantt-row,.gantt-side-background{pointer-events:auto}.gantt-scrollable{overflow-x:auto}.gantt-header,.gantt-row-label,.gantt-side-background-body,.gantt-side-content,.gantt-side-header-row,.gantt-task-content{overflow:hidden}.gantt-scrollable-header{overflow-x:hidden}.gantt-header,.gantt-side,.gantt-task{cursor:default}.gantt-row-label{white-space:nowrap}.gantt-valign-container{height:100%}.gantt-valign-content{position:relative;top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.gantt-side-background{position:absolute;height:100%;width:100%}.gantt-side-content{position:relative;vertical-align:top;white-space:nowrap}.gantt-side-content>div.side-element{display:inline-block}.gantt-header-columns{position:relative;height:100%}.gantt-side{float:left;position:relative}.gantt-header-row{box-sizing:border-box;height:2em}.gantt-header-row .gantt-column-header{position:absolute;border-right:1px solid #ddd;box-sizing:border-box;display:inline-block;height:2em;text-align:center;padding-top:.5em;overflow:hidden;text-overflow:clip}.gantt-header-row .gantt-column-header-last{position:absolute;border-right:none}.gantt-foreground-col,.gantt-foreground-col-current-date,.gantt-foreground-col-nonworkhour{position:absolute;box-sizing:border-box;display:inline-block;height:100%;border-right:1px solid #ddd}.gantt-foreground-col-nonworkhour{background-color:rgba(200,200,200,.3)}.gantt-column-header-last,.gantt-column-last{border-right:none}.gantt-side-background-header{position:relative}.gantt-side-header-row{position:absolute;bottom:0;width:100%}.gantt-body{position:relative;height:100%}.gantt-body-columns,.gantt-resizer,.gantt-row-background,.gantt-row-content,.gantt-timeframe{position:absolute;height:100%}.gantt-body-rows{overflow-x:hidden}.gantt-body-background,.gantt-body-foreground{position:absolute;height:100%;width:100%}.gantt-resizer{z-index:1;right:-6px;top:0;width:12px}.gantt-resizer-enabled{cursor:ew-resize}.gantt-resizer-display{margin-left:auto;margin-right:auto;width:4px;background-color:#DDD;background-image:-webkit-linear-gradient(0deg,transparent 50%,rgba(255,255,255,.5) 50%);background-image:linear-gradient(90deg,transparent 50%,rgba(255,255,255,.5) 50%);background-size:2px 2px;height:100%}.gantt-timeframe{box-sizing:border-box}.gantt-timeframe-non-working{background-color:#d3d3d3;opacity:.3}.gantt-foreground-col-current-date{background-color:green;opacity:.6}.gantt-row-background,.gantt-row-content{width:100%}.gantt-row-even>.gantt-row-background{background-color:#EFEFEF}.gantt-row{position:relative}.gantt-row-height{height:2em}.gantt-task,.gantt-task-milestone{position:absolute;margin:auto;height:80%;top:0;bottom:0}.gantt-task{min-width:.6em}.gantt-task-milestone{width:.6em!important;background-color:grey;border-radius:.3em}.gantt-current-date-line,.gantt-task-background,.gantt-task-content,.gantt-task-foreground,.gantt-timespan{height:100%;position:absolute}.gantt-task-background{width:100%;background-color:grey;border-radius:2px}.gantt-task-foreground{width:100%}.gantt-task-content{width:100%;text-align:center;vertical-align:middle;white-space:nowrap}.gantt-task-content>span{margin-left:8px;margin-right:8px}.gantt-task-truncated-left{position:absolute;top:0;bottom:0;left:.3em}.gantt-task-truncated-right{position:absolute;top:0;bottom:0;right:.3em}.gantt-task-truncated-left,.gantt-task-truncated-right{color:#fff;font-size:1.5em;font-weight:bolder}.gantt-timespan{box-sizing:border-box;display:inline-block;color:#000;background-color:rgba(158,158,158,.5);border-left:1px solid rgba(158,158,158,1);border-right:1px solid rgba(158,158,158,1)}.gantt-current-date-line{border:1px dotted green;opacity:.6}.unselectable{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} \ No newline at end of file +.gantt-scrollable,.gantt-scrollable-header{border-left:1px solid #ddd;border-right:1px solid #ddd}.gantt-row-label span.gantt-label-text,.gantt-side-header-row{padding-left:12px;padding-right:12px}.gantt-header-row,.gantt-side-header-row{border-top:1px solid #ddd;white-space:nowrap}.gantt-header-row-last,.gantt-side-header-row{border-bottom:1px solid #ddd}.gantt{line-height:normal}.gantt-scrollable{overflow-x:auto}.gantt-header,.gantt-row-label,.gantt-side-background-body,.gantt-side-content,.gantt-side-header-row,.gantt-task-content{overflow:hidden}.gantt-scrollable-header{overflow-x:hidden}.gantt-header,.gantt-side,.gantt-task{cursor:default;z-index:10}.gantt-row-label{white-space:nowrap}.gantt-valign-container{height:100%}.gantt-valign-content{position:relative;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.gantt-side-background{position:absolute;height:100%;width:100%}.gantt-side-content{position:relative;vertical-align:top;white-space:nowrap}.gantt-side-content>div.side-element{display:inline-block}.gantt-header-columns{position:relative;height:100%}.gantt-side{float:left;position:relative}.gantt-header-row{box-sizing:border-box;height:2em}.gantt-header-row .gantt-column-header{position:absolute;border-right:1px solid #ddd;box-sizing:border-box;display:inline-block;height:2em;text-align:center;padding-top:.5em;overflow:hidden;text-overflow:clip}.gantt-header-row .gantt-column-header-last{position:absolute;border-right:none}.gantt-foreground-col,.gantt-foreground-col-current-date,.gantt-foreground-col-nonworkhour{position:absolute;box-sizing:border-box;display:inline-block;height:100%;border-right:1px solid #ddd}.gantt-foreground-col-nonworkhour{background-color:rgba(200,200,200,.3)}.gantt-column-header-last,.gantt-column-last{border-right:none}.gantt-side-background-header{position:relative}.gantt-side-header-row{position:absolute;bottom:0;width:100%}.gantt-body{position:relative;height:100%}.gantt-body-rows{overflow-x:hidden;overflow-y:hidden}.gantt-body-background,.gantt-body-foreground{position:absolute;height:100%;width:100%}.gantt-body-columns{position:absolute;height:100%}.gantt-resizer{position:absolute;z-index:1;right:-6px;top:0;width:12px;height:100%}.gantt-resizer-enabled{cursor:ew-resize}.gantt-resizer-display{margin-left:auto;margin-right:auto;width:4px;background-color:#DDD;background-image:-webkit-linear-gradient(0deg,transparent 50%,rgba(255,255,255,.5) 50%);background-image:linear-gradient(90deg,transparent 50%,rgba(255,255,255,.5) 50%);background-size:2px 2px;height:100%}.gantt-timeframe{position:absolute;box-sizing:border-box;height:100%}.gantt-timeframe-non-working{background-color:#d3d3d3;opacity:.3}.gantt-foreground-col-current-date{background-color:green;opacity:.6}.gantt-row-background,.gantt-row-content{position:absolute;width:100%;height:100%}.gantt-row-even>.gantt-row-background{background-color:#EFEFEF}.gantt-row{position:relative}.gantt-row-height{height:2em}.gantt-task,.gantt-task-milestone{position:absolute;margin:auto;top:0;bottom:0;min-width:.6em;height:80%}.gantt-current-date-line,.gantt-task-background,.gantt-task-content,.gantt-task-foreground,.gantt-timespan{height:100%;position:absolute}.gantt-task-background{width:100%;background-color:grey;border-radius:2px}.gantt-task-foreground{width:100%}.gantt-task-content{width:100%;text-align:center;vertical-align:middle;white-space:nowrap}.gantt-task-content>span{margin-left:8px;margin-right:8px}.gantt-task-truncated-left{position:absolute;top:0;bottom:0;left:.3em}.gantt-task-truncated-right{position:absolute;top:0;bottom:0;right:.3em}.gantt-task-truncated-left,.gantt-task-truncated-right{color:#fff;font-size:1.5em;font-weight:bolder}.gantt-timespan{box-sizing:border-box;display:inline-block;color:#000;background-color:rgba(158,158,158,.5);border-left:1px solid rgba(158,158,158,1);border-right:1px solid rgba(158,158,158,1)}.gantt-current-date-line{border:1px dotted green;opacity:.6}.unselectable{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.min.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.min.js index e42e1b44ceba36bceed59e46e58f3c8f706454bd..b8ffd2d9e071f810629b80bca95507760549c605 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.min.js +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.min.js @@ -1,12 +1,12 @@ /* -Project: angular-gantt v1.2.7 - Gantt chart component for AngularJS +Project: angular-gantt v1.2.12 - Gantt chart component for AngularJS Authors: Marco Schweighauser, Rémi Alvergnat License: MIT Homepage: https://www.angular-gantt.com Github: https://github.com/angular-gantt/angular-gantt.git */ -!function(){"use strict";angular.module("gantt",["gantt.templates","angularMoment"]).directive("gantt",["Gantt","ganttEnableNgAnimate","$timeout","$templateCache",function(a,b,c,d){return{restrict:"A",transclude:!0,templateUrl:function(a,b){var c;return c=void 0===b.templateUrl?"template/gantt.tmpl.html":b.templateUrl,void 0!==b.template&&d.put(c,b.template),c},scope:{sortMode:"=?",filterTask:"=?",filterTaskComparator:"=?",filterRow:"=?",filterRowComparator:"=?",viewScale:"=?",columnWidth:"=?",expandToFit:"=?",shrinkToFit:"=?",showSide:"=?",allowSideResizing:"=?",fromDate:"=?",toDate:"=?",currentDateValue:"=?",currentDate:"=?",daily:"=?",autoExpand:"=?",taskOutOfRange:"=?",taskContent:"=?",rowContent:"=?",maxHeight:"=?",sideWidth:"=?",headers:"=?",headersFormats:"=?",timeFrames:"=?",dateFrames:"=?",timeFramesWorkingMode:"=?",timeFramesNonWorkingMode:"=?",timespans:"=?",columnMagnet:"=?",shiftColumnMagnet:"=?",timeFramesMagnet:"=?",data:"=?",api:"=?",options:"=?"},controller:["$scope","$element",function(c,d){for(var e in c.options)c[e]=c.options[e];b(d,!1),c.gantt=new a(c,d),this.gantt=c.gantt}],link:function(a,b){a.gantt.api.directives.raise["new"]("gantt",a,b),a.$on("$destroy",function(){a.gantt.api.directives.raise.destroy("gantt",a,b)}),c(function(){a.gantt.initialized()})}}}])}(),function(){"use strict";angular.module("gantt").factory("GanttApi",["$q","$rootScope","ganttUtils",function(a,b,c){function d(a,c,d,e){return b.$on(a,function(){var a=Array.prototype.slice.call(arguments);a.splice(0,1),c.apply(e?e:d.api,a)})}var e=function(a){this.gantt=a,this.listeners=[],this.apiId=c.newId()};return e.prototype.suppressEvents=function(a,b){var c=this,e=angular.isArray(a)?a:[a],f=[];e.forEach(function(a){f=c.listeners.filter(function(b){return a===b.handler})}),f.forEach(function(a){a.dereg()}),b(),f.forEach(function(a){a.dereg=d(a.eventId,a.handler,c.gantt,a._this)})},e.prototype.registerEvent=function(a,c){var e=this;e[a]||(e[a]={});var f=e[a];f.on||(f.on={},f.raise={});var g="event:gantt:"+this.apiId+":"+a+":"+c;f.raise[c]=function(){b.$emit.apply(b,[g].concat(Array.prototype.slice.call(arguments)))},f.on[c]=function(a,b,c){var f=d(g,b,e.gantt,c),h={handler:b,dereg:f,eventId:g,scope:a,_this:c};e.listeners.push(h);var i=function(){h.dereg();var a=e.listeners.indexOf(h);e.listeners.splice(a,1)};return a.$on("$destroy",function(){i()}),i}},e.prototype.registerEventsFromObject=function(a){var b=this,c=[];angular.forEach(a,function(a,b){var d={name:b,events:[]};angular.forEach(a,function(a,b){d.events.push(b)}),c.push(d)}),c.forEach(function(a){a.events.forEach(function(c){b.registerEvent(a.name,c)})})},e.prototype.registerMethod=function(a,b,d,e){this[a]||(this[a]={});var f=this[a];f[b]=c.createBoundedWrapper(e||this.gantt,d)},e.prototype.registerMethodsFromObject=function(a,b){var c=this,d=[];angular.forEach(a,function(a,b){var c={name:b,methods:[]};angular.forEach(a,function(a,b){c.methods.push({name:b,fn:a})}),d.push(c)}),d.forEach(function(a){a.methods.forEach(function(d){c.registerMethod(a.name,d.name,d.fn,b)})})},e}])}(),function(){"use strict";angular.module("gantt").factory("GanttOptions",[function(){var a=function(a,b){this.defaultValues=b,this.values=a,this.defaultValue=function(a){var b=this.defaultValues[a];return angular.isFunction(b)&&(b=b()),b},this.sanitize=function(a,b){if(!b){var c=this.defaultValue(a);if(void 0!==c)return void 0!==b&&"boolean"==typeof c?b:c}return b},this.value=function(a){return this.sanitize(a,this.values[a])},this.set=function(a,b){this.values[a]=b},this.initialize=function(){for(var a in this.values){var b=this.values[a];this.values.hasOwnProperty(a)&&(this.values[a]=this.value(a,b))}return this.values}};return a}])}(),function(){"use strict";angular.module("gantt").factory("GanttCalendar",["$filter","moment",function(a,b){var c=function(a){void 0===a&&(a={}),this.start=a.start,this.end=a.end,this.working=a.working,this.magnet=void 0!==a.magnet?a.magnet:!0,this["default"]=a["default"],this.color=a.color,this.classes=a.classes};c.prototype.updateView=function(){if(this.$element){var a={};void 0!==this.left?a.left=this.left+"px":a.left="",void 0!==this.width?a.width=this.width+"px":a.width="",void 0!==this.color?a["background-color"]=this.color:a["background-color"]="",this.$element.css(a);var b=["gantt-timeframe"+(this.working?"":"-non")+"-working"];this.classes&&(b=b.concat(this.classes));for(var c=0,d=b.length;d>c;c++)this.$element.toggleClass(b[c],!0)}},c.prototype.getDuration=function(){return void 0!==this.end&&void 0!==this.start?this.end.diff(this.start,"milliseconds"):void 0},c.prototype.clone=function(){return new c(this)};var d=function(a){this.func=a};d.prototype.getTimeFrames=function(a){var b=this.func(a);return b instanceof Array||(b=[b]),b},d.prototype.clone=function(){return new d(this.func)};var e=function(a){this.evaluator=a.evaluator,a.date?(this.start=b(a.date).startOf("day"),this.end=b(a.date).endOf("day")):(this.start=a.start,this.end=a.end),a.targets instanceof Array?this.targets=a.targets:this.targets=[a.targets],this["default"]=a["default"]};e.prototype.dateMatch=function(a){return this.evaluator?this.evaluator(a):this.start&&this.end?a>=this.start&&a<=this.end:!1},e.prototype.clone=function(){return new e(this)};var f=function(){this.timeFrames={},this.timeFrameMappings={},this.dateFrames={}};f.prototype.clear=function(){this.timeFrames={},this.timeFrameMappings={},this.dateFrames={}},f.prototype.registerTimeFrames=function(a){angular.forEach(a,function(a,b){this.timeFrames[b]=new c(a)},this)},f.prototype.removeTimeFrames=function(a){angular.forEach(a,function(a){delete this.timeFrames[a]},this)},f.prototype.clearTimeFrames=function(){this.timeFrames={}},f.prototype.registerTimeFrameMappings=function(a){angular.forEach(a,function(a,b){this.timeFrameMappings[b]=new d(a)},this)},f.prototype.removeTimeFrameMappings=function(a){angular.forEach(a,function(a){delete this.timeFrameMappings[a]},this)},f.prototype.clearTimeFrameMappings=function(){this.timeFrameMappings={}},f.prototype.registerDateFrames=function(a){angular.forEach(a,function(a,b){this.dateFrames[b]=new e(a)},this)},f.prototype.removeDateFrames=function(a){angular.forEach(a,function(a){delete this.dateFrames[a]},this)},f.prototype.clearDateFrames=function(){this.dateFrames={}};var g=function(a,b){var c=[];return angular.forEach(a,function(a){a.dateMatch(b)&&c.push(a)}),0===c.length&&angular.forEach(a,function(a){a["default"]&&c.push(a)}),c};return f.prototype.getTimeFrames=function(a){var c=[],d=g(this.dateFrames,a);angular.forEach(d,function(a){void 0!==a&&angular.forEach(a.targets,function(a){var b=this.timeFrameMappings[a];if(void 0!==b)c.push(b.getTimeFrames());else{var d=this.timeFrames[a];void 0!==d&&c.push(d)}},this)},this);var e=a.year(),f=a.month(),h=a.date(),i=[];return 0===c.length&&angular.forEach(this.timeFrames,function(a){a["default"]&&c.push(a)}),angular.forEach(c,function(a){a=a.clone(),void 0!==a.start&&(a.start.year(e),a.start.month(f),a.start.date(h)),void 0!==a.end&&(a.end.year(e),a.end.month(f),a.end.date(h),b(a.end).startOf("day")===a.end&&a.end.add(1,"day")),i.push(a)}),i},f.prototype.solve=function(d,e,f){var g,h,i,j,k=0===d.length;angular.forEach(d,function(a){(void 0===i||i>a.start)&&(i=a.start),(void 0===j||j<a.end)&&(j=a.end),void 0===g&&a.color&&(g=a.color),void 0!==a.classes&&(void 0===h&&(h=[]),h=h.concat(a.classes))}),void 0===e&&(e=i),void 0===f&&(f=j);var l=[new c({start:e,end:f,working:k,magnet:!1,color:g,classes:h})];d=a("filter")(d,function(a){return(void 0===a.start||a.start<f)&&(void 0===a.end||a.end>e)});var m=a("orderBy")(d,function(a){return-a.getDuration()});return angular.forEach(m,function(a){var c=l.slice(),d=0,e=!1,f=!1;angular.forEach(l,function(g){if(!f){if(a.end>g.start&&a.start<g.end){var h=g.clone();g.end=b(a.start),h.start=b(a.end),c.splice(d+1,0,a.clone(),h),f=!0,e=!1}else!e&&a.start<g.end?(g.end=b(a.start),c.splice(d+1,0,a.clone()),e=!0):e&&a.end>g.start&&(g.start=b(a.end),e=!1,f=!0);d++}}),l=c}),l=a("filter")(l,function(a){return(void 0===a.start||a.start<f)&&(void 0===a.end||a.end>e)})},f}])}(),function(){"use strict";angular.module("gantt").factory("GanttCurrentDateManager",["moment",function(a){var b=function(b){var c=this;this.gantt=b,this.date=void 0,this.position=void 0,this.currentDateColumn=void 0,this.gantt.$scope.simplifyMoment=function(b){return a.isMoment(b)?b.unix():b},this.gantt.$scope.$watchGroup(["currentDate","simplifyMoment(currentDateValue)"],function(a,b){a!==b&&c.setCurrentDate(c.gantt.options.value("currentDateValue"))})};return b.prototype.setCurrentDate=function(a){this.date=a;var b,c=this.currentDateColumn;void 0!==this.date&&"column"===this.gantt.options.value("currentDate")&&(b=this.gantt.columnsManager.getColumnByDate(this.date,!0)),this.currentDateColumn=b,c!==b&&(void 0!==c&&(c.currentDate=!1,c.updateView()),void 0!==b&&(b.currentDate=!0,b.updateView())),this.position=this.gantt.getPositionByDate(this.date,!0)},b}])}(),function(){"use strict";angular.module("gantt").factory("GanttColumn",["moment",function(a){var b=function(a,b,c,d,e,f,g){this.date=a,this.endDate=b,this.left=c,this.width=d,this.calendar=e,this.duration=this.endDate.diff(this.date,"milliseconds"),this.timeFramesWorkingMode=f,this.timeFramesNonWorkingMode=g,this.timeFrames=[],this.currentDate=!1,this.visibleTimeFrames=[],this.daysTimeFrames={},this.cropped=!1,this.originalSize={left:this.left,width:this.width},this.updateTimeFrames()},c=function(a){return a.year()+"-"+a.month()+"-"+a.date()};return b.prototype.updateView=function(){if(this.$element){this.currentDate?this.$element.addClass("gantt-foreground-col-current-date"):this.$element.removeClass("gantt-foreground-col-current-date"),this.$element.css({left:this.left+"px",width:this.width+"px"});for(var a=0,b=this.timeFrames.length;b>a;a++)this.timeFrames[a].updateView()}},b.prototype.updateTimeFrames=function(){var b=this;if(void 0!==b.calendar&&("hidden"!==b.timeFramesNonWorkingMode||"hidden"!==b.timeFramesWorkingMode)){for(var d=function(c,d,e){return function(f){var g=f.start;void 0===g&&(g=d);var h=f.end;void 0===h&&(h=e),g<b.date&&(g=b.date),h>b.endDate&&(h=b.endDate),f=f.clone(),f.start=a(g),f.end=a(h),c.push(f)}},e=b.date,f=a(e).startOf("day"),g=f.add(1,"day");e<b.endDate;){var h=b.calendar.getTimeFrames(e),i=a.min(g,b.endDate);h=b.calendar.solve(h,e,i);var j=[];angular.forEach(h,d(j,e,i)),b.timeFrames=b.timeFrames.concat(j);var k=c(e);b.daysTimeFrames[k]=j,e=i,f=a(e).startOf("day"),g=f.add(1,"day")}if(angular.forEach(b.timeFrames,function(a){var c=a.start.diff(b.date,"milliseconds"),d=c/b.duration*b.width,e=a.end.diff(a.start,"milliseconds"),f=e/b.duration*b.width,g=!1;a.working&&"visible"!==b.timeFramesWorkingMode?g=!0:a.working||"visible"===b.timeFramesNonWorkingMode||(g=!0),g||b.visibleTimeFrames.push(a),a.hidden=g,a.left=d,a.width=f,a.originalSize={left:a.left,width:a.width}}),"cropped"===b.timeFramesNonWorkingMode||"cropped"===b.timeFramesWorkingMode){var l=0;if(angular.forEach(b.timeFrames,function(a){(!a.working&&"cropped"!==b.timeFramesNonWorkingMode||a.working&&"cropped"!==b.timeFramesWorkingMode)&&(l+=a.width)}),l!==b.width){var m=b.width/l,n=0,o=0,p=!0;angular.forEach(b.timeFrames,function(a){!a.working&&"cropped"!==b.timeFramesNonWorkingMode||a.working&&"cropped"!==b.timeFramesWorkingMode?(a.left=(a.left-n)*m,a.width=a.width*m,a.originalSize.left=(a.originalSize.left-o)*m,a.originalSize.width=a.originalSize.width*m,a.cropped=!1,p=!1):(n+=a.width,o+=a.originalSize.width,a.left=void 0,a.width=0,a.originalSize={left:void 0,width:0},a.cropped=!0)}),b.cropped=p}else b.cropped=!1}}},b.prototype.clone=function(){return new b(a(this.date),a(this.endDate),this.left,this.width,this.calendar)},b.prototype.containsDate=function(a){return a>this.date&&a<=this.endDate},b.prototype.equals=function(a){return this.date===a.date},b.prototype.roundTo=function(a,b,c,d){"day"===b&&(b="date"),c=c||1;var e=a.get(b);switch(d){case"up":e=Math.ceil(e/c);break;case"down":e=Math.floor(e/c);break;default:e=Math.round(e/c)}var f=["millisecond","second","minute","hour","date","month","year"];a.set(b,e*c);for(var g=f.indexOf(b),h=0;g>h;h++)a.set(f[h],0);return a},b.prototype.getMagnetDate=function(b,c,d,e){if(c>0&&void 0!==d){var f=b;if(b=a(b),"column"===d){var g=this.getPositionByDate(b);b=a(g<this.width/2?this.date:this.endDate)}else b=this.roundTo(b,d,c),b<this.date?b=a(this.date):b>this.endDate&&(b=a(this.endDate));if(e)for(var h,i=Math.abs(f.diff(b,"milliseconds")),j=0;j<this.timeFrames.length;j++){var k=this.timeFrames[j];if(k.magnet){var l,m=this.timeFrames[j-1],n=this.timeFrames[j+1];(void 0===m||m.working!==k.working)&&(l=Math.abs(f.diff(k.start,"milliseconds")),i>l&&(void 0===h||h>l)&&(h=l,b=k.start)),(void 0===n||n.working!==k.working)&&(l=Math.abs(f.diff(k.end,"milliseconds")),i>l&&(void 0===h||h>l)&&(h=l,b=k.end))}}}return b},b.prototype.getDateByPositionUsingTimeFrames=function(b){for(var c=0,d=this.timeFrames.length;d>c;c++){var e=this.timeFrames[c];if(!e.cropped&&b>=e.left&&b<=e.left+e.width){var f=e.getDuration()/e.width*(b-e.left),g=a(e.start).add(f,"milliseconds");return g}}},b.prototype.getDateByPosition=function(b,c,d,e){var f,g;return 0>b&&(b=0),b>this.width&&(b=this.width),("cropped"===this.timeFramesNonWorkingMode||"cropped"===this.timeFramesWorkingMode)&&(g=this.getDateByPositionUsingTimeFrames(b)),void 0===g&&(f=this.duration/this.width*b,g=a(this.date).add(f,"milliseconds")),g=this.getMagnetDate(g,c,d,e)},b.prototype.getDayTimeFrame=function(a){var b=this.daysTimeFrames[c(a)];return void 0===b?[]:b},b.prototype.getPositionByDate=function(a){var b,c;if("cropped"===this.timeFramesNonWorkingMode||"cropped"===this.timeFramesWorkingMode)for(var d=a,e=this.getDayTimeFrame(d),f=0;f<e.length;f++){var g=e[f];if(d>=g.start&&d<=g.end){if(!g.cropped)return b=d.diff(g.start,"milliseconds"),c=b/g.getDuration()*g.width,this.left+g.left+c;d=e.length>f+1?e[f+1].start:g.end}}return b=a.diff(this.date,"milliseconds"),c=b/this.duration*this.width,0>c&&(c=0),c>this.width&&(c=this.width),this.left+c},b}])}(),function(){"use strict";angular.module("gantt").factory("GanttColumnGenerator",["GanttColumn","moment",function(a,b){var c=function(c){var d=this;this.columnsManager=c,d.generate=function(c,g,h,i,j){if(!g&&!h)throw"to or maximumWidth must be defined";var k=d.columnsManager.gantt.options.value("viewScale");k=k.trim(),"s"===k.charAt(k.length-1)&&(k=k.substring(0,k.length-1));var l,m,n;k&&(n=k.split(" ")),n&&n.length>1?(l=parseFloat(n[0]),m=n[n.length-1]):(l=1,m=k);var o=d.columnsManager.gantt.calendar,p=d.columnsManager.gantt.options.value("timeFramesWorkingMode"),q=d.columnsManager.gantt.options.value("timeFramesNonWorkingMode"),r=d.columnsManager.getColumnsWidth(),s=!1;c=b(c).startOf(m),g&&(s=e(g),g=b(g).startOf(m));var t=b(c).startOf(m);j&&t.add(-l,m);for(var u=[],v=0;;){if(h&&Math.abs(v)>h+r)break;var w=b(t),x=b(w).add(l,m);f(m,w,x);var y=new a(w,x,i?v+i:v,r,o,p,q);if(!y.cropped&&(u.push(y),j?v-=r:v+=r,g))if(j){if(s&&g>t||!s&&g>=t)break}else if(s&&t>g||!s&&t>=g)break;j?(t.add(-l,m),f(m,t,w)):(t.add(l,m),f(m,w,t))}return j&&(e(c,l,m)&&u.shift(),u.reverse()),u};var e=function(a,c,d){return b(a).add(c,d).startOf(d)===a},f=function(a,b,c){var d=b.get(a),e=c.get(a),f=g(a);void 0!==f&&e!==f&&d>e&&c.set(a,f)},g=function(a){return["hour","minute","second","millisecond"].indexOf(a)>=0?0:void 0}};return c}])}(),function(){"use strict";angular.module("gantt").factory("GanttColumnHeader",["moment","GanttColumn",function(a,b){var c=function(c,d,e,f,g,h){var i=a(c),j=a(i).add(d,e),k=new b(i,j,f,g);return k.unit=e,k.label=angular.isFunction(h)?h(k):i.format(h),k};return c}])}(),function(){"use strict";angular.module("gantt").factory("GanttColumnsManager",["GanttColumnGenerator","GanttHeaderGenerator","$filter","$timeout","ganttLayout","ganttBinarySearch","moment",function(a,b,c,d,e,f,g){var h=function(a){var b=this;this.gantt=a,this.from=void 0,this.to=void 0,this.columns=[],this.visibleColumns=[],this.previousColumns=[],this.nextColumns=[],this.headers=[],this.visibleHeaders=[],this.scrollAnchor=void 0,this.gantt.$scope.$watchGroup(["viewScale","columnWidth","timeFramesWorkingMode","timeFramesNonWorkingMode","fromDate","toDate","autoExpand","taskOutOfRange"],function(a,c){a!==c&&b.gantt.rendered&&b.generateColumns()}),this.gantt.$scope.$watchCollection("headers",function(a,c){a!==c&&b.gantt.rendered&&b.generateColumns()}),this.gantt.$scope.$watchCollection("headersFormats",function(a,c){a!==c&&b.gantt.rendered&&b.generateColumns()}),this.gantt.$scope.$watchGroup(["ganttElementWidth","showSide","sideWidth","maxHeight","daily"],function(a,c){a!==c&&b.gantt.rendered&&b.updateColumnsMeta()}),this.gantt.api.data.on.load(this.gantt.$scope,function(){(void 0===b.from||void 0===b.to||b.from>b.gantt.rowsManager.getDefaultFrom()||b.to<b.gantt.rowsManager.getDefaultTo())&&b.gantt.rendered&&b.generateColumns(),b.gantt.rowsManager.sortRows()}),this.gantt.api.data.on.remove(this.gantt.$scope,function(){b.gantt.rowsManager.sortRows()}),this.gantt.api.registerMethod("columns","clear",this.clearColumns,this),this.gantt.api.registerMethod("columns","generate",this.generateColumns,this),this.gantt.api.registerMethod("columns","refresh",this.updateColumnsMeta,this),this.gantt.api.registerMethod("columns","getColumnsWidth",this.getColumnsWidth,this),this.gantt.api.registerMethod("columns","getColumnsWidthToFit",this.getColumnsWidthToFit,this),this.gantt.api.registerMethod("columns","getDateRange",this.getDateRange,this),this.gantt.api.registerEvent("columns","clear"),this.gantt.api.registerEvent("columns","generate"),this.gantt.api.registerEvent("columns","refresh")};h.prototype.setScrollAnchor=function(){if(this.gantt.scroll.$element&&this.columns.length>0){var a=this.gantt.scroll.$element[0],b=a.scrollLeft+a.offsetWidth/2;this.scrollAnchor=this.gantt.getDateByPosition(b)}},h.prototype.scrollToScrollAnchor=function(){var a=this;this.columns.length>0&&void 0!==this.scrollAnchor&&this.gantt.$scope.$$postDigest(function(){a.gantt.api.scroll.toDate(a.scrollAnchor)})},h.prototype.clearColumns=function(){this.setScrollAnchor(),this.from=void 0,this.to=void 0,this.columns=[],this.visibleColumns=[],this.previousColumns=[],this.nextColumns=[],this.headers=[],this.visibleHeaders=[],this.gantt.api.columns.raise.clear()},h.prototype.generateColumns=function(c,d){if(c||(c=this.gantt.options.value("fromDate")),d||(d=this.gantt.options.value("toDate")),(!c||g.isMoment(c)&&!c.isValid())&&(c=this.gantt.rowsManager.getDefaultFrom(),!c))return!1;if((!d||g.isMoment(d)&&!d.isValid())&&(d=this.gantt.rowsManager.getDefaultTo(),!d))return!1;void 0===c||g.isMoment(c)||(c=g(c)),void 0===d||g.isMoment(d)||(d=g(d)),"expand"===this.gantt.options.value("taskOutOfRange")&&(c=this.gantt.rowsManager.getExpandedFrom(c),d=this.gantt.rowsManager.getExpandedTo(d)),this.setScrollAnchor(),this.from=c,this.to=d;var e=new a(this),f=new b(this);this.columns=e.generate(c,d),this.headers=f.generate(this.columns),this.previousColumns=[],this.nextColumns=[],this.updateColumnsMeta(),this.scrollToScrollAnchor(),this.gantt.api.columns.raise.generate(this.columns,this.headers)},h.prototype.updateColumnsMeta=function(){this.gantt.isRefreshingColumns=!0;var a=this.getLastColumn();this.gantt.originalWidth=void 0!==a?a.originalSize.left+a.originalSize.width:0;var b=this.updateColumnsWidths(this.columns,this.headers,this.previousColumns,this.nextColumns);this.gantt.width=void 0!==a?a.left+a.width:0;var c=this.gantt.options.value("showSide"),d=this.gantt.side.isShown(),e=c!==d;e&&!c&&this.gantt.side.show(!1),this.gantt.rowsManager.updateTasksPosAndSize(),this.gantt.timespansManager.updateTimespansPosAndSize(),this.updateVisibleColumns(b),this.gantt.rowsManager.updateVisibleObjects();var f=this.gantt.options.value("currentDateValue");this.gantt.currentDateManager.setCurrentDate(f),e&&c&&this.gantt.side.show(!0),this.gantt.isRefreshingColumns=!1,this.gantt.api.columns.raise.refresh(this.columns,this.headers)},h.prototype.getLastColumn=function(a){var b=this.columns;return a&&(b=this.nextColumns),b&&b.length>0?b[b.length-1]:void 0},h.prototype.getFirstColumn=function(a){var b=this.columns;return a&&(b=this.previousColumns),b&&b.length>0?b[0]:void 0},h.prototype.getColumnByDate=function(a,b){b||this.expandExtendedColumnsForDate(a);var c=this.previousColumns.concat(this.columns,this.nextColumns),d=f.get(c,a,function(a){return a.date},!0);return void 0!==d[0]?d[0]:d[1]},h.prototype.getColumnByPosition=function(a,b){b||this.expandExtendedColumnsForPosition(a);var c=this.previousColumns.concat(this.columns,this.nextColumns),d=f.get(c,a,function(a){return a.left},!0);return void 0===d[0]?d[1]:d[0]},h.prototype.updateColumnsWidths=function(a,b,c,d){var f=this.gantt.options.value("columnWidth"),g=this.gantt.options.value("expandToFit"),h=this.gantt.options.value("shrinkToFit");if(void 0===f||g||h){var i=this.gantt.getBodyAvailableWidth(),j=this.gantt.columnsManager.getLastColumn(!1);if(void 0!==j){var k=j.originalSize.left+j.originalSize.width;if(g&&i>k||h&&k>i||void 0===f){var l=i/k;return e.setColumnsWidthFactor(a,l),angular.forEach(b,function(a){e.setColumnsWidthFactor(a,l)}),c.splice(0,this.previousColumns.length),d.splice(0,this.nextColumns.length),!0}}}return!1},h.prototype.getColumnsWidth=function(){var a=this.gantt.options.value("columnWidth");return void 0===a&&(a=this.gantt.width<=0?20:this.gantt.width/this.columns.length),a},h.prototype.getColumnsWidthToFit=function(){return this.gantt.getBodyAvailableWidth()/this.columns.length},h.prototype.expandExtendedColumnsForPosition=function(b){if(0>b){var c=this.getFirstColumn(),d=c.date,e=this.getFirstColumn(!0);return(!e||e.left>b)&&(this.previousColumns=new a(this).generate(d,void 0,-b,-this.getColumnsWidth(),!0)),!0}if(b>this.gantt.width){var f=this.getLastColumn(),g=f.getDateByPosition(f.width),h=this.getLastColumn(!0);return(!h||h.left+h.width<b)&&(this.nextColumns=new a(this).generate(g,void 0,b-this.gantt.width,this.gantt.width,!1)),!0}return!1},h.prototype.expandExtendedColumnsForDate=function(b){var c,d=this.getFirstColumn();d&&(c=d.date);var e,f=this.getLastColumn();if(f&&(e=f.getDateByPosition(f.width)),c&&c>b){var g=this.getFirstColumn(!0);return(!g||g.date>b)&&(this.previousColumns=new a(this).generate(c,b,void 0,0,!0)),!0}if(e&&b>=e){var h=this.getLastColumn(!0);return(!h||h.date<e)&&(this.nextColumns=new a(this).generate(e,b,void 0,this.gantt.width,!1)),!0}return!1},h.prototype.getActiveHeadersCount=function(){return this.headers.length},h.prototype.updateVisibleColumns=function(a){this.visibleColumns=c("ganttColumnLimit")(this.columns,this.gantt),this.visibleHeaders=[],angular.forEach(this.headers,function(a){this.visibleHeaders.push(c("ganttColumnLimit")(a,this.gantt))},this),a&&(angular.forEach(this.visibleColumns,function(a){a.updateView()}),angular.forEach(this.visibleHeaders,function(a){angular.forEach(a,function(a){a.updateView()})}));var b=this.gantt.options.value("currentDateValue");this.gantt.currentDateManager.setCurrentDate(b)};var i={year:"YYYY",quarter:"[Q]Q YYYY",month:"MMMM YYYY",week:"w",day:"D",hour:"H",minute:"HH:mm"},j={day:"LL",hour:"H",minute:"HH:mm"},k={year:"YYYY",quarter:"[Q]Q",month:"MMMM"};return h.prototype.getHeaderFormat=function(a){var b,c=this.gantt.options.value("headersFormats");if(void 0!==c&&(b=c[a]),void 0===b){var d=this.gantt.options.value("viewScale");d=d.trim(),"s"===d.charAt(d.length-1)&&(d=d.substring(0,d.length-1));var e,f;d&&(f=d.split(" ")),e=f&&f.length>1?f[f.length-1]:d,["millisecond","second","minute","hour"].indexOf(e)>-1?b=j[a]:["month","quarter","year"].indexOf(e)>-1&&(b=k[a]),void 0===b&&(b=i[a])}return b},h.prototype.getDateRange=function(a){var b,c;return a?this.visibleColumns&&this.visibleColumns.length>0&&(b=this.visibleColumns[0],c=this.visibleColumns[this.visibleColumns.length-1]):(b=this.getFirstColumn(),c=this.getLastColumn()),b&&c?[b.date,c.endDate]:void 0},h}])}(),function(){"use strict";angular.module("gantt").factory("GanttHeaderGenerator",["GanttColumnHeader",function(a){var b=function(b,c,d){var e,f,g,h,i,j=[];d&&(i=d.split(" ")),i&&i.length>1?(g=parseFloat(i[0]),h=i[i.length-1]):(g=1,h=d);for(var k=0,l=c.length;l>k;k++){var m=c[k],n=m.date.get(h);if(0===k||f!==n){f=n;var o=b.getHeaderFormat(h);e=new a(m.date,g,h,m.originalSize.left,m.originalSize.width,o),e.left=m.left,e.width=m.width,j.push(e)}else e.originalSize.width+=m.originalSize.width,e.width+=m.width}return j};return function(a){this.generate=function(c){var d=[];if(void 0===a.gantt.options.value("headers")){var e=a.gantt.options.value("viewScale");e=e.trim(),"s"===e.charAt(e.length-1)&&(e=e.substring(0,e.length-1));var f,g;e&&(g=e.split(" ")),f=g&&g.length>1?g[g.length-1]:e,["quarter","month"].indexOf(f)>-1&&d.push("year"),["day","week"].indexOf(f)>-1&&d.push("month"),["day"].indexOf(f)>-1&&d.push("week"),["hour"].indexOf(f)>-1&&d.push("day"),["minute","second"].indexOf(f)>-1&&d.push("hour"),["second"].indexOf(f)>-1&&d.push("minute"),d.push(e)}else d=a.gantt.options.value("headers");var h=[];return angular.forEach(d,function(d){h.push(b(a,c,d))}),h}}}])}(),function(){"use strict";angular.module("gantt").factory("Gantt",["GanttApi","GanttOptions","GanttCalendar","GanttScroll","GanttBody","GanttRowHeader","GanttHeader","GanttSide","GanttObjectModel","GanttRowsManager","GanttColumnsManager","GanttTimespansManager","GanttCurrentDateManager","ganttArrays","moment","$document","$timeout",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){var r=function(f,q){var r=this;this.$scope=f,this.$element=q,this.options=new b(f,{api:angular.noop,data:[],timespans:[],viewScale:"day",columnMagnet:"15 minutes",timeFramesMagnet:!0,showSide:!0,allowSideResizing:!0,currentDate:"line",currentDateValue:o,autoExpand:"none",taskOutOfRange:"truncate",taskContent:"{{task.model.name}}",rowContent:"{{row.model.name}}",maxHeight:0,timeFrames:[],dateFrames:[],timeFramesWorkingMode:"hidden",timeFramesNonWorkingMode:"visible"}),this.api=new a(this),this.api.registerEvent("core","ready"),this.api.registerEvent("core","rendered"),this.api.registerEvent("directives","controller"),this.api.registerEvent("directives","preLink"),this.api.registerEvent("directives","postLink"),this.api.registerEvent("directives","new"),this.api.registerEvent("directives","destroy"),this.api.registerEvent("data","change"),this.api.registerEvent("data","load"),this.api.registerEvent("data","remove"),this.api.registerEvent("data","clear"),this.api.registerMethod("core","getDateByPosition",this.getDateByPosition,this),this.api.registerMethod("core","getPositionByDate",this.getPositionByDate,this),this.api.registerMethod("data","load",this.loadData,this),this.api.registerMethod("data","remove",this.removeData,this),this.api.registerMethod("data","clear",this.clearData,this),this.api.registerMethod("data","get",this.getData,this),this.calendar=new c(this),this.calendar.registerTimeFrames(this.options.value("timeFrames")),this.calendar.registerDateFrames(this.options.value("dateFrames")),this.api.registerMethod("timeframes","registerTimeFrames",this.calendar.registerTimeFrames,this.calendar),this.api.registerMethod("timeframes","clearTimeframes",this.calendar.clearTimeFrames,this.calendar),this.api.registerMethod("timeframes","registerDateFrames",this.calendar.registerDateFrames,this.calendar),this.api.registerMethod("timeframes","clearDateFrames",this.calendar.clearDateFrames,this.calendar),this.api.registerMethod("timeframes","registerTimeFrameMappings",this.calendar.registerTimeFrameMappings,this.calendar),this.api.registerMethod("timeframes","clearTimeFrameMappings",this.calendar.clearTimeFrameMappings,this.calendar),f.$watchGroup(["timeFrames","dateFrames"],function(a,b){if(a!==b){var c=a[0],d=a[1],e=b[0],f=b[1],g=!1;angular.equals(c,e)||(r.calendar.clearTimeFrames(),r.calendar.registerTimeFrames(c),g=!0),angular.equals(d,f)||(r.calendar.clearDateFrames(),r.calendar.registerDateFrames(d),g=!0),g&&r.columnsManager.generateColumns()}}),f.$watch("columnMagnet",function(){var a,b=r.options.value("columnMagnet");b&&(a=b.trim().split(" ")),a&&a.length>1?(r.columnMagnetValue=parseFloat(a[0]),r.columnMagnetUnit=o.normalizeUnits(a[a.length-1])):(r.columnMagnetValue=1,r.columnMagnetUnit=o.normalizeUnits(b))}),f.$watchGroup(["shiftColumnMagnet","viewScale"],function(){var a,b=r.options.value("shiftColumnMagnet");b&&(a=b.trim().split(" ")),void 0!==a&&a.length>1?(r.shiftColumnMagnetValue=parseFloat(a[0]),r.shiftColumnMagnetUnit=o.normalizeUnits(a[a.length-1])):(r.shiftColumnMagnetValue=1,r.shiftColumnMagnetUnit=o.normalizeUnits(b))});var s=function(a){return r.shiftKey=a.shiftKey,!0};p.on("keyup keydown",s),f.$on("$destroy",function(){p.off("keyup keydown",s)}),this.scroll=new d(this),this.body=new e(this),this.header=new g(this),this.side=new h(this),this.objectModel=new i(this.api),this.rowsManager=new j(this),this.columnsManager=new k(this),this.timespansManager=new l(this),this.currentDateManager=new m(this),this.originalWidth=0,this.width=0,angular.isFunction(this.$scope.api)&&this.$scope.api(this.api);var t=function(a,b){if(void 0===b||a.length!==b.length)return!0;for(var c=0,d=a.length;d>c;c++)if(a[c].id!==b[c].id)return!0;return!1};f.$watchCollection("data",function(a,b){if(void 0!==b){var c=n.getRemovedIds(a,b);if(c.length===b.length)r.rowsManager.removeAll(),r.api.data.raise.clear();else{for(var d=0,e=c.length;e>d;d++){var f=c[d];r.rowsManager.removeRow(f)}var g=[];angular.forEach(b,function(a){c.indexOf(a.id)>-1&&g.push(a)}),r.api.data.raise.remove(g)}}if(void 0!==a){var h=t(a,b);h&&r.rowsManager.resetNonModelLists();for(var i=0,j=a.length;j>i;i++){var k=a[i];r.rowsManager.addRow(k,h)}r.api.data.raise.change(a,b),r.api.data.raise.load(a)}})};return r.prototype.getDateByPosition=function(a,b,c){var d=this.columnsManager.getColumnByPosition(a,c);if(void 0!==d){var e,f;if(b)if(this.shiftKey)if(void 0!==this.shiftColumnMagnetValue&&void 0!==this.shiftColumnMagnetUnit)e=this.shiftColumnMagnetValue,f=this.shiftColumnMagnetUnit;else{var g=this.options.value("viewScale");g=g.trim();var h,i,j;g&&(j=g.split(" ")),j&&j.length>1?(h=parseFloat(j[0]),i=o.normalizeUnits(j[j.length-1])):(h=1,i=o.normalizeUnits(g)),e=.25*h,f=i}else e=this.columnMagnetValue,f=this.columnMagnetUnit;return d.getDateByPosition(a-d.left,e,f,this.options.value("timeFramesMagnet"))}return void 0},r.prototype.getBodyAvailableWidth=function(){var a=this.getWidth()-this.side.getWidth(),b=this.scroll.getBordersWidth(),c=a-(void 0!==b?this.scroll.getBordersWidth():0);return c-=1},r.prototype.getPositionByDate=function(a,b){if(void 0===a)return void 0;o.isMoment(o)||(a=o(a));var c=this.columnsManager.getColumnByDate(a,b);return void 0!==c?c.getPositionByDate(a):void 0},r.prototype.loadData=function(a){if(angular.isArray(a)||(a=void 0!==a?[a]:[]),void 0===this.$scope.data)this.$scope.data=a;else for(var b=0,c=a.length;c>b;b++){var d=a[b],e=n.indexOfId(this.$scope.data,d.id);e>-1?this.$scope.data[e]=d:this.$scope.data.push(d)}var f=this.side.getWidth();f>0&&this.options.set("sideWidth",f)},r.prototype.getData=function(){return this.$scope.data},r.prototype.removeData=function(a){if(angular.isArray(a)||(a=void 0!==a?[a]:[]),void 0!==this.$scope.data)for(var b=0,c=a.length;c>b;b++){var d=a[b],e=n.indexOfId(this.$scope.data,d.id);if(e>-1)if(void 0===d.tasks||0===d.tasks.length)this.$scope.data.splice(e,1);else for(var f=this.$scope.data[e],g=0,h=d.tasks.length;h>g;g++){var i=d.tasks[g],j=n.indexOfId(f.tasks,i.id);j>-1&&f.tasks.splice(j,1)}}},r.prototype.clearData=function(){this.$scope.data=void 0},r.prototype.getWidth=function(){return this.$scope.ganttElementWidth},r.prototype.initialized=function(){this.api.core.raise.ready(this.api),this.rendered=!0,this.columnsManager.generateColumns();var a=this,b=function(){var b=a.side.getWidth();b>0&&a.options.set("sideWidth",b),a.api.core.raise.rendered(a.api)};q(b)},r}])}(),function(){"use strict";angular.module("gantt").factory("GanttObjectModel",["ganttUtils","moment",function(a,b){ -var c=function(a){this.api=a,this.api.registerEvent("tasks","clean"),this.api.registerEvent("rows","clean"),this.api.registerEvent("timespans","clean")};return c.prototype.cleanTask=function(c){void 0===c.id&&(c.id=a.randomUuid()),void 0===c.from||b.isMoment(c.from)||(c.from=b(c.from)),void 0===c.to||b.isMoment(c.to)||(c.to=b(c.to)),this.api.tasks.raise.clean(c)},c.prototype.cleanRow=function(c){void 0===c.id&&(c.id=a.randomUuid()),void 0===c.from||b.isMoment(c.from)||(c.from=b(c.from)),void 0===c.to||b.isMoment(c.to)||(c.to=b(c.to)),this.api.rows.raise.clean(c)},c.prototype.cleanTimespan=function(c){void 0===c.id&&(c.id=a.randomUuid()),void 0===c.from||b.isMoment(c.from)||(c.from=b(c.from)),void 0===c.to||b.isMoment(c.to)||(c.to=b(c.to)),this.api.timespans.raise.clean(c)},c}])}(),function(){"use strict";angular.module("gantt").factory("GanttRow",["GanttTask","moment","$filter",function(a,b,c){var d=function(a,b){this.rowsManager=a,this.model=b,this.from=void 0,this.to=void 0,this.tasksMap={},this.tasks=[],this.filteredTasks=[],this.visibleTasks=[]};return d.prototype.addTaskImpl=function(a,b){this.tasksMap[a.model.id]=a,this.tasks.push(a),b||(void 0===this.model.tasks&&(this.model.tasks=[]),-1===this.model.tasks.indexOf(a.model)&&this.model.tasks.push(a.model))},d.prototype.addTask=function(b,c){var d,e=!1;if(this.rowsManager.gantt.objectModel.cleanTask(b),b.id in this.tasksMap){if(d=this.tasksMap[b.id],d.model===b)return d;d.model=b,e=!0}else d=new a(this,b),this.addTaskImpl(d,c);return this.sortTasks(),this.setFromToByTask(d),c||(e?this.rowsManager.gantt.api.tasks.raise.change(d):this.rowsManager.gantt.api.tasks.raise.add(d)),d},d.prototype.moveTaskToRow=function(a,b){var c=a.row;c.removeTask(a.model.id,b,!0),a.row=this,this.addTaskImpl(a,b),this.sortTasks(),this.setFromToByTask(a),a.updatePosAndSize(),this.updateVisibleTasks(),b||this.rowsManager.gantt.api.tasks.raise.rowChange(a,c)},d.prototype.updateVisibleTasks=function(){var a=this.rowsManager.gantt.options.value("filterTask");if(a){"object"==typeof a&&(a={model:a});var b=this.rowsManager.gantt.options.value("filterTaskComparator");"function"==typeof b&&(b=function(a,c){return b(a.model,c.model)}),this.filteredTasks=c("filter")(this.tasks,a,b)}else this.filteredTasks=this.tasks.slice(0);this.visibleTasks=c("ganttTaskLimit")(this.filteredTasks,this.rowsManager.gantt)},d.prototype.updateTasksPosAndSize=function(){for(var a=0,b=this.tasks.length;b>a;a++)this.tasks[a].updatePosAndSize()},d.prototype.removeTask=function(a,b,c){if(a in this.tasksMap){var d,e,f=this.tasksMap[a];for(e=this.tasks.length-1;e>=0;e--)if(d=this.tasks[e],d.model.id===a){this.tasks.splice(e,1),(this.from-d.model.from===0||this.to-d.model.to===0)&&this.setFromTo();break}for(e=this.filteredTasks.length-1;e>=0;e--)if(d=this.filteredTasks[e],d.model.id===a){this.filteredTasks.splice(e,1);break}for(e=this.visibleTasks.length-1;e>=0;e--)if(d=this.visibleTasks[e],d.model.id===a){this.visibleTasks.splice(e,1);break}if(!b){if(delete this.tasksMap[a],void 0!==this.model.tasks){var g=this.model.tasks.indexOf(f.model);g>-1&&this.model.tasks.splice(g,1)}c||this.rowsManager.gantt.api.tasks.raise.remove(f)}return f}},d.prototype.removeAllTasks=function(){this.from=void 0,this.to=void 0,this.tasksMap={},this.tasks=[],this.filteredTasks=[],this.visibleTasks=[]},d.prototype.setFromTo=function(){this.from=void 0,this.to=void 0;for(var a=0,b=this.tasks.length;b>a;a++)this.setFromToByTask(this.tasks[a])},d.prototype.setFromToByTask=function(a){this.setFromToByValues(a.model.from,a.model.to)},d.prototype.setFromToByValues=function(a,c){void 0!==a&&(void 0===this.from?this.from=b(a):a<this.from&&(this.from=b(a))),void 0!==c&&(void 0===this.to?this.to=b(c):c>this.to&&(this.to=b(c)))},d.prototype.sortTasks=function(){this.tasks.sort(function(a,b){return a.left-b.left})},d.prototype.clone=function(){for(var a=new d(this.rowsManager,angular.copy(this)),b=0,c=this.tasks.length;c>b;b++)a.addTask(this.tasks[b].model);return a},d}])}(),function(){"use strict";angular.module("gantt").factory("GanttRowHeader",[function(){var a=function(a){this.gantt=a};return a}])}(),function(){"use strict";angular.module("gantt").factory("GanttRowsManager",["GanttRow","ganttArrays","$filter","$timeout","moment",function(a,b,c,d,e){var f=function(a){var b=this;this.gantt=a,this.rowsMap={},this.rows=[],this.sortedRows=[],this.filteredRows=[],this.customFilteredRows=[],this.visibleRows=[],this.rowsTaskWatchers=[],this._defaultFilterImpl=function(a,b,d){return c("filter")(a,b,d)},this.filterImpl=this._defaultFilterImpl,this.customRowSorters=[],this.customRowFilters=[],this.gantt.$scope.$watchGroup(["filterTask","filterTaskComparator"],function(a,c){a!==c&&b.updateVisibleTasks()}),this.gantt.$scope.$watchGroup(["filterRow","filterRowComparator"],function(a,c){a!==c&&b.updateVisibleRows()}),this.gantt.$scope.$watch("sortMode",function(a,c){a!==c&&b.sortRows()});var e=this.gantt.scroll.isVScrollbarVisible();this.gantt.$scope.$watchGroup(["maxHeight","gantt.rowsManager.visibleRows.length"],function(a,c){a!==c&&d(function(){var a=b.gantt.scroll.isVScrollbarVisible();a!==e&&(e=a,b.gantt.columnsManager.updateColumnsMeta())})}),this.gantt.api.registerMethod("rows","sort",f.prototype.sortRows,this),this.gantt.api.registerMethod("rows","applySort",f.prototype.applySort,this),this.gantt.api.registerMethod("rows","refresh",f.prototype.updateVisibleObjects,this),this.gantt.api.registerMethod("rows","removeRowSorter",f.prototype.removeCustomRowSorter,this),this.gantt.api.registerMethod("rows","addRowSorter",f.prototype.addCustomRowSorter,this),this.gantt.api.registerMethod("rows","removeRowFilter",f.prototype.removeCustomRowFilter,this),this.gantt.api.registerMethod("rows","addRowFilter",f.prototype.addCustomRowFilter,this),this.gantt.api.registerMethod("rows","setFilterImpl",f.prototype.setFilterImpl,this),this.gantt.api.registerEvent("tasks","add"),this.gantt.api.registerEvent("tasks","change"),this.gantt.api.registerEvent("tasks","viewChange"),this.gantt.api.registerEvent("tasks","rowChange"),this.gantt.api.registerEvent("tasks","remove"),this.gantt.api.registerEvent("tasks","filter"),this.gantt.api.registerEvent("rows","add"),this.gantt.api.registerEvent("rows","change"),this.gantt.api.registerEvent("rows","remove"),this.gantt.api.registerEvent("rows","move"),this.gantt.api.registerEvent("rows","filter"),this.updateVisibleObjects()};return f.prototype.resetNonModelLists=function(){this.rows=[],this.sortedRows=[],this.filteredRows=[],this.customFilteredRows=[],this.visibleRows=[]},f.prototype.addRow=function(c,d){var e,f,g,h=!1;if(this.gantt.objectModel.cleanRow(c),c.id in this.rowsMap){if(e=this.rowsMap[c.id],d&&(this.rows.push(e),this.sortedRows.push(e),this.filteredRows.push(e),this.customFilteredRows.push(e),this.visibleRows.push(e)),e.model===c)return;var i=b.getRemovedIds(c.tasks,e.model.tasks);for(f=0,g=i.length;g>f;f++){var j=i[f];e.removeTask(j)}e.model=c,h=!0}else e=new a(this,c),this.rowsMap[c.id]=e,this.rows.push(e),this.sortedRows.push(e),this.filteredRows.push(e),this.customFilteredRows.push(e),this.visibleRows.push(e);if(void 0!==c.tasks&&c.tasks.length>0){for(f=0,g=c.tasks.length;g>f;f++){var k=c.tasks[f];e.addTask(k)}e.updateVisibleTasks()}if(h?this.gantt.api.rows.raise.change(e):this.gantt.api.rows.raise.add(e),!h){var l=this.gantt.$scope.$watchCollection(function(){return c.tasks},function(a,c){if(a!==c){var d,f,g=b.getRemovedIds(a,c);for(d=0,f=g.length;f>d;d++){var h=g[d];e.removeTask(h)}if(void 0!==a){for(d=0,f=a.length;f>d;d++){var i=a[d];e.addTask(i)}e.updateVisibleTasks()}}});this.rowsTaskWatchers.push(l)}return h},f.prototype.removeRow=function(a){if(a in this.rowsMap){delete this.rowsMap[a];var c,d,e=b.indexOfId(this.rows,a,["model","id"]);if(e>-1){c=this.rows.splice(e,1)[0];var f=this.rowsTaskWatchers.splice(e,1)[0];f()}return b.removeId(this.sortedRows,a,["model","id"]),b.removeId(this.filteredRows,a,["model","id"]),b.removeId(this.customFilteredRows,a,["model","id"]),b.removeId(this.visibleRows,a,["model","id"]),this.gantt.api.rows.raise.remove(c),d}return void 0},f.prototype.removeAll=function(){this.rowsMap={},this.rows=[],this.sortedRows=[],this.filteredRows=[],this.customFilteredRows=[],this.visibleRows=[];for(var a=0,b=this.rowsTaskWatchers.length;b>a;a++){var c=this.rowsTaskWatchers[a];c()}this.rowsTaskWatchers=[]},f.prototype.sortRows=function(){var a=this.gantt.options.value("sortMode");if(void 0!==a){var b=!1;angular.isString(a)&&"-"===a.charAt(0)&&(b=!0,a=a.substr(1));var d=c("orderBy");this.sortedRows=d(this.rows,a,b)}else this.sortedRows=this.rows.slice();this.sortedRows=this.applyCustomRowSorters(this.sortedRows),this.updateVisibleRows()},f.prototype.removeCustomRowSorter=function(a){var b=this.customRowSorters.indexOf(a);b>-1&&this.customRowSorters.splice(b,1)},f.prototype.addCustomRowSorter=function(a){this.customRowSorters.push(a)},f.prototype.applyCustomRowSorters=function(a){return angular.forEach(this.customRowSorters,function(b){a=b(a)}),a},f.prototype.applySort=function(){for(var a=this.gantt.$scope.data;a>0;)a.pop();for(var b=[],c=0,d=this.sortedRows.length;d>c;c++)a.push(this.sortedRows[c].model),b.push(this.sortedRows[c]);this.rows=b},f.prototype.moveRow=function(a,c){var d=this.gantt.options.value("sortMode");void 0!==d&&(this.applySort(),this.gantt.options.set("sortMode",void 0));var e=this.rows.indexOf(c),f=this.rows.indexOf(a);e>-1&&f>-1&&e!==f&&(b.moveToIndex(this.rows,f,e),b.moveToIndex(this.rowsTaskWatchers,f,e),b.moveToIndex(this.gantt.$scope.data,f,e),this.gantt.api.rows.raise.change(a),this.gantt.api.rows.raise.move(a,f,e),this.updateVisibleObjects(),this.sortRows())},f.prototype.updateVisibleObjects=function(){this.updateVisibleRows(),this.updateVisibleTasks()},f.prototype.updateVisibleRows=function(){var a=this.filteredRows,b=this.gantt.options.value("filterRow");if(b){"object"==typeof b&&(b={model:b});var c=this.gantt.options.value("filterRowComparator");if("function"==typeof c){var d=this.gantt;c=function(a,b){return d.options.value("filterRowComparator")(a,b)}}this.filteredRows=this.filterImpl(this.sortedRows,b,c)}else this.filteredRows=this.sortedRows.slice(0);var e=!angular.equals(a,this.filteredRows);this.customFilteredRows=this.applyCustomRowFilters(this.filteredRows),this.visibleRows=this.customFilteredRows,e&&this.gantt.api.rows.raise.filter(this.sortedRows,this.filteredRows)},f.prototype.removeCustomRowFilter=function(a){var b=this.customRowFilters.indexOf(a);b>-1&&this.customRowFilters.splice(b,1)},f.prototype.addCustomRowFilter=function(a){this.customRowFilters.push(a)},f.prototype.applyCustomRowFilters=function(a){return angular.forEach(this.customRowFilters,function(b){a=b(a)}),a},f.prototype.setFilterImpl=function(a){a?this.filterImpl=a:this.filterImpl=this._defaultFilterImpl},f.prototype.updateVisibleTasks=function(){var a=[],b=[],c=[];angular.forEach(this.rows,function(d){a=a.concat(d.filteredTasks),d.updateVisibleTasks(),b=b.concat(d.filteredTasks),c=c.concat(d.tasks)});var d=!angular.equals(a,b);d&&this.gantt.api.tasks.raise.filter(c,b)},f.prototype.updateTasksPosAndSize=function(){for(var a=0,b=this.rows.length;b>a;a++)this.rows[a].updateTasksPosAndSize()},f.prototype.getExpandedFrom=function(a){a=a?e(a):a;var b=a;return angular.forEach(this.rows,function(a){(void 0===b||b>a.from)&&(b=a.from)}),b&&(!a||a>b)?b:a},f.prototype.getExpandedTo=function(a){a=a?e(a):a;var b=a;angular.forEach(this.rows,function(a){(void 0===b||b<a.to)&&(b=a.to)});var c=this.gantt.options.value("toDate");return b&&(!c||b>c)?b:a},f.prototype.getDefaultFrom=function(){var a;return angular.forEach(this.rows,function(b){(void 0===a||b.from<a)&&(a=b.from)}),a},f.prototype.getDefaultTo=function(){var a;return angular.forEach(this.rows,function(b){(void 0===a||b.to>a)&&(a=b.to)}),a},f}])}(),function(){"use strict";angular.module("gantt").factory("GanttTask",["moment",function(a){var b=function(a,b){this.rowsManager=a.rowsManager,this.row=a,this.model=b,this.truncatedLeft=!1,this.truncatedRight=!1};return b.prototype.isMilestone=function(){return!this.model.to||this.model.from-this.model.to===0},b.prototype.isOutOfRange=function(){var a=this.rowsManager.gantt.columnsManager.getFirstColumn(),b=this.rowsManager.gantt.columnsManager.getLastColumn();return void 0===a||this.model.to<a.date||void 0===b||this.model.from>b.endDate},b.prototype.updatePosAndSize=function(){var b=this.left,c=this.width,d=this.truncatedRight,e=this.truncatedLeft;!this.isMoving&&this.isOutOfRange()?(this.modelLeft=void 0,this.modelWidth=void 0):(this.modelLeft=this.rowsManager.gantt.getPositionByDate(this.model.from),this.modelWidth=this.rowsManager.gantt.getPositionByDate(this.model.to)-this.modelLeft);var f=this.rowsManager.gantt.columnsManager.getLastColumn(),g=f?f.left+f.width:0,h=this.modelLeft,i=this.modelWidth;this.rowsManager.gantt.options.value("daily")&&(h=this.rowsManager.gantt.getPositionByDate(a(this.model.from).startOf("day")),i=this.rowsManager.gantt.getPositionByDate(a(this.model.to).endOf("day"))-h),void 0===h||void 0===i||0>h+i||h>g?(this.left=void 0,this.width=void 0):(this.left=Math.min(Math.max(h,0),this.rowsManager.gantt.width),0>h?(this.truncatedLeft=!0,i+h>this.rowsManager.gantt.width?(this.truncatedRight=!0,this.width=this.rowsManager.gantt.width):(this.truncatedRight=!1,this.width=i+h)):i+h>this.rowsManager.gantt.width?(this.truncatedRight=!0,this.truncatedLeft=!1,this.width=this.rowsManager.gantt.width-h):(this.truncatedLeft=!1,this.truncatedRight=!1,this.width=i),this.width<0&&(this.left=this.left+this.width,this.width=-this.width)),this.updateView(),this.rowsManager.gantt.isRefreshingColumns||b===this.left&&c===this.width&&d===this.truncatedRight&&e===this.truncatedLeft||this.rowsManager.gantt.api.tasks.raise.viewChange(this)},b.prototype.updateView=function(){if(this.$element)if(void 0===this.left||void 0===this.width)this.$element.css("display","none");else{if(this.$element.css({left:this.left+"px",width:this.width+"px",display:""}),this.model.priority>0){var a=this.model.priority;angular.forEach(this.$element.children(),function(b){angular.element(b).css("z-index",a)})}this.$element.toggleClass("gantt-task-milestone",this.isMilestone())}},b.prototype.getBackgroundElement=function(){if(void 0!==this.$element){var a=this.$element[0].querySelector(".gantt-task-background");return void 0!==a&&(a=angular.element(a)),a}},b.prototype.getContentElement=function(){if(void 0!==this.$element){var a=this.$element[0].querySelector(".gantt-task-content");return void 0!==a&&(a=angular.element(a)),a}},b.prototype.getForegroundElement=function(){if(void 0!==this.$element){var a=this.$element[0].querySelector(".gantt-task-foreground");return void 0!==a&&(a=angular.element(a)),a}},b.prototype.setFrom=function(a,b){this.model.from=this.rowsManager.gantt.getDateByPosition(a,b),this.row.setFromTo(),this.updatePosAndSize()},b.prototype.setTo=function(a,b){this.model.to=this.rowsManager.gantt.getDateByPosition(a,b),this.row.setFromTo(),this.updatePosAndSize()},b.prototype.moveTo=function(a,b){var c,d;a>this.modelLeft?(this.model.to=this.rowsManager.gantt.getDateByPosition(a+this.modelWidth,b),c=this.rowsManager.gantt.getPositionByDate(this.model.to),d=c-this.modelWidth,this.model.from=this.rowsManager.gantt.getDateByPosition(d,!1)):(this.model.from=this.rowsManager.gantt.getDateByPosition(a,b),d=this.rowsManager.gantt.getPositionByDate(this.model.from),c=d+this.modelWidth,this.model.to=this.rowsManager.gantt.getDateByPosition(c,!1)),this.row.setFromTo(),this.updatePosAndSize()},b.prototype.clone=function(){return new b(this.row,angular.copy(this.model))},b}])}(),function(){"use strict";angular.module("gantt").factory("GanttBody",["GanttBodyColumns","GanttBodyRows","GanttBodyBackground","GanttBodyForeground",function(a,b,c,d){var e=function(e){this.gantt=e,this.background=new c(this),this.foreground=new d(this),this.columns=new a(this),this.rows=new b(this)};return e}])}(),function(){"use strict";angular.module("gantt").factory("GanttBodyBackground",[function(){var a=function(a){this.body=a};return a}])}(),function(){"use strict";angular.module("gantt").factory("GanttBodyColumns",[function(){var a=function(a){this.body=a};return a}])}(),function(){"use strict";angular.module("gantt").factory("GanttBodyForeground",[function(){var a=function(a){this.body=a};return a}])}(),function(){"use strict";angular.module("gantt").factory("GanttBodyRows",[function(){var a=function(a){this.body=a};return a}])}(),function(){"use strict";angular.module("gantt").factory("GanttHeader",["GanttHeaderColumns",function(a){var b=function(b){this.gantt=b,this.columns=new a(this),this.getHeight=function(){return this.$element[0].offsetHeight}};return b}])}(),function(){"use strict";angular.module("gantt").factory("GanttHeaderColumns",[function(){var a=function(a){this.$element=a};return a}])}(),function(){"use strict";angular.module("gantt").factory("GanttScroll",[function(){var a=function(b){this.gantt=b,this.gantt.api.registerEvent("scroll","scroll"),this.gantt.api.registerMethod("scroll","to",a.prototype.scrollTo,this),this.gantt.api.registerMethod("scroll","toDate",a.prototype.scrollToDate,this),this.gantt.api.registerMethod("scroll","left",a.prototype.scrollToLeft,this),this.gantt.api.registerMethod("scroll","right",a.prototype.scrollToRight,this),this.gantt.api.registerMethod("scroll","setWidth",a.prototype.setWidth,this)};return a.prototype.getScrollLeft=function(){return void 0===this.$element?void 0:(void 0===this.cachedScrollLeft&&(this.cachedScrollLeft=this.$element[0].scrollLeft),this.cachedScrollLeft)},a.prototype.getScrollWidth=function(){return void 0===this.$element?void 0:this.$element[0].scrollWidth},a.prototype.getWidth=function(){return void 0===this.$element?void 0:this.$element[0].offsetWidth},a.prototype.setWidth=function(a){this.$element[0]&&(this.$element[0].offsetWidth=a)},a.prototype.getBordersWidth=function(){return void 0===this.$element?void 0:this.$element[0].offsetWidth-this.$element[0].clientWidth},a.prototype.getBordersHeight=function(){return void 0===this.$element?void 0:this.$element[0].offsetHeight-this.$element[0].clientHeight},a.prototype.isVScrollbarVisible=function(){return void 0!==this.$element?this.$element[0].scrollHeight>this.$element[0].offsetHeight:void 0},a.prototype.isHScrollbarVisible=function(){return void 0!==this.$element?this.$element[0].scrollWidth>this.$element[0].offsetWidth:void 0},a.prototype.scrollTo=function(a){this.$element[0].scrollLeft=a,this.$element.triggerHandler("scroll")},a.prototype.scrollToLeft=function(a){this.$element[0].scrollLeft-=a,this.$element.triggerHandler("scroll")},a.prototype.scrollToRight=function(a){this.$element[0].scrollLeft+=a,this.$element.triggerHandler("scroll")},a.prototype.scrollToDate=function(a){var b=this.gantt.getPositionByDate(a);void 0!==b&&(this.$element[0].scrollLeft=b-this.$element[0].offsetWidth/2)},a}])}(),function(){"use strict";angular.module("gantt").factory("GanttSide",[function(){var a=function(a){this.gantt=a};return a.prototype.getWidth=function(){if(this.gantt.options.value("showSide")){var a=this.gantt.options.value("sideWidth");if(void 0===a&&void 0!==this.$element&&(void 0!==this.$element.css("width")&&this.$element.css("width",""),a=this.$element[0].offsetWidth),void 0!==a)return a}return 0},a.prototype.show=function(a){void 0!==this.$element&&this.$element.toggleClass("ng-hide",!a)},a.prototype.isShown=function(){return void 0!==this.$element?!this.$element.hasClass("ng-hide"):void 0},a}])}(),function(){"use strict";angular.module("gantt").factory("GanttTimespan",[function(){var a=function(a,b){this.gantt=a,this.model=b};return a.prototype.updatePosAndSize=function(){this.modelLeft=this.gantt.getPositionByDate(this.model.from),this.modelWidth=this.gantt.getPositionByDate(this.model.to)-this.modelLeft;var a=this.gantt.columnsManager.getLastColumn(),b=a?a.left+a.width:0;this.modelLeft+this.modelWidth<0||this.modelLeft>b?(this.left=void 0,this.width=void 0):(this.left=Math.min(Math.max(this.modelLeft,0),this.gantt.width),this.modelLeft<0?(this.truncatedLeft=!0,this.modelWidth+this.modelLeft>this.gantt.width?(this.truncatedRight=!0,this.width=this.gantt.width):(this.truncatedRight=!1,this.width=this.modelWidth+this.modelLeft)):this.modelWidth+this.modelLeft>this.gantt.width?(this.truncatedRight=!0,this.truncatedLeft=!1,this.width=this.gantt.width-this.modelLeft):(this.truncatedLeft=!1,this.truncatedRight=!1,this.width=this.modelWidth),this.width<0&&(this.left=this.left+this.width,this.width=-this.width)),this.updateView()},a.prototype.updateView=function(){this.$element&&(void 0===this.left||void 0===this.width?this.$element.css("display","none"):(this.$element.css("display",""),this.$element.css("left",this.left+"px"),this.$element.css("width",this.width+"px")))},a.prototype.setFrom=function(a){this.from=this.gantt.getDateByPosition(a),this.updatePosAndSize()},a.prototype.setTo=function(a){this.to=this.gantt.getDateByPosition(a),this.updatePosAndSize()},a.prototype.moveTo=function(a){this.from=this.gantt.getDateByPosition(a),this.to=this.gantt.getDateByPosition(a+this.width),this.updatePosAndSize()},a.prototype.clone=function(){return new a(this.gantt,angular.copy(this.model))},a}])}(),function(){"use strict";angular.module("gantt").factory("GanttTimespansManager",["GanttTimespan",function(a){var b=function(a){var b=this;this.gantt=a,this.timespansMap={},this.timespans=[],this.gantt.$scope.$watchCollection("timespans",function(a){b.clearTimespans(),b.loadTimespans(a)}),this.gantt.api.registerMethod("timespans","load",this.loadTimespans,this),this.gantt.api.registerMethod("timespans","remove",this.removeTimespans,this),this.gantt.api.registerMethod("timespans","clear",this.clearTimespans,this),this.gantt.api.registerEvent("timespans","add"),this.gantt.api.registerEvent("timespans","remove"),this.gantt.api.registerEvent("timespans","change")};return b.prototype.loadTimespans=function(a){angular.isArray(a)||(a=void 0!==a?[a]:[]),this.gantt.$scope.timespans=a;for(var b=0,c=a.length;c>b;b++){var d=a[b];this.gantt.objectModel.cleanTimespan(d),this.loadTimespan(d)}},b.prototype.loadTimespan=function(b){var c,d=!1;return b.id in this.timespansMap?(c=this.timespansMap[b.id],c.model=b,d=!0,this.gantt.api.timespans.raise.change(c)):(c=new a(this.gantt,b),this.timespansMap[b.id]=c,this.timespans.push(c),this.gantt.api.timespans.raise.add(c)),c.updatePosAndSize(),d},b.prototype.removeTimespans=function(a){angular.isArray(a)||(a=[a]);for(var b=0,c=a.length;c>b;b++){var d=a[b];this.removeTimespan(d.id)}this.updateVisibleObjects()},b.prototype.removeTimespan=function(a){if(a in this.timespansMap){delete this.timespansMap[a];for(var b,c,d=this.timespans.length-1;d>=0;d--)if(c=this.timespans[d],c.model.id===a){b=c,this.timespans.splice(d,1);break}return this.gantt.api.timespans.raise.remove(b),b}return void 0},b.prototype.clearTimespans=function(){this.timespansMap={},this.timespans=[]},b.prototype.updateTimespansPosAndSize=function(){for(var a=0,b=this.timespans.length;b>a;a++)this.timespans[a].updatePosAndSize()},b}])}(),function(){"use strict";angular.module("gantt").service("ganttArrays",[function(){return{moveToIndex:function(a,b,c){if(c>=a.length)for(var d=c-a.length;d--+1;)a.push(void 0);return a.splice(c,0,a.splice(b,1)[0]),a},getRemovedIds:function(a,b,c){void 0===c&&(c="id");var d,e,f=[];if(void 0!==b)for(d=0,e=b.length;e>d;d++)f.push(b[d][c]);if(void 0!==a)for(d=0,e=a.length;e>d;d++){var g=a[d];if(void 0!==g[c]){var h=f.indexOf(g[c]);h>-1&&f.splice(h,1)}}return f},indexOfId:function(a,b,c){var d;if(void 0===c)c="id";else if(c instanceof Array){for(d=a.length-1;d>=0;d--){for(var e=a[d],f=0,g=c.length;g>f;f++)e=e[c[f]];if(e===b)return d}return-1}for(d=a.length-1;d>=0;d--)if(a[d][c]===b)return d;return-1},removeId:function(a,b,c){var d=this.indexOfId(a,b,c);return d>-1?a.splice(d,1)[0]:void 0},remove:function(a,b){var c=a.indexOf(b);return c>-1?(a.splice(c,1),!0):!1}}}])}(),function(){"use strict";angular.module("gantt").service("ganttBinarySearch",[function(){return{getIndicesOnly:function(a,b,c,d){for(var e=-1,f=a.length;f-e>1;){var g=Math.floor((e+f)/2);(d?c(a[g])<b:c(a[g])<=b)?e=g:f=g}return d||void 0===a[e]||c(a[e])!==b||(f=e),[e,f]},get:function(a,b,c,d){var e=this.getIndicesOnly(a,b,c,d);return[a[e[0]],a[e[1]]]}}}])}(),function(){"use strict";angular.module("gantt").factory("GanttHierarchy",[function(){var a=function(){var a=this,b={},c={},d={},e={},f={},g={},h=function(a,b){if(void 0!==b){var c=d[a.model.name];void 0===c&&(c=[],d[a.model.name]=c),c.push(b);var h=e[a.model.id];void 0===h&&(h=[],e[a.model.id]=h),h.push(b),f[b.model.name]=a,g[b.model.id]=a}};this.refresh=function(i){b={},c={},d={},e={},f={},g={},angular.forEach(i,function(a){b[a.model.name]=a,c[a.model.id]=a}),angular.forEach(i,function(a){if(void 0!==a.model.parent){var d=b[a.model.parent];void 0===d&&(d=c[a.model.parent]),void 0!==d&&h(d,a)}void 0!==a.model.children&&angular.forEach(a.model.children,function(d){var e=b[d];void 0===e&&(e=c[d]),void 0!==e&&h(a,e)})});var j=[];return angular.forEach(i,function(b){void 0===a.parent(b)&&j.push(b)}),j},this.children=function(a){var b=e[a.model.id];return b},this.descendants=function(b){var c=[],d=a.children(b);return c.push.apply(c,d),void 0!==d&&angular.forEach(d,function(b){var d=a.descendants(b);c.push.apply(c,d)}),c},this.parent=function(a){var b=g[a.model.id];return b},this.ancestors=function(b){for(var c=[],d=a.parent(b);void 0!==d;)c.push(d),d=a.parent(d);return c}};return a}])}(),function(){"use strict";angular.module("gantt").service("ganttUtils",[function(){return{createBoundedWrapper:function(a,b){return function(){return b.apply(a,arguments)}},firstProperty:function(a,b,c){for(var d=0,e=a.length;e>d;d++){var f=a[d];if(void 0!==f&&b in f&&void 0!==f[b])return f[b]}return c},random4:function(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)},randomUuid:function(){return this.random4()+this.random4()+"-"+this.random4()+"-"+this.random4()+"-"+this.random4()+"-"+this.random4()+this.random4()+this.random4()},newId:function(){var a=(new Date).getTime();return function(){return a+=1}}()}}])}(),function(){"use strict";angular.module("gantt").filter("ganttColumnLimit",["ganttBinarySearch",function(a){var b=function(a){return a.left};return function(c,d){var e=d.scroll.getScrollLeft(),f=d.getWidth()-d.side.getWidth();if(f>0){var g=a.getIndicesOnly(c,e,b)[0],h=a.getIndicesOnly(c,e+f,b)[1];return c.slice(g,h)}return c.slice()}}])}(),function(){"use strict";angular.module("gantt").filter("ganttTaskLimit",[function(){return function(a,b){var c=b.columnsManager.getFirstColumn(),d=b.columnsManager.getLastColumn();if(void 0!==c&&void 0!==d){for(var e=c.date,f=d.endDate,g=[],h=b.scroll.getScrollLeft(),i=b.getWidth()-b.side.getWidth(),j=0,k=a.length;k>j;j++){var l=a[j];l.active?g.push(l):l.model.to>=e&&l.model.from<=f&&(void 0===l.left&&l.updatePosAndSize(),(!i||l.left>=h&&l.left<=h+i||l.left+l.width>=h&&l.left+l.width<=h+i||l.left<h&&l.left+l.width>h+i)&&g.push(l))}return g}return a.splice()}}])}(),function(){"use strict";angular.module("gantt").directive("ganttResizer",["$document","$parse","$timeout","ganttMouseOffset",function(a,b,c,d){return{restrict:"A",require:"^gantt",scope:{targetElement:"=ganttResizer",enabled:"@?ganttResizerEnabled"},link:function(e,f,g,h){function i(a){a.preventDefault(),m(void 0)}function j(b){b.preventDefault(),void 0!==p&&o[p].raise.resizeBegin(n()),a.on("mousemove",k),a.on("mouseup",l)}function k(a){e.$evalAsync(function(){var b=d.getOffsetForElement(e.targetElement[0],a),c=h.gantt.getWidth()-h.gantt.scroll.getBordersWidth(),f=Math.min(Math.max(b.x,0),c);m(f)})}function l(){void 0!==p&&o[p].raise.resizeEnd(n()),a.unbind("mousemove",k),a.unbind("mouseup",l)}function m(a){a!==n()&&(h.gantt.options.set(g.resizerWidth,a),void 0!==p&&o[p].raise.resize(a),c(function(){h.gantt.columnsManager.updateColumnsMeta()}))}function n(){return h.gantt.options.value(g.resizerWidth)}var o=h.gantt.api,p=g.ganttResizerEventTopic;void 0===e.enabled&&(e.enabled=!0),g.$observe("ganttResizerEnabled",function(a){e.enabled=b(a)()}),e.$watch("enabled",function(a){void 0===a&&(a=!0),f.toggleClass("gantt-resizer-enabled",a),a?(f.on("dblclick",i),f.on("mousedown",j)):(f.off("dblclick",i),f.off("mousedown",j))}),e.$watch(function(){return n()},function(a,b){a!==b&&(e.targetElement.css("width",a+"px"),e.targetElement[0].offsetWidth>0&&m(e.targetElement[0].offsetWidth))}),p&&(o.registerEvent(p,"resize"),o.registerEvent(p,"resizeBegin"),o.registerEvent(p,"resizeEnd"),o.registerMethod(p,"setWidth",m,this),o.registerMethod(p,"getWidth",n,this))}}}])}(),function(){"use strict";angular.module("gantt").directive("ganttHorizontalScrollReceiver",function(){return{restrict:"A",require:"^ganttScrollManager",link:function(a,b,c,d){d.registerHorizontalReceiver(b)}}})}(),function(){"use strict";angular.module("gantt").directive("ganttScrollManager",function(){return{restrict:"A",scope:{},controller:["$scope",function(a){a.horizontal=[],a.vertical=[],this.registerVerticalReceiver=function(b){b.css("position","relative"),a.vertical.push(b[0])},this.registerHorizontalReceiver=function(b){b.css("position","relative"),a.horizontal.push(b[0])},this.getHorizontalRecievers=function(){return a.horizontal},this.getVerticalRecievers=function(){return a.vertical}}]}})}(),function(){"use strict";angular.module("gantt").directive("ganttScrollSender",[function(){return{restrict:"A",require:["^gantt","^ganttScrollManager"],link:function(a,b,c,d){var e=b[0],f=function(){var a,b,c=d[1].getVerticalRecievers();for(a=0,b=c.length;b>a;a++){var f=c[a];f.parentNode.scrollTop!==e.scrollTop&&(f.parentNode.scrollTop=e.scrollTop)}var g=d[1].getHorizontalRecievers();for(a=0,b=g.length;b>a;a++){var h=g[a];h.parentNode.scrollLeft!==e.scrollLeft&&(h.parentNode.scrollLeft=e.scrollLeft)}};b.bind("scroll",f),a.$watch(function(){return d[0].gantt.width},function(a,b){if(a!==b)for(var c=d[1].getHorizontalRecievers(),e=0,f=c.length;f>e;e++){var g=c[e];g.style.width=a+"px"}})}}}])}(),function(){"use strict";angular.module("gantt").directive("ganttScrollable",["GanttDirectiveBuilder","$timeout","ganttDebounce","moment",function(a,b,c,d){var e=new a("ganttScrollable");return e.controller=function(a,e){a.gantt.scroll.$element=e;var f,g,h=function(b,c,e){var f=a.gantt.options.value("autoExpand");if("both"===f||f===!0||f===e){var g,h,i=a.gantt.options.value("viewScale");i=i.trim(),"s"===i.charAt(i.length-1)&&(i=i.substring(0,i.length-1));var j,k,l;i&&(l=i.split(" ")),l&&l.length>1?(j=parseFloat(l[0]),k=l[l.length-1]):(j=1,k=i),"left"===e?(g=d(c).add(-5*j,k),a.fromDate=g):(h=d(c).add(5*j,k),a.toDate=h),a.gantt.api.scroll.raise.scroll(b.scrollLeft,c,e)}};e.bind("scroll",c(function(){var c,d,i=e[0],j=i.scrollLeft;a.gantt.scroll.cachedScrollLeft=j,a.gantt.columnsManager.updateVisibleColumns(),a.gantt.rowsManager.updateVisibleObjects(),f>j&&0===j?(c="left",d=a.gantt.columnsManager.from):j>f&&i.offsetWidth+j>=i.scrollWidth-1&&(c="right",d=a.gantt.columnsManager.to),f=j,void 0!==d?(g&&b.cancel(g),g=b(function(){h(i,d,c)},300)):a.gantt.api.scroll.raise.scroll(j)},5)),a.getScrollableCss=function(){var b={},c=a.gantt.options.value("maxHeight");c>0&&(b["max-height"]=c-a.gantt.header.getHeight()+"px",b["overflow-y"]="auto",a.gantt.scroll.isVScrollbarVisible()&&(b["border-right"]="none"));var d=this.gantt.options.value("columnWidth"),e=0===a.gantt.width?!1:a.gantt.width<a.gantt.getWidth()-a.gantt.side.getWidth();return void 0!==d&&e&&(b.width=a.gantt.width+this.gantt.scroll.getBordersWidth()+"px"),b}},e.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttVerticalScrollReceiver",function(){return{restrict:"A",require:"^ganttScrollManager",link:function(a,b,c,d){d.registerVerticalReceiver(b)}}})}(),function(){"use strict";angular.module("gantt").directive("ganttElementHeightListener",[function(){return{restrict:"A",controller:["$scope","$element","$attrs",function(a,b,c){ -var d=c.ganttElementHeightListener;""===d&&(d="ganttElementHeight");for(var e=a;0===d.indexOf("$parent.");)d=d.substring("$parent.".length),e=e.$parent;e.$watch(function(){return b[0].offsetHeight},function(a){a>0&&(e[d]=a)})}]}}])}(),function(){"use strict";angular.module("gantt").directive("ganttElementWidthListener",[function(){return{restrict:"A",controller:["$scope","$element","$attrs",function(a,b,c){var d=c.ganttElementWidthListener;""===d&&(d="ganttElementWidth");for(var e=a;0===d.indexOf("$parent.");)d=d.substring("$parent.".length),e=e.$parent;e.$watch(function(){return b[0].offsetWidth},function(a){a>0&&(e[d]=a)})}]}}])}(),function(){"use strict";angular.module("gantt").directive("ganttBody",["GanttDirectiveBuilder",function(a){var b=new a("ganttBody");return b.controller=function(a,b){a.gantt.body.$element=b,a.gantt.body.$scope=a},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttBodyBackground",["GanttDirectiveBuilder",function(a){var b=new a("ganttBodyBackground");return b.controller=function(a,b){a.gantt.body.background.$element=b,a.gantt.body.background.$scope=a},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttBodyColumns",["GanttDirectiveBuilder",function(a){var b=new a("ganttBodyColumns");return b.controller=function(a,b){a.gantt.body.columns.$element=b,a.gantt.body.background.$scope=a},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttBodyForeground",["GanttDirectiveBuilder",function(a){var b=new a("ganttBodyForeground");return b.controller=function(a,b){a.gantt.body.foreground.$element=b,a.gantt.body.foreground.$scope=a},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttBodyRows",["GanttDirectiveBuilder",function(a){var b=new a("ganttBodyRows");return b.controller=function(a,b){a.gantt.body.rows.$element=b,a.gantt.body.rows.$scope=a},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttColumn",["GanttDirectiveBuilder",function(a){var b=new a("ganttColumn");return b.controller=function(a,b){a.column.$element=b,a.column.$scope=a,a.column.updateView()},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttColumnHeader",["GanttDirectiveBuilder",function(a){var b=new a("ganttColumnHeader");return b.controller=function(a,b){a.column.$element=b,a.column.$scope=a,a.column.updateView()},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttHeader",["GanttDirectiveBuilder",function(a){var b=new a("ganttHeader");return b.controller=function(a,b){a.gantt.header.$element=b,a.gantt.header.$scope=a},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttHeaderColumns",["GanttDirectiveBuilder",function(a){var b=new a("ganttHeaderColumns");return b.controller=function(a,b){a.gantt.header.columns.$element=b,a.gantt.header.columns.$scope=a},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttRow",["GanttDirectiveBuilder",function(a){var b=new a("ganttRow");return b.controller=function(a,b){a.row.$element=b,a.row.$scope=a},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttRowBackground",["GanttDirectiveBuilder",function(a){var b=new a("ganttRowBackground");return b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttRowLabel",["GanttDirectiveBuilder",function(a){var b=new a("ganttRowLabel");return b.restrict="A",b.templateUrl=void 0,b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttScrollableHeader",["GanttDirectiveBuilder","ganttLayout",function(a,b){var c=new a("ganttScrollableHeader");return c.controller=function(a){var c=b.getScrollBarWidth();a.getScrollableHeaderCss=function(){var b={},d=a.gantt.scroll.isVScrollbarVisible(),e=d?c:0,f=this.gantt.options.value("columnWidth"),g=0===a.gantt.width?!1:a.gantt.width<a.gantt.getWidth()-a.gantt.side.getWidth();return void 0!==f&&g?b.width=a.gantt.width-e+this.gantt.scroll.getBordersWidth()+"px":d&&(b.width=a.gantt.getWidth()-a.gantt.side.getWidth()-e+"px"),b}},c.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttSide",["GanttDirectiveBuilder",function(a){var b=new a("ganttSide");return b.controller=function(a,b){a.gantt.side.$element=b,a.gantt.side.$scope=a},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttSideBackground",["GanttDirectiveBuilder","ganttLayout",function(a,b){var c=new a("ganttSideBackground");return c.controller=function(a){var c=b.getScrollBarHeight();a.getMaxHeightCss=function(){var b={};if(a.maxHeight){var d=a.gantt.scroll.isHScrollbarVisible()?c:0;b["max-height"]=a.maxHeight-d-a.gantt.header.getHeight()+"px"}return b}},c.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttSideContent",["GanttDirectiveBuilder",function(a){var b=new a("ganttSideContent");return b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttTask",["GanttDirectiveBuilder","moment",function(a,b){var c=new a("ganttTask");return c.controller=function(a,c){a.task.$element=c,a.task.$scope=a,a.getTaskContent=function(){return void 0!==a.task.model.content?a.task.model.content:a.task.rowsManager.gantt.options.value("taskContent")},a.simplifyMoment=function(a){return b.isMoment(a)?a.unix():a},a.$watchGroup(["simplifyMoment(task.model.from)","simplifyMoment(task.model.to)"],function(){a.task.updatePosAndSize()})},c.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttTaskBackground",["GanttDirectiveBuilder",function(a){var b=new a("ganttTaskBackground");return b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttTaskContent",["GanttDirectiveBuilder",function(a){var b=new a("ganttTaskContent");return b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttTaskForeground",["GanttDirectiveBuilder",function(a){var b=new a("ganttTaskForeground");return b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttTimeFrame",["GanttDirectiveBuilder",function(a){var b=new a("ganttTimeFrame");return b.controller=function(a,b){a.timeFrame.$element=b,a.timeFrame.$scope=a,a.timeFrame.updateView()},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttTimespan",["GanttDirectiveBuilder",function(a){var b=new a("ganttTimespan");return b.controller=function(a,b){a.timespan.$element=b,a.timespan.$scope=a,a.timespan.updateView()},b.build()}])}(),function(){"use strict";angular.module("gantt").factory("ganttDebounce",["$timeout",function(a){function b(b,c,d){var e=0;return function(){var f=this,g=arguments;e++;var h=function(a){return function(){return a===e?b.apply(f,g):void 0}}(e);return a(h,c,void 0===d?!0:d)}}return b}])}(),function(){"use strict";angular.module("gantt").service("GanttDirectiveBuilder",["$templateCache",function(a){var b=function(b,c,d,e){var f=this;this.directiveName=b,this.templateUrl=void 0===c?"template/"+b+".tmpl.html":c,this.require=void 0===d?"^gantt":d,this.restrict=void 0===e?"E":e,this.scope=!1,this.transclude=!0,this.replace=!0,this.build=function(){var b=f.directiveName,c=f.templateUrl,d=f.controller,e={restrict:f.restrict,require:f.require,transclude:f.transclude,replace:f.replace,scope:f.scope,templateUrl:function(b,d){return void 0!==d.templateUrl&&(c=d.templateUrl),void 0!==d.template&&a.put(c,d.template),c},compile:function(){return{pre:function(a,c,d,e){a.gantt.api.directives.raise.preLink(b,a,c,d,e)},post:function(a,c,d,e){a.gantt.api.directives.raise.postLink(b,a,c,d,e)}}},controller:["$scope","$element","$attrs",function(a,c,e){var f=this;void 0!==d&&d(a,c,e,f),a.gantt.api.directives.raise.controller(b,a,c,e,f),a.$on("$destroy",function(){a.gantt.api.directives.raise.destroy(b,a,c,e,f)}),a.$evalAsync(function(){a.gantt.api.directives.raise["new"](b,a,c,e,f)})}]};return c||(delete e.templateUrl,delete e.replace,delete e.transclude),e}};return b}])}(),function(){"use strict";angular.module("gantt").service("ganttDom",["$document",function(a){return{elementFromPoint:function(b,c){return a[0].elementFromPoint(b,c)},elementsFromPoint:function(a,b,c){for(var d,e,f,g,h=[],i=[],j=0;(d=this.elementFromPoint(a,b))&&-1===h.indexOf(d)&&null!==d&&(void 0===c||c>j);)h.push(d),i.push({value:d.style.getPropertyValue("visibility"),priority:d.style.getPropertyPriority("visibility")}),d.style.setProperty("visibility","hidden","important"),j++;for(e=0,f=i.length;f>e;e++)g=i[e],h[e].style.setProperty("visibility",g.value?g.value:"",g.priority);return h},findElementFromPoint:function(a,b,c){for(var d,e,f,g,h,i=[],j=[],k=0;(d=this.elementFromPoint(a,b))&&-1===i.indexOf(d)&&null!==d;)if(i.push(d),j.push({value:d.style.getPropertyValue("visibility"),priority:d.style.getPropertyPriority("visibility")}),d.style.setProperty("visibility","hidden","important"),k++,c(d)){e=d;break}for(f=0,g=j.length;g>f;f++)h=j[f],i[f].style.setProperty("visibility",h.value?h.value:"",h.priority);return e}}}])}(),function(){"use strict";angular.module("gantt").service("ganttEnableNgAnimate",["$injector",function(a){var b;try{b=a.get("$animate")}catch(c){}return void 0!==b?function(a,c){angular.version.major>=1&&angular.version.minor>=4?b.enabled(a,c):b.enabled(c,a)}:angular.noop}])}(),function(){"use strict";angular.module("gantt").directive("ganttBindCompileHtml",["$compile",function(a){return{restrict:"A",require:"^gantt",link:function(b,c,d,e){b.scope=e.gantt.$scope.$parent,b.$watch(function(){return b.$eval(d.ganttBindCompileHtml)},function(d){c.html(d),a(c.contents())(b)})}}}])}(),function(){"use strict";angular.module("gantt").service("ganttLayout",["$document",function(a){return{getScrollBarWidth:function(){var b=a[0].createElement("p");b.style.width="100%",b.style.height="200px";var c=a[0].createElement("div");c.style.position="absolute",c.style.top="0px",c.style.left="0px",c.style.visibility="hidden",c.style.width="200px",c.style.height="150px",c.style.overflow="hidden",c.appendChild(b),a[0].body.appendChild(c);var d=b.offsetWidth;c.style.overflow="scroll";var e=b.offsetWidth;return d===e&&(e=c.clientWidth),a[0].body.removeChild(c),d-e},getScrollBarHeight:function(){var b=a[0].createElement("p");b.style.width="200px;",b.style.height="100%";var c=a[0].createElement("div");c.style.position="absolute",c.style.top="0px",c.style.left="0px",c.style.visibility="hidden",c.style.width="150px",c.style.height="200px",c.style.overflow="hidden",c.appendChild(b),a[0].body.appendChild(c);var d=b.offsetHeight;c.style.overflow="scroll";var e=b.offsetHeight;return d===e&&(e=c.clientHeight),a[0].body.removeChild(c),d-e},setColumnsWidthFactor:function(a,b,c){a&&(c||(c=0),angular.forEach(a,function(a){a.left=b*(a.originalSize.left+c)-c,a.width=b*a.originalSize.width,angular.forEach(a.timeFrames,function(a){a.left=b*a.originalSize.left,a.width=b*a.originalSize.width})}))}}}])}(),function(){"use strict";angular.module("gantt").service("ganttMouseButton",[function(){return{getButton:function(a){return a=a||window.event,a.which?a.which:void 0===a.button?1:a.button<2?1:4===a.button?2:3}}}])}(),function(){"use strict";angular.module("gantt").service("ganttMouseOffset",[function(){return{getTouch:function(a){return void 0!==a.touches?a.touches[0]:a},getOffset:function(a){return a.offsetX&&a.offsetY?{x:a.offsetX,y:a.offsetY}:a.layerX&&a.layerY?{x:a.layerX,y:a.layerY}:this.getOffsetForElement(a.target,a)},getOffsetForElement:function(a,b){var c=a.getBoundingClientRect();return{x:b.clientX-c.left,y:b.clientY-c.top}}}}])}(),function(){"use strict";angular.module("gantt").factory("ganttSmartEvent",[function(){function a(a,b,c,d){return a.$on("$destroy",function(){b.unbind(c,d)}),{bindOnce:function(){b.one(c,d)},bind:function(){b.bind(c,d)},unbind:function(){b.unbind(c,d)}}}return a}])}(),angular.module("gantt.templates",[]).run(["$templateCache",function(a){a.put("template/gantt.tmpl.html",'<div class="gantt unselectable" ng-cloak gantt-scroll-manager gantt-element-width-listener="ganttElementWidth">\n <gantt-side>\n <gantt-side-background>\n </gantt-side-background>\n <gantt-side-content>\n </gantt-side-content>\n <div gantt-resizer="gantt.side.$element" gantt-resizer-event-topic="side" gantt-resizer-enabled="{{$parent.gantt.options.value(\'allowSideResizing\')}}" resizer-width="sideWidth" class="gantt-resizer">\n <div ng-show="$parent.gantt.options.value(\'allowSideResizing\')" class="gantt-resizer-display"></div>\n </div>\n </gantt-side>\n <gantt-scrollable-header>\n <gantt-header gantt-element-height-listener="$parent.ganttHeaderHeight">\n <gantt-header-columns>\n <div ng-repeat="header in gantt.columnsManager.visibleHeaders track by $index">\n <div class="gantt-header-row" ng-class="{\'gantt-header-row-last\': $last, \'gantt-header-row-first\': $first}">\n <gantt-column-header ng-repeat="column in header"></gantt-column-header>\n </div>\n </div>\n </gantt-header-columns>\n </gantt-header>\n </gantt-scrollable-header>\n <gantt-scrollable>\n <gantt-body>\n <gantt-body-background>\n <gantt-row-background ng-repeat="row in gantt.rowsManager.visibleRows track by row.model.id"></gantt-row-background>\n </gantt-body-background>\n <gantt-body-foreground>\n <div class="gantt-current-date-line" ng-show="currentDate === \'line\' && gantt.currentDateManager.position >= 0 && gantt.currentDateManager.position <= gantt.width" ng-style="{\'left\': gantt.currentDateManager.position + \'px\' }"></div>\n </gantt-body-foreground>\n <gantt-body-columns>\n <gantt-column ng-repeat="column in gantt.columnsManager.visibleColumns">\n <gantt-time-frame ng-repeat="timeFrame in column.visibleTimeFrames"></gantt-time-frame>\n </gantt-column>\n </gantt-body-columns>\n <div ng-if="gantt.columnsManager.visibleColumns == 0" style="background-color: #808080"></div>\n <gantt-body-rows>\n <gantt-timespan ng-repeat="timespan in gantt.timespansManager.timespans track by timespan.model.id"></gantt-timespan>\n <gantt-row ng-repeat="row in gantt.rowsManager.visibleRows track by row.model.id">\n <gantt-task ng-repeat="task in row.visibleTasks track by task.model.id">\n </gantt-task>\n </gantt-row>\n </gantt-body-rows>\n </gantt-body>\n </gantt-scrollable>\n\n <!-- Plugins -->\n <ng-transclude></ng-transclude>\n\n <!--\n ******* Inline templates *******\n You can specify your own templates by either changing the default ones below or by\n adding an attribute template-url="<url to your template>" on the specific element.\n -->\n\n <!-- Body template -->\n <script type="text/ng-template" id="template/ganttBody.tmpl.html">\n <div ng-transclude class="gantt-body" ng-style="{\'width\': gantt.width > 0 ? gantt.width +\'px\' : undefined}"></div>\n </script>\n\n <!-- Header template -->\n <script type="text/ng-template" id="template/ganttHeader.tmpl.html">\n <div ng-transclude class="gantt-header"\n ng-show="gantt.columnsManager.columns.length > 0 && gantt.columnsManager.headers.length > 0"></div>\n </script>\n\n <!-- Side template -->\n <script type="text/ng-template" id="template/ganttSide.tmpl.html">\n <div ng-transclude class="gantt-side" style="width: auto;"></div>\n </script>\n\n <!-- Side content template-->\n <script type="text/ng-template" id="template/ganttSideContent.tmpl.html">\n <div class="gantt-side-content">\n </div>\n </script>\n\n <!-- Header columns template -->\n <script type="text/ng-template" id="template/ganttHeaderColumns.tmpl.html">\n <div ng-transclude class="gantt-header-columns"\n gantt-horizontal-scroll-receiver></div>\n </script>\n\n <script type="text/ng-template" id="template/ganttColumnHeader.tmpl.html">\n <div class="gantt-column-header" ng-class="{\'gantt-column-header-last\': $last, \'gantt-column-header-first\': $first}">{{::column.label}}</div>\n </script>\n\n <!-- Body background template -->\n <script type="text/ng-template" id="template/ganttBodyBackground.tmpl.html">\n <div ng-transclude class="gantt-body-background"></div>\n </script>\n\n <!-- Body foreground template -->\n <script type="text/ng-template" id="template/ganttBodyForeground.tmpl.html">\n <div ng-transclude class="gantt-body-foreground"></div>\n </script>\n\n <!-- Body columns template -->\n <script type="text/ng-template" id="template/ganttBodyColumns.tmpl.html">\n <div ng-transclude class="gantt-body-columns"></div>\n </script>\n\n <script type="text/ng-template" id="template/ganttColumn.tmpl.html">\n <div ng-transclude class="gantt-column gantt-foreground-col" ng-class="{\'gantt-column-last\': $last, \'gantt-column-first\': $first}"></div>\n </script>\n\n <script type="text/ng-template" id="template/ganttTimeFrame.tmpl.html">\n <div class="gantt-timeframe"></div>\n </script>\n\n <!-- Scrollable template -->\n <script type="text/ng-template" id="template/ganttScrollable.tmpl.html">\n <div ng-transclude class="gantt-scrollable" gantt-scroll-sender ng-style="getScrollableCss()"></div>\n </script>\n\n <script type="text/ng-template" id="template/ganttScrollableHeader.tmpl.html">\n <div ng-transclude class="gantt-scrollable-header" ng-style="getScrollableHeaderCss()"></div>\n </script>\n\n <!-- Rows template -->\n <script type="text/ng-template" id="template/ganttBodyRows.tmpl.html">\n <div ng-transclude class="gantt-body-rows"></div>\n </script>\n\n <!-- Timespan template -->\n <script type="text/ng-template" id="template/ganttTimespan.tmpl.html">\n <div class="gantt-timespan" ng-class="timespan.model.classes">\n </div>\n </script>\n\n <!-- Task template -->\n <script type="text/ng-template" id="template/ganttTask.tmpl.html">\n <div class="gantt-task" ng-class="task.model.classes">\n <gantt-task-background></gantt-task-background>\n <gantt-task-foreground></gantt-task-foreground>\n <gantt-task-content></gantt-task-content>\n </div>\n </script>\n\n <script type="text/ng-template" id="template/ganttTaskBackground.tmpl.html">\n <div class="gantt-task-background" ng-style="{\'background-color\': task.model.color}"></div>\n </script>\n\n <script type="text/ng-template" id="template/ganttTaskForeground.tmpl.html">\n <div class="gantt-task-foreground">\n <div ng-if="task.truncatedRight" class="gantt-task-truncated-right">></div>\n <div ng-if="task.truncatedLeft" class="gantt-task-truncated-left"><</div>\n </div>\n </script>\n\n <!-- Task content template -->\n <script type="text/ng-template" id="template/ganttTaskContent.tmpl.html">\n <div class="gantt-task-content" unselectable="on"><span unselectable="on" gantt-bind-compile-html="getTaskContent()"/></div>\n </script>\n\n\n <!-- Row background template -->\n <script type="text/ng-template" id="template/ganttRowBackground.tmpl.html">\n <div class="gantt-row gantt-row-height"\n ng-class="row.model.classes"\n ng-class-odd="\'gantt-row-odd\'"\n ng-class-even="\'gantt-row-even\'"\n ng-style="{\'height\': row.model.height}">\n <div class="gantt-row-background"\n ng-style="{\'background-color\': row.model.color}">\n </div>\n </div>\n </script>\n\n <!-- Row template -->\n <script type="text/ng-template" id="template/ganttRow.tmpl.html">\n <div class="gantt-row gantt-row-height"\n ng-class="row.model.classes"\n ng-class-odd="\'gantt-row-odd\'"\n ng-class-even="\'gantt-row-even\'"\n ng-style="{\'height\': row.model.height}">\n <div ng-transclude class="gantt-row-content"></div>\n </div>\n </script>\n\n <!-- Side background template -->\n <script type="text/ng-template" id="template/ganttSideBackground.tmpl.html">\n <div class="gantt-side-background">\n <div class="gantt-side-background-header" ng-style="{height: $parent.ganttHeaderHeight + \'px\'}">\n <div ng-show="$parent.ganttHeaderHeight" class="gantt-header-row gantt-side-header-row"></div>\n </div>\n <div class="gantt-side-background-body" ng-style="getMaxHeightCss()">\n <div gantt-vertical-scroll-receiver>\n <div class="gantt-row gantt-row-height "\n ng-class-odd="\'gantt-row-odd\'"\n ng-class-even="\'gantt-row-even\'"\n ng-class="row.model.classes"\n ng-repeat="row in gantt.rowsManager.visibleRows track by row.model.id"\n ng-style="{\'height\': row.model.height}">\n <div gantt-row-label class="gantt-row-label gantt-row-background"\n ng-style="{\'background-color\': row.model.color}">\n </div>\n </div>\n </div>\n </div>\n </div>\n </script>\n</div>\n')}]); +!function(){"use strict";angular.module("gantt",["gantt.templates","angularMoment"]).directive("gantt",["Gantt","ganttEnableNgAnimate","$timeout","$templateCache",function(a,b,c,d){return{restrict:"A",transclude:!0,templateUrl:function(a,b){var c;return c=void 0===b.templateUrl?"template/gantt.tmpl.html":b.templateUrl,void 0!==b.template&&d.put(c,b.template),c},scope:{sortMode:"=?",filterTask:"=?",filterTaskComparator:"=?",filterRow:"=?",filterRowComparator:"=?",viewScale:"=?",columnWidth:"=?",expandToFit:"=?",shrinkToFit:"=?",showSide:"=?",allowSideResizing:"=?",fromDate:"=?",toDate:"=?",currentDateValue:"=?",currentDate:"=?",daily:"=?",autoExpand:"=?",taskOutOfRange:"=?",taskContent:"=?",rowContent:"=?",maxHeight:"=?",sideWidth:"=?",headers:"=?",headersFormats:"=?",timeFrames:"=?",dateFrames:"=?",timeFramesWorkingMode:"=?",timeFramesNonWorkingMode:"=?",timespans:"=?",columnMagnet:"=?",shiftColumnMagnet:"=?",timeFramesMagnet:"=?",data:"=?",api:"=?",options:"=?"},controller:["$scope","$element",function(c,d){for(var e in c.options)c[e]=c.options[e];b(d,!1),c.gantt=new a(c,d),this.gantt=c.gantt}],link:function(a,b){a.gantt.api.directives.raise["new"]("gantt",a,b),a.$on("$destroy",function(){a.gantt.api.directives.raise.destroy("gantt",a,b)}),c(function(){a.gantt.initialized()})}}}])}(),function(){"use strict";angular.module("gantt").factory("GanttApi",["$q","$rootScope","ganttUtils",function(a,b,c){function d(a,c,d,e){return b.$on(a,function(){var a=Array.prototype.slice.call(arguments);a.splice(0,1),c.apply(e?e:d.api,a)})}var e=function(a){this.gantt=a,this.listeners=[],this.apiId=c.newId()};return e.prototype.suppressEvents=function(a,b){var c=this,e=angular.isArray(a)?a:[a],f=[];e.forEach(function(a){f=c.listeners.filter(function(b){return a===b.handler})}),f.forEach(function(a){a.dereg()}),b(),f.forEach(function(a){a.dereg=d(a.eventId,a.handler,c.gantt,a._this)})},e.prototype.registerEvent=function(a,c){var e=this;e[a]||(e[a]={});var f=e[a];f.on||(f.on={},f.raise={});var g="event:gantt:"+this.apiId+":"+a+":"+c;f.raise[c]=function(){b.$emit.apply(b,[g].concat(Array.prototype.slice.call(arguments)))},f.on[c]=function(a,b,c){var f=d(g,b,e.gantt,c),h={handler:b,dereg:f,eventId:g,scope:a,_this:c};e.listeners.push(h);var i=function(){h.dereg();var a=e.listeners.indexOf(h);e.listeners.splice(a,1)};return a.$on("$destroy",function(){i()}),i}},e.prototype.registerEventsFromObject=function(a){var b=this,c=[];angular.forEach(a,function(a,b){var d={name:b,events:[]};angular.forEach(a,function(a,b){d.events.push(b)}),c.push(d)}),c.forEach(function(a){a.events.forEach(function(c){b.registerEvent(a.name,c)})})},e.prototype.registerMethod=function(a,b,d,e){this[a]||(this[a]={});var f=this[a];f[b]=c.createBoundedWrapper(e||this.gantt,d)},e.prototype.registerMethodsFromObject=function(a,b){var c=this,d=[];angular.forEach(a,function(a,b){var c={name:b,methods:[]};angular.forEach(a,function(a,b){c.methods.push({name:b,fn:a})}),d.push(c)}),d.forEach(function(a){a.methods.forEach(function(d){c.registerMethod(a.name,d.name,d.fn,b)})})},e}])}(),function(){"use strict";angular.module("gantt").factory("GanttOptions",[function(){var a=function(a,b){this.defaultValues=b,this.values=a,this.defaultValue=function(a){var b=this.defaultValues[a];return angular.isFunction(b)&&(b=b()),b},this.sanitize=function(a,b){if(!b){var c=this.defaultValue(a);if(void 0!==c)return void 0!==b&&"boolean"==typeof c?b:c}return b},this.value=function(a){return this.sanitize(a,this.values[a])},this.set=function(a,b){this.values[a]=b},this.initialize=function(){for(var a in this.values){var b=this.values[a];this.values.hasOwnProperty(a)&&(this.values[a]=this.value(a,b))}return this.values}};return a}])}(),function(){"use strict";angular.module("gantt").factory("GanttCalendar",["$filter","moment",function(a,b){var c=function(a){void 0===a&&(a={}),this.start=a.start,this.end=a.end,this.working=a.working,this.magnet=void 0!==a.magnet?a.magnet:!0,this["default"]=a["default"],this.color=a.color,this.classes=a.classes,this.internal=a.internal};c.prototype.updateView=function(){if(this.$element){var a={};void 0!==this.left?a.left=this.left+"px":a.left="",void 0!==this.width?a.width=this.width+"px":a.width="",void 0!==this.color?a["background-color"]=this.color:a["background-color"]="",this.$element.css(a);var b=["gantt-timeframe"+(this.working?"":"-non")+"-working"];this.classes&&(b=b.concat(this.classes));for(var c=0,d=b.length;d>c;c++)this.$element.toggleClass(b[c],!0)}},c.prototype.getDuration=function(){return void 0!==this.end&&void 0!==this.start?this.end.diff(this.start,"milliseconds"):void 0},c.prototype.clone=function(){return new c(this)};var d=function(a){this.func=a};d.prototype.getTimeFrames=function(a){var b=this.func(a);return b instanceof Array||(b=[b]),b},d.prototype.clone=function(){return new d(this.func)};var e=function(a){this.evaluator=a.evaluator,a.date?(this.start=b(a.date).startOf("day"),this.end=b(a.date).endOf("day")):(this.start=a.start,this.end=a.end),a.targets instanceof Array?this.targets=a.targets:this.targets=[a.targets],this["default"]=a["default"]};e.prototype.dateMatch=function(a){return this.evaluator?this.evaluator(a):this.start&&this.end?a>=this.start&&a<=this.end:!1},e.prototype.clone=function(){return new e(this)};var f=function(){this.timeFrames={},this.timeFrameMappings={},this.dateFrames={}};f.prototype.clear=function(){this.timeFrames={},this.timeFrameMappings={},this.dateFrames={}},f.prototype.registerTimeFrames=function(a){angular.forEach(a,function(a,b){this.timeFrames[b]=new c(a)},this)},f.prototype.removeTimeFrames=function(a){angular.forEach(a,function(a){delete this.timeFrames[a]},this)},f.prototype.clearTimeFrames=function(){this.timeFrames={}},f.prototype.registerTimeFrameMappings=function(a){angular.forEach(a,function(a,b){this.timeFrameMappings[b]=new d(a)},this)},f.prototype.removeTimeFrameMappings=function(a){angular.forEach(a,function(a){delete this.timeFrameMappings[a]},this)},f.prototype.clearTimeFrameMappings=function(){this.timeFrameMappings={}},f.prototype.registerDateFrames=function(a){angular.forEach(a,function(a,b){this.dateFrames[b]=new e(a)},this)},f.prototype.removeDateFrames=function(a){angular.forEach(a,function(a){delete this.dateFrames[a]},this)},f.prototype.clearDateFrames=function(){this.dateFrames={}};var g=function(a,b){var c=[];return angular.forEach(a,function(a){a.dateMatch(b)&&c.push(a)}),0===c.length&&angular.forEach(a,function(a){a["default"]&&c.push(a)}),c};return f.prototype.getTimeFrames=function(a){for(var c=[],d=g(this.dateFrames,a),e=0;e<d.length;e++)if(void 0!==d[e])for(var f=d[e].targets,h=0;h<f.length;h++){var i=this.timeFrameMappings[f[h]];if(void 0!==i)c.push(i.getTimeFrames());else{var j=this.timeFrames[f[h]];void 0!==j&&c.push(j)}}var k=a.year(),l=a.month(),m=a.date(),n=[];for(0===c.length&&angular.forEach(this.timeFrames,function(a){a["default"]&&c.push(a)}),e=0;e<c.length;e++){var o=c[e].clone();void 0!==o.start&&(o.start.year(k),o.start.month(l),o.start.date(m)),void 0!==o.end&&(o.end.year(k),o.end.month(l),o.end.date(m),b(o.end).startOf("day")===o.end&&o.end.add(1,"day")),n.push(o)}return n},f.prototype.solve=function(d,e,f){for(var g,h,i,j,k=0;k<d.length;k++){var l=d[k];(void 0===i||i>l.start)&&(i=l.start),(void 0===j||j<l.end)&&(j=l.end),void 0===g&&l.color&&(g=l.color),void 0!==l.classes&&(void 0===h&&(h=[]),h=h.concat(l.classes))}void 0===e&&(e=i),void 0===f&&(f=j);var m=[new c({start:e,end:f,internal:!0})];for(d=a("filter")(d,function(a){return(void 0===a.start||a.start<f)&&(void 0===a.end||a.end>e)}),k=0;k<d.length;k++){var n=d[k];n.start||(n.start=e),n.end||(n.end=f)}var o,p=a("orderBy")(d,function(a){return-a.getDuration()});for(k=0;k<p.length;k++){var q=p[k],r=m.slice();o=0;for(var s=!1,t=!1,u=0;u<m.length;u++){var v=m[u];if(!t){if(q.end||q.start)if(q.end>v.start&&q.start<v.end){var w=v.clone();v.end=b(q.start),w.start=b(q.end),r.splice(o+1,0,q.clone(),w),t=!0,s=!1}else!s&&q.start<v.end?(v.end=b(q.start),r.splice(o+1,0,q.clone()),s=!0):s&&q.end>v.start&&(v.start=b(q.end),s=!1,t=!0);else r.splice(o,0,q),t=!0,s=!1;o++}}m=r}return m=a("filter")(m,function(a){return!a.internal&&(void 0===a.start||a.start<f)&&(void 0===a.end||a.end>e)})},f}])}(),function(){"use strict";angular.module("gantt").factory("GanttCurrentDateManager",["moment",function(a){var b=function(b){var c=this;this.gantt=b,this.date=void 0,this.position=void 0,this.currentDateColumn=void 0,this.gantt.$scope.simplifyMoment=function(b){return a.isMoment(b)?b.unix():b},this.gantt.$scope.$watchGroup(["currentDate","simplifyMoment(currentDateValue)"],function(a,b){a!==b&&c.setCurrentDate(c.gantt.options.value("currentDateValue"))})};return b.prototype.setCurrentDate=function(a){this.date=a;var b,c=this.currentDateColumn;void 0!==this.date&&"column"===this.gantt.options.value("currentDate")&&(b=this.gantt.columnsManager.getColumnByDate(this.date,!0)),this.currentDateColumn=b,c!==b&&(void 0!==c&&(c.currentDate=!1,c.updateView()),void 0!==b&&(b.currentDate=!0,b.updateView())),this.position=this.gantt.getPositionByDate(this.date,!0)},b}])}(),function(){"use strict";angular.module("gantt").factory("GanttColumn",["moment",function(a){var b=function(a,b,c,d,e,f,g){this.date=a,this.endDate=b,this.left=c,this.width=d,this.calendar=e,this.duration=this.endDate.diff(this.date,"milliseconds"),this.timeFramesWorkingMode=f,this.timeFramesNonWorkingMode=g,this.timeFrames=[],this.currentDate=!1,this.visibleTimeFrames=[],this.daysTimeFrames={},this.cropped=!1,this.originalSize={left:this.left,width:this.width},this.updateTimeFrames()},c=function(a){return a.year()+"-"+a.month()+"-"+a.date()};return b.prototype.updateView=function(){if(this.$element){this.currentDate?this.$element.addClass("gantt-foreground-col-current-date"):this.$element.removeClass("gantt-foreground-col-current-date"),this.$element.css({left:this.left+"px",width:this.width+"px"});for(var a=0,b=this.timeFrames.length;b>a;a++)this.timeFrames[a].updateView()}},b.prototype.updateTimeFrames=function(){var b=this;if(void 0!==b.calendar&&("hidden"!==b.timeFramesNonWorkingMode||"hidden"!==b.timeFramesWorkingMode)){for(var d,e=b.date,f=a(e).startOf("day"),g=f.add(1,"day");e<b.endDate;){var h=b.calendar.getTimeFrames(e),i=a.min(g,b.endDate);h=b.calendar.solve(h,e,i);var j=[];for(d=0;d<h.length;d++){var k=h[d],l=k.start;void 0===l&&(l=e);var m=k.end;void 0===m&&(m=i),l<b.date&&(l=b.date),m>b.endDate&&(m=b.endDate),k=k.clone(),k.start=a(l),k.end=a(m),j.push(k)}b.timeFrames=b.timeFrames.concat(j);var n=c(e);b.daysTimeFrames[n]=j,e=i,f=a(e).startOf("day"),g=f.add(1,"day")}for(d=0;d<b.timeFrames.length;d++){var o=b.timeFrames[d],p=o.start.diff(b.date,"milliseconds"),q=p/b.duration*b.width,r=o.end.diff(o.start,"milliseconds"),s=r/b.duration*b.width,t=!1;o.working&&"visible"!==b.timeFramesWorkingMode?t=!0:o.working||"visible"===b.timeFramesNonWorkingMode||(t=!0),t||b.visibleTimeFrames.push(o),o.hidden=t,o.left=q,o.width=s,o.originalSize={left:o.left,width:o.width}}if("cropped"===b.timeFramesNonWorkingMode||"cropped"===b.timeFramesWorkingMode){for(var u=0,v=0;v<b.timeFrames.length;v++){var w=b.timeFrames[v];(!w.working&&"cropped"!==b.timeFramesNonWorkingMode||w.working&&"cropped"!==b.timeFramesWorkingMode)&&(u+=w.width)}if(u!==b.width){var x=b.width/u,y=0,z=0,A=!0;for(v=0;v<b.timeFrames.length;v++){var B=b.timeFrames[v];!B.working&&"cropped"!==b.timeFramesNonWorkingMode||B.working&&"cropped"!==b.timeFramesWorkingMode?(B.left=(B.left-y)*x,B.width=B.width*x,B.originalSize.left=(B.originalSize.left-z)*x,B.originalSize.width=B.originalSize.width*x,B.cropped=!1,A=!1):(y+=B.width,z+=B.originalSize.width,B.left=void 0,B.width=0,B.originalSize={left:void 0,width:0},B.cropped=!0)}b.cropped=A}else b.cropped=!1}}},b.prototype.clone=function(){return new b(a(this.date),a(this.endDate),this.left,this.width,this.calendar)},b.prototype.containsDate=function(a){return a>this.date&&a<=this.endDate},b.prototype.equals=function(a){return this.date===a.date},b.prototype.roundTo=function(a,b,c,d){"day"===b&&(b="date"),c=c||1;var e=a.get(b);switch(d){case"up":e=Math.ceil(e/c);break;case"down":e=Math.floor(e/c);break;default:e=Math.round(e/c)}var f=["millisecond","second","minute","hour","date","month","year"];a.set(b,e*c);for(var g=f.indexOf(b),h=0;g>h;h++)a.set(f[h],0);return a},b.prototype.getMagnetDate=function(b,c,d,e){if(c>0&&void 0!==d){var f=b;if(b=a(b),"column"===d){var g=this.getPositionByDate(b);b=a(g<this.width/2?this.date:this.endDate)}else b=this.roundTo(b,d,c),b<this.date?b=a(this.date):b>this.endDate&&(b=a(this.endDate));if(e)for(var h,i=Math.abs(f.diff(b,"milliseconds")),j=0;j<this.timeFrames.length;j++){var k=this.timeFrames[j];if(k.magnet){var l,m=this.timeFrames[j-1],n=this.timeFrames[j+1];(void 0===m||m.working!==k.working)&&(l=Math.abs(f.diff(k.start,"milliseconds")),i>l&&(void 0===h||h>l)&&(h=l,b=k.start)),(void 0===n||n.working!==k.working)&&(l=Math.abs(f.diff(k.end,"milliseconds")),i>l&&(void 0===h||h>l)&&(h=l,b=k.end))}}}return b},b.prototype.getDateByPositionUsingTimeFrames=function(b){for(var c=0,d=this.timeFrames.length;d>c;c++){var e=this.timeFrames[c];if(!e.cropped&&b>=e.left&&b<=e.left+e.width){var f=e.getDuration()/e.width*(b-e.left),g=a(e.start).add(f,"milliseconds");return g}}},b.prototype.getDateByPosition=function(b,c,d,e){var f,g;return 0>b&&(b=0),b>this.width&&(b=this.width),("cropped"===this.timeFramesNonWorkingMode||"cropped"===this.timeFramesWorkingMode)&&(g=this.getDateByPositionUsingTimeFrames(b)),void 0===g&&(f=this.duration/this.width*b,g=a(this.date).add(f,"milliseconds")),g=this.getMagnetDate(g,c,d,e)},b.prototype.getDayTimeFrame=function(a){var b=this.daysTimeFrames[c(a)];return void 0===b?[]:b},b.prototype.getPositionByDate=function(a){var b,c;if("cropped"===this.timeFramesNonWorkingMode||"cropped"===this.timeFramesWorkingMode)for(var d=a,e=this.getDayTimeFrame(d),f=0;f<e.length;f++){var g=e[f];if(d>=g.start&&d<=g.end){if(!g.cropped)return b=d.diff(g.start,"milliseconds"),c=b/g.getDuration()*g.width,this.left+g.left+c;d=e.length>f+1?e[f+1].start:g.end}}return b=a.diff(this.date,"milliseconds"),c=b/this.duration*this.width,0>c&&(c=0),c>this.width&&(c=this.width),this.left+c},b}])}(),function(){"use strict";angular.module("gantt").factory("GanttColumnBuilder",["GanttColumn",function(a){var b=function(a){this.columnsManager=a};return b.prototype.newColumn=function(b,c,d,e){var f=this.columnsManager.gantt.calendar,g=this.columnsManager.gantt.options.value("timeFramesWorkingMode"),h=this.columnsManager.gantt.options.value("timeFramesNonWorkingMode");return new a(b,c,d,e,f,g,h)},b}])}(),function(){"use strict";angular.module("gantt").service("GanttColumnGenerator",["moment",function(a){var b=function(b,c,d){return a(b).add(c,d).startOf(d)===b},c=function(a){return["hour","minute","second","millisecond"].indexOf(a)>=0?0:void 0},d=function(a,b,d){var e=b.get(a),f=d.get(a),g=c(a);void 0!==g&&f!==g&&e>f&&d.set(a,g)};this.generate=function(c,e,f,g,h,i,j,k){if(!f&&!i)throw"to or maximumWidth must be defined";g=g.trim(),"s"===g.charAt(g.length-1)&&(g=g.substring(0,g.length-1));var l,m,n;g&&(n=g.split(" ")),n&&n.length>1?(l=parseFloat(n[0]),m=n[n.length-1]):(l=1,m=g);var o=!1;e=a(e).startOf(m),f&&(o=b(f),f=a(f).startOf(m));var p=0,q=a(e).startOf(m);k&&(q.add(-l,m),p-=h);for(var r=[];;){if(i&&Math.abs(p)>i+h)break;var s=a(q),t=a(s).add(l,m);d(m,s,t);var u=c.newColumn(s,t,j?p+j:p,h);if(!u.cropped&&(r.push(u),k?p-=h:p+=h,f))if(k){if(o&&f>q||!o&&f>=q)break}else if(o&&q>f||!o&&q>=f)break;k?(q.add(-l,m),d(m,q,s)):(q.add(l,m),d(m,s,q))}return k&&(b(e,l,m)&&r.shift(),r.reverse()),r}}])}(),function(){"use strict";angular.module("gantt").factory("GanttColumnHeader",["moment","GanttColumn",function(a,b){var c=function(c,d,e,f,g,h){c=a(c),d=a(d);var i=new b(c,d,f,g);return i.unit=e,i.label=angular.isFunction(h)?h(i):c.format(h),i};return c}])}(),function(){"use strict";angular.module("gantt").factory("GanttColumnsManager",["GanttColumnGenerator","GanttColumnBuilder","GanttHeadersGenerator","$filter","$timeout","ganttLayout","ganttBinarySearch","moment",function(a,b,c,d,e,f,g,h){var i=function(a){var c=this;this.gantt=a,this.from=void 0,this.to=void 0,this.columns=[],this.visibleColumns=[],this.previousColumns=[],this.nextColumns=[],this.headers=[],this.visibleHeaders=[],this.scrollAnchor=void 0,this.columnBuilder=new b(this),this.gantt.$scope.$watchGroup(["viewScale","columnWidth","timeFramesWorkingMode","timeFramesNonWorkingMode","fromDate","toDate","autoExpand","taskOutOfRange"],function(a,b){a!==b&&c.gantt.rendered&&c.generateColumns()}),this.gantt.$scope.$watchCollection("headers",function(a,b){a!==b&&c.gantt.rendered&&c.generateColumns()}),this.gantt.$scope.$watchCollection("headersFormats",function(a,b){a!==b&&c.gantt.rendered&&c.generateColumns()}),this.gantt.$scope.$watchGroup(["ganttElementWidth","showSide","sideWidth","maxHeight","daily"],function(a,b){a!==b&&c.gantt.rendered&&c.updateColumnsMeta()}),this.gantt.api.data.on.load(this.gantt.$scope,function(){(void 0===c.from||void 0===c.to||c.from>c.gantt.rowsManager.getDefaultFrom()||c.to<c.gantt.rowsManager.getDefaultTo())&&c.gantt.rendered&&c.generateColumns(),c.gantt.rowsManager.sortRows()}),this.gantt.api.data.on.remove(this.gantt.$scope,function(){c.gantt.rowsManager.sortRows()}),this.gantt.api.registerMethod("columns","clear",this.clearColumns,this),this.gantt.api.registerMethod("columns","generate",this.generateColumns,this),this.gantt.api.registerMethod("columns","refresh",this.updateColumnsMeta,this),this.gantt.api.registerMethod("columns","getColumnsWidth",this.getColumnsWidth,this),this.gantt.api.registerMethod("columns","getColumnsWidthToFit",this.getColumnsWidthToFit,this),this.gantt.api.registerMethod("columns","getDateRange",this.getDateRange,this),this.gantt.api.registerEvent("columns","clear"),this.gantt.api.registerEvent("columns","generate"),this.gantt.api.registerEvent("columns","refresh")};i.prototype.setScrollAnchor=function(){if(this.gantt.scroll.$element&&this.columns.length>0){var a=this.gantt.scroll.$element[0],b=a.scrollLeft+a.offsetWidth/2;this.scrollAnchor=this.gantt.getDateByPosition(b)}},i.prototype.scrollToScrollAnchor=function(){var a=this;this.columns.length>0&&void 0!==this.scrollAnchor&&this.gantt.$scope.$$postDigest(function(){a.gantt.api.scroll.toDate(a.scrollAnchor)})},i.prototype.clearColumns=function(){this.setScrollAnchor(),this.from=void 0,this.to=void 0,this.columns=[],this.visibleColumns=[],this.previousColumns=[],this.nextColumns=[],this.headers=[],this.visibleHeaders=[],this.gantt.api.columns.raise.clear()},i.prototype.generateColumns=function(b,d){return b||(b=this.gantt.options.value("fromDate")),d||(d=this.gantt.options.value("toDate")),(b&&(!h.isMoment(b)||b.isValid())||(b=this.gantt.rowsManager.getDefaultFrom()))&&(d&&(!h.isMoment(d)||d.isValid())||(d=this.gantt.rowsManager.getDefaultTo()))?(void 0===b||h.isMoment(b)||(b=h(b)),void 0===d||h.isMoment(d)||(d=h(d)),"expand"===this.gantt.options.value("taskOutOfRange")&&(b=this.gantt.rowsManager.getExpandedFrom(b),d=this.gantt.rowsManager.getExpandedTo(d)),this.setScrollAnchor(),this.from=b,this.to=d,this.columns=a.generate(this.columnBuilder,b,d,this.gantt.options.value("viewScale"),this.getColumnsWidth()),this.headers=c.generate(this),this.previousColumns=[],this.nextColumns=[],this.updateColumnsMeta(),this.scrollToScrollAnchor(),void this.gantt.api.columns.raise.generate(this.columns,this.headers)):!1},i.prototype.updateColumnsMeta=function(){this.gantt.isRefreshingColumns=!0;var a=this.getLastColumn();this.gantt.originalWidth=void 0!==a?a.originalSize.left+a.originalSize.width:0;var b=this.updateColumnsWidths(this.columns,this.headers,this.previousColumns,this.nextColumns);this.gantt.width=void 0!==a?a.left+a.width:0;var c=this.gantt.options.value("showSide"),d=this.gantt.side.isShown(),e=c!==d;e&&!c&&this.gantt.side.show(!1),this.gantt.rowsManager.updateTasksPosAndSize(),this.gantt.timespansManager.updateTimespansPosAndSize(),this.updateVisibleColumns(b),this.gantt.rowsManager.updateVisibleObjects();var f=this.gantt.options.value("currentDateValue");this.gantt.currentDateManager.setCurrentDate(f),e&&c&&this.gantt.side.show(!0),this.gantt.isRefreshingColumns=!1,this.gantt.api.columns.raise.refresh(this.columns,this.headers)},i.prototype.getLastColumn=function(a){var b=this.columns;return a&&(b=this.nextColumns),b&&b.length>0?b[b.length-1]:void 0},i.prototype.getFirstColumn=function(a){var b=this.columns;return a&&(b=this.previousColumns),b&&b.length>0?b[0]:void 0},i.prototype.getColumnByDate=function(a,b){b||this.expandExtendedColumnsForDate(a);var c=this.previousColumns.concat(this.columns,this.nextColumns),d=g.get(c,a,function(a){return a.date},!0);return void 0===d[0]?d[1]:d[0]},i.prototype.getColumnByPosition=function(a,b){b||this.expandExtendedColumnsForPosition(a);var c=this.previousColumns.concat(this.columns,this.nextColumns),d=g.get(c,a,function(a){return a.left},!0);return void 0===d[0]?d[1]:d[0]},i.prototype.updateColumnsWidths=function(a,b,c,d){var e=this.gantt.options.value("columnWidth"),g=this.gantt.options.value("expandToFit"),h=this.gantt.options.value("shrinkToFit");if(void 0===e||g||h){var i=this.gantt.getBodyAvailableWidth(),j=this.gantt.columnsManager.getLastColumn(!1);if(void 0!==j){var k=j.originalSize.left+j.originalSize.width;if(g&&i>k||h&&k>i||void 0===e){var l=i/k;f.setColumnsWidthFactor(a,l);for(var m=0;m<b.length;m++)f.setColumnsWidthFactor(b[m],l);return c.splice(0,this.previousColumns.length),d.splice(0,this.nextColumns.length),!0}}}return!1},i.prototype.getColumnsWidth=function(){var a=this.gantt.options.value("columnWidth");return void 0===a&&(a=!this.gantt.width||this.gantt.width<=0?20:this.gantt.width/this.columns.length),a},i.prototype.getColumnsWidthToFit=function(){return this.gantt.getBodyAvailableWidth()/this.columns.length},i.prototype.expandExtendedColumnsForPosition=function(b){var c;if(0>b){var d=this.getFirstColumn(),e=d.date,f=this.getFirstColumn(!0);return(!f||f.left>b)&&(c=this.gantt.options.value("viewScale"),this.previousColumns=a.generate(this.columnBuilder,e,void 0,c,this.getColumnsWidth(),-b,0,!0)),!0}if(b>this.gantt.width){var g=this.getLastColumn(),h=g.getDateByPosition(g.width),i=this.getLastColumn(!0);return(!i||i.left+i.width<b)&&(c=this.gantt.options.value("viewScale"),this.nextColumns=a.generate(this.columnBuilder,h,void 0,c,this.getColumnsWidth(),b-this.gantt.width,this.gantt.width,!1)),!0}return!1},i.prototype.expandExtendedColumnsForDate=function(b){var c,d=this.getFirstColumn();d&&(c=d.date);var e,f=this.getLastColumn();f&&(e=f.getDateByPosition(f.width));var g;if(c&&c>b){var h=this.getFirstColumn(!0);return(!h||h.date>b)&&(g=this.gantt.options.value("viewScale"),this.previousColumns=a.generate(this.columnBuilder,c,b,g,this.getColumnsWidth(),void 0,0,!0)),!0}if(e&&b>=e){var i=this.getLastColumn(!0);return(!i||i.date<e)&&(g=this.gantt.options.value("viewScale"),this.nextColumns=a.generate(this.columnBuilder,e,b,g,this.getColumnsWidth(),void 0,this.gantt.width,!1)),!0}return!1},i.prototype.getActiveHeadersCount=function(){return this.headers.length},i.prototype.updateVisibleColumns=function(a){this.visibleColumns=d("ganttColumnLimit")(this.columns,this.gantt),this.visibleHeaders=[];for(var b=0;b<this.headers.length;b++)this.visibleHeaders.push(d("ganttColumnLimit")(this.headers[b],this.gantt));if(a){for(b=0;b<this.visibleColumns.length;b++)this.visibleColumns[b].updateView();for(b=0;b<this.visibleHeaders.length;b++)for(var c=this.visibleHeaders[b],e=0;e<c.length;e++)c[e].updateView()}var f=this.gantt.options.value("currentDateValue");this.gantt.currentDateManager.setCurrentDate(f)};var j={year:"YYYY",quarter:"[Q]Q YYYY",month:"MMMM YYYY",week:"w",day:"D",hour:"H",minute:"HH:mm"},k={day:"LL",hour:"H",minute:"HH:mm"},l={year:"YYYY",quarter:"[Q]Q",month:"MMMM"};return i.prototype.getHeaderFormat=function(a){var b,c=this.gantt.options.value("headersFormats");if(void 0!==c&&(b=c[a]),void 0===b){var d=this.gantt.options.value("viewScale");d=d.trim(),"s"===d.charAt(d.length-1)&&(d=d.substring(0,d.length-1));var e,f;d&&(f=d.split(" ")),e=f&&f.length>1?f[f.length-1]:d,["millisecond","second","minute","hour"].indexOf(e)>-1?b=k[a]:["month","quarter","year"].indexOf(e)>-1&&(b=l[a]),void 0===b&&(b=j[a])}return b},i.prototype.getDateRange=function(a){var b,c;return a?this.visibleColumns&&this.visibleColumns.length>0&&(b=this.visibleColumns[0],c=this.visibleColumns[this.visibleColumns.length-1]):(b=this.getFirstColumn(),c=this.getLastColumn()),b&&c?[b.date,c.endDate]:void 0},i}])}(),function(){"use strict";angular.module("gantt").service("GanttHeadersGenerator",["GanttColumnHeader","moment",function(a,b){var c=function(c,d){var e,f,g,h,i=[];d&&(h=d.split(" ")),h&&h.length>1?(f=parseFloat(h[0]),g=h[h.length-1]):(f=1,g=d);for(var j=c.columns[0],k=b(j.date).startOf(g),l=b(c.columns[c.columns.length-1].endDate);;){var m=j.getPositionByDate(k),n=b.min(b(k).add(f,g),l),o=c.getColumnByDate(n,!0),p=o.getPositionByDate(n),q=p-m;if(q>0){var r=c.getHeaderFormat(g);e=new a(k,n,g,m,q,r),i.push(e)}if(n.isSame(l)||n.isAfter(l))break;j=o,k=n}return i};this.generate=function(a){var b=[];if(void 0===a.gantt.options.value("headers")){var d=a.gantt.options.value("viewScale");d=d.trim(),"s"===d.charAt(d.length-1)&&(d=d.substring(0,d.length-1));var e,f;d&&(f=d.split(" ")),e=f&&f.length>1?f[f.length-1]:d,["quarter","month"].indexOf(e)>-1&&b.push("year"),["day","week"].indexOf(e)>-1&&b.push("month"),["day"].indexOf(e)>-1&&b.push("week"),["hour"].indexOf(e)>-1&&b.push("day"),["minute","second"].indexOf(e)>-1&&b.push("hour"),["second"].indexOf(e)>-1&&b.push("minute"),b.push(d)}else b=a.gantt.options.value("headers");for(var g=[],h=0;h<b.length;h++)g.push(c(a,b[h]));return g}}])}(),function(){"use strict";angular.module("gantt").factory("Gantt",["GanttApi","GanttOptions","GanttCalendar","GanttScroll","GanttBody","GanttRowHeader","GanttHeader","GanttSide","GanttObjectModel","GanttRowsManager","GanttColumnsManager","GanttTimespansManager","GanttCurrentDateManager","ganttArrays","moment","$document","$timeout",function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q){var r=function(f,q){var r=this;this.$scope=f,this.$element=q,this.options=new b(f,{api:angular.noop,data:[],timespans:[],viewScale:"day",columnMagnet:"15 minutes",timeFramesMagnet:!0,showSide:!0,allowSideResizing:!0,currentDate:"line",currentDateValue:o,autoExpand:"none",taskOutOfRange:"truncate",taskContent:"{{task.model.name}}",rowContent:"{{row.model.name}}",maxHeight:0,timeFrames:[],dateFrames:[],timeFramesWorkingMode:"hidden",timeFramesNonWorkingMode:"visible"}),this.api=new a(this),this.api.registerEvent("core","ready"),this.api.registerEvent("core","rendered"),this.api.registerEvent("directives","controller"),this.api.registerEvent("directives","preLink"),this.api.registerEvent("directives","postLink"),this.api.registerEvent("directives","new"),this.api.registerEvent("directives","destroy"),this.api.registerEvent("data","change"),this.api.registerEvent("data","load"),this.api.registerEvent("data","remove"),this.api.registerEvent("data","clear"),this.api.registerMethod("core","getDateByPosition",this.getDateByPosition,this),this.api.registerMethod("core","getPositionByDate",this.getPositionByDate,this),this.api.registerMethod("data","load",this.loadData,this),this.api.registerMethod("data","remove",this.removeData,this),this.api.registerMethod("data","clear",this.clearData,this),this.api.registerMethod("data","get",this.getData,this),this.calendar=new c(this),this.calendar.registerTimeFrames(this.options.value("timeFrames")),this.calendar.registerDateFrames(this.options.value("dateFrames")),this.api.registerMethod("timeframes","registerTimeFrames",this.calendar.registerTimeFrames,this.calendar),this.api.registerMethod("timeframes","clearTimeframes",this.calendar.clearTimeFrames,this.calendar),this.api.registerMethod("timeframes","registerDateFrames",this.calendar.registerDateFrames,this.calendar),this.api.registerMethod("timeframes","clearDateFrames",this.calendar.clearDateFrames,this.calendar),this.api.registerMethod("timeframes","registerTimeFrameMappings",this.calendar.registerTimeFrameMappings,this.calendar),this.api.registerMethod("timeframes","clearTimeFrameMappings",this.calendar.clearTimeFrameMappings,this.calendar),f.$watchGroup(["timeFrames","dateFrames"],function(a,b){if(a!==b){var c=a[0],d=a[1],e=b[0],f=b[1],g=!1;angular.equals(c,e)||(r.calendar.clearTimeFrames(),r.calendar.registerTimeFrames(c),g=!0),angular.equals(d,f)||(r.calendar.clearDateFrames(),r.calendar.registerDateFrames(d),g=!0),g&&r.columnsManager.generateColumns()}}),f.$watch("columnMagnet",function(){var a,b=r.options.value("columnMagnet");b&&(a=b.trim().split(" ")),a&&a.length>1?(r.columnMagnetValue=parseFloat(a[0]),r.columnMagnetUnit=o.normalizeUnits(a[a.length-1])):(r.columnMagnetValue=1,r.columnMagnetUnit=o.normalizeUnits(b))}),f.$watchGroup(["shiftColumnMagnet","viewScale"],function(){var a,b=r.options.value("shiftColumnMagnet");b&&(a=b.trim().split(" ")),void 0!==a&&a.length>1?(r.shiftColumnMagnetValue=parseFloat(a[0]),r.shiftColumnMagnetUnit=o.normalizeUnits(a[a.length-1])):(r.shiftColumnMagnetValue=1,r.shiftColumnMagnetUnit=o.normalizeUnits(b))});var s=function(a){return r.shiftKey=a.shiftKey,!0};p.on("keyup keydown",s),f.$on("$destroy",function(){p.off("keyup keydown",s)}),this.scroll=new d(this),this.body=new e(this),this.header=new g(this),this.side=new h(this),this.objectModel=new i(this.api),this.rowsManager=new j(this),this.columnsManager=new k(this),this.timespansManager=new l(this),this.currentDateManager=new m(this),this.originalWidth=0,this.width=0,angular.isFunction(this.$scope.api)&&this.$scope.api(this.api);var t=function(a,b){if(void 0===b||a.length!==b.length)return!0;for(var c=0,d=a.length;d>c;c++)if(a[c].id!==b[c].id)return!0;return!1};f.$watchCollection("data",function(a,b){if(void 0!==b){var c=n.getRemovedIds(a,b);if(c.length===b.length)r.rowsManager.removeAll(),r.api.data.raise.clear();else{for(var d=0,e=c.length;e>d;d++){var f=c[d];r.rowsManager.removeRow(f)}var g=[];for(d=0,e=b.length;e>d;d++)c.indexOf(b[d].id)>-1&&g.push(b[d]);r.api.data.raise.remove(g)}}if(void 0!==a){var h=t(a,b);h&&r.rowsManager.resetNonModelLists();for(var i=0,j=a.length;j>i;i++){var k=a[i];r.rowsManager.addRow(k,h)}r.api.data.raise.change(a,b),r.api.data.raise.load(a)}})};return r.prototype.getDateByPosition=function(a,b,c){var d=this.columnsManager.getColumnByPosition(a,c);if(void 0!==d){var e,f;if(b)if(this.shiftKey)if(void 0!==this.shiftColumnMagnetValue&&void 0!==this.shiftColumnMagnetUnit)e=this.shiftColumnMagnetValue,f=this.shiftColumnMagnetUnit;else{var g=this.options.value("viewScale");g=g.trim();var h,i,j;g&&(j=g.split(" ")),j&&j.length>1?(h=parseFloat(j[0]),i=o.normalizeUnits(j[j.length-1])):(h=1,i=o.normalizeUnits(g)),e=.25*h,f=i}else e=this.columnMagnetValue,f=this.columnMagnetUnit;return d.getDateByPosition(a-d.left,e,f,this.options.value("timeFramesMagnet"))}},r.prototype.getBodyAvailableWidth=function(){var a=this.getWidth()-this.side.getWidth(),b=this.scroll.getBordersWidth(),c=a-(void 0!==b?this.scroll.getBordersWidth():0);return c-=1},r.prototype.getPositionByDate=function(a,b){if(void 0!==a){o.isMoment(o)||(a=o(a));var c=this.columnsManager.getColumnByDate(a,b);return void 0!==c?c.getPositionByDate(a):void 0}},r.prototype.loadData=function(a){if(angular.isArray(a)||(a=void 0!==a?[a]:[]),void 0===this.$scope.data)this.$scope.data=a;else for(var b=0,c=a.length;c>b;b++){var d=a[b],e=n.indexOfId(this.$scope.data,d.id);e>-1?this.$scope.data[e]=d:this.$scope.data.push(d)}var f=this.side.getWidth();f>0&&this.options.set("sideWidth",f)},r.prototype.getData=function(){return this.$scope.data},r.prototype.removeData=function(a){if(angular.isArray(a)||(a=void 0!==a?[a]:[]),void 0!==this.$scope.data)for(var b=0,c=a.length;c>b;b++){var d=a[b],e=n.indexOfId(this.$scope.data,d.id);if(e>-1)if(void 0===d.tasks||0===d.tasks.length)this.$scope.data.splice(e,1);else for(var f=this.$scope.data[e],g=0,h=d.tasks.length;h>g;g++){ +var i=d.tasks[g],j=n.indexOfId(f.tasks,i.id);j>-1&&f.tasks.splice(j,1)}}},r.prototype.clearData=function(){this.$scope.data=void 0},r.prototype.getWidth=function(){return this.$scope.ganttElementWidth},r.prototype.initialized=function(){this.api.core.raise.ready(this.api),this.rendered=!0,this.columnsManager.generateColumns();var a=this,b=function(){var b=a.side.getWidth();b>0&&a.options.set("sideWidth",b),a.api.core.raise.rendered(a.api)};q(b)},r}])}(),function(){"use strict";angular.module("gantt").factory("GanttObjectModel",["ganttUtils","moment",function(a,b){var c=function(a){this.api=a,this.api.registerEvent("tasks","clean"),this.api.registerEvent("rows","clean"),this.api.registerEvent("timespans","clean")};return c.prototype.cleanTask=function(c){void 0===c.id&&(c.id=a.randomUuid()),void 0===c.from||b.isMoment(c.from)||(c.from=b(c.from)),void 0===c.to||b.isMoment(c.to)||(c.to=b(c.to)),this.api.tasks.raise.clean(c)},c.prototype.cleanRow=function(c){void 0===c.id&&(c.id=a.randomUuid()),void 0===c.from||b.isMoment(c.from)||(c.from=b(c.from)),void 0===c.to||b.isMoment(c.to)||(c.to=b(c.to)),this.api.rows.raise.clean(c)},c.prototype.cleanTimespan=function(c){void 0===c.id&&(c.id=a.randomUuid()),void 0===c.from||b.isMoment(c.from)||(c.from=b(c.from)),void 0===c.to||b.isMoment(c.to)||(c.to=b(c.to)),this.api.timespans.raise.clean(c)},c}])}(),function(){"use strict";angular.module("gantt").factory("GanttRow",["GanttTask","moment","$filter",function(a,b,c){var d=function(a,b){this.rowsManager=a,this.model=b,this.from=void 0,this.to=void 0,this.tasksMap={},this.tasks=[],this.filteredTasks=[],this.visibleTasks=[]};return d.prototype.addTaskImpl=function(a,b){this.tasksMap[a.model.id]=a,this.tasks.push(a),b||(void 0===this.model.tasks&&(this.model.tasks=[]),-1===this.model.tasks.indexOf(a.model)&&this.model.tasks.push(a.model))},d.prototype.addTask=function(b,c){var d,e=!1;if(this.rowsManager.gantt.objectModel.cleanTask(b),b.id in this.tasksMap){if(d=this.tasksMap[b.id],d.model===b)return d;d.model=b,e=!0}else d=new a(this,b),this.addTaskImpl(d,c);return this.sortTasks(),this.setFromToByTask(d),c||(e?this.rowsManager.gantt.api.tasks.raise.change(d):this.rowsManager.gantt.api.tasks.raise.add(d)),d},d.prototype.moveTaskToRow=function(a,b){var c=a.row;c.removeTask(a.model.id,b,!0),a.row=this,this.addTaskImpl(a,b),this.sortTasks(),this.setFromToByTask(a),a.updatePosAndSize(),this.updateVisibleTasks(),c.$scope.$digest(),a.row.$scope.$digest(),this.rowsManager.gantt.api.tasks.raise.viewRowChange(a,c),b||this.rowsManager.gantt.api.tasks.raise.rowChange(a,c)},d.prototype.updateVisibleTasks=function(){var a=this.rowsManager.gantt.options.value("filterTask");if(a){"object"==typeof a&&(a={model:a});var b=this.rowsManager.gantt.options.value("filterTaskComparator");"function"==typeof b&&(b=function(a,c){return b(a.model,c.model)}),this.filteredTasks=c("filter")(this.tasks,a,b)}else this.filteredTasks=this.tasks.slice(0);this.visibleTasks=c("ganttTaskLimit")(this.filteredTasks,this.rowsManager.gantt)},d.prototype.updateTasksPosAndSize=function(){for(var a=0,b=this.tasks.length;b>a;a++)this.tasks[a].updatePosAndSize()},d.prototype.removeTask=function(a,b,c){if(a in this.tasksMap){var d,e,f=this.tasksMap[a];for(e=this.tasks.length-1;e>=0;e--)if(d=this.tasks[e],d.model.id===a){this.tasks.splice(e,1),(this.from-d.model.from===0||this.to-d.model.to===0)&&this.setFromTo();break}for(e=this.filteredTasks.length-1;e>=0;e--)if(d=this.filteredTasks[e],d.model.id===a){this.filteredTasks.splice(e,1);break}for(e=this.visibleTasks.length-1;e>=0;e--)if(d=this.visibleTasks[e],d.model.id===a){this.visibleTasks.splice(e,1);break}if(!b){if(delete this.tasksMap[a],void 0!==this.model.tasks){var g=this.model.tasks.indexOf(f.model);g>-1&&this.model.tasks.splice(g,1)}c||this.rowsManager.gantt.api.tasks.raise.remove(f)}return f}},d.prototype.removeAllTasks=function(){this.from=void 0,this.to=void 0,this.tasksMap={},this.tasks=[],this.filteredTasks=[],this.visibleTasks=[]},d.prototype.setFromTo=function(){this.from=void 0,this.to=void 0;for(var a=0,b=this.tasks.length;b>a;a++)this.setFromToByTask(this.tasks[a])},d.prototype.setFromToByTask=function(a){this.setFromToByValues(a.model.from,a.model.to)},d.prototype.setFromToByValues=function(a,c){void 0!==a&&(void 0===this.from?this.from=b(a):a<this.from&&(this.from=b(a))),void 0!==c&&(void 0===this.to?this.to=b(c):c>this.to&&(this.to=b(c)))},d.prototype.sortTasks=function(){this.tasks.sort(function(a,b){return a.left-b.left})},d.prototype.clone=function(){for(var a=new d(this.rowsManager,angular.copy(this)),b=0,c=this.tasks.length;c>b;b++)a.addTask(this.tasks[b].model);return a},d}])}(),function(){"use strict";angular.module("gantt").factory("GanttRowHeader",[function(){var a=function(a){this.gantt=a};return a}])}(),function(){"use strict";angular.module("gantt").factory("GanttRowsManager",["GanttRow","ganttArrays","$filter","$timeout","moment",function(a,b,c,d,e){var f=function(a){var b=this;this.gantt=a,this.rowsMap={},this.rows=[],this.sortedRows=[],this.filteredRows=[],this.customFilteredRows=[],this.visibleRows=[],this.rowsTaskWatchers=[],this._defaultFilterImpl=function(a,b,d){return c("filter")(a,b,d)},this.filterImpl=this._defaultFilterImpl,this.customRowSorters=[],this.customRowFilters=[],this.gantt.$scope.$watchGroup(["filterTask","filterTaskComparator"],function(a,c){a!==c&&b.updateVisibleTasks()}),this.gantt.$scope.$watchGroup(["filterRow","filterRowComparator"],function(a,c){a!==c&&b.updateVisibleRows()}),this.gantt.$scope.$watch("sortMode",function(a,c){a!==c&&b.sortRows()});var e=this.gantt.scroll.isVScrollbarVisible();this.gantt.$scope.$watchGroup(["maxHeight","gantt.rowsManager.visibleRows.length"],function(a,c){a!==c&&d(function(){var a=b.gantt.scroll.isVScrollbarVisible();a!==e&&(e=a,b.gantt.columnsManager.updateColumnsMeta())})}),this.gantt.api.registerMethod("rows","sort",f.prototype.sortRows,this),this.gantt.api.registerMethod("rows","applySort",f.prototype.applySort,this),this.gantt.api.registerMethod("rows","refresh",f.prototype.updateVisibleObjects,this),this.gantt.api.registerMethod("rows","removeRowSorter",f.prototype.removeCustomRowSorter,this),this.gantt.api.registerMethod("rows","addRowSorter",f.prototype.addCustomRowSorter,this),this.gantt.api.registerMethod("rows","removeRowFilter",f.prototype.removeCustomRowFilter,this),this.gantt.api.registerMethod("rows","addRowFilter",f.prototype.addCustomRowFilter,this),this.gantt.api.registerMethod("rows","setFilterImpl",f.prototype.setFilterImpl,this),this.gantt.api.registerEvent("tasks","add"),this.gantt.api.registerEvent("tasks","change"),this.gantt.api.registerEvent("tasks","viewChange"),this.gantt.api.registerEvent("tasks","rowChange"),this.gantt.api.registerEvent("tasks","viewRowChange"),this.gantt.api.registerEvent("tasks","remove"),this.gantt.api.registerEvent("tasks","filter"),this.gantt.api.registerEvent("tasks","displayed"),this.gantt.api.registerEvent("rows","add"),this.gantt.api.registerEvent("rows","change"),this.gantt.api.registerEvent("rows","remove"),this.gantt.api.registerEvent("rows","move"),this.gantt.api.registerEvent("rows","displayed"),this.gantt.api.registerEvent("rows","filter"),this.updateVisibleObjects()};return f.prototype.resetNonModelLists=function(){this.rows=[],this.sortedRows=[],this.filteredRows=[],this.customFilteredRows=[],this.visibleRows=[]},f.prototype.addRow=function(c,d){var e,f,g,h=!1;if(this.gantt.objectModel.cleanRow(c),c.id in this.rowsMap){if(e=this.rowsMap[c.id],d&&(this.rows.push(e),this.sortedRows.push(e),this.filteredRows.push(e),this.customFilteredRows.push(e),this.visibleRows.push(e)),e.model===c)return;var i=b.getRemovedIds(c.tasks,e.model.tasks);for(f=0,g=i.length;g>f;f++){var j=i[f];e.removeTask(j)}e.model=c,h=!0}else e=new a(this,c),this.rowsMap[c.id]=e,this.rows.push(e),this.sortedRows.push(e),this.filteredRows.push(e),this.customFilteredRows.push(e),this.visibleRows.push(e);if(void 0!==c.tasks&&c.tasks.length>0){for(f=0,g=c.tasks.length;g>f;f++){var k=c.tasks[f];e.addTask(k)}e.updateVisibleTasks()}if(h?this.gantt.api.rows.raise.change(e):this.gantt.api.rows.raise.add(e),!h){var l=this.gantt.$scope.$watchCollection(function(){return c.tasks},function(a,c){if(a!==c){var d,f,g=b.getRemovedIds(a,c);for(d=0,f=g.length;f>d;d++){var h=g[d];e.removeTask(h)}if(void 0!==a){for(d=0,f=a.length;f>d;d++){var i=a[d];e.addTask(i)}e.updateVisibleTasks()}}});this.rowsTaskWatchers.push(l)}return h},f.prototype.removeRow=function(a){if(a in this.rowsMap){delete this.rowsMap[a];var c,d,e=b.indexOfId(this.rows,a,["model","id"]);if(e>-1){c=this.rows.splice(e,1)[0];var f=this.rowsTaskWatchers.splice(e,1)[0];f()}return b.removeId(this.sortedRows,a,["model","id"]),b.removeId(this.filteredRows,a,["model","id"]),b.removeId(this.customFilteredRows,a,["model","id"]),b.removeId(this.visibleRows,a,["model","id"]),this.gantt.api.rows.raise.remove(c),d}},f.prototype.removeAll=function(){this.rowsMap={},this.rows=[],this.sortedRows=[],this.filteredRows=[],this.customFilteredRows=[],this.visibleRows=[];for(var a=0,b=this.rowsTaskWatchers.length;b>a;a++){var c=this.rowsTaskWatchers[a];c()}this.rowsTaskWatchers=[]},f.prototype.sortRows=function(){var a=this.gantt.options.value("sortMode");if(void 0!==a){var b=!1;angular.isString(a)&&"-"===a.charAt(0)&&(b=!0,a=a.substr(1));var d=c("orderBy");this.sortedRows=d(this.rows,a,b)}else this.sortedRows=this.rows.slice();this.sortedRows=this.applyCustomRowSorters(this.sortedRows),this.updateVisibleRows()},f.prototype.removeCustomRowSorter=function(a){var b=this.customRowSorters.indexOf(a);b>-1&&this.customRowSorters.splice(b,1)},f.prototype.addCustomRowSorter=function(a){this.customRowSorters.push(a)},f.prototype.applyCustomRowSorters=function(a){for(var b=0;b<this.customRowSorters.length;b++)a=this.customRowSorters[b](a);return a},f.prototype.applySort=function(){var a=this.gantt.$scope.data;a.splice(0,a.length);for(var b=[],c=0,d=this.sortedRows.length;d>c;c++)a.push(this.sortedRows[c].model),b.push(this.sortedRows[c]);this.rows=b},f.prototype.moveRow=function(a,c){var d=this.gantt.options.value("sortMode");void 0!==d&&(this.applySort(),this.gantt.options.set("sortMode",void 0));var e=this.rows.indexOf(c),f=this.rows.indexOf(a);e>-1&&f>-1&&e!==f&&(b.moveToIndex(this.rows,f,e),b.moveToIndex(this.rowsTaskWatchers,f,e),b.moveToIndex(this.gantt.$scope.data,f,e),this.gantt.api.rows.raise.change(a),this.gantt.api.rows.raise.move(a,f,e),this.updateVisibleObjects(),this.sortRows())},f.prototype.updateVisibleObjects=function(){this.updateVisibleRows(),this.updateVisibleTasks()},f.prototype.updateVisibleRows=function(){var a=this.filteredRows,b=this.gantt.options.value("filterRow");if(b){"object"==typeof b&&(b={model:b});var c=this.gantt.options.value("filterRowComparator");if("function"==typeof c){var d=this.gantt;c=function(a,b){return d.options.value("filterRowComparator")(a,b)}}this.filteredRows=this.filterImpl(this.sortedRows,b,c)}else this.filteredRows=this.sortedRows.slice(0);var e=!angular.equals(a,this.filteredRows);this.customFilteredRows=this.applyCustomRowFilters(this.filteredRows),this.visibleRows=this.customFilteredRows,this.gantt.api.rows.raise.displayed(this.sortedRows,this.filteredRows,this.visibleRows),e&&this.gantt.api.rows.raise.filter(this.sortedRows,this.filteredRows)},f.prototype.removeCustomRowFilter=function(a){var b=this.customRowFilters.indexOf(a);b>-1&&this.customRowFilters.splice(b,1)},f.prototype.addCustomRowFilter=function(a){this.customRowFilters.push(a)},f.prototype.applyCustomRowFilters=function(a){for(var b=0;b<this.customRowFilters.length;b++)a=this.customRowFilters[b](a);return a},f.prototype.setFilterImpl=function(a){a?this.filterImpl=a:this.filterImpl=this._defaultFilterImpl},f.prototype.updateVisibleTasks=function(){for(var a=[],b=[],c=[],d=[],e=0;e<this.rows.length;e++){var f=this.rows[e];a=a.concat(f.filteredTasks),f.updateVisibleTasks(),b=b.concat(f.filteredTasks),d=d.concat(f.visibleTasks),c=c.concat(f.tasks)}this.gantt.api.tasks.raise.displayed(c,b,d);var g=!angular.equals(a,b);g&&this.gantt.api.tasks.raise.filter(c,b,d)},f.prototype.updateTasksPosAndSize=function(){for(var a=0,b=this.rows.length;b>a;a++)this.rows[a].updateTasksPosAndSize()},f.prototype.getExpandedFrom=function(a){a=a?e(a):a;for(var b=a,c=0;c<this.rows.length;c++)(void 0===b||b>this.rows[c].from)&&(b=this.rows[c]);return b&&(!a||a>b)?b:a},f.prototype.getExpandedTo=function(a){a=a?e(a):a;for(var b=a,c=0;c<this.rows.length;c++)(void 0===b||b<this.rows[c].to)&&(b=this.rows[c].to);var d=this.gantt.options.value("toDate");return b&&(!d||b>d)?b:a},f.prototype.getDefaultFrom=function(){for(var a,b=0;b<this.rows.length;b++)(void 0===a||this.rows[b].from<a)&&(a=this.rows[b].from);return a},f.prototype.getDefaultTo=function(){for(var a,b=0;b<this.rows.length;b++)(void 0===a||this.rows[b].to>a)&&(a=this.rows[b].to);return a},f}])}(),function(){"use strict";angular.module("gantt").factory("GanttTask",["moment",function(a){var b=function(a,b){this.rowsManager=a.rowsManager,this.row=a,this.model=b,this.truncatedLeft=!1,this.truncatedRight=!1};return b.prototype.isMilestone=function(){return!this.model.to||this.model.from-this.model.to===0},b.prototype.isOutOfRange=function(){var a=this.rowsManager.gantt.columnsManager.getFirstColumn(),b=this.rowsManager.gantt.columnsManager.getLastColumn();return void 0===a||this.model.to<a.date||void 0===b||this.model.from>b.endDate},b.prototype.updatePosAndSize=function(){var b=this.left,c=this.width,d=this.truncatedRight,e=this.truncatedLeft;!this.isMoving&&this.isOutOfRange()?(this.modelLeft=void 0,this.modelWidth=void 0):(this.modelLeft=this.rowsManager.gantt.getPositionByDate(this.model.from),this.modelWidth=this.rowsManager.gantt.getPositionByDate(this.model.to)-this.modelLeft);var f=this.rowsManager.gantt.columnsManager.getLastColumn(),g=f?f.left+f.width:0,h=this.modelLeft,i=this.modelWidth;this.rowsManager.gantt.options.value("daily")&&(h=this.rowsManager.gantt.getPositionByDate(a(this.model.from).startOf("day")),i=this.rowsManager.gantt.getPositionByDate(a(this.model.to).endOf("day"))-h),void 0===h||void 0===i||0>h+i||h>g?(this.left=void 0,this.width=void 0):(this.left=Math.min(Math.max(h,0),this.rowsManager.gantt.width),0>h?(this.truncatedLeft=!0,i+h>this.rowsManager.gantt.width?(this.truncatedRight=!0,this.width=this.rowsManager.gantt.width):(this.truncatedRight=!1,this.width=i+h)):i+h>this.rowsManager.gantt.width?(this.truncatedRight=!0,this.truncatedLeft=!1,this.width=this.rowsManager.gantt.width-h):(this.truncatedLeft=!1,this.truncatedRight=!1,this.width=i),this.width<0&&(this.left=this.left+this.width,this.width=-this.width)),this.updateView(),this.rowsManager.gantt.isRefreshingColumns||b===this.left&&c===this.width&&d===this.truncatedRight&&e===this.truncatedLeft||this.rowsManager.gantt.api.tasks.raise.viewChange(this)},b.prototype.updateView=function(){if(this.$element)if(void 0===this.left||void 0===this.width)this.$element.css("display","none");else{if(this.$element.css({left:this.left+"px",width:this.width+"px",display:""}),this.model.priority>0)for(var a=this.model.priority,b=this.$element.children(),c=0;c<b.length;c++)angular.element(b[c]).css("z-index",a);this.$element.toggleClass("gantt-task-milestone",this.isMilestone())}},b.prototype.getBackgroundElement=function(){if(void 0!==this.$element){var a=this.$element[0].querySelector(".gantt-task-background");return void 0!==a&&(a=angular.element(a)),a}},b.prototype.getContentElement=function(){if(void 0!==this.$element){var a=this.$element[0].querySelector(".gantt-task-content");return void 0!==a&&(a=angular.element(a)),a}},b.prototype.getForegroundElement=function(){if(void 0!==this.$element){var a=this.$element[0].querySelector(".gantt-task-foreground");return void 0!==a&&(a=angular.element(a)),a}},b.prototype.setFrom=function(a,b){this.model.from=this.rowsManager.gantt.getDateByPosition(a,b),this.row.setFromTo(),this.updatePosAndSize()},b.prototype.setTo=function(a,b){this.model.to=this.rowsManager.gantt.getDateByPosition(a,b),this.row.setFromTo(),this.updatePosAndSize()},b.prototype.moveTo=function(a,b){var c,d;a>this.modelLeft?(this.model.to=this.rowsManager.gantt.getDateByPosition(a+this.modelWidth,b),c=this.rowsManager.gantt.getPositionByDate(this.model.to),d=c-this.modelWidth,this.model.from=this.rowsManager.gantt.getDateByPosition(d,!1)):(this.model.from=this.rowsManager.gantt.getDateByPosition(a,b),d=this.rowsManager.gantt.getPositionByDate(this.model.from),c=d+this.modelWidth,this.model.to=this.rowsManager.gantt.getDateByPosition(c,!1)),this.row.setFromTo(),this.updatePosAndSize()},b.prototype.clone=function(){return new b(this.row,angular.copy(this.model))},b}])}(),function(){"use strict";angular.module("gantt").factory("GanttBody",["GanttBodyColumns","GanttBodyRows","GanttBodyBackground","GanttBodyForeground",function(a,b,c,d){var e=function(e){this.gantt=e,this.background=new c(this),this.foreground=new d(this),this.columns=new a(this),this.rows=new b(this)};return e}])}(),function(){"use strict";angular.module("gantt").factory("GanttBodyBackground",[function(){var a=function(a){this.body=a};return a}])}(),function(){"use strict";angular.module("gantt").factory("GanttBodyColumns",[function(){var a=function(a){this.body=a};return a}])}(),function(){"use strict";angular.module("gantt").factory("GanttBodyForeground",[function(){var a=function(a){this.body=a};return a}])}(),function(){"use strict";angular.module("gantt").factory("GanttBodyRows",[function(){var a=function(a){this.body=a};return a}])}(),function(){"use strict";angular.module("gantt").factory("GanttHeader",["GanttHeaderColumns",function(a){var b=function(b){this.gantt=b,this.columns=new a(this),this.getHeight=function(){return this.$element[0].offsetHeight}};return b}])}(),function(){"use strict";angular.module("gantt").factory("GanttHeaderColumns",[function(){var a=function(a){this.$element=a};return a}])}(),function(){"use strict";angular.module("gantt").factory("GanttScroll",[function(){var a=function(b){this.gantt=b,this.gantt.api.registerEvent("scroll","scroll"),this.gantt.api.registerMethod("scroll","to",a.prototype.scrollTo,this),this.gantt.api.registerMethod("scroll","toDate",a.prototype.scrollToDate,this),this.gantt.api.registerMethod("scroll","left",a.prototype.scrollToLeft,this),this.gantt.api.registerMethod("scroll","right",a.prototype.scrollToRight,this),this.gantt.api.registerMethod("scroll","setWidth",a.prototype.setWidth,this)};return a.prototype.getScrollLeft=function(){return void 0===this.$element?void 0:(void 0===this.cachedScrollLeft&&(this.cachedScrollLeft=this.$element[0].scrollLeft),this.cachedScrollLeft)},a.prototype.getScrollWidth=function(){return void 0===this.$element?void 0:this.$element[0].scrollWidth},a.prototype.getWidth=function(){return void 0===this.$element?void 0:this.$element[0].offsetWidth},a.prototype.setWidth=function(a){this.$element[0]&&(this.$element[0].offsetWidth=a)},a.prototype.getBordersWidth=function(){if(void 0!==this.$element){if(this.$element[0].clientWidth)return this.$element[0].offsetWidth-this.$element[0].clientWidth;var a=window.getComputedStyle(this.$element[0]).getPropertyValue("border-left-width")?window.getComputedStyle(this.$element[0]).getPropertyValue("border-left-width").match(/\d+/)[0]:0,b=window.getComputedStyle(this.$element[0]).getPropertyValue("border-right-width")?window.getComputedStyle(this.$element[0]).getPropertyValue("border-right-width").match(/\d+/)[0]:0;return parseInt(a)+parseInt(b)}},a.prototype.getBordersHeight=function(){return void 0===this.$element?void 0:this.$element[0].offsetHeight-this.$element[0].clientHeight},a.prototype.isVScrollbarVisible=function(){return void 0!==this.$element?this.$element[0].scrollHeight>this.$element[0].offsetHeight:void 0},a.prototype.isHScrollbarVisible=function(){return void 0!==this.$element?this.$element[0].scrollWidth>this.$element[0].offsetWidth:void 0},a.prototype.scrollTo=function(a){this.$element[0].scrollLeft=a,this.$element.triggerHandler("scroll")},a.prototype.scrollToLeft=function(a){this.$element[0].scrollLeft-=a,this.$element.triggerHandler("scroll")},a.prototype.scrollToRight=function(a){this.$element[0].scrollLeft+=a,this.$element.triggerHandler("scroll")},a.prototype.scrollToDate=function(a){var b=this.gantt.getPositionByDate(a);void 0!==b&&(this.$element[0].scrollLeft=b-this.$element[0].offsetWidth/2)},a}])}(),function(){"use strict";angular.module("gantt").factory("GanttSide",[function(){var a=function(a){this.gantt=a};return a.prototype.getWidth=function(){if(this.gantt.options.value("showSide")){var a=this.gantt.options.value("sideWidth");if(void 0===a&&void 0!==this.$element&&void 0!==this.$element.css("width")&&this.$element.css("width",""),void 0!==this.$element&&(a=this.$element[0].offsetWidth),void 0!==a)return a}return 0},a.prototype.show=function(a){void 0!==this.$element&&this.$element.toggleClass("ng-hide",!a)},a.prototype.isShown=function(){return void 0!==this.$element?!this.$element.hasClass("ng-hide"):void 0},a}])}(),function(){"use strict";angular.module("gantt").factory("GanttTimespan",[function(){var a=function(a,b){this.gantt=a,this.model=b};return a.prototype.updatePosAndSize=function(){this.modelLeft=this.gantt.getPositionByDate(this.model.from),this.modelWidth=this.gantt.getPositionByDate(this.model.to)-this.modelLeft;var a=this.gantt.columnsManager.getLastColumn(),b=a?a.left+a.width:0;this.modelLeft+this.modelWidth<0||this.modelLeft>b?(this.left=void 0,this.width=void 0):(this.left=Math.min(Math.max(this.modelLeft,0),this.gantt.width),this.modelLeft<0?(this.truncatedLeft=!0,this.modelWidth+this.modelLeft>this.gantt.width?(this.truncatedRight=!0,this.width=this.gantt.width):(this.truncatedRight=!1,this.width=this.modelWidth+this.modelLeft)):this.modelWidth+this.modelLeft>this.gantt.width?(this.truncatedRight=!0,this.truncatedLeft=!1,this.width=this.gantt.width-this.modelLeft):(this.truncatedLeft=!1,this.truncatedRight=!1,this.width=this.modelWidth),this.width<0&&(this.left=this.left+this.width,this.width=-this.width)),this.updateView()},a.prototype.updateView=function(){this.$element&&(void 0===this.left||void 0===this.width?this.$element.css("display","none"):(this.$element.css("display",""),this.$element.css("left",this.left+"px"),this.$element.css("width",this.width+"px")))},a.prototype.setFrom=function(a){this.from=this.gantt.getDateByPosition(a),this.updatePosAndSize()},a.prototype.setTo=function(a){this.to=this.gantt.getDateByPosition(a),this.updatePosAndSize()},a.prototype.moveTo=function(a){this.from=this.gantt.getDateByPosition(a),this.to=this.gantt.getDateByPosition(a+this.width),this.updatePosAndSize()},a.prototype.clone=function(){return new a(this.gantt,angular.copy(this.model))},a}])}(),function(){"use strict";angular.module("gantt").factory("GanttTimespansManager",["GanttTimespan",function(a){var b=function(a){var b=this;this.gantt=a,this.timespansMap={},this.timespans=[],this.gantt.$scope.$watchCollection("timespans",function(a){b.clearTimespans(),b.loadTimespans(a)}),this.gantt.api.registerMethod("timespans","load",this.loadTimespans,this),this.gantt.api.registerMethod("timespans","remove",this.removeTimespans,this),this.gantt.api.registerMethod("timespans","clear",this.clearTimespans,this),this.gantt.api.registerEvent("timespans","add"),this.gantt.api.registerEvent("timespans","remove"),this.gantt.api.registerEvent("timespans","change")};return b.prototype.loadTimespans=function(a){angular.isArray(a)||(a=void 0!==a?[a]:[]),this.gantt.$scope.timespans=a;for(var b=0,c=a.length;c>b;b++){var d=a[b];this.gantt.objectModel.cleanTimespan(d),this.loadTimespan(d)}},b.prototype.loadTimespan=function(b){var c,d=!1;return b.id in this.timespansMap?(c=this.timespansMap[b.id],c.model=b,d=!0,this.gantt.api.timespans.raise.change(c)):(c=new a(this.gantt,b),this.timespansMap[b.id]=c,this.timespans.push(c),this.gantt.api.timespans.raise.add(c)),c.updatePosAndSize(),d},b.prototype.removeTimespans=function(a){angular.isArray(a)||(a=[a]);for(var b=0,c=a.length;c>b;b++){var d=a[b];this.removeTimespan(d.id)}this.updateVisibleObjects()},b.prototype.removeTimespan=function(a){if(a in this.timespansMap){delete this.timespansMap[a];for(var b,c,d=this.timespans.length-1;d>=0;d--)if(c=this.timespans[d],c.model.id===a){b=c,this.timespans.splice(d,1);break}return this.gantt.api.timespans.raise.remove(b),b}},b.prototype.clearTimespans=function(){this.timespansMap={},this.timespans=[]},b.prototype.updateTimespansPosAndSize=function(){for(var a=0,b=this.timespans.length;b>a;a++)this.timespans[a].updatePosAndSize()},b}])}(),function(){"use strict";angular.module("gantt").service("ganttArrays",[function(){return{moveToIndex:function(a,b,c){if(c>=a.length)for(var d=c-a.length;d--+1;)a.push(void 0);return a.splice(c,0,a.splice(b,1)[0]),a},getRemovedIds:function(a,b,c){void 0===c&&(c="id");var d,e,f=[];if(void 0!==b)for(d=0,e=b.length;e>d;d++)f.push(b[d][c]);if(void 0!==a)for(d=0,e=a.length;e>d;d++){var g=a[d];if(void 0!==g[c]){var h=f.indexOf(g[c]);h>-1&&f.splice(h,1)}}return f},indexOfId:function(a,b,c){var d;if(void 0===c)c="id";else if(c instanceof Array){for(d=a.length-1;d>=0;d--){for(var e=a[d],f=0,g=c.length;g>f;f++)e=e[c[f]];if(e===b)return d}return-1}for(d=a.length-1;d>=0;d--)if(a[d][c]===b)return d;return-1},removeId:function(a,b,c){var d=this.indexOfId(a,b,c);return d>-1?a.splice(d,1)[0]:void 0},remove:function(a,b){var c=a.indexOf(b);return c>-1?(a.splice(c,1),!0):!1}}}])}(),function(){"use strict";angular.module("gantt").service("ganttBinarySearch",[function(){return{getIndicesOnly:function(a,b,c,d){for(var e=-1,f=a.length;f-e>1;){var g=Math.floor((e+f)/2);(d?c(a[g])<b:c(a[g])<=b)?e=g:f=g}return d||void 0===a[e]||c(a[e])!==b||(f=e),[e,f]},get:function(a,b,c,d){var e=this.getIndicesOnly(a,b,c,d);return[a[e[0]],a[e[1]]]}}}])}(),function(){"use strict";angular.module("gantt").factory("GanttHierarchy",[function(){var a=function(){var a=this,b={},c={},d={},e={},f={},g={},h=function(a,b){if(void 0!==b){var c=d[a.model.name];void 0===c&&(c=[],d[a.model.name]=c),c.push(b);var h=e[a.model.id];void 0===h&&(h=[],e[a.model.id]=h),h.push(b),f[b.model.name]=a,g[b.model.id]=a}};this.refresh=function(i){b={},c={},d={},e={},f={},g={};for(var j,k=0;k<i.length;k++)j=i[k],b[j.model.name]=j,c[j.model.id]=j;for(k=0;k<i.length;k++){if(j=i[k],void 0!==j.model.parent){var l=b[j.model.parent];void 0===l&&(l=c[j.model.parent]),void 0!==l&&h(l,j)}if(void 0!==j.model.children)for(var m=j.model.children,n=0;n<m.length;n++){var o=m[n],p=b[o];void 0===p&&(p=c[o]),void 0!==p&&h(j,p)}}var q=[];for(k=0;k<i.length;k++)j=i[k],void 0===a.parent(j)&&q.push(j);return q},this.children=function(a){var b=e[a.model.id];return b},this.descendants=function(b){var c=[],d=a.children(b);if(c.push.apply(c,d),void 0!==d)for(var e=0;e<d.length;e++){var f=a.descendants(d[e]);c.push.apply(c,f)}return c},this.parent=function(a){var b=g[a.model.id];return b},this.ancestors=function(b){for(var c=[],d=a.parent(b);void 0!==d;)c.push(d),d=a.parent(d);return c}};return a}])}(),function(){"use strict";angular.module("gantt").service("ganttUtils",[function(){return{createBoundedWrapper:function(a,b){return function(){return b.apply(a,arguments)}},firstProperty:function(a,b,c){for(var d=0,e=a.length;e>d;d++){var f=a[d];if(void 0!==f&&b in f&&void 0!==f[b])return f[b]}return c},angularIndexOf:function(a,b){for(var c=0;c<a.length;c++)if(angular.equals(a[c],b))return c;return-1},random4:function(){return Math.floor(65536*(1+Math.random())).toString(16).substring(1)},randomUuid:function(){return this.random4()+this.random4()+"-"+this.random4()+"-"+this.random4()+"-"+this.random4()+"-"+this.random4()+this.random4()+this.random4()},newId:function(){var a=(new Date).getTime();return function(){return a+=1}}()}}])}(),function(){"use strict";angular.module("gantt").filter("ganttColumnLimit",["ganttBinarySearch",function(a){var b=function(a){return a.left};return function(c,d){var e=d.scroll.getScrollLeft(),f=d.getWidth()-d.side.getWidth();if(f>0){var g=a.getIndicesOnly(c,e,b)[0],h=a.getIndicesOnly(c,e+f,b)[1];return c.slice(g,h)}return c.slice()}}])}(),function(){"use strict";angular.module("gantt").filter("ganttTaskLimit",[function(){return function(a,b){var c=b.columnsManager.getFirstColumn(),d=b.columnsManager.getLastColumn();if(void 0!==c&&void 0!==d){for(var e=c.date,f=d.endDate,g=[],h=b.scroll.getScrollLeft(),i=b.getWidth()-b.side.getWidth(),j=0,k=a.length;k>j;j++){var l=a[j];l.active?g.push(l):l.model.to>=e&&l.model.from<=f&&(void 0===l.left&&l.updatePosAndSize(),(!i||l.left>=h&&l.left<=h+i||l.left+l.width>=h&&l.left+l.width<=h+i||l.left<h&&l.left+l.width>h+i)&&g.push(l))}return g}return a.splice()}}])}(),function(){"use strict";angular.module("gantt").directive("ganttResizer",["$document","$parse","$timeout","ganttMouseOffset",function(a,b,c,d){return{restrict:"A",require:"^gantt",scope:{targetElement:"=ganttResizer",enabled:"@?ganttResizerEnabled"},link:function(e,f,g,h){function i(){return h.gantt.options.value(g.resizerWidth)}function j(a){a!==i()&&(h.gantt.options.set(g.resizerWidth,a),void 0!==p&&o[p].raise.resize(a),c(function(){h.gantt.columnsManager.updateColumnsMeta()}))}function k(a){a.preventDefault(),j(void 0)}function l(a){e.$evalAsync(function(){var b=d.getOffsetForElement(e.targetElement[0],a),c=h.gantt.getWidth()-h.gantt.scroll.getBordersWidth(),f=Math.min(Math.max(b.x,0),c);j(f)})}function m(){void 0!==p&&o[p].raise.resizeEnd(i()),a.unbind("mousemove",l),a.unbind("mouseup",m)}function n(b){b.preventDefault(),void 0!==p&&o[p].raise.resizeBegin(i()),a.on("mousemove",l),a.on("mouseup",m)}var o=h.gantt.api,p=g.ganttResizerEventTopic;void 0===e.enabled&&(e.enabled=!0),g.$observe("ganttResizerEnabled",function(a){e.enabled=b(a)()}),e.$watch("enabled",function(a){void 0===a&&(a=!0),f.toggleClass("gantt-resizer-enabled",a),a?(f.on("dblclick",k),f.on("mousedown",n)):(f.off("dblclick",k),f.off("mousedown",n))}),e.$watch(function(){return i()},function(a,b){a!==b&&(e.targetElement.css("width",a+"px"),e.targetElement[0].offsetWidth>0&&j(e.targetElement[0].offsetWidth))}),p&&(o.registerEvent(p,"resize"),o.registerEvent(p,"resizeBegin"),o.registerEvent(p,"resizeEnd"),o.registerMethod(p,"setWidth",j,this),o.registerMethod(p,"getWidth",i,this))}}}])}(),function(){"use strict";angular.module("gantt").directive("ganttHorizontalScrollReceiver",function(){return{restrict:"A",require:"^ganttScrollManager",link:function(a,b,c,d){d.registerHorizontalReceiver(b)}}})}(),function(){"use strict";angular.module("gantt").directive("ganttScrollManager",function(){return{restrict:"A",scope:{},controller:["$scope",function(a){a.horizontal=[],a.vertical=[],this.registerVerticalReceiver=function(b){b.css("position","relative"),a.vertical.push(b[0])},this.registerHorizontalReceiver=function(b){b.css("position","relative"),a.horizontal.push(b[0])},this.getHorizontalRecievers=function(){return a.horizontal},this.getVerticalRecievers=function(){return a.vertical}}]}})}(),function(){"use strict";angular.module("gantt").directive("ganttScrollSender",[function(){return{restrict:"A",require:["^gantt","^ganttScrollManager"],link:function(a,b,c,d){var e=b[0],f=function(){var a,b,c=d[1].getVerticalRecievers();for(a=0,b=c.length;b>a;a++){var f=c[a];f.parentNode.scrollTop!==e.scrollTop&&(f.parentNode.scrollTop=e.scrollTop)}var g=d[1].getHorizontalRecievers();for(a=0,b=g.length;b>a;a++){var h=g[a];h.parentNode.scrollLeft!==e.scrollLeft&&(h.parentNode.scrollLeft=e.scrollLeft)}};b.bind("scroll",f),a.$watch(function(){return d[0].gantt.width},function(a,b){if(a!==b)for(var c=d[1].getHorizontalRecievers(),e=0,f=c.length;f>e;e++){var g=c[e];g.style.width=a+"px"}})}}}])}(),function(){"use strict";angular.module("gantt").directive("ganttScrollable",["GanttDirectiveBuilder","$timeout","ganttDebounce","moment",function(a,b,c,d){var e=new a("ganttScrollable");return e.controller=function(a,e){a.gantt.scroll.$element=e;var f,g,h=function(b,c,e){ +var f=a.gantt.options.value("autoExpand");if("both"===f||f===!0||f===e){var g,h,i=a.gantt.options.value("viewScale");i=i.trim(),"s"===i.charAt(i.length-1)&&(i=i.substring(0,i.length-1));var j,k,l;i&&(l=i.split(" ")),l&&l.length>1?(j=parseFloat(l[0]),k=l[l.length-1]):(j=1,k=i),"left"===e?(g=d(c).add(-5*j,k),a.fromDate=g):(h=d(c).add(5*j,k),a.toDate=h),a.gantt.api.scroll.raise.scroll(b.scrollLeft,c,e)}};e.bind("scroll",c(function(){var c,d,i=e[0],j=i.scrollLeft;a.gantt.scroll.cachedScrollLeft=j,a.gantt.columnsManager.updateVisibleColumns(),a.gantt.rowsManager.updateVisibleObjects(),f>j&&0===j?(c="left",d=a.gantt.columnsManager.from):j>f&&i.offsetWidth+j>=i.scrollWidth-1&&(c="right",d=a.gantt.columnsManager.to),f=j,void 0!==d?(g&&b.cancel(g),g=b(function(){h(i,d,c)},300)):a.gantt.api.scroll.raise.scroll(j)},5)),a.getScrollableCss=function(){var b={},c=a.gantt.options.value("maxHeight");c>0&&(b["max-height"]=c-a.gantt.header.getHeight()+"px",b["overflow-y"]="auto",a.gantt.scroll.isVScrollbarVisible()&&(b["border-right"]="none"));var d=this.gantt.options.value("columnWidth"),e=0===a.gantt.width?!1:a.gantt.width<a.gantt.getWidth()-a.gantt.side.getWidth();return void 0!==d&&e&&(b.width=a.gantt.width+this.gantt.scroll.getBordersWidth()+"px"),b}},e.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttVerticalScrollReceiver",function(){return{restrict:"A",require:"^ganttScrollManager",link:function(a,b,c,d){d.registerVerticalReceiver(b)}}})}(),function(){"use strict";angular.module("gantt").directive("ganttElementHeightListener",[function(){return{restrict:"A",controller:["$scope","$element","$attrs",function(a,b,c){var d=c.ganttElementHeightListener;""===d&&(d="ganttElementHeight");for(var e=a;0===d.indexOf("$parent.");)d=d.substring("$parent.".length),e=e.$parent;e.$watch(function(){return b[0].offsetHeight},function(a){a>0&&(e[d]=a)})}]}}])}(),function(){"use strict";angular.module("gantt").directive("ganttElementWidthListener",[function(){return{restrict:"A",controller:["$scope","$element","$attrs",function(a,b,c){var d=c.ganttElementWidthListener;""===d&&(d="ganttElementWidth");for(var e=a;0===d.indexOf("$parent.");)d=d.substring("$parent.".length),e=e.$parent;e.$watch(function(){return b[0].offsetWidth},function(a){a>0&&(e[d]=a)})}]}}])}(),function(){"use strict";angular.module("gantt").directive("ganttBody",["GanttDirectiveBuilder",function(a){var b=new a("ganttBody");return b.controller=function(a,b){a.gantt.body.$element=b,a.gantt.body.$scope=a},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttBodyBackground",["GanttDirectiveBuilder",function(a){var b=new a("ganttBodyBackground");return b.controller=function(a,b){a.gantt.body.background.$element=b,a.gantt.body.background.$scope=a},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttBodyColumns",["GanttDirectiveBuilder",function(a){var b=new a("ganttBodyColumns");return b.controller=function(a,b){a.gantt.body.columns.$element=b,a.gantt.body.background.$scope=a},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttBodyForeground",["GanttDirectiveBuilder",function(a){var b=new a("ganttBodyForeground");return b.controller=function(a,b){a.gantt.body.foreground.$element=b,a.gantt.body.foreground.$scope=a},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttBodyRows",["GanttDirectiveBuilder",function(a){var b=new a("ganttBodyRows");return b.controller=function(a,b){a.gantt.body.rows.$element=b,a.gantt.body.rows.$scope=a},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttColumn",["GanttDirectiveBuilder",function(a){var b=new a("ganttColumn");return b.controller=function(a,b){a.column.$element=b,a.column.$scope=a,a.column.updateView()},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttColumnHeader",["GanttDirectiveBuilder",function(a){var b=new a("ganttColumnHeader");return b.controller=function(a,b){a.column.$element=b,a.column.$scope=a,a.column.updateView()},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttHeader",["GanttDirectiveBuilder",function(a){var b=new a("ganttHeader");return b.controller=function(a,b){a.gantt.header.$element=b,a.gantt.header.$scope=a},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttHeaderColumns",["GanttDirectiveBuilder",function(a){var b=new a("ganttHeaderColumns");return b.controller=function(a,b){a.gantt.header.columns.$element=b,a.gantt.header.columns.$scope=a},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttRow",["GanttDirectiveBuilder",function(a){var b=new a("ganttRow");return b.controller=function(a,b){a.row.$element=b,a.row.$scope=a},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttRowBackground",["GanttDirectiveBuilder",function(a){var b=new a("ganttRowBackground");return b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttRowLabel",["GanttDirectiveBuilder",function(a){var b=new a("ganttRowLabel");return b.restrict="A",b.templateUrl=void 0,b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttScrollableHeader",["GanttDirectiveBuilder","ganttLayout",function(a,b){var c=new a("ganttScrollableHeader");return c.controller=function(a){var c=b.getScrollBarWidth();a.getScrollableHeaderCss=function(){var b={},d=a.gantt.scroll.isVScrollbarVisible(),e=d?c:0,f=this.gantt.options.value("columnWidth"),g=0===a.gantt.width?!1:a.gantt.width<a.gantt.getWidth()-a.gantt.side.getWidth();return void 0!==f&&g?b.width=a.gantt.width-e+this.gantt.scroll.getBordersWidth()+"px":d&&(b.width=a.gantt.getWidth()-a.gantt.side.getWidth()-e+"px"),b}},c.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttSide",["GanttDirectiveBuilder",function(a){var b=new a("ganttSide");return b.controller=function(a,b){a.gantt.side.$element=b,a.gantt.side.$scope=a},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttSideBackground",["GanttDirectiveBuilder","ganttLayout",function(a,b){var c=new a("ganttSideBackground");return c.controller=function(a){var c=b.getScrollBarHeight();a.getMaxHeightCss=function(){var b={};if(a.maxHeight){var d=a.gantt.scroll.isHScrollbarVisible()?c:0;b["max-height"]=a.maxHeight-d-a.gantt.header.getHeight()+"px"}return b}},c.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttSideContent",["GanttDirectiveBuilder",function(a){var b=new a("ganttSideContent");return b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttTask",["GanttDirectiveBuilder","moment",function(a,b){var c=new a("ganttTask");return c.controller=function(a,c){a.task.$element=c,a.task.$scope=a,a.getTaskContent=function(){return void 0!==a.task.model.content?a.task.model.content:a.task.rowsManager.gantt.options.value("taskContent")},a.simplifyMoment=function(a){return b.isMoment(a)?a.unix():a},a.$watchGroup(["simplifyMoment(task.model.from)","simplifyMoment(task.model.to)"],function(){a.task.updatePosAndSize()})},c.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttTaskBackground",["GanttDirectiveBuilder",function(a){var b=new a("ganttTaskBackground");return b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttTaskContent",["GanttDirectiveBuilder",function(a){var b=new a("ganttTaskContent");return b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttTaskForeground",["GanttDirectiveBuilder",function(a){var b=new a("ganttTaskForeground");return b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttTimeFrame",["GanttDirectiveBuilder",function(a){var b=new a("ganttTimeFrame");return b.controller=function(a,b){a.timeFrame.$element=b,a.timeFrame.$scope=a,a.timeFrame.updateView()},b.build()}])}(),function(){"use strict";angular.module("gantt").directive("ganttTimespan",["GanttDirectiveBuilder",function(a){var b=new a("ganttTimespan");return b.controller=function(a,b){a.timespan.$element=b,a.timespan.$scope=a,a.timespan.updateView()},b.build()}])}(),function(){"use strict";angular.module("gantt").factory("ganttDebounce",["$timeout",function(a){function b(b,c,d){var e=0;return function(){var f=this,g=arguments;e++;var h=function(a){return function(){return a===e?b.apply(f,g):void 0}}(e);return a(h,c,void 0===d?!0:d)}}return b}])}(),function(){"use strict";angular.module("gantt").service("GanttDirectiveBuilder",["$templateCache",function(a){var b=function(b,c,d,e){var f=this;this.directiveName=b,this.templateUrl=void 0===c?"template/"+b+".tmpl.html":c,this.require=void 0===d?"^gantt":d,this.restrict=void 0===e?"E":e,this.scope=!1,this.transclude=!0,this.replace=!0,this.build=function(){var b=f.directiveName,c=f.templateUrl,d=f.controller,e={restrict:f.restrict,require:f.require,transclude:f.transclude,replace:f.replace,scope:f.scope,templateUrl:function(b,d){return void 0!==d.templateUrl&&(c=d.templateUrl),void 0!==d.template&&a.put(c,d.template),c},compile:function(){return{pre:function(a,c,d,e){a.gantt.api.directives.raise.preLink(b,a,c,d,e)},post:function(a,c,d,e){a.gantt.api.directives.raise.postLink(b,a,c,d,e)}}},controller:["$scope","$element","$attrs",function(a,c,e){var f=this;void 0!==d&&d(a,c,e,f),a.gantt.api.directives.raise.controller(b,a,c,e,f),a.$on("$destroy",function(){a.gantt.api.directives.raise.destroy(b,a,c,e,f)}),a.$applyAsync(function(){a.gantt.api.directives.raise["new"](b,a,c,e,f)})}]};return c||(delete e.templateUrl,delete e.replace,delete e.transclude),e}};return b}])}(),function(){"use strict";angular.module("gantt").service("ganttDom",["$document",function(a){return{elementFromPoint:function(b,c){return a[0].elementFromPoint(b,c)},elementsFromPoint:function(a,b,c){for(var d,e,f,g,h=[],i=[],j=0;(d=this.elementFromPoint(a,b))&&-1===h.indexOf(d)&&null!==d&&(void 0===c||c>j);)h.push(d),i.push({value:d.style.getPropertyValue("visibility"),priority:d.style.getPropertyPriority("visibility")}),d.style.setProperty("visibility","hidden","important"),j++;for(e=0,f=i.length;f>e;e++)g=i[e],h[e].style.setProperty("visibility",g.value?g.value:"",g.priority);return h},findElementFromPoint:function(a,b,c){for(var d,e,f,g,h,i=[],j=[],k=0;(d=this.elementFromPoint(a,b))&&-1===i.indexOf(d)&&null!==d;)if(i.push(d),j.push({value:d.style.getPropertyValue("visibility"),priority:d.style.getPropertyPriority("visibility")}),d.style.setProperty("visibility","hidden","important"),k++,c(d)){e=d;break}for(f=0,g=j.length;g>f;f++)h=j[f],i[f].style.setProperty("visibility",h.value?h.value:"",h.priority);return e},isElementVisible:function(a){return void 0!==a.offsetParent&&null!==a.offsetParent}}}])}(),function(){"use strict";angular.module("gantt").service("ganttEnableNgAnimate",["$injector",function(a){var b;try{b=a.get("$animate")}catch(c){}return void 0!==b?function(a,c){angular.version.major>=1&&angular.version.minor>=4?b.enabled(a,c):b.enabled(c,a)}:angular.noop}])}(),function(){"use strict";angular.module("gantt").directive("ganttBindCompileHtml",["$compile",function(a){return{restrict:"A",require:"^gantt",link:function(b,c,d,e){b.scope=e.gantt.$scope.$parent,b.$watch(function(){return b.$eval(d.ganttBindCompileHtml)},function(d){c.html(d),a(c.contents())(b)})}}}])}(),function(){"use strict";angular.module("gantt").service("ganttLayout",["$document",function(a){return{getScrollBarWidth:function(){var b=a[0].createElement("p");b.style.width="100%",b.style.height="200px";var c=a[0].createElement("div");c.style.position="absolute",c.style.top="0px",c.style.left="0px",c.style.visibility="hidden",c.style.width="200px",c.style.height="150px",c.style.overflow="hidden",c.appendChild(b),a[0].body.appendChild(c);var d=b.offsetWidth;c.style.overflow="scroll";var e=b.offsetWidth;return d===e&&(e=c.clientWidth),a[0].body.removeChild(c),d-e},getScrollBarHeight:function(){var b=a[0].createElement("p");b.style.width="200px;",b.style.height="100%";var c=a[0].createElement("div");c.style.position="absolute",c.style.top="0px",c.style.left="0px",c.style.visibility="hidden",c.style.width="150px",c.style.height="200px",c.style.overflow="hidden",c.appendChild(b),a[0].body.appendChild(c);var d=b.offsetHeight;c.style.overflow="scroll";var e=b.offsetHeight;return d===e&&(e=c.clientHeight),a[0].body.removeChild(c),d-e},setColumnsWidthFactor:function(a,b,c){if(a){c||(c=0);for(var d=0;d<a.length;d++){var e=a[d];e.left=b*(e.originalSize.left+c)-c,e.width=b*e.originalSize.width;for(var f=0;f<e.timeFrames.length;f++){var g=e.timeFrames[f];g.left=b*g.originalSize.left,g.width=b*g.originalSize.width}}}}}}])}(),function(){"use strict";angular.module("gantt").service("ganttMouseButton",[function(){return{getButton:function(a){return a=a||window.event,a.which?a.which:void 0===a.button?1:a.button<2?1:4===a.button?2:3}}}])}(),function(){"use strict";angular.module("gantt").service("ganttMouseOffset",[function(){return{getTouch:function(a){return void 0!==a.touches?a.touches[0]:a},getOffset:function(a){return a.offsetX&&a.offsetY?{x:a.offsetX,y:a.offsetY}:a.layerX&&a.layerY?{x:a.layerX,y:a.layerY}:this.getOffsetForElement(a.target,a)},getOffsetForElement:function(a,b){var c=a.getBoundingClientRect();return{x:b.clientX-c.left,y:b.clientY-c.top}}}}])}(),function(){"use strict";angular.module("gantt").factory("ganttSmartEvent",[function(){function a(a,b,c,d){return a.$on("$destroy",function(){b.unbind(c,d)}),{bindOnce:function(){b.one(c,d)},bind:function(){b.bind(c,d)},unbind:function(){b.unbind(c,d)}}}return a}])}(),angular.module("gantt.templates",[]).run(["$templateCache",function(a){a.put("template/gantt.tmpl.html",'<div class="gantt unselectable" ng-cloak gantt-scroll-manager gantt-element-width-listener="ganttElementWidth">\n <gantt-side>\n <gantt-side-background>\n </gantt-side-background>\n <gantt-side-content>\n </gantt-side-content>\n <div gantt-resizer="gantt.side.$element" gantt-resizer-event-topic="side" gantt-resizer-enabled="{{$parent.gantt.options.value(\'allowSideResizing\')}}" resizer-width="sideWidth" class="gantt-resizer">\n <div ng-show="$parent.gantt.options.value(\'allowSideResizing\')" class="gantt-resizer-display"></div>\n </div>\n </gantt-side>\n <gantt-scrollable-header>\n <gantt-header gantt-element-height-listener="$parent.ganttHeaderHeight">\n <gantt-header-columns>\n <div ng-repeat="header in gantt.columnsManager.visibleHeaders track by $index">\n <div class="gantt-header-row" ng-class="{\'gantt-header-row-last\': $last, \'gantt-header-row-first\': $first}">\n <gantt-column-header ng-repeat="column in header"></gantt-column-header>\n </div>\n </div>\n </gantt-header-columns>\n </gantt-header>\n </gantt-scrollable-header>\n <gantt-scrollable>\n <gantt-body>\n <gantt-body-background>\n <gantt-row-background ng-repeat="row in gantt.rowsManager.visibleRows track by row.model.id"></gantt-row-background>\n </gantt-body-background>\n <gantt-body-foreground>\n <div class="gantt-current-date-line" ng-show="currentDate === \'line\' && gantt.currentDateManager.position >= 0 && gantt.currentDateManager.position <= gantt.width" ng-style="{\'left\': gantt.currentDateManager.position + \'px\' }"></div>\n </gantt-body-foreground>\n <gantt-body-columns>\n <gantt-column ng-repeat="column in gantt.columnsManager.visibleColumns">\n <gantt-time-frame ng-repeat="timeFrame in column.visibleTimeFrames"></gantt-time-frame>\n </gantt-column>\n </gantt-body-columns>\n <div ng-if="gantt.columnsManager.visibleColumns == 0" style="background-color: #808080"></div>\n <gantt-body-rows>\n <gantt-timespan ng-repeat="timespan in gantt.timespansManager.timespans track by timespan.model.id"></gantt-timespan>\n <gantt-row ng-repeat="row in gantt.rowsManager.visibleRows track by row.model.id">\n <gantt-task ng-repeat="task in row.visibleTasks track by task.model.id">\n </gantt-task>\n </gantt-row>\n </gantt-body-rows>\n </gantt-body>\n </gantt-scrollable>\n\n <!-- Plugins -->\n <ng-transclude></ng-transclude>\n\n <!--\n ******* Inline templates *******\n You can specify your own templates by either changing the default ones below or by\n adding an attribute template-url="<url to your template>" on the specific element.\n -->\n\n <!-- Body template -->\n <script type="text/ng-template" id="template/ganttBody.tmpl.html">\n <div ng-transclude class="gantt-body" ng-style="{\'width\': gantt.width > 0 ? gantt.width +\'px\' : undefined}"></div>\n </script>\n\n <!-- Header template -->\n <script type="text/ng-template" id="template/ganttHeader.tmpl.html">\n <div ng-transclude class="gantt-header"\n ng-show="gantt.columnsManager.columns.length > 0 && gantt.columnsManager.headers.length > 0"></div>\n </script>\n\n <!-- Side template -->\n <script type="text/ng-template" id="template/ganttSide.tmpl.html">\n <div ng-transclude class="gantt-side" style="width: auto;"></div>\n </script>\n\n <!-- Side content template-->\n <script type="text/ng-template" id="template/ganttSideContent.tmpl.html">\n <div class="gantt-side-content">\n </div>\n </script>\n\n <!-- Header columns template -->\n <script type="text/ng-template" id="template/ganttHeaderColumns.tmpl.html">\n <div ng-transclude class="gantt-header-columns"\n gantt-horizontal-scroll-receiver></div>\n </script>\n\n <script type="text/ng-template" id="template/ganttColumnHeader.tmpl.html">\n <div class="gantt-column-header" ng-class="{\'gantt-column-header-last\': $last, \'gantt-column-header-first\': $first}">{{::column.label}}</div>\n </script>\n\n <!-- Body background template -->\n <script type="text/ng-template" id="template/ganttBodyBackground.tmpl.html">\n <div ng-transclude class="gantt-body-background"></div>\n </script>\n\n <!-- Body foreground template -->\n <script type="text/ng-template" id="template/ganttBodyForeground.tmpl.html">\n <div ng-transclude class="gantt-body-foreground"></div>\n </script>\n\n <!-- Body columns template -->\n <script type="text/ng-template" id="template/ganttBodyColumns.tmpl.html">\n <div ng-transclude class="gantt-body-columns"></div>\n </script>\n\n <script type="text/ng-template" id="template/ganttColumn.tmpl.html">\n <div ng-transclude class="gantt-column gantt-foreground-col" ng-class="{\'gantt-column-last\': $last, \'gantt-column-first\': $first}"></div>\n </script>\n\n <script type="text/ng-template" id="template/ganttTimeFrame.tmpl.html">\n <div class="gantt-timeframe"></div>\n </script>\n\n <!-- Scrollable template -->\n <script type="text/ng-template" id="template/ganttScrollable.tmpl.html">\n <div ng-transclude class="gantt-scrollable" gantt-scroll-sender ng-style="getScrollableCss()"></div>\n </script>\n\n <script type="text/ng-template" id="template/ganttScrollableHeader.tmpl.html">\n <div ng-transclude class="gantt-scrollable-header" ng-style="getScrollableHeaderCss()"></div>\n </script>\n\n <!-- Rows template -->\n <script type="text/ng-template" id="template/ganttBodyRows.tmpl.html">\n <div ng-transclude class="gantt-body-rows"></div>\n </script>\n\n <!-- Timespan template -->\n <script type="text/ng-template" id="template/ganttTimespan.tmpl.html">\n <div class="gantt-timespan" ng-class="timespan.model.classes">\n </div>\n </script>\n\n <!-- Task template -->\n <script type="text/ng-template" id="template/ganttTask.tmpl.html">\n <div class="gantt-task" ng-class="task.model.classes">\n <gantt-task-background></gantt-task-background>\n <gantt-task-foreground></gantt-task-foreground>\n <gantt-task-content></gantt-task-content>\n </div>\n </script>\n\n <script type="text/ng-template" id="template/ganttTaskBackground.tmpl.html">\n <div class="gantt-task-background" ng-style="{\'background-color\': task.model.color}"></div>\n </script>\n\n <script type="text/ng-template" id="template/ganttTaskForeground.tmpl.html">\n <div class="gantt-task-foreground">\n <div ng-if="task.truncatedRight" class="gantt-task-truncated-right">></div>\n <div ng-if="task.truncatedLeft" class="gantt-task-truncated-left"><</div>\n </div>\n </script>\n\n <!-- Task content template -->\n <script type="text/ng-template" id="template/ganttTaskContent.tmpl.html">\n <div class="gantt-task-content" unselectable="on"><span unselectable="on" gantt-bind-compile-html="getTaskContent()"/></div>\n </script>\n\n\n <!-- Row background template -->\n <script type="text/ng-template" id="template/ganttRowBackground.tmpl.html">\n <div class="gantt-row gantt-row-height"\n ng-class="row.model.classes"\n ng-class-odd="\'gantt-row-odd\'"\n ng-class-even="\'gantt-row-even\'"\n ng-style="{\'height\': row.model.height}">\n <div class="gantt-row-background"\n ng-style="{\'background-color\': row.model.color}">\n </div>\n </div>\n </script>\n\n <!-- Row template -->\n <script type="text/ng-template" id="template/ganttRow.tmpl.html">\n <div class="gantt-row gantt-row-height"\n ng-class="row.model.classes"\n ng-class-odd="\'gantt-row-odd\'"\n ng-class-even="\'gantt-row-even\'"\n ng-style="{\'height\': row.model.height}">\n <div ng-transclude class="gantt-row-content"></div>\n </div>\n </script>\n\n <!-- Side background template -->\n <script type="text/ng-template" id="template/ganttSideBackground.tmpl.html">\n <div class="gantt-side-background">\n <div class="gantt-side-background-header" ng-style="{height: $parent.ganttHeaderHeight + \'px\'}">\n <div ng-show="$parent.ganttHeaderHeight" class="gantt-header-row gantt-side-header-row"></div>\n </div>\n <div class="gantt-side-background-body" ng-style="getMaxHeightCss()">\n <div gantt-vertical-scroll-receiver>\n <div class="gantt-row gantt-row-height "\n ng-class-odd="\'gantt-row-odd\'"\n ng-class-even="\'gantt-row-even\'"\n ng-class="row.model.classes"\n ng-repeat="row in gantt.rowsManager.visibleRows track by row.model.id"\n ng-style="{\'height\': row.model.height}">\n <div gantt-row-label class="gantt-row-label gantt-row-background"\n ng-style="{\'background-color\': row.model.color}">\n </div>\n </div>\n </div>\n </div>\n </div>\n </script>\n</div>\n')}]); //# sourceMappingURL=angular-gantt.min.js.map \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.min.js.map b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.min.js.map index 814f328240144fcc721bf699a81734785dbb4672..f7e9256f4eb1377cc3828f1aea901fbdffb573c0 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.min.js.map +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-gantt/angular-gantt.min.js.map @@ -1 +1 @@ -{"version":3,"file":"angular-gantt.min.js","sources":["../src/core/gantt.directive.js","../src/core/logic/api/api.factory.js","../src/core/logic/api/options.factory.js","../src/core/logic/calendar/calendar.factory.js","../src/core/logic/calendar/currentDateManager.factory.js","../src/core/logic/column/column.factory.js","../src/core/logic/column/columnGenerator.factory.js","../src/core/logic/column/columnHeader.factory.js","../src/core/logic/column/columnsManager.factory.js","../src/core/logic/column/headerGenerator.factory.js","../src/core/logic/gantt.factory.js","../src/core/logic/model/objectModel.factory.js","../src/core/logic/row/row.factory.js","../src/core/logic/row/rowHeader.factory.js","../src/core/logic/row/rowsManager.factory.js","../src/core/logic/task/task.factory.js","../src/core/logic/template/body.factory.js","../src/core/logic/template/bodyBackground.factory.js","../src/core/logic/template/bodyColumns.factory.js","../src/core/logic/template/bodyForeground.factory.js","../src/core/logic/template/bodyRows.factory.js","../src/core/logic/template/header.factory.js","../src/core/logic/template/headerColumns.factory.js","../src/core/logic/template/scroll.factory.js","../src/core/logic/template/side.factory.js","../src/core/logic/timespan/timespan.factory.js","../src/core/logic/timespan/timespansManager.factory.js","../src/core/logic/util/arrays.service.js","../src/core/logic/util/binarySearch.service.js","../src/core/logic/util/hierarchy.factory.js","../src/core/logic/util/utils.service.js","../src/core/ui/limit/columnLimit.filter.js","../src/core/ui/limit/taskLimit.filter.js","../src/core/ui/resizer/resizer.directive.js","../src/core/ui/scroll/horizontalScrollReceiver.directive.js","../src/core/ui/scroll/scrollManager.directive.js","../src/core/ui/scroll/scrollSender.directive.js","../src/core/ui/scroll/scrollable.directive.js","../src/core/ui/scroll/verticalScrollReceiver.directive.js","../src/core/ui/size/elementHeightListener.directive.js","../src/core/ui/size/elementWidthListener.directive.js","../src/core/ui/template/body.directive.js","../src/core/ui/template/bodyBackground.directive.js","../src/core/ui/template/bodyColumns.directive.js","../src/core/ui/template/bodyForeground.directive.js","../src/core/ui/template/bodyRows.directive.js","../src/core/ui/template/column.directive.js","../src/core/ui/template/columnHeader.directive.js","../src/core/ui/template/header.directive.js","../src/core/ui/template/headerColumns.directive.js","../src/core/ui/template/row.directive.js","../src/core/ui/template/rowBackground.directive.js","../src/core/ui/template/rowLabel.directive.js","../src/core/ui/template/scrollableHeader.directive.js","../src/core/ui/template/side.directive.js","../src/core/ui/template/sideBackground.directive.js","../src/core/ui/template/sideContent.directive.js","../src/core/ui/template/task.directive.js","../src/core/ui/template/taskBackground.directive.js","../src/core/ui/template/taskContent.directive.js","../src/core/ui/template/taskForeground.directive.js","../src/core/ui/template/timeFrame.directive.js","../src/core/ui/template/timespan.directive.js","../src/core/ui/util/debounce.factory.js","../src/core/ui/util/directiveBuilder.service.js","../src/core/ui/util/dom.service.js","../src/core/ui/util/enableNgAnimate.service.js","../src/core/ui/util/ganttBindHtmlCompile.directive.js","../src/core/ui/util/layout.service.js","../src/core/ui/util/mouseButton.service.js","../src/core/ui/util/mouseOffset.service.js","../src/core/ui/util/smartEvent.factory.js","../.tmp/generated/core/html2js.js"],"names":["angular","module","directive","Gantt","enableNgAnimate","$timeout","$templateCache","restrict","transclude","templateUrl","tElement","tAttrs","undefined","template","put","scope","sortMode","filterTask","filterTaskComparator","filterRow","filterRowComparator","viewScale","columnWidth","expandToFit","shrinkToFit","showSide","allowSideResizing","fromDate","toDate","currentDateValue","currentDate","daily","autoExpand","taskOutOfRange","taskContent","rowContent","maxHeight","sideWidth","headers","headersFormats","timeFrames","dateFrames","timeFramesWorkingMode","timeFramesNonWorkingMode","timespans","columnMagnet","shiftColumnMagnet","timeFramesMagnet","data","api","options","controller","$scope","$element","option","gantt","this","link","element","directives","raise","$on","destroy","initialized","factory","$q","$rootScope","utils","registerEventWithAngular","eventId","handler","_this","args","Array","prototype","slice","call","arguments","splice","apply","GanttApi","listeners","apiId","newId","suppressEvents","listenerFuncs","callBackFn","self","isArray","foundListeners","forEach","l","filter","lstnr","dereg","registerEvent","featureName","eventName","feature","on","$emit","concat","deregAngularOn","listener","push","removeListener","index","indexOf","registerEventsFromObject","eventObjectMap","features","featProp","featPropName","name","events","prop","propName","event","registerMethod","methodName","createBoundedWrapper","registerMethodsFromObject","methodMap","methods","fn","method","GanttOptions","values","defaultValues","defaultValue","optionName","isFunction","sanitize","optionValue","value","set","initialize","hasOwnProperty","$filter","moment","TimeFrame","start","end","working","magnet","color","classes","updateView","cssStyles","left","width","css","i","length","toggleClass","getDuration","diff","clone","TimeFrameMapping","func","getTimeFrames","date","ret","DateFrame","evaluator","startOf","endOf","targets","dateMatch","Calendar","timeFrameMappings","clear","registerTimeFrames","timeFrame","removeTimeFrames","clearTimeFrames","registerTimeFrameMappings","mappings","timeFrameMapping","removeTimeFrameMappings","clearTimeFrameMappings","registerDateFrames","dateFrame","removeDateFrames","clearDateFrames","filterDateFrames","inputDateFrames","timeFrameMappingName","dateYear","year","dateMonth","month","dateDate","validatedTimeFrames","add","solve","startDate","endDate","minDate","maxDate","defaultWorking","solvedTimeFrames","orderedTimeFrames","tmpSolvedTimeFrames","dispatched","treated","solvedTimeFrame","newSolvedTimeFrame","GanttCurrentDateManager","position","currentDateColumn","simplifyMoment","d","isMoment","unix","$watchGroup","newValues","oldValues","setCurrentDate","newColumn","oldColumn","columnsManager","getColumnByDate","getPositionByDate","Column","calendar","duration","visibleTimeFrames","daysTimeFrames","cropped","originalSize","updateTimeFrames","getDateKey","addClass","removeClass","buildPushTimeFrames","cDate","cDateStartOfDay","cDateNextDay","nextCDate","min","cTimeFrames","cDateKey","positionDuration","timeFrameDuration","timeFramePosition","hidden","timeFramesWidth","croppedRatio","croppedWidth","originalCroppedWidth","allCropped","containsDate","equals","other","roundTo","unit","offset","midpoint","get","Math","ceil","floor","round","units","getMagnetDate","magnetValue","magnetUnit","initialDate","currentTimeFrameDiff","maxTimeFrameDiff","abs","timeFrameDiff","previousTimeFrame","nextTimeFrame","getDateByPositionUsingTimeFrames","getDateByPosition","getDayTimeFrame","dtf","croppedDate","ColumnGenerator","generate","from","to","maximumWidth","leftOffset","reverse","trim","charAt","substring","viewScaleValue","viewScaleUnit","splittedViewScale","split","parseFloat","getColumnsWidth","excludeTo","isToDateToExclude","generatedCols","ensureNoUnitOverflow","column","shift","v1","v2","firstValue","getFirstValue","ColumnHeader","labelFormat","label","format","HeaderGenerator","layout","bs","ColumnsManager","columns","visibleColumns","previousColumns","nextColumns","visibleHeaders","scrollAnchor","rendered","generateColumns","$watchCollection","updateColumnsMeta","load","rowsManager","getDefaultFrom","getDefaultTo","sortRows","remove","clearColumns","getColumnsWidthToFit","getDateRange","setScrollAnchor","scroll","el","center","scrollLeft","offsetWidth","scrollToScrollAnchor","$$postDigest","isValid","getExpandedFrom","getExpandedTo","columnGenerator","headerGenerator","isRefreshingColumns","lastColumn","getLastColumn","originalWidth","columnsWidthChanged","updateColumnsWidths","sideShown","side","isShown","sideVisibilityChanged","show","updateTasksPosAndSize","timespansManager","updateTimespansPosAndSize","updateVisibleColumns","updateVisibleObjects","currentDateManager","refresh","extended","getFirstColumn","disableExpand","expandExtendedColumnsForDate","extendedColumns","c","getColumnByPosition","x","expandExtendedColumnsForPosition","newWidth","getBodyAvailableWidth","currentWidth","widthFactor","setColumnsWidthFactor","header","firstColumn","firstExtendedColumn","lastExtendedColumn","getActiveHeadersCount","includeViews","headerRow","defaultHeadersFormats","quarter","week","day","hour","minute","defaultDayHeadersFormats","defaultYearHeadersFormats","getHeaderFormat","visibleOnly","generateHeader","prevColDateVal","generatedHeaders","col","colDateVal","Options","Scroll","Body","RowHeader","Header","Side","ObjectModel","RowsManager","TimespansManager","CurrentDateManager","arrays","$document","noop","loadData","removeData","clearData","getData","oldTimeFrames","oldDateFrames","framesChanged","$watch","splittedColumnMagnet","columnMagnetValue","columnMagnetUnit","normalizeUnits","shiftColumnMagnetValue","shiftColumnMagnetUnit","keyHandler","e","shiftKey","off","body","objectModel","hasRowModelOrderChanged","data1","data2","id","newData","oldData","toRemoveIds","getRemovedIds","removeAll","toRemoveId","removeRow","removedRows","removedRow","modelOrderChanged","resetNonModelLists","j","k","rowData","addRow","change","scrollWidth","getWidth","borderWidth","getBordersWidth","availableWidth","row","indexOfId","w","rowToRemove","tasks","ti","tl","taskToRemove","tj","ganttElementWidth","core","ready","renderedFunction","cleanTask","model","randomUuid","clean","cleanRow","rows","cleanTimespan","Task","Row","tasksMap","filteredTasks","visibleTasks","addTaskImpl","task","viewOnly","addTask","taskModel","isUpdate","sortTasks","setFromToByTask","moveTaskToRow","oldRow","removeTask","updatePosAndSize","updateVisibleTasks","rowChange","actual","expected","taskId","silent","removedTask","setFromTo","taskIndex","removeAllTasks","setFromToByValues","sort","t1","t2","copy","rowsMap","sortedRows","filteredRows","customFilteredRows","visibleRows","rowsTaskWatchers","_defaultFilterImpl","filterImpl","customRowSorters","customRowFilters","updateVisibleRows","newValue","oldValue","_oldVScrollbarVisible","isVScrollbarVisible","newVScrollbarVisible","applySort","removeCustomRowSorter","addCustomRowSorter","removeCustomRowFilter","addCustomRowFilter","setFilterImpl","rowModel","watcher","newTasks","oldTasks","toRemove","toAdd","rowId","deregisterFunction","removeId","expression","isString","substr","angularOrderBy","applyCustomRowSorters","sorterFunction","pop","moveRow","targetRow","targetRowIndex","rowIndex","moveToIndex","move","oldFilteredRows","raiseEvent","applyCustomRowFilters","filterFunction","oldFilteredTasks","filterEvent","minRowFrom","maxRowTo","defaultFrom","defaultTo","truncatedLeft","truncatedRight","isMilestone","isOutOfRange","oldViewLeft","oldViewWidth","oldTruncatedRight","oldTruncatedLeft","isMoving","modelLeft","modelWidth","maxModelLeft","max","viewChange","display","priority","children","getBackgroundElement","backgroundElement","querySelector","getContentElement","contentElement","getForegroundElement","foregroundElement","setFrom","magnetEnabled","setTo","moveTo","newTaskRight","newTaskLeft","BodyColumns","BodyRows","BodyBackground","BodyForeground","background","foreground","GanttBodyBackground","GanttBodyForeground","HeaderColumns","getHeight","offsetHeight","scrollTo","scrollToDate","scrollToLeft","scrollToRight","setWidth","getScrollLeft","cachedScrollLeft","getScrollWidth","clientWidth","getBordersHeight","clientHeight","scrollHeight","isHScrollbarVisible","triggerHandler","hasClass","Timespan","GanttTimespansManager","timespansMap","clearTimespans","loadTimespans","removeTimespans","timespanModel","loadTimespan","timespan","timespanData","removeTimespan","timespanId","removedTimespan","service","array","oldIndex","newIndex","newArray","oldArray","idProperty","removedIds","newObject","newObjectIndex","idProperties","arrayValue","getIndicesOnly","input","comparer","strict","lo","hi","mid","res","Hierarchy","nameToRow","idToRow","nameToChildren","idToChildren","nameToParent","idToParent","registerChildRow","childRow","nameChildren","idChildren","parent","parentRow","childRowNameOrId","rootRows","descendants","child","childDescendants","ancestors","object","firstProperty","objects","propertyName","random4","random","toString","seedId","Date","getTime","leftComparator","scrollContainerWidth","active","$parse","mouseOffset","require","targetElement","enabled","$attrs","ganttCtrl","dblclick","preventDefault","mousedown","eventTopic","resizeBegin","mousemove","mouseup","$evalAsync","getOffsetForElement","maxWidth","resizeEnd","unbind","resizerWidth","resize","ganttResizerEventTopic","$observe","attrs","ganttScrollManagerCtrl","registerHorizontalReceiver","horizontal","vertical","registerVerticalReceiver","getHorizontalRecievers","getVerticalRecievers","controllers","updateListeners","vElement","parentNode","scrollTop","hElement","bind","style","Builder","debounce","builder","lastScrollLeft","autoExpandTimer","autoExpandColumns","direction","currentScrollLeft","cancel","getScrollableCss","bodySmallerThanGantt","build","scopeVariable","ganttElementHeightListener","effectiveScope","$parent","ganttElementWidthListener","scrollBarWidth","getScrollBarWidth","getScrollableHeaderCss","maxHeightActivated","vScrollbarWidth","hScrollBarHeight","getScrollBarHeight","getMaxHeightCss","bodyScrollBarHeight","getTaskContent","content","timeout","invokeApply","nthCall","argz","later","version","DirectiveBuilder","directiveName","replace","controllerFunction","compile","pre","iElement","iAttrs","preLink","post","postLink","elementFromPoint","y","elementsFromPoint","depth","current","elements","previousPointerEvents","cDepth","getPropertyValue","getPropertyPriority","setProperty","findElementFromPoint","checkFunction","found","$injector","ngAnimate","major","minor","$compile","$eval","ganttBindCompileHtml","html","contents","inner","createElement","height","outer","top","visibility","overflow","appendChild","w1","w2","removeChild","h1","h2","originalLeftOffset","getButton","window","which","button","getTouch","evt","touches","getOffset","offsetX","offsetY","layerX","layerY","target","bb","getBoundingClientRect","clientX","clientY","smartEvent","bindOnce","one","run"],"mappings":"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"} \ No newline at end of file +{"version":3,"sources":["../src/core/gantt.directive.js","../src/core/logic/api/api.factory.js","../src/core/logic/api/options.factory.js","../src/core/logic/calendar/calendar.factory.js","../src/core/logic/calendar/currentDateManager.factory.js","../src/core/logic/column/column.factory.js","../src/core/logic/column/columnBuilder.factory.js","../src/core/logic/column/columnGenerator.service.js","../src/core/logic/column/columnHeader.factory.js","../src/core/logic/column/columnsManager.factory.js","../src/core/logic/column/headersGenerator.service.js","../src/core/logic/gantt.factory.js","../src/core/logic/model/objectModel.factory.js","../src/core/logic/row/row.factory.js","../src/core/logic/row/rowHeader.factory.js","../src/core/logic/row/rowsManager.factory.js","../src/core/logic/task/task.factory.js","../src/core/logic/template/body.factory.js","../src/core/logic/template/bodyBackground.factory.js","../src/core/logic/template/bodyColumns.factory.js","../src/core/logic/template/bodyForeground.factory.js","../src/core/logic/template/bodyRows.factory.js","../src/core/logic/template/header.factory.js","../src/core/logic/template/headerColumns.factory.js","../src/core/logic/template/scroll.factory.js","../src/core/logic/template/side.factory.js","../src/core/logic/timespan/timespan.factory.js","../src/core/logic/timespan/timespansManager.factory.js","../src/core/logic/util/arrays.service.js","../src/core/logic/util/binarySearch.service.js","../src/core/logic/util/hierarchy.factory.js","../src/core/logic/util/utils.service.js","../src/core/ui/limit/columnLimit.filter.js","../src/core/ui/limit/taskLimit.filter.js","../src/core/ui/resizer/resizer.directive.js","../src/core/ui/scroll/horizontalScrollReceiver.directive.js","../src/core/ui/scroll/scrollManager.directive.js","../src/core/ui/scroll/scrollSender.directive.js","../src/core/ui/scroll/scrollable.directive.js","../src/core/ui/scroll/verticalScrollReceiver.directive.js","../src/core/ui/size/elementHeightListener.directive.js","../src/core/ui/size/elementWidthListener.directive.js","../src/core/ui/template/body.directive.js","../src/core/ui/template/bodyBackground.directive.js","../src/core/ui/template/bodyColumns.directive.js","../src/core/ui/template/bodyForeground.directive.js","../src/core/ui/template/bodyRows.directive.js","../src/core/ui/template/column.directive.js","../src/core/ui/template/columnHeader.directive.js","../src/core/ui/template/header.directive.js","../src/core/ui/template/headerColumns.directive.js","../src/core/ui/template/row.directive.js","../src/core/ui/template/rowBackground.directive.js","../src/core/ui/template/rowLabel.directive.js","../src/core/ui/template/scrollableHeader.directive.js","../src/core/ui/template/side.directive.js","../src/core/ui/template/sideBackground.directive.js","../src/core/ui/template/sideContent.directive.js","../src/core/ui/template/task.directive.js","../src/core/ui/template/taskBackground.directive.js","../src/core/ui/template/taskContent.directive.js","../src/core/ui/template/taskForeground.directive.js","../src/core/ui/template/timeFrame.directive.js","../src/core/ui/template/timespan.directive.js","../src/core/ui/util/debounce.factory.js","../src/core/ui/util/directiveBuilder.service.js","../src/core/ui/util/dom.service.js","../src/core/ui/util/enableNgAnimate.service.js","../src/core/ui/util/ganttBindHtmlCompile.directive.js","../src/core/ui/util/layout.service.js","../src/core/ui/util/mouseButton.service.js","../src/core/ui/util/mouseOffset.service.js","../src/core/ui/util/smartEvent.factory.js","../.tmp/generated/core/html2js.js"],"names":["angular","module","directive","Gantt","enableNgAnimate","$timeout","$templateCache","restrict","transclude","templateUrl","tElement","tAttrs","undefined","template","put","scope","sortMode","filterTask","filterTaskComparator","filterRow","filterRowComparator","viewScale","columnWidth","expandToFit","shrinkToFit","showSide","allowSideResizing","fromDate","toDate","currentDateValue","currentDate","daily","autoExpand","taskOutOfRange","taskContent","rowContent","maxHeight","sideWidth","headers","headersFormats","timeFrames","dateFrames","timeFramesWorkingMode","timeFramesNonWorkingMode","timespans","columnMagnet","shiftColumnMagnet","timeFramesMagnet","data","api","options","controller","$scope","$element","option","gantt","this","link","element","directives","raise","$on","destroy","initialized","factory","$q","$rootScope","utils","registerEventWithAngular","eventId","handler","_this","args","Array","prototype","slice","call","arguments","splice","apply","GanttApi","listeners","apiId","newId","suppressEvents","listenerFuncs","callBackFn","self","isArray","foundListeners","forEach","l","filter","lstnr","dereg","registerEvent","featureName","eventName","feature","on","$emit","concat","deregAngularOn","listener","push","removeListener","index","indexOf","registerEventsFromObject","eventObjectMap","features","featProp","featPropName","name","events","prop","propName","event","registerMethod","methodName","createBoundedWrapper","registerMethodsFromObject","methodMap","methods","fn","method","GanttOptions","values","defaultValues","defaultValue","optionName","isFunction","sanitize","optionValue","value","set","initialize","hasOwnProperty","$filter","moment","TimeFrame","start","end","working","magnet","color","classes","internal","updateView","cssStyles","left","width","css","i","length","toggleClass","getDuration","diff","clone","TimeFrameMapping","func","getTimeFrames","date","ret","DateFrame","evaluator","startOf","endOf","targets","dateMatch","Calendar","timeFrameMappings","clear","registerTimeFrames","timeFrame","removeTimeFrames","clearTimeFrames","registerTimeFrameMappings","mappings","timeFrameMapping","removeTimeFrameMappings","clearTimeFrameMappings","registerDateFrames","dateFrame","removeDateFrames","clearDateFrames","filterDateFrames","inputDateFrames","j","dateYear","year","dateMonth","month","dateDate","validatedTimeFrames","cTimeFrame","add","solve","startDate","endDate","minDate","maxDate","solvedTimeFrames","k","orderedTimeFrames","oTimeFrame","tmpSolvedTimeFrames","dispatched","treated","sTimeFrame","newSolvedTimeFrame","GanttCurrentDateManager","position","currentDateColumn","simplifyMoment","d","isMoment","unix","$watchGroup","newValues","oldValues","setCurrentDate","newColumn","oldColumn","columnsManager","getColumnByDate","getPositionByDate","Column","calendar","duration","visibleTimeFrames","daysTimeFrames","cropped","originalSize","updateTimeFrames","getDateKey","addClass","removeClass","cDate","cDateStartOfDay","cDateNextDay","nextCDate","min","cTimeFrames","cDateKey","positionDuration","timeFrameDuration","timeFramePosition","hidden","timeFramesWidth","aTimeFrame","croppedRatio","croppedWidth","originalCroppedWidth","allCropped","bTimeFrame","containsDate","equals","other","roundTo","unit","offset","midpoint","get","Math","ceil","floor","round","units","getMagnetDate","magnetValue","magnetUnit","initialDate","currentTimeFrameDiff","maxTimeFrameDiff","abs","timeFrameDiff","previousTimeFrame","nextTimeFrame","getDateByPositionUsingTimeFrames","getDateByPosition","getDayTimeFrame","dtf","croppedDate","ColumnBuilder","service","isToDateToExclude","to","getFirstValue","ensureNoUnitOverflow","v1","v2","firstValue","generate","builder","from","maximumWidth","leftOffset","reverse","trim","charAt","substring","viewScaleValue","viewScaleUnit","splittedViewScale","split","parseFloat","excludeTo","generatedCols","column","shift","ColumnHeader","labelFormat","label","format","ColumnGenerator","HeadersGenerator","layout","bs","ColumnsManager","columns","visibleColumns","previousColumns","nextColumns","visibleHeaders","scrollAnchor","columnBuilder","rendered","generateColumns","$watchCollection","updateColumnsMeta","load","rowsManager","getDefaultFrom","getDefaultTo","sortRows","remove","clearColumns","getColumnsWidth","getColumnsWidthToFit","getDateRange","setScrollAnchor","scroll","el","center","scrollLeft","offsetWidth","scrollToScrollAnchor","$$postDigest","isValid","getExpandedFrom","getExpandedTo","isRefreshingColumns","lastColumn","getLastColumn","originalWidth","columnsWidthChanged","updateColumnsWidths","sideShown","side","isShown","sideVisibilityChanged","show","updateTasksPosAndSize","timespansManager","updateTimespansPosAndSize","updateVisibleColumns","updateVisibleObjects","currentDateManager","refresh","extended","getFirstColumn","disableExpand","expandExtendedColumnsForDate","extendedColumns","c","getColumnByPosition","x","expandExtendedColumnsForPosition","newWidth","getBodyAvailableWidth","currentWidth","widthFactor","setColumnsWidthFactor","firstColumn","firstExtendedColumn","lastExtendedColumn","getActiveHeadersCount","includeViews","headerRow","defaultHeadersFormats","quarter","week","day","hour","minute","defaultDayHeadersFormats","defaultYearHeadersFormats","getHeaderFormat","visibleOnly","generateHeader","header","generatedHeaders","currentColumn","maximumDate","currentPosition","isSame","isAfter","Options","Scroll","Body","RowHeader","Header","Side","ObjectModel","RowsManager","TimespansManager","CurrentDateManager","arrays","$document","noop","loadData","removeData","clearData","getData","oldTimeFrames","oldDateFrames","framesChanged","$watch","splittedColumnMagnet","columnMagnetValue","columnMagnetUnit","normalizeUnits","shiftColumnMagnetValue","shiftColumnMagnetUnit","keyHandler","e","shiftKey","off","body","objectModel","hasRowModelOrderChanged","data1","data2","id","newData","oldData","toRemoveIds","getRemovedIds","removeAll","toRemoveId","removeRow","removedRows","modelOrderChanged","resetNonModelLists","rowData","addRow","change","scrollWidth","getWidth","borderWidth","getBordersWidth","availableWidth","row","indexOfId","w","rowToRemove","tasks","ti","tl","taskToRemove","tj","ganttElementWidth","core","ready","renderedFunction","cleanTask","model","randomUuid","clean","cleanRow","rows","cleanTimespan","Task","Row","tasksMap","filteredTasks","visibleTasks","addTaskImpl","task","viewOnly","addTask","taskModel","isUpdate","sortTasks","setFromToByTask","moveTaskToRow","oldRow","removeTask","updatePosAndSize","updateVisibleTasks","$digest","viewRowChange","rowChange","actual","expected","taskId","silent","removedTask","setFromTo","taskIndex","removeAllTasks","setFromToByValues","sort","t1","t2","copy","rowsMap","sortedRows","filteredRows","customFilteredRows","visibleRows","rowsTaskWatchers","_defaultFilterImpl","filterImpl","customRowSorters","customRowFilters","updateVisibleRows","newValue","oldValue","_oldVScrollbarVisible","isVScrollbarVisible","newVScrollbarVisible","applySort","removeCustomRowSorter","addCustomRowSorter","removeCustomRowFilter","addCustomRowFilter","setFilterImpl","rowModel","watcher","newTasks","oldTasks","toRemove","toAdd","rowId","removedRow","deregisterFunction","removeId","expression","isString","substr","angularOrderBy","applyCustomRowSorters","sorterFunction","moveRow","targetRow","targetRowIndex","rowIndex","moveToIndex","move","oldFilteredRows","raiseEvent","applyCustomRowFilters","displayed","filterFunction","oldFilteredTasks","filterEvent","minRowFrom","maxRowTo","defaultFrom","defaultTo","truncatedLeft","truncatedRight","isMilestone","isOutOfRange","oldViewLeft","oldViewWidth","oldTruncatedRight","oldTruncatedLeft","isMoving","modelLeft","modelWidth","maxModelLeft","max","viewChange","display","priority","children","getBackgroundElement","backgroundElement","querySelector","getContentElement","contentElement","getForegroundElement","foregroundElement","setFrom","magnetEnabled","setTo","moveTo","newTaskRight","newTaskLeft","BodyColumns","BodyRows","BodyBackground","BodyForeground","background","foreground","GanttBodyBackground","GanttBodyForeground","HeaderColumns","getHeight","offsetHeight","scrollTo","scrollToDate","scrollToLeft","scrollToRight","setWidth","getScrollLeft","cachedScrollLeft","getScrollWidth","clientWidth","borderLeft","window","getComputedStyle","getPropertyValue","match","borderRight","parseInt","getBordersHeight","clientHeight","scrollHeight","isHScrollbarVisible","triggerHandler","hasClass","Timespan","GanttTimespansManager","timespansMap","clearTimespans","loadTimespans","removeTimespans","timespanModel","loadTimespan","timespan","timespanData","removeTimespan","timespanId","removedTimespan","array","oldIndex","newIndex","newArray","oldArray","idProperty","removedIds","newObject","newObjectIndex","idProperties","arrayValue","getIndicesOnly","input","comparer","strict","lo","hi","mid","res","Hierarchy","nameToRow","idToRow","nameToChildren","idToChildren","nameToParent","idToParent","registerChildRow","childRow","nameChildren","idChildren","parent","parentRow","childRowNameOrId","rootRows","descendants","childDescendants","ancestors","object","firstProperty","objects","propertyName","angularIndexOf","arr","obj","random4","random","toString","seedId","Date","getTime","leftComparator","scrollContainerWidth","active","$parse","mouseOffset","require","targetElement","enabled","$attrs","ganttCtrl","resizerWidth","eventTopic","resize","dblclick","preventDefault","mousemove","$evalAsync","getOffsetForElement","maxWidth","mouseup","resizeEnd","unbind","mousedown","resizeBegin","ganttResizerEventTopic","$observe","attrs","ganttScrollManagerCtrl","registerHorizontalReceiver","horizontal","vertical","registerVerticalReceiver","getHorizontalRecievers","getVerticalRecievers","controllers","updateListeners","vElement","parentNode","scrollTop","hElement","bind","style","Builder","debounce","lastScrollLeft","autoExpandTimer","autoExpandColumns","direction","currentScrollLeft","cancel","getScrollableCss","bodySmallerThanGantt","build","scopeVariable","ganttElementHeightListener","effectiveScope","$parent","ganttElementWidthListener","scrollBarWidth","getScrollBarWidth","getScrollableHeaderCss","maxHeightActivated","vScrollbarWidth","hScrollBarHeight","getScrollBarHeight","getMaxHeightCss","bodyScrollBarHeight","getTaskContent","content","timeout","invokeApply","nthCall","argz","later","version","DirectiveBuilder","directiveName","replace","controllerFunction","compile","pre","iElement","iAttrs","preLink","post","postLink","$applyAsync","elementFromPoint","y","elementsFromPoint","depth","current","elements","previousPointerEvents","cDepth","getPropertyPriority","setProperty","findElementFromPoint","checkFunction","found","isElementVisible","offsetParent","$injector","ngAnimate","major","minor","$compile","$eval","ganttBindCompileHtml","html","contents","inner","createElement","height","outer","top","visibility","overflow","appendChild","w1","w2","removeChild","h1","h2","originalLeftOffset","getButton","which","button","getTouch","evt","touches","getOffset","offsetX","offsetY","layerX","layerY","target","bb","getBoundingClientRect","clientX","clientY","smartEvent","bindOnce","one","run"],"mappings":"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","file":"angular-gantt.min.js"} \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-tabs/angular-ui.bootstrap.tabs.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-tabs/angular-ui.bootstrap.tabs.js new file mode 100644 index 0000000000000000000000000000000000000000..55a232aa7693039ae2e5549b66c443d3069629af --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-tabs/angular-ui.bootstrap.tabs.js @@ -0,0 +1,208 @@ +angular.module('ui.bootstrap.tabs', []) + +.controller('UibTabsetController', ['$scope', function ($scope) { + var ctrl = this, + oldIndex; + ctrl.tabs = []; + + ctrl.select = function(index) { + if (!destroyed) { + var previousIndex = findTabIndex(oldIndex); + var previousSelected = ctrl.tabs[previousIndex]; + if (previousSelected) { + previousSelected.tab.onDeselect(); + previousSelected.tab.active = false; + } + + var selected = ctrl.tabs[index]; + if (selected) { + selected.tab.onSelect(); + selected.tab.active = true; + ctrl.active = selected.index; + oldIndex = selected.index; + } else if (!selected && angular.isNumber(oldIndex)) { + ctrl.active = null; + oldIndex = null; + } + } + }; + + ctrl.addTab = function addTab(tab) { + ctrl.tabs.push({ + tab: tab, + index: tab.index + }); + ctrl.tabs.sort(function(t1, t2) { + if (t1.index > t2.index) { + return 1; + } + + if (t1.index < t2.index) { + return -1; + } + + return 0; + }); + + if (tab.index === ctrl.active || !angular.isNumber(ctrl.active) && ctrl.tabs.length === 1) { + var newActiveIndex = findTabIndex(tab.index); + ctrl.select(newActiveIndex); + } + }; + + ctrl.removeTab = function removeTab(tab) { + var index = findTabIndex(tab.index); + + if (tab.index === ctrl.active) { + var newActiveTabIndex = index === ctrl.tabs.length - 1 ? + index - 1 : index + 1 % ctrl.tabs.length; + ctrl.select(newActiveTabIndex); + } + + ctrl.tabs.splice(index, 1); + }; + + $scope.$watch('tabset.active', function(val) { + if (angular.isNumber(val) && val !== oldIndex) { + ctrl.select(findTabIndex(val)); + } + }); + + var destroyed; + $scope.$on('$destroy', function() { + destroyed = true; + }); + + function findTabIndex(index) { + for (var i = 0; i < ctrl.tabs.length; i++) { + if (ctrl.tabs[i].index === index) { + return i; + } + } + } +}]) + +.directive('uibTabset', function() { + return { + transclude: true, + replace: true, + scope: {}, + bindToController: { + active: '=', + type: '@' + }, + controller: 'UibTabsetController', + controllerAs: 'tabset', + templateUrl: function(element, attrs) { + return attrs.templateUrl || 'static/js/angular-ui-tabs/tabset.html'; + }, + link: function(scope, element, attrs) { + scope.vertical = angular.isDefined(attrs.vertical) ? + scope.$parent.$eval(attrs.vertical) : false; + scope.justified = angular.isDefined(attrs.justified) ? + scope.$parent.$eval(attrs.justified) : false; + } + }; +}) + +.directive('uibTab', ['$parse', function($parse) { + return { + require: '^uibTabset', + replace: true, + templateUrl: function(element, attrs) { + return attrs.templateUrl || 'static/js/angular-ui-tabs/tab.html'; + }, + transclude: true, + scope: { + heading: '@', + index: '=', + onSelect: '&select', //This callback is called in contentHeadingTransclude + //once it inserts the tab's content into the dom + onDeselect: '&deselect' + }, + controller: function() { + //Empty controller so other directives can require being 'under' a tab + }, + controllerAs: 'tab', + link: function(scope, elm, attrs, tabsetCtrl, transclude) { + scope.disabled = false; + if (attrs.disable) { + scope.$parent.$watch($parse(attrs.disable), function(value) { + scope.disabled = !! value; + }); + } + + scope.select = function() { + if (!scope.disabled) { + var index; + for (var i = 0; i < tabsetCtrl.tabs.length; i++) { + if (tabsetCtrl.tabs[i].tab === scope) { + index = i; + break; + } + } + + tabsetCtrl.select(index); + } + }; + + tabsetCtrl.addTab(scope); + scope.$on('$destroy', function() { + tabsetCtrl.removeTab(scope); + }); + + //We need to transclude later, once the content container is ready. + //when this link happens, we're inside a tab heading. + scope.$transcludeFn = transclude; + } + }; +}]) + +.directive('uibTabHeadingTransclude', function() { + return { + restrict: 'A', + require: '^uibTab', + link: function(scope, elm) { + scope.$watch('headingElement', function updateHeadingElement(heading) { + if (heading) { + elm.html(''); + elm.append(heading); + } + }); + } + }; +}) + +.directive('uibTabContentTransclude', function() { + return { + restrict: 'A', + require: '^uibTabset', + link: function(scope, elm, attrs) { + var tab = scope.$eval(attrs.uibTabContentTransclude).tab; + + //Now our tab is ready to be transcluded: both the tab heading area + //and the tab content area are loaded. Transclude 'em both. + tab.$transcludeFn(tab.$parent, function(contents) { + angular.forEach(contents, function(node) { + if (isTabHeading(node)) { + //Let tabHeadingTransclude know. + tab.headingElement = node; + } else { + elm.append(node); + } + }); + }); + } + }; + + function isTabHeading(node) { + return node.tagName && ( + node.hasAttribute('uib-tab-heading') || + node.hasAttribute('data-uib-tab-heading') || + node.hasAttribute('x-uib-tab-heading') || + node.tagName.toLowerCase() === 'uib-tab-heading' || + node.tagName.toLowerCase() === 'data-uib-tab-heading' || + node.tagName.toLowerCase() === 'x-uib-tab-heading' + ); + } +}); diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-tabs/angular-ui.bootstrap.tabs.min.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-tabs/angular-ui.bootstrap.tabs.min.js new file mode 100644 index 0000000000000000000000000000000000000000..40a6610f0a50ac0c9e792a7078e4a79363d04807 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-tabs/angular-ui.bootstrap.tabs.min.js @@ -0,0 +1 @@ +angular.module("ui.bootstrap.tabs",[]).controller("UibTabsetController",["$scope",function(e){function t(e){for(var t=0;t<n.tabs.length;t++)if(n.tabs[t].index===e)return t}var a,n=this;n.tabs=[],n.select=function(e){if(!i){var r=t(a),l=n.tabs[r];l&&(l.tab.onDeselect(),l.tab.active=!1);var u=n.tabs[e];u?(u.tab.onSelect(),u.tab.active=!0,n.active=u.index,a=u.index):!u&&angular.isNumber(a)&&(n.active=null,a=null)}},n.addTab=function(e){if(n.tabs.push({tab:e,index:e.index}),n.tabs.sort(function(e,t){return e.index>t.index?1:e.index<t.index?-1:0}),e.index===n.active||!angular.isNumber(n.active)&&1===n.tabs.length){var a=t(e.index);n.select(a)}},n.removeTab=function(e){var a=t(e.index);if(e.index===n.active){var i=a===n.tabs.length-1?a-1:a+1%n.tabs.length;n.select(i)}n.tabs.splice(a,1)},e.$watch("tabset.active",function(e){angular.isNumber(e)&&e!==a&&n.select(t(e))});var i;e.$on("$destroy",function(){i=!0})}]).directive("uibTabset",function(){return{transclude:!0,replace:!0,scope:{},bindToController:{active:"=",type:"@"},controller:"UibTabsetController",controllerAs:"tabset",templateUrl:function(e,t){return t.templateUrl||"static/js/angular-ui-tabs/tabset.html"},link:function(e,t,a){e.vertical=angular.isDefined(a.vertical)?e.$parent.$eval(a.vertical):!1,e.justified=angular.isDefined(a.justified)?e.$parent.$eval(a.justified):!1}}}).directive("uibTab",["$parse",function(e){return{require:"^uibTabset",replace:!0,templateUrl:function(e,t){return t.templateUrl||"static/js/angular-ui-tabs/tab.html"},transclude:!0,scope:{heading:"@",index:"=",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},controllerAs:"tab",link:function(t,a,n,i,r){t.disabled=!1,n.disable&&t.$parent.$watch(e(n.disable),function(e){t.disabled=!!e}),t.select=function(){if(!t.disabled){for(var e,a=0;a<i.tabs.length;a++)if(i.tabs[a].tab===t){e=a;break}i.select(e)}},i.addTab(t),t.$on("$destroy",function(){i.removeTab(t)}),t.$transcludeFn=r}}}]).directive("uibTabHeadingTransclude",function(){return{restrict:"A",require:"^uibTab",link:function(e,t){e.$watch("headingElement",function(e){e&&(t.html(""),t.append(e))})}}}).directive("uibTabContentTransclude",function(){function e(e){return e.tagName&&(e.hasAttribute("uib-tab-heading")||e.hasAttribute("data-uib-tab-heading")||e.hasAttribute("x-uib-tab-heading")||"uib-tab-heading"===e.tagName.toLowerCase()||"data-uib-tab-heading"===e.tagName.toLowerCase()||"x-uib-tab-heading"===e.tagName.toLowerCase())}return{restrict:"A",require:"^uibTabset",link:function(t,a,n){var i=t.$eval(n.uibTabContentTransclude).tab;i.$transcludeFn(i.$parent,function(t){angular.forEach(t,function(t){e(t)?i.headingElement=t:a.append(t)})})}}}); diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-tabs/tab.html b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-tabs/tab.html new file mode 100644 index 0000000000000000000000000000000000000000..35927bcdd020512b561c3a20f9810d4baeb1d621 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-tabs/tab.html @@ -0,0 +1,3 @@ +<li ng-class="{active: active, disabled: disabled}" class="uib-tab"> + <a href ng-click="select()" uib-tab-heading-transclude>{{heading}}</a> +</li> diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-tabs/tabset.html b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-tabs/tabset.html new file mode 100644 index 0000000000000000000000000000000000000000..e5d17f8df87d028fa1a586bed4bb7b929829b497 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/angular-ui-tabs/tabset.html @@ -0,0 +1,10 @@ +<div> + <ul class="nav nav-{{tabset.type || 'tabs'}}" ng-class="{'nav-stacked': vertical, 'nav-justified': justified}" ng-transclude></ul> + <div class="tab-content"> + <div class="tab-pane" + ng-repeat="tab in tabset.tabs" + ng-class="{active: tabset.active === tab.index}" + uib-tab-content-transclude="tab"> + </div> + </div> +</div> diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/highcharts/exporting.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/highcharts/exporting.js new file mode 100644 index 0000000000000000000000000000000000000000..4dca6c7568f56dcf8b4408d8a522483b24613a0e --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/highcharts/exporting.js @@ -0,0 +1,24 @@ +/* + Highcharts JS v4.2.3 (2016-02-08) + Exporting module + + (c) 2010-2016 Torstein Honsi + + License: www.highcharts.com/license +*/ +(function(f){typeof module==="object"&&module.exports?module.exports=f:f(Highcharts)})(function(f){var r=f.win,m=r.document,A=f.Chart,t=f.addEvent,B=f.removeEvent,C=f.fireEvent,n=f.createElement,s=f.discardElement,v=f.css,l=f.merge,i=f.each,q=f.extend,F=f.splat,G=Math.max,H=f.isTouchDevice,I=f.Renderer.prototype.symbols,y=f.getOptions(),z;q(y.lang,{printChart:"Print chart",downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image",downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image", +contextButtonTitle:"Chart context menu"});y.navigation={menuStyle:{border:"1px solid #A0A0A0",background:"#FFFFFF",padding:"5px 0"},menuItemStyle:{padding:"0 10px",background:"none",color:"#303030",fontSize:H?"14px":"11px"},menuItemHoverStyle:{background:"#4572A5",color:"#FFFFFF"},buttonOptions:{symbolFill:"#E0E0E0",symbolSize:14,symbolStroke:"#666",symbolStrokeWidth:3,symbolX:12.5,symbolY:10.5,align:"right",buttonSpacing:3,height:22,theme:{fill:"white",stroke:"none"},verticalAlign:"top",width:24}}; +y.exporting={type:"image/png",url:"http://export.highcharts.com/",buttons:{contextButton:{menuClassName:"highcharts-contextmenu",symbol:"menu",_titleKey:"contextButtonTitle",menuItems:[{textKey:"printChart",onclick:function(){this.print()}},{separator:!0},{textKey:"downloadPNG",onclick:function(){this.exportChart()}},{textKey:"downloadJPEG",onclick:function(){this.exportChart({type:"image/jpeg"})}},{textKey:"downloadPDF",onclick:function(){this.exportChart({type:"application/pdf"})}},{textKey:"downloadSVG", +onclick:function(){this.exportChart({type:"image/svg+xml"})}}]}}};f.post=function(a,b,e){var c,a=n("form",l({method:"post",action:a,enctype:"multipart/form-data"},e),{display:"none"},m.body);for(c in b)n("input",{type:"hidden",name:c,value:b[c]},null,a);a.submit();s(a)};q(A.prototype,{sanitizeSVG:function(a){return a.replace(/zIndex="[^"]+"/g,"").replace(/isShadow="[^"]+"/g,"").replace(/symbolName="[^"]+"/g,"").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/url\([^#]+#/g,"url(#").replace(/<svg /,'<svg xmlns:xlink="http://www.w3.org/1999/xlink" ').replace(/ (NS[0-9]+\:)?href=/g, +" xlink:href=").replace(/\n/," ").replace(/<\/svg>.*?$/,"</svg>").replace(/(fill|stroke)="rgba\(([ 0-9]+,[ 0-9]+,[ 0-9]+),([ 0-9\.]+)\)"/g,'$1="rgb($2)" $1-opacity="$3"').replace(/ /g,"\u00a0").replace(/­/g,"\u00ad").replace(/<IMG /g,"<image ").replace(/<(\/?)TITLE>/g,"<$1title>").replace(/height=([^" ]+)/g,'height="$1"').replace(/width=([^" ]+)/g,'width="$1"').replace(/hc-svg-href="([^"]+)">/g,'xlink:href="$1"/>').replace(/ id=([^" >]+)/g,' id="$1"').replace(/class=([^" >]+)/g,'class="$1"').replace(/ transform /g, +" ").replace(/:(path|rect)/g,"$1").replace(/style="([^"]+)"/g,function(b){return b.toLowerCase()})},getChartHTML:function(){return this.container.innerHTML},getSVG:function(a){var b=this,e,c,g,j,k,d=l(b.options,a),J=d.exporting.allowHTML;if(!m.createElementNS)m.createElementNS=function(b,a){return m.createElement(a)};c=n("div",null,{position:"absolute",top:"-9999em",width:b.chartWidth+"px",height:b.chartHeight+"px"},m.body);g=b.renderTo.style.width;k=b.renderTo.style.height;g=d.exporting.sourceWidth|| +d.chart.width||/px$/.test(g)&&parseInt(g,10)||600;k=d.exporting.sourceHeight||d.chart.height||/px$/.test(k)&&parseInt(k,10)||400;q(d.chart,{animation:!1,renderTo:c,forExport:!0,renderer:"SVGRenderer",width:g,height:k});d.exporting.enabled=!1;delete d.data;d.series=[];i(b.series,function(a){j=l(a.userOptions,{animation:!1,enableMouseTracking:!1,showCheckbox:!1,visible:a.visible});j.isInternal||d.series.push(j)});a&&i(["xAxis","yAxis"],function(b){i(F(a[b]),function(a,c){d[b][c]=l(d[b][c],a)})});e= +new f.Chart(d,b.callback);i(["xAxis","yAxis"],function(a){i(b[a],function(b,c){var d=e[a][c],f=b.getExtremes(),g=f.userMin,f=f.userMax;d&&(g!==void 0||f!==void 0)&&d.setExtremes(g,f,!0,!1)})});g=e.getChartHTML();d=null;e.destroy();s(c);if(J&&(c=g.match(/<\/svg>(.*?$)/)))c='<foreignObject x="0" y="0" width="200" height="200"><body xmlns="http://www.w3.org/1999/xhtml">'+c[1]+"</body></foreignObject>",g=g.replace("</svg>",c+"</svg>");g=this.sanitizeSVG(g);return g=g.replace(/(url\(#highcharts-[0-9]+)"/g, +"$1").replace(/"/g,"'")},getSVGForExport:function(a,b){var e=this.options.exporting;return this.getSVG(l({chart:{borderRadius:0}},e.chartOptions,b,{exporting:{sourceWidth:a&&a.sourceWidth||e.sourceWidth,sourceHeight:a&&a.sourceHeight||e.sourceHeight}}))},exportChart:function(a,b){var e=this.getSVGForExport(a,b),a=l(this.options.exporting,a);f.post(a.url,{filename:a.filename||"chart",type:a.type,width:a.width||0,scale:a.scale||2,svg:e},a.formAttributes)},print:function(){var a=this,b=a.container, +e=[],c=b.parentNode,f=m.body,j=f.childNodes;if(!a.isPrinting)a.isPrinting=!0,a.pointer.reset(null,0),C(a,"beforePrint"),i(j,function(a,b){if(a.nodeType===1)e[b]=a.style.display,a.style.display="none"}),f.appendChild(b),r.focus(),r.print(),setTimeout(function(){c.appendChild(b);i(j,function(a,b){if(a.nodeType===1)a.style.display=e[b]});a.isPrinting=!1;C(a,"afterPrint")},1E3)},contextMenu:function(a,b,e,c,f,j,k){var d=this,l=d.options.navigation,D=l.menuItemStyle,o=d.chartWidth,p=d.chartHeight,E="cache-"+ +a,h=d[E],u=G(f,j),w,x,r,s=function(b){d.pointer.inClass(b.target,a)||x()};if(!h)d[E]=h=n("div",{className:a},{position:"absolute",zIndex:1E3,padding:u+"px"},d.container),w=n("div",null,q({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},l.menuStyle),h),x=function(){v(h,{display:"none"});k&&k.setState(0);d.openMenu=!1},t(h,"mouseleave",function(){r=setTimeout(x,500)}),t(h,"mouseenter",function(){clearTimeout(r)}),t(m,"mouseup",s),t(d,"destroy",function(){B(m, +"mouseup",s)}),i(b,function(a){if(a){var b=a.separator?n("hr",null,null,w):n("div",{onmouseover:function(){v(this,l.menuItemHoverStyle)},onmouseout:function(){v(this,D)},onclick:function(b){b&&b.stopPropagation();x();a.onclick&&a.onclick.apply(d,arguments)},innerHTML:a.text||d.options.lang[a.textKey]},q({cursor:"pointer"},D),w);d.exportDivElements.push(b)}}),d.exportDivElements.push(w,h),d.exportMenuWidth=h.offsetWidth,d.exportMenuHeight=h.offsetHeight;b={display:"block"};e+d.exportMenuWidth>o?b.right= +o-e-f-u+"px":b.left=e-u+"px";c+j+d.exportMenuHeight>p&&k.alignOptions.verticalAlign!=="top"?b.bottom=p-c-u+"px":b.top=c+j-u+"px";v(h,b);d.openMenu=!0},addButton:function(a){var b=this,e=b.renderer,c=l(b.options.navigation.buttonOptions,a),g=c.onclick,j=c.menuItems,k,d,m={stroke:c.symbolStroke,fill:c.symbolFill},i=c.symbolSize||12;if(!b.btnCount)b.btnCount=0;if(!b.exportDivElements)b.exportDivElements=[],b.exportSVGElements=[];if(c.enabled!==!1){var o=c.theme,p=o.states,n=p&&p.hover,p=p&&p.select, +h;delete o.states;g?h=function(a){a.stopPropagation();g.call(b,a)}:j&&(h=function(){b.contextMenu(d.menuClassName,j,d.translateX,d.translateY,d.width,d.height,d);d.setState(2)});c.text&&c.symbol?o.paddingLeft=f.pick(o.paddingLeft,25):c.text||q(o,{width:c.width,height:c.height,padding:0});d=e.button(c.text,0,0,h,o,n,p).attr({title:b.options.lang[c._titleKey],"stroke-linecap":"round",zIndex:3});d.menuClassName=a.menuClassName||"highcharts-menu-"+b.btnCount++;c.symbol&&(k=e.symbol(c.symbol,c.symbolX- +i/2,c.symbolY-i/2,i,i).attr(q(m,{"stroke-width":c.symbolStrokeWidth||1,zIndex:1})).add(d));d.add().align(q(c,{width:d.width,x:f.pick(c.x,z)}),!0,"spacingBox");z+=(d.width+c.buttonSpacing)*(c.align==="right"?-1:1);b.exportSVGElements.push(d,k)}},destroyExport:function(a){var a=a.target,b,e;for(b=0;b<a.exportSVGElements.length;b++)if(e=a.exportSVGElements[b])e.onclick=e.ontouchstart=null,a.exportSVGElements[b]=e.destroy();for(b=0;b<a.exportDivElements.length;b++)e=a.exportDivElements[b],B(e,"mouseleave"), +a.exportDivElements[b]=e.onmouseout=e.onmouseover=e.ontouchstart=e.onclick=null,s(e)}});I.menu=function(a,b,e,c){return["M",a,b+2.5,"L",a+e,b+2.5,"M",a,b+c/2+0.5,"L",a+e,b+c/2+0.5,"M",a,b+c-1.5,"L",a+e,b+c-1.5]};A.prototype.callbacks.push(function(a){var b,e=a.options.exporting,c=e.buttons;z=0;if(e.enabled!==!1){for(b in c)a.addButton(c[b]);t(a,"destroy",a.destroyExport)}})}); diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/highcharts/highcharts-ng.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/highcharts/highcharts-ng.js new file mode 100644 index 0000000000000000000000000000000000000000..94567e05a07c8c8551f8d0180f014297c31136d1 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/highcharts/highcharts-ng.js @@ -0,0 +1,498 @@ +if (typeof module !== 'undefined' && typeof exports !== 'undefined' && module.exports === exports){ + module.exports = 'highcharts-ng'; +} + +(function () { + 'use strict'; + /*global angular: false, Highcharts: false */ + + + angular.module('highcharts-ng', []) + .provider('highchartsNG', highchartsNGProvider) + .directive('highchart', ['highchartsNG', '$timeout', highchart]); + + function highchartsNGProvider(){ + var modules = []; + var basePath = false; + var lazyLoad = false; + return { + HIGHCHART: 'highcharts.js', + HIGHSTOCK: 'stock/highstock.js', + basePath: function (p) { + basePath = p; + }, + lazyLoad: function (list) { + if (list === undefined) { + modules = [this.HIGHCHART]; + } else { + modules = list; + } + lazyLoad = true; + }, + $get: ['$window', '$rootScope', function ($window, $rootScope) { + if (!basePath) { + basePath = (window.location.protocol === 'https:' ? 'https' : 'http') + '://code.highcharts.com/'; + } + return highchartsNG($window, $rootScope, lazyLoad, basePath, modules); + }] + }; + } + function highchartsNG($window, $rootScope, lazyload, basePath, modules) { + var readyQueue = []; + var loading = false; + return { + lazyLoad:lazyload, + ready: function (callback, thisArg) { + if (typeof $window.Highcharts !== 'undefined' || !lazyload) { + callback(); + } else { + readyQueue.push([callback, thisArg]); + if (loading) { + return; + } + loading = true; + var self = this; + if (typeof jQuery === 'undefined') { + modules.unshift('adapters/standalone-framework.js'); + } + var doWork = function () { + if (modules.length === 0) { + loading = false; + $rootScope.$apply(function () { + angular.forEach(readyQueue, function (e) { + // invoke callback passing 'thisArg' + e[0].apply(e[1], []); + }); + }); + } else { + var s = modules.shift(); + self.loadScript(s, doWork); + } + }; + doWork(); + } + }, + loadScript: function (path, callback) { + var s = document.createElement('script'); + s.type = 'text/javascript'; + s.src = basePath + path; + s.onload = callback; + document.getElementsByTagName('body')[0].appendChild(s); + }, + //IE8 support + indexOf: function (arr, find, i /*opt*/) { + if (i === undefined) i = 0; + if (i < 0) i += arr.length; + if (i < 0) i = 0; + for (var n = arr.length; i < n; i++) + if (i in arr && arr[i] === find) + return i; + return -1; + }, + + prependMethod: function (obj, method, func) { + var original = obj[method]; + obj[method] = function () { + var args = Array.prototype.slice.call(arguments); + func.apply(this, args); + if (original) { + return original.apply(this, args); + } else { + return; + } + + }; + }, + + deepExtend: function deepExtend(destination, source) { + //Slightly strange behaviour in edge cases (e.g. passing in non objects) + //But does the job for current use cases. + if (angular.isArray(source)) { + destination = angular.isArray(destination) ? destination : []; + for (var i = 0; i < source.length; i++) { + destination[i] = deepExtend(destination[i] || {}, source[i]); + } + } else if (angular.isObject(source)) { + destination = angular.isObject(destination) ? destination : {}; + for (var property in source) { + destination[property] = deepExtend(destination[property] || {}, source[property]); + } + } else { + destination = source; + } + return destination; + } + }; + } + + function highchart(highchartsNGUtils, $timeout) { + + // acceptable shared state + var seriesId = 0; + var ensureIds = function (series) { + var changed = false; + angular.forEach(series, function(s) { + if (!angular.isDefined(s.id)) { + s.id = 'series-' + seriesId++; + changed = true; + } + }); + return changed; + }; + + // immutable + var axisNames = [ 'xAxis', 'yAxis' ]; + var chartTypeMap = { + 'stock': 'StockChart', + 'map': 'Map', + 'chart': 'Chart' + }; + + var getMergedOptions = function (scope, element, config) { + var mergedOptions = {}; + + var defaultOptions = { + chart: { + events: {} + }, + title: {}, + subtitle: {}, + series: [], + credits: {}, + plotOptions: {}, + navigator: {enabled: false}, + xAxis: { + events: {} + }, + yAxis: { + events: {} + } + }; + + if (config.options) { + mergedOptions = highchartsNGUtils.deepExtend(defaultOptions, config.options); + } else { + mergedOptions = defaultOptions; + } + mergedOptions.chart.renderTo = element[0]; + + angular.forEach(axisNames, function(axisName) { + if(angular.isDefined(config[axisName])) { + mergedOptions[axisName] = highchartsNGUtils.deepExtend(mergedOptions[axisName] || {}, config[axisName]); + + if(angular.isDefined(config[axisName].currentMin) || + angular.isDefined(config[axisName].currentMax)) { + + highchartsNGUtils.prependMethod(mergedOptions.chart.events, 'selection', function(e){ + var thisChart = this; + if (e[axisName]) { + scope.$apply(function () { + scope.config[axisName].currentMin = e[axisName][0].min; + scope.config[axisName].currentMax = e[axisName][0].max; + }); + } else { + //handle reset button - zoom out to all + scope.$apply(function () { + scope.config[axisName].currentMin = thisChart[axisName][0].dataMin; + scope.config[axisName].currentMax = thisChart[axisName][0].dataMax; + }); + } + }); + + highchartsNGUtils.prependMethod(mergedOptions.chart.events, 'addSeries', function(e){ + scope.config[axisName].currentMin = this[axisName][0].min || scope.config[axisName].currentMin; + scope.config[axisName].currentMax = this[axisName][0].max || scope.config[axisName].currentMax; + }); + highchartsNGUtils.prependMethod(mergedOptions[axisName].events, 'setExtremes', function (e) { + if (e.trigger && e.trigger !== 'zoom') { // zoom trigger is handled by selection event + $timeout(function () { + scope.config[axisName].currentMin = e.min; + scope.config[axisName].currentMax = e.max; + scope.config[axisName].min = e.min; // set min and max to adjust scrollbar/navigator + scope.config[axisName].max = e.max; + }, 0); + } + }); + } + } + }); + + if(config.title) { + mergedOptions.title = config.title; + } + if (config.subtitle) { + mergedOptions.subtitle = config.subtitle; + } + if (config.credits) { + mergedOptions.credits = config.credits; + } + if(config.size) { + if (config.size.width) { + mergedOptions.chart.width = config.size.width; + } + if (config.size.height) { + mergedOptions.chart.height = config.size.height; + } + } + return mergedOptions; + }; + + var updateZoom = function (axis, modelAxis) { + var extremes = axis.getExtremes(); + if(modelAxis.currentMin !== extremes.dataMin || modelAxis.currentMax !== extremes.dataMax) { + if (axis.setExtremes) { + axis.setExtremes(modelAxis.currentMin, modelAxis.currentMax, false); + } else { + axis.detachedsetExtremes(modelAxis.currentMin, modelAxis.currentMax, false); + } + } + }; + + var processExtremes = function(chart, axis, axisName) { + if(axis.currentMin || axis.currentMax) { + chart[axisName][0].setExtremes(axis.currentMin, axis.currentMax, true); + } + }; + + var chartOptionsWithoutEasyOptions = function (options) { + return angular.extend( + highchartsNGUtils.deepExtend({}, options), + { data: null, visible: null } + ); + }; + + var getChartType = function(scope) { + if (scope.config === undefined) return 'Chart'; + return chartTypeMap[('' + scope.config.chartType).toLowerCase()] || + (scope.config.useHighStocks ? 'StockChart' : 'Chart'); + }; + + var res = { + restrict: 'EAC', + replace: true, + template: '<div></div>', + scope: { + config: '=', + disableDataWatch: '=' + }, + link: function (scope, element, attrs) { + // We keep some chart-specific variables here as a closure + // instead of storing them on 'scope'. + + // prevSeriesOptions is maintained by processSeries + var prevSeriesOptions = {}; + + var processSeries = function(series) { + var i; + var ids = []; + + if(series) { + var setIds = ensureIds(series); + if(setIds && !scope.disableDataWatch) { + //If we have set some ids this will trigger another digest cycle. + //In this scenario just return early and let the next cycle take care of changes + return false; + } + + //Find series to add or update + angular.forEach(series, function(s) { + ids.push(s.id); + var chartSeries = chart.get(s.id); + if (chartSeries) { + if (!angular.equals(prevSeriesOptions[s.id], chartOptionsWithoutEasyOptions(s))) { + chartSeries.update(angular.copy(s), false); + } else { + if (s.visible !== undefined && chartSeries.visible !== s.visible) { + chartSeries.setVisible(s.visible, false); + } + chartSeries.setData(angular.copy(s.data), false); + } + } else { + chart.addSeries(angular.copy(s), false); + } + prevSeriesOptions[s.id] = chartOptionsWithoutEasyOptions(s); + }); + + // Shows no data text if all series are empty + if(scope.config.noData) { + var chartContainsData = false; + + for(i = 0; i < series.length; i++) { + if (series[i].data && series[i].data.length > 0) { + chartContainsData = true; + + break; + } + } + + if (!chartContainsData) { + chart.showLoading(scope.config.noData); + } else { + chart.hideLoading(); + } + } + } + + //Now remove any missing series + for(i = chart.series.length - 1; i >= 0; i--) { + var s = chart.series[i]; + if (s.options.id !== 'highcharts-navigator-series' && highchartsNGUtils.indexOf(ids, s.options.id) < 0) { + s.remove(false); + } + } + + return true; + }; + + // chart is maintained by initChart + var chart = false; + var initChart = function() { + if (chart) chart.destroy(); + prevSeriesOptions = {}; + var config = scope.config || {}; + var mergedOptions = getMergedOptions(scope, element, config); + var func = config.func || undefined; + var chartType = getChartType(scope); + + chart = new Highcharts[chartType](mergedOptions, func); + + for (var i = 0; i < axisNames.length; i++) { + if (config[axisNames[i]]) { + processExtremes(chart, config[axisNames[i]], axisNames[i]); + } + } + if(config.loading) { + chart.showLoading(); + } + config.getHighcharts = function() { + return chart; + }; + + }; + initChart(); + + + if(scope.disableDataWatch){ + scope.$watchCollection('config.series', function (newSeries, oldSeries) { + processSeries(newSeries); + chart.redraw(); + }); + } else { + scope.$watch('config.series', function (newSeries, oldSeries) { + var needsRedraw = processSeries(newSeries); + if(needsRedraw) { + chart.redraw(); + } + }, true); + } + + scope.$watch('config.title', function (newTitle) { + chart.setTitle(newTitle, true); + }, true); + + scope.$watch('config.subtitle', function (newSubtitle) { + chart.setTitle(true, newSubtitle); + }, true); + + scope.$watch('config.loading', function (loading) { + if(loading) { + chart.showLoading(loading === true ? null : loading); + } else { + chart.hideLoading(); + } + }); + scope.$watch('config.noData', function (noData) { + if(scope.config && scope.config.loading) { + chart.showLoading(noData); + } + }, true); + + scope.$watch('config.credits.enabled', function (enabled) { + if (enabled) { + chart.credits.show(); + } else if (chart.credits) { + chart.credits.hide(); + } + }); + + scope.$watch(getChartType, function (chartType, oldChartType) { + if (chartType === oldChartType) return; + initChart(); + }); + + angular.forEach(axisNames, function(axisName) { + scope.$watch('config.' + axisName, function(newAxes, oldAxes) { + if (newAxes === oldAxes || !newAxes) { + return; + } + + if (angular.isArray(newAxes)) { + + for (var axisIndex = 0; axisIndex < newAxes.length; axisIndex++) { + var axis = newAxes[axisIndex]; + + if (axisIndex < chart[axisName].length) { + chart[axisName][axisIndex].update(axis, false); + updateZoom(chart[axisName][axisIndex], angular.copy(axis)); + } + + } + + } else { + // update single axis + chart[axisName][0].update(newAxes, false); + updateZoom(chart[axisName][0], angular.copy(newAxes)); + } + + chart.redraw(); + }, true); + }); + scope.$watch('config.options', function (newOptions, oldOptions, scope) { + //do nothing when called on registration + if (newOptions === oldOptions) return; + initChart(); + processSeries(scope.config.series); + chart.redraw(); + }, true); + + scope.$watch('config.size', function (newSize, oldSize) { + if(newSize === oldSize) return; + if(newSize) { + chart.setSize(newSize.width || chart.chartWidth, newSize.height || chart.chartHeight); + } + }, true); + + scope.$on('highchartsng.reflow', function () { + chart.reflow(); + }); + + scope.$on('$destroy', function() { + if (chart) { + try{ + chart.destroy(); + }catch(ex){ + // fail silently as highcharts will throw exception if element doesn't exist + } + + $timeout(function(){ + element.remove(); + }, 0); + } + }); + + } + }; + + // override link fn if lazy loading is enabled + if(highchartsNGUtils.lazyLoad){ + var oldLink = res.link; + res.link = function(){ + var args = arguments; + highchartsNGUtils.ready(function(){ + oldLink.apply(this, args); + }, this); + }; + } + return res; + } +}()); diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/highcharts/highcharts.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/highcharts/highcharts.js new file mode 100644 index 0000000000000000000000000000000000000000..374916866b03b214cab07f96a45bbb0b82ff095f --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/highcharts/highcharts.js @@ -0,0 +1,340 @@ +/* + Highcharts JS v4.2.3 (2016-02-08) + + (c) 2009-2016 Torstein Honsi + + License: www.highcharts.com/license +*/ +(function(E,X){typeof module==="object"&&module.exports?module.exports=E.document?X(E):X:E.Highcharts=X(E)})(typeof window!=="undefined"?window:this,function(E){function X(a,b){var c="Highcharts error #"+a+": www.highcharts.com/errors/"+a;if(b)throw Error(c);E.console&&console.log(c)}function pb(a,b,c){this.options=b;this.elem=a;this.prop=c}function D(){var a,b=arguments,c,d={},e=function(a,b){var c,d;typeof a!=="object"&&(a={});for(d in b)b.hasOwnProperty(d)&&(c=b[d],a[d]=c&&typeof c==="object"&& +Object.prototype.toString.call(c)!=="[object Array]"&&d!=="renderTo"&&typeof c.nodeType!=="number"?e(a[d]||{},c):b[d]);return a};b[0]===!0&&(d=b[1],b=Array.prototype.slice.call(b,2));c=b.length;for(a=0;a<c;a++)d=e(d,b[a]);return d}function C(a,b){return parseInt(a,b||10)}function xa(a){return typeof a==="string"}function Y(a){return a&&typeof a==="object"}function Ia(a){return Object.prototype.toString.call(a)==="[object Array]"}function ma(a){return typeof a==="number"}function Da(a){return W.log(a)/ +W.LN10}function na(a){return W.pow(10,a)}function oa(a,b){for(var c=a.length;c--;)if(a[c]===b){a.splice(c,1);break}}function q(a){return a!==z&&a!==null}function K(a,b,c){var d,e;if(xa(b))q(c)?a.setAttribute(b,c):a&&a.getAttribute&&(e=a.getAttribute(b));else if(q(b)&&Y(b))for(d in b)a.setAttribute(d,b[d]);return e}function ta(a){return Ia(a)?a:[a]}function Pa(a,b,c){if(b)return setTimeout(a,b,c);a.call(0,c)}function L(a,b){if(ya&&!ca&&b&&b.opacity!==z)b.filter="alpha(opacity="+b.opacity*100+")";u(a.style, +b)}function Z(a,b,c,d,e){a=y.createElement(a);b&&u(a,b);e&&L(a,{padding:0,border:"none",margin:0});c&&L(a,c);d&&d.appendChild(a);return a}function pa(a,b){var c=function(){};c.prototype=new a;u(c.prototype,b);return c}function Ja(a,b){return Array((b||2)+1-String(a).length).join(0)+a}function Ya(a){return(Za&&Za(a)||qb||0)*6E4}function Ka(a,b){for(var c="{",d=!1,e,f,g,h,i,k=[];(c=a.indexOf(c))!==-1;){e=a.slice(0,c);if(d){f=e.split(":");g=f.shift().split(".");i=g.length;e=b;for(h=0;h<i;h++)e=e[g[h]]; +if(f.length)f=f.join(":"),g=/\.([0-9])/,h=N.lang,i=void 0,/f$/.test(f)?(i=(i=f.match(g))?i[1]:-1,e!==null&&(e=B.numberFormat(e,i,h.decimalPoint,f.indexOf(",")>-1?h.thousandsSep:""))):e=Qa(f,e)}k.push(e);a=a.slice(c+1);c=(d=!d)?"}":"{"}k.push(a);return k.join("")}function rb(a){return W.pow(10,T(W.log(a)/W.LN10))}function sb(a,b,c,d,e){var f,g=a,c=p(c,1);f=a/c;b||(b=[1,2,2.5,5,10],d===!1&&(c===1?b=[1,2,5,10]:c<=0.1&&(b=[1/c])));for(d=0;d<b.length;d++)if(g=b[d],e&&g*c>=a||!e&&f<=(b[d]+(b[d+1]||b[d]))/ +2)break;g*=c;return g}function ib(a,b){var c=a.length,d,e;for(e=0;e<c;e++)a[e].safeI=e;a.sort(function(a,c){d=b(a,c);return d===0?a.safeI-c.safeI:d});for(e=0;e<c;e++)delete a[e].safeI}function Ra(a){for(var b=a.length,c=a[0];b--;)a[b]<c&&(c=a[b]);return c}function Ea(a){for(var b=a.length,c=a[0];b--;)a[b]>c&&(c=a[b]);return c}function Sa(a,b){for(var c in a)a[c]&&a[c]!==b&&a[c].destroy&&a[c].destroy(),delete a[c]}function Ta(a){jb||(jb=Z(La));a&&jb.appendChild(a);jb.innerHTML=""}function fa(a,b){return parseFloat(a.toPrecision(b|| +14))}function Ua(a,b){b.renderer.globalAnimation=p(a,b.animation)}function Fb(){var a=N.global,b=a.useUTC,c=b?"getUTC":"get",d=b?"setUTC":"set";qa=a.Date||E.Date;qb=b&&a.timezoneOffset;Za=b&&a.getTimezoneOffset;kb=function(a,c,d,h,i,k){var j;b?(j=qa.UTC.apply(0,arguments),j+=Ya(j)):j=(new qa(a,c,p(d,1),p(h,0),p(i,0),p(k,0))).getTime();return j};tb=c+"Minutes";ub=c+"Hours";vb=c+"Day";$a=c+"Date";ab=c+"Month";bb=c+"FullYear";Gb=d+"Milliseconds";Hb=d+"Seconds";Ib=d+"Minutes";Jb=d+"Hours";wb=d+"Date"; +xb=d+"Month";yb=d+"FullYear"}function ia(a){if(!(this instanceof ia))return new ia(a);this.init(a)}function O(){}function Va(a,b,c,d){this.axis=a;this.pos=b;this.type=c||"";this.isNew=!0;!c&&!d&&this.addLabel()}function Kb(a,b,c,d,e){var f=a.chart.inverted;this.axis=a;this.isNegative=c;this.options=b;this.x=d;this.total=null;this.points={};this.stack=e;this.rightCliff=this.leftCliff=0;this.alignOptions={align:b.align||(f?c?"left":"right":"center"),verticalAlign:b.verticalAlign||(f?"middle":c?"bottom": +"top"),y:p(b.y,f?4:c?14:-6),x:p(b.x,f?c?-6:6:0)};this.textAlign=b.textAlign||(f?c?"right":"left":"center")}var z,y=E.document,W=Math,A=W.round,T=W.floor,ua=W.ceil,t=W.max,F=W.min,P=W.abs,U=W.cos,$=W.sin,ra=W.PI,ga=ra*2/360,za=E.navigator&&E.navigator.userAgent||"",Lb=E.opera,ya=/(msie|trident|edge)/i.test(za)&&!Lb,lb=y&&y.documentMode===8,mb=!ya&&/AppleWebKit/.test(za),Ma=/Firefox/.test(za),Mb=/(Mobile|Android|Windows Phone)/.test(za),Fa="http://www.w3.org/2000/svg",ca=y&&y.createElementNS&&!!y.createElementNS(Fa, +"svg").createSVGRect,Qb=Ma&&parseInt(za.split("Firefox/")[1],10)<4,ha=y&&!ca&&!ya&&!!y.createElement("canvas").getContext,cb,db,Nb={},zb=0,jb,N,Qa,G,Aa=function(){},S=[],eb=0,La="div",Rb=/^[0-9]+$/,nb=["plotTop","marginRight","marginBottom","plotLeft"],qa,kb,qb,Za,tb,ub,vb,$a,ab,bb,Gb,Hb,Ib,Jb,wb,xb,yb,I={},B;B=E.Highcharts?X(16,!0):{win:E};B.seriesTypes=I;var Ga=[],ja,sa,o,Na,Ab,Ba,M,V,H,Wa,Oa;pb.prototype={dSetter:function(){var a=this.paths[0],b=this.paths[1],c=[],d=this.now,e=a.length,f;if(d=== +1)c=this.toD;else if(e===b.length&&d<1)for(;e--;)f=parseFloat(a[e]),c[e]=isNaN(f)?a[e]:d*parseFloat(b[e]-f)+f;else c=b;this.elem.attr("d",c)},update:function(){var a=this.elem,b=this.prop,c=this.now,d=this.options.step;if(this[b+"Setter"])this[b+"Setter"]();else a.attr?a.element&&a.attr(b,c):a.style[b]=c+this.unit;d&&d.call(a,c,this)},run:function(a,b,c){var d=this,e=function(a){return e.stopped?!1:d.step(a)},f;this.startTime=+new qa;this.start=a;this.end=b;this.unit=c;this.now=this.start;this.pos= +0;e.elem=this.elem;if(e()&&Ga.push(e)===1)e.timerId=setInterval(function(){for(f=0;f<Ga.length;f++)Ga[f]()||Ga.splice(f--,1);Ga.length||clearInterval(e.timerId)},13)},step:function(a){var b=+new qa,c,d=this.options;c=this.elem;var e=d.complete,f=d.duration,g=d.curAnim,h;if(c.attr&&!c.element)c=!1;else if(a||b>=f+this.startTime){this.now=this.end;this.pos=1;this.update();a=g[this.prop]=!0;for(h in g)g[h]!==!0&&(a=!1);a&&e&&e.call(c);c=!1}else this.pos=d.easing((b-this.startTime)/f),this.now=this.start+ +(this.end-this.start)*this.pos,this.update(),c=!0;return c},initPath:function(a,b,c){var b=b||"",d=a.shift,e=b.indexOf("C")>-1,f=e?7:3,g,b=b.split(" "),c=[].concat(c),h=a.isArea,i=h?2:1,k=function(a){for(g=a.length;g--;)(a[g]==="M"||a[g]==="L")&&a.splice(g+1,0,a[g+1],a[g+2],a[g+1],a[g+2])};e&&(k(b),k(c));if(d<=c.length/f&&b.length===c.length)for(;d--;)c=c.slice(0,f).concat(c),h&&(c=c.concat(c.slice(c.length-f)));a.shift=0;if(b.length)for(a=c.length;b.length<a;)d=b.slice().splice(b.length/i-f,f*i), +e&&(d[f-6]=d[f-2],d[f-5]=d[f-1]),[].splice.apply(b,[b.length/i,0].concat(d));return[b,c]}};var u=B.extend=function(a,b){var c;a||(a={});for(c in b)a[c]=b[c];return a},p=B.pick=function(){var a=arguments,b,c,d=a.length;for(b=0;b<d;b++)if(c=a[b],c!==z&&c!==null)return c},fb=B.wrap=function(a,b,c){var d=a[b];a[b]=function(){var a=Array.prototype.slice.call(arguments);a.unshift(d);return c.apply(this,a)}};Qa=function(a,b,c){if(!q(b)||isNaN(b))return N.lang.invalidDate||"";var a=p(a,"%Y-%m-%d %H:%M:%S"), +d=new qa(b-Ya(b)),e,f=d[ub](),g=d[vb](),h=d[$a](),i=d[ab](),k=d[bb](),j=N.lang,l=j.weekdays,d=u({a:l[g].substr(0,3),A:l[g],d:Ja(h),e:h,w:g,b:j.shortMonths[i],B:j.months[i],m:Ja(i+1),y:k.toString().substr(2,2),Y:k,H:Ja(f),k:f,I:Ja(f%12||12),l:f%12||12,M:Ja(d[tb]()),p:f<12?"AM":"PM",P:f<12?"am":"pm",S:Ja(d.getSeconds()),L:Ja(A(b%1E3),3)},B.dateFormats);for(e in d)for(;a.indexOf("%"+e)!==-1;)a=a.replace("%"+e,typeof d[e]==="function"?d[e](b):d[e]);return c?a.substr(0,1).toUpperCase()+a.substr(1):a}; +G={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:24192E5,year:314496E5};B.numberFormat=function(a,b,c,d){var a=+a||0,e=N.lang,f=(a.toString().split(".")[1]||"").length,g,h,i=Math.abs(a);b===-1?b=Math.min(f,20):isNaN(b)&&(b=2);g=String(C(i.toFixed(b)));h=g.length>3?g.length%3:0;c=p(c,e.decimalPoint);d=p(d,e.thousandsSep);a=a<0?"-":"";a+=h?g.substr(0,h)+d:"";a+=g.substr(h).replace(/(\d{3})(?=\d)/g,"$1"+d);+b&&(d=Math.abs(i-g+Math.pow(10,-Math.max(b,f)-1)),a+=c+d.toFixed(b).slice(2)); +return a};Math.easeInOutSine=function(a){return-0.5*(Math.cos(Math.PI*a)-1)};ja=function(a,b){var c;if(b==="width")return Math.min(a.offsetWidth,a.scrollWidth)-ja(a,"padding-left")-ja(a,"padding-right");else if(b==="height")return Math.min(a.offsetHeight,a.scrollHeight)-ja(a,"padding-top")-ja(a,"padding-bottom");return(c=E.getComputedStyle(a,void 0))&&C(c.getPropertyValue(b))};sa=function(a,b){return b.indexOf?b.indexOf(a):[].indexOf.call(b,a)};Na=function(a,b){return[].filter.call(a,b)};Ba=function(a, +b){for(var c=[],d=0,e=a.length;d<e;d++)c[d]=b.call(a[d],a[d],d,a);return c};Ab=function(a){var b=y.documentElement,a=a.getBoundingClientRect();return{top:a.top+(E.pageYOffset||b.scrollTop)-(b.clientTop||0),left:a.left+(E.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}};Oa=function(a){for(var b=Ga.length;b--;)if(Ga[b].elem===a)Ga[b].stopped=!0};o=function(a,b){return Array.prototype.forEach.call(a,b)};M=function(a,b,c){function d(b){b.target=b.srcElement||E;c.call(a,b)}var e=a.hcEvents=a.hcEvents||{}; +if(a.addEventListener)a.addEventListener(b,c,!1);else if(a.attachEvent){if(!a.hcEventsIE)a.hcEventsIE={};a.hcEventsIE[c.toString()]=d;a.attachEvent("on"+b,d)}e[b]||(e[b]=[]);e[b].push(c)};V=function(a,b,c){function d(b,c){a.removeEventListener?a.removeEventListener(b,c,!1):a.attachEvent&&(c=a.hcEventsIE[c.toString()],a.detachEvent("on"+b,c))}function e(){var c,e,f;if(a.nodeName)for(f in b?(c={},c[b]=!0):c=g,c)if(g[f])for(e=g[f].length;e--;)d(f,g[f][e])}var f,g=a.hcEvents,h;if(g)b?(f=g[b]||[],c?(h= +sa(c,f),h>-1&&(f.splice(h,1),g[b]=f),d(b,c)):(e(),g[b]=[])):(e(),a.hcEvents={})};H=function(a,b,c,d){var e;e=a.hcEvents;var f,g,h,i,c=c||{};if(y.createEvent&&(a.dispatchEvent||a.fireEvent))e=y.createEvent("Events"),e.initEvent(b,!0,!0),e.target=a,u(e,c),a.dispatchEvent?a.dispatchEvent(e):a.fireEvent(b,e);else if(e){e=e[b]||[];f=e.length;h=function(){c.defaultPrevented=!0};for(g=0;g<f;g++){i=e[g];if(c.stopped)return;c.preventDefault=h;c.target=a;if(!c.type)c.type=b;i.call(a,c)===!1&&c.preventDefault()}}d&& +!c.defaultPrevented&&d(c)};Wa=function(a,b,c){var d,e="",f,g,h;Y(c)||(d=arguments,c={duration:d[2],easing:d[3],complete:d[4]});if(!ma(c.duration))c.duration=400;c.easing=Math[c.easing]||Math.easeInOutSine;c.curAnim=D(b);for(h in b)g=new pb(a,c,h),f=null,h==="d"?(g.paths=g.initPath(a,a.d,b.d),g.toD=b.d,d=0,f=1):a.attr?d=a.attr(h):(d=parseFloat(ja(a,h))||0,h!=="opacity"&&(e="px")),f||(f=b[h]),f.match&&f.match("px")&&(f=f.replace(/px/g,"")),g.run(d,f,e)};if(E.jQuery)E.jQuery.fn.highcharts=function(){var a= +[].slice.call(arguments);if(this[0])return a[0]?(new (B[xa(a[0])?a.shift():"Chart"])(this[0],a[0],a[1]),this):S[K(this[0],"data-highcharts-chart")]};y&&!y.defaultView&&(ja=function(a,b){var c;c={width:"clientWidth",height:"clientHeight"}[b];if(a.style[b])return C(a.style[b]);b==="opacity"&&(b="filter");if(c)return a.style.zoom=1,a[c]-2*ja(a,"padding");c=a.currentStyle[b.replace(/\-(\w)/g,function(a,b){return b.toUpperCase()})];b==="filter"&&(c=c.replace(/alpha\(opacity=([0-9]+)\)/,function(a,b){return b/ +100}));return c===""?1:C(c)});Array.prototype.forEach||(o=function(a,b){for(var c=0,d=a.length;c<d;c++)if(b.call(a[c],a[c],c,a)===!1)return c});Array.prototype.indexOf||(sa=function(a,b){var c,d=0;if(b)for(c=b.length;d<c;d++)if(b[d]===a)return d;return-1});Array.prototype.filter||(Na=function(a,b){for(var c=[],d=0,e=a.length;d<e;d++)b(a[d],d)&&c.push(a[d]);return c});B.Fx=pb;B.inArray=sa;B.each=o;B.grep=Na;B.offset=Ab;B.map=Ba;B.addEvent=M;B.removeEvent=V;B.fireEvent=H;B.animate=Wa;B.stop=Oa;N={colors:"#7cb5ec,#434348,#90ed7d,#f7a35c,#8085e9,#f15c80,#e4d354,#2b908f,#f45b5b,#91e8e1".split(","), +symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),shortMonths:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),weekdays:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),decimalPoint:".",numericSymbols:"k,M,G,T,P,E".split(","),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:" "},global:{useUTC:!0, +canvasToolsURL:"http://code.highcharts.com/modules/canvas-tools.js",VMLRadialGradientURL:"http://code.highcharts.com/4.2.3/gfx/vml-radial-gradient.png"},chart:{borderColor:"#4572A7",borderRadius:0,defaultSeriesType:"line",ignoreHiddenSeries:!0,spacing:[10,10,15,10],backgroundColor:"#FFFFFF",plotBorderColor:"#C0C0C0",resetZoomButton:{theme:{zIndex:20},position:{align:"right",x:-10,y:10}}},title:{text:"Chart title",align:"center",margin:15,style:{color:"#333333",fontSize:"18px"}},subtitle:{text:"", +align:"center",style:{color:"#555555"}},plotOptions:{line:{allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{},lineWidth:2,marker:{lineWidth:0,radius:4,lineColor:"#FFFFFF",states:{hover:{enabled:!0,lineWidthPlus:1,radiusPlus:2},select:{fillColor:"#FFFFFF",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:{align:"center",formatter:function(){return this.y===null?"":B.numberFormat(this.y,-1)},style:{color:"contrast",fontSize:"11px",fontWeight:"bold",textShadow:"0 0 6px contrast, 0 0 3px contrast"}, +verticalAlign:"bottom",x:0,y:0,padding:5},cropThreshold:300,pointRange:0,softThreshold:!0,states:{hover:{lineWidthPlus:1,marker:{},halo:{size:10,opacity:0.25}},select:{marker:{}}},stickyTracking:!0,turboThreshold:1E3}},labels:{style:{position:"absolute",color:"#3E576F"}},legend:{enabled:!0,align:"center",layout:"horizontal",labelFormatter:function(){return this.name},borderColor:"#909090",borderRadius:0,navigation:{activeColor:"#274b6d",inactiveColor:"#CCC"},shadow:!1,itemStyle:{color:"#333333",fontSize:"12px", +fontWeight:"bold"},itemHoverStyle:{color:"#000"},itemHiddenStyle:{color:"#CCC"},itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"45%"},style:{position:"absolute",backgroundColor:"white",opacity:0.5,textAlign:"center"}},tooltip:{enabled:!0,animation:ca,backgroundColor:"rgba(249, 249, 249, .85)",borderWidth:1,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L", +second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},footerFormat:"",headerFormat:'<span style="font-size: 10px">{point.key}</span><br/>',pointFormat:'<span style="color:{point.color}">\u25cf</span> {series.name}: <b>{point.y}</b><br/>',shadow:!0,snap:Mb?25:10,style:{color:"#333333",cursor:"default",fontSize:"12px",padding:"8px",pointerEvents:"none",whiteSpace:"nowrap"}},credits:{enabled:!0,text:"Highcharts.com", +href:"http://www.highcharts.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#909090",fontSize:"9px"}}};var aa=N.plotOptions,da=aa.line;Fb();ia.prototype={parsers:[{regex:/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/,parse:function(a){return[C(a[1]),C(a[2]),C(a[3]),parseFloat(a[4],10)]}},{regex:/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,parse:function(a){return[C(a[1],16),C(a[2],16),C(a[3],16), +1]}},{regex:/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,parse:function(a){return[C(a[1]),C(a[2]),C(a[3]),1]}}],init:function(a){var b,c,d,e;if((this.input=a)&&a.stops)this.stops=Ba(a.stops,function(a){return new ia(a[1])});else for(d=this.parsers.length;d--&&!c;)e=this.parsers[d],(b=e.regex.exec(a))&&(c=e.parse(b));this.rgba=c||[]},get:function(a){var b=this.input,c=this.rgba,d;this.stops?(d=D(b),d.stops=[].concat(d.stops),o(this.stops,function(b,c){d.stops[c]=[d.stops[c][0], +b.get(a)]})):d=c&&!isNaN(c[0])?a==="rgb"||!a&&c[3]===1?"rgb("+c[0]+","+c[1]+","+c[2]+")":a==="a"?c[3]:"rgba("+c.join(",")+")":b;return d},brighten:function(a){var b,c=this.rgba;if(this.stops)o(this.stops,function(b){b.brighten(a)});else if(ma(a)&&a!==0)for(b=0;b<3;b++)c[b]+=C(a*255),c[b]<0&&(c[b]=0),c[b]>255&&(c[b]=255);return this},setOpacity:function(a){this.rgba[3]=a;return this}};O.prototype={opacity:1,textProps:"direction,fontSize,fontWeight,fontFamily,fontStyle,color,lineHeight,width,textDecoration,textOverflow,textShadow".split(","), +init:function(a,b){this.element=b==="span"?Z(b):y.createElementNS(Fa,b);this.renderer=a},animate:function(a,b,c){b=p(b,this.renderer.globalAnimation,!0);Oa(this);if(b){b=D(b,{});if(c)b.complete=c;Wa(this,a,b)}else this.attr(a,null,c);return this},colorGradient:function(a,b,c){var d=this.renderer,e,f,g,h,i,k,j,l,m,n,r,s=[],p;a.linearGradient?f="linearGradient":a.radialGradient&&(f="radialGradient");if(f){g=a[f];i=d.gradients;j=a.stops;n=c.radialReference;Ia(g)&&(a[f]=g={x1:g[0],y1:g[1],x2:g[2],y2:g[3], +gradientUnits:"userSpaceOnUse"});f==="radialGradient"&&n&&!q(g.gradientUnits)&&(h=g,g=D(g,d.getRadialAttr(n,h),{gradientUnits:"userSpaceOnUse"}));for(r in g)r!=="id"&&s.push(r,g[r]);for(r in j)s.push(j[r]);s=s.join(",");i[s]?n=i[s].attr("id"):(g.id=n="highcharts-"+zb++,i[s]=k=d.createElement(f).attr(g).add(d.defs),k.radAttr=h,k.stops=[],o(j,function(a){a[1].indexOf("rgba")===0?(e=ia(a[1]),l=e.get("rgb"),m=e.get("a")):(l=a[1],m=1);a=d.createElement("stop").attr({offset:a[0],"stop-color":l,"stop-opacity":m}).add(k); +k.stops.push(a)}));p="url("+d.url+"#"+n+")";c.setAttribute(b,p);c.gradient=s;a.toString=function(){return p}}},applyTextShadow:function(a){var b=this.element,c,d=a.indexOf("contrast")!==-1,e={},f=this.renderer.forExport,g=f||b.style.textShadow!==z&&!ya;if(d)e.textShadow=a=a.replace(/contrast/g,this.renderer.getContrast(b.style.fill));if(mb||f)e.textRendering="geometricPrecision";g?this.css(e):(this.fakeTS=!0,this.ySetter=this.xSetter,c=[].slice.call(b.getElementsByTagName("tspan")),o(a.split(/\s?,\s?/g), +function(a){var d=b.firstChild,e,f,a=a.split(" ");e=a[a.length-1];(f=a[a.length-2])&&o(c,function(a,c){var g;c===0&&(a.setAttribute("x",b.getAttribute("x")),c=b.getAttribute("y"),a.setAttribute("y",c||0),c===null&&b.setAttribute("y",0));g=a.cloneNode(1);K(g,{"class":"highcharts-text-shadow",fill:e,stroke:e,"stroke-opacity":1/t(C(f),3),"stroke-width":f,"stroke-linejoin":"round"});b.insertBefore(g,d)})}))},attr:function(a,b,c){var d,e=this.element,f,g=this,h;typeof a==="string"&&b!==z&&(d=a,a={},a[d]= +b);if(typeof a==="string")g=(this[a+"Getter"]||this._defaultGetter).call(this,a,e);else{for(d in a){b=a[d];h=!1;this.symbolName&&/^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(d)&&(f||(this.symbolAttr(a),f=!0),h=!0);if(this.rotation&&(d==="x"||d==="y"))this.doTransform=!0;h||(h=this[d+"Setter"]||this._defaultSetter,h.call(this,b,d,e),this.shadows&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(d)&&this.updateShadows(d,b,h))}if(this.doTransform)this.updateTransform(),this.doTransform= +!1}c&&c();return g},updateShadows:function(a,b,c){for(var d=this.shadows,e=d.length;e--;)c.call(null,a==="height"?Math.max(b-(d[e].cutHeight||0),0):a==="d"?this.d:b,a,d[e])},addClass:function(a){var b=this.element,c=K(b,"class")||"";c.indexOf(a)===-1&&K(b,"class",c+" "+a);return this},symbolAttr:function(a){var b=this;o("x,y,r,start,end,width,height,innerR,anchorX,anchorY".split(","),function(c){b[c]=p(a[c],b[c])});b.attr({d:b.renderer.symbols[b.symbolName](b.x,b.y,b.width,b.height,b)})},clip:function(a){return this.attr("clip-path", +a?"url("+this.renderer.url+"#"+a.id+")":"none")},crisp:function(a){var b,c={},d,e=this.strokeWidth||0;d=A(e)%2/2;a.x=T(a.x||this.x||0)+d;a.y=T(a.y||this.y||0)+d;a.width=T((a.width||this.width||0)-2*d);a.height=T((a.height||this.height||0)-2*d);a.strokeWidth=e;for(b in a)this[b]!==a[b]&&(this[b]=c[b]=a[b]);return c},css:function(a){var b=this.styles,c={},d=this.element,e,f,g="";e=!b;if(a&&a.color)a.fill=a.color;if(b)for(f in a)a[f]!==b[f]&&(c[f]=a[f],e=!0);if(e){e=this.textWidth=a&&a.width&&d.nodeName.toLowerCase()=== +"text"&&C(a.width)||this.textWidth;b&&(a=u(b,c));this.styles=a;e&&(ha||!ca&&this.renderer.forExport)&&delete a.width;if(ya&&!ca)L(this.element,a);else{b=function(a,b){return"-"+b.toLowerCase()};for(f in a)g+=f.replace(/([A-Z])/g,b)+":"+a[f]+";";K(d,"style",g)}e&&this.added&&this.renderer.buildText(this)}return this},on:function(a,b){var c=this,d=c.element;db&&a==="click"?(d.ontouchstart=function(a){c.touchEventFired=qa.now();a.preventDefault();b.call(d,a)},d.onclick=function(a){(za.indexOf("Android")=== +-1||qa.now()-(c.touchEventFired||0)>1100)&&b.call(d,a)}):d["on"+a]=b;return this},setRadialReference:function(a){var b=this.renderer.gradients[this.element.gradient];this.element.radialReference=a;b&&b.radAttr&&b.animate(this.renderer.getRadialAttr(a,b.radAttr));return this},translate:function(a,b){return this.attr({translateX:a,translateY:b})},invert:function(){this.inverted=!0;this.updateTransform();return this},updateTransform:function(){var a=this.translateX||0,b=this.translateY||0,c=this.scaleX, +d=this.scaleY,e=this.inverted,f=this.rotation,g=this.element;e&&(a+=this.attr("width"),b+=this.attr("height"));a=["translate("+a+","+b+")"];e?a.push("rotate(90) scale(-1,1)"):f&&a.push("rotate("+f+" "+(g.getAttribute("x")||0)+" "+(g.getAttribute("y")||0)+")");(q(c)||q(d))&&a.push("scale("+p(c,1)+" "+p(d,1)+")");a.length&&g.setAttribute("transform",a.join(" "))},toFront:function(){var a=this.element;a.parentNode.appendChild(a);return this},align:function(a,b,c){var d,e,f,g,h={};e=this.renderer;f=e.alignedObjects; +if(a){if(this.alignOptions=a,this.alignByTranslate=b,!c||xa(c))this.alignTo=d=c||"renderer",oa(f,this),f.push(this),c=null}else a=this.alignOptions,b=this.alignByTranslate,d=this.alignTo;c=p(c,e[d],e);d=a.align;e=a.verticalAlign;f=(c.x||0)+(a.x||0);g=(c.y||0)+(a.y||0);if(d==="right"||d==="center")f+=(c.width-(a.width||0))/{right:1,center:2}[d];h[b?"translateX":"x"]=A(f);if(e==="bottom"||e==="middle")g+=(c.height-(a.height||0))/({bottom:1,middle:2}[e]||1);h[b?"translateY":"y"]=A(g);this[this.placed? +"animate":"attr"](h);this.placed=!0;this.alignAttr=h;return this},getBBox:function(a,b){var c,d=this.renderer,e,f,g,h=this.element,i=this.styles;e=this.textStr;var k,j=h.style,l,m=d.cache,n=d.cacheKeys,r;f=p(b,this.rotation);g=f*ga;e!==z&&(r=["",f||0,i&&i.fontSize,h.style.width].join(","),r=e===""||Rb.test(e)?"num:"+e.toString().length+r:e+r);r&&!a&&(c=m[r]);if(!c){if(h.namespaceURI===Fa||d.forExport){try{l=this.fakeTS&&function(a){o(h.querySelectorAll(".highcharts-text-shadow"),function(b){b.style.display= +a})},Ma&&j.textShadow?(k=j.textShadow,j.textShadow=""):l&&l("none"),c=h.getBBox?u({},h.getBBox()):{width:h.offsetWidth,height:h.offsetHeight},k?j.textShadow=k:l&&l("")}catch(s){}if(!c||c.width<0)c={width:0,height:0}}else c=this.htmlGetBBox();if(d.isSVG){d=c.width;e=c.height;if(ya&&i&&i.fontSize==="11px"&&e.toPrecision(3)==="16.9")c.height=e=14;if(f)c.width=P(e*$(g))+P(d*U(g)),c.height=P(e*U(g))+P(d*$(g))}if(r){for(;n.length>250;)delete m[n.shift()];m[r]||n.push(r);m[r]=c}}return c},show:function(a){return this.attr({visibility:a? +"inherit":"visible"})},hide:function(){return this.attr({visibility:"hidden"})},fadeOut:function(a){var b=this;b.animate({opacity:0},{duration:a||150,complete:function(){b.attr({y:-9999})}})},add:function(a){var b=this.renderer,c=this.element,d;if(a)this.parentGroup=a;this.parentInverted=a&&a.inverted;this.textStr!==void 0&&b.buildText(this);this.added=!0;if(!a||a.handleZ||this.zIndex)d=this.zIndexSetter();d||(a?a.element:b.box).appendChild(c);if(this.onAdd)this.onAdd();return this},safeRemoveChild:function(a){var b= +a.parentNode;b&&b.removeChild(a)},destroy:function(){var a=this,b=a.element||{},c=a.shadows,d=a.renderer.isSVG&&b.nodeName==="SPAN"&&a.parentGroup,e,f;b.onclick=b.onmouseout=b.onmouseover=b.onmousemove=b.point=null;Oa(a);if(a.clipPath)a.clipPath=a.clipPath.destroy();if(a.stops){for(f=0;f<a.stops.length;f++)a.stops[f]=a.stops[f].destroy();a.stops=null}a.safeRemoveChild(b);for(c&&o(c,function(b){a.safeRemoveChild(b)});d&&d.div&&d.div.childNodes.length===0;)b=d.parentGroup,a.safeRemoveChild(d.div),delete d.div, +d=b;a.alignTo&&oa(a.renderer.alignedObjects,a);for(e in a)delete a[e];return null},shadow:function(a,b,c){var d=[],e,f,g=this.element,h,i,k,j;if(a){i=p(a.width,3);k=(a.opacity||0.15)/i;j=this.parentInverted?"(-1,-1)":"("+p(a.offsetX,1)+", "+p(a.offsetY,1)+")";for(e=1;e<=i;e++){f=g.cloneNode(0);h=i*2+1-2*e;K(f,{isShadow:"true",stroke:a.color||"black","stroke-opacity":k*e,"stroke-width":h,transform:"translate"+j,fill:"none"});if(c)K(f,"height",t(K(f,"height")-h,0)),f.cutHeight=h;b?b.element.appendChild(f): +g.parentNode.insertBefore(f,g);d.push(f)}this.shadows=d}return this},xGetter:function(a){this.element.nodeName==="circle"&&(a={x:"cx",y:"cy"}[a]||a);return this._defaultGetter(a)},_defaultGetter:function(a){a=p(this[a],this.element?this.element.getAttribute(a):null,0);/^[\-0-9\.]+$/.test(a)&&(a=parseFloat(a));return a},dSetter:function(a,b,c){a&&a.join&&(a=a.join(" "));/(NaN| {2}|^$)/.test(a)&&(a="M 0 0");c.setAttribute(b,a);this[b]=a},dashstyleSetter:function(a){var b;if(a=a&&a.toLowerCase()){a= +a.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot","3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g,"1,3,").replace("dash","4,3,").replace(/,$/,"").split(",");for(b=a.length;b--;)a[b]=C(a[b])*this["stroke-width"];a=a.join(",").replace("NaN","none");this.element.setAttribute("stroke-dasharray",a)}},alignSetter:function(a){this.element.setAttribute("text-anchor",{left:"start",center:"middle",right:"end"}[a])},opacitySetter:function(a, +b,c){this[b]=a;c.setAttribute(b,a)},titleSetter:function(a){var b=this.element.getElementsByTagName("title")[0];b||(b=y.createElementNS(Fa,"title"),this.element.appendChild(b));b.appendChild(y.createTextNode(String(p(a),"").replace(/<[^>]*>/g,"")))},textSetter:function(a){if(a!==this.textStr)delete this.bBox,this.textStr=a,this.added&&this.renderer.buildText(this)},fillSetter:function(a,b,c){typeof a==="string"?c.setAttribute(b,a):a&&this.colorGradient(a,b,c)},visibilitySetter:function(a,b,c){a=== +"inherit"?c.removeAttribute(b):c.setAttribute(b,a)},zIndexSetter:function(a,b){var c=this.renderer,d=this.parentGroup,c=(d||c).element||c.box,e,f,g=this.element,h;e=this.added;var i;q(a)&&(g.setAttribute(b,a),a=+a,this[b]===a&&(e=!1),this[b]=a);if(e){if((a=this.zIndex)&&d)d.handleZ=!0;d=c.childNodes;for(i=0;i<d.length&&!h;i++)if(e=d[i],f=K(e,"zIndex"),e!==g&&(C(f)>a||!q(a)&&q(f)))c.insertBefore(g,e),h=!0;h||c.appendChild(g)}return h},_defaultSetter:function(a,b,c){c.setAttribute(b,a)}};O.prototype.yGetter= +O.prototype.xGetter;O.prototype.translateXSetter=O.prototype.translateYSetter=O.prototype.rotationSetter=O.prototype.verticalAlignSetter=O.prototype.scaleXSetter=O.prototype.scaleYSetter=function(a,b){this[b]=a;this.doTransform=!0};O.prototype["stroke-widthSetter"]=O.prototype.strokeSetter=function(a,b,c){this[b]=a;if(this.stroke&&this["stroke-width"])this.strokeWidth=this["stroke-width"],O.prototype.fillSetter.call(this,this.stroke,"stroke",c),c.setAttribute("stroke-width",this["stroke-width"]), +this.hasStroke=!0;else if(b==="stroke-width"&&a===0&&this.hasStroke)c.removeAttribute("stroke"),this.hasStroke=!1};var Ca=function(){this.init.apply(this,arguments)};Ca.prototype={Element:O,init:function(a,b,c,d,e,f){var g,d=this.createElement("svg").attr({version:"1.1"}).css(this.getStyle(d));g=d.element;a.appendChild(g);a.innerHTML.indexOf("xmlns")===-1&&K(g,"xmlns",Fa);this.isSVG=!0;this.box=g;this.boxWrapper=d;this.alignedObjects=[];this.url=(Ma||mb)&&y.getElementsByTagName("base").length?E.location.href.replace(/#.*?$/, +"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.createElement("desc").add().element.appendChild(y.createTextNode("Created with Highcharts 4.2.3"));this.defs=this.createElement("defs").add();this.allowHTML=f;this.forExport=e;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(b,c,!1);var h;if(Ma&&a.getBoundingClientRect)this.subPixelFix=b=function(){L(a,{left:0,top:0});h=a.getBoundingClientRect();L(a,{left:ua(h.left)-h.left+"px",top:ua(h.top)-h.top+"px"})},b(), +M(E,"resize",b)},getStyle:function(a){return this.style=u({fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',fontSize:"12px"},a)},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();Sa(this.gradients||{});this.gradients=null;if(a)this.defs=a.destroy();this.subPixelFix&&V(E,"resize",this.subPixelFix);return this.alignedObjects=null},createElement:function(a){var b=new this.Element; +b.init(this,a);return b},draw:function(){},getRadialAttr:function(a,b){return{cx:a[0]-a[2]/2+b.cx*a[2],cy:a[1]-a[2]/2+b.cy*a[2],r:b.r*a[2]}},buildText:function(a){for(var b=a.element,c=this,d=c.forExport,e=p(a.textStr,"").toString(),f=e.indexOf("<")!==-1,g=b.childNodes,h,i,k=K(b,"x"),j=a.styles,l=a.textWidth,m=j&&j.lineHeight,n=j&&j.textShadow,r=j&&j.textOverflow==="ellipsis",s=g.length,R=l&&!a.added&&this.box,v=function(a){return m?C(m):c.fontMetrics(/(px|em)$/.test(a&&a.style.fontSize)?a.style.fontSize: +j&&j.fontSize||c.style.fontSize||12,a).h},x=function(a){return a.replace(/</g,"<").replace(/>/g,">")};s--;)b.removeChild(g[s]);!f&&!n&&!r&&e.indexOf(" ")===-1?b.appendChild(y.createTextNode(x(e))):(h=/<.*style="([^"]+)".*>/,i=/<.*href="(http[^"]+)".*>/,R&&R.appendChild(b),e=f?e.replace(/<(b|strong)>/g,'<span style="font-weight:bold">').replace(/<(i|em)>/g,'<span style="font-style:italic">').replace(/<a/g,"<span").replace(/<\/(b|strong|i|em|a)>/g,"</span>").split(/<br.*?>/g):[e],e[e.length-1]=== +""&&e.pop(),o(e,function(e,f){var g,m=0,e=e.replace(/<span/g,"|||<span").replace(/<\/span>/g,"</span>|||");g=e.split("|||");o(g,function(e){if(e!==""||g.length===1){var n={},s=y.createElementNS(Fa,"tspan"),p;h.test(e)&&(p=e.match(h)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),K(s,"style",p));i.test(e)&&!d&&(K(s,"onclick",'location.href="'+e.match(i)[1]+'"'),L(s,{cursor:"pointer"}));e=x(e.replace(/<(.|\n)*?>/g,"")||" ");if(e!==" "){s.appendChild(y.createTextNode(e));if(m)n.dx=0;else if(f&&k!==null)n.x= +k;K(s,n);b.appendChild(s);!m&&f&&(!ca&&d&&L(s,{display:"block"}),K(s,"dy",v(s)));if(l){for(var n=e.replace(/([^\^])-/g,"$1- ").split(" "),R=g.length>1||f||n.length>1&&j.whiteSpace!=="nowrap",o,w,q,t=[],u=v(s),A=1,z=a.rotation,B=e,D=B.length;(R||r)&&(n.length||t.length);)a.rotation=0,o=a.getBBox(!0),q=o.width,!ca&&c.forExport&&(q=c.measureSpanWidth(s.firstChild.data,a.styles)),o=q>l,w===void 0&&(w=o),r&&w?(D/=2,B===""||!o&&D<0.5?n=[]:(o&&(w=!0),B=e.substring(0,B.length+(o?-1:1)*ua(D)),n=[B+(l>3?"\u2026": +"")],s.removeChild(s.firstChild))):!o||n.length===1?(n=t,t=[],n.length&&(A++,s=y.createElementNS(Fa,"tspan"),K(s,{dy:u,x:k}),p&&K(s,"style",p),b.appendChild(s)),q>l&&(l=q)):(s.removeChild(s.firstChild),t.unshift(n.pop())),n.length&&s.appendChild(y.createTextNode(n.join(" ").replace(/- /g,"-")));w&&a.attr("title",a.textStr);a.rotation=z}m++}}})}),R&&R.removeChild(b),n&&a.applyTextShadow&&a.applyTextShadow(n))},getContrast:function(a){a=ia(a).rgba;return a[0]+a[1]+a[2]>384?"#000000":"#FFFFFF"},button:function(a, +b,c,d,e,f,g,h,i){var k=this.label(a,b,c,i,null,null,null,null,"button"),j=0,l,m,n,r,s,p,a={x1:0,y1:0,x2:0,y2:1},e=D({"stroke-width":1,stroke:"#CCCCCC",fill:{linearGradient:a,stops:[[0,"#FEFEFE"],[1,"#F6F6F6"]]},r:2,padding:5,style:{color:"black"}},e);n=e.style;delete e.style;f=D(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#FFF"],[1,"#ACF"]]}},f);r=f.style;delete f.style;g=D(e,{stroke:"#68A",fill:{linearGradient:a,stops:[[0,"#9BD"],[1,"#CDF"]]}},g);s=g.style;delete g.style;h=D(e,{style:{color:"#CCC"}}, +h);p=h.style;delete h.style;M(k.element,ya?"mouseover":"mouseenter",function(){j!==3&&k.attr(f).css(r)});M(k.element,ya?"mouseout":"mouseleave",function(){j!==3&&(l=[e,f,g][j],m=[n,r,s][j],k.attr(l).css(m))});k.setState=function(a){(k.state=j=a)?a===2?k.attr(g).css(s):a===3&&k.attr(h).css(p):k.attr(e).css(n)};return k.on("click",function(a){j!==3&&d.call(k,a)}).attr(e).css(u({cursor:"default"},n))},crispLine:function(a,b){a[1]===a[4]&&(a[1]=a[4]=A(a[1])-b%2/2);a[2]===a[5]&&(a[2]=a[5]=A(a[2])+b%2/ +2);return a},path:function(a){var b={fill:"none"};Ia(a)?b.d=a:Y(a)&&u(b,a);return this.createElement("path").attr(b)},circle:function(a,b,c){a=Y(a)?a:{x:a,y:b,r:c};b=this.createElement("circle");b.xSetter=b.ySetter=function(a,b,c){c.setAttribute("c"+b,a)};return b.attr(a)},arc:function(a,b,c,d,e,f){if(Y(a))b=a.y,c=a.r,d=a.innerR,e=a.start,f=a.end,a=a.x;a=this.symbol("arc",a||0,b||0,c||0,c||0,{innerR:d||0,start:e||0,end:f||0});a.r=c;return a},rect:function(a,b,c,d,e,f){var e=Y(a)?a.r:e,g=this.createElement("rect"), +a=Y(a)?a:a===z?{}:{x:a,y:b,width:t(c,0),height:t(d,0)};if(f!==z)g.strokeWidth=f,a=g.crisp(a);if(e)a.r=e;g.rSetter=function(a,b,c){K(c,{rx:a,ry:a})};return g.attr(a)},setSize:function(a,b,c){var d=this.alignedObjects,e=d.length;this.width=a;this.height=b;for(this.boxWrapper[p(c,!0)?"animate":"attr"]({width:a,height:b});e--;)d[e].align()},g:function(a){var b=this.createElement("g");return q(a)?b.attr({"class":"highcharts-"+a}):b},image:function(a,b,c,d,e){var f={preserveAspectRatio:"none"};arguments.length> +1&&u(f,{x:b,y:c,width:d,height:e});f=this.createElement("image").attr(f);f.element.setAttributeNS?f.element.setAttributeNS("http://www.w3.org/1999/xlink","href",a):f.element.setAttribute("hc-svg-href",a);return f},symbol:function(a,b,c,d,e,f){var g=this,h,i=this.symbols[a],i=i&&i(A(b),A(c),d,e,f),k=/^url\((.*?)\)$/,j,l;if(i)h=this.path(i),u(h,{symbolName:a,x:b,y:c,width:d,height:e}),f&&u(h,f);else if(k.test(a))l=function(a,b){a.element&&(a.attr({width:b[0],height:b[1]}),a.alignByTranslate||a.translate(A((d- +b[0])/2),A((e-b[1])/2)))},j=a.match(k)[1],a=Nb[j]||f&&f.width&&f.height&&[f.width,f.height],h=this.image(j).attr({x:b,y:c}),h.isImg=!0,a?l(h,a):(h.attr({width:0,height:0}),Z("img",{onload:function(){this.width===0&&(L(this,{position:"absolute",top:"-999em"}),y.body.appendChild(this));l(h,Nb[j]=[this.width,this.height]);this.parentNode&&this.parentNode.removeChild(this);g.imgCount--;if(!g.imgCount)S[g.chartIndex].onload()},src:j})),this.imgCount++;return h},symbols:{circle:function(a,b,c,d){var e= +0.166*c;return["M",a+c/2,b,"C",a+c+e,b,a+c+e,b+d,a+c/2,b+d,"C",a-e,b+d,a-e,b,a+c/2,b,"Z"]},square:function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c,b+d,a,b+d,"Z"]},triangle:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d,a,b+d,"Z"]},"triangle-down":function(a,b,c,d){return["M",a,b,"L",a+c,b,a+c/2,b+d,"Z"]},diamond:function(a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d/2,a+c/2,b+d,a,b+d/2,"Z"]},arc:function(a,b,c,d,e){var f=e.start,c=e.r||c||d,g=e.end-0.001,d=e.innerR,h=e.open,i=U(f),k=$(f),j=U(g),g=$(g), +e=e.end-f<ra?0:1;return["M",a+c*i,b+c*k,"A",c,c,0,e,1,a+c*j,b+c*g,h?"M":"L",a+d*j,b+d*g,"A",d,d,0,e,0,a+d*i,b+d*k,h?"":"Z"]},callout:function(a,b,c,d,e){var f=F(e&&e.r||0,c,d),g=f+6,h=e&&e.anchorX,e=e&&e.anchorY,i;i=["M",a+f,b,"L",a+c-f,b,"C",a+c,b,a+c,b,a+c,b+f,"L",a+c,b+d-f,"C",a+c,b+d,a+c,b+d,a+c-f,b+d,"L",a+f,b+d,"C",a,b+d,a,b+d,a,b+d-f,"L",a,b+f,"C",a,b,a,b,a+f,b];h&&h>c&&e>b+g&&e<b+d-g?i.splice(13,3,"L",a+c,e-6,a+c+6,e,a+c,e+6,a+c,b+d-f):h&&h<0&&e>b+g&&e<b+d-g?i.splice(33,3,"L",a,e+6,a-6,e, +a,e-6,a,b+f):e&&e>d&&h>a+g&&h<a+c-g?i.splice(23,3,"L",h+6,b+d,h,b+d+6,h-6,b+d,a+f,b+d):e&&e<0&&h>a+g&&h<a+c-g&&i.splice(3,3,"L",h-6,b,h,b-6,h+6,b,c-f,b);return i}},clipRect:function(a,b,c,d){var e="highcharts-"+zb++,f=this.createElement("clipPath").attr({id:e}).add(this.defs),a=this.rect(a,b,c,d,0).add(f);a.id=e;a.clipPath=f;a.count=0;return a},text:function(a,b,c,d){var e=ha||!ca&&this.forExport,f={};if(d&&(this.allowHTML||!this.forExport))return this.html(a,b,c);f.x=Math.round(b||0);if(c)f.y=Math.round(c); +if(a||a===0)f.text=a;a=this.createElement("text").attr(f);e&&a.css({position:"absolute"});if(!d)a.xSetter=function(a,b,c){var d=c.getElementsByTagName("tspan"),e,f=c.getAttribute(b),m;for(m=0;m<d.length;m++)e=d[m],e.getAttribute(b)===f&&e.setAttribute(b,a);c.setAttribute(b,a)};return a},fontMetrics:function(a,b){var c,d,a=a||this.style.fontSize;!a&&b&&E.getComputedStyle&&(b=b.element||b,a=(c=E.getComputedStyle(b,""))&&c.fontSize);a=/px/.test(a)?C(a):/em/.test(a)?parseFloat(a)*12:12;c=a<24?a+3:A(a* +1.2);d=A(c*0.8);return{h:c,b:d,f:a}},rotCorr:function(a,b,c){var d=a;b&&c&&(d=t(d*U(b*ga),4));return{x:-a/3*$(b*ga),y:d}},label:function(a,b,c,d,e,f,g,h,i){var k=this,j=k.g(i),l=k.text("",0,0,g).attr({zIndex:1}),m,n,r=0,s=3,p=0,v,x,w,t,ba=0,gb={},B,y,Bb,F,E;Bb=function(){var a,b;a=l.element.style;n=(v===void 0||x===void 0||j.styles.textAlign)&&q(l.textStr)&&l.getBBox();j.width=(v||n.width||0)+2*s+p;j.height=(x||n.height||0)+2*s;B=s+k.fontMetrics(a&&a.fontSize,l).b;if(y){if(!m)a=ba,b=(h?-B:0)+ba,j.box= +m=d?k.symbol(d,a,b,j.width,j.height,gb):k.rect(a,b,j.width,j.height,0,gb["stroke-width"]),m.isImg||m.attr("fill","none"),m.add(j);m.isImg||m.attr(u({width:A(j.width),height:A(j.height)},gb));gb=null}};F=function(){var a=j.styles,a=a&&a.textAlign,b=p+s,c;c=h?0:B;if(q(v)&&n&&(a==="center"||a==="right"))b+={center:0.5,right:1}[a]*(v-n.width);if(b!==l.x||c!==l.y)l.attr("x",b),c!==z&&l.attr("y",c);l.x=b;l.y=c};E=function(a,b){m?m.attr(a,b):gb[a]=b};j.onAdd=function(){l.add(j);j.attr({text:a||a===0?a:"", +x:b,y:c});m&&q(e)&&j.attr({anchorX:e,anchorY:f})};j.widthSetter=function(a){v=a};j.heightSetter=function(a){x=a};j.paddingSetter=function(a){if(q(a)&&a!==s)s=j.padding=a,F()};j.paddingLeftSetter=function(a){q(a)&&a!==p&&(p=a,F())};j.alignSetter=function(a){a={left:0,center:0.5,right:1}[a];a!==r&&(r=a,n&&j.attr({x:b}))};j.textSetter=function(a){a!==z&&l.textSetter(a);Bb();F()};j["stroke-widthSetter"]=function(a,b){a&&(y=!0);ba=a%2/2;E(b,a)};j.strokeSetter=j.fillSetter=j.rSetter=function(a,b){b==="fill"&& +a&&(y=!0);E(b,a)};j.anchorXSetter=function(a,b){e=a;E(b,A(a)-ba-w)};j.anchorYSetter=function(a,b){f=a;E(b,a-t)};j.xSetter=function(a){j.x=a;r&&(a-=r*((v||n.width)+2*s));w=A(a);j.attr("translateX",w)};j.ySetter=function(a){t=j.y=A(a);j.attr("translateY",t)};var C=j.css;return u(j,{css:function(a){if(a){var b={},a=D(a);o(j.textProps,function(c){a[c]!==z&&(b[c]=a[c],delete a[c])});l.css(b)}return C.call(j,a)},getBBox:function(){return{width:n.width+2*s,height:n.height+2*s,x:n.x-s,y:n.y-s}},shadow:function(a){m&& +m.shadow(a);return j},destroy:function(){V(j.element,"mouseenter");V(j.element,"mouseleave");l&&(l=l.destroy());m&&(m=m.destroy());O.prototype.destroy.call(j);j=k=Bb=F=E=null}})}};cb=Ca;u(O.prototype,{htmlCss:function(a){var b=this.element;if(b=a&&b.tagName==="SPAN"&&a.width)delete a.width,this.textWidth=b,this.updateTransform();if(a&&a.textOverflow==="ellipsis")a.whiteSpace="nowrap",a.overflow="hidden";this.styles=u(this.styles,a);L(this.element,a);return this},htmlGetBBox:function(){var a=this.element; +if(a.nodeName==="text")a.style.position="absolute";return{x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}},htmlUpdateTransform:function(){if(this.added){var a=this.renderer,b=this.element,c=this.translateX||0,d=this.translateY||0,e=this.x||0,f=this.y||0,g=this.textAlign||"left",h={left:0,center:0.5,right:1}[g],i=this.shadows,k=this.styles;L(b,{marginLeft:c,marginTop:d});i&&o(i,function(a){L(a,{marginLeft:c+1,marginTop:d+1})});this.inverted&&o(b.childNodes,function(c){a.invertChild(c, +b)});if(b.tagName==="SPAN"){var i=this.rotation,j=C(this.textWidth),l=k&&k.whiteSpace,m=[i,g,b.innerHTML,this.textWidth,this.textAlign].join(",");if(m!==this.cTT){k=a.fontMetrics(b.style.fontSize).b;q(i)&&this.setSpanRotation(i,h,k);if(b.offsetWidth>j&&/[ \-]/.test(b.textContent||b.innerText))L(b,{width:j+"px",display:"block",whiteSpace:l||"normal"}),this.hasTextWidth=!0;else if(this.hasTextWidth)L(b,{width:"",display:"",whiteSpace:l||"nowrap"}),this.hasTextWidth=!1;this.getSpanCorrection(this.hasTextWidth? +j:b.offsetWidth,k,h,i,g)}L(b,{left:e+(this.xCorr||0)+"px",top:f+(this.yCorr||0)+"px"});if(mb)k=b.offsetHeight;this.cTT=m}}else this.alignOnAdd=!0},setSpanRotation:function(a,b,c){var d={},e=ya?"-ms-transform":mb?"-webkit-transform":Ma?"MozTransform":Lb?"-o-transform":"";d[e]=d.transform="rotate("+a+"deg)";d[e+(Ma?"Origin":"-origin")]=d.transformOrigin=b*100+"% "+c+"px";L(this.element,d)},getSpanCorrection:function(a,b,c){this.xCorr=-a*c;this.yCorr=-b}});u(Ca.prototype,{html:function(a,b,c){var d= +this.createElement("span"),e=d.element,f=d.renderer,g=function(a,b){o(["opacity","visibility"],function(c){fb(a,c+"Setter",function(a,c,d,e){a.call(this,c,d,e);b[d]=c})})};d.textSetter=function(a){a!==e.innerHTML&&delete this.bBox;e.innerHTML=this.textStr=a;d.htmlUpdateTransform()};g(d,d.element.style);d.xSetter=d.ySetter=d.alignSetter=d.rotationSetter=function(a,b){b==="align"&&(b="textAlign");d[b]=a;d.htmlUpdateTransform()};d.attr({text:a,x:A(b),y:A(c)}).css({position:"absolute",fontFamily:this.style.fontFamily, +fontSize:this.style.fontSize});e.style.whiteSpace="nowrap";d.css=d.htmlCss;if(f.isSVG)d.add=function(a){var b,c=f.box.parentNode,j=[];if(this.parentGroup=a){if(b=a.div,!b){for(;a;)j.push(a),a=a.parentGroup;o(j.reverse(),function(a){var d,e=K(a.element,"class");e&&(e={className:e});b=a.div=a.div||Z(La,e,{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px"},b||c);d=b.style;u(a,{translateXSetter:function(b,c){d.left=b+"px";a[c]=b;a.doTransform=!0},translateYSetter:function(b,c){d.top= +b+"px";a[c]=b;a.doTransform=!0}});g(a,d)})}}else b=c;b.appendChild(e);d.added=!0;d.alignOnAdd&&d.htmlUpdateTransform();return d};return d}});var J;if(!ca&&!ha){J={init:function(a,b){var c=["<",b,' filled="f" stroked="f"'],d=["position: ","absolute",";"],e=b===La;(b==="shape"||e)&&d.push("left:0;top:0;width:1px;height:1px;");d.push("visibility: ",e?"hidden":"visible");c.push(' style="',d.join(""),'"/>');if(b)c=e||b==="span"||b==="img"?c.join(""):a.prepVML(c),this.element=Z(c);this.renderer=a},add:function(a){var b= +this.renderer,c=this.element,d=b.box,e=a&&a.inverted,d=a?a.element||a:d;if(a)this.parentGroup=a;e&&b.invertChild(c,d);d.appendChild(c);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();if(this.onAdd)this.onAdd();return this},updateTransform:O.prototype.htmlUpdateTransform,setSpanRotation:function(){var a=this.rotation,b=U(a*ga),c=$(a*ga);L(this.element,{filter:a?["progid:DXImageTransform.Microsoft.Matrix(M11=",b,", M12=",-c,", M21=",c,", M22=",b,", sizingMethod='auto expand')"].join(""): +"none"})},getSpanCorrection:function(a,b,c,d,e){var f=d?U(d*ga):1,g=d?$(d*ga):0,h=p(this.elemHeight,this.element.offsetHeight),i;this.xCorr=f<0&&-a;this.yCorr=g<0&&-h;i=f*g<0;this.xCorr+=g*b*(i?1-c:c);this.yCorr-=f*b*(d?i?c:1-c:1);e&&e!=="left"&&(this.xCorr-=a*c*(f<0?-1:1),d&&(this.yCorr-=h*c*(g<0?-1:1)),L(this.element,{textAlign:e}))},pathToVML:function(a){for(var b=a.length,c=[];b--;)if(ma(a[b]))c[b]=A(a[b]*10)-5;else if(a[b]==="Z")c[b]="x";else if(c[b]=a[b],a.isArc&&(a[b]==="wa"||a[b]==="at"))c[b+ +5]===c[b+7]&&(c[b+7]+=a[b+7]>a[b+5]?1:-1),c[b+6]===c[b+8]&&(c[b+8]+=a[b+8]>a[b+6]?1:-1);return c.join(" ")||"x"},clip:function(a){var b=this,c;a?(c=a.members,oa(c,b),c.push(b),b.destroyClip=function(){oa(c,b)},a=a.getCSS(b)):(b.destroyClip&&b.destroyClip(),a={clip:lb?"inherit":"rect(auto)"});return b.css(a)},css:O.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&Ta(a)},destroy:function(){this.destroyClip&&this.destroyClip();return O.prototype.destroy.apply(this)},on:function(a,b){this.element["on"+ +a]=function(){var a=E.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,b){var c,a=a.split(/[ ,]/);c=a.length;if(c===9||c===11)a[c-4]=a[c-2]=C(a[c-2])-10*b;return a.join(" ")},shadow:function(a,b,c){var d=[],e,f=this.element,g=this.renderer,h,i=f.style,k,j=f.path,l,m,n,r;j&&typeof j.value!=="string"&&(j="x");m=j;if(a){n=p(a.width,3);r=(a.opacity||0.15)/n;for(e=1;e<=3;e++){l=n*2+1-2*e;c&&(m=this.cutOffPath(j.value,l+0.5));k=['<shape isShadow="true" strokeweight="',l,'" filled="false" path="', +m,'" coordsize="10 10" style="',f.style.cssText,'" />'];h=Z(g.prepVML(k),null,{left:C(i.left)+p(a.offsetX,1),top:C(i.top)+p(a.offsetY,1)});if(c)h.cutOff=l+1;k=['<stroke color="',a.color||"black",'" opacity="',r*e,'"/>'];Z(g.prepVML(k),null,null,h);b?b.element.appendChild(h):f.parentNode.insertBefore(h,f);d.push(h)}this.shadows=d}return this},updateShadows:Aa,setAttr:function(a,b){lb?this.element[a]=b:this.element.setAttribute(a,b)},classSetter:function(a){this.element.className=a},dashstyleSetter:function(a, +b,c){(c.getElementsByTagName("stroke")[0]||Z(this.renderer.prepVML(["<stroke/>"]),null,null,c))[b]=a||"solid";this[b]=a},dSetter:function(a,b,c){var d=this.shadows,a=a||[];this.d=a.join&&a.join(" ");c.path=a=this.pathToVML(a);if(d)for(c=d.length;c--;)d[c].path=d[c].cutOff?this.cutOffPath(a,d[c].cutOff):a;this.setAttr(b,a)},fillSetter:function(a,b,c){var d=c.nodeName;if(d==="SPAN")c.style.color=a;else if(d!=="IMG")c.filled=a!=="none",this.setAttr("fillcolor",this.renderer.color(a,c,b,this))},"fill-opacitySetter":function(a, +b,c){Z(this.renderer.prepVML(["<",b.split("-")[0],' opacity="',a,'"/>']),null,null,c)},opacitySetter:Aa,rotationSetter:function(a,b,c){c=c.style;this[b]=c[b]=a;c.left=-A($(a*ga)+1)+"px";c.top=A(U(a*ga))+"px"},strokeSetter:function(a,b,c){this.setAttr("strokecolor",this.renderer.color(a,c,b,this))},"stroke-widthSetter":function(a,b,c){c.stroked=!!a;this[b]=a;ma(a)&&(a+="px");this.setAttr("strokeweight",a)},titleSetter:function(a,b){this.setAttr(b,a)},visibilitySetter:function(a,b,c){a==="inherit"&& +(a="visible");this.shadows&&o(this.shadows,function(c){c.style[b]=a});c.nodeName==="DIV"&&(a=a==="hidden"?"-999em":0,lb||(c.style[b]=a?"visible":"hidden"),b="top");c.style[b]=a},xSetter:function(a,b,c){this[b]=a;b==="x"?b="left":b==="y"&&(b="top");this.updateClipping?(this[b]=a,this.updateClipping()):c.style[b]=a},zIndexSetter:function(a,b,c){c.style[b]=a}};J["stroke-opacitySetter"]=J["fill-opacitySetter"];B.VMLElement=J=pa(O,J);J.prototype.ySetter=J.prototype.widthSetter=J.prototype.heightSetter= +J.prototype.xSetter;var Cb={Element:J,isIE8:za.indexOf("MSIE 8.0")>-1,init:function(a,b,c,d){var e;this.alignedObjects=[];d=this.createElement(La).css(u(this.getStyle(d),{position:"relative"}));e=d.element;a.appendChild(d.element);this.isVML=!0;this.box=e;this.boxWrapper=d;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(b,c,!1);if(!y.namespaces.hcv){y.namespaces.add("hcv","urn:schemas-microsoft-com:vml");try{y.createStyleSheet().cssText="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}catch(f){y.styleSheets[0].cssText+= +"hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}}},isHidden:function(){return!this.box.offsetWidth},clipRect:function(a,b,c,d){var e=this.createElement(),f=Y(a);return u(e,{members:[],count:0,left:(f?a.x:a)+1,top:(f?a.y:b)+1,width:(f?a.width:c)-1,height:(f?a.height:d)-1,getCSS:function(a){var b=a.element,c=b.nodeName,a=a.inverted,d=this.top-(c==="shape"?b.offsetTop:0),e=this.left,b=e+this.width,f=d+this.height,d={clip:"rect("+A(a?e:d)+"px,"+ +A(a?f:b)+"px,"+A(a?b:f)+"px,"+A(a?d:e)+"px)"};!a&&lb&&c==="DIV"&&u(d,{width:b+"px",height:f+"px"});return d},updateClipping:function(){o(e.members,function(a){a.element&&a.css(e.getCSS(a))})}})},color:function(a,b,c,d){var e=this,f,g=/^rgba/,h,i,k="none";a&&a.linearGradient?i="gradient":a&&a.radialGradient&&(i="pattern");if(i){var j,l,m=a.linearGradient||a.radialGradient,n,r,s,p,v,x="",a=a.stops,w,q=[],ba=function(){h=['<fill colors="'+q.join(",")+'" opacity="',s,'" o:opacity2="',r,'" type="',i,'" ', +x,'focus="100%" method="any" />'];Z(e.prepVML(h),null,null,b)};n=a[0];w=a[a.length-1];n[0]>0&&a.unshift([0,n[1]]);w[0]<1&&a.push([1,w[1]]);o(a,function(a,b){g.test(a[1])?(f=ia(a[1]),j=f.get("rgb"),l=f.get("a")):(j=a[1],l=1);q.push(a[0]*100+"% "+j);b?(s=l,p=j):(r=l,v=j)});if(c==="fill")if(i==="gradient")c=m.x1||m[0]||0,a=m.y1||m[1]||0,n=m.x2||m[2]||0,m=m.y2||m[3]||0,x='angle="'+(90-W.atan((m-a)/(n-c))*180/ra)+'"',ba();else{var k=m.r,t=k*2,u=k*2,A=m.cx,B=m.cy,z=b.radialReference,y,k=function(){z&&(y= +d.getBBox(),A+=(z[0]-y.x)/y.width-0.5,B+=(z[1]-y.y)/y.height-0.5,t*=z[2]/y.width,u*=z[2]/y.height);x='src="'+N.global.VMLRadialGradientURL+'" size="'+t+","+u+'" origin="0.5,0.5" position="'+A+","+B+'" color2="'+v+'" ';ba()};d.added?k():d.onAdd=k;k=p}else k=j}else if(g.test(a)&&b.tagName!=="IMG")f=ia(a),d[c+"-opacitySetter"](f.get("a"),c,b),k=f.get("rgb");else{k=b.getElementsByTagName(c);if(k.length)k[0].opacity=1,k[0].type="solid";k=a}return k},prepVML:function(a){var b=this.isIE8,a=a.join("");b? +(a=a.replace("/>",' xmlns="urn:schemas-microsoft-com:vml" />'),a=a.indexOf('style="')===-1?a.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'):a.replace('style="','style="display:inline-block;behavior:url(#default#VML);')):a=a.replace("<","<hcv:");return a},text:Ca.prototype.html,path:function(a){var b={coordsize:"10 10"};Ia(a)?b.d=a:Y(a)&&u(b,a);return this.createElement("shape").attr(b)},circle:function(a,b,c){var d=this.symbol("circle");if(Y(a))c=a.r,b=a.y,a=a.x;d.isCircle= +!0;d.r=c;return d.attr({x:a,y:b})},g:function(a){var b;a&&(b={className:"highcharts-"+a,"class":"highcharts-"+a});return this.createElement(La).attr(b)},image:function(a,b,c,d,e){var f=this.createElement("img").attr({src:a});arguments.length>1&&f.attr({x:b,y:c,width:d,height:e});return f},createElement:function(a){return a==="rect"?this.symbol(a):Ca.prototype.createElement.call(this,a)},invertChild:function(a,b){var c=this,d=b.style,e=a.tagName==="IMG"&&a.style;L(a,{flip:"x",left:C(d.width)-(e?C(e.top): +1),top:C(d.height)-(e?C(e.left):1),rotation:-90});o(a.childNodes,function(b){c.invertChild(b,a)})},symbols:{arc:function(a,b,c,d,e){var f=e.start,g=e.end,h=e.r||c||d,c=e.innerR,d=U(f),i=$(f),k=U(g),j=$(g);if(g-f===0)return["x"];f=["wa",a-h,b-h,a+h,b+h,a+h*d,b+h*i,a+h*k,b+h*j];e.open&&!c&&f.push("e","M",a,b);f.push("at",a-c,b-c,a+c,b+c,a+c*k,b+c*j,a+c*d,b+c*i,"x","e");f.isArc=!0;return f},circle:function(a,b,c,d,e){e&&(c=d=2*e.r);e&&e.isCircle&&(a-=c/2,b-=d/2);return["wa",a,b,a+c,b+d,a+c,b+d/2,a+c, +b+d/2,"e"]},rect:function(a,b,c,d,e){return Ca.prototype.symbols[!q(e)||!e.r?"square":"callout"].call(0,a,b,c,d,e)}}};B.VMLRenderer=J=function(){this.init.apply(this,arguments)};J.prototype=D(Ca.prototype,Cb);cb=J}Ca.prototype.measureSpanWidth=function(a,b){var c=y.createElement("span"),d;d=y.createTextNode(a);c.appendChild(d);L(c,b);this.box.appendChild(c);d=c.offsetWidth;Ta(c);return d};var Ob;if(ha)B.CanVGRenderer=J=function(){Fa="http://www.w3.org/1999/xhtml"},J.prototype.symbols={},Ob=function(){function a(){var a= +b.length,d;for(d=0;d<a;d++)b[d]();b=[]}var b=[];return{push:function(c,d){if(b.length===0){var e=y.getElementsByTagName("head")[0],f=y.createElement("script");f.type="text/javascript";f.src=d;f.onload=a;e.appendChild(f)}b.push(c)}}}(),cb=J;Va.prototype={addLabel:function(){var a=this.axis,b=a.options,c=a.chart,d=a.categories,e=a.names,f=this.pos,g=b.labels,h=a.tickPositions,i=f===h[0],k=f===h[h.length-1],e=d?p(d[f],e[f],f):f,d=this.label,h=h.info,j;a.isDatetimeAxis&&h&&(j=b.dateTimeLabelFormats[h.higherRanks[f]|| +h.unitName]);this.isFirst=i;this.isLast=k;b=a.labelFormatter.call({axis:a,chart:c,isFirst:i,isLast:k,dateTimeLabelFormat:j,value:a.isLog?fa(na(e)):e});q(d)?d&&d.attr({text:b}):(this.labelLength=(this.label=d=q(b)&&g.enabled?c.renderer.text(b,0,0,g.useHTML).css(D(g.style)).add(a.labelGroup):null)&&d.getBBox().width,this.rotation=0)},getLabelSize:function(){return this.label?this.label.getBBox()[this.axis.horiz?"height":"width"]:0},handleOverflow:function(a){var b=this.axis,c=a.x,d=b.chart.chartWidth, +e=b.chart.spacing,f=p(b.labelLeft,F(b.pos,e[3])),e=p(b.labelRight,t(b.pos+b.len,d-e[1])),g=this.label,h=this.rotation,i={left:0,center:0.5,right:1}[b.labelAlign],k=g.getBBox().width,j=b.slotWidth,l=1,m,n={};if(h)h<0&&c-i*k<f?m=A(c/U(h*ga)-f):h>0&&c+i*k>e&&(m=A((d-c)/U(h*ga)));else if(d=c+(1-i)*k,c-i*k<f?j=a.x+j*(1-i)-f:d>e&&(j=e-a.x+j*i,l=-1),j=F(b.slotWidth,j),j<b.slotWidth&&b.labelAlign==="center"&&(a.x+=l*(b.slotWidth-j-i*(b.slotWidth-F(k,j)))),k>j||b.autoRotation&&g.styles.width)m=j;if(m){n.width= +m;if(!b.options.labels.style.textOverflow)n.textOverflow="ellipsis";g.css(n)}},getPosition:function(a,b,c,d){var e=this.axis,f=e.chart,g=d&&f.oldChartHeight||f.chartHeight;return{x:a?e.translate(b+c,null,null,d)+e.transB:e.left+e.offset+(e.opposite?(d&&f.oldChartWidth||f.chartWidth)-e.right-e.left:0),y:a?g-e.bottom+e.offset-(e.opposite?e.height:0):g-e.translate(b+c,null,null,d)-e.transB}},getLabelPosition:function(a,b,c,d,e,f,g,h){var i=this.axis,k=i.transA,j=i.reversed,l=i.staggerLines,m=i.tickRotCorr|| +{x:0,y:0},n=e.y;q(n)||(n=i.side===2?m.y+8:n=U(c.rotation*ga)*(m.y-c.getBBox(!1,0).height/2));a=a+e.x+m.x-(f&&d?f*k*(j?-1:1):0);b=b+n-(f&&!d?f*k*(j?1:-1):0);l&&(c=g/(h||1)%l,i.opposite&&(c=l-c-1),b+=c*(i.labelOffset/l));return{x:a,y:A(b)}},getMarkPath:function(a,b,c,d,e,f){return f.crispLine(["M",a,b,"L",a+(e?0:-c),b+(e?c:0)],d)},render:function(a,b,c){var d=this.axis,e=d.options,f=d.chart.renderer,g=d.horiz,h=this.type,i=this.label,k=this.pos,j=e.labels,l=this.gridLine,m=h?h+"Grid":"grid",n=h?h+"Tick": +"tick",r=e[m+"LineWidth"],s=e[m+"LineColor"],o=e[m+"LineDashStyle"],v=e[n+"Length"],m=p(e[n+"Width"],!h&&d.isXAxis?1:0),x=e[n+"Color"],w=e[n+"Position"],n=this.mark,q=j.step,ba=!0,t=d.tickmarkOffset,u=this.getPosition(g,k,t,b),A=u.x,u=u.y,B=g&&A===d.pos+d.len||!g&&u===d.pos?-1:1,c=p(c,1);this.isActive=!0;if(r){k=d.getPlotLinePath(k+t,r*B,b,!0);if(l===z){l={stroke:s,"stroke-width":r};if(o)l.dashstyle=o;if(!h)l.zIndex=1;if(b)l.opacity=0;this.gridLine=l=r?f.path(k).attr(l).add(d.gridGroup):null}if(!b&& +l&&k)l[this.isNew?"attr":"animate"]({d:k,opacity:c})}if(m&&v)w==="inside"&&(v=-v),d.opposite&&(v=-v),h=this.getMarkPath(A,u,v,m*B,g,f),n?n.animate({d:h,opacity:c}):this.mark=f.path(h).attr({stroke:x,"stroke-width":m,opacity:c}).add(d.axisGroup);if(i&&!isNaN(A))i.xy=u=this.getLabelPosition(A,u,i,g,j,t,a,q),this.isFirst&&!this.isLast&&!p(e.showFirstLabel,1)||this.isLast&&!this.isFirst&&!p(e.showLastLabel,1)?ba=!1:g&&!d.isRadial&&!j.step&&!j.rotation&&!b&&c!==0&&this.handleOverflow(u),q&&a%q&&(ba=!1), +ba&&!isNaN(u.y)?(u.opacity=c,i[this.isNew?"attr":"animate"](u),this.isNew=!1):i.attr("y",-9999)},destroy:function(){Sa(this,this.axis)}};B.PlotLineOrBand=function(a,b){this.axis=a;if(b)this.options=b,this.id=b.id};B.PlotLineOrBand.prototype={render:function(){var a=this,b=a.axis,c=b.horiz,d=a.options,e=d.label,f=a.label,g=d.width,h=d.to,i=d.from,k=q(i)&&q(h),j=d.value,l=d.dashStyle,m=a.svgElem,n=[],r,s=d.color,o=p(d.zIndex,0),v=d.events,x={},w=b.chart.renderer;b.isLog&&(i=Da(i),h=Da(h),j=Da(j));if(g){if(n= +b.getPlotLinePath(j,g),x={stroke:s,"stroke-width":g},l)x.dashstyle=l}else if(k){n=b.getPlotBandPath(i,h,d);if(s)x.fill=s;if(d.borderWidth)x.stroke=d.borderColor,x["stroke-width"]=d.borderWidth}else return;x.zIndex=o;if(m)if(n)m.show(),m.animate({d:n});else{if(m.hide(),f)a.label=f=f.destroy()}else if(n&&n.length&&(a.svgElem=m=w.path(n).attr(x).add(),v))for(r in d=function(b){m.on(b,function(c){v[b].apply(a,[c])})},v)d(r);e&&q(e.text)&&n&&n.length&&b.width>0&&b.height>0&&!n.flat?(e=D({align:c&&k&&"center", +x:c?!k&&4:10,verticalAlign:!c&&k&&"middle",y:c?k?16:10:k?6:-4,rotation:c&&!k&&90},e),this.renderLabel(e,n,k,o)):f&&f.hide();return a},renderLabel:function(a,b,c,d){var e=this.label,f=this.axis.chart.renderer;if(!e)e={align:a.textAlign||a.align,rotation:a.rotation},e.zIndex=d,this.label=e=f.text(a.text,0,0,a.useHTML).attr(e).css(a.style).add();d=[b[1],b[4],c?b[6]:b[1]];b=[b[2],b[5],c?b[7]:b[2]];c=Ra(d);f=Ra(b);e.align(a,!1,{x:c,y:f,width:Ea(d)-c,height:Ea(b)-f});e.show()},destroy:function(){oa(this.axis.plotLinesAndBands, +this);delete this.axis;Sa(this)}};var ka=B.Axis=function(){this.init.apply(this,arguments)};ka.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M",hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",year:"%Y"},endOnTick:!1,gridLineColor:"#D8D8D8",labels:{enabled:!0,style:{color:"#606060",cursor:"default",fontSize:"11px"},x:0,y:15},lineColor:"#C0D0E0",lineWidth:1,minPadding:0.01,maxPadding:0.01,minorGridLineColor:"#E0E0E0",minorGridLineWidth:1, +minorTickColor:"#A0A0A0",minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickColor:"#C0D0E0",tickLength:10,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",title:{align:"middle",style:{color:"#707070"}},type:"linear"},defaultYAxisOptions:{endOnTick:!0,gridLineWidth:1,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8,y:3},lineWidth:0,maxPadding:0.05,minPadding:0.05,startOnTick:!0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return B.numberFormat(this.total, +-1)},style:D(aa.line.dataLabels.style,{color:"#000000"})}},defaultLeftAxisOptions:{labels:{x:-15,y:null},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:15,y:null},title:{rotation:90}},defaultBottomAxisOptions:{labels:{autoRotation:[-45],x:0,y:null},title:{rotation:0}},defaultTopAxisOptions:{labels:{autoRotation:[-45],x:0,y:-15},title:{rotation:0}},init:function(a,b){var c=b.isX;this.chart=a;this.horiz=a.inverted?!c:c;this.coll=(this.isXAxis=c)?"xAxis":"yAxis";this.opposite=b.opposite;this.side= +b.side||(this.horiz?this.opposite?0:2:this.opposite?1:3);this.setOptions(b);var d=this.options,e=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter;this.userOptions=b;this.minPixelPadding=0;this.reversed=d.reversed;this.visible=d.visible!==!1;this.zoomEnabled=d.zoomEnabled!==!1;this.categories=d.categories||e==="category";this.names=this.names||[];this.isLog=e==="logarithmic";this.isDatetimeAxis=e==="datetime";this.isLinked=q(d.linkedTo);this.ticks={};this.labelEdge=[];this.minorTicks= +{};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom;this.range=d.range;this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.stacksTouched=0;this.min=this.max=null;this.crosshair=p(d.crosshair,ta(a.options.tooltip.crosshairs)[c?0:1],!1);var f,d=this.options.events;sa(this,a.axes)===-1&&(c&&!this.isColorAxis?a.axes.splice(a.xAxis.length,0,this):a.axes.push(this),a[this.coll].push(this));this.series=this.series||[];if(a.inverted&& +c&&this.reversed===z)this.reversed=!0;this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(f in d)M(this,f,d[f]);if(this.isLog)this.val2lin=Da,this.lin2val=na},setOptions:function(a){this.options=D(this.defaultOptions,this.isXAxis?{}:this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],D(N[this.coll],a))},defaultLabelFormatter:function(){var a=this.axis,b=this.value,c=a.categories,d= +this.dateTimeLabelFormat,e=N.lang.numericSymbols,f=e&&e.length,g,h=a.options.labels.format,a=a.isLog?b:a.tickInterval;if(h)g=Ka(h,this);else if(c)g=b;else if(d)g=Qa(d,b);else if(f&&a>=1E3)for(;f--&&g===z;)c=Math.pow(1E3,f+1),a>=c&&b*10%c===0&&e[f]!==null&&(g=B.numberFormat(b/c,-1)+e[f]);g===z&&(g=P(b)>=1E4?B.numberFormat(b,-1):B.numberFormat(b,-1,z,""));return g},getSeriesExtremes:function(){var a=this,b=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis; +a.buildStacks&&a.buildStacks();o(a.series,function(c){if(c.visible||!b.options.chart.ignoreHiddenSeries){var d=c.options,e=d.threshold,f;a.hasVisibleSeries=!0;a.isLog&&e<=0&&(e=null);if(a.isXAxis){if(d=c.xData,d.length)a.dataMin=F(p(a.dataMin,d[0]),Ra(d)),a.dataMax=t(p(a.dataMax,d[0]),Ea(d))}else{c.getExtremes();f=c.dataMax;c=c.dataMin;if(q(c)&&q(f))a.dataMin=F(p(a.dataMin,c),c),a.dataMax=t(p(a.dataMax,f),f);if(q(e))a.threshold=e;if(!d.softThreshold||a.isLog)a.softThreshold=!1}}})},translate:function(a, +b,c,d,e,f){var g=this.linkedParent||this,h=1,i=0,k=d?g.oldTransA:g.transA,d=d?g.oldMin:g.min,j=g.minPixelPadding,e=(g.isOrdinal||g.isBroken||g.isLog&&e)&&g.lin2val;if(!k)k=g.transA;if(c)h*=-1,i=g.len;g.reversed&&(h*=-1,i-=h*(g.sector||g.len));b?(a=a*h+i,a-=j,a=a/k+d,e&&(a=g.lin2val(a))):(e&&(a=g.val2lin(a)),f==="between"&&(f=0.5),a=h*(a-d)*k+i+h*j+(ma(f)?k*f*g.pointRange:0));return a},toPixels:function(a,b){return this.translate(a,!1,!this.horiz,null,!0)+(b?0:this.pos)},toValue:function(a,b){return this.translate(a- +(b?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,b,c,d,e){var f=this.chart,g=this.left,h=this.top,i,k,j=c&&f.oldChartHeight||f.chartHeight,l=c&&f.oldChartWidth||f.chartWidth,m;i=this.transB;var n=function(a,b,c){if(a<b||a>c)d?a=F(t(b,a),c):m=!0;return a},e=p(e,this.translate(a,null,null,c)),a=c=A(e+i);i=k=A(j-e-i);isNaN(e)?m=!0:this.horiz?(i=h,k=j-this.bottom,a=c=n(a,g,g+this.width)):(a=g,c=l-this.right,i=k=n(i,h,h+this.height));return m&&!d?null:f.renderer.crispLine(["M",a,i,"L", +c,k],b||1)},getLinearTickPositions:function(a,b,c){var d,e=fa(T(b/a)*a),f=fa(ua(c/a)*a),g=[];if(b===c&&ma(b))return[b];for(b=e;b<=f;){g.push(b);b=fa(b+a);if(b===d)break;d=b}return g},getMinorTickPositions:function(){var a=this.options,b=this.tickPositions,c=this.minorTickInterval,d=[],e,f=this.pointRangePadding||0;e=this.min-f;var f=this.max+f,g=f-e;if(g&&g/c<this.len/3)if(this.isLog){f=b.length;for(e=1;e<f;e++)d=d.concat(this.getLogTickPositions(c,b[e-1],b[e],!0))}else if(this.isDatetimeAxis&&a.minorTickInterval=== +"auto")d=d.concat(this.getTimeTicks(this.normalizeTimeTickInterval(c),e,f,a.startOfWeek));else for(b=e+(b[0]-e)%c;b<=f;b+=c)d.push(b);d.length!==0&&this.trimTicks(d,a.startOnTick,a.endOnTick);return d},adjustForMinRange:function(){var a=this.options,b=this.min,c=this.max,d,e=this.dataMax-this.dataMin>=this.minRange,f,g,h,i,k,j;if(this.isXAxis&&this.minRange===z&&!this.isLog)q(a.min)||q(a.max)?this.minRange=null:(o(this.series,function(a){i=a.xData;for(g=k=a.xIncrement?1:i.length-1;g>0;g--)if(h=i[g]- +i[g-1],f===z||h<f)f=h}),this.minRange=F(f*5,this.dataMax-this.dataMin));if(c-b<this.minRange){j=this.minRange;d=(j-c+b)/2;d=[b-d,p(a.min,b-d)];if(e)d[2]=this.dataMin;b=Ea(d);c=[b+j,p(a.max,b+j)];if(e)c[2]=this.dataMax;c=Ra(c);c-b<j&&(d[0]=c-j,d[1]=p(a.min,c-j),b=Ea(d))}this.min=b;this.max=c},setAxisTranslation:function(a){var b=this,c=b.max-b.min,d=b.axisPointRange||0,e,f=0,g=0,h=b.linkedParent,i=!!b.categories,k=b.transA,j=b.isXAxis;if(j||i||d)if(h?(f=h.minPointOffset,g=h.pointRangePadding):(o(b.series, +function(a){var b=a.closestPointRange;!a.noSharedTooltip&&q(b)&&(e=q(e)?F(e,b):b)}),o(b.series,function(a){var c=i?1:j?p(a.options.pointRange,e,0):b.axisPointRange||0,a=a.options.pointPlacement;d=t(d,c);b.single||(f=t(f,xa(a)?0:c/2),g=t(g,a==="on"?0:c))})),h=b.ordinalSlope&&e?b.ordinalSlope/e:1,b.minPointOffset=f*=h,b.pointRangePadding=g*=h,b.pointRange=F(d,c),j)b.closestPointRange=e;if(a)b.oldTransA=k;b.translationSlope=b.transA=k=b.len/(c+g||1);b.transB=b.horiz?b.left:b.bottom;b.minPixelPadding= +k*f},minFromRange:function(){return this.max-this.range},setTickInterval:function(a){var b=this,c=b.chart,d=b.options,e=b.isLog,f=b.isDatetimeAxis,g=b.isXAxis,h=b.isLinked,i=d.maxPadding,k=d.minPadding,j=d.tickInterval,l=d.tickPixelInterval,m=b.categories,n=b.threshold,r=b.softThreshold,s,R,v,x;!f&&!m&&!h&&this.getTickAmount();v=p(b.userMin,d.min);x=p(b.userMax,d.max);h?(b.linkedParent=c[b.coll][d.linkedTo],c=b.linkedParent.getExtremes(),b.min=p(c.min,c.dataMin),b.max=p(c.max,c.dataMax),d.type!== +b.linkedParent.options.type&&X(11,1)):(!r&&q(n)&&(b.dataMin>=n?(s=n,k=0):b.dataMax<=n&&(R=n,i=0)),b.min=p(v,s,b.dataMin),b.max=p(x,R,b.dataMax));if(e)!a&&F(b.min,p(b.dataMin,b.min))<=0&&X(10,1),b.min=fa(Da(b.min),15),b.max=fa(Da(b.max),15);if(b.range&&q(b.max))b.userMin=b.min=v=t(b.min,b.minFromRange()),b.userMax=x=b.max,b.range=null;b.beforePadding&&b.beforePadding();b.adjustForMinRange();if(!m&&!b.axisPointRange&&!b.usePercentage&&!h&&q(b.min)&&q(b.max)&&(c=b.max-b.min))!q(v)&&k&&(b.min-=c*k),!q(x)&& +i&&(b.max+=c*i);if(ma(d.floor))b.min=t(b.min,d.floor);if(ma(d.ceiling))b.max=F(b.max,d.ceiling);if(r&&q(b.dataMin))if(n=n||0,!q(v)&&b.min<n&&b.dataMin>=n)b.min=n;else if(!q(x)&&b.max>n&&b.dataMax<=n)b.max=n;b.tickInterval=b.min===b.max||b.min===void 0||b.max===void 0?1:h&&!j&&l===b.linkedParent.options.tickPixelInterval?j=b.linkedParent.tickInterval:p(j,this.tickAmount?(b.max-b.min)/t(this.tickAmount-1,1):void 0,m?1:(b.max-b.min)*l/t(b.len,l));g&&!a&&o(b.series,function(a){a.processData(b.min!==b.oldMin|| +b.max!==b.oldMax)});b.setAxisTranslation(!0);b.beforeSetTickPositions&&b.beforeSetTickPositions();if(b.postProcessTickInterval)b.tickInterval=b.postProcessTickInterval(b.tickInterval);if(b.pointRange&&!j)b.tickInterval=t(b.pointRange,b.tickInterval);a=p(d.minTickInterval,b.isDatetimeAxis&&b.closestPointRange);if(!j&&b.tickInterval<a)b.tickInterval=a;if(!f&&!e&&!j)b.tickInterval=sb(b.tickInterval,null,rb(b.tickInterval),p(d.allowDecimals,!(b.tickInterval>0.5&&b.tickInterval<5&&b.max>1E3&&b.max<9999)), +!!this.tickAmount);if(!this.tickAmount&&this.len)b.tickInterval=b.unsquish();this.setTickPositions()},setTickPositions:function(){var a=this.options,b,c=a.tickPositions,d=a.tickPositioner,e=a.startOnTick,f=a.endOnTick,g;this.tickmarkOffset=this.categories&&a.tickmarkPlacement==="between"&&this.tickInterval===1?0.5:0;this.minorTickInterval=a.minorTickInterval==="auto"&&this.tickInterval?this.tickInterval/5:a.minorTickInterval;this.tickPositions=b=c&&c.slice();if(!b&&(b=this.isDatetimeAxis?this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval, +a.units),this.min,this.max,a.startOfWeek,this.ordinalPositions,this.closestPointRange,!0):this.isLog?this.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max),b.length>this.len&&(b=[b[0],b.pop()]),this.tickPositions=b,d&&(d=d.apply(this,[this.min,this.max]))))this.tickPositions=b=d;if(!this.isLinked)this.trimTicks(b,e,f),this.min===this.max&&q(this.min)&&!this.tickAmount&&(g=!0,this.min-=0.5,this.max+=0.5),this.single=g,!c&&!d&& +this.adjustTickAmount()},trimTicks:function(a,b,c){var d=a[0],e=a[a.length-1],f=this.minPointOffset||0;if(b)this.min=d;else for(;this.min-f>a[0];)a.shift();if(c)this.max=e;else for(;this.max+f<a[a.length-1];)a.pop();a.length===0&&q(d)&&a.push((e+d)/2)},alignToOthers:function(){var a={},b,c=this.options;this.chart.options.chart.alignTicks!==!1&&c.alignTicks!==!1&&o(this.chart[this.coll],function(c){var e=c.options,e=[c.horiz?e.left:e.top,e.width,e.height,e.pane].join(",");c.series.length&&(a[e]?b= +!0:a[e]=1)});return b},getTickAmount:function(){var a=this.options,b=a.tickAmount,c=a.tickPixelInterval;!q(a.tickInterval)&&this.len<c&&!this.isRadial&&!this.isLog&&a.startOnTick&&a.endOnTick&&(b=2);!b&&this.alignToOthers()&&(b=ua(this.len/c)+1);if(b<4)this.finalTickAmt=b,b=5;this.tickAmount=b},adjustTickAmount:function(){var a=this.tickInterval,b=this.tickPositions,c=this.tickAmount,d=this.finalTickAmt,e=b&&b.length;if(e<c){for(;b.length<c;)b.push(fa(b[b.length-1]+a));this.transA*=(e-1)/(c-1);this.max= +b[b.length-1]}else e>c&&(this.tickInterval*=2,this.setTickPositions());if(q(d)){for(a=c=b.length;a--;)(d===3&&a%2===1||d<=2&&a>0&&a<c-1)&&b.splice(a,1);this.finalTickAmt=z}},setScale:function(){var a,b;this.oldMin=this.min;this.oldMax=this.max;this.oldAxisLength=this.len;this.setAxisSize();b=this.len!==this.oldAxisLength;o(this.series,function(b){if(b.isDirtyData||b.isDirty||b.xAxis.isDirty)a=!0});if(b||a||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==this.oldUserMax|| +this.alignToOthers()){if(this.resetStacks&&this.resetStacks(),this.forceRedraw=!1,this.getSeriesExtremes(),this.setTickInterval(),this.oldUserMin=this.userMin,this.oldUserMax=this.userMax,!this.isDirty)this.isDirty=b||this.min!==this.oldMin||this.max!==this.oldMax}else this.cleanStacks&&this.cleanStacks()},setExtremes:function(a,b,c,d,e){var f=this,g=f.chart,c=p(c,!0);o(f.series,function(a){delete a.kdTree});e=u(e,{min:a,max:b});H(f,"setExtremes",e,function(){f.userMin=a;f.userMax=b;f.eventArgs=e; +c&&g.redraw(d)})},zoom:function(a,b){var c=this.dataMin,d=this.dataMax,e=this.options,f=F(c,p(e.min,c)),e=t(d,p(e.max,d));this.allowZoomOutside||(q(c)&&a<=f&&(a=f),q(d)&&b>=e&&(b=e));this.displayBtn=a!==z||b!==z;this.setExtremes(a,b,!1,z,{trigger:"zoom"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsetLeft||0,d=this.horiz,e=p(b.width,a.plotWidth-c+(b.offsetRight||0)),f=p(b.height,a.plotHeight),g=p(b.top,a.plotTop),b=p(b.left,a.plotLeft+c),c=/%$/;c.test(f)&&(f=Math.round(parseFloat(f)/ +100*a.plotHeight));c.test(g)&&(g=Math.round(parseFloat(g)/100*a.plotHeight+a.plotTop));this.left=b;this.top=g;this.width=e;this.height=f;this.bottom=a.chartHeight-f-g;this.right=a.chartWidth-e-b;this.len=t(d?e:f,0);this.pos=d?b:g},getExtremes:function(){var a=this.isLog;return{min:a?fa(na(this.min)):this.min,max:a?fa(na(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=b?na(this.min):this.min,b=b?na(this.max): +this.max;a===null?a=b<0?b:c:c>a?a=c:b<a&&(a=b);return this.translate(a,0,1,0,1)},autoLabelAlign:function(a){a=(p(a,0)-this.side*90+720)%360;return a>15&&a<165?"right":a>195&&a<345?"left":"center"},unsquish:function(){var a=this.ticks,b=this.options.labels,c=this.horiz,d=this.tickInterval,e=d,f=this.len/(((this.categories?1:0)+this.max-this.min)/d),g,h=b.rotation,i=this.chart.renderer.fontMetrics(b.style.fontSize,a[0]&&a[0].label),k,j=Number.MAX_VALUE,l,m=function(a){a/=f||1;a=a>1?ua(a):1;return a* +d};c?(l=!b.staggerLines&&!b.step&&(q(h)?[h]:f<p(b.autoRotationLimit,80)&&b.autoRotation))&&o(l,function(a){var b;if(a===h||a&&a>=-90&&a<=90)k=m(P(i.h/$(ga*a))),b=k+P(a/360),b<j&&(j=b,g=a,e=k)}):b.step||(e=m(i.h));this.autoRotation=l;this.labelRotation=p(g,h);return e},renderUnsquish:function(){var a=this.chart,b=a.renderer,c=this.tickPositions,d=this.ticks,e=this.options.labels,f=this.horiz,g=a.margin,h=this.categories?c.length:c.length-1,g=this.slotWidth=f&&(e.step||0)<2&&!e.rotation&&(this.staggerLines|| +1)*a.plotWidth/h||!f&&(g[3]&&g[3]-a.spacing[3]||a.chartWidth*0.33),i=t(1,A(g-2*(e.padding||5))),k={},h=b.fontMetrics(e.style.fontSize,d[0]&&d[0].label),j=e.style.textOverflow,l,m=0,n,r;if(!xa(e.rotation))k.rotation=e.rotation||0;if(this.autoRotation)o(c,function(a){if((a=d[a])&&a.labelLength>m)m=a.labelLength}),m>i&&m>h.h?k.rotation=this.labelRotation:this.labelRotation=0;else if(g&&(l={width:i+"px"},!j)){l.textOverflow="clip";for(n=c.length;!f&&n--;)if(r=c[n],i=d[r].label)if(i.styles.textOverflow=== +"ellipsis"&&i.css({textOverflow:"clip"}),i.getBBox().height>this.len/c.length-(h.h-h.f)||d[r].labelLength>g)i.specCss={textOverflow:"ellipsis"}}if(k.rotation&&(l={width:(m>a.chartHeight*0.5?a.chartHeight*0.33:a.chartHeight)+"px"},!j))l.textOverflow="ellipsis";if(this.labelAlign=e.align||this.autoLabelAlign(this.labelRotation))k.align=this.labelAlign;o(c,function(a){var b=(a=d[a])&&a.label;if(b)b.attr(k),l&&b.css(D(l,b.specCss)),delete b.specCss,a.rotation=k.rotation});this.tickRotCorr=b.rotCorr(h.b, +this.labelRotation||0,this.side!==0)},hasData:function(){return this.hasVisibleSeries||q(this.min)&&q(this.max)&&!!this.tickPositions},getOffset:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,e=a.tickPositions,f=a.ticks,g=a.horiz,h=a.side,i=b.inverted?[1,0,3,2][h]:h,k,j,l=0,m,n=0,r=d.title,s=d.labels,R=0,v=a.opposite,x=b.axisOffset,b=b.clipOffset,w=[-1,1,1,-1][h],u,ba=a.axisParent;k=a.hasData();a.showAxis=j=k||p(d.showEmpty,!0);a.staggerLines=a.horiz&&s.staggerLines;if(!a.axisGroup)a.gridGroup= +c.g("grid").attr({zIndex:d.gridZIndex||1}).add(ba),a.axisGroup=c.g("axis").attr({zIndex:d.zIndex||2}).add(ba),a.labelGroup=c.g("axis-labels").attr({zIndex:s.zIndex||7}).addClass("highcharts-"+a.coll.toLowerCase()+"-labels").add(ba);if(k||a.isLinked){if(o(e,function(b){f[b]?f[b].addLabel():f[b]=new Va(a,b)}),a.renderUnsquish(),s.reserveSpace!==!1&&(h===0||h===2||{1:"left",3:"right"}[h]===a.labelAlign||a.labelAlign==="center")&&o(e,function(a){R=t(f[a].getLabelSize(),R)}),a.staggerLines)R*=a.staggerLines, +a.labelOffset=R*(a.opposite?-1:1)}else for(u in f)f[u].destroy(),delete f[u];if(r&&r.text&&r.enabled!==!1){if(!a.axisTitle)a.axisTitle=c.text(r.text,0,0,r.useHTML).attr({zIndex:7,rotation:r.rotation||0,align:r.textAlign||{low:v?"right":"left",middle:"center",high:v?"left":"right"}[r.align]}).addClass("highcharts-"+this.coll.toLowerCase()+"-title").css(r.style).add(a.axisGroup),a.axisTitle.isNew=!0;if(j)l=a.axisTitle.getBBox()[g?"height":"width"],m=r.offset,n=q(m)?0:p(r.margin,g?5:10);a.axisTitle[j? +"show":"hide"](!0)}a.offset=w*p(d.offset,x[h]);a.tickRotCorr=a.tickRotCorr||{x:0,y:0};c=h===2?a.tickRotCorr.y:0;g=Math.abs(R)+n+(R&&w*(g?p(s.y,a.tickRotCorr.y+8):s.x)-c);a.axisTitleMargin=p(m,g);x[h]=t(x[h],a.axisTitleMargin+l+w*a.offset,g);d=d.offset?0:T(d.lineWidth/2)*2;b[i]=t(b[i],d)},getLinePath:function(a){var b=this.chart,c=this.opposite,d=this.offset,e=this.horiz,f=this.left+(c?this.width:0)+d,d=b.chartHeight-this.bottom-(c?this.height:0)+d;c&&(a*=-1);return b.renderer.crispLine(["M",e?this.left: +f,e?d:this.top,"L",e?b.chartWidth-this.right:f,e?d:b.chartHeight-this.bottom],a)},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,e=this.options.title,f=a?b:c,g=this.opposite,h=this.offset,i=e.x||0,k=e.y||0,j=C(e.style.fontSize||12),d={low:f+(a?0:d),middle:f+d/2,high:f+(a?d:0)}[e.align],b=(a?c+this.height:b)+(a?1:-1)*(g?-1:1)*this.axisTitleMargin+(this.side===2?j:0);return{x:a?d+i:b+(g?this.width:0)+h+i,y:a?b+k-(g?this.height:0)+h:d+k}},render:function(){var a=this, +b=a.chart,c=b.renderer,d=a.options,e=a.isLog,f=a.isLinked,g=a.tickPositions,h=a.axisTitle,i=a.ticks,k=a.minorTicks,j=a.alternateBands,l=d.stackLabels,m=d.alternateGridColor,n=a.tickmarkOffset,r=d.lineWidth,s,p=b.hasRendered&&q(a.oldMin)&&!isNaN(a.oldMin),v=a.showAxis,x=c.globalAnimation,w,t;a.labelEdge.length=0;a.overlap=!1;o([i,k,j],function(a){for(var b in a)a[b].isActive=!1});if(a.hasData()||f){a.minorTickInterval&&!a.categories&&o(a.getMinorTickPositions(),function(b){k[b]||(k[b]=new Va(a,b,"minor")); +p&&k[b].isNew&&k[b].render(null,!0);k[b].render(null,!1,1)});if(g.length&&(o(g,function(b,c){if(!f||b>=a.min&&b<=a.max)i[b]||(i[b]=new Va(a,b)),p&&i[b].isNew&&i[b].render(c,!0,0.1),i[b].render(c)}),n&&(a.min===0||a.single)))i[-1]||(i[-1]=new Va(a,-1,null,!0)),i[-1].render(-1);m&&o(g,function(c,d){t=g[d+1]!==z?g[d+1]+n:a.max-n;if(d%2===0&&c<a.max&&t<=a.max+(b.polar?-n:n))j[c]||(j[c]=new B.PlotLineOrBand(a)),w=c+n,j[c].options={from:e?na(w):w,to:e?na(t):t,color:m},j[c].render(),j[c].isActive=!0});if(!a._addedPlotLB)o((d.plotLines|| +[]).concat(d.plotBands||[]),function(b){a.addPlotBandOrLine(b)}),a._addedPlotLB=!0}o([i,k,j],function(a){var c,d,e=[],f=x?x.duration||500:0;for(c in a)if(!a[c].isActive)a[c].render(c,!1,0),a[c].isActive=!1,e.push(c);Pa(function(){for(d=e.length;d--;)a[e[d]]&&!a[e[d]].isActive&&(a[e[d]].destroy(),delete a[e[d]])},a===j||!b.hasRendered||!f?0:f)});if(r)s=a.getLinePath(r),a.axisLine?a.axisLine.animate({d:s}):a.axisLine=c.path(s).attr({stroke:d.lineColor,"stroke-width":r,zIndex:7}).add(a.axisGroup),a.axisLine[v? +"show":"hide"](!0);if(h&&v)h[h.isNew?"attr":"animate"](a.getTitlePosition()),h.isNew=!1;l&&l.enabled&&a.renderStackTotals();a.isDirty=!1},redraw:function(){this.visible&&(this.render(),o(this.plotLinesAndBands,function(a){a.render()}));o(this.series,function(a){a.isDirty=!0})},destroy:function(a){var b=this,c=b.stacks,d,e=b.plotLinesAndBands;a||V(b);for(d in c)Sa(c[d]),c[d]=null;o([b.ticks,b.minorTicks,b.alternateBands],function(a){Sa(a)});for(a=e.length;a--;)e[a].destroy();o("stackTotalGroup,axisLine,axisTitle,axisGroup,cross,gridGroup,labelGroup".split(","), +function(a){b[a]&&(b[a]=b[a].destroy())});this.cross&&this.cross.destroy()},drawCrosshair:function(a,b){var c,d=this.crosshair,e,f;if(!this.crosshair||(q(b)||!p(d.snap,!0))===!1)this.hideCrosshair();else if(p(d.snap,!0)?q(b)&&(c=this.isXAxis?b.plotX:this.len-b.plotY):c=this.horiz?a.chartX-this.pos:this.len-a.chartY+this.pos,c=this.isRadial?this.getPlotLinePath(this.isXAxis?b.x:p(b.stackY,b.y))||null:this.getPlotLinePath(null,null,null,null,c)||null,c===null)this.hideCrosshair();else if(e=this.categories&& +!this.isRadial,f=p(d.width,e?this.transA:1),this.cross)this.cross.attr({d:c,visibility:"visible","stroke-width":f});else{e={"stroke-width":f,stroke:d.color||(e?"rgba(155,200,255,0.2)":"#C0C0C0"),zIndex:p(d.zIndex,2)};if(d.dashStyle)e.dashstyle=d.dashStyle;this.cross=this.chart.renderer.path(c).attr(e).add()}},hideCrosshair:function(){this.cross&&this.cross.hide()}};u(ka.prototype,{getPlotBandPath:function(a,b){var c=this.getPlotLinePath(b,null,null,!0),d=this.getPlotLinePath(a,null,null,!0);d&&c? +(d.flat=d.toString()===c.toString(),d.push(c[4],c[5],c[1],c[2])):d=null;return d},addPlotBand:function(a){return this.addPlotBandOrLine(a,"plotBands")},addPlotLine:function(a){return this.addPlotBandOrLine(a,"plotLines")},addPlotBandOrLine:function(a,b){var c=(new B.PlotLineOrBand(this,a)).render(),d=this.userOptions;c&&(b&&(d[b]=d[b]||[],d[b].push(a)),this.plotLinesAndBands.push(c));return c},removePlotBandOrLine:function(a){for(var b=this.plotLinesAndBands,c=this.options,d=this.userOptions,e=b.length;e--;)b[e].id=== +a&&b[e].destroy();o([c.plotLines||[],d.plotLines||[],c.plotBands||[],d.plotBands||[]],function(b){for(e=b.length;e--;)b[e].id===a&&oa(b,b[e])})}});ka.prototype.getTimeTicks=function(a,b,c,d){var e=[],f={},g=N.global.useUTC,h,i=new qa(b-Ya(b)),k=a.unitRange,j=a.count;if(q(b)){i[Gb](k>=G.second?0:j*T(i.getMilliseconds()/j));if(k>=G.second)i[Hb](k>=G.minute?0:j*T(i.getSeconds()/j));if(k>=G.minute)i[Ib](k>=G.hour?0:j*T(i[tb]()/j));if(k>=G.hour)i[Jb](k>=G.day?0:j*T(i[ub]()/j));if(k>=G.day)i[wb](k>=G.month? +1:j*T(i[$a]()/j));k>=G.month&&(i[xb](k>=G.year?0:j*T(i[ab]()/j)),h=i[bb]());k>=G.year&&(h-=h%j,i[yb](h));if(k===G.week)i[wb](i[$a]()-i[vb]()+p(d,1));b=1;if(qb||Za)i=i.getTime(),i=new qa(i+Ya(i));h=i[bb]();for(var d=i.getTime(),l=i[ab](),m=i[$a](),n=!g||!!Za,r=(G.day+(g?Ya(i):i.getTimezoneOffset()*6E4))%G.day;d<c;)e.push(d),k===G.year?d=kb(h+b*j,0):k===G.month?d=kb(h,l+b*j):n&&(k===G.day||k===G.week)?d=kb(h,l,m+b*j*(k===G.day?1:7)):d+=k*j,b++;e.push(d);o(Na(e,function(a){return k<=G.hour&&a%G.day=== +r}),function(a){f[a]="day"})}e.info=u(a,{higherRanks:f,totalRange:k*j});return e};ka.prototype.normalizeTimeTickInterval=function(a,b){var c=b||[["millisecond",[1,2,5,10,20,25,50,100,200,500]],["second",[1,2,5,10,15,30]],["minute",[1,2,5,10,15,30]],["hour",[1,2,3,4,6,8,12]],["day",[1,2]],["week",[1,2]],["month",[1,2,3,4,6]],["year",null]],d=c[c.length-1],e=G[d[0]],f=d[1],g;for(g=0;g<c.length;g++)if(d=c[g],e=G[d[0]],f=d[1],c[g+1]&&a<=(e*f[f.length-1]+G[c[g+1][0]])/2)break;e===G.year&&a<5*e&&(f=[1, +2,5]);c=sb(a/e,f,d[0]==="year"?t(rb(a/e),1):1);return{unitRange:e,count:c,unitName:d[0]}};ka.prototype.getLogTickPositions=function(a,b,c,d){var e=this.options,f=this.len,g=[];if(!d)this._minorAutoInterval=null;if(a>=0.5)a=A(a),g=this.getLinearTickPositions(a,b,c);else if(a>=0.08)for(var f=T(b),h,i,k,j,l,e=a>0.3?[1,2,4]:a>0.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];f<c+1&&!l;f++){i=e.length;for(h=0;h<i&&!l;h++)k=Da(na(f)*e[h]),k>b&&(!d||j<=c)&&j!==z&&g.push(j),j>c&&(l=!0),j=k}else if(b=na(b),c=na(c),a=e[d? +"minorTickInterval":"tickInterval"],a=p(a==="auto"?null:a,this._minorAutoInterval,(c-b)*(e.tickPixelInterval/(d?5:1))/((d?f/this.tickPositions.length:f)||1)),a=sb(a,null,rb(a)),g=Ba(this.getLinearTickPositions(a,b,c),Da),!d)this._minorAutoInterval=a/5;if(!d)this.tickInterval=a;return g};var Pb=B.Tooltip=function(){this.init.apply(this,arguments)};Pb.prototype={init:function(a,b){var c=b.borderWidth,d=b.style,e=C(d.padding);this.chart=a;this.options=b;this.crosshairs=[];this.now={x:0,y:0};this.isHidden= +!0;this.label=a.renderer.label("",0,0,b.shape||"callout",null,null,b.useHTML,null,"tooltip").attr({padding:e,fill:b.backgroundColor,"stroke-width":c,r:b.borderRadius,zIndex:8}).css(d).css({padding:0}).add().attr({y:-9999});ha||this.label.shadow(b.shadow);this.shared=b.shared},destroy:function(){if(this.label)this.label=this.label.destroy();clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,b,c,d){var e=this,f=e.now,g=e.options.animation!==!1&&!e.isHidden&&(P(a-f.x)>1|| +P(b-f.y)>1),h=e.followPointer||e.len>1;u(f,{x:g?(2*f.x+a)/3:a,y:g?(f.y+b)/2:b,anchorX:h?z:g?(2*f.anchorX+c)/3:c,anchorY:h?z:g?(f.anchorY+d)/2:d});e.label.attr(f);if(g)clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){e&&e.move(a,b,c,d)},32)},hide:function(a){var b=this;clearTimeout(this.hideTimer);a=p(a,this.options.hideDelay,500);if(!this.isHidden)this.hideTimer=Pa(function(){b.label[a?"fadeOut":"hide"]();b.isHidden=!0},a)},getAnchor:function(a,b){var c,d=this.chart,e=d.inverted, +f=d.plotTop,g=d.plotLeft,h=0,i=0,k,j,a=ta(a);c=a[0].tooltipPos;this.followPointer&&b&&(b.chartX===z&&(b=d.pointer.normalize(b)),c=[b.chartX-d.plotLeft,b.chartY-f]);c||(o(a,function(a){k=a.series.yAxis;j=a.series.xAxis;h+=a.plotX+(!e&&j?j.left-g:0);i+=(a.plotLow?(a.plotLow+a.plotHigh)/2:a.plotY)+(!e&&k?k.top-f:0)}),h/=a.length,i/=a.length,c=[e?d.plotWidth-i:h,this.shared&&!e&&a.length>1&&b?b.chartY-f:e?d.plotHeight-h:i]);return Ba(c,A)},getPosition:function(a,b,c){var d=this.chart,e=this.distance, +f={},g=c.h||0,h,i=["y",d.chartHeight,b,c.plotY+d.plotTop,d.plotTop,d.plotTop+d.plotHeight],k=["x",d.chartWidth,a,c.plotX+d.plotLeft,d.plotLeft,d.plotLeft+d.plotWidth],j=p(c.ttBelow,d.inverted&&!c.negative||!d.inverted&&c.negative),l=function(a,b,c,d,h,i){var k=c<d-e,l=d+e+c<b,m=d-e-c;d+=e;if(j&&l)f[a]=d;else if(!j&&k)f[a]=m;else if(k)f[a]=F(i-c,m-g<0?m:m-g);else if(l)f[a]=t(h,d+g+c>b?d:d+g);else return!1},m=function(a,b,c,d){var g;d<e||d>b-e?g=!1:f[a]=d<c/2?1:d>b-c/2?b-c-2:d-c/2;return g},n=function(a){var b= +i;i=k;k=b;h=a},r=function(){l.apply(0,i)!==!1?m.apply(0,k)===!1&&!h&&(n(!0),r()):h?f.x=f.y=0:(n(!0),r())};(d.inverted||this.len>1)&&n();r();return f},defaultFormatter:function(a){var b=this.points||ta(this),c;c=[a.tooltipFooterHeaderFormatter(b[0])];c=c.concat(a.bodyFormatter(b));c.push(a.tooltipFooterHeaderFormatter(b[0],!0));return c.join("")},refresh:function(a,b){var c=this.chart,d=this.label,e=this.options,f,g,h,i={},k,j=[];k=e.formatter||this.defaultFormatter;var i=c.hoverPoints,l,m=this.shared; +clearTimeout(this.hideTimer);this.followPointer=ta(a)[0].series.tooltipOptions.followPointer;h=this.getAnchor(a,b);f=h[0];g=h[1];m&&(!a.series||!a.series.noSharedTooltip)?(c.hoverPoints=a,i&&o(i,function(a){a.setState()}),o(a,function(a){a.setState("hover");j.push(a.getLabelConfig())}),i={x:a[0].category,y:a[0].y},i.points=j,this.len=j.length,a=a[0]):i=a.getLabelConfig();k=k.call(i,this);i=a.series;this.distance=p(i.tooltipOptions.distance,16);k===!1?this.hide():(this.isHidden&&(Oa(d),d.attr("opacity", +1).show()),d.attr({text:k}),l=e.borderColor||a.color||i.color||"#606060",d.attr({stroke:l}),this.updatePosition({plotX:f,plotY:g,negative:a.negative,ttBelow:a.ttBelow,h:h[2]||0}),this.isHidden=!1);H(c,"tooltipRefresh",{text:k,x:f+c.plotLeft,y:g+c.plotTop,borderColor:l})},updatePosition:function(a){var b=this.chart,c=this.label,c=(this.options.positioner||this.getPosition).call(this,c.width,c.height,a);this.move(A(c.x),A(c.y||0),a.plotX+b.plotLeft,a.plotY+b.plotTop)},getXDateFormat:function(a,b,c){var d, +b=b.dateTimeLabelFormats,e=c&&c.closestPointRange,f,g={millisecond:15,second:12,minute:9,hour:6,day:3},h,i="millisecond";if(e){h=Qa("%m-%d %H:%M:%S.%L",a.x);for(f in G){if(e===G.week&&+Qa("%w",a.x)===c.options.startOfWeek&&h.substr(6)==="00:00:00.000"){f="week";break}if(G[f]>e){f=i;break}if(g[f]&&h.substr(g[f])!=="01-01 00:00:00.000".substr(g[f]))break;f!=="week"&&(i=f)}f&&(d=b[f])}else d=b.day;return d||b.year},tooltipFooterHeaderFormatter:function(a,b){var c=b?"footer":"header",d=a.series,e=d.tooltipOptions, +f=e.xDateFormat,g=d.xAxis,h=g&&g.options.type==="datetime"&&ma(a.key),c=e[c+"Format"];h&&!f&&(f=this.getXDateFormat(a,e,g));h&&f&&(c=c.replace("{point.key}","{point.key:"+f+"}"));return Ka(c,{point:a,series:d})},bodyFormatter:function(a){return Ba(a,function(a){var c=a.series.tooltipOptions;return(c.pointFormatter||a.point.tooltipFormatter).call(a.point,c.pointFormat)})}};var ea;db=y&&y.documentElement.ontouchstart!==z;var Xa=B.Pointer=function(a,b){this.init(a,b)};Xa.prototype={init:function(a,b){var c= +b.chart,d=c.events,e=ha?"":c.zoomType,c=a.inverted,f;this.options=b;this.chart=a;this.zoomX=f=/x/.test(e);this.zoomY=e=/y/.test(e);this.zoomHor=f&&!c||e&&c;this.zoomVert=e&&!c||f&&c;this.hasZoom=f||e;this.runChartClick=d&&!!d.click;this.pinchDown=[];this.lastValidTouch={};if(B.Tooltip&&b.tooltip.enabled)a.tooltip=new Pb(a,b.tooltip),this.followTouchMove=p(b.tooltip.followTouchMove,!0);this.setDOMEvents()},normalize:function(a,b){var c,d,a=a||E.event;if(!a.target)a.target=a.srcElement;d=a.touches? +a.touches.length?a.touches.item(0):a.changedTouches[0]:a;if(!b)this.chartPosition=b=Ab(this.chart.container);d.pageX===z?(c=t(a.x,a.clientX-b.left),d=a.y):(c=d.pageX-b.left,d=d.pageY-b.top);return u(a,{chartX:A(c),chartY:A(d)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};o(this.chart.axes,function(c){b[c.isXAxis?"xAxis":"yAxis"].push({axis:c,value:c.toValue(a[c.horiz?"chartX":"chartY"])})});return b},runPointActions:function(a){var b=this.chart,c=b.series,d=b.tooltip,e=d?d.shared:!1,f=b.hoverPoint, +g=b.hoverSeries,h=[Number.MAX_VALUE,Number.MAX_VALUE],i,k,j=[],l=[],m;if(!e&&!g)for(b=0;b<c.length;b++)if(c[b].directTouch||!c[b].options.stickyTracking)c=[];g&&(e?g.noSharedTooltip:g.directTouch)&&f?l=[f]:(o(c,function(b){i=b.noSharedTooltip&&e;k=!e&&b.directTouch;b.visible&&!i&&!k&&p(b.options.enableMouseTracking,!0)&&(m=b.searchPoint(a,!i&&b.kdDimensions===1))&&j.push(m)}),o(j,function(a){a&&o(["dist","distX"],function(b,c){typeof a[b]==="number"&&a[b]<h[c]&&(h[c]=a[b],l[c]=a)})}));if(e)for(b= +j.length;b--;)(j[b].clientX!==l[1].clientX||j[b].series.noSharedTooltip)&&j.splice(b,1);if(l[0]&&(l[0]!==this.prevKDPoint||d&&d.isHidden))if(e&&!l[0].series.noSharedTooltip)j.length&&d&&d.refresh(j,a),o(j,function(b){b.onMouseOver(a,b!==(g&&g.directTouch&&f||l[0]))}),this.prevKDPoint=l[1];else{d&&d.refresh(l[0],a);if(!g||!g.directTouch)l[0].onMouseOver(a);this.prevKDPoint=l[0]}else c=g&&g.tooltipOptions.followPointer,d&&c&&!d.isHidden&&(c=d.getAnchor([{}],a),d.updatePosition({plotX:c[0],plotY:c[1]})); +if(!this._onDocumentMouseMove)this._onDocumentMouseMove=function(a){if(S[ea])S[ea].pointer.onDocumentMouseMove(a)},M(y,"mousemove",this._onDocumentMouseMove);o(e?j:[p(l[1],f)],function(b){var c=b&&b.series;c&&o(["xAxis","yAxis","colorAxis"],function(d){c[d]&&c[d].drawCrosshair(a,b)})})},reset:function(a,b){var c=this.chart,d=c.hoverSeries,e=c.hoverPoint,f=c.hoverPoints,g=c.tooltip,h=g&&g.shared?f:e;(a=a&&g&&h)&&o(ta(h),function(b){b.plotX===void 0&&(a=!1)});if(a)g.refresh(h),e&&(e.setState(e.state, +!0),o(c.axes,function(a){p(a.options.crosshair&&a.options.crosshair.snap,!0)?a.drawCrosshair(null,e):a.hideCrosshair()}));else{if(e)e.onMouseOut();f&&o(f,function(a){a.setState()});if(d)d.onMouseOut();g&&g.hide(b);if(this._onDocumentMouseMove)V(y,"mousemove",this._onDocumentMouseMove),this._onDocumentMouseMove=null;o(c.axes,function(a){a.hideCrosshair()});this.hoverX=c.hoverPoints=c.hoverPoint=null}},scaleGroups:function(a,b){var c=this.chart,d;o(c.series,function(e){d=a||e.getPlotBox();e.xAxis&& +e.xAxis.zoomEnabled&&(e.group.attr(d),e.markerGroup&&(e.markerGroup.attr(d),e.markerGroup.clip(b?c.clipRect:null)),e.dataLabelsGroup&&e.dataLabelsGroup.attr(d))});c.clipRect.attr(b||c.clipBox)},dragStart:function(a){var b=this.chart;b.mouseIsDown=a.type;b.cancelClick=!1;b.mouseDownX=this.mouseDownX=a.chartX;b.mouseDownY=this.mouseDownY=a.chartY},drag:function(a){var b=this.chart,c=b.options.chart,d=a.chartX,e=a.chartY,f=this.zoomHor,g=this.zoomVert,h=b.plotLeft,i=b.plotTop,k=b.plotWidth,j=b.plotHeight, +l,m=this.selectionMarker,n=this.mouseDownX,r=this.mouseDownY,s=c.panKey&&a[c.panKey+"Key"];if(!m||!m.touch)if(d<h?d=h:d>h+k&&(d=h+k),e<i?e=i:e>i+j&&(e=i+j),this.hasDragged=Math.sqrt(Math.pow(n-d,2)+Math.pow(r-e,2)),this.hasDragged>10){l=b.isInsidePlot(n-h,r-i);if(b.hasCartesianSeries&&(this.zoomX||this.zoomY)&&l&&!s&&!m)this.selectionMarker=m=b.renderer.rect(h,i,f?1:k,g?1:j,0).attr({fill:c.selectionMarkerFill||"rgba(69,114,167,0.25)",zIndex:7}).add();m&&f&&(d-=n,m.attr({width:P(d),x:(d>0?0:d)+n})); +m&&g&&(d=e-r,m.attr({height:P(d),y:(d>0?0:d)+r}));l&&!m&&c.panning&&b.pan(a,c.panning)}},drop:function(a){var b=this,c=this.chart,d=this.hasPinched;if(this.selectionMarker){var e={originalEvent:a,xAxis:[],yAxis:[]},f=this.selectionMarker,g=f.attr?f.attr("x"):f.x,h=f.attr?f.attr("y"):f.y,i=f.attr?f.attr("width"):f.width,k=f.attr?f.attr("height"):f.height,j;if(this.hasDragged||d)o(c.axes,function(c){if(c.zoomEnabled&&q(c.min)&&(d||b[{xAxis:"zoomX",yAxis:"zoomY"}[c.coll]])){var f=c.horiz,n=a.type=== +"touchend"?c.minPixelPadding:0,r=c.toValue((f?g:h)+n),f=c.toValue((f?g+i:h+k)-n);e[c.coll].push({axis:c,min:F(r,f),max:t(r,f)});j=!0}}),j&&H(c,"selection",e,function(a){c.zoom(u(a,d?{animation:!1}:null))});this.selectionMarker=this.selectionMarker.destroy();d&&this.scaleGroups()}if(c)L(c.container,{cursor:c._cursor}),c.cancelClick=this.hasDragged>10,c.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[]},onContainerMouseDown:function(a){a=this.normalize(a);a.preventDefault&&a.preventDefault(); +this.dragStart(a)},onDocumentMouseUp:function(a){S[ea]&&S[ea].pointer.drop(a)},onDocumentMouseMove:function(a){var b=this.chart,c=this.chartPosition,a=this.normalize(a,c);c&&!this.inClass(a.target,"highcharts-tracker")&&!b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop)&&this.reset()},onContainerMouseLeave:function(a){var b=S[ea];if(b&&(a.relatedTarget||a.toElement))b.pointer.reset(),b.pointer.chartPosition=null},onContainerMouseMove:function(a){var b=this.chart;if(!q(ea)||!S[ea]||!S[ea].mouseIsDown)ea= +b.index;a=this.normalize(a);a.returnValue=!1;b.mouseIsDown==="mousedown"&&this.drag(a);(this.inClass(a.target,"highcharts-tracker")||b.isInsidePlot(a.chartX-b.plotLeft,a.chartY-b.plotTop))&&!b.openMenu&&this.runPointActions(a)},inClass:function(a,b){for(var c;a;){if(c=K(a,"class")){if(c.indexOf(b)!==-1)return!0;if(c.indexOf("highcharts-container")!==-1)return!1}a=a.parentNode}},onTrackerMouseOut:function(a){var b=this.chart.hoverSeries,a=a.relatedTarget||a.toElement;if(b&&a&&!b.options.stickyTracking&& +!this.inClass(a,"highcharts-tooltip")&&!this.inClass(a,"highcharts-series-"+b.index))b.onMouseOut()},onContainerClick:function(a){var b=this.chart,c=b.hoverPoint,d=b.plotLeft,e=b.plotTop,a=this.normalize(a);b.cancelClick||(c&&this.inClass(a.target,"highcharts-tracker")?(H(c.series,"click",u(a,{point:c})),b.hoverPoint&&c.firePointEvent("click",a)):(u(a,this.getCoordinates(a)),b.isInsidePlot(a.chartX-d,a.chartY-e)&&H(b,"click",a)))},setDOMEvents:function(){var a=this,b=a.chart.container;b.onmousedown= +function(b){a.onContainerMouseDown(b)};b.onmousemove=function(b){a.onContainerMouseMove(b)};b.onclick=function(b){a.onContainerClick(b)};M(b,"mouseleave",a.onContainerMouseLeave);eb===1&&M(y,"mouseup",a.onDocumentMouseUp);if(db)b.ontouchstart=function(b){a.onContainerTouchStart(b)},b.ontouchmove=function(b){a.onContainerTouchMove(b)},eb===1&&M(y,"touchend",a.onDocumentTouchEnd)},destroy:function(){var a;V(this.chart.container,"mouseleave",this.onContainerMouseLeave);eb||(V(y,"mouseup",this.onDocumentMouseUp), +V(y,"touchend",this.onDocumentTouchEnd));clearInterval(this.tooltipTimeout);for(a in this)this[a]=null}};u(B.Pointer.prototype,{pinchTranslate:function(a,b,c,d,e,f){(this.zoomHor||this.pinchHor)&&this.pinchTranslateDirection(!0,a,b,c,d,e,f);(this.zoomVert||this.pinchVert)&&this.pinchTranslateDirection(!1,a,b,c,d,e,f)},pinchTranslateDirection:function(a,b,c,d,e,f,g,h){var i=this.chart,k=a?"x":"y",j=a?"X":"Y",l="chart"+j,m=a?"width":"height",n=i["plot"+(a?"Left":"Top")],r,s,p=h||1,o=i.inverted,x=i.bounds[a? +"h":"v"],w=b.length===1,q=b[0][l],t=c[0][l],u=!w&&b[1][l],A=!w&&c[1][l],B,c=function(){!w&&P(q-u)>20&&(p=h||P(t-A)/P(q-u));s=(n-t)/p+q;r=i["plot"+(a?"Width":"Height")]/p};c();b=s;b<x.min?(b=x.min,B=!0):b+r>x.max&&(b=x.max-r,B=!0);B?(t-=0.8*(t-g[k][0]),w||(A-=0.8*(A-g[k][1])),c()):g[k]=[t,A];o||(f[k]=s-n,f[m]=r);f=o?1/p:p;e[m]=r;e[k]=b;d[o?a?"scaleY":"scaleX":"scale"+j]=p;d["translate"+j]=f*n+(t-f*q)},pinch:function(a){var b=this,c=b.chart,d=b.pinchDown,e=a.touches,f=e.length,g=b.lastValidTouch,h= +b.hasZoom,i=b.selectionMarker,k={},j=f===1&&(b.inClass(a.target,"highcharts-tracker")&&c.runTrackerClick||b.runChartClick),l={};if(f>1)b.initiated=!0;h&&b.initiated&&!j&&a.preventDefault();Ba(e,function(a){return b.normalize(a)});if(a.type==="touchstart")o(e,function(a,b){d[b]={chartX:a.chartX,chartY:a.chartY}}),g.x=[d[0].chartX,d[1]&&d[1].chartX],g.y=[d[0].chartY,d[1]&&d[1].chartY],o(c.axes,function(a){if(a.zoomEnabled){var b=c.bounds[a.horiz?"h":"v"],d=a.minPixelPadding,e=a.toPixels(p(a.options.min, +a.dataMin)),f=a.toPixels(p(a.options.max,a.dataMax)),g=F(e,f),e=t(e,f);b.min=F(a.pos,g-d);b.max=t(a.pos+a.len,e+d)}}),b.res=!0;else if(d.length){if(!i)b.selectionMarker=i=u({destroy:Aa,touch:!0},c.plotBox);b.pinchTranslate(d,e,k,i,l,g);b.hasPinched=h;b.scaleGroups(k,l);if(!h&&b.followTouchMove&&f===1)this.runPointActions(b.normalize(a));else if(b.res)b.res=!1,this.reset(!1,0)}},touch:function(a,b){var c=this.chart;ea=c.index;a.touches.length===1?(a=this.normalize(a),c.isInsidePlot(a.chartX-c.plotLeft, +a.chartY-c.plotTop)&&!c.openMenu?(b&&this.runPointActions(a),this.pinch(a)):b&&this.reset()):a.touches.length===2&&this.pinch(a)},onContainerTouchStart:function(a){this.touch(a,!0)},onContainerTouchMove:function(a){this.touch(a)},onDocumentTouchEnd:function(a){S[ea]&&S[ea].pointer.drop(a)}});if(E.PointerEvent||E.MSPointerEvent){var va={},Db=!!E.PointerEvent,Sb=function(){var a,b=[];b.item=function(a){return this[a]};for(a in va)va.hasOwnProperty(a)&&b.push({pageX:va[a].pageX,pageY:va[a].pageY,target:va[a].target}); +return b},Eb=function(a,b,c,d){if((a.pointerType==="touch"||a.pointerType===a.MSPOINTER_TYPE_TOUCH)&&S[ea])d(a),d=S[ea].pointer,d[b]({type:c,target:a.currentTarget,preventDefault:Aa,touches:Sb()})};u(Xa.prototype,{onContainerPointerDown:function(a){Eb(a,"onContainerTouchStart","touchstart",function(a){va[a.pointerId]={pageX:a.pageX,pageY:a.pageY,target:a.currentTarget}})},onContainerPointerMove:function(a){Eb(a,"onContainerTouchMove","touchmove",function(a){va[a.pointerId]={pageX:a.pageX,pageY:a.pageY}; +if(!va[a.pointerId].target)va[a.pointerId].target=a.currentTarget})},onDocumentPointerUp:function(a){Eb(a,"onDocumentTouchEnd","touchend",function(a){delete va[a.pointerId]})},batchMSEvents:function(a){a(this.chart.container,Db?"pointerdown":"MSPointerDown",this.onContainerPointerDown);a(this.chart.container,Db?"pointermove":"MSPointerMove",this.onContainerPointerMove);a(y,Db?"pointerup":"MSPointerUp",this.onDocumentPointerUp)}});fb(Xa.prototype,"init",function(a,b,c){a.call(this,b,c);this.hasZoom&& +L(b.container,{"-ms-touch-action":"none","touch-action":"none"})});fb(Xa.prototype,"setDOMEvents",function(a){a.apply(this);(this.hasZoom||this.followTouchMove)&&this.batchMSEvents(M)});fb(Xa.prototype,"destroy",function(a){this.batchMSEvents(V);a.call(this)})}var ob=B.Legend=function(a,b){this.init(a,b)};ob.prototype={init:function(a,b){var c=this,d=b.itemStyle,e=b.itemMarginTop||0;this.options=b;if(b.enabled)c.itemStyle=d,c.itemHiddenStyle=D(d,b.itemHiddenStyle),c.itemMarginTop=e,c.padding=d=p(b.padding, +8),c.initialItemX=d,c.initialItemY=d-5,c.maxItemWidth=0,c.chart=a,c.itemHeight=0,c.symbolWidth=p(b.symbolWidth,16),c.pages=[],c.render(),M(c.chart,"endResize",function(){c.positionCheckboxes()})},colorizeItem:function(a,b){var c=this.options,d=a.legendItem,e=a.legendLine,f=a.legendSymbol,g=this.itemHiddenStyle.color,c=b?c.itemStyle.color:g,h=b?a.legendColor||a.color||"#CCC":g,g=a.options&&a.options.marker,i={fill:h},k;d&&d.css({fill:c,color:c});e&&e.attr({stroke:h});if(f){if(g&&f.isMarker)for(k in i.stroke= +h,g=a.convertAttribs(g),g)d=g[k],d!==z&&(i[k]=d);f.attr(i)}},positionItem:function(a){var b=this.options,c=b.symbolPadding,b=!b.rtl,d=a._legendItemPos,e=d[0],d=d[1],f=a.checkbox;(a=a.legendGroup)&&a.element&&a.translate(b?e:this.legendWidth-e-2*c-4,d);if(f)f.x=e,f.y=d},destroyItem:function(a){var b=a.checkbox;o(["legendItem","legendLine","legendSymbol","legendGroup"],function(b){a[b]&&(a[b]=a[b].destroy())});b&&Ta(a.checkbox)},destroy:function(){var a=this.group,b=this.box;if(b)this.box=b.destroy(); +if(a)this.group=a.destroy()},positionCheckboxes:function(a){var b=this.group.alignAttr,c,d=this.clipHeight||this.legendHeight,e=this.titleHeight;if(b)c=b.translateY,o(this.allItems,function(f){var g=f.checkbox,h;g&&(h=c+e+g.y+(a||0)+3,L(g,{left:b.translateX+f.checkboxOffset+g.x-20+"px",top:h+"px",display:h>c-6&&h<c+d-6?"":"none"}))})},renderTitle:function(){var a=this.padding,b=this.options.title,c=0;if(b.text){if(!this.title)this.title=this.chart.renderer.label(b.text,a-3,a-4,null,null,null,null, +null,"legend-title").attr({zIndex:1}).css(b.style).add(this.group);a=this.title.getBBox();c=a.height;this.offsetWidth=a.width;this.contentGroup.attr({translateY:c})}this.titleHeight=c},setText:function(a){var b=this.options;a.legendItem.attr({text:b.labelFormat?Ka(b.labelFormat,a):b.labelFormatter.call(a)})},renderItem:function(a){var b=this.chart,c=b.renderer,d=this.options,e=d.layout==="horizontal",f=this.symbolWidth,g=d.symbolPadding,h=this.itemStyle,i=this.itemHiddenStyle,k=this.padding,j=e?p(d.itemDistance, +20):0,l=!d.rtl,m=d.width,n=d.itemMarginBottom||0,r=this.itemMarginTop,s=this.initialItemX,o=a.legendItem,v=a.series&&a.series.drawLegendSymbol?a.series:a,x=v.options,x=this.createCheckboxForItem&&x&&x.showCheckbox,w=d.useHTML;if(!o){a.legendGroup=c.g("legend-item").attr({zIndex:1}).add(this.scrollGroup);a.legendItem=o=c.text("",l?f+g:-g,this.baseline||0,w).css(D(a.visible?h:i)).attr({align:l?"left":"right",zIndex:2}).add(a.legendGroup);if(!this.baseline)this.fontMetrics=c.fontMetrics(h.fontSize,o), +this.baseline=this.fontMetrics.f+3+r,o.attr("y",this.baseline);v.drawLegendSymbol(this,a);this.setItemEvents&&this.setItemEvents(a,o,w,h,i);x&&this.createCheckboxForItem(a)}this.colorizeItem(a,a.visible);this.setText(a);c=o.getBBox();f=a.checkboxOffset=d.itemWidth||a.legendItemWidth||f+g+c.width+j+(x?20:0);this.itemHeight=g=A(a.legendItemHeight||c.height);if(e&&this.itemX-s+f>(m||b.chartWidth-2*k-s-d.x))this.itemX=s,this.itemY+=r+this.lastLineHeight+n,this.lastLineHeight=0;this.maxItemWidth=t(this.maxItemWidth, +f);this.lastItemY=r+this.itemY+n;this.lastLineHeight=t(g,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];e?this.itemX+=f:(this.itemY+=r+g+n,this.lastLineHeight=g);this.offsetWidth=m||t((e?this.itemX-s-j:f)+k,this.offsetWidth)},getAllItems:function(){var a=[];o(this.chart.series,function(b){var c=b.options;if(p(c.showInLegend,!q(c.linkedTo)?z:!1,!0))a=a.concat(b.legendItems||(c.legendType==="point"?b.data:b))});return a},adjustMargins:function(a,b){var c=this.chart,d=this.options,e=d.align.charAt(0)+ +d.verticalAlign.charAt(0)+d.layout.charAt(0);this.display&&!d.floating&&o([/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/],function(f,g){f.test(e)&&!q(a[g])&&(c[nb[g]]=t(c[nb[g]],c.legend[(g+1)%2?"legendHeight":"legendWidth"]+[1,-1,-1,1][g]*d[g%2?"x":"y"]+p(d.margin,12)+b[g]))})},render:function(){var a=this,b=a.chart,c=b.renderer,d=a.group,e,f,g,h,i=a.box,k=a.options,j=a.padding,l=k.borderWidth,m=k.backgroundColor;a.itemX=a.initialItemX;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY= +0;if(!d)a.group=d=c.g("legend").attr({zIndex:7}).add(),a.contentGroup=c.g().attr({zIndex:1}).add(d),a.scrollGroup=c.g().add(a.contentGroup);a.renderTitle();e=a.getAllItems();ib(e,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});k.reversed&&e.reverse();a.allItems=e;a.display=f=!!e.length;a.lastLineHeight=0;o(e,function(b){a.renderItem(b)});g=(k.width||a.offsetWidth)+j;h=a.lastItemY+a.lastLineHeight+a.titleHeight;h=a.handleOverflow(h);h+=j;if(l||m){if(i){if(g> +0&&h>0)i[i.isNew?"attr":"animate"](i.crisp({width:g,height:h})),i.isNew=!1}else a.box=i=c.rect(0,0,g,h,k.borderRadius,l||0).attr({stroke:k.borderColor,"stroke-width":l||0,fill:m||"none"}).add(d).shadow(k.shadow),i.isNew=!0;i[f?"show":"hide"]()}a.legendWidth=g;a.legendHeight=h;o(e,function(b){a.positionItem(b)});f&&d.align(u({width:g,height:h},k),!0,"spacingBox");b.isResizing||this.positionCheckboxes()},handleOverflow:function(a){var b=this,c=this.chart,d=c.renderer,e=this.options,f=e.y,f=c.spacingBox.height+ +(e.verticalAlign==="top"?-f:f)-this.padding,g=e.maxHeight,h,i=this.clipRect,k=e.navigation,j=p(k.animation,!0),l=k.arrowSize||12,m=this.nav,n=this.pages,r=this.padding,s,R=this.allItems,v=function(a){i.attr({height:a});if(b.contentGroup.div)b.contentGroup.div.style.clip="rect("+r+"px,9999px,"+(r+a)+"px,0)"};e.layout==="horizontal"&&(f/=2);g&&(f=F(f,g));n.length=0;if(a>f){this.clipHeight=h=t(f-20-this.titleHeight-r,0);this.currentPage=p(this.currentPage,1);this.fullHeight=a;o(R,function(a,b){var c= +a._legendItemPos[1],d=A(a.legendItem.getBBox().height),e=n.length;if(!e||c-n[e-1]>h&&(s||c)!==n[e-1])n.push(s||c),e++;b===R.length-1&&c+d-n[e-1]>h&&n.push(c);c!==s&&(s=c)});if(!i)i=b.clipRect=d.clipRect(0,r,9999,0),b.contentGroup.clip(i);v(h);if(!m)this.nav=m=d.g().attr({zIndex:1}).add(this.group),this.up=d.symbol("triangle",0,0,l,l).on("click",function(){b.scroll(-1,j)}).add(m),this.pager=d.text("",15,10).css(k.style).add(m),this.down=d.symbol("triangle-down",0,0,l,l).on("click",function(){b.scroll(1, +j)}).add(m);b.scroll(0);a=f}else if(m)v(c.chartHeight),m.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0;return a},scroll:function(a,b){var c=this.pages,d=c.length,e=this.currentPage+a,f=this.clipHeight,g=this.options.navigation,h=g.activeColor,g=g.inactiveColor,i=this.pager,k=this.padding;e>d&&(e=d);if(e>0)b!==z&&Ua(b,this.chart),this.nav.attr({translateX:k,translateY:f+this.padding+7+this.titleHeight,visibility:"visible"}),this.up.attr({fill:e===1?g:h}).css({cursor:e===1?"default": +"pointer"}),i.attr({text:e+"/"+d}),this.down.attr({x:18+this.pager.getBBox().width,fill:e===d?g:h}).css({cursor:e===d?"default":"pointer"}),c=-c[e-1]+this.initialItemY,this.scrollGroup.animate({translateY:c}),this.currentPage=e,this.positionCheckboxes(c)}};J=B.LegendSymbolMixin={drawRectangle:function(a,b){var c=a.options.symbolHeight||a.fontMetrics.f;b.legendSymbol=this.chart.renderer.rect(0,a.baseline-c+1,a.symbolWidth,c,a.options.symbolRadius||0).attr({zIndex:3}).add(b.legendGroup)},drawLineMarker:function(a){var b= +this.options,c=b.marker,d=a.symbolWidth,e=this.chart.renderer,f=this.legendGroup,a=a.baseline-A(a.fontMetrics.b*0.3),g;if(b.lineWidth){g={"stroke-width":b.lineWidth};if(b.dashStyle)g.dashstyle=b.dashStyle;this.legendLine=e.path(["M",0,a,"L",d,a]).attr(g).add(f)}if(c&&c.enabled!==!1)b=c.radius,this.legendSymbol=c=e.symbol(this.symbol,d/2-b,a-b,2*b,2*b,c).add(f),c.isMarker=!0}};(/Trident\/7\.0/.test(za)||Ma)&&fb(ob.prototype,"positionItem",function(a,b){var c=this,d=function(){b._legendItemPos&&a.call(c, +b)};d();setTimeout(d)});var hb=B.Chart=function(){this.getArgs.apply(this,arguments)};B.chart=function(a,b,c){return new hb(a,b,c)};hb.prototype={callbacks:[],getArgs:function(){var a=[].slice.call(arguments);if(xa(a[0])||a[0].nodeName)this.renderTo=a.shift();this.init(a[0],a[1])},init:function(a,b){var c,d=a.series;a.series=null;c=D(N,a);c.series=a.series=d;this.userOptions=a;d=c.chart;this.margin=this.splashArray("margin",d);this.spacing=this.splashArray("spacing",d);var e=d.events;this.bounds= +{h:{},v:{}};this.callback=b;this.isResizing=0;this.options=c;this.axes=[];this.series=[];this.hasCartesianSeries=d.showAxes;var f=this,g;f.index=S.length;S.push(f);eb++;d.reflow!==!1&&M(f,"load",function(){f.initReflow()});if(e)for(g in e)M(f,g,e[g]);f.xAxis=[];f.yAxis=[];f.animation=ha?!1:p(d.animation,!0);f.pointCount=f.colorCounter=f.symbolCounter=0;f.firstRender()},initSeries:function(a){var b=this.options.chart;(b=I[a.type||b.type||b.defaultSeriesType])||X(17,!0);b=new b;b.init(this,a);return b}, +isInsidePlot:function(a,b,c){var d=c?b:a,a=c?a:b;return d>=0&&d<=this.plotWidth&&a>=0&&a<=this.plotHeight},redraw:function(a){var b=this.axes,c=this.series,d=this.pointer,e=this.legend,f=this.isDirtyLegend,g,h,i=this.hasCartesianSeries,k=this.isDirtyBox,j=c.length,l=j,m=this.renderer,n=m.isHidden(),r=[];Ua(a,this);n&&this.cloneRenderTo();for(this.layOutTitles();l--;)if(a=c[l],a.options.stacking&&(g=!0,a.isDirty)){h=!0;break}if(h)for(l=j;l--;)if(a=c[l],a.options.stacking)a.isDirty=!0;o(c,function(a){a.isDirty&& +a.options.legendType==="point"&&(a.updateTotals&&a.updateTotals(),f=!0)});if(f&&e.options.enabled)e.render(),this.isDirtyLegend=!1;g&&this.getStacks();if(i&&!this.isResizing)this.maxTicks=null,o(b,function(a){a.setScale()});this.getMargins();i&&(o(b,function(a){a.isDirty&&(k=!0)}),o(b,function(a){var b=a.min+","+a.max;if(a.extKey!==b)a.extKey=b,r.push(function(){H(a,"afterSetExtremes",u(a.eventArgs,a.getExtremes()));delete a.eventArgs});(k||g)&&a.redraw()}));k&&this.drawChartBox();o(c,function(a){a.isDirty&& +a.visible&&(!a.isCartesian||a.xAxis)&&a.redraw()});d&&d.reset(!0);m.draw();H(this,"redraw");n&&this.cloneRenderTo(!0);o(r,function(a){a.call()})},get:function(a){var b=this.axes,c=this.series,d,e;for(d=0;d<b.length;d++)if(b[d].options.id===a)return b[d];for(d=0;d<c.length;d++)if(c[d].options.id===a)return c[d];for(d=0;d<c.length;d++){e=c[d].points||[];for(b=0;b<e.length;b++)if(e[b].id===a)return e[b]}return null},getAxes:function(){var a=this,b=this.options,c=b.xAxis=ta(b.xAxis||{}),b=b.yAxis=ta(b.yAxis|| +{});o(c,function(a,b){a.index=b;a.isX=!0});o(b,function(a,b){a.index=b});c=c.concat(b);o(c,function(b){new ka(a,b)})},getSelectedPoints:function(){var a=[];o(this.series,function(b){a=a.concat(Na(b.points||[],function(a){return a.selected}))});return a},getSelectedSeries:function(){return Na(this.series,function(a){return a.selected})},setTitle:function(a,b,c){var g;var d=this,e=d.options,f;f=e.title=D(e.title,a);g=e.subtitle=D(e.subtitle,b),e=g;o([["title",a,f],["subtitle",b,e]],function(a){var b= +a[0],c=d[b],e=a[1],a=a[2];c&&e&&(d[b]=c=c.destroy());a&&a.text&&!c&&(d[b]=d.renderer.text(a.text,0,0,a.useHTML).attr({align:a.align,"class":"highcharts-"+b,zIndex:a.zIndex||4}).css(a.style).add())});d.layOutTitles(c)},layOutTitles:function(a){var b=0,c=this.title,d=this.subtitle,e=this.options,f=e.title,e=e.subtitle,g=this.renderer,h=this.spacingBox.width-44;if(c&&(c.css({width:(f.width||h)+"px"}).align(u({y:g.fontMetrics(f.style.fontSize,c).b-3},f),!1,"spacingBox"),!f.floating&&!f.verticalAlign))b= +c.getBBox().height;d&&(d.css({width:(e.width||h)+"px"}).align(u({y:b+(f.margin-13)+g.fontMetrics(e.style.fontSize,c).b},e),!1,"spacingBox"),!e.floating&&!e.verticalAlign&&(b=ua(b+d.getBBox().height)));c=this.titleOffset!==b;this.titleOffset=b;if(!this.isDirtyBox&&c)this.isDirtyBox=c,this.hasRendered&&p(a,!0)&&this.isDirtyBox&&this.redraw()},getChartSize:function(){var a=this.options.chart,b=a.width,a=a.height,c=this.renderToClone||this.renderTo;if(!q(b))this.containerWidth=ja(c,"width");if(!q(a))this.containerHeight= +ja(c,"height");this.chartWidth=t(0,b||this.containerWidth||600);this.chartHeight=t(0,p(a,this.containerHeight>19?this.containerHeight:400))},cloneRenderTo:function(a){var b=this.renderToClone,c=this.container;a?b&&(this.renderTo.appendChild(c),Ta(b),delete this.renderToClone):(c&&c.parentNode===this.renderTo&&this.renderTo.removeChild(c),this.renderToClone=b=this.renderTo.cloneNode(0),L(b,{position:"absolute",top:"-9999px",display:"block"}),b.style.setProperty&&b.style.setProperty("display","block", +"important"),y.body.appendChild(b),c&&b.appendChild(c))},getContainer:function(){var a,b=this.options,c=b.chart,d,e;a=this.renderTo;var f="highcharts-"+zb++;if(!a)this.renderTo=a=c.renderTo;if(xa(a))this.renderTo=a=y.getElementById(a);a||X(13,!0);d=C(K(a,"data-highcharts-chart"));!isNaN(d)&&S[d]&&S[d].hasRendered&&S[d].destroy();K(a,"data-highcharts-chart",this.index);a.innerHTML="";!c.skipClone&&!a.offsetWidth&&this.cloneRenderTo();this.getChartSize();d=this.chartWidth;e=this.chartHeight;this.container= +a=Z(La,{className:"highcharts-container"+(c.className?" "+c.className:""),id:f},u({position:"relative",overflow:"hidden",width:d+"px",height:e+"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)"},c.style),this.renderToClone||a);this._cursor=a.style.cursor;this.renderer=new (B[c.renderer]||cb)(a,d,e,c.style,c.forExport,b.exporting&&b.exporting.allowHTML);ha&&this.renderer.create(this,a,d,e);this.renderer.chartIndex=this.index},getMargins:function(a){var b= +this.spacing,c=this.margin,d=this.titleOffset;this.resetMargins();if(d&&!q(c[0]))this.plotTop=t(this.plotTop,d+this.options.title.margin+b[0]);this.legend.adjustMargins(c,b);this.extraBottomMargin&&(this.marginBottom+=this.extraBottomMargin);this.extraTopMargin&&(this.plotTop+=this.extraTopMargin);a||this.getAxisMargins()},getAxisMargins:function(){var a=this,b=a.axisOffset=[0,0,0,0],c=a.margin;a.hasCartesianSeries&&o(a.axes,function(a){a.visible&&a.getOffset()});o(nb,function(d,e){q(c[e])||(a[d]+= +b[e])});a.setChartSize()},reflow:function(a){var b=this,c=b.options.chart,d=b.renderTo,e=c.width||ja(d,"width"),f=c.height||ja(d,"height"),c=a?a.target:E;if(!b.hasUserSize&&!b.isPrinting&&e&&f&&(c===E||c===y)){if(e!==b.containerWidth||f!==b.containerHeight)clearTimeout(b.reflowTimeout),b.reflowTimeout=Pa(function(){if(b.container)b.setSize(e,f,!1),b.hasUserSize=null},a?100:0);b.containerWidth=e;b.containerHeight=f}},initReflow:function(){var a=this,b=function(b){a.reflow(b)};M(E,"resize",b);M(a,"destroy", +function(){V(E,"resize",b)})},setSize:function(a,b,c){var d=this,e,f,g=d.renderer;d.isResizing+=1;Ua(c,d);d.oldChartHeight=d.chartHeight;d.oldChartWidth=d.chartWidth;if(q(a))d.chartWidth=e=t(0,A(a)),d.hasUserSize=!!e;if(q(b))d.chartHeight=f=t(0,A(b));a=g.globalAnimation;(a?Wa:L)(d.container,{width:e+"px",height:f+"px"},a);d.setChartSize(!0);g.setSize(e,f,c);d.maxTicks=null;o(d.axes,function(a){a.isDirty=!0;a.setScale()});o(d.series,function(a){a.isDirty=!0});d.isDirtyLegend=!0;d.isDirtyBox=!0;d.layOutTitles(); +d.getMargins();d.redraw(c);d.oldChartHeight=null;H(d,"resize");a=g.globalAnimation;Pa(function(){d&&H(d,"endResize",null,function(){d.isResizing-=1})},a===!1?0:a&&a.duration||500)},setChartSize:function(a){var b=this.inverted,c=this.renderer,d=this.chartWidth,e=this.chartHeight,f=this.options.chart,g=this.spacing,h=this.clipOffset,i,k,j,l;this.plotLeft=i=A(this.plotLeft);this.plotTop=k=A(this.plotTop);this.plotWidth=j=t(0,A(d-i-this.marginRight));this.plotHeight=l=t(0,A(e-k-this.marginBottom));this.plotSizeX= +b?l:j;this.plotSizeY=b?j:l;this.plotBorderWidth=f.plotBorderWidth||0;this.spacingBox=c.spacingBox={x:g[3],y:g[0],width:d-g[3]-g[1],height:e-g[0]-g[2]};this.plotBox=c.plotBox={x:i,y:k,width:j,height:l};d=2*T(this.plotBorderWidth/2);b=ua(t(d,h[3])/2);c=ua(t(d,h[0])/2);this.clipBox={x:b,y:c,width:T(this.plotSizeX-t(d,h[1])/2-b),height:t(0,T(this.plotSizeY-t(d,h[2])/2-c))};a||o(this.axes,function(a){a.setAxisSize();a.setAxisTranslation()})},resetMargins:function(){var a=this;o(nb,function(b,c){a[b]=p(a.margin[c], +a.spacing[c])});a.axisOffset=[0,0,0,0];a.clipOffset=[0,0,0,0]},drawChartBox:function(){var a=this.options.chart,b=this.renderer,c=this.chartWidth,d=this.chartHeight,e=this.chartBackground,f=this.plotBackground,g=this.plotBorder,h=this.plotBGImage,i=a.borderWidth||0,k=a.backgroundColor,j=a.plotBackgroundColor,l=a.plotBackgroundImage,m=a.plotBorderWidth||0,n,r=this.plotLeft,p=this.plotTop,o=this.plotWidth,v=this.plotHeight,x=this.plotBox,w=this.clipRect,t=this.clipBox;n=i+(a.shadow?8:0);if(i||k)if(e)e.animate(e.crisp({width:c- +n,height:d-n}));else{e={fill:k||"none"};if(i)e.stroke=a.borderColor,e["stroke-width"]=i;this.chartBackground=b.rect(n/2,n/2,c-n,d-n,a.borderRadius,i).attr(e).addClass("highcharts-background").add().shadow(a.shadow)}if(j)f?f.animate(x):this.plotBackground=b.rect(r,p,o,v,0).attr({fill:j}).add().shadow(a.plotShadow);if(l)h?h.animate(x):this.plotBGImage=b.image(l,r,p,o,v).add();w?w.animate({width:t.width,height:t.height}):this.clipRect=b.clipRect(t);if(m)g?(g.strokeWidth=-m,g.animate(g.crisp({x:r,y:p, +width:o,height:v}))):this.plotBorder=b.rect(r,p,o,v,0,-m).attr({stroke:a.plotBorderColor,"stroke-width":m,fill:"none",zIndex:1}).add();this.isDirtyBox=!1},propFromSeries:function(){var a=this,b=a.options.chart,c,d=a.options.series,e,f;o(["inverted","angular","polar"],function(g){c=I[b.type||b.defaultSeriesType];f=a[g]||b[g]||c&&c.prototype[g];for(e=d&&d.length;!f&&e--;)(c=I[d[e].type])&&c.prototype[g]&&(f=!0);a[g]=f})},linkSeries:function(){var a=this,b=a.series;o(b,function(a){a.linkedSeries.length= +0});o(b,function(b){var d=b.options.linkedTo;if(xa(d)&&(d=d===":previous"?a.series[b.index-1]:a.get(d)))d.linkedSeries.push(b),b.linkedParent=d,b.visible=p(b.options.visible,d.options.visible,b.visible)})},renderSeries:function(){o(this.series,function(a){a.translate();a.render()})},renderLabels:function(){var a=this,b=a.options.labels;b.items&&o(b.items,function(c){var d=u(b.style,c.style),e=C(d.left)+a.plotLeft,f=C(d.top)+a.plotTop+12;delete d.left;delete d.top;a.renderer.text(c.html,e,f).attr({zIndex:2}).css(d).add()})}, +render:function(){var a=this.axes,b=this.renderer,c=this.options,d,e,f,g;this.setTitle();this.legend=new ob(this,c.legend);this.getStacks&&this.getStacks();this.getMargins(!0);this.setChartSize();d=this.plotWidth;e=this.plotHeight-=21;o(a,function(a){a.setScale()});this.getAxisMargins();f=d/this.plotWidth>1.1;g=e/this.plotHeight>1.05;if(f||g)this.maxTicks=null,o(a,function(a){(a.horiz&&f||!a.horiz&&g)&&a.setTickInterval(!0)}),this.getMargins();this.drawChartBox();this.hasCartesianSeries&&o(a,function(a){a.visible&& +a.render()});if(!this.seriesGroup)this.seriesGroup=b.g("series-group").attr({zIndex:3}).add();this.renderSeries();this.renderLabels();this.showCredits(c.credits);this.hasRendered=!0},showCredits:function(a){if(a.enabled&&!this.credits)this.credits=this.renderer.text(a.text,0,0).on("click",function(){if(a.href)E.location.href=a.href}).attr({align:a.position.align,zIndex:8}).css(a.style).add().align(a.position)},destroy:function(){var a=this,b=a.axes,c=a.series,d=a.container,e,f=d&&d.parentNode;H(a, +"destroy");S[a.index]=z;eb--;a.renderTo.removeAttribute("data-highcharts-chart");V(a);for(e=b.length;e--;)b[e]=b[e].destroy();for(e=c.length;e--;)c[e]=c[e].destroy();o("title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,pointer,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer".split(","),function(b){var c=a[b];c&&c.destroy&&(a[b]=c.destroy())});if(d)d.innerHTML="",V(d),f&&Ta(d);for(e in a)delete a[e]},isReadyToRender:function(){var a=this; +return!ca&&E==E.top&&y.readyState!=="complete"||ha&&!E.canvg?(ha?Ob.push(function(){a.firstRender()},a.options.global.canvasToolsURL):y.attachEvent("onreadystatechange",function(){y.detachEvent("onreadystatechange",a.firstRender);y.readyState==="complete"&&a.firstRender()}),!1):!0},firstRender:function(){var a=this,b=a.options;if(a.isReadyToRender()){a.getContainer();H(a,"init");a.resetMargins();a.setChartSize();a.propFromSeries();a.getAxes();o(b.series||[],function(b){a.initSeries(b)});a.linkSeries(); +H(a,"beforeRender");if(B.Pointer)a.pointer=new Xa(a,b);a.render();a.renderer.draw();if(!a.renderer.imgCount)a.onload();a.cloneRenderTo(!0)}},onload:function(){var a=this;o([this.callback].concat(this.callbacks),function(b){b&&a.index!==void 0&&b.apply(a,[a])});a.renderer.imgCount||H(a,"load")},splashArray:function(a,b){var c=b[a],c=Y(c)?c:[c,c,c,c];return[p(b[a+"Top"],c[0]),p(b[a+"Right"],c[1]),p(b[a+"Bottom"],c[2]),p(b[a+"Left"],c[3])]}};var Cb=B.CenteredSeriesMixin={getCenter:function(){var a=this.options, +b=this.chart,c=2*(a.slicedOffset||0),d=b.plotWidth-2*c,b=b.plotHeight-2*c,e=a.center,e=[p(e[0],"50%"),p(e[1],"50%"),a.size||"100%",a.innerSize||0],f=F(d,b),g,h;for(g=0;g<4;++g)h=e[g],a=g<2||g===2&&/%$/.test(h),e[g]=(/%$/.test(h)?[d,b,f,e[2]][g]*parseFloat(h)/100:parseFloat(h))+(a?c:0);e[3]>e[2]&&(e[3]=e[2]);return e}},Ha=function(){};Ha.prototype={init:function(a,b,c){this.series=a;this.color=a.color;this.applyOptions(b,c);this.pointAttr={};if(a.options.colorByPoint&&(b=a.options.colors||a.chart.options.colors, +this.color=this.color||b[a.colorCounter++],a.colorCounter===b.length))a.colorCounter=0;a.chart.pointCount++;return this},applyOptions:function(a,b){var c=this.series,d=c.options.pointValKey||c.pointValKey,a=Ha.prototype.optionsToObject.call(this,a);u(this,a);this.options=this.options?u(this.options,a):a;if(d)this.y=this[d];this.isNull=this.y===null;if(typeof this.x!=="number"&&c)this.x=b===void 0?c.autoIncrement():b;return this},optionsToObject:function(a){var b={},c=this.series,d=c.options.keys, +e=d||c.pointArrayMap||["y"],f=e.length,g=0,h=0;if(typeof a==="number"||a===null)b[e[0]]=a;else if(Ia(a)){if(!d&&a.length>f){c=typeof a[0];if(c==="string")b.name=a[0];else if(c==="number")b.x=a[0];g++}for(;h<f;){if(!d||a[g]!==void 0)b[e[h]]=a[g];g++;h++}}else if(typeof a==="object"){b=a;if(a.dataLabels)c._hasPointLabels=!0;if(a.marker)c._hasPointMarkers=!0}return b},destroy:function(){var a=this.series.chart,b=a.hoverPoints,c;a.pointCount--;if(b&&(this.setState(),oa(b,this),!b.length))a.hoverPoints= +null;if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)V(this),this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(c in this)this[c]=null},destroyElements:function(){for(var a=["graphic","dataLabel","dataLabelUpper","connector","shadowGroup"],b,c=6;c--;)b=a[c],this[b]&&(this[b]=this[b].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,color:this.color,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage, +total:this.total||this.stackTotal}},tooltipFormatter:function(a){var b=this.series,c=b.tooltipOptions,d=p(c.valueDecimals,""),e=c.valuePrefix||"",f=c.valueSuffix||"";o(b.pointArrayMap||["y"],function(b){b="{point."+b;if(e||f)a=a.replace(b+"}",e+b+"}"+f);a=a.replace(b+"}",b+":,."+d+"f}")});return Ka(a,{point:this,series:this.series})},firePointEvent:function(a,b,c){var d=this,e=this.series.options;(e.point.events[a]||d.options&&d.options.events&&d.options.events[a])&&this.importEvents();a==="click"&& +e.allowPointSelect&&(c=function(a){d.select&&d.select(null,a.ctrlKey||a.metaKey||a.shiftKey)});H(this,a,b,c)},visible:!0};var Q=B.Series=function(){};Q.prototype={isCartesian:!0,type:"line",pointClass:Ha,sorted:!0,requireSorting:!0,pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth",fill:"fillColor",r:"radius"},directTouch:!1,axisTypes:["xAxis","yAxis"],colorCounter:0,parallelArrays:["x","y"],init:function(a,b){var c=this,d,e,f=a.series,g=function(a,b){return p(a.options.index,a._i)- +p(b.options.index,b._i)};c.chart=a;c.options=b=c.setOptions(b);c.linkedSeries=[];c.bindAxes();u(c,{name:b.name,state:"",pointAttr:{},visible:b.visible!==!1,selected:b.selected===!0});if(ha)b.animation=!1;e=b.events;for(d in e)M(c,d,e[d]);if(e&&e.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;c.getColor();c.getSymbol();o(c.parallelArrays,function(a){c[a+"Data"]=[]});c.setData(b.data,!1);if(c.isCartesian)a.hasCartesianSeries=!0;f.push(c);c._i=f.length- +1;ib(f,g);this.yAxis&&ib(this.yAxis.series,g);o(f,function(a,b){a.index=b;a.name=a.name||"Series "+(b+1)})},bindAxes:function(){var a=this,b=a.options,c=a.chart,d;o(a.axisTypes||[],function(e){o(c[e],function(c){d=c.options;if(b[e]===d.index||b[e]!==z&&b[e]===d.id||b[e]===z&&d.index===0)c.series.push(a),a[e]=c,c.isDirty=!0});!a[e]&&a.optionalAxis!==e&&X(18,!0)})},updateParallelArrays:function(a,b){var c=a.series,d=arguments;o(c.parallelArrays,typeof b==="number"?function(d){var f=d==="y"&&c.toYData? +c.toYData(a):a[d];c[d+"Data"][b]=f}:function(a){Array.prototype[b].apply(c[a+"Data"],Array.prototype.slice.call(d,2))})},autoIncrement:function(){var a=this.options,b=this.xIncrement,c,d=a.pointIntervalUnit,b=p(b,a.pointStart,0);this.pointInterval=c=p(this.pointInterval,a.pointInterval,1);if(d==="month"||d==="year")a=new qa(b),a=d==="month"?+a[xb](a[ab]()+c):+a[yb](a[bb]()+c),c=a-b;this.xIncrement=b+c;return b},setOptions:function(a){var b=this.chart,c=b.options.plotOptions,b=b.userOptions||{},d= +b.plotOptions||{},e=c[this.type];this.userOptions=a;c=D(e,c.series,a);this.tooltipOptions=D(N.tooltip,N.plotOptions[this.type].tooltip,b.tooltip,d.series&&d.series.tooltip,d[this.type]&&d[this.type].tooltip,a.tooltip);e.marker===null&&delete c.marker;this.zoneAxis=c.zoneAxis;a=this.zones=(c.zones||[]).slice();if((c.negativeColor||c.negativeFillColor)&&!c.zones)a.push({value:c[this.zoneAxis+"Threshold"]||c.threshold||0,color:c.negativeColor,fillColor:c.negativeFillColor});a.length&&q(a[a.length-1].value)&& +a.push({color:this.color,fillColor:this.fillColor});return c},getCyclic:function(a,b,c){var d=this.userOptions,e="_"+a+"Index",f=a+"Counter";b||(q(d[e])?b=d[e]:(d[e]=b=this.chart[f]%c.length,this.chart[f]+=1),b=c[b]);this[a]=b},getColor:function(){this.options.colorByPoint?this.options.color=null:this.getCyclic("color",this.options.color||aa[this.type].color,this.chart.options.colors)},getSymbol:function(){var a=this.options.marker;this.getCyclic("symbol",a.symbol,this.chart.options.symbols);if(/^url/.test(this.symbol))a.radius= +0},drawLegendSymbol:J.drawLineMarker,setData:function(a,b,c,d){var e=this,f=e.points,g=f&&f.length||0,h,i=e.options,k=e.chart,j=null,l=e.xAxis,m=l&&!!l.categories,n=i.turboThreshold,r=this.xData,s=this.yData,t=(h=e.pointArrayMap)&&h.length,a=a||[];h=a.length;b=p(b,!0);if(d!==!1&&h&&g===h&&!e.cropped&&!e.hasGroupedData&&e.visible)o(a,function(a,b){f[b].update&&a!==i.data[b]&&f[b].update(a,!1,null,!1)});else{e.xIncrement=null;e.colorCounter=0;o(this.parallelArrays,function(a){e[a+"Data"].length=0}); +if(n&&h>n){for(c=0;j===null&&c<h;)j=a[c],c++;if(ma(j)){m=p(i.pointStart,0);j=p(i.pointInterval,1);for(c=0;c<h;c++)r[c]=m,s[c]=a[c],m+=j;e.xIncrement=m}else if(Ia(j))if(t)for(c=0;c<h;c++)j=a[c],r[c]=j[0],s[c]=j.slice(1,t+1);else for(c=0;c<h;c++)j=a[c],r[c]=j[0],s[c]=j[1];else X(12)}else for(c=0;c<h;c++)if(a[c]!==z&&(j={series:e},e.pointClass.prototype.applyOptions.apply(j,[a[c]]),e.updateParallelArrays(j,c),m&&q(j.name)))l.names[j.x]=j.name;xa(s[0])&&X(14,!0);e.data=[];e.options.data=e.userOptions.data= +a;for(c=g;c--;)f[c]&&f[c].destroy&&f[c].destroy();if(l)l.minRange=l.userMinRange;e.isDirty=e.isDirtyData=k.isDirtyBox=!0;c=!1}i.legendType==="point"&&(this.processData(),this.generatePoints());b&&k.redraw(c)},processData:function(a){var b=this.xData,c=this.yData,d=b.length,e;e=0;var f,g,h=this.xAxis,i,k=this.options;i=k.cropThreshold;var j=this.getExtremesFromAll||k.getExtremesFromAll,l=this.isCartesian,k=h&&h.val2lin,m=h&&h.isLog,n,p;if(l&&!this.isDirty&&!h.isDirty&&!this.yAxis.isDirty&&!a)return!1; +if(h)a=h.getExtremes(),n=a.min,p=a.max;if(l&&this.sorted&&!j&&(!i||d>i||this.forceCrop))if(b[d-1]<n||b[0]>p)b=[],c=[];else if(b[0]<n||b[d-1]>p)e=this.cropData(this.xData,this.yData,n,p),b=e.xData,c=e.yData,e=e.start,f=!0;for(i=b.length||1;--i;)d=m?k(b[i])-k(b[i-1]):b[i]-b[i-1],d>0&&(g===z||d<g)?g=d:d<0&&this.requireSorting&&X(15);this.cropped=f;this.cropStart=e;this.processedXData=b;this.processedYData=c;this.closestPointRange=g},cropData:function(a,b,c,d){var e=a.length,f=0,g=e,h=p(this.cropShoulder, +1),i;for(i=0;i<e;i++)if(a[i]>=c){f=t(0,i-h);break}for(c=i;c<e;c++)if(a[c]>d){g=c+h;break}return{xData:a.slice(f,g),yData:b.slice(f,g),start:f,end:g}},generatePoints:function(){var a=this.options.data,b=this.data,c,d=this.processedXData,e=this.processedYData,f=this.pointClass,g=d.length,h=this.cropStart||0,i,k=this.hasGroupedData,j,l=[],m;if(!b&&!k)b=[],b.length=a.length,b=this.data=b;for(m=0;m<g;m++)i=h+m,k?l[m]=(new f).init(this,[d[m]].concat(ta(e[m]))):(b[i]?j=b[i]:a[i]!==z&&(b[i]=j=(new f).init(this, +a[i],d[m])),l[m]=j),l[m].index=i;if(b&&(g!==(c=b.length)||k))for(m=0;m<c;m++)if(m===h&&!k&&(m+=g),b[m])b[m].destroyElements(),b[m].plotX=z;this.data=b;this.points=l},getExtremes:function(a){var b=this.yAxis,c=this.processedXData,d,e=[],f=0;d=this.xAxis.getExtremes();var g=d.min,h=d.max,i,k,j,l,a=a||this.stackedYData||this.processedYData;d=a.length;for(l=0;l<d;l++)if(k=c[l],j=a[l],i=j!==null&&j!==z&&(!b.isLog||j.length||j>0),k=this.getExtremesFromAll||this.options.getExtremesFromAll||this.cropped|| +(c[l+1]||k)>=g&&(c[l-1]||k)<=h,i&&k)if(i=j.length)for(;i--;)j[i]!==null&&(e[f++]=j[i]);else e[f++]=j;this.dataMin=Ra(e);this.dataMax=Ea(e)},translate:function(){this.processedXData||this.processData();this.generatePoints();for(var a=this.options,b=a.stacking,c=this.xAxis,d=c.categories,e=this.yAxis,f=this.points,g=f.length,h=!!this.modifyValue,i=a.pointPlacement,k=i==="between"||ma(i),j=a.threshold,l=a.startFromThreshold?j:0,m,n,r,o,R=Number.MAX_VALUE,a=0;a<g;a++){var v=f[a],x=v.x,w=v.y;n=v.low;var u= +b&&e.stacks[(this.negStacks&&w<(l?0:j)?"-":"")+this.stackKey];if(e.isLog&&w!==null&&w<=0)v.y=w=null,X(10);v.plotX=m=F(t(-1E5,c.translate(x,0,0,0,1,i,this.type==="flags")),1E5);if(b&&this.visible&&!v.isNull&&u&&u[x])o=this.getStackIndicator(o,x,this.index),u=u[x],w=u.points[o.key],n=w[0],w=w[1],n===l&&(n=p(j,e.min)),e.isLog&&n<=0&&(n=null),v.total=v.stackTotal=u.total,v.percentage=u.total&&v.y/u.total*100,v.stackY=w,u.setOffset(this.pointXOffset||0,this.barW||0);v.yBottom=q(n)?e.translate(n,0,1,0, +1):null;h&&(w=this.modifyValue(w,v));v.plotY=n=typeof w==="number"&&w!==Infinity?F(t(-1E5,e.translate(w,0,1,0,1)),1E5):z;v.isInside=n!==z&&n>=0&&n<=e.len&&m>=0&&m<=c.len;v.clientX=k?c.translate(x,0,0,0,1):m;v.negative=v.y<(j||0);v.category=d&&d[v.x]!==z?d[v.x]:v.x;a&&(R=F(R,P(m-r)));r=m}this.closestPointRangePx=R},getValidPoints:function(a){return Na(a||this.points,function(a){return!a.isNull})},setClip:function(a){var b=this.chart,c=this.options,d=b.renderer,e=b.inverted,f=this.clipBox,g=f||b.clipBox, +h=this.sharedClipKey||["_sharedClip",a&&a.duration,a&&a.easing,g.height,c.xAxis,c.yAxis].join(","),i=b[h],k=b[h+"m"];if(!i){if(a)g.width=0,b[h+"m"]=k=d.clipRect(-99,e?-b.plotLeft:-b.plotTop,99,e?b.chartWidth:b.chartHeight);b[h]=i=d.clipRect(g)}a&&(i.count+=1);if(c.clip!==!1)this.group.clip(a||f?i:b.clipRect),this.markerGroup.clip(k),this.sharedClipKey=h;a||(i.count-=1,i.count<=0&&h&&b[h]&&(f||(b[h]=b[h].destroy()),b[h+"m"]&&(b[h+"m"]=b[h+"m"].destroy())))},animate:function(a){var b=this.chart,c=this.options.animation, +d;if(c&&!Y(c))c=aa[this.type].animation;a?this.setClip(c):(d=this.sharedClipKey,(a=b[d])&&a.animate({width:b.plotSizeX},c),b[d+"m"]&&b[d+"m"].animate({width:b.plotSizeX+99},c),this.animate=null)},afterAnimate:function(){this.setClip();H(this,"afterAnimate")},drawPoints:function(){var a,b=this.points,c=this.chart,d,e,f,g,h,i,k,j,l=this.options.marker,m=this.pointAttr[""],n,r,o,t=this.markerGroup,v=p(l.enabled,this.xAxis.isRadial,this.closestPointRangePx>2*l.radius);if(l.enabled!==!1||this._hasPointMarkers)for(f= +b.length;f--;)if(g=b[f],d=T(g.plotX),e=g.plotY,j=g.graphic,n=g.marker||{},r=!!g.marker,a=v&&n.enabled===z||n.enabled,o=g.isInside,a&&e!==z&&!isNaN(e)&&g.y!==null)if(a=g.pointAttr[g.selected?"select":""]||m,h=a.r,i=p(n.symbol,this.symbol),k=i.indexOf("url")===0,j)j[o?"show":"hide"](!0).attr(a).animate(u({x:d-h,y:e-h},j.symbolName?{width:2*h,height:2*h}:{}));else{if(o&&(h>0||k))g.graphic=c.renderer.symbol(i,d-h,e-h,2*h,2*h,r?n:l).attr(a).add(t)}else if(j)g.graphic=j.destroy()},convertAttribs:function(a, +b,c,d){var e=this.pointAttrToOptions,f,g,h={},a=a||{},b=b||{},c=c||{},d=d||{};for(f in e)g=e[f],h[f]=p(a[g],b[f],c[f],d[f]);return h},getAttribs:function(){var a=this,b=a.options,c=aa[a.type].marker?b.marker:b,d=c.states,e=d.hover,f,g=a.color,h=a.options.negativeColor;f={stroke:g,fill:g};var i=a.points||[],k,j,l=[],m=a.pointAttrToOptions;k=a.hasPointSpecificOptions;var n=c.lineColor,r=c.fillColor;j=b.turboThreshold;var s=a.zones,t=a.zoneAxis||"y",v;b.marker?(e.radius=e.radius||c.radius+e.radiusPlus, +e.lineWidth=e.lineWidth||c.lineWidth+e.lineWidthPlus):(e.color=e.color||ia(e.color||g).brighten(e.brightness).get(),e.negativeColor=e.negativeColor||ia(e.negativeColor||h).brighten(e.brightness).get());l[""]=a.convertAttribs(c,f);o(["hover","select"],function(b){l[b]=a.convertAttribs(d[b],l[""])});a.pointAttr=l;g=i.length;if(!j||g<j||k)for(;g--;){j=i[g];if((c=j.options&&j.options.marker||j.options)&&c.enabled===!1)c.radius=0;if(s.length){k=0;for(f=s[k];j[t]>=f.value;)f=s[++k];j.color=j.fillColor= +p(f.color,a.color)}k=b.colorByPoint||j.color;if(j.options)for(v in m)q(c[m[v]])&&(k=!0);if(k){c=c||{};k=[];d=c.states||{};f=d.hover=d.hover||{};if(!b.marker||j.negative&&!f.fillColor&&!e.fillColor)f[a.pointAttrToOptions.fill]=f.color||!j.options.color&&e[j.negative&&h?"negativeColor":"color"]||ia(j.color).brighten(f.brightness||e.brightness).get();f={color:j.color};if(!r)f.fillColor=j.color;if(!n)f.lineColor=j.color;c.hasOwnProperty("color")&&!c.color&&delete c.color;k[""]=a.convertAttribs(u(f,c), +l[""]);k.hover=a.convertAttribs(d.hover,l.hover,k[""]);k.select=a.convertAttribs(d.select,l.select,k[""])}else k=l;j.pointAttr=k}},destroy:function(){var a=this,b=a.chart,c=/AppleWebKit\/533/.test(za),d,e=a.data||[],f,g,h;H(a,"destroy");V(a);o(a.axisTypes||[],function(b){if(h=a[b])oa(h.series,a),h.isDirty=h.forceRedraw=!0});a.legendItem&&a.chart.legend.destroyItem(a);for(d=e.length;d--;)(f=e[d])&&f.destroy&&f.destroy();a.points=null;clearTimeout(a.animationTimeout);for(g in a)a[g]instanceof O&&!a[g].survive&& +(d=c&&g==="group"?"hide":"destroy",a[g][d]());if(b.hoverSeries===a)b.hoverSeries=null;oa(b.series,a);for(g in a)delete a[g]},getGraphPath:function(a,b,c){var d=this,e=d.options,f=e.step,g,h=[],i,a=a||d.points;(g=a.reversed)&&a.reverse();(f={right:1,center:2}[f]||f&&3)&&g&&(f=4-f);e.connectNulls&&!b&&!c&&(a=this.getValidPoints(a));o(a,function(g,j){var l=g.plotX,m=g.plotY,n=a[j-1];if((g.leftCliff||n&&n.rightCliff)&&!c)i=!0;g.isNull&&!q(b)&&j>0?i=!e.connectNulls:g.isNull&&!b?i=!0:(j===0||i?n=["M",g.plotX, +g.plotY]:d.getPointSpline?n=d.getPointSpline(a,g,j):f?(n=f===1?["L",n.plotX,m]:f===2?["L",(n.plotX+l)/2,n.plotY,"L",(n.plotX+l)/2,m]:["L",l,n.plotY],n.push("L",l,m)):n=["L",l,m],h.push.apply(h,n),i=!1)});return d.graphPath=h},drawGraph:function(){var a=this,b=this.options,c=[["graph",b.lineColor||this.color,b.dashStyle]],d=b.lineWidth,e=b.linecap!=="square",f=(this.gappedPath||this.getGraphPath).call(this),g=this.fillGraph&&this.color||"none";o(this.zones,function(d,e){c.push(["zoneGraph"+e,d.color|| +a.color,d.dashStyle||b.dashStyle])});o(c,function(c,i){var k=c[0],j=a[k];if(j)j.animate({d:f});else if((d||g)&&f.length)j={stroke:c[1],"stroke-width":d,fill:g,zIndex:1},c[2]?j.dashstyle=c[2]:e&&(j["stroke-linecap"]=j["stroke-linejoin"]="round"),a[k]=a.chart.renderer.path(f).attr(j).add(a.group).shadow(i<2&&b.shadow)})},applyZones:function(){var a=this,b=this.chart,c=b.renderer,d=this.zones,e,f,g=this.clips||[],h,i=this.graph,k=this.area,j=t(b.chartWidth,b.chartHeight),l=this[(this.zoneAxis||"y")+ +"Axis"],m,n=l.reversed,r=b.inverted,s=l.horiz,q,v,x,w=!1;if(d.length&&(i||k)&&l.min!==z)i&&i.hide(),k&&k.hide(),m=l.getExtremes(),o(d,function(d,o){e=n?s?b.plotWidth:0:s?0:l.toPixels(m.min);e=F(t(p(f,e),0),j);f=F(t(A(l.toPixels(p(d.value,m.max),!0)),0),j);w&&(e=f=l.toPixels(m.max));q=Math.abs(e-f);v=F(e,f);x=t(e,f);if(l.isXAxis){if(h={x:r?x:v,y:0,width:q,height:j},!s)h.x=b.plotHeight-h.x}else if(h={x:0,y:r?x:v,width:j,height:q},s)h.y=b.plotWidth-h.y;b.inverted&&c.isVML&&(h=l.isXAxis?{x:0,y:n?v:x, +height:h.width,width:b.chartWidth}:{x:h.y-b.plotLeft-b.spacingBox.x,y:0,width:h.height,height:b.chartHeight});g[o]?g[o].animate(h):(g[o]=c.clipRect(h),i&&a["zoneGraph"+o].clip(g[o]),k&&a["zoneArea"+o].clip(g[o]));w=d.value>m.max}),this.clips=g},invertGroups:function(){function a(){var a={width:b.yAxis.len,height:b.xAxis.len};o(["group","markerGroup"],function(c){b[c]&&b[c].attr(a).invert()})}var b=this,c=b.chart;if(b.xAxis)M(c,"resize",a),M(b,"destroy",function(){V(c,"resize",a)}),a(),b.invertGroups= +a},plotGroup:function(a,b,c,d,e){var f=this[a],g=!f;g&&(this[a]=f=this.chart.renderer.g(b).attr({zIndex:d||0.1}).add(e),f.addClass("highcharts-series-"+this.index));f.attr({visibility:c})[g?"attr":"animate"](this.getPlotBox());return f},getPlotBox:function(){var a=this.chart,b=this.xAxis,c=this.yAxis;if(a.inverted)b=c,c=this.xAxis;return{translateX:b?b.left:a.plotLeft,translateY:c?c.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this,b=a.chart,c,d=a.options,e=(c=d.animation)&&!!a.animate&& +b.renderer.isSVG&&p(c.duration,500)||0,f=a.visible?"inherit":"hidden",g=d.zIndex,h=a.hasRendered,i=b.seriesGroup;c=a.plotGroup("group","series",f,g,i);a.markerGroup=a.plotGroup("markerGroup","markers",f,g,i);e&&a.animate(!0);a.getAttribs();c.inverted=a.isCartesian?b.inverted:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());o(a.points,function(a){a.redraw&&a.redraw()});a.drawDataLabels&&a.drawDataLabels();a.visible&&a.drawPoints();a.drawTracker&&a.options.enableMouseTracking!==!1&&a.drawTracker();b.inverted&& +a.invertGroups();d.clip!==!1&&!a.sharedClipKey&&!h&&c.clip(b.clipRect);e&&a.animate();if(!h)a.animationTimeout=Pa(function(){a.afterAnimate()},e);a.isDirty=a.isDirtyData=!1;a.hasRendered=!0},redraw:function(){var a=this.chart,b=this.isDirtyData,c=this.isDirty,d=this.group,e=this.xAxis,f=this.yAxis;d&&(a.inverted&&d.attr({width:a.plotWidth,height:a.plotHeight}),d.animate({translateX:p(e&&e.left,a.plotLeft),translateY:p(f&&f.top,a.plotTop)}));this.translate();this.render();b&&H(this,"updatedData"); +(c||b)&&delete this.kdTree},kdDimensions:1,kdAxisArray:["clientX","plotY"],searchPoint:function(a,b){var c=this.xAxis,d=this.yAxis,e=this.chart.inverted;return this.searchKDTree({clientX:e?c.len-a.chartY+c.pos:a.chartX-c.pos,plotY:e?d.len-a.chartX+d.pos:a.chartY-d.pos},b)},buildKDTree:function(){function a(c,e,f){var g,h;if(h=c&&c.length)return g=b.kdAxisArray[e%f],c.sort(function(a,b){return a[g]-b[g]}),h=Math.floor(h/2),{point:c[h],left:a(c.slice(0,h),e+1,f),right:a(c.slice(h+1),e+1,f)}}var b=this, +c=b.kdDimensions;delete b.kdTree;Pa(function(){b.kdTree=a(b.getValidPoints(),c,c)},b.options.kdNow?0:1)},searchKDTree:function(a,b){function c(a,b,k,j){var l=b.point,m=d.kdAxisArray[k%j],n,p,o=l;p=q(a[e])&&q(l[e])?Math.pow(a[e]-l[e],2):null;n=q(a[f])&&q(l[f])?Math.pow(a[f]-l[f],2):null;n=(p||0)+(n||0);l.dist=q(n)?Math.sqrt(n):Number.MAX_VALUE;l.distX=q(p)?Math.sqrt(p):Number.MAX_VALUE;m=a[m]-l[m];n=m<0?"left":"right";p=m<0?"right":"left";b[n]&&(n=c(a,b[n],k+1,j),o=n[g]<o[g]?n:l);b[p]&&Math.sqrt(m* +m)<o[g]&&(a=c(a,b[p],k+1,j),o=a[g]<o[g]?a:o);return o}var d=this,e=this.kdAxisArray[0],f=this.kdAxisArray[1],g=b?"distX":"dist";this.kdTree||this.buildKDTree();if(this.kdTree)return c(a,this.kdTree,this.kdDimensions,this.kdDimensions)}};Kb.prototype={destroy:function(){Sa(this,this.axis)},render:function(a){var b=this.options,c=b.format,c=c?Ka(c,this):b.formatter.call(this);this.label?this.label.attr({text:c,visibility:"hidden"}):this.label=this.axis.chart.renderer.text(c,null,null,b.useHTML).css(b.style).attr({align:this.textAlign, +rotation:b.rotation,visibility:"hidden"}).add(a)},setOffset:function(a,b){var c=this.axis,d=c.chart,e=d.inverted,f=c.reversed,f=this.isNegative&&!f||!this.isNegative&&f,g=c.translate(c.usePercentage?100:this.total,0,0,0,1),c=c.translate(0),c=P(g-c),h=d.xAxis[0].translate(this.x)+a,i=d.plotHeight,f={x:e?f?g:g-c:h,y:e?i-h-b:f?i-g-c:i-g,width:e?c:b,height:e?b:c};if(e=this.label)e.align(this.alignOptions,null,f),f=e.alignAttr,e[this.options.crop===!1||d.isInsidePlot(f.x,f.y)?"show":"hide"](!0)}};hb.prototype.getStacks= +function(){var a=this;o(a.yAxis,function(a){if(a.stacks&&a.hasVisibleSeries)a.oldStacks=a.stacks});o(a.series,function(b){if(b.options.stacking&&(b.visible===!0||a.options.chart.ignoreHiddenSeries===!1))b.stackKey=b.type+p(b.options.stack,"")})};ka.prototype.buildStacks=function(){var a=this.series,b,c=p(this.options.reversedStacks,!0),d=a.length,e;if(!this.isXAxis){this.usePercentage=!1;for(e=d;e--;)a[c?e:d-e-1].setStackedPoints();for(e=d;e--;)b=a[c?e:d-e-1],b.setStackCliffs&&b.setStackCliffs(); +if(this.usePercentage)for(e=0;e<d;e++)a[e].setPercentStacks()}};ka.prototype.renderStackTotals=function(){var a=this.chart,b=a.renderer,c=this.stacks,d,e,f=this.stackTotalGroup;if(!f)this.stackTotalGroup=f=b.g("stack-labels").attr({visibility:"visible",zIndex:6}).add();f.translate(a.plotLeft,a.plotTop);for(d in c)for(e in a=c[d],a)a[e].render(f)};ka.prototype.resetStacks=function(){var a=this.stacks,b,c;if(!this.isXAxis)for(b in a)for(c in a[b])a[b][c].touched<this.stacksTouched?(a[b][c].destroy(), +delete a[b][c]):(a[b][c].total=null,a[b][c].cum=0)};ka.prototype.cleanStacks=function(){var a,b,c;if(!this.isXAxis){if(this.oldStacks)a=this.stacks=this.oldStacks;for(b in a)for(c in a[b])a[b][c].cum=a[b][c].total}};Q.prototype.setStackedPoints=function(){if(this.options.stacking&&!(this.visible!==!0&&this.chart.options.chart.ignoreHiddenSeries!==!1)){var a=this.processedXData,b=this.processedYData,c=[],d=b.length,e=this.options,f=e.threshold,g=e.startFromThreshold?f:0,h=e.stack,e=e.stacking,i=this.stackKey, +k="-"+i,j=this.negStacks,l=this.yAxis,m=l.stacks,n=l.oldStacks,o,s,q,v,x,w,u;l.stacksTouched+=1;for(x=0;x<d;x++){w=a[x];u=b[x];o=this.getStackIndicator(o,w,this.index);v=o.key;q=(s=j&&u<(g?0:f))?k:i;m[q]||(m[q]={});if(!m[q][w])n[q]&&n[q][w]?(m[q][w]=n[q][w],m[q][w].total=null):m[q][w]=new Kb(l,l.options.stackLabels,s,w,h);q=m[q][w];if(u!==null)q.points[v]=q.points[this.index]=[p(q.cum,g)],q.touched=l.stacksTouched,o.index>0&&this.singleStacks===!1&&(q.points[v][0]=q.points[this.index+","+w+",0"][0]); +e==="percent"?(s=s?i:k,j&&m[s]&&m[s][w]?(s=m[s][w],q.total=s.total=t(s.total,q.total)+P(u)||0):q.total=fa(q.total+(P(u)||0))):q.total=fa(q.total+(u||0));q.cum=p(q.cum,g)+(u||0);u!==null&&q.points[v].push(q.cum);c[x]=q.cum}if(e==="percent")l.usePercentage=!0;this.stackedYData=c;l.oldStacks={}}};Q.prototype.setPercentStacks=function(){var a=this,b=a.stackKey,c=a.yAxis.stacks,d=a.processedXData,e;o([b,"-"+b],function(b){var f;for(var g=d.length,h,i;g--;)if(h=d[g],e=a.getStackIndicator(e,h,a.index),f= +(i=c[b]&&c[b][h])&&i.points[e.key],h=f)i=i.total?100/i.total:0,h[0]=fa(h[0]*i),h[1]=fa(h[1]*i),a.stackedYData[g]=h[1]})};Q.prototype.getStackIndicator=function(a,b,c){!q(a)||a.x!==b?a={x:b,index:0}:a.index++;a.key=[c,b,a.index].join(",");return a};u(hb.prototype,{addSeries:function(a,b,c){var d,e=this;a&&(b=p(b,!0),H(e,"addSeries",{options:a},function(){d=e.initSeries(a);e.isDirtyLegend=!0;e.linkSeries();b&&e.redraw(c)}));return d},addAxis:function(a,b,c,d){var e=b?"xAxis":"yAxis",f=this.options; +new ka(this,D(a,{index:this[e].length,isX:b}));f[e]=ta(f[e]||{});f[e].push(a);p(c,!0)&&this.redraw(d)},showLoading:function(a){var b=this,c=b.options,d=b.loadingDiv,e=c.loading,f=function(){d&&L(d,{left:b.plotLeft+"px",top:b.plotTop+"px",width:b.plotWidth+"px",height:b.plotHeight+"px"})};if(!d)b.loadingDiv=d=Z(La,{className:"highcharts-loading"},u(e.style,{zIndex:10,display:"none"}),b.container),b.loadingSpan=Z("span",null,e.labelStyle,d),M(b,"redraw",f);b.loadingSpan.innerHTML=a||c.lang.loading; +if(!b.loadingShown)L(d,{opacity:0,display:""}),Wa(d,{opacity:e.style.opacity},{duration:e.showDuration||0}),b.loadingShown=!0;f()},hideLoading:function(){var a=this.options,b=this.loadingDiv;b&&Wa(b,{opacity:0},{duration:a.loading.hideDuration||100,complete:function(){L(b,{display:"none"})}});this.loadingShown=!1}});u(Ha.prototype,{update:function(a,b,c,d){function e(){f.applyOptions(a);if(f.y===null&&h)f.graphic=h.destroy();if(Y(a)&&!Ia(a))f.redraw=function(){if(h&&h.element&&a&&a.marker&&a.marker.symbol)f.graphic= +h.destroy();if(a&&a.dataLabels&&f.dataLabel)f.dataLabel=f.dataLabel.destroy();f.redraw=null};i=f.index;g.updateParallelArrays(f,i);if(l&&f.name)l[f.x]=f.name;j.data[i]=Y(j.data[i])?f.options:a;g.isDirty=g.isDirtyData=!0;if(!g.fixedBox&&g.hasCartesianSeries)k.isDirtyBox=!0;if(j.legendType==="point")k.isDirtyLegend=!0;b&&k.redraw(c)}var f=this,g=f.series,h=f.graphic,i,k=g.chart,j=g.options,l=g.xAxis&&g.xAxis.names,b=p(b,!0);d===!1?e():f.firePointEvent("update",{options:a},e)},remove:function(a,b){this.series.removePoint(sa(this, +this.series.data),a,b)}});u(Q.prototype,{addPoint:function(a,b,c,d){var e=this,f=e.options,g=e.data,h=e.graph,i=e.area,k=e.chart,j=e.xAxis&&e.xAxis.names,l=h&&h.shift||0,m=["graph","area"],h=f.data,n,r=e.xData;Ua(d,k);if(c){for(d=e.zones.length;d--;)m.push("zoneGraph"+d,"zoneArea"+d);o(m,function(a){if(e[a])e[a].shift=l+(f.step?2:1)})}if(i)i.isArea=!0;b=p(b,!0);i={series:e};e.pointClass.prototype.applyOptions.apply(i,[a]);m=i.x;d=r.length;if(e.requireSorting&&m<r[d-1])for(n=!0;d&&r[d-1]>m;)d--;e.updateParallelArrays(i, +"splice",d,0,0);e.updateParallelArrays(i,d);if(j&&i.name)j[m]=i.name;h.splice(d,0,a);n&&(e.data.splice(d,0,null),e.processData());f.legendType==="point"&&e.generatePoints();c&&(g[0]&&g[0].remove?g[0].remove(!1):(g.shift(),e.updateParallelArrays(i,"shift"),h.shift()));e.isDirty=!0;e.isDirtyData=!0;b&&(e.getAttribs(),k.redraw())},removePoint:function(a,b,c){var d=this,e=d.data,f=e[a],g=d.points,h=d.chart,i=function(){g&&g.length===e.length&&g.splice(a,1);e.splice(a,1);d.options.data.splice(a,1);d.updateParallelArrays(f|| +{series:d},"splice",a,1);f&&f.destroy();d.isDirty=!0;d.isDirtyData=!0;b&&h.redraw()};Ua(c,h);b=p(b,!0);f?f.firePointEvent("remove",null,i):i()},remove:function(a,b){var c=this,d=c.chart;H(c,"remove",null,function(){c.destroy();d.isDirtyLegend=d.isDirtyBox=!0;d.linkSeries();p(a,!0)&&d.redraw(b)})},update:function(a,b){var c=this,d=this.chart,e=this.userOptions,f=this.type,g=I[f].prototype,h=["group","markerGroup","dataLabelsGroup"],i;if(a.type&&a.type!==f||a.zIndex!==void 0)h.length=0;o(h,function(a){h[a]= +c[a];delete c[a]});a=D(e,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},a);this.remove(!1);for(i in g)this[i]=z;u(this,I[a.type||f].prototype);o(h,function(a){c[a]=h[a]});this.init(d,a);d.linkSeries();p(b,!0)&&d.redraw(!1)}});u(ka.prototype,{update:function(a,b){var c=this.chart,a=c.options[this.coll][this.options.index]=D(this.userOptions,a);this.destroy(!0);this._addedPlotLB=this.chart._labelPanes=z;this.init(c,u(a,{events:z}));c.isDirtyBox=!0;p(b,!0)&&c.redraw()}, +remove:function(a){for(var b=this.chart,c=this.coll,d=this.series,e=d.length;e--;)d[e]&&d[e].remove(!1);oa(b.axes,this);oa(b[c],this);b.options[c].splice(this.options.index,1);o(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;p(a,!0)&&b.redraw()},setTitle:function(a,b){this.update({title:a},b)},setCategories:function(a,b){this.update({categories:a},b)}});var wa=pa(Q);I.line=wa;aa.area=D(da,{softThreshold:!1,threshold:0});var la=pa(Q,{type:"area",singleStacks:!1,getStackPoints:function(){var a= +[],b=[],c=this.xAxis,d=this.yAxis,e=d.stacks[this.stackKey],f={},g=this.points,h=this.index,i=d.series,k=i.length,j,l=p(d.options.reversedStacks,!0)?1:-1,m,n;if(this.options.stacking){for(m=0;m<g.length;m++)f[g[m].x]=g[m];for(n in e)e[n].total!==null&&b.push(+n);b.sort(function(a,b){return a-b});j=Ba(i,function(){return this.visible});o(b,function(g,i){var n=0,p,q;if(f[g]&&!f[g].isNull)a.push(f[g]),o([-1,1],function(a){var c=a===1?"rightNull":"leftNull",d=0,n=e[b[i+a]];if(n)for(m=h;m>=0&&m<k;)p=n.points[m], +p||(m===h?f[g][c]=!0:j[m]&&(q=e[g].points[m])&&(d-=q[1]-q[0])),m+=l;f[g][a===1?"rightCliff":"leftCliff"]=d});else{for(m=h;m>=0&&m<k;){if(p=e[g].points[m]){n=p[1];break}m+=l}n=d.toPixels(n,!0);a.push({isNull:!0,plotX:c.toPixels(g,!0),plotY:n,yBottom:n})}})}return a},getGraphPath:function(a){var b=Q.prototype.getGraphPath,c=this.options,d=c.stacking,e=this.yAxis,f,g,h=[],i=[],k=this.index,j,l=e.stacks[this.stackKey],m=c.threshold,n=e.getThreshold(c.threshold),o,c=c.connectNulls||d==="percent",s=function(b, +c,f){var g=a[b],b=d&&l[g.x].points[k],p=g[f+"Null"]||0,f=g[f+"Cliff"]||0,o,r,g=!0;f||p?(o=(p?b[0]:b[1])+f,r=b[0]+f,g=!!p):!d&&a[c]&&a[c].isNull&&(o=r=m);o!==void 0&&(i.push({plotX:j,plotY:o===null?n:e.toPixels(o,!0),isNull:g}),h.push({plotX:j,plotY:r===null?n:e.toPixels(r,!0)}))},a=a||this.points;d&&(a=this.getStackPoints());for(f=0;f<a.length;f++)if(g=a[f].isNull,j=p(a[f].rectPlotX,a[f].plotX),o=p(a[f].yBottom,n),!g||c){c||s(f,f-1,"left");if(!g||d||!c)i.push(a[f]),h.push({x:f,plotX:j,plotY:o});c|| +s(f,f+1,"right")}f=b.call(this,i,!0,!0);h.reversed=!0;g=b.call(this,h,!0,!0);g.length&&(g[0]="L");f=f.concat(g);b=b.call(this,i,!1,c);this.areaPath=f;return b},drawGraph:function(){this.areaPath=[];Q.prototype.drawGraph.apply(this);var a=this,b=this.areaPath,c=this.options,d=[["area",this.color,c.fillColor]];o(this.zones,function(b,f){d.push(["zoneArea"+f,b.color||a.color,b.fillColor||c.fillColor])});o(d,function(d){var f=d[0],g=a[f];g?g.animate({d:b}):(g={fill:d[2]||d[1],zIndex:0},d[2]||(g["fill-opacity"]= +p(c.fillOpacity,0.75)),a[f]=a.chart.renderer.path(b).attr(g).add(a.group))})},drawLegendSymbol:J.drawRectangle});I.area=la;aa.spline=D(da);wa=pa(Q,{type:"spline",getPointSpline:function(a,b,c){var d=b.plotX,e=b.plotY,f=a[c-1],c=a[c+1],g,h,i,k;if(f&&!f.isNull&&c&&!c.isNull){a=f.plotY;i=c.plotX;var c=c.plotY,j=0;g=(1.5*d+f.plotX)/2.5;h=(1.5*e+a)/2.5;i=(1.5*d+i)/2.5;k=(1.5*e+c)/2.5;i!==g&&(j=(k-h)*(i-d)/(i-g)+e-k);h+=j;k+=j;h>a&&h>e?(h=t(a,e),k=2*e-h):h<a&&h<e&&(h=F(a,e),k=2*e-h);k>c&&k>e?(k=t(c,e), +h=2*e-k):k<c&&k<e&&(k=F(c,e),h=2*e-k);b.rightContX=i;b.rightContY=k}b=["C",p(f.rightContX,f.plotX),p(f.rightContY,f.plotY),p(g,d),p(h,e),d,e];f.rightContX=f.rightContY=null;return b}});I.spline=wa;aa.areaspline=D(aa.area);la=la.prototype;wa=pa(wa,{type:"areaspline",getStackPoints:la.getStackPoints,getGraphPath:la.getGraphPath,setStackCliffs:la.setStackCliffs,drawGraph:la.drawGraph,drawLegendSymbol:J.drawRectangle});I.areaspline=wa;aa.column=D(da,{borderColor:"#FFFFFF",borderRadius:0,groupPadding:0.2, +marker:null,pointPadding:0.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{brightness:0.1,shadow:!1,halo:!1},select:{color:"#C0C0C0",borderColor:"#000000",shadow:!1}},dataLabels:{align:null,verticalAlign:null,y:null},softThreshold:!1,startFromThreshold:!0,stickyTracking:!1,tooltip:{distance:6},threshold:0});wa=pa(Q,{type:"column",pointAttrToOptions:{stroke:"borderColor",fill:"color",r:"borderRadius"},cropShoulder:0,directTouch:!0,trackerGroups:["group","dataLabelsGroup"],negStacks:!0, +init:function(){Q.prototype.init.apply(this,arguments);var a=this,b=a.chart;b.hasRendered&&o(b.series,function(b){if(b.type===a.type)b.isDirty=!0})},getColumnMetrics:function(){var a=this,b=a.options,c=a.xAxis,d=a.yAxis,e=c.reversed,f,g={},h=0;b.grouping===!1?h=1:o(a.chart.series,function(b){var c=b.options,e=b.yAxis,i;if(b.type===a.type&&b.visible&&d.len===e.len&&d.pos===e.pos)c.stacking?(f=b.stackKey,g[f]===z&&(g[f]=h++),i=g[f]):c.grouping!==!1&&(i=h++),b.columnIndex=i});var i=F(P(c.transA)*(c.ordinalSlope|| +b.pointRange||c.closestPointRange||c.tickInterval||1),c.len),k=i*b.groupPadding,j=(i-2*k)/h,b=F(b.maxPointWidth||c.len,p(b.pointWidth,j*(1-2*b.pointPadding)));a.columnMetrics={width:b,offset:(j-b)/2+(k+((a.columnIndex||0)+(e?1:0))*j-i/2)*(e?-1:1)};return a.columnMetrics},crispCol:function(a,b,c,d){var e=this.chart,f=this.borderWidth,g=-(f%2?0.5:0),f=f%2?0.5:1;e.inverted&&e.renderer.isVML&&(f+=1);c=Math.round(a+c)+g;a=Math.round(a)+g;c-=a;d=Math.round(b+d)+f;g=P(b)<=0.5&&d>0.5;b=Math.round(b)+f;d-= +b;g&&(b-=1,d+=1);return{x:a,y:b,width:c,height:d}},translate:function(){var a=this,b=a.chart,c=a.options,d=a.borderWidth=p(c.borderWidth,a.closestPointRange*a.xAxis.transA<2?0:1),e=a.yAxis,f=a.translatedThreshold=e.getThreshold(c.threshold),g=p(c.minPointLength,5),h=a.getColumnMetrics(),i=h.width,k=a.barW=t(i,1+2*d),j=a.pointXOffset=h.offset;b.inverted&&(f-=0.5);c.pointPadding&&(k=ua(k));Q.prototype.translate.apply(a);o(a.points,function(c){var d=F(p(c.yBottom,f),9E4),h=999+P(d),h=F(t(-h,c.plotY), +e.len+h),o=c.plotX+j,s=k,q=F(h,d),v,u=t(h,d)-q;P(u)<g&&g&&(u=g,v=!e.reversed&&!c.negative||e.reversed&&c.negative,q=P(q-f)>g?d-g:f-(v?g:0));c.barX=o;c.pointWidth=i;c.tooltipPos=b.inverted?[e.len+e.pos-b.plotLeft-h,a.xAxis.len-o-s/2,u]:[o+s/2,h+e.pos-b.plotTop,u];c.shapeType="rect";c.shapeArgs=a.crispCol(o,q,s,u)})},getSymbol:Aa,drawLegendSymbol:J.drawRectangle,drawGraph:Aa,drawPoints:function(){var a=this,b=this.chart,c=a.options,d=b.renderer,e=c.animationLimit||250,f,g;o(a.points,function(h){var i= +h.plotY,k=h.graphic;if(i!==z&&!isNaN(i)&&h.y!==null)f=h.shapeArgs,i=q(a.borderWidth)?{"stroke-width":a.borderWidth}:{},g=h.pointAttr[h.selected?"select":""]||a.pointAttr[""],k?(Oa(k),k.attr(i).attr(g)[b.pointCount<e?"animate":"attr"](D(f))):h.graphic=d[h.shapeType](f).attr(i).attr(g).add(h.group||a.group).shadow(c.shadow,null,c.stacking&&!c.borderRadius);else if(k)h.graphic=k.destroy()})},animate:function(a){var b=this.yAxis,c=this.options,d=this.chart.inverted,e={};if(ca)a?(e.scaleY=0.001,a=F(b.pos+ +b.len,t(b.pos,b.toPixels(c.threshold))),d?e.translateX=a-b.len:e.translateY=a,this.group.attr(e)):(e.scaleY=1,e[d?"translateX":"translateY"]=b.pos,this.group.animate(e,this.options.animation),this.animate=null)},remove:function(){var a=this,b=a.chart;b.hasRendered&&o(b.series,function(b){if(b.type===a.type)b.isDirty=!0});Q.prototype.remove.apply(a,arguments)}});I.column=wa;aa.bar=D(aa.column);la=pa(wa,{type:"bar",inverted:!0});I.bar=la;aa.scatter=D(da,{lineWidth:0,marker:{enabled:!0},tooltip:{headerFormat:'<span style="color:{point.color}">\u25cf</span> <span style="font-size: 10px;"> {series.name}</span><br/>', +pointFormat:"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>"}});la=pa(Q,{type:"scatter",sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","markerGroup","dataLabelsGroup"],takeOrdinalPosition:!1,kdDimensions:2,drawGraph:function(){this.options.lineWidth&&Q.prototype.drawGraph.call(this)}});I.scatter=la;aa.pie=D(da,{borderColor:"#FFFFFF",borderWidth:1,center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.y===null?void 0: +this.point.name},x:0},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,states:{hover:{brightness:0.1,shadow:!1}},stickyTracking:!1,tooltip:{followPointer:!0}});da={type:"pie",isCartesian:!1,pointClass:pa(Ha,{init:function(){Ha.prototype.init.apply(this,arguments);var a=this,b;a.name=p(a.name,"Slice");b=function(b){a.slice(b.type==="select")};M(a,"select",b);M(a,"unselect",b);return a},setVisible:function(a,b){var c=this,d=c.series,e=d.chart,f=d.options.ignoreHiddenPoint, +b=p(b,f);if(a!==c.visible){c.visible=c.options.visible=a=a===z?!c.visible:a;d.options.data[sa(c,d.data)]=c.options;o(["graphic","dataLabel","connector","shadowGroup"],function(b){if(c[b])c[b][a?"show":"hide"](!0)});c.legendItem&&e.legend.colorizeItem(c,a);!a&&c.state==="hover"&&c.setState("");if(f)d.isDirty=!0;b&&e.redraw()}},slice:function(a,b,c){var d=this.series;Ua(c,d.chart);p(b,!0);this.sliced=this.options.sliced=a=q(a)?a:!this.sliced;d.options.data[sa(this,d.data)]=this.options;a=a?this.slicedTranslation: +{translateX:0,translateY:0};this.graphic.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)},haloPath:function(a){var b=this.shapeArgs,c=this.series.chart;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(c.plotLeft+b.x,c.plotTop+b.y,b.r+a,b.r+a,{innerR:this.shapeArgs.r,start:b.start,end:b.end})}}),requireSorting:!1,directTouch:!0,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth", +fill:"color"},animate:function(a){var b=this,c=b.points,d=b.startAngleRad;if(!a)o(c,function(a){var c=a.graphic,g=a.shapeArgs;c&&(c.attr({r:a.startR||b.center[3]/2,start:d,end:d}),c.animate({r:g.r,start:g.start,end:g.end},b.options.animation))}),b.animate=null},updateTotals:function(){var a,b=0,c=this.points,d=c.length,e,f=this.options.ignoreHiddenPoint;for(a=0;a<d;a++)e=c[a],b+=f&&!e.visible?0:e.y;this.total=b;for(a=0;a<d;a++)e=c[a],e.percentage=b>0&&(e.visible||!f)?e.y/b*100:0,e.total=b},generatePoints:function(){Q.prototype.generatePoints.call(this); +this.updateTotals()},translate:function(a){this.generatePoints();var b=0,c=this.options,d=c.slicedOffset,e=d+c.borderWidth,f,g,h,i=c.startAngle||0,k=this.startAngleRad=ra/180*(i-90),i=(this.endAngleRad=ra/180*(p(c.endAngle,i+360)-90))-k,j=this.points,l=c.dataLabels.distance,c=c.ignoreHiddenPoint,m,n=j.length,o;if(!a)this.center=a=this.getCenter();this.getX=function(b,c){h=W.asin(F((b-a[1])/(a[2]/2+l),1));return a[0]+(c?-1:1)*U(h)*(a[2]/2+l)};for(m=0;m<n;m++){o=j[m];f=k+b*i;if(!c||o.visible)b+=o.percentage/ +100;g=k+b*i;o.shapeType="arc";o.shapeArgs={x:a[0],y:a[1],r:a[2]/2,innerR:a[3]/2,start:A(f*1E3)/1E3,end:A(g*1E3)/1E3};h=(g+f)/2;h>1.5*ra?h-=2*ra:h<-ra/2&&(h+=2*ra);o.slicedTranslation={translateX:A(U(h)*d),translateY:A($(h)*d)};f=U(h)*a[2]/2;g=$(h)*a[2]/2;o.tooltipPos=[a[0]+f*0.7,a[1]+g*0.7];o.half=h<-ra/2||h>ra/2?1:0;o.angle=h;e=F(e,l/2);o.labelPos=[a[0]+f+U(h)*l,a[1]+g+$(h)*l,a[0]+f+U(h)*e,a[1]+g+$(h)*e,a[0]+f,a[1]+g,l<0?"center":o.half?"right":"left",h]}},drawGraph:null,drawPoints:function(){var a= +this,b=a.chart.renderer,c,d,e=a.options.shadow,f,g,h,i;if(e&&!a.shadowGroup)a.shadowGroup=b.g("shadow").add(a.group);o(a.points,function(k){if(k.y!==null){d=k.graphic;h=k.shapeArgs;f=k.shadowGroup;g=k.pointAttr[k.selected?"select":""];if(!g.stroke)g.stroke=g.fill;if(e&&!f)f=k.shadowGroup=b.g("shadow").add(a.shadowGroup);c=k.sliced?k.slicedTranslation:{translateX:0,translateY:0};f&&f.attr(c);if(d)d.setRadialReference(a.center).attr(g).animate(u(h,c));else{i={"stroke-linejoin":"round"};if(!k.visible)i.visibility= +"hidden";k.graphic=d=b[k.shapeType](h).setRadialReference(a.center).attr(g).attr(i).attr(c).add(a.group).shadow(e,f)}}})},searchPoint:Aa,sortByAngle:function(a,b){a.sort(function(a,d){return a.angle!==void 0&&(d.angle-a.angle)*b})},drawLegendSymbol:J.drawRectangle,getCenter:Cb.getCenter,getSymbol:Aa};da=pa(Q,da);I.pie=da;Q.prototype.drawDataLabels=function(){var a=this,b=a.options,c=b.cursor,d=b.dataLabels,e=a.points,f,g,h=a.hasRendered||0,i,k,j=a.chart.renderer;if(d.enabled||a._hasPointLabels)a.dlProcessOptions&& +a.dlProcessOptions(d),k=a.plotGroup("dataLabelsGroup","data-labels",d.defer?"hidden":"visible",d.zIndex||6),p(d.defer,!0)&&(k.attr({opacity:+h}),h||M(a,"afterAnimate",function(){a.visible&&k.show();k[b.animation?"animate":"attr"]({opacity:1},{duration:200})})),g=d,o(e,function(e){var h,n=e.dataLabel,o,s,t=e.connector,v=!0,x,w={};f=e.dlOptions||e.options&&e.options.dataLabels;h=p(f&&f.enabled,g.enabled)&&e.y!==null;if(n&&!h)e.dataLabel=n.destroy();else if(h){d=D(g,f);x=d.style;h=d.rotation;o=e.getLabelConfig(); +i=d.format?Ka(d.format,o):d.formatter.call(o,d);x.color=p(d.color,x.color,a.color,"black");if(n)if(q(i))n.attr({text:i}),v=!1;else{if(e.dataLabel=n=n.destroy(),t)e.connector=t.destroy()}else if(q(i)){n={fill:d.backgroundColor,stroke:d.borderColor,"stroke-width":d.borderWidth,r:d.borderRadius||0,rotation:h,padding:d.padding,zIndex:1};if(x.color==="contrast")w.color=d.inside||d.distance<0||b.stacking?j.getContrast(e.color||a.color):"#000000";if(c)w.cursor=c;for(s in n)n[s]===z&&delete n[s];n=e.dataLabel= +j[h?"text":"label"](i,0,-9999,d.shape,null,null,d.useHTML).attr(n).css(u(x,w)).add(k).shadow(d.shadow)}n&&a.alignDataLabel(e,n,d,null,v)}})};Q.prototype.alignDataLabel=function(a,b,c,d,e){var f=this.chart,g=f.inverted,h=p(a.plotX,-9999),i=p(a.plotY,-9999),k=b.getBBox(),j=f.renderer.fontMetrics(c.style.fontSize).b,l=c.rotation,m=c.align,n=this.visible&&(a.series.forceDL||f.isInsidePlot(h,A(i),g)||d&&f.isInsidePlot(h,g?d.x+1:d.y+d.height-1,g)),o=p(c.overflow,"justify")==="justify";if(n)d=u({x:g?f.plotWidth- +i:h,y:A(g?f.plotHeight-h:i),width:0,height:0},d),u(c,{width:k.width,height:k.height}),l?(o=!1,g=f.renderer.rotCorr(j,l),g={x:d.x+c.x+d.width/2+g.x,y:d.y+c.y+d.height/2},b[e?"attr":"animate"](g).attr({align:c.align}),h=(l+720)%360,h=h>180&&h<360,m==="left"?g.y-=h?k.height:0:m==="center"?(g.x-=k.width/2,g.y-=k.height/2):m==="right"&&(g.x-=k.width,g.y-=h?0:k.height)):(b.align(c,null,d),g=b.alignAttr),o?this.justifyDataLabel(b,c,g,k,d,e):p(c.crop,!0)&&(n=f.isInsidePlot(g.x,g.y)&&f.isInsidePlot(g.x+k.width, +g.y+k.height)),c.shape&&!l&&b.attr({anchorX:a.plotX,anchorY:a.plotY});if(!n)Oa(b),b.attr({y:-9999}),b.placed=!1};Q.prototype.justifyDataLabel=function(a,b,c,d,e,f){var g=this.chart,h=b.align,i=b.verticalAlign,k,j,l=a.box?0:a.padding||0;k=c.x+l;if(k<0)h==="right"?b.align="left":b.x=-k,j=!0;k=c.x+d.width-l;if(k>g.plotWidth)h==="left"?b.align="right":b.x=g.plotWidth-k,j=!0;k=c.y+l;if(k<0)i==="bottom"?b.verticalAlign="top":b.y=-k,j=!0;k=c.y+d.height-l;if(k>g.plotHeight)i==="top"?b.verticalAlign="bottom": +b.y=g.plotHeight-k,j=!0;if(j)a.placed=!f,a.align(b,null,e)};if(I.pie)I.pie.prototype.drawDataLabels=function(){var a=this,b=a.data,c,d=a.chart,e=a.options.dataLabels,f=p(e.connectorPadding,10),g=p(e.connectorWidth,1),h=d.plotWidth,i=d.plotHeight,k,j,l=p(e.softConnector,!0),m=e.distance,n=a.center,r=n[2]/2,q=n[1],u=m>0,v,x,w,B=[[],[]],z,y,E,D,C,G=[0,0,0,0],L=function(a,b){return b.y-a.y};if(a.visible&&(e.enabled||a._hasPointLabels)){Q.prototype.drawDataLabels.apply(a);o(b,function(a){if(a.dataLabel&& +a.visible)B[a.half].push(a),a.dataLabel._pos=null});for(D=2;D--;){var H=[],M=[],I=B[D],K=I.length,J;if(K){a.sortByAngle(I,D-0.5);for(C=b=0;!b&&I[C];)b=I[C]&&I[C].dataLabel&&(I[C].dataLabel.getBBox().height||21),C++;if(m>0){x=F(q+r+m,d.plotHeight);for(C=t(0,q-r-m);C<=x;C+=b)H.push(C);x=H.length;if(K>x){c=[].concat(I);c.sort(L);for(C=K;C--;)c[C].rank=C;for(C=K;C--;)I[C].rank>=x&&I.splice(C,1);K=I.length}for(C=0;C<K;C++){c=I[C];w=c.labelPos;c=9999;var O,N;for(N=0;N<x;N++)O=P(H[N]-w[1]),O<c&&(c=O,J=N); +if(J<C&&H[C]!==null)J=C;else for(x<K-C+J&&H[C]!==null&&(J=x-K+C);H[J]===null;)J++;M.push({i:J,y:H[J]});H[J]=null}M.sort(L)}for(C=0;C<K;C++){c=I[C];w=c.labelPos;v=c.dataLabel;E=c.visible===!1?"hidden":"inherit";c=w[1];if(m>0){if(x=M.pop(),J=x.i,y=x.y,c>y&&H[J+1]!==null||c<y&&H[J-1]!==null)y=F(t(0,c),d.plotHeight)}else y=c;z=e.justify?n[0]+(D?-1:1)*(r+m):a.getX(y===q-r-m||y===q+r+m?c:y,D);v._attr={visibility:E,align:w[6]};v._pos={x:z+e.x+({left:f,right:-f}[w[6]]||0),y:y+e.y-10};v.connX=z;v.connY=y; +if(this.options.size===null)x=v.width,z-x<f?G[3]=t(A(x-z+f),G[3]):z+x>h-f&&(G[1]=t(A(z+x-h+f),G[1])),y-b/2<0?G[0]=t(A(-y+b/2),G[0]):y+b/2>i&&(G[2]=t(A(y+b/2-i),G[2]))}}}if(Ea(G)===0||this.verifyDataLabelOverflow(G))this.placeDataLabels(),u&&g&&o(this.points,function(b){k=b.connector;w=b.labelPos;if((v=b.dataLabel)&&v._pos&&b.visible)E=v._attr.visibility,z=v.connX,y=v.connY,j=l?["M",z+(w[6]==="left"?5:-5),y,"C",z,y,2*w[2]-w[4],2*w[3]-w[5],w[2],w[3],"L",w[4],w[5]]:["M",z+(w[6]==="left"?5:-5),y,"L", +w[2],w[3],"L",w[4],w[5]],k?(k.animate({d:j}),k.attr("visibility",E)):b.connector=k=a.chart.renderer.path(j).attr({"stroke-width":g,stroke:e.connectorColor||b.color||"#606060",visibility:E}).add(a.dataLabelsGroup);else if(k)b.connector=k.destroy()})}},I.pie.prototype.placeDataLabels=function(){o(this.points,function(a){var b=a.dataLabel;if(b&&a.visible)(a=b._pos)?(b.attr(b._attr),b[b.moved?"animate":"attr"](a),b.moved=!0):b&&b.attr({y:-9999})})},I.pie.prototype.alignDataLabel=Aa,I.pie.prototype.verifyDataLabelOverflow= +function(a){var b=this.center,c=this.options,d=c.center,e=c.minSize||80,f=e,g;d[0]!==null?f=t(b[2]-t(a[1],a[3]),e):(f=t(b[2]-a[1]-a[3],e),b[0]+=(a[3]-a[1])/2);d[1]!==null?f=t(F(f,b[2]-t(a[0],a[2])),e):(f=t(F(f,b[2]-a[0]-a[2]),e),b[1]+=(a[0]-a[2])/2);f<b[2]?(b[2]=f,b[3]=Math.min(/%$/.test(c.innerSize||0)?f*parseFloat(c.innerSize||0)/100:parseFloat(c.innerSize||0),f),this.translate(b),this.drawDataLabels&&this.drawDataLabels()):g=!0;return g};if(I.column)I.column.prototype.alignDataLabel=function(a, +b,c,d,e){var f=this.chart.inverted,g=a.series,h=a.dlBox||a.shapeArgs,i=p(a.below,a.plotY>p(this.translatedThreshold,g.yAxis.len)),k=p(c.inside,!!this.options.stacking);if(h){d=D(h);if(d.y<0)d.height+=d.y,d.y=0;h=d.y+d.height-g.yAxis.len;h>0&&(d.height-=h);f&&(d={x:g.yAxis.len-d.y-d.height,y:g.xAxis.len-d.x-d.width,width:d.height,height:d.width});if(!k)f?(d.x+=i?0:d.width,d.width=0):(d.y+=i?d.height:0,d.height=0)}c.align=p(c.align,!f||k?"center":i?"right":"left");c.verticalAlign=p(c.verticalAlign, +f||k?"middle":i?"top":"bottom");Q.prototype.alignDataLabel.call(this,a,b,c,d,e)};(function(a){var b=a.Chart,c=a.each,d=a.pick,e=a.addEvent;b.prototype.callbacks.push(function(a){function b(){var e=[];c(a.series,function(a){var b=a.options.dataLabels,f=a.dataLabelCollections||["dataLabel"];(b.enabled||a._hasPointLabels)&&!b.allowOverlap&&a.visible&&c(f,function(b){c(a.points,function(a){if(a[b])a[b].labelrank=d(a.labelrank,a.shapeArgs&&a.shapeArgs.height),e.push(a[b])})})});a.hideOverlappingLabels(e)} +b();e(a,"redraw",b)});b.prototype.hideOverlappingLabels=function(a){var b=a.length,d,e,k,j,l,m,n,o,p;for(e=0;e<b;e++)if(d=a[e])d.oldOpacity=d.opacity,d.newOpacity=1;a.sort(function(a,b){return(b.labelrank||0)-(a.labelrank||0)});for(e=0;e<b;e++){k=a[e];for(d=e+1;d<b;++d)if(j=a[d],k&&j&&k.placed&&j.placed&&k.newOpacity!==0&&j.newOpacity!==0&&(l=k.alignAttr,m=j.alignAttr,n=k.parentGroup,o=j.parentGroup,p=2*(k.box?0:k.padding),l=!(m.x+o.translateX>l.x+n.translateX+(k.width-p)||m.x+o.translateX+(j.width- +p)<l.x+n.translateX||m.y+o.translateY>l.y+n.translateY+(k.height-p)||m.y+o.translateY+(j.height-p)<l.y+n.translateY)))(k.labelrank<j.labelrank?k:j).newOpacity=0}c(a,function(a){var b,c;if(a){c=a.newOpacity;if(a.oldOpacity!==c&&a.placed)c?a.show(!0):b=function(){a.hide()},a.alignAttr.opacity=c,a[a.isOld?"animate":"attr"](a.alignAttr,null,b);a.isOld=!0}})}})(B);da=B.TrackerMixin={drawTrackerPoint:function(){var a=this,b=a.chart,c=b.pointer,d=a.options.cursor,e=d&&{cursor:d},f=function(a){for(var c= +a.target,d;c&&!d;)d=c.point,c=c.parentNode;if(d!==z&&d!==b.hoverPoint)d.onMouseOver(a)};o(a.points,function(a){if(a.graphic)a.graphic.element.point=a;if(a.dataLabel)a.dataLabel.element.point=a});if(!a._hasTracking)o(a.trackerGroups,function(b){if(a[b]&&(a[b].addClass("highcharts-tracker").on("mouseover",f).on("mouseout",function(a){c.onTrackerMouseOut(a)}).css(e),db))a[b].on("touchstart",f)}),a._hasTracking=!0},drawTrackerGraph:function(){var a=this,b=a.options,c=b.trackByArea,d=[].concat(c?a.areaPath: +a.graphPath),e=d.length,f=a.chart,g=f.pointer,h=f.renderer,i=f.options.tooltip.snap,k=a.tracker,j=b.cursor,l=j&&{cursor:j},m=function(){if(f.hoverSeries!==a)a.onMouseOver()},n="rgba(192,192,192,"+(ca?1.0E-4:0.002)+")";if(e&&!c)for(j=e+1;j--;)d[j]==="M"&&d.splice(j+1,0,d[j+1]-i,d[j+2],"L"),(j&&d[j]==="M"||j===e)&&d.splice(j,0,"L",d[j-2]+i,d[j-1]);k?k.attr({d:d}):(a.tracker=h.path(d).attr({"stroke-linejoin":"round",visibility:a.visible?"visible":"hidden",stroke:n,fill:c?n:"none","stroke-width":b.lineWidth+ +(c?0:2*i),zIndex:2}).add(a.group),o([a.tracker,a.markerGroup],function(a){a.addClass("highcharts-tracker").on("mouseover",m).on("mouseout",function(a){g.onTrackerMouseOut(a)}).css(l);if(db)a.on("touchstart",m)}))}};if(I.column)wa.prototype.drawTracker=da.drawTrackerPoint;if(I.pie)I.pie.prototype.drawTracker=da.drawTrackerPoint;if(I.scatter)la.prototype.drawTracker=da.drawTrackerPoint;u(ob.prototype,{setItemEvents:function(a,b,c,d,e){var f=this;(c?b:a.legendGroup).on("mouseover",function(){a.setState("hover"); +b.css(f.options.itemHoverStyle)}).on("mouseout",function(){b.css(a.visible?d:e);a.setState()}).on("click",function(b){var c=function(){a.setVisible&&a.setVisible()},b={browserEvent:b};a.firePointEvent?a.firePointEvent("legendItemClick",b,c):H(a,"legendItemClick",b,c)})},createCheckboxForItem:function(a){a.checkbox=Z("input",{type:"checkbox",checked:a.selected,defaultChecked:a.selected},this.options.itemCheckboxStyle,this.chart.container);M(a.checkbox,"click",function(b){H(a.series||a,"checkboxClick", +{checked:b.target.checked,item:a},function(){a.select()})})}});N.legend.itemStyle.cursor="pointer";u(hb.prototype,{showResetZoom:function(){var a=this,b=N.lang,c=a.options.chart.resetZoomButton,d=c.theme,e=d.states,f=c.relativeTo==="chart"?null:"plotBox";this.resetZoomButton=a.renderer.button(b.resetZoom,null,null,function(){a.zoomOut()},d,e&&e.hover).attr({align:c.position.align,title:b.resetZoomTitle}).add().align(c.position,!1,f)},zoomOut:function(){var a=this;H(a,"selection",{resetSelection:!0}, +function(){a.zoom()})},zoom:function(a){var b,c=this.pointer,d=!1,e;!a||a.resetSelection?o(this.axes,function(a){b=a.zoom()}):o(a.xAxis.concat(a.yAxis),function(a){var e=a.axis,h=e.isXAxis;if(c[h?"zoomX":"zoomY"]||c[h?"pinchX":"pinchY"])b=e.zoom(a.min,a.max),e.displayBtn&&(d=!0)});e=this.resetZoomButton;if(d&&!e)this.showResetZoom();else if(!d&&Y(e))this.resetZoomButton=e.destroy();b&&this.redraw(p(this.options.chart.animation,a&&a.animation,this.pointCount<100))},pan:function(a,b){var c=this,d=c.hoverPoints, +e;d&&o(d,function(a){a.setState()});o(b==="xy"?[1,0]:[1],function(b){var b=c[b?"xAxis":"yAxis"][0],d=b.horiz,h=a[d?"chartX":"chartY"],d=d?"mouseDownX":"mouseDownY",i=c[d],k=(b.pointRange||0)/2,j=b.getExtremes(),l=b.toValue(i-h,!0)+k,k=b.toValue(i+b.len-h,!0)-k,i=i>h;if(b.series.length&&(i||l>F(j.dataMin,j.min))&&(!i||k<t(j.dataMax,j.max)))b.setExtremes(l,k,!1,!1,{trigger:"pan"}),e=!0;c[d]=h});e&&c.redraw(!1);L(c.container,{cursor:"move"})}});u(Ha.prototype,{select:function(a,b){var c=this,d=c.series, +e=d.chart,a=p(a,!c.selected);c.firePointEvent(a?"select":"unselect",{accumulate:b},function(){c.selected=c.options.selected=a;d.options.data[sa(c,d.data)]=c.options;c.setState(a&&"select");b||o(e.getSelectedPoints(),function(a){if(a.selected&&a!==c)a.selected=a.options.selected=!1,d.options.data[sa(a,d.data)]=a.options,a.setState(""),a.firePointEvent("unselect")})})},onMouseOver:function(a,b){var c=this.series,d=c.chart,e=d.tooltip,f=d.hoverPoint;if(d.hoverSeries!==c)c.onMouseOver();if(f&&f!==this)f.onMouseOut(); +if(this.series&&(this.firePointEvent("mouseOver"),e&&(!e.shared||c.noSharedTooltip)&&e.refresh(this,a),this.setState("hover"),!b))d.hoverPoint=this},onMouseOut:function(){var a=this.series.chart,b=a.hoverPoints;this.firePointEvent("mouseOut");if(!b||sa(this,b)===-1)this.setState(),a.hoverPoint=null},importEvents:function(){if(!this.hasImportedEvents){var a=D(this.series.options.point,this.options).events,b;this.events=a;for(b in a)M(this,b,a[b]);this.hasImportedEvents=!0}},setState:function(a,b){var c= +T(this.plotX),d=this.plotY,e=this.series,f=e.options.states,g=aa[e.type].marker&&e.options.marker,h=g&&!g.enabled,i=g&&g.states[a],k=i&&i.enabled===!1,j=e.stateMarkerGraphic,l=this.marker||{},m=e.chart,n=e.halo,o,a=a||"";o=this.pointAttr[a]||e.pointAttr[a];if(!(a===this.state&&!b||this.selected&&a!=="select"||f[a]&&f[a].enabled===!1||a&&(k||h&&i.enabled===!1)||a&&l.states&&l.states[a]&&l.states[a].enabled===!1)){if(this.graphic)g=g&&this.graphic.symbolName&&o.r,this.graphic.attr(D(o,g?{x:c-g,y:d- +g,width:2*g,height:2*g}:{})),j&&j.hide();else{if(a&&i)if(g=i.radius,l=l.symbol||e.symbol,j&&j.currentSymbol!==l&&(j=j.destroy()),j)j[b?"animate":"attr"]({x:c-g,y:d-g});else if(l)e.stateMarkerGraphic=j=m.renderer.symbol(l,c-g,d-g,2*g,2*g).attr(o).add(e.markerGroup),j.currentSymbol=l;if(j)j[a&&m.isInsidePlot(c,d,m.inverted)?"show":"hide"](),j.element.point=this}if((c=f[a]&&f[a].halo)&&c.size){if(!n)e.halo=n=m.renderer.path().add(m.seriesGroup);n.attr(u({fill:this.color||e.color,"fill-opacity":c.opacity, +zIndex:-1},c.attributes))[b?"animate":"attr"]({d:this.haloPath(c.size)})}else n&&n.attr({d:[]});this.state=a}},haloPath:function(a){var b=this.series,c=b.chart,d=b.getPlotBox(),e=c.inverted,f=Math.floor(this.plotX);return c.renderer.symbols.circle(d.translateX+(e?b.yAxis.len-this.plotY:f)-a,d.translateY+(e?b.xAxis.len-f:this.plotY)-a,a*2,a*2)}});u(Q.prototype,{onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(b&&b!==this)b.onMouseOut();this.options.events.mouseOver&&H(this,"mouseOver");this.setState("hover"); +a.hoverSeries=this},onMouseOut:function(){var a=this.options,b=this.chart,c=b.tooltip,d=b.hoverPoint;b.hoverSeries=null;if(d)d.onMouseOut();this&&a.events.mouseOut&&H(this,"mouseOut");c&&!a.stickyTracking&&(!c.shared||this.noSharedTooltip)&&c.hide();this.setState()},setState:function(a){var b=this.options,c=this.graph,d=b.states,e=b.lineWidth,b=0,a=a||"";if(this.state!==a&&(this.state=a,!(d[a]&&d[a].enabled===!1)&&(a&&(e=d[a].lineWidth||e+(d[a].lineWidthPlus||0)),c&&!c.dashstyle))){a={"stroke-width":e}; +for(c.attr(a);this["zoneGraph"+b];)this["zoneGraph"+b].attr(a),b+=1}},setVisible:function(a,b){var c=this,d=c.chart,e=c.legendItem,f,g=d.options.chart.ignoreHiddenSeries,h=c.visible;f=(c.visible=a=c.userOptions.visible=a===z?!h:a)?"show":"hide";o(["group","dataLabelsGroup","markerGroup","tracker"],function(a){if(c[a])c[a][f]()});if(d.hoverSeries===c||(d.hoverPoint&&d.hoverPoint.series)===c)c.onMouseOut();e&&d.legend.colorizeItem(c,a);c.isDirty=!0;c.options.stacking&&o(d.series,function(a){if(a.options.stacking&& +a.visible)a.isDirty=!0});o(c.linkedSeries,function(b){b.setVisible(a,!1)});if(g)d.isDirtyBox=!0;b!==!1&&d.redraw();H(c,f)},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(a){this.selected=a=a===z?!this.selected:a;if(this.checkbox)this.checkbox.checked=a;H(this,a?"select":"unselect")},drawTracker:da.drawTrackerGraph});u(B,{Color:ia,Point:Ha,Tick:Va,Renderer:cb,SVGElement:O,SVGRenderer:Ca,arrayMin:Ra,arrayMax:Ea,charts:S,dateFormat:Qa,error:X,format:Ka,pathAnim:void 0, +getOptions:function(){return N},hasBidiBug:Qb,isTouchDevice:Mb,setOptions:function(a){N=D(!0,N,a);Fb();return N},addEvent:M,removeEvent:V,createElement:Z,discardElement:Ta,css:L,each:o,map:Ba,merge:D,splat:ta,stableSort:ib,extendClass:pa,pInt:C,svg:ca,canvas:ha,vml:!ca&&!ha,product:"Highcharts",version:"4.2.3"});return B}); diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/jsplumb/jsplumb-2.0.7-min.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/jsplumb/jsplumb-2.0.7-min.js new file mode 100644 index 0000000000000000000000000000000000000000..4e75c47ed226585525c834e940a3779b7353d626 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/jsplumb/jsplumb-2.0.7-min.js @@ -0,0 +1,6 @@ +(function(){"undefined"==typeof Math.sgn&&(Math.sgn=function(a){return 0==a?0:a>0?1:-1});var a={subtract:function(a,b){return{x:a.x-b.x,y:a.y-b.y}},dotProduct:function(a,b){return a.x*b.x+a.y*b.y},square:function(a){return Math.sqrt(a.x*a.x+a.y*a.y)},scale:function(a,b){return{x:a.x*b,y:a.y*b}}},b=64,c=Math.pow(2,-b-1),d=function(b,c){for(var d=[],e=f(b,c),h=c.length-1,i=2*h-1,j=g(e,i,d,0),k=a.subtract(b,c[0]),m=a.square(k),n=0,o=0;j>o;o++){k=a.subtract(b,l(c,h,d[o],null,null));var p=a.square(k);m>p&&(m=p,n=d[o])}return k=a.subtract(b,c[h]),p=a.square(k),m>p&&(m=p,n=1),{location:n,distance:m}},e=function(a,b){var c=d(a,b);return{point:l(b,b.length-1,c.location,null,null),location:c.location}},f=function(b,c){for(var d=c.length-1,e=2*d-1,f=[],g=[],h=[],i=[],k=[[1,.6,.3,.1],[.4,.6,.6,.4],[.1,.3,.6,1]],l=0;d>=l;l++)f[l]=a.subtract(c[l],b);for(var l=0;d-1>=l;l++)g[l]=a.subtract(c[l+1],c[l]),g[l]=a.scale(g[l],3);for(var m=0;d-1>=m;m++)for(var n=0;d>=n;n++)h[m]||(h[m]=[]),h[m][n]=a.dotProduct(g[m],f[n]);for(l=0;e>=l;l++)i[l]||(i[l]=[]),i[l].y=0,i[l].x=parseFloat(l)/e;for(var o=d,p=d-1,q=0;o+p>=q;q++){var r=Math.max(0,q-p),s=Math.min(q,o);for(l=r;s>=l;l++)j=q-l,i[l+j].y+=h[j][l]*k[j][l]}return i},g=function(a,c,d,e){var f,j,m=[],n=[],o=[],p=[];switch(h(a,c)){case 0:return 0;case 1:if(e>=b)return d[0]=(a[0].x+a[c].x)/2,1;if(i(a,c))return d[0]=k(a,c),1}l(a,c,.5,m,n),f=g(m,c,o,e+1),j=g(n,c,p,e+1);for(var q=0;f>q;q++)d[q]=o[q];for(var q=0;j>q;q++)d[q+f]=p[q];return f+j},h=function(a,b){var c,d,e=0;c=d=Math.sgn(a[0].y);for(var f=1;b>=f;f++)c=Math.sgn(a[f].y),c!=d&&e++,d=c;return e},i=function(a,b){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s;i=a[0].y-a[b].y,j=a[b].x-a[0].x,k=a[0].x*a[b].y-a[b].x*a[0].y;for(var t=max_distance_below=0,u=1;b>u;u++){var v=i*a[u].x+j*a[u].y+k;v>t?t=v:max_distance_below>v&&(max_distance_below=v)}return n=0,o=1,p=0,q=i,r=j,s=k-t,l=n*r-q*o,m=1/l,e=(o*s-r*p)*m,q=i,r=j,s=k-max_distance_below,l=n*r-q*o,m=1/l,f=(o*s-r*p)*m,g=Math.min(e,f),h=Math.max(e,f),d=h-g,c>d?1:0},k=function(a,b){var c=1,d=0,e=a[b].x-a[0].x,f=a[b].y-a[0].y,g=a[0].x-0,h=a[0].y-0,i=e*d-f*c,j=1/i,k=(e*h-f*g)*j;return 0+c*k},l=function(a,b,c,d,e){for(var f=[[]],g=0;b>=g;g++)f[0][g]=a[g];for(var h=1;b>=h;h++)for(var g=0;b-h>=g;g++)f[h]||(f[h]=[]),f[h][g]||(f[h][g]={}),f[h][g].x=(1-c)*f[h-1][g].x+c*f[h-1][g+1].x,f[h][g].y=(1-c)*f[h-1][g].y+c*f[h-1][g+1].y;if(null!=d)for(g=0;b>=g;g++)d[g]=f[g][0];if(null!=e)for(g=0;b>=g;g++)e[g]=f[b-g][g];return f[b][0]},m={},n=function(a){var b=m[a];if(!b){b=[];var c=function(){return function(b){return Math.pow(b,a)}},d=function(){return function(b){return Math.pow(1-b,a)}},e=function(a){return function(){return a}},f=function(){return function(a){return a}},g=function(){return function(a){return 1-a}},h=function(a){return function(b){for(var c=1,d=0;d<a.length;d++)c*=a[d](b);return c}};b.push(new c);for(var i=1;a>i;i++){for(var j=[new e(a)],k=0;a-i>k;k++)j.push(new f);for(var k=0;i>k;k++)j.push(new g);b.push(new h(j))}b.push(new d),m[a]=b}return b},o=function(a,b){for(var c=n(a.length-1),d=0,e=0,f=0;f<a.length;f++)d+=a[f].x*c[f](b),e+=a[f].y*c[f](b);return{x:d,y:e}},p=function(a,b){return Math.sqrt(Math.pow(a.x-b.x,2)+Math.pow(a.y-b.y,2))},q=function(a){return a[0].x==a[1].x&&a[0].y==a[1].y},r=function(a,b,c){if(q(a))return{point:a[0],location:b};for(var d=o(a,b),e=0,f=b,g=c>0?1:-1,h=null;e<Math.abs(c);)f+=.005*g,h=o(a,f),e+=p(h,d),d=h;return{point:h,location:f}},s=function(a){if(q(a))return 0;for(var b=o(a,0),c=0,d=0,e=1,f=null;1>d;)d+=.005*e,f=o(a,d),c+=p(f,b),b=f;return c},t=function(a,b,c){return r(a,b,c).point},u=function(a,b,c){return r(a,b,c).location},v=function(a,b){var c=o(a,b),d=o(a.slice(0,a.length-1),b),e=d.y-c.y,f=d.x-c.x;return 0==e?1/0:Math.atan(e/f)},w=function(a,b,c){var d=r(a,b,c);return d.location>1&&(d.location=1),d.location<0&&(d.location=0),v(a,d.location)},x=function(a,b,c,d){d=null==d?0:d;var e=r(a,b,d),f=v(a,e.location),g=Math.atan(-1/f),h=c/2*Math.sin(g),i=c/2*Math.cos(g);return[{x:e.point.x+i,y:e.point.y+h},{x:e.point.x-i,y:e.point.y-h}]};this.jsBezier={distanceFromCurve:d,gradientAtPoint:v,gradientAtPointAlongCurveFrom:w,nearestPointOnCurve:e,pointOnCurve:o,pointAlongCurveFrom:t,perpendicularToCurveAt:x,locationAlongCurveFrom:u,getLength:s}}).call(this),function(){"use strict";var a=this.Biltong={},b=function(a){return"[object Array]"===Object.prototype.toString.call(a)},c=function(a,c,d){return a=b(a)?a:[a.x,a.y],c=b(c)?c:[c.x,c.y],d(a,c)},d=a.gradient=function(a,b){return c(a,b,function(a,b){return b[0]==a[0]?b[1]>a[1]?1/0:-1/0:b[1]==a[1]?b[0]>a[0]?0:-0:(b[1]-a[1])/(b[0]-a[0])})},e=(a.normal=function(a,b){return-1/d(a,b)},a.lineLength=function(a,b){return c(a,b,function(a,b){return Math.sqrt(Math.pow(b[1]-a[1],2)+Math.pow(b[0]-a[0],2))})},a.quadrant=function(a,b){return c(a,b,function(a,b){return b[0]>a[0]?b[1]>a[1]?2:1:b[0]==a[0]?b[1]>a[1]?2:1:b[1]>a[1]?3:4})}),f=(a.theta=function(a,b){return c(a,b,function(a,b){var c=d(a,b),f=Math.atan(c),g=e(a,b);return(4==g||3==g)&&(f+=Math.PI),0>f&&(f+=2*Math.PI),f})},a.intersects=function(a,b){var c=a.x,d=a.x+a.w,e=a.y,f=a.y+a.h,g=b.x,h=b.x+b.w,i=b.y,j=b.y+b.h;return g>=c&&d>=g&&i>=e&&f>=i||h>=c&&d>=h&&i>=e&&f>=i||g>=c&&d>=g&&j>=e&&f>=j||h>=c&&d>=g&&j>=e&&f>=j||c>=g&&h>=c&&e>=i&&j>=e||d>=g&&h>=d&&e>=i&&j>=e||c>=g&&h>=c&&f>=i&&j>=f||d>=g&&h>=c&&f>=i&&j>=f},a.encloses=function(a,b,c){var d=a.x,e=a.x+a.w,f=a.y,g=a.y+a.h,h=b.x,i=b.x+b.w,j=b.y,k=b.y+b.h,l=function(a,b,d,e){return c?b>=a&&d>=e:b>a&&d>e};return l(d,h,e,i)&&l(f,j,g,k)},[null,[1,-1],[1,1],[-1,1],[-1,-1]]),g=[null,[-1,-1],[-1,1],[1,1],[1,-1]];a.pointOnLine=function(a,b,c){var h=d(a,b),i=e(a,b),j=c>0?f[i]:g[i],k=Math.atan(h),l=Math.abs(c*Math.sin(k))*j[1],m=Math.abs(c*Math.cos(k))*j[0];return{x:a.x+m,y:a.y+l}},a.perpendicularLineTo=function(a,b,c){var e=d(a,b),f=Math.atan(-1/e),g=c/2*Math.sin(f),h=c/2*Math.cos(f);return[{x:b.x+h,y:b.y+g},{x:b.x-h,y:b.y-g}]}}.call(this),function(){"use strict";var a=this,b={android:navigator.userAgent.toLowerCase().indexOf("android")>-1},c=function(a,b,c){c=c||a.parentNode;for(var d=c.querySelectorAll(b),e=0;e<d.length;e++)if(d[e]===a)return!0;return!1},d=function(a){return"string"==typeof a||a.constructor===String?document.getElementById(a):a},e=function(a){return a.srcElement||a.target},f=function(a,b){for(var c=0,d=a.length;d>c&&a[c]!=b;c++);c<a.length&&a.splice(c,1)},g=1,h=function(a,b,c){var d=g++;return a.__ta=a.__ta||{},a.__ta[b]=a.__ta[b]||{},a.__ta[b][d]=c,c.__tauid=d,d},i=function(a,b,c){if(a.__ta&&a.__ta[b]&&delete a.__ta[b][c.__tauid],c.__taExtra){for(var d=0;d<c.__taExtra.length;d++)E(a,c.__taExtra[d][0],c.__taExtra[d][1]);c.__taExtra.length=0}c.__taUnstore&&c.__taUnstore()},j=function(a,b,d,f){if(null==a)return d;var g=a.split(","),h=function(a){h.__tauid=d.__tauid;for(var f=e(a),i=0;i<g.length;i++)c(f,g[i],b)&&d.apply(f,arguments)};return k(d,f,h),h},k=function(a,b,c){a.__taExtra=a.__taExtra||[],a.__taExtra.push([b,c])},l=function(a,b,c,d){if(r&&t[b]){var e=j(d,a,c,t[b]);D(a,t[b],e,c)}"focus"===b&&null==a.getAttribute("tabindex")&&a.setAttribute("tabindex","1"),D(a,b,j(d,a,c,b),c)},m=function(a,b,c,d){if(null==a.__taSmartClicks){var g=function(b){a.__tad=x(b)},h=function(b){a.__tau=x(b)},i=function(b){if(a.__tad&&a.__tau&&a.__tad[0]===a.__tau[0]&&a.__tad[1]===a.__tau[1])for(var c=0;c<a.__taSmartClicks.length;c++)a.__taSmartClicks[c].apply(e(b),[b])};l(a,"mousedown",g,d),l(a,"mouseup",h,d),l(a,"click",i,d),a.__taSmartClicks=[]}a.__taSmartClicks.push(c),c.__taUnstore=function(){f(a.__taSmartClicks,c)}},n={tap:{touches:1,taps:1},dbltap:{touches:1,taps:2},contextmenu:{touches:2,taps:1}},o=function(a,b){return function(d,g,h,i){if("contextmenu"==g&&s)l(d,g,h,i);else{if(null==d.__taTapHandler){var j=d.__taTapHandler={tap:[],dbltap:[],contextmenu:[],down:!1,taps:0,downSelectors:[]},k=function(e){for(var f=e.srcElement||e.target,g=0;g<j.downSelectors.length;g++)if(null==j.downSelectors[g]||c(f,j.downSelectors[g],d)){j.down=!0,setTimeout(o,a),setTimeout(p,b);break}},m=function(a){if(j.down){var b=a.srcElement||a.target;j.taps++;var f=C(a);for(var g in n)if(n.hasOwnProperty(g)){var h=n[g];if(h.touches===f&&(1===h.taps||h.taps===j.taps))for(var i=0;i<j[g].length;i++)(null==j[g][i][1]||c(b,j[g][i][1],d))&&j[g][i][0].apply(e(a),[a])}}},o=function(){j.down=!1},p=function(){j.taps=0};l(d,"mousedown",k),l(d,"mouseup",m)}d.__taTapHandler.downSelectors.push(i),d.__taTapHandler[g].push([h,i]),h.__taUnstore=function(){f(d.__taTapHandler[g],h)}}}},p=function(a,b,c,d){for(var e in c.__tamee[a])c.__tamee[a].hasOwnProperty(e)&&c.__tamee[a][e].apply(d,[b])},q=function(){var a=[];return function(b,d,f,g){if(!b.__tamee){b.__tamee={over:!1,mouseenter:[],mouseexit:[]};var i=function(d){var f=e(d);(null==g&&f==b&&!b.__tamee.over||c(f,g,b)&&(null==f.__tamee||!f.__tamee.over))&&(p("mouseenter",d,b,f),f.__tamee=f.__tamee||{},f.__tamee.over=!0,a.push(f))},k=function(d){for(var f=e(d),g=0;g<a.length;g++)f!=a[g]||c(d.relatedTarget||d.toElement,"*",f)||(f.__tamee.over=!1,a.splice(g,1),p("mouseexit",d,b,f))};D(b,"mouseover",j(g,b,i,"mouseover"),i),D(b,"mouseout",j(g,b,k,"mouseout"),k)}f.__taUnstore=function(){delete b.__tamee[d][f.__tauid]},h(b,d,f),b.__tamee[d][f.__tauid]=f}},r="ontouchstart"in document.documentElement,s="onmousedown"in document.documentElement,t={mousedown:"touchstart",mouseup:"touchend",mousemove:"touchmove"},u=function(){var a=-1;if("Microsoft Internet Explorer"==navigator.appName){var b=navigator.userAgent,c=new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})");null!=c.exec(b)&&(a=parseFloat(RegExp.$1))}return a}(),v=u>-1&&9>u,w=function(a,b){if(null==a)return[0,0];var c=B(a),d=A(c,0);return[d[b+"X"],d[b+"Y"]]},x=function(a){return null==a?[0,0]:v?[a.clientX+document.documentElement.scrollLeft,a.clientY+document.documentElement.scrollTop]:w(a,"page")},y=function(a){return w(a,"screen")},z=function(a){return w(a,"client")},A=function(a,b){return a.item?a.item(b):a[b]},B=function(a){return a.touches&&a.touches.length>0?a.touches:a.changedTouches&&a.changedTouches.length>0?a.changedTouches:a.targetTouches&&a.targetTouches.length>0?a.targetTouches:[a]},C=function(a){return B(a).length},D=function(a,b,c,d){if(h(a,b,c),d.__tauid=c.__tauid,a.addEventListener)a.addEventListener(b,c,!1);else if(a.attachEvent){var e=b+c.__tauid;a["e"+e]=c,a[e]=function(){a["e"+e]&&a["e"+e](window.event)},a.attachEvent("on"+b,a[e])}},E=function(a,b,c){null!=c&&F(a,function(){var e=d(this);if(i(e,b,c),null!=c.__tauid)if(e.removeEventListener)e.removeEventListener(b,c,!1),r&&t[b]&&e.removeEventListener(t[b],c,!1);else if(this.detachEvent){var f=b+c.__tauid;e[f]&&e.detachEvent("on"+b,e[f]),e[f]=null,e["e"+f]=null}c.__taTouchProxy&&E(a,c.__taTouchProxy[1],c.__taTouchProxy[0])})},F=function(a,b){if(null!=a){a="undefined"!=typeof Window&&"unknown"!=typeof a.top&&a==a.top?[a]:"string"!=typeof a&&null==a.tagName&&null!=a.length?a:"string"==typeof a?document.querySelectorAll(a):[a];for(var c=0;c<a.length;c++)b.apply(a[c])}};a.Mottle=function(a){a=a||{};var c=a.clickThreshold||150,e=a.dblClickThreshold||350,f=new q,g=new o(c,e),h=a.smartClicks,i=function(a,b,c,e){null!=c&&F(a,function(){var a=d(this);h&&"click"===b?m(a,b,c,e):"tap"===b||"dbltap"===b||"contextmenu"===b?g(a,b,c,e):"mouseenter"===b||"mouseexit"==b?f(a,b,c,e):l(a,b,c,e)})};this.remove=function(a){return F(a,function(){var a=d(this);if(a.__ta)for(var b in a.__ta)if(a.__ta.hasOwnProperty(b))for(var c in a.__ta[b])a.__ta[b].hasOwnProperty(c)&&E(a,b,a.__ta[b][c]);a.parentNode&&a.parentNode.removeChild(a)}),this},this.on=function(){var a=arguments[0],b=4==arguments.length?arguments[2]:null,c=arguments[1],d=arguments[arguments.length-1];return i(a,c,d,b),this},this.off=function(a,b,c){return E(a,b,c),this},this.trigger=function(a,c,e,f){var g=s&&("undefined"==typeof MouseEvent||null==e||e.constructor===MouseEvent),h=r&&!s&&t[c]?t[c]:c,i=!(r&&!s&&t[c]),j=x(e),k=y(e),l=z(e);return F(a,function(){var a,m=d(this);e=e||{screenX:k[0],screenY:k[1],clientX:l[0],clientY:l[1]};var n=function(a){f&&(a.payload=f)},o={TouchEvent:function(a){var b=document.createTouch(window,m,0,j[0],j[1],k[0],k[1],l[0],l[1],0,0,0,0),c=document.createTouchList(b),d=document.createTouchList(b),e=document.createTouchList(b);a.initTouchEvent(h,!0,!0,window,null,k[0],k[1],l[0],l[1],!1,!1,!1,!1,c,d,e,1,0)},MouseEvents:function(a){if(a.initMouseEvent(h,!0,!0,window,0,k[0],k[1],l[0],l[1],!1,!1,!1,!1,1,m),b.android){var c=document.createTouch(window,m,0,j[0],j[1],k[0],k[1],l[0],l[1],0,0,0,0);a.touches=a.targetTouches=a.changedTouches=document.createTouchList(c)}}};if(document.createEvent){var p=!i&&!g&&r&&t[c]&&!b.android,q=p?"TouchEvent":"MouseEvents";a=document.createEvent(q),o[q](a),n(a),m.dispatchEvent(a)}else document.createEventObject&&(a=document.createEventObject(),a.eventType=a.eventName=h,a.screenX=k[0],a.screenY=k[1],a.clientX=l[0],a.clientY=l[1],n(a),m.fireEvent("on"+h,a))}),this}},a.Mottle.consume=function(a,b){a.stopPropagation?a.stopPropagation():a.returnValue=!1,!b&&a.preventDefault&&a.preventDefault()},a.Mottle.pageLocation=x,a.Mottle.setForceTouchEvents=function(a){r=a},a.Mottle.setForceMouseEvents=function(a){s=a}}.call(this),function(){"use strict";var a=function(a,b,c){return-1===a.indexOf(b)?(c?a.unshift(b):a.push(b),!0):!1},b=function(a,b){var c=a.indexOf(b);-1!=c&&a.splice(c,1)},c=function(a,b){for(var c=[],d=0;d<a.length;d++)-1==b.indexOf(a[d])&&c.push(a[d]);return c},d=function(a){return null==a?!1:"string"==typeof a||a.constructor==String},e=function(a){var b=a.getBoundingClientRect(),c=document.body,d=document.documentElement,e=window.pageYOffset||d.scrollTop||c.scrollTop,f=window.pageXOffset||d.scrollLeft||c.scrollLeft,g=d.clientTop||c.clientTop||0,h=d.clientLeft||c.clientLeft||0,i=b.top+e-g,j=b.left+f-h;return{top:Math.round(i),left:Math.round(j)}},f=function(a,b,c){c=c||a.parentNode;for(var d=c.querySelectorAll(b),e=0;e<d.length;e++)if(d[e]===a)return!0;return!1},g=function(){var a=-1;if("Microsoft Internet Explorer"==navigator.appName){var b=navigator.userAgent,c=new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})");null!=c.exec(b)&&(a=parseFloat(RegExp.$1))}return a}(),h=50,i=50,j=g>-1&&9>g,k=9==g,l=function(a){if(j)return[a.clientX+document.documentElement.scrollLeft,a.clientY+document.documentElement.scrollTop];var b=n(a),c=m(b,0);return k?[c.pageX||c.clientX,c.pageY||c.clientY]:[c.pageX,c.pageY]},m=function(a,b){return a.item?a.item(b):a[b]},n=function(a){return a.touches&&a.touches.length>0?a.touches:a.changedTouches&&a.changedTouches.length>0?a.changedTouches:a.targetTouches&&a.targetTouches.length>0?a.targetTouches:[a]},o={draggable:"katavorio-draggable",droppable:"katavorio-droppable",drag:"katavorio-drag",selected:"katavorio-drag-selected",active:"katavorio-drag-active",hover:"katavorio-drag-hover",noSelect:"katavorio-drag-no-select"},p="katavorio-drag-scope",q=["stop","start","drag","drop","over","out","beforeStart"],r=function(){},s=function(){return!0},t=function(a,b,c){for(var d=0;d<a.length;d++)a[d]!=c&&b(a[d])},u=function(a,b,c,d){t(a,function(a){a.setActive(b),b&&a.updatePosition(),c&&a.setHover(d,b)})},v=function(a,b){if(null!=a){a=d(a)||null!=a.tagName||null==a.length?[a]:a;for(var c=0;c<a.length;c++)b.apply(a[c],[a[c]])}},w=function(a){a.stopPropagation?(a.stopPropagation(),a.preventDefault()):a.returnValue=!1},x="input,textarea,select,button,option",y=function(a,b,c){var d=a.srcElement||a.target;return!f(d,c.getInputFilterSelector(),b)},z=function(a,b,c,d){this.params=b||{},this.el=a,this.params.addClass(this.el,this._class),this.uuid=C();var e=!0;return this.setEnabled=function(a){e=a},this.isEnabled=function(){return e},this.toggleEnabled=function(){e=!e},this.setScope=function(a){this.scopes=a?a.split(/\s+/):[d]},this.addScope=function(a){var b={};v(this.scopes,function(a){b[a]=!0}),v(a?a.split(/\s+/):[],function(a){b[a]=!0}),this.scopes=[];for(var c in b)this.scopes.push(c)},this.removeScope=function(a){var b={};v(this.scopes,function(a){b[a]=!0}),v(a?a.split(/\s+/):[],function(a){delete b[a]}),this.scopes=[];for(var c in b)this.scopes.push(c)},this.toggleScope=function(a){var b={};v(this.scopes,function(a){b[a]=!0}),v(a?a.split(/\s+/):[],function(a){b[a]?delete b[a]:b[a]=!0}),this.scopes=[];for(var c in b)this.scopes.push(c)},this.setScope(b.scope),this.k=b.katavorio,b.katavorio},A=function(a,b,c){this._class=c.draggable;var g=z.apply(this,arguments);this.rightButtonCanDrag=this.params.rightButtonCanDrag;var j=[0,0],k=null,m=!1,n=this.params.consumeStartEvent!==!1,o=this.el,p=this.params.clone,q=(this.params.scroll,b.multipleDrop!==!1),r=b.snapThreshold||5,t=function(a,b,c,d,e){d=d||r,e=e||r;var f=Math.floor(a[0]/b),g=b*f,h=g+b,i=Math.abs(a[0]-g)<=d?g:Math.abs(h-a[0])<=d?h:a[0],j=Math.floor(a[1]/c),k=c*j,l=k+c,m=Math.abs(a[1]-k)<=e?k:Math.abs(l-a[1])<=e?l:a[1];return[i,m]};this.posses=[],this.posseRoles={},this.toGrid=function(a){return null==this.params.grid?a:t(a,this.params.grid[0],this.params.grid[1])},this.snap=function(a,b){if(null!=o){a=a||(this.params.grid?this.params.grid[0]:h),b=b||(this.params.grid?this.params.grid[1]:i);var c=this.params.getPosition(o);this.params.setPosition(o,t(c,a,b,a,b))}},this.constrain="function"==typeof this.params.constrain?this.params.constrain:this.params.constrain||this.params.containment?function(a){return[Math.max(0,Math.min(D.w-this.size[0],a[0])),Math.max(0,Math.min(D.h-this.size[1],a[1]))]}:function(a){return a};var v=function(a){return"function"==typeof a?(a._katavorioId=C(),a._katavorioId):a},x={},A=function(a){for(var b in x){var c=x[b],d=c[0](a);if(c[1]&&(d=!d),!d)return!1}return!0},B=this.setFilter=function(b,c){if(b){var e=v(b);x[e]=[function(c){var e,g=c.srcElement||c.target;return d(b)?e=f(g,b,a):"function"==typeof b&&(e=b(c,a)),e},c!==!1]}};this.addFilter=B,this.removeFilter=function(a){var b="function"==typeof a?a._katavorioId:a;delete x[b]},this.clearAllFilters=function(){x={}},this.canDrag=this.params.canDrag||s;var D,E=[],F=[];this.downListener=function(a){var b=this.rightButtonCanDrag||3!==a.which&&2!==a.button;if(b&&this.isEnabled()&&this.canDrag()){var d=A(a)&&y(a,this.el,this.k);if(d){if(p){o=this.el.cloneNode(!0),o.setAttribute("id",null),o.style.position="absolute";var f=e(this.el);o.style.left=f.left+"px",o.style.top=f.top+"px",document.body.appendChild(o)}else o=this.el;n&&w(a),j=l(a),this.params.bind(document,"mousemove",this.moveListener),this.params.bind(document,"mouseup",this.upListener),g.markSelection(this),g.markPosses(this),this.params.addClass(document.body,c.noSelect),H("beforeStart",{el:this.el,pos:k,e:a,drag:this})}else this.params.consumeFilteredEvents&&w(a)}}.bind(this),this.moveListener=function(a){if(j){if(!m){var b=H("start",{el:this.el,pos:k,e:a,drag:this});if(b!==!1){if(!j)return;this.mark(!0),m=!0}}if(j){F.length=0;var c=l(a),d=c[0]-j[0],e=c[1]-j[1],f=this.params.ignoreZoom?1:g.getZoom();d/=f,e/=f,this.moveBy(d,e,a),g.updateSelection(d,e,this),g.updatePosses(d,e,this)}}}.bind(this),this.upListener=function(a){j&&(j=null,this.params.unbind(document,"mousemove",this.moveListener),this.params.unbind(document,"mouseup",this.upListener),this.params.removeClass(document.body,c.noSelect),this.unmark(a),g.unmarkSelection(this,a),g.unmarkPosses(this,a),this.stop(a),g.notifySelectionDragStop(this,a),g.notifyPosseDragStop(this,a),m=!1,p&&(o&&o.parentNode&&o.parentNode.removeChild(o),o=null))}.bind(this),this.getFilters=function(){return x},this.abort=function(){null!=j&&this.upListener()},this.getDragElement=function(){return o||this.el};var G={start:[],drag:[],stop:[],over:[],out:[],beforeStart:[]};b.events.start&&G.start.push(b.events.start),b.events.beforeStart&&G.beforeStart.push(b.events.beforeStart),b.events.stop&&G.stop.push(b.events.stop),b.events.drag&&G.drag.push(b.events.drag),this.on=function(a,b){G[a]&&G[a].push(b)};var H=function(a,b){if(G[a])for(var c=0;c<G[a].length;c++)try{G[a][c](b)}catch(d){}};this.notifyStart=function(a){H("start",{el:this.el,pos:this.params.getPosition(o),e:a,drag:this})},this.stop=function(a,b){if(b||m){var c=[],d=g.getSelection(),e=this.params.getPosition(o);if(d.length>1)for(var f=0;f<d.length;f++){var h=this.params.getPosition(d[f].el);c.push([d[f].el,{left:h[0],top:h[1]},d[f]])}else c.push([o,{left:e[0],top:e[1]},this]);H("stop",{el:o,pos:e,e:a,drag:this,selection:c})}},this.mark=function(a){if(k=this.params.getPosition(o),this.size=this.params.getSize(o),E=g.getMatchingDroppables(this),u(E,!0,!1,this),this.params.addClass(o,this.params.dragClass||c.drag),this.params.constrain||this.params.containment){var b=this.params.getSize(o.parentNode);D={w:b[0],h:b[1]}}a&&g.notifySelectionDragStart(this)},this.unmark=function(a,b){if(u(E,!1,!0,this),this.params.removeClass(o,this.params.dragClass||c.drag),E.length=0,!b)for(var d=0;d<F.length;d++){var e=F[d].drop(this,a);if(e===!0)break}},this.moveBy=function(a,b,c){F.length=0;var d=this.constrain(this.toGrid([k[0]+a,k[1]+b]),o),e={x:d[0],y:d[1],w:this.size[0],h:this.size[1]},f=null;this.params.setPosition(o,d);for(var g=0;g<E.length;g++){var h={x:E[g].position[0],y:E[g].position[1],w:E[g].size[0],h:E[g].size[1]};this.params.intersects(e,h)&&(q||null==f||f==E[g].el)&&E[g].canDrop(this)?(f||(f=E[g].el),F.push(E[g]),E[g].setHover(this,!0,c)):E[g].isHover()&&E[g].setHover(this,!1,c)}H("drag",{el:this.el,pos:d,e:c,drag:this})},this.destroy=function(){this.params.unbind(this.el,"mousedown",this.downListener),this.params.unbind(document,"mousemove",this.moveListener),this.params.unbind(document,"mouseup",this.upListener),this.downListener=null,this.upListener=null,this.moveListener=null},this.params.bind(this.el,"mousedown",this.downListener),this.params.handle?B(this.params.handle,!1):B(this.params.filter,this.params.filterExclude)},B=function(a,b,c){this._class=c.droppable,this.params=b||{},this._activeClass=this.params.activeClass||c.active,this._hoverClass=this.params.hoverClass||c.hover,z.apply(this,arguments);var d=!1;this.allowLoopback=this.params.allowLoopback!==!1,this.setActive=function(a){this.params[a?"addClass":"removeClass"](this.el,this._activeClass)},this.updatePosition=function(){this.position=this.params.getPosition(this.el),this.size=this.params.getSize(this.el)},this.canDrop=this.params.canDrop||function(){return!0},this.isHover=function(){return d},this.setHover=function(a,b,c){(b||null==this.el._katavorioDragHover||this.el._katavorioDragHover==a.el._katavorio)&&(this.params[b?"addClass":"removeClass"](this.el,this._hoverClass),this.el._katavorioDragHover=b?a.el._katavorio:null,d!==b&&this.params.events[b?"over":"out"]({el:this.el,e:c,drag:a,drop:this}),d=b)},this.drop=function(a,b){return this.params.events.drop({drag:a,e:b,drop:this})},this.destroy=function(){this._class=null,this._activeClass=null,this._hoverClass=null,d=null}},C=function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(a){var b=0|16*Math.random(),c="x"==a?b:8|3&b;return c.toString(16)})},D=function(a){return null==a?null:(a="string"==typeof a||a.constructor==String?document.getElementById(a):a,null==a?null:(a._katavorio=a._katavorio||C(),a))};this.Katavorio=function(e){var f=[],g={};this._dragsByScope={},this._dropsByScope={};var h=1,i=function(a,b){v(a,function(a){for(var c=0;c<a.scopes.length;c++)b[a.scopes[c]]=b[a.scopes[c]]||[],b[a.scopes[c]].push(a)})},j=function(a,b){var c=0;return v(a,function(a){for(var d=0;d<a.scopes.length;d++)if(b[a.scopes[d]]){var f=e.indexOf(b[a.scopes[d]],a);-1!=f&&(b[a.scopes[d]].splice(f,1),c++)}}),c>0},k=(this.getMatchingDroppables=function(a){for(var b=[],c={},d=0;d<a.scopes.length;d++){var e=this._dropsByScope[a.scopes[d]];if(e)for(var f=0;f<e.length;f++)!e[f].canDrop(a)||c[e[f].uuid]||!e[f].allowLoopback&&e[f].el===a.el||(c[e[f].uuid]=!0,b.push(e[f]))}return b},function(a){a=a||{};var b,c={events:{}};for(b in e)c[b]=e[b];for(b in a)c[b]=a[b];for(b=0;b<q.length;b++)c.events[q[b]]=a[q[b]]||r;return c.katavorio=this,c}.bind(this)),l=function(a,b){for(var c=0;c<q.length;c++)b[q[c]]&&a.on(q[c],b[q[c]])}.bind(this),m={},n=e.css||{},s=e.scope||p;for(var u in o)m[u]=o[u];for(var u in n)m[u]=n[u];var w=e.inputFilterSelector||x;this.getInputFilterSelector=function(){return w},this.setInputFilterSelector=function(a){return w=a,this},this.draggable=function(a,b){var c=[];return v(a,function(a){if(a=D(a),null!=a)if(null==a._katavorioDrag){var d=k(b);a._katavorioDrag=new A(a,d,m,s),i(a._katavorioDrag,this._dragsByScope),c.push(a._katavorioDrag),e.addClass(a,m.draggable)}else l(a._katavorioDrag,b)}.bind(this)),c},this.droppable=function(a,b){var c=[];return v(a,function(a){if(a=D(a),null!=a){var d=new B(a,k(b),m,s);a._katavorioDrop=a._katavorioDrop||[],a._katavorioDrop.push(d),i(d,this._dropsByScope),c.push(d),e.addClass(a,m.droppable)}}.bind(this)),c},this.select=function(a){return v(a,function(){var a=D(this);a&&a._katavorioDrag&&(g[a._katavorio]||(f.push(a._katavorioDrag),g[a._katavorio]=[a,f.length-1],e.addClass(a,m.selected)))}),this},this.deselect=function(a){return v(a,function(){var a=D(this);if(a&&a._katavorio){var b=g[a._katavorio];if(b){for(var c=[],d=0;d<f.length;d++)f[d].el!==a&&c.push(f[d]);f=c,delete g[a._katavorio],e.removeClass(a,m.selected)}}}),this},this.deselectAll=function(){for(var a in g){var b=g[a];e.removeClass(b[0],m.selected)}f.length=0,g={}},this.markSelection=function(a){t(f,function(a){a.mark()},a)},this.markPosses=function(a){a.posses&&v(a.posses,function(b){a.posseRoles[b]&&E[b]&&t(E[b].members,function(a){a.mark()},a)})},this.unmarkSelection=function(a,b){t(f,function(a){a.unmark(b)},a)},this.unmarkPosses=function(a,b){a.posses&&v(a.posses,function(c){a.posseRoles[c]&&E[c]&&t(E[c].members,function(a){a.unmark(b,!0)},a)})},this.getSelection=function(){return f.slice(0)},this.updateSelection=function(a,b,c){t(f,function(c){c.moveBy(a,b)},c)};var y=function(a,b){b.posses&&v(b.posses,function(c){b.posseRoles[c]&&E[c]&&t(E[c].members,function(b){a(b)},b)})};this.updatePosses=function(a,b,c){y(function(c){c.moveBy(a,b)},c)},this.notifyPosseDragStop=function(a,b){y(function(a){a.stop(b,!0)},a)},this.notifySelectionDragStop=function(a,b){t(f,function(a){a.stop(b,!0)},a)},this.notifySelectionDragStart=function(a,b){t(f,function(a){a.notifyStart(b)},a)},this.setZoom=function(a){h=a},this.getZoom=function(){return h};var z=function(a,b,c,d){v(a,function(a){j(a,c),a[d](b),i(a,c)})};v(["set","add","remove","toggle"],function(a){this[a+"Scope"]=function(b,c){z(b._katavorioDrag,c,this._dragsByScope,a+"Scope"),z(b._katavorioDrop,c,this._dropsByScope,a+"Scope")}.bind(this),this[a+"DragScope"]=function(b,c){z(b.constructor===A?b:b._katavorioDrag,c,this._dragsByScope,a+"Scope")}.bind(this),this[a+"DropScope"]=function(b,c){z(b.constructor===B?b:b._katavorioDrop,c,this._dropsByScope,a+"Scope")}.bind(this)}.bind(this)),this.snapToGrid=function(a,b){for(var c in this._dragsByScope)t(this._dragsByScope[c],function(c){c.snap(a,b)})},this.getDragsForScope=function(a){return this._dragsByScope[a]},this.getDropsForScope=function(a){return this._dropsByScope[a]};var C=function(a,b,c){a=D(a),a[b]&&(j(a[b],c)&&v(a[b],function(a){a.destroy()}),a[b]=null)};this.elementRemoved=function(a){this.destroyDraggable(a),this.destroyDroppable(a)},this.destroyDraggable=function(a){C(a,"_katavorioDrag",this._dragsByScope)},this.destroyDroppable=function(a){C(a,"_katavorioDrop",this._dropsByScope)},this.reset=function(){this._dragsByScope={},this._dropsByScope={},f=[],g={},E={}};var E={},F=function(b,c,e){var f=d(c)?c:c.id,g=d(c)?!0:c.active!==!1,h=E[f]||function(){var a={name:f,members:[]};return E[f]=a,a}();return v(b,function(b){if(b._katavorioDrag){if(e&&null!=b._katavorioDrag.posseRoles[h.name])return;a(h.members,b._katavorioDrag),a(b._katavorioDrag.posses,h.name),b._katavorioDrag.posseRoles[h.name]=g}}),h};this.addToPosse=function(a){for(var b=[],c=1;c<arguments.length;c++)b.push(F(a,arguments[c]));return 1==b.length?b[0]:b},this.setPosse=function(a){for(var b=[],d=1;d<arguments.length;d++)b.push(F(a,arguments[d],!0).name);return v(a,function(a){if(a._katavorioDrag){var d=c(a._katavorioDrag.posses,b),e=[];Array.prototype.push.apply(e,a._katavorioDrag.posses);for(var f=0;f<d.length;f++)this.removeFromPosse(a,d[f])}}.bind(this)),1==b.length?b[0]:b},this.removeFromPosse=function(a,c){if(arguments.length<2)throw new TypeError("No posse id provided for remove operation");for(var d=1;d<arguments.length;d++)c=arguments[d],v(a,function(a){if(a._katavorioDrag&&a._katavorioDrag.posses){var d=a._katavorioDrag;v(c,function(a){b(E[a].members,d),b(d.posses,a),delete d.posseRoles[a]})}})},this.removeFromAllPosses=function(a){v(a,function(a){if(a._katavorioDrag&&a._katavorioDrag.posses){var c=a._katavorioDrag;v(c.posses,function(a){b(E[a].members,c)}),c.posses.length=0,c.posseRoles={}}})},this.setPosseState=function(a,b,c){var d=E[b];d&&v(a,function(a){a._katavorioDrag&&a._katavorioDrag.posses&&(a._katavorioDrag.posseRoles[d.name]=c)})}}}.call(this),function(){var a=function(a){return"[object Array]"===Object.prototype.toString.call(a)},b=function(a){return"[object Number]"===Object.prototype.toString.call(a)},c=function(a){return"string"==typeof a},d=function(a){return"boolean"==typeof a},e=function(a){return null==a},f=function(a){return null==a?!1:"[object Object]"===Object.prototype.toString.call(a)},g=function(a){return"[object Date]"===Object.prototype.toString.call(a)},h=function(a){return"[object Function]"===Object.prototype.toString.call(a)},i=function(a){for(var b in a)if(a.hasOwnProperty(b))return!1;return!0},j=this,k=j.jsPlumbUtil={isArray:a,isString:c,isBoolean:d,isNull:e,isObject:f,isDate:g,isFunction:h,isEmpty:i,isNumber:b,clone:function(b){if(c(b))return""+b;if(d(b))return!!b;if(g(b))return new Date(b.getTime());if(h(b))return b;if(a(b)){for(var e=[],i=0;i<b.length;i++)e.push(this.clone(b[i]));return e}if(f(b)){var j={};for(var k in b)j[k]=this.clone(b[k]);return j}return b},merge:function(b,e,g){var h,i,j={};for(g=g||[],i=0;i<g.length;i++)j[g[i]]=!0;var k=this.clone(b);for(i in e)if(null==k[i])k[i]=e[i];else if(c(e[i])||d(e[i]))j[i]?(h=[],h.push.apply(h,a(k[i])?k[i]:[k[i]]),h.push.apply(h,a(e[i])?e[i]:[e[i]]),k[i]=h):k[i]=e[i];else if(a(e[i]))h=[],a(k[i])&&h.push.apply(h,k[i]),h.push.apply(h,e[i]),k[i]=h;else if(f(e[i])){f(k[i])||(k[i]={});for(var l in e[i])k[i][l]=e[i][l]}return k},replace:function(a,b,c){if(null!=a){var d=a,e=d;return b.replace(/([^\.])+/g,function(a,b,d,f){var g=a.match(/([^\[0-9]+){1}(\[)([0-9+])/),h=d+a.length>=f.length,i=function(){return e[g[1]]||function(){return e[g[1]]=[],e[g[1]]}()};if(h)g?i()[g[3]]=c:e[a]=c;else if(g){var j=i();e=j[g[3]]||function(){return j[g[3]]={},j[g[3]]}()}else e=e[a]||function(){return e[a]={},e[a]}()}),a}},functionChain:function(a,b,c){for(var d=0;d<c.length;d++){var e=c[d][0][c[d][1]].apply(c[d][0],c[d][2]);if(e===b)return e}return a},populate:function(b,d,e){var g=function(a){var b=a.match(/(\${.*?})/g);if(null!=b)for(var c=0;c<b.length;c++){var e=d[b[c].substring(2,b[c].length-1)]||"";null!=e&&(a=a.replace(b[c],e))}return a},i=function(b){if(null!=b){if(c(b))return g(b);if(!h(b)||null!=e&&0!==(b.name||"").indexOf(e)){if(a(b)){for(var j=[],k=0;k<b.length;k++)j.push(i(b[k]));return j}if(f(b)){var l={};for(var m in b)l[m]=i(b[m]);return l}return b}return b(d)}};return i(b)},findWithFunction:function(a,b){if(a)for(var c=0;c<a.length;c++)if(b(a[c]))return c;return-1},removeWithFunction:function(a,b){var c=k.findWithFunction(a,b);return c>-1&&a.splice(c,1),-1!=c},remove:function(a,b){var c=a.indexOf(b);return c>-1&&a.splice(c,1),-1!=c},addWithFunction:function(a,b,c){-1==k.findWithFunction(a,c)&&a.push(b)},addToList:function(a,b,c,d){var e=a[b];return null==e&&(e=[],a[b]=e),e[d?"unshift":"push"](c),e},extend:function(b,c){var d;for(c=a(c)?c:[c],d=0;d<c.length;d++)for(var e in c[d].prototype)c[d].prototype.hasOwnProperty(e)&&(b.prototype[e]=c[d].prototype[e]);var f=function(a,b){return function(){for(d=0;d<c.length;d++)c[d].prototype[a]&&c[d].prototype[a].apply(this,arguments);return b.apply(this,arguments)}},g=function(a){for(var c in a)b.prototype[c]=f(c,a[c])};if(arguments.length>2)for(d=2;d<arguments.length;d++)g(arguments[d]); +return b},uuid:function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(a){var b=0|16*Math.random(),c="x"==a?b:8|3&b;return c.toString(16)})},logEnabled:!0,log:function(){if(k.logEnabled&&"undefined"!=typeof console)try{var a=arguments[arguments.length-1];console.log(a)}catch(b){}},wrap:function(a,b,c){return a=a||function(){},b=b||function(){},function(){var d=null;try{d=b.apply(this,arguments)}catch(e){k.log("jsPlumb function failed : "+e)}if(null==c||d!==c)try{d=a.apply(this,arguments)}catch(e){k.log("wrapped function failed : "+e)}return d}}};k.EventGenerator=function(){var a={},b=!1,c={ready:!0};this.bind=function(b,c,d){var e=function(b){k.addToList(a,b,c,d),c.__jsPlumb=c.__jsPlumb||{},c.__jsPlumb[jsPlumbUtil.uuid()]=b};if("string"==typeof b)e(b);else if(null!=b.length)for(var f=0;f<b.length;f++)e(b[f]);return this},this.fire=function(d,e,f){if(!b&&a[d]){var g=a[d].length,h=0,i=!1,j=null;if(!this.shouldFireEvent||this.shouldFireEvent(d,e,f))for(;!i&&g>h&&j!==!1;){if(c[d])a[d][h].apply(this,[e,f]);else try{j=a[d][h].apply(this,[e,f])}catch(l){k.log("jsPlumb: fire failed for event "+d+" : "+l)}h++,(null==a||null==a[d])&&(i=!0)}}return this},this.unbind=function(b,c){if(0===arguments.length)a={};else if(1===arguments.length){if("string"==typeof b)delete a[b];else if(b.__jsPlumb){var d;for(var e in b.__jsPlumb)d=b.__jsPlumb[e],k.remove(a[d]||[],b)}}else 2===arguments.length&&k.remove(a[b]||[],c);return this},this.getListener=function(b){return a[b]},this.setSuspendEvents=function(a){b=a},this.isSuspendEvents=function(){return b},this.silently=function(a){this.setSuspendEvents(!0);try{a()}catch(b){jsPlumbUtil.log("Cannot execute silent function "+b)}this.setSuspendEvents(!1)},this.cleanupListeners=function(){for(var b in a)a[b]=null}},k.EventGenerator.prototype={cleanup:function(){this.cleanupListeners()}}}.call(this),function(){"use strict";var a=this,b=a.jsPlumbUtil;b.matchesSelector=function(a,b,c){c=c||a.parentNode;for(var d=c.querySelectorAll(b),e=0;e<d.length;e++)if(d[e]===a)return!0;return!1},b.consume=function(a,b){a.stopPropagation?a.stopPropagation():a.returnValue=!1,!b&&a.preventDefault&&a.preventDefault()},b.sizeElement=function(a,b,c,d,e){a&&(a.style.height=e+"px",a.height=e,a.style.width=d+"px",a.width=d,a.style.left=b+"px",a.style.top=c+"px")}}.call(this),function(){"use strict";var a,b=this,c=[],d=b.jsPlumbUtil,e=function(){return""+(new Date).getTime()},f=function(a){if(a._jsPlumb.paintStyle&&a._jsPlumb.hoverPaintStyle){var b={};r.extend(b,a._jsPlumb.paintStyle),r.extend(b,a._jsPlumb.hoverPaintStyle),delete a._jsPlumb.hoverPaintStyle,b.gradient&&a._jsPlumb.paintStyle.fillStyle&&delete b.gradient,a._jsPlumb.hoverPaintStyle=b}},g=["tap","dbltap","click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","contextmenu"],h=function(a,b,c,d){var e=a.getAttachedElements();if(e)for(var f=0,g=e.length;g>f;f++)d&&d==e[f]||e[f].setHover(b,!0,c)},i=function(a){return null==a?null:a.split(" ")},j=function(a,b,c){for(var d in b)a[d]=c},k=function(a,b){b=d.isArray(b)||null!=b.length&&!d.isString(b)?b:[b];for(var c=0;c<b.length;c++)try{a.apply(b[c],[b[c]])}catch(e){d.log(".each iteration failed : "+e)}},l=function(a,b,c){if(a.getDefaultType){var e=a.getTypeDescriptor(),f={},g=a.getDefaultType(),h=d.merge({},g);j(f,g,"__default");for(var i=0,k=a._jsPlumb.types.length;k>i;i++){var l=a._jsPlumb.types[i];if("__default"!==l){var m=a._jsPlumb.instance.getType(l,e);null!=m&&(h=d.merge(h,m,["cssClass"]),j(f,m,l))}}b&&(h=d.populate(h,b,"_")),a.applyType(h,c,f),c||a.repaint()}},m=b.jsPlumbUIComponent=function(a){d.EventGenerator.apply(this,arguments);var b=this,c=arguments,e=b.idPrefix,f=e+(new Date).getTime();this._jsPlumb={instance:a._jsPlumb,parameters:a.parameters||{},paintStyle:null,hoverPaintStyle:null,paintStyleInUse:null,hover:!1,beforeDetach:a.beforeDetach,beforeDrop:a.beforeDrop,overlayPlacements:[],hoverClass:a.hoverClass||a._jsPlumb.Defaults.HoverClass,types:[],typeCache:{}},this.cacheTypeItem=function(a,b,c){this._jsPlumb.typeCache[c]=this._jsPlumb.typeCache[c]||{},this._jsPlumb.typeCache[c][a]=b},this.getCachedTypeItem=function(a,b){return this._jsPlumb.typeCache[b]?this._jsPlumb.typeCache[b][a]:null},this.getId=function(){return f};var g=a.overlays||[],h={};if(this.defaultOverlayKeys){for(var i=0;i<this.defaultOverlayKeys.length;i++)Array.prototype.push.apply(g,this._jsPlumb.instance.Defaults[this.defaultOverlayKeys[i]]||[]);for(i=0;i<g.length;i++){var j=r.convertToFullOverlaySpec(g[i]);h[j[1].id]=j}}var k={overlays:h,parameters:a.parameters||{},scope:a.scope||this._jsPlumb.instance.getDefaultScope()};if(this.getDefaultType=function(){return k},this.appendToDefaultType=function(a){for(var b in a)k[b]=a[b]},a.events)for(i in a.events)b.bind(i,a.events[i]);this.clone=function(){var a={};return this.constructor.apply(a,c),a}.bind(this),this.isDetachAllowed=function(a){var b=!0;if(this._jsPlumb.beforeDetach)try{b=this._jsPlumb.beforeDetach(a)}catch(c){d.log("jsPlumb: beforeDetach callback failed",c)}return b},this.isDropAllowed=function(a,b,c,e,f,g,h){var i=this._jsPlumb.instance.checkCondition("beforeDrop",{sourceId:a,targetId:b,scope:c,connection:e,dropEndpoint:f,source:g,target:h});if(this._jsPlumb.beforeDrop)try{i=this._jsPlumb.beforeDrop({sourceId:a,targetId:b,scope:c,connection:e,dropEndpoint:f,source:g,target:h})}catch(j){d.log("jsPlumb: beforeDrop callback failed",j)}return i};var l=[];this.setListenerComponent=function(a){for(var b=0;b<l.length;b++)l[b][3]=a}},n=function(a,b){var c=a._jsPlumb.types[b],d=a._jsPlumb.instance.getType(c,a.getTypeDescriptor());null!=d&&d.cssClass&&a.canvas&&a._jsPlumb.instance.removeClass(a.canvas,d.cssClass)};d.extend(b.jsPlumbUIComponent,d.EventGenerator,{getParameter:function(a){return this._jsPlumb.parameters[a]},setParameter:function(a,b){this._jsPlumb.parameters[a]=b},getParameters:function(){return this._jsPlumb.parameters},setParameters:function(a){this._jsPlumb.parameters=a},getClass:function(){return r.getClass(this.canvas)},hasClass:function(a){return r.hasClass(this.canvas,a)},addClass:function(a){r.addClass(this.canvas,a)},removeClass:function(a){r.removeClass(this.canvas,a)},updateClasses:function(a,b){r.updateClasses(this.canvas,a,b)},setType:function(a,b,c){this.clearTypes(),this._jsPlumb.types=i(a)||[],l(this,b,c)},getType:function(){return this._jsPlumb.types},reapplyTypes:function(a,b){l(this,a,b)},hasType:function(a){return-1!=this._jsPlumb.types.indexOf(a)},addType:function(a,b,c){var d=i(a),e=!1;if(null!=d){for(var f=0,g=d.length;g>f;f++)this.hasType(d[f])||(this._jsPlumb.types.push(d[f]),e=!0);e&&l(this,b,c)}},removeType:function(a,b,c){var d=i(a),e=!1,f=function(a){var b=this._jsPlumb.types.indexOf(a);return-1!=b?(n(this,b),this._jsPlumb.types.splice(b,1),!0):!1}.bind(this);if(null!=d){for(var g=0,h=d.length;h>g;g++)e=f(d[g])||e;e&&l(this,b,c)}},clearTypes:function(a,b){for(var c=this._jsPlumb.types.length,d=0;c>d;d++)n(this,0),this._jsPlumb.types.splice(0,1);l(this,a,b)},toggleType:function(a,b,c){var d=i(a);if(null!=d){for(var e=0,f=d.length;f>e;e++){var g=this._jsPlumb.types.indexOf(d[e]);-1!=g?(n(this,g),this._jsPlumb.types.splice(g,1)):this._jsPlumb.types.push(d[e])}l(this,b,c)}},applyType:function(a,b){if(this.setPaintStyle(a.paintStyle,b),this.setHoverPaintStyle(a.hoverPaintStyle,b),a.parameters)for(var c in a.parameters)this.setParameter(c,a.parameters[c]);this._jsPlumb.paintStyleInUse=this.getPaintStyle()},setPaintStyle:function(a,b){this._jsPlumb.paintStyle=a,this._jsPlumb.paintStyleInUse=this._jsPlumb.paintStyle,f(this),b||this.repaint()},getPaintStyle:function(){return this._jsPlumb.paintStyle},setHoverPaintStyle:function(a,b){this._jsPlumb.hoverPaintStyle=a,f(this),b||this.repaint()},getHoverPaintStyle:function(){return this._jsPlumb.hoverPaintStyle},destroy:function(a){(a||null==this.typeId)&&(this.cleanupListeners(),this.clone=null,this._jsPlumb=null)},isHover:function(){return this._jsPlumb.hover},setHover:function(a,b,c){if(this._jsPlumb&&!this._jsPlumb.instance.currentlyDragging&&!this._jsPlumb.instance.isHoverSuspended()){if(this._jsPlumb.hover=a,null!=this.canvas){if(null!=this._jsPlumb.instance.hoverClass){var d=a?"addClass":"removeClass";this._jsPlumb.instance[d](this.canvas,this._jsPlumb.instance.hoverClass)}null!=this._jsPlumb.hoverClass&&this._jsPlumb.instance[d](this.canvas,this._jsPlumb.hoverClass)}null!=this._jsPlumb.hoverPaintStyle&&(this._jsPlumb.paintStyleInUse=a?this._jsPlumb.hoverPaintStyle:this._jsPlumb.paintStyle,this._jsPlumb.instance.isSuspendDrawing()||(c=c||e(),this.repaint({timestamp:c,recalc:!1}))),this.getAttachedElements&&!b&&h(this,a,e(),this)}}});var o=0,p=function(){var a=o+1;return o++,a},q=window.jsPlumbInstance=function(b){this.Defaults={Anchor:"Bottom",Anchors:[null,null],ConnectionsDetachable:!0,ConnectionOverlays:[],Connector:"Bezier",Container:null,DoNotThrowErrors:!1,DragOptions:{},DropOptions:{},Endpoint:"Dot",EndpointOverlays:[],Endpoints:[null,null],EndpointStyle:{fillStyle:"#456"},EndpointStyles:[null,null],EndpointHoverStyle:null,EndpointHoverStyles:[null,null],HoverPaintStyle:null,LabelStyle:{color:"black"},LogEnabled:!1,Overlays:[],MaxConnections:1,PaintStyle:{lineWidth:4,strokeStyle:"#456"},ReattachConnections:!1,RenderMode:"svg",Scope:"jsPlumb_DefaultScope"},b&&r.extend(this.Defaults,b),this.logEnabled=this.Defaults.LogEnabled,this._connectionTypes={},this._endpointTypes={},d.EventGenerator.apply(this);var f=this,h=p(),i=f.bind,j={},l=1,n=function(a){if(null==a)return null;if(3==a.nodeType||8==a.nodeType)return{el:a,text:!0};var b=f.getElement(a);return{el:b,id:d.isString(a)&&null==b?a:Y(b)}};this.getInstanceIndex=function(){return h},this.setZoom=function(a,b){return l=a,f.fire("zoom",l),b&&f.repaintEverything(),!0},this.getZoom=function(){return l};for(var o in this.Defaults)j[o]=this.Defaults[o];var q,s=[];this.unbindContainer=function(){if(null!=q&&s.length>0)for(var a=0;a<s.length;a++)f.off(q,s[a][0],s[a][1])},this.setContainer=function(a){this.unbindContainer(),a=this.getElement(a),this.select().each(function(b){b.moveParent(a)}),this.selectEndpoints().each(function(b){b.moveParent(a)});var b=q;q=a,s.length=0;for(var c=function(a,b){var c=b.srcElement||b.target,d=(c&&c.parentNode?c.parentNode._jsPlumb:null)||(c?c._jsPlumb:null)||(c&&c.parentNode&&c.parentNode.parentNode?c.parentNode.parentNode._jsPlumb:null);d&&(d.fire(a,d,b),f.fire(a,d.component||d,b))},d=function(a,b,c){s.push([a,c]),f.on(q,a,b,c)},e=function(a){d(a,".jsplumb-connector > *",function(b){c(a,b)}),d(a,".jsplumb-endpoint, .jsplumb-endpoint > *, .jsplumb-endpoint svg *",function(b){c(a,b)}),d(a,".jsplumb-overlay, .jsplumb-overlay *",function(b){c(a,b)})},h=0;h<g.length;h++)e(g[h]);for(var i in y){var j=y[i].el;j.parentNode===b&&(b.removeChild(j),q.appendChild(j))}},this.getContainer=function(){return q},this.bind=function(a,b){"ready"===a&&u?b():i.apply(f,[a,b])},f.importDefaults=function(a){for(var b in a)f.Defaults[b]=a[b];return a.Container&&f.setContainer(a.Container),f},f.restoreDefaults=function(){return f.Defaults=r.extend({},j),f};var t=null,u=!1,v=[],w={},x={},y={},z={},A={},B={},C=!1,D=[],E=!1,F=null,G=this.Defaults.Scope,H=1,I=function(){return""+H++},J=function(a,b){q?q.appendChild(a):b?this.getElement(b).appendChild(a):this.appendToRoot(a)}.bind(this),K=function(a,b,c,d){if(!r.headless&&!E){var g=Y(a),h=f.getDragManager().getElementsForDraggable(g);null==c&&(c=e());var i=qb({elId:g,offset:b,recalc:!1,timestamp:c});if(h)for(var j in h)qb({elId:h[j].id,offset:{left:i.o.left+h[j].offset.left,top:i.o.top+h[j].offset.top},recalc:!1,timestamp:c});if(f.anchorManager.redraw(g,b,c,null,d),h)for(var k in h)f.anchorManager.redraw(h[k].id,b,c,h[k].offset,d,!0)}},L=function(a){return x[a]},M=function(a,b,c,e){if(!r.headless){var g=null==b?!1:b;if(g&&r.isDragSupported(a,f)){var h=c||f.Defaults.DragOptions;if(h=r.extend({},h),r.isAlreadyDraggable(a,f))c.force&&f.initDraggable(a,h);else{var i=r.dragEvents.drag,j=r.dragEvents.stop,k=r.dragEvents.start,l=f.getElement(a),m=f.getDragManager().getDragAncestor(l),n={left:0,top:0},o=n,p=!1;pb(e,a),h[k]=d.wrap(h[k],function(){return o=null!=m?f.getOffset(m):n,f.setHoverSuspended(!0),f.select({source:a}).addClass(f.elementDraggingClass+" "+f.sourceElementDraggingClass,!0),f.select({target:a}).addClass(f.elementDraggingClass+" "+f.targetElementDraggingClass,!0),f.setConnectionBeingDragged(!0),h.canDrag?c.canDrag():void 0},!1),h[i]=d.wrap(h[i],function(){var b=f.getUIPosition(arguments,f.getZoom());b.left+=o.left,b.top+=o.top,K(a,b,null,!0),p&&f.addClass(a,"jsplumb-dragged"),p=!0}),h[j]=d.wrap(h[j],function(){for(var a=arguments[0].selection,b=f.getUIPosition(arguments),c=function(a){K(a[0],b),f.removeClass(a[0],"jsplumb-dragged"),f.select({source:a[0]}).removeClass(f.elementDraggingClass+" "+f.sourceElementDraggingClass,!0),f.select({target:a[0]}).removeClass(f.elementDraggingClass+" "+f.targetElementDraggingClass,!0),f.getDragManager().dragEnded(a[0])},d=0;d<a.length;d++)c(a[d]);p=!1,f.setHoverSuspended(!1),f.setConnectionBeingDragged(!1)});var q=Y(a);B[q]=!0;var s=B[q];h.disabled=null==s?!1:!s,f.initDraggable(a,h),f.getDragManager().register(a)}}}},N=function(a,b){for(var c=a.scope.split(/\s/),d=b.scope.split(/\s/),e=0;e<c.length;e++)for(var f=0;f<d.length;f++)if(d[f]==c[e])return!0;return!1},O=function(a,b){var c=r.extend({},a);if(b&&r.extend(c,b),c.source&&(c.source.endpoint?c.sourceEndpoint=c.source:c.source=f.getElement(c.source)),c.target&&(c.target.endpoint?c.targetEndpoint=c.target:c.target=f.getElement(c.target)),a.uuids&&(c.sourceEndpoint=L(a.uuids[0]),c.targetEndpoint=L(a.uuids[1])),c.sourceEndpoint&&c.sourceEndpoint.isFull())return d.log(f,"could not add connection; source endpoint is full"),void 0;if(c.targetEndpoint&&c.targetEndpoint.isFull())return d.log(f,"could not add connection; target endpoint is full"),void 0;if(!c.type&&c.sourceEndpoint&&(c.type=c.sourceEndpoint.connectionType),c.sourceEndpoint&&c.sourceEndpoint.connectorOverlays){c.overlays=c.overlays||[];for(var e=0,g=c.sourceEndpoint.connectorOverlays.length;g>e;e++)c.overlays.push(c.sourceEndpoint.connectorOverlays[e])}c.sourceEndpoint&&c.sourceEndpoint.scope&&(c.scope=c.sourceEndpoint.scope),!c["pointer-events"]&&c.sourceEndpoint&&c.sourceEndpoint.connectorPointerEvents&&(c["pointer-events"]=c.sourceEndpoint.connectorPointerEvents);var h=function(a,b){var c=r.extend({},a);for(var d in b)b[d]&&(c[d]=b[d]);return c},i=function(a,b,d){return f.addEndpoint(a,h(b,{anchor:c.anchors?c.anchors[d]:c.anchor,endpoint:c.endpoints?c.endpoints[d]:c.endpoint,paintStyle:c.endpointStyles?c.endpointStyles[d]:c.endpointStyle,hoverPaintStyle:c.endpointHoverStyles?c.endpointHoverStyles[d]:c.endpointHoverStyle}))},j=function(a,b,d,e){if(c[a]&&!c[a].endpoint&&!c[a+"Endpoint"]&&!c.newConnection){var f=Y(c[a]),g=d[f];if(g=g?g[e]:null){if(!g.enabled)return!1;var h=null!=g.endpoint&&g.endpoint._jsPlumb?g.endpoint:i(c[a],g.def,b);if(h.isFull())return!1;c[a+"Endpoint"]=h,h._doNotDeleteOnDetach=!1,h._deleteOnDetach=!0,g.uniqueEndpoint&&(g.endpoint?h.finalEndpoint=g.endpoint:(g.endpoint=h,h._deleteOnDetach=!1,h._doNotDeleteOnDetach=!0))}}};return j("source",0,this.sourceEndpointDefinitions,c.type||"default")!==!1&&j("target",1,this.targetEndpointDefinitions,c.type||"default")!==!1?(c.sourceEndpoint&&c.targetEndpoint&&(N(c.sourceEndpoint,c.targetEndpoint)||(c=null)),c):void 0}.bind(f),P=function(a){var b=f.Defaults.ConnectionType||f.getDefaultConnectionType();a._jsPlumb=f,a.newConnection=P,a.newEndpoint=R,a.endpointsByUUID=x,a.endpointsByElement=w,a.finaliseConnection=Q,a.id="con_"+I();var c=new b(a);return c.isDetachable()&&(c.endpoints[0].initDraggable("_jsPlumbSource"),c.endpoints[1].initDraggable("_jsPlumbTarget")),c},Q=f.finaliseConnection=function(a,b,c,d){if(b=b||{},a.suspendedEndpoint||v.push(a),a.pending=null,a.endpoints[0].isTemporarySource=!1,d!==!1&&f.anchorManager.newConnection(a),K(a.source),!b.doNotFireConnectionEvent&&b.fireEvent!==!1){var e={connection:a,source:a.source,target:a.target,sourceId:a.sourceId,targetId:a.targetId,sourceEndpoint:a.endpoints[0],targetEndpoint:a.endpoints[1]};f.fire("connection",e,c)}},R=function(a,b){var c=f.Defaults.EndpointType||r.Endpoint,d=r.extend({},a);d._jsPlumb=f,d.newConnection=P,d.newEndpoint=R,d.endpointsByUUID=x,d.endpointsByElement=w,d.fireDetachEvent=_,d.elementId=b||Y(d.source);var e=new c(d);return e.id="ep_"+I(),pb(d.elementId,d.source),r.headless||f.getDragManager().endpointAdded(d.source,b),e},S=function(a,b,c){var d=w[a];if(d&&d.length)for(var e=0,f=d.length;f>e;e++){for(var g=0,h=d[e].connections.length;h>g;g++){var i=b(d[e].connections[g]);if(i)return}c&&c(d[e])}},T=function(a,b){return r.each(a,function(a){f.isDragSupported(a)&&(B[f.getAttribute(a,"id")]=b,f.setElementDraggable(a,b))})},U=function(a,b,c){b="block"===b;var d=null;c&&(d=b?function(a){a.setVisible(!0,!0,!0)}:function(a){a.setVisible(!1,!0,!0)});var e=n(a);S(e.id,function(a){if(b&&c){var d=a.sourceId===e.id?1:0;a.endpoints[d].isVisible()&&a.setVisible(!0)}else a.setVisible(b)},d)},V=function(a){return r.each(a,function(a){var b=f.getAttribute(a,"id"),c=null==B[b]?!1:B[b];return c=!c,B[b]=c,f.setDraggable(a,c),c}.bind(this))},W=function(a,b){var c=null;b&&(c=function(a){var b=a.isVisible();a.setVisible(!b)}),S(a,function(a){var b=a.isVisible();a.setVisible(!b)},c)},X=function(a){var b=z[a];return b?{o:b,s:D[a]}:qb({elId:a})},Y=function(a,b,c){if(d.isString(a))return a;if(null==a)return null;var e=f.getAttribute(a,"id");return e&&"undefined"!==e||(2==arguments.length&&void 0!==arguments[1]?e=b:(1==arguments.length||3==arguments.length&&!arguments[2])&&(e="jsPlumb_"+h+"_"+I()),c||f.setAttribute(a,"id",e)),e};this.setConnectionBeingDragged=function(a){C=a},this.isConnectionBeingDragged=function(){return C},this.getManagedElements=function(){return y},this.getRenderMode=function(){return"svg"},this.connectorClass="jsplumb-connector",this.connectorOutlineClass="jsplumb-connector-outline",this.editableConnectorClass="jsplumb-connector-editable",this.connectedClass="jsplumb-connected",this.hoverClass="jsplumb-hover",this.endpointClass="jsplumb-endpoint",this.endpointConnectedClass="jsplumb-endpoint-connected",this.endpointFullClass="jsplumb-endpoint-full",this.endpointDropAllowedClass="jsplumb-endpoint-drop-allowed",this.endpointDropForbiddenClass="jsplumb-endpoint-drop-forbidden",this.overlayClass="jsplumb-overlay",this.draggingClass="jsplumb-dragging",this.elementDraggingClass="jsplumb-element-dragging",this.sourceElementDraggingClass="jsplumb-source-element-dragging",this.targetElementDraggingClass="jsplumb-target-element-dragging",this.endpointAnchorClassPrefix="jsplumb-endpoint-anchor",this.hoverSourceClass="jsplumb-source-hover",this.hoverTargetClass="jsplumb-target-hover",this.dragSelectClass="jsplumb-drag-select",this.Anchors={},this.Connectors={svg:{}},this.Endpoints={svg:{}},this.Overlays={svg:{}},this.ConnectorRenderers={},this.SVG="svg",this.addEndpoint=function(a,b,c){c=c||{};var e=r.extend({},c);r.extend(e,b),e.endpoint=e.endpoint||f.Defaults.Endpoint,e.paintStyle=e.paintStyle||f.Defaults.EndpointStyle;for(var g=[],h=d.isArray(a)||null!=a.length&&!d.isString(a)?a:[a],i=0,j=h.length;j>i;i++){e.source=f.getElement(h[i]),nb(e.source);var k=Y(e.source),l=R(e,k),m=pb(k,e.source).info.o;d.addToList(w,k,l),E||l.paint({anchorLoc:l.anchor.compute({xy:[m.left,m.top],wh:D[k],element:l,timestamp:F}),timestamp:F}),g.push(l),l._doNotDeleteOnDetach=!0}return 1==g.length?g[0]:g},this.addEndpoints=function(a,b,c){for(var e=[],g=0,h=b.length;h>g;g++){var i=f.addEndpoint(a,b[g],c);d.isArray(i)?Array.prototype.push.apply(e,i):e.push(i)}return e},this.animate=function(a,b,c){if(!this.animationSupported)return!1;c=c||{};var e=f.getElement(a),g=Y(e),h=r.animEvents.step,i=r.animEvents.complete;c[h]=d.wrap(c[h],function(){f.revalidate(g)}),c[i]=d.wrap(c[i],function(){f.revalidate(g)}),f.doAnimate(e,b,c)},this.checkCondition=function(a){var b=f.getListener(a),c=!0;if(b&&b.length>0){var e=Array.prototype.slice.call(arguments,1);try{for(var g=0,h=b.length;h>g;g++)c=c&&b[g].apply(b[g],e)}catch(i){d.log(f,"cannot check condition ["+a+"]"+i)}}return c},this.connect=function(a,b){var c,e=O(a,b);if(e){if(null==e.source&&null==e.sourceEndpoint)return d.log("Cannot establish connection - source does not exist"),void 0;if(null==e.target&&null==e.targetEndpoint)return d.log("Cannot establish connection - target does not exist"),void 0;nb(e.source),c=P(e),Q(c,e)}return c};var Z=[{el:"source",elId:"sourceId",epDefs:"sourceEndpointDefinitions"},{el:"target",elId:"targetId",epDefs:"targetEndpointDefinitions"}],$=function(a,b,c,d){var e,f,g,h=Z[c],i=a[h.elId],j=(a[h.el],a.endpoints[c]),k={index:c,originalSourceId:0===c?i:a.sourceId,newSourceId:a.sourceId,originalTargetId:1==c?i:a.targetId,newTargetId:a.targetId,connection:a};if(b.constructor==r.Endpoint)e=b,e.addConnection(a);else if(f=Y(b),g=this[h.epDefs][f],f===a[h.elId])e=null;else if(g)for(var l in g){if(!g[l].enabled)return;e=null!=g[l].endpoint&&g[l].endpoint._jsPlumb?g[l].endpoint:this.addEndpoint(b,g[l].def),g[l].uniqueEndpoint&&(g[l].endpoint=e),e._doNotDeleteOnDetach=!1,e._deleteOnDetach=!0,e.addConnection(a)}else e=a.makeEndpoint(0===c,b,f),e._doNotDeleteOnDetach=!1,e._deleteOnDetach=!0;return null!=e&&(j.detachFromConnection(a),a.endpoints[c]=e,a[h.el]=e.element,a[h.elId]=e.elementId,k[0===c?"newSourceId":"newTargetId"]=e.elementId,ab(k),d||a.repaint()),k}.bind(this);this.setSource=function(a,b,c){var d=$(a,b,0,c);this.anchorManager.sourceChanged(d.originalSourceId,d.newSourceId,a)},this.setTarget=function(a,b,c){var d=$(a,b,1,c);this.anchorManager.updateOtherEndpoint(d.originalSourceId,d.originalTargetId,d.newTargetId,a)},this.deleteEndpoint=function(a,b){var c="string"==typeof a?x[a]:a;return c&&f.deleteObject({endpoint:c,dontUpdateHover:b}),f},this.deleteEveryEndpoint=function(){var a=f.setSuspendDrawing(!0);for(var b in w){var c=w[b];if(c&&c.length)for(var d=0,e=c.length;e>d;d++)f.deleteEndpoint(c[d],!0)}return w={},y={},x={},z={},A={},f.anchorManager.reset(),f.getDragManager().reset(),a||f.setSuspendDrawing(!1),f};var _=function(a,b,c){var d=f.Defaults.ConnectionType||f.getDefaultConnectionType(),e=a.constructor==d,g=e?{connection:a,source:a.source,target:a.target,sourceId:a.sourceId,targetId:a.targetId,sourceEndpoint:a.endpoints[0],targetEndpoint:a.endpoints[1]}:a;b&&f.fire("connectionDetached",g,c),f.anchorManager.connectionDetached(g)},ab=f.fireMoveEvent=function(a,b){f.fire("connectionMoved",a,b)};this.unregisterEndpoint=function(a){a._jsPlumb.uuid&&(x[a._jsPlumb.uuid]=null),f.anchorManager.deleteEndpoint(a);for(var b in w){var c=w[b];if(c){for(var d=[],e=0,g=c.length;g>e;e++)c[e]!=a&&d.push(c[e]);w[b]=d}w[b].length<1&&delete w[b]}},this.detach=function(){if(0!==arguments.length){var a=f.Defaults.ConnectionType||f.getDefaultConnectionType(),b=arguments[0].constructor==a,c=2==arguments.length?b?arguments[1]||{}:arguments[0]:arguments[0],e=c.fireEvent!==!1,g=c.forceDetach,h=b?arguments[0]:c.connection;if(h)(g||d.functionChain(!0,!1,[[h.endpoints[0],"isDetachAllowed",[h]],[h.endpoints[1],"isDetachAllowed",[h]],[h,"isDetachAllowed",[h]],[f,"checkCondition",["beforeDetach",h]]]))&&h.endpoints[0].detach(h,!1,!0,e);else{var i=r.extend({},c);if(i.uuids)L(i.uuids[0]).detachFrom(L(i.uuids[1]),e);else if(i.sourceEndpoint&&i.targetEndpoint)i.sourceEndpoint.detachFrom(i.targetEndpoint);else{var j=Y(f.getElement(i.source)),k=Y(f.getElement(i.target));S(j,function(a){(a.sourceId==j&&a.targetId==k||a.targetId==j&&a.sourceId==k)&&f.checkCondition("beforeDetach",a)&&a.endpoints[0].detach(a,!1,!0,e)})}}}},this.detachAllConnections=function(a,b){b=b||{},a=f.getElement(a);var c=Y(a),d=w[c];if(d&&d.length)for(var e=0,g=d.length;g>e;e++)d[e].detachAll(b.fireEvent!==!1,b.forceDetach);return f},this.detachEveryConnection=function(a){return a=a||{},f.batch(function(){for(var b in w){var c=w[b];if(c&&c.length)for(var d=0,e=c.length;e>d;d++)c[d].detachAll(a.fireEvent!==!1,a.forceDetach)}v.length=0}),f},this.deleteObject=function(a){var b={endpoints:{},connections:{},endpointCount:0,connectionCount:0},c=(a.fireEvent!==!1,a.deleteAttachedObjects!==!1),e=function(d){if(null!=d&&null==b.connections[d.id]&&(a.dontUpdateHover||null==d._jsPlumb||d.setHover(!1),b.connections[d.id]=d,b.connectionCount++,c))for(var e=0;e<d.endpoints.length;e++)d.endpoints[e]._deleteOnDetach&&g(d.endpoints[e])},g=function(d){if(null!=d&&null==b.endpoints[d.id]&&(a.dontUpdateHover||null==d._jsPlumb||d.setHover(!1),b.endpoints[d.id]=d,b.endpointCount++,c))for(var f=0;f<d.connections.length;f++){var g=d.connections[f];e(g)}};a.connection?e(a.connection):g(a.endpoint);for(var h in b.connections){var i=b.connections[h];i._jsPlumb&&(d.removeWithFunction(v,function(a){return i.id==a.id}),_(i,a.fireEvent===!1?!1:!i.pending,a.originalEvent),i.endpoints[0].detachFromConnection(i),i.endpoints[1].detachFromConnection(i),i.cleanup(!0),i.destroy(!0))}for(var j in b.endpoints){var k=b.endpoints[j];k._jsPlumb&&(f.unregisterEndpoint(k),k.cleanup(!0),k.destroy(!0))}return b},this.draggable=function(a,b){var c;return k(function(a){c=n(a),c.el&&M(c.el,!0,b,c.id)},a),f},this.droppable=function(a,b){var c;return b=b||{},b.allowLoopback=!1,k(function(a){c=n(a),c.el&&f.initDroppable(c.el,b)},a),f};var bb=function(a,b,c,d){for(var e=0,f=a.length;f>e;e++)a[e][b].apply(a[e],c);return d(a)},cb=function(a,b,c){for(var d=[],e=0,f=a.length;f>e;e++)d.push([a[e][b].apply(a[e],c),a[e]]);return d},db=function(a,b,c){return function(){return bb(a,b,arguments,c)}},eb=function(a,b){return function(){return cb(a,b,arguments)}},fb=function(a,b){var c=[];if(a)if("string"==typeof a){if("*"===a)return a;c.push(a)}else if(b)c=a;else if(a.length)for(var d=0,e=a.length;e>d;d++)c.push(n(a[d]).id);else c.push(n(a).id);return c},gb=function(a,b,c){return"*"===a?!0:a.length>0?-1!=a.indexOf(b):!c};this.getConnections=function(a,b){a?a.constructor==String&&(a={scope:a}):a={};for(var c=a.scope||f.getDefaultScope(),d=fb(c,!0),e=fb(a.source),g=fb(a.target),h=!b&&d.length>1?{}:[],i=function(a,c){if(!b&&d.length>1){var e=h[a];null==e&&(e=h[a]=[]),e.push(c)}else h.push(c)},j=0,k=v.length;k>j;j++){var l=v[j];gb(d,l.scope)&&gb(e,l.sourceId)&&gb(g,l.targetId)&&i(l.scope,l)}return h};var hb=function(a,b){return function(c){for(var d=0,e=a.length;e>d;d++)c(a[d]);return b(a)}},ib=function(a){return function(b){return a[b]}},jb=function(a,b){var c,d,e={length:a.length,each:hb(a,b),get:ib(a)},f=["setHover","removeAllOverlays","setLabel","addClass","addOverlay","removeOverlay","removeOverlays","showOverlay","hideOverlay","showOverlays","hideOverlays","setPaintStyle","setHoverPaintStyle","setSuspendEvents","setParameter","setParameters","setVisible","repaint","addType","toggleType","removeType","removeClass","setType","bind","unbind"],g=["getLabel","getOverlay","isHover","getParameter","getParameters","getPaintStyle","getHoverPaintStyle","isVisible","hasType","getType","isSuspendEvents"];for(c=0,d=f.length;d>c;c++)e[f[c]]=db(a,f[c],b);for(c=0,d=g.length;d>c;c++)e[g[c]]=eb(a,g[c]);return e},kb=function(a){var b=jb(a,kb);return r.extend(b,{setDetachable:db(a,"setDetachable",kb),setReattach:db(a,"setReattach",kb),setConnector:db(a,"setConnector",kb),detach:function(){for(var b=0,c=a.length;c>b;b++)f.detach(a[b])},isDetachable:eb(a,"isDetachable"),isReattach:eb(a,"isReattach")})},lb=function(a){var b=jb(a,lb);return r.extend(b,{setEnabled:db(a,"setEnabled",lb),setAnchor:db(a,"setAnchor",lb),isEnabled:eb(a,"isEnabled"),detachAll:function(){for(var b=0,c=a.length;c>b;b++)a[b].detachAll()},remove:function(){for(var b=0,c=a.length;c>b;b++)f.deleteObject({endpoint:a[b]})}})};this.select=function(a){return a=a||{},a.scope=a.scope||"*",kb(a.connections||f.getConnections(a,!0))},this.selectEndpoints=function(a){a=a||{},a.scope=a.scope||"*";var b=!a.element&&!a.source&&!a.target,c=b?"*":fb(a.element),d=b?"*":fb(a.source),e=b?"*":fb(a.target),f=fb(a.scope,!0),g=[];for(var h in w){var i=gb(c,h,!0),j=gb(d,h,!0),k="*"!=d,l=gb(e,h,!0),m="*"!=e;if(i||j||l)a:for(var n=0,o=w[h].length;o>n;n++){var p=w[h][n];if(gb(f,p.scope,!0)){var q=k&&d.length>0&&!p.isSource,r=m&&e.length>0&&!p.isTarget;if(q||r)continue a;g.push(p)}}}return lb(g)},this.getAllConnections=function(){return v},this.getDefaultScope=function(){return G},this.getEndpoint=L,this.getEndpoints=function(a){return w[n(a).id]},this.getDefaultEndpointType=function(){return r.Endpoint},this.getDefaultConnectionType=function(){return r.Connection},this.getId=Y,this.appendElement=J;var mb=!1;this.isHoverSuspended=function(){return mb},this.setHoverSuspended=function(a){mb=a},this.hide=function(a,b){return U(a,"none",b),f},this.idstamp=I,this.connectorsInitialized=!1,this.registerConnectorType=function(a,b){c.push([a,b])};var nb=function(a){if(!q&&a){var b=f.getElement(a);b.offsetParent&&f.setContainer(b.offsetParent)}},ob=function(){f.Defaults.Container&&f.setContainer(f.Defaults.Container)},pb=f.manage=function(a,b,c){return y[a]||(y[a]={el:b,endpoints:[],connections:[]},y[a].info=qb({elId:a,timestamp:F}),c||f.fire("manageElement",{id:a,info:y[a].info,el:b})),y[a]},qb=this.updateOffset=function(a){var b,c=a.timestamp,d=a.recalc,e=a.offset,g=a.elId;return E&&!c&&(c=F),!d&&c&&c===A[g]?{o:a.offset||z[g],s:D[g]}:(d||!e&&null==z[g]?(b=y[g]?y[g].el:null,null!=b&&(D[g]=f.getSize(b),z[g]=f.getOffset(b),A[g]=c)):(z[g]=e||z[g],null==D[g]&&(b=y[g].el,null!=b&&(D[g]=f.getSize(b))),A[g]=c),z[g]&&!z[g].right&&(z[g].right=z[g].left+D[g][0],z[g].bottom=z[g].top+D[g][1],z[g].width=D[g][0],z[g].height=D[g][1],z[g].centerx=z[g].left+z[g].width/2,z[g].centery=z[g].top+z[g].height/2),{o:z[g],s:D[g]})};this.init=function(){a=r.getRenderModes();var b=function(a,b,c){r.Connectors[a][b]=function(){c.apply(this,arguments),r.ConnectorRenderers[a].apply(this,arguments)},d.extend(r.Connectors[a][b],[c,r.ConnectorRenderers[a]])};if(!r.connectorsInitialized){for(var e=0;e<c.length;e++)for(var g=0;g<a.length;g++)b(a[g],c[e][1],c[e][0]);r.connectorsInitialized=!0}u||(ob(),f.anchorManager=new r.AnchorManager({jsPlumbInstance:f}),u=!0,f.fire("ready",f))}.bind(this),this.log=t,this.jsPlumbUIComponent=m,this.makeAnchor=function(){var a,b=function(a,b){if(r.Anchors[a])return new r.Anchors[a](b);if(!f.Defaults.DoNotThrowErrors)throw{msg:"jsPlumb: unknown anchor type '"+a+"'"}};if(0===arguments.length)return null;var c=arguments[0],e=arguments[1],g=(arguments[2],null);if(c.compute&&c.getOrientation)return c;if("string"==typeof c)g=b(arguments[0],{elementId:e,jsPlumbInstance:f});else if(d.isArray(c))if(d.isArray(c[0])||d.isString(c[0]))2==c.length&&d.isObject(c[1])?d.isString(c[0])?(a=r.extend({elementId:e,jsPlumbInstance:f},c[1]),g=b(c[0],a)):(a=r.extend({elementId:e,jsPlumbInstance:f,anchors:c[0]},c[1]),g=new r.DynamicAnchor(a)):g=new r.DynamicAnchor({anchors:c,selector:null,elementId:e,jsPlumbInstance:f});else{var h={x:c[0],y:c[1],orientation:c.length>=4?[c[2],c[3]]:[0,0],offsets:c.length>=6?[c[4],c[5]]:[0,0],elementId:e,jsPlumbInstance:f,cssClass:7==c.length?c[6]:null};g=new r.Anchor(h),g.clone=function(){return new r.Anchor(h)}}return g.id||(g.id="anchor_"+I()),g},this.makeAnchors=function(a,b,c){for(var e=[],g=0,h=a.length;h>g;g++)"string"==typeof a[g]?e.push(r.Anchors[a[g]]({elementId:b,jsPlumbInstance:c})):d.isArray(a[g])&&e.push(f.makeAnchor(a[g],b,c));return e},this.makeDynamicAnchor=function(a,b){return new r.DynamicAnchor({anchors:a,selector:b,elementId:null,jsPlumbInstance:f})},this.targetEndpointDefinitions={};var rb=function(){};this.sourceEndpointDefinitions={};var sb=function(a,b,c,d,e){for(var f=a.target||a.srcElement,g=!1,h=d.getSelector(b,c),i=0;i<h.length;i++)if(h[i]==f){g=!0;break}return e?!g:g},tb=function(a,b,c,e,g){var h=new m(b),i=b._jsPlumb.EndpointDropHandler({jsPlumb:f,enabled:function(){return a.def.enabled},isFull:function(){var b=f.select({target:a.id}).length;return a.def.maxConnections>0&&b>=a.def.maxConnections},element:a.el,elementId:a.id,isSource:e,isTarget:g,addClass:function(b){f.addClass(a.el,b) +},removeClass:function(b){f.removeClass(a.el,b)},onDrop:function(a){var b=a.endpoints[0];b.anchor.locked=!1},isDropAllowed:function(){return h.isDropAllowed.apply(h,arguments)},isRedrop:function(b){return null!=b.suspendedElement&&null!=b.suspendedEndpoint&&b.suspendedEndpoint.element===a.el},getEndpoint:function(c){var d=a.def.endpoint;if(null==d||null==d._jsPlumb){var e=f.deriveEndpointAndAnchorSpec(c.getType().join(" "),!0),g=e.endpoints?r.extend(b,{endpoint:a.def.def.endpoint||e.endpoints[1]}):b;e.anchors&&(g=r.extend(g,{anchor:a.def.def.anchor||e.anchors[1]})),d=f.addEndpoint(a.el,g),d._mtNew=!0}if(b.uniqueEndpoint&&(a.def.endpoint=d),d._doNotDeleteOnDetach=!1,d._deleteOnDetach=!0,c.isDetachable()&&d.initDraggable(),null!=d.anchor.positionFinder){var h=f.getUIPosition(arguments,f.getZoom()),i=f.getOffset(a.el),j=f.getSize(a.el),k=d.anchor.positionFinder(h,i,j,d.anchor.constructorParams);d.anchor.x=k[0],d.anchor.y=k[1]}return d},maybeCleanup:function(a){a._mtNew&&0===a.connections.length?f.deleteObject({endpoint:a}):delete a._mtNew}}),j=r.dragEvents.drop;return c.scope=c.scope||b.scope||f.Defaults.Scope,c[j]=d.wrap(c[j],i,!0),g&&(c[r.dragEvents.over]=function(){return!0}),b.allowLoopback===!1&&(c.canDrop=function(b){var c=b.getDragElement()._jsPlumbRelatedElement;return c!=a.el}),f.initDroppable(a.el,c,"internal"),i};this.makeTarget=function(a,b,c){var d=r.extend({_jsPlumb:this},c);r.extend(d,b),rb(d,1,this);for(var e=(!(d.deleteEndpointsOnDetach===!1),d.maxConnections||-1),f=function(a){var b=n(a),c=b.id,f=r.extend({},d.dropOptions||{}),g="default";this.targetEndpointDefinitions[c]=this.targetEndpointDefinitions[c]||{},nb(c);var h={def:r.extend({},d),uniqueEndpoint:d.uniqueEndpoint,maxConnections:e,enabled:!0};b.def=h,this.targetEndpointDefinitions[c][g]=h,tb(b,d,f,d.isSource===!0,!0),b.el._katavorioDrop[b.el._katavorioDrop.length-1].targetDef=h}.bind(this),g=a.length&&a.constructor!=String?a:[a],h=0,i=g.length;i>h;h++)f(g[h]);return this},this.unmakeTarget=function(a,b){var c=n(a);return r.destroyDroppable(c.el),b||delete this.targetEndpointDefinitions[c.id],this},this.makeSource=function(a,b,c){var e=r.extend({_jsPlumb:this},c);r.extend(e,b);var g=e.connectionType||"default",h=f.deriveEndpointAndAnchorSpec(g);e.endpoint=e.endpoint||h.endpoints[0],e.anchor=e.anchor||h.anchors[0],rb(e,0,this);for(var i=e.maxConnections||-1,j=e.onMaxConnections,k=function(a){var b=a.id,c=this.getElement(a.el);this.sourceEndpointDefinitions[b]=this.sourceEndpointDefinitions[b]||{},nb(b);var h={def:r.extend({},e),uniqueEndpoint:e.uniqueEndpoint,maxConnections:i,enabled:!0};this.sourceEndpointDefinitions[b][g]=h,a.def=h;var k=r.dragEvents.stop,m=r.dragEvents.drag,n=r.extend({},e.dragOptions||{}),o=n.drag,p=n.stop,q=null,s=!1;n.scope=n.scope||e.scope,n[m]=d.wrap(n[m],function(){o&&o.apply(this,arguments),s=!1}),n[k]=d.wrap(n[k],function(){if(p&&p.apply(this,arguments),this.currentlyDragging=!1,null!=q._jsPlumb){var a=e.anchor||this.Defaults.Anchor,c=q.anchor,d=q.connections[0],g=this.makeAnchor(a,b,this),h=q.element;if(null!=g.positionFinder){var i=f.getOffset(h),j=this.getSize(h),k={left:i.left+c.x*j[0],top:i.top+c.y*j[1]},l=g.positionFinder(k,i,j,g.constructorParams);g.x=l[0],g.y=l[1]}q.setAnchor(g,!0),q.repaint(),this.repaint(q.elementId),null!=d&&this.repaint(d.targetId)}}.bind(this));var t=function(h){if(3!==h.which&&2!==h.button){var k=this.sourceEndpointDefinitions[b][g];if(k.enabled){if(b=this.getId(this.getElement(a.el)),e.filter){var m=d.isString(e.filter)?sb(h,a.el,e.filter,this,e.filterExclude):e.filter(h,a.el);if(m===!1)return}var o=this.select({source:b}).length;if(k.maxConnections>=0&&o>=k.maxConnections)return j&&j({element:a.el,maxConnections:i},h),!1;var p=r.getPositionOnElement(h,c,l),t={};r.extend(t,e),t.isTemporarySource=!0,t.anchor=[p[0],p[1],0,0],t.dragOptions=n,k.def.scope&&(t.scope=k.def.scope),q=this.addEndpoint(b,t),s=!0,q._doNotDeleteOnDetach=!1,q._deleteOnDetach=!0,k.uniqueEndpoint&&(k.endpoint?q.finalEndpoint=k.endpoint:(k.endpoint=q,q._deleteOnDetach=!1,q._doNotDeleteOnDetach=!0));var u=function(){f.off(q.canvas,"mouseup",u),f.off(a.el,"mouseup",u),s&&(s=!1,f.deleteEndpoint(q))};f.on(q.canvas,"mouseup",u),f.on(a.el,"mouseup",u);var v={};if(k.def.extract)for(var w in k.def.extract){var x=h.srcElement.getAttribute(w);x&&(v[k.def.extract[w]]=x)}f.trigger(q.canvas,"mousedown",h,v),d.consume(h)}}}.bind(this);this.on(a.el,"mousedown",t),h.trigger=t,e.filter&&(d.isString(e.filter)||d.isFunction(e.filter))&&f.setDragFilter(a.el,e.filter);var u=r.extend({},e.dropOptions||{});tb(a,e,u,!0,e.isTarget===!0)}.bind(this),m=a.length&&a.constructor!=String?a:[a],o=0,p=m.length;p>o;o++)k(n(m[o]));return this},this.unmakeSource=function(a,b,c){var d=n(a),e=this.sourceEndpointDefinitions[d.id];if(e)for(var g in e)if(null==b||b===g){var h=e[g].trigger;h&&f.off(d.el,"mousedown",h),c||delete this.sourceEndpointDefinitions[d.id][g]}return this},this.unmakeEverySource=function(){for(var a in this.sourceEndpointDefinitions)f.unmakeSource(a,null,!0);return this.sourceEndpointDefinitions={},this};var ub=function(a,b,c){b=d.isArray(b)?b:[b];var e=Y(a);c=c||"default";for(var f=0;f<b.length;f++){var g=this[b[f]][e];if(g&&g[c])return g[c].def.scope||this.Defaults.Scope}}.bind(this),vb=function(a,b,c,e){c=d.isArray(c)?c:[c];var f=Y(a);e=e||"default";for(var g=0;g<c.length;g++){var h=this[c[g]][f];h&&h[e]&&(h[e].def.scope=b)}}.bind(this);this.getScope=function(a){return ub(a,["sourceEndpointDefinitions","targetEndpointDefinitions"])},this.getSourceScope=function(a){return ub(a,"sourceEndpointDefinitions")},this.getTargetScope=function(a){return ub(a,"targetEndpointDefinitions")},this.setScope=function(a,b,c){this.setSourceScope(a,b,c),this.setTargetScope(a,b,c)},this.setSourceScope=function(a,b,c){vb(a,b,"sourceEndpointDefinitions",c),this.setDragScope(a,b)},this.setTargetScope=function(a,b,c){vb(a,b,"targetEndpointDefinitions",c),this.setDropScope(a,b)},this.unmakeEveryTarget=function(){for(var a in this.targetEndpointDefinitions)f.unmakeTarget(a,!0);return this.targetEndpointDefinitions={},this};var wb=function(a,b,c,e,f){var g="source"==a?this.sourceEndpointDefinitions:this.targetEndpointDefinitions;if(f=f||"default",d.isString(b)&&g[b]&&g[b][f])g[b][f].enabled=e?!g[b][f].enabled:c;else if(b.length)for(var h=0,i=b.length;i>h;h++){var j=n(b[h]);g[j.id]&&g[j.id][f]&&(g[j.id][f].enabled=e?!g[j.id][f].enabled:c)}else{var k=n(b).id;g[k]&&g[k][f]&&(g[k][f].enabled=e?!g[k][f].enabled:c)}return this}.bind(this),xb=function(a,b){return d.isString(a)||!a.length?b.apply(this,[a]):a.length?b.apply(this,[a[0]]):void 0}.bind(this);this.toggleSourceEnabled=function(a,b){return wb("source",a,null,!0,b),this.isSourceEnabled(a,b)},this.setSourceEnabled=function(a,b,c){return wb("source",a,b,null,c)},this.isSource=function(a,b){return b=b||"default",xb(a,function(a){var c=this.sourceEndpointDefinitions[n(a).id];return null!=c&&null!=c[b]}.bind(this))},this.isSourceEnabled=function(a,b){return b=b||"default",xb(a,function(a){var c=this.sourceEndpointDefinitions[n(a).id];return c&&c[b]&&c[b].enabled===!0}.bind(this))},this.toggleTargetEnabled=function(a,b){return wb("target",a,null,!0,b),this.isTargetEnabled(a,b)},this.isTarget=function(a,b){return b=b||"default",xb(a,function(a){var c=this.targetEndpointDefinitions[n(a).id];return null!=c&&null!=c[b]}.bind(this))},this.isTargetEnabled=function(a,b){return b=b||"default",xb(a,function(a){var c=this.targetEndpointDefinitions[n(a).id];return c&&c[b]&&c[b].enabled===!0}.bind(this))},this.setTargetEnabled=function(a,b,c){return wb("target",a,b,null,c)},this.ready=function(a){f.bind("ready",a)};var yb=function(a,b){if("object"==typeof a&&a.length)for(var c=0,d=a.length;d>c;c++)b(a[c]);else b(a);return f};this.repaint=function(a,b,c){return yb(a,function(a){K(a,b,c)})},this.revalidate=function(a,b,c){return yb(a,function(a){var d=c?a:f.getId(a);f.updateOffset({elId:d,recalc:!0,timestamp:b}),f.repaint(a)})},this.repaintEverything=function(){var a,b=e();for(a in w)f.updateOffset({elId:a,recalc:!0,timestamp:b});for(a in w)K(a,null,b);return this},this.removeAllEndpoints=function(a,b,c){c=c||[];var d=function(a){var e,g,h=n(a),i=w[h.id];if(i)for(c.push(h),e=0,g=i.length;g>e;e++)f.deleteEndpoint(i[e],!1);if(delete w[h.id],b&&h.el&&3!=h.el.nodeType&&8!=h.el.nodeType)for(e=0,g=h.el.childNodes.length;g>e;e++)d(h.el.childNodes[e])};return d(a),this};var zb=function(a,b){f.removeAllEndpoints(a.id,!0,b);for(var c=function(a){f.getDragManager().elementRemoved(a.id),f.anchorManager.clearFor(a.id),f.anchorManager.removeFloatingConnection(a.id),delete f.floatingConnections[a.id],delete y[a.id],delete z[a.id],a.el&&(f.removeElement(a.el),a.el._jsPlumb=null)},d=1;d<b.length;d++)c(b[d]);c(a)};this.remove=function(a,b){var c=n(a),d=[];return c.text?c.el.parentNode.removeChild(c.el):c.id&&f.batch(function(){zb(c,d)},b===!1),f},this.empty=function(a,b){var c=[],d=function(a,b){var e=n(a);if(e.text)e.el.parentNode.removeChild(e.el);else if(e.el){for(;e.el.childNodes.length>0;)d(e.el.childNodes[0]);b||zb(e,c)}};return f.batch(function(){d(a,!0)},b===!1),f},this.reset=function(){f.silently(function(){f.deleteEveryEndpoint(),f.unbind(),this.targetEndpointDefinitions={},this.sourceEndpointDefinitions={},v.length=0,this.doReset&&this.doReset()}.bind(this))};var Ab=function(a){a.canvas&&a.canvas.parentNode&&a.canvas.parentNode.removeChild(a.canvas),a.cleanup(),a.destroy()};this.clear=function(){f.select().each(Ab),f.selectEndpoints().each(Ab),w={},x={}},this.setDefaultScope=function(a){return G=a,f},this.setDraggable=T,this.deriveEndpointAndAnchorSpec=function(a,b){for(var c=((b?"":"default ")+a).split(/[\s]/),d=null,e=null,g=null,h=null,i=0;i<c.length;i++){var j=f.getType(c[i],"connection");j&&(j.endpoints&&(d=j.endpoints),j.endpoint&&(e=j.endpoint),j.anchors&&(h=j.anchors),j.anchor&&(g=j.anchor))}return{endpoints:d?d:[e,e],anchors:h?h:[g,g]}},this.setId=function(a,b,c){var e;d.isString(a)?e=a:(a=this.getElement(a),e=this.getId(a));var f=this.getConnections({source:e,scope:"*"},!0),g=this.getConnections({target:e,scope:"*"},!0);b=""+b,c?a=this.getElement(b):(a=this.getElement(e),this.setAttribute(a,"id",b)),w[b]=w[e]||[];for(var h=0,i=w[b].length;i>h;h++)w[b][h].setElementId(b),w[b][h].setReferenceElement(a);delete w[e],this.sourceEndpointDefinitions[b]=this.sourceEndpointDefinitions[e],delete this.sourceEndpointDefinitions[e],this.targetEndpointDefinitions[b]=this.targetEndpointDefinitions[e],delete this.targetEndpointDefinitions[e],this.anchorManager.changeId(e,b),this.getDragManager().changeId(e,b),y[b]=y[e],delete y[e];var j=function(c,d,e){for(var f=0,g=c.length;g>f;f++)c[f].endpoints[d].setElementId(b),c[f].endpoints[d].setReferenceElement(a),c[f][e+"Id"]=b,c[f][e]=a};j(f,0,"source"),j(g,1,"target"),this.repaint(b)},this.setDebugLog=function(a){t=a},this.setSuspendDrawing=function(a,b){var c=E;return E=a,F=a?(new Date).getTime():null,b&&this.repaintEverything(),c},this.isSuspendDrawing=function(){return E},this.getSuspendedAt=function(){return F},this.batch=function(a,b){var c=this.isSuspendDrawing();c||this.setSuspendDrawing(!0);try{a()}catch(e){d.log("Function run while suspended failed",e)}c||this.setSuspendDrawing(!1,!b)},this.doWhileSuspended=this.batch,this.getCachedData=X,this.timestamp=e,this.show=function(a,b){return U(a,"block",b),f},this.toggleVisible=W,this.toggleDraggable=V,this.addListener=this.bind};d.extend(q,d.EventGenerator,{setAttribute:function(a,b,c){this.setAttribute(a,b,c)},getAttribute:function(a,b){return this.getAttribute(r.getElement(a),b)},convertToFullOverlaySpec:function(a){return d.isString(a)&&(a=[a,{}]),a[1].id=a[1].id||d.uuid(),a},registerConnectionType:function(a,b){if(this._connectionTypes[a]=r.extend({},b),b.overlays){for(var c={},d=0;d<b.overlays.length;d++){var e=this.convertToFullOverlaySpec(b.overlays[d]);c[e[1].id]=e}this._connectionTypes[a].overlays=c}},registerConnectionTypes:function(a){for(var b in a)this.registerConnectionType(b,a[b])},registerEndpointType:function(a,b){if(this._endpointTypes[a]=r.extend({},b),b.overlays){for(var c={},d=0;d<b.overlays.length;d++){var e=this.convertToFullOverlaySpec(b.overlays[d]);c[e[1].id]=e}this._endpointTypes[a].overlays=c}},registerEndpointTypes:function(a){for(var b in a)this.registerEndpointType(b,a[b])},getType:function(a,b){return"connection"===b?this._connectionTypes[a]:this._endpointTypes[a]},setIdChanged:function(a,b){this.setId(a,b,!0)},setParent:function(a,b){var c=this.getElement(a),d=this.getId(c),e=this.getElement(b),f=this.getId(e);c.parentNode.removeChild(c),e.appendChild(c),this.getDragManager().setParent(c,d,e,f)},extend:function(a,b,c){var d;if(c)for(d=0;d<c.length;d++)a[c[d]]=b[c[d]];else for(d in b)a[d]=b[d];return a},floatingConnections:{},getFloatingAnchorIndex:function(a){return a.endpoints[0].isFloating()?0:a.endpoints[1].isFloating()?1:-1}});var r=new q;b.jsPlumb=r,r.getInstance=function(a){var b=new q(a);return b.init(),b},r.each=function(a,b){if(null!=a)if("string"==typeof a)b(r.getElement(a));else if(null!=a.length)for(var c=0;c<a.length;c++)b(r.getElement(a[c]));else b(a)},"function"==typeof define&&(define("jsplumb",[],function(){return r}),define("jsplumbinstance",[],function(){return r.getInstance()})),"undefined"!=typeof exports&&(exports.jsPlumb=r)}.call(this),function(){var a=this;a.jsPlumbUtil;var b=(!!window.SVGAngle||document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1"),function(a,b){if(null==a)return[0,0];var c=g(a),d=f(c,0);return[d[b+"X"],d[b+"Y"]]}),c=function(a){return null==a?[0,0]:b(a,"page")},d=function(a){return b(a,"screen")},e=function(a){return b(a,"client")},f=function(a,b){return a.item?a.item(b):a[b]},g=function(a){return a.touches&&a.touches.length>0?a.touches:a.changedTouches&&a.changedTouches.length>0?a.changedTouches:a.targetTouches&&a.targetTouches.length>0?a.targetTouches:[a]},h=function(a){var b={},c=[],d={},e={},f={};this.register=function(g){var h=a.getId(g),i=a.getOffset(g);b[h]||(b[h]=g,c.push(g),d[h]={});var j=function(b){if(b)for(var c=0;c<b.childNodes.length;c++)if(3!=b.childNodes[c].nodeType&&8!=b.childNodes[c].nodeType){var g=jsPlumb.getElement(b.childNodes[c]),k=a.getId(b.childNodes[c],null,!0);if(k&&e[k]&&e[k]>0){var l=a.getOffset(g);d[h][k]={id:k,offset:{left:l.left-i.left,top:l.top-i.top}},f[k]=h}j(b.childNodes[c])}};j(g)},this.updateOffsets=function(b){if(null!=b){var c=jsPlumb.getElement(b),e=a.getId(c),g=d[e],h=a.getOffset(c);if(g)for(var i in g)if(g.hasOwnProperty(i)){var j=jsPlumb.getElement(i),k=a.getOffset(j);d[e][i]={id:i,offset:{left:k.left-h.left,top:k.top-h.top}},f[i]=e}}},this.endpointAdded=function(c,g){g=g||a.getId(c);var h=document.body,i=c.parentNode;for(e[g]=e[g]?e[g]+1:1;null!=i&&i!=h;){var j=a.getId(i,null,!0);if(j&&b[j]){var k=a.getOffset(i);if(null==d[j][g]){var l=a.getOffset(c);d[j][g]={id:g,offset:{left:l.left-k.left,top:l.top-k.top}},f[g]=j}break}i=i.parentNode}},this.endpointDeleted=function(a){if(e[a.elementId]&&(e[a.elementId]--,e[a.elementId]<=0))for(var b in d)d.hasOwnProperty(b)&&d[b]&&(delete d[b][a.elementId],delete f[a.elementId])},this.changeId=function(a,b){d[b]=d[a],d[a]={},f[b]=f[a],f[a]=null},this.getElementsForDraggable=function(a){return d[a]},this.elementRemoved=function(a){var b=f[a];b&&(delete d[b][a],delete f[a])},this.reset=function(){b={},c=[],d={},e={}},this.dragEnded=function(b){var c=a.getId(b),d=f[c];d&&this.updateOffsets(d)},this.setParent=function(b,c,e,g){var h=f[c];if(h){d[g]||(d[g]={}),d[g][c]=d[h][c],delete d[h][c];var i=a.getOffset(e),j=a.getOffset(b);d[g][c].offset={left:j.left-i.left,top:j.top-i.top},f[c]=g}},this.getDragAncestor=function(b){var c=jsPlumb.getElement(b),d=a.getId(c),e=f[d];return e?jsPlumb.getElement(e):null}},i=function(a){return null==a?null:a.replace(/^\s\s*/,"").replace(/\s\s*$/,"")},j=function(a,b){b=i(b),"undefined"!=typeof a.className.baseVal?a.className.baseVal=b:a.className=b},k=function(a){return"undefined"==typeof a.className.baseVal?a.className:a.className.baseVal},l=function(a,b,c){b=null==b?[]:jsPlumbUtil.isArray(b)?b:b.split(/\s+/),c=null==c?[]:jsPlumbUtil.isArray(c)?c:c.split(/\s+/);var d=k(a),e=d.split(/\s+/),f=function(a,b){for(var c=0;c<b.length;c++)if(a)-1==e.indexOf(b[c])&&e.push(b[c]);else{var d=e.indexOf(b[c]);-1!=d&&e.splice(d,1)}};f(!0,b),f(!1,c),j(a,e.join(" "))};jsPlumb.extend(jsPlumbInstance.prototype,{headless:!1,pageLocation:c,screenLocation:d,clientLocation:e,getDragManager:function(){return null==this.dragManager&&(this.dragManager=new h(this)),this.dragManager},recalculateOffsets:function(a){this.getDragManager().updateOffsets(a)},createElement:function(a,b,c,d){return this.createElementNS(null,a,b,c,d)},createElementNS:function(a,b,c,d,e){var f,g=null==a?document.createElement(b):document.createElementNS(a,b);c=c||{};for(f in c)g.style[f]=c[f];d&&(g.className=d),e=e||{};for(f in e)g.setAttribute(f,""+e[f]);return g},getAttribute:function(a,b){return null!=a.getAttribute?a.getAttribute(b):null},setAttribute:function(a,b,c){null!=a.setAttribute&&a.setAttribute(b,c)},setAttributes:function(a,b){for(var c in b)b.hasOwnProperty(c)&&a.setAttribute(c,b[c])},appendToRoot:function(a){document.body.appendChild(a)},getRenderModes:function(){return["svg"]},getClass:k,addClass:function(a,b){jsPlumb.each(a,function(a){l(a,b)})},hasClass:function(a,b){return a=jsPlumb.getElement(a),a.classList?a.classList.contains(b):-1!=k(a).indexOf(b)},removeClass:function(a,b){jsPlumb.each(a,function(a){l(a,null,b)})},updateClasses:function(a,b,c){jsPlumb.each(a,function(a){l(a,b,c)})},setClass:function(a,b){jsPlumb.each(a,function(a){j(a,b)})},setPosition:function(a,b){a.style.left=b.left+"px",a.style.top=b.top+"px"},getPosition:function(a){var b=function(b){var c=a.style[b];return c?c.substring(0,c.length-2):0};return{left:b("left"),top:b("top")}},getStyle:function(a,b){return"undefined"!=typeof window.getComputedStyle?getComputedStyle(a,null).getPropertyValue(b):a.currentStyle[b]},getSelector:function(a,b){var c=null;return c=1==arguments.length?null!=a.nodeType?a:document.querySelectorAll(a):a.querySelectorAll(b)},getOffset:function(a,b,c){a=jsPlumb.getElement(a),c=c||this.getContainer();for(var d={left:a.offsetLeft,top:a.offsetTop},e=b||null!=c&&a!=c&&a.offsetParent!=c?a.offsetParent:null,f=function(a){null!=a&&a!==document.body&&(a.scrollTop>0||a.scrollLeft>0)&&(d.left-=a.scrollLeft,d.top-=a.scrollTop)}.bind(this);null!=e;)d.left+=e.offsetLeft,d.top+=e.offsetTop,f(e),e=b?e.offsetParent:e.offsetParent==c?null:e.offsetParent;if(null!=c&&!b&&(c.scrollTop>0||c.scrollLeft>0)){var g=null!=a.offsetParent?this.getStyle(a.offsetParent,"position"):"static",h=this.getStyle(a,"position");"absolute"!==h&&"fixed"!==h&&"absolute"!==g&&"fixed"!=g&&(d.left-=c.scrollLeft,d.top-=c.scrollTop)}return d},getPositionOnElement:function(a,b,c){var d="undefined"!=typeof b.getBoundingClientRect?b.getBoundingClientRect():{left:0,top:0,width:0,height:0},e=document.body,f=document.documentElement,g=window.pageYOffset||f.scrollTop||e.scrollTop,h=window.pageXOffset||f.scrollLeft||e.scrollLeft,i=f.clientTop||e.clientTop||0,j=f.clientLeft||e.clientLeft||0,k=0,l=0,m=d.top+g-i+k*c,n=d.left+h-j+l*c,o=jsPlumb.pageLocation(a),p=d.width||b.offsetWidth*c,q=d.height||b.offsetHeight*c,r=(o[0]-n)/p,s=(o[1]-m)/q;return[r,s]},getAbsolutePosition:function(a){var b=function(b){var c=a.style[b];return c?parseFloat(c.substring(0,c.length-2)):void 0};return[b("left"),b("top")]},setAbsolutePosition:function(a,b,c,d){c?this.animate(a,{left:"+="+(b[0]-c[0]),top:"+="+(b[1]-c[1])},d):(a.style.left=b[0]+"px",a.style.top=b[1]+"px")},getSize:function(a){return[a.offsetWidth,a.offsetHeight]},getWidth:function(a){return a.offsetWidth},getHeight:function(a){return a.offsetHeight}})}.call(this),function(){"use strict";var a=this,b=a.jsPlumb,c=a.jsPlumbUtil,d="__label",e=function(a,c){var e={cssClass:c.cssClass,labelStyle:a.labelStyle,id:d,component:a,_jsPlumb:a._jsPlumb.instance},f=jsPlumb.extend(e,c);return new(b.Overlays[a._jsPlumb.instance.getRenderMode()].Label)(f)},f=function(a,d){var e=null;if(c.isArray(d)){var f=d[0],g=b.extend({component:a,_jsPlumb:a._jsPlumb.instance},d[1]);3==d.length&&b.extend(g,d[2]),e=new(b.Overlays[a._jsPlumb.instance.getRenderMode()][f])(g)}else e=d.constructor==String?new(b.Overlays[a._jsPlumb.instance.getRenderMode()][d])({component:a,_jsPlumb:a._jsPlumb.instance}):d;return e.id=e.id||c.uuid(),a.cacheTypeItem("overlay",e,e.id),a._jsPlumb.overlays[e.id]=e,e};b.OverlayCapableJsPlumbUIComponent=function(a){jsPlumbUIComponent.apply(this,arguments),this._jsPlumb.overlays={},this._jsPlumb.overlayPositions={},a.label&&(this.getDefaultType().overlays[d]=["Label",{label:a.label,location:a.labelLocation||this.defaultLabelLocation||.5,labelStyle:a.labelStyle||this._jsPlumb.instance.Defaults.LabelStyle,id:d}]),this.setListenerComponent=function(a){if(this._jsPlumb)for(var b in this._jsPlumb.overlays)this._jsPlumb.overlays[b].setListenerComponent(a)}},b.OverlayCapableJsPlumbUIComponent.applyType=function(a,b){if(b.overlays){var c,d={};for(c in b.overlays){var e=a._jsPlumb.overlays[b.overlays[c][1].id];if(e)e.updateFrom(b.overlays[c][1]),d[b.overlays[c][1].id]=!0;else{var f=a.getCachedTypeItem("overlay",b.overlays[c][1].id);null!=f?(f.reattach(a._jsPlumb.instance),f.updateFrom(b.overlays[c][1]),a._jsPlumb.overlays[f.id]=f):f=a.addOverlay(b.overlays[c],!0),d[f.id]=!0}}for(c in a._jsPlumb.overlays)null==d[a._jsPlumb.overlays[c].id]&&a.removeOverlay(a._jsPlumb.overlays[c].id,!0)}},c.extend(b.OverlayCapableJsPlumbUIComponent,a.jsPlumbUIComponent,{setHover:function(a){if(this._jsPlumb&&!this._jsPlumb.instance.isConnectionBeingDragged())for(var b in this._jsPlumb.overlays)this._jsPlumb.overlays[b][a?"addClass":"removeClass"](this._jsPlumb.instance.hoverClass)},addOverlay:function(a,b){var c=f(this,a);return b||this.repaint(),c},getOverlay:function(a){return this._jsPlumb.overlays[a]},getOverlays:function(){return this._jsPlumb.overlays},hideOverlay:function(a){var b=this.getOverlay(a);b&&b.hide()},hideOverlays:function(){for(var a in this._jsPlumb.overlays)this._jsPlumb.overlays[a].hide()},showOverlay:function(a){var b=this.getOverlay(a);b&&b.show()},showOverlays:function(){for(var a in this._jsPlumb.overlays)this._jsPlumb.overlays[a].show()},removeAllOverlays:function(a){for(var b in this._jsPlumb.overlays)this._jsPlumb.overlays[b].cleanup&&this._jsPlumb.overlays[b].cleanup();this._jsPlumb.overlays={},this._jsPlumb.overlayPositions=null,a||this.repaint()},removeOverlay:function(a,b){var c=this._jsPlumb.overlays[a];c&&(!b&&c.cleanup&&c.cleanup(),delete this._jsPlumb.overlays[a],this._jsPlumb.overlayPositions&&delete this._jsPlumb.overlayPositions[a])},removeOverlays:function(){for(var a=0,b=arguments.length;b>a;a++)this.removeOverlay(arguments[a])},moveParent:function(a){if(this.bgCanvas&&(this.bgCanvas.parentNode.removeChild(this.bgCanvas),a.appendChild(this.bgCanvas)),this.canvas&&this.canvas.parentNode){this.canvas.parentNode.removeChild(this.canvas),a.appendChild(this.canvas);for(var b in this._jsPlumb.overlays)if(this._jsPlumb.overlays[b].isAppendedAtTopLevel){var c=this._jsPlumb.overlays[b].getElement();c.parentNode.removeChild(c),a.appendChild(c)}}},getLabel:function(){var a=this.getOverlay(d);return null!=a?a.getLabel():null},getLabelOverlay:function(){return this.getOverlay(d)},setLabel:function(a){var b=this.getOverlay(d);if(b)a.constructor==String||a.constructor==Function?b.setLabel(a):(a.label&&b.setLabel(a.label),a.location&&b.setLocation(a.location));else{var c=a.constructor==String||a.constructor==Function?{label:a}:a;b=e(this,c),this._jsPlumb.overlays[d]=b}this._jsPlumb.instance.isSuspendDrawing()||this.repaint()},cleanup:function(a){for(var b in this._jsPlumb.overlays)this._jsPlumb.overlays[b].cleanup(a),this._jsPlumb.overlays[b].destroy(a);a&&(this._jsPlumb.overlays={},this._jsPlumb.overlayPositions=null)},setVisible:function(a){this[a?"showOverlays":"hideOverlays"]()},setAbsoluteOverlayPosition:function(a,b){this._jsPlumb.overlayPositions[a.id]=b},getAbsoluteOverlayPosition:function(a){return this._jsPlumb.overlayPositions?this._jsPlumb.overlayPositions[a.id]:null},_clazzManip:function(a,b,c){if(!c)for(var d in this._jsPlumb.overlays)this._jsPlumb.overlays[d][a+"Class"](b)},addClass:function(a,b){this._clazzManip("add",a,b)},removeClass:function(a,b){this._clazzManip("remove",a,b)}})}.call(this),function(){"use strict";var a=this,b=a.jsPlumb,c=a.jsPlumbUtil,d=function(a,b,c){var d=!1;return{drag:function(){if(d)return d=!1,!0;if(b.element){var e=c.getUIPosition(arguments,c.getZoom());jsPlumb.setPosition(b.element,e),c.repaint(b.element,e),a.paint({anchorPoint:a.anchor.getCurrentLocation({element:a.element})})}},stopDrag:function(){d=!0}}},e=function(a,b,c,d){var e=jsPlumb.createElement("div",{position:"absolute"});b.appendElement(e);var f=b.getId(e);jsPlumb.setPosition(e,c),e.style.width=d[0]+"px",e.style.height=d[1]+"px",b.manage(f,e,!0),a.id=f,a.element=e},f=function(a,c,d,e,f,g,h,i){var j=new b.FloatingAnchor({reference:c,referenceCanvas:e,jsPlumbInstance:g});return h({paintStyle:a,endpoint:d,anchor:j,source:f,scope:i})},g=["connectorStyle","connectorHoverStyle","connectorOverlays","connector","connectionType","connectorClass","connectorHoverClass"],h=function(a,b){var c=0;if(null!=b)for(var d=0;d<a.connections.length;d++)if(a.connections[d].sourceId==b||a.connections[d].targetId==b){c=d;break}return a.connections[c]};b.Endpoint=function(a){var i=a._jsPlumb,j=a.newConnection,k=a.newEndpoint;this.idPrefix="_jsplumb_e_",this.defaultLabelLocation=[.5,.5],this.defaultOverlayKeys=["Overlays","EndpointOverlays"],b.OverlayCapableJsPlumbUIComponent.apply(this,arguments),this.appendToDefaultType({connectionType:a.connectionType,maxConnections:null==a.maxConnections?this._jsPlumb.instance.Defaults.MaxConnections:a.maxConnections,paintStyle:a.endpointStyle||a.paintStyle||a.style||this._jsPlumb.instance.Defaults.EndpointStyle||b.Defaults.EndpointStyle,hoverPaintStyle:a.endpointHoverStyle||a.hoverPaintStyle||this._jsPlumb.instance.Defaults.EndpointHoverStyle||b.Defaults.EndpointHoverStyle,connectorStyle:a.connectorStyle,connectorHoverStyle:a.connectorHoverStyle,connectorClass:a.connectorClass,connectorHoverClass:a.connectorHoverClass,connectorOverlays:a.connectorOverlays,connector:a.connector,connectorTooltip:a.connectorTooltip}),this._jsPlumb.enabled=!(a.enabled===!1),this._jsPlumb.visible=!0,this.element=b.getElement(a.source),this._jsPlumb.uuid=a.uuid,this._jsPlumb.floatingEndpoint=null;var l=null;this._jsPlumb.uuid&&(a.endpointsByUUID[this._jsPlumb.uuid]=this),this.elementId=a.elementId,this.dragProxy=a.dragProxy,this._jsPlumb.connectionCost=a.connectionCost,this._jsPlumb.connectionsDirected=a.connectionsDirected,this._jsPlumb.currentAnchorClass="",this._jsPlumb.events={};var m=function(){var a=i.endpointAnchorClassPrefix+"-"+this._jsPlumb.currentAnchorClass;this._jsPlumb.currentAnchorClass=this.anchor.getCssClass();var b=i.endpointAnchorClassPrefix+(this._jsPlumb.currentAnchorClass?"-"+this._jsPlumb.currentAnchorClass:"");this.removeClass(a),this.addClass(b),jsPlumb.updateClasses(this.element,b,a)}.bind(this);this.prepareAnchor=function(a){var b=this._jsPlumb.instance.makeAnchor(a,this.elementId,i);return b.bind("anchorChanged",function(a){this.fire("anchorChanged",{endpoint:this,anchor:a}),m()}.bind(this)),b},this.setPreparedAnchor=function(a,b){return this._jsPlumb.instance.continuousAnchorFactory.clear(this.elementId),this.anchor=a,m(),b||this._jsPlumb.instance.repaint(this.elementId),this},this.setAnchor=function(a,b){var c=this.prepareAnchor(a);return this.setPreparedAnchor(c,b),this};var n=function(a){if(this.connections.length>0)for(var b=0;b<this.connections.length;b++)this.connections[b].setHover(a,!1);else this.setHover(a)}.bind(this);this.bind("mouseover",function(){n(!0)}),this.bind("mouseout",function(){n(!1)}),a._transient||this._jsPlumb.instance.anchorManager.add(this,this.elementId),this.prepareEndpoint=function(d,e){var f,g=function(a,c){var d=i.getRenderMode();if(b.Endpoints[d][a])return new b.Endpoints[d][a](c);if(!i.Defaults.DoNotThrowErrors)throw{msg:"jsPlumb: unknown endpoint type '"+a+"'"}},h={_jsPlumb:this._jsPlumb.instance,cssClass:a.cssClass,container:a.container,tooltip:a.tooltip,connectorTooltip:a.connectorTooltip,endpoint:this};return c.isString(d)?f=g(d,h):c.isArray(d)?(h=c.merge(d[1],h),f=g(d[0],h)):f=d.clone(),f.clone=function(){return c.isString(d)?g(d,h):c.isArray(d)?(h=c.merge(d[1],h),g(d[0],h)):void 0}.bind(this),f.typeId=e,f},this.setEndpoint=function(a){var b=this.prepareEndpoint(a);this.setPreparedEndpoint(b,!0)},this.setPreparedEndpoint=function(a){null!=this.endpoint&&(this.endpoint.cleanup(),this.endpoint.destroy()),this.endpoint=a,this.type=this.endpoint.type,this.canvas=this.endpoint.canvas},b.extend(this,a,g),this.isSource=a.isSource||!1,this.isTemporarySource=a.isTemporarySource||!1,this.isTarget=a.isTarget||!1,this.connections=a.connections||[],this.connectorPointerEvents=a["connector-pointer-events"],this.scope=a.scope||i.getDefaultScope(),this.timestamp=null,this.reattachConnections=a.reattach||i.Defaults.ReattachConnections,this.connectionsDetachable=i.Defaults.ConnectionsDetachable,(a.connectionsDetachable===!1||a.detachable===!1)&&(this.connectionsDetachable=!1),this.dragAllowedWhenFull=a.dragAllowedWhenFull!==!1,a.onMaxConnections&&this.bind("maxConnections",a.onMaxConnections),this.addConnection=function(a){this.connections.push(a),this[(this.connections.length>0?"add":"remove")+"Class"](i.endpointConnectedClass),this[(this.isFull()?"add":"remove")+"Class"](i.endpointFullClass)},this.detachFromConnection=function(a,b,c){b=null==b?this.connections.indexOf(a):b,b>=0&&(this.connections.splice(b,1),this[(this.connections.length>0?"add":"remove")+"Class"](i.endpointConnectedClass),this[(this.isFull()?"add":"remove")+"Class"](i.endpointFullClass)),!c&&this._deleteOnDetach&&0===this.connections.length&&i.deleteObject({endpoint:this,fireEvent:!1,deleteAttachedObjects:!1})},this.detach=function(a,b,c,d,e,f,g){var h=null==g?this.connections.indexOf(a):g,j=!1;return d=d!==!1,h>=0&&(c||a._forceDetach||a.isDetachable()&&a.isDetachAllowed(a)&&this.isDetachAllowed(a)&&i.checkCondition("beforeDetach",a,f))&&(i.deleteObject({connection:a,fireEvent:!b&&d,originalEvent:e,deleteAttachedObjects:!1}),j=!0),j},this.detachAll=function(a,b){for(var c=[];this.connections.length>0;){var d=this.detach(this.connections[0],!1,b===!0,a!==!1,null,this,0);d||(c.push(this.connections[0]),this.connections.splice(0,1))}return this.connections=c,this},this.detachFrom=function(a,b,c){for(var d=[],e=0;e<this.connections.length;e++)(this.connections[e].endpoints[1]==a||this.connections[e].endpoints[0]==a)&&d.push(this.connections[e]);for(var f=0;f<d.length;f++)this.detach(d[f],!1,!0,b,c);return this},this.getElement=function(){return this.element},this.setElement=function(b){var d=this._jsPlumb.instance.getId(b),e=this.elementId;return c.removeWithFunction(a.endpointsByElement[this.elementId],function(a){return a.id==this.id}.bind(this)),this.element=jsPlumb.getElement(b),this.elementId=i.getId(this.element),i.anchorManager.rehomeEndpoint(this,e,this.element),i.dragManager.endpointAdded(this.element),c.addToList(a.endpointsByElement,d,this),this},this.makeInPlaceCopy=function(){var b=this.anchor.getCurrentLocation({element:this}),c=this.anchor.getOrientation(this),d=this.anchor.getCssClass(),e={bind:function(){},compute:function(){return[b[0],b[1]]},getCurrentLocation:function(){return[b[0],b[1]]},getOrientation:function(){return c},getCssClass:function(){return d}};return k({dropOptions:a.dropOptions,anchor:e,source:this.element,paintStyle:this.getPaintStyle(),endpoint:a.hideOnDrag?"Blank":this.endpoint,_transient:!0,scope:this.scope,reference:this})},this.connectorSelector=function(){var a=this.connections[0];return a?a:this.connections.length<this._jsPlumb.maxConnections||-1==this._jsPlumb.maxConnections?null:a},this.setStyle=this.setPaintStyle,this.paint=function(a){a=a||{}; +var b=a.timestamp,c=!(a.recalc===!1);if(!b||this.timestamp!==b){var d=i.updateOffset({elId:this.elementId,timestamp:b}),e=a.offset?a.offset.o:d.o;if(null!=e){var f=a.anchorPoint,g=a.connectorPaintStyle;if(null==f){var j=a.dimensions||d.s,k={xy:[e.left,e.top],wh:j,element:this,timestamp:b};if(c&&this.anchor.isDynamic&&this.connections.length>0){var l=h(this,a.elementWithPrecedence),m=l.endpoints[0]==this?1:0,n=0===m?l.sourceId:l.targetId,o=i.getCachedData(n),p=o.o,q=o.s;k.txy=[p.left,p.top],k.twh=q,k.tElement=l.endpoints[m]}f=this.anchor.compute(k)}this.endpoint.compute(f,this.anchor.getOrientation(this),this._jsPlumb.paintStyleInUse,g||this.paintStyleInUse),this.endpoint.paint(this._jsPlumb.paintStyleInUse,this.anchor),this.timestamp=b;for(var r in this._jsPlumb.overlays)if(this._jsPlumb.overlays.hasOwnProperty(r)){var s=this._jsPlumb.overlays[r];s.isVisible()&&(this._jsPlumb.overlayPlacements[r]=s.draw(this.endpoint,this._jsPlumb.paintStyleInUse),s.paint(this._jsPlumb.overlayPlacements[r]))}}}},this.getTypeDescriptor=function(){return"endpoint"},this.isVisible=function(){return this._jsPlumb.visible},this.repaint=this.paint;var o=!1;this.initDraggable=function(){if(!o&&b.isDragSupported(this.element)){var g,h={id:null,element:null},m=null,n=!1,p=null,q=d(this,h,i),r=a.dragOptions||{},s={},t=b.dragEvents.start,u=b.dragEvents.stop,v=b.dragEvents.drag,w=b.dragEvents.beforeStart,x=function(a){g=a.e.payload||{}},y=function(){m=this.connectorSelector();var b=!0;this.isEnabled()||(b=!1),null!=m||this.isSource||this.isTemporarySource||(b=!1),!this.isSource||!this.isFull()||null!=m&&this.dragAllowedWhenFull||(b=!1),null==m||m.isDetachable(this)||(b=!1);var d=i.checkCondition(null==m?"beforeDrag":"beforeStartDetach",{endpoint:this,source:this.element,sourceId:this.elementId,connection:m});if(d===!1?b=!1:"object"==typeof d?jsPlumb.extend(d,g||{}):d=g||{},b===!1)return i.stopDrag&&i.stopDrag(this.canvas),q.stopDrag(),!1;for(var l=0;l<this.connections.length;l++)this.connections[l].setHover(!1);this.addClass("endpointDrag"),i.setConnectionBeingDragged(!0),m&&!this.isFull()&&this.isSource&&(m=null),i.updateOffset({elId:this.elementId});var o=this._jsPlumb.instance.getOffset(this.canvas),r=this.canvas,s=this._jsPlumb.instance.getSize(this.canvas);e(h,i,o,s),i.setAttributes(this.canvas,{dragId:h.id,elId:this.elementId});var t=this.dragProxy||this.endpoint;if(null==this.dragProxy&&null!=this.connectionType){var u=this._jsPlumb.instance.deriveEndpointAndAnchorSpec(this.connectionType);u.endpoints[1]&&(t=u.endpoints[1])}var v=this._jsPlumb.instance.makeAnchor("Center");v.isFloating=!0,this._jsPlumb.floatingEndpoint=f(this.getPaintStyle(),v,t,this.canvas,h.element,i,k,this.scope);var w=this._jsPlumb.floatingEndpoint.anchor;if(null==m)this.setHover(!1,!1),m=j({sourceEndpoint:this,targetEndpoint:this._jsPlumb.floatingEndpoint,source:this.element,target:h.element,anchors:[this.anchor,this._jsPlumb.floatingEndpoint.anchor],paintStyle:a.connectorStyle,hoverPaintStyle:a.connectorHoverStyle,connector:a.connector,overlays:a.connectorOverlays,type:this.connectionType,cssClass:this.connectorClass,hoverClass:this.connectorHoverClass,scope:a.scope,data:d}),m.pending=!0,m.addClass(i.draggingClass),this._jsPlumb.floatingEndpoint.addClass(i.draggingClass),this._jsPlumb.floatingEndpoint.anchor=w,i.fire("connectionDrag",m),i.anchorManager.newConnection(m);else{n=!0,m.setHover(!1);var x=m.endpoints[0].id==this.id?0:1;this.detachFromConnection(m,null,!0);var y=i.getDragScope(r);i.setAttribute(this.canvas,"originalScope",y),i.fire("connectionDrag",m),0===x?(p=[m.source,m.sourceId,r,y],m.source=h.element,m.sourceId=h.id,i.anchorManager.sourceChanged(m.endpoints[x].elementId,m.sourceId,m)):(p=[m.target,m.targetId,r,y],m.target=h.element,m.targetId=h.id,i.anchorManager.updateOtherEndpoint(m.sourceId,m.endpoints[x].elementId,m.targetId,m)),m.suspendedEndpoint=m.endpoints[x],m.suspendedElement=m.endpoints[x].getElement(),m.suspendedElementId=m.endpoints[x].elementId,m.suspendedElementType=0===x?"source":"target",m.suspendedEndpoint.setHover(!1),this._jsPlumb.floatingEndpoint.referenceEndpoint=m.suspendedEndpoint,m.endpoints[x]=this._jsPlumb.floatingEndpoint,m.addClass(i.draggingClass),this._jsPlumb.floatingEndpoint.addClass(i.draggingClass)}i.floatingConnections[h.id]=m,c.addToList(a.endpointsByElement,h.id,this._jsPlumb.floatingEndpoint),i.currentlyDragging=!0}.bind(this),z=function(){if(i.setConnectionBeingDragged(!1),m&&null!=m.endpoints){var a=i.getDropEvent(arguments),b=i.getFloatingAnchorIndex(m);if(m.endpoints[0===b?1:0].anchor.locked=!1,m.removeClass(i.draggingClass),this._jsPlumb&&(m.deleteConnectionNow||m.endpoints[b]==this._jsPlumb.floatingEndpoint)&&n&&m.suspendedEndpoint){0===b?(m.floatingElement=m.source,m.floatingId=m.sourceId,m.floatingEndpoint=m.endpoints[0],m.floatingIndex=0,m.source=p[0],m.sourceId=p[1]):(m.floatingElement=m.target,m.floatingId=m.targetId,m.floatingEndpoint=m.endpoints[1],m.floatingIndex=1,m.target=p[0],m.targetId=p[1]);var c=this._jsPlumb.floatingEndpoint;i.setDragScope(p[2],p[3]),m.endpoints[b]=m.suspendedEndpoint,m.isReattach()||m._forceReattach||m._forceDetach||!m.endpoints[0===b?1:0].detach(m,!1,!1,!0,a,!0)?(m.setHover(!1),m._forceDetach=null,m._forceReattach=null,this._jsPlumb.floatingEndpoint.detachFromConnection(m),m.suspendedEndpoint.addConnection(m),1==b?i.anchorManager.updateOtherEndpoint(m.sourceId,m.floatingId,m.targetId,m):i.anchorManager.sourceChanged(m.floatingId,m.sourceId,m),i.repaint(p[1])):i.deleteObject({endpoint:c})}this.deleteAfterDragStop?i.deleteObject({endpoint:this}):this._jsPlumb&&this.paint({recalc:!1}),i.fire("connectionDragStop",m,a),m.pending&&i.fire("connectionAborted",m,a),i.currentlyDragging=!1,m=null}h&&h.element&&i.remove(h.element,!1,!1),l&&i.deleteObject({endpoint:l}),this._jsPlumb&&(this.canvas.style.visibility="visible",this.anchor.locked=!1,this._jsPlumb.floatingEndpoint=null)}.bind(this);r=b.extend(s,r),r.scope=this.scope||r.scope,r[w]=c.wrap(r[w],x,!1),r[t]=c.wrap(r[t],y,!1),r[v]=c.wrap(r[v],q.drag),r[u]=c.wrap(r[u],z),r.multipleDrop=!1,r.canDrag=function(){return this.isSource||this.isTemporarySource||this.connections.length>0}.bind(this),i.initDraggable(this.canvas,r,"internal"),this.canvas._jsPlumbRelatedElement=this.element,o=!0}};var p=a.endpoint||this._jsPlumb.instance.Defaults.Endpoint||b.Defaults.Endpoint;this.setEndpoint(p,!0);var q=a.anchor?a.anchor:a.anchors?a.anchors:i.Defaults.Anchor||"Top";this.setAnchor(q,!0);var r=["default",a.type||""].join(" ");this.addType(r,a.data,!0),this.canvas=this.endpoint.canvas,this.canvas._jsPlumb=this,this.initDraggable();var s=function(d,e,f,g){if(b.isDropSupported(this.element)){var h=a.dropOptions||i.Defaults.DropOptions||b.Defaults.DropOptions;h=b.extend({},h),h.scope=h.scope||this.scope;var j=b.dragEvents.drop,k=b.dragEvents.over,l=b.dragEvents.out,m=this,n=i.EndpointDropHandler({getEndpoint:function(){return m},jsPlumb:i,enabled:function(){return null!=f?f.isEnabled():!0},isFull:function(){return f.isFull()},element:this.element,elementId:this.elementId,isSource:this.isSource,isTarget:this.isTarget,addClass:function(a){m.addClass(a)},removeClass:function(a){m.removeClass(a)},isDropAllowed:function(){return m.isDropAllowed.apply(m,arguments)},reference:g,isRedrop:function(a,b){return a.suspendedEndpoint&&b.reference&&a.suspendedEndpoint.id===b.reference.id}});h[j]=c.wrap(h[j],n,!0),h[k]=c.wrap(h[k],function(){var a=b.getDragObject(arguments),c=i.getAttribute(b.getElement(a),"dragId"),d=i.floatingConnections[c];if(null!=d){var e=i.getFloatingAnchorIndex(d),f=this.isTarget&&0!==e||d.suspendedEndpoint&&this.referenceEndpoint&&this.referenceEndpoint.id==d.suspendedEndpoint.id;if(f){var g=i.checkCondition("checkDropAllowed",{sourceEndpoint:d.endpoints[e],targetEndpoint:this,connection:d});this[(g?"add":"remove")+"Class"](i.endpointDropAllowedClass),this[(g?"remove":"add")+"Class"](i.endpointDropForbiddenClass),d.endpoints[e].anchor.over(this.anchor,this)}}}.bind(this)),h[l]=c.wrap(h[l],function(){var a=b.getDragObject(arguments),c=null==a?null:i.getAttribute(b.getElement(a),"dragId"),d=c?i.floatingConnections[c]:null;if(null!=d){var e=i.getFloatingAnchorIndex(d),f=this.isTarget&&0!==e||d.suspendedEndpoint&&this.referenceEndpoint&&this.referenceEndpoint.id==d.suspendedEndpoint.id;f&&(this.removeClass(i.endpointDropAllowedClass),this.removeClass(i.endpointDropForbiddenClass),d.endpoints[e].anchor.out())}}.bind(this)),i.initDroppable(d,h,"internal",e)}}.bind(this);return this.anchor.isFloating||s(this.canvas,!(a._transient||this.anchor.isFloating),this,a.reference),this},c.extend(b.Endpoint,b.OverlayCapableJsPlumbUIComponent,{setVisible:function(a,b,c){if(this._jsPlumb.visible=a,this.canvas&&(this.canvas.style.display=a?"block":"none"),this[a?"showOverlays":"hideOverlays"](),!b)for(var d=0;d<this.connections.length;d++)if(this.connections[d].setVisible(a),!c){var e=this===this.connections[d].endpoints[0]?1:0;1==this.connections[d].endpoints[e].connections.length&&this.connections[d].endpoints[e].setVisible(a,!0,!0)}},getAttachedElements:function(){return this.connections},applyType:function(a,c){this.setPaintStyle(a.endpointStyle||a.paintStyle,c),this.setHoverPaintStyle(a.endpointHoverStyle||a.hoverPaintStyle,c),null!=a.maxConnections&&(this._jsPlumb.maxConnections=a.maxConnections),a.scope&&(this.scope=a.scope),b.extend(this,a,g),null!=a.cssClass&&this.canvas&&this._jsPlumb.instance.addClass(this.canvas,a.cssClass),b.OverlayCapableJsPlumbUIComponent.applyType(this,a)},isEnabled:function(){return this._jsPlumb.enabled},setEnabled:function(a){this._jsPlumb.enabled=a},cleanup:function(){var a=this._jsPlumb.instance.endpointAnchorClassPrefix+(this._jsPlumb.currentAnchorClass?"-"+this._jsPlumb.currentAnchorClass:"");jsPlumb.removeClass(this.element,a),this.anchor=null,this.endpoint.cleanup(!0),this.endpoint.destroy(),this.endpoint=null,this._jsPlumb.instance.destroyDraggable(this.canvas,"internal"),this._jsPlumb.instance.destroyDroppable(this.canvas,"internal")},setHover:function(a){this.endpoint&&this._jsPlumb&&!this._jsPlumb.instance.isConnectionBeingDragged()&&this.endpoint.setHover(a)},isFull:function(){return 0===this._jsPlumb.maxConnections?!0:!(this.isFloating()||this._jsPlumb.maxConnections<0||this.connections.length<this._jsPlumb.maxConnections)},isFloating:function(){return null!=this.anchor&&this.anchor.isFloating},isConnectedTo:function(a){var b=!1;if(a)for(var c=0;c<this.connections.length;c++)if(this.connections[c].endpoints[1]==a||this.connections[c].endpoints[0]==a){b=!0;break}return b},getConnectionCost:function(){return this._jsPlumb.connectionCost},setConnectionCost:function(a){this._jsPlumb.connectionCost=a},areConnectionsDirected:function(){return this._jsPlumb.connectionsDirected},setConnectionsDirected:function(a){this._jsPlumb.connectionsDirected=a},setElementId:function(a){this.elementId=a,this.anchor.elementId=a},setReferenceElement:function(a){this.element=b.getElement(a)},setDragAllowedWhenFull:function(a){this.dragAllowedWhenFull=a},equals:function(a){return this.anchor.equals(a.anchor)},getUuid:function(){return this._jsPlumb.uuid},computeAnchor:function(a){return this.anchor.compute(a)}}),a.jsPlumbInstance.prototype.EndpointDropHandler=function(a){return function(b){var c=a.jsPlumb;a.removeClass(c.endpointDropAllowedClass),a.removeClass(c.endpointDropForbiddenClass);var d=c.getDropEvent(arguments),e=c.getDragObject(arguments),f=c.getAttribute(e,"dragId"),g=(c.getAttribute(e,"elId"),c.getAttribute(e,"originalScope")),h=c.floatingConnections[f];if(null!=h){var i=null!=h.suspendedEndpoint;if(!i||null!=h.suspendedEndpoint._jsPlumb){var j=a.getEndpoint(h);if(null!=j){if(a.isRedrop(h,a))return h._forceReattach=!0,h.setHover(!1),a.maybeCleanup&&a.maybeCleanup(j),void 0;var k=c.getFloatingAnchorIndex(h);if(0===k&&!a.isSource||1===k&&!a.isTarget)return a.maybeCleanup&&a.maybeCleanup(j),void 0;a.onDrop&&a.onDrop(h),g&&c.setDragScope(e,g);var l=a.isFull(b);if(l&&j.fire("maxConnections",{endpoint:this,connection:h,maxConnections:j._jsPlumb.maxConnections},d),!l&&a.enabled()){var m=!0;0===k?(h.floatingElement=h.source,h.floatingId=h.sourceId,h.floatingEndpoint=h.endpoints[0],h.floatingIndex=0,h.source=a.element,h.sourceId=a.elementId):(h.floatingElement=h.target,h.floatingId=h.targetId,h.floatingEndpoint=h.endpoints[1],h.floatingIndex=1,h.target=a.element,h.targetId=a.elementId),i&&h.suspendedEndpoint.id!=j.id&&(h.isDetachAllowed(h)&&h.endpoints[k].isDetachAllowed(h)&&h.suspendedEndpoint.isDetachAllowed(h)&&c.checkCondition("beforeDetach",h)||(m=!1));var n=function(a){h.endpoints[k].detachFromConnection(h),h.suspendedEndpoint&&h.suspendedEndpoint.detachFromConnection(h),h.endpoints[k]=j,j.addConnection(h);var b=j.getParameters();for(var e in b)h.setParameter(e,b[e]);if(i){var f=h.suspendedEndpoint.elementId;c.fireMoveEvent({index:k,originalSourceId:0===k?f:h.sourceId,newSourceId:0===k?j.elementId:h.sourceId,originalTargetId:1==k?f:h.targetId,newTargetId:1==k?j.elementId:h.targetId,originalSourceEndpoint:0===k?h.suspendedEndpoint:h.endpoints[0],newSourceEndpoint:0===k?j:h.endpoints[0],originalTargetEndpoint:1==k?h.suspendedEndpoint:h.endpoints[1],newTargetEndpoint:1==k?j:h.endpoints[1],connection:h},d)}else b.draggable&&c.initDraggable(this.element,dragOptions,"internal",c);if(1==k?c.anchorManager.updateOtherEndpoint(h.sourceId,h.floatingId,h.targetId,h):c.anchorManager.sourceChanged(h.floatingId,h.sourceId,h),h.endpoints[0].finalEndpoint){var g=h.endpoints[0];g.detachFromConnection(h),h.endpoints[0]=h.endpoints[0].finalEndpoint,h.endpoints[0].addConnection(h)}jsPlumbUtil.isObject(a)&&h.mergeData(a),c.finaliseConnection(h,null,d,!1),h.setHover(!1)}.bind(this),o=function(){h.suspendedEndpoint&&(h.endpoints[k]=h.suspendedEndpoint,h.setHover(!1),h._forceDetach=!0,0===k?(h.source=h.suspendedEndpoint.element,h.sourceId=h.suspendedEndpoint.elementId):(h.target=h.suspendedEndpoint.element,h.targetId=h.suspendedEndpoint.elementId),h.suspendedEndpoint.addConnection(h),1==k?c.anchorManager.updateOtherEndpoint(h.sourceId,h.floatingId,h.targetId,h):c.anchorManager.sourceChanged(h.floatingId,h.sourceId,h),c.repaint(h.sourceId),h._forceDetach=!1)};if(m=m&&a.isDropAllowed(h.sourceId,h.targetId,h.scope,h,j))return n(m),!0;o()}a.maybeCleanup&&a.maybeCleanup(j),c.currentlyDragging=!1}}}}}}.call(this),function(){"use strict";var a=this,b=a.jsPlumb,c=a.jsPlumbUtil,d=function(a,c,d,e,f){if(!a.Defaults.DoNotThrowErrors&&null==jsPlumb.Connectors[c][d])throw{msg:"jsPlumb: unknown connector type '"+d+"'"};return new b.Connectors[c][d](e,f)},e=function(a,b,c){return a?c.makeAnchor(a,b,c):null},f=function(a,b,d,e){null!=b&&(b._jsPlumbConnections=b._jsPlumbConnections||{},e?delete b._jsPlumbConnections[a.id]:b._jsPlumbConnections[a.id]=!0,c.isEmpty(b._jsPlumbConnections)?d.removeClass(b,d.connectedClass):d.addClass(b,d.connectedClass))};b.Connection=function(a){var d=a.newEndpoint;this.id=a.id,this.connector=null,this.idPrefix="_jsplumb_c_",this.defaultLabelLocation=.5,this.defaultOverlayKeys=["Overlays","ConnectionOverlays"],this.previousConnection=a.previousConnection,this.source=b.getElement(a.source),this.target=b.getElement(a.target),a.sourceEndpoint&&(this.source=a.sourceEndpoint.getElement()),a.targetEndpoint&&(this.target=a.targetEndpoint.getElement()),b.OverlayCapableJsPlumbUIComponent.apply(this,arguments),this.sourceId=this._jsPlumb.instance.getId(this.source),this.targetId=this._jsPlumb.instance.getId(this.target),this.scope=a.scope,this.endpoints=[],this.endpointStyles=[];var e=this._jsPlumb.instance;e.manage(this.sourceId,this.source),e.manage(this.targetId,this.target),this._jsPlumb.visible=!0,this._jsPlumb.editable=a.editable===!0,this._jsPlumb.params={cssClass:a.cssClass,container:a.container,"pointer-events":a["pointer-events"],editorParams:a.editorParams,overlays:a.overlays},this._jsPlumb.lastPaintedAt=null,this.bind("mouseover",function(){this.setHover(!0)}.bind(this)),this.bind("mouseout",function(){this.setHover(!1)}.bind(this)),this.editableRequested=a.editable!==!1,this.setEditable=function(a){return this.connector?this.connector.setEditable(a):!1},this.isEditable=function(){return this.connector?this.connector.isEditable():!1},this.isEditing=function(){return this.connector?this.connector.isEditing():!1},this.makeEndpoint=function(b,c,f,g){return f=f||this._jsPlumb.instance.getId(c),this.prepareEndpoint(e,d,this,g,b?0:1,a,c,f)},a.type&&(a.endpoints=this._jsPlumb.instance.deriveEndpointAndAnchorSpec(a.type).endpoints);var f=this.makeEndpoint(!0,this.source,this.sourceId,a.sourceEndpoint),g=this.makeEndpoint(!1,this.target,this.targetId,a.targetEndpoint);f&&c.addToList(a.endpointsByElement,this.sourceId,f),g&&c.addToList(a.endpointsByElement,this.targetId,g),this.scope||(this.scope=this.endpoints[0].scope),null!=a.deleteEndpointsOnDetach?(this.endpoints[0]._deleteOnDetach=a.deleteEndpointsOnDetach,this.endpoints[1]._deleteOnDetach=a.deleteEndpointsOnDetach):(this.endpoints[0]._doNotDeleteOnDetach||(this.endpoints[0]._deleteOnDetach=!0),this.endpoints[1]._doNotDeleteOnDetach||(this.endpoints[1]._deleteOnDetach=!0));var h=e.Defaults.ConnectionsDetachable;a.detachable===!1&&(h=!1),this.endpoints[0].connectionsDetachable===!1&&(h=!1),this.endpoints[1].connectionsDetachable===!1&&(h=!1);var i=a.reattach||this.endpoints[0].reattachConnections||this.endpoints[1].reattachConnections||e.Defaults.ReattachConnections;this.appendToDefaultType({detachable:h,reattach:i,paintStyle:this.endpoints[0].connectorStyle||this.endpoints[1].connectorStyle||a.paintStyle||e.Defaults.PaintStyle||jsPlumb.Defaults.PaintStyle,hoverPaintStyle:this.endpoints[0].connectorHoverStyle||this.endpoints[1].connectorHoverStyle||a.hoverPaintStyle||e.Defaults.HoverPaintStyle||jsPlumb.Defaults.HoverPaintStyle});var j=e.getSuspendedAt();if(!e.isSuspendDrawing()){var k=e.getCachedData(this.sourceId),l=k.o,m=k.s,n=e.getCachedData(this.targetId),o=n.o,p=n.s,q=j||e.timestamp(),r=this.endpoints[0].anchor.compute({xy:[l.left,l.top],wh:m,element:this.endpoints[0],elementId:this.endpoints[0].elementId,txy:[o.left,o.top],twh:p,tElement:this.endpoints[1],timestamp:q});this.endpoints[0].paint({anchorLoc:r,timestamp:q}),r=this.endpoints[1].anchor.compute({xy:[o.left,o.top],wh:p,element:this.endpoints[1],elementId:this.endpoints[1].elementId,txy:[l.left,l.top],twh:m,tElement:this.endpoints[0],timestamp:q}),this.endpoints[1].paint({anchorLoc:r,timestamp:q})}this.getTypeDescriptor=function(){return"connection"},this.getAttachedElements=function(){return this.endpoints},this.isDetachable=function(){return this._jsPlumb.detachable===!0},this.setDetachable=function(a){this._jsPlumb.detachable=a===!0},this.isReattach=function(){return this._jsPlumb.reattach===!0||this.endpoints[0].reattachConnections===!0||this.endpoints[1].reattachConnections===!0},this.setReattach=function(a){this._jsPlumb.reattach=a===!0},this._jsPlumb.cost=a.cost||this.endpoints[0].getConnectionCost(),this._jsPlumb.directed=a.directed,null==a.directed&&(this._jsPlumb.directed=this.endpoints[0].areConnectionsDirected());var s=jsPlumb.extend({},this.endpoints[1].getParameters());b.extend(s,this.endpoints[0].getParameters()),b.extend(s,this.getParameters()),this.setParameters(s),this.setConnector(this.endpoints[0].connector||this.endpoints[1].connector||a.connector||e.Defaults.Connector||b.Defaults.Connector,!0),a.geometry&&this.connector.setGeometry(a.geometry);var t=null!=a.data&&jsPlumbUtil.isObject(a.data)?a.data:{};this.getData=function(){return t},this.setData=function(a){t=a||{}},this.mergeData=function(a){t=jsPlumb.extend(t,a)};var u=["default",this.endpoints[0].connectionType,this.endpoints[1].connectionType,a.type].join(" ");/[^\s]/.test(u)&&this.addType(u,a.data,!0),this.updateConnectedClass()},c.extend(b.Connection,b.OverlayCapableJsPlumbUIComponent,{applyType:function(a,c,d){null!=a.detachable&&this.setDetachable(a.detachable),null!=a.reattach&&this.setReattach(a.reattach),a.scope&&(this.scope=a.scope),null!=a.cssClass&&this.canvas&&this._jsPlumb.instance.addClass(this.canvas,a.cssClass);var e=null;a.anchor?(e=this.getCachedTypeItem("anchors",d.anchor),null==e&&(e=[this._jsPlumb.instance.makeAnchor(a.anchor),this._jsPlumb.instance.makeAnchor(a.anchor)],this.cacheTypeItem("anchors",e,d.anchor))):a.anchors&&(e=this.getCachedTypeItem("anchors",d.anchors),null==e&&(e=[this._jsPlumb.instance.makeAnchor(a.anchors[0]),this._jsPlumb.instance.makeAnchor(a.anchors[1])],this.cacheTypeItem("anchors",e,d.anchors))),null!=e&&(this.endpoints[0].anchor=e[0],this.endpoints[1].anchor=e[1],this.endpoints[1].anchor.isDynamic&&this._jsPlumb.instance.repaint(this.endpoints[1].elementId)),b.OverlayCapableJsPlumbUIComponent.applyType(this,a)},addClass:function(a,b){b&&(this.endpoints[0].addClass(a),this.endpoints[1].addClass(a),this.suspendedEndpoint&&this.suspendedEndpoint.addClass(a)),this.connector&&this.connector.addClass(a)},removeClass:function(a,b){b&&(this.endpoints[0].removeClass(a),this.endpoints[1].removeClass(a),this.suspendedEndpoint&&this.suspendedEndpoint.removeClass(a)),this.connector&&this.connector.removeClass(a)},isVisible:function(){return this._jsPlumb.visible},setVisible:function(a){this._jsPlumb.visible=a,this.connector&&this.connector.setVisible(a),this.repaint()},cleanup:function(){this.updateConnectedClass(!0),this.endpoints=null,this.source=null,this.target=null,null!=this.connector&&(this.connector.cleanup(!0),this.connector.destroy(!0)),this.connector=null},updateConnectedClass:function(a){this._jsPlumb&&(f(this,this.source,this._jsPlumb.instance,a),f(this,this.target,this._jsPlumb.instance,a))},setHover:function(b){this.connector&&this._jsPlumb&&!this._jsPlumb.instance.isConnectionBeingDragged()&&(this.connector.setHover(b),a.jsPlumb[b?"addClass":"removeClass"](this.source,this._jsPlumb.instance.hoverSourceClass),a.jsPlumb[b?"addClass":"removeClass"](this.target,this._jsPlumb.instance.hoverTargetClass))},getUuids:function(){return[this.endpoints[0].getUuid(),this.endpoints[1].getUuid()]},getCost:function(){return this._jsPlumb?this._jsPlumb.cost:-1/0},setCost:function(a){this._jsPlumb.cost=a},isDirected:function(){return this._jsPlumb.directed===!0},getConnector:function(){return this.connector},getGeometry:function(){return this.connector?this.connector.getGeometry():null},setGeometry:function(a){this.connector&&this.connector.setGeometry(a)},prepareConnector:function(a,b){var e,f={_jsPlumb:this._jsPlumb.instance,cssClass:(this._jsPlumb.params.cssClass||"")+(this.isEditable()?this._jsPlumb.instance.editableConnectorClass:""),container:this._jsPlumb.params.container,"pointer-events":this._jsPlumb.params["pointer-events"],editable:this.editableRequested},g=this._jsPlumb.instance.getRenderMode();return c.isString(a)?e=d(this._jsPlumb.instance,g,a,f,this):c.isArray(a)&&(e=1==a.length?d(this._jsPlumb.instance,g,a[0],f,this):d(this._jsPlumb.instance,g,a[0],c.merge(a[1],f),this)),null!=b&&(e.typeId=b),e},setPreparedConnector:function(a,b,c,d){var e,f="";if(null!=this.connector&&(e=this.connector,f=e.getClass(),this.connector.cleanup(),this.connector.destroy()),this.connector=a,d&&this.cacheTypeItem("connector",a,d),this.canvas=this.connector.canvas,this.bgCanvas=this.connector.bgCanvas,this.addClass(f),this.canvas&&(this.canvas._jsPlumb=this),this.bgCanvas&&(this.bgCanvas._jsPlumb=this),null!=e)for(var g=this.getOverlays(),h=0;h<g.length;h++)g[h].transfer&&g[h].transfer(this.connector);c||this.setListenerComponent(this.connector),b||this.repaint()},setConnector:function(a,b,c,d){var e=this.prepareConnector(a,d);this.setPreparedConnector(e,b,c,d)},paint:function(a){if(!this._jsPlumb.instance.isSuspendDrawing()&&this._jsPlumb.visible){a=a||{};var b=a.timestamp,c=!1,d=c?this.sourceId:this.targetId,e=c?this.targetId:this.sourceId,f=c?0:1,g=c?1:0;if(null==b||b!=this._jsPlumb.lastPaintedAt){var h=this._jsPlumb.instance.updateOffset({elId:e}).o,i=this._jsPlumb.instance.updateOffset({elId:d}).o,j=this.endpoints[g],k=this.endpoints[f],l=j.anchor.getCurrentLocation({xy:[h.left,h.top],wh:[h.width,h.height],element:j,timestamp:b}),m=k.anchor.getCurrentLocation({xy:[i.left,i.top],wh:[i.width,i.height],element:k,timestamp:b});this.connector.resetBounds(),this.connector.compute({sourcePos:l,targetPos:m,sourceEndpoint:this.endpoints[g],targetEndpoint:this.endpoints[f],lineWidth:this._jsPlumb.paintStyleInUse.lineWidth,sourceInfo:h,targetInfo:i});var n={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};for(var o in this._jsPlumb.overlays)if(this._jsPlumb.overlays.hasOwnProperty(o)){var p=this._jsPlumb.overlays[o];p.isVisible()&&(this._jsPlumb.overlayPlacements[o]=p.draw(this.connector,this._jsPlumb.paintStyleInUse,this.getAbsoluteOverlayPosition(p)),n.minX=Math.min(n.minX,this._jsPlumb.overlayPlacements[o].minX),n.maxX=Math.max(n.maxX,this._jsPlumb.overlayPlacements[o].maxX),n.minY=Math.min(n.minY,this._jsPlumb.overlayPlacements[o].minY),n.maxY=Math.max(n.maxY,this._jsPlumb.overlayPlacements[o].maxY))}var q=parseFloat(this._jsPlumb.paintStyleInUse.lineWidth||1)/2,r=parseFloat(this._jsPlumb.paintStyleInUse.lineWidth||0),s={xmin:Math.min(this.connector.bounds.minX-(q+r),n.minX),ymin:Math.min(this.connector.bounds.minY-(q+r),n.minY),xmax:Math.max(this.connector.bounds.maxX+(q+r),n.maxX),ymax:Math.max(this.connector.bounds.maxY+(q+r),n.maxY)};this.connector.paint(this._jsPlumb.paintStyleInUse,null,s);for(var t in this._jsPlumb.overlays)if(this._jsPlumb.overlays.hasOwnProperty(t)){var u=this._jsPlumb.overlays[t];u.isVisible()&&u.paint(this._jsPlumb.overlayPlacements[t],s)}}this._jsPlumb.lastPaintedAt=b}},repaint:function(a){a=a||{},this.paint({elId:this.sourceId,recalc:!(a.recalc===!1),timestamp:a.timestamp})},prepareEndpoint:function(a,c,d,f,g,h,i,j){var k;if(f)d.endpoints[g]=f,f.addConnection(d);else{h.endpoints||(h.endpoints=[null,null]);var l=h.endpoints[g]||h.endpoint||a.Defaults.Endpoints[g]||jsPlumb.Defaults.Endpoints[g]||a.Defaults.Endpoint||jsPlumb.Defaults.Endpoint;h.endpointStyles||(h.endpointStyles=[null,null]),h.endpointHoverStyles||(h.endpointHoverStyles=[null,null]);var m=h.endpointStyles[g]||h.endpointStyle||a.Defaults.EndpointStyles[g]||jsPlumb.Defaults.EndpointStyles[g]||a.Defaults.EndpointStyle||jsPlumb.Defaults.EndpointStyle;null==m.fillStyle&&null!=h.paintStyle&&(m.fillStyle=h.paintStyle.strokeStyle),null==m.outlineColor&&null!=h.paintStyle&&(m.outlineColor=h.paintStyle.outlineColor),null==m.outlineWidth&&null!=h.paintStyle&&(m.outlineWidth=h.paintStyle.outlineWidth);var n=h.endpointHoverStyles[g]||h.endpointHoverStyle||a.Defaults.EndpointHoverStyles[g]||jsPlumb.Defaults.EndpointHoverStyles[g]||a.Defaults.EndpointHoverStyle||jsPlumb.Defaults.EndpointHoverStyle;null!=h.hoverPaintStyle&&(null==n&&(n={}),null==n.fillStyle&&(n.fillStyle=h.hoverPaintStyle.strokeStyle));var o=h.anchors?h.anchors[g]:h.anchor?h.anchor:e(a.Defaults.Anchors[g],j,a)||e(b.Defaults.Anchors[g],j,a)||e(a.Defaults.Anchor,j,a)||e(b.Defaults.Anchor,j,a),p=h.uuids?h.uuids[g]:null;k=c({paintStyle:m,hoverPaintStyle:n,endpoint:l,connections:[d],uuid:p,anchor:o,source:i,scope:h.scope,reattach:h.reattach||a.Defaults.ReattachConnections,detachable:h.detachable||a.Defaults.ConnectionsDetachable}),d.endpoints[g]=k,h.drawEndpoints===!1&&k.setVisible(!1,!0,!0)}return k}})}.call(this),function(){"use strict";var a=this,b=a.jsPlumbUtil,c=a.jsPlumb;c.AnchorManager=function(a){var d={},e={},f={},g={},h={HORIZONTAL:"horizontal",VERTICAL:"vertical",DIAGONAL:"diagonal",IDENTITY:"identity"},i=["left","top","right","bottom"],j={},k=this,l={},m=a.jsPlumbInstance,n={},o=function(a,b,c,d,e,f){if(a===b)return{orientation:h.IDENTITY,a:["top","top"]};var g=Math.atan2(d.centery-c.centery,d.centerx-c.centerx),j=Math.atan2(c.centery-d.centery,c.centerx-d.centerx),k=[],l={};!function(a,b){for(var c=0;c<a.length;c++)l[a[c]]={left:[b[c].left,b[c].centery],right:[b[c].right,b[c].centery],top:[b[c].centerx,b[c].top],bottom:[b[c].centerx,b[c].bottom]}}(["source","target"],[c,d]);for(var m=0;m<i.length;m++)for(var n=0;n<i.length;n++)k.push({source:i[m],target:i[n],dist:Biltong.lineLength(l.source[i[m]],l.target[i[n]])});k.sort(function(a,b){return a.dist<b.dist?-1:a.dist>b.dist?1:0});for(var o=k[0].source,p=k[0].target,q=0;q<k.length&&(o=!e.isContinuous||e.isEdgeSupported(k[q].source)?k[q].source:null,p=!f.isContinuous||f.isEdgeSupported(k[q].target)?k[q].target:null,null==o||null==p);q++);return{a:[o,p],theta:g,theta2:j}},p=function(a,b,c,d,e,f,g){for(var h=[],i=b[e?0:1]/(d.length+1),j=0;j<d.length;j++){var k=(j+1)*i,l=f*b[e?1:0];g&&(k=b[e?0:1]-k);var m=e?k:l,n=c[0]+m,o=m/b[0],p=e?l:k,q=c[1]+p,r=p/b[1];h.push([n,q,o,r,d[j][1],d[j][2]])}return h},q=function(a){return function(b,c){var d=!0;return d=a?b[0][0]<c[0][0]:b[0][0]>c[0][0],d===!1?-1:1}},r=function(a,b){var c=a[0][0]<0?-Math.PI-a[0][0]:Math.PI-a[0][0],d=b[0][0]<0?-Math.PI-b[0][0]:Math.PI-b[0][0];return c>d?1:a[0][1]>b[0][1]?1:-1},s={top:function(a,b){return a[0]>b[0]?1:-1},right:q(!0),bottom:q(!0),left:r},t=function(a,b){return a.sort(b)},u=function(a,b){var c=m.getCachedData(a),d=c.s,f=c.o,h=function(b,c,d,f,h,i,j){if(f.length>0)for(var k=t(f,s[b]),l="right"===b||"top"===b,m=p(b,c,d,k,h,i,l),n=function(a,b){e[a.id]=[b[0],b[1],b[2],b[3]],g[a.id]=j},o=0;o<m.length;o++){var q=m[o][4],r=q.endpoints[0].elementId===a,u=q.endpoints[1].elementId===a;r&&n(q.endpoints[0],m[o]),u&&n(q.endpoints[1],m[o])}};h("bottom",d,[f.left,f.top],b.bottom,!0,1,[0,1]),h("top",d,[f.left,f.top],b.top,!0,0,[0,-1]),h("left",d,[f.left,f.top],b.left,!1,0,[-1,0]),h("right",d,[f.left,f.top],b.right,!1,1,[1,0])};this.reset=function(){d={},j={},l={}},this.addFloatingConnection=function(a,b){n[a]=b},this.removeFloatingConnection=function(a){delete n[a]},this.newConnection=function(a){var d=a.sourceId,e=a.targetId,f=a.endpoints,g=!0,h=function(h,i,k,l,m){d==e&&k.isContinuous&&(a._jsPlumb.instance.removeElement(f[1].canvas),g=!1),b.addToList(j,l,[m,i,k.constructor==c.DynamicAnchor])};h(0,f[0],f[0].anchor,e,a),g&&h(1,f[1],f[1].anchor,d,a)};var v=function(a){!function(a,c){if(a){var d=function(a){return a[4]==c};b.removeWithFunction(a.top,d),b.removeWithFunction(a.left,d),b.removeWithFunction(a.bottom,d),b.removeWithFunction(a.right,d)}}(l[a.elementId],a.id)};this.connectionDetached=function(a,c){var d=a.connection||a,e=a.sourceId,f=a.targetId,g=d.endpoints,h=function(a,c,d,e,f){b.removeWithFunction(j[e],function(a){return a[0].id==f.id})};h(1,g[1],g[1].anchor,e,d),h(0,g[0],g[0].anchor,f,d),d.floatingId&&(h(d.floatingIndex,d.floatingEndpoint,d.floatingEndpoint.anchor,d.floatingId,d),v(d.floatingEndpoint)),v(d.endpoints[0]),v(d.endpoints[1]),c||(k.redraw(d.sourceId),d.targetId!==d.sourceId&&k.redraw(d.targetId))},this.add=function(a,c){b.addToList(d,c,a)},this.changeId=function(a,b){j[b]=j[a],d[b]=d[a],delete j[a],delete d[a]},this.getConnectionsFor=function(a){return j[a]||[]},this.getEndpointsFor=function(a){return d[a]||[]},this.deleteEndpoint=function(a){b.removeWithFunction(d[a.elementId],function(b){return b.id==a.id}),v(a)},this.clearFor=function(a){delete d[a],d[a]=[]};var w=function(c,d,e,f,g,h,i,j,k,l,m,n){var o,p,q=-1,r=-1,s=f.endpoints[i],t=s.id,u=[1,0][i],v=[[d,e],f,g,h,t],w=c[k],x=s._continuousAnchorEdge?c[s._continuousAnchorEdge]:null;if(x){var y=b.findWithFunction(x,function(a){return a[4]==t});if(-1!=y)for(x.splice(y,1),o=0;o<x.length;o++)p=x[o][1],b.addWithFunction(m,p,function(a){return a.id==p.id}),b.addWithFunction(n,x[o][1].endpoints[i],function(a){return a.id==p.endpoints[i].id}),b.addWithFunction(n,x[o][1].endpoints[u],function(a){return a.id==p.endpoints[u].id})}for(o=0;o<w.length;o++)p=w[o][1],1==a.idx&&w[o][3]===h&&-1==r&&(r=o),b.addWithFunction(m,p,function(a){return a.id==p.id}),b.addWithFunction(n,w[o][1].endpoints[i],function(a){return a.id==p.endpoints[i].id}),b.addWithFunction(n,w[o][1].endpoints[u],function(a){return a.id==p.endpoints[u].id});if(-1!=q)w[q]=v;else{var z=j?-1!=r?r:0:w.length;w.splice(z,0,v)}s._continuousAnchorEdge=k};this.updateOtherEndpoint=function(a,d,e,f){var g=b.findWithFunction(j[a],function(a){return a[0].id===f.id +}),h=b.findWithFunction(j[d],function(a){return a[0].id===f.id});-1!=g&&(j[a][g][0]=f,j[a][g][1]=f.endpoints[1],j[a][g][2]=f.endpoints[1].anchor.constructor==c.DynamicAnchor),h>-1&&(j[d].splice(h,1),b.addToList(j,e,[f,f.endpoints[0],f.endpoints[0].anchor.constructor==c.DynamicAnchor])),f.updateConnectedClass()},this.sourceChanged=function(a,d,e){if(a!==d){b.removeWithFunction(j[a],function(a){return a[0].id===e.id});var f=b.findWithFunction(j[e.targetId],function(a){return a[0].id===e.id});f>-1&&(j[e.targetId][f][0]=e,j[e.targetId][f][1]=e.endpoints[0],j[e.targetId][f][2]=e.endpoints[0].anchor.constructor==c.DynamicAnchor),b.addToList(j,d,[e,e.endpoints[1],e.endpoints[1].anchor.constructor==c.DynamicAnchor]),e.endpoints[1].anchor.isContinuous&&(e.source===e.target?e._jsPlumb.instance.removeElement(e.endpoints[1].canvas):null==e.endpoints[1].canvas.parentNode&&e._jsPlumb.instance.appendElement(e.endpoints[1].canvas)),e.updateConnectedClass()}},this.rehomeEndpoint=function(a,b,c){var e=d[b]||[],f=m.getId(c);if(f!==b){var g=e.indexOf(a);if(g>-1){var h=e.splice(g,1)[0];k.add(h,f)}}for(var i=0;i<a.connections.length;i++)a.connections[i].sourceId==b?(a.connections[i].sourceId=a.elementId,a.connections[i].source=a.element,k.sourceChanged(b,a.elementId,a.connections[i])):a.connections[i].targetId==b&&(a.connections[i].targetId=a.elementId,a.connections[i].target=a.element,k.updateOtherEndpoint(a.connections[i].sourceId,b,a.elementId,a.connections[i]))},this.redraw=function(a,e,f,g,h,i){if(!m.isSuspendDrawing()){var k=d[a]||[],p=j[a]||[],q=[],r=[],s=[];f=f||m.timestamp(),g=g||{left:0,top:0},e&&(e={left:e.left+g.left,top:e.top+g.top});for(var t=m.updateOffset({elId:a,offset:e,recalc:!1,timestamp:f}),v={},x=0;x<p.length;x++){var y=p[x][0],z=y.sourceId,A=y.targetId,B=y.endpoints[0].anchor.isContinuous,C=y.endpoints[1].anchor.isContinuous;if(B||C){var D=z+"_"+A,E=v[D],F=y.sourceId==a?1:0;B&&!l[z]&&(l[z]={top:[],right:[],bottom:[],left:[]}),C&&!l[A]&&(l[A]={top:[],right:[],bottom:[],left:[]}),a!=A&&m.updateOffset({elId:A,timestamp:f}),a!=z&&m.updateOffset({elId:z,timestamp:f});var G=m.getCachedData(A),H=m.getCachedData(z);A==z&&(B||C)?(w(l[z],-Math.PI/2,0,y,!1,A,0,!1,"top",z,q,r),w(l[A],-Math.PI/2,0,y,!1,z,1,!1,"top",A,q,r)):(E||(E=o(z,A,H.o,G.o,y.endpoints[0].anchor,y.endpoints[1].anchor),v[D]=E),B&&w(l[z],E.theta,0,y,!1,A,0,!1,E.a[0],z,q,r),C&&w(l[A],E.theta2,-1,y,!0,z,1,!0,E.a[1],A,q,r)),B&&b.addWithFunction(s,z,function(a){return a===z}),C&&b.addWithFunction(s,A,function(a){return a===A}),b.addWithFunction(q,y,function(a){return a.id==y.id}),(B&&0===F||C&&1===F)&&b.addWithFunction(r,y.endpoints[F],function(a){return a.id==y.endpoints[F].id})}}for(x=0;x<k.length;x++)0===k[x].connections.length&&k[x].anchor.isContinuous&&(l[a]||(l[a]={top:[],right:[],bottom:[],left:[]}),w(l[a],-Math.PI/2,0,{endpoints:[k[x],k[x]],paint:function(){}},!1,a,0,!1,k[x].anchor.getDefaultFace(),a,q,r),b.addWithFunction(s,a,function(b){return b===a}));for(x=0;x<s.length;x++)u(s[x],l[s[x]]);for(x=0;x<k.length;x++)k[x].paint({timestamp:f,offset:t,dimensions:t.s,recalc:i!==!0});for(x=0;x<r.length;x++){var I=m.getCachedData(r[x].elementId);r[x].paint({timestamp:f,offset:I,dimensions:I.s})}for(x=0;x<p.length;x++){var J=p[x][1];if(J.anchor.constructor==c.DynamicAnchor){J.paint({elementWithPrecedence:a,timestamp:f}),b.addWithFunction(q,p[x][0],function(a){return a.id==p[x][0].id});for(var K=0;K<J.connections.length;K++)J.connections[K]!==p[x][0]&&b.addWithFunction(q,J.connections[K],function(a){return a.id==J.connections[K].id})}else J.anchor.constructor==c.Anchor&&b.addWithFunction(q,p[x][0],function(a){return a.id==p[x][0].id})}var L=n[a];for(L&&L.paint({timestamp:f,recalc:!1,elId:a}),x=0;x<q.length;x++)q[x].paint({elId:a,timestamp:f,recalc:!1,clearEdits:h})}};var x=function(a){b.EventGenerator.apply(this),this.type="Continuous",this.isDynamic=!0,this.isContinuous=!0;for(var c=a.faces||["top","right","bottom","left"],d=!(a.clockwise===!1),h={},i={top:"bottom",right:"left",left:"right",bottom:"top"},j={top:"right",right:"bottom",left:"top",bottom:"left"},k={top:"left",right:"top",left:"bottom",bottom:"right"},l=d?j:k,m=d?k:j,n=a.cssClass||"",o=0;o<c.length;o++)h[c[o]]=!0;this.getDefaultFace=function(){return 0===c.length?"top":c[0]},this.verifyEdge=function(a){return h[a]?a:h[i[a]]?i[a]:h[l[a]]?l[a]:h[m[a]]?m[a]:a},this.isEdgeSupported=function(a){return h[a]===!0},this.compute=function(a){return f[a.element.id]||e[a.element.id]||[0,0]},this.getCurrentLocation=function(a){return f[a.element.id]||e[a.element.id]||[0,0]},this.getOrientation=function(a){return g[a.id]||[0,0]},this.clearUserDefinedLocation=function(){delete f[a.elementId]},this.setUserDefinedLocation=function(b){f[a.elementId]=b},this.getCssClass=function(){return n}};m.continuousAnchorFactory={get:function(a){return new x(a)},clear:function(a){delete f[a],delete e[a]}}},c.Anchor=function(a){this.x=a.x||0,this.y=a.y||0,this.elementId=a.elementId,this.cssClass=a.cssClass||"",this.userDefinedLocation=null,this.orientation=a.orientation||[0,0],this.lastReturnValue=null,this.offsets=a.offsets||[0,0],this.timestamp=null,b.EventGenerator.apply(this),this.compute=function(a){var b=a.xy,c=a.wh,d=a.timestamp;return a.clearUserDefinedLocation&&(this.userDefinedLocation=null),d&&d===self.timestamp?this.lastReturnValue:(this.lastReturnValue=null!=this.userDefinedLocation?this.userDefinedLocation:[b[0]+this.x*c[0]+this.offsets[0],b[1]+this.y*c[1]+this.offsets[1]],this.timestamp=d,this.lastReturnValue)},this.getCurrentLocation=function(a){return a=a||{},null==this.lastReturnValue||null!=a.timestamp&&this.timestamp!=a.timestamp?this.compute(a):this.lastReturnValue}},b.extend(c.Anchor,b.EventGenerator,{equals:function(a){if(!a)return!1;var b=a.getOrientation(),c=this.getOrientation();return this.x==a.x&&this.y==a.y&&this.offsets[0]==a.offsets[0]&&this.offsets[1]==a.offsets[1]&&c[0]==b[0]&&c[1]==b[1]},getUserDefinedLocation:function(){return this.userDefinedLocation},setUserDefinedLocation:function(a){this.userDefinedLocation=a},clearUserDefinedLocation:function(){this.userDefinedLocation=null},getOrientation:function(){return this.orientation},getCssClass:function(){return this.cssClass}}),c.FloatingAnchor=function(a){c.Anchor.apply(this,arguments);var b=a.reference,d=a.referenceCanvas,e=c.getSize(d),f=0,g=0,h=null,i=null;this.orientation=null,this.x=0,this.y=0,this.isFloating=!0,this.compute=function(a){var b=a.xy,c=[b[0]+e[0]/2,b[1]+e[1]/2];return i=c,c},this.getOrientation=function(a){if(h)return h;var c=b.getOrientation(a);return[-1*Math.abs(c[0])*f,-1*Math.abs(c[1])*g]},this.over=function(a,b){h=a.getOrientation(b)},this.out=function(){h=null},this.getCurrentLocation=function(a){return null==i?this.compute(a):i}},b.extend(c.FloatingAnchor,c.Anchor);var d=function(a,b,d){return a.constructor==c.Anchor?a:b.makeAnchor(a,d,b)};c.DynamicAnchor=function(a){c.Anchor.apply(this,arguments),this.isDynamic=!0,this.anchors=[],this.elementId=a.elementId,this.jsPlumbInstance=a.jsPlumbInstance;for(var b=0;b<a.anchors.length;b++)this.anchors[b]=d(a.anchors[b],this.jsPlumbInstance,this.elementId);this.getAnchors=function(){return this.anchors},this.locked=!1;var e=this.anchors.length>0?this.anchors[0]:null,f=e,g=this,h=function(a,b,c,d,e){var f=d[0]+a.x*e[0],g=d[1]+a.y*e[1],h=d[0]+e[0]/2,i=d[1]+e[1]/2;return Math.sqrt(Math.pow(b-f,2)+Math.pow(c-g,2))+Math.sqrt(Math.pow(h-f,2)+Math.pow(i-g,2))},i=a.selector||function(a,b,c,d,e){for(var f=c[0]+d[0]/2,g=c[1]+d[1]/2,i=-1,j=1/0,k=0;k<e.length;k++){var l=h(e[k],f,g,a,b);j>l&&(i=k+0,j=l)}return e[i]};this.compute=function(a){var b=a.xy,c=a.wh,d=a.txy,h=a.twh;this.timestamp=a.timestamp;var j=g.getUserDefinedLocation();return null!=j?j:this.locked||null==d||null==h?e.compute(a):(a.timestamp=null,e=i(b,c,d,h,this.anchors),this.x=e.x,this.y=e.y,e!=f&&this.fire("anchorChanged",e),f=e,e.compute(a))},this.getCurrentLocation=function(a){return this.getUserDefinedLocation()||(null!=e?e.getCurrentLocation(a):null)},this.getOrientation=function(a){return null!=e?e.getOrientation(a):[0,0]},this.over=function(a,b){null!=e&&e.over(a,b)},this.out=function(){null!=e&&e.out()},this.getCssClass=function(){return e&&e.getCssClass()||""}},b.extend(c.DynamicAnchor,c.Anchor);var e=function(a,b,d,e,f,g){c.Anchors[f]=function(c){var h=c.jsPlumbInstance.makeAnchor([a,b,d,e,0,0],c.elementId,c.jsPlumbInstance);return h.type=f,g&&g(h,c),h}};e(.5,0,0,-1,"TopCenter"),e(.5,1,0,1,"BottomCenter"),e(0,.5,-1,0,"LeftMiddle"),e(1,.5,1,0,"RightMiddle"),e(.5,0,0,-1,"Top"),e(.5,1,0,1,"Bottom"),e(0,.5,-1,0,"Left"),e(1,.5,1,0,"Right"),e(.5,.5,0,0,"Center"),e(1,0,0,-1,"TopRight"),e(1,1,0,1,"BottomRight"),e(0,0,0,-1,"TopLeft"),e(0,1,0,1,"BottomLeft"),c.Defaults.DynamicAnchors=function(a){return a.jsPlumbInstance.makeAnchors(["TopCenter","RightMiddle","BottomCenter","LeftMiddle"],a.elementId,a.jsPlumbInstance)},c.Anchors.AutoDefault=function(a){var b=a.jsPlumbInstance.makeDynamicAnchor(c.Defaults.DynamicAnchors(a));return b.type="AutoDefault",b};var f=function(a,b){c.Anchors[a]=function(c){var d=c.jsPlumbInstance.makeAnchor(["Continuous",{faces:b}],c.elementId,c.jsPlumbInstance);return d.type=a,d}};c.Anchors.Continuous=function(a){return a.jsPlumbInstance.continuousAnchorFactory.get(a)},f("ContinuousLeft",["left"]),f("ContinuousTop",["top"]),f("ContinuousBottom",["bottom"]),f("ContinuousRight",["right"]),e(0,0,0,0,"Assign",function(a,b){var c=b.position||"Fixed";a.positionFinder=c.constructor==String?b.jsPlumbInstance.AnchorPositionFinders[c]:c,a.constructorParams=b}),jsPlumbInstance.prototype.AnchorPositionFinders={Fixed:function(a,b,c){return[(a.left-b.left)/c[0],(a.top-b.top)/c[1]]},Grid:function(a,b,c,d){var e=a.left-b.left,f=a.top-b.top,g=c[0]/d.grid[0],h=c[1]/d.grid[1],i=Math.floor(e/g),j=Math.floor(f/h);return[(i*g+g/2)/c[0],(j*h+h/2)/c[1]]}},c.Anchors.Perimeter=function(a){a=a||{};var b=a.anchorCount||60,c=a.shape;if(!c)throw new Error("no shape supplied to Perimeter Anchor type");var d=function(){for(var a=.5,c=2*Math.PI/b,d=0,e=[],f=0;b>f;f++){var g=a+a*Math.sin(d),h=a+a*Math.cos(d);e.push([g,h,0,0]),d+=c}return e},e=function(a){for(var c=b/a.length,d=[],e=function(a,e,f,g,h){c=b*h;for(var i=(f-a)/c,j=(g-e)/c,k=0;c>k;k++)d.push([a+i*k,e+j*k,0,0])},f=0;f<a.length;f++)e.apply(null,a[f]);return d},f=function(a){for(var b=[],c=0;c<a.length;c++)b.push([a[c][0],a[c][1],a[c][2],a[c][3],1/a.length]);return e(b)},g=function(){return f([[0,0,1,0],[1,0,1,1],[1,1,0,1],[0,1,0,0]])},h={Circle:d,Ellipse:d,Diamond:function(){return f([[.5,0,1,.5],[1,.5,.5,1],[.5,1,0,.5],[0,.5,.5,0]])},Rectangle:g,Square:g,Triangle:function(){return f([[.5,0,1,1],[1,1,0,1],[0,1,.5,0]])},Path:function(a){for(var b=a.points,c=[],d=0,f=0;f<b.length-1;f++){var g=Math.sqrt(Math.pow(b[f][2]-b[f][0])+Math.pow(b[f][3]-b[f][1]));d+=g,c.push([b[f][0],b[f][1],b[f+1][0],b[f+1][1],g])}for(var h=0;h<c.length;h++)c[h][4]=c[h][4]/d;return e(c)}},i=function(a,b){for(var c=[],d=b/180*Math.PI,e=0;e<a.length;e++){var f=a[e][0]-.5,g=a[e][1]-.5;c.push([.5+(f*Math.cos(d)-g*Math.sin(d)),.5+(f*Math.sin(d)+g*Math.cos(d)),a[e][2],a[e][3]])}return c};if(!h[c])throw new Error("Shape ["+c+"] is unknown by Perimeter Anchor type");var j=h[c](a);a.rotation&&(j=i(j,a.rotation));var k=a.jsPlumbInstance.makeDynamicAnchor(j);return k.type="Perimeter",k}}.call(this),function(){"use strict";var a=this,b=a.jsPlumb,c=a.jsPlumbUtil,d=a.Biltong;b.Segments={AbstractSegment:function(a){this.params=a,this.findClosestPointOnPath=function(){return{d:1/0,x:null,y:null,l:null}},this.getBounds=function(){return{minX:Math.min(a.x1,a.x2),minY:Math.min(a.y1,a.y2),maxX:Math.max(a.x1,a.x2),maxY:Math.max(a.y1,a.y2)}}},Straight:function(a){var c,e,f,g,h,i,j,k=(b.Segments.AbstractSegment.apply(this,arguments),function(){c=Math.sqrt(Math.pow(h-g,2)+Math.pow(j-i,2)),e=d.gradient({x:g,y:i},{x:h,y:j}),f=-1/e});this.type="Straight",this.getLength=function(){return c},this.getGradient=function(){return e},this.getCoordinates=function(){return{x1:g,y1:i,x2:h,y2:j}},this.setCoordinates=function(a){g=a.x1,i=a.y1,h=a.x2,j=a.y2,k()},this.setCoordinates({x1:a.x1,y1:a.y1,x2:a.x2,y2:a.y2}),this.getBounds=function(){return{minX:Math.min(g,h),minY:Math.min(i,j),maxX:Math.max(g,h),maxY:Math.max(i,j)}},this.pointOnPath=function(a,b){if(0!==a||b){if(1!=a||b){var e=b?a>0?a:c+a:a*c;return d.pointOnLine({x:g,y:i},{x:h,y:j},e)}return{x:h,y:j}}return{x:g,y:i}},this.gradientAtPoint=function(){return e},this.pointAlongPathFrom=function(a,b,c){var e=this.pointOnPath(a,c),f=0>=b?{x:g,y:i}:{x:h,y:j};return 0>=b&&Math.abs(b)>1&&(b*=-1),d.pointOnLine(e,f,b)};var l=function(a,b,c){return c>=Math.min(a,b)&&c<=Math.max(a,b)},m=function(a,b,c){return Math.abs(c-a)<Math.abs(c-b)?a:b};this.findClosestPointOnPath=function(a,b){var k={d:1/0,x:null,y:null,l:null,x1:g,x2:h,y1:i,y2:j};if(0===e)k.y=i,k.x=l(g,h,a)?a:m(g,h,a);else if(1/0==e||e==-1/0)k.x=g,k.y=l(i,j,b)?b:m(i,j,b);else{var n=i-e*g,o=b-f*a,p=(o-n)/(e-f),q=e*p+n;k.x=l(g,h,p)?p:m(g,h,p),k.y=l(i,j,q)?q:m(i,j,q)}var r=d.lineLength([k.x,k.y],[g,i]);return k.d=d.lineLength([a,b],[k.x,k.y]),k.l=r/c,k}},Arc:function(a){var c=(b.Segments.AbstractSegment.apply(this,arguments),function(b,c){return d.theta([a.cx,a.cy],[b,c])}),e=function(a,b){if(a.anticlockwise){var c=a.startAngle<a.endAngle?a.startAngle+f:a.startAngle,d=Math.abs(c-a.endAngle);return c-d*b}var e=a.endAngle<a.startAngle?a.endAngle+f:a.endAngle,g=Math.abs(e-a.startAngle);return a.startAngle+g*b},f=2*Math.PI;this.radius=a.r,this.anticlockwise=a.ac,this.type="Arc",a.startAngle&&a.endAngle?(this.startAngle=a.startAngle,this.endAngle=a.endAngle,this.x1=a.cx+this.radius*Math.cos(a.startAngle),this.y1=a.cy+this.radius*Math.sin(a.startAngle),this.x2=a.cx+this.radius*Math.cos(a.endAngle),this.y2=a.cy+this.radius*Math.sin(a.endAngle)):(this.startAngle=c(a.x1,a.y1),this.endAngle=c(a.x2,a.y2),this.x1=a.x1,this.y1=a.y1,this.x2=a.x2,this.y2=a.y2),this.endAngle<0&&(this.endAngle+=f),this.startAngle<0&&(this.startAngle+=f);var g=this.endAngle<this.startAngle?this.endAngle+f:this.endAngle;this.sweep=Math.abs(g-this.startAngle),this.anticlockwise&&(this.sweep=f-this.sweep);var h=2*Math.PI*this.radius,i=this.sweep/f,j=h*i;this.getLength=function(){return j},this.getBounds=function(){return{minX:a.cx-a.r,maxX:a.cx+a.r,minY:a.cy-a.r,maxY:a.cy+a.r}};var k=1e-10,l=function(a){var b=Math.floor(a),c=Math.ceil(a);return k>a-b?b:k>c-a?c:a};this.pointOnPath=function(b,c){if(0===b)return{x:this.x1,y:this.y1,theta:this.startAngle};if(1==b)return{x:this.x2,y:this.y2,theta:this.endAngle};c&&(b/=j);var d=e(this,b),f=a.cx+a.r*Math.cos(d),g=a.cy+a.r*Math.sin(d);return{x:l(f),y:l(g),theta:d}},this.gradientAtPoint=function(b,c){var e=this.pointOnPath(b,c),f=d.normal([a.cx,a.cy],[e.x,e.y]);return this.anticlockwise||1/0!=f&&f!=-1/0||(f*=-1),f},this.pointAlongPathFrom=function(b,c,d){var e=this.pointOnPath(b,d),f=2*(c/h)*Math.PI,g=this.anticlockwise?-1:1,i=e.theta+g*f,j=a.cx+this.radius*Math.cos(i),k=a.cy+this.radius*Math.sin(i);return{x:j,y:k}}},Bezier:function(c){this.curve=[{x:c.x1,y:c.y1},{x:c.cp1x,y:c.cp1y},{x:c.cp2x,y:c.cp2y},{x:c.x2,y:c.y2}],b.Segments.AbstractSegment.apply(this,arguments),this.bounds={minX:Math.min(c.x1,c.x2,c.cp1x,c.cp2x),minY:Math.min(c.y1,c.y2,c.cp1y,c.cp2y),maxX:Math.max(c.x1,c.x2,c.cp1x,c.cp2x),maxY:Math.max(c.y1,c.y2,c.cp1y,c.cp2y)},this.type="Bezier";var d=function(b,c,d){return d&&(c=a.jsBezier.locationAlongCurveFrom(b,c>0?0:1,c)),c};this.pointOnPath=function(b,c){return b=d(this.curve,b,c),a.jsBezier.pointOnCurve(this.curve,b)},this.gradientAtPoint=function(b,c){return b=d(this.curve,b,c),a.jsBezier.gradientAtPoint(this.curve,b)},this.pointAlongPathFrom=function(b,c,e){return b=d(this.curve,b,e),a.jsBezier.pointAlongCurveFrom(this.curve,b,c)},this.getLength=function(){return a.jsBezier.getLength(this.curve)},this.getBounds=function(){return this.bounds}}};var e=function(){this.resetBounds=function(){this.bounds={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}},this.resetBounds()};b.Connectors.AbstractConnector=function(a){e.apply(this,arguments);var f=[],g=0,h=[],i=[],j=a.stub||0,k=c.isArray(j)?j[0]:j,l=c.isArray(j)?j[1]:j,m=a.gap||0,n=c.isArray(m)?m[0]:m,o=c.isArray(m)?m[1]:m,p=null,q=!1,r=null,s=null,t=a.editable!==!1&&null!=jsPlumb.ConnectorEditors&&null!=jsPlumb.ConnectorEditors[this.type],u=this.setGeometry=function(a,b){q=!b,s=a},v=this.getGeometry=function(){return s};this.hasBeenEdited=function(){return q},this.isEditing=function(){return null!=this.editor&&this.editor.isActive()},this.setEditable=function(a){return t=a&&null!=jsPlumb.ConnectorEditors&&null!=jsPlumb.ConnectorEditors[this.type]&&(null==this.overrideSetEditable||this.overrideSetEditable())?a:!1},this.isEditable=function(){return t},this.findSegmentForPoint=function(a,b){for(var c={d:1/0,s:null,x:null,y:null,l:null},d=0;d<f.length;d++){var e=f[d].findClosestPointOnPath(a,b);e.d<c.d&&(c.d=e.d,c.l=e.l,c.x=e.x,c.y=e.y,c.s=f[d],c.x1=e.x1,c.x2=e.x2,c.y1=e.y1,c.y2=e.y2,c.index=d)}return c};var w=function(){for(var a=0,b=0;b<f.length;b++){var c=f[b].getLength();i[b]=c/g,h[b]=[a,a+=c/g]}},x=function(a,b){b&&(a=a>0?a/g:(g+a)/g);for(var c=h.length-1,d=1,e=0;e<h.length;e++)if(h[e][1]>=a){c=e,d=1==a?1:0===a?0:(a-h[e][0])/i[e];break}return{segment:f[c],proportion:d,index:c}},y=function(a,c,d){if(d.x1!=d.x2||d.y1!=d.y2){var e=new b.Segments[c](d);f.push(e),g+=e.getLength(),a.updateBounds(e)}},z=function(){g=f.length=h.length=i.length=0};this.setSegments=function(a){p=[],g=0;for(var b=0;b<a.length;b++)p.push(a[b]),g+=a[b].getLength()},this.getLength=function(){return g};var A=function(a){this.lineWidth=a.lineWidth;var b=d.quadrant(a.sourcePos,a.targetPos),c=a.targetPos[0]<a.sourcePos[0],e=a.targetPos[1]<a.sourcePos[1],f=a.lineWidth||1,g=a.sourceEndpoint.anchor.getOrientation(a.sourceEndpoint),h=a.targetEndpoint.anchor.getOrientation(a.targetEndpoint),i=c?a.targetPos[0]:a.sourcePos[0],j=e?a.targetPos[1]:a.sourcePos[1],m=Math.abs(a.targetPos[0]-a.sourcePos[0]),p=Math.abs(a.targetPos[1]-a.sourcePos[1]);if(0===g[0]&&0===g[1]||0===h[0]&&0===h[1]){var q=m>p?0:1,r=[1,0][q];g=[],h=[],g[q]=a.sourcePos[q]>a.targetPos[q]?-1:1,h[q]=a.sourcePos[q]>a.targetPos[q]?1:-1,g[r]=0,h[r]=0}var s=c?m+n*g[0]:n*g[0],t=e?p+n*g[1]:n*g[1],u=c?o*h[0]:m+o*h[0],v=e?o*h[1]:p+o*h[1],w=g[0]*h[0]+g[1]*h[1],x={sx:s,sy:t,tx:u,ty:v,lw:f,xSpan:Math.abs(u-s),ySpan:Math.abs(v-t),mx:(s+u)/2,my:(t+v)/2,so:g,to:h,x:i,y:j,w:m,h:p,segment:b,startStubX:s+g[0]*k,startStubY:t+g[1]*k,endStubX:u+h[0]*l,endStubY:v+h[1]*l,isXGreaterThanStubTimes2:Math.abs(s-u)>k+l,isYGreaterThanStubTimes2:Math.abs(t-v)>k+l,opposite:-1==w,perpendicular:0===w,orthogonal:1==w,sourceAxis:0===g[0]?"y":"x",points:[i,j,m,p,s,t,u,v]};return x.anchorOrientation=x.opposite?"opposite":x.orthogonal?"orthogonal":"perpendicular",x};return this.getSegments=function(){return f},this.updateBounds=function(a){var b=a.getBounds();this.bounds.minX=Math.min(this.bounds.minX,b.minX),this.bounds.maxX=Math.max(this.bounds.maxX,b.maxX),this.bounds.minY=Math.min(this.bounds.minY,b.minY),this.bounds.maxY=Math.max(this.bounds.maxY,b.maxY)},this.pointOnPath=function(a,b){var c=x(a,b);return c.segment&&c.segment.pointOnPath(c.proportion,!1)||[0,0]},this.gradientAtPoint=function(a,b){var c=x(a,b);return c.segment&&c.segment.gradientAtPoint(c.proportion,!1)||0},this.pointAlongPathFrom=function(a,b,c){var d=x(a,c);return d.segment&&d.segment.pointAlongPathFrom(d.proportion,b,!1)||[0,0]},this.compute=function(a){r=A.call(this,a),z(),this._compute(r,a),this.x=r.points[0],this.y=r.points[1],this.w=r.points[2],this.h=r.points[3],this.segment=r.segment,w()},{addSegment:y,prepareCompute:A,sourceStub:k,targetStub:l,maxStub:Math.max(k,l),sourceGap:n,targetGap:o,maxGap:Math.max(n,o),setGeometry:u,getGeometry:v}},c.extend(b.Connectors.AbstractConnector,e);var f=b.Connectors.Straight=function(){this.type="Straight";var a=b.Connectors.AbstractConnector.apply(this,arguments);this._compute=function(b){a.addSegment(this,"Straight",{x1:b.sx,y1:b.sy,x2:b.startStubX,y2:b.startStubY}),a.addSegment(this,"Straight",{x1:b.startStubX,y1:b.startStubY,x2:b.endStubX,y2:b.endStubY}),a.addSegment(this,"Straight",{x1:b.endStubX,y1:b.endStubY,x2:b.tx,y2:b.ty})}};c.extend(b.Connectors.Straight,b.Connectors.AbstractConnector),b.registerConnectorType(f,"Straight"),b.Endpoints.AbstractEndpoint=function(a){e.apply(this,arguments);var b=this.compute=function(){var a=this._compute.apply(this,arguments);return this.x=a[0],this.y=a[1],this.w=a[2],this.h=a[3],this.bounds.minX=this.x,this.bounds.minY=this.y,this.bounds.maxX=this.x+this.w,this.bounds.maxY=this.y+this.h,a};return{compute:b,cssClass:a.cssClass}},c.extend(b.Endpoints.AbstractEndpoint,e),b.Endpoints.Dot=function(a){this.type="Dot",b.Endpoints.AbstractEndpoint.apply(this,arguments),a=a||{},this.radius=a.radius||10,this.defaultOffset=.5*this.radius,this.defaultInnerRadius=this.radius/3,this._compute=function(a,b,c){this.radius=c.radius||this.radius;var d=a[0]-this.radius,e=a[1]-this.radius,f=2*this.radius,g=2*this.radius;if(c.strokeStyle){var h=c.lineWidth||1;d-=h,e-=h,f+=2*h,g+=2*h}return[d,e,f,g,this.radius]}},c.extend(b.Endpoints.Dot,b.Endpoints.AbstractEndpoint),b.Endpoints.Rectangle=function(a){this.type="Rectangle",b.Endpoints.AbstractEndpoint.apply(this,arguments),a=a||{},this.width=a.width||20,this.height=a.height||20,this._compute=function(a,b,c){var d=c.width||this.width,e=c.height||this.height,f=a[0]-d/2,g=a[1]-e/2;return[f,g,d,e]}},c.extend(b.Endpoints.Rectangle,b.Endpoints.AbstractEndpoint);var g=function(){b.jsPlumbUIComponent.apply(this,arguments),this._jsPlumb.displayElements=[]};c.extend(g,b.jsPlumbUIComponent,{getDisplayElements:function(){return this._jsPlumb.displayElements},appendDisplayElement:function(a){this._jsPlumb.displayElements.push(a)}}),b.Endpoints.Image=function(d){this.type="Image",g.apply(this,arguments),b.Endpoints.AbstractEndpoint.apply(this,arguments);var e=d.onload,f=d.src||d.url,h=d.cssClass?" "+d.cssClass:"";this._jsPlumb.img=new Image,this._jsPlumb.ready=!1,this._jsPlumb.initialized=!1,this._jsPlumb.deleted=!1,this._jsPlumb.widthToUse=d.width,this._jsPlumb.heightToUse=d.height,this._jsPlumb.endpoint=d.endpoint,this._jsPlumb.img.onload=function(){null!=this._jsPlumb&&(this._jsPlumb.ready=!0,this._jsPlumb.widthToUse=this._jsPlumb.widthToUse||this._jsPlumb.img.width,this._jsPlumb.heightToUse=this._jsPlumb.heightToUse||this._jsPlumb.img.height,e&&e(this))}.bind(this),this._jsPlumb.endpoint.setImage=function(a,b){var c=a.constructor==String?a:a.src;e=b,this._jsPlumb.img.src=c,null!=this.canvas&&this.canvas.setAttribute("src",this._jsPlumb.img.src)}.bind(this),this._jsPlumb.endpoint.setImage(f,e),this._compute=function(a){return this.anchorPoint=a,this._jsPlumb.ready?[a[0]-this._jsPlumb.widthToUse/2,a[1]-this._jsPlumb.heightToUse/2,this._jsPlumb.widthToUse,this._jsPlumb.heightToUse]:[0,0,0,0]},this.canvas=jsPlumb.createElement("img",{position:"absolute",margin:0,padding:0,outline:0},this._jsPlumb.instance.endpointClass+h),this._jsPlumb.widthToUse&&this.canvas.setAttribute("width",this._jsPlumb.widthToUse),this._jsPlumb.heightToUse&&this.canvas.setAttribute("height",this._jsPlumb.heightToUse),this._jsPlumb.instance.appendElement(this.canvas),this.actuallyPaint=function(){if(!this._jsPlumb.deleted){this._jsPlumb.initialized||(this.canvas.setAttribute("src",this._jsPlumb.img.src),this.appendDisplayElement(this.canvas),this._jsPlumb.initialized=!0);var a=this.anchorPoint[0]-this._jsPlumb.widthToUse/2,b=this.anchorPoint[1]-this._jsPlumb.heightToUse/2;c.sizeElement(this.canvas,a,b,this._jsPlumb.widthToUse,this._jsPlumb.heightToUse)}},this.paint=function(b,c){null!=this._jsPlumb&&(this._jsPlumb.ready?this.actuallyPaint(b,c):a.setTimeout(function(){this.paint(b,c)}.bind(this),200))}},c.extend(b.Endpoints.Image,[g,b.Endpoints.AbstractEndpoint],{cleanup:function(a){a&&(this._jsPlumb.deleted=!0,this.canvas&&this.canvas.parentNode.removeChild(this.canvas),this.canvas=null)}}),b.Endpoints.Blank=function(a){b.Endpoints.AbstractEndpoint.apply(this,arguments),this.type="Blank",g.apply(this,arguments),this._compute=function(a){return[a[0],a[1],10,0]};var d=a.cssClass?" "+a.cssClass:"";this.canvas=jsPlumb.createElement("div",{display:"block",width:"1px",height:"1px",background:"transparent",position:"absolute"},this._jsPlumb.instance.endpointClass+d),this._jsPlumb.instance.appendElement(this.canvas),this.paint=function(){c.sizeElement(this.canvas,this.x,this.y,this.w,this.h)}},c.extend(b.Endpoints.Blank,[b.Endpoints.AbstractEndpoint,g],{cleanup:function(){this.canvas&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas)}}),b.Endpoints.Triangle=function(a){this.type="Triangle",b.Endpoints.AbstractEndpoint.apply(this,arguments),a=a||{},a.width=a.width||55,a.height=a.height||55,this.width=a.width,this.height=a.height,this._compute=function(a,b,c){var d=c.width||self.width,e=c.height||self.height,f=a[0]-d/2,g=a[1]-e/2;return[f,g,d,e]}};var h=b.Overlays.AbstractOverlay=function(a){this.visible=!0,this.isAppendedAtTopLevel=!0,this.component=a.component,this.loc=null==a.location?.5:a.location,this.endpointLoc=null==a.endpointLocation?[.5,.5]:a.endpointLocation,this.visible=a.visible!==!1};h.prototype={cleanup:function(a){a&&(this.component=null,this.canvas=null,this.endpointLoc=null)},reattach:function(){},setVisible:function(a){this.visible=a,this.component.repaint()},isVisible:function(){return this.visible},hide:function(){this.setVisible(!1)},show:function(){this.setVisible(!0)},incrementLocation:function(a){this.loc+=a,this.component.repaint()},setLocation:function(a){this.loc=a,this.component.repaint()},getLocation:function(){return this.loc},updateFrom:function(){}},b.Overlays.Arrow=function(a){this.type="Arrow",h.apply(this,arguments),this.isAppendedAtTopLevel=!1,a=a||{},this.length=a.length||20,this.width=a.width||20,this.id=a.id;var b=(a.direction||1)<0?-1:1,e=a.paintStyle||{lineWidth:1},f=a.foldback||.623;this.computeMaxSize=function(){return 1.5*self.width},this.elementCreated=function(b){if(this.path=b,a.events)for(var c in a.events)jsPlumb.on(b,c,a.events[c])},this.draw=function(a,g){var h,i,j,k,l;if(a.pointAlongPathFrom){if(c.isString(this.loc)||this.loc>1||this.loc<0){var m=parseInt(this.loc,10),n=this.loc<0?1:0;h=a.pointAlongPathFrom(n,m,!1),i=a.pointAlongPathFrom(n,m-b*this.length/2,!1),j=d.pointOnLine(h,i,this.length)}else if(1==this.loc){if(h=a.pointOnPath(this.loc),i=a.pointAlongPathFrom(this.loc,-this.length),j=d.pointOnLine(h,i,this.length),-1==b){var o=j;j=h,h=o}}else if(0===this.loc){if(j=a.pointOnPath(this.loc),i=a.pointAlongPathFrom(this.loc,this.length),h=d.pointOnLine(j,i,this.length),-1==b){var p=j;j=h,h=p}}else h=a.pointAlongPathFrom(this.loc,b*this.length/2),i=a.pointOnPath(this.loc),j=d.pointOnLine(h,i,this.length);k=d.perpendicularLineTo(h,j,this.width),l=d.pointOnLine(h,j,f*this.length);var q={hxy:h,tail:k,cxy:l},r=e.strokeStyle||g.strokeStyle,s=e.fillStyle||g.strokeStyle,t=e.lineWidth||g.lineWidth;return{component:a,d:q,lineWidth:t,strokeStyle:r,fillStyle:s,minX:Math.min(h.x,k[0].x,k[1].x),maxX:Math.max(h.x,k[0].x,k[1].x),minY:Math.min(h.y,k[0].y,k[1].y),maxY:Math.max(h.y,k[0].y,k[1].y)}}return{component:a,minX:0,maxX:0,minY:0,maxY:0}}},c.extend(b.Overlays.Arrow,h,{updateFrom:function(a){this.length=a.length||this.length,this.width=a.width||this.width,this.direction=null!=a.direction?a.direction:this.direction,this.foldback=a.foldback||this.foldback}}),b.Overlays.PlainArrow=function(a){a=a||{};var c=b.extend(a,{foldback:1});b.Overlays.Arrow.call(this,c),this.type="PlainArrow"},c.extend(b.Overlays.PlainArrow,b.Overlays.Arrow),b.Overlays.Diamond=function(a){a=a||{};var c=a.length||40,d=jsPlumb.extend(a,{length:c/2,foldback:2});b.Overlays.Arrow.call(this,d),this.type="Diamond"},c.extend(b.Overlays.Diamond,b.Overlays.Arrow);var i=function(a,b){return(null==a._jsPlumb.cachedDimensions||b)&&(a._jsPlumb.cachedDimensions=a.getDimensions()),a._jsPlumb.cachedDimensions},j=function(a){b.jsPlumbUIComponent.apply(this,arguments),h.apply(this,arguments);var d=this.fire;this.fire=function(){d.apply(this,arguments),this.component&&this.component.fire.apply(this.component,arguments)},this.detached=!1,this.id=a.id,this._jsPlumb.div=null,this._jsPlumb.initialised=!1,this._jsPlumb.component=a.component,this._jsPlumb.cachedDimensions=null,this._jsPlumb.create=a.create,this._jsPlumb.initiallyInvisible=a.visible===!1,this.getElement=function(){if(null==this._jsPlumb.div){var b=this._jsPlumb.div=jsPlumb.getElement(this._jsPlumb.create(this._jsPlumb.component));b.style.position="absolute",b.className=this._jsPlumb.instance.overlayClass+" "+(this.cssClass?this.cssClass:a.cssClass?a.cssClass:""),this._jsPlumb.instance.appendElement(b),this._jsPlumb.instance.getId(b),this.canvas=b;var c="translate(-50%, -50%)";b.style.webkitTransform=c,b.style.mozTransform=c,b.style.msTransform=c,b.style.oTransform=c,b.style.transform=c,b._jsPlumb=this,a.visible===!1&&(b.style.display="none")}return this._jsPlumb.div},this.draw=function(a,b,d){var e=i(this);if(null!=e&&2==e.length){var f={x:0,y:0};if(d)f={x:d[0],y:d[1]};else if(a.pointOnPath){var g=this.loc,h=!1;(c.isString(this.loc)||this.loc<0||this.loc>1)&&(g=parseInt(this.loc,10),h=!0),f=a.pointOnPath(g,h)}else{var j=this.loc.constructor==Array?this.loc:this.endpointLoc;f={x:j[0]*a.w,y:j[1]*a.h}}var k=f.x-e[0]/2,l=f.y-e[1]/2;return{component:a,d:{minx:k,miny:l,td:e,cxy:f},minX:k,maxX:k+e[0],minY:l,maxY:l+e[1]}}return{minX:0,maxX:0,minY:0,maxY:0}}};c.extend(j,[b.jsPlumbUIComponent,h],{getDimensions:function(){return[1,1]},setVisible:function(a){this._jsPlumb.div&&(this._jsPlumb.div.style.display=a?"block":"none",a&&this._jsPlumb.initiallyInvisible&&(i(this,!0),this.component.repaint(),this._jsPlumb.initiallyInvisible=!1))},clearCachedDimensions:function(){this._jsPlumb.cachedDimensions=null},cleanup:function(a){a?null!=this._jsPlumb.div&&(this._jsPlumb.div._jsPlumb=null,this._jsPlumb.instance.removeElement(this._jsPlumb.div)):(this._jsPlumb&&this._jsPlumb.div&&this._jsPlumb.div.parentNode&&this._jsPlumb.div.parentNode.removeChild(this._jsPlumb.div),this.detached=!0)},reattach:function(a){null!=this._jsPlumb.div&&a.getContainer().appendChild(this._jsPlumb.div),this.detached=!1},computeMaxSize:function(){var a=i(this);return Math.max(a[0],a[1])},paint:function(a){this._jsPlumb.initialised||(this.getElement(),a.component.appendDisplayElement(this._jsPlumb.div),this._jsPlumb.initialised=!0,this.detached&&this._jsPlumb.div.parentNode.removeChild(this._jsPlumb.div)),this._jsPlumb.div.style.left=a.component.x+a.d.minx+"px",this._jsPlumb.div.style.top=a.component.y+a.d.miny+"px"}}),b.Overlays.Custom=function(){this.type="Custom",j.apply(this,arguments)},c.extend(b.Overlays.Custom,j),b.Overlays.GuideLines=function(){var a=this;a.length=50,a.lineWidth=5,this.type="GuideLines",h.apply(this,arguments),b.jsPlumbUIComponent.apply(this,arguments),this.draw=function(b){var c=b.pointAlongPathFrom(a.loc,a.length/2),e=b.pointOnPath(a.loc),f=d.pointOnLine(c,e,a.length),g=d.perpendicularLineTo(c,f,40),h=d.perpendicularLineTo(f,c,20);return{connector:b,head:c,tail:f,headLine:h,tailLine:g,minX:Math.min(c.x,f.x,h[0].x,h[1].x),minY:Math.min(c.y,f.y,h[0].y,h[1].y),maxX:Math.max(c.x,f.x,h[0].x,h[1].x),maxY:Math.max(c.y,f.y,h[0].y,h[1].y)}}},b.Overlays.Label=function(a){this.labelStyle=a.labelStyle,this.cssClass=null!=this.labelStyle?this.labelStyle.cssClass:null;var c=b.extend({create:function(){return jsPlumb.createElement("div")}},a);if(b.Overlays.Custom.call(this,c),this.type="Label",this.label=a.label||"",this.labelText=null,this.labelStyle){var d=this.getElement();if(this.labelStyle.font=this.labelStyle.font||"12px sans-serif",d.style.font=this.labelStyle.font,d.style.color=this.labelStyle.color||"black",this.labelStyle.fillStyle&&(d.style.background=this.labelStyle.fillStyle),this.labelStyle.borderWidth>0){var e=this.labelStyle.borderStyle?this.labelStyle.borderStyle:"black";d.style.border=this.labelStyle.borderWidth+"px solid "+e}this.labelStyle.padding&&(d.style.padding=this.labelStyle.padding) +}},c.extend(b.Overlays.Label,b.Overlays.Custom,{cleanup:function(a){a&&(this.div=null,this.label=null,this.labelText=null,this.cssClass=null,this.labelStyle=null)},getLabel:function(){return this.label},setLabel:function(a){this.label=a,this.labelText=null,this.clearCachedDimensions(),this.update(),this.component.repaint()},getDimensions:function(){return this.update(),j.prototype.getDimensions.apply(this,arguments)},update:function(){if("function"==typeof this.label){var a=this.label(this);this.getElement().innerHTML=a.replace(/\r\n/g,"<br/>")}else null==this.labelText&&(this.labelText=this.label,this.getElement().innerHTML=this.labelText.replace(/\r\n/g,"<br/>"))},updateFrom:function(a){a.label&&this.setLabel(a.label)}})}.call(this),function(){"use strict";var a=this,b=a.jsPlumb,c=function(b){var c=b._mottle;return c||(c=b._mottle=new a.Mottle),c};b.extend(a.jsPlumbInstance.prototype,{getEventManager:function(){return c(this)},on:function(){return this.getEventManager().on.apply(this,arguments),this},off:function(){return this.getEventManager().off.apply(this,arguments),this}})}.call(this),function(){"use strict";var a=this,b=a.jsPlumb,c=a.jsPlumbUtil,d=function(a){this.type="Flowchart",a=a||{},a.stub=null==a.stub?30:a.stub;var c,d,e=b.Connectors.AbstractConnector.apply(this,arguments),f=null==a.midpoint?.5:a.midpoint,g=a.alwaysRespectStubs===!0,h=null,i=null,j=null!=a.cornerRadius?a.cornerRadius:0,k=(a.loopbackRadius||25,function(a){return 0>a?-1:0===a?0:1}),l=function(a,b,c,d){if(h!=b||i!=c){var e=null==h?d.sx:h,f=null==i?d.sy:i,g=e==b?"v":"h",j=k(b-e),l=k(c-f);h=b,i=c,a.push([e,f,b,c,g,j,l])}},m=function(a){return Math.sqrt(Math.pow(a[0]-a[2],2)+Math.pow(a[1]-a[3],2))},n=function(a){var b=[];return b.push.apply(b,a),b},o=function(a,b,c){for(var d,f=null,g=0;g<b.length-1;g++){if(f=f||n(b[g]),d=n(b[g+1]),j>0&&f[4]!=d[4]){var h=Math.min(j,m(f),m(d));f[2]-=f[5]*h,f[3]-=f[6]*h,d[0]+=d[5]*h,d[1]+=d[6]*h;var i=f[6]==d[5]&&1==d[5]||f[6]==d[5]&&0===d[5]&&f[5]!=d[6]||f[6]==d[5]&&-1==d[5],k=d[1]>f[3]?1:-1,l=d[0]>f[2]?1:-1,o=k==l,p=o&&i||!o&&!i?d[0]:f[2],q=o&&i||!o&&!i?f[3]:d[1];e.addSegment(a,"Straight",{x1:f[0],y1:f[1],x2:f[2],y2:f[3]}),e.addSegment(a,"Arc",{r:h,x1:f[2],y1:f[3],x2:d[0],y2:d[1],cx:p,cy:q,ac:i})}else{var r=f[2]==f[0]?0:f[2]>f[0]?c.lw/2:-(c.lw/2),s=f[3]==f[1]?0:f[3]>f[1]?c.lw/2:-(c.lw/2);e.addSegment(a,"Straight",{x1:f[0]-r,y1:f[1]-s,x2:f[2]+r,y2:f[3]+s})}f=d}null!=d&&e.addSegment(a,"Straight",{x1:d[0],y1:d[1],x2:d[2],y2:d[3]})};this._compute=function(a,b){c=[],h=null,i=null,d=null;var j=function(){return[a.startStubX,a.startStubY,a.endStubX,a.endStubY]},k={perpendicular:j,orthogonal:j,opposite:function(b){var c=a,d="x"==b?0:1,e={x:function(){return 1==c.so[d]&&(c.startStubX>c.endStubX&&c.tx>c.startStubX||c.sx>c.endStubX&&c.tx>c.sx)||-1==c.so[d]&&(c.startStubX<c.endStubX&&c.tx<c.startStubX||c.sx<c.endStubX&&c.tx<c.sx)},y:function(){return 1==c.so[d]&&(c.startStubY>c.endStubY&&c.ty>c.startStubY||c.sy>c.endStubY&&c.ty>c.sy)||-1==c.so[d]&&(c.startStubY<c.endStubY&&c.ty<c.startStubY||c.sy<c.endStubY&&c.ty<c.sy)}};return!g&&e[b]()?{x:[(a.sx+a.tx)/2,a.startStubY,(a.sx+a.tx)/2,a.endStubY],y:[a.startStubX,(a.sy+a.ty)/2,a.endStubX,(a.sy+a.ty)/2]}[b]:[a.startStubX,a.startStubY,a.endStubX,a.endStubY]}},m=k[a.anchorOrientation](a.sourceAxis),n="x"==a.sourceAxis?0:1,p="x"==a.sourceAxis?1:0,q=m[n],r=m[p],s=m[n+2],t=m[p+2];l(c,m[0],m[1],a);var u=a.startStubX+(a.endStubX-a.startStubX)*f,v=a.startStubY+(a.endStubY-a.startStubY)*f,w={x:[0,1],y:[1,0]},x={perpendicular:function(b){var c=a,d={x:[[[1,2,3,4],null,[2,1,4,3]],null,[[4,3,2,1],null,[3,4,1,2]]],y:[[[3,2,1,4],null,[2,3,4,1]],null,[[4,1,2,3],null,[1,4,3,2]]]},e={x:[[c.startStubX,c.endStubX],null,[c.endStubX,c.startStubX]],y:[[c.startStubY,c.endStubY],null,[c.endStubY,c.startStubY]]},f={x:[[u,c.startStubY],[u,c.endStubY]],y:[[c.startStubX,v],[c.endStubX,v]]},g={x:[[c.endStubX,c.startStubY]],y:[[c.startStubX,c.endStubY]]},h={x:[[c.startStubX,c.endStubY],[c.endStubX,c.endStubY]],y:[[c.endStubX,c.startStubY],[c.endStubX,c.endStubY]]},i={x:[[c.startStubX,v],[c.endStubX,v],[c.endStubX,c.endStubY]],y:[[u,c.startStubY],[u,c.endStubY],[c.endStubX,c.endStubY]]},j={x:[c.startStubY,c.endStubY],y:[c.startStubX,c.endStubX]},k=w[b][0],l=w[b][1],m=c.so[k]+1,n=c.to[l]+1,o=-1==c.to[l]&&j[b][1]<j[b][0]||1==c.to[l]&&j[b][1]>j[b][0],p=e[b][m][0],q=e[b][m][1],r=d[b][m][n];return c.segment==r[3]||c.segment==r[2]&&o?f[b]:c.segment==r[2]&&p>q?g[b]:c.segment==r[2]&&q>=p||c.segment==r[1]&&!o?i[b]:c.segment==r[0]||c.segment==r[1]&&o?h[b]:void 0},orthogonal:function(b,c,d,e,f){var g=a,h={x:-1==g.so[0]?Math.min(c,e):Math.max(c,e),y:-1==g.so[1]?Math.min(c,e):Math.max(c,e)}[b];return{x:[[h,d],[h,f],[e,f]],y:[[d,h],[f,h],[f,e]]}[b]},opposite:function(c,d,f,g){var h=a,i={x:"y",y:"x"}[c],j={x:"height",y:"width"}[c],k=h["is"+c.toUpperCase()+"GreaterThanStubTimes2"];if(b.sourceEndpoint.elementId==b.targetEndpoint.elementId){var l=f+(1-b.sourceEndpoint.anchor[i])*b.sourceInfo[j]+e.maxStub;return{x:[[d,l],[g,l]],y:[[l,d],[l,g]]}[c]}return!k||1==h.so[n]&&d>g||-1==h.so[n]&&g>d?{x:[[d,v],[g,v]],y:[[u,d],[u,g]]}[c]:1==h.so[n]&&g>d||-1==h.so[n]&&d>g?{x:[[u,h.sy],[u,h.ty]],y:[[h.sx,v],[h.tx,v]]}[c]:void 0}},y=x[a.anchorOrientation](a.sourceAxis,q,r,s,t);if(y)for(var z=0;z<y.length;z++)l(c,y[z][0],y[z][1],a);l(c,m[2],m[3],a),l(c,a.tx,a.ty,a),o(this,c,a)}};c.extend(d,b.Connectors.AbstractConnector),b.registerConnectorType(d,"Flowchart")}.call(this),function(){"use strict";var a=this,b=a.jsPlumb,c=a.jsPlumbUtil;b.Connectors.AbstractBezierConnector=function(a){a=a||{};var c,d=a.showLoopback!==!1,e=(a.curviness||10,a.margin||5),f=(a.proximityLimit||80,a.orientation&&"clockwise"===a.orientation),g=a.loopbackRadius||25,h=!1;return this.overrideSetEditable=function(){return!h},this._compute=function(a,b){var i=b.sourcePos,j=b.targetPos,k=Math.abs(i[0]-j[0]),l=Math.abs(i[1]-j[1]);if(d&&b.sourceEndpoint.elementId===b.targetEndpoint.elementId){h=!0;var m=b.sourcePos[0],n=b.sourcePos[1]-e,o=m,p=n-g,q=o-g,r=p-g;k=2*g,l=2*g,a.points[0]=q,a.points[1]=r,a.points[2]=k,a.points[3]=l,c.addSegment(this,"Arc",{loopback:!0,x1:m-q+4,y1:n-r,startAngle:0,endAngle:2*Math.PI,r:g,ac:!f,x2:m-q-4,y2:n-r,cx:o-q,cy:p-r})}else h=!1,this._computeBezier(a,b,i,j,k,l)},c=b.Connectors.AbstractConnector.apply(this,arguments)},c.extend(b.Connectors.AbstractBezierConnector,b.Connectors.AbstractConnector);var d=function(a){a=a||{},this.type="Bezier";var c=b.Connectors.AbstractBezierConnector.apply(this,arguments),d=a.curviness||150,e=10;this.getCurviness=function(){return d},this._findControlPoint=function(a,b,c,f,g,h,i){var j=h[0]!=i[0]||h[1]==i[1],k=[];return j?(0===i[0]?k.push(c[0]<b[0]?a[0]+e:a[0]-e):k.push(a[0]+d*i[0]),0===i[1]?k.push(c[1]<b[1]?a[1]+e:a[1]-e):k.push(a[1]+d*h[1])):(0===h[0]?k.push(b[0]<c[0]?a[0]+e:a[0]-e):k.push(a[0]-d*h[0]),0===h[1]?k.push(b[1]<c[1]?a[1]+e:a[1]-e):k.push(a[1]+d*i[1])),k},this._computeBezier=function(a,b,d,e,f,g){var h,i,j=this.getGeometry(),k=d[0]<e[0]?f:0,l=d[1]<e[1]?g:0,m=d[0]<e[0]?0:f,n=d[1]<e[1]?0:g;(this.hasBeenEdited()||this.isEditing())&&null!=j&&null!=j.controlPoints&&null!=j.controlPoints[0]&&null!=j.controlPoints[1]?(h=j.controlPoints[0],i=j.controlPoints[1]):(h=this._findControlPoint([k,l],d,e,b.sourceEndpoint,b.targetEndpoint,a.so,a.to),i=this._findControlPoint([m,n],e,d,b.targetEndpoint,b.sourceEndpoint,a.to,a.so)),c.setGeometry({controlPoints:[h,i]},!0),c.addSegment(this,"Bezier",{x1:k,y1:l,x2:m,y2:n,cp1x:h[0],cp1y:h[1],cp2x:i[0],cp2y:i[1]})}};c.extend(d,b.Connectors.AbstractBezierConnector),b.registerConnectorType(d,"Bezier")}.call(this),function(){"use strict";var a=this,b=a.jsPlumb,c=a.jsPlumbUtil,d=function(a,b,c,d){return c>=a&&b>=d?1:c>=a&&d>=b?2:a>=c&&d>=b?3:4},e=function(a,b,c,d,e,f,g,h,i){return i>=h?[a,b]:1===c?d[3]<=0&&e[3]>=1?[a+(d[2]<.5?-1*f:f),b]:d[2]>=1&&e[2]<=0?[a,b+(d[3]<.5?-1*g:g)]:[a+-1*f,b+-1*g]:2===c?d[3]>=1&&e[3]<=0?[a+(d[2]<.5?-1*f:f),b]:d[2]>=1&&e[2]<=0?[a,b+(d[3]<.5?-1*g:g)]:[a+f,b+-1*g]:3===c?d[3]>=1&&e[3]<=0?[a+(d[2]<.5?-1*f:f),b]:d[2]<=0&&e[2]>=1?[a,b+(d[3]<.5?-1*g:g)]:[a+-1*f,b+-1*g]:4===c?d[3]<=0&&e[3]>=1?[a+(d[2]<.5?-1*f:f),b]:d[2]<=0&&e[2]>=1?[a,b+(d[3]<.5?-1*g:g)]:[a+f,b+-1*g]:void 0},f=function(a){a=a||{},this.type="StateMachine";var c,f=b.Connectors.AbstractBezierConnector.apply(this,arguments),g=a.curviness||10,h=a.margin||5,i=a.proximityLimit||80;a.orientation&&"clockwise"===a.orientation,this._computeBezier=function(a,b,j,k,l,m){var n=b.sourcePos[0]<b.targetPos[0]?0:l,o=b.sourcePos[1]<b.targetPos[1]?0:m,p=b.sourcePos[0]<b.targetPos[0]?l:0,q=b.sourcePos[1]<b.targetPos[1]?m:0;0===b.sourcePos[2]&&(n-=h),1===b.sourcePos[2]&&(n+=h),0===b.sourcePos[3]&&(o-=h),1===b.sourcePos[3]&&(o+=h),0===b.targetPos[2]&&(p-=h),1===b.targetPos[2]&&(p+=h),0===b.targetPos[3]&&(q-=h),1===b.targetPos[3]&&(q+=h);var r,s,t,u,v=(n+p)/2,w=(o+q)/2,x=d(n,o,p,q),y=Math.sqrt(Math.pow(p-n,2)+Math.pow(q-o,2)),z=f.getGeometry();(this.hasBeenEdited()||this.isEditing())&&null!=z?(r=z.controlPoints[0][0],t=z.controlPoints[0][1],s=z.controlPoints[1][0],u=z.controlPoints[1][1]):(c=e(v,w,x,b.sourcePos,b.targetPos,g,g,y,i),r=c[0],s=c[0],t=c[1],u=c[1],f.setGeometry({controlPoints:[c,c]},!0)),f.addSegment(this,"Bezier",{x1:p,y1:q,x2:n,y2:o,cp1x:r,cp1y:t,cp2x:s,cp2y:u})}};c.extend(f,b.Connectors.AbstractBezierConnector),b.registerConnectorType(f,"StateMachine")}.call(this),function(){"use strict";var a=this,b=a.jsPlumb,c=a.jsPlumbUtil,d={"stroke-linejoin":"stroke-linejoin","stroke-dashoffset":"stroke-dashoffset","stroke-linecap":"stroke-linecap"},e="stroke-dasharray",f="dashstyle",g="linearGradient",h="radialGradient",i="defs",j="fill",k="stop",l="stroke",m="stroke-width",n="style",o="none",p="jsplumb_gradient_",q="lineWidth",r={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml"},s=function(a,b){for(var c in b)a.setAttribute(c,""+b[c])},t=function(a,b){return b=b||{},b.version="1.1",b.xmlns=r.xhtml,jsPlumb.createElementNS(r.svg,a,null,null,b)},u=function(a){return"position:absolute;left:"+a[0]+"px;top:"+a[1]+"px"},v=function(a){for(var b=a.querySelectorAll(" defs,linearGradient,radialGradient"),c=0;c<b.length;c++)b[c].parentNode.removeChild(b[c])},w=function(a,b,c,d,e){var f=p+e._jsPlumb.instance.idstamp();v(a);var m;m=c.gradient.offset?t(h,{id:f}):t(g,{id:f,gradientUnits:"userSpaceOnUse"});var n=t(i);a.appendChild(n),n.appendChild(m);for(var o=0;o<c.gradient.stops.length;o++){var q=1==e.segment||2==e.segment?o:c.gradient.stops.length-1-o,r=c.gradient.stops[q][1],s=t(k,{offset:Math.floor(100*c.gradient.stops[o][0])+"%","stop-color":r});m.appendChild(s)}var u=c.strokeStyle?l:j;b.setAttribute(u,"url(#"+f+")")},x=function(a,b,c,g,h){if(b.setAttribute(j,c.fillStyle?c.fillStyle:o),b.setAttribute(l,c.strokeStyle?c.strokeStyle:o),c.gradient?w(a,b,c,g,h):(v(a),b.setAttribute(n,"")),c.lineWidth&&b.setAttribute(m,c.lineWidth),c[f]&&c[q]&&!c[e]){var i=-1==c[f].indexOf(",")?" ":",",k=c[f].split(i),p="";k.forEach(function(a){p+=Math.floor(a*c.lineWidth)+i}),b.setAttribute(e,p)}else c[e]&&b.setAttribute(e,c[e]);for(var r in d)c[r]&&b.setAttribute(d[r],c[r])},y=function(a,b,c){a.childNodes.length>c?a.insertBefore(b,a.childNodes[c]):a.appendChild(b)};c.svg={node:t,attr:s,pos:u};var z=function(a){var d=a.pointerEventsSpec||"all",e={};b.jsPlumbUIComponent.apply(this,a.originalArgs),this.canvas=null,this.path=null,this.svg=null,this.bgCanvas=null;var f=a.cssClass+" "+(a.originalArgs[0].cssClass||""),g={style:"",width:0,height:0,"pointer-events":d,position:"absolute"};this.svg=t("svg",g),a.useDivWrapper?(this.canvas=jsPlumb.createElement("div",{position:"absolute"}),c.sizeElement(this.canvas,0,0,1,1),this.canvas.className=f):(s(this.svg,{"class":f}),this.canvas=this.svg),a._jsPlumb.appendElement(this.canvas,a.originalArgs[0].parent),a.useDivWrapper&&this.canvas.appendChild(this.svg);var h=[this.canvas];return this.getDisplayElements=function(){return h},this.appendDisplayElement=function(a){h.push(a)},this.paint=function(b,d,f){if(null!=b){var g,h=[this.x,this.y],i=[this.w,this.h];null!=f&&(f.xmin<0&&(h[0]+=f.xmin),f.ymin<0&&(h[1]+=f.ymin),i[0]=f.xmax+(f.xmin<0?-f.xmin:0),i[1]=f.ymax+(f.ymin<0?-f.ymin:0)),a.useDivWrapper?(c.sizeElement(this.canvas,h[0],h[1],i[0],i[1]),h[0]=0,h[1]=0,g=u([0,0])):g=u([h[0],h[1]]),e.paint.apply(this,arguments),s(this.svg,{style:g,width:i[0]||0,height:i[1]||0})}},{renderer:e}};c.extend(z,b.jsPlumbUIComponent,{cleanup:function(a){a||null==this.typeId?(this.canvas&&(this.canvas._jsPlumb=null),this.svg&&(this.svg._jsPlumb=null),this.bgCanvas&&(this.bgCanvas._jsPlumb=null),this.canvas&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.bgCanvas&&this.bgCanvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.svg=null,this.canvas=null,this.path=null,this.group=null):(this.canvas&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.bgCanvas&&this.bgCanvas.parentNode&&this.bgCanvas.parentNode.removeChild(this.bgCanvas))},reattach:function(a){var b=a.getContainer();this.canvas&&null==this.canvas.parentNode&&b.appendChild(this.canvas),this.bgCanvas&&null==this.bgCanvas.parentNode&&b.appendChild(this.bgCanvas)},setVisible:function(a){this.canvas&&(this.canvas.style.display=a?"block":"none")}}),b.ConnectorRenderers.svg=function(a){var c=this,d=z.apply(this,[{cssClass:a._jsPlumb.connectorClass+(this.isEditable()?" "+a._jsPlumb.editableConnectorClass:""),originalArgs:arguments,pointerEventsSpec:"none",_jsPlumb:a._jsPlumb}]),e=this.setEditable;this.setEditable=function(a){var b=e.apply(this,[a]);jsPlumb[b?"addClass":"removeClass"](this.canvas,this._jsPlumb.instance.editableConnectorClass)},d.renderer.paint=function(d,e,f){var g=c.getSegments(),h="",i=[0,0];if(f.xmin<0&&(i[0]=-f.xmin),f.ymin<0&&(i[1]=-f.ymin),g.length>0){for(var j=0;j<g.length;j++)h+=b.Segments.svg.SegmentRenderer.getPath(g[j]),h+=" ";var k={d:h,transform:"translate("+i[0]+","+i[1]+")","pointer-events":a["pointer-events"]||"visibleStroke"},l=null,m=[c.x,c.y,c.w,c.h];if(d.outlineColor){var n=d.outlineWidth||1,o=d.lineWidth+2*n;l=b.extend({},d),delete l.gradient,l.strokeStyle=d.outlineColor,l.lineWidth=o,null==c.bgPath?(c.bgPath=t("path",k),b.addClass(c.bgPath,b.connectorOutlineClass),y(c.svg,c.bgPath,0)):s(c.bgPath,k),x(c.svg,c.bgPath,l,m,c)}null==c.path?(c.path=t("path",k),y(c.svg,c.path,d.outlineColor?1:0)):s(c.path,k),x(c.svg,c.path,d,m,c)}}},c.extend(b.ConnectorRenderers.svg,z),b.Segments.svg={SegmentRenderer:{getPath:function(a){return{Straight:function(){var b=a.getCoordinates();return"M "+b.x1+" "+b.y1+" L "+b.x2+" "+b.y2},Bezier:function(){var b=a.params;return"M "+b.x1+" "+b.y1+" C "+b.cp1x+" "+b.cp1y+" "+b.cp2x+" "+b.cp2y+" "+b.x2+" "+b.y2},Arc:function(){var b=a.params,c=a.sweep>Math.PI?1:0,d=a.anticlockwise?0:1;return"M"+a.x1+" "+a.y1+" A "+a.radius+" "+b.r+" 0 "+c+","+d+" "+a.x2+" "+a.y2}}[a.type]()}}};var A=b.SvgEndpoint=function(a){var c=z.apply(this,[{cssClass:a._jsPlumb.endpointClass,originalArgs:arguments,pointerEventsSpec:"all",useDivWrapper:!0,_jsPlumb:a._jsPlumb}]);c.renderer.paint=function(a){var c=b.extend({},a);c.outlineColor&&(c.strokeWidth=c.outlineWidth,c.strokeStyle=c.outlineColor),null==this.node?(this.node=this.makeNode(c),this.svg.appendChild(this.node)):null!=this.updateNode&&this.updateNode(this.node),x(this.svg,this.node,c,[this.x,this.y,this.w,this.h],this),u(this.node,[this.x,this.y])}.bind(this)};c.extend(A,z),b.Endpoints.svg.Dot=function(){b.Endpoints.Dot.apply(this,arguments),A.apply(this,arguments),this.makeNode=function(){return t("circle",{cx:this.w/2,cy:this.h/2,r:this.radius})},this.updateNode=function(a){s(a,{cx:this.w/2,cy:this.h/2,r:this.radius})}},c.extend(b.Endpoints.svg.Dot,[b.Endpoints.Dot,A]),b.Endpoints.svg.Rectangle=function(){b.Endpoints.Rectangle.apply(this,arguments),A.apply(this,arguments),this.makeNode=function(){return t("rect",{width:this.w,height:this.h})},this.updateNode=function(a){s(a,{width:this.w,height:this.h})}},c.extend(b.Endpoints.svg.Rectangle,[b.Endpoints.Rectangle,A]),b.Endpoints.svg.Image=b.Endpoints.Image,b.Endpoints.svg.Blank=b.Endpoints.Blank,b.Overlays.svg.Label=b.Overlays.Label,b.Overlays.svg.Custom=b.Overlays.Custom;var B=function(a,c){a.apply(this,c),b.jsPlumbUIComponent.apply(this,c),this.isAppendedAtTopLevel=!1,this.path=null,this.paint=function(a,b){if(a.component.svg&&b){null==this.path&&(this.path=t("path",{"pointer-events":"all"}),a.component.svg.appendChild(this.path),this.elementCreated&&this.elementCreated(this.path,a.component),this.canvas=a.component.svg);var e=c&&1==c.length?c[0].cssClass||"":"",f=[0,0];b.xmin<0&&(f[0]=-b.xmin),b.ymin<0&&(f[1]=-b.ymin),s(this.path,{d:d(a.d),"class":e,stroke:a.strokeStyle?a.strokeStyle:null,fill:a.fillStyle?a.fillStyle:null,transform:"translate("+f[0]+","+f[1]+")"})}};var d=function(a){return isNaN(a.cxy.x)||isNaN(a.cxy.y)?"":"M"+a.hxy.x+","+a.hxy.y+" L"+a.tail[0].x+","+a.tail[0].y+" L"+a.cxy.x+","+a.cxy.y+" L"+a.tail[1].x+","+a.tail[1].y+" L"+a.hxy.x+","+a.hxy.y};this.transfer=function(a){a.canvas&&this.path&&this.path.parentNode&&(this.path.parentNode.removeChild(this.path),a.canvas.appendChild(this.path))}};c.extend(B,[b.jsPlumbUIComponent,b.Overlays.AbstractOverlay],{cleanup:function(a){null!=this.path&&(a?this._jsPlumb.instance.removeElement(this.path):this.path.parentNode&&this.path.parentNode.removeChild(this.path))},reattach:function(){this.path&&this.canvas&&null==this.path.parentNode&&this.canvas.appendChild(this.path)},setVisible:function(a){null!=this.path&&(this.path.style.display=a?"block":"none")}}),b.Overlays.svg.Arrow=function(){B.apply(this,[b.Overlays.Arrow,arguments])},c.extend(b.Overlays.svg.Arrow,[b.Overlays.Arrow,B]),b.Overlays.svg.PlainArrow=function(){B.apply(this,[b.Overlays.PlainArrow,arguments])},c.extend(b.Overlays.svg.PlainArrow,[b.Overlays.PlainArrow,B]),b.Overlays.svg.Diamond=function(){B.apply(this,[b.Overlays.Diamond,arguments])},c.extend(b.Overlays.svg.Diamond,[b.Overlays.Diamond,B]),b.Overlays.svg.GuideLines=function(){var a,c,d=null,e=this;b.Overlays.GuideLines.apply(this,arguments),this.paint=function(b,g){null==d&&(d=t("path"),b.connector.svg.appendChild(d),e.attachListeners(d,b.connector),e.attachListeners(d,e),a=t("path"),b.connector.svg.appendChild(a),e.attachListeners(a,b.connector),e.attachListeners(a,e),c=t("path"),b.connector.svg.appendChild(c),e.attachListeners(c,b.connector),e.attachListeners(c,e));var h=[0,0];g.xmin<0&&(h[0]=-g.xmin),g.ymin<0&&(h[1]=-g.ymin),s(d,{d:f(b.head,b.tail),stroke:"red",fill:null,transform:"translate("+h[0]+","+h[1]+")"}),s(a,{d:f(b.tailLine[0],b.tailLine[1]),stroke:"blue",fill:null,transform:"translate("+h[0]+","+h[1]+")"}),s(c,{d:f(b.headLine[0],b.headLine[1]),stroke:"green",fill:null,transform:"translate("+h[0]+","+h[1]+")"})};var f=function(a,b){return"M "+a.x+","+a.y+" L"+b.x+","+b.y}},c.extend(b.Overlays.svg.GuideLines,b.Overlays.GuideLines)}.call(this),function(){"use strict";var a=this,b=a.jsPlumb,c=a.jsPlumbUtil,d=a.Katavorio,e=a.Biltong,f=function(a,b){b=b||"main";var c="_katavorio_"+b,f=a[c],g=a.getEventManager();return f||(f=new d({bind:g.on,unbind:g.off,getSize:jsPlumb.getSize,getPosition:function(b){var c=a.getOffset(b,!1,b._katavorioDrag?b.offsetParent:null);return[c.left,c.top]},setPosition:function(a,b){a.style.left=b[0]+"px",a.style.top=b[1]+"px"},addClass:jsPlumb.addClass,removeClass:jsPlumb.removeClass,intersects:e.intersects,indexOf:function(a,b){return a.indexOf(b)},css:{noSelect:a.dragSelectClass,droppable:"jsplumb-droppable",draggable:"jsplumb-draggable",drag:"jsplumb-drag",selected:"jsplumb-drag-selected",active:"jsplumb-drag-active",hover:"jsplumb-drag-hover"}}),a[c]=f,a.bind("zoom",f.setZoom)),f},g=function(a,b){var d=function(d){if(null!=b[d]){if(c.isString(b[d])){var e=b[d].match(/-=/)?-1:1,f=b[d].substring(2);return a[d]+e*f}return b[d]}return a[d]};return[d("left"),d("top")]};b.extend(a.jsPlumbInstance.prototype,{animationSupported:!0,getElement:function(a){return null==a?null:(a="string"==typeof a?a:null!=a.length&&null==a.enctype?a[0]:a,"string"==typeof a?document.getElementById(a):a)},removeElement:function(a){f(this).elementRemoved(a),this.getEventManager().remove(a)},doAnimate:function(a,b,c){c=c||{};var d=this.getOffset(a),e=g(d,b),f=e[0]-d.left,h=e[1]-d.top,i=c.duration||250,j=15,k=i/j,l=j/i*f,m=j/i*h,n=0,o=setInterval(function(){jsPlumb.setPosition(a,{left:d.left+l*(n+1),top:d.top+m*(n+1)}),null!=c.step&&c.step(n,Math.ceil(k)),n++,n>=k&&(window.clearInterval(o),null!=c.complete&&c.complete())},j)},destroyDraggable:function(a,b){f(this,b).destroyDraggable(a)},destroyDroppable:function(a,b){f(this,b).destroyDroppable(a)},initDraggable:function(a,b,c){f(this,c).draggable(a,b)},initDroppable:function(a,b,c){f(this,c).droppable(a,b)},isAlreadyDraggable:function(a){return null!=a._katavorioDrag},isDragSupported:function(){return!0},isDropSupported:function(){return!0},isElementDraggable:function(a){return a=jsPlumb.getElement(a),a._katavorioDrag&&a._katavorioDrag.isEnabled()},getDragObject:function(a){return a[0].drag.getDragElement()},getDragScope:function(a){return a._katavorioDrag&&a._katavorioDrag.scopes.join(" ")||""},getDropEvent:function(a){return a[0].e},getUIPosition:function(a){var b=a[0].el,c={left:a[0].pos[0],top:a[0].pos[1]};if(b._katavorioDrag&&b.offsetParent!==this.getContainer()){var d=this.getOffset(b.offsetParent);c.left+=d.left,c.top+=d.top}return c},setDragFilter:function(a,b,c){a._katavorioDrag&&a._katavorioDrag.setFilter(b,c)},setElementDraggable:function(a,b){a=jsPlumb.getElement(a),a._katavorioDrag&&a._katavorioDrag.setEnabled(b)},setDragScope:function(a,b){a._katavorioDrag&&a._katavorioDrag.k.setDragScope(a,b)},setDropScope:function(a,b){a._katavorioDrop&&a._katavorioDrop.length>0&&a._katavorioDrop[0].k.setDropScope(a,b)},addToPosse:function(a){var b=Array.prototype.slice.call(arguments,1),c=f(this);jsPlumb.each(a,function(a){a=[jsPlumb.getElement(a)],a.push.apply(a,b),c.addToPosse.apply(c,a)})},setPosse:function(a){var b=Array.prototype.slice.call(arguments,1),c=f(this);jsPlumb.each(a,function(a){a=[jsPlumb.getElement(a)],a.push.apply(a,b),c.setPosse.apply(c,a)})},removeFromPosse:function(a){var b=Array.prototype.slice.call(arguments,1),c=f(this);jsPlumb.each(a,function(a){a=[jsPlumb.getElement(a)],a.push.apply(a,b),c.removeFromPosse.apply(c,a)})},removeFromAllPosses:function(a){var b=f(this);jsPlumb.each(a,function(a){b.removeFromAllPosses(jsPlumb.getElement(a))})},setPosseState:function(a,b,c){var d=f(this);jsPlumb.each(a,function(a){d.setPosseState(jsPlumb.getElement(a),b,c)})},dragEvents:{start:"start",stop:"stop",drag:"drag",step:"step",over:"over",out:"out",drop:"drop",complete:"complete",beforeStart:"beforeStart"},animEvents:{step:"step",complete:"complete"},stopDrag:function(a){a._katavorioDrag&&a._katavorioDrag.abort()},addToDragSelection:function(a){f(this).select(a)},removeFromDragSelection:function(a){f(this).deselect(a)},clearDragSelection:function(){f(this).deselectAll()},trigger:function(a,b,c,d){this.getEventManager().trigger(a,b,c,d)},doReset:function(){for(var a in this)0===a.indexOf("_katavorio_")&&this[a].reset()}});var h=function(a){var b=function(){/complete|loaded|interactive/.test(document.readyState)&&"undefined"!=typeof document.body&&null!=document.body?a():setTimeout(b,9)};b()};h(b.init)}.call(this); \ No newline at end of file diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/jsplumb/jsplumb-2.0.7.js b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/jsplumb/jsplumb-2.0.7.js new file mode 100644 index 0000000000000000000000000000000000000000..7c8a01802f5da754667c444ffb00951e9fa4cfb0 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/static/js/jsplumb/jsplumb-2.0.7.js @@ -0,0 +1,12733 @@ +/** + * jsBezier-0.7 + * + * Copyright (c) 2010 - 2015 jsPlumb (hello@jsplumbtoolkit.com) + * + * licensed under the MIT license. + * + * a set of Bezier curve functions that deal with Beziers, used by jsPlumb, and perhaps useful for other people. These functions work with Bezier + * curves of arbitrary degree. + * + * - functions are all in the 'jsBezier' namespace. + * + * - all input points should be in the format {x:.., y:..}. all output points are in this format too. + * + * - all input curves should be in the format [ {x:.., y:..}, {x:.., y:..}, {x:.., y:..}, {x:.., y:..} ] + * + * - 'location' as used as an input here refers to a decimal in the range 0-1 inclusive, which indicates a point some proportion along the length + * of the curve. location as output has the same format and meaning. + * + * + * Function List: + * -------------- + * + * distanceFromCurve(point, curve) + * + * Calculates the distance that the given point lies from the given Bezier. Note that it is computed relative to the center of the Bezier, + * so if you have stroked the curve with a wide pen you may wish to take that into account! The distance returned is relative to the values + * of the curve and the point - it will most likely be pixels. + * + * gradientAtPoint(curve, location) + * + * Calculates the gradient to the curve at the given location, as a decimal between 0 and 1 inclusive. + * + * gradientAtPointAlongCurveFrom (curve, location) + * + * Calculates the gradient at the point on the given curve that is 'distance' units from location. + * + * nearestPointOnCurve(point, curve) + * + * Calculates the nearest point to the given point on the given curve. The return value of this is a JS object literal, containing both the + *point's coordinates and also the 'location' of the point (see above), for example: { point:{x:551,y:150}, location:0.263365 }. + * + * pointOnCurve(curve, location) + * + * Calculates the coordinates of the point on the given Bezier curve at the given location. + * + * pointAlongCurveFrom(curve, location, distance) + * + * Calculates the coordinates of the point on the given curve that is 'distance' units from location. 'distance' should be in the same coordinate + * space as that used to construct the Bezier curve. For an HTML Canvas usage, for example, distance would be a measure of pixels. + * + * locationAlongCurveFrom(curve, location, distance) + * + * Calculates the location on the given curve that is 'distance' units from location. 'distance' should be in the same coordinate + * space as that used to construct the Bezier curve. For an HTML Canvas usage, for example, distance would be a measure of pixels. + * + * perpendicularToCurveAt(curve, location, length, distance) + * + * Calculates the perpendicular to the given curve at the given location. length is the length of the line you wish for (it will be centered + * on the point at 'location'). distance is optional, and allows you to specify a point along the path from the given location as the center of + * the perpendicular returned. The return value of this is an array of two points: [ {x:...,y:...}, {x:...,y:...} ]. + * + * + */ + +(function() { + + var root = this; + + if(typeof Math.sgn == "undefined") { + Math.sgn = function(x) { return x == 0 ? 0 : x > 0 ? 1 :-1; }; + } + + var Vectors = { + subtract : function(v1, v2) { return {x:v1.x - v2.x, y:v1.y - v2.y }; }, + dotProduct : function(v1, v2) { return (v1.x * v2.x) + (v1.y * v2.y); }, + square : function(v) { return Math.sqrt((v.x * v.x) + (v.y * v.y)); }, + scale : function(v, s) { return {x:v.x * s, y:v.y * s }; } + }, + + maxRecursion = 64, + flatnessTolerance = Math.pow(2.0,-maxRecursion-1); + + /** + * Calculates the distance that the point lies from the curve. + * + * @param point a point in the form {x:567, y:3342} + * @param curve a Bezier curve in the form [{x:..., y:...}, {x:..., y:...}, {x:..., y:...}, {x:..., y:...}]. note that this is currently + * hardcoded to assume cubiz beziers, but would be better off supporting any degree. + * @return a JS object literal containing location and distance, for example: {location:0.35, distance:10}. Location is analogous to the location + * argument you pass to the pointOnPath function: it is a ratio of distance travelled along the curve. Distance is the distance in pixels from + * the point to the curve. + */ + var _distanceFromCurve = function(point, curve) { + var candidates = [], + w = _convertToBezier(point, curve), + degree = curve.length - 1, higherDegree = (2 * degree) - 1, + numSolutions = _findRoots(w, higherDegree, candidates, 0), + v = Vectors.subtract(point, curve[0]), dist = Vectors.square(v), t = 0.0; + + for (var i = 0; i < numSolutions; i++) { + v = Vectors.subtract(point, _bezier(curve, degree, candidates[i], null, null)); + var newDist = Vectors.square(v); + if (newDist < dist) { + dist = newDist; + t = candidates[i]; + } + } + v = Vectors.subtract(point, curve[degree]); + newDist = Vectors.square(v); + if (newDist < dist) { + dist = newDist; + t = 1.0; + } + return {location:t, distance:dist}; + }; + /** + * finds the nearest point on the curve to the given point. + */ + var _nearestPointOnCurve = function(point, curve) { + var td = _distanceFromCurve(point, curve); + return {point:_bezier(curve, curve.length - 1, td.location, null, null), location:td.location}; + }; + var _convertToBezier = function(point, curve) { + var degree = curve.length - 1, higherDegree = (2 * degree) - 1, + c = [], d = [], cdTable = [], w = [], + z = [ [1.0, 0.6, 0.3, 0.1], [0.4, 0.6, 0.6, 0.4], [0.1, 0.3, 0.6, 1.0] ]; + + for (var i = 0; i <= degree; i++) c[i] = Vectors.subtract(curve[i], point); + for (var i = 0; i <= degree - 1; i++) { + d[i] = Vectors.subtract(curve[i+1], curve[i]); + d[i] = Vectors.scale(d[i], 3.0); + } + for (var row = 0; row <= degree - 1; row++) { + for (var column = 0; column <= degree; column++) { + if (!cdTable[row]) cdTable[row] = []; + cdTable[row][column] = Vectors.dotProduct(d[row], c[column]); + } + } + for (i = 0; i <= higherDegree; i++) { + if (!w[i]) w[i] = []; + w[i].y = 0.0; + w[i].x = parseFloat(i) / higherDegree; + } + var n = degree, m = degree-1; + for (var k = 0; k <= n + m; k++) { + var lb = Math.max(0, k - m), + ub = Math.min(k, n); + for (i = lb; i <= ub; i++) { + j = k - i; + w[i+j].y += cdTable[j][i] * z[j][i]; + } + } + return w; + }; + /** + * counts how many roots there are. + */ + var _findRoots = function(w, degree, t, depth) { + var left = [], right = [], + left_count, right_count, + left_t = [], right_t = []; + + switch (_getCrossingCount(w, degree)) { + case 0 : { + return 0; + } + case 1 : { + if (depth >= maxRecursion) { + t[0] = (w[0].x + w[degree].x) / 2.0; + return 1; + } + if (_isFlatEnough(w, degree)) { + t[0] = _computeXIntercept(w, degree); + return 1; + } + break; + } + } + _bezier(w, degree, 0.5, left, right); + left_count = _findRoots(left, degree, left_t, depth+1); + right_count = _findRoots(right, degree, right_t, depth+1); + for (var i = 0; i < left_count; i++) t[i] = left_t[i]; + for (var i = 0; i < right_count; i++) t[i+left_count] = right_t[i]; + return (left_count+right_count); + }; + var _getCrossingCount = function(curve, degree) { + var n_crossings = 0, sign, old_sign; + sign = old_sign = Math.sgn(curve[0].y); + for (var i = 1; i <= degree; i++) { + sign = Math.sgn(curve[i].y); + if (sign != old_sign) n_crossings++; + old_sign = sign; + } + return n_crossings; + }; + var _isFlatEnough = function(curve, degree) { + var error, + intercept_1, intercept_2, left_intercept, right_intercept, + a, b, c, det, dInv, a1, b1, c1, a2, b2, c2; + a = curve[0].y - curve[degree].y; + b = curve[degree].x - curve[0].x; + c = curve[0].x * curve[degree].y - curve[degree].x * curve[0].y; + + var max_distance_above = max_distance_below = 0.0; + + for (var i = 1; i < degree; i++) { + var value = a * curve[i].x + b * curve[i].y + c; + if (value > max_distance_above) + max_distance_above = value; + else if (value < max_distance_below) + max_distance_below = value; + } + + a1 = 0.0; b1 = 1.0; c1 = 0.0; a2 = a; b2 = b; + c2 = c - max_distance_above; + det = a1 * b2 - a2 * b1; + dInv = 1.0/det; + intercept_1 = (b1 * c2 - b2 * c1) * dInv; + a2 = a; b2 = b; c2 = c - max_distance_below; + det = a1 * b2 - a2 * b1; + dInv = 1.0/det; + intercept_2 = (b1 * c2 - b2 * c1) * dInv; + left_intercept = Math.min(intercept_1, intercept_2); + right_intercept = Math.max(intercept_1, intercept_2); + error = right_intercept - left_intercept; + return (error < flatnessTolerance)? 1 : 0; + }; + var _computeXIntercept = function(curve, degree) { + var XLK = 1.0, YLK = 0.0, + XNM = curve[degree].x - curve[0].x, YNM = curve[degree].y - curve[0].y, + XMK = curve[0].x - 0.0, YMK = curve[0].y - 0.0, + det = XNM*YLK - YNM*XLK, detInv = 1.0/det, + S = (XNM*YMK - YNM*XMK) * detInv; + return 0.0 + XLK * S; + }; + var _bezier = function(curve, degree, t, left, right) { + var temp = [[]]; + for (var j =0; j <= degree; j++) temp[0][j] = curve[j]; + for (var i = 1; i <= degree; i++) { + for (var j =0 ; j <= degree - i; j++) { + if (!temp[i]) temp[i] = []; + if (!temp[i][j]) temp[i][j] = {}; + temp[i][j].x = (1.0 - t) * temp[i-1][j].x + t * temp[i-1][j+1].x; + temp[i][j].y = (1.0 - t) * temp[i-1][j].y + t * temp[i-1][j+1].y; + } + } + if (left != null) + for (j = 0; j <= degree; j++) left[j] = temp[j][0]; + if (right != null) + for (j = 0; j <= degree; j++) right[j] = temp[degree-j][j]; + + return (temp[degree][0]); + }; + + var _curveFunctionCache = {}; + var _getCurveFunctions = function(order) { + var fns = _curveFunctionCache[order]; + if (!fns) { + fns = []; + var f_term = function() { return function(t) { return Math.pow(t, order); }; }, + l_term = function() { return function(t) { return Math.pow((1-t), order); }; }, + c_term = function(c) { return function(t) { return c; }; }, + t_term = function() { return function(t) { return t; }; }, + one_minus_t_term = function() { return function(t) { return 1-t; }; }, + _termFunc = function(terms) { + return function(t) { + var p = 1; + for (var i = 0; i < terms.length; i++) p = p * terms[i](t); + return p; + }; + }; + + fns.push(new f_term()); // first is t to the power of the curve order + for (var i = 1; i < order; i++) { + var terms = [new c_term(order)]; + for (var j = 0 ; j < (order - i); j++) terms.push(new t_term()); + for (var j = 0 ; j < i; j++) terms.push(new one_minus_t_term()); + fns.push(new _termFunc(terms)); + } + fns.push(new l_term()); // last is (1-t) to the power of the curve order + + _curveFunctionCache[order] = fns; + } + + return fns; + }; + + + /** + * calculates a point on the curve, for a Bezier of arbitrary order. + * @param curve an array of control points, eg [{x:10,y:20}, {x:50,y:50}, {x:100,y:100}, {x:120,y:100}]. For a cubic bezier this should have four points. + * @param location a decimal indicating the distance along the curve the point should be located at. this is the distance along the curve as it travels, taking the way it bends into account. should be a number from 0 to 1, inclusive. + */ + var _pointOnPath = function(curve, location) { + var cc = _getCurveFunctions(curve.length - 1), + _x = 0, _y = 0; + for (var i = 0; i < curve.length ; i++) { + _x = _x + (curve[i].x * cc[i](location)); + _y = _y + (curve[i].y * cc[i](location)); + } + + return {x:_x, y:_y}; + }; + + var _dist = function(p1,p2) { + return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2)); + }; + + var _isPoint = function(curve) { + return curve[0].x == curve[1].x && curve[0].y == curve[1].y; + }; + + /** + * finds the point that is 'distance' along the path from 'location'. this method returns both the x,y location of the point and also + * its 'location' (proportion of travel along the path); the method below - _pointAlongPathFrom - calls this method and just returns the + * point. + */ + var _pointAlongPath = function(curve, location, distance) { + + if (_isPoint(curve)) { + return { + point:curve[0], + location:location + }; + } + + var prev = _pointOnPath(curve, location), + tally = 0, + curLoc = location, + direction = distance > 0 ? 1 : -1, + cur = null; + + while (tally < Math.abs(distance)) { + curLoc += (0.005 * direction); + cur = _pointOnPath(curve, curLoc); + tally += _dist(cur, prev); + prev = cur; + } + return {point:cur, location:curLoc}; + }; + + var _length = function(curve) { + if (_isPoint(curve)) return 0; + + var prev = _pointOnPath(curve, 0), + tally = 0, + curLoc = 0, + direction = 1, + cur = null; + + while (curLoc < 1) { + curLoc += (0.005 * direction); + cur = _pointOnPath(curve, curLoc); + tally += _dist(cur, prev); + prev = cur; + } + return tally; + }; + + /** + * finds the point that is 'distance' along the path from 'location'. + */ + var _pointAlongPathFrom = function(curve, location, distance) { + return _pointAlongPath(curve, location, distance).point; + }; + + /** + * finds the location that is 'distance' along the path from 'location'. + */ + var _locationAlongPathFrom = function(curve, location, distance) { + return _pointAlongPath(curve, location, distance).location; + }; + + /** + * returns the gradient of the curve at the given location, which is a decimal between 0 and 1 inclusive. + * + * thanks // http://bimixual.org/AnimationLibrary/beziertangents.html + */ + var _gradientAtPoint = function(curve, location) { + var p1 = _pointOnPath(curve, location), + p2 = _pointOnPath(curve.slice(0, curve.length - 1), location), + dy = p2.y - p1.y, dx = p2.x - p1.x; + return dy == 0 ? Infinity : Math.atan(dy / dx); + }; + + /** + returns the gradient of the curve at the point which is 'distance' from the given location. + if this point is greater than location 1, the gradient at location 1 is returned. + if this point is less than location 0, the gradient at location 0 is returned. + */ + var _gradientAtPointAlongPathFrom = function(curve, location, distance) { + var p = _pointAlongPath(curve, location, distance); + if (p.location > 1) p.location = 1; + if (p.location < 0) p.location = 0; + return _gradientAtPoint(curve, p.location); + }; + + /** + * calculates a line that is 'length' pixels long, perpendicular to, and centered on, the path at 'distance' pixels from the given location. + * if distance is not supplied, the perpendicular for the given location is computed (ie. we set distance to zero). + */ + var _perpendicularToPathAt = function(curve, location, length, distance) { + distance = distance == null ? 0 : distance; + var p = _pointAlongPath(curve, location, distance), + m = _gradientAtPoint(curve, p.location), + _theta2 = Math.atan(-1 / m), + y = length / 2 * Math.sin(_theta2), + x = length / 2 * Math.cos(_theta2); + return [{x:p.point.x + x, y:p.point.y + y}, {x:p.point.x - x, y:p.point.y - y}]; + }; + + this.jsBezier = { + distanceFromCurve : _distanceFromCurve, + gradientAtPoint : _gradientAtPoint, + gradientAtPointAlongCurveFrom : _gradientAtPointAlongPathFrom, + nearestPointOnCurve : _nearestPointOnCurve, + pointOnCurve : _pointOnPath, + pointAlongCurveFrom : _pointAlongPathFrom, + perpendicularToCurveAt : _perpendicularToPathAt, + locationAlongCurveFrom:_locationAlongPathFrom, + getLength:_length + }; +}).call(this); + +/** + * Biltong v0.2 + * + * Various geometry functions written as part of jsPlumb and perhaps useful for others. + * + * Copyright (c) 2014 Simon Porritt + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ +;(function() { + + + "use strict"; + + var Biltong = this.Biltong = {}; + + var _isa = function(a) { return Object.prototype.toString.call(a) === "[object Array]"; }, + _pointHelper = function(p1, p2, fn) { + p1 = _isa(p1) ? p1 : [p1.x, p1.y]; + p2 = _isa(p2) ? p2 : [p2.x, p2.y]; + return fn(p1, p2); + }, + /** + * @name Biltong.gradient + * @function + * @desc Calculates the gradient of a line between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The gradient of a line between the two points. + */ + _gradient = Biltong.gradient = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + if (_p2[0] == _p1[0]) + return _p2[1] > _p1[1] ? Infinity : -Infinity; + else if (_p2[1] == _p1[1]) + return _p2[0] > _p1[0] ? 0 : -0; + else + return (_p2[1] - _p1[1]) / (_p2[0] - _p1[0]); + }); + }, + /** + * @name Biltong.normal + * @function + * @desc Calculates the gradient of a normal to a line between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The gradient of a normal to a line between the two points. + */ + _normal = Biltong.normal = function(p1, p2) { + return -1 / _gradient(p1, p2); + }, + /** + * @name Biltong.lineLength + * @function + * @desc Calculates the length of a line between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The length of a line between the two points. + */ + _lineLength = Biltong.lineLength = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + return Math.sqrt(Math.pow(_p2[1] - _p1[1], 2) + Math.pow(_p2[0] - _p1[0], 2)); + }); + }, + /** + * @name Biltong.quadrant + * @function + * @desc Calculates the quadrant in which the angle between the two points lies. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Integer} The quadrant - 1 for upper right, 2 for lower right, 3 for lower left, 4 for upper left. + */ + _quadrant = Biltong.quadrant = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + if (_p2[0] > _p1[0]) { + return (_p2[1] > _p1[1]) ? 2 : 1; + } + else if (_p2[0] == _p1[0]) { + return _p2[1] > _p1[1] ? 2 : 1; + } + else { + return (_p2[1] > _p1[1]) ? 3 : 4; + } + }); + }, + /** + * @name Biltong.theta + * @function + * @desc Calculates the angle between the two points. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Float} The angle between the two points. + */ + _theta = Biltong.theta = function(p1, p2) { + return _pointHelper(p1, p2, function(_p1, _p2) { + var m = _gradient(_p1, _p2), + t = Math.atan(m), + s = _quadrant(_p1, _p2); + if ((s == 4 || s== 3)) t += Math.PI; + if (t < 0) t += (2 * Math.PI); + + return t; + }); + }, + /** + * @name Biltong.intersects + * @function + * @desc Calculates whether or not the two rectangles intersect. + * @param {Rectangle} r1 First rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @param {Rectangle} r2 Second rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @return {Boolean} True if the rectangles intersect, false otherwise. + */ + _intersects = Biltong.intersects = function(r1, r2) { + var x1 = r1.x, x2 = r1.x + r1.w, y1 = r1.y, y2 = r1.y + r1.h, + a1 = r2.x, a2 = r2.x + r2.w, b1 = r2.y, b2 = r2.y + r2.h; + + return ( (x1 <= a1 && a1 <= x2) && (y1 <= b1 && b1 <= y2) ) || + ( (x1 <= a2 && a2 <= x2) && (y1 <= b1 && b1 <= y2) ) || + ( (x1 <= a1 && a1 <= x2) && (y1 <= b2 && b2 <= y2) ) || + ( (x1 <= a2 && a1 <= x2) && (y1 <= b2 && b2 <= y2) ) || + ( (a1 <= x1 && x1 <= a2) && (b1 <= y1 && y1 <= b2) ) || + ( (a1 <= x2 && x2 <= a2) && (b1 <= y1 && y1 <= b2) ) || + ( (a1 <= x1 && x1 <= a2) && (b1 <= y2 && y2 <= b2) ) || + ( (a1 <= x2 && x1 <= a2) && (b1 <= y2 && y2 <= b2) ); + }, + /** + * @name Biltong.encloses + * @function + * @desc Calculates whether or not r2 is completely enclosed by r1. + * @param {Rectangle} r1 First rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @param {Rectangle} r2 Second rectangle, as a js object in the form `{x:.., y:.., w:.., h:..}` + * @param {Boolean} [allowSharedEdges=false] If true, the concept of enclosure allows for one or more edges to be shared by the two rectangles. + * @return {Boolean} True if r1 encloses r2, false otherwise. + */ + _encloses = Biltong.encloses = function(r1, r2, allowSharedEdges) { + var x1 = r1.x, x2 = r1.x + r1.w, y1 = r1.y, y2 = r1.y + r1.h, + a1 = r2.x, a2 = r2.x + r2.w, b1 = r2.y, b2 = r2.y + r2.h, + c = function(v1, v2, v3, v4) { return allowSharedEdges ? v1 <= v2 && v3>= v4 : v1 < v2 && v3 > v4; }; + + return c(x1,a1,x2,a2) && c(y1,b1,y2,b2); + }, + _segmentMultipliers = [null, [1, -1], [1, 1], [-1, 1], [-1, -1] ], + _inverseSegmentMultipliers = [null, [-1, -1], [-1, 1], [1, 1], [1, -1] ], + /** + * @name Biltong.pointOnLine + * @function + * @desc Calculates a point on the line from `fromPoint` to `toPoint` that is `distance` units along the length of the line. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Point} Point on the line, in the form `{ x:..., y:... }`. + */ + _pointOnLine = Biltong.pointOnLine = function(fromPoint, toPoint, distance) { + var m = _gradient(fromPoint, toPoint), + s = _quadrant(fromPoint, toPoint), + segmentMultiplier = distance > 0 ? _segmentMultipliers[s] : _inverseSegmentMultipliers[s], + theta = Math.atan(m), + y = Math.abs(distance * Math.sin(theta)) * segmentMultiplier[1], + x = Math.abs(distance * Math.cos(theta)) * segmentMultiplier[0]; + return { x:fromPoint.x + x, y:fromPoint.y + y }; + }, + /** + * @name Biltong.perpendicularLineTo + * @function + * @desc Calculates a line of length `length` that is perpendicular to the line from `fromPoint` to `toPoint` and passes through `toPoint`. + * @param {Point} p1 First point, either as a 2 entry array or object with `left` and `top` properties. + * @param {Point} p2 Second point, either as a 2 entry array or object with `left` and `top` properties. + * @return {Line} Perpendicular line, in the form `[ { x:..., y:... }, { x:..., y:... } ]`. + */ + _perpendicularLineTo = Biltong.perpendicularLineTo = function(fromPoint, toPoint, length) { + var m = _gradient(fromPoint, toPoint), + theta2 = Math.atan(-1 / m), + y = length / 2 * Math.sin(theta2), + x = length / 2 * Math.cos(theta2); + return [{x:toPoint.x + x, y:toPoint.y + y}, {x:toPoint.x - x, y:toPoint.y - y}]; + }; +}).call(this); +; +(function () { + + "use strict"; + + var root = this, + Sniff = { + android: navigator.userAgent.toLowerCase().indexOf("android") > -1 + }, + matchesSelector = function (el, selector, ctx) { + ctx = ctx || el.parentNode; + var possibles = ctx.querySelectorAll(selector); + for (var i = 0; i < possibles.length; i++) { + if (possibles[i] === el) { + return true; + } + } + return false; + }, + _gel = function (el) { + return (typeof el == "string" || el.constructor === String) ? document.getElementById(el) : el; + }, + _t = function (e) { + return e.srcElement || e.target; + }, + _d = function (l, fn) { + for (var i = 0, j = l.length; i < j; i++) { + if (l[i] == fn) break; + } + if (i < l.length) l.splice(i, 1); + }, + guid = 1, + // + // this function generates a guid for every handler, sets it on the handler, then adds + // it to the associated object's map of handlers for the given event. this is what enables us + // to unbind all events of some type, or all events (the second of which can be requested by the user, + // but it also used by Mottle when an element is removed.) + _store = function (obj, event, fn) { + var g = guid++; + obj.__ta = obj.__ta || {}; + obj.__ta[event] = obj.__ta[event] || {}; + // store each handler with a unique guid. + obj.__ta[event][g] = fn; + // set the guid on the handler. + fn.__tauid = g; + return g; + }, + _unstore = function (obj, event, fn) { + obj.__ta && obj.__ta[event] && delete obj.__ta[event][fn.__tauid]; + // a handler might have attached extra functions, so we unbind those too. + if (fn.__taExtra) { + for (var i = 0; i < fn.__taExtra.length; i++) { + _unbind(obj, fn.__taExtra[i][0], fn.__taExtra[i][1]); + } + fn.__taExtra.length = 0; + } + // a handler might have attached an unstore callback + fn.__taUnstore && fn.__taUnstore(); + }, + _curryChildFilter = function (children, obj, fn, evt) { + if (children == null) return fn; + else { + var c = children.split(","), + _fn = function (e) { + _fn.__tauid = fn.__tauid; + var t = _t(e); + for (var i = 0; i < c.length; i++) { + if (matchesSelector(t, c[i], obj)) { + fn.apply(t, arguments); + } + } + }; + registerExtraFunction(fn, evt, _fn); + return _fn; + } + }, + // + // registers an 'extra' function on some event listener function we were given - a function that we + // created and bound to the element as part of our housekeeping, and which we want to unbind and remove + // whenever the given function is unbound. + registerExtraFunction = function (fn, evt, newFn) { + fn.__taExtra = fn.__taExtra || []; + fn.__taExtra.push([evt, newFn]); + }, + DefaultHandler = function (obj, evt, fn, children) { + if (isTouchDevice && touchMap[evt]) { + var tfn = _curryChildFilter(children, obj, fn, touchMap[evt]); + _bind(obj, touchMap[evt], tfn , fn); + } + if (evt === "focus" && obj.getAttribute("tabindex") == null) { + obj.setAttribute("tabindex", "1"); + } + _bind(obj, evt, _curryChildFilter(children, obj, fn, evt), fn); + }, + SmartClickHandler = function (obj, evt, fn, children) { + if (obj.__taSmartClicks == null) { + var down = function (e) { + obj.__tad = _pageLocation(e); + }, + up = function (e) { + obj.__tau = _pageLocation(e); + }, + click = function (e) { + if (obj.__tad && obj.__tau && obj.__tad[0] === obj.__tau[0] && obj.__tad[1] === obj.__tau[1]) { + for (var i = 0; i < obj.__taSmartClicks.length; i++) + obj.__taSmartClicks[i].apply(_t(e), [ e ]); + } + }; + DefaultHandler(obj, "mousedown", down, children); + DefaultHandler(obj, "mouseup", up, children); + DefaultHandler(obj, "click", click, children); + obj.__taSmartClicks = []; + } + + // store in the list of callbacks + obj.__taSmartClicks.push(fn); + // the unstore function removes this function from the object's listener list for this type. + fn.__taUnstore = function () { + _d(obj.__taSmartClicks, fn); + }; + }, + _tapProfiles = { + "tap": {touches: 1, taps: 1}, + "dbltap": {touches: 1, taps: 2}, + "contextmenu": {touches: 2, taps: 1} + }, + TapHandler = function (clickThreshold, dblClickThreshold) { + return function (obj, evt, fn, children) { + // if event is contextmenu, for devices which are mouse only, we want to + // use the default bind. + if (evt == "contextmenu" && isMouseDevice) + DefaultHandler(obj, evt, fn, children); + else { + // the issue here is that this down handler gets registered only for the + // child nodes in the first registration. in fact it should be registered with + // no child selector and then on down we should cycle through the regustered + // functions to see if one of them matches. on mouseup we should execute ALL of + // the functions whose children are either null or match the element. + if (obj.__taTapHandler == null) { + var tt = obj.__taTapHandler = { + tap: [], + dbltap: [], + contextmenu: [], + down: false, + taps: 0, + downSelectors: [] + }; + var down = function (e) { + var target = e.srcElement || e.target; + for (var i = 0; i < tt.downSelectors.length; i++) { + if (tt.downSelectors[i] == null || matchesSelector(target, tt.downSelectors[i], obj)) { + tt.down = true; + setTimeout(clearSingle, clickThreshold); + setTimeout(clearDouble, dblClickThreshold); + break; // we only need one match on mousedown + } + } + }, + up = function (e) { + if (tt.down) { + var target = e.srcElement || e.target; + tt.taps++; + var tc = _touchCount(e); + for (var eventId in _tapProfiles) { + if (_tapProfiles.hasOwnProperty(eventId)) { + var p = _tapProfiles[eventId]; + if (p.touches === tc && (p.taps === 1 || p.taps === tt.taps)) { + for (var i = 0; i < tt[eventId].length; i++) { + if (tt[eventId][i][1] == null || matchesSelector(target, tt[eventId][i][1], obj)) + tt[eventId][i][0].apply(_t(e), [ e ]); + } + } + } + } + } + }, + clearSingle = function () { + tt.down = false; + }, + clearDouble = function () { + tt.taps = 0; + }; + + DefaultHandler(obj, "mousedown", down/*, children*/); + DefaultHandler(obj, "mouseup", up/*, children*/); + } + // add this child selector (it can be null, that's fine). + obj.__taTapHandler.downSelectors.push(children); + + obj.__taTapHandler[evt].push([fn, children]); + // the unstore function removes this function from the object's listener list for this type. + fn.__taUnstore = function () { + _d(obj.__taTapHandler[evt], fn); + }; + } + }; + }, + meeHelper = function (type, evt, obj, target) { + for (var i in obj.__tamee[type]) { + if (obj.__tamee[type].hasOwnProperty(i)) { + obj.__tamee[type][i].apply(target, [ evt ]); + } + } + }, + MouseEnterExitHandler = function () { + var activeElements = []; + return function (obj, evt, fn, children) { + if (!obj.__tamee) { + // __tamee holds a flag saying whether the mouse is currently "in" the element, and a list of + // both mouseenter and mouseexit functions. + obj.__tamee = { over: false, mouseenter: [], mouseexit: [] }; + // register over and out functions + var over = function (e) { + var t = _t(e); + if ((children == null && (t == obj && !obj.__tamee.over)) || (matchesSelector(t, children, obj) && (t.__tamee == null || !t.__tamee.over))) { + meeHelper("mouseenter", e, obj, t); + t.__tamee = t.__tamee || {}; + t.__tamee.over = true; + activeElements.push(t); + } + }, + out = function (e) { + var t = _t(e); + // is the current target one of the activeElements? and is the + // related target NOT a descendant of it? + for (var i = 0; i < activeElements.length; i++) { + if (t == activeElements[i] && !matchesSelector((e.relatedTarget || e.toElement), "*", t)) { + t.__tamee.over = false; + activeElements.splice(i, 1); + meeHelper("mouseexit", e, obj, t); + } + } + }; + + _bind(obj, "mouseover", _curryChildFilter(children, obj, over, "mouseover"), over); + _bind(obj, "mouseout", _curryChildFilter(children, obj, out, "mouseout"), out); + } + + fn.__taUnstore = function () { + delete obj.__tamee[evt][fn.__tauid]; + }; + + _store(obj, evt, fn); + obj.__tamee[evt][fn.__tauid] = fn; + }; + }, + isTouchDevice = "ontouchstart" in document.documentElement, + isMouseDevice = "onmousedown" in document.documentElement, + touchMap = { "mousedown": "touchstart", "mouseup": "touchend", "mousemove": "touchmove" }, + touchstart = "touchstart", touchend = "touchend", touchmove = "touchmove", + iev = (function () { + var rv = -1; + if (navigator.appName == 'Microsoft Internet Explorer') { + var ua = navigator.userAgent, + re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); + if (re.exec(ua) != null) + rv = parseFloat(RegExp.$1); + } + return rv; + })(), + isIELT9 = iev > -1 && iev < 9, + _genLoc = function (e, prefix) { + if (e == null) return [ 0, 0 ]; + var ts = _touches(e), t = _getTouch(ts, 0); + return [t[prefix + "X"], t[prefix + "Y"]]; + }, + _pageLocation = function (e) { + if (e == null) return [ 0, 0 ]; + if (isIELT9) { + return [ e.clientX + document.documentElement.scrollLeft, e.clientY + document.documentElement.scrollTop ]; + } + else { + return _genLoc(e, "page"); + } + }, + _screenLocation = function (e) { + return _genLoc(e, "screen"); + }, + _clientLocation = function (e) { + return _genLoc(e, "client"); + }, + _getTouch = function (touches, idx) { + return touches.item ? touches.item(idx) : touches[idx]; + }, + _touches = function (e) { + return e.touches && e.touches.length > 0 ? e.touches : + e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches : + e.targetTouches && e.targetTouches.length > 0 ? e.targetTouches : + [ e ]; + }, + _touchCount = function (e) { + return _touches(e).length; + }, + //http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html + _bind = function (obj, type, fn, originalFn) { + _store(obj, type, fn); + originalFn.__tauid = fn.__tauid; + if (obj.addEventListener) + obj.addEventListener(type, fn, false); + else if (obj.attachEvent) { + var key = type + fn.__tauid; + obj["e" + key] = fn; + // TODO look at replacing with .call(..) + obj[key] = function () { + obj["e" + key] && obj["e" + key](window.event); + }; + obj.attachEvent("on" + type, obj[key]); + } + }, + _unbind = function (obj, type, fn) { + if (fn == null) return; + _each(obj, function () { + var _el = _gel(this); + _unstore(_el, type, fn); + // it has been bound if there is a tauid. otherwise it was not bound and we can ignore it. + if (fn.__tauid != null) { + if (_el.removeEventListener) { + _el.removeEventListener(type, fn, false); + if (isTouchDevice && touchMap[type]) _el.removeEventListener(touchMap[type], fn, false); + } + else if (this.detachEvent) { + var key = type + fn.__tauid; + _el[key] && _el.detachEvent("on" + type, _el[key]); + _el[key] = null; + _el["e" + key] = null; + } + } + + // if a touch event was also registered, deregister now. + if (fn.__taTouchProxy) { + _unbind(obj, fn.__taTouchProxy[1], fn.__taTouchProxy[0]); + } + }); + }, + _each = function (obj, fn) { + if (obj == null) return; + // if a list (or list-like), use it. if a string, get a list + // by running the string through querySelectorAll. else, assume + // it's an Element. + // obj.top is "unknown" in IE8. + obj = (typeof Window !== "undefined" && (typeof obj.top !== "unknown" && obj == obj.top)) ? [ obj ] : + (typeof obj !== "string") && (obj.tagName == null && obj.length != null) ? obj : + typeof obj === "string" ? document.querySelectorAll(obj) + : [ obj ]; + + for (var i = 0; i < obj.length; i++) + fn.apply(obj[i]); + }; + + /** + * Mottle offers support for abstracting out the differences + * between touch and mouse devices, plus "smart click" functionality + * (don't fire click if the mouse has moved between mousedown and mouseup), + * and synthesized click/tap events. + * @class Mottle + * @constructor + * @param {Object} params Constructor params + * @param {Number} [params.clickThreshold=150] Threshold, in milliseconds beyond which a touchstart followed by a touchend is not considered to be a click. + * @param {Number} [params.dblClickThreshold=350] Threshold, in milliseconds beyond which two successive tap events are not considered to be a click. + * @param {Boolean} [params.smartClicks=false] If true, won't fire click events if the mouse has moved between mousedown and mouseup. Note that this functionality + * requires that Mottle consume the mousedown event, and so may not be viable in all use cases. + */ + root.Mottle = function (params) { + params = params || {}; + var clickThreshold = params.clickThreshold || 150, + dblClickThreshold = params.dblClickThreshold || 350, + mouseEnterExitHandler = new MouseEnterExitHandler(), + tapHandler = new TapHandler(clickThreshold, dblClickThreshold), + _smartClicks = params.smartClicks, + _doBind = function (obj, evt, fn, children) { + if (fn == null) return; + _each(obj, function () { + var _el = _gel(this); + if (_smartClicks && evt === "click") + SmartClickHandler(_el, evt, fn, children); + else if (evt === "tap" || evt === "dbltap" || evt === "contextmenu") { + tapHandler(_el, evt, fn, children); + } + else if (evt === "mouseenter" || evt == "mouseexit") + mouseEnterExitHandler(_el, evt, fn, children); + else + DefaultHandler(_el, evt, fn, children); + }); + }; + + /** + * Removes an element from the DOM, and deregisters all event handlers for it. You should use this + * to ensure you don't leak memory. + * @method remove + * @param {String|Element} el Element, or id of the element, to remove. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.remove = function (el) { + _each(el, function () { + var _el = _gel(this); + if (_el.__ta) { + for (var evt in _el.__ta) { + if (_el.__ta.hasOwnProperty(evt)) { + for (var h in _el.__ta[evt]) { + if (_el.__ta[evt].hasOwnProperty(h)) + _unbind(_el, evt, _el.__ta[evt][h]); + } + } + } + } + _el.parentNode && _el.parentNode.removeChild(_el); + }); + return this; + }; + + /** + * Register an event handler, optionally as a delegate for some set of descendant elements. Note + * that this method takes either 3 or 4 arguments - if you supply 3 arguments it is assumed you have + * omitted the `children` parameter, and that the event handler should be bound directly to the given element. + * @method on + * @param {Element[]|Element|String} el Either an Element, or a CSS spec for a list of elements, or an array of Elements. + * @param {String} [children] Comma-delimited list of selectors identifying allowed children. + * @param {String} event Event ID. + * @param {Function} fn Event handler function. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.on = function (el, event, children, fn) { + var _el = arguments[0], + _c = arguments.length == 4 ? arguments[2] : null, + _e = arguments[1], + _f = arguments[arguments.length - 1]; + + _doBind(_el, _e, _f, _c); + return this; + }; + + /** + * Cancel delegate event handling for the given function. Note that unlike with 'on' you do not supply + * a list of child selectors here: it removes event delegation from all of the child selectors for which the + * given function was registered (if any). + * @method off + * @param {Element[]|Element|String} el Element - or ID of element - from which to remove event listener. + * @param {String} event Event ID. + * @param {Function} fn Event handler function. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.off = function (el, event, fn) { + _unbind(el, event, fn); + return this; + }; + + /** + * Triggers some event for a given element. + * @method trigger + * @param {Element} el Element for which to trigger the event. + * @param {String} event Event ID. + * @param {Event} originalEvent The original event. Should be optional of course, but currently is not, due + * to the jsPlumb use case that caused this method to be added. + * @param {Object} [payload] Optional object to set as `payload` on the generated event; useful for message passing. + * @return {Mottle} The current Mottle instance; you can chain this method. + */ + this.trigger = function (el, event, originalEvent, payload) { + // MouseEvent undefined in old IE; that's how we know it's a mouse event. A fine Microsoft paradox. + var originalIsMouse = isMouseDevice && (typeof MouseEvent === "undefined" || originalEvent == null || originalEvent.constructor === MouseEvent); + + var eventToBind = (isTouchDevice && !isMouseDevice && touchMap[event]) ? touchMap[event] : event, + bindingAMouseEvent = !(isTouchDevice && !isMouseDevice && touchMap[event]); + + var pl = _pageLocation(originalEvent), sl = _screenLocation(originalEvent), cl = _clientLocation(originalEvent); + _each(el, function () { + var _el = _gel(this), evt; + originalEvent = originalEvent || { + screenX: sl[0], + screenY: sl[1], + clientX: cl[0], + clientY: cl[1] + }; + + var _decorate = function (_evt) { + if (payload) _evt.payload = payload; + }; + + var eventGenerators = { + "TouchEvent": function (evt) { + var touch = document.createTouch(window, _el, 0, pl[0], pl[1], + sl[0], sl[1], + cl[0], cl[1], + 0, 0, 0, 0); + + // https://gist.github.com/sstephenson/448808 + var touches = document.createTouchList(touch); + var targetTouches = document.createTouchList(touch); + var changedTouches = document.createTouchList(touch); + evt.initTouchEvent(eventToBind, true, true, window, null, sl[0], sl[1], + cl[0], cl[1], false, false, false, false, + touches, targetTouches, changedTouches, 1, 0); + }, + "MouseEvents": function (evt) { + evt.initMouseEvent(eventToBind, true, true, window, 0, + sl[0], sl[1], + cl[0], cl[1], + false, false, false, false, 1, _el); + + if (Sniff.android) { + // Android's touch events are not standard. + var t = document.createTouch(window, _el, 0, pl[0], pl[1], + sl[0], sl[1], + cl[0], cl[1], + 0, 0, 0, 0); + + evt.touches = evt.targetTouches = evt.changedTouches = document.createTouchList(t); + } + } + }; + + if (document.createEvent) { + + var ite = !bindingAMouseEvent && !originalIsMouse && (isTouchDevice && touchMap[event] && !Sniff.android), + evtName = ite ? "TouchEvent" : "MouseEvents"; + + evt = document.createEvent(evtName); + eventGenerators[evtName](evt); + _decorate(evt); + _el.dispatchEvent(evt); + } + else if (document.createEventObject) { + evt = document.createEventObject(); + evt.eventType = evt.eventName = eventToBind; + evt.screenX = sl[0]; + evt.screenY = sl[1]; + evt.clientX = cl[0]; + evt.clientY = cl[1]; + _decorate(evt); + _el.fireEvent('on' + eventToBind, evt); + } + }); + return this; + } + }; + + /** + * Static method to assist in 'consuming' an element: uses `stopPropagation` where available, or sets + * `e.returnValue=false` where it is not. + * @method Mottle.consume + * @param {Event} e Event to consume + * @param {Boolean} [doNotPreventDefault=false] If true, does not call `preventDefault()` on the event. + */ + root.Mottle.consume = function (e, doNotPreventDefault) { + if (e.stopPropagation) + e.stopPropagation(); + else + e.returnValue = false; + + if (!doNotPreventDefault && e.preventDefault) + e.preventDefault(); + }; + + /** + * Gets the page location corresponding to the given event. For touch events this means get the page location of the first touch. + * @method Mottle.pageLocation + * @param {Event} e Event to get page location for. + * @return {Integer[]} [left, top] for the given event. + */ + root.Mottle.pageLocation = _pageLocation; + + /** + * Forces touch events to be turned "on". Useful for testing: even if you don't have a touch device, you can still + * trigger a touch event when this is switched on and it will be captured and acted on. + * @method setForceTouchEvents + * @param {Boolean} value If true, force touch events to be on. + */ + root.Mottle.setForceTouchEvents = function (value) { + isTouchDevice = value; + }; + + /** + * Forces mouse events to be turned "on". Useful for testing: even if you don't have a mouse, you can still + * trigger a mouse event when this is switched on and it will be captured and acted on. + * @method setForceMouseEvents + * @param {Boolean} value If true, force mouse events to be on. + */ + root.Mottle.setForceMouseEvents = function (value) { + isMouseDevice = value; + }; + +}).call(this); + +/** + drag/drop functionality for use with jsPlumb but with + no knowledge of jsPlumb. supports multiple scopes (separated by whitespace), dragging + multiple elements, constrain to parent, drop filters, drag start filters, custom + css classes. + + a lot of the functionality of this script is expected to be plugged in: + + addClass + removeClass + + addEvent + removeEvent + + getPosition + setPosition + getSize + + indexOf + intersects + + the name came from here: + + http://mrsharpoblunto.github.io/foswig.js/ + + copyright 2015 jsPlumb + */ + +;(function() { + + "use strict"; + + var _suggest = function(list, item, head) { + if (list.indexOf(item) === -1) { + head ? list.unshift(item) : list.push(item); + return true; + } + return false; + }; + + var _vanquish = function(list, item) { + var idx = list.indexOf(item); + if (idx != -1) list.splice(idx, 1); + }; + + var _difference = function(l1, l2) { + var d = []; + for (var i = 0; i < l1.length; i++) { + if (l2.indexOf(l1[i]) == -1) + d.push(l1[i]); + } + return d; + }; + + var _isString = function(f) { + return f == null ? false : (typeof f === "string" || f.constructor == String); + }; + + var getOffsetRect = function (elem) { + // (1) + var box = elem.getBoundingClientRect(), + body = document.body, + docElem = document.documentElement, + // (2) + scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop, + scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft, + // (3) + clientTop = docElem.clientTop || body.clientTop || 0, + clientLeft = docElem.clientLeft || body.clientLeft || 0, + // (4) + top = box.top + scrollTop - clientTop, + left = box.left + scrollLeft - clientLeft; + + return { top: Math.round(top), left: Math.round(left) }; + }; + + var matchesSelector = function(el, selector, ctx) { + ctx = ctx || el.parentNode; + var possibles = ctx.querySelectorAll(selector); + for (var i = 0; i < possibles.length; i++) { + if (possibles[i] === el) + return true; + } + return false; + }; + + var iev = (function() { + var rv = -1; + if (navigator.appName == 'Microsoft Internet Explorer') { + var ua = navigator.userAgent, + re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); + if (re.exec(ua) != null) + rv = parseFloat(RegExp.$1); + } + return rv; + })(), + DEFAULT_GRID_X = 50, + DEFAULT_GRID_Y = 50, + isIELT9 = iev > -1 && iev < 9, + isIE9 = iev == 9, + _pl = function(e) { + if (isIELT9) { + return [ e.clientX + document.documentElement.scrollLeft, e.clientY + document.documentElement.scrollTop ]; + } + else { + var ts = _touches(e), t = _getTouch(ts, 0); + // for IE9 pageX might be null if the event was synthesized. We try for pageX/pageY first, + // falling back to clientX/clientY if necessary. In every other browser we want to use pageX/pageY. + return isIE9 ? [t.pageX || t.clientX, t.pageY || t.clientY] : [t.pageX, t.pageY]; + } + }, + _getTouch = function(touches, idx) { return touches.item ? touches.item(idx) : touches[idx]; }, + _touches = function(e) { + return e.touches && e.touches.length > 0 ? e.touches : + e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches : + e.targetTouches && e.targetTouches.length > 0 ? e.targetTouches : + [ e ]; + }, + _classes = { + draggable:"katavorio-draggable", // draggable elements + droppable:"katavorio-droppable", // droppable elements + drag : "katavorio-drag", // elements currently being dragged + selected:"katavorio-drag-selected", // elements in current drag selection + active : "katavorio-drag-active", // droppables that are targets of a currently dragged element + hover : "katavorio-drag-hover", // droppables over which a matching drag element is hovering + noSelect : "katavorio-drag-no-select" // added to the body to provide a hook to suppress text selection + }, + _defaultScope = "katavorio-drag-scope", + _events = [ "stop", "start", "drag", "drop", "over", "out", "beforeStart" ], + _devNull = function() {}, + _true = function() { return true; }, + _foreach = function(l, fn, from) { + for (var i = 0; i < l.length; i++) { + if (l[i] != from) + fn(l[i]); + } + }, + _setDroppablesActive = function(dd, val, andHover, drag) { + _foreach(dd, function(e) { + e.setActive(val); + if (val) e.updatePosition(); + if (andHover) e.setHover(drag, val); + }); + }, + _each = function(obj, fn) { + if (obj == null) return; + obj = !_isString(obj) && (obj.tagName == null && obj.length != null) ? obj : [ obj ]; + for (var i = 0; i < obj.length; i++) + fn.apply(obj[i], [ obj[i] ]); + }, + _consume = function(e) { + if (e.stopPropagation) { + e.stopPropagation(); + e.preventDefault(); + } + else { + e.returnValue = false; + } + }, + _defaultInputFilterSelector = "input,textarea,select,button,option", + // + // filters out events on all input elements, like textarea, checkbox, input, select. + _inputFilter = function(e, el, _katavorio) { + var t = e.srcElement || e.target; + return !matchesSelector(t, _katavorio.getInputFilterSelector(), el); + }; + + var Super = function(el, params, css, scope) { + this.params = params || {}; + this.el = el; + this.params.addClass(this.el, this._class); + this.uuid = _uuid(); + var enabled = true; + this.setEnabled = function(e) { enabled = e; }; + this.isEnabled = function() { return enabled; }; + this.toggleEnabled = function() { enabled = !enabled; }; + this.setScope = function(scopes) { + this.scopes = scopes ? scopes.split(/\s+/) : [ scope ]; + }; + this.addScope = function(scopes) { + var m = {}; + _each(this.scopes, function(s) { m[s] = true;}); + _each(scopes ? scopes.split(/\s+/) : [], function(s) { m[s] = true;}); + this.scopes = []; + for (var i in m) this.scopes.push(i); + }; + this.removeScope = function(scopes) { + var m = {}; + _each(this.scopes, function(s) { m[s] = true;}); + _each(scopes ? scopes.split(/\s+/) : [], function(s) { delete m[s];}); + this.scopes = []; + for (var i in m) this.scopes.push(i); + }; + this.toggleScope = function(scopes) { + var m = {}; + _each(this.scopes, function(s) { m[s] = true;}); + _each(scopes ? scopes.split(/\s+/) : [], function(s) { + if (m[s]) delete m[s]; + else m[s] = true; + }); + this.scopes = []; + for (var i in m) this.scopes.push(i); + }; + this.setScope(params.scope); + this.k = params.katavorio; + return params.katavorio; + }; + + var Drag = function(el, params, css, scope) { + this._class = css.draggable; + var k = Super.apply(this, arguments); + this.rightButtonCanDrag = this.params.rightButtonCanDrag; + var downAt = [0,0], posAtDown = null, moving = false, + consumeStartEvent = this.params.consumeStartEvent !== false, + dragEl = this.el, + clone = this.params.clone, + scroll = this.params.scroll, + _multipleDrop = params.multipleDrop !== false; + + var snapThreshold = params.snapThreshold || 5, + _snap = function(pos, x, y, thresholdX, thresholdY) { + thresholdX = thresholdX || snapThreshold; + thresholdY = thresholdY || snapThreshold; + var _dx = Math.floor(pos[0] / x), + _dxl = x * _dx, + _dxt = _dxl + x, + _x = Math.abs(pos[0] - _dxl) <= thresholdX ? _dxl : Math.abs(_dxt - pos[0]) <= thresholdX ? _dxt : pos[0]; + + var _dy = Math.floor(pos[1] / y), + _dyl = y * _dy, + _dyt = _dyl + y, + _y = Math.abs(pos[1] - _dyl) <= thresholdY ? _dyl : Math.abs(_dyt - pos[1]) <= thresholdY ? _dyt : pos[1]; + + return [ _x, _y]; + }; + + this.posses = []; + this.posseRoles = {}; + + this.toGrid = function(pos) { + if (this.params.grid == null) { + return pos; + } + else { + return _snap(pos, this.params.grid[0], this.params.grid[1]); + } + }; + + this.snap = function(x, y) { + if (dragEl == null) return; + x = x || (this.params.grid ? this.params.grid[0] : DEFAULT_GRID_X); + y = y || (this.params.grid ? this.params.grid[1] : DEFAULT_GRID_Y); + var p = this.params.getPosition(dragEl); + this.params.setPosition(dragEl, _snap(p, x, y, x, y)); + }; + + this.constrain = typeof this.params.constrain === "function" ? this.params.constrain : (this.params.constrain || this.params.containment) ? function(pos) { + return [ + Math.max(0, Math.min(constrainRect.w - this.size[0], pos[0])), + Math.max(0, Math.min(constrainRect.h - this.size[1], pos[1])) + ]; + } : function(pos) { return pos; }; + + var _assignId = function(obj) { + if (typeof obj == "function") { + obj._katavorioId = _uuid(); + return obj._katavorioId; + } else { + return obj; + } + }, + // a map of { spec -> [ fn, exclusion ] } entries. + _filters = {}, + _testFilter = function(e) { + for (var key in _filters) { + var f = _filters[key]; + var rv = f[0](e); + if (f[1]) rv = !rv; + if (!rv) return false; + } + return true; + }, + _setFilter = this.setFilter = function(f, _exclude) { + if (f) { + var key = _assignId(f); + _filters[key] = [ + function(e) { + var t = e.srcElement || e.target, m; + if (_isString(f)) { + m = matchesSelector(t, f, el); + } + else if (typeof f === "function") { + m = f(e, el); + } + return m; + }, + _exclude !== false + ]; + + } + }, + _addFilter = this.addFilter = _setFilter, + _removeFilter = this.removeFilter = function(f) { + var key = typeof f == "function" ? f._katavorioId : f; + delete _filters[key]; + }; + + this.clearAllFilters = function() { + _filters = {}; + }; + + this.canDrag = this.params.canDrag || _true; + + var constrainRect, + matchingDroppables = [], intersectingDroppables = []; + + this.downListener = function(e) { + var isNotRightClick = this.rightButtonCanDrag || (e.which !== 3 && e.button !== 2); + if (isNotRightClick && this.isEnabled() && this.canDrag()) { + var _f = _testFilter(e) && _inputFilter(e, this.el, this.k); + if (_f) { + if (!clone) + dragEl = this.el; + else { + dragEl = this.el.cloneNode(true); + dragEl.setAttribute("id", null); + dragEl.style.position = "absolute"; + // the clone node is added to the body; getOffsetRect gives us a value + // relative to the body. + var b = getOffsetRect(this.el); + dragEl.style.left = b.left + "px"; + dragEl.style.top = b.top + "px"; + document.body.appendChild(dragEl); + } + consumeStartEvent && _consume(e); + downAt = _pl(e); + // + this.params.bind(document, "mousemove", this.moveListener); + this.params.bind(document, "mouseup", this.upListener); + k.markSelection(this); + k.markPosses(this); + this.params.addClass(document.body, css.noSelect); + _dispatch("beforeStart", {el:this.el, pos:posAtDown, e:e, drag:this}); + } + else if (this.params.consumeFilteredEvents) { + _consume(e); + } + } + }.bind(this); + + this.moveListener = function(e) { + if (downAt) { + if (!moving) { + var _continue = _dispatch("start", {el:this.el, pos:posAtDown, e:e, drag:this}); + if (_continue !== false) { + if (!downAt) return; + this.mark(true); + moving = true; + } + } + + // it is possible that the start event caused the drag to be aborted. So we check + // again that we are currently dragging. + if (downAt) { + intersectingDroppables.length = 0; + var pos = _pl(e), dx = pos[0] - downAt[0], dy = pos[1] - downAt[1], + z = this.params.ignoreZoom ? 1 : k.getZoom(); + dx /= z; + dy /= z; + this.moveBy(dx, dy, e); + k.updateSelection(dx, dy, this); + k.updatePosses(dx, dy, this); + } + } + }.bind(this); + + this.upListener = function(e) { + if (downAt) { + downAt = null; + this.params.unbind(document, "mousemove", this.moveListener); + this.params.unbind(document, "mouseup", this.upListener); + this.params.removeClass(document.body, css.noSelect); + this.unmark(e); + k.unmarkSelection(this, e); + k.unmarkPosses(this, e); + this.stop(e); + k.notifySelectionDragStop(this, e); + k.notifyPosseDragStop(this, e); + moving = false; + if (clone) { + dragEl && dragEl.parentNode && dragEl.parentNode.removeChild(dragEl); + dragEl = null; + } + } + }.bind(this); + + this.getFilters = function() { return _filters; }; + + this.abort = function() { + if (downAt != null) + this.upListener(); + }; + + this.getDragElement = function() { + return dragEl || this.el; + }; + + var listeners = {"start":[], "drag":[], "stop":[], "over":[], "out":[], "beforeStart":[] }; + if (params.events.start) listeners.start.push(params.events.start); + if (params.events.beforeStart) listeners.beforeStart.push(params.events.beforeStart); + if (params.events.stop) listeners.stop.push(params.events.stop); + if (params.events.drag) listeners.drag.push(params.events.drag); + + this.on = function(evt, fn) { + if (listeners[evt]) listeners[evt].push(fn); + }; + + var _dispatch = function(evt, value) { + if (listeners[evt]) { + for (var i = 0; i < listeners[evt].length; i++) { + try { + listeners[evt][i](value); + } + catch (e) { } + } + } + }; + + this.notifyStart = function(e) { + _dispatch("start", {el:this.el, pos:this.params.getPosition(dragEl), e:e, drag:this}); + }; + + this.stop = function(e, force) { + if (force || moving) { + var positions = [], + sel = k.getSelection(), + dPos = this.params.getPosition(dragEl); + + if (sel.length > 1) { + for (var i = 0; i < sel.length; i++) { + var p = this.params.getPosition(sel[i].el); + positions.push([ sel[i].el, { left: p[0], top: p[1] }, sel[i] ]); + } + } + else { + positions.push([ dragEl, {left:dPos[0], top:dPos[1]}, this ]); + } + + _dispatch("stop", { + el: dragEl, pos: dPos, e: e, drag: this, selection:positions + }); + } + }; + + this.mark = function(andNotify) { + posAtDown = this.params.getPosition(dragEl); + this.size = this.params.getSize(dragEl); + matchingDroppables = k.getMatchingDroppables(this); + _setDroppablesActive(matchingDroppables, true, false, this); + this.params.addClass(dragEl, this.params.dragClass || css.drag); + if (this.params.constrain || this.params.containment) { + var cs = this.params.getSize(dragEl.parentNode); + constrainRect = { w:cs[0], h:cs[1] }; + } + if (andNotify) { + k.notifySelectionDragStart(this); + } + }; + this.unmark = function(e, doNotCheckDroppables) { + _setDroppablesActive(matchingDroppables, false, true, this); + this.params.removeClass(dragEl, this.params.dragClass || css.drag); + matchingDroppables.length = 0; + if (!doNotCheckDroppables) { + for (var i = 0; i < intersectingDroppables.length; i++) { + var retVal = intersectingDroppables[i].drop(this, e); + if (retVal === true) break; + } + } + }; + this.moveBy = function(dx, dy, e) { + intersectingDroppables.length = 0; + var cPos = this.constrain(this.toGrid(([posAtDown[0] + dx, posAtDown[1] + dy])), dragEl), + rect = { x:cPos[0], y:cPos[1], w:this.size[0], h:this.size[1]}, + focusDropElement = null; + + this.params.setPosition(dragEl, cPos); + for (var i = 0; i < matchingDroppables.length; i++) { + var r2 = { x:matchingDroppables[i].position[0], y:matchingDroppables[i].position[1], w:matchingDroppables[i].size[0], h:matchingDroppables[i].size[1]}; + if (this.params.intersects(rect, r2) && (_multipleDrop || focusDropElement == null || focusDropElement == matchingDroppables[i].el) && matchingDroppables[i].canDrop(this)) { + if (!focusDropElement) focusDropElement = matchingDroppables[i].el; + intersectingDroppables.push(matchingDroppables[i]); + matchingDroppables[i].setHover(this, true, e); + } + else if (matchingDroppables[i].isHover()) { + matchingDroppables[i].setHover(this, false, e); + } + } + + _dispatch("drag", {el:this.el, pos:cPos, e:e, drag:this}); + + /* test to see if the parent needs to be scrolled + if (scroll) { + var pnsl = dragEl.parentNode.scrollLeft, pnst = dragEl.parentNode.scrollTop; + console.log("scroll!", pnsl, pnst); + }*/ + }; + this.destroy = function() { + this.params.unbind(this.el, "mousedown", this.downListener); + this.params.unbind(document, "mousemove", this.moveListener); + this.params.unbind(document, "mouseup", this.upListener); + this.downListener = null; + this.upListener = null; + this.moveListener = null; + //this.params = null; + //this.el = null; + //dragEl = null; + }; + + // init:register mousedown, and perhaps set a filter + this.params.bind(this.el, "mousedown", this.downListener); + + // if handle provded, use that. otherwise, try to set a filter. + // note that a `handle` selector always results in filterExclude being set to false, ie. + // the selector defines the handle element(s). + if (this.params.handle) + _setFilter(this.params.handle, false); + else + _setFilter(this.params.filter, this.params.filterExclude); + }; + + var Drop = function(el, params, css, scope) { + this._class = css.droppable; + this.params = params || {}; + this._activeClass = this.params.activeClass || css.active; + this._hoverClass = this.params.hoverClass || css.hover; + Super.apply(this, arguments); + var hover = false; + this.allowLoopback = this.params.allowLoopback !== false; + + this.setActive = function(val) { + this.params[val ? "addClass" : "removeClass"](this.el, this._activeClass); + }; + + this.updatePosition = function() { + this.position = this.params.getPosition(this.el); + this.size = this.params.getSize(this.el); + }; + + this.canDrop = this.params.canDrop || function(drag) { + return true; + }; + + this.isHover = function() { return hover; }; + + this.setHover = function(drag, val, e) { + // if turning off hover but this was not the drag that caused the hover, ignore. + if (val || this.el._katavorioDragHover == null || this.el._katavorioDragHover == drag.el._katavorio) { + this.params[val ? "addClass" : "removeClass"](this.el, this._hoverClass); + //this.el._katavorioDragHover = val ? drag.el._katavorio : null; + this.el._katavorioDragHover = val ? drag.el._katavorio : null; + if (hover !== val) + this.params.events[val ? "over" : "out"]({el:this.el, e:e, drag:drag, drop:this}); + hover = val; + } + }; + + this.drop = function(drag, event) { + return this.params.events["drop"]({ drag:drag, e:event, drop:this }); + }; + + this.destroy = function() { + this._class = null; + this._activeClass = null; + this._hoverClass = null; + //this.params = null; + hover = null; + //this.el = null; + }; + }; + + var _uuid = function() { + return ('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); + return v.toString(16); + })); + }; + + var _gel = function(el) { + if (el == null) return null; + el = (typeof el === "string" || el.constructor == String) ? document.getElementById(el) : el; + if (el == null) return null; + el._katavorio = el._katavorio || _uuid(); + return el; + }; + + this.Katavorio = function(katavorioParams) { + + var _selection = [], + _selectionMap = {}; + + this._dragsByScope = {}; + this._dropsByScope = {}; + var _zoom = 1, + _reg = function(obj, map) { + _each(obj, function(_obj) { + for(var i = 0; i < _obj.scopes.length; i++) { + map[_obj.scopes[i]] = map[_obj.scopes[i]] || []; + map[_obj.scopes[i]].push(_obj); + } + }); + }, + _unreg = function(obj, map) { + var c = 0; + _each(obj, function(_obj) { + for(var i = 0; i < _obj.scopes.length; i++) { + if (map[_obj.scopes[i]]) { + var idx = katavorioParams.indexOf(map[_obj.scopes[i]], _obj); + if (idx != -1) { + map[_obj.scopes[i]].splice(idx, 1); + c++; + } + } + } + }); + + return c > 0 ; + }, + _getMatchingDroppables = this.getMatchingDroppables = function(drag) { + var dd = [], _m = {}; + for (var i = 0; i < drag.scopes.length; i++) { + var _dd = this._dropsByScope[drag.scopes[i]]; + if (_dd) { + for (var j = 0; j < _dd.length; j++) { + if (_dd[j].canDrop(drag) && !_m[_dd[j].uuid] && (_dd[j].allowLoopback || _dd[j].el !== drag.el)) { + _m[_dd[j].uuid] = true; + dd.push(_dd[j]); + } + } + } + } + return dd; + }, + _prepareParams = function(p) { + p = p || {}; + var _p = { + events:{} + }, i; + for (i in katavorioParams) _p[i] = katavorioParams[i]; + for (i in p) _p[i] = p[i]; + // events + + for (i = 0; i < _events.length; i++) { + _p.events[_events[i]] = p[_events[i]] || _devNull; + } + _p.katavorio = this; + return _p; + }.bind(this), + _mistletoe = function(existingDrag, params) { + for (var i = 0; i < _events.length; i++) { + if (params[_events[i]]) { + existingDrag.on(_events[i], params[_events[i]]); + } + } + }.bind(this), + _css = {}, + overrideCss = katavorioParams.css || {}, + _scope = katavorioParams.scope || _defaultScope; + + // prepare map of css classes based on defaults frst, then optional overrides + for (var i in _classes) _css[i] = _classes[i]; + for (var i in overrideCss) _css[i] = overrideCss[i]; + + var inputFilterSelector = katavorioParams.inputFilterSelector || _defaultInputFilterSelector; + /** + * Gets the selector identifying which input elements to filter from drag events. + * @method getInputFilterSelector + * @return {String} Current input filter selector. + */ + this.getInputFilterSelector = function() { return inputFilterSelector; }; + + /** + * Sets the selector identifying which input elements to filter from drag events. + * @method setInputFilterSelector + * @param {String} selector Input filter selector to set. + * @return {Katavorio} Current instance; method may be chained. + */ + this.setInputFilterSelector = function(selector) { + inputFilterSelector = selector; + return this; + }; + + this.draggable = function(el, params) { + var o = []; + _each(el, function(_el) { + _el = _gel(_el); + if (_el != null) { + if (_el._katavorioDrag == null) { + var p = _prepareParams(params); + _el._katavorioDrag = new Drag(_el, p, _css, _scope); + _reg(_el._katavorioDrag, this._dragsByScope); + o.push(_el._katavorioDrag); + katavorioParams.addClass(_el, _css.draggable); + } + else { + _mistletoe(_el._katavorioDrag, params); + } + } + }.bind(this)); + return o; + + }; + + this.droppable = function(el, params) { + var o = []; + _each(el, function(_el) { + _el = _gel(_el); + if (_el != null) { + var drop = new Drop(_el, _prepareParams(params), _css, _scope); + _el._katavorioDrop = _el._katavorioDrop || []; + _el._katavorioDrop.push(drop); + _reg(drop, this._dropsByScope); + o.push(drop); + katavorioParams.addClass(_el, _css.droppable); + } + }.bind(this)); + return o; + }; + + /** + * @name Katavorio#select + * @function + * @desc Adds an element to the current selection (for multiple node drag) + * @param {Element|String} DOM element - or id of the element - to add. + */ + this.select = function(el) { + _each(el, function() { + var _el = _gel(this); + if (_el && _el._katavorioDrag) { + if (!_selectionMap[_el._katavorio]) { + _selection.push(_el._katavorioDrag); + _selectionMap[_el._katavorio] = [ _el, _selection.length - 1 ]; + katavorioParams.addClass(_el, _css.selected); + } + } + }); + return this; + }; + + /** + * @name Katavorio#deselect + * @function + * @desc Removes an element from the current selection (for multiple node drag) + * @param {Element|String} DOM element - or id of the element - to remove. + */ + this.deselect = function(el) { + _each(el, function() { + var _el = _gel(this); + if (_el && _el._katavorio) { + var e = _selectionMap[_el._katavorio]; + if (e) { + var _s = []; + for (var i = 0; i < _selection.length; i++) + if (_selection[i].el !== _el) _s.push(_selection[i]); + _selection = _s; + delete _selectionMap[_el._katavorio]; + katavorioParams.removeClass(_el, _css.selected); + } + } + }); + return this; + }; + + this.deselectAll = function() { + for (var i in _selectionMap) { + var d = _selectionMap[i]; + katavorioParams.removeClass(d[0], _css.selected); + } + + _selection.length = 0; + _selectionMap = {}; + }; + + this.markSelection = function(drag) { + _foreach(_selection, function(e) { e.mark(); }, drag); + }; + + this.markPosses = function(drag) { + if (drag.posses) { + _each(drag.posses, function(p) { + if (drag.posseRoles[p] && _posses[p]) { + _foreach(_posses[p].members, function (d) { + d.mark(); + }, drag); + } + }) + } + }; + + this.unmarkSelection = function(drag, event) { + _foreach(_selection, function(e) { e.unmark(event); }, drag); + }; + + this.unmarkPosses = function(drag, event) { + if (drag.posses) { + _each(drag.posses, function(p) { + if (drag.posseRoles[p] && _posses[p]) { + _foreach(_posses[p].members, function (d) { + d.unmark(event, true); + }, drag); + } + }); + } + }; + + this.getSelection = function() { return _selection.slice(0); }; + + this.updateSelection = function(dx, dy, drag) { + _foreach(_selection, function(e) { e.moveBy(dx, dy); }, drag); + }; + + var _posseAction = function(fn, drag) { + if (drag.posses) { + _each(drag.posses, function(p) { + if (drag.posseRoles[p] && _posses[p]) { + _foreach(_posses[p].members, function (e) { + fn(e); + }, drag); + } + }); + } + }; + + this.updatePosses = function(dx, dy, drag) { + _posseAction(function(e) { e.moveBy(dx, dy); }, drag); + }; + + this.notifyPosseDragStop = function(drag, evt) { + _posseAction(function(e) { e.stop(evt, true); }, drag); + }; + + this.notifySelectionDragStop = function(drag, evt) { + _foreach(_selection, function(e) { e.stop(evt, true); }, drag); + }; + + this.notifySelectionDragStart = function(drag, evt) { + _foreach(_selection, function(e) { e.notifyStart(evt);}, drag); + }; + + this.setZoom = function(z) { _zoom = z; }; + this.getZoom = function() { return _zoom; }; + + // does the work of changing scopes + var _scopeManip = function(kObj, scopes, map, fn) { + _each(kObj, function(_kObj) { + _unreg(_kObj, map); // deregister existing scopes + _kObj[fn](scopes); // set scopes + _reg(_kObj, map); // register new ones + }); + }; + + _each([ "set", "add", "remove", "toggle"], function(v) { + this[v + "Scope"] = function(el, scopes) { + _scopeManip(el._katavorioDrag, scopes, this._dragsByScope, v + "Scope"); + _scopeManip(el._katavorioDrop, scopes, this._dropsByScope, v + "Scope"); + }.bind(this); + this[v + "DragScope"] = function(el, scopes) { + _scopeManip(el.constructor === Drag ? el : el._katavorioDrag, scopes, this._dragsByScope, v + "Scope"); + }.bind(this); + this[v + "DropScope"] = function(el, scopes) { + _scopeManip(el.constructor === Drop ? el : el._katavorioDrop, scopes, this._dropsByScope, v + "Scope"); + }.bind(this); + }.bind(this)); + + this.snapToGrid = function(x, y) { + for (var s in this._dragsByScope) { + _foreach(this._dragsByScope[s], function(d) { d.snap(x, y); }); + } + }; + + this.getDragsForScope = function(s) { return this._dragsByScope[s]; }; + this.getDropsForScope = function(s) { return this._dropsByScope[s]; }; + + var _destroy = function(el, type, map) { + el = _gel(el); + if (el[type]) { + if (_unreg(el[type], map)) { + _each(el[type], function(kObj) { kObj.destroy() }); + } + + el[type] = null; + } + }; + + this.elementRemoved = function(el) { + this.destroyDraggable(el); + this.destroyDroppable(el); + }; + + this.destroyDraggable = function(el) { + _destroy(el, "_katavorioDrag", this._dragsByScope); + }; + + this.destroyDroppable = function(el) { + _destroy(el, "_katavorioDrop", this._dropsByScope); + }; + + this.reset = function() { + this._dragsByScope = {}; + this._dropsByScope = {}; + _selection = []; + _selectionMap = {}; + _posses = {}; + }; + + // ----- groups + var _posses = {}; + + var _processOneSpec = function(el, _spec, dontAddExisting) { + var posseId = _isString(_spec) ? _spec : _spec.id; + var active = _isString(_spec) ? true : _spec.active !== false; + var posse = _posses[posseId] || (function() { + var g = {name:posseId, members:[]}; + _posses[posseId] = g; + return g; + })(); + _each(el, function(_el) { + if (_el._katavorioDrag) { + + if (dontAddExisting && _el._katavorioDrag.posseRoles[posse.name] != null) return; + + _suggest(posse.members, _el._katavorioDrag); + _suggest(_el._katavorioDrag.posses, posse.name); + _el._katavorioDrag.posseRoles[posse.name] = active; + } + }); + return posse; + }; + + /** + * Add the given element to the posse with the given id, creating the group if it at first does not exist. + * @method addToPosse + * @param {Element} el Element to add. + * @param {String...|Object...} spec Variable args parameters. Each argument can be a either a String, indicating + * the ID of a Posse to which the element should be added as an active participant, or an Object containing + * `{ id:"posseId", active:false/true}`. In the latter case, if `active` is not provided it is assumed to be + * true. + * @returns {Posse|Posse[]} The Posse(s) to which the element(s) was/were added. + */ + this.addToPosse = function(el, spec) { + + var posses = []; + + for (var i = 1; i < arguments.length; i++) { + posses.push(_processOneSpec(el, arguments[i])); + } + + return posses.length == 1 ? posses[0] : posses; + }; + + /** + * Sets the posse(s) for the element with the given id, creating those that do not yet exist, and removing from + * the element any current Posses that are not specified by this method call. This method will not change the + * active/passive state if it is given a posse in which the element is already a member. + * @method setPosse + * @param {Element} el Element to set posse(s) on. + * @param {String...|Object...} spec Variable args parameters. Each argument can be a either a String, indicating + * the ID of a Posse to which the element should be added as an active participant, or an Object containing + * `{ id:"posseId", active:false/true}`. In the latter case, if `active` is not provided it is assumed to be + * true. + * @returns {Posse|Posse[]} The Posse(s) to which the element(s) now belongs. + */ + this.setPosse = function(el, spec) { + + var posses = []; + + for (var i = 1; i < arguments.length; i++) { + posses.push(_processOneSpec(el, arguments[i], true).name); + } + + _each(el, function(_el) { + if (_el._katavorioDrag) { + var diff = _difference(_el._katavorioDrag.posses, posses); + var p = []; + Array.prototype.push.apply(p, _el._katavorioDrag.posses); + for (var i = 0; i < diff.length; i++) { + this.removeFromPosse(_el, diff[i]); + } + } + }.bind(this)); + + return posses.length == 1 ? posses[0] : posses; + }; + + /** + * Remove the given element from the given posse(s). + * @method removeFromPosse + * @param {Element} el Element to remove. + * @param {String...} posseId Varargs parameter: one value for each posse to remove the element from. + */ + this.removeFromPosse = function(el, posseId) { + if (arguments.length < 2) throw new TypeError("No posse id provided for remove operation"); + for(var i = 1; i < arguments.length; i++) { + posseId = arguments[i]; + _each(el, function (_el) { + if (_el._katavorioDrag && _el._katavorioDrag.posses) { + var d = _el._katavorioDrag; + _each(posseId, function (p) { + _vanquish(_posses[p].members, d); + _vanquish(d.posses, p); + delete d.posseRoles[p]; + }); + } + }); + } + }; + + /** + * Remove the given element from all Posses to which it belongs. + * @method removeFromAllPosses + * @param {Element|Element[]} el Element to remove from Posses. + */ + this.removeFromAllPosses = function(el) { + _each(el, function(_el) { + if (_el._katavorioDrag && _el._katavorioDrag.posses) { + var d = _el._katavorioDrag; + _each(d.posses, function(p) { + _vanquish(_posses[p].members, d); + }); + d.posses.length = 0; + d.posseRoles = {}; + } + }); + }; + + /** + * Changes the participation state for the element in the Posse with the given ID. + * @param {Element|Element[]} el Element(s) to change state for. + * @param {String} posseId ID of the Posse to change element state for. + * @param {Boolean} state True to make active, false to make passive. + */ + this.setPosseState = function(el, posseId, state) { + var posse = _posses[posseId]; + if (posse) { + _each(el, function(_el) { + if (_el._katavorioDrag && _el._katavorioDrag.posses) { + _el._katavorioDrag.posseRoles[posse.name] = state; + } + }); + } + }; + }; +}).call(this); + +/* + * jsPlumb + * + * Title:jsPlumb 2.0.2 + * + * Provides a way to visually connect elements on an HTML page, using SVG. + * + * This file contains utility functions that run in both browsers and headless. + * + * Copyright (c) 2010 - 2015 jsPlumb (hello@jsplumbtoolkit.com) + * + * http://jsplumbtoolkit.com + * http://github.com/sporritt/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ + +; +(function () { + + var _isa = function (a) { + return Object.prototype.toString.call(a) === "[object Array]"; + }, + _isnum = function (n) { + return Object.prototype.toString.call(n) === "[object Number]"; + }, + _iss = function (s) { + return typeof s === "string"; + }, + _isb = function (s) { + return typeof s === "boolean"; + }, + _isnull = function (s) { + return s == null; + }, + _iso = function (o) { + return o == null ? false : Object.prototype.toString.call(o) === "[object Object]"; + }, + _isd = function (o) { + return Object.prototype.toString.call(o) === "[object Date]"; + }, + _isf = function (o) { + return Object.prototype.toString.call(o) === "[object Function]"; + }, + _isNamedFunction = function(o) { + return _isf(o) && o.name != null && o.name.length > 0; + }, + _ise = function (o) { + for (var i in o) { + if (o.hasOwnProperty(i)) return false; + } + return true; + }; + + var root = this; + var exports = root.jsPlumbUtil = { + isArray: _isa, + isString: _iss, + isBoolean: _isb, + isNull: _isnull, + isObject: _iso, + isDate: _isd, + isFunction: _isf, + isEmpty: _ise, + isNumber: _isnum, + clone: function (a) { + if (_iss(a)) return "" + a; + else if (_isb(a)) return !!a; + else if (_isd(a)) return new Date(a.getTime()); + else if (_isf(a)) return a; + else if (_isa(a)) { + var b = []; + for (var i = 0; i < a.length; i++) + b.push(this.clone(a[i])); + return b; + } + else if (_iso(a)) { + var c = {}; + for (var j in a) + c[j] = this.clone(a[j]); + return c; + } + else return a; + }, + merge: function (a, b, collations) { + // first change the collations array - if present - into a lookup table, because its faster. + var cMap = {}, ar, i; + collations = collations || []; + for (i = 0; i < collations.length; i++) + cMap[collations[i]] = true; + + var c = this.clone(a); + for (i in b) { + if (c[i] == null) { + c[i] = b[i]; + } + else if (_iss(b[i]) || _isb(b[i])) { + if (!cMap[i]) { + c[i] = b[i]; // if we dont want to collate, just copy it in. + } + else { + ar = []; + // if c's object is also an array we can keep its values. + ar.push.apply(ar, _isa(c[i]) ? c[i] : [ c[i] ]); + ar.push.apply(ar, _isa(b[i]) ? b[i] : [ b[i] ]); + c[i] = ar; + } + } + else { + if (_isa(b[i])) { + ar = []; + // if c's object is also an array we can keep its values. + if (_isa(c[i])) ar.push.apply(ar, c[i]); + ar.push.apply(ar, b[i]); + c[i] = ar; + } + else if (_iso(b[i])) { + // overwite c's value with an object if it is not already one. + if (!_iso(c[i])) + c[i] = {}; + for (var j in b[i]) { + c[i][j] = b[i][j]; + } + } + } + + } + return c; + }, + replace: function (inObj, path, value) { + if (inObj == null) return; + var q = inObj, t = q; + path.replace(/([^\.])+/g, function (term, lc, pos, str) { + var array = term.match(/([^\[0-9]+){1}(\[)([0-9+])/), + last = pos + term.length >= str.length, + _getArray = function () { + return t[array[1]] || (function () { + t[array[1]] = []; + return t[array[1]]; + })(); + }; + + if (last) { + // set term = value on current t, creating term as array if necessary. + if (array) + _getArray()[array[3]] = value; + else + t[term] = value; + } + else { + // set to current t[term], creating t[term] if necessary. + if (array) { + var a = _getArray(); + t = a[array[3]] || (function () { + a[array[3]] = {}; + return a[array[3]]; + })(); + } + else + t = t[term] || (function () { + t[term] = {}; + return t[term]; + })(); + } + }); + + return inObj; + }, + // + // chain a list of functions, supplied by [ object, method name, args ], and return on the first + // one that returns the failValue. if none return the failValue, return the successValue. + // + functionChain: function (successValue, failValue, fns) { + for (var i = 0; i < fns.length; i++) { + var o = fns[i][0][fns[i][1]].apply(fns[i][0], fns[i][2]); + if (o === failValue) { + return o; + } + } + return successValue; + }, + // take the given model and expand out any parameters. + // 'functionPrefix' is optional, and if present, helps jsplumb figure out what to do if a value is a Function. + // if you do not provide it, jsplumb will run the given values through any functions it finds, and use the function's + // output as the value in the result. if you do provide the prefix, only functions that are named and have this prefix + // will be executed; other functions will be passed as values to the output. + populate: function (model, values, functionPrefix) { + // for a string, see if it has parameter matches, and if so, try to make the substitutions. + var getValue = function (fromString) { + var matches = fromString.match(/(\${.*?})/g); + if (matches != null) { + for (var i = 0; i < matches.length; i++) { + var val = values[matches[i].substring(2, matches[i].length - 1)] || ""; + if (val != null) { + fromString = fromString.replace(matches[i], val); + } + } + } + return fromString; + }, + // process one entry. + _one = function (d) { + if (d != null) { + if (_iss(d)) { + return getValue(d); + } + else if (_isf(d) && (functionPrefix == null || (d.name || "").indexOf(functionPrefix) === 0)) { + return d(values); + } + else if (_isa(d)) { + var r = []; + for (var i = 0; i < d.length; i++) + r.push(_one(d[i])); + return r; + } + else if (_iso(d)) { + var s = {}; + for (var j in d) { + s[j] = _one(d[j]); + } + return s; + } + else { + return d; + } + } + }; + + return _one(model); + }, + findWithFunction: function (a, f) { + if (a) + for (var i = 0; i < a.length; i++) if (f(a[i])) return i; + return -1; + }, + removeWithFunction: function (a, f) { + var idx = exports.findWithFunction(a, f); + if (idx > -1) a.splice(idx, 1); + return idx != -1; + }, + remove: function (l, v) { + var idx = l.indexOf(v); + if (idx > -1) l.splice(idx, 1); + return idx != -1; + }, + // TODO support insert index + addWithFunction: function (list, item, hashFunction) { + if (exports.findWithFunction(list, hashFunction) == -1) list.push(item); + }, + addToList: function (map, key, value, insertAtStart) { + var l = map[key]; + if (l == null) { + l = []; + map[key] = l; + } + l[insertAtStart ? "unshift" : "push"](value); + return l; + }, + // + // extends the given obj (which can be an array) with the given constructor function, prototype functions, and + // class members, any of which may be null. + // + extend: function (child, parent, _protoFn) { + var i; + parent = _isa(parent) ? parent : [ parent ]; + + for (i = 0; i < parent.length; i++) { + for (var j in parent[i].prototype) { + if (parent[i].prototype.hasOwnProperty(j)) { + child.prototype[j] = parent[i].prototype[j]; + } + } + } + + var _makeFn = function (name, protoFn) { + return function () { + for (i = 0; i < parent.length; i++) { + if (parent[i].prototype[name]) + parent[i].prototype[name].apply(this, arguments); + } + return protoFn.apply(this, arguments); + }; + }; + + var _oneSet = function (fns) { + for (var k in fns) { + child.prototype[k] = _makeFn(k, fns[k]); + } + }; + + if (arguments.length > 2) { + for (i = 2; i < arguments.length; i++) + _oneSet(arguments[i]); + } + + return child; + }, + uuid: function () { + return ('xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); + return v.toString(16); + })); + }, + logEnabled: true, + log: function () { + if (exports.logEnabled && typeof console != "undefined") { + try { + var msg = arguments[arguments.length - 1]; + console.log(msg); + } + catch (e) { + } + } + }, + + /** + * Wraps one function with another, creating a placeholder for the + * wrapped function if it was null. this is used to wrap the various + * drag/drop event functions - to allow jsPlumb to be notified of + * important lifecycle events without imposing itself on the user's + * drag/drop functionality. + * @method jsPlumbUtil.wrap + * @param {Function} wrappedFunction original function to wrap; may be null. + * @param {Function} newFunction function to wrap the original with. + * @param {Object} [returnOnThisValue] Optional. Indicates that the wrappedFunction should + * not be executed if the newFunction returns a value matching 'returnOnThisValue'. + * note that this is a simple comparison and only works for primitives right now. + */ + wrap: function (wrappedFunction, newFunction, returnOnThisValue) { + wrappedFunction = wrappedFunction || function () { + }; + newFunction = newFunction || function () { + }; + return function () { + var r = null; + try { + r = newFunction.apply(this, arguments); + } catch (e) { + exports.log("jsPlumb function failed : " + e); + } + if (returnOnThisValue == null || (r !== returnOnThisValue)) { + try { + r = wrappedFunction.apply(this, arguments); + } catch (e) { + exports.log("wrapped function failed : " + e); + } + } + return r; + }; + } + }; + + exports.EventGenerator = function () { + var _listeners = {}, + eventsSuspended = false, + // this is a list of events that should re-throw any errors that occur during their dispatch. it is current private. + eventsToDieOn = { "ready": true }; + + this.bind = function (event, listener, insertAtStart) { + var _one = function(evt) { + exports.addToList(_listeners, evt, listener, insertAtStart); + listener.__jsPlumb = listener.__jsPlumb || {}; + listener.__jsPlumb[jsPlumbUtil.uuid()] = evt; + }; + + if (typeof event === "string") _one(event); + else if (event.length != null) { + for (var i = 0; i < event.length; i++) { + _one(event[i]); + } + } + + return this; + }; + + this.fire = function (event, value, originalEvent) { + if (!eventsSuspended && _listeners[event]) { + var l = _listeners[event].length, i = 0, _gone = false, ret = null; + if (!this.shouldFireEvent || this.shouldFireEvent(event, value, originalEvent)) { + while (!_gone && i < l && ret !== false) { + // doing it this way rather than catching and then possibly re-throwing means that an error propagated by this + // method will have the whole call stack available in the debugger. + if (eventsToDieOn[event]) + _listeners[event][i].apply(this, [ value, originalEvent]); + else { + try { + ret = _listeners[event][i].apply(this, [ value, originalEvent ]); + } catch (e) { + exports.log("jsPlumb: fire failed for event " + event + " : " + e); + } + } + i++; + if (_listeners == null || _listeners[event] == null) + _gone = true; + } + } + } + return this; + }; + + this.unbind = function (eventOrListener, listener) { + + if (arguments.length === 0) { + _listeners = {}; + } + else if (arguments.length === 1) { + if (typeof eventOrListener === "string") + delete _listeners[eventOrListener]; + else if (eventOrListener.__jsPlumb) { + var evt; + for (var i in eventOrListener.__jsPlumb) { + evt = eventOrListener.__jsPlumb[i]; + exports.remove(_listeners[evt] || [], eventOrListener); + } + } + } + else if (arguments.length === 2) { + exports.remove(_listeners[eventOrListener] || [], listener); + } + + return this; + }; + + this.getListener = function (forEvent) { + return _listeners[forEvent]; + }; + this.setSuspendEvents = function (val) { + eventsSuspended = val; + }; + this.isSuspendEvents = function () { + return eventsSuspended; + }; + this.silently = function(fn) { + this.setSuspendEvents(true); + try { + fn(); + } + catch (e) { + jsPlumbUtil.log("Cannot execute silent function " + e); + } + this.setSuspendEvents(false); + }; + this.cleanupListeners = function () { + for (var i in _listeners) { + _listeners[i] = null; + } + }; + }; + + exports.EventGenerator.prototype = { + cleanup: function () { + this.cleanupListeners(); + } + }; + +}).call(this); + +/* + * jsPlumb + * + * Title:jsPlumb 2.0.2 + * + * Provides a way to visually connect elements on an HTML page, using SVG. + * + * This file contains utility functions that run in browsers only. + * + * Copyright (c) 2010 - 2015 jsPlumb (hello@jsplumbtoolkit.com) + * + * http://jsplumbtoolkit.com + * http://github.com/sporritt/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ + ;(function() { + + "use strict"; + + var root = this; + var exports = root.jsPlumbUtil; + + exports.matchesSelector = function(el, selector, ctx) { + ctx = ctx || el.parentNode; + var possibles = ctx.querySelectorAll(selector); + for (var i = 0; i < possibles.length; i++) { + if (possibles[i] === el) + return true; + } + return false; + }; + + exports.consume = function(e, doNotPreventDefault) { + if (e.stopPropagation) + e.stopPropagation(); + else + e.returnValue = false; + + if (!doNotPreventDefault && e.preventDefault) + e.preventDefault(); + }; + + /* + * Function: sizeElement + * Helper to size and position an element. You would typically use + * this when writing your own Connector or Endpoint implementation. + * + * Parameters: + * x - [int] x position for the element origin + * y - [int] y position for the element origin + * w - [int] width of the element + * h - [int] height of the element + * + */ + exports.sizeElement = function(el, x, y, w, h) { + if (el) { + el.style.height = h + "px"; + el.height = h; + el.style.width = w + "px"; + el.width = w; + el.style.left = x + "px"; + el.style.top = y + "px"; + } + }; + + + }).call(this); + +/* + * jsPlumb + * + * Title:jsPlumb 2.0.2 + * + * Provides a way to visually connect elements on an HTML page, using SVG. + * + * This file contains the core code. + * + * Copyright (c) 2010 - 2015 jsPlumb (hello@jsplumbtoolkit.com) + * + * http://jsplumbtoolkit.com + * http://github.com/sporritt/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +(function () { + + "use strict"; + + var root = this; + var connectorTypes = [], rendererTypes; + + var _ju = root.jsPlumbUtil, + _getOffset = function (el, _instance, relativeToRoot) { + return _instance.getOffset(el, relativeToRoot); + }, + + /** + * creates a timestamp, using milliseconds since 1970, but as a string. + */ + _timestamp = function () { + return "" + (new Date()).getTime(); + }, + + // helper method to update the hover style whenever it, or paintStyle, changes. + // we use paintStyle as the foundation and merge hoverPaintStyle over the + // top. + _updateHoverStyle = function (component) { + if (component._jsPlumb.paintStyle && component._jsPlumb.hoverPaintStyle) { + var mergedHoverStyle = {}; + jsPlumb.extend(mergedHoverStyle, component._jsPlumb.paintStyle); + jsPlumb.extend(mergedHoverStyle, component._jsPlumb.hoverPaintStyle); + delete component._jsPlumb.hoverPaintStyle; + // we want the fillStyle of paintStyle to override a gradient, if possible. + if (mergedHoverStyle.gradient && component._jsPlumb.paintStyle.fillStyle) + delete mergedHoverStyle.gradient; + component._jsPlumb.hoverPaintStyle = mergedHoverStyle; + } + }, + events = ["tap", "dbltap", "click", "dblclick", "mouseover", "mouseout", "mousemove", "mousedown", "mouseup", "contextmenu" ], + eventFilters = { "mouseout": "mouseleave", "mouseexit": "mouseleave" }, + _updateAttachedElements = function (component, state, timestamp, sourceElement) { + var affectedElements = component.getAttachedElements(); + if (affectedElements) { + for (var i = 0, j = affectedElements.length; i < j; i++) { + if (!sourceElement || sourceElement != affectedElements[i]) + affectedElements[i].setHover(state, true, timestamp); // tell the attached elements not to inform their own attached elements. + } + } + }, + _splitType = function (t) { + return t == null ? null : t.split(" "); + }, + _mapType = function(map, obj, typeId) { + for (var i in obj) + map[i] = typeId; + }, + _each = function(fn, obj) { + obj = _ju.isArray(obj) || (obj.length != null && !_ju.isString(obj)) ? obj : [ obj ]; + for (var i = 0; i < obj.length; i++) { + try { + fn.apply(obj[i], [ obj[i] ]); + } + catch (e) { + _ju.log(".each iteration failed : " + e); + } + } + }, + _applyTypes = function (component, params, doNotRepaint) { + if (component.getDefaultType) { + var td = component.getTypeDescriptor(), map = {}; + var defType = component.getDefaultType(); + var o = _ju.merge({}, defType); + _mapType(map, defType, "__default"); + for (var i = 0, j = component._jsPlumb.types.length; i < j; i++) { + var tid = component._jsPlumb.types[i]; + if (tid !== "__default") { + var _t = component._jsPlumb.instance.getType(tid, td); + if (_t != null) { + o = _ju.merge(o, _t, [ "cssClass" ]); + _mapType(map, _t, tid); + } + } + } + + if (params) { + o = _ju.populate(o, params, "_"); + } + + component.applyType(o, doNotRepaint, map); + if (!doNotRepaint) component.repaint(); + } + }, + +// ------------------------------ BEGIN jsPlumbUIComponent -------------------------------------------- + + jsPlumbUIComponent = root.jsPlumbUIComponent = function (params) { + + _ju.EventGenerator.apply(this, arguments); + + var self = this, + a = arguments, + idPrefix = self.idPrefix, + id = idPrefix + (new Date()).getTime(); + + this._jsPlumb = { + instance: params._jsPlumb, + parameters: params.parameters || {}, + paintStyle: null, + hoverPaintStyle: null, + paintStyleInUse: null, + hover: false, + beforeDetach: params.beforeDetach, + beforeDrop: params.beforeDrop, + overlayPlacements: [], + hoverClass: params.hoverClass || params._jsPlumb.Defaults.HoverClass, + types: [], + typeCache:{} + }; + + this.cacheTypeItem = function(key, item, typeId) { + this._jsPlumb.typeCache[typeId] = this._jsPlumb.typeCache[typeId] || {}; + this._jsPlumb.typeCache[typeId][key] = item; + }; + this.getCachedTypeItem = function(key, typeId) { + return this._jsPlumb.typeCache[typeId] ? this._jsPlumb.typeCache[typeId][key] : null; + }; + + this.getId = function () { + return id; + }; + +// ----------------------------- default type -------------------------------------------- + + + var o = params.overlays || [], oo = {}; + if (this.defaultOverlayKeys) { + for (var i = 0; i < this.defaultOverlayKeys.length; i++) + Array.prototype.push.apply(o, this._jsPlumb.instance.Defaults[this.defaultOverlayKeys[i]] || []); + + for (i = 0; i < o.length; i++) { + // if a string, convert to object representation so that we can store the typeid on it. + // also assign an id. + var fo = jsPlumb.convertToFullOverlaySpec(o[i]); + oo[fo[1].id] = fo; + } + } + + var _defaultType = { + overlays:oo, + parameters: params.parameters || {}, + scope: params.scope || this._jsPlumb.instance.getDefaultScope() + }; + this.getDefaultType = function() { + return _defaultType; + }; + this.appendToDefaultType = function(obj) { + for (var i in obj) _defaultType[i] = obj[i]; + }; + +// ----------------------------- end default type -------------------------------------------- + + // all components can generate events + + if (params.events) { + for (i in params.events) + self.bind(i, params.events[i]); + } + + // all components get this clone function. + // TODO issue 116 showed a problem with this - it seems 'a' that is in + // the clone function's scope is shared by all invocations of it, the classic + // JS closure problem. for now, jsPlumb does a version of this inline where + // it used to call clone. but it would be nice to find some time to look + // further at this. + this.clone = function () { + var o = {};//new Object(); + this.constructor.apply(o, a); + return o; + }.bind(this); + + // user can supply a beforeDetach callback, which will be executed before a detach + // is performed; returning false prevents the detach. + this.isDetachAllowed = function (connection) { + var r = true; + if (this._jsPlumb.beforeDetach) { + try { + r = this._jsPlumb.beforeDetach(connection); + } + catch (e) { + _ju.log("jsPlumb: beforeDetach callback failed", e); + } + } + return r; + }; + + // user can supply a beforeDrop callback, which will be executed before a dropped + // connection is confirmed. user can return false to reject connection. + this.isDropAllowed = function (sourceId, targetId, scope, connection, dropEndpoint, source, target) { + var r = this._jsPlumb.instance.checkCondition("beforeDrop", { + sourceId: sourceId, + targetId: targetId, + scope: scope, + connection: connection, + dropEndpoint: dropEndpoint, + source: source, target: target + }); + if (this._jsPlumb.beforeDrop) { + try { + r = this._jsPlumb.beforeDrop({ + sourceId: sourceId, + targetId: targetId, + scope: scope, + connection: connection, + dropEndpoint: dropEndpoint, + source: source, target: target + }); + } + catch (e) { + _ju.log("jsPlumb: beforeDrop callback failed", e); + } + } + return r; + }; + + var boundListeners = [], + bindAListener = function (obj, type, fn) { + boundListeners.push([obj, type, fn]); + obj.bind(type, fn); + }, + domListeners = []; + + // sets the component associated with listener events. for instance, an overlay delegates + // its events back to a connector. but if the connector is swapped on the underlying connection, + // then this component must be changed. This is called by setConnector in the Connection class. + this.setListenerComponent = function (c) { + for (var i = 0; i < domListeners.length; i++) + domListeners[i][3] = c; + }; + + + }; + + var _removeTypeCssHelper = function (component, typeIndex) { + var typeId = component._jsPlumb.types[typeIndex], + type = component._jsPlumb.instance.getType(typeId, component.getTypeDescriptor()); + + if (type != null) { + + if (type.cssClass && component.canvas) + component._jsPlumb.instance.removeClass(component.canvas, type.cssClass); + } + }; + + _ju.extend(root.jsPlumbUIComponent, _ju.EventGenerator, { + + getParameter: function (name) { + return this._jsPlumb.parameters[name]; + }, + + setParameter: function (name, value) { + this._jsPlumb.parameters[name] = value; + }, + + getParameters: function () { + return this._jsPlumb.parameters; + }, + + setParameters: function (p) { + this._jsPlumb.parameters = p; + }, + + getClass:function() { + return jsPlumb.getClass(this.canvas); + }, + + hasClass:function(clazz) { + return jsPlumb.hasClass(this.canvas, clazz); + }, + + addClass: function (clazz) { + jsPlumb.addClass(this.canvas, clazz); + }, + + removeClass: function (clazz) { + jsPlumb.removeClass(this.canvas, clazz); + }, + + updateClasses: function (classesToAdd, classesToRemove) { + jsPlumb.updateClasses(this.canvas, classesToAdd, classesToRemove); + }, + + setType: function (typeId, params, doNotRepaint) { + this.clearTypes(); + this._jsPlumb.types = _splitType(typeId) || []; + _applyTypes(this, params, doNotRepaint); + }, + + getType: function () { + return this._jsPlumb.types; + }, + + reapplyTypes: function (params, doNotRepaint) { + _applyTypes(this, params, doNotRepaint); + }, + + hasType: function (typeId) { + return this._jsPlumb.types.indexOf(typeId) != -1; + }, + + addType: function (typeId, params, doNotRepaint) { + var t = _splitType(typeId), _cont = false; + if (t != null) { + for (var i = 0, j = t.length; i < j; i++) { + if (!this.hasType(t[i])) { + this._jsPlumb.types.push(t[i]); + _cont = true; + } + } + if (_cont) _applyTypes(this, params, doNotRepaint); + } + }, + + removeType: function (typeId, params, doNotRepaint) { + var t = _splitType(typeId), _cont = false, _one = function (tt) { + var idx = this._jsPlumb.types.indexOf(tt); + if (idx != -1) { + // remove css class if necessary + _removeTypeCssHelper(this, idx); + this._jsPlumb.types.splice(idx, 1); + return true; + } + return false; + }.bind(this); + + if (t != null) { + for (var i = 0, j = t.length; i < j; i++) { + _cont = _one(t[i]) || _cont; + } + if (_cont) _applyTypes(this, params, doNotRepaint); + } + }, + clearTypes: function (params, doNotRepaint) { + var i = this._jsPlumb.types.length; + for (var j = 0; j < i; j++) { + _removeTypeCssHelper(this, 0); + this._jsPlumb.types.splice(0, 1); + } + _applyTypes(this, params, doNotRepaint); + }, + + toggleType: function (typeId, params, doNotRepaint) { + var t = _splitType(typeId); + if (t != null) { + for (var i = 0, j = t.length; i < j; i++) { + var idx = this._jsPlumb.types.indexOf(t[i]); + if (idx != -1) { + _removeTypeCssHelper(this, idx); + this._jsPlumb.types.splice(idx, 1); + } + else + this._jsPlumb.types.push(t[i]); + } + + _applyTypes(this, params, doNotRepaint); + } + }, + applyType: function (t, doNotRepaint) { + this.setPaintStyle(t.paintStyle, doNotRepaint); + this.setHoverPaintStyle(t.hoverPaintStyle, doNotRepaint); + if (t.parameters) { + for (var i in t.parameters) + this.setParameter(i, t.parameters[i]); + } + this._jsPlumb.paintStyleInUse = this.getPaintStyle(); + }, + setPaintStyle: function (style, doNotRepaint) { +// this._jsPlumb.paintStyle = jsPlumb.extend({}, style); +// TODO figure out if we want components to clone paintStyle so as not to share it. + this._jsPlumb.paintStyle = style; + this._jsPlumb.paintStyleInUse = this._jsPlumb.paintStyle; + _updateHoverStyle(this); + if (!doNotRepaint) this.repaint(); + }, + getPaintStyle: function () { + return this._jsPlumb.paintStyle; + }, + setHoverPaintStyle: function (style, doNotRepaint) { + //this._jsPlumb.hoverPaintStyle = jsPlumb.extend({}, style); +// TODO figure out if we want components to clone paintStyle so as not to share it. + this._jsPlumb.hoverPaintStyle = style; + _updateHoverStyle(this); + if (!doNotRepaint) this.repaint(); + }, + getHoverPaintStyle: function () { + return this._jsPlumb.hoverPaintStyle; + }, + destroy: function (force) { + if (force || this.typeId == null) { + this.cleanupListeners(); // this is on EventGenerator + this.clone = null; + this._jsPlumb = null; + } + }, + + isHover: function () { + return this._jsPlumb.hover; + }, + + setHover: function (hover, ignoreAttachedElements, timestamp) { + // while dragging, we ignore these events. this keeps the UI from flashing and + // swishing and whatevering. + if (this._jsPlumb && !this._jsPlumb.instance.currentlyDragging && !this._jsPlumb.instance.isHoverSuspended()) { + + this._jsPlumb.hover = hover; + + if (this.canvas != null) { + if (this._jsPlumb.instance.hoverClass != null) { + var method = hover ? "addClass" : "removeClass"; + this._jsPlumb.instance[method](this.canvas, this._jsPlumb.instance.hoverClass); + } + if (this._jsPlumb.hoverClass != null) { + this._jsPlumb.instance[method](this.canvas, this._jsPlumb.hoverClass); + } + } + if (this._jsPlumb.hoverPaintStyle != null) { + this._jsPlumb.paintStyleInUse = hover ? this._jsPlumb.hoverPaintStyle : this._jsPlumb.paintStyle; + if (!this._jsPlumb.instance.isSuspendDrawing()) { + timestamp = timestamp || _timestamp(); + this.repaint({timestamp: timestamp, recalc: false}); + } + } + // get the list of other affected elements, if supported by this component. + // for a connection, its the endpoints. for an endpoint, its the connections! surprise. + if (this.getAttachedElements && !ignoreAttachedElements) + _updateAttachedElements(this, hover, _timestamp(), this); + } + } + }); + +// ------------------------------ END jsPlumbUIComponent -------------------------------------------- + + var _jsPlumbInstanceIndex = 0, + getInstanceIndex = function () { + var i = _jsPlumbInstanceIndex + 1; + _jsPlumbInstanceIndex++; + return i; + }; + + var jsPlumbInstance = window.jsPlumbInstance = function (_defaults) { + + this.Defaults = { + Anchor: "Bottom", + Anchors: [ null, null ], + ConnectionsDetachable: true, + ConnectionOverlays: [ ], + Connector: "Bezier", + Container: null, + DoNotThrowErrors: false, + DragOptions: { }, + DropOptions: { }, + Endpoint: "Dot", + EndpointOverlays: [ ], + Endpoints: [ null, null ], + EndpointStyle: { fillStyle: "#456" }, + EndpointStyles: [ null, null ], + EndpointHoverStyle: null, + EndpointHoverStyles: [ null, null ], + HoverPaintStyle: null, + LabelStyle: { color: "black" }, + LogEnabled: false, + Overlays: [ ], + MaxConnections: 1, + PaintStyle: { lineWidth: 4, strokeStyle: "#456" }, + ReattachConnections: false, + RenderMode: "svg", + Scope: "jsPlumb_DefaultScope" + }; + if (_defaults) jsPlumb.extend(this.Defaults, _defaults); + + this.logEnabled = this.Defaults.LogEnabled; + this._connectionTypes = {}; + this._endpointTypes = {}; + + _ju.EventGenerator.apply(this); + + var _currentInstance = this, + _instanceIndex = getInstanceIndex(), + _bb = _currentInstance.bind, + _initialDefaults = {}, + _zoom = 1, + _info = function (el) { + if (el == null) return null; + else if (el.nodeType == 3 || el.nodeType == 8) { + return { el:el, text:true }; + } + else { + var _el = _currentInstance.getElement(el); + return { el: _el, id: (_ju.isString(el) && _el == null) ? el : _getId(_el) }; + } + }; + + this.getInstanceIndex = function () { + return _instanceIndex; + }; + + this.setZoom = function (z, repaintEverything) { + _zoom = z; + _currentInstance.fire("zoom", _zoom); + if (repaintEverything) _currentInstance.repaintEverything(); + return true; + }; + this.getZoom = function () { + return _zoom; + }; + + for (var i in this.Defaults) + _initialDefaults[i] = this.Defaults[i]; + + var _container, _containerDelegations = []; + this.unbindContainer = function() { + if (_container != null && _containerDelegations.length > 0) { + for (var i = 0; i < _containerDelegations.length; i++) { + _currentInstance.off(_container, _containerDelegations[i][0], _containerDelegations[i][1]); + } + } + }; + this.setContainer = function (c) { + + this.unbindContainer(); + + // get container as dom element. + c = this.getElement(c); + // move existing connections and endpoints, if any. + this.select().each(function (conn) { + conn.moveParent(c); + }); + this.selectEndpoints().each(function (ep) { + ep.moveParent(c); + }); + + // set container. + var previousContainer = _container; + _container = c; + _containerDelegations.length = 0; + + var _oneDelegateHandler = function (id, e) { + var t = e.srcElement || e.target, + jp = (t && t.parentNode ? t.parentNode._jsPlumb : null) || (t ? t._jsPlumb : null) || (t && t.parentNode && t.parentNode.parentNode ? t.parentNode.parentNode._jsPlumb : null); + if (jp) { + jp.fire(id, jp, e); + // jsplumb also fires every event coming from components/overlays. That's what the test for `jp.component` is for. + _currentInstance.fire(id, jp.component || jp, e); + } + }; + + var _addOneDelegate = function(eventId, selector, fn) { + _containerDelegations.push([eventId, fn]); + _currentInstance.on(_container, eventId, selector, fn); + }; + + // delegate one event on the container to jsplumb elements. it might be possible to + // abstract this out: each of endpoint, connection and overlay could register themselves with + // jsplumb as "component types" or whatever, and provide a suitable selector. this would be + // done by the renderer (although admittedly from 2.0 onwards we're not supporting vml anymore) + var _oneDelegate = function (id) { + // connections. + _addOneDelegate(id, ".jsplumb-connector > *", function (e) { + _oneDelegateHandler(id, e); + }); + // endpoints. note they can have an enclosing div, or not. + _addOneDelegate(id, ".jsplumb-endpoint, .jsplumb-endpoint > *, .jsplumb-endpoint svg *", function (e) { + _oneDelegateHandler(id, e); + }); + // overlays + _addOneDelegate(id, ".jsplumb-overlay, .jsplumb-overlay *", function (e) { + _oneDelegateHandler(id, e); + }); + }; + + for (var i = 0; i < events.length; i++) + _oneDelegate(events[i]); + + // managed elements + for (var elId in managedElements) { + var el = managedElements[elId].el; + if (el.parentNode === previousContainer) { + previousContainer.removeChild(el); + _container.appendChild(el); + } + } + + }; + this.getContainer = function () { + return _container; + }; + + this.bind = function (event, fn) { + if ("ready" === event && initialized) fn(); + else _bb.apply(_currentInstance, [event, fn]); + }; + + _currentInstance.importDefaults = function (d) { + for (var i in d) { + _currentInstance.Defaults[i] = d[i]; + } + if (d.Container) + _currentInstance.setContainer(d.Container); + + return _currentInstance; + }; + + _currentInstance.restoreDefaults = function () { + _currentInstance.Defaults = jsPlumb.extend({}, _initialDefaults); + return _currentInstance; + }; + + var log = null, + initialized = false, + // TODO remove from window scope + connections = [], + // map of element id -> endpoint lists. an element can have an arbitrary + // number of endpoints on it, and not all of them have to be connected + // to anything. + endpointsByElement = {}, + endpointsByUUID = {}, + managedElements = {}, + offsets = {}, + offsetTimestamps = {}, + draggableStates = {}, + connectionBeingDragged = false, + sizes = [], + _suspendDrawing = false, + _suspendedAt = null, + DEFAULT_SCOPE = this.Defaults.Scope, + renderMode = null, // will be set in init() + _curIdStamp = 1, + _idstamp = function () { + return "" + _curIdStamp++; + }, + + // + // appends an element to some other element, which is calculated as follows: + // + // 1. if Container exists, use that element. + // 2. if the 'parent' parameter exists, use that. + // 3. otherwise just use the root element. + // + // + _appendElement = function (el, parent) { + if (_container) + _container.appendChild(el); + else if (!parent) + this.appendToRoot(el); + else + this.getElement(parent).appendChild(el); + }.bind(this), + + // + // Draws an endpoint and its connections. this is the main entry point into drawing connections as well + // as endpoints, since jsPlumb is endpoint-centric under the hood. + // + // @param element element to draw (of type library specific element object) + // @param ui UI object from current library's event system. optional. + // @param timestamp timestamp for this paint cycle. used to speed things up a little by cutting down the amount of offset calculations we do. + // @param clearEdits defaults to false; indicates that mouse edits for connectors should be cleared + /// + _draw = function (element, ui, timestamp, clearEdits) { + + // TODO is it correct to filter by headless at this top level? how would a headless adapter ever repaint? + // NO. it is not correct. + if (!jsPlumb.headless && !_suspendDrawing) { + var id = _getId(element), + repaintEls = _currentInstance.getDragManager().getElementsForDraggable(id); + + if (timestamp == null) timestamp = _timestamp(); + + // update the offset of everything _before_ we try to draw anything. + var o = _updateOffset({ elId: id, offset: ui, recalc: false, timestamp: timestamp }); + + if (repaintEls) { + for (var i in repaintEls) { + _updateOffset({ + elId: repaintEls[i].id, + offset: { + left: o.o.left + repaintEls[i].offset.left, + top: o.o.top + repaintEls[i].offset.top + }, + recalc: false, + timestamp: timestamp + }); + } + } + + _currentInstance.anchorManager.redraw(id, ui, timestamp, null, clearEdits); + + if (repaintEls) { + for (var j in repaintEls) { + _currentInstance.anchorManager.redraw(repaintEls[j].id, ui, timestamp, repaintEls[j].offset, clearEdits, true); + } + } + } + }, + + // + // gets an Endpoint by uuid. + // + _getEndpoint = function (uuid) { + return endpointsByUUID[uuid]; + }, + + /** + * inits a draggable if it's not already initialised. + * TODO: somehow abstract this to the adapter, because the concept of "draggable" has no + * place on the server. + */ + _initDraggableIfNecessary = function (element, isDraggable, dragOptions, id) { + // move to DragManager? + if (!jsPlumb.headless) { + var _draggable = isDraggable == null ? false : isDraggable; + if (_draggable) { + if (jsPlumb.isDragSupported(element, _currentInstance)) { + var options = dragOptions || _currentInstance.Defaults.DragOptions; + options = jsPlumb.extend({}, options); // make a copy. + if (!jsPlumb.isAlreadyDraggable(element, _currentInstance)) { + var dragEvent = jsPlumb.dragEvents.drag, + stopEvent = jsPlumb.dragEvents.stop, + startEvent = jsPlumb.dragEvents.start, + _del = _currentInstance.getElement(element), + _ancestor = _currentInstance.getDragManager().getDragAncestor(_del), + _noOffset = {left: 0, top: 0}, + _ancestorOffset = _noOffset, + _started = false; + + _manage(id, element); + + options[startEvent] = _ju.wrap(options[startEvent], function () { + _ancestorOffset = _ancestor != null ? _currentInstance.getOffset(_ancestor) : _noOffset; + _currentInstance.setHoverSuspended(true); + _currentInstance.select({source: element}).addClass(_currentInstance.elementDraggingClass + " " + _currentInstance.sourceElementDraggingClass, true); + _currentInstance.select({target: element}).addClass(_currentInstance.elementDraggingClass + " " + _currentInstance.targetElementDraggingClass, true); + _currentInstance.setConnectionBeingDragged(true); + if (options.canDrag) return dragOptions.canDrag(); + }, false); + + options[dragEvent] = _ju.wrap(options[dragEvent], function () { + // TODO: here we could actually use getDragObject, and then compute it ourselves, + // since every adapter does the same thing. but i'm not sure why YUI's getDragObject + // differs from getUIPosition so much + var ui = _currentInstance.getUIPosition(arguments, _currentInstance.getZoom()); + // adjust by ancestor offset if there is one: this is for the case that a draggable + // is contained inside some other element that is not the Container. + ui.left += _ancestorOffset.left; + ui.top += _ancestorOffset.top; + _draw(element, ui, null, true); + if (_started) _currentInstance.addClass(element, "jsplumb-dragged"); + _started = true; + }); + options[stopEvent] = _ju.wrap(options[stopEvent], function () { + var elements = arguments[0].selection; + var uip = _currentInstance.getUIPosition(arguments); + + // this is one element + var _one = function (_e) { + _draw(_e[0], uip); + _currentInstance.removeClass(_e[0], "jsplumb-dragged"); + _currentInstance.select({source: _e[0]}).removeClass(_currentInstance.elementDraggingClass + " " + _currentInstance.sourceElementDraggingClass, true); + _currentInstance.select({target: _e[0]}).removeClass(_currentInstance.elementDraggingClass + " " + _currentInstance.targetElementDraggingClass, true); + _currentInstance.getDragManager().dragEnded(_e[0]); + }; + + for (var i = 0; i < elements.length; i++) + _one(elements[i]); + + // this is common across all + _started = false; + _currentInstance.setHoverSuspended(false); + _currentInstance.setConnectionBeingDragged(false); + }); + var elId = _getId(element); // need ID + draggableStates[elId] = true; + var draggable = draggableStates[elId]; + options.disabled = draggable == null ? false : !draggable; + _currentInstance.initDraggable(element, options); + _currentInstance.getDragManager().register(element); + } + else { + // already draggable. attach any start, drag or stop listeners to the current Drag. + if (dragOptions.force) { + _currentInstance.initDraggable(element, options); + } + } + } + } + } + }, + + _scopeMatch = function (e1, e2) { + var s1 = e1.scope.split(/\s/), s2 = e2.scope.split(/\s/); + for (var i = 0; i < s1.length; i++) + for (var j = 0; j < s2.length; j++) + if (s2[j] == s1[i]) return true; + + return false; + }, + + /* + * prepares a final params object that can be passed to _newConnection, taking into account defaults, events, etc. + */ + _prepareConnectionParams = function (params, referenceParams) { + var _p = jsPlumb.extend({ }, params); + if (referenceParams) jsPlumb.extend(_p, referenceParams); + + // hotwire endpoints passed as source or target to sourceEndpoint/targetEndpoint, respectively. + if (_p.source) { + if (_p.source.endpoint) + _p.sourceEndpoint = _p.source; + else + _p.source = _currentInstance.getElement(_p.source); + } + if (_p.target) { + if (_p.target.endpoint) + _p.targetEndpoint = _p.target; + else + _p.target = _currentInstance.getElement(_p.target); + } + + // test for endpoint uuids to connect + if (params.uuids) { + _p.sourceEndpoint = _getEndpoint(params.uuids[0]); + _p.targetEndpoint = _getEndpoint(params.uuids[1]); + } + + // now ensure that if we do have Endpoints already, they're not full. + // source: + if (_p.sourceEndpoint && _p.sourceEndpoint.isFull()) { + _ju.log(_currentInstance, "could not add connection; source endpoint is full"); + return; + } + + // target: + if (_p.targetEndpoint && _p.targetEndpoint.isFull()) { + _ju.log(_currentInstance, "could not add connection; target endpoint is full"); + return; + } + + // if source endpoint mandates connection type and nothing specified in our params, use it. + if (!_p.type && _p.sourceEndpoint) + _p.type = _p.sourceEndpoint.connectionType; + + // copy in any connectorOverlays that were specified on the source endpoint. + // it doesnt copy target endpoint overlays. i'm not sure if we want it to or not. + if (_p.sourceEndpoint && _p.sourceEndpoint.connectorOverlays) { + _p.overlays = _p.overlays || []; + for (var i = 0, j = _p.sourceEndpoint.connectorOverlays.length; i < j; i++) { + _p.overlays.push(_p.sourceEndpoint.connectorOverlays[i]); + } + } + + // scope + if (_p.sourceEndpoint && _p.sourceEndpoint.scope) { + _p.scope = _p.sourceEndpoint.scope; + } + + // pointer events + if (!_p["pointer-events"] && _p.sourceEndpoint && _p.sourceEndpoint.connectorPointerEvents) + _p["pointer-events"] = _p.sourceEndpoint.connectorPointerEvents; + + var _mergeOverrides = function (def, values) { + var m = jsPlumb.extend({}, def); + for (var i in values) { + if (values[i]) m[i] = values[i]; + } + return m; + }; + + var _addEndpoint = function (el, def, idx) { + return _currentInstance.addEndpoint(el, _mergeOverrides(def, { + anchor: _p.anchors ? _p.anchors[idx] : _p.anchor, + endpoint: _p.endpoints ? _p.endpoints[idx] : _p.endpoint, + paintStyle: _p.endpointStyles ? _p.endpointStyles[idx] : _p.endpointStyle, + hoverPaintStyle: _p.endpointHoverStyles ? _p.endpointHoverStyles[idx] : _p.endpointHoverStyle + })); + }; + + // check for makeSource/makeTarget specs. + + var _oneElementDef = function (type, idx, defs, matchType) { + if (_p[type] && !_p[type].endpoint && !_p[type + "Endpoint"] && !_p.newConnection) { + var tid = _getId(_p[type]), tep = defs[tid]; + + tep = tep ? tep[matchType] : null; + + if (tep) { + // if not enabled, return. + if (!tep.enabled) return false; + var newEndpoint = tep.endpoint != null && tep.endpoint._jsPlumb ? tep.endpoint : _addEndpoint(_p[type], tep.def, idx); + if (newEndpoint.isFull()) return false; + _p[type + "Endpoint"] = newEndpoint; + newEndpoint._doNotDeleteOnDetach = false; // reset. + newEndpoint._deleteOnDetach = true; + if (tep.uniqueEndpoint) { + if (!tep.endpoint) { + tep.endpoint = newEndpoint; + newEndpoint._deleteOnDetach = false; + newEndpoint._doNotDeleteOnDetach = true; + } + else + newEndpoint.finalEndpoint = tep.endpoint; + } + } + } + }; + + if (_oneElementDef("source", 0, this.sourceEndpointDefinitions, _p.type || "default") === false) return; + if (_oneElementDef("target", 1, this.targetEndpointDefinitions, _p.type || "default") === false) return; + + // last, ensure scopes match + if (_p.sourceEndpoint && _p.targetEndpoint) + if (!_scopeMatch(_p.sourceEndpoint, _p.targetEndpoint)) _p = null; + + return _p; + }.bind(_currentInstance), + + _newConnection = function (params) { + var connectionFunc = _currentInstance.Defaults.ConnectionType || _currentInstance.getDefaultConnectionType(); + + params._jsPlumb = _currentInstance; + params.newConnection = _newConnection; + params.newEndpoint = _newEndpoint; + params.endpointsByUUID = endpointsByUUID; + params.endpointsByElement = endpointsByElement; + params.finaliseConnection = _finaliseConnection; + params.id = "con_" + _idstamp(); + var con = new connectionFunc(params); + + // if the connection is draggable, then maybe we need to tell the target endpoint to init the + // dragging code. it won't run again if it already configured to be draggable. + if (con.isDetachable()) { + con.endpoints[0].initDraggable("_jsPlumbSource"); + con.endpoints[1].initDraggable("_jsPlumbTarget"); + } + + return con; + }, + + // + // adds the connection to the backing model, fires an event if necessary and then redraws + // + _finaliseConnection = _currentInstance.finaliseConnection = function (jpc, params, originalEvent, doInformAnchorManager) { + params = params || {}; + // add to list of connections (by scope). + if (!jpc.suspendedEndpoint) + connections.push(jpc); + + jpc.pending = null; + + // turn off isTemporarySource on the source endpoint (only viable on first draw) + jpc.endpoints[0].isTemporarySource = false; + + // always inform the anchor manager + // except that if jpc has a suspended endpoint it's not true to say the + // connection is new; it has just (possibly) moved. the question is whether + // to make that call here or in the anchor manager. i think perhaps here. + if (doInformAnchorManager !== false) + _currentInstance.anchorManager.newConnection(jpc); + + // force a paint + _draw(jpc.source); + + // fire an event + if (!params.doNotFireConnectionEvent && params.fireEvent !== false) { + + var eventArgs = { + connection: jpc, + source: jpc.source, target: jpc.target, + sourceId: jpc.sourceId, targetId: jpc.targetId, + sourceEndpoint: jpc.endpoints[0], targetEndpoint: jpc.endpoints[1] + }; + + _currentInstance.fire("connection", eventArgs, originalEvent); + } + }, + + /* + factory method to prepare a new endpoint. this should always be used instead of creating Endpoints + manually, since this method attaches event listeners and an id. + */ + _newEndpoint = function (params, id) { + var endpointFunc = _currentInstance.Defaults.EndpointType || jsPlumb.Endpoint; + var _p = jsPlumb.extend({}, params); + _p._jsPlumb = _currentInstance; + _p.newConnection = _newConnection; + _p.newEndpoint = _newEndpoint; + _p.endpointsByUUID = endpointsByUUID; + _p.endpointsByElement = endpointsByElement; + _p.fireDetachEvent = fireDetachEvent; + _p.elementId = id || _getId(_p.source); + var ep = new endpointFunc(_p); + ep.id = "ep_" + _idstamp(); + _manage(_p.elementId, _p.source); + + if (!jsPlumb.headless) + _currentInstance.getDragManager().endpointAdded(_p.source, id); + + return ep; + }, + + /* + * performs the given function operation on all the connections found + * for the given element id; this means we find all the endpoints for + * the given element, and then for each endpoint find the connectors + * connected to it. then we pass each connection in to the given + * function. + */ + _operation = function (elId, func, endpointFunc) { + var endpoints = endpointsByElement[elId]; + if (endpoints && endpoints.length) { + for (var i = 0, ii = endpoints.length; i < ii; i++) { + for (var j = 0, jj = endpoints[i].connections.length; j < jj; j++) { + var retVal = func(endpoints[i].connections[j]); + // if the function passed in returns true, we exit. + // most functions return false. + if (retVal) return; + } + if (endpointFunc) endpointFunc(endpoints[i]); + } + } + }, + + _setDraggable = function (element, draggable) { + return jsPlumb.each(element, function (el) { + if (_currentInstance.isDragSupported(el)) { + draggableStates[_currentInstance.getAttribute(el, "id")] = draggable; + _currentInstance.setElementDraggable(el, draggable); + } + }); + }, + /* + * private method to do the business of hiding/showing. + * + * @param el + * either Id of the element in question or a library specific + * object for the element. + * @param state + * String specifying a value for the css 'display' property + * ('block' or 'none'). + */ + _setVisible = function (el, state, alsoChangeEndpoints) { + state = state === "block"; + var endpointFunc = null; + if (alsoChangeEndpoints) { + if (state) endpointFunc = function (ep) { + ep.setVisible(true, true, true); + }; + else endpointFunc = function (ep) { + ep.setVisible(false, true, true); + }; + } + var info = _info(el); + _operation(info.id, function (jpc) { + if (state && alsoChangeEndpoints) { + // this test is necessary because this functionality is new, and i wanted to maintain backwards compatibility. + // this block will only set a connection to be visible if the other endpoint in the connection is also visible. + var oidx = jpc.sourceId === info.id ? 1 : 0; + if (jpc.endpoints[oidx].isVisible()) jpc.setVisible(true); + } + else // the default behaviour for show, and what always happens for hide, is to just set the visibility without getting clever. + jpc.setVisible(state); + }, endpointFunc); + }, + /* + * toggles the draggable state of the given element(s). + * el is either an id, or an element object, or a list of ids/element objects. + */ + _toggleDraggable = function (el) { + return jsPlumb.each(el, function (el) { + var elId = _currentInstance.getAttribute(el, "id"); + var state = draggableStates[elId] == null ? false : draggableStates[elId]; + state = !state; + draggableStates[elId] = state; + _currentInstance.setDraggable(el, state); + return state; + }.bind(this)); + }, + /** + * private method to do the business of toggling hiding/showing. + */ + _toggleVisible = function (elId, changeEndpoints) { + var endpointFunc = null; + if (changeEndpoints) { + endpointFunc = function (ep) { + var state = ep.isVisible(); + ep.setVisible(!state); + }; + } + _operation(elId, function (jpc) { + var state = jpc.isVisible(); + jpc.setVisible(!state); + }, endpointFunc); + }, + + // TODO comparison performance + _getCachedData = function (elId) { + var o = offsets[elId]; + if (!o) + return _updateOffset({elId: elId}); + else + return {o: o, s: sizes[elId]}; + }, + + /** + * gets an id for the given element, creating and setting one if + * necessary. the id is of the form + * + * jsPlumb_<instance index>_<index in instance> + * + * where "index in instance" is a monotonically increasing integer that starts at 0, + * for each instance. this method is used not only to assign ids to elements that do not + * have them but also to connections and endpoints. + */ + _getId = function (element, uuid, doNotCreateIfNotFound) { + if (_ju.isString(element)) return element; + if (element == null) return null; + var id = _currentInstance.getAttribute(element, "id"); + if (!id || id === "undefined") { + // check if fixed uuid parameter is given + if (arguments.length == 2 && arguments[1] !== undefined) + id = uuid; + else if (arguments.length == 1 || (arguments.length == 3 && !arguments[2])) + id = "jsPlumb_" + _instanceIndex + "_" + _idstamp(); + + if (!doNotCreateIfNotFound) _currentInstance.setAttribute(element, "id", id); + } + return id; + }; + + this.setConnectionBeingDragged = function (v) { + connectionBeingDragged = v; + }; + this.isConnectionBeingDragged = function () { + return connectionBeingDragged; + }; + + /** + * Returns a map of all the elements this jsPlumbInstance is currently managing. + * @returns {Object} Map of [id-> {el, endpoint[], connection, position}] information. + */ + this.getManagedElements = function() { + return managedElements; + }; + + this.getRenderMode = function() { return "svg"; }; + + this.connectorClass = "jsplumb-connector"; + this.connectorOutlineClass = "jsplumb-connector-outline"; + this.editableConnectorClass = "jsplumb-connector-editable"; + this.connectedClass = "jsplumb-connected"; + this.hoverClass = "jsplumb-hover"; + this.endpointClass = "jsplumb-endpoint"; + this.endpointConnectedClass = "jsplumb-endpoint-connected"; + this.endpointFullClass = "jsplumb-endpoint-full"; + this.endpointDropAllowedClass = "jsplumb-endpoint-drop-allowed"; + this.endpointDropForbiddenClass = "jsplumb-endpoint-drop-forbidden"; + this.overlayClass = "jsplumb-overlay"; + this.draggingClass = "jsplumb-dragging"; + this.elementDraggingClass = "jsplumb-element-dragging"; + this.sourceElementDraggingClass = "jsplumb-source-element-dragging"; + this.targetElementDraggingClass = "jsplumb-target-element-dragging"; + this.endpointAnchorClassPrefix = "jsplumb-endpoint-anchor"; + this.hoverSourceClass = "jsplumb-source-hover"; + this.hoverTargetClass = "jsplumb-target-hover"; + this.dragSelectClass = "jsplumb-drag-select"; + + this.Anchors = {}; + this.Connectors = { "svg": {} }; + this.Endpoints = { "svg": {} }; + this.Overlays = { "svg": {} } ; + this.ConnectorRenderers = {}; + this.SVG = "svg"; + +// --------------------------- jsPlumbInstance public API --------------------------------------------------------- + + + this.addEndpoint = function (el, params, referenceParams) { + referenceParams = referenceParams || {}; + var p = jsPlumb.extend({}, referenceParams); + jsPlumb.extend(p, params); + p.endpoint = p.endpoint || _currentInstance.Defaults.Endpoint; + p.paintStyle = p.paintStyle || _currentInstance.Defaults.EndpointStyle; + + var results = [], + inputs = (_ju.isArray(el) || (el.length != null && !_ju.isString(el))) ? el : [ el ]; + + for (var i = 0, j = inputs.length; i < j; i++) { + p.source = _currentInstance.getElement(inputs[i]); + _ensureContainer(p.source); + + var id = _getId(p.source), e = _newEndpoint(p, id); + + // SP new. here we have introduced a class-wide element manager, which is responsible + // for getting object dimensions and width/height, and for updating these values only + // when necessary (after a drag, or on a forced refresh call). + var myOffset = _manage(id, p.source).info.o; + _ju.addToList(endpointsByElement, id, e); + + if (!_suspendDrawing) { + e.paint({ + anchorLoc: e.anchor.compute({ xy: [ myOffset.left, myOffset.top ], wh: sizes[id], element: e, timestamp: _suspendedAt }), + timestamp: _suspendedAt + }); + } + + results.push(e); + e._doNotDeleteOnDetach = true; // mark this as being added via addEndpoint. + } + + return results.length == 1 ? results[0] : results; + }; + + this.addEndpoints = function (el, endpoints, referenceParams) { + var results = []; + for (var i = 0, j = endpoints.length; i < j; i++) { + var e = _currentInstance.addEndpoint(el, endpoints[i], referenceParams); + if (_ju.isArray(e)) + Array.prototype.push.apply(results, e); + else results.push(e); + } + return results; + }; + + this.animate = function (el, properties, options) { + if (!this.animationSupported) return false; + + options = options || {}; + var del = _currentInstance.getElement(el), + id = _getId(del), + stepFunction = jsPlumb.animEvents.step, + completeFunction = jsPlumb.animEvents.complete; + + options[stepFunction] = _ju.wrap(options[stepFunction], function () { + _currentInstance.revalidate(id); + }); + + // onComplete repaints, just to make sure everything looks good at the end of the animation. + options[completeFunction] = _ju.wrap(options[completeFunction], function () { + _currentInstance.revalidate(id); + }); + + _currentInstance.doAnimate(del, properties, options); + }; + + /** + * checks for a listener for the given condition, executing it if found, passing in the given value. + * condition listeners would have been attached using "bind" (which is, you could argue, now overloaded, since + * firing click events etc is a bit different to what this does). i thought about adding a "bindCondition" + * or something, but decided against it, for the sake of simplicity. jsPlumb will never fire one of these + * condition events anyway. + */ + this.checkCondition = function (conditionName, args) { + var l = _currentInstance.getListener(conditionName), + r = true; + + if (l && l.length > 0) { + var values = Array.prototype.slice.call(arguments, 1); + try { + for (var i = 0, j = l.length; i < j; i++) { + r = r && l[i].apply(l[i], values); + } + } + catch (e) { + _ju.log(_currentInstance, "cannot check condition [" + conditionName + "]" + e); + } + } + return r; + }; + + this.connect = function (params, referenceParams) { + // prepare a final set of parameters to create connection with + var _p = _prepareConnectionParams(params, referenceParams), jpc; + // TODO probably a nicer return value if the connection was not made. _prepareConnectionParams + // will return null (and log something) if either endpoint was full. what would be nicer is to + // create a dedicated 'error' object. + if (_p) { + if (_p.source == null && _p.sourceEndpoint == null) { + _ju.log("Cannot establish connection - source does not exist"); + return; + } + if (_p.target == null && _p.targetEndpoint == null) { + _ju.log("Cannot establish connection - target does not exist"); + return; + } + _ensureContainer(_p.source); + // create the connection. it is not yet registered + jpc = _newConnection(_p); + // now add it the model, fire an event, and redraw + _finaliseConnection(jpc, _p); + } + return jpc; + }; + + var stTypes = [ + { el: "source", elId: "sourceId", epDefs: "sourceEndpointDefinitions" }, + { el: "target", elId: "targetId", epDefs: "targetEndpointDefinitions" } + ]; + + var _set = function (c, el, idx, doNotRepaint) { + var ep, _st = stTypes[idx], cId = c[_st.elId], cEl = c[_st.el], sid, sep, + oldEndpoint = c.endpoints[idx]; + + var evtParams = { + index: idx, + originalSourceId: idx === 0 ? cId : c.sourceId, + newSourceId: c.sourceId, + originalTargetId: idx == 1 ? cId : c.targetId, + newTargetId: c.targetId, + connection: c + }; + + if (el.constructor == jsPlumb.Endpoint) { // TODO here match the current endpoint class; users can change it { + ep = el; + ep.addConnection(c); + } + else { + sid = _getId(el); + sep = this[_st.epDefs][sid]; + + if (sid === c[_st.elId]) + ep = null; // dont change source/target if the element is already the one given. + else if (sep) { + for (var t in sep) { + if (!sep[t].enabled) return; + ep = sep[t].endpoint != null && sep[t].endpoint._jsPlumb ? sep[t].endpoint : this.addEndpoint(el, sep[t].def); + if (sep[t].uniqueEndpoint) sep[t].endpoint = ep; + ep._doNotDeleteOnDetach = false; + ep._deleteOnDetach = true; + ep.addConnection(c); + } + } + else { + ep = c.makeEndpoint(idx === 0, el, sid); + ep._doNotDeleteOnDetach = false; + ep._deleteOnDetach = true; + } + } + + if (ep != null) { + oldEndpoint.detachFromConnection(c); + c.endpoints[idx] = ep; + c[_st.el] = ep.element; + c[_st.elId] = ep.elementId; + evtParams[idx === 0 ? "newSourceId" : "newTargetId"] = ep.elementId; + + fireMoveEvent(evtParams); + + if (!doNotRepaint) + c.repaint(); + } + + return evtParams; + + }.bind(this); + + this.setSource = function (connection, el, doNotRepaint) { + var p = _set(connection, el, 0, doNotRepaint); + this.anchorManager.sourceChanged(p.originalSourceId, p.newSourceId, connection); + }; + this.setTarget = function (connection, el, doNotRepaint) { + var p = _set(connection, el, 1, doNotRepaint); + this.anchorManager.updateOtherEndpoint(p.originalSourceId, p.originalTargetId, p.newTargetId, connection); + }; + + this.deleteEndpoint = function (object, dontUpdateHover) { + var endpoint = (typeof object === "string") ? endpointsByUUID[object] : object; + if (endpoint) { + _currentInstance.deleteObject({ endpoint: endpoint, dontUpdateHover: dontUpdateHover }); + } + return _currentInstance; + }; + + this.deleteEveryEndpoint = function () { + var _is = _currentInstance.setSuspendDrawing(true); + for (var id in endpointsByElement) { + var endpoints = endpointsByElement[id]; + if (endpoints && endpoints.length) { + for (var i = 0, j = endpoints.length; i < j; i++) { + _currentInstance.deleteEndpoint(endpoints[i], true); + } + } + } + endpointsByElement = {}; + // SP new + managedElements = {}; + endpointsByUUID = {}; + offsets = {}; + offsetTimestamps = {}; + _currentInstance.anchorManager.reset(); + _currentInstance.getDragManager().reset(); + if (!_is) _currentInstance.setSuspendDrawing(false); + return _currentInstance; + }; + + var fireDetachEvent = function (jpc, doFireEvent, originalEvent) { + // may have been given a connection, or in special cases, an object + var connType = _currentInstance.Defaults.ConnectionType || _currentInstance.getDefaultConnectionType(), + argIsConnection = jpc.constructor == connType, + params = argIsConnection ? { + connection: jpc, + source: jpc.source, target: jpc.target, + sourceId: jpc.sourceId, targetId: jpc.targetId, + sourceEndpoint: jpc.endpoints[0], targetEndpoint: jpc.endpoints[1] + } : jpc; + + if (doFireEvent) + _currentInstance.fire("connectionDetached", params, originalEvent); + + _currentInstance.anchorManager.connectionDetached(params); + }; + + var fireMoveEvent = _currentInstance.fireMoveEvent = function (params, evt) { + _currentInstance.fire("connectionMoved", params, evt); + }; + + this.unregisterEndpoint = function (endpoint) { + //if (endpoint._jsPlumb == null) return; + if (endpoint._jsPlumb.uuid) endpointsByUUID[endpoint._jsPlumb.uuid] = null; + _currentInstance.anchorManager.deleteEndpoint(endpoint); + // TODO at least replace this with a removeWithFunction call. + for (var e in endpointsByElement) { + var endpoints = endpointsByElement[e]; + if (endpoints) { + var newEndpoints = []; + for (var i = 0, j = endpoints.length; i < j; i++) + if (endpoints[i] != endpoint) newEndpoints.push(endpoints[i]); + + endpointsByElement[e] = newEndpoints; + } + if (endpointsByElement[e].length < 1) { + delete endpointsByElement[e]; + } + } + }; + + this.detach = function () { + + if (arguments.length === 0) return; + var connType = _currentInstance.Defaults.ConnectionType || _currentInstance.getDefaultConnectionType(), + firstArgIsConnection = arguments[0].constructor == connType, + params = arguments.length == 2 ? firstArgIsConnection ? (arguments[1] || {}) : arguments[0] : arguments[0], + fireEvent = (params.fireEvent !== false), + forceDetach = params.forceDetach, + conn = firstArgIsConnection ? arguments[0] : params.connection; + + if (conn) { + if (forceDetach || _ju.functionChain(true, false, [ + [ conn.endpoints[0], "isDetachAllowed", [ conn ] ], + [ conn.endpoints[1], "isDetachAllowed", [ conn ] ], + [ conn, "isDetachAllowed", [ conn ] ], + [ _currentInstance, "checkCondition", [ "beforeDetach", conn ] ] + ])) { + + conn.endpoints[0].detach(conn, false, true, fireEvent); + } + } + else { + var _p = jsPlumb.extend({}, params); // a backwards compatibility hack: source should be thought of as 'params' in this case. + // test for endpoint uuids to detach + if (_p.uuids) { + _getEndpoint(_p.uuids[0]).detachFrom(_getEndpoint(_p.uuids[1]), fireEvent); + } else if (_p.sourceEndpoint && _p.targetEndpoint) { + _p.sourceEndpoint.detachFrom(_p.targetEndpoint); + } else { + var sourceId = _getId(_currentInstance.getElement(_p.source)), + targetId = _getId(_currentInstance.getElement(_p.target)); + _operation(sourceId, function (jpc) { + if ((jpc.sourceId == sourceId && jpc.targetId == targetId) || (jpc.targetId == sourceId && jpc.sourceId == targetId)) { + if (_currentInstance.checkCondition("beforeDetach", jpc)) { + jpc.endpoints[0].detach(jpc, false, true, fireEvent); + } + } + }); + } + } + }; + + this.detachAllConnections = function (el, params) { + params = params || {}; + el = _currentInstance.getElement(el); + var id = _getId(el), + endpoints = endpointsByElement[id]; + if (endpoints && endpoints.length) { + for (var i = 0, j = endpoints.length; i < j; i++) { + endpoints[i].detachAll(params.fireEvent !== false, params.forceDetach); + } + } + return _currentInstance; + }; + + this.detachEveryConnection = function (params) { + params = params || {}; + _currentInstance.batch(function () { + for (var id in endpointsByElement) { + var endpoints = endpointsByElement[id]; + if (endpoints && endpoints.length) { + for (var i = 0, j = endpoints.length; i < j; i++) { + endpoints[i].detachAll(params.fireEvent !== false, params.forceDetach); + } + } + } + connections.length = 0; + }); + return _currentInstance; + }; + + /// not public. but of course its exposed. how to change this. + this.deleteObject = function (params) { + var result = { + endpoints: {}, + connections: {}, + endpointCount: 0, + connectionCount: 0 + }, + fireEvent = params.fireEvent !== false, + deleteAttachedObjects = params.deleteAttachedObjects !== false; + + var unravelConnection = function (connection) { + if (connection != null && result.connections[connection.id] == null) { + if (!params.dontUpdateHover && connection._jsPlumb != null) connection.setHover(false); + result.connections[connection.id] = connection; + result.connectionCount++; + if (deleteAttachedObjects) { + for (var j = 0; j < connection.endpoints.length; j++) { + if (connection.endpoints[j]._deleteOnDetach) + unravelEndpoint(connection.endpoints[j]); + } + } + } + }; + var unravelEndpoint = function (endpoint) { + if (endpoint != null && result.endpoints[endpoint.id] == null) { + if (!params.dontUpdateHover && endpoint._jsPlumb != null) endpoint.setHover(false); + result.endpoints[endpoint.id] = endpoint; + result.endpointCount++; + + if (deleteAttachedObjects) { + for (var i = 0; i < endpoint.connections.length; i++) { + var c = endpoint.connections[i]; + unravelConnection(c); + } + } + } + }; + + if (params.connection) + unravelConnection(params.connection); + else unravelEndpoint(params.endpoint); + + // loop through connections + for (var i in result.connections) { + var c = result.connections[i]; + if (c._jsPlumb) { + _ju.removeWithFunction(connections, function (_c) { + return c.id == _c.id; + }); + + fireDetachEvent(c, params.fireEvent === false ? false : !c.pending, params.originalEvent); + + c.endpoints[0].detachFromConnection(c); + c.endpoints[1].detachFromConnection(c); + c.cleanup(true); + c.destroy(true); + } + } + + // loop through endpoints + for (var j in result.endpoints) { + var e = result.endpoints[j]; + if (e._jsPlumb) { + _currentInstance.unregisterEndpoint(e); + // FIRE some endpoint deleted event? + e.cleanup(true); + e.destroy(true); + } + } + + return result; + }; + + this.draggable = function (el, options) { + var info; + _each(function(_el) { + info = _info(_el); + if (info.el) _initDraggableIfNecessary(info.el, true, options, info.id); + }, el); + return _currentInstance; + }; + + this.droppable = function(el, options) { + var info; + options = options || {}; + options.allowLoopback = false; + _each(function(_el) { + info = _info(_el); + if (info.el) _currentInstance.initDroppable(info.el, options); + }, el); + return _currentInstance; + }; + + // helpers for select/selectEndpoints + var _setOperation = function (list, func, args, selector) { + for (var i = 0, j = list.length; i < j; i++) { + list[i][func].apply(list[i], args); + } + return selector(list); + }, + _getOperation = function (list, func, args) { + var out = []; + for (var i = 0, j = list.length; i < j; i++) { + out.push([ list[i][func].apply(list[i], args), list[i] ]); + } + return out; + }, + setter = function (list, func, selector) { + return function () { + return _setOperation(list, func, arguments, selector); + }; + }, + getter = function (list, func) { + return function () { + return _getOperation(list, func, arguments); + }; + }, + prepareList = function (input, doNotGetIds) { + var r = []; + if (input) { + if (typeof input == 'string') { + if (input === "*") return input; + r.push(input); + } + else { + if (doNotGetIds) r = input; + else { + if (input.length) { + for (var i = 0, j = input.length; i < j; i++) + r.push(_info(input[i]).id); + } + else + r.push(_info(input).id); + } + } + } + return r; + }, + filterList = function (list, value, missingIsFalse) { + if (list === "*") return true; + return list.length > 0 ? list.indexOf(value) != -1 : !missingIsFalse; + }; + + // get some connections, specifying source/target/scope + this.getConnections = function (options, flat) { + if (!options) { + options = {}; + } else if (options.constructor == String) { + options = { "scope": options }; + } + var scope = options.scope || _currentInstance.getDefaultScope(), + scopes = prepareList(scope, true), + sources = prepareList(options.source), + targets = prepareList(options.target), + results = (!flat && scopes.length > 1) ? {} : [], + _addOne = function (scope, obj) { + if (!flat && scopes.length > 1) { + var ss = results[scope]; + if (ss == null) { + ss = results[scope] = []; + } + ss.push(obj); + } else results.push(obj); + }; + + for (var j = 0, jj = connections.length; j < jj; j++) { + var c = connections[j]; + if (filterList(scopes, c.scope) && filterList(sources, c.sourceId) && filterList(targets, c.targetId)) + _addOne(c.scope, c); + } + + return results; + }; + + var _curryEach = function (list, executor) { + return function (f) { + for (var i = 0, ii = list.length; i < ii; i++) { + f(list[i]); + } + return executor(list); + }; + }, + _curryGet = function (list) { + return function (idx) { + return list[idx]; + }; + }; + + var _makeCommonSelectHandler = function (list, executor) { + var out = { + length: list.length, + each: _curryEach(list, executor), + get: _curryGet(list) + }, + setters = ["setHover", "removeAllOverlays", "setLabel", "addClass", "addOverlay", "removeOverlay", + "removeOverlays", "showOverlay", "hideOverlay", "showOverlays", "hideOverlays", "setPaintStyle", + "setHoverPaintStyle", "setSuspendEvents", "setParameter", "setParameters", "setVisible", + "repaint", "addType", "toggleType", "removeType", "removeClass", "setType", "bind", "unbind" ], + + getters = ["getLabel", "getOverlay", "isHover", "getParameter", "getParameters", "getPaintStyle", + "getHoverPaintStyle", "isVisible", "hasType", "getType", "isSuspendEvents" ], + i, ii; + + for (i = 0, ii = setters.length; i < ii; i++) + out[setters[i]] = setter(list, setters[i], executor); + + for (i = 0, ii = getters.length; i < ii; i++) + out[getters[i]] = getter(list, getters[i]); + + return out; + }; + + var _makeConnectionSelectHandler = function (list) { + var common = _makeCommonSelectHandler(list, _makeConnectionSelectHandler); + return jsPlumb.extend(common, { + // setters + setDetachable: setter(list, "setDetachable", _makeConnectionSelectHandler), + setReattach: setter(list, "setReattach", _makeConnectionSelectHandler), + setConnector: setter(list, "setConnector", _makeConnectionSelectHandler), + detach: function () { + for (var i = 0, ii = list.length; i < ii; i++) + _currentInstance.detach(list[i]); + }, + // getters + isDetachable: getter(list, "isDetachable"), + isReattach: getter(list, "isReattach") + }); + }; + + var _makeEndpointSelectHandler = function (list) { + var common = _makeCommonSelectHandler(list, _makeEndpointSelectHandler); + return jsPlumb.extend(common, { + setEnabled: setter(list, "setEnabled", _makeEndpointSelectHandler), + setAnchor: setter(list, "setAnchor", _makeEndpointSelectHandler), + isEnabled: getter(list, "isEnabled"), + detachAll: function () { + for (var i = 0, ii = list.length; i < ii; i++) + list[i].detachAll(); + }, + "remove": function () { + for (var i = 0, ii = list.length; i < ii; i++) + _currentInstance.deleteObject({endpoint: list[i]}); + } + }); + }; + + this.select = function (params) { + params = params || {}; + params.scope = params.scope || "*"; + return _makeConnectionSelectHandler(params.connections || _currentInstance.getConnections(params, true)); + }; + + this.selectEndpoints = function (params) { + params = params || {}; + params.scope = params.scope || "*"; + var noElementFilters = !params.element && !params.source && !params.target, + elements = noElementFilters ? "*" : prepareList(params.element), + sources = noElementFilters ? "*" : prepareList(params.source), + targets = noElementFilters ? "*" : prepareList(params.target), + scopes = prepareList(params.scope, true); + + var ep = []; + + for (var el in endpointsByElement) { + var either = filterList(elements, el, true), + source = filterList(sources, el, true), + sourceMatchExact = sources != "*", + target = filterList(targets, el, true), + targetMatchExact = targets != "*"; + + // if they requested 'either' then just match scope. otherwise if they requested 'source' (not as a wildcard) then we have to match only endpoints that have isSource set to to true, and the same thing with isTarget. + if (either || source || target) { + inner: + for (var i = 0, ii = endpointsByElement[el].length; i < ii; i++) { + var _ep = endpointsByElement[el][i]; + if (filterList(scopes, _ep.scope, true)) { + + var noMatchSource = (sourceMatchExact && sources.length > 0 && !_ep.isSource), + noMatchTarget = (targetMatchExact && targets.length > 0 && !_ep.isTarget); + + if (noMatchSource || noMatchTarget) + continue inner; + + ep.push(_ep); + } + } + } + } + + return _makeEndpointSelectHandler(ep); + }; + + // get all connections managed by the instance of jsplumb. + this.getAllConnections = function () { + return connections; + }; + this.getDefaultScope = function () { + return DEFAULT_SCOPE; + }; + // get an endpoint by uuid. + this.getEndpoint = _getEndpoint; + // get endpoints for some element. + this.getEndpoints = function (el) { + return endpointsByElement[_info(el).id]; + }; + // gets the default endpoint type. used when subclassing. see wiki. + this.getDefaultEndpointType = function () { + return jsPlumb.Endpoint; + }; + // gets the default connection type. used when subclassing. see wiki. + this.getDefaultConnectionType = function () { + return jsPlumb.Connection; + }; + /* + * Gets an element's id, creating one if necessary. really only exposed + * for the lib-specific functionality to access; would be better to pass + * the current instance into the lib-specific code (even though this is + * a static call. i just don't want to expose it to the public API). + */ + this.getId = _getId; + + this.appendElement = _appendElement; + + var _hoverSuspended = false; + this.isHoverSuspended = function () { + return _hoverSuspended; + }; + this.setHoverSuspended = function (s) { + _hoverSuspended = s; + }; + + // set an element's connections to be hidden + this.hide = function (el, changeEndpoints) { + _setVisible(el, "none", changeEndpoints); + return _currentInstance; + }; + + // exposed for other objects to use to get a unique id. + this.idstamp = _idstamp; + + this.connectorsInitialized = false; + this.registerConnectorType = function (connector, name) { + connectorTypes.push([connector, name]); + }; + + // ensure that, if the current container exists, it is a DOM element and not a selector. + // if it does not exist and `candidate` is supplied, the offset parent of that element will be set as the Container. + // this is used to do a better default behaviour for the case that the user has not set a container: + // addEndpoint, makeSource, makeTarget and connect all call this method with the offsetParent of the + // element in question (for connect it is the source element). So if no container is set, it is inferred + // to be the offsetParent of the first element the user tries to connect. + var _ensureContainer = function (candidate) { + if (!_container && candidate) { + var can = _currentInstance.getElement(candidate); + if (can.offsetParent) _currentInstance.setContainer(can.offsetParent); + } + }; + + var _getContainerFromDefaults = function () { + if (_currentInstance.Defaults.Container) + _currentInstance.setContainer(_currentInstance.Defaults.Container); + }; + + // check if a given element is managed or not. if not, add to our map. if drawing is not suspended then + // we'll also stash its dimensions; otherwise we'll do this in a lazy way through updateOffset. + var _manage = _currentInstance.manage = function (id, element, transient) { + if (!managedElements[id]) { + managedElements[id] = { + el: element, + endpoints: [], + connections: [] + }; + + managedElements[id].info = _updateOffset({ elId: id, timestamp: _suspendedAt }); + if (!transient) { + _currentInstance.fire("manageElement", { id:id, info:managedElements[id].info, el:element }); + } + } + + return managedElements[id]; + }; + + var _unmanage = function(id) { + if (managedElements[id]) { + delete managedElements[id]; + _currentInstance.fire("unmanageElement", id); + } + }; + + /** + * updates the offset and size for a given element, and stores the + * values. if 'offset' is not null we use that (it would have been + * passed in from a drag call) because it's faster; but if it is null, + * or if 'recalc' is true in order to force a recalculation, we get the current values. + */ + var _updateOffset = this.updateOffset = function (params) { + + var timestamp = params.timestamp, recalc = params.recalc, offset = params.offset, elId = params.elId, s; + if (_suspendDrawing && !timestamp) timestamp = _suspendedAt; + if (!recalc) { + if (timestamp && timestamp === offsetTimestamps[elId]) { + return {o: params.offset || offsets[elId], s: sizes[elId]}; + } + } + if (recalc || (!offset && offsets[elId] == null)) { // if forced repaint or no offset available, we recalculate. + + // get the current size and offset, and store them + s = managedElements[elId] ? managedElements[elId].el : null; + if (s != null) { + sizes[elId] = _currentInstance.getSize(s); + offsets[elId] = _currentInstance.getOffset(s); + offsetTimestamps[elId] = timestamp; + } + } else { + offsets[elId] = offset || offsets[elId]; + if (sizes[elId] == null) { + s = managedElements[elId].el; + if (s != null) sizes[elId] = _currentInstance.getSize(s); + } + offsetTimestamps[elId] = timestamp; + } + + if (offsets[elId] && !offsets[elId].right) { + offsets[elId].right = offsets[elId].left + sizes[elId][0]; + offsets[elId].bottom = offsets[elId].top + sizes[elId][1]; + offsets[elId].width = sizes[elId][0]; + offsets[elId].height = sizes[elId][1]; + offsets[elId].centerx = offsets[elId].left + (offsets[elId].width / 2); + offsets[elId].centery = offsets[elId].top + (offsets[elId].height / 2); + } + + return {o: offsets[elId], s: sizes[elId]}; + }; + + /** + * callback from the current library to tell us to prepare ourselves (attach + * mouse listeners etc; can't do that until the library has provided a bind method) + */ + this.init = function () { + rendererTypes = jsPlumb.getRenderModes(); + + var _oneType = function (renderer, name, fn) { + jsPlumb.Connectors[renderer][name] = function () { + fn.apply(this, arguments); + jsPlumb.ConnectorRenderers[renderer].apply(this, arguments); + }; + _ju.extend(jsPlumb.Connectors[renderer][name], [ fn, jsPlumb.ConnectorRenderers[renderer]]); + }; + + if (!jsPlumb.connectorsInitialized) { + for (var i = 0; i < connectorTypes.length; i++) { + for (var j = 0; j < rendererTypes.length; j++) { + _oneType(rendererTypes[j], connectorTypes[i][1], connectorTypes[i][0]); + } + + } + jsPlumb.connectorsInitialized = true; + } + + if (!initialized) { + _getContainerFromDefaults(); + _currentInstance.anchorManager = new jsPlumb.AnchorManager({jsPlumbInstance: _currentInstance}); + initialized = true; + _currentInstance.fire("ready", _currentInstance); + } + }.bind(this); + + this.log = log; + this.jsPlumbUIComponent = jsPlumbUIComponent; + + /* + * Creates an anchor with the given params. + * + * + * Returns: The newly created Anchor. + * Throws: an error if a named anchor was not found. + */ + this.makeAnchor = function () { + var pp, _a = function (t, p) { + if (jsPlumb.Anchors[t]) return new jsPlumb.Anchors[t](p); + if (!_currentInstance.Defaults.DoNotThrowErrors) + throw { msg: "jsPlumb: unknown anchor type '" + t + "'" }; + }; + if (arguments.length === 0) return null; + var specimen = arguments[0], elementId = arguments[1], jsPlumbInstance = arguments[2], newAnchor = null; + // if it appears to be an anchor already... + if (specimen.compute && specimen.getOrientation) return specimen; //TODO hazy here about whether it should be added or is already added somehow. + // is it the name of an anchor type? + else if (typeof specimen == "string") { + newAnchor = _a(arguments[0], {elementId: elementId, jsPlumbInstance: _currentInstance}); + } + // is it an array? it will be one of: + // an array of [spec, params] - this defines a single anchor, which may be dynamic, but has parameters. + // an array of arrays - this defines some dynamic anchors + // an array of numbers - this defines a single anchor. + else if (_ju.isArray(specimen)) { + if (_ju.isArray(specimen[0]) || _ju.isString(specimen[0])) { + // if [spec, params] format + if (specimen.length == 2 && _ju.isObject(specimen[1])) { + // if first arg is a string, its a named anchor with params + if (_ju.isString(specimen[0])) { + pp = jsPlumb.extend({elementId: elementId, jsPlumbInstance: _currentInstance}, specimen[1]); + newAnchor = _a(specimen[0], pp); + } + // otherwise first arg is array, second is params. we treat as a dynamic anchor, which is fine + // even if the first arg has only one entry. you could argue all anchors should be implicitly dynamic in fact. + else { + pp = jsPlumb.extend({elementId: elementId, jsPlumbInstance: _currentInstance, anchors: specimen[0]}, specimen[1]); + newAnchor = new jsPlumb.DynamicAnchor(pp); + } + } + else + newAnchor = new jsPlumb.DynamicAnchor({anchors: specimen, selector: null, elementId: elementId, jsPlumbInstance: _currentInstance}); + + } + else { + var anchorParams = { + x: specimen[0], y: specimen[1], + orientation: (specimen.length >= 4) ? [ specimen[2], specimen[3] ] : [0, 0], + offsets: (specimen.length >= 6) ? [ specimen[4], specimen[5] ] : [ 0, 0 ], + elementId: elementId, + jsPlumbInstance: _currentInstance, + cssClass: specimen.length == 7 ? specimen[6] : null + }; + newAnchor = new jsPlumb.Anchor(anchorParams); + newAnchor.clone = function () { + return new jsPlumb.Anchor(anchorParams); + }; + } + } + + if (!newAnchor.id) newAnchor.id = "anchor_" + _idstamp(); + return newAnchor; + }; + + /** + * makes a list of anchors from the given list of types or coords, eg + * ["TopCenter", "RightMiddle", "BottomCenter", [0, 1, -1, -1] ] + */ + this.makeAnchors = function (types, elementId, jsPlumbInstance) { + var r = []; + for (var i = 0, ii = types.length; i < ii; i++) { + if (typeof types[i] == "string") + r.push(jsPlumb.Anchors[types[i]]({elementId: elementId, jsPlumbInstance: jsPlumbInstance})); + else if (_ju.isArray(types[i])) + r.push(_currentInstance.makeAnchor(types[i], elementId, jsPlumbInstance)); + } + return r; + }; + + /** + * Makes a dynamic anchor from the given list of anchors (which may be in shorthand notation as strings or dimension arrays, or Anchor + * objects themselves) and the given, optional, anchorSelector function (jsPlumb uses a default if this is not provided; most people will + * not need to provide this - i think). + */ + this.makeDynamicAnchor = function (anchors, anchorSelector) { + return new jsPlumb.DynamicAnchor({anchors: anchors, selector: anchorSelector, elementId: null, jsPlumbInstance: _currentInstance}); + }; + +// --------------------- makeSource/makeTarget ---------------------------------------------- + + this.targetEndpointDefinitions = {}; + var _setEndpointPaintStylesAndAnchor = function (ep, epIndex, _instance) { + /* ep.paintStyle = ep.paintStyle || + _instance.Defaults.EndpointStyles[epIndex] || + _instance.Defaults.EndpointStyle; + + ep.hoverPaintStyle = ep.hoverPaintStyle || + _instance.Defaults.EndpointHoverStyles[epIndex] || + _instance.Defaults.EndpointHoverStyle; + + ep.anchor = ep.anchor || + _instance.Defaults.Anchors[epIndex] || + _instance.Defaults.Anchor; + + ep.endpoint = ep.endpoint || + _instance.Defaults.Endpoints[epIndex] || + _instance.Defaults.Endpoint;*/ + }; + + // TODO put all the source stuff inside one parent, keyed by id. + this.sourceEndpointDefinitions = {}; + + var selectorFilter = function (evt, _el, selector, _instance, negate) { + var t = evt.target || evt.srcElement, ok = false, + sel = _instance.getSelector(_el, selector); + for (var j = 0; j < sel.length; j++) { + if (sel[j] == t) { + ok = true; + break; + } + } + return negate ? !ok : ok; + }; + + // SP target source refactor + var _makeElementDropHandler = function (elInfo, p, dropOptions, isSource, isTarget) { + var proxyComponent = new jsPlumbUIComponent(p); + var _drop = p._jsPlumb.EndpointDropHandler({ + jsPlumb: _currentInstance, + enabled: function () { + return elInfo.def.enabled; + }, + isFull: function () { + var targetCount = _currentInstance.select({target: elInfo.id}).length; + return elInfo.def.maxConnections > 0 && targetCount >= elInfo.def.maxConnections; + }, + element: elInfo.el, + elementId: elInfo.id, + isSource: isSource, + isTarget: isTarget, + addClass: function (clazz) { + _currentInstance.addClass(elInfo.el, clazz); + }, + removeClass: function (clazz) { + _currentInstance.removeClass(elInfo.el, clazz); + }, + onDrop: function (jpc) { + var source = jpc.endpoints[0]; + source.anchor.locked = false; + }, + isDropAllowed: function () { + return proxyComponent.isDropAllowed.apply(proxyComponent, arguments); + }, + isRedrop:function(jpc) { + return (jpc.suspendedElement != null && jpc.suspendedEndpoint != null && jpc.suspendedEndpoint.element === elInfo.el); + }, + getEndpoint: function (jpc) { + + // make a new Endpoint for the target, or get it from the cache if uniqueEndpoint + // is set. if its a redrop the new endpoint will be immediately cleaned up. + + var newEndpoint = elInfo.def.endpoint; + + // if no cached endpoint, or there was one but it has been cleaned up + // (ie. detached), create a new one + if (newEndpoint == null || newEndpoint._jsPlumb == null) { + var eps = _currentInstance.deriveEndpointAndAnchorSpec(jpc.getType().join(" "), true); + var pp = eps.endpoints ? jsPlumb.extend(p, { + endpoint:elInfo.def.def.endpoint || eps.endpoints[1] + }) :p; + if (eps.anchors) { + pp = jsPlumb.extend(pp, { + anchor:elInfo.def.def.anchor || eps.anchors[1] + }); + } + newEndpoint = _currentInstance.addEndpoint(elInfo.el, pp); + newEndpoint._mtNew = true; + } + + if (p.uniqueEndpoint) elInfo.def.endpoint = newEndpoint; // may of course just store what it just pulled out. that's ok. + // TODO test options to makeTarget to see if we should do this? + newEndpoint._doNotDeleteOnDetach = false; // reset. + newEndpoint._deleteOnDetach = true; + + // if connection is detachable, init the new endpoint to be draggable, to support that happening. + if (jpc.isDetachable()) + newEndpoint.initDraggable(); + + // if the anchor has a 'positionFinder' set, then delegate to that function to find + // out where to locate the anchor. + if (newEndpoint.anchor.positionFinder != null) { + var dropPosition = _currentInstance.getUIPosition(arguments, _currentInstance.getZoom()), + elPosition = _currentInstance.getOffset(elInfo.el), + elSize = _currentInstance.getSize(elInfo.el), + ap = newEndpoint.anchor.positionFinder(dropPosition, elPosition, elSize, newEndpoint.anchor.constructorParams); + + newEndpoint.anchor.x = ap[0]; + newEndpoint.anchor.y = ap[1]; + // now figure an orientation for it..kind of hard to know what to do actually. probably the best thing i can do is to + // support specifying an orientation in the anchor's spec. if one is not supplied then i will make the orientation + // be what will cause the most natural link to the source: it will be pointing at the source, but it needs to be + // specified in one axis only, and so how to make that choice? i think i will use whichever axis is the one in which + // the target is furthest away from the source. + } + + return newEndpoint; + }, + maybeCleanup: function (ep) { + if (ep._mtNew && ep.connections.length === 0) { + _currentInstance.deleteObject({endpoint: ep}); + } + else + delete ep._mtNew; + } + }); + + // wrap drop events as needed and initialise droppable + var dropEvent = jsPlumb.dragEvents.drop; + dropOptions.scope = dropOptions.scope || (p.scope || _currentInstance.Defaults.Scope); + dropOptions[dropEvent] = _ju.wrap(dropOptions[dropEvent], _drop, true); + + // if target, return true from the over event. this will cause katavorio to stop setting drops to hover + // if multipleDrop is set to false. + if (isTarget) { + dropOptions[jsPlumb.dragEvents.over] = function () { return true; }; + } + + // vanilla jsplumb only + if (p.allowLoopback === false) { + dropOptions.canDrop = function (_drag) { + var de = _drag.getDragElement()._jsPlumbRelatedElement; + return de != elInfo.el; + }; + } + _currentInstance.initDroppable(elInfo.el, dropOptions, "internal"); + + return _drop; + + }; + + // see API docs + this.makeTarget = function (el, params, referenceParams) { + + // put jsplumb ref into params without altering the params passed in + var p = jsPlumb.extend({_jsPlumb: this}, referenceParams); + jsPlumb.extend(p, params); + + // calculate appropriate paint styles and anchor from the params given + _setEndpointPaintStylesAndAnchor(p, 1, this); + + var deleteEndpointsOnDetach = !(p.deleteEndpointsOnDetach === false), + maxConnections = p.maxConnections || -1, + + _doOne = function (el) { + + // get the element's id and store the endpoint definition for it. jsPlumb.connect calls will look for one of these, + // and use the endpoint definition if found. + // decode the info for this element (id and element) + var elInfo = _info(el), + elid = elInfo.id, + dropOptions = jsPlumb.extend({}, p.dropOptions || {}), + type = "default"; + + this.targetEndpointDefinitions[elid] = this.targetEndpointDefinitions[elid] || {}; + + _ensureContainer(elid); + + // store the definition + var _def = { + def: jsPlumb.extend({}, p), + uniqueEndpoint: p.uniqueEndpoint, + maxConnections: maxConnections, + enabled: true + }; + elInfo.def = _def; + this.targetEndpointDefinitions[elid][type] = _def; + _makeElementDropHandler(elInfo, p, dropOptions, p.isSource === true, true); + // stash the definition on the drop + elInfo.el._katavorioDrop[elInfo.el._katavorioDrop.length - 1].targetDef = _def; + + }.bind(this); + + // make an array if only given one element + var inputs = el.length && el.constructor != String ? el : [ el ]; + + // register each one in the list. + for (var i = 0, ii = inputs.length; i < ii; i++) { + _doOne(inputs[i]); + } + + return this; + }; + + // see api docs + this.unmakeTarget = function (el, doNotClearArrays) { + var info = _info(el); + jsPlumb.destroyDroppable(info.el); + if (!doNotClearArrays) { + delete this.targetEndpointDefinitions[info.id]; + } + + return this; + }; + + // see api docs + this.makeSource = function (el, params, referenceParams) { + var p = jsPlumb.extend({_jsPlumb: this}, referenceParams); + jsPlumb.extend(p, params); + var type = p.connectionType || "default"; + var aae = _currentInstance.deriveEndpointAndAnchorSpec(type); + p.endpoint = p.endpoint || aae.endpoints[0]; + p.anchor = p.anchor || aae.anchors[0]; + _setEndpointPaintStylesAndAnchor(p, 0, this); + var maxConnections = p.maxConnections || -1, + onMaxConnections = p.onMaxConnections, + _doOne = function (elInfo) { + // get the element's id and store the endpoint definition for it. jsPlumb.connect calls will look for one of these, + // and use the endpoint definition if found. + var elid = elInfo.id, + _del = this.getElement(elInfo.el); + + this.sourceEndpointDefinitions[elid] = this.sourceEndpointDefinitions[elid] || {}; + _ensureContainer(elid); + + var _def = { + def:jsPlumb.extend({}, p), + uniqueEndpoint: p.uniqueEndpoint, + maxConnections: maxConnections, + enabled: true + }; + + + this.sourceEndpointDefinitions[elid][type] = _def; + elInfo.def = _def; + + var stopEvent = jsPlumb.dragEvents.stop, + dragEvent = jsPlumb.dragEvents.drag, + dragOptions = jsPlumb.extend({ }, p.dragOptions || {}), + existingDrag = dragOptions.drag, + existingStop = dragOptions.stop, + ep = null, + endpointAddedButNoDragYet = false; + + // set scope if its not set in dragOptions but was passed in in params + dragOptions.scope = dragOptions.scope || p.scope; + + dragOptions[dragEvent] = _ju.wrap(dragOptions[dragEvent], function () { + if (existingDrag) existingDrag.apply(this, arguments); + endpointAddedButNoDragYet = false; + }); + + dragOptions[stopEvent] = _ju.wrap(dragOptions[stopEvent], function () { + + if (existingStop) existingStop.apply(this, arguments); + this.currentlyDragging = false; + if (ep._jsPlumb != null) { // if not cleaned up... + + // reset the anchor to the anchor that was initially provided. the one we were using to drag + // the connection was just a placeholder that was located at the place the user pressed the + // mouse button to initiate the drag. + var anchorDef = p.anchor || this.Defaults.Anchor, + oldAnchor = ep.anchor, + oldConnection = ep.connections[0]; + + // if the connection has a type, try to get an anchor spec for it. + /*if (oldConnection != null) { + var aae = _currentInstance.deriveEndpointAndAnchorSpec(oldConnection.getType().join(" "), false); + if (aae.anchors) anchorDef = aae.anchor[0]; + if (aae.endpoints) ep.setEndpoint(aae.endpoints[0]); + }*/ + + var newAnchor = this.makeAnchor(anchorDef, elid, this), + _el = ep.element; + + // if the anchor has a 'positionFinder' set, then delegate to that function to find + // out where to locate the anchor. issue 117. + if (newAnchor.positionFinder != null) { + var elPosition = _currentInstance.getOffset(_el), + elSize = this.getSize(_el), + dropPosition = { left: elPosition.left + (oldAnchor.x * elSize[0]), top: elPosition.top + (oldAnchor.y * elSize[1]) }, + ap = newAnchor.positionFinder(dropPosition, elPosition, elSize, newAnchor.constructorParams); + + newAnchor.x = ap[0]; + newAnchor.y = ap[1]; + } + + ep.setAnchor(newAnchor, true); + ep.repaint(); + this.repaint(ep.elementId); + if (oldConnection != null) this.repaint(oldConnection.targetId); + } + }.bind(this)); + + // when the user presses the mouse, add an Endpoint, if we are enabled. + var mouseDownListener = function (e) { + // on right mouse button, abort. + if (e.which === 3 || e.button === 2) return; + + // TODO store def on element. + var def = this.sourceEndpointDefinitions[elid][type]; + + // if disabled, return. + if (!def.enabled) return; + + elid = this.getId(this.getElement(elInfo.el)); // elid might have changed since this method was called to configure the element. + + // if a filter was given, run it, and return if it says no. + if (p.filter) { + var r = _ju.isString(p.filter) ? selectorFilter(e, elInfo.el, p.filter, this, p.filterExclude) : p.filter(e, elInfo.el); + if (r === false) return; + } + + // if maxConnections reached + var sourceCount = this.select({source: elid}).length; + if (def.maxConnections >= 0 && (sourceCount >= def.maxConnections)) { + if (onMaxConnections) { + onMaxConnections({ + element: elInfo.el, + maxConnections: maxConnections + }, e); + } + return false; + } + + // find the position on the element at which the mouse was pressed; this is where the endpoint + // will be located. + var elxy = jsPlumb.getPositionOnElement(e, _del, _zoom); + + // we need to override the anchor in here, and force 'isSource', but we don't want to mess with + // the params passed in, because after a connection is established we're going to reset the endpoint + // to have the anchor we were given. + var tempEndpointParams = {}; + jsPlumb.extend(tempEndpointParams, p); + tempEndpointParams.isTemporarySource = true; + tempEndpointParams.anchor = [ elxy[0], elxy[1] , 0, 0]; + tempEndpointParams.dragOptions = dragOptions; + + if (def.def.scope) tempEndpointParams.scope = def.def.scope; + + ep = this.addEndpoint(elid, tempEndpointParams); + endpointAddedButNoDragYet = true; + ep._doNotDeleteOnDetach = false; // reset. + ep._deleteOnDetach = true; + + // if unique endpoint and it's already been created, push it onto the endpoint we create. at the end + // of a successful connection we'll switch to that endpoint. + // TODO this is the same code as the programmatic endpoints create on line 1050 ish + if (def.uniqueEndpoint) { + if (!def.endpoint) { + def.endpoint = ep; + ep._deleteOnDetach = false; + ep._doNotDeleteOnDetach = true; + } + else + ep.finalEndpoint = def.endpoint; + } + + var _delTempEndpoint = function () { + // this mouseup event is fired only if no dragging occurred, by jquery and yui, but for mootools + // it is fired even if dragging has occurred, in which case we would blow away a perfectly + // legitimate endpoint, were it not for this check. the flag is set after adding an + // endpoint and cleared in a drag listener we set in the dragOptions above. + _currentInstance.off(ep.canvas, "mouseup", _delTempEndpoint); + _currentInstance.off(elInfo.el, "mouseup", _delTempEndpoint); + if (endpointAddedButNoDragYet) { + endpointAddedButNoDragYet = false; + _currentInstance.deleteEndpoint(ep); + } + }; + + _currentInstance.on(ep.canvas, "mouseup", _delTempEndpoint); + _currentInstance.on(elInfo.el, "mouseup", _delTempEndpoint); + + // optionally check for attributes to extract from the source element + var payload = {}; + if (def.def.extract) { + for (var att in def.def.extract) { + var v = e.srcElement.getAttribute(att); + if (v) { + payload[def.def.extract[att]] = v; + } + } + } + + // and then trigger its mousedown event, which will kick off a drag, which will start dragging + // a new connection from this endpoint. + _currentInstance.trigger(ep.canvas, "mousedown", e, payload); + + _ju.consume(e); + + }.bind(this); + + this.on(elInfo.el, "mousedown", mouseDownListener); + _def.trigger = mouseDownListener; + + // if a filter was provided, set it as a dragFilter on the element, + // to prevent the element drag function from kicking in when we want to + // drag a new connection + if (p.filter && (_ju.isString(p.filter) || _ju.isFunction(p.filter))) { + _currentInstance.setDragFilter(elInfo.el, p.filter); + } + + var dropOptions = jsPlumb.extend({}, p.dropOptions || {}); + + _makeElementDropHandler(elInfo, p, dropOptions, true, p.isTarget === true); + + }.bind(this); + + var inputs = el.length && el.constructor != String ? el : [ el ]; + for (var i = 0, ii = inputs.length; i < ii; i++) { + _doOne(_info(inputs[i])); + } + + return this; + }; + + // see api docs + this.unmakeSource = function (el, connectionType, doNotClearArrays) { + var info = _info(el); + var eldefs = this.sourceEndpointDefinitions[info.id]; + if (eldefs) { + for (var def in eldefs) { + if (connectionType == null || connectionType === def) { + var mouseDownListener = eldefs[def].trigger; + if (mouseDownListener) + _currentInstance.off(info.el, "mousedown", mouseDownListener); + if (!doNotClearArrays) { + delete this.sourceEndpointDefinitions[info.id][def]; + } + } + } + } + + return this; + }; + + // see api docs + this.unmakeEverySource = function () { + for (var i in this.sourceEndpointDefinitions) + _currentInstance.unmakeSource(i, null, true); + + this.sourceEndpointDefinitions = {}; + return this; + }; + + var _getScope = function (el, types, connectionType) { + types = _ju.isArray(types) ? types : [ types ]; + var id = _getId(el); + connectionType = connectionType || "default"; + for (var i = 0; i < types.length; i++) { + var eldefs = this[types[i]][id]; + if (eldefs && eldefs[connectionType]) return eldefs[connectionType].def.scope || this.Defaults.Scope; + } + }.bind(this); + + var _setScope = function (el, scope, types, connectionType) { + types = _ju.isArray(types) ? types : [ types ]; + var id = _getId(el); + connectionType = connectionType || "default"; + for (var i = 0; i < types.length; i++) { + var eldefs = this[types[i]][id]; + if (eldefs && eldefs[connectionType]) { + eldefs[connectionType].def.scope = scope; + } + } + + }.bind(this); + + this.getScope = function (el, scope) { + return _getScope(el, [ "sourceEndpointDefinitions", "targetEndpointDefinitions" ]); + }; + this.getSourceScope = function (el) { + return _getScope(el, "sourceEndpointDefinitions"); + }; + this.getTargetScope = function (el) { + return _getScope(el, "targetEndpointDefinitions"); + }; + this.setScope = function (el, scope, connectionType) { + this.setSourceScope(el, scope, connectionType); + this.setTargetScope(el, scope, connectionType); + }; + this.setSourceScope = function (el, scope, connectionType) { + _setScope(el, scope, "sourceEndpointDefinitions", connectionType); + // we get the source scope during the mousedown event, but we also want to set this. + this.setDragScope(el, scope); + }; + this.setTargetScope = function (el, scope, connectionType) { + _setScope(el, scope, "targetEndpointDefinitions", connectionType); + this.setDropScope(el, scope); + }; + + // see api docs + this.unmakeEveryTarget = function () { + for (var i in this.targetEndpointDefinitions) + _currentInstance.unmakeTarget(i, true); + + this.targetEndpointDefinitions = {}; + return this; + }; + + // does the work of setting a source enabled or disabled. + var _setEnabled = function (type, el, state, toggle, connectionType) { + var a = type == "source" ? this.sourceEndpointDefinitions : this.targetEndpointDefinitions; + connectionType = connectionType || "default"; + + + if (_ju.isString(el) && a[el] && a[el][connectionType]) { + a[el][connectionType].enabled = toggle ? !a[el][connectionType].enabled : state; + } + else if (el.length) { + for (var i = 0, ii = el.length; i < ii; i++) { + var info = _info(el[i]); + if (a[info.id] && a[info.id][connectionType]) + a[info.id][connectionType].enabled = toggle ? !a[info.id][connectionType].enabled : state; + } + } + // otherwise a DOM element + else { + var id = _info(el).id; + if (a[id] && a[id][connectionType]) + a[id][connectionType].enabled = toggle ? !a[id][connectionType].enabled : state; + } + return this; + }.bind(this); + + var _first = function (el, fn) { + if (_ju.isString(el) || !el.length) + return fn.apply(this, [ el ]); + else if (el.length) + return fn.apply(this, [ el[0] ]); + + }.bind(this); + + this.toggleSourceEnabled = function (el, connectionType) { + _setEnabled("source", el, null, true, connectionType); + return this.isSourceEnabled(el, connectionType); + }; + + this.setSourceEnabled = function (el, state, connectionType) { + return _setEnabled("source", el, state, null, connectionType); + }; + this.isSource = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var eldefs = this.sourceEndpointDefinitions[_info(_el).id]; + return eldefs != null && eldefs[connectionType] != null; + }.bind(this)); + }; + this.isSourceEnabled = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var sep = this.sourceEndpointDefinitions[_info(_el).id]; + return sep && sep[connectionType] && sep[connectionType].enabled === true; + }.bind(this)); + }; + + this.toggleTargetEnabled = function (el, connectionType) { + _setEnabled("target", el, null, true, connectionType); + return this.isTargetEnabled(el, connectionType); + }; + + this.isTarget = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var eldefs = this.targetEndpointDefinitions[_info(_el).id]; + return eldefs != null && eldefs[connectionType] != null; + }.bind(this)); + }; + this.isTargetEnabled = function (el, connectionType) { + connectionType = connectionType || "default"; + return _first(el, function (_el) { + var tep = this.targetEndpointDefinitions[_info(_el).id]; + return tep && tep[connectionType] && tep[connectionType].enabled === true; + }.bind(this)); + }; + this.setTargetEnabled = function (el, state, connectionType) { + return _setEnabled("target", el, state, null, connectionType); + }; + +// --------------------- end makeSource/makeTarget ---------------------------------------------- + + this.ready = function (fn) { + _currentInstance.bind("ready", fn); + }; + + var _elEach = function(el, fn) { + // support both lists... + if (typeof el == 'object' && el.length) + for (var i = 0, ii = el.length; i < ii; i++) { + fn(el[i]); + } + else // ...and single strings or elements. + fn(el); + + return _currentInstance; + }; + + // repaint some element's endpoints and connections + this.repaint = function (el, ui, timestamp) { + return _elEach(el, function(_el) { + _draw(_el, ui, timestamp); + }); + }; + + this.revalidate = function (el, timestamp, isIdAlready) { + return _elEach(el, function(_el) { + var elId = isIdAlready ? _el : _currentInstance.getId(_el); + _currentInstance.updateOffset({ elId: elId, recalc: true, timestamp:timestamp }); + _currentInstance.repaint(_el); + }); + }; + + // repaint every endpoint and connection. + this.repaintEverything = function () { + // TODO this timestamp causes continuous anchors to not repaint properly. + // fix this. do not just take out the timestamp. it runs a lot faster with + // the timestamp included. + var timestamp = _timestamp(), elId; + + for (elId in endpointsByElement) { + _currentInstance.updateOffset({ elId: elId, recalc: true, timestamp: timestamp }); + } + + for (elId in endpointsByElement) { + _draw(elId, null, timestamp); + } + + return this; + }; + + this.removeAllEndpoints = function (el, recurse, affectedElements) { + affectedElements = affectedElements || []; + var _one = function (_el) { + var info = _info(_el), + ebe = endpointsByElement[info.id], + i, ii; + + if (ebe) { + affectedElements.push(info); + for (i = 0, ii = ebe.length; i < ii; i++) + _currentInstance.deleteEndpoint(ebe[i], false); + } + delete endpointsByElement[info.id]; + + if (recurse) { + if (info.el && info.el.nodeType != 3 && info.el.nodeType != 8) { + for (i = 0, ii = info.el.childNodes.length; i < ii; i++) { + _one(info.el.childNodes[i]); + } + } + } + + }; + _one(el); + return this; + }; + + var _doRemove = function(info, affectedElements) { + _currentInstance.removeAllEndpoints(info.id, true, affectedElements); + var _one = function(_info) { + _currentInstance.getDragManager().elementRemoved(_info.id); + _currentInstance.anchorManager.clearFor(_info.id); + _currentInstance.anchorManager.removeFloatingConnection(_info.id); + delete _currentInstance.floatingConnections[_info.id]; + delete managedElements[_info.id]; + delete offsets[_info.id]; + if (_info.el) { + _currentInstance.removeElement(_info.el); + _info.el._jsPlumb = null; + } + }; + + // remove all affected child elements + for (var ae = 1; ae < affectedElements.length; ae++) { + _one(affectedElements[ae]); + } + // and always remove the requested one from the dom. + _one(info); + }; + + /** + * Remove the given element, including cleaning up all endpoints registered for it. + * This is exposed in the public API but also used internally by jsPlumb when removing the + * element associated with a connection drag. + */ + this.remove = function (el, doNotRepaint) { + var info = _info(el), affectedElements = []; + if (info.text) { + info.el.parentNode.removeChild(info.el); + } + else if (info.id) { + _currentInstance.batch(function () { + _doRemove(info, affectedElements); + }, doNotRepaint === false); + } + return _currentInstance; + }; + + this.empty = function (el, doNotRepaint) { + var affectedElements = []; + var _one = function(el, dontRemoveFocus) { + var info = _info(el); + if (info.text) { + info.el.parentNode.removeChild(info.el); + } + else if (info.el) { + while(info.el.childNodes.length > 0) { + _one(info.el.childNodes[0]); + } + if (!dontRemoveFocus) _doRemove(info, affectedElements); + } + }; + + _currentInstance.batch(function() { + _one(el, true); + }, doNotRepaint === false); + + return _currentInstance; + }; + + this.reset = function () { + _currentInstance.silently(function() { + _currentInstance.deleteEveryEndpoint(); + _currentInstance.unbind(); + this.targetEndpointDefinitions = {}; + this.sourceEndpointDefinitions = {}; + connections.length = 0; + if (this.doReset) this.doReset(); + }.bind(this)); + }; + + var _clearObject = function (obj) { + if (obj.canvas && obj.canvas.parentNode) + obj.canvas.parentNode.removeChild(obj.canvas); + obj.cleanup(); + obj.destroy(); + }; + + this.clear = function () { + _currentInstance.select().each(_clearObject); + _currentInstance.selectEndpoints().each(_clearObject); + + endpointsByElement = {}; + endpointsByUUID = {}; + }; + + this.setDefaultScope = function (scope) { + DEFAULT_SCOPE = scope; + return _currentInstance; + }; + + // sets whether or not some element should be currently draggable. + this.setDraggable = _setDraggable; + + this.deriveEndpointAndAnchorSpec = function(type, dontPrependDefault) { + var bits = ((dontPrependDefault ? "" : "default ") + type).split(/[\s]/), eps = null, ep = null, a = null, as = null; + for (var i = 0; i < bits.length; i++) { + var _t = _currentInstance.getType(bits[i], "connection"); + if (_t) { + if (_t.endpoints) eps = _t.endpoints; + if (_t.endpoint) ep = _t.endpoint; + if (_t.anchors) as = _t.anchors; + if (_t.anchor) a = _t.anchor; + } + } + return { endpoints: eps ? eps : [ ep, ep ], anchors: as ? as : [a, a ]}; + }; + + // sets the id of some element, changing whatever we need to to keep track. + this.setId = function (el, newId, doNotSetAttribute) { + // + var id; + + if (_ju.isString(el)) { + id = el; + } + else { + el = this.getElement(el); + id = this.getId(el); + } + + var sConns = this.getConnections({source: id, scope: '*'}, true), + tConns = this.getConnections({target: id, scope: '*'}, true); + + newId = "" + newId; + + if (!doNotSetAttribute) { + el = this.getElement(id); + this.setAttribute(el, "id", newId); + } + else + el = this.getElement(newId); + + endpointsByElement[newId] = endpointsByElement[id] || []; + for (var i = 0, ii = endpointsByElement[newId].length; i < ii; i++) { + endpointsByElement[newId][i].setElementId(newId); + endpointsByElement[newId][i].setReferenceElement(el); + } + delete endpointsByElement[id]; + + this.sourceEndpointDefinitions[newId] = this.sourceEndpointDefinitions[id]; + delete this.sourceEndpointDefinitions[id]; + this.targetEndpointDefinitions[newId] = this.targetEndpointDefinitions[id]; + delete this.targetEndpointDefinitions[id]; + + this.anchorManager.changeId(id, newId); + this.getDragManager().changeId(id, newId); + managedElements[newId] = managedElements[id]; + delete managedElements[id]; + + var _conns = function (list, epIdx, type) { + for (var i = 0, ii = list.length; i < ii; i++) { + list[i].endpoints[epIdx].setElementId(newId); + list[i].endpoints[epIdx].setReferenceElement(el); + list[i][type + "Id"] = newId; + list[i][type] = el; + } + }; + _conns(sConns, 0, "source"); + _conns(tConns, 1, "target"); + + this.repaint(newId); + }; + + this.setDebugLog = function (debugLog) { + log = debugLog; + }; + + this.setSuspendDrawing = function (val, repaintAfterwards) { + var curVal = _suspendDrawing; + _suspendDrawing = val; + if (val) _suspendedAt = new Date().getTime(); else _suspendedAt = null; + if (repaintAfterwards) this.repaintEverything(); + return curVal; + }; + + // returns whether or not drawing is currently suspended. + this.isSuspendDrawing = function () { + return _suspendDrawing; + }; + + // return timestamp for when drawing was suspended. + this.getSuspendedAt = function () { + return _suspendedAt; + }; + + this.batch = function (fn, doNotRepaintAfterwards) { + var _wasSuspended = this.isSuspendDrawing(); + if (!_wasSuspended) + this.setSuspendDrawing(true); + try { + fn(); + } + catch (e) { + _ju.log("Function run while suspended failed", e); + } + if (!_wasSuspended) + this.setSuspendDrawing(false, !doNotRepaintAfterwards); + }; + + this.doWhileSuspended = this.batch; + + this.getCachedData = _getCachedData; + this.timestamp = _timestamp; + this.show = function (el, changeEndpoints) { + _setVisible(el, "block", changeEndpoints); + return _currentInstance; + }; + + // TODO: update this method to return the current state. + this.toggleVisible = _toggleVisible; + this.toggleDraggable = _toggleDraggable; + this.addListener = this.bind; + }; + + _ju.extend(jsPlumbInstance, _ju.EventGenerator, { + setAttribute: function (el, a, v) { + this.setAttribute(el, a, v); + }, + getAttribute: function (el, a) { + return this.getAttribute(jsPlumb.getElement(el), a); + }, + convertToFullOverlaySpec: function(spec) { + if (_ju.isString(spec)) { + spec = [ spec, { } ]; + } + spec[1].id = spec[1].id || _ju.uuid(); + return spec; + }, + registerConnectionType: function (id, type) { + this._connectionTypes[id] = jsPlumb.extend({}, type); + if (type.overlays) { + var to = {}; + for (var i = 0; i < type.overlays.length; i++) { + // if a string, convert to object representation so that we can store the typeid on it. + // also assign an id. + var fo = this.convertToFullOverlaySpec(type.overlays[i]); + to[fo[1].id] = fo; + } + this._connectionTypes[id].overlays = to; + } + }, + registerConnectionTypes: function (types) { + for (var i in types) + this.registerConnectionType(i, types[i]); + }, + registerEndpointType: function (id, type) { + this._endpointTypes[id] = jsPlumb.extend({}, type); + if (type.overlays) { + var to = {}; + for (var i = 0; i < type.overlays.length; i++) { + // if a string, convert to object representation so that we can store the typeid on it. + // also assign an id. + var fo = this.convertToFullOverlaySpec(type.overlays[i]); + to[fo[1].id] = fo; + } + this._endpointTypes[id].overlays = to; + } + }, + registerEndpointTypes: function (types) { + for (var i in types) + //this._endpointTypes[i] = jsPlumb.extend({}, types[i]); + this.registerEndpointType(i, types[i]); + }, + getType: function (id, typeDescriptor) { + return typeDescriptor === "connection" ? this._connectionTypes[id] : this._endpointTypes[id]; + }, + setIdChanged: function (oldId, newId) { + this.setId(oldId, newId, true); + }, + // set parent: change the parent for some node and update all the registrations we need to. + setParent: function (el, newParent) { + var _dom = this.getElement(el), + _id = this.getId(_dom), + _pdom = this.getElement(newParent), + _pid = this.getId(_pdom); + + _dom.parentNode.removeChild(_dom); + _pdom.appendChild(_dom); + this.getDragManager().setParent(_dom, _id, _pdom, _pid); + }, + extend: function (o1, o2, names) { + var i; + if (names) { + for (i = 0; i < names.length; i++) + o1[names[i]] = o2[names[i]]; + } + else + for (i in o2) o1[i] = o2[i]; + return o1; + }, + floatingConnections: {}, + getFloatingAnchorIndex: function (jpc) { + return jpc.endpoints[0].isFloating() ? 0 : jpc.endpoints[1].isFloating() ? 1 : -1; + } + }); + +// --------------------- static instance + AMD registration ------------------------------------------- + +// create static instance and assign to window if window exists. + var jsPlumb = new jsPlumbInstance(); + // register on 'root' (lets us run on server or browser) + root.jsPlumb = jsPlumb; + // add 'getInstance' method to static instance + jsPlumb.getInstance = function (_defaults) { + var j = new jsPlumbInstance(_defaults); + j.init(); + return j; + }; + jsPlumb.each = function (spec, fn) { + if (spec == null) return; + if (typeof spec === "string") + fn(jsPlumb.getElement(spec)); + else if (spec.length != null) { + for (var i = 0; i < spec.length; i++) + fn(jsPlumb.getElement(spec[i])); + } + else + fn(spec); // assume it's an element. + }; +// maybe register static instance as an AMD module, and getInstance method too. + if (typeof define === "function") { + define("jsplumb", [], function () { + return jsPlumb; + }); + define("jsplumbinstance", [], function () { + return jsPlumb.getInstance(); + }); + } + // CommonJS + if (typeof exports !== 'undefined') { + exports.jsPlumb = jsPlumb; + } + + +// --------------------- end static instance + AMD registration ------------------------------------------- + +}).call(this); + +/* + * jsPlumb + * + * Title:jsPlumb 2.0.2 + * + * Provides a way to visually connect elements on an HTML page, using SVG. + * + * This file contains the base functionality for DOM type adapters. + * + * Copyright (c) 2010 - 2015 jsPlumb (hello@jsplumbtoolkit.com) + * + * http://jsplumbtoolkit.com + * http://github.com/sporritt/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + var root = this, _ju = root.jsPlumbUtil; + + var svgAvailable = !!window.SVGAngle || document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"), + + _genLoc = function (e, prefix) { + if (e == null) return [ 0, 0 ]; + var ts = _touches(e), t = _getTouch(ts, 0); + return [t[prefix + "X"], t[prefix + "Y"]]; + }, + _pageLocation = function (e) { + if (e == null) return [ 0, 0 ]; + return _genLoc(e, "page"); + }, + _screenLocation = function (e) { + return _genLoc(e, "screen"); + }, + _clientLocation = function (e) { + return _genLoc(e, "client"); + }, + _getTouch = function (touches, idx) { + return touches.item ? touches.item(idx) : touches[idx]; + }, + _touches = function (e) { + return e.touches && e.touches.length > 0 ? e.touches : + e.changedTouches && e.changedTouches.length > 0 ? e.changedTouches : + e.targetTouches && e.targetTouches.length > 0 ? e.targetTouches : + [ e ]; + }; + + /** + Manages dragging for some instance of jsPlumb. + + TODO instead of this being accessed directly, it should subscribe to events on the jsPlumb instance: every method + in here is called directly by jsPlumb. But what should happen is that we have unpublished events that this listens + to. The only trick is getting one of these instantiated with every jsPlumb instance: it needs to have a hook somehow. + Basically the general idea is to pull ALL the drag code out (prototype method registrations plus this) into a + dedicated drag script), that does not necessarily need to be included. + + + */ + var DragManager = function (_currentInstance) { + var _draggables = {}, _dlist = [], _delements = {}, _elementsWithEndpoints = {}, + // elementids mapped to the draggable to which they belong. + _draggablesForElements = {}; + + /** + register some element as draggable. right now the drag init stuff is done elsewhere, and it is + possible that will continue to be the case. + */ + this.register = function (el) { + var id = _currentInstance.getId(el), + parentOffset = _currentInstance.getOffset(el); + + if (!_draggables[id]) { + _draggables[id] = el; + _dlist.push(el); + _delements[id] = {}; + } + + // look for child elements that have endpoints and register them against this draggable. + var _oneLevel = function (p) { + if (p) { + for (var i = 0; i < p.childNodes.length; i++) { + if (p.childNodes[i].nodeType != 3 && p.childNodes[i].nodeType != 8) { + var cEl = jsPlumb.getElement(p.childNodes[i]), + cid = _currentInstance.getId(p.childNodes[i], null, true); + if (cid && _elementsWithEndpoints[cid] && _elementsWithEndpoints[cid] > 0) { + var cOff = _currentInstance.getOffset(cEl); + _delements[id][cid] = { + id: cid, + offset: { + left: cOff.left - parentOffset.left, + top: cOff.top - parentOffset.top + } + }; + _draggablesForElements[cid] = id; + } + _oneLevel(p.childNodes[i]); + } + } + } + }; + + _oneLevel(el); + }; + + // refresh the offsets for child elements of this element. + this.updateOffsets = function (elId) { + if (elId != null) { + var domEl = jsPlumb.getElement(elId), + id = _currentInstance.getId(domEl), + children = _delements[id], + parentOffset = _currentInstance.getOffset(domEl); + + if (children) { + for (var i in children) { + if (children.hasOwnProperty(i)) { + var cel = jsPlumb.getElement(i), + cOff = _currentInstance.getOffset(cel); + + _delements[id][i] = { + id: i, + offset: { + left: cOff.left - parentOffset.left, + top: cOff.top - parentOffset.top + } + }; + _draggablesForElements[i] = id; + } + } + } + } + }; + + /** + notification that an endpoint was added to the given el. we go up from that el's parent + node, looking for a parent that has been registered as a draggable. if we find one, we add this + el to that parent's list of elements to update on drag (if it is not there already) + */ + this.endpointAdded = function (el, id) { + + id = id || _currentInstance.getId(el); + + var b = document.body, + p = el.parentNode; + + _elementsWithEndpoints[id] = _elementsWithEndpoints[id] ? _elementsWithEndpoints[id] + 1 : 1; + + while (p != null && p != b) { + var pid = _currentInstance.getId(p, null, true); + if (pid && _draggables[pid]) { + var pLoc = _currentInstance.getOffset(p); + + if (_delements[pid][id] == null) { + var cLoc = _currentInstance.getOffset(el); + _delements[pid][id] = { + id: id, + offset: { + left: cLoc.left - pLoc.left, + top: cLoc.top - pLoc.top + } + }; + _draggablesForElements[id] = pid; + } + break; + } + p = p.parentNode; + } + }; + + this.endpointDeleted = function (endpoint) { + if (_elementsWithEndpoints[endpoint.elementId]) { + _elementsWithEndpoints[endpoint.elementId]--; + if (_elementsWithEndpoints[endpoint.elementId] <= 0) { + for (var i in _delements) { + if (_delements.hasOwnProperty(i) && _delements[i]) { + delete _delements[i][endpoint.elementId]; + delete _draggablesForElements[endpoint.elementId]; + } + } + } + } + }; + + this.changeId = function (oldId, newId) { + _delements[newId] = _delements[oldId]; + _delements[oldId] = {}; + _draggablesForElements[newId] = _draggablesForElements[oldId]; + _draggablesForElements[oldId] = null; + }; + + this.getElementsForDraggable = function (id) { + return _delements[id]; + }; + + this.elementRemoved = function (elementId) { + var elId = _draggablesForElements[elementId]; + if (elId) { + delete _delements[elId][elementId]; + delete _draggablesForElements[elementId]; + } + }; + + this.reset = function () { + _draggables = {}; + _dlist = []; + _delements = {}; + _elementsWithEndpoints = {}; + }; + + // + // notification drag ended. We check automatically if need to update some + // ancestor's offsets. + // + this.dragEnded = function (el) { + var id = _currentInstance.getId(el), + ancestor = _draggablesForElements[id]; + + if (ancestor) this.updateOffsets(ancestor); + }; + + this.setParent = function (el, elId, p, pId) { + var current = _draggablesForElements[elId]; + if (current) { + if (!_delements[pId]) + _delements[pId] = {}; + _delements[pId][elId] = _delements[current][elId]; + delete _delements[current][elId]; + var pLoc = _currentInstance.getOffset(p), + cLoc = _currentInstance.getOffset(el); + _delements[pId][elId].offset = { + left: cLoc.left - pLoc.left, + top: cLoc.top - pLoc.top + }; + _draggablesForElements[elId] = pId; + } + }; + + this.getDragAncestor = function (el) { + var de = jsPlumb.getElement(el), + id = _currentInstance.getId(de), + aid = _draggablesForElements[id]; + + if (aid) + return jsPlumb.getElement(aid); + else + return null; + }; + + }; + + var trim = function (str) { + return str == null ? null : (str.replace(/^\s\s*/, '').replace(/\s\s*$/, '')); + }, + _setClassName = function (el, cn) { + cn = trim(cn); + if (typeof el.className.baseVal != "undefined") // SVG + el.className.baseVal = cn; + else + el.className = cn; + }, + _getClassName = function (el) { + return (typeof el.className.baseVal == "undefined") ? el.className : el.className.baseVal; + }, + _classManip = function (el, classesToAdd, classesToRemove) { + classesToAdd = classesToAdd == null ? [] : jsPlumbUtil.isArray(classesToAdd) ? classesToAdd : classesToAdd.split(/\s+/); + classesToRemove = classesToRemove == null ? [] : jsPlumbUtil.isArray(classesToRemove) ? classesToRemove : classesToRemove.split(/\s+/); + + var className = _getClassName(el), + curClasses = className.split(/\s+/); + + var _oneSet = function (add, classes) { + for (var i = 0; i < classes.length; i++) { + if (add) { + if (curClasses.indexOf(classes[i]) == -1) + curClasses.push(classes[i]); + } + else { + var idx = curClasses.indexOf(classes[i]); + if (idx != -1) + curClasses.splice(idx, 1); + } + } + }; + + _oneSet(true, classesToAdd); + _oneSet(false, classesToRemove); + + _setClassName(el, curClasses.join(" ")); + }; + + jsPlumb.extend(jsPlumbInstance.prototype, { + + headless: false, + + pageLocation: _pageLocation, + screenLocation: _screenLocation, + clientLocation: _clientLocation, + + getDragManager:function() { + if (this.dragManager == null) + this.dragManager = new DragManager(this); + + return this.dragManager; + }, + + recalculateOffsets:function(elId) { + this.getDragManager().updateOffsets(elId); + }, + + createElement:function(tag, style, clazz, atts) { + return this.createElementNS(null, tag, style, clazz, atts); + }, + + createElementNS:function(ns, tag, style, clazz, atts) { + var e = ns == null ? document.createElement(tag) : document.createElementNS(ns, tag); + var i; + style = style || {}; + for (i in style) + e.style[i] = style[i]; + + if (clazz) + e.className = clazz; + + atts = atts || {}; + for (i in atts) + e.setAttribute(i, "" + atts[i]); + + return e; + }, + + getAttribute: function (el, attName) { + return el.getAttribute != null ? el.getAttribute(attName) : null; + }, + + setAttribute: function (el, a, v) { + if (el.setAttribute != null) el.setAttribute(a, v); + }, + + setAttributes: function (el, atts) { + for (var i in atts) + if (atts.hasOwnProperty(i)) el.setAttribute(i, atts[i]); + }, + appendToRoot: function (node) { + document.body.appendChild(node); + }, + getRenderModes: function () { + return [ "svg" ]; + }, + getClass:_getClassName, + addClass: function (el, clazz) { + jsPlumb.each(el, function (e) { + _classManip(e, clazz); + }); + }, + hasClass: function (el, clazz) { + el = jsPlumb.getElement(el); + if (el.classList) return el.classList.contains(clazz); + else { + return _getClassName(el).indexOf(clazz) != -1; + } + }, + removeClass: function (el, clazz) { + jsPlumb.each(el, function (e) { + _classManip(e, null, clazz); + }); + }, + updateClasses: function (el, toAdd, toRemove) { + jsPlumb.each(el, function (e) { + _classManip(e, toAdd, toRemove); + }); + }, + setClass: function (el, clazz) { + jsPlumb.each(el, function (e) { + _setClassName(e, clazz); + }); + }, + setPosition: function (el, p) { + el.style.left = p.left + "px"; + el.style.top = p.top + "px"; + }, + getPosition: function (el) { + var _one = function (prop) { + var v = el.style[prop]; + return v ? v.substring(0, v.length - 2) : 0; + }; + return { + left: _one("left"), + top: _one("top") + }; + }, + getStyle:function(el, prop) { + if (typeof window.getComputedStyle !== 'undefined') { + return getComputedStyle(el, null).getPropertyValue(prop); + } else { + return el.currentStyle[prop]; + } + }, + getSelector: function (ctx, spec) { + var sel = null; + if (arguments.length == 1) { + sel = ctx.nodeType != null ? ctx : document.querySelectorAll(ctx); + } + else + sel = ctx.querySelectorAll(spec); + + return sel; + }, + getOffset:function(el, relativeToRoot, container) { + el = jsPlumb.getElement(el); + container = container || this.getContainer(); + var out = { + left: el.offsetLeft, + top: el.offsetTop + }, + op = (relativeToRoot || (container != null && (el != container && el.offsetParent != container))) ? el.offsetParent : null, + _maybeAdjustScroll = function(offsetParent) { + if (offsetParent != null && offsetParent !== document.body && (offsetParent.scrollTop > 0 || offsetParent.scrollLeft > 0)) { + out.left -= offsetParent.scrollLeft; + out.top -= offsetParent.scrollTop; + } + }.bind(this); + + while (op != null) { + out.left += op.offsetLeft; + out.top += op.offsetTop; + _maybeAdjustScroll(op); + op = relativeToRoot ? op.offsetParent : + op.offsetParent == container ? null : op.offsetParent; + } + + // if container is scrolled and the element (or its offset parent) is not absolute or fixed, adjust accordingly. + if (container != null && !relativeToRoot && (container.scrollTop > 0 || container.scrollLeft > 0)) { + var pp = el.offsetParent != null ? this.getStyle(el.offsetParent, "position") : "static", + p = this.getStyle(el, "position"); + if (p !== "absolute" && p !== "fixed" && pp !== "absolute" && pp != "fixed") { + out.left -= container.scrollLeft; + out.top -= container.scrollTop; + } + } + return out; + }, + // + // return x+y proportion of the given element's size corresponding to the location of the given event. + // + getPositionOnElement: function (evt, el, zoom) { + var box = typeof el.getBoundingClientRect !== "undefined" ? el.getBoundingClientRect() : { left: 0, top: 0, width: 0, height: 0 }, + body = document.body, + docElem = document.documentElement, + scrollTop = window.pageYOffset || docElem.scrollTop || body.scrollTop, + scrollLeft = window.pageXOffset || docElem.scrollLeft || body.scrollLeft, + clientTop = docElem.clientTop || body.clientTop || 0, + clientLeft = docElem.clientLeft || body.clientLeft || 0, + pst = 0, + psl = 0, + top = box.top + scrollTop - clientTop + (pst * zoom), + left = box.left + scrollLeft - clientLeft + (psl * zoom), + cl = jsPlumb.pageLocation(evt), + w = box.width || (el.offsetWidth * zoom), + h = box.height || (el.offsetHeight * zoom), + x = (cl[0] - left) / w, + y = (cl[1] - top) / h; + + return [ x, y ]; + }, + + /** + * Gets the absolute position of some element as read from the left/top properties in its style. + * @method getAbsolutePosition + * @param {Element} el The element to retrieve the absolute coordinates from. **Note** this is a DOM element, not a selector from the underlying library. + * @return {Number[]} [left, top] pixel values. + */ + getAbsolutePosition: function (el) { + var _one = function (s) { + var ss = el.style[s]; + if (ss) return parseFloat(ss.substring(0, ss.length - 2)); + }; + return [ _one("left"), _one("top") ]; + }, + + /** + * Sets the absolute position of some element by setting the left/top properties in its style. + * @method setAbsolutePosition + * @param {Element} el The element to set the absolute coordinates on. **Note** this is a DOM element, not a selector from the underlying library. + * @param {Number[]} xy x and y coordinates + * @param {Number[]} [animateFrom] Optional previous xy to animate from. + * @param {Object} [animateOptions] Options for the animation. + */ + setAbsolutePosition: function (el, xy, animateFrom, animateOptions) { + if (animateFrom) { + this.animate(el, { + left: "+=" + (xy[0] - animateFrom[0]), + top: "+=" + (xy[1] - animateFrom[1]) + }, animateOptions); + } + else { + el.style.left = xy[0] + "px"; + el.style.top = xy[1] + "px"; + } + }, + /** + * gets the size for the element, in an array : [ width, height ]. + */ + getSize: function (el) { + return [ el.offsetWidth, el.offsetHeight ]; + }, + getWidth: function (el) { + return el.offsetWidth; + }, + getHeight: function (el) { + return el.offsetHeight; + } + + }); +}).call(this); + +/* + * jsPlumb + * + * Title:jsPlumb 2.0.2 + * + * Provides a way to visually connect elements on an HTML page, using SVG. + * + * This file contains code for components that support overlays. + * + * Copyright (c) 2010 - 2015 jsPlumb (hello@jsplumbtoolkit.com) + * + * http://jsplumbtoolkit.com + * http://github.com/sporritt/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function() { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + // ------------------------------ BEGIN OverlayCapablejsPlumbUIComponent -------------------------------------------- + + var _internalLabelOverlayId = "__label", + // this is a shortcut helper method to let people add a label as + // overlay. + _makeLabelOverlay = function (component, params) { + + var _params = { + cssClass: params.cssClass, + labelStyle: component.labelStyle, + id: _internalLabelOverlayId, + component: component, + _jsPlumb: component._jsPlumb.instance // TODO not necessary, since the instance can be accessed through the component. + }, + mergedParams = jsPlumb.extend(_params, params); + + return new _jp.Overlays[component._jsPlumb.instance.getRenderMode()].Label(mergedParams); + }, + _processOverlay = function (component, o) { + var _newOverlay = null; + if (_ju.isArray(o)) { // this is for the shorthand ["Arrow", { width:50 }] syntax + // there's also a three arg version: + // ["Arrow", { width:50 }, {location:0.7}] + // which merges the 3rd arg into the 2nd. + var type = o[0], + // make a copy of the object so as not to mess up anyone else's reference... + p = _jp.extend({component: component, _jsPlumb: component._jsPlumb.instance}, o[1]); + if (o.length == 3) _jp.extend(p, o[2]); + _newOverlay = new _jp.Overlays[component._jsPlumb.instance.getRenderMode()][type](p); + } else if (o.constructor == String) { + _newOverlay = new _jp.Overlays[component._jsPlumb.instance.getRenderMode()][o]({component: component, _jsPlumb: component._jsPlumb.instance}); + } else { + _newOverlay = o; + } + + _newOverlay.id = _newOverlay.id || _ju.uuid(); + component.cacheTypeItem("overlay", _newOverlay, _newOverlay.id); + //component._jsPlumb.overlays.push(_newOverlay); + component._jsPlumb.overlays[_newOverlay.id] = _newOverlay; + + return _newOverlay; + }; + + _jp.OverlayCapableJsPlumbUIComponent = function (params) { + + jsPlumbUIComponent.apply(this, arguments); + this._jsPlumb.overlays = {}; + this._jsPlumb.overlayPositions = {}; + + if (params.label) { + this.getDefaultType().overlays[_internalLabelOverlayId] = ["Label", { + label: params.label, + location: params.labelLocation || this.defaultLabelLocation || 0.5, + labelStyle: params.labelStyle || this._jsPlumb.instance.Defaults.LabelStyle, + id:_internalLabelOverlayId + }]; + } + + this.setListenerComponent = function (c) { + if (this._jsPlumb) { + for (var i in this._jsPlumb.overlays) + this._jsPlumb.overlays[i].setListenerComponent(c); + } + }; + }; + + _jp.OverlayCapableJsPlumbUIComponent.applyType = function (component, t) { + if (t.overlays) { + // loop through the ones in the type. if already present on the component, + // dont remove or re-add. + var keep = {}, i; + + for (i in t.overlays) { + + var existing = component._jsPlumb.overlays[t.overlays[i][1].id]; + if (existing) { + // maybe update from data, if there were parameterised values for instance. + existing.updateFrom(t.overlays[i][1]); + keep[t.overlays[i][1].id] = true; + } + else { + var c = component.getCachedTypeItem("overlay", t.overlays[i][1].id); + if (c != null) { + c.reattach(component._jsPlumb.instance); + // maybe update from data, if there were parameterised values for instance. + c.updateFrom(t.overlays[i][1]); + component._jsPlumb.overlays[c.id] = c; + } + else { + c = component.addOverlay(t.overlays[i], true); + } + keep[c.id] = true; + } + } + + // now loop through the full overlays and remove those that we dont want to keep + for (i in component._jsPlumb.overlays) { + if (keep[component._jsPlumb.overlays[i].id] == null) + component.removeOverlay(component._jsPlumb.overlays[i].id, true); // remove overlay but dont clean it up. + // that would remove event listeners etc; overlays are never discarded by the types stuff, they are + // just detached/reattached. + } + } + }; + + _ju.extend(_jp.OverlayCapableJsPlumbUIComponent, root.jsPlumbUIComponent, { + + setHover: function (hover, ignoreAttachedElements) { + if (this._jsPlumb && !this._jsPlumb.instance.isConnectionBeingDragged()) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i][hover ? "addClass" : "removeClass"](this._jsPlumb.instance.hoverClass); + } + } + }, + addOverlay: function (overlay, doNotRepaint) { + var o = _processOverlay(this, overlay); + if (!doNotRepaint) this.repaint(); + return o; + }, + getOverlay: function (id) { + return this._jsPlumb.overlays[id]; + }, + getOverlays: function () { + return this._jsPlumb.overlays; + }, + hideOverlay: function (id) { + var o = this.getOverlay(id); + if (o) o.hide(); + }, + hideOverlays: function () { + for (var i in this._jsPlumb.overlays) + this._jsPlumb.overlays[i].hide(); + }, + showOverlay: function (id) { + var o = this.getOverlay(id); + if (o) o.show(); + }, + showOverlays: function () { + for (var i in this._jsPlumb.overlays) + this._jsPlumb.overlays[i].show(); + }, + removeAllOverlays: function (doNotRepaint) { + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays[i].cleanup) this._jsPlumb.overlays[i].cleanup(); + } + + this._jsPlumb.overlays = {}; + this._jsPlumb.overlayPositions = null; + if (!doNotRepaint) + this.repaint(); + }, + removeOverlay: function (overlayId, dontCleanup) { + var o = this._jsPlumb.overlays[overlayId]; + if (o) { + if (!dontCleanup && o.cleanup) o.cleanup(); + delete this._jsPlumb.overlays[overlayId]; + if (this._jsPlumb.overlayPositions) + delete this._jsPlumb.overlayPositions[overlayId]; + } + }, + removeOverlays: function () { + for (var i = 0, j = arguments.length; i < j; i++) + this.removeOverlay(arguments[i]); + }, + moveParent: function (newParent) { + if (this.bgCanvas) { + this.bgCanvas.parentNode.removeChild(this.bgCanvas); + newParent.appendChild(this.bgCanvas); + } + + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + newParent.appendChild(this.canvas); + + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays[i].isAppendedAtTopLevel) { + var el = this._jsPlumb.overlays[i].getElement(); + el.parentNode.removeChild(el); + newParent.appendChild(el); + } + } + } + }, + getLabel: function () { + var lo = this.getOverlay(_internalLabelOverlayId); + return lo != null ? lo.getLabel() : null; + }, + getLabelOverlay: function () { + return this.getOverlay(_internalLabelOverlayId); + }, + setLabel: function (l) { + var lo = this.getOverlay(_internalLabelOverlayId); + if (!lo) { + var params = l.constructor == String || l.constructor == Function ? { label: l } : l; + lo = _makeLabelOverlay(this, params); + this._jsPlumb.overlays[_internalLabelOverlayId] = lo; + } + else { + if (l.constructor == String || l.constructor == Function) lo.setLabel(l); + else { + if (l.label) lo.setLabel(l.label); + if (l.location) lo.setLocation(l.location); + } + } + + if (!this._jsPlumb.instance.isSuspendDrawing()) + this.repaint(); + }, + cleanup: function (force) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i].cleanup(force); + this._jsPlumb.overlays[i].destroy(force); + } + if (force) { + this._jsPlumb.overlays = {}; + this._jsPlumb.overlayPositions = null; + } + }, + setVisible: function (v) { + this[v ? "showOverlays" : "hideOverlays"](); + }, + setAbsoluteOverlayPosition: function (overlay, xy) { + this._jsPlumb.overlayPositions[overlay.id] = xy; + }, + getAbsoluteOverlayPosition: function (overlay) { + return this._jsPlumb.overlayPositions ? this._jsPlumb.overlayPositions[overlay.id] : null; + }, + _clazzManip:function(action, clazz, dontUpdateOverlays) { + if (!dontUpdateOverlays) { + for (var i in this._jsPlumb.overlays) { + this._jsPlumb.overlays[i][action + "Class"](clazz); + } + } + }, + addClass:function(clazz, dontUpdateOverlays) { + this._clazzManip("add", clazz, dontUpdateOverlays) + }, + removeClass:function(clazz, dontUpdateOverlays) { + this._clazzManip("remove", clazz, dontUpdateOverlays) + } + }); + +// ------------------------------ END OverlayCapablejsPlumbUIComponent -------------------------------------------- + +}).call(this); + +/* + * jsPlumb + * + * Title:jsPlumb 2.0.2 + * + * Provides a way to visually connect elements on an HTML page, using SVG. + * + * This file contains the code for Endpoints. + * + * Copyright (c) 2010 - 2015 jsPlumb (hello@jsplumbtoolkit.com) + * + * http://jsplumbtoolkit.com + * http://github.com/sporritt/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + // create the drag handler for a connection + var _makeConnectionDragHandler = function (endpoint, placeholder, _jsPlumb) { + var stopped = false; + return { + drag: function () { + if (stopped) { + stopped = false; + return true; + } + + if (placeholder.element) { + var _ui = _jsPlumb.getUIPosition(arguments, _jsPlumb.getZoom()); + jsPlumb.setPosition(placeholder.element, _ui); + _jsPlumb.repaint(placeholder.element, _ui); + // always repaint the source endpoint, because only continuous/dynamic anchors cause the endpoint + // to be repainted, so static anchors need to be told (or the endpoint gets dragged around) + endpoint.paint({anchorPoint:endpoint.anchor.getCurrentLocation({element:endpoint.element})}); + } + }, + stopDrag: function () { + stopped = true; + } + }; + }; + + // creates a placeholder div for dragging purposes, adds it, and pre-computes its offset. + var _makeDraggablePlaceholder = function (placeholder, _jsPlumb, ipco, ips) { + var n = jsPlumb.createElement("div", { position : "absolute" }); + _jsPlumb.appendElement(n); + var id = _jsPlumb.getId(n); + jsPlumb.setPosition(n, ipco); + n.style.width = ips[0] + "px"; + n.style.height = ips[1] + "px"; + _jsPlumb.manage(id, n, true); // TRANSIENT MANAGE + // create and assign an id, and initialize the offset. + placeholder.id = id; + placeholder.element = n; + }; + + // create a floating endpoint (for drag connections) + var _makeFloatingEndpoint = function (paintStyle, referenceAnchor, endpoint, referenceCanvas, sourceElement, _jsPlumb, _newEndpoint, scope) { + var floatingAnchor = new _jp.FloatingAnchor({ reference: referenceAnchor, referenceCanvas: referenceCanvas, jsPlumbInstance: _jsPlumb }); + //setting the scope here should not be the way to fix that mootools issue. it should be fixed by not + // adding the floating endpoint as a droppable. that makes more sense anyway! + // TRANSIENT MANAGE + return _newEndpoint({ + paintStyle: paintStyle, + endpoint: endpoint, + anchor: floatingAnchor, + source: sourceElement, + scope: scope + }); + }; + + var typeParameters = [ "connectorStyle", "connectorHoverStyle", "connectorOverlays", + "connector", "connectionType", "connectorClass", "connectorHoverClass" ]; + + // a helper function that tries to find a connection to the given element, and returns it if so. if elementWithPrecedence is null, + // or no connection to it is found, we return the first connection in our list. + var findConnectionToUseForDynamicAnchor = function (ep, elementWithPrecedence) { + var idx = 0; + if (elementWithPrecedence != null) { + for (var i = 0; i < ep.connections.length; i++) { + if (ep.connections[i].sourceId == elementWithPrecedence || ep.connections[i].targetId == elementWithPrecedence) { + idx = i; + break; + } + } + } + + return ep.connections[idx]; + }; + + _jp.Endpoint = function (params) { + var _jsPlumb = params._jsPlumb, + _newConnection = params.newConnection, + _newEndpoint = params.newEndpoint; + + this.idPrefix = "_jsplumb_e_"; + this.defaultLabelLocation = [ 0.5, 0.5 ]; + this.defaultOverlayKeys = ["Overlays", "EndpointOverlays"]; + _jp.OverlayCapableJsPlumbUIComponent.apply(this, arguments); + +// TYPE + + this.appendToDefaultType({ + connectionType:params.connectionType, + maxConnections: params.maxConnections == null ? this._jsPlumb.instance.Defaults.MaxConnections : params.maxConnections, // maximum number of connections this endpoint can be the source of., + paintStyle: params.endpointStyle || params.paintStyle || params.style || this._jsPlumb.instance.Defaults.EndpointStyle || _jp.Defaults.EndpointStyle, + hoverPaintStyle: params.endpointHoverStyle || params.hoverPaintStyle || this._jsPlumb.instance.Defaults.EndpointHoverStyle || _jp.Defaults.EndpointHoverStyle, + connectorStyle: params.connectorStyle, + connectorHoverStyle: params.connectorHoverStyle, + connectorClass: params.connectorClass, + connectorHoverClass: params.connectorHoverClass, + connectorOverlays: params.connectorOverlays, + connector: params.connector, + connectorTooltip: params.connectorTooltip + }); + +// END TYPE + + this._jsPlumb.enabled = !(params.enabled === false); + this._jsPlumb.visible = true; + this.element = _jp.getElement(params.source); + this._jsPlumb.uuid = params.uuid; + this._jsPlumb.floatingEndpoint = null; + var inPlaceCopy = null; + if (this._jsPlumb.uuid) params.endpointsByUUID[this._jsPlumb.uuid] = this; + this.elementId = params.elementId; + this.dragProxy = params.dragProxy; + + this._jsPlumb.connectionCost = params.connectionCost; + this._jsPlumb.connectionsDirected = params.connectionsDirected; + this._jsPlumb.currentAnchorClass = ""; + this._jsPlumb.events = {}; + + var _updateAnchorClass = function () { + // stash old, get new + var oldAnchorClass = _jsPlumb.endpointAnchorClassPrefix + "-" + this._jsPlumb.currentAnchorClass; + this._jsPlumb.currentAnchorClass = this.anchor.getCssClass(); + var anchorClass = _jsPlumb.endpointAnchorClassPrefix + (this._jsPlumb.currentAnchorClass ? "-" + this._jsPlumb.currentAnchorClass : ""); + + this.removeClass(oldAnchorClass); + this.addClass(anchorClass); + // add and remove at the same time to reduce the number of reflows. + jsPlumb.updateClasses(this.element, anchorClass, oldAnchorClass); + }.bind(this); + + this.prepareAnchor = function(anchorParams) { + var a = this._jsPlumb.instance.makeAnchor(anchorParams, this.elementId, _jsPlumb); + a.bind("anchorChanged", function (currentAnchor) { + this.fire("anchorChanged", {endpoint: this, anchor: currentAnchor}); + _updateAnchorClass(); + }.bind(this)); + return a; + }; + + this.setPreparedAnchor = function(anchor, doNotRepaint) { + this._jsPlumb.instance.continuousAnchorFactory.clear(this.elementId); + this.anchor = anchor; + _updateAnchorClass(); + + if (!doNotRepaint) + this._jsPlumb.instance.repaint(this.elementId); + + return this; + }; + + this.setAnchor = function (anchorParams, doNotRepaint) { + var a = this.prepareAnchor(anchorParams); + this.setPreparedAnchor(a, doNotRepaint); + return this; + }; + + var internalHover = function (state) { + if (this.connections.length > 0) { + for (var i = 0; i < this.connections.length; i++) + this.connections[i].setHover(state, false); + } + else + this.setHover(state); + }.bind(this); + + this.bind("mouseover", function () { + internalHover(true); + }); + this.bind("mouseout", function () { + internalHover(false); + }); + + // ANCHOR MANAGER + if (!params._transient) // in place copies, for example, are transient. they will never need to be retrieved during a paint cycle, because they dont move, and then they are deleted. + this._jsPlumb.instance.anchorManager.add(this, this.elementId); + + this.prepareEndpoint = function(ep, typeId) { + var _e = function (t, p) { + var rm = _jsPlumb.getRenderMode(); + if (_jp.Endpoints[rm][t]) return new _jp.Endpoints[rm][t](p); + if (!_jsPlumb.Defaults.DoNotThrowErrors) + throw { msg: "jsPlumb: unknown endpoint type '" + t + "'" }; + }; + + var endpointArgs = { + _jsPlumb: this._jsPlumb.instance, + cssClass: params.cssClass, + container: params.container, + tooltip: params.tooltip, + connectorTooltip: params.connectorTooltip, + endpoint: this + }; + + var endpoint; + + if (_ju.isString(ep)) + endpoint = _e(ep, endpointArgs); + else if (_ju.isArray(ep)) { + endpointArgs = _ju.merge(ep[1], endpointArgs); + endpoint = _e(ep[0], endpointArgs); + } + else { + endpoint = ep.clone(); + } + + // assign a clone function using a copy of endpointArgs. this is used when a drag starts: the endpoint that was dragged is cloned, + // and the clone is left in its place while the original one goes off on a magical journey. + // the copy is to get around a closure problem, in which endpointArgs ends up getting shared by + // the whole world. + //var argsForClone = jsPlumb.extend({}, endpointArgs); + endpoint.clone = function () { + // TODO this, and the code above, can be refactored to be more dry. + if (_ju.isString(ep)) + return _e(ep, endpointArgs); + else if (_ju.isArray(ep)) { + endpointArgs = _ju.merge(ep[1], endpointArgs); + return _e(ep[0], endpointArgs); + } + }.bind(this); + + endpoint.typeId = typeId; + return endpoint; + }; + + this.setEndpoint = function(ep, doNotRepaint) { + var _ep = this.prepareEndpoint(ep); + this.setPreparedEndpoint(_ep, true); + }; + + this.setPreparedEndpoint = function (ep, doNotRepaint) { + if (this.endpoint != null) { + this.endpoint.cleanup(); + this.endpoint.destroy(); + } + this.endpoint = ep; + this.type = this.endpoint.type; + this.canvas = this.endpoint.canvas; + }; + + _jp.extend(this, params, typeParameters); + + this.isSource = params.isSource || false; + this.isTemporarySource = params.isTemporarySource || false; + this.isTarget = params.isTarget || false; + + this.connections = params.connections || []; + this.connectorPointerEvents = params["connector-pointer-events"]; + + this.scope = params.scope || _jsPlumb.getDefaultScope(); + this.timestamp = null; + this.reattachConnections = params.reattach || _jsPlumb.Defaults.ReattachConnections; + this.connectionsDetachable = _jsPlumb.Defaults.ConnectionsDetachable; + if (params.connectionsDetachable === false || params.detachable === false) + this.connectionsDetachable = false; + this.dragAllowedWhenFull = params.dragAllowedWhenFull !== false; + + if (params.onMaxConnections) + this.bind("maxConnections", params.onMaxConnections); + + // + // add a connection. not part of public API. + // + this.addConnection = function (connection) { + this.connections.push(connection); + this[(this.connections.length > 0 ? "add" : "remove") + "Class"](_jsPlumb.endpointConnectedClass); + this[(this.isFull() ? "add" : "remove") + "Class"](_jsPlumb.endpointFullClass); + }; + + this.detachFromConnection = function (connection, idx, doNotCleanup) { + //idx = idx == null ? findConnectionIndex(connection, this) : idx; + idx = idx == null ? this.connections.indexOf(connection) : idx; + if (idx >= 0) { + this.connections.splice(idx, 1); + this[(this.connections.length > 0 ? "add" : "remove") + "Class"](_jsPlumb.endpointConnectedClass); + this[(this.isFull() ? "add" : "remove") + "Class"](_jsPlumb.endpointFullClass); + } + + if (!doNotCleanup && this._deleteOnDetach && this.connections.length === 0) { + _jsPlumb.deleteObject({ + endpoint: this, + fireEvent: false, + deleteAttachedObjects: false + }); + } + }; + + this.detach = function (connection, ignoreTarget, forceDetach, fireEvent, originalEvent, endpointBeingDeleted, connectionIndex) { + + var idx = connectionIndex == null ? this.connections.indexOf(connection) : connectionIndex, + actuallyDetached = false; + fireEvent = (fireEvent !== false); + + if (idx >= 0) { + + if (forceDetach || connection._forceDetach || (connection.isDetachable() && connection.isDetachAllowed(connection) && this.isDetachAllowed(connection) && _jsPlumb.checkCondition("beforeDetach", connection, endpointBeingDeleted) )) { + + _jsPlumb.deleteObject({ + connection: connection, + fireEvent: (!ignoreTarget && fireEvent), + originalEvent: originalEvent, + deleteAttachedObjects: false/**/ + }); + actuallyDetached = true; + } + } + return actuallyDetached; + }; + + this.detachAll = function (fireEvent, forceDetach) { + var unaffectedConns = []; + while (this.connections.length > 0) { + // TODO this could pass the index in to the detach method to save some time (index will always be zero in this while loop) + var actuallyDetached = this.detach(this.connections[0], false, forceDetach === true, fireEvent !== false, null, this, 0); + if (!actuallyDetached) { + unaffectedConns.push(this.connections[0]); + this.connections.splice(0, 1); + } + } + this.connections = unaffectedConns; + return this; + }; + this.detachFrom = function (targetEndpoint, fireEvent, originalEvent) { + var c = []; + for (var i = 0; i < this.connections.length; i++) { + if (this.connections[i].endpoints[1] == targetEndpoint || this.connections[i].endpoints[0] == targetEndpoint) { + c.push(this.connections[i]); + } + } + for (var j = 0; j < c.length; j++) { + this.detach(c[j], false, true, fireEvent, originalEvent); + } + return this; + }; + + this.getElement = function () { + return this.element; + }; + + this.setElement = function (el) { + var parentId = this._jsPlumb.instance.getId(el), + curId = this.elementId; + // remove the endpoint from the list for the current endpoint's element + _ju.removeWithFunction(params.endpointsByElement[this.elementId], function (e) { + return e.id == this.id; + }.bind(this)); + this.element = jsPlumb.getElement(el); + this.elementId = _jsPlumb.getId(this.element); + _jsPlumb.anchorManager.rehomeEndpoint(this, curId, this.element); + _jsPlumb.dragManager.endpointAdded(this.element); + _ju.addToList(params.endpointsByElement, parentId, this); + return this; + }; + + /** + * private but must be exposed. + */ + this.makeInPlaceCopy = function () { + var loc = this.anchor.getCurrentLocation({element: this}), + o = this.anchor.getOrientation(this), + acc = this.anchor.getCssClass(), + inPlaceAnchor = { + bind: function () { + }, + compute: function () { + return [ loc[0], loc[1] ]; + }, + getCurrentLocation: function () { + return [ loc[0], loc[1] ]; + }, + getOrientation: function () { + return o; + }, + getCssClass: function () { + return acc; + } + }; + + return _newEndpoint({ + dropOptions: params.dropOptions, + anchor: inPlaceAnchor, + source: this.element, + paintStyle: this.getPaintStyle(), + endpoint: params.hideOnDrag ? "Blank" : this.endpoint, + _transient: true, + scope: this.scope, + reference:this + }); + }; + + /** + * returns a connection from the pool; used when dragging starts. just gets the head of the array if it can. + */ + this.connectorSelector = function () { + var candidate = this.connections[0]; + // SP target source refactor + if (/*this.isTarget && */candidate) return candidate; + else { + return (this.connections.length < this._jsPlumb.maxConnections) || this._jsPlumb.maxConnections == -1 ? null : candidate; + } + }; + + this.setStyle = this.setPaintStyle; + + this.paint = function (params) { + params = params || {}; + var timestamp = params.timestamp, recalc = !(params.recalc === false); + if (!timestamp || this.timestamp !== timestamp) { + + var info = _jsPlumb.updateOffset({ elId: this.elementId, timestamp: timestamp }); + + var xy = params.offset ? params.offset.o : info.o; + if (xy != null) { + var ap = params.anchorPoint, connectorPaintStyle = params.connectorPaintStyle; + if (ap == null) { + var wh = params.dimensions || info.s, + anchorParams = { xy: [ xy.left, xy.top ], wh: wh, element: this, timestamp: timestamp }; + if (recalc && this.anchor.isDynamic && this.connections.length > 0) { + var c = findConnectionToUseForDynamicAnchor(this, params.elementWithPrecedence), + oIdx = c.endpoints[0] == this ? 1 : 0, + oId = oIdx === 0 ? c.sourceId : c.targetId, + oInfo = _jsPlumb.getCachedData(oId), + oOffset = oInfo.o, oWH = oInfo.s; + anchorParams.txy = [ oOffset.left, oOffset.top ]; + anchorParams.twh = oWH; + anchorParams.tElement = c.endpoints[oIdx]; + } + ap = this.anchor.compute(anchorParams); + } + + this.endpoint.compute(ap, this.anchor.getOrientation(this), this._jsPlumb.paintStyleInUse, connectorPaintStyle || this.paintStyleInUse); + this.endpoint.paint(this._jsPlumb.paintStyleInUse, this.anchor); + this.timestamp = timestamp; + + // paint overlays + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays.hasOwnProperty(i)) { + var o = this._jsPlumb.overlays[i]; + if (o.isVisible()) { + this._jsPlumb.overlayPlacements[i] = o.draw(this.endpoint, this._jsPlumb.paintStyleInUse); + o.paint(this._jsPlumb.overlayPlacements[i]); + } + } + } + } + } + }; + + this.getTypeDescriptor = function () { + return "endpoint"; + }; + this.isVisible = function () { + return this._jsPlumb.visible; + }; + + this.repaint = this.paint; + + var draggingInitialised = false; + this.initDraggable = function () { + + // is this a connection source? we make it draggable and have the + // drag listener maintain a connection with a floating endpoint. + if (!draggingInitialised && _jp.isDragSupported(this.element)) { + var placeholderInfo = { id: null, element: null }, + jpc = null, + existingJpc = false, + existingJpcParams = null, + _dragHandler = _makeConnectionDragHandler(this, placeholderInfo, _jsPlumb), + dragOptions = params.dragOptions || {}, + defaultOpts = {}, + startEvent = _jp.dragEvents.start, + stopEvent = _jp.dragEvents.stop, + dragEvent = _jp.dragEvents.drag, + beforeStartEvent = _jp.dragEvents.beforeStart, + payload; + + // respond to beforeStart from katavorio; this will have, optionally, a payload of attribute values + // that were placed there by the makeSource mousedown listener. + var beforeStart = function(beforeStartParams) { + payload = beforeStartParams.e.payload || {}; + }; + + var start = function (startParams) { + +// ------------- first, get a connection to drag. this may be null, in which case we are dragging a new one. + + jpc = this.connectorSelector(); + +// -------------------------------- now a bunch of tests about whether or not to proceed ------------------------- + + var _continue = true; + // if not enabled, return + if (!this.isEnabled()) _continue = false; + // if no connection and we're not a source - or temporarily a source, as is the case with makeSource - return. + if (jpc == null && !this.isSource && !this.isTemporarySource) _continue = false; + // otherwise if we're full and not allowed to drag, also return false. + if (this.isSource && this.isFull() && !(jpc != null && this.dragAllowedWhenFull)) _continue = false; + // if the connection was setup as not detachable or one of its endpoints + // was setup as connectionsDetachable = false, or Defaults.ConnectionsDetachable + // is set to false... + if (jpc != null && !jpc.isDetachable(this)) _continue = false; + + var beforeDrag = _jsPlumb.checkCondition(jpc == null ? "beforeDrag" : "beforeStartDetach", { + endpoint:this, + source:this.element, + sourceId:this.elementId, + connection:jpc + }); + if (beforeDrag === false) _continue = false; + // else we might have been given some data. we'll pass it in to a new connection as 'data'. + // here we also merge in the optional payload we were given on mousedown. + else if (typeof beforeDrag === "object") { + jsPlumb.extend(beforeDrag, payload || {}); + } + else + // or if no beforeDrag data, maybe use the payload on its own. + beforeDrag = payload || {}; + + if (_continue === false) { + // this is for mootools and yui. returning false from this causes jquery to stop drag. + // the events are wrapped in both mootools and yui anyway, but i don't think returning + // false from the start callback would stop a drag. + if (_jsPlumb.stopDrag) _jsPlumb.stopDrag(this.canvas); + _dragHandler.stopDrag(); + return false; + } + +// --------------------------------------------------------------------------------------------------------------------- + + // ok to proceed. + + // clear hover for all connections for this endpoint before continuing. + for (var i = 0; i < this.connections.length; i++) + this.connections[i].setHover(false); + + this.addClass("endpointDrag"); + _jsPlumb.setConnectionBeingDragged(true); + + // if we're not full but there was a connection, make it null. we'll create a new one. + if (jpc && !this.isFull() && this.isSource) jpc = null; + + _jsPlumb.updateOffset({ elId: this.elementId }); + +// ---------------- make the element we will drag around, and position it ----------------------------- + + var ipco = this._jsPlumb.instance.getOffset(this.canvas), + canvasElement = this.canvas, + ips = this._jsPlumb.instance.getSize(this.canvas); + + _makeDraggablePlaceholder(placeholderInfo, _jsPlumb, ipco, ips); + + // store the id of the dragging div and the source element. the drop function will pick these up. + _jsPlumb.setAttributes(this.canvas, { + "dragId": placeholderInfo.id, + "elId": this.elementId + }); + +// ------------------- create an endpoint that will be our floating endpoint ------------------------------------ + + var endpointToFloat = this.dragProxy || this.endpoint; + if (this.dragProxy == null && this.connectionType != null) { + var aae = this._jsPlumb.instance.deriveEndpointAndAnchorSpec(this.connectionType); + if (aae.endpoints[1]) endpointToFloat = aae.endpoints[1]; + } + var centerAnchor = this._jsPlumb.instance.makeAnchor("Center"); + centerAnchor.isFloating = true; + this._jsPlumb.floatingEndpoint = _makeFloatingEndpoint(this.getPaintStyle(), centerAnchor, endpointToFloat, this.canvas, placeholderInfo.element, _jsPlumb, _newEndpoint, this.scope); + var _savedAnchor = this._jsPlumb.floatingEndpoint.anchor; + + + if (jpc == null) { + + this.setHover(false, false); + // create a connection. one end is this endpoint, the other is a floating endpoint. + jpc = _newConnection({ + sourceEndpoint: this, + targetEndpoint: this._jsPlumb.floatingEndpoint, + source: this.element, // for makeSource with parent option. ensure source element is represented correctly. + target: placeholderInfo.element, + anchors: [ this.anchor, this._jsPlumb.floatingEndpoint.anchor ], + paintStyle: params.connectorStyle, // this can be null. Connection will use the default. + hoverPaintStyle: params.connectorHoverStyle, + connector: params.connector, // this can also be null. Connection will use the default. + overlays: params.connectorOverlays, + type: this.connectionType, + cssClass: this.connectorClass, + hoverClass: this.connectorHoverClass, + scope:params.scope, + data:beforeDrag + }); + jpc.pending = true; + jpc.addClass(_jsPlumb.draggingClass); + this._jsPlumb.floatingEndpoint.addClass(_jsPlumb.draggingClass); + this._jsPlumb.floatingEndpoint.anchor = _savedAnchor; + // fire an event that informs that a connection is being dragged + _jsPlumb.fire("connectionDrag", jpc); + + // register the new connection on the drag manager. This connection, at this point, is 'pending', + // and has as its target a temporary element (the 'placeholder'). If the connection subsequently + // becomes established, the anchor manager is informed that the target of the connection has + // changed. + + _jsPlumb.anchorManager.newConnection(jpc); + + } else { + existingJpc = true; + jpc.setHover(false); + // new anchor idx + var anchorIdx = jpc.endpoints[0].id == this.id ? 0 : 1; + this.detachFromConnection(jpc, null, true); // detach from the connection while dragging is occurring. but dont cleanup automatically. + + // store the original scope (issue 57) + var dragScope = _jsPlumb.getDragScope(canvasElement); + _jsPlumb.setAttribute(this.canvas, "originalScope", dragScope); + + // fire an event that informs that a connection is being dragged. we do this before + // replacing the original target with the floating element info. + _jsPlumb.fire("connectionDrag", jpc); + + // now we replace ourselves with the temporary div we created above: + if (anchorIdx === 0) { + existingJpcParams = [ jpc.source, jpc.sourceId, canvasElement, dragScope ]; + jpc.source = placeholderInfo.element; + jpc.sourceId = placeholderInfo.id; + + _jsPlumb.anchorManager.sourceChanged(jpc.endpoints[anchorIdx].elementId, jpc.sourceId, jpc); + + } else { + existingJpcParams = [ jpc.target, jpc.targetId, canvasElement, dragScope ]; + jpc.target = placeholderInfo.element; + jpc.targetId = placeholderInfo.id; + + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.endpoints[anchorIdx].elementId, jpc.targetId, jpc); + } + + // lock the other endpoint; if it is dynamic it will not move while the drag is occurring. + // TODO SP i commented this out as part of the rewirte; i think now we want the other endpoint + // to behave naturally. + // SJP + //jpc.endpoints[anchorIdx === 0 ? 1 : 0].anchor.locked = true; + + + // store the original endpoint and assign the new floating endpoint for the drag. + jpc.suspendedEndpoint = jpc.endpoints[anchorIdx]; + + // PROVIDE THE SUSPENDED ELEMENT, BE IT A SOURCE OR TARGET (ISSUE 39) + jpc.suspendedElement = jpc.endpoints[anchorIdx].getElement(); + jpc.suspendedElementId = jpc.endpoints[anchorIdx].elementId; + jpc.suspendedElementType = anchorIdx === 0 ? "source" : "target"; + + jpc.suspendedEndpoint.setHover(false); + this._jsPlumb.floatingEndpoint.referenceEndpoint = jpc.suspendedEndpoint; + jpc.endpoints[anchorIdx] = this._jsPlumb.floatingEndpoint; + + jpc.addClass(_jsPlumb.draggingClass); + this._jsPlumb.floatingEndpoint.addClass(_jsPlumb.draggingClass); + } + + // register it and register connection on it. + _jsPlumb.floatingConnections[placeholderInfo.id] = jpc; + // only register for the target endpoint; we will not be dragging the source at any time + // before this connection is either discarded or made into a permanent connection. + _ju.addToList(params.endpointsByElement, placeholderInfo.id, this._jsPlumb.floatingEndpoint); + // tell jsplumb about it + _jsPlumb.currentlyDragging = true; + }.bind(this); + + var stop = function () { + _jsPlumb.setConnectionBeingDragged(false); + + if (jpc && jpc.endpoints != null) { + // get the actual drop event (decode from library args to stop function) + var originalEvent = _jsPlumb.getDropEvent(arguments); + // unlock the other endpoint (if it is dynamic, it would have been locked at drag start) + var idx = _jsPlumb.getFloatingAnchorIndex(jpc); + jpc.endpoints[idx === 0 ? 1 : 0].anchor.locked = false; + // TODO: Dont want to know about css classes inside jsplumb, ideally. + jpc.removeClass(_jsPlumb.draggingClass); + + // if we have the floating endpoint then the connection has not been dropped + // on another endpoint. If it is a new connection we throw it away. If it is an + // existing connection we check to see if we should reattach it, throwing it away + // if not. + if (this._jsPlumb && (jpc.deleteConnectionNow || jpc.endpoints[idx] == this._jsPlumb.floatingEndpoint)) { + // 6a. if the connection was an existing one... + if (existingJpc && jpc.suspendedEndpoint) { + // fix for issue35, thanks Sylvain Gizard: when firing the detach event make sure the + // floating endpoint has been replaced. + if (idx === 0) { + jpc.floatingElement = jpc.source; + jpc.floatingId = jpc.sourceId; + jpc.floatingEndpoint = jpc.endpoints[0]; + jpc.floatingIndex = 0; + jpc.source = existingJpcParams[0]; + jpc.sourceId = existingJpcParams[1]; + } else { + // keep a copy of the floating element; the anchor manager will want to clean up. + jpc.floatingElement = jpc.target; + jpc.floatingId = jpc.targetId; + jpc.floatingEndpoint = jpc.endpoints[1]; + jpc.floatingIndex = 1; + jpc.target = existingJpcParams[0]; + jpc.targetId = existingJpcParams[1]; + } + + var fe = this._jsPlumb.floatingEndpoint; // store for later removal. + // restore the original scope (issue 57) + _jsPlumb.setDragScope(existingJpcParams[2], existingJpcParams[3]); + jpc.endpoints[idx] = jpc.suspendedEndpoint; + // IF the connection should be reattached, or the other endpoint refuses detach, then + // reset the connection to its original state + if (jpc.isReattach() || jpc._forceReattach || jpc._forceDetach || !jpc.endpoints[idx === 0 ? 1 : 0].detach(jpc, false, false, true, originalEvent, true)) { + jpc.setHover(false); + jpc._forceDetach = null; + jpc._forceReattach = null; + this._jsPlumb.floatingEndpoint.detachFromConnection(jpc); + jpc.suspendedEndpoint.addConnection(jpc); + + // TODO this code is duplicated in lots of places...and there is nothing external + // in the code; it all refers to the connection itself. we could add a + // `checkSanity(connection)` method to anchorManager that did this. + if (idx == 1) { + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.floatingId, jpc.targetId, jpc); + } + else { + _jsPlumb.anchorManager.sourceChanged(jpc.floatingId, jpc.sourceId, jpc); + } + + _jsPlumb.repaint(existingJpcParams[1]); + } + else { + _jsPlumb.deleteObject({endpoint: fe}); + } + } + } + + // makeTargets sets this flag, to tell us we have been replaced and should delete this object. + if (this.deleteAfterDragStop) { + _jsPlumb.deleteObject({endpoint: this}); + } + else { + if (this._jsPlumb) { + this.paint({recalc: false}); + } + } + + // although the connection is no longer valid, there are use cases where this is useful. + _jsPlumb.fire("connectionDragStop", jpc, originalEvent); + // fire this event to give people more fine-grained control (connectionDragStop fires a lot) + if (jpc.pending) { + _jsPlumb.fire("connectionAborted", jpc, originalEvent); + } + // tell jsplumb that dragging is finished. + _jsPlumb.currentlyDragging = false; + jpc = null; + } + + // if no endpoints, jpc already cleaned up. but still we want to ensure we're reset properly. + // remove the element associated with the floating endpoint + // (and its associated floating endpoint and visual artefacts) + if (placeholderInfo && placeholderInfo.element) { + _jsPlumb.remove(placeholderInfo.element, false, false); + } + // remove the inplace copy + if (inPlaceCopy) { + _jsPlumb.deleteObject({endpoint: inPlaceCopy}); + } + + if (this._jsPlumb) { + // make our canvas visible (TODO: hand off to library; we should not know about DOM) + this.canvas.style.visibility = "visible"; + // unlock our anchor + this.anchor.locked = false; + // clear floating anchor. + this._jsPlumb.floatingEndpoint = null; + } + + }.bind(this); + + dragOptions = _jp.extend(defaultOpts, dragOptions); + dragOptions.scope = this.scope || dragOptions.scope; + dragOptions[beforeStartEvent] = _ju.wrap(dragOptions[beforeStartEvent], beforeStart, false); + dragOptions[startEvent] = _ju.wrap(dragOptions[startEvent], start, false); + // extracted drag handler function so can be used by makeSource + dragOptions[dragEvent] = _ju.wrap(dragOptions[dragEvent], _dragHandler.drag); + dragOptions[stopEvent] = _ju.wrap(dragOptions[stopEvent], stop); + dragOptions.multipleDrop = false; + + dragOptions.canDrag = function () { + return this.isSource || this.isTemporarySource || /*(this.isTarget && */this.connections.length > 0/*)*/; + }.bind(this); + + _jsPlumb.initDraggable(this.canvas, dragOptions, "internal"); + + this.canvas._jsPlumbRelatedElement = this.element; + + draggingInitialised = true; + } + }; + + var ep = params.endpoint || this._jsPlumb.instance.Defaults.Endpoint || _jp.Defaults.Endpoint; + this.setEndpoint(ep, true); + var anchorParamsToUse = params.anchor ? params.anchor : params.anchors ? params.anchors : (_jsPlumb.Defaults.Anchor || "Top"); + this.setAnchor(anchorParamsToUse, true); + + // finally, set type if it was provided + var type = [ "default", (params.type || "")].join(" "); + this.addType(type, params.data, true); + this.canvas = this.endpoint.canvas; + this.canvas._jsPlumb = this; + + this.initDraggable(); + + // pulled this out into a function so we can reuse it for the inPlaceCopy canvas; you can now drop detached connections + // back onto the endpoint you detached it from. + var _initDropTarget = function (canvas, isTransient, endpoint, referenceEndpoint) { + + if (_jp.isDropSupported(this.element)) { + var dropOptions = params.dropOptions || _jsPlumb.Defaults.DropOptions || _jp.Defaults.DropOptions; + dropOptions = _jp.extend({}, dropOptions); + dropOptions.scope = dropOptions.scope || this.scope; + var dropEvent = _jp.dragEvents.drop, + overEvent = _jp.dragEvents.over, + outEvent = _jp.dragEvents.out, + _ep = this, + drop = _jsPlumb.EndpointDropHandler({ + getEndpoint: function () { + return _ep; + }, + jsPlumb: _jsPlumb, + enabled: function () { + return endpoint != null ? endpoint.isEnabled() : true; + }, + isFull: function () { + return endpoint.isFull(); + }, + element: this.element, + elementId: this.elementId, + isSource: this.isSource, + isTarget: this.isTarget, + addClass: function (clazz) { + _ep.addClass(clazz); + }, + removeClass: function (clazz) { + _ep.removeClass(clazz); + }, + isDropAllowed: function () { + return _ep.isDropAllowed.apply(_ep, arguments); + }, + reference:referenceEndpoint, + isRedrop:function(jpc, dhParams) { + return jpc.suspendedEndpoint && dhParams.reference && (jpc.suspendedEndpoint.id === dhParams.reference.id); + } + }); + + dropOptions[dropEvent] = _ju.wrap(dropOptions[dropEvent], drop, true); + dropOptions[overEvent] = _ju.wrap(dropOptions[overEvent], function () { + var draggable = _jp.getDragObject(arguments), + id = _jsPlumb.getAttribute(_jp.getElement(draggable), "dragId"), + _jpc = _jsPlumb.floatingConnections[id]; + + if (_jpc != null) { + var idx = _jsPlumb.getFloatingAnchorIndex(_jpc); + // here we should fire the 'over' event if we are a target and this is a new connection, + // or we are the same as the floating endpoint. + var _cont = (this.isTarget && idx !== 0) || (_jpc.suspendedEndpoint && this.referenceEndpoint && this.referenceEndpoint.id == _jpc.suspendedEndpoint.id); + if (_cont) { + var bb = _jsPlumb.checkCondition("checkDropAllowed", { + sourceEndpoint: _jpc.endpoints[idx], + targetEndpoint: this, + connection: _jpc + }); + this[(bb ? "add" : "remove") + "Class"](_jsPlumb.endpointDropAllowedClass); + this[(bb ? "remove" : "add") + "Class"](_jsPlumb.endpointDropForbiddenClass); + _jpc.endpoints[idx].anchor.over(this.anchor, this); + } + } + }.bind(this)); + + dropOptions[outEvent] = _ju.wrap(dropOptions[outEvent], function () { + var draggable = _jp.getDragObject(arguments), + id = draggable == null ? null : _jsPlumb.getAttribute(_jp.getElement(draggable), "dragId"), + _jpc = id ? _jsPlumb.floatingConnections[id] : null; + + if (_jpc != null) { + var idx = _jsPlumb.getFloatingAnchorIndex(_jpc); + var _cont = (this.isTarget && idx !== 0) || (_jpc.suspendedEndpoint && this.referenceEndpoint && this.referenceEndpoint.id == _jpc.suspendedEndpoint.id); + if (_cont) { + this.removeClass(_jsPlumb.endpointDropAllowedClass); + this.removeClass(_jsPlumb.endpointDropForbiddenClass); + _jpc.endpoints[idx].anchor.out(); + } + } + }.bind(this)); + + _jsPlumb.initDroppable(canvas, dropOptions, "internal", isTransient); + } + }.bind(this); + + // Initialise the endpoint's canvas as a drop target. The drop handler will take care of the logic of whether + // something can actually be dropped. + if (!this.anchor.isFloating) + _initDropTarget(this.canvas, !(params._transient || this.anchor.isFloating), this, params.reference); + + + return this; + }; + + _ju.extend(_jp.Endpoint, _jp.OverlayCapableJsPlumbUIComponent, { + + setVisible: function (v, doNotChangeConnections, doNotNotifyOtherEndpoint) { + this._jsPlumb.visible = v; + if (this.canvas) this.canvas.style.display = v ? "block" : "none"; + this[v ? "showOverlays" : "hideOverlays"](); + if (!doNotChangeConnections) { + for (var i = 0; i < this.connections.length; i++) { + this.connections[i].setVisible(v); + if (!doNotNotifyOtherEndpoint) { + var oIdx = this === this.connections[i].endpoints[0] ? 1 : 0; + // only change the other endpoint if this is its only connection. + if (this.connections[i].endpoints[oIdx].connections.length == 1) this.connections[i].endpoints[oIdx].setVisible(v, true, true); + } + } + } + }, + getAttachedElements: function () { + return this.connections; + }, + applyType: function (t, doNotRepaint) { + this.setPaintStyle(t.endpointStyle || t.paintStyle, doNotRepaint); + this.setHoverPaintStyle(t.endpointHoverStyle || t.hoverPaintStyle, doNotRepaint); + if (t.maxConnections != null) this._jsPlumb.maxConnections = t.maxConnections; + if (t.scope) this.scope = t.scope; + _jp.extend(this, t, typeParameters); + if (t.cssClass != null && this.canvas) this._jsPlumb.instance.addClass(this.canvas, t.cssClass); + _jp.OverlayCapableJsPlumbUIComponent.applyType(this, t); + }, + isEnabled: function () { + return this._jsPlumb.enabled; + }, + setEnabled: function (e) { + this._jsPlumb.enabled = e; + }, + cleanup: function () { + var anchorClass = this._jsPlumb.instance.endpointAnchorClassPrefix + (this._jsPlumb.currentAnchorClass ? "-" + this._jsPlumb.currentAnchorClass : ""); + jsPlumb.removeClass(this.element, anchorClass); + this.anchor = null; + this.endpoint.cleanup(true); + this.endpoint.destroy(); + this.endpoint = null; + // drag/drop + this._jsPlumb.instance.destroyDraggable(this.canvas, "internal"); + this._jsPlumb.instance.destroyDroppable(this.canvas, "internal"); + }, + setHover: function (h) { + if (this.endpoint && this._jsPlumb && !this._jsPlumb.instance.isConnectionBeingDragged()) + this.endpoint.setHover(h); + }, + isFull: function () { + return this._jsPlumb.maxConnections === 0 ? true : !(this.isFloating() || this._jsPlumb.maxConnections < 0 || this.connections.length < this._jsPlumb.maxConnections); + }, + /** + * private but needs to be exposed. + */ + isFloating: function () { + return this.anchor != null && this.anchor.isFloating; + }, + isConnectedTo: function (endpoint) { + var found = false; + if (endpoint) { + for (var i = 0; i < this.connections.length; i++) { + if (this.connections[i].endpoints[1] == endpoint || this.connections[i].endpoints[0] == endpoint) { + found = true; + break; + } + } + } + return found; + }, + getConnectionCost: function () { + return this._jsPlumb.connectionCost; + }, + setConnectionCost: function (c) { + this._jsPlumb.connectionCost = c; + }, + areConnectionsDirected: function () { + return this._jsPlumb.connectionsDirected; + }, + setConnectionsDirected: function (b) { + this._jsPlumb.connectionsDirected = b; + }, + setElementId: function (_elId) { + this.elementId = _elId; + this.anchor.elementId = _elId; + }, + setReferenceElement: function (_el) { + this.element = _jp.getElement(_el); + }, + setDragAllowedWhenFull: function (allowed) { + this.dragAllowedWhenFull = allowed; + }, + equals: function (endpoint) { + return this.anchor.equals(endpoint.anchor); + }, + getUuid: function () { + return this._jsPlumb.uuid; + }, + computeAnchor: function (params) { + return this.anchor.compute(params); + } + }); + + root.jsPlumbInstance.prototype.EndpointDropHandler = function (dhParams) { + return function (e) { + + var _jsPlumb = dhParams.jsPlumb; + + // remove the classes that are added dynamically. drop is neither forbidden nor allowed now that + // the drop is finishing. + dhParams.removeClass(_jsPlumb.endpointDropAllowedClass); + dhParams.removeClass(_jsPlumb.endpointDropForbiddenClass); + + var originalEvent = _jsPlumb.getDropEvent(arguments), + draggable = _jsPlumb.getDragObject(arguments), + id = _jsPlumb.getAttribute(draggable, "dragId"), + elId = _jsPlumb.getAttribute(draggable, "elId"), + scope = _jsPlumb.getAttribute(draggable, "originalScope"), + jpc = _jsPlumb.floatingConnections[id]; + + // if no active connection, bail. + if (jpc == null) return; + + // calculate if this is an existing connection. + var existingConnection = jpc.suspendedEndpoint != null; + + // if suspended endpoint exists but has been cleaned up, bail. This means it's an existing connection + // that has been detached and will shortly be discarded. + if (existingConnection && jpc.suspendedEndpoint._jsPlumb == null) return; + + // get the drop endpoint. for a normal connection this is just the one that would replace the currently + // floating endpoint. for a makeTarget this is a new endpoint that is created on drop. But we leave that to + // the handler to figure out. + var _ep = dhParams.getEndpoint(jpc); + + // If we're not given an endpoint to use, bail. + if (_ep == null) return; + + // if this is a drop back where the connection came from, mark it force reattach and + // return; the stop handler will reattach. without firing an event. + if (dhParams.isRedrop(jpc, dhParams)) { + jpc._forceReattach = true; + jpc.setHover(false); + if (dhParams.maybeCleanup) dhParams.maybeCleanup(_ep); + return; + } + + // ensure we dont bother trying to drop sources on non-source eps, and same for target. + var idx = _jsPlumb.getFloatingAnchorIndex(jpc); + if ((idx === 0 && !dhParams.isSource)|| (idx === 1 && !dhParams.isTarget)){ + if (dhParams.maybeCleanup) dhParams.maybeCleanup(_ep); + return; + } + + if (dhParams.onDrop) dhParams.onDrop(jpc); + + // restore the original scope if necessary (issue 57) + if (scope) _jsPlumb.setDragScope(draggable, scope); + + // if the target of the drop is full, fire an event (we abort below) + // makeTarget: keep. + var isFull = dhParams.isFull(e); + if (isFull) { + _ep.fire("maxConnections", { + endpoint: this, + connection: jpc, + maxConnections: _ep._jsPlumb.maxConnections + }, originalEvent); + } + // + // if endpoint enabled, not full, and matches the index of the floating endpoint... + if (!isFull && dhParams.enabled()) { + var _doContinue = true; + + // before testing for beforeDrop, reset the connection's source/target to be the actual DOM elements + // involved (that is, stash any temporary stuff used for dragging. but we need to keep it around in + // order that the anchor manager can clean things up properly). + if (idx === 0) { + jpc.floatingElement = jpc.source; + jpc.floatingId = jpc.sourceId; + jpc.floatingEndpoint = jpc.endpoints[0]; + jpc.floatingIndex = 0; + jpc.source = dhParams.element; + jpc.sourceId = dhParams.elementId; + } else { + jpc.floatingElement = jpc.target; + jpc.floatingId = jpc.targetId; + jpc.floatingEndpoint = jpc.endpoints[1]; + jpc.floatingIndex = 1; + jpc.target = dhParams.element; + jpc.targetId = dhParams.elementId; + } + + // if this is an existing connection and detach is not allowed we won't continue. The connection's + // endpoints have been reinstated; everything is back to how it was. + if (existingConnection && jpc.suspendedEndpoint.id != _ep.id) { + + if (!jpc.isDetachAllowed(jpc) || !jpc.endpoints[idx].isDetachAllowed(jpc) || !jpc.suspendedEndpoint.isDetachAllowed(jpc) || !_jsPlumb.checkCondition("beforeDetach", jpc)) + _doContinue = false; + } + +// ------------ wrap the execution path in a function so we can support asynchronous beforeDrop + + var continueFunction = function (optionalData) { + // remove this jpc from the current endpoint, which is a floating endpoint that we will + // subsequently discard. + jpc.endpoints[idx].detachFromConnection(jpc); + + // if there's a suspended endpoint, detach it from the connection. + if (jpc.suspendedEndpoint) jpc.suspendedEndpoint.detachFromConnection(jpc); + + jpc.endpoints[idx] = _ep; + _ep.addConnection(jpc); + + // copy our parameters in to the connection: + var params = _ep.getParameters(); + for (var aParam in params) + jpc.setParameter(aParam, params[aParam]); + + if (!existingConnection) { + // if not an existing connection and + if (params.draggable) + _jsPlumb.initDraggable(this.element, dragOptions, "internal", _jsPlumb); + } + else { + var suspendedElementId = jpc.suspendedEndpoint.elementId; + _jsPlumb.fireMoveEvent({ + index: idx, + originalSourceId: idx === 0 ? suspendedElementId : jpc.sourceId, + newSourceId: idx === 0 ? _ep.elementId : jpc.sourceId, + originalTargetId: idx == 1 ? suspendedElementId : jpc.targetId, + newTargetId: idx == 1 ? _ep.elementId : jpc.targetId, + originalSourceEndpoint: idx === 0 ? jpc.suspendedEndpoint : jpc.endpoints[0], + newSourceEndpoint: idx === 0 ? _ep : jpc.endpoints[0], + originalTargetEndpoint: idx == 1 ? jpc.suspendedEndpoint : jpc.endpoints[1], + newTargetEndpoint: idx == 1 ? _ep : jpc.endpoints[1], + connection: jpc + }, originalEvent); + } + + if (idx == 1) { + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.floatingId, jpc.targetId, jpc); + } + else { + _jsPlumb.anchorManager.sourceChanged(jpc.floatingId, jpc.sourceId, jpc); + } + + // when makeSource has uniqueEndpoint:true, we want to create connections with new endpoints + // that are subsequently deleted. So makeSource sets `finalEndpoint`, which is the Endpoint to + // which the connection should be attached. The `detachFromConnection` call below results in the + // temporary endpoint being cleaned up. + if (jpc.endpoints[0].finalEndpoint) { + var _toDelete = jpc.endpoints[0]; + _toDelete.detachFromConnection(jpc); + jpc.endpoints[0] = jpc.endpoints[0].finalEndpoint; + jpc.endpoints[0].addConnection(jpc); + } + + // if optionalData was given, merge it onto the connection's data. + if (jsPlumbUtil.isObject(optionalData)) { + jpc.mergeData(optionalData); + } + // finalise will inform the anchor manager and also add to + // connectionsByScope if necessary. + _jsPlumb.finaliseConnection(jpc, null, originalEvent, false); + jpc.setHover(false); + + }.bind(this); + + var dontContinueFunction = function () { + // otherwise just put it back on the endpoint it was on before the drag. + if (jpc.suspendedEndpoint) { + jpc.endpoints[idx] = jpc.suspendedEndpoint; + jpc.setHover(false); + jpc._forceDetach = true; + if (idx === 0) { + jpc.source = jpc.suspendedEndpoint.element; + jpc.sourceId = jpc.suspendedEndpoint.elementId; + } else { + jpc.target = jpc.suspendedEndpoint.element; + jpc.targetId = jpc.suspendedEndpoint.elementId; + } + jpc.suspendedEndpoint.addConnection(jpc); + + // TODO checkSanity + if (idx == 1) { + _jsPlumb.anchorManager.updateOtherEndpoint(jpc.sourceId, jpc.floatingId, jpc.targetId, jpc); + } + else { + _jsPlumb.anchorManager.sourceChanged(jpc.floatingId, jpc.sourceId, jpc); + } + + _jsPlumb.repaint(jpc.sourceId); + jpc._forceDetach = false; + } + }; + +// -------------------------------------- + // now check beforeDrop. this will be available only on Endpoints that are setup to + // have a beforeDrop condition (although, secretly, under the hood all Endpoints and + // the Connection have them, because they are on jsPlumbUIComponent. shhh!), because + // it only makes sense to have it on a target endpoint. + _doContinue = _doContinue && dhParams.isDropAllowed(jpc.sourceId, jpc.targetId, jpc.scope, jpc, _ep);// && jpc.pending; + + if (_doContinue) { + continueFunction(_doContinue); + return true; + } + else { + dontContinueFunction(); + } + } + + if (dhParams.maybeCleanup) dhParams.maybeCleanup(_ep); + + _jsPlumb.currentlyDragging = false; + }; + }; +}).call(this); + +/* + * jsPlumb + * + * Title:jsPlumb 2.1.0 + * + * Provides a way to visually connect elements on an HTML page, using SVG. + * + * This file contains the code for Connections. + * + * Copyright (c) 2010 - 2015 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * http://github.com/sporritt/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, + _jp = root.jsPlumb, + _ju = root.jsPlumbUtil; + + var makeConnector = function (_jsPlumb, renderMode, connectorName, connectorArgs, forComponent) { + if (!_jsPlumb.Defaults.DoNotThrowErrors && jsPlumb.Connectors[renderMode][connectorName] == null) + throw { msg: "jsPlumb: unknown connector type '" + connectorName + "'" }; + + return new _jp.Connectors[renderMode][connectorName](connectorArgs, forComponent); + }, + _makeAnchor = function (anchorParams, elementId, _jsPlumb) { + return (anchorParams) ? _jsPlumb.makeAnchor(anchorParams, elementId, _jsPlumb) : null; + }, + _updateConnectedClass = function (conn, element, _jsPlumb, remove) { + if (element != null) { + element._jsPlumbConnections = element._jsPlumbConnections || {}; + if (remove) + delete element._jsPlumbConnections[conn.id]; + else + element._jsPlumbConnections[conn.id] = true; + + if (_ju.isEmpty(element._jsPlumbConnections)) { + _jsPlumb.removeClass(element, _jsPlumb.connectedClass); + } + else + _jsPlumb.addClass(element, _jsPlumb.connectedClass); + } + }; + + _jp.Connection = function (params) { + var _newEndpoint = params.newEndpoint; + + this.id = params.id; + this.connector = null; + this.idPrefix = "_jsplumb_c_"; + this.defaultLabelLocation = 0.5; + this.defaultOverlayKeys = ["Overlays", "ConnectionOverlays"]; + // if a new connection is the result of moving some existing connection, params.previousConnection + // will have that Connection in it. listeners for the jsPlumbConnection event can look for that + // member and take action if they need to. + this.previousConnection = params.previousConnection; + this.source = _jp.getElement(params.source); + this.target = _jp.getElement(params.target); + // sourceEndpoint and targetEndpoint override source/target, if they are present. but + // source is not overridden if the Endpoint has declared it is not the final target of a connection; + // instead we use the source that the Endpoint declares will be the final source element. + if (params.sourceEndpoint) this.source = params.sourceEndpoint.getElement(); + if (params.targetEndpoint) this.target = params.targetEndpoint.getElement(); + + _jp.OverlayCapableJsPlumbUIComponent.apply(this, arguments); + + this.sourceId = this._jsPlumb.instance.getId(this.source); + this.targetId = this._jsPlumb.instance.getId(this.target); + this.scope = params.scope; // scope may have been passed in to the connect call. if it wasn't, we will pull it from the source endpoint, after having initialised the endpoints. + this.endpoints = []; + this.endpointStyles = []; + + var _jsPlumb = this._jsPlumb.instance; + + _jsPlumb.manage(this.sourceId, this.source); + _jsPlumb.manage(this.targetId, this.target); + + this._jsPlumb.visible = true; + this._jsPlumb.editable = params.editable === true; + this._jsPlumb.params = { + cssClass: params.cssClass, + container: params.container, + "pointer-events": params["pointer-events"], + editorParams: params.editorParams, + overlays: params.overlays + }; + this._jsPlumb.lastPaintedAt = null; + + // listen to mouseover and mouseout events passed from the container delegate. + this.bind("mouseover", function () { + this.setHover(true); + }.bind(this)); + this.bind("mouseout", function () { + this.setHover(false); + }.bind(this)); + + this.editableRequested = params.editable !== false; + this.setEditable = function(e) { + return this.connector ? this.connector.setEditable(e) : false; + }; + this.isEditable = function() { return this.connector ? this.connector.isEditable() : false; }; + this.isEditing = function() { return this.connector ? this.connector.isEditing() : false; }; + +// INITIALISATION CODE + + this.makeEndpoint = function (isSource, el, elId, ep) { + elId = elId || this._jsPlumb.instance.getId(el); + return this.prepareEndpoint(_jsPlumb, _newEndpoint, this, ep, isSource ? 0 : 1, params, el, elId); + }; + + // if type given, get the endpoint definitions mapping to that type from the jsplumb instance, and use those. + // we apply types at the end of this constructor but endpoints are only honoured in a type definition at + // create time. + if (params.type) { + params.endpoints = this._jsPlumb.instance.deriveEndpointAndAnchorSpec(params.type).endpoints; + } + + var eS = this.makeEndpoint(true, this.source, this.sourceId, params.sourceEndpoint), + eT = this.makeEndpoint(false, this.target, this.targetId, params.targetEndpoint); + + if (eS) _ju.addToList(params.endpointsByElement, this.sourceId, eS); + if (eT) _ju.addToList(params.endpointsByElement, this.targetId, eT); + // if scope not set, set it to be the scope for the source endpoint. + if (!this.scope) this.scope = this.endpoints[0].scope; + + // if explicitly told to (or not to) delete endpoints on detach, override endpoint's preferences + if (params.deleteEndpointsOnDetach != null) { + this.endpoints[0]._deleteOnDetach = params.deleteEndpointsOnDetach; + this.endpoints[1]._deleteOnDetach = params.deleteEndpointsOnDetach; + } + else { + // otherwise, unless the endpoints say otherwise, mark them for deletion. + if (!this.endpoints[0]._doNotDeleteOnDetach) this.endpoints[0]._deleteOnDetach = true; + if (!this.endpoints[1]._doNotDeleteOnDetach) this.endpoints[1]._deleteOnDetach = true; + } + +// -------------------------- DEFAULT TYPE --------------------------------------------- + + // DETACHABLE + var _detachable = _jsPlumb.Defaults.ConnectionsDetachable; + if (params.detachable === false) _detachable = false; + if (this.endpoints[0].connectionsDetachable === false) _detachable = false; + if (this.endpoints[1].connectionsDetachable === false) _detachable = false; + // REATTACH + var _reattach = params.reattach || this.endpoints[0].reattachConnections || this.endpoints[1].reattachConnections || _jsPlumb.Defaults.ReattachConnections; + + this.appendToDefaultType({ + detachable: _detachable, + reattach: _reattach, + paintStyle:this.endpoints[0].connectorStyle || this.endpoints[1].connectorStyle || params.paintStyle || _jsPlumb.Defaults.PaintStyle || jsPlumb.Defaults.PaintStyle, + hoverPaintStyle:this.endpoints[0].connectorHoverStyle || this.endpoints[1].connectorHoverStyle || params.hoverPaintStyle || _jsPlumb.Defaults.HoverPaintStyle || jsPlumb.Defaults.HoverPaintStyle + }); + + + var _suspendedAt = _jsPlumb.getSuspendedAt(); + if (!_jsPlumb.isSuspendDrawing()) { + // paint the endpoints + var myInfo = _jsPlumb.getCachedData(this.sourceId), + myOffset = myInfo.o, myWH = myInfo.s, + otherInfo = _jsPlumb.getCachedData(this.targetId), + otherOffset = otherInfo.o, + otherWH = otherInfo.s, + initialTimestamp = _suspendedAt || _jsPlumb.timestamp(), + anchorLoc = this.endpoints[0].anchor.compute({ + xy: [ myOffset.left, myOffset.top ], wh: myWH, element: this.endpoints[0], + elementId: this.endpoints[0].elementId, + txy: [ otherOffset.left, otherOffset.top ], twh: otherWH, tElement: this.endpoints[1], + timestamp: initialTimestamp + }); + + this.endpoints[0].paint({ anchorLoc: anchorLoc, timestamp: initialTimestamp }); + + anchorLoc = this.endpoints[1].anchor.compute({ + xy: [ otherOffset.left, otherOffset.top ], wh: otherWH, element: this.endpoints[1], + elementId: this.endpoints[1].elementId, + txy: [ myOffset.left, myOffset.top ], twh: myWH, tElement: this.endpoints[0], + timestamp: initialTimestamp + }); + this.endpoints[1].paint({ anchorLoc: anchorLoc, timestamp: initialTimestamp }); + } + + this.getTypeDescriptor = function () { + return "connection"; + }; + this.getAttachedElements = function () { + return this.endpoints; + }; + + this.isDetachable = function () { + return this._jsPlumb.detachable === true; + }; + this.setDetachable = function (detachable) { + this._jsPlumb.detachable = detachable === true; + }; + this.isReattach = function () { + return this._jsPlumb.reattach === true || this.endpoints[0].reattachConnections === true || this.endpoints[1].reattachConnections === true; + }; + this.setReattach = function (reattach) { + this._jsPlumb.reattach = reattach === true; + }; + +// END INITIALISATION CODE + + +// COST + DIRECTIONALITY + // if cost not supplied, try to inherit from source endpoint + this._jsPlumb.cost = params.cost || this.endpoints[0].getConnectionCost(); + this._jsPlumb.directed = params.directed; + // inherit directed flag if set no source endpoint + if (params.directed == null) this._jsPlumb.directed = this.endpoints[0].areConnectionsDirected(); +// END COST + DIRECTIONALITY + +// PARAMETERS + // merge all the parameters objects into the connection. parameters set + // on the connection take precedence; then source endpoint params, then + // finally target endpoint params. + var _p = jsPlumb.extend({}, this.endpoints[1].getParameters()); + _jp.extend(_p, this.endpoints[0].getParameters()); + _jp.extend(_p, this.getParameters()); + this.setParameters(_p); +// END PARAMETERS + +// PAINTING + + this.setConnector(this.endpoints[0].connector || this.endpoints[1].connector || params.connector || _jsPlumb.Defaults.Connector || _jp.Defaults.Connector, true); + if (params.geometry) { + this.connector.setGeometry(params.geometry); + } + var data = params.data == null || !jsPlumbUtil.isObject(params.data) ? {} : params.data; + this.getData = function() { return data; }; + this.setData = function(d) { data = d || {}; }; + this.mergeData = function(d) { data = jsPlumb.extend(data, d); }; + + // the very last thing we do is apply types, if there are any. + var _types = [ "default", this.endpoints[0].connectionType, this.endpoints[1].connectionType, params.type ].join(" "); + if (/[^\s]/.test(_types)) + this.addType(_types, params.data, true); + + this.updateConnectedClass(); + +// END PAINTING + }; + + _ju.extend(_jp.Connection, _jp.OverlayCapableJsPlumbUIComponent, { + applyType: function (t, doNotRepaint, typeMap) { + + // none of these things result in the creation of objects so can be ignored. + if (t.detachable != null) this.setDetachable(t.detachable); + if (t.reattach != null) this.setReattach(t.reattach); + if (t.scope) this.scope = t.scope; + + if (t.cssClass != null && this.canvas) this._jsPlumb.instance.addClass(this.canvas, t.cssClass); + + var _anchors = null; + // this also results in the creation of objects. + if (t.anchor) { + // note that even if the param was anchor, we store `anchors`. + _anchors = this.getCachedTypeItem("anchors", typeMap.anchor); + if (_anchors == null) { + _anchors = [ this._jsPlumb.instance.makeAnchor(t.anchor), this._jsPlumb.instance.makeAnchor(t.anchor) ]; + this.cacheTypeItem("anchors", _anchors, typeMap.anchor); + } + } + else if (t.anchors) { + _anchors = this.getCachedTypeItem("anchors", typeMap.anchors); + if (_anchors == null) { + _anchors = [ + this._jsPlumb.instance.makeAnchor(t.anchors[0]), + this._jsPlumb.instance.makeAnchor(t.anchors[1]) + ]; + this.cacheTypeItem("anchors", _anchors, typeMap.anchors); + } + } + if (_anchors != null) { + this.endpoints[0].anchor = _anchors[0]; + this.endpoints[1].anchor = _anchors[1]; + if (this.endpoints[1].anchor.isDynamic) this._jsPlumb.instance.repaint(this.endpoints[1].elementId); + } + + _jp.OverlayCapableJsPlumbUIComponent.applyType(this, t); + }, + addClass: function (c, informEndpoints) { + if (informEndpoints) { + this.endpoints[0].addClass(c); + this.endpoints[1].addClass(c); + if (this.suspendedEndpoint) this.suspendedEndpoint.addClass(c); + } + if (this.connector) { + this.connector.addClass(c); + } + }, + removeClass: function (c, informEndpoints) { + if (informEndpoints) { + this.endpoints[0].removeClass(c); + this.endpoints[1].removeClass(c); + if (this.suspendedEndpoint) this.suspendedEndpoint.removeClass(c); + } + if (this.connector) { + this.connector.removeClass(c); + } + }, + isVisible: function () { + return this._jsPlumb.visible; + }, + setVisible: function (v) { + this._jsPlumb.visible = v; + if (this.connector) + this.connector.setVisible(v); + this.repaint(); + }, + cleanup: function () { + this.updateConnectedClass(true); + this.endpoints = null; + this.source = null; + this.target = null; + if (this.connector != null) { + this.connector.cleanup(true); + this.connector.destroy(true); + } + this.connector = null; + }, + updateConnectedClass:function(remove) { + if (this._jsPlumb) { + _updateConnectedClass(this, this.source, this._jsPlumb.instance, remove); + _updateConnectedClass(this, this.target, this._jsPlumb.instance, remove); + } + }, + setHover: function (state) { + if (this.connector && this._jsPlumb && !this._jsPlumb.instance.isConnectionBeingDragged()) { + this.connector.setHover(state); + root.jsPlumb[state ? "addClass" : "removeClass"](this.source, this._jsPlumb.instance.hoverSourceClass); + root.jsPlumb[state ? "addClass" : "removeClass"](this.target, this._jsPlumb.instance.hoverTargetClass); + } + }, + getUuids:function() { + return [ this.endpoints[0].getUuid(), this.endpoints[1].getUuid() ]; + }, + getCost: function () { + return this._jsPlumb ? this._jsPlumb.cost : -Infinity; + }, + setCost: function (c) { + this._jsPlumb.cost = c; + }, + isDirected: function () { + return this._jsPlumb.directed === true; + }, + getConnector: function () { + return this.connector; + }, + getGeometry : function() { return this.connector ? this.connector.getGeometry() : null; }, + setGeometry : function(g) { if (this.connector) this.connector.setGeometry(g); }, + prepareConnector:function(connectorSpec, typeId) { + var connectorArgs = { + _jsPlumb: this._jsPlumb.instance, + cssClass: (this._jsPlumb.params.cssClass || "") + (this.isEditable() ? this._jsPlumb.instance.editableConnectorClass : ""), + container: this._jsPlumb.params.container, + "pointer-events": this._jsPlumb.params["pointer-events"], + editable:this.editableRequested + }, + renderMode = this._jsPlumb.instance.getRenderMode(), + connector; + + if (_ju.isString(connectorSpec)) + connector = makeConnector(this._jsPlumb.instance, renderMode, connectorSpec, connectorArgs, this); // lets you use a string as shorthand. + else if (_ju.isArray(connectorSpec)) { + if (connectorSpec.length == 1) + connector = makeConnector(this._jsPlumb.instance, renderMode, connectorSpec[0], connectorArgs, this); + else + connector = makeConnector(this._jsPlumb.instance, renderMode, connectorSpec[0], _ju.merge(connectorSpec[1], connectorArgs), this); + } + if (typeId != null) connector.typeId = typeId; + return connector; + }, + setPreparedConnector: function(connector, doNotRepaint, doNotChangeListenerComponent, typeId) { + + var previous, previousClasses = ""; + // the connector will not be cleaned up if it was set as part of a type, because `typeId` will be set on it + // and we havent passed in `true` for "force" here. + if (this.connector != null) { + previous = this.connector; + previousClasses = previous.getClass(); + this.connector.cleanup(); + this.connector.destroy(); + } + + this.connector = connector; + if (typeId) { + this.cacheTypeItem("connector", connector, typeId); + } + + this.canvas = this.connector.canvas; + this.bgCanvas = this.connector.bgCanvas; + + // put classes from prior connector onto the canvas + this.addClass(previousClasses); + + // new: instead of binding listeners per connector, we now just have one delegate on the container. + // so for that handler we set the connection as the '_jsPlumb' member of the canvas element, and + // bgCanvas, if it exists, which it does right now in the VML renderer, so it won't from v 2.0.0 onwards. + if (this.canvas) this.canvas._jsPlumb = this; + if (this.bgCanvas) this.bgCanvas._jsPlumb = this; + + if (previous != null) { + var o = this.getOverlays(); + for (var i = 0; i < o.length; i++) { + if (o[i].transfer) o[i].transfer(this.connector); + } + } + + if (!doNotChangeListenerComponent) this.setListenerComponent(this.connector); + if (!doNotRepaint) this.repaint(); + }, + setConnector: function (connectorSpec, doNotRepaint, doNotChangeListenerComponent, typeId) { + var connector = this.prepareConnector(connectorSpec, typeId); + this.setPreparedConnector(connector, doNotRepaint, doNotChangeListenerComponent, typeId); + }, + paint: function (params) { + + if (!this._jsPlumb.instance.isSuspendDrawing() && this._jsPlumb.visible) { + params = params || {}; + var timestamp = params.timestamp, + // if the moving object is not the source we must transpose the two references. + swap = false, + tId = swap ? this.sourceId : this.targetId, sId = swap ? this.targetId : this.sourceId, + tIdx = swap ? 0 : 1, sIdx = swap ? 1 : 0; + + if (timestamp == null || timestamp != this._jsPlumb.lastPaintedAt) { + var sourceInfo = this._jsPlumb.instance.updateOffset({elId:sId}).o, + targetInfo = this._jsPlumb.instance.updateOffset({elId:tId}).o, + sE = this.endpoints[sIdx], tE = this.endpoints[tIdx]; + + var sAnchorP = sE.anchor.getCurrentLocation({xy: [sourceInfo.left, sourceInfo.top], wh: [sourceInfo.width, sourceInfo.height], element: sE, timestamp: timestamp}), + tAnchorP = tE.anchor.getCurrentLocation({xy: [targetInfo.left, targetInfo.top], wh: [targetInfo.width, targetInfo.height], element: tE, timestamp: timestamp}); + + this.connector.resetBounds(); + + this.connector.compute({ + sourcePos: sAnchorP, + targetPos: tAnchorP, + sourceEndpoint: this.endpoints[sIdx], + targetEndpoint: this.endpoints[tIdx], + lineWidth: this._jsPlumb.paintStyleInUse.lineWidth, + sourceInfo: sourceInfo, + targetInfo: targetInfo + }); + + var overlayExtents = { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity }; + + // compute overlays. we do this first so we can get their placements, and adjust the + // container if needs be (if an overlay would be clipped) + for (var i in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays.hasOwnProperty(i)) { + var o = this._jsPlumb.overlays[i]; + if (o.isVisible()) { + this._jsPlumb.overlayPlacements[i] = o.draw(this.connector, this._jsPlumb.paintStyleInUse, this.getAbsoluteOverlayPosition(o)); + overlayExtents.minX = Math.min(overlayExtents.minX, this._jsPlumb.overlayPlacements[i].minX); + overlayExtents.maxX = Math.max(overlayExtents.maxX, this._jsPlumb.overlayPlacements[i].maxX); + overlayExtents.minY = Math.min(overlayExtents.minY, this._jsPlumb.overlayPlacements[i].minY); + overlayExtents.maxY = Math.max(overlayExtents.maxY, this._jsPlumb.overlayPlacements[i].maxY); + } + } + } + + var lineWidth = parseFloat(this._jsPlumb.paintStyleInUse.lineWidth || 1) / 2, + outlineWidth = parseFloat(this._jsPlumb.paintStyleInUse.lineWidth || 0), + extents = { + xmin: Math.min(this.connector.bounds.minX - (lineWidth + outlineWidth), overlayExtents.minX), + ymin: Math.min(this.connector.bounds.minY - (lineWidth + outlineWidth), overlayExtents.minY), + xmax: Math.max(this.connector.bounds.maxX + (lineWidth + outlineWidth), overlayExtents.maxX), + ymax: Math.max(this.connector.bounds.maxY + (lineWidth + outlineWidth), overlayExtents.maxY) + }; + // paint the connector. + this.connector.paint(this._jsPlumb.paintStyleInUse, null, extents); + // and then the overlays + for (var j in this._jsPlumb.overlays) { + if (this._jsPlumb.overlays.hasOwnProperty(j)) { + var p = this._jsPlumb.overlays[j]; + if (p.isVisible()) { + p.paint(this._jsPlumb.overlayPlacements[j], extents); + } + } + } + } + this._jsPlumb.lastPaintedAt = timestamp; + } + }, + repaint: function (params) { + params = params || {}; + this.paint({ elId: this.sourceId, recalc: !(params.recalc === false), timestamp: params.timestamp}); + }, + prepareEndpoint: function (_jsPlumb, _newEndpoint, conn, existing, index, params, element, elementId) { + var e; + if (existing) { + conn.endpoints[index] = existing; + existing.addConnection(conn); + } else { + if (!params.endpoints) params.endpoints = [ null, null ]; + var ep = params.endpoints[index] || params.endpoint || _jsPlumb.Defaults.Endpoints[index] || jsPlumb.Defaults.Endpoints[index] || _jsPlumb.Defaults.Endpoint || jsPlumb.Defaults.Endpoint; + if (!params.endpointStyles) params.endpointStyles = [ null, null ]; + if (!params.endpointHoverStyles) params.endpointHoverStyles = [ null, null ]; + var es = params.endpointStyles[index] || params.endpointStyle || _jsPlumb.Defaults.EndpointStyles[index] || jsPlumb.Defaults.EndpointStyles[index] || _jsPlumb.Defaults.EndpointStyle || jsPlumb.Defaults.EndpointStyle; + // Endpoints derive their fillStyle from the connector's strokeStyle, if no fillStyle was specified. + if (es.fillStyle == null && params.paintStyle != null) + es.fillStyle = params.paintStyle.strokeStyle; + + if (es.outlineColor == null && params.paintStyle != null) + es.outlineColor = params.paintStyle.outlineColor; + if (es.outlineWidth == null && params.paintStyle != null) + es.outlineWidth = params.paintStyle.outlineWidth; + + var ehs = params.endpointHoverStyles[index] || params.endpointHoverStyle || _jsPlumb.Defaults.EndpointHoverStyles[index] || jsPlumb.Defaults.EndpointHoverStyles[index] || _jsPlumb.Defaults.EndpointHoverStyle || jsPlumb.Defaults.EndpointHoverStyle; + // endpoint hover fill style is derived from connector's hover stroke style + if (params.hoverPaintStyle != null) { + if (ehs == null) ehs = {}; + if (ehs.fillStyle == null) { + ehs.fillStyle = params.hoverPaintStyle.strokeStyle; + } + } + var a = params.anchors ? params.anchors[index] : + params.anchor ? params.anchor : + _makeAnchor(_jsPlumb.Defaults.Anchors[index], elementId, _jsPlumb) || + _makeAnchor(_jp.Defaults.Anchors[index], elementId, _jsPlumb) || + _makeAnchor(_jsPlumb.Defaults.Anchor, elementId, _jsPlumb) || + _makeAnchor(_jp.Defaults.Anchor, elementId, _jsPlumb), + u = params.uuids ? params.uuids[index] : null; + + e = _newEndpoint({ + paintStyle: es, hoverPaintStyle: ehs, endpoint: ep, connections: [ conn ], + uuid: u, anchor: a, source: element, scope: params.scope, + reattach: params.reattach || _jsPlumb.Defaults.ReattachConnections, + detachable: params.detachable || _jsPlumb.Defaults.ConnectionsDetachable + }); + conn.endpoints[index] = e; + + if (params.drawEndpoints === false) e.setVisible(false, true, true); + + } + return e; + } + + }); // END Connection class +}).call(this); + +/* + * jsPlumb + * + * Title:jsPlumb 2.0.2 + * + * Provides a way to visually connect elements on an HTML page, using SVG. + * + * This file contains the code for creating and manipulating anchors. + * + * Copyright (c) 2010 - 2015 jsPlumb (hello@jsplumbtoolkit.com) + * + * http://jsplumbtoolkit.com + * http://github.com/sporritt/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + + var root = this, + _ju = root.jsPlumbUtil, + _jp = root.jsPlumb; + + // + // manages anchors for all elements. + // + _jp.AnchorManager = function (params) { + var _amEndpoints = {}, + continuousAnchorLocations = {}, + userDefinedContinuousAnchorLocations = {}, + continuousAnchorOrientations = {}, + Orientation = { HORIZONTAL: "horizontal", VERTICAL: "vertical", DIAGONAL: "diagonal", IDENTITY: "identity" }, + axes = ["left", "top", "right", "bottom"], + connectionsByElementId = {}, + self = this, + anchorLists = {}, + jsPlumbInstance = params.jsPlumbInstance, + floatingConnections = {}, + calculateOrientation = function (sourceId, targetId, sd, td, sourceAnchor, targetAnchor) { + + if (sourceId === targetId) return { + orientation: Orientation.IDENTITY, + a: ["top", "top"] + }; + + var theta = Math.atan2((td.centery - sd.centery), (td.centerx - sd.centerx)), + theta2 = Math.atan2((sd.centery - td.centery), (sd.centerx - td.centerx)); + +// -------------------------------------------------------------------------------------- + + // improved face calculation. get midpoints of each face for source and target, then put in an array with all combinations of + // source/target faces. sort this array by distance between midpoints. the entry at index 0 is our preferred option. we can + // go through the array one by one until we find an entry in which each requested face is supported. + var candidates = [], midpoints = { }; + (function (types, dim) { + for (var i = 0; i < types.length; i++) { + midpoints[types[i]] = { + "left": [ dim[i].left, dim[i].centery ], + "right": [ dim[i].right, dim[i].centery ], + "top": [ dim[i].centerx, dim[i].top ], + "bottom": [ dim[i].centerx , dim[i].bottom] + }; + } + })([ "source", "target" ], [ sd, td ]); + + for (var sf = 0; sf < axes.length; sf++) { + for (var tf = 0; tf < axes.length; tf++) { + candidates.push({ + source: axes[sf], + target: axes[tf], + dist: Biltong.lineLength(midpoints.source[axes[sf]], midpoints.target[axes[tf]]) + }); + } + } + + candidates.sort(function (a, b) { + return a.dist < b.dist ? -1 : a.dist > b.dist ? 1 : 0; + }); + + // now go through this list and try to get an entry that satisfies both (there will be one, unless one of the anchors + // declares no available faces) + var sourceEdge = candidates[0].source, targetEdge = candidates[0].target; + for (var i = 0; i < candidates.length; i++) { + + if (!sourceAnchor.isContinuous || sourceAnchor.isEdgeSupported(candidates[i].source)) + sourceEdge = candidates[i].source; + else + sourceEdge = null; + + if (!targetAnchor.isContinuous || targetAnchor.isEdgeSupported(candidates[i].target)) + targetEdge = candidates[i].target; + else { + targetEdge = null; + } + + if (sourceEdge != null && targetEdge != null) break; + } + +// -------------------------------------------------------------------------------------- + + return { + a: [ sourceEdge, targetEdge ], + theta: theta, + theta2: theta2 + }; + }, + // used by placeAnchors function + placeAnchorsOnLine = function (desc, elementDimensions, elementPosition, connections, horizontal, otherMultiplier, reverse) { + var a = [], step = elementDimensions[horizontal ? 0 : 1] / (connections.length + 1); + + for (var i = 0; i < connections.length; i++) { + var val = (i + 1) * step, other = otherMultiplier * elementDimensions[horizontal ? 1 : 0]; + if (reverse) + val = elementDimensions[horizontal ? 0 : 1] - val; + + var dx = (horizontal ? val : other), x = elementPosition[0] + dx, xp = dx / elementDimensions[0], + dy = (horizontal ? other : val), y = elementPosition[1] + dy, yp = dy / elementDimensions[1]; + + a.push([ x, y, xp, yp, connections[i][1], connections[i][2] ]); + } + + return a; + }, + // used by edgeSortFunctions + currySort = function (reverseAngles) { + return function (a, b) { + var r = true; + if (reverseAngles) { + r = a[0][0] < b[0][0]; + } + else { + r = a[0][0] > b[0][0]; + } + return r === false ? -1 : 1; + }; + }, + // used by edgeSortFunctions + leftSort = function (a, b) { + // first get adjusted values + var p1 = a[0][0] < 0 ? -Math.PI - a[0][0] : Math.PI - a[0][0], + p2 = b[0][0] < 0 ? -Math.PI - b[0][0] : Math.PI - b[0][0]; + if (p1 > p2) return 1; + else return a[0][1] > b[0][1] ? 1 : -1; + }, + // used by placeAnchors + edgeSortFunctions = { + "top": function (a, b) { + return a[0] > b[0] ? 1 : -1; + }, + "right": currySort(true), + "bottom": currySort(true), + "left": leftSort + }, + // used by placeAnchors + _sortHelper = function (_array, _fn) { + return _array.sort(_fn); + }, + // used by AnchorManager.redraw + placeAnchors = function (elementId, _anchorLists) { + var cd = jsPlumbInstance.getCachedData(elementId), sS = cd.s, sO = cd.o, + placeSomeAnchors = function (desc, elementDimensions, elementPosition, unsortedConnections, isHorizontal, otherMultiplier, orientation) { + if (unsortedConnections.length > 0) { + var sc = _sortHelper(unsortedConnections, edgeSortFunctions[desc]), // puts them in order based on the target element's pos on screen + reverse = desc === "right" || desc === "top", + anchors = placeAnchorsOnLine(desc, elementDimensions, + elementPosition, sc, + isHorizontal, otherMultiplier, reverse); + + // takes a computed anchor position and adjusts it for parent offset and scroll, then stores it. + var _setAnchorLocation = function (endpoint, anchorPos) { + continuousAnchorLocations[endpoint.id] = [ anchorPos[0], anchorPos[1], anchorPos[2], anchorPos[3] ]; + continuousAnchorOrientations[endpoint.id] = orientation; + }; + + for (var i = 0; i < anchors.length; i++) { + var c = anchors[i][4], weAreSource = c.endpoints[0].elementId === elementId, weAreTarget = c.endpoints[1].elementId === elementId; + if (weAreSource) + _setAnchorLocation(c.endpoints[0], anchors[i]); + if (weAreTarget) + _setAnchorLocation(c.endpoints[1], anchors[i]); + } + } + }; + + placeSomeAnchors("bottom", sS, [sO.left, sO.top], _anchorLists.bottom, true, 1, [0, 1]); + placeSomeAnchors("top", sS, [sO.left, sO.top], _anchorLists.top, true, 0, [0, -1]); + placeSomeAnchors("left", sS, [sO.left, sO.top], _anchorLists.left, false, 0, [-1, 0]); + placeSomeAnchors("right", sS, [sO.left, sO.top], _anchorLists.right, false, 1, [1, 0]); + }; + + this.reset = function () { + _amEndpoints = {}; + connectionsByElementId = {}; + anchorLists = {}; + }; + this.addFloatingConnection = function (key, conn) { + floatingConnections[key] = conn; + }; + this.removeFloatingConnection = function (key) { + delete floatingConnections[key]; + }; + this.newConnection = function (conn) { + var sourceId = conn.sourceId, targetId = conn.targetId, + ep = conn.endpoints, + doRegisterTarget = true, + registerConnection = function (otherIndex, otherEndpoint, otherAnchor, elId, c) { + if ((sourceId == targetId) && otherAnchor.isContinuous) { + // remove the target endpoint's canvas. we dont need it. + conn._jsPlumb.instance.removeElement(ep[1].canvas); + doRegisterTarget = false; + } + _ju.addToList(connectionsByElementId, elId, [c, otherEndpoint, otherAnchor.constructor == _jp.DynamicAnchor]); + }; + + registerConnection(0, ep[0], ep[0].anchor, targetId, conn); + if (doRegisterTarget) + registerConnection(1, ep[1], ep[1].anchor, sourceId, conn); + }; + var removeEndpointFromAnchorLists = function (endpoint) { + (function (list, eId) { + if (list) { // transient anchors dont get entries in this list. + var f = function (e) { + return e[4] == eId; + }; + _ju.removeWithFunction(list.top, f); + _ju.removeWithFunction(list.left, f); + _ju.removeWithFunction(list.bottom, f); + _ju.removeWithFunction(list.right, f); + } + })(anchorLists[endpoint.elementId], endpoint.id); + }; + this.connectionDetached = function (connInfo, doNotRedraw) { + var connection = connInfo.connection || connInfo, + sourceId = connInfo.sourceId, + targetId = connInfo.targetId, + ep = connection.endpoints, + removeConnection = function (otherIndex, otherEndpoint, otherAnchor, elId, c) { + _ju.removeWithFunction(connectionsByElementId[elId], function (_c) { + return _c[0].id == c.id; + }); + }; + + removeConnection(1, ep[1], ep[1].anchor, sourceId, connection); + removeConnection(0, ep[0], ep[0].anchor, targetId, connection); + if (connection.floatingId) { + removeConnection(connection.floatingIndex, connection.floatingEndpoint, connection.floatingEndpoint.anchor, connection.floatingId, connection); + removeEndpointFromAnchorLists(connection.floatingEndpoint); + } + + // remove from anchorLists + removeEndpointFromAnchorLists(connection.endpoints[0]); + removeEndpointFromAnchorLists(connection.endpoints[1]); + + if (!doNotRedraw) { + self.redraw(connection.sourceId); + if (connection.targetId !== connection.sourceId) + self.redraw(connection.targetId); + } + }; + this.add = function (endpoint, elementId) { + _ju.addToList(_amEndpoints, elementId, endpoint); + }; + this.changeId = function (oldId, newId) { + connectionsByElementId[newId] = connectionsByElementId[oldId]; + _amEndpoints[newId] = _amEndpoints[oldId]; + delete connectionsByElementId[oldId]; + delete _amEndpoints[oldId]; + }; + this.getConnectionsFor = function (elementId) { + return connectionsByElementId[elementId] || []; + }; + this.getEndpointsFor = function (elementId) { + return _amEndpoints[elementId] || []; + }; + this.deleteEndpoint = function (endpoint) { + _ju.removeWithFunction(_amEndpoints[endpoint.elementId], function (e) { + return e.id == endpoint.id; + }); + removeEndpointFromAnchorLists(endpoint); + }; + this.clearFor = function (elementId) { + delete _amEndpoints[elementId]; + _amEndpoints[elementId] = []; + }; + // updates the given anchor list by either updating an existing anchor's info, or adding it. this function + // also removes the anchor from its previous list, if the edge it is on has changed. + // all connections found along the way (those that are connected to one of the faces this function + // operates on) are added to the connsToPaint list, as are their endpoints. in this way we know to repaint + // them wthout having to calculate anything else about them. + var _updateAnchorList = function (lists, theta, order, conn, aBoolean, otherElId, idx, reverse, edgeId, elId, connsToPaint, endpointsToPaint) { + // first try to find the exact match, but keep track of the first index of a matching element id along the way.s + var exactIdx = -1, + firstMatchingElIdx = -1, + endpoint = conn.endpoints[idx], + endpointId = endpoint.id, + oIdx = [1, 0][idx], + values = [ + [ theta, order ], + conn, + aBoolean, + otherElId, + endpointId + ], + listToAddTo = lists[edgeId], + listToRemoveFrom = endpoint._continuousAnchorEdge ? lists[endpoint._continuousAnchorEdge] : null, + i, + candidate; + + if (listToRemoveFrom) { + var rIdx = _ju.findWithFunction(listToRemoveFrom, function (e) { + return e[4] == endpointId; + }); + if (rIdx != -1) { + listToRemoveFrom.splice(rIdx, 1); + // get all connections from this list + for (i = 0; i < listToRemoveFrom.length; i++) { + candidate = listToRemoveFrom[i][1]; + _ju.addWithFunction(connsToPaint, candidate, function (c) { + return c.id == candidate.id; + }); + _ju.addWithFunction(endpointsToPaint, listToRemoveFrom[i][1].endpoints[idx], function (e) { + return e.id == candidate.endpoints[idx].id; + }); + _ju.addWithFunction(endpointsToPaint, listToRemoveFrom[i][1].endpoints[oIdx], function (e) { + return e.id == candidate.endpoints[oIdx].id; + }); + } + } + } + + for (i = 0; i < listToAddTo.length; i++) { + candidate = listToAddTo[i][1]; + if (params.idx == 1 && listToAddTo[i][3] === otherElId && firstMatchingElIdx == -1) + firstMatchingElIdx = i; + _ju.addWithFunction(connsToPaint, candidate, function (c) { + return c.id == candidate.id; + }); + _ju.addWithFunction(endpointsToPaint, listToAddTo[i][1].endpoints[idx], function (e) { + return e.id == candidate.endpoints[idx].id; + }); + _ju.addWithFunction(endpointsToPaint, listToAddTo[i][1].endpoints[oIdx], function (e) { + return e.id == candidate.endpoints[oIdx].id; + }); + } + if (exactIdx != -1) { + listToAddTo[exactIdx] = values; + } + else { + var insertIdx = reverse ? firstMatchingElIdx != -1 ? firstMatchingElIdx : 0 : listToAddTo.length; // of course we will get this from having looked through the array shortly. + listToAddTo.splice(insertIdx, 0, values); + } + + // store this for next time. + endpoint._continuousAnchorEdge = edgeId; + }; + + // + // find the entry in an endpoint's list for this connection and update its target endpoint + // with the current target in the connection. + // + // + this.updateOtherEndpoint = function (elId, oldTargetId, newTargetId, connection) { + var sIndex = _ju.findWithFunction(connectionsByElementId[elId], function (i) { + return i[0].id === connection.id; + }), + tIndex = _ju.findWithFunction(connectionsByElementId[oldTargetId], function (i) { + return i[0].id === connection.id; + }); + + // update or add data for source + if (sIndex != -1) { + connectionsByElementId[elId][sIndex][0] = connection; + connectionsByElementId[elId][sIndex][1] = connection.endpoints[1]; + connectionsByElementId[elId][sIndex][2] = connection.endpoints[1].anchor.constructor == _jp.DynamicAnchor; + } + + // remove entry for previous target (if there) + if (tIndex > -1) { + connectionsByElementId[oldTargetId].splice(tIndex, 1); + // add entry for new target + _ju.addToList(connectionsByElementId, newTargetId, [connection, connection.endpoints[0], connection.endpoints[0].anchor.constructor == _jp.DynamicAnchor]); + } + + connection.updateConnectedClass(); + }; + + // + // notification that the connection given has changed source from the originalId to the newId. + // This involves: + // 1. removing the connection from the list of connections stored for the originalId + // 2. updating the source information for the target of the connection + // 3. re-registering the connection in connectionsByElementId with the newId + // + this.sourceChanged = function (originalId, newId, connection) { + if (originalId !== newId) { + // remove the entry that points from the old source to the target + _ju.removeWithFunction(connectionsByElementId[originalId], function (info) { + return info[0].id === connection.id; + }); + // find entry for target and update it + var tIdx = _ju.findWithFunction(connectionsByElementId[connection.targetId], function (i) { + return i[0].id === connection.id; + }); + if (tIdx > -1) { + connectionsByElementId[connection.targetId][tIdx][0] = connection; + connectionsByElementId[connection.targetId][tIdx][1] = connection.endpoints[0]; + connectionsByElementId[connection.targetId][tIdx][2] = connection.endpoints[0].anchor.constructor == _jp.DynamicAnchor; + } + // add entry for new source + _ju.addToList(connectionsByElementId, newId, [connection, connection.endpoints[1], connection.endpoints[1].anchor.constructor == _jp.DynamicAnchor]); + + // TODO SP not final on this yet. when a user drags an existing connection and it turns into a self + // loop, then this code hides the target endpoint (by removing it from the DOM) But I think this should + // occur only if the anchor is Continuous + if (connection.endpoints[1].anchor.isContinuous) { + if (connection.source === connection.target) { + connection._jsPlumb.instance.removeElement(connection.endpoints[1].canvas); + } + else { + if (connection.endpoints[1].canvas.parentNode == null) { + connection._jsPlumb.instance.appendElement(connection.endpoints[1].canvas); + } + } + } + + connection.updateConnectedClass(); + } + }; + + // + // moves the given endpoint from `currentId` to `element`. + // This involves: + // + // 1. changing the key in _amEndpoints under which the endpoint is stored + // 2. changing the source or target values in all of the endpoint's connections + // 3. changing the array in connectionsByElementId in which the endpoint's connections + // are stored (done by either sourceChanged or updateOtherEndpoint) + // + this.rehomeEndpoint = function (ep, currentId, element) { + var eps = _amEndpoints[currentId] || [], + elementId = jsPlumbInstance.getId(element); + + if (elementId !== currentId) { + var idx = eps.indexOf(ep); + if (idx > -1) { + var _ep = eps.splice(idx, 1)[0]; + self.add(_ep, elementId); + } + } + + for (var i = 0; i < ep.connections.length; i++) { + if (ep.connections[i].sourceId == currentId) { + ep.connections[i].sourceId = ep.elementId; + ep.connections[i].source = ep.element; + self.sourceChanged(currentId, ep.elementId, ep.connections[i]); + } + else if (ep.connections[i].targetId == currentId) { + ep.connections[i].targetId = ep.elementId; + ep.connections[i].target = ep.element; + self.updateOtherEndpoint(ep.connections[i].sourceId, currentId, ep.elementId, ep.connections[i]); + } + } + }; + + this.redraw = function (elementId, ui, timestamp, offsetToUI, clearEdits, doNotRecalcEndpoint) { + + if (!jsPlumbInstance.isSuspendDrawing()) { + // get all the endpoints for this element + var ep = _amEndpoints[elementId] || [], + endpointConnections = connectionsByElementId[elementId] || [], + connectionsToPaint = [], + endpointsToPaint = [], + anchorsToUpdate = []; + + timestamp = timestamp || jsPlumbInstance.timestamp(); + // offsetToUI are values that would have been calculated in the dragManager when registering + // an endpoint for an element that had a parent (somewhere in the hierarchy) that had been + // registered as draggable. + offsetToUI = offsetToUI || {left: 0, top: 0}; + if (ui) { + ui = { + left: ui.left + offsetToUI.left, + top: ui.top + offsetToUI.top + }; + } + + // valid for one paint cycle. + var myOffset = jsPlumbInstance.updateOffset({ elId: elementId, offset: ui, recalc: false, timestamp: timestamp }), + orientationCache = {}; + + // actually, first we should compute the orientation of this element to all other elements to which + // this element is connected with a continuous anchor (whether both ends of the connection have + // a continuous anchor or just one) + + for (var i = 0; i < endpointConnections.length; i++) { + var conn = endpointConnections[i][0], + sourceId = conn.sourceId, + targetId = conn.targetId, + sourceContinuous = conn.endpoints[0].anchor.isContinuous, + targetContinuous = conn.endpoints[1].anchor.isContinuous; + + if (sourceContinuous || targetContinuous) { + var oKey = sourceId + "_" + targetId, + o = orientationCache[oKey], + oIdx = conn.sourceId == elementId ? 1 : 0; + + if (sourceContinuous && !anchorLists[sourceId]) anchorLists[sourceId] = { top: [], right: [], bottom: [], left: [] }; + if (targetContinuous && !anchorLists[targetId]) anchorLists[targetId] = { top: [], right: [], bottom: [], left: [] }; + + if (elementId != targetId) jsPlumbInstance.updateOffset({ elId: targetId, timestamp: timestamp }); + if (elementId != sourceId) jsPlumbInstance.updateOffset({ elId: sourceId, timestamp: timestamp }); + + var td = jsPlumbInstance.getCachedData(targetId), + sd = jsPlumbInstance.getCachedData(sourceId); + + if (targetId == sourceId && (sourceContinuous || targetContinuous)) { + // here we may want to improve this by somehow determining the face we'd like + // to put the connector on. ideally, when drawing, the face should be calculated + // by determining which face is closest to the point at which the mouse button + // was released. for now, we're putting it on the top face. + _updateAnchorList( anchorLists[sourceId], -Math.PI / 2, 0, conn, false, targetId, 0, false, "top", sourceId, connectionsToPaint, endpointsToPaint); + _updateAnchorList( anchorLists[targetId], -Math.PI / 2, 0, conn, false, sourceId, 1, false, "top", targetId, connectionsToPaint, endpointsToPaint); + } + else { + if (!o) { + o = calculateOrientation(sourceId, targetId, sd.o, td.o, conn.endpoints[0].anchor, conn.endpoints[1].anchor); + orientationCache[oKey] = o; + // this would be a performance enhancement, but the computed angles need to be clamped to + //the (-PI/2 -> PI/2) range in order for the sorting to work properly. + /* orientationCache[oKey2] = { + orientation:o.orientation, + a:[o.a[1], o.a[0]], + theta:o.theta + Math.PI, + theta2:o.theta2 + Math.PI + };*/ + } + if (sourceContinuous) _updateAnchorList(anchorLists[sourceId], o.theta, 0, conn, false, targetId, 0, false, o.a[0], sourceId, connectionsToPaint, endpointsToPaint); + if (targetContinuous) _updateAnchorList(anchorLists[targetId], o.theta2, -1, conn, true, sourceId, 1, true, o.a[1], targetId, connectionsToPaint, endpointsToPaint); + } + + if (sourceContinuous) _ju.addWithFunction(anchorsToUpdate, sourceId, function (a) { + return a === sourceId; + }); + if (targetContinuous) _ju.addWithFunction(anchorsToUpdate, targetId, function (a) { + return a === targetId; + }); + _ju.addWithFunction(connectionsToPaint, conn, function (c) { + return c.id == conn.id; + }); + if ((sourceContinuous && oIdx === 0) || (targetContinuous && oIdx === 1)) + _ju.addWithFunction(endpointsToPaint, conn.endpoints[oIdx], function (e) { + return e.id == conn.endpoints[oIdx].id; + }); + } + } + + // place Endpoints whose anchors are continuous but have no Connections + for (i = 0; i < ep.length; i++) { + if (ep[i].connections.length === 0 && ep[i].anchor.isContinuous) { + if (!anchorLists[elementId]) anchorLists[elementId] = { top: [], right: [], bottom: [], left: [] }; + _updateAnchorList(anchorLists[elementId], -Math.PI / 2, 0, {endpoints: [ep[i], ep[i]], paint: function () { + }}, false, elementId, 0, false, ep[i].anchor.getDefaultFace(), elementId, connectionsToPaint, endpointsToPaint); + _ju.addWithFunction(anchorsToUpdate, elementId, function (a) { + return a === elementId; + }); + } + } + + + // now place all the continuous anchors we need to; + for (i = 0; i < anchorsToUpdate.length; i++) { + placeAnchors(anchorsToUpdate[i], anchorLists[anchorsToUpdate[i]]); + } + + // now that continuous anchors have been placed, paint all the endpoints for this element + // TODO performance: add the endpoint ids to a temp array, and then when iterating in the next + // loop, check that we didn't just paint that endpoint. we can probably shave off a few more milliseconds this way. + for (i = 0; i < ep.length; i++) { + ep[i].paint({ timestamp: timestamp, offset: myOffset, dimensions: myOffset.s, recalc: doNotRecalcEndpoint !== true }); + } + + // ... and any other endpoints we came across as a result of the continuous anchors. + for (i = 0; i < endpointsToPaint.length; i++) { + var cd = jsPlumbInstance.getCachedData(endpointsToPaint[i].elementId); + endpointsToPaint[i].paint({ timestamp: timestamp, offset: cd, dimensions: cd.s }); + } + + // paint all the standard and "dynamic connections", which are connections whose other anchor is + // static and therefore does need to be recomputed; we make sure that happens only one time. + + // TODO we could have compiled a list of these in the first pass through connections; might save some time. + for (i = 0; i < endpointConnections.length; i++) { + var otherEndpoint = endpointConnections[i][1]; + if (otherEndpoint.anchor.constructor == _jp.DynamicAnchor) { + otherEndpoint.paint({ elementWithPrecedence: elementId, timestamp: timestamp }); + _ju.addWithFunction(connectionsToPaint, endpointConnections[i][0], function (c) { + return c.id == endpointConnections[i][0].id; + }); + // all the connections for the other endpoint now need to be repainted + for (var k = 0; k < otherEndpoint.connections.length; k++) { + if (otherEndpoint.connections[k] !== endpointConnections[i][0]) + _ju.addWithFunction(connectionsToPaint, otherEndpoint.connections[k], function (c) { + return c.id == otherEndpoint.connections[k].id; + }); + } + } else if (otherEndpoint.anchor.constructor == _jp.Anchor) { + _ju.addWithFunction(connectionsToPaint, endpointConnections[i][0], function (c) { + return c.id == endpointConnections[i][0].id; + }); + } + } + + // paint current floating connection for this element, if there is one. + var fc = floatingConnections[elementId]; + if (fc) + fc.paint({timestamp: timestamp, recalc: false, elId: elementId}); + + // paint all the connections + for (i = 0; i < connectionsToPaint.length; i++) { + connectionsToPaint[i].paint({elId: elementId, timestamp: timestamp, recalc: false, clearEdits: clearEdits}); + } + } + }; + + var ContinuousAnchor = function (anchorParams) { + _ju.EventGenerator.apply(this); + this.type = "Continuous"; + this.isDynamic = true; + this.isContinuous = true; + var faces = anchorParams.faces || ["top", "right", "bottom", "left"], + clockwise = !(anchorParams.clockwise === false), + availableFaces = { }, + opposites = { "top": "bottom", "right": "left", "left": "right", "bottom": "top" }, + clockwiseOptions = { "top": "right", "right": "bottom", "left": "top", "bottom": "left" }, + antiClockwiseOptions = { "top": "left", "right": "top", "left": "bottom", "bottom": "right" }, + secondBest = clockwise ? clockwiseOptions : antiClockwiseOptions, + lastChoice = clockwise ? antiClockwiseOptions : clockwiseOptions, + cssClass = anchorParams.cssClass || ""; + + for (var i = 0; i < faces.length; i++) { + availableFaces[faces[i]] = true; + } + + this.getDefaultFace = function () { + return faces.length === 0 ? "top" : faces[0]; + }; + + // if the given edge is supported, returns it. otherwise looks for a substitute that _is_ + // supported. if none supported we also return the request edge. + this.verifyEdge = function (edge) { + if (availableFaces[edge]) return edge; + else if (availableFaces[opposites[edge]]) return opposites[edge]; + else if (availableFaces[secondBest[edge]]) return secondBest[edge]; + else if (availableFaces[lastChoice[edge]]) return lastChoice[edge]; + return edge; // we have to give them something. + }; + + this.isEdgeSupported = function (edge) { + return availableFaces[edge] === true; + }; + + this.compute = function (params) { + return userDefinedContinuousAnchorLocations[params.element.id] || continuousAnchorLocations[params.element.id] || [0, 0]; + }; + this.getCurrentLocation = function (params) { + return userDefinedContinuousAnchorLocations[params.element.id] || continuousAnchorLocations[params.element.id] || [0, 0]; + }; + this.getOrientation = function (endpoint) { + return continuousAnchorOrientations[endpoint.id] || [0, 0]; + }; + this.clearUserDefinedLocation = function () { + delete userDefinedContinuousAnchorLocations[anchorParams.elementId]; + }; + this.setUserDefinedLocation = function (loc) { + userDefinedContinuousAnchorLocations[anchorParams.elementId] = loc; + }; + this.getCssClass = function () { + return cssClass; + }; + }; + + // continuous anchors + jsPlumbInstance.continuousAnchorFactory = { + get: function (params) { + return new ContinuousAnchor(params); + }, + clear: function (elementId) { + delete userDefinedContinuousAnchorLocations[elementId]; + delete continuousAnchorLocations[elementId]; + } + }; + }; + + /** + * Anchors model a position on some element at which an Endpoint may be located. They began as a first class citizen of jsPlumb, ie. a user + * was required to create these themselves, but over time this has been replaced by the concept of referring to them either by name (eg. "TopMiddle"), + * or by an array describing their coordinates (eg. [ 0, 0.5, 0, -1 ], which is the same as "TopMiddle"). jsPlumb now handles all of the + * creation of Anchors without user intervention. + */ + _jp.Anchor = function (params) { + this.x = params.x || 0; + this.y = params.y || 0; + this.elementId = params.elementId; + this.cssClass = params.cssClass || ""; + this.userDefinedLocation = null; + this.orientation = params.orientation || [ 0, 0 ]; + this.lastReturnValue = null; + this.offsets = params.offsets || [ 0, 0 ]; + this.timestamp = null; + + _ju.EventGenerator.apply(this); + + this.compute = function (params) { + + var xy = params.xy, wh = params.wh, timestamp = params.timestamp; + + if (params.clearUserDefinedLocation) + this.userDefinedLocation = null; + + if (timestamp && timestamp === self.timestamp) + return this.lastReturnValue; + + if (this.userDefinedLocation != null) { + this.lastReturnValue = this.userDefinedLocation; + } + else { + this.lastReturnValue = [ xy[0] + (this.x * wh[0]) + this.offsets[0], xy[1] + (this.y * wh[1]) + this.offsets[1] ]; + } + + this.timestamp = timestamp; + return this.lastReturnValue; + }; + + this.getCurrentLocation = function (params) { + params = params || {}; + return (this.lastReturnValue == null || (params.timestamp != null && this.timestamp != params.timestamp)) ? this.compute(params) : this.lastReturnValue; + }; + }; + _ju.extend(_jp.Anchor, _ju.EventGenerator, { + equals: function (anchor) { + if (!anchor) return false; + var ao = anchor.getOrientation(), + o = this.getOrientation(); + return this.x == anchor.x && this.y == anchor.y && this.offsets[0] == anchor.offsets[0] && this.offsets[1] == anchor.offsets[1] && o[0] == ao[0] && o[1] == ao[1]; + }, + getUserDefinedLocation: function () { + return this.userDefinedLocation; + }, + setUserDefinedLocation: function (l) { + this.userDefinedLocation = l; + }, + clearUserDefinedLocation: function () { + this.userDefinedLocation = null; + }, + getOrientation: function () { + return this.orientation; + }, + getCssClass: function () { + return this.cssClass; + } + }); + + /** + * An Anchor that floats. its orientation is computed dynamically from + * its position relative to the anchor it is floating relative to. It is used when creating + * a connection through drag and drop. + * + * TODO FloatingAnchor could totally be refactored to extend Anchor just slightly. + */ + _jp.FloatingAnchor = function (params) { + + _jp.Anchor.apply(this, arguments); + + // this is the anchor that this floating anchor is referenced to for + // purposes of calculating the orientation. + var ref = params.reference, + // the canvas this refers to. + refCanvas = params.referenceCanvas, + size = _jp.getSize(refCanvas), + // these are used to store the current relative position of our + // anchor wrt the reference anchor. they only indicate + // direction, so have a value of 1 or -1 (or, very rarely, 0). these + // values are written by the compute method, and read + // by the getOrientation method. + xDir = 0, yDir = 0, + // temporary member used to store an orientation when the floating + // anchor is hovering over another anchor. + orientation = null, + _lastResult = null; + + // clear from parent. we want floating anchor orientation to always be computed. + this.orientation = null; + + // set these to 0 each; they are used by certain types of connectors in the loopback case, + // when the connector is trying to clear the element it is on. but for floating anchor it's not + // very important. + this.x = 0; + this.y = 0; + + this.isFloating = true; + + this.compute = function (params) { + var xy = params.xy, + result = [ xy[0] + (size[0] / 2), xy[1] + (size[1] / 2) ]; // return origin of the element. we may wish to improve this so that any object can be the drag proxy. + _lastResult = result; + return result; + }; + + this.getOrientation = function (_endpoint) { + if (orientation) return orientation; + else { + var o = ref.getOrientation(_endpoint); + // here we take into account the orientation of the other + // anchor: if it declares zero for some direction, we declare zero too. this might not be the most awesome. perhaps we can come + // up with a better way. it's just so that the line we draw looks like it makes sense. maybe this wont make sense. + return [ Math.abs(o[0]) * xDir * -1, + Math.abs(o[1]) * yDir * -1 ]; + } + }; + + /** + * notification the endpoint associated with this anchor is hovering + * over another anchor; we want to assume that anchor's orientation + * for the duration of the hover. + */ + this.over = function (anchor, endpoint) { + orientation = anchor.getOrientation(endpoint); + }; + + /** + * notification the endpoint associated with this anchor is no + * longer hovering over another anchor; we should resume calculating + * orientation as we normally do. + */ + this.out = function () { + orientation = null; + }; + + this.getCurrentLocation = function (params) { + return _lastResult == null ? this.compute(params) : _lastResult; + }; + }; + _ju.extend(_jp.FloatingAnchor, _jp.Anchor); + + var _convertAnchor = function (anchor, jsPlumbInstance, elementId) { + return anchor.constructor == _jp.Anchor ? anchor : jsPlumbInstance.makeAnchor(anchor, elementId, jsPlumbInstance); + }; + + /* + * A DynamicAnchor is an Anchor that contains a list of other Anchors, which it cycles + * through at compute time to find the one that is located closest to + * the center of the target element, and returns that Anchor's compute + * method result. this causes endpoints to follow each other with + * respect to the orientation of their target elements, which is a useful + * feature for some applications. + * + */ + _jp.DynamicAnchor = function (params) { + _jp.Anchor.apply(this, arguments); + + this.isDynamic = true; + this.anchors = []; + this.elementId = params.elementId; + this.jsPlumbInstance = params.jsPlumbInstance; + + for (var i = 0; i < params.anchors.length; i++) + this.anchors[i] = _convertAnchor(params.anchors[i], this.jsPlumbInstance, this.elementId); + + this.getAnchors = function () { + return this.anchors; + }; + this.locked = false; + var _curAnchor = this.anchors.length > 0 ? this.anchors[0] : null, + _lastAnchor = _curAnchor, + self = this, + + // helper method to calculate the distance between the centers of the two elements. + _distance = function (anchor, cx, cy, xy, wh) { + var ax = xy[0] + (anchor.x * wh[0]), ay = xy[1] + (anchor.y * wh[1]), + acx = xy[0] + (wh[0] / 2), acy = xy[1] + (wh[1] / 2); + return (Math.sqrt(Math.pow(cx - ax, 2) + Math.pow(cy - ay, 2)) + + Math.sqrt(Math.pow(acx - ax, 2) + Math.pow(acy - ay, 2))); + }, + // default method uses distance between element centers. you can provide your own method in the dynamic anchor + // constructor (and also to jsPlumb.makeDynamicAnchor). the arguments to it are four arrays: + // xy - xy loc of the anchor's element + // wh - anchor's element's dimensions + // txy - xy loc of the element of the other anchor in the connection + // twh - dimensions of the element of the other anchor in the connection. + // anchors - the list of selectable anchors + _anchorSelector = params.selector || function (xy, wh, txy, twh, anchors) { + var cx = txy[0] + (twh[0] / 2), cy = txy[1] + (twh[1] / 2); + var minIdx = -1, minDist = Infinity; + for (var i = 0; i < anchors.length; i++) { + var d = _distance(anchors[i], cx, cy, xy, wh); + if (d < minDist) { + minIdx = i + 0; + minDist = d; + } + } + return anchors[minIdx]; + }; + + this.compute = function (params) { + var xy = params.xy, wh = params.wh, txy = params.txy, twh = params.twh; + + this.timestamp = params.timestamp; + + var udl = self.getUserDefinedLocation(); + if (udl != null) { + return udl; + } + + // if anchor is locked or an opposite element was not given, we + // maintain our state. anchor will be locked + // if it is the source of a drag and drop. + if (this.locked || txy == null || twh == null) + return _curAnchor.compute(params); + else + params.timestamp = null; // otherwise clear this, i think. we want the anchor to compute. + + _curAnchor = _anchorSelector(xy, wh, txy, twh, this.anchors); + this.x = _curAnchor.x; + this.y = _curAnchor.y; + + if (_curAnchor != _lastAnchor) + this.fire("anchorChanged", _curAnchor); + + _lastAnchor = _curAnchor; + + return _curAnchor.compute(params); + }; + + this.getCurrentLocation = function (params) { + return this.getUserDefinedLocation() || (_curAnchor != null ? _curAnchor.getCurrentLocation(params) : null); + }; + + this.getOrientation = function (_endpoint) { + return _curAnchor != null ? _curAnchor.getOrientation(_endpoint) : [ 0, 0 ]; + }; + this.over = function (anchor, endpoint) { + if (_curAnchor != null) _curAnchor.over(anchor, endpoint); + }; + this.out = function () { + if (_curAnchor != null) _curAnchor.out(); + }; + + this.getCssClass = function () { + return (_curAnchor && _curAnchor.getCssClass()) || ""; + }; + }; + _ju.extend(_jp.DynamicAnchor, _jp.Anchor); + +// -------- basic anchors ------------------ + var _curryAnchor = function (x, y, ox, oy, type, fnInit) { + _jp.Anchors[type] = function (params) { + var a = params.jsPlumbInstance.makeAnchor([ x, y, ox, oy, 0, 0 ], params.elementId, params.jsPlumbInstance); + a.type = type; + if (fnInit) fnInit(a, params); + return a; + }; + }; + + _curryAnchor(0.5, 0, 0, -1, "TopCenter"); + _curryAnchor(0.5, 1, 0, 1, "BottomCenter"); + _curryAnchor(0, 0.5, -1, 0, "LeftMiddle"); + _curryAnchor(1, 0.5, 1, 0, "RightMiddle"); + + _curryAnchor(0.5, 0, 0, -1, "Top"); + _curryAnchor(0.5, 1, 0, 1, "Bottom"); + _curryAnchor(0, 0.5, -1, 0, "Left"); + _curryAnchor(1, 0.5, 1, 0, "Right"); + _curryAnchor(0.5, 0.5, 0, 0, "Center"); + _curryAnchor(1, 0, 0, -1, "TopRight"); + _curryAnchor(1, 1, 0, 1, "BottomRight"); + _curryAnchor(0, 0, 0, -1, "TopLeft"); + _curryAnchor(0, 1, 0, 1, "BottomLeft"); + +// ------- dynamic anchors ------------------- + + // default dynamic anchors chooses from Top, Right, Bottom, Left + _jp.Defaults.DynamicAnchors = function (params) { + return params.jsPlumbInstance.makeAnchors(["TopCenter", "RightMiddle", "BottomCenter", "LeftMiddle"], params.elementId, params.jsPlumbInstance); + }; + + // default dynamic anchors bound to name 'AutoDefault' + _jp.Anchors.AutoDefault = function (params) { + var a = params.jsPlumbInstance.makeDynamicAnchor(_jp.Defaults.DynamicAnchors(params)); + a.type = "AutoDefault"; + return a; + }; + +// ------- continuous anchors ------------------- + + var _curryContinuousAnchor = function (type, faces) { + _jp.Anchors[type] = function (params) { + var a = params.jsPlumbInstance.makeAnchor(["Continuous", { faces: faces }], params.elementId, params.jsPlumbInstance); + a.type = type; + return a; + }; + }; + + _jp.Anchors.Continuous = function (params) { + return params.jsPlumbInstance.continuousAnchorFactory.get(params); + }; + + _curryContinuousAnchor("ContinuousLeft", ["left"]); + _curryContinuousAnchor("ContinuousTop", ["top"]); + _curryContinuousAnchor("ContinuousBottom", ["bottom"]); + _curryContinuousAnchor("ContinuousRight", ["right"]); + +// ------- position assign anchors ------------------- + + // this anchor type lets you assign the position at connection time. + _curryAnchor(0, 0, 0, 0, "Assign", function (anchor, params) { + // find what to use as the "position finder". the user may have supplied a String which represents + // the id of a position finder in jsPlumb.AnchorPositionFinders, or the user may have supplied the + // position finder as a function. we find out what to use and then set it on the anchor. + var pf = params.position || "Fixed"; + anchor.positionFinder = pf.constructor == String ? params.jsPlumbInstance.AnchorPositionFinders[pf] : pf; + // always set the constructor params; the position finder might need them later (the Grid one does, + // for example) + anchor.constructorParams = params; + }); + + // these are the default anchor positions finders, which are used by the makeTarget function. supplying + // a position finder argument to that function allows you to specify where the resulting anchor will + // be located + jsPlumbInstance.prototype.AnchorPositionFinders = { + "Fixed": function (dp, ep, es) { + return [ (dp.left - ep.left) / es[0], (dp.top - ep.top) / es[1] ]; + }, + "Grid": function (dp, ep, es, params) { + var dx = dp.left - ep.left, dy = dp.top - ep.top, + gx = es[0] / (params.grid[0]), gy = es[1] / (params.grid[1]), + mx = Math.floor(dx / gx), my = Math.floor(dy / gy); + return [ ((mx * gx) + (gx / 2)) / es[0], ((my * gy) + (gy / 2)) / es[1] ]; + } + }; + +// ------- perimeter anchors ------------------- + + _jp.Anchors.Perimeter = function (params) { + params = params || {}; + var anchorCount = params.anchorCount || 60, + shape = params.shape; + + if (!shape) throw new Error("no shape supplied to Perimeter Anchor type"); + + var _circle = function () { + var r = 0.5, step = Math.PI * 2 / anchorCount, current = 0, a = []; + for (var i = 0; i < anchorCount; i++) { + var x = r + (r * Math.sin(current)), + y = r + (r * Math.cos(current)); + a.push([ x, y, 0, 0 ]); + current += step; + } + return a; + }, + _path = function (segments) { + var anchorsPerFace = anchorCount / segments.length, a = [], + _computeFace = function (x1, y1, x2, y2, fractionalLength) { + anchorsPerFace = anchorCount * fractionalLength; + var dx = (x2 - x1) / anchorsPerFace, dy = (y2 - y1) / anchorsPerFace; + for (var i = 0; i < anchorsPerFace; i++) { + a.push([ + x1 + (dx * i), + y1 + (dy * i), + 0, + 0 + ]); + } + }; + + for (var i = 0; i < segments.length; i++) + _computeFace.apply(null, segments[i]); + + return a; + }, + _shape = function (faces) { + var s = []; + for (var i = 0; i < faces.length; i++) { + s.push([faces[i][0], faces[i][1], faces[i][2], faces[i][3], 1 / faces.length]); + } + return _path(s); + }, + _rectangle = function () { + return _shape([ + [ 0, 0, 1, 0 ], + [ 1, 0, 1, 1 ], + [ 1, 1, 0, 1 ], + [ 0, 1, 0, 0 ] + ]); + }; + + var _shapes = { + "Circle": _circle, + "Ellipse": _circle, + "Diamond": function () { + return _shape([ + [ 0.5, 0, 1, 0.5 ], + [ 1, 0.5, 0.5, 1 ], + [ 0.5, 1, 0, 0.5 ], + [ 0, 0.5, 0.5, 0 ] + ]); + }, + "Rectangle": _rectangle, + "Square": _rectangle, + "Triangle": function () { + return _shape([ + [ 0.5, 0, 1, 1 ], + [ 1, 1, 0, 1 ], + [ 0, 1, 0.5, 0] + ]); + }, + "Path": function (params) { + var points = params.points, p = [], tl = 0; + for (var i = 0; i < points.length - 1; i++) { + var l = Math.sqrt(Math.pow(points[i][2] - points[i][0]) + Math.pow(points[i][3] - points[i][1])); + tl += l; + p.push([points[i][0], points[i][1], points[i + 1][0], points[i + 1][1], l]); + } + for (var j = 0; j < p.length; j++) { + p[j][4] = p[j][4] / tl; + } + return _path(p); + } + }, + _rotate = function (points, amountInDegrees) { + var o = [], theta = amountInDegrees / 180 * Math.PI; + for (var i = 0; i < points.length; i++) { + var _x = points[i][0] - 0.5, + _y = points[i][1] - 0.5; + + o.push([ + 0.5 + ((_x * Math.cos(theta)) - (_y * Math.sin(theta))), + 0.5 + ((_x * Math.sin(theta)) + (_y * Math.cos(theta))), + points[i][2], + points[i][3] + ]); + } + return o; + }; + + if (!_shapes[shape]) throw new Error("Shape [" + shape + "] is unknown by Perimeter Anchor type"); + + var da = _shapes[shape](params); + if (params.rotation) da = _rotate(da, params.rotation); + var a = params.jsPlumbInstance.makeDynamicAnchor(da); + a.type = "Perimeter"; + return a; + }; +}).call(this); +/* + * jsPlumb + * + * Title:jsPlumb 2.0.2 + * + * Provides a way to visually connect elements on an HTML page, using SVG. + * + * This file contains the default Connectors, Endpoint and Overlay definitions. + * + * Copyright (c) 2010 - 2015 jsPlumb (hello@jsplumbtoolkit.com) + * + * http://jsplumbtoolkit.com + * http://github.com/sporritt/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil, _jg = root.Biltong; + + _jp.Segments = { + + /* + * Class: AbstractSegment + * A Connector is made up of 1..N Segments, each of which has a Type, such as 'Straight', 'Arc', + * 'Bezier'. This is new from 1.4.2, and gives us a lot more flexibility when drawing connections: things such + * as rounded corners for flowchart connectors, for example, or a straight line stub for Bezier connections, are + * much easier to do now. + * + * A Segment is responsible for providing coordinates for painting it, and also must be able to report its length. + * + */ + AbstractSegment: function (params) { + this.params = params; + + /** + * Function: findClosestPointOnPath + * Finds the closest point on this segment to the given [x, y], + * returning both the x and y of the point plus its distance from + * the supplied point, and its location along the length of the + * path inscribed by the segment. This implementation returns + * Infinity for distance and null values for everything else; + * subclasses are expected to override. + */ + this.findClosestPointOnPath = function (x, y) { + return { + d: Infinity, + x: null, + y: null, + l: null + }; + }; + + this.getBounds = function () { + return { + minX: Math.min(params.x1, params.x2), + minY: Math.min(params.y1, params.y2), + maxX: Math.max(params.x1, params.x2), + maxY: Math.max(params.y1, params.y2) + }; + }; + }, + Straight: function (params) { + var _super = _jp.Segments.AbstractSegment.apply(this, arguments), + length, m, m2, x1, x2, y1, y2, + _recalc = function () { + length = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); + m = _jg.gradient({x: x1, y: y1}, {x: x2, y: y2}); + m2 = -1 / m; + }; + + this.type = "Straight"; + + this.getLength = function () { + return length; + }; + this.getGradient = function () { + return m; + }; + + this.getCoordinates = function () { + return { x1: x1, y1: y1, x2: x2, y2: y2 }; + }; + this.setCoordinates = function (coords) { + x1 = coords.x1; + y1 = coords.y1; + x2 = coords.x2; + y2 = coords.y2; + _recalc(); + }; + this.setCoordinates({x1: params.x1, y1: params.y1, x2: params.x2, y2: params.y2}); + + this.getBounds = function () { + return { + minX: Math.min(x1, x2), + minY: Math.min(y1, y2), + maxX: Math.max(x1, x2), + maxY: Math.max(y1, y2) + }; + }; + + /** + * returns the point on the segment's path that is 'location' along the length of the path, where 'location' is a decimal from + * 0 to 1 inclusive. for the straight line segment this is simple maths. + */ + this.pointOnPath = function (location, absolute) { + if (location === 0 && !absolute) + return { x: x1, y: y1 }; + else if (location == 1 && !absolute) + return { x: x2, y: y2 }; + else { + var l = absolute ? location > 0 ? location : length + location : location * length; + return _jg.pointOnLine({x: x1, y: y1}, {x: x2, y: y2}, l); + } + }; + + /** + * returns the gradient of the segment at the given point - which for us is constant. + */ + this.gradientAtPoint = function (_) { + return m; + }; + + /** + * returns the point on the segment's path that is 'distance' along the length of the path from 'location', where + * 'location' is a decimal from 0 to 1 inclusive, and 'distance' is a number of pixels. + * this hands off to jsPlumbUtil to do the maths, supplying two points and the distance. + */ + this.pointAlongPathFrom = function (location, distance, absolute) { + var p = this.pointOnPath(location, absolute), + farAwayPoint = distance <= 0 ? {x: x1, y: y1} : {x: x2, y: y2 }; + + /* + location == 1 ? { + x:x1 + ((x2 - x1) * 10), + y:y1 + ((y1 - y2) * 10) + } : + */ + + if (distance <= 0 && Math.abs(distance) > 1) distance *= -1; + + return _jg.pointOnLine(p, farAwayPoint, distance); + }; + + // is c between a and b? + var within = function (a, b, c) { + return c >= Math.min(a, b) && c <= Math.max(a, b); + }; + // find which of a and b is closest to c + var closest = function (a, b, c) { + return Math.abs(c - a) < Math.abs(c - b) ? a : b; + }; + + /** + Function: findClosestPointOnPath + Finds the closest point on this segment to [x,y]. See + notes on this method in AbstractSegment. + */ + this.findClosestPointOnPath = function (x, y) { + var out = { + d: Infinity, + x: null, + y: null, + l: null, + x1: x1, + x2: x2, + y1: y1, + y2: y2 + }; + + if (m === 0) { + out.y = y1; + out.x = within(x1, x2, x) ? x : closest(x1, x2, x); + } + else if (m == Infinity || m == -Infinity) { + out.x = x1; + out.y = within(y1, y2, y) ? y : closest(y1, y2, y); + } + else { + // closest point lies on normal from given point to this line. + var b = y1 - (m * x1), + b2 = y - (m2 * x), + // y1 = m.x1 + b and y1 = m2.x1 + b2 + // so m.x1 + b = m2.x1 + b2 + // x1(m - m2) = b2 - b + // x1 = (b2 - b) / (m - m2) + _x1 = (b2 - b) / (m - m2), + _y1 = (m * _x1) + b; + + out.x = within(x1, x2, _x1) ? _x1 : closest(x1, x2, _x1);//_x1; + out.y = within(y1, y2, _y1) ? _y1 : closest(y1, y2, _y1);//_y1; + } + + var fractionInSegment = _jg.lineLength([ out.x, out.y ], [ x1, y1 ]); + out.d = _jg.lineLength([x, y], [out.x, out.y]); + out.l = fractionInSegment / length; + return out; + }; + }, + + /* + Arc Segment. You need to supply: + + r - radius + cx - center x for the arc + cy - center y for the arc + ac - whether the arc is anticlockwise or not. default is clockwise. + + and then either: + + startAngle - startAngle for the arc. + endAngle - endAngle for the arc. + + or: + + x1 - x for start point + y1 - y for start point + x2 - x for end point + y2 - y for end point + + */ + Arc: function (params) { + var _super = _jp.Segments.AbstractSegment.apply(this, arguments), + _calcAngle = function (_x, _y) { + return _jg.theta([params.cx, params.cy], [_x, _y]); + }, + _calcAngleForLocation = function (segment, location) { + if (segment.anticlockwise) { + var sa = segment.startAngle < segment.endAngle ? segment.startAngle + TWO_PI : segment.startAngle, + s = Math.abs(sa - segment.endAngle); + return sa - (s * location); + } + else { + var ea = segment.endAngle < segment.startAngle ? segment.endAngle + TWO_PI : segment.endAngle, + ss = Math.abs(ea - segment.startAngle); + + return segment.startAngle + (ss * location); + } + }, + TWO_PI = 2 * Math.PI; + + this.radius = params.r; + this.anticlockwise = params.ac; + this.type = "Arc"; + + if (params.startAngle && params.endAngle) { + this.startAngle = params.startAngle; + this.endAngle = params.endAngle; + this.x1 = params.cx + (this.radius * Math.cos(params.startAngle)); + this.y1 = params.cy + (this.radius * Math.sin(params.startAngle)); + this.x2 = params.cx + (this.radius * Math.cos(params.endAngle)); + this.y2 = params.cy + (this.radius * Math.sin(params.endAngle)); + } + else { + this.startAngle = _calcAngle(params.x1, params.y1); + this.endAngle = _calcAngle(params.x2, params.y2); + this.x1 = params.x1; + this.y1 = params.y1; + this.x2 = params.x2; + this.y2 = params.y2; + } + + if (this.endAngle < 0) this.endAngle += TWO_PI; + if (this.startAngle < 0) this.startAngle += TWO_PI; + + // segment is used by vml + //this.segment = _jg.quadrant([this.x1, this.y1], [this.x2, this.y2]); + + // we now have startAngle and endAngle as positive numbers, meaning the + // absolute difference (|d|) between them is the sweep (s) of this arc, unless the + // arc is 'anticlockwise' in which case 's' is given by 2PI - |d|. + + var ea = this.endAngle < this.startAngle ? this.endAngle + TWO_PI : this.endAngle; + this.sweep = Math.abs(ea - this.startAngle); + if (this.anticlockwise) this.sweep = TWO_PI - this.sweep; + var circumference = 2 * Math.PI * this.radius, + frac = this.sweep / TWO_PI, + length = circumference * frac; + + this.getLength = function () { + return length; + }; + + this.getBounds = function () { + return { + minX: params.cx - params.r, + maxX: params.cx + params.r, + minY: params.cy - params.r, + maxY: params.cy + params.r + }; + }; + + var VERY_SMALL_VALUE = 0.0000000001, + gentleRound = function (n) { + var f = Math.floor(n), r = Math.ceil(n); + if (n - f < VERY_SMALL_VALUE) + return f; + else if (r - n < VERY_SMALL_VALUE) + return r; + return n; + }; + + /** + * returns the point on the segment's path that is 'location' along the length of the path, where 'location' is a decimal from + * 0 to 1 inclusive. + */ + this.pointOnPath = function (location, absolute) { + + if (location === 0) { + return { x: this.x1, y: this.y1, theta: this.startAngle }; + } + else if (location == 1) { + return { x: this.x2, y: this.y2, theta: this.endAngle }; + } + + if (absolute) { + location = location / length; + } + + var angle = _calcAngleForLocation(this, location), + _x = params.cx + (params.r * Math.cos(angle)), + _y = params.cy + (params.r * Math.sin(angle)); + + return { x: gentleRound(_x), y: gentleRound(_y), theta: angle }; + }; + + /** + * returns the gradient of the segment at the given point. + */ + this.gradientAtPoint = function (location, absolute) { + var p = this.pointOnPath(location, absolute); + var m = _jg.normal([ params.cx, params.cy ], [p.x, p.y ]); + if (!this.anticlockwise && (m == Infinity || m == -Infinity)) m *= -1; + return m; + }; + + this.pointAlongPathFrom = function (location, distance, absolute) { + var p = this.pointOnPath(location, absolute), + arcSpan = distance / circumference * 2 * Math.PI, + dir = this.anticlockwise ? -1 : 1, + startAngle = p.theta + (dir * arcSpan), + startX = params.cx + (this.radius * Math.cos(startAngle)), + startY = params.cy + (this.radius * Math.sin(startAngle)); + + return {x: startX, y: startY}; + }; + }, + + Bezier: function (params) { + this.curve = [ + { x: params.x1, y: params.y1}, + { x: params.cp1x, y: params.cp1y }, + { x: params.cp2x, y: params.cp2y }, + { x: params.x2, y: params.y2 } + ]; + + var _super = _jp.Segments.AbstractSegment.apply(this, arguments); + // although this is not a strictly rigorous determination of bounds + // of a bezier curve, it works for the types of curves that this segment + // type produces. + this.bounds = { + minX: Math.min(params.x1, params.x2, params.cp1x, params.cp2x), + minY: Math.min(params.y1, params.y2, params.cp1y, params.cp2y), + maxX: Math.max(params.x1, params.x2, params.cp1x, params.cp2x), + maxY: Math.max(params.y1, params.y2, params.cp1y, params.cp2y) + }; + + this.type = "Bezier"; + + var _translateLocation = function (_curve, location, absolute) { + if (absolute) + location = root.jsBezier.locationAlongCurveFrom(_curve, location > 0 ? 0 : 1, location); + + return location; + }; + + /** + * returns the point on the segment's path that is 'location' along the length of the path, where 'location' is a decimal from + * 0 to 1 inclusive. + */ + this.pointOnPath = function (location, absolute) { + location = _translateLocation(this.curve, location, absolute); + return root.jsBezier.pointOnCurve(this.curve, location); + }; + + /** + * returns the gradient of the segment at the given point. + */ + this.gradientAtPoint = function (location, absolute) { + location = _translateLocation(this.curve, location, absolute); + return root.jsBezier.gradientAtPoint(this.curve, location); + }; + + this.pointAlongPathFrom = function (location, distance, absolute) { + location = _translateLocation(this.curve, location, absolute); + return root.jsBezier.pointAlongCurveFrom(this.curve, location, distance); + }; + + this.getLength = function () { + return root.jsBezier.getLength(this.curve); + }; + + this.getBounds = function () { + return this.bounds; + }; + } + }; + + /* + Class: AbstractComponent + Superclass for AbstractConnector and AbstractEndpoint. + */ + var AbstractComponent = function () { + this.resetBounds = function () { + this.bounds = { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity }; + }; + this.resetBounds(); + }; + + /* + * Class: AbstractConnector + * Superclass for all Connectors; here is where Segments are managed. This is exposed on jsPlumb just so it + * can be accessed from other files. You should not try to instantiate one of these directly. + * + * When this class is asked for a pointOnPath, or gradient etc, it must first figure out which segment to dispatch + * that request to. This is done by keeping track of the total connector length as segments are added, and also + * their cumulative ratios to the total length. Then when the right segment is found it is a simple case of dispatching + * the request to it (and adjusting 'location' so that it is relative to the beginning of that segment.) + */ + _jp.Connectors.AbstractConnector = function (params) { + + AbstractComponent.apply(this, arguments); + + var segments = [], + totalLength = 0, + segmentProportions = [], + segmentProportionalLengths = [], + stub = params.stub || 0, + sourceStub = _ju.isArray(stub) ? stub[0] : stub, + targetStub = _ju.isArray(stub) ? stub[1] : stub, + gap = params.gap || 0, + sourceGap = _ju.isArray(gap) ? gap[0] : gap, + targetGap = _ju.isArray(gap) ? gap[1] : gap, + userProvidedSegments = null, + edited = false, + paintInfo = null, + geometry = null, + editable = params.editable !== false && jsPlumb.ConnectorEditors != null && jsPlumb.ConnectorEditors[this.type] != null; + + var _setGeometry = this.setGeometry = function(g, internallyComputed) { + edited = (!internallyComputed); + geometry = g; + }; + var _getGeometry = this.getGeometry = function() { + return geometry; + }; + + this.hasBeenEdited = function() { return edited; }; + this.isEditing = function() { return this.editor != null && this.editor.isActive(); }; + this.setEditable = function(e) { + // if this connector has an editor already, or + // if an editor for this connector's type is available, or + // if the child declares an overrideSetEditable and it does not return false, editable is true. + if (e && jsPlumb.ConnectorEditors != null && jsPlumb.ConnectorEditors[this.type] != null && (this.overrideSetEditable == null || this.overrideSetEditable())) { + editable = e; + } else { + editable = false; + } + return editable; + }; + this.isEditable = function() { return editable; }; + + /** + * Function: findSegmentForPoint + * Returns the segment that is closest to the given [x,y], + * null if nothing found. This function returns a JS + * object with: + * + * d - distance from segment + * l - proportional location in segment + * x - x point on the segment + * y - y point on the segment + * s - the segment itself. + */ + this.findSegmentForPoint = function (x, y) { + var out = { d: Infinity, s: null, x: null, y: null, l: null }; + for (var i = 0; i < segments.length; i++) { + var _s = segments[i].findClosestPointOnPath(x, y); + if (_s.d < out.d) { + out.d = _s.d; + out.l = _s.l; + out.x = _s.x; + out.y = _s.y; + out.s = segments[i]; + out.x1 = _s.x1; + out.x2 = _s.x2; + out.y1 = _s.y1; + out.y2 = _s.y2; + out.index = i; + } + } + + return out; + }; + + var _updateSegmentProportions = function () { + var curLoc = 0; + for (var i = 0; i < segments.length; i++) { + var sl = segments[i].getLength(); + segmentProportionalLengths[i] = sl / totalLength; + segmentProportions[i] = [curLoc, (curLoc += (sl / totalLength)) ]; + } + }, + + /** + * returns [segment, proportion of travel in segment, segment index] for the segment + * that contains the point which is 'location' distance along the entire path, where + * 'location' is a decimal between 0 and 1 inclusive. in this connector type, paths + * are made up of a list of segments, each of which contributes some fraction to + * the total length. + * From 1.3.10 this also supports the 'absolute' property, which lets us specify a location + * as the absolute distance in pixels, rather than a proportion of the total path. + */ + _findSegmentForLocation = function (location, absolute) { + if (absolute) { + location = location > 0 ? location / totalLength : (totalLength + location) / totalLength; + } + var idx = segmentProportions.length - 1, inSegmentProportion = 1; + for (var i = 0; i < segmentProportions.length; i++) { + if (segmentProportions[i][1] >= location) { + idx = i; + // todo is this correct for all connector path types? + inSegmentProportion = location == 1 ? 1 : location === 0 ? 0 : (location - segmentProportions[i][0]) / segmentProportionalLengths[i]; + break; + } + } + return { segment: segments[idx], proportion: inSegmentProportion, index: idx }; + }, + _addSegment = function (conn, type, params) { + if (params.x1 == params.x2 && params.y1 == params.y2) return; + var s = new _jp.Segments[type](params); + segments.push(s); + totalLength += s.getLength(); + conn.updateBounds(s); + }, + _clearSegments = function () { + totalLength = segments.length = segmentProportions.length = segmentProportionalLengths.length = 0; + }; + + this.setSegments = function (_segs) { + userProvidedSegments = []; + totalLength = 0; + for (var i = 0; i < _segs.length; i++) { + userProvidedSegments.push(_segs[i]); + totalLength += _segs[i].getLength(); + } + }; + + this.getLength = function() { + return totalLength; + }; + + var _prepareCompute = function (params) { + this.lineWidth = params.lineWidth; + var segment = _jg.quadrant(params.sourcePos, params.targetPos), + swapX = params.targetPos[0] < params.sourcePos[0], + swapY = params.targetPos[1] < params.sourcePos[1], + lw = params.lineWidth || 1, + so = params.sourceEndpoint.anchor.getOrientation(params.sourceEndpoint), + to = params.targetEndpoint.anchor.getOrientation(params.targetEndpoint), + x = swapX ? params.targetPos[0] : params.sourcePos[0], + y = swapY ? params.targetPos[1] : params.sourcePos[1], + w = Math.abs(params.targetPos[0] - params.sourcePos[0]), + h = Math.abs(params.targetPos[1] - params.sourcePos[1]); + + // if either anchor does not have an orientation set, we derive one from their relative + // positions. we fix the axis to be the one in which the two elements are further apart, and + // point each anchor at the other element. this is also used when dragging a new connection. + if (so[0] === 0 && so[1] === 0 || to[0] === 0 && to[1] === 0) { + var index = w > h ? 0 : 1, oIndex = [1, 0][index]; + so = []; + to = []; + so[index] = params.sourcePos[index] > params.targetPos[index] ? -1 : 1; + to[index] = params.sourcePos[index] > params.targetPos[index] ? 1 : -1; + so[oIndex] = 0; + to[oIndex] = 0; + } + + var sx = swapX ? w + (sourceGap * so[0]) : sourceGap * so[0], + sy = swapY ? h + (sourceGap * so[1]) : sourceGap * so[1], + tx = swapX ? targetGap * to[0] : w + (targetGap * to[0]), + ty = swapY ? targetGap * to[1] : h + (targetGap * to[1]), + oProduct = ((so[0] * to[0]) + (so[1] * to[1])); + + var result = { + sx: sx, sy: sy, tx: tx, ty: ty, lw: lw, + xSpan: Math.abs(tx - sx), + ySpan: Math.abs(ty - sy), + mx: (sx + tx) / 2, + my: (sy + ty) / 2, + so: so, to: to, x: x, y: y, w: w, h: h, + segment: segment, + startStubX: sx + (so[0] * sourceStub), + startStubY: sy + (so[1] * sourceStub), + endStubX: tx + (to[0] * targetStub), + endStubY: ty + (to[1] * targetStub), + isXGreaterThanStubTimes2: Math.abs(sx - tx) > (sourceStub + targetStub), + isYGreaterThanStubTimes2: Math.abs(sy - ty) > (sourceStub + targetStub), + opposite: oProduct == -1, + perpendicular: oProduct === 0, + orthogonal: oProduct == 1, + sourceAxis: so[0] === 0 ? "y" : "x", + points: [x, y, w, h, sx, sy, tx, ty ] + }; + result.anchorOrientation = result.opposite ? "opposite" : result.orthogonal ? "orthogonal" : "perpendicular"; + return result; + }; + + this.getSegments = function () { + return segments; + }; + + this.updateBounds = function (segment) { + var segBounds = segment.getBounds(); + this.bounds.minX = Math.min(this.bounds.minX, segBounds.minX); + this.bounds.maxX = Math.max(this.bounds.maxX, segBounds.maxX); + this.bounds.minY = Math.min(this.bounds.minY, segBounds.minY); + this.bounds.maxY = Math.max(this.bounds.maxY, segBounds.maxY); + }; + + var dumpSegmentsToConsole = function () { + console.log("SEGMENTS:"); + for (var i = 0; i < segments.length; i++) { + console.log(segments[i].type, segments[i].getLength(), segmentProportions[i]); + } + }; + + this.pointOnPath = function (location, absolute) { + var seg = _findSegmentForLocation(location, absolute); + return seg.segment && seg.segment.pointOnPath(seg.proportion, false) || [0, 0]; + }; + + this.gradientAtPoint = function (location, absolute) { + var seg = _findSegmentForLocation(location, absolute); + return seg.segment && seg.segment.gradientAtPoint(seg.proportion, false) || 0; + }; + + this.pointAlongPathFrom = function (location, distance, absolute) { + var seg = _findSegmentForLocation(location, absolute); + // TODO what happens if this crosses to the next segment? + return seg.segment && seg.segment.pointAlongPathFrom(seg.proportion, distance, false) || [0, 0]; + }; + + this.compute = function (params) { + paintInfo = _prepareCompute.call(this, params); + + _clearSegments(); + this._compute(paintInfo, params); + this.x = paintInfo.points[0]; + this.y = paintInfo.points[1]; + this.w = paintInfo.points[2]; + this.h = paintInfo.points[3]; + this.segment = paintInfo.segment; + _updateSegmentProportions(); + }; + + return { + addSegment: _addSegment, + prepareCompute: _prepareCompute, + sourceStub: sourceStub, + targetStub: targetStub, + maxStub: Math.max(sourceStub, targetStub), + sourceGap: sourceGap, + targetGap: targetGap, + maxGap: Math.max(sourceGap, targetGap), + setGeometry:_setGeometry, + getGeometry:_getGeometry + }; + }; + _ju.extend(_jp.Connectors.AbstractConnector, AbstractComponent); + + /** + * Class: Connectors.Straight + * The Straight connector draws a simple straight line between the two anchor points. It does not have any constructor parameters. + */ + var Straight = _jp.Connectors.Straight = function () { + this.type = "Straight"; + var _super = _jp.Connectors.AbstractConnector.apply(this, arguments); + + this._compute = function (paintInfo, _) { + _super.addSegment(this, "Straight", {x1: paintInfo.sx, y1: paintInfo.sy, x2: paintInfo.startStubX, y2: paintInfo.startStubY}); + _super.addSegment(this, "Straight", {x1: paintInfo.startStubX, y1: paintInfo.startStubY, x2: paintInfo.endStubX, y2: paintInfo.endStubY}); + _super.addSegment(this, "Straight", {x1: paintInfo.endStubX, y1: paintInfo.endStubY, x2: paintInfo.tx, y2: paintInfo.ty}); + }; + }; + _ju.extend(_jp.Connectors.Straight, _jp.Connectors.AbstractConnector); + _jp.registerConnectorType(Straight, "Straight"); + + + // ********************************* END OF CONNECTOR TYPES ******************************************************************* + + // ********************************* ENDPOINT TYPES ******************************************************************* + + _jp.Endpoints.AbstractEndpoint = function (params) { + AbstractComponent.apply(this, arguments); + var compute = this.compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + var out = this._compute.apply(this, arguments); + this.x = out[0]; + this.y = out[1]; + this.w = out[2]; + this.h = out[3]; + this.bounds.minX = this.x; + this.bounds.minY = this.y; + this.bounds.maxX = this.x + this.w; + this.bounds.maxY = this.y + this.h; + return out; + }; + return { + compute: compute, + cssClass: params.cssClass + }; + }; + _ju.extend(_jp.Endpoints.AbstractEndpoint, AbstractComponent); + + /** + * Class: Endpoints.Dot + * A round endpoint, with default radius 10 pixels. + */ + + /** + * Function: Constructor + * + * Parameters: + * + * radius - radius of the endpoint. defaults to 10 pixels. + */ + _jp.Endpoints.Dot = function (params) { + this.type = "Dot"; + var _super = _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + params = params || {}; + this.radius = params.radius || 10; + this.defaultOffset = 0.5 * this.radius; + this.defaultInnerRadius = this.radius / 3; + + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + this.radius = endpointStyle.radius || this.radius; + var x = anchorPoint[0] - this.radius, + y = anchorPoint[1] - this.radius, + w = this.radius * 2, + h = this.radius * 2; + + if (endpointStyle.strokeStyle) { + var lw = endpointStyle.lineWidth || 1; + x -= lw; + y -= lw; + w += (lw * 2); + h += (lw * 2); + } + return [ x, y, w, h, this.radius ]; + }; + }; + _ju.extend(_jp.Endpoints.Dot, _jp.Endpoints.AbstractEndpoint); + + _jp.Endpoints.Rectangle = function (params) { + this.type = "Rectangle"; + var _super = _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + params = params || {}; + this.width = params.width || 20; + this.height = params.height || 20; + + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + var width = endpointStyle.width || this.width, + height = endpointStyle.height || this.height, + x = anchorPoint[0] - (width / 2), + y = anchorPoint[1] - (height / 2); + + return [ x, y, width, height]; + }; + }; + _ju.extend(_jp.Endpoints.Rectangle, _jp.Endpoints.AbstractEndpoint); + + var DOMElementEndpoint = function (params) { + _jp.jsPlumbUIComponent.apply(this, arguments); + this._jsPlumb.displayElements = []; + }; + _ju.extend(DOMElementEndpoint, _jp.jsPlumbUIComponent, { + getDisplayElements: function () { + return this._jsPlumb.displayElements; + }, + appendDisplayElement: function (el) { + this._jsPlumb.displayElements.push(el); + } + }); + + /** + * Class: Endpoints.Image + * Draws an image as the Endpoint. + */ + /** + * Function: Constructor + * + * Parameters: + * + * src - location of the image to use. + + TODO: multiple references to self. not sure quite how to get rid of them entirely. perhaps self = null in the cleanup + function will suffice + + TODO this class still might leak memory. + + */ + _jp.Endpoints.Image = function (params) { + + this.type = "Image"; + DOMElementEndpoint.apply(this, arguments); + _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + + var _onload = params.onload, + src = params.src || params.url, + clazz = params.cssClass ? " " + params.cssClass : ""; + + this._jsPlumb.img = new Image(); + this._jsPlumb.ready = false; + this._jsPlumb.initialized = false; + this._jsPlumb.deleted = false; + this._jsPlumb.widthToUse = params.width; + this._jsPlumb.heightToUse = params.height; + this._jsPlumb.endpoint = params.endpoint; + + this._jsPlumb.img.onload = function () { + if (this._jsPlumb != null) { + this._jsPlumb.ready = true; + this._jsPlumb.widthToUse = this._jsPlumb.widthToUse || this._jsPlumb.img.width; + this._jsPlumb.heightToUse = this._jsPlumb.heightToUse || this._jsPlumb.img.height; + if (_onload) { + _onload(this); + } + } + }.bind(this); + + /* + Function: setImage + Sets the Image to use in this Endpoint. + + Parameters: + img - may be a URL or an Image object + onload - optional; a callback to execute once the image has loaded. + */ + this._jsPlumb.endpoint.setImage = function (_img, onload) { + var s = _img.constructor == String ? _img : _img.src; + _onload = onload; + this._jsPlumb.img.src = s; + + if (this.canvas != null) + this.canvas.setAttribute("src", this._jsPlumb.img.src); + }.bind(this); + + this._jsPlumb.endpoint.setImage(src, _onload); + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + this.anchorPoint = anchorPoint; + if (this._jsPlumb.ready) return [anchorPoint[0] - this._jsPlumb.widthToUse / 2, anchorPoint[1] - this._jsPlumb.heightToUse / 2, + this._jsPlumb.widthToUse, this._jsPlumb.heightToUse]; + else return [0, 0, 0, 0]; + }; + + this.canvas = jsPlumb.createElement("img", { + position:"absolute", + margin:0, + padding:0, + outline:0 + }, this._jsPlumb.instance.endpointClass + clazz); + + if (this._jsPlumb.widthToUse) this.canvas.setAttribute("width", this._jsPlumb.widthToUse); + if (this._jsPlumb.heightToUse) this.canvas.setAttribute("height", this._jsPlumb.heightToUse); + this._jsPlumb.instance.appendElement(this.canvas); + + this.actuallyPaint = function (d, style, anchor) { + if (!this._jsPlumb.deleted) { + if (!this._jsPlumb.initialized) { + this.canvas.setAttribute("src", this._jsPlumb.img.src); + this.appendDisplayElement(this.canvas); + this._jsPlumb.initialized = true; + } + var x = this.anchorPoint[0] - (this._jsPlumb.widthToUse / 2), + y = this.anchorPoint[1] - (this._jsPlumb.heightToUse / 2); + _ju.sizeElement(this.canvas, x, y, this._jsPlumb.widthToUse, this._jsPlumb.heightToUse); + } + }; + + this.paint = function (style, anchor) { + if (this._jsPlumb != null) { // may have been deleted + if (this._jsPlumb.ready) { + this.actuallyPaint(style, anchor); + } + else { + root.setTimeout(function () { + this.paint(style, anchor); + }.bind(this), 200); + } + } + }; + }; + _ju.extend(_jp.Endpoints.Image, [ DOMElementEndpoint, _jp.Endpoints.AbstractEndpoint ], { + cleanup: function (force) { + if (force) { + this._jsPlumb.deleted = true; + if (this.canvas) this.canvas.parentNode.removeChild(this.canvas); + this.canvas = null; + } + } + }); + + /* + * Class: Endpoints.Blank + * An Endpoint that paints nothing (visible) on the screen. Supports cssClass and hoverClass parameters like all Endpoints. + */ + _jp.Endpoints.Blank = function (params) { + var _super = _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + this.type = "Blank"; + DOMElementEndpoint.apply(this, arguments); + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + return [anchorPoint[0], anchorPoint[1], 10, 0]; + }; + + var clazz = params.cssClass ? " " + params.cssClass : ""; + + this.canvas = jsPlumb.createElement("div", { + display: "block", + width: "1px", + height: "1px", + background: "transparent", + position: "absolute" + }, this._jsPlumb.instance.endpointClass + clazz); + + this._jsPlumb.instance.appendElement(this.canvas); + + this.paint = function (style, anchor) { + _ju.sizeElement(this.canvas, this.x, this.y, this.w, this.h); + }; + }; + _ju.extend(_jp.Endpoints.Blank, [_jp.Endpoints.AbstractEndpoint, DOMElementEndpoint], { + cleanup: function () { + if (this.canvas && this.canvas.parentNode) { + this.canvas.parentNode.removeChild(this.canvas); + } + } + }); + + /* + * Class: Endpoints.Triangle + * A triangular Endpoint. + */ + /* + * Function: Constructor + * + * Parameters: + * + * width - width of the triangle's base. defaults to 55 pixels. + * height - height of the triangle from base to apex. defaults to 55 pixels. + */ + _jp.Endpoints.Triangle = function (params) { + this.type = "Triangle"; + _jp.Endpoints.AbstractEndpoint.apply(this, arguments); + params = params || { }; + params.width = params.width || 55; + params.height = params.height || 55; + this.width = params.width; + this.height = params.height; + this._compute = function (anchorPoint, orientation, endpointStyle, connectorPaintStyle) { + var width = endpointStyle.width || self.width, + height = endpointStyle.height || self.height, + x = anchorPoint[0] - (width / 2), + y = anchorPoint[1] - (height / 2); + return [ x, y, width, height ]; + }; + }; +// ********************************* END OF ENDPOINT TYPES ******************************************************************* + + +// ********************************* OVERLAY DEFINITIONS *********************************************************************** + + var AbstractOverlay = _jp.Overlays.AbstractOverlay = function (params) { + this.visible = true; + this.isAppendedAtTopLevel = true; + this.component = params.component; + this.loc = params.location == null ? 0.5 : params.location; + this.endpointLoc = params.endpointLocation == null ? [ 0.5, 0.5] : params.endpointLocation; + this.visible = params.visible !== false; + }; + AbstractOverlay.prototype = { + cleanup: function (force) { + if (force) { + this.component = null; + this.canvas = null; + this.endpointLoc = null; + } + }, + reattach:function(instance) { + + }, + setVisible: function (val) { + this.visible = val; + this.component.repaint(); + }, + isVisible: function () { + return this.visible; + }, + hide: function () { + this.setVisible(false); + }, + show: function () { + this.setVisible(true); + }, + incrementLocation: function (amount) { + this.loc += amount; + this.component.repaint(); + }, + setLocation: function (l) { + this.loc = l; + this.component.repaint(); + }, + getLocation: function () { + return this.loc; + }, + updateFrom:function() { } + }; + + + /* + * Class: Overlays.Arrow + * + * An arrow overlay, defined by four points: the head, the two sides of the tail, and a 'foldback' point at some distance along the length + * of the arrow that lines from each tail point converge into. The foldback point is defined using a decimal that indicates some fraction + * of the length of the arrow and has a default value of 0.623. A foldback point value of 1 would mean that the arrow had a straight line + * across the tail. + */ + /* + * Function: Constructor + * + * Parameters: + * + * length - distance in pixels from head to tail baseline. default 20. + * width - width in pixels of the tail baseline. default 20. + * fillStyle - style to use when filling the arrow. defaults to "black". + * strokeStyle - style to use when stroking the arrow. defaults to null, which means the arrow is not stroked. + * lineWidth - line width to use when stroking the arrow. defaults to 1, but only used if strokeStyle is not null. + * foldback - distance (as a decimal from 0 to 1 inclusive) along the length of the arrow marking the point the tail points should fold back to. defaults to 0.623. + * location - distance (as a decimal from 0 to 1 inclusive) marking where the arrow should sit on the connector. defaults to 0.5. + * direction - indicates the direction the arrow points in. valid values are -1 and 1; 1 is default. + */ + _jp.Overlays.Arrow = function (params) { + this.type = "Arrow"; + AbstractOverlay.apply(this, arguments); + this.isAppendedAtTopLevel = false; + params = params || {}; + + this.length = params.length || 20; + this.width = params.width || 20; + this.id = params.id; + var direction = (params.direction || 1) < 0 ? -1 : 1, + paintStyle = params.paintStyle || { lineWidth: 1 }, + // how far along the arrow the lines folding back in come to. default is 62.3%. + foldback = params.foldback || 0.623; + + this.computeMaxSize = function () { + return self.width * 1.5; + }; + + this.elementCreated = function(p, component) { + this.path = p; + if (params.events) { + for (var i in params.events) { + jsPlumb.on(p, i, params.events[i]); + } + } + }; + + this.draw = function (component, currentConnectionPaintStyle) { + + var hxy, mid, txy, tail, cxy; + if (component.pointAlongPathFrom) { + + if (_ju.isString(this.loc) || this.loc > 1 || this.loc < 0) { + var l = parseInt(this.loc, 10), + fromLoc = this.loc < 0 ? 1 : 0; + hxy = component.pointAlongPathFrom(fromLoc, l, false); + mid = component.pointAlongPathFrom(fromLoc, l - (direction * this.length / 2), false); + txy = _jg.pointOnLine(hxy, mid, this.length); + } + else if (this.loc == 1) { + hxy = component.pointOnPath(this.loc); + mid = component.pointAlongPathFrom(this.loc, -(this.length)); + txy = _jg.pointOnLine(hxy, mid, this.length); + + if (direction == -1) { + var _ = txy; + txy = hxy; + hxy = _; + } + } + else if (this.loc === 0) { + txy = component.pointOnPath(this.loc); + mid = component.pointAlongPathFrom(this.loc, this.length); + hxy = _jg.pointOnLine(txy, mid, this.length); + if (direction == -1) { + var __ = txy; + txy = hxy; + hxy = __; + } + } + else { + hxy = component.pointAlongPathFrom(this.loc, direction * this.length / 2); + mid = component.pointOnPath(this.loc); + txy = _jg.pointOnLine(hxy, mid, this.length); + } + + tail = _jg.perpendicularLineTo(hxy, txy, this.width); + cxy = _jg.pointOnLine(hxy, txy, foldback * this.length); + + var d = { hxy: hxy, tail: tail, cxy: cxy }, + strokeStyle = paintStyle.strokeStyle || currentConnectionPaintStyle.strokeStyle, + fillStyle = paintStyle.fillStyle || currentConnectionPaintStyle.strokeStyle, + lineWidth = paintStyle.lineWidth || currentConnectionPaintStyle.lineWidth; + + return { + component: component, + d: d, + lineWidth: lineWidth, + strokeStyle: strokeStyle, + fillStyle: fillStyle, + minX: Math.min(hxy.x, tail[0].x, tail[1].x), + maxX: Math.max(hxy.x, tail[0].x, tail[1].x), + minY: Math.min(hxy.y, tail[0].y, tail[1].y), + maxY: Math.max(hxy.y, tail[0].y, tail[1].y) + }; + } + else return {component: component, minX: 0, maxX: 0, minY: 0, maxY: 0}; + }; + }; + _ju.extend(_jp.Overlays.Arrow, AbstractOverlay, { + updateFrom:function(d) { + this.length = d.length || this.length; + this.width = d.width|| this.width; + this.direction = d.direction != null ? d.direction : this.direction; + this.foldback = d.foldback|| this.foldback; + } + }); + + /* + * Class: Overlays.PlainArrow + * + * A basic arrow. This is in fact just one instance of the more generic case in which the tail folds back on itself to some + * point along the length of the arrow: in this case, that foldback point is the full length of the arrow. so it just does + * a 'call' to Arrow with foldback set appropriately. + */ + /* + * Function: Constructor + * See <Overlays.Arrow> for allowed parameters for this overlay. + */ + _jp.Overlays.PlainArrow = function (params) { + params = params || {}; + var p = _jp.extend(params, {foldback: 1}); + _jp.Overlays.Arrow.call(this, p); + this.type = "PlainArrow"; + }; + _ju.extend(_jp.Overlays.PlainArrow, _jp.Overlays.Arrow); + + /* + * Class: Overlays.Diamond + * + * A diamond. Like PlainArrow, this is a concrete case of the more generic case of the tail points converging on some point...it just + * happens that in this case, that point is greater than the length of the the arrow. + * + * this could probably do with some help with positioning...due to the way it reuses the Arrow paint code, what Arrow thinks is the + * center is actually 1/4 of the way along for this guy. but we don't have any knowledge of pixels at this point, so we're kind of + * stuck when it comes to helping out the Arrow class. possibly we could pass in a 'transpose' parameter or something. the value + * would be -l/4 in this case - move along one quarter of the total length. + */ + /* + * Function: Constructor + * See <Overlays.Arrow> for allowed parameters for this overlay. + */ + _jp.Overlays.Diamond = function (params) { + params = params || {}; + var l = params.length || 40, + p = jsPlumb.extend(params, {length: l / 2, foldback: 2}); + _jp.Overlays.Arrow.call(this, p); + this.type = "Diamond"; + }; + _ju.extend(_jp.Overlays.Diamond, _jp.Overlays.Arrow); + + var _getDimensions = function (component, forceRefresh) { + if (component._jsPlumb.cachedDimensions == null || forceRefresh) + component._jsPlumb.cachedDimensions = component.getDimensions(); + return component._jsPlumb.cachedDimensions; + }; + + // abstract superclass for overlays that add an element to the DOM. + var AbstractDOMOverlay = function (params) { + _jp.jsPlumbUIComponent.apply(this, arguments); + AbstractOverlay.apply(this, arguments); + + // hand off fired events to associated component. + var _f = this.fire; + this.fire = function () { + _f.apply(this, arguments); + if (this.component) this.component.fire.apply(this.component, arguments); + }; + + this.detached=false; + this.id = params.id; + this._jsPlumb.div = null; + this._jsPlumb.initialised = false; + this._jsPlumb.component = params.component; + this._jsPlumb.cachedDimensions = null; + this._jsPlumb.create = params.create; + this._jsPlumb.initiallyInvisible = params.visible === false; + + this.getElement = function () { + if (this._jsPlumb.div == null) { + var div = this._jsPlumb.div = jsPlumb.getElement(this._jsPlumb.create(this._jsPlumb.component)); + div.style.position = "absolute"; + div.className = this._jsPlumb.instance.overlayClass + " " + + (this.cssClass ? this.cssClass : + params.cssClass ? params.cssClass : ""); + this._jsPlumb.instance.appendElement(div); + this._jsPlumb.instance.getId(div); + this.canvas = div; + + // in IE the top left corner is what it placed at the desired location. This will not + // be fixed. IE8 is not going to be supported for much longer. + var ts = "translate(-50%, -50%)"; + div.style.webkitTransform = ts; + div.style.mozTransform = ts; + div.style.msTransform = ts; + div.style.oTransform = ts; + div.style.transform = ts; + + // write the related component into the created element + div._jsPlumb = this; + + if (params.visible === false) + div.style.display = "none"; + } + return this._jsPlumb.div; + }; + + this.draw = function (component, currentConnectionPaintStyle, absolutePosition) { + var td = _getDimensions(this); + if (td != null && td.length == 2) { + var cxy = { x: 0, y: 0 }; + + // absolutePosition would have been set by a call to connection.setAbsoluteOverlayPosition. + if (absolutePosition) { + cxy = { x: absolutePosition[0], y: absolutePosition[1] }; + } + else if (component.pointOnPath) { + var loc = this.loc, absolute = false; + if (_ju.isString(this.loc) || this.loc < 0 || this.loc > 1) { + loc = parseInt(this.loc, 10); + absolute = true; + } + cxy = component.pointOnPath(loc, absolute); // a connection + } + else { + var locToUse = this.loc.constructor == Array ? this.loc : this.endpointLoc; + cxy = { x: locToUse[0] * component.w, + y: locToUse[1] * component.h }; + } + + var minx = cxy.x - (td[0] / 2), + miny = cxy.y - (td[1] / 2); + + return { + component: component, + d: { minx: minx, miny: miny, td: td, cxy: cxy }, + minX: minx, + maxX: minx + td[0], + minY: miny, + maxY: miny + td[1] + }; + } + else return {minX: 0, maxX: 0, minY: 0, maxY: 0}; + }; + }; + _ju.extend(AbstractDOMOverlay, [_jp.jsPlumbUIComponent, AbstractOverlay], { + getDimensions: function () { + return [1,1]; + }, + setVisible: function (state) { + if (this._jsPlumb.div) { + this._jsPlumb.div.style.display = state ? "block" : "none"; + // if initially invisible, dimensions are 0,0 and never get updated + if (state && this._jsPlumb.initiallyInvisible) { + _getDimensions(this, true); + this.component.repaint(); + this._jsPlumb.initiallyInvisible = false; + } + } + }, + /* + * Function: clearCachedDimensions + * Clears the cached dimensions for the label. As a performance enhancement, label dimensions are + * cached from 1.3.12 onwards. The cache is cleared when you change the label text, of course, but + * there are other reasons why the text dimensions might change - if you make a change through CSS, for + * example, you might change the font size. in that case you should explicitly call this method. + */ + clearCachedDimensions: function () { + this._jsPlumb.cachedDimensions = null; + }, + cleanup: function (force) { + if (force) { + if (this._jsPlumb.div != null) { + this._jsPlumb.div._jsPlumb = null; + this._jsPlumb.instance.removeElement(this._jsPlumb.div); + } + } + else { + // if not a forced cleanup, just detach child from parent for now. + if (this._jsPlumb && this._jsPlumb.div && this._jsPlumb.div.parentNode) + this._jsPlumb.div.parentNode.removeChild(this._jsPlumb.div); + this.detached = true; + } + + }, + reattach:function(instance) { + if (this._jsPlumb.div != null) instance.getContainer().appendChild(this._jsPlumb.div); + this.detached = false; + }, + computeMaxSize: function () { + var td = _getDimensions(this); + return Math.max(td[0], td[1]); + }, + paint: function (p, containerExtents) { + if (!this._jsPlumb.initialised) { + this.getElement(); + p.component.appendDisplayElement(this._jsPlumb.div); + this._jsPlumb.initialised = true; + if (this.detached) this._jsPlumb.div.parentNode.removeChild(this._jsPlumb.div); + } + this._jsPlumb.div.style.left = (p.component.x + p.d.minx) + "px"; + this._jsPlumb.div.style.top = (p.component.y + p.d.miny) + "px"; + } + }); + + /* + * Class: Overlays.Custom + * A Custom overlay. You supply a 'create' function which returns some DOM element, and jsPlumb positions it. + * The 'create' function is passed a Connection or Endpoint. + */ + /* + * Function: Constructor + * + * Parameters: + * create - function for jsPlumb to call that returns a DOM element. + * location - distance (as a decimal from 0 to 1 inclusive) marking where the label should sit on the connector. defaults to 0.5. + * id - optional id to use for later retrieval of this overlay. + * + */ + _jp.Overlays.Custom = function (params) { + this.type = "Custom"; + AbstractDOMOverlay.apply(this, arguments); + }; + _ju.extend(_jp.Overlays.Custom, AbstractDOMOverlay); + + _jp.Overlays.GuideLines = function () { + var self = this; + self.length = 50; + self.lineWidth = 5; + this.type = "GuideLines"; + AbstractOverlay.apply(this, arguments); + _jp.jsPlumbUIComponent.apply(this, arguments); + this.draw = function (connector, currentConnectionPaintStyle) { + + var head = connector.pointAlongPathFrom(self.loc, self.length / 2), + mid = connector.pointOnPath(self.loc), + tail = _jg.pointOnLine(head, mid, self.length), + tailLine = _jg.perpendicularLineTo(head, tail, 40), + headLine = _jg.perpendicularLineTo(tail, head, 20); + + return { + connector: connector, + head: head, + tail: tail, + headLine: headLine, + tailLine: tailLine, + minX: Math.min(head.x, tail.x, headLine[0].x, headLine[1].x), + minY: Math.min(head.y, tail.y, headLine[0].y, headLine[1].y), + maxX: Math.max(head.x, tail.x, headLine[0].x, headLine[1].x), + maxY: Math.max(head.y, tail.y, headLine[0].y, headLine[1].y) + }; + }; + + // this.cleanup = function() { }; // nothing to clean up for GuideLines + }; + + /* + * Class: Overlays.Label + + */ + /* + * Function: Constructor + * + * Parameters: + * cssClass - optional css class string to append to css class. This string is appended "as-is", so you can of course have multiple classes + * defined. This parameter is preferred to using labelStyle, borderWidth and borderStyle. + * label - the label to paint. May be a string or a function that returns a string. Nothing will be painted if your label is null or your + * label function returns null. empty strings _will_ be painted. + * location - distance (as a decimal from 0 to 1 inclusive) marking where the label should sit on the connector. defaults to 0.5. + * id - optional id to use for later retrieval of this overlay. + * + * + */ + _jp.Overlays.Label = function (params) { + this.labelStyle = params.labelStyle; + + var labelWidth = null, labelHeight = null, labelText = null, labelPadding = null; + this.cssClass = this.labelStyle != null ? this.labelStyle.cssClass : null; + var p = _jp.extend({ + create: function () { + return jsPlumb.createElement("div"); + }}, params); + _jp.Overlays.Custom.call(this, p); + this.type = "Label"; + this.label = params.label || ""; + this.labelText = null; + if (this.labelStyle) { + var el = this.getElement(); + this.labelStyle.font = this.labelStyle.font || "12px sans-serif"; + el.style.font = this.labelStyle.font; + el.style.color = this.labelStyle.color || "black"; + if (this.labelStyle.fillStyle) el.style.background = this.labelStyle.fillStyle; + if (this.labelStyle.borderWidth > 0) { + var dStyle = this.labelStyle.borderStyle ? this.labelStyle.borderStyle : "black"; + el.style.border = this.labelStyle.borderWidth + "px solid " + dStyle; + } + if (this.labelStyle.padding) el.style.padding = this.labelStyle.padding; + } + + }; + _ju.extend(_jp.Overlays.Label, _jp.Overlays.Custom, { + cleanup: function (force) { + if (force) { + this.div = null; + this.label = null; + this.labelText = null; + this.cssClass = null; + this.labelStyle = null; + } + }, + getLabel: function () { + return this.label; + }, + /* + * Function: setLabel + * sets the label's, um, label. you would think i'd call this function + * 'setText', but you can pass either a Function or a String to this, so + * it makes more sense as 'setLabel'. This uses innerHTML on the label div, so keep + * that in mind if you need escaped HTML. + */ + setLabel: function (l) { + this.label = l; + this.labelText = null; + this.clearCachedDimensions(); + this.update(); + this.component.repaint(); + }, + getDimensions: function () { + this.update(); + return AbstractDOMOverlay.prototype.getDimensions.apply(this, arguments); + }, + update: function () { + if (typeof this.label == "function") { + var lt = this.label(this); + this.getElement().innerHTML = lt.replace(/\r\n/g, "<br/>"); + } + else { + if (this.labelText == null) { + this.labelText = this.label; + this.getElement().innerHTML = this.labelText.replace(/\r\n/g, "<br/>"); + } + } + }, + updateFrom:function(d) { + if(d.label) this.setLabel(d.label); + } + }); + + // ********************************* END OF OVERLAY DEFINITIONS *********************************************************************** + +}).call(this); + +/* + * jsPlumb + * + * Title:jsPlumb 2.0.2 + * + * Provides a way to visually connect elements on an HTML page, using SVG. + * + * This file contains the base class for library adapters. + * + * Copyright (c) 2010 - 2015 jsPlumb (hello@jsplumbtoolkit.com) + * + * http://jsplumbtoolkit.com + * http://github.com/sporritt/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +;(function() { + "use strict"; + var root = this, + _jp = root.jsPlumb; + + var _getEventManager = function(instance) { + var e = instance._mottle; + if (!e) { + e = instance._mottle = new root.Mottle(); + } + return e; + }; + + _jp.extend(root.jsPlumbInstance.prototype, { + getEventManager:function() { + return _getEventManager(this); + }, + on : function(el, event, callback) { + // TODO: here we would like to map the tap event if we know its + // an internal bind to a click. we have to know its internal because only + // then can we be sure that the UP event wont be consumed (tap is a synthesized + // event from a mousedown followed by a mouseup). + //event = { "click":"tap", "dblclick":"dbltap"}[event] || event; + this.getEventManager().on.apply(this, arguments); + return this; + }, + off : function(el, event, callback) { + this.getEventManager().off.apply(this, arguments); + return this; + } + }); + + +}).call(this); +/* + * jsPlumb + * + * Title:jsPlumb 2.0.2 + * + * Provides a way to visually connect elements on an HTML page, using SVG. + * + * This file contains the 'flowchart' connectors, consisting of vertical and horizontal line segments. + * + * Copyright (c) 2010 - 2015 jsPlumb (hello@jsplumbtoolkit.com) + * + * http://jsplumbtoolkit.com + * http://github.com/sporritt/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + var Flowchart = function (params) { + this.type = "Flowchart"; + params = params || {}; + params.stub = params.stub == null ? 30 : params.stub; + var segments, + _super = _jp.Connectors.AbstractConnector.apply(this, arguments), + midpoint = params.midpoint == null ? 0.5 : params.midpoint, + alwaysRespectStubs = params.alwaysRespectStubs === true, + lastx = null, lasty = null, lastOrientation, + cornerRadius = params.cornerRadius != null ? params.cornerRadius : 0, + + // TODO now common between this and AbstractBezierEditor; refactor into superclass? + loopbackRadius = params.loopbackRadius || 25, + isLoopbackCurrently = false, + + sgn = function (n) { + return n < 0 ? -1 : n === 0 ? 0 : 1; + }, + /** + * helper method to add a segment. + */ + addSegment = function (segments, x, y, paintInfo) { + if (lastx == x && lasty == y) return; + var lx = lastx == null ? paintInfo.sx : lastx, + ly = lasty == null ? paintInfo.sy : lasty, + o = lx == x ? "v" : "h", + sgnx = sgn(x - lx), + sgny = sgn(y - ly); + + lastx = x; + lasty = y; + segments.push([lx, ly, x, y, o, sgnx, sgny]); + }, + segLength = function (s) { + return Math.sqrt(Math.pow(s[0] - s[2], 2) + Math.pow(s[1] - s[3], 2)); + }, + _cloneArray = function (a) { + var _a = []; + _a.push.apply(_a, a); + return _a; + }, + writeSegments = function (conn, segments, paintInfo) { + var current = null, next; + for (var i = 0; i < segments.length - 1; i++) { + + current = current || _cloneArray(segments[i]); + next = _cloneArray(segments[i + 1]); + if (cornerRadius > 0 && current[4] != next[4]) { + var radiusToUse = Math.min(cornerRadius, segLength(current), segLength(next)); + // right angle. adjust current segment's end point, and next segment's start point. + current[2] -= current[5] * radiusToUse; + current[3] -= current[6] * radiusToUse; + next[0] += next[5] * radiusToUse; + next[1] += next[6] * radiusToUse; + var ac = (current[6] == next[5] && next[5] == 1) || + ((current[6] == next[5] && next[5] === 0) && current[5] != next[6]) || + (current[6] == next[5] && next[5] == -1), + sgny = next[1] > current[3] ? 1 : -1, + sgnx = next[0] > current[2] ? 1 : -1, + sgnEqual = sgny == sgnx, + cx = (sgnEqual && ac || (!sgnEqual && !ac)) ? next[0] : current[2], + cy = (sgnEqual && ac || (!sgnEqual && !ac)) ? current[3] : next[1]; + + _super.addSegment(conn, "Straight", { + x1: current[0], y1: current[1], x2: current[2], y2: current[3] + }); + + _super.addSegment(conn, "Arc", { + r: radiusToUse, + x1: current[2], + y1: current[3], + x2: next[0], + y2: next[1], + cx: cx, + cy: cy, + ac: ac + }); + } + else { + // dx + dy are used to adjust for line width. + var dx = (current[2] == current[0]) ? 0 : (current[2] > current[0]) ? (paintInfo.lw / 2) : -(paintInfo.lw / 2), + dy = (current[3] == current[1]) ? 0 : (current[3] > current[1]) ? (paintInfo.lw / 2) : -(paintInfo.lw / 2); + _super.addSegment(conn, "Straight", { + x1: current[0] - dx, y1: current[1] - dy, x2: current[2] + dx, y2: current[3] + dy + }); + } + current = next; + } + if (next != null) { + // last segment + _super.addSegment(conn, "Straight", { + x1: next[0], y1: next[1], x2: next[2], y2: next[3] + }); + } + }; + + this._compute = function (paintInfo, params) { + + segments = []; + lastx = null; + lasty = null; + lastOrientation = null; + + var commonStubCalculator = function () { + return [ paintInfo.startStubX, paintInfo.startStubY, paintInfo.endStubX, paintInfo.endStubY ]; + }, + stubCalculators = { + perpendicular: commonStubCalculator, + orthogonal: commonStubCalculator, + opposite: function (axis) { + var pi = paintInfo, + idx = axis == "x" ? 0 : 1, + areInProximity = { + "x": function () { + return ( (pi.so[idx] == 1 && ( + ( (pi.startStubX > pi.endStubX) && (pi.tx > pi.startStubX) ) || + ( (pi.sx > pi.endStubX) && (pi.tx > pi.sx))))) || + + ( (pi.so[idx] == -1 && ( + ( (pi.startStubX < pi.endStubX) && (pi.tx < pi.startStubX) ) || + ( (pi.sx < pi.endStubX) && (pi.tx < pi.sx))))); + }, + "y": function () { + return ( (pi.so[idx] == 1 && ( + ( (pi.startStubY > pi.endStubY) && (pi.ty > pi.startStubY) ) || + ( (pi.sy > pi.endStubY) && (pi.ty > pi.sy))))) || + + ( (pi.so[idx] == -1 && ( + ( (pi.startStubY < pi.endStubY) && (pi.ty < pi.startStubY) ) || + ( (pi.sy < pi.endStubY) && (pi.ty < pi.sy))))); + } + }; + + if (!alwaysRespectStubs && areInProximity[axis]()) { + return { + "x": [(paintInfo.sx + paintInfo.tx) / 2, paintInfo.startStubY, (paintInfo.sx + paintInfo.tx) / 2, paintInfo.endStubY], + "y": [paintInfo.startStubX, (paintInfo.sy + paintInfo.ty) / 2, paintInfo.endStubX, (paintInfo.sy + paintInfo.ty) / 2] + }[axis]; + } + else { + return [ paintInfo.startStubX, paintInfo.startStubY, paintInfo.endStubX, paintInfo.endStubY ]; + } + } + }; + + // calculate Stubs. + var stubs = stubCalculators[paintInfo.anchorOrientation](paintInfo.sourceAxis), + idx = paintInfo.sourceAxis == "x" ? 0 : 1, + oidx = paintInfo.sourceAxis == "x" ? 1 : 0, + ss = stubs[idx], + oss = stubs[oidx], + es = stubs[idx + 2], + oes = stubs[oidx + 2]; + + // add the start stub segment. use stubs for loopback as it will look better, with the loop spaced + // away from the element. + addSegment(segments, stubs[0], stubs[1], paintInfo); + + // if its a loopback and we should treat it differently. + if (false &¶ms.sourcePos[0] == params.targetPos[0] && params.sourcePos[1] == params.targetPos[1]) { + + // we use loopbackRadius here, as statemachine connectors do. + // so we go radius to the left from stubs[0], then upwards by 2*radius, to the right by 2*radius, + // down by 2*radius, left by radius. + addSegment(segments, stubs[0] - loopbackRadius, stubs[1], paintInfo); + addSegment(segments, stubs[0] - loopbackRadius, stubs[1] - (2 * loopbackRadius), paintInfo); + addSegment(segments, stubs[0] + loopbackRadius, stubs[1] - (2 * loopbackRadius), paintInfo); + addSegment(segments, stubs[0] + loopbackRadius, stubs[1], paintInfo); + addSegment(segments, stubs[0], stubs[1], paintInfo); + + } + else { + + + var midx = paintInfo.startStubX + ((paintInfo.endStubX - paintInfo.startStubX) * midpoint), + midy = paintInfo.startStubY + ((paintInfo.endStubY - paintInfo.startStubY) * midpoint); + + var orientations = { x: [ 0, 1 ], y: [ 1, 0 ] }, + lineCalculators = { + perpendicular: function (axis) { + var pi = paintInfo, + sis = { + x: [ + [ [ 1, 2, 3, 4 ], null, [ 2, 1, 4, 3 ] ], + null, + [ [ 4, 3, 2, 1 ], null, [ 3, 4, 1, 2 ] ] + ], + y: [ + [ [ 3, 2, 1, 4 ], null, [ 2, 3, 4, 1 ] ], + null, + [ [ 4, 1, 2, 3 ], null, [ 1, 4, 3, 2 ] ] + ] + }, + stubs = { + x: [ [ pi.startStubX, pi.endStubX ], null, [ pi.endStubX, pi.startStubX ] ], + y: [ [ pi.startStubY, pi.endStubY ], null, [ pi.endStubY, pi.startStubY ] ] + }, + midLines = { + x: [ [ midx, pi.startStubY ], [ midx, pi.endStubY ] ], + y: [ [ pi.startStubX, midy ], [ pi.endStubX, midy ] ] + }, + linesToEnd = { + x: [ [ pi.endStubX, pi.startStubY ] ], + y: [ [ pi.startStubX, pi.endStubY ] ] + }, + startToEnd = { + x: [ [ pi.startStubX, pi.endStubY ], [ pi.endStubX, pi.endStubY ] ], + y: [ [ pi.endStubX, pi.startStubY ], [ pi.endStubX, pi.endStubY ] ] + }, + startToMidToEnd = { + x: [ [ pi.startStubX, midy ], [ pi.endStubX, midy ], [ pi.endStubX, pi.endStubY ] ], + y: [ [ midx, pi.startStubY ], [ midx, pi.endStubY ], [ pi.endStubX, pi.endStubY ] ] + }, + otherStubs = { + x: [ pi.startStubY, pi.endStubY ], + y: [ pi.startStubX, pi.endStubX ] + }, + soIdx = orientations[axis][0], toIdx = orientations[axis][1], + _so = pi.so[soIdx] + 1, + _to = pi.to[toIdx] + 1, + otherFlipped = (pi.to[toIdx] == -1 && (otherStubs[axis][1] < otherStubs[axis][0])) || (pi.to[toIdx] == 1 && (otherStubs[axis][1] > otherStubs[axis][0])), + stub1 = stubs[axis][_so][0], + stub2 = stubs[axis][_so][1], + segmentIndexes = sis[axis][_so][_to]; + + if (pi.segment == segmentIndexes[3] || (pi.segment == segmentIndexes[2] && otherFlipped)) { + return midLines[axis]; + } + else if (pi.segment == segmentIndexes[2] && stub2 < stub1) { + return linesToEnd[axis]; + } + else if ((pi.segment == segmentIndexes[2] && stub2 >= stub1) || (pi.segment == segmentIndexes[1] && !otherFlipped)) { + return startToMidToEnd[axis]; + } + else if (pi.segment == segmentIndexes[0] || (pi.segment == segmentIndexes[1] && otherFlipped)) { + return startToEnd[axis]; + } + }, + orthogonal: function (axis, startStub, otherStartStub, endStub, otherEndStub) { + var pi = paintInfo, + extent = { + "x": pi.so[0] == -1 ? Math.min(startStub, endStub) : Math.max(startStub, endStub), + "y": pi.so[1] == -1 ? Math.min(startStub, endStub) : Math.max(startStub, endStub) + }[axis]; + + return { + "x": [ + [ extent, otherStartStub ], + [ extent, otherEndStub ], + [ endStub, otherEndStub ] + ], + "y": [ + [ otherStartStub, extent ], + [ otherEndStub, extent ], + [ otherEndStub, endStub ] + ] + }[axis]; + }, + opposite: function (axis, ss, oss, es) { + var pi = paintInfo, + otherAxis = {"x": "y", "y": "x"}[axis], + dim = {"x": "height", "y": "width"}[axis], + comparator = pi["is" + axis.toUpperCase() + "GreaterThanStubTimes2"]; + + if (params.sourceEndpoint.elementId == params.targetEndpoint.elementId) { + var _val = oss + ((1 - params.sourceEndpoint.anchor[otherAxis]) * params.sourceInfo[dim]) + _super.maxStub; + return { + "x": [ + [ ss, _val ], + [ es, _val ] + ], + "y": [ + [ _val, ss ], + [ _val, es ] + ] + }[axis]; + + } + else if (!comparator || (pi.so[idx] == 1 && ss > es) || (pi.so[idx] == -1 && ss < es)) { + return { + "x": [ + [ ss, midy ], + [ es, midy ] + ], + "y": [ + [ midx, ss ], + [ midx, es ] + ] + }[axis]; + } + else if ((pi.so[idx] == 1 && ss < es) || (pi.so[idx] == -1 && ss > es)) { + return { + "x": [ + [ midx, pi.sy ], + [ midx, pi.ty ] + ], + "y": [ + [ pi.sx, midy ], + [ pi.tx, midy ] + ] + }[axis]; + } + } + }; + + // compute the rest of the line + var p = lineCalculators[paintInfo.anchorOrientation](paintInfo.sourceAxis, ss, oss, es, oes); + if (p) { + for (var i = 0; i < p.length; i++) { + addSegment(segments, p[i][0], p[i][1], paintInfo); + } + } + + // line to end stub + addSegment(segments, stubs[2], stubs[3], paintInfo); + + } + + // end stub to end (common) + addSegment(segments, paintInfo.tx, paintInfo.ty, paintInfo); + + // write out the segments. + writeSegments(this, segments, paintInfo); + }; + + /*this.getPath = function () { + var _last = null, _lastAxis = null, s = [], segs = segments; + for (var i = 0; i < segs.length; i++) { + var seg = segs[i], axis = seg[4], axisIndex = (axis == "v" ? 3 : 2); + if (_last != null && _lastAxis === axis) { + _last[axisIndex] = seg[axisIndex]; + } + else { + if (seg[0] != seg[2] || seg[1] != seg[3]) { + s.push({ + start: [ seg[0], seg[1] ], + end: [ seg[2], seg[3] ] + }); + _last = seg; + _lastAxis = seg[4]; + } + } + } + return s; + };*/ + }; + + _ju.extend(Flowchart, _jp.Connectors.AbstractConnector); + _jp.registerConnectorType(Flowchart, "Flowchart"); +}).call(this); +/* + * This file contains the code for the Bezier connector type. + * + * Copyright (c) 2010 - 2015 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * http://github.com/sporritt/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + _jp.Connectors.AbstractBezierConnector = function(params) { + params = params || {}; + var showLoopback = params.showLoopback !== false, + curviness = params.curviness || 10, + margin = params.margin || 5, + proximityLimit = params.proximityLimit || 80, + clockwise = params.orientation && params.orientation === "clockwise", + loopbackRadius = params.loopbackRadius || 25, + isLoopbackCurrently = false, + _super; + + this.overrideSetEditable = function() { return !isLoopbackCurrently; }; + + this._compute = function (paintInfo, p) { + + var sp = p.sourcePos, + tp = p.targetPos, + _w = Math.abs(sp[0] - tp[0]), + _h = Math.abs(sp[1] - tp[1]); + + if (!showLoopback || (p.sourceEndpoint.elementId !== p.targetEndpoint.elementId)) { + isLoopbackCurrently = false; + this._computeBezier(paintInfo, p, sp, tp, _w, _h); + } else { + isLoopbackCurrently = true; + // a loopback connector. draw an arc from one anchor to the other. + var x1 = p.sourcePos[0], y1 = p.sourcePos[1] - margin, + cx = x1, cy = y1 - loopbackRadius, + // canvas sizing stuff, to ensure the whole painted area is visible. + _x = cx - loopbackRadius, + _y = cy - loopbackRadius; + + _w = 2 * loopbackRadius; + _h = 2 * loopbackRadius; + + paintInfo.points[0] = _x; + paintInfo.points[1] = _y; + paintInfo.points[2] = _w; + paintInfo.points[3] = _h; + + // ADD AN ARC SEGMENT. + _super.addSegment(this, "Arc", { + loopback: true, + x1: (x1 - _x) + 4, + y1: y1 - _y, + startAngle: 0, + endAngle: 2 * Math.PI, + r: loopbackRadius, + ac: !clockwise, + x2: (x1 - _x) - 4, + y2: y1 - _y, + cx: cx - _x, + cy: cy - _y + }); + } + }; + + _super = _jp.Connectors.AbstractConnector.apply(this, arguments); + return _super; + }; + _ju.extend(_jp.Connectors.AbstractBezierConnector, _jp.Connectors.AbstractConnector); + + var Bezier = function (params) { + params = params || {}; + this.type = "Bezier"; + + var _super = _jp.Connectors.AbstractBezierConnector.apply(this, arguments), + majorAnchor = params.curviness || 150, + minorAnchor = 10; + + this.getCurviness = function () { + return majorAnchor; + }; + + this._findControlPoint = function (point, sourceAnchorPosition, targetAnchorPosition, sourceEndpoint, targetEndpoint, soo, too) { + // determine if the two anchors are perpendicular to each other in their orientation. we swap the control + // points around if so (code could be tightened up) + var perpendicular = soo[0] != too[0] || soo[1] == too[1], + p = []; + + if (!perpendicular) { + if (soo[0] === 0) // X + p.push(sourceAnchorPosition[0] < targetAnchorPosition[0] ? point[0] + minorAnchor : point[0] - minorAnchor); + else p.push(point[0] - (majorAnchor * soo[0])); + + if (soo[1] === 0) // Y + p.push(sourceAnchorPosition[1] < targetAnchorPosition[1] ? point[1] + minorAnchor : point[1] - minorAnchor); + else p.push(point[1] + (majorAnchor * too[1])); + } + else { + if (too[0] === 0) // X + p.push(targetAnchorPosition[0] < sourceAnchorPosition[0] ? point[0] + minorAnchor : point[0] - minorAnchor); + else p.push(point[0] + (majorAnchor * too[0])); + + if (too[1] === 0) // Y + p.push(targetAnchorPosition[1] < sourceAnchorPosition[1] ? point[1] + minorAnchor : point[1] - minorAnchor); + else p.push(point[1] + (majorAnchor * soo[1])); + } + + return p; + }; + + this._computeBezier = function (paintInfo, p, sp, tp, _w, _h) { + + var geometry = this.getGeometry(), _CP, _CP2, + _sx = sp[0] < tp[0] ? _w : 0, + _sy = sp[1] < tp[1] ? _h : 0, + _tx = sp[0] < tp[0] ? 0 : _w, + _ty = sp[1] < tp[1] ? 0 : _h; + + if ((this.hasBeenEdited() || this.isEditing()) && geometry != null && geometry.controlPoints != null && geometry.controlPoints[0] != null && geometry.controlPoints[1] != null) { + _CP = geometry.controlPoints[0]; + _CP2 = geometry.controlPoints[1]; + } + else { + _CP = this._findControlPoint([_sx, _sy], sp, tp, p.sourceEndpoint, p.targetEndpoint, paintInfo.so, paintInfo.to); + _CP2 = this._findControlPoint([_tx, _ty], tp, sp, p.targetEndpoint, p.sourceEndpoint, paintInfo.to, paintInfo.so); + } + + _super.setGeometry({controlPoints:[_CP, _CP2]}, true); + + _super.addSegment(this, "Bezier", { + x1: _sx, y1: _sy, x2: _tx, y2: _ty, + cp1x: _CP[0], cp1y: _CP[1], cp2x: _CP2[0], cp2y: _CP2[1] + }); + }; + + + }; + + _ju.extend(Bezier, _jp.Connectors.AbstractBezierConnector); + _jp.registerConnectorType(Bezier, "Bezier"); + +}).call(this); +/* + * This file contains the state machine connectors, which extend AbstractBezierConnector. + * + * Copyright (c) 2010 - 2015 jsPlumb (hello@jsplumbtoolkit.com) + * + * https://jsplumbtoolkit.com + * http://github.com/sporritt/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + var _segment = function (x1, y1, x2, y2) { + if (x1 <= x2 && y2 <= y1) return 1; + else if (x1 <= x2 && y1 <= y2) return 2; + else if (x2 <= x1 && y2 >= y1) return 3; + return 4; + }, + + // the control point we will use depends on the faces to which each end of the connection is assigned, specifically whether or not the + // two faces are parallel or perpendicular. if they are parallel then the control point lies on the midpoint of the axis in which they + // are parellel and varies only in the other axis; this variation is proportional to the distance that the anchor points lie from the + // center of that face. if the two faces are perpendicular then the control point is at some distance from both the midpoints; the amount and + // direction are dependent on the orientation of the two elements. 'seg', passed in to this method, tells you which segment the target element + // lies in with respect to the source: 1 is top right, 2 is bottom right, 3 is bottom left, 4 is top left. + // + // sourcePos and targetPos are arrays of info about where on the source and target each anchor is located. their contents are: + // + // 0 - absolute x + // 1 - absolute y + // 2 - proportional x in element (0 is left edge, 1 is right edge) + // 3 - proportional y in element (0 is top edge, 1 is bottom edge) + // + _findControlPoint = function (midx, midy, segment, sourceEdge, targetEdge, dx, dy, distance, proximityLimit) { + // TODO (maybe) + // - if anchor pos is 0.5, make the control point take into account the relative position of the elements. + if (distance <= proximityLimit) return [midx, midy]; + + if (segment === 1) { + if (sourceEdge[3] <= 0 && targetEdge[3] >= 1) return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + else if (sourceEdge[2] >= 1 && targetEdge[2] <= 0) return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + else return [ midx + (-1 * dx) , midy + (-1 * dy) ]; + } + else if (segment === 2) { + if (sourceEdge[3] >= 1 && targetEdge[3] <= 0) return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + else if (sourceEdge[2] >= 1 && targetEdge[2] <= 0) return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + else return [ midx + dx, midy + (-1 * dy) ]; + } + else if (segment === 3) { + if (sourceEdge[3] >= 1 && targetEdge[3] <= 0) return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + else if (sourceEdge[2] <= 0 && targetEdge[2] >= 1) return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + else return [ midx + (-1 * dx) , midy + (-1 * dy) ]; + } + else if (segment === 4) { + if (sourceEdge[3] <= 0 && targetEdge[3] >= 1) return [ midx + (sourceEdge[2] < 0.5 ? -1 * dx : dx), midy ]; + else if (sourceEdge[2] <= 0 && targetEdge[2] >= 1) return [ midx, midy + (sourceEdge[3] < 0.5 ? -1 * dy : dy) ]; + else return [ midx + dx , midy + (-1 * dy) ]; + } + + }; + + var StateMachine = function (params) { + params = params || {}; + this.type = "StateMachine"; + + var _super = _jp.Connectors.AbstractBezierConnector.apply(this, arguments), + curviness = params.curviness || 10, + margin = params.margin || 5, + proximityLimit = params.proximityLimit || 80, + clockwise = params.orientation && params.orientation === "clockwise", + _controlPoint; + + this._computeBezier = function(paintInfo, params, sp, tp, w, h) { + var _sx = params.sourcePos[0] < params.targetPos[0] ? 0 : w, + _sy = params.sourcePos[1] < params.targetPos[1] ? 0 : h, + _tx = params.sourcePos[0] < params.targetPos[0] ? w : 0, + _ty = params.sourcePos[1] < params.targetPos[1] ? h : 0; + + // now adjust for the margin + if (params.sourcePos[2] === 0) _sx -= margin; + if (params.sourcePos[2] === 1) _sx += margin; + if (params.sourcePos[3] === 0) _sy -= margin; + if (params.sourcePos[3] === 1) _sy += margin; + if (params.targetPos[2] === 0) _tx -= margin; + if (params.targetPos[2] === 1) _tx += margin; + if (params.targetPos[3] === 0) _ty -= margin; + if (params.targetPos[3] === 1) _ty += margin; + + // + // these connectors are quadratic bezier curves, having a single control point. if both anchors + // are located at 0.5 on their respective faces, the control point is set to the midpoint and you + // get a straight line. this is also the case if the two anchors are within 'proximityLimit', since + // it seems to make good aesthetic sense to do that. outside of that, the control point is positioned + // at 'curviness' pixels away along the normal to the straight line connecting the two anchors. + // + // there may be two improvements to this. firstly, we might actually support the notion of avoiding nodes + // in the UI, or at least making a good effort at doing so. if a connection would pass underneath some node, + // for example, we might increase the distance the control point is away from the midpoint in a bid to + // steer it around that node. this will work within limits, but i think those limits would also be the likely + // limits for, once again, aesthetic good sense in the layout of a chart using these connectors. + // + // the second possible change is actually two possible changes: firstly, it is possible we should gradually + // decrease the 'curviness' as the distance between the anchors decreases; start tailing it off to 0 at some + // point (which should be configurable). secondly, we might slightly increase the 'curviness' for connectors + // with respect to how far their anchor is from the center of its respective face. this could either look cool, + // or stupid, and may indeed work only in a way that is so subtle as to have been a waste of time. + // + + var _midx = (_sx + _tx) / 2, + _midy = (_sy + _ty) / 2, + segment = _segment(_sx, _sy, _tx, _ty), + distance = Math.sqrt(Math.pow(_tx - _sx, 2) + Math.pow(_ty - _sy, 2)), + cp1x, cp2x, cp1y, cp2y, + geometry = _super.getGeometry(); + + if ((this.hasBeenEdited() || this.isEditing()) && geometry != null) { + cp1x = geometry.controlPoints[0][0]; + cp1y = geometry.controlPoints[0][1]; + cp2x = geometry.controlPoints[1][0]; + cp2y = geometry.controlPoints[1][1]; + } + else { + // calculate the control point. this code will be where we'll put in a rudimentary element avoidance scheme; it + // will work by extending the control point to force the curve to be, um, curvier. + _controlPoint = _findControlPoint(_midx, + _midy, + segment, + params.sourcePos, + params.targetPos, + curviness, curviness, + distance, + proximityLimit); + + cp1x = _controlPoint[0]; + cp2x = _controlPoint[0]; + cp1y = _controlPoint[1]; + cp2y = _controlPoint[1]; + + _super.setGeometry({controlPoints:[_controlPoint, _controlPoint]}, true); + } + + _super.addSegment(this, "Bezier", { + x1: _tx, y1: _ty, x2: _sx, y2: _sy, + cp1x: cp1x, cp1y: cp1y, + cp2x: cp2x, cp2y: cp2y + }); + }; + }; + + _ju.extend(StateMachine, _jp.Connectors.AbstractBezierConnector); + _jp.registerConnectorType(StateMachine, "StateMachine"); + +}).call(this); +/* + * jsPlumb + * + * Title:jsPlumb 2.0.2 + * + * Provides a way to visually connect elements on an HTML page, using SVG. + * + * This file contains the SVG renderers. + * + * Copyright (c) 2010 - 2015 jsPlumb (hello@jsplumbtoolkit.com) + * + * http://jsplumbtoolkit.com + * http://github.com/sporritt/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + +// ************************** SVG utility methods ******************************************** + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil; + + var svgAttributeMap = { + "stroke-linejoin": "stroke-linejoin", + "stroke-dashoffset": "stroke-dashoffset", + "stroke-linecap": "stroke-linecap" + }, + STROKE_DASHARRAY = "stroke-dasharray", + DASHSTYLE = "dashstyle", + LINEAR_GRADIENT = "linearGradient", + RADIAL_GRADIENT = "radialGradient", + DEFS = "defs", + FILL = "fill", + STOP = "stop", + STROKE = "stroke", + STROKE_WIDTH = "stroke-width", + STYLE = "style", + NONE = "none", + JSPLUMB_GRADIENT = "jsplumb_gradient_", + LINE_WIDTH = "lineWidth", + ns = { + svg: "http://www.w3.org/2000/svg", + xhtml: "http://www.w3.org/1999/xhtml" + }, + _attr = function (node, attributes) { + for (var i in attributes) + node.setAttribute(i, "" + attributes[i]); + }, + _node = function (name, attributes) { + attributes = attributes || {}; + attributes.version = "1.1"; + attributes.xmlns = ns.xhtml; + return jsPlumb.createElementNS(ns.svg, name, null, null, attributes); + }, + _pos = function (d) { + return "position:absolute;left:" + d[0] + "px;top:" + d[1] + "px"; + }, + _clearGradient = function (parent) { + var els = parent.querySelectorAll(" defs,linearGradient,radialGradient"); + for (var i = 0; i < els.length; i++) + els[i].parentNode.removeChild(els[i]); + }, + _updateGradient = function (parent, node, style, dimensions, uiComponent) { + var id = JSPLUMB_GRADIENT + uiComponent._jsPlumb.instance.idstamp(); + // first clear out any existing gradient + _clearGradient(parent); + // this checks for an 'offset' property in the gradient, and in the absence of it, assumes + // we want a linear gradient. if it's there, we create a radial gradient. + // it is possible that a more explicit means of defining the gradient type would be + // better. relying on 'offset' means that we can never have a radial gradient that uses + // some default offset, for instance. + // issue 244 suggested the 'gradientUnits' attribute; without this, straight/flowchart connectors with gradients would + // not show gradients when the line was perfectly horizontal or vertical. + var g; + if (!style.gradient.offset) + g = _node(LINEAR_GRADIENT, {id: id, gradientUnits: "userSpaceOnUse"}); + else + g = _node(RADIAL_GRADIENT, { id: id }); + + var defs = _node(DEFS); + parent.appendChild(defs); + defs.appendChild(g); + + // the svg radial gradient seems to treat stops in the reverse + // order to how canvas does it. so we want to keep all the maths the same, but + // iterate the actual style declarations in reverse order, if the x indexes are not in order. + for (var i = 0; i < style.gradient.stops.length; i++) { + var styleToUse = uiComponent.segment == 1 || uiComponent.segment == 2 ? i : style.gradient.stops.length - 1 - i, + //stopColor = _ju.convertStyle(style.gradient.stops[styleToUse][1], true), + stopColor = style.gradient.stops[styleToUse][1], + s = _node(STOP, {"offset": Math.floor(style.gradient.stops[i][0] * 100) + "%", "stop-color": stopColor}); + + g.appendChild(s); + } + var applyGradientTo = style.strokeStyle ? STROKE : FILL; + node.setAttribute(applyGradientTo, "url(#" + id + ")"); + }, + _applyStyles = function (parent, node, style, dimensions, uiComponent) { + + node.setAttribute(FILL, style.fillStyle ? style.fillStyle : NONE); + node.setAttribute(STROKE, style.strokeStyle ? style.strokeStyle : NONE); + + if (style.gradient) { + _updateGradient(parent, node, style, dimensions, uiComponent); + } + else { + // make sure we clear any existing gradient + _clearGradient(parent); + node.setAttribute(STYLE, ""); + } + + if (style.lineWidth) { + node.setAttribute(STROKE_WIDTH, style.lineWidth); + } + + // in SVG there is a stroke-dasharray attribute we can set, and its syntax looks like + // the syntax in VML but is actually kind of nasty: values are given in the pixel + // coordinate space, whereas in VML they are multiples of the width of the stroked + // line, which makes a lot more sense. for that reason, jsPlumb is supporting both + // the native svg 'stroke-dasharray' attribute, and also the 'dashstyle' concept from + // VML, which will be the preferred method. the code below this converts a dashstyle + // attribute given in terms of stroke width into a pixel representation, by using the + // stroke's lineWidth. + if (style[DASHSTYLE] && style[LINE_WIDTH] && !style[STROKE_DASHARRAY]) { + var sep = style[DASHSTYLE].indexOf(",") == -1 ? " " : ",", + parts = style[DASHSTYLE].split(sep), + styleToUse = ""; + parts.forEach(function (p) { + styleToUse += (Math.floor(p * style.lineWidth) + sep); + }); + node.setAttribute(STROKE_DASHARRAY, styleToUse); + } + else if (style[STROKE_DASHARRAY]) { + node.setAttribute(STROKE_DASHARRAY, style[STROKE_DASHARRAY]); + } + + // extra attributes such as join type, dash offset. + for (var i in svgAttributeMap) { + if (style[i]) { + node.setAttribute(svgAttributeMap[i], style[i]); + } + } + }, + _appendAtIndex = function (svg, path, idx) { + if (svg.childNodes.length > idx) { + svg.insertBefore(path, svg.childNodes[idx]); + } + else svg.appendChild(path); + }; + + /** + utility methods for other objects to use. + */ + _ju.svg = { + node: _node, + attr: _attr, + pos: _pos + }; + + // ************************** / SVG utility methods ******************************************** + + /* + * Base class for SVG components. + */ + var SvgComponent = function (params) { + var pointerEventsSpec = params.pointerEventsSpec || "all", renderer = {}; + + _jp.jsPlumbUIComponent.apply(this, params.originalArgs); + this.canvas = null; + this.path = null; + this.svg = null; + this.bgCanvas = null; + + var clazz = params.cssClass + " " + (params.originalArgs[0].cssClass || ""), + svgParams = { + "style": "", + "width": 0, + "height": 0, + "pointer-events": pointerEventsSpec, + "position": "absolute" + }; + + this.svg = _node("svg", svgParams); + + if (params.useDivWrapper) { + this.canvas = jsPlumb.createElement("div", { position : "absolute" }); + _ju.sizeElement(this.canvas, 0, 0, 1, 1); + this.canvas.className = clazz; + } + else { + _attr(this.svg, { "class": clazz }); + this.canvas = this.svg; + } + + params._jsPlumb.appendElement(this.canvas, params.originalArgs[0].parent); + if (params.useDivWrapper) this.canvas.appendChild(this.svg); + + var displayElements = [ this.canvas ]; + this.getDisplayElements = function () { + return displayElements; + }; + + this.appendDisplayElement = function (el) { + displayElements.push(el); + }; + + this.paint = function (style, anchor, extents) { + if (style != null) { + + var xy = [ this.x, this.y ], wh = [ this.w, this.h ], p; + if (extents != null) { + if (extents.xmin < 0) xy[0] += extents.xmin; + if (extents.ymin < 0) xy[1] += extents.ymin; + wh[0] = extents.xmax + ((extents.xmin < 0) ? -extents.xmin : 0); + wh[1] = extents.ymax + ((extents.ymin < 0) ? -extents.ymin : 0); + } + + if (params.useDivWrapper) { + _ju.sizeElement(this.canvas, xy[0], xy[1], wh[0], wh[1]); + xy[0] = 0; + xy[1] = 0; + p = _pos([ 0, 0 ]); + } + else + p = _pos([ xy[0], xy[1] ]); + + renderer.paint.apply(this, arguments); + + _attr(this.svg, { + "style": p, + "width": wh[0] || 0, + "height": wh[1] || 0 + }); + } + }; + + return { + renderer: renderer + }; + }; + + _ju.extend(SvgComponent, _jp.jsPlumbUIComponent, { + cleanup: function (force) { + if (force || this.typeId == null) { + if (this.canvas) this.canvas._jsPlumb = null; + if (this.svg) this.svg._jsPlumb = null; + if (this.bgCanvas) this.bgCanvas._jsPlumb = null; + + if (this.canvas && this.canvas.parentNode) + this.canvas.parentNode.removeChild(this.canvas); + if (this.bgCanvas && this.bgCanvas.parentNode) + this.canvas.parentNode.removeChild(this.canvas); + + this.svg = null; + this.canvas = null; + this.path = null; + this.group = null; + } + else { + // if not a forced cleanup, just detach from DOM for now. + if (this.canvas && this.canvas.parentNode) this.canvas.parentNode.removeChild(this.canvas); + if (this.bgCanvas && this.bgCanvas.parentNode) this.bgCanvas.parentNode.removeChild(this.bgCanvas); + } + }, + reattach:function(instance) { + var c = instance.getContainer(); + if (this.canvas && this.canvas.parentNode == null) c.appendChild(this.canvas); + if (this.bgCanvas && this.bgCanvas.parentNode == null) c.appendChild(this.bgCanvas); + }, + setVisible: function (v) { + if (this.canvas) { + this.canvas.style.display = v ? "block" : "none"; + } + } + }); + + /* + * Base class for SVG connectors. + */ + _jp.ConnectorRenderers.svg = function (params) { + var self = this, + _super = SvgComponent.apply(this, [ + { + cssClass: params._jsPlumb.connectorClass + (this.isEditable() ? " " + params._jsPlumb.editableConnectorClass : ""), + originalArgs: arguments, + pointerEventsSpec: "none", + _jsPlumb: params._jsPlumb + } + ]); + + var _superSetEditable = this.setEditable; + this.setEditable = function(e) { + var result = _superSetEditable.apply(this, [e]); + jsPlumb[result ? "addClass" : "removeClass"](this.canvas, this._jsPlumb.instance.editableConnectorClass); + }; + + _super.renderer.paint = function (style, anchor, extents) { + + var segments = self.getSegments(), p = "", offset = [0, 0]; + if (extents.xmin < 0) offset[0] = -extents.xmin; + if (extents.ymin < 0) offset[1] = -extents.ymin; + + if (segments.length > 0) { + + // create path from segments. + for (var i = 0; i < segments.length; i++) { + p += _jp.Segments.svg.SegmentRenderer.getPath(segments[i]); + p += " "; + } + + var a = { + d: p, + transform: "translate(" + offset[0] + "," + offset[1] + ")", + "pointer-events": params["pointer-events"] || "visibleStroke" + }, + outlineStyle = null, + d = [self.x, self.y, self.w, self.h]; + + // outline style. actually means drawing an svg object underneath the main one. + if (style.outlineColor) { + var outlineWidth = style.outlineWidth || 1, + outlineStrokeWidth = style.lineWidth + (2 * outlineWidth); + outlineStyle = _jp.extend({}, style); + delete outlineStyle.gradient; + outlineStyle.strokeStyle = style.outlineColor; + outlineStyle.lineWidth = outlineStrokeWidth; + + if (self.bgPath == null) { + self.bgPath = _node("path", a); + _jp.addClass(self.bgPath, _jp.connectorOutlineClass); + _appendAtIndex(self.svg, self.bgPath, 0); + } + else { + _attr(self.bgPath, a); + } + + _applyStyles(self.svg, self.bgPath, outlineStyle, d, self); + } + + if (self.path == null) { + self.path = _node("path", a); + _appendAtIndex(self.svg, self.path, style.outlineColor ? 1 : 0); + } + else { + _attr(self.path, a); + } + + _applyStyles(self.svg, self.path, style, d, self); + } + }; + }; + _ju.extend(_jp.ConnectorRenderers.svg, SvgComponent); + +// ******************************* svg segment renderer ***************************************************** + + _jp.Segments.svg = { + SegmentRenderer: { + getPath: function (segment) { + return ({ + "Straight": function () { + var d = segment.getCoordinates(); + return "M " + d.x1 + " " + d.y1 + " L " + d.x2 + " " + d.y2; + }, + "Bezier": function () { + var d = segment.params; + return "M " + d.x1 + " " + d.y1 + + " C " + d.cp1x + " " + d.cp1y + " " + d.cp2x + " " + d.cp2y + " " + d.x2 + " " + d.y2; + }, + "Arc": function () { + var d = segment.params, + laf = segment.sweep > Math.PI ? 1 : 0, + sf = segment.anticlockwise ? 0 : 1; + + return "M" + segment.x1 + " " + segment.y1 + " A " + segment.radius + " " + d.r + " 0 " + laf + "," + sf + " " + segment.x2 + " " + segment.y2; + } + })[segment.type](); + } + } + }; + +// ******************************* /svg segments ***************************************************** + + /* + * Base class for SVG endpoints. + */ + var SvgEndpoint = _jp.SvgEndpoint = function (params) { + var _super = SvgComponent.apply(this, [ + { + cssClass: params._jsPlumb.endpointClass, + originalArgs: arguments, + pointerEventsSpec: "all", + useDivWrapper: true, + _jsPlumb: params._jsPlumb + } + ]); + + _super.renderer.paint = function (style) { + var s = _jp.extend({}, style); + if (s.outlineColor) { + s.strokeWidth = s.outlineWidth; + s.strokeStyle = s.outlineColor; + } + + if (this.node == null) { + this.node = this.makeNode(s); + this.svg.appendChild(this.node); + } + else if (this.updateNode != null) { + this.updateNode(this.node); + } + _applyStyles(this.svg, this.node, s, [ this.x, this.y, this.w, this.h ], this); + _pos(this.node, [ this.x, this.y ]); + }.bind(this); + + }; + _ju.extend(SvgEndpoint, SvgComponent); + + /* + * SVG Dot Endpoint + */ + _jp.Endpoints.svg.Dot = function () { + _jp.Endpoints.Dot.apply(this, arguments); + SvgEndpoint.apply(this, arguments); + this.makeNode = function (style) { + return _node("circle", { + "cx": this.w / 2, + "cy": this.h / 2, + "r": this.radius + }); + }; + this.updateNode = function (node) { + _attr(node, { + "cx": this.w / 2, + "cy": this.h / 2, + "r": this.radius + }); + }; + }; + _ju.extend(_jp.Endpoints.svg.Dot, [_jp.Endpoints.Dot, SvgEndpoint]); + + /* + * SVG Rectangle Endpoint + */ + _jp.Endpoints.svg.Rectangle = function () { + _jp.Endpoints.Rectangle.apply(this, arguments); + SvgEndpoint.apply(this, arguments); + this.makeNode = function (style) { + return _node("rect", { + "width": this.w, + "height": this.h + }); + }; + this.updateNode = function (node) { + _attr(node, { + "width": this.w, + "height": this.h + }); + }; + }; + _ju.extend(_jp.Endpoints.svg.Rectangle, [_jp.Endpoints.Rectangle, SvgEndpoint]); + + /* + * SVG Image Endpoint is the default image endpoint. + */ + _jp.Endpoints.svg.Image = _jp.Endpoints.Image; + /* + * Blank endpoint in svg renderer is the default Blank endpoint. + */ + _jp.Endpoints.svg.Blank = _jp.Endpoints.Blank; + /* + * Label overlay in svg renderer is the default Label overlay. + */ + _jp.Overlays.svg.Label = _jp.Overlays.Label; + /* + * Custom overlay in svg renderer is the default Custom overlay. + */ + _jp.Overlays.svg.Custom = _jp.Overlays.Custom; + + var AbstractSvgArrowOverlay = function (superclass, originalArgs) { + superclass.apply(this, originalArgs); + _jp.jsPlumbUIComponent.apply(this, originalArgs); + this.isAppendedAtTopLevel = false; + var self = this; + this.path = null; + this.paint = function (params, containerExtents) { + // only draws on connections, not endpoints. + if (params.component.svg && containerExtents) { + if (this.path == null) { + this.path = _node("path", { + "pointer-events": "all" + }); + params.component.svg.appendChild(this.path); + if (this.elementCreated) { + this.elementCreated(this.path, params.component); + } + + this.canvas = params.component.svg; // for the sake of completeness; this behaves the same as other overlays + } + var clazz = originalArgs && (originalArgs.length == 1) ? (originalArgs[0].cssClass || "") : "", + offset = [0, 0]; + + if (containerExtents.xmin < 0) offset[0] = -containerExtents.xmin; + if (containerExtents.ymin < 0) offset[1] = -containerExtents.ymin; + + _attr(this.path, { + "d": makePath(params.d), + "class": clazz, + stroke: params.strokeStyle ? params.strokeStyle : null, + fill: params.fillStyle ? params.fillStyle : null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + } + }; + var makePath = function (d) { + return (isNaN(d.cxy.x) || isNaN(d.cxy.y)) ? "" : "M" + d.hxy.x + "," + d.hxy.y + + " L" + d.tail[0].x + "," + d.tail[0].y + + " L" + d.cxy.x + "," + d.cxy.y + + " L" + d.tail[1].x + "," + d.tail[1].y + + " L" + d.hxy.x + "," + d.hxy.y; + }; + this.transfer = function(target) { + if (target.canvas && this.path && this.path.parentNode) { + this.path.parentNode.removeChild(this.path); + target.canvas.appendChild(this.path); + } + }; + }; + _ju.extend(AbstractSvgArrowOverlay, [_jp.jsPlumbUIComponent, _jp.Overlays.AbstractOverlay], { + cleanup: function (force) { + if (this.path != null) { + if (force) + this._jsPlumb.instance.removeElement(this.path); + else + if (this.path.parentNode) + this.path.parentNode.removeChild(this.path); + } + }, + reattach:function(instance) { + if (this.path && this.canvas && this.path.parentNode == null) + this.canvas.appendChild(this.path); + }, + setVisible: function (v) { + if (this.path != null) (this.path.style.display = (v ? "block" : "none")); + } + }); + + _jp.Overlays.svg.Arrow = function () { + AbstractSvgArrowOverlay.apply(this, [_jp.Overlays.Arrow, arguments]); + }; + _ju.extend(_jp.Overlays.svg.Arrow, [ _jp.Overlays.Arrow, AbstractSvgArrowOverlay ]); + + _jp.Overlays.svg.PlainArrow = function () { + AbstractSvgArrowOverlay.apply(this, [_jp.Overlays.PlainArrow, arguments]); + }; + _ju.extend(_jp.Overlays.svg.PlainArrow, [ _jp.Overlays.PlainArrow, AbstractSvgArrowOverlay ]); + + _jp.Overlays.svg.Diamond = function () { + AbstractSvgArrowOverlay.apply(this, [_jp.Overlays.Diamond, arguments]); + }; + _ju.extend(_jp.Overlays.svg.Diamond, [ _jp.Overlays.Diamond, AbstractSvgArrowOverlay ]); + + // a test + _jp.Overlays.svg.GuideLines = function () { + var path = null, self = this, p1_1, p1_2; + _jp.Overlays.GuideLines.apply(this, arguments); + this.paint = function (params, containerExtents) { + if (path == null) { + path = _node("path"); + params.connector.svg.appendChild(path); + self.attachListeners(path, params.connector); + self.attachListeners(path, self); + + p1_1 = _node("path"); + params.connector.svg.appendChild(p1_1); + self.attachListeners(p1_1, params.connector); + self.attachListeners(p1_1, self); + + p1_2 = _node("path"); + params.connector.svg.appendChild(p1_2); + self.attachListeners(p1_2, params.connector); + self.attachListeners(p1_2, self); + } + + var offset = [0, 0]; + if (containerExtents.xmin < 0) offset[0] = -containerExtents.xmin; + if (containerExtents.ymin < 0) offset[1] = -containerExtents.ymin; + + _attr(path, { + "d": makePath(params.head, params.tail), + stroke: "red", + fill: null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + + _attr(p1_1, { + "d": makePath(params.tailLine[0], params.tailLine[1]), + stroke: "blue", + fill: null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + + _attr(p1_2, { + "d": makePath(params.headLine[0], params.headLine[1]), + stroke: "green", + fill: null, + transform: "translate(" + offset[0] + "," + offset[1] + ")" + }); + }; + + var makePath = function (d1, d2) { + return "M " + d1.x + "," + d1.y + + " L" + d2.x + "," + d2.y; + }; + }; + _ju.extend(_jp.Overlays.svg.GuideLines, _jp.Overlays.GuideLines); +}).call(this); + +/* + * jsPlumb + * + * Title:jsPlumb 2.0.2 + * + * Provides a way to visually connect elements on an HTML page, using SVG. + * + * This file contains the 'vanilla' adapter - having no external dependencies other than bundled libs. + * + * Copyright (c) 2010 - 2015 jsPlumb (hello@jsplumbtoolkit.com) + * + * http://jsplumbtoolkit.com + * http://github.com/sporritt/jsplumb + * + * Dual licensed under the MIT and GPL2 licenses. + */ +; +(function () { + + "use strict"; + var root = this, _jp = root.jsPlumb, _ju = root.jsPlumbUtil, + _jk = root.Katavorio, _jg = root.Biltong; + + var _getDragManager = function (instance, category) { + + category = category || "main"; + var key = "_katavorio_" + category; + var k = instance[key], + e = instance.getEventManager(); + + if (!k) { + k = new _jk({ + bind: e.on, + unbind: e.off, + getSize: jsPlumb.getSize, + getPosition: function (el) { + // if this is a nested draggable then compute the offset against its own offsetParent, otherwise + // compute against the Container's origin. see also the getUIPosition method below. + var o = instance.getOffset(el, false, el._katavorioDrag ? el.offsetParent : null); + return [o.left, o.top]; + }, + setPosition: function (el, xy) { + el.style.left = xy[0] + "px"; + el.style.top = xy[1] + "px"; + }, + addClass: jsPlumb.addClass, + removeClass: jsPlumb.removeClass, + intersects: _jg.intersects, + indexOf: function(l, i) { return l.indexOf(i); }, + css: { + noSelect: instance.dragSelectClass, + droppable: "jsplumb-droppable", + draggable: "jsplumb-draggable", + drag: "jsplumb-drag", + selected: "jsplumb-drag-selected", + active: "jsplumb-drag-active", + hover: "jsplumb-drag-hover" + } + }); + instance[key] = k; + instance.bind("zoom", k.setZoom); + } + return k; + }; + + var _animProps = function (o, p) { + var _one = function (pName) { + if (p[pName] != null) { + if (_ju.isString(p[pName])) { + var m = p[pName].match(/-=/) ? -1 : 1, + v = p[pName].substring(2); + return o[pName] + (m * v); + } + else return p[pName]; + } + else + return o[pName]; + }; + return [ _one("left"), _one("top") ]; + }; + + _jp.extend(root.jsPlumbInstance.prototype, { + + animationSupported:true, + getElement: function (el) { + if (el == null) return null; + // here we pluck the first entry if el was a list of entries. + // this is not my favourite thing to do, but previous versions of + // jsplumb supported jquery selectors, and it is possible a selector + // will be passed in here. + el = typeof el === "string" ? el : el.length != null && el.enctype == null ? el[0] : el; + return typeof el === "string" ? document.getElementById(el) : el; + }, + removeElement: function (element) { + _getDragManager(this).elementRemoved(element); + this.getEventManager().remove(element); + }, + // + // this adapter supports a rudimentary animation function. no easing is supported. only + // left/top properties are supported. property delta args are expected to be in the form + // + // +=x.xxxx + // + // or + // + // -=x.xxxx + // + doAnimate: function (el, properties, options) { + options = options || {}; + var o = this.getOffset(el), + ap = _animProps(o, properties), + ldist = ap[0] - o.left, + tdist = ap[1] - o.top, + d = options.duration || 250, + step = 15, steps = d / step, + linc = (step / d) * ldist, + tinc = (step / d) * tdist, + idx = 0, + int = setInterval(function () { + jsPlumb.setPosition(el, { + left: o.left + (linc * (idx + 1)), + top: o.top + (tinc * (idx + 1)) + }); + if (options.step != null) options.step(idx, Math.ceil(steps)); + idx++; + if (idx >= steps) { + window.clearInterval(int); + if (options.complete != null) options.complete(); + } + }, step); + }, + // DRAG/DROP + destroyDraggable: function (el, category) { + _getDragManager(this, category).destroyDraggable(el); + }, + destroyDroppable: function (el, category) { + _getDragManager(this, category).destroyDroppable(el); + }, + initDraggable: function (el, options, category) { + _getDragManager(this, category).draggable(el, options); + }, + initDroppable: function (el, options, category) { + _getDragManager(this, category).droppable(el, options); + }, + isAlreadyDraggable: function (el) { + return el._katavorioDrag != null; + }, + isDragSupported: function (el, options) { + return true; + }, + isDropSupported: function (el, options) { + return true; + }, + isElementDraggable: function (el) { + el = jsPlumb.getElement(el); + return el._katavorioDrag && el._katavorioDrag.isEnabled(); + }, + getDragObject: function (eventArgs) { + return eventArgs[0].drag.getDragElement(); + }, + getDragScope: function (el) { + return el._katavorioDrag && el._katavorioDrag.scopes.join(" ") || ""; + }, + getDropEvent: function (args) { + return args[0].e; + }, + getUIPosition: function (eventArgs, zoom) { + // here the position reported to us by Katavorio is relative to the element's offsetParent. For top + // level nodes that is fine, but if we have a nested draggable then its offsetParent is actually + // not going to be the jsplumb container; it's going to be some child of that element. In that case + // we want to adjust the UI position to account for the offsetParent's position relative to the Container + // origin. + var el = eventArgs[0].el; + var p = { left:eventArgs[0].pos[0], top:eventArgs[0].pos[1] }; + if (el._katavorioDrag && el.offsetParent !== this.getContainer()) { + var oc = this.getOffset(el.offsetParent); + p.left += oc.left; + p.top += oc.top; + } + return p; + }, + setDragFilter: function (el, filter, _exclude) { + if (el._katavorioDrag) { + el._katavorioDrag.setFilter(filter, _exclude); + } + }, + setElementDraggable: function (el, draggable) { + el = jsPlumb.getElement(el); + if (el._katavorioDrag) + el._katavorioDrag.setEnabled(draggable); + }, + setDragScope: function (el, scope) { + if (el._katavorioDrag) + el._katavorioDrag.k.setDragScope(el, scope); + }, + setDropScope:function(el, scope) { + if (el._katavorioDrop && el._katavorioDrop.length > 0) { + el._katavorioDrop[0].k.setDropScope(el, scope); + } + }, + addToPosse:function(el, spec) { + var specs = Array.prototype.slice.call(arguments, 1); + var dm = _getDragManager(this); + jsPlumb.each(el, function(_el) { + _el = [ jsPlumb.getElement(_el) ]; + _el.push.apply(_el, specs ); + dm.addToPosse.apply(dm, _el); + }); + }, + setPosse:function(el, spec) { + var specs = Array.prototype.slice.call(arguments, 1); + var dm = _getDragManager(this); + jsPlumb.each(el, function(_el) { + _el = [ jsPlumb.getElement(_el) ]; + _el.push.apply(_el, specs ); + dm.setPosse.apply(dm, _el); + }); + }, + removeFromPosse:function(el, posseId) { + var specs = Array.prototype.slice.call(arguments, 1); + var dm = _getDragManager(this); + jsPlumb.each(el, function(_el) { + _el = [ jsPlumb.getElement(_el) ]; + _el.push.apply(_el, specs ); + dm.removeFromPosse.apply(dm, _el); + }); + }, + removeFromAllPosses:function(el) { + var dm = _getDragManager(this); + jsPlumb.each(el, function(_el) { dm.removeFromAllPosses(jsPlumb.getElement(_el)); }); + }, + setPosseState:function(el, posseId, state) { + var dm = _getDragManager(this); + jsPlumb.each(el, function(_el) { dm.setPosseState(jsPlumb.getElement(_el), posseId, state); }); + }, + dragEvents: { + 'start': 'start', 'stop': 'stop', 'drag': 'drag', 'step': 'step', + 'over': 'over', 'out': 'out', 'drop': 'drop', 'complete': 'complete', + 'beforeStart':'beforeStart' + }, + animEvents: { + 'step': "step", 'complete': 'complete' + }, + stopDrag: function (el) { + if (el._katavorioDrag) + el._katavorioDrag.abort(); + }, + addToDragSelection: function (spec) { + _getDragManager(this).select(spec); + }, + removeFromDragSelection: function (spec) { + _getDragManager(this).deselect(spec); + }, + clearDragSelection: function () { + _getDragManager(this).deselectAll(); + }, + trigger: function (el, event, originalEvent, payload) { + this.getEventManager().trigger(el, event, originalEvent, payload); + }, + doReset:function() { + // look for katavorio instances and reset each one if found. + for (var key in this) { + if (key.indexOf("_katavorio_") === 0) { + this[key].reset(); + } + } + } + }); + + var ready = function (f) { + var _do = function () { + if (/complete|loaded|interactive/.test(document.readyState) && typeof(document.body) != "undefined" && document.body != null) + f(); + else + setTimeout(_do, 9); + }; + + _do(); + }; + ready(_jp.init); + +}).call(this); diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/templates/index.html b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/templates/index.html index 1e2b71a647135d43b4329276967a48857c36ece1..637b1d54e60ea05919c28824d3b4d1b6156ae67f 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/templates/index.html +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/templates/index.html @@ -5,6 +5,8 @@ <meta http-equiv='Content-Type' content='text/html; charset=utf-8'/> <title>{{title}}</title> <link rel='shortcut icon' href='{{ url_for('static', filename='favicon.ico') }}'> + <link href="/static/js/angular-gantt/angular-gantt.min.css" rel="stylesheet" type="text/css"> + <link href="/static/js/angular-gantt/angular-gantt-plugins.min.css" rel="stylesheet" type="text/css"> <link href="/static/css/bootstrap.min.css" rel="stylesheet" type="text/css"> <link href="/static/js/angular-ui-grid/ui-grid.min.css" rel="stylesheet" type="text/css"> <link href="/static/js/angular-ui-layout/angular-ui-layout.css" rel="stylesheet" type="text/css"> @@ -14,6 +16,8 @@ <script src="/static/js/moment/moment.js"></script> <script src="/static/js/jquery/jquery.min.js"></script> <script src="/static/js/utils/bootstrap.min.js"></script> + <script type="text/javascript" src="/static/js/highcharts/highcharts.js"></script> + <script type="text/javascript" src="/static/js/highcharts/exporting.js"></script> <script src="/static/js/angular/angular.js"></script> <script src="/static/js/utils/ui-bootstrap-tpls.min.js"></script> <script src="/static/js/angular-route/angular-route.min.js"></script> @@ -23,41 +27,82 @@ <script src="/static/js/angular-ui-grid/ui-grid.js"></script> <script src="/static/js/angular-ui-tree/angular-ui-tree.js"></script> <script src="/static/js/angular-ui-layout/angular-ui-layout.min.js"></script> + <script src="/static/js/angular-ui-layout/angular-ui-layout.min.js"></script> + <script src="/static/js/angular-ui-tabs/angular-ui.bootstrap.tabs.min.js"></script> <script src="/static/js/angular-moment/angular-moment.js"></script> <script src="/static/js/utils/datetimepicker.js"></script> - <link href="/static/js/angular-gantt/angular-gantt.min.css" rel="stylesheet" type="text/css"> - <link href="/static/js/angular-gantt/angular-gantt-plugins.min.css" rel="stylesheet" type="text/css"> + <script src="/static/js/jsplumb/jsplumb-2.0.7-min.js"></script> <script src="/static/js/angular-gantt/angular-gantt.js"></script> <script src="/static/js/angular-gantt/angular-gantt-plugins.js"></script> + <script type="text/javascript" src="/static/js/highcharts/highcharts-ng.js"></script> <script src="/static/app/app.js"></script> <script src="/static/app/controllers/datacontroller.js"></script> <script src="/static/app/controllers/gridcontroller.js"></script> - <script src="/static/app/controllers/ganttcontroller.js"></script> + <script src="/static/app/controllers/ganttresourcecontroller.js"></script> + <script src="/static/app/controllers/ganttprojectcontroller.js"></script> + <script src="/static/app/controllers/chartresourceusagecontroller.js"></script> </head> <body> {% raw %} <div ng-controller="DataController as dataCtrl"> - <div ui-layout> + <div >Time (local): <span>{{dataService.lofarTime | date:'yyyy-MM-dd HH:mm:ss' }}</span></div> + <div ui-layout class="top-stretch" ui-layout="{flow: 'column'}"> <header> - <div ng-controller="GridController as gridCtrl"> - <strong>Tasks:</strong> - <div id="grid" ui-grid="gridOptions" ui-grid-edit ui-grid-cellnav ui-grid-resize-columns class="grid"> - </div> - </div> + <uib-tabset margin-top='10px'> + <uib-tab heading="Tasks" index='0' active='true'> + <div ng-controller="GridController as gridCtrl"> + <div id="grid" ui-grid="gridOptions" ui-grid-edit ui-grid-selection ui-grid-cellnav ui-grid-resize-columns class="grid"> + </div> + </div> + </uib-tab> + <uib-tab heading="Usages" index='1' active='false'> + <div class="tab-pane active" ng-controller="ChartResourceUsageController as chartResourceUsageCtrl"> + <highchart id="chart_resource_usage" config="chartConfig" style="width: 95%; height: 40%; margin: 10px;" ></highchart> + </div> + </uib-tab> + </uib-tabset> </header> <header> - <div ng-controller="GanttController as ganttCtrl"> - <div gantt data=ganttData - api=options.api - show-side='true'> - <gantt-tree enabled="true"></gantt-tree> - <gantt-movable enabled="true" - allow-moving="true" - allow-resizing="true" - allow-row-switching="false"></gantt-movable> - <gantt-tooltips></gantt-tooltips> - </div> - </div> + <uib-tabset margin-top='10px'> + <uib-tab heading="Projects" index='0' active='true'> + <div class="tab-pane active" ng-controller="GanttProjectController as ganttProjectCtrl"> + <div gantt data=ganttData + api=options.api + show-side='true' + view-scale="options.viewScale" + current-date="options.currentDate" + current-date-value="options.currentDateValue" + column-magnet="options.columnMagnet"> + <gantt-tree enabled="true"></gantt-tree> + <gantt-movable enabled="true" + allow-moving="false" + allow-resizing="false" + allow-row-switching="false"> + </gantt-movable> + <gantt-tooltips enabled="true" date-format="'YYYY-MM-DD HH:mm'"></gantt-tooltips> + <gantt-dependencies enabled="true"></gantt-dependencies> + </div> + </div> + </uib-tab> + <uib-tab heading="Resources" index='1' active='false'> + <div class="tab-pane active" ng-controller="GanttResourceController as ganttResourceCtrl"> + <div gantt data=ganttData + api=options.api + show-side='true' + view-scale="options.viewScale" + current-date="options.currentDate" + current-date-value="options.currentDateValue" + column-magnet="options.columnMagnet"> + <gantt-tree enabled="true"></gantt-tree> + <gantt-movable enabled="true" + allow-moving="false" + allow-resizing="false" + allow-row-switching="false"></gantt-movable> + <gantt-tooltips enabled="true" date-format="'YYYY-MM-DD HH:mm'"></gantt-tooltips> + </div> + </div> + </uib-tab> + <uib-tabset> <header> </div> </div> diff --git a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/webservice.py b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/webservice.py index 59f4bd8755bfee0f56a688765468b5431fb3291b..fdc1bdd85103f734ffb59d9f6706fb8d1463ec08 100755 --- a/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/webservice.py +++ b/SAS/ResourceAssignment/ResourceAssignmentEditor/lib/webservice.py @@ -42,12 +42,16 @@ from flask.json import JSONEncoder from lofar.sas.resourceassignment.resourceassignmenteditor.utils import gzipped from lofar.sas.resourceassignment.resourceassignmenteditor.fakedata import * from lofar.sas.resourceassignment.resourceassignmenteditor.radbchangeshandler import RADBChangesHandler, CHANGE_DELETE_TYPE -from lofar.sas.resourceassignment.database.config import DEFAULT_BUSNAME as DEFAULT_RADB_CHANGES_BUSNAME +from lofar.sas.resourceassignment.database.config import DEFAULT_NOTIFICATION_BUSNAME as DEFAULT_RADB_CHANGES_BUSNAME +from lofar.sas.resourceassignment.database.config import DEFAULT_NOTIFICATION_SUBJECTS as DEFAULT_RADB_CHANGES_SUBJECTS from lofar.sas.resourceassignment.resourceassignmentservice.rpc import RARPC -from lofar.sas.resourceassignment.resourceassignmentservice.config import DEFAULT_BUSNAME, DEFAULT_SERVICENAME +from lofar.sas.resourceassignment.resourceassignmentservice.config import DEFAULT_BUSNAME as DEFAULT_RADB_BUSNAME +from lofar.sas.resourceassignment.resourceassignmentservice.config import DEFAULT_SERVICENAME as DEFAULT_RADB_SERVICENAME from lofar.mom.momqueryservice.momqueryrpc import MoMRPC from lofar.mom.momqueryservice.config import DEFAULT_BUSNAME as DEFAULT_MOM_BUSNAME from lofar.mom.momqueryservice.config import DEFAULT_SERVICENAME as DEFAULT_MOM_SERVICENAME +from lofar.sas.resourceassignment.resourceassignmenteditor.mom import updateTaskMomDetails +#from lofar.sas.resourceassignment.resourceassigner. import updateTaskMomDetails logger = logging.getLogger(__name__) @@ -78,7 +82,7 @@ class CustomJSONEncoder(JSONEncoder): __root_path = os.path.dirname(os.path.realpath(__file__)) '''The flask webservice app''' -app = Flask('ResourceAssignmentEditor', +app = Flask('Scheduler', instance_path=__root_path, template_folder=os.path.join(__root_path, 'templates'), static_folder=os.path.join(__root_path, 'static'), @@ -88,22 +92,22 @@ app = Flask('ResourceAssignmentEditor', app.config.from_object('lofar.sas.resourceassignment.resourceassignmenteditor.config.default') app.json_encoder = CustomJSONEncoder -rarpc = RARPC(busname=DEFAULT_BUSNAME, servicename=DEFAULT_SERVICENAME, broker=None) -radbchangeshandler = RADBChangesHandler(DEFAULT_RADB_CHANGES_BUSNAME, broker=None) -momrpc = MoMRPC(busname=DEFAULT_MOM_BUSNAME, servicename=DEFAULT_MOM_SERVICENAME, broker=None) +rarpc = None +momrpc = None +radbchangeshandler = None @app.route('/') @app.route('/index.htm') @app.route('/index.html') def index(): '''Serves the ResourceAssignmentEditor's index page''' - return render_template('index.html', title='Resource Assignment Editor') + return render_template('index.html', title='Scheduler') -@app.route('/rest/resourceitems') +@app.route('/rest/resources') @gzipped -def resourcesitems(): - result = rarpc.getResources() - return jsonify({'resourceitems': result}) +def resources(): + result = rarpc.getResources(include_availability=True) + return jsonify({'resources': result}) @app.route('/rest/resourcegroups') @gzipped @@ -111,17 +115,36 @@ def resourcegroups(): result = rarpc.getResourceGroups() return jsonify({'resourcegroups': result}) +@app.route('/rest/resourcegroupmemberships') +@gzipped +def resourcegroupsmemberships(): + result = rarpc.getResourceGroupMemberships() + return jsonify({'resourcegroupmemberships': result}) + @app.route('/rest/resourceclaims') @gzipped def resourceclaims(): - claims = rarpc.getResourceClaims() + claims = rarpc.getResourceClaims(include_properties=True) return jsonify({'resourceclaims': claims}) -@app.route('/rest/resourcegroupclaims') +@app.route('/rest/resourceusages') @gzipped -def resourcegroupclaims(): - abort(500) +def resourceUsages(): + result = rarpc.getResourceUsages() + return jsonify({'resourceusages': result}) +@app.route('/rest/resources/<int:resource_id>/usages', methods=['GET']) +@app.route('/rest/resourceusages/<int:resource_id>', methods=['GET']) +@gzipped +def resourceUsagesForResource(resource_id): + result = rarpc.getResourceUsages(resource_ids=[resource_id]) + return jsonify({'resourceusages': result}) + +@app.route('/rest/tasks/<int:task_id>/resourceusages', methods=['GET']) +@gzipped +def resourceUsagesForTask(task_id): + result = rarpc.getResourceUsages(task_ids=[task_id]) + return jsonify({'resourceusages': result}) @app.route('/rest/tasks') @gzipped @@ -131,8 +154,7 @@ def getTasks(): # there are no task names in the database yet. # will they come from spec/MoM? # add Task <id> as name for now - for task in tasks: - task['name'] = 'Task %d' % task['id'] + updateTaskMomDetails(tasks, momrpc) return jsonify({'tasks': tasks}) @@ -145,6 +167,7 @@ def getTask(task_id): abort(404) task['name'] = 'Task %d' % task['id'] + updateTaskMomDetails(task, momrpc) return jsonify({'task': task}) except Exception as e: abort(404) @@ -153,6 +176,8 @@ def getTask(task_id): @app.route('/rest/tasks/<int:task_id>', methods=['PUT']) def putTask(task_id): + abort(403, 'Editing of tasks is by users is not yet approved') + if 'Content-Type' in request.headers and \ request.headers['Content-Type'].startswith('application/json'): updatedTask = json.loads(request.data) @@ -174,10 +199,10 @@ def putTask(task_id): abort(400, 'timestamp not in iso format: ' + updatedTask['endtime']) logger.info('putTask: ' + str(updatedTask)) - rarpc.updateResourceClaimsForTask(task_id, - starttime=updatedTask.get('starttime', None), - endtime=updatedTask.get('endtime', None), - status=updatedTask.get('status', None)) + rarpc.updateTaskAndResourceClaims(task_id, + starttime=updatedTask.get('starttime', None), + endtime=updatedTask.get('endtime', None), + task_status=updatedTask.get('status', None)) return "", 204 except KeyError: @@ -191,54 +216,95 @@ def taskResourceClaims(task_id): @app.route('/rest/tasktypes') def tasktypes(): result = rarpc.getTaskTypes() - result = [x['name'] for x in result] + result = sorted(result, key=lambda q: q['id']) return jsonify({'tasktypes': result}) @app.route('/rest/taskstatustypes') def getTaskStatusTypes(): result = rarpc.getTaskStatuses() result = sorted(result, key=lambda q: q['id']) - result = [x['name'] for x in result] return jsonify({'taskstatustypes': result}) +@app.route('/rest/resourcetypes') +def resourcetypes(): + result = rarpc.getResourceTypes() + result = sorted(result, key=lambda q: q['id']) + return jsonify({'resourcetypes': result}) + +@app.route('/rest/resourceclaimpropertytypes') +def resourceclaimpropertytypes(): + result = rarpc.getResourceClaimPropertyTypes() + result = sorted(result, key=lambda q: q['id']) + return jsonify({'resourceclaimpropertytypes': result}) + @app.route('/rest/momprojects') def getMoMProjects(): - projects = momrpc.getProjects() - projects = [x for x in projects if x['status_id'] in [1, 7]] + projects = [] + try: + projects = momrpc.getProjects() + projects = [x for x in projects if x['status_id'] in [1, 7]] + for project in projects: + project['mom_id'] = project.pop('mom2id') + except Exception as e: + logger.error(e) + projects.append({'name':'<unknown>', 'mom_id':-99, 'description': 'Container project for tasks for which we could not find a MoM project'}) + projects.append({'name':'OTDB Only', 'mom_id':-98, 'description': 'Container project for tasks which exists only in OTDB'}) return jsonify({'momprojects': projects}) @app.route('/rest/momobjectdetails/<int:mom2id>') def getMoMObjectDetails(mom2id): details = momrpc.getProjectDetails(mom2id) - return jsonify({'momobjectdetails': details.values()[0] if details else None}) + details = details.values()[0] if details else None + if details: + details['project_mom_id'] = details.pop('project_mom2id') + details['object_mom_id'] = details.pop('object_mom2id') + + return jsonify({'momobjectdetails': details}) @app.route('/rest/updates/<int:sinceChangeNumber>') def getUpdateEventsSince(sinceChangeNumber): changesSince = radbchangeshandler.getChangesSince(sinceChangeNumber) return jsonify({'changes': changesSince}) +@app.route('/rest/mostRecentChangeNumber') +def getMostRecentChangeNumber(): + mrcn = radbchangeshandler.getMostRecentChangeNumber() + return jsonify({'mostRecentChangeNumber': mrcn}) + @app.route('/rest/updates') def getUpdateEvents(): return getUpdateEventsSince(-1L) +@app.route('/rest/lofarTime') +def getLofarTime(): + return jsonify({'lofarTime': asIsoFormat(datetime.utcnow())}) + def main(): # Check the invocation arguments parser = OptionParser('%prog [options]', description='run the resource assignment editor web service') - parser.add_option('-p', '--port', dest='port', type='int', default=5000, help='port number on which to host the webservice, default: 5000') + parser.add_option('-p', '--port', dest='port', type='int', default=5000, help='port number on which to host the webservice, default: %default') parser.add_option('-q', '--broker', dest='broker', type='string', default=None, help='Address of the qpid broker, default: localhost') - parser.add_option('--radb_busname', dest='radb_busname', type='string', default=DEFAULT_BUSNAME, help='Name of the bus exchange on the qpid broker on which the radbservice listens, default: %s' % DEFAULT_BUSNAME) - parser.add_option('--radb_servicename', dest='radb_servicename', type='string', default=DEFAULT_SERVICENAME, help='Name of the radbservice, default: %s' % DEFAULT_SERVICENAME) - parser.add_option('--radb_notifications_busname', dest='radb_notifications_busname', type='string', default=DEFAULT_RADB_CHANGES_BUSNAME, help='Name of the notification bus exchange on the qpid broker on which the radb notifications are published, default: %s' % DEFAULT_RADB_CHANGES_BUSNAME) - parser.add_option('--mom_busname', dest='mom_busname', type='string', default=DEFAULT_MOM_BUSNAME, help='Name of the bus exchange on the qpid broker on which the momservice listens, default: %s' % DEFAULT_MOM_BUSNAME) - parser.add_option('--mom_servicename', dest='mom_servicename', type='string', default=DEFAULT_MOM_SERVICENAME, help='Name of the momservice, default: %s' % DEFAULT_MOM_SERVICENAME) + parser.add_option('--radb_busname', dest='radb_busname', type='string', default=DEFAULT_RADB_BUSNAME, help='Name of the bus exchange on the qpid broker on which the radbservice listens, default: %default') + parser.add_option('--radb_servicename', dest='radb_servicename', type='string', default=DEFAULT_RADB_SERVICENAME, help='Name of the radbservice, default: %default') + parser.add_option('--radb_notification_busname', dest='radb_notification_busname', type='string', default=DEFAULT_RADB_CHANGES_BUSNAME, help='Name of the notification bus exchange on the qpid broker on which the radb notifications are published, default: %default') + parser.add_option('--radb_notification_subjects', dest='radb_notification_subjects', type='string', default=DEFAULT_RADB_CHANGES_SUBJECTS, help='Subject(s) to listen for on the radb notification bus exchange on the qpid broker, default: %default') + parser.add_option('--mom_busname', dest='mom_busname', type='string', default=DEFAULT_MOM_BUSNAME, help='Name of the bus exchange on the qpid broker on which the momservice listens, default: %default') + parser.add_option('--mom_servicename', dest='mom_servicename', type='string', default=DEFAULT_MOM_SERVICENAME, help='Name of the momservice, default: %default') parser.add_option('-V', '--verbose', dest='verbose', action='store_true', help='verbose logging') (options, args) = parser.parse_args() logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.DEBUG if options.verbose else logging.INFO) + global rarpc + rarpc = RARPC(busname=DEFAULT_RADB_BUSNAME, servicename=DEFAULT_RADB_SERVICENAME, broker=options.broker) + global momrpc + momrpc = MoMRPC(busname=DEFAULT_MOM_BUSNAME, servicename=DEFAULT_MOM_SERVICENAME, timeout=2.5, broker=options.broker) + global radbchangeshandler + radbchangeshandler = RADBChangesHandler(DEFAULT_RADB_CHANGES_BUSNAME, broker=options.broker, momrpc=momrpc) + with radbchangeshandler, rarpc, momrpc: '''Start the webserver''' app.run(debug=options.verbose, threaded=True, host='0.0.0.0', port=options.port) diff --git a/SAS/ResourceAssignment/ResourceAssignmentEstimator/CMakeLists.txt b/SAS/ResourceAssignment/ResourceAssignmentEstimator/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..ea2d8d4c8ddff636568439f305c1cf1967cd31de --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEstimator/CMakeLists.txt @@ -0,0 +1,24 @@ +# $Id: CMakeLists.txt $ + +lofar_package(ResourceAssignmentEstimator 1.0 DEPENDS PyMessaging PyCommon pyparameterset) + +lofar_find_package(Python 2.6 REQUIRED) +include(PythonInstall) + +set(_py_files + __init__.py + service.py + config.py +) + +python_install(${_py_files} DESTINATION lofar/sas/resourceassignment/resourceassignmentestimator) + +lofar_add_bin_scripts(raestimatorservice) + +# supervisord config files +install(FILES + raestimatorservice.ini + DESTINATION etc/supervisord.d) + +add_subdirectory(test) +add_subdirectory(resource_estimators) diff --git a/SAS/ResourceAssignment/ResourceAssignmentEstimator/__init__.py b/SAS/ResourceAssignment/ResourceAssignmentEstimator/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..74e4d4fb4f87fce732da982bdfe3b11c50aedc3d --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEstimator/__init__.py @@ -0,0 +1 @@ +# $Id: __init__.py donker $ diff --git a/SAS/ResourceAssignment/ResourceAssignmentEstimator/config.py b/SAS/ResourceAssignment/ResourceAssignmentEstimator/config.py new file mode 100644 index 0000000000000000000000000000000000000000..fa39d8db77108f72fd79859b4665776a6dcf4c4a --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEstimator/config.py @@ -0,0 +1,6 @@ +#!/usr/bin/python +# $Id$ + +DEFAULT_BUSNAME = 'lofar.ra.command' +DEFAULT_SERVICENAME = 'ResourceEstimation' + diff --git a/SAS/ResourceAssignment/ResourceAssignmentEstimator/raestimatorservice b/SAS/ResourceAssignment/ResourceAssignmentEstimator/raestimatorservice new file mode 100644 index 0000000000000000000000000000000000000000..fc5f764760a1943490a8bc7190627ffbb839e34b --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEstimator/raestimatorservice @@ -0,0 +1,30 @@ +#!/usr/bin/env python +# +# Copyright (C) 2015 +# ASTRON (Netherlands Institute for Radio Astronomy) +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it and/or +# modify it under the terms of the GNU General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. +# +# $Id: raestimatorservice.py 33364 2016-01-21 21:21:12Z mol $ +""" +rpc-service which can estimate how much resources are needed for a given task. +""" + +from lofar.sas.resourceassignment.resourceassignmentestimator.service import main + +if __name__ == "__main__": + main() + diff --git a/SAS/ResourceAssignment/ResourceAssignmentEstimator/raestimatorservice.ini b/SAS/ResourceAssignment/ResourceAssignmentEstimator/raestimatorservice.ini new file mode 100644 index 0000000000000000000000000000000000000000..49a714aedeb4fafed6080c9da073231659805838 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEstimator/raestimatorservice.ini @@ -0,0 +1,8 @@ +[program:raestimatorservice] +command=/bin/bash -c 'source $LOFARROOT/lofarinit.sh;raestimatorservice' +user=lofarsys +stopsignal=INT ; KeyboardInterrupt +stopasgroup=true ; bash does not propagate signals +stdout_logfile=%(program_name)s.log +redirect_stderr=true +stderr_logfile=NONE diff --git a/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/CMakeLists.txt b/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..6c42b9e1eede3045170add0188d7a87067fd430c --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/CMakeLists.txt @@ -0,0 +1,14 @@ +# $Id: CMakeLists.txt $ + +set(_py_files + __init__.py + base_resource_estimator.py + observation.py + longbaseline_pipeline.py + calibration_pipeline.py + image_pipeline.py + pulsar_pipeline.py + #parameterset.py +) + +python_install(${_py_files} DESTINATION lofar/sas/resourceassignment/resourceassignmentestimator/resource_estimators) diff --git a/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/__init__.py b/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..720938b2bf5186e9bd7adb55a7c9ddac2fea52c5 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/__init__.py @@ -0,0 +1,9 @@ +""" resource_estimators __init__() +""" +from lofar.parameterset import parameterset +from observation import ObservationResourceEstimator +from longbaseline_pipeline import LongBaselinePipelineResourceEstimator +from calibration_pipeline import CalibrationPipelineResourceEstimator +from pulsar_pipeline import PulsarPipelineResourceEstimator +from image_pipeline import ImagePipelineResourceEstimator + diff --git a/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/base_resource_estimator.py b/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/base_resource_estimator.py new file mode 100644 index 0000000000000000000000000000000000000000..d1a9701a01818aee3a3c40f7c0e206b1f3da387a --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/base_resource_estimator.py @@ -0,0 +1,75 @@ +# base_resource_estimator.py +# +# Copyright (C) 2016 +# ASTRON (Netherlands Institute for Radio Astronomy) +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. +# +# $Id: base_resource_estimator.py 33534 2016-02-08 14:28:26Z schaap $ + +""" Base class for Resource Estimators +""" +import logging +from datetime import datetime +from lofar.common.datetimeutils import totalSeconds +from datetime import datetime, timedelta +from lofar.parameterset import parameterset + +logger = logging.getLogger(__name__) + + +class BaseResourceEstimator(object): + """ Base class for all other resource estmiater classes + """ + def __init__(self, name): + self.name = name + self.required_keys = () + + def _checkParsetForRequiredKeys(self, parset): + """ Check if all required keys needed are available """ + logger.debug("required keys: %s" % ', '.join(self.required_keys)) + logger.debug("parset keys: %s" % ', '.join(parset.keys())) + missing_keys = set(self.required_keys) - set(parset.keys()) + if missing_keys: + logger.error("missing keys: %s" % ', '.join(missing_keys)) + return False + return True + + def _getDateTime(self, date_time): + return datetime.strptime(date_time, '%Y-%m-%d %H:%M:%S') + + def _getDuration(self, start, end): + startTime = self._getDateTime(start) + endTime = self._getDateTime(end) + if startTime >= endTime: + return 1 ##TODO To prevent divide by zero later + return totalSeconds(endTime - startTime) + #TODO check if this makes duration = int(parset.get('duration', 0)) as a key reduntant? + + def _calculate(self, parset, input_files={}): + raise NotImplementedError('estimate() in base class is called. Please implement estimate() in your subclass') + + def estimate(self, parset, input_files={}): + """ Create estimates for a single process based on its parset and input files""" + if self._checkParsetForRequiredKeys(parset): + estimates = self._calculate(parameterset(parset), input_files) + else: + raise ValueError('The parset is incomplete') + result = {} + result[self.name] = {} + result[self.name]['storage'] = estimates['storage'] + result[self.name]['bandwidth'] = estimates['bandwidth'] + return result diff --git a/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/calibration_pipeline.py b/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/calibration_pipeline.py new file mode 100644 index 0000000000000000000000000000000000000000..d3b6b98dd1e998657e08f0794e76a4b74e91cb12 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/calibration_pipeline.py @@ -0,0 +1,72 @@ +# base_resource_estimator.py +# +# Copyright (C) 2016 +# ASTRON (Netherlands Institute for Radio Astronomy) +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. +# +# $Id: base_resource_estimator.py 33534 2016-02-08 14:28:26Z schaap $ + +import logging +from math import ceil +from base_resource_estimator import BaseResourceEstimator +from lofar.parameterset import parameterset + +logger = logging.getLogger(__name__) + +class CalibrationPipelineResourceEstimator(BaseResourceEstimator): + """ CalibrationPipelineResourceEstimator + + """ + def __init__(self, kwargs, input_files): + BaseResourceEstimator.__init__(self, name='calibration_pipeline') + self.required_keys = ('correlated.enabled', 'correlated.demixing_settings.freq_step', + 'correlated.demixing_settings.time_step', 'instrument_model.enabled') + + def _calculate(self, parset, input_files): + """ Estimate for calibration pipeline + calculates: datasize (number of files, file size), bandwidth + """ + logger.debug("start estimate '{}'".format(self.name)) + parset = parameterset(parset).makeSubset('dp.output') + output_files = {} + duration = int(kwargs.get('observation.duration', 1)) + if 'dp_correlated_uv' in input_files: + if parset['correlated']['enabled'] == 'true': + logger.debug("calculate correlated data size") + freq_step = int(parset['correlated']['demixing_settings']['freq_step']) + time_step = int(parset['correlated']['demixing_settings']['time_step']) + reduction_factor = freq_step * time_step + input_file_size = int(input_files['dp_correlated_uv']['file_size']) + output_file_size = 0.0 + if reduction_factor > 0: + new_size = input_file_size / reduction_factor + output_file_size = new_size + new_size / 64.0 * (1.0 + reduction_factor) + new_size / 2.0 + output_files['dp_correlated_uv'] = {'nr_files': int(input_files['dp_correlated_uv']['nr_files']), 'file_size': int(output_file_size)} + logger.debug("dp_correlated_uv: {} files {} bytes each".format(int(input_files['dp_correlated_uv']['nr_files']), int(output_file_size))) + + if parset['instrument_model']['enabled'] == 'true': + logger.debug("calculate instrument-model data size") + output_files['dp_instrument_model'] = {'nr_files': int(input_files['dp_correlated_uv']['nr_files']), 'file_size': 1000} + logger.debug("dp_instrument_model: {} files {} bytes each".format(int(input_files['dp_correlated_uv']['nr_files']), 1000)) + + # count total data size + total_data_size = 0 + for values in output_files.itervalues(): + total_data_size += values['nr_files'] * values['file_size'] + total_bandwidth = ceil((self.total_data_size * 8) / duration) # bits/second + return {"total_data_size":total_data_size, "total_bandwidth":total_bandwidth, "output_files":output_files} + diff --git a/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/image_pipeline.py b/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/image_pipeline.py new file mode 100644 index 0000000000000000000000000000000000000000..e3d239100b7edcf45e9989e5f05924080545ad65 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/image_pipeline.py @@ -0,0 +1,66 @@ +# base_resource_estimator.py +# +# Copyright (C) 2016 +# ASTRON (Netherlands Institute for Radio Astronomy) +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. +# +# $Id: base_resource_estimator.py 33534 2016-02-08 14:28:26Z schaap $ + +import logging +from math import ceil +from base_resource_estimator import BaseResourceEstimator +from lofar.parameterset import parameterset + +logger = logging.getLogger(__name__) + +class ImagePipelineResourceEstimator(BaseResourceEstimator): + """ ImagePipelineResourceEstimator + + """ + def __init__(self, kwargs, input_files): + BaseResourceEstimator.__init__(self, name='image_pipeline') + self.parset = ParameterSet(kwargs).make_subset('dp.output') + self.duration = int(kwargs.get('observation.duration', 1)) + self.input_files = input_files + self.required_keys = ('skyimage.enabled', 'skyimage.slices_per_image', 'skyimage.subbands_per_image') + if self.checkParsetForRequiredKeys(): + self.estimate() + return + + def estimate(self): + """ Estimate for image pipeline + calculates: datasize (number of files, file size), bandwidth + """ + logger.debug("start estimate '{}'".format(self.name)) + if 'dp_correlated_uv' in self.input_files: + if self.parset['skyimage']['enabled'] == 'true': + logger.debug("calculate skyimage data size") + slices_per_image = int(self.parset['skyimage']['slices_per_image']) + subbands_per_image = int(self.parset['skyimage']['subbands_per_image']) + if slices_per_image and subbands_per_image: + nr_input_subbands = int(self.input_files['dp_correlated_uv']['nr_files']) + if (nr_input_subbands % (subbands_per_image * slices_per_image)) == 0: + nr_images = nr_input_subbands / (subbands_per_image * slices_per_image) + self.output_files['dp_sky_image'] = {'nr_files': nr_images, 'file_size': 1000} + logger.debug("dp_sky_image: {} files {} bytes each".format(nr_images, 1000)) + + # count total data size + for values in self.output_files.itervalues(): + self.total_data_size += values['nr_files'] * values['file_size'] + self.total_bandwidth = ceil((self.total_data_size * 8) / self.duration) # bits/second + return + diff --git a/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/longbaseline_pipeline.py b/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/longbaseline_pipeline.py new file mode 100644 index 0000000000000000000000000000000000000000..eb52034868de6d720f577a0728ae8c94047f426d --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/longbaseline_pipeline.py @@ -0,0 +1,70 @@ +# base_resource_estimator.py +# +# Copyright (C) 2016 +# ASTRON (Netherlands Institute for Radio Astronomy) +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. +# +# $Id: base_resource_estimator.py 33534 2016-02-08 14:28:26Z schaap $ + +import logging +from math import ceil +from base_resource_estimator import BaseResourceEstimator +from lofar.parameterset import parameterset + +logger = logging.getLogger(__name__) + + +class LongBaselinePipelineResourceEstimator(BaseResourceEstimator): + """ LongBaselinePipelineResourceEstimator + """ + def __init__(self, kwargs, input_files): + BaseResourceEstimator.__init__(self, name='longbaseline_pipeline') + logger.debug("init LongBaselinePipelineResourceEstimator") + self.parset = ParameterSet(kwargs).make_subset('dp.output') + self.duration = int(kwargs.get('observation.duration', 1)) + self.input_files = input_files + self.required_keys = ('correlated.enabled', 'longbaseline.subband_groups_per_ms', + 'longbaseline.subbands_per_subband_group') + if self.checkParsetForRequiredKeys(): + self.estimate() + return + + def estimate(self): + """ Estimate for calibration pipeline + calculates: datasize (number of files, file size), bandwidth + """ + logger.debug("start estimate '{}'".format(self.name)) + if 'dp_correlated_uv' in self.input_files: + if self.parset['correlated']['enabled'] == 'true': + logger.debug("calculate long baseline data size") + + nr_output_files = 0 + subband_groups_per_ms = int(self.parset['longbaseline']['subband_groups_per_ms']) + subbands_per_subband_group = int(self.parset['longbaseline']['subbands_per_subband_group']) + if subband_groups_per_ms and subbands_per_subband_group: + nr_input_files = int(self.input_files['dp_correlated_uv']['nr_files']) + if (nr_input_files % (subbands_per_subband_group * subband_groups_per_ms)) == 0: + nr_output_files = nr_input_files / (subbands_per_subband_group * subband_groups_per_ms) + self.output_files['dp_correlated_uv'] = {'nr_files': nr_output_files, 'file_size': 1000} + logger.debug("dp_correlated_uv: {} files {} bytes each".format(nr_output_files, 1000)) + + # count total data size + for values in self.output_files.itervalues(): + self.total_data_size += values['nr_files'] * values['file_size'] + self.total_bandwidth = ceil((self.total_data_size * 8) / self.duration) # bits/second + return + diff --git a/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/observation.py b/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/observation.py new file mode 100644 index 0000000000000000000000000000000000000000..50b01555b0ede30943c986b29fddbe86b33c7ea6 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/observation.py @@ -0,0 +1,275 @@ +# observation.py +# +# Copyright (C) 2016 +# ASTRON (Netherlands Institute for Radio Astronomy) +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. +# +# $Id: observation.py 33534 2016-02-08 14:28:26Z schaap $ + +import logging +from math import ceil, floor +from base_resource_estimator import BaseResourceEstimator + +logger = logging.getLogger(__name__) + +COBALT = "Observation.ObservationControl.OnlineControl.Cobalt." + +class ObservationResourceEstimator(BaseResourceEstimator): + """ ResourceEstimator for LOFAR Observations + """ + def __init__(self): + logger.info("init ObservationResourceEstimator") + super(ObservationResourceEstimator, self).__init__(name='observation') + self.required_keys = ('Observation.sampleClock', + 'Observation.startTime', + 'Observation.stopTime', + 'Observation.antennaSet', + COBALT + 'Correlator.nrChannelsPerSubband', + COBALT + 'Correlator.integrationTime', + COBALT + 'BeamFormer.flysEye', + COBALT + 'BeamFormer.CoherentStokes.timeIntegrationFactor', + COBALT + 'BeamFormer.IncoherentStokes.timeIntegrationFactor', + 'Observation.VirtualInstrument.stationList', + 'Observation.DataProducts.Output_CoherentStokes.enabled', + COBALT + 'BeamFormer.CoherentStokes.which', + 'Observation.DataProducts.Output_IncoherentStokes.enabled', + COBALT + 'BeamFormer.IncoherentStokes.which' + ) + + def _calculate(self, parset, input_files={}): + """ Calculate the combined resources needed by the different observation types that + can be in a single observation. + """ + logger.info("start estimate '{}'".format(self.name)) + logger.info('parset: %s ' % parset) + duration = self._getDuration(parset.getString('Observation.startTime'), parset.getString('Observation.stopTime')) + + result = {} + output_files = {} + correlated_size, correlated_bandwidth, output_files_uv, correlated_saps = self.correlated(parset, duration) + coherentstokes_size, coherentstokes_bandwidth, output_files_cs, coherentstokes_saps = self.coherentstokes(parset, duration) + incoherentstokes_size, incoherentstokes_bandwidth, output_files_is, incoherentstokes_saps = self.incoherentstokes(parset, duration) + + if output_files_uv: + output_files['uv'] = output_files_uv + if output_files_cs: + output_files['cs'] = output_files_cs + if output_files_is: + output_files['is'] = output_files_is + + output_files['saps'] = [] + for sap_nr in xrange(parset.getInt('Observation.nrBeams')): + sap = {'sap_nr': sap_nr, 'properties': {}} + if sap_nr in correlated_saps: + sap['properties'].update(correlated_saps[sap_nr]) + if sap_nr in coherentstokes_saps: + sap['properties'].update(coherentstokes_saps[sap_nr]) + if sap_nr in incoherentstokes_saps: + sap['properties'].update(incoherentstokes_saps[sap_nr]) + output_files['saps'].append(sap) + + total_data_size = correlated_size + coherentstokes_size + incoherentstokes_size + result['storage'] = {'total_size': total_data_size, 'output_files': output_files} + result['bandwidth'] = {'total_size': correlated_bandwidth + coherentstokes_bandwidth + incoherentstokes_bandwidth} + return result + + def correlated(self, parset, duration): + """ Estimate number of files, file size and bandwidth needed for correlated data""" + logger.info("calculating correlated datasize") + size_of_header = 512 #TODO More magic numbers (probably from Alwin). ScS needs to check these. They look ok though. + size_of_overhead = 600000 + size_of_short = 2 + size_of_complex = 8 + nr_polarizations = 2 + channels_per_subband = parset.getInt(COBALT + 'Correlator.nrChannelsPerSubband', 64) #TODO should these have defaults? + intergration_time = parset.getFloat(COBALT + 'Correlator.integrationTime', 1) + nr_virtual_stations = self._virtual_stations(parset) + + integrated_seconds = floor(duration / intergration_time) + nr_baselines = nr_virtual_stations * (nr_virtual_stations + 1.0) / 2.0 #TODO Why is this done in float? + data_size = ceil((nr_baselines * channels_per_subband * nr_polarizations**2 * size_of_complex) / 512.0) * 512.0 #TODO What's the 512.0 magic numbers? + n_sample_size = ceil((nr_baselines * channels_per_subband * size_of_short) / 512.0) * 512.0 + + # sum of all subbands in all digital beams + total_files = 0 + sap_files = {} + + for sap_nr in xrange(parset.getInt('Observation.nrBeams')): + subbandList = parset.getStringVector('Observation.Beam[%d].subbandList' % sap_nr) + nr_files = len(subbandList) + total_files += nr_files + sap_files[sap_nr]= {'nr_of_uv_files': nr_files} + + file_size = int((data_size + n_sample_size + size_of_header) * integrated_seconds + size_of_overhead) + output_files = {'nr_of_uv_files': total_files, 'uv_file_size': file_size} + logger.info("correlated_uv: {} files {} bytes each".format(total_files, file_size)) + + total_data_size = int(ceil(file_size * total_files)) # bytes + total_bandwidth = int(ceil((total_data_size * 8) / duration)) # bits/second + return (total_data_size, total_bandwidth, output_files, sap_files) + + def coherentstokes(self, parset, duration): + """ Estimate number of files, file size and bandwidth needed for coherent stokes + """ + if not parset.getBool('Observation.DataProducts.Output_CoherentStokes.enabled'): + return (0,0, {}, {}) + + logger.info("calculate coherentstokes datasize") + coherent_type = parset.getString(COBALT + 'BeamFormer.CoherentStokes.which') + subbands_per_file = parset.getInt(COBALT + 'BeamFormer.CoherentStokes.subbandsPerFile', 512) + samples_per_second = self._samples_per_second(parset) + integration_factor = parset.getInt(COBALT + 'BeamFormer.CoherentStokes.timeIntegrationFactor') + + nr_coherent = 4 if coherent_type in ('XXYY', 'IQUV') else 1 + if coherent_type in ('XXYY',): + size_per_subband = samples_per_second * 4.0 * duration + else: + size_per_subband = (samples_per_second * 4.0 * duration) / integration_factor + + total_nr_stokes = 0 + total_files = 0 + max_nr_subbands = 0 + sap_files = {} + + for sap_nr in xrange(parset.getInt('Observation.nrBeams')): + logger.info("checking SAP {}".format(sap_nr)) + subbandList = parset.getStringVector('Observation.Beam[%d].subbandList' % sap_nr) + nr_subbands = len(subbandList) + max_nr_subbands = max(nr_subbands, max_nr_subbands) + nr_files = 0 + total_nr_tabs = 0 + + for tab_nr in xrange(parset.getInt('Observation.Beam[%d].nrTiedArrayBeams' % sap_nr)): + logger.info("checking TAB {}".format(tab_nr)) + if parset.getBool("Observation.Beam[%d].TiedArrayBeam[%d].coherent" % (sap_nr, tab_nr)): + logger.info("adding coherentstokes size") + nr_stokes = nr_coherent #TODO what does min mean here? + total_nr_tabs += 1 + total_nr_stokes += nr_stokes + nr_files += int(nr_stokes * ceil(nr_subbands / float(subbands_per_file))) + + nr_tab_rings = parset.getInt('Observation.Beam[%d].nrTabRings' % sap_nr) + if nr_tab_rings > 0: + logger.info("adding size for {} tab_rings".format(nr_tab_rings)) + nr_tabs = (3 * nr_tab_rings * (nr_tab_rings + 1) + 1) + total_nr_tabs += nr_tabs + nr_stokes = nr_tabs * nr_coherent + total_nr_stokes += nr_stokes + nr_files += int(nr_stokes * ceil(nr_subbands / float(subbands_per_file))) + + if parset.getBool(COBALT + 'BeamFormer.flysEye'): + logger.info("adding flys eye data size") + nr_tabs = self._virtual_stations(parset) + total_nr_tabs += nr_tabs + nr_stokes = nr_tabs * nr_coherent + total_nr_stokes += nr_stokes + nr_files += int(nr_stokes * ceil(nr_subbands / float(subbands_per_file))) + + sap_files[sap_nr]= {'nr_of_cs_files': nr_files, 'nr_of_tabs': total_nr_tabs} + total_files += nr_files + + nr_subbands_per_file = min(subbands_per_file, max_nr_subbands) + size_per_file = int(nr_subbands_per_file * size_per_subband) + + output_files = {'nr_of_cs_files': total_files, 'nr_of_cs_stokes': nr_coherent, 'cs_file_size': size_per_file} + logger.info("coherentstokes: {} files {} bytes each".format(total_files, size_per_file)) + + total_data_size = int(ceil(total_nr_stokes * max_nr_subbands * size_per_subband)) + total_bandwidth = int(ceil((total_data_size * 8) / duration)) # bits/second + return (total_data_size, total_bandwidth, output_files, sap_files) + + def incoherentstokes(self, parset, duration): + """ Estimate number of files, file size and bandwidth needed for incoherentstokes + """ + if not parset.getBool('Observation.DataProducts.Output_IncoherentStokes.enabled'): + return (0,0, {}, {}) + + logger.info("calculate incoherentstokes data size") + incoherent_type = parset.getString(COBALT + 'BeamFormer.IncoherentStokes.which') + subbands_per_file = parset.getInt(COBALT + 'BeamFormer.CoherentStokes.subbandsPerFile', 512) + samples_per_second = self._samples_per_second(parset) + time_integration_factor = parset.getInt(COBALT + 'BeamFormer.IncoherentStokes.timeIntegrationFactor') + channels_per_subband = parset.getInt(COBALT + 'Correlator.nrChannelsPerSubband', 64) #TODO should these have defaults? + incoherent_channels_per_subband = parset.getInt(COBALT + 'BeamFormer.IncoherentStokes.nrChannelsPerSubband', 0) + + nr_incoherent = 4 if incoherent_type in ('IQUV',) else 1 + + total_nr_stokes = 0 + total_files = 0 + max_nr_subbands = 0 + sap_files = {} + + for sap_nr in xrange(parset.getInt('Observation.nrBeams')): + logger.info("checking SAP {}".format(sap_nr)) + subbandList = parset.getStringVector('Observation.Beam[%d].subbandList' % sap_nr) + nr_subbands = len(subbandList) + max_nr_subbands = max(nr_subbands, max_nr_subbands) + nr_files = 0 + total_nr_tabs = parset.getInt('Observation.Beam[%d].nrTiedArrayBeams' % sap_nr) + for tab_nr in xrange(total_nr_tabs): + logger.info("checking TAB {}".format(tab_nr)) + if not parset.getBool("Observation.Beam[%d].TiedArrayBeam[%d].coherent" % (sap_nr, tab_nr)): + logger.info("adding incoherentstokes size") + total_nr_stokes += nr_incoherent + nr_files += int(nr_incoherent * ceil(nr_subbands / float(subbands_per_file))) + + sap_files[sap_nr]= {'nr_of_is_files': nr_files, 'nr_of_tabs': total_nr_tabs} + total_files += nr_files + + if incoherent_channels_per_subband > 0: + channel_integration_factor = channels_per_subband / incoherent_channels_per_subband + else: + channel_integration_factor = 1 + + if total_files > 0: + nr_subbands_per_file = min(subbands_per_file, max_nr_subbands) + size_per_subband = int((samples_per_second * 4) / time_integration_factor / channel_integration_factor * duration) + size_per_file = nr_subbands_per_file * size_per_subband + + output_files = {'nr_of_is_files': total_files, 'nr_of_is_stokes': nr_incoherent, 'is_file_size': int(size_per_file)} + logger.info("incoherentstokes: {} files {} bytes each".format(total_files, size_per_file)) + + total_data_size = int(ceil(total_nr_stokes * max_nr_subbands * size_per_subband)) # bytes + total_bandwidth = int(ceil((total_data_size * 8) / duration)) # bits/sec + return (total_data_size, total_bandwidth, output_files, sap_files) + + def _samples_per_second(self, parset): + """ set samples per second + """ + samples_160mhz = 155648 + samples_200mhz = 196608 + sample_clock = parset.getInt('Observation.sampleClock') + samples = samples_160mhz if 160 == sample_clock else samples_200mhz + logger.info("samples per second for {} MHz clock = {}".format(sample_clock, samples)) + return samples + + def _virtual_stations(self, parset): + """ calculate virtualnumber of stations + """ + stationList = parset.getStringVector('Observation.VirtualInstrument.stationList') + nr_virtual_stations = 0 + if parset.getString('Observation.antennaSet') in ('HBA_DUAL', 'HBA_DUAL_INNER'): + for station in stationList: + if 'CS' in station: + nr_virtual_stations += 2 + else: + nr_virtual_stations += 1 + else: + nr_virtual_stations = len(stationList) + logger.info("number of virtual stations = {}".format(nr_virtual_stations)) + return nr_virtual_stations + diff --git a/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/parameterset.py b/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/parameterset.py new file mode 100644 index 0000000000000000000000000000000000000000..d534e0f8facdef9a25e8af061a92da80e8653d12 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/parameterset.py @@ -0,0 +1,69 @@ + + +class ParameterSet(object): + def __init__(self, data=None): + self.parset = {} + if data: + if type(data) == dict: + self.parset = data + elif type(data) == str: + self.import_string(data) + + def clear(self): + self.parset = {} + + def get_set(self): + return self.parset + + def import_file(self, filename): + fd = open(filename, 'r') + data = fd.readlines() + fd.close() + self.import_string(data) + + def import_string(self, data): + if isinstance(data, basestring): + data = data.split('\n') + + for line in data: + if line.strip() == '' or line.strip()[0] == '#': + continue + ps = self.parset + #key, value = line.strip().split('=') + items = [x.strip() for x in line.strip().split('=')] + if len(items) != 2: + continue + key, value = items[0], items[1] + key_list = key.strip().split('.') + #print key_list, key_list[-1] + + last_key = key_list[-1] + for k in key_list[:-1]: + if k in ps: + ps = ps[k] + else: + ps[k] = {} + ps = ps[k] + ps[key_list[-1]] = value.strip() + + def replace(self, key, value): + self.parset[key] = value + + def make_subset(self, subset): + keys = subset.strip().split('.') + ps = self.parset + for key in keys: + ps = ps[key] + return ps + + def get(self, key, default_val=None): + ps = self.parset + keys = key.split('.') + try: + for k in keys: + ps = ps[k] + except: + ps = default_val + return ps + + diff --git a/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/pulsar_pipeline.py b/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/pulsar_pipeline.py new file mode 100644 index 0000000000000000000000000000000000000000..d907c2f2f2e51e56b158e996ee88c21e26410f0f --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEstimator/resource_estimators/pulsar_pipeline.py @@ -0,0 +1,71 @@ +# base_resource_estimator.py +# +# Copyright (C) 2016 +# ASTRON (Netherlands Institute for Radio Astronomy) +# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +# +# This file is part of the LOFAR software suite. +# The LOFAR software suite is free software: you can redistribute it +# and/or modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# The LOFAR software suite is distributed in the hope that it will be +# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with the LOFAR software suite. If not, see <http://www.gnu.org/licenses/>. +# +# $Id: base_resource_estimator.py 33534 2016-02-08 14:28:26Z schaap $ + +import logging +from math import ceil +from base_resource_estimator import BaseResourceEstimator +from lofar.parameterset import parameterset + +logger = logging.getLogger(__name__) + +class PulsarPipelineResourceEstimator(BaseResourceEstimator): + """ PulsarPipelineResourceEstimator + + """ + def __init__(self, kwargs, input_files): + BaseResourceEstimator.__init__(self, name='pulsar_pipeline') + self.parset = ParameterSet(kwargs).make_subset('dp.output') + self.duration = int(kwargs.get('observation.duration', 1)) + self.coherent_stokes_type = kwargs.get('observation.coherent_stokes.type') + self.input_files = input_files + self.required_keys = ('pulsar.enabled',) + if self.checkParsetForRequiredKeys(): + self.estimate() + return + + def estimate(self): + """ Estimate for pulsar pipeline + calculates: datasize (number of files, file size), bandwidth + """ + logger.debug("start estimate '{}'".format(self.name)) + if self.parset['pulsar']['enabled'] == 'true': + logger.debug("calculate pulsar data size") + nr_output_files = 0 + if 'dp_coherent_stokes' in self.input_files: + nr_input_files = int(self.input_files['dp_coherent_stokes']['nr_files']) + if self.coherent_stokes_type == 'DATA_TYPE_XXYY': + nr_output_files += nr_input_files / 4 + else: + nr_output_files += nr_input_files + + if 'dp_incoherent_stokes' in self.input_files: + nr_input_files = int(self.input_files['dp_incoherent_stokes']['nr_files']) + nr_output_files += nr_input_files + + self.output_files['dp_pulsar'] = {'nr_files': nr_output_files, 'file_size': 1000} + logger.debug("dp_pulsar: {} files {} bytes each".format(nr_output_files, 1000)) + + # count total data size + for values in self.output_files.itervalues(): + self.total_data_size += values['nr_files'] * values['file_size'] + self.total_bandwidth = ceil((self.total_data_size * 8) / self.duration) # bits/second + return diff --git a/SAS/ResourceAssignment/ResourceAssignmentEstimator/service.py b/SAS/ResourceAssignment/ResourceAssignmentEstimator/service.py new file mode 100644 index 0000000000000000000000000000000000000000..342e180c4aabcd444aa6bb17f98dbca39c556e65 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEstimator/service.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python +# $Id: service.py $ + +''' +Simple Service listening +''' + +import logging +from lofar.messaging import Service +from lofar.messaging.Service import MessageHandlerInterface + +from lofar.sas.resourceassignment.resourceassignmentestimator.resource_estimators import * +from lofar.sas.resourceassignment.resourceassignmentestimator.config import DEFAULT_BUSNAME, DEFAULT_SERVICENAME + +logger = logging.getLogger(__name__) + +class ResourceEstimatorHandler(MessageHandlerInterface): + def __init__(self, **kwargs): + super(ResourceEstimatorHandler, self).__init__(**kwargs) + self.observation = ObservationResourceEstimator() + #self.longbaseline_pipeline = LongBaselinePipelineResourceEstimator() + #self.calibration_pipeline = CalibrationPipelineResourceEstimator() + #self.pulsar_pipeline = PulsarPipelineResourceEstimator() + #self.imaging_pipeline = ImagePipelineResourceEstimator() + + def handle_message(self, content): + specification_tree = content["specification_tree"] + return self._get_estimated_resources(specification_tree) ##TODO also handle MoM tasks in RA 1.2 + + #def _getPredecessors(self, parset): + + + def _get_estimated_resources(self, specification_tree): + logger.info('get_estimated_resources on: %s' % specification_tree) + result = {} + + otdb_id = specification_tree['otdb_id'] + main_parset = specification_tree['specification'] + if specification_tree['task_type'] == 'observation': + result[str(otdb_id)] = self.observation.estimate(main_parset) + + #TODO: implement properly + #pipeline_input_files = result['observation']['output_files'] + + #longbaseline = LongBaselinePipelineResourceEstimator(parsetDict, input_files=pipeline_input_files) + #result.update(longbaseline.result_as_dict()) + + #calibration = CalibrationPipelineResourceEstimator(parsetDict, input_files=pipeline_input_files) + #result.update(calibration.result_as_dict()) + + #pulsar = PulsarPipelineResourceEstimator(parsetDict, input_files=pipeline_input_files) + #result.update(pulsar.result_as_dict()) + + #image = ImagePipelineResourceEstimator(parsetDict, input_files=pipeline_input_files) + #result.update(image.result_as_dict()) + + return result + + +def createService(busname=DEFAULT_BUSNAME, servicename=DEFAULT_SERVICENAME, broker=None): + return Service(servicename=servicename, + servicehandler=ResourceEstimatorHandler, + busname=busname, + broker=broker, + numthreads=1, + verbose=True) + +def main(): + from optparse import OptionParser + from lofar.messaging import setQpidLogLevel + from lofar.common.util import waitForInterrupt + + # Check the invocation arguments + parser = OptionParser("%prog [options]", + description='runs the resourceassigner service') + parser.add_option('-q', '--broker', dest='broker', type='string', default=None, help='Address of the qpid broker, default: localhost') + parser.add_option("-b", "--busname", dest="busname", type="string", default=DEFAULT_BUSNAME, help="Name of the bus exchange on the qpid broker, default: %s" % DEFAULT_BUSNAME) + parser.add_option("-s", "--servicename", dest="servicename", type="string", default=DEFAULT_SERVICENAME, help="Name for this service, default: %s" % DEFAULT_SERVICENAME) + parser.add_option('-V', '--verbose', dest='verbose', action='store_true', help='verbose logging') + (options, args) = parser.parse_args() + + setQpidLogLevel(logging.INFO) + logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', + level=logging.DEBUG if options.verbose else logging.INFO) + + with createService(busname=options.busname, servicename=options.servicename, broker=options.broker): + waitForInterrupt() + +if __name__ == '__main__': + main() diff --git a/SAS/ResourceAssignment/ResourceAssignmentEstimator/test/CMakeLists.txt b/SAS/ResourceAssignment/ResourceAssignmentEstimator/test/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..93b6b35fae3c17a3e702c4b400a0900d81b8c60a --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEstimator/test/CMakeLists.txt @@ -0,0 +1,11 @@ +# $Id: CMakeLists.txt $ +include(LofarCTest) + +lofar_add_test(t_resource_estimator) + +set(_py_files + __init__.py + testset.py +) + +python_install(${_py_files} DESTINATION lofar/sas/resourceassignment/resourceassignmentestimator/test) diff --git a/SAS/ResourceAssignment/ResourceAssignmentEstimator/test/__init__.py b/SAS/ResourceAssignment/ResourceAssignmentEstimator/test/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..74e4d4fb4f87fce732da982bdfe3b11c50aedc3d --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEstimator/test/__init__.py @@ -0,0 +1 @@ +# $Id: __init__.py donker $ diff --git a/SAS/ResourceAssignment/ResourceAssignmentEstimator/test/t_resource_estimator.py b/SAS/ResourceAssignment/ResourceAssignmentEstimator/test/t_resource_estimator.py new file mode 100755 index 0000000000000000000000000000000000000000..0ffcb51efee0edb29509a109aa723b978855e022 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEstimator/test/t_resource_estimator.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python + +print "TODO: fix this test" +exit(3) + +import unittest +import uuid +import datetime +import logging +from lofar.messaging import RPC, RPCException +from lofar.sas.resourceassignment.resourceassignmentestimator.service import createService +from lofar.sas.resourceassignment.resourceassignmentestimator.test.testset import TestSet + +logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) +logger = logging.getLogger(__name__) + +try: + from qpid.messaging import Connection + from qpidtoollibs import BrokerAgent +except ImportError: + print 'Cannot run test without qpid tools' + print 'Please source qpid profile' + exit(3) + +try: + # setup broker connection + connection = Connection.establish('127.0.0.1') + broker = BrokerAgent(connection) + + # add test service busname + busname = 'test-lofarbus-raestimator-%s' % (uuid.uuid1()) + broker.addExchange('topic', busname) + + class Test1(unittest.TestCase): + '''Test''' + + def test(self): + '''basic test ''' + self.maxDiff = None + ts = TestSet() + + # test observation + ts.add_observation() + with RPC('ResourceEstimation', busname=busname, timeout=3) as rpc: + result = rpc(ts.test_dict() ) + self.assertEqual(result[0], ts.valid_dict()) + + # test add beams + ts.add_observation_beams() + with RPC('ResourceEstimation', busname=busname, timeout=3) as rpc: + result = rpc( ts.test_dict() ) + self.assertEqual(result[0], ts.valid_dict()) + + # test add flys_eye + ts.enabble_flys_eye() + with RPC('ResourceEstimation', busname=busname, timeout=3) as rpc: + result = rpc( ts.test_dict() ) + self.assertEqual(result[0], ts.valid_dict()) + + # test add coherent_stokes + ts.enable_observations_coherent_stokes() + with RPC('ResourceEstimation', busname=busname, timeout=3) as rpc: + result = rpc( ts.test_dict() ) + self.assertEqual(result[0], ts.valid_dict()) + + # test add incoherent_stokes + ts.enable_observations_incoherent_stokes() + with RPC('ResourceEstimation', busname=busname, timeout=3) as rpc: + result = rpc( ts.test_dict() ) + self.assertEqual(result[0], ts.valid_dict()) + + # test add calibration_pipeline + ts.enable_calibration_pipeline() + with RPC('ResourceEstimation', busname=busname, timeout=3) as rpc: + result = rpc( ts.test_dict() ) + self.assertEqual(result[0], ts.valid_dict()) + + # test add longbaseline_pipeline + ts.enable_longbaseline_pipeline() + with RPC('ResourceEstimation', busname=busname, timeout=3) as rpc: + result = rpc( ts.test_dict() ) + self.assertEqual(result[0], ts.valid_dict()) + + # test add pulsar_pipeline + ts.enable_pulsar_pipeline() + with RPC('ResourceEstimation', busname=busname, timeout=3) as rpc: + result = rpc( ts.test_dict() ) + self.assertEqual(result[0], ts.valid_dict()) + + # test add image_pipeline + ts.enable_image_pipeline() + with RPC('ResourceEstimation', busname=busname, timeout=3) as rpc: + result = rpc( ts.test_dict() ) + self.assertEqual(result[0], ts.valid_dict()) + + # create and run the service + with createService(busname=busname): + # and run all tests + unittest.main(verbosity=2) + +finally: + # cleanup test bus and exit + broker.delExchange(busname) + connection.close() diff --git a/SAS/ResourceAssignment/ResourceAssignmentEstimator/test/t_resource_estimator.run b/SAS/ResourceAssignment/ResourceAssignmentEstimator/test/t_resource_estimator.run new file mode 100755 index 0000000000000000000000000000000000000000..773605e015aae9972145cd5902701006dc21ad4e --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEstimator/test/t_resource_estimator.run @@ -0,0 +1,4 @@ +#!/bin/bash + +source python-coverage.sh +python_coverage_test "ResourceAssignmentEstimator*" t_resource_estimator.py diff --git a/SAS/ResourceAssignment/ResourceAssignmentEstimator/test/t_resource_estimator.sh b/SAS/ResourceAssignment/ResourceAssignmentEstimator/test/t_resource_estimator.sh new file mode 100755 index 0000000000000000000000000000000000000000..7633be54d894468a3c08160aa9170a0ffcd73f98 --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEstimator/test/t_resource_estimator.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +./runctest.sh t_resource_estimator diff --git a/SAS/ResourceAssignment/ResourceAssignmentEstimator/test/testset.py b/SAS/ResourceAssignment/ResourceAssignmentEstimator/test/testset.py new file mode 100644 index 0000000000000000000000000000000000000000..b861309fae143187b275173d9eb2b4e1f185a44f --- /dev/null +++ b/SAS/ResourceAssignment/ResourceAssignmentEstimator/test/testset.py @@ -0,0 +1,237 @@ +#TODO: fix test + +#""" test parameterset for resource estimator +#""" + +#from lofar.sas.resourceassignment.resourceassignmentestimator.resource_estimators import ParameterSet + +#class TestSet(object): + #def __init__(self): + #self.check_set = ParameterSet() + #self.valid_set = ParameterSet() + + #def clear(self): + #self.check_set.clear() + #self.valid_set.clear() + + #def test_dict(self): + #return self.check_set.get_set() + + #def valid_dict(self): + #return self.valid_set.get_set() + + ## for observation + #def add_observation(self): + #checkset = """ + #observation.sample_clock= 200 + #observation.duration=3600 + #observation.channels_per_subband= 61 + #observation.intergration_time= 1 + #observation.antenna_mode= HBA_DUAL + #observation.stations= [CS001, CS002, RS307, RS509] + #observation.flys_eye.enabled= false + #observation.nr_beams= 0 + + ## coherent_stokes.type can be: DATA_TYPE_XXYY or DATA_TYPE_STOKES_IQUV + #observation.output.coherent_stokes.enabled= false + #observation.output.coherent_stokes.type= + #observation.output.coherent_stokes.integration_factor= + + ## incoherent_stokes.type can be: DATA_TYPE_STOKES_IQUV + #observation.output.incoherent_stokes.enabled= false + #observation.output.incoherent_stokes.type= + + ## for calibration-pipeline + #dp.output.correlated.enabled= false + #dp.output.correlated.demixing_settings.freq_step= + #dp.output.correlated.demixing_settings.time_step= + #dp.output.instrument_model.enabled= false + + ## for longbaseline-pipeline + #dp.output.longbaseline.enabled= false + #dp.output.longbaseline.subband_groups_per_ms= + #dp.output.longbaseline.subbands_per_subband_group= + + ## for pulsar-pipeline + #dp.output.pulsar.enabled= false + + ## for image-pipeline + #dp.output.skyimage.enabled= false + #dp.output.skyimage.slices_per_image= + #dp.output.skyimage.subbands_per_image= + #""" + #self.check_set.import_string(checkset) + #validset = """ + #observation.total_data_size= + #observation.total_bandwidth= + #observation.output_files.dp_correlated_uv.nr_files= + #observation.output_files.dp_correlated_uv.file_size= + #observation.output_files.dp_coherent_stokes.nr_files= + #observation.output_files.dp_coherent_stokes.file_size= + #observation.output_files.dp_incoherent_stokes.nr_files= + #observation.output_files.dp_incoherent_stokes.file_size= + #""" + #self.valid_set.import_string(validset) + + + #def add_observation_beams(self): + #checkset = """ + #observation.nr_beams= 2 + #observation.beam[0].nr_subbands= 400 + #observation.beam[0].nr_tab_rings= 4 + #observation.beam[0].tied_array_beam[0].coherent= true + #observation.beam[0].tied_array_beam[1].coherent= true + #observation.beam[1].nr_subbands= 400 + #observation.beam[1].nr_tab_rings= 4 + #observation.beam[1].tied_array_beam[0].coherent= true + #observation.beam[1].tied_array_beam[1].coherent= true + #""" + #self.check_set.import_string(checkset) + #self.check_set.import_string(checkset) + #validset = """ + #observation.total_data_size= + #observation.total_bandwidth= + #observation.output_files.dp_correlated_uv.nr_files= + #observation.output_files.dp_correlated_uv.file_size= + #observation.output_files.dp_coherent_stokes.nr_files= + #observation.output_files.dp_coherent_stokes.file_size= + #observation.output_files.dp_incoherent_stokes.nr_files= + #observation.output_files.dp_incoherent_stokes.file_size= + #""" + #self.valid_set.import_string(validset) + + + #def enable_observations_coherent_stokes(self): + #checkset = """ + ## coherent_stokes.type can be: DATA_TYPE_XXYY or DATA_TYPE_STOKES_IQUV + #observation.output.coherent_stokes.enabled= true + #observation.output.coherent_stokes.type= DATA_TYPE_XXYY + #observation.output.coherent_stokes.integration_factor= 1 + #""" + #self.check_set.import_string(checkset) + #self.check_set.import_string(checkset) + #validset = """ + #observation.total_data_size= + #observation.total_bandwidth= + #observation.output_files.dp_correlated_uv.nr_files= + #observation.output_files.dp_correlated_uv.file_size= + #observation.output_files.dp_coherent_stokes.nr_files= + #observation.output_files.dp_coherent_stokes.file_size= + #observation.output_files.dp_incoherent_stokes.nr_files= + #observation.output_files.dp_incoherent_stokes.file_size= + #""" + #self.valid_set.import_string(validset) + + + #def enable_observations_incoherent_stokes(self): + #checkset = """ + ## incoherent_stokes.type can be: DATA_TYPE_STOKES_IQUV + #observation.output.incoherent_stokes.enabled= true + #observation.output.incoherent_stokes.type= DATA_TYPE_STOKES_IQUV + #""" + #self.check_set.import_string(checkset) + #self.check_set.import_string(checkset) + #validset = """ + #observation.total_data_size= + #observation.total_bandwidth= + #observation.output_files.dp_correlated_uv.nr_files= + #observation.output_files.dp_correlated_uv.file_size= + #observation.output_files.dp_coherent_stokes.nr_files= + #observation.output_files.dp_coherent_stokes.file_size= + #observation.output_files.dp_incoherent_stokes.nr_files= + #observation.output_files.dp_incoherent_stokes.file_size= + #""" + #self.valid_set.import_string(validset) + + + #def enabble_flys_eye(self): + #checkset = """ + #observation.flys_eye.enabled= true + #""" + #self.check_set.import_string(checkset) + #self.check_set.import_string(checkset) + #validset = """ + #observation.total_data_size= + #observation.total_bandwidth= + #observation.output_files.dp_correlated_uv.nr_files= + #observation.output_files.dp_correlated_uv.file_size= + #observation.output_files.dp_coherent_stokes.nr_files= + #observation.output_files.dp_coherent_stokes.file_size= + #observation.output_files.dp_incoherent_stokes.nr_files= + #observation.output_files.dp_incoherent_stokes.file_size= + #""" + #self.valid_set.import_string(validset) + + ## for all pipelines + #def enable_calibration_pipeline(self): + #checkset = """ + ## for calibration-pipeline + #dp.output.correlated.enabled= true + #dp.output.correlated.demixing_settings.freq_step= 60 + #dp.output.correlated.demixing_settings.time_step= 10 + #dp.output.instrument_model.enabled= true + #""" + #self.check_set.import_string(checkset) + #self.check_set.import_string(checkset) + #validset = """ + #calibration_pipeline.total_data_size= + #calibration_pipeline.total_bandwidth= + #calibration_pipeline.dp_correlated_uv.nr_files= + #calibration_pipeline.dp_correlated_uv.file_size= + #calibration_pipeline.dp_instrument_model.nr_files= + #calibration_pipeline.dp_instrument_model.file_size= + #""" + #self.valid_set.import_string(validset) + + + #def enable_longbaseline_pipeline(self): + #checkset = """ + ## for -pipeline + #dp.output.longbaseline.enabled= true + #dp.output.longbaseline.subband_groups_per_ms= 1 + #dp.output.longbaseline.subbands_per_subband_group= 1 + #""" + #self.check_set.import_string(checkset) + #self.check_set.import_string(checkset) + #validset = """ + #longbaseline_pipeline.total_data_size= + #longbaseline_pipeline.total_bandwidth= + #longbaseline_pipeline.dp_correlated_uv.nr_files= + #longbaseline_pipeline.dp_correlated_uv.file_size= + #""" + #self.valid_set.import_string(validset) + + + #def enable_pulsar_pipeline(self): + #checkset = """ + ## for pulsar-pipeline + #dp.output.pulsar.enabled= true + #""" + #self.check_set.import_string(checkset) + #self.check_set.import_string(checkset) + #validset = """ + #pulsar_pipeline.total_data_size= + #pulsar_pipeline.total_bandwidth= + #pulsar_pipeline.dp_pulsar.nr_files= + #pulsar_pipeline.dp_pulsar.file_size= + #""" + #self.valid_set.import_string(validset) + + + #def enable_image_pipeline(self): + #checkset = """ + ## for image-pipeline + #dp.output.skyimage.enabled= true + #dp.output.skyimage.slices_per_image= 1 + #dp.output.skyimage.subbands_per_image= 2 + #""" + #self.check_set.import_string(checkset) + #self.check_set.import_string(checkset) + #validset = """ + #image_pipeline.total_data_size= + #image_pipeline.total_bandwidth= + #image_pipeline.dp_sky_image.nr_files= + #image_pipeline.dp_sky_image.file_size= + #""" + #self.valid_set.import_string(validset) + diff --git a/SAS/ResourceAssignment/ResourceAssignmentService/CMakeLists.txt b/SAS/ResourceAssignment/ResourceAssignmentService/CMakeLists.txt index a59a2ac81a5b75fbc9696748ac6a782361973f8a..96e34ae101c9363212a5aa7e292ddbed4f8c3a3f 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentService/CMakeLists.txt +++ b/SAS/ResourceAssignment/ResourceAssignmentService/CMakeLists.txt @@ -10,7 +10,6 @@ set(_py_files config.py rpc.py service.py - radbbuslistener.py ) python_install(${_py_files} DESTINATION lofar/sas/resourceassignment/resourceassignmentservice) diff --git a/SAS/ResourceAssignment/ResourceAssignmentService/radbservice.ini b/SAS/ResourceAssignment/ResourceAssignmentService/radbservice.ini index b306483aa74afa72b06141f265347627551c8f67..6d6c20f477d95de54eb31dcd7820a19a7e81a4c0 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentService/radbservice.ini +++ b/SAS/ResourceAssignment/ResourceAssignmentService/radbservice.ini @@ -1,5 +1,5 @@ [program:radbservice] -command=/bin/bash -c 'source $LOFARROOT/lofarinit.sh;radbservice --busname=lofar.ra.command --servicename=RADBService' +command=/bin/bash -c 'source $LOFARROOT/lofarinit.sh;radbservice --busname=lofar.ra.command --servicename=RADBService --log-queries' user=lofarsys stopsignal=INT ; KeyboardInterrupt stopasgroup=true ; bash does not propagate signals diff --git a/SAS/ResourceAssignment/ResourceAssignmentService/rpc.py b/SAS/ResourceAssignment/ResourceAssignmentService/rpc.py index 20eba35c51cd1bea550b7b752b96c264531e40f3..7365ca8b1d71a98f67484eb57488f81321b47adf 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentService/rpc.py +++ b/SAS/ResourceAssignment/ResourceAssignmentService/rpc.py @@ -2,8 +2,9 @@ import logging import datetime -from lofar.messaging.RPC import RPC, RPCException +from lofar.messaging.RPC import RPC, RPCException, RPCWrapper from lofar.sas.resourceassignment.resourceassignmentservice.config import DEFAULT_BUSNAME, DEFAULT_SERVICENAME +from lofar.common.util import convertStringDigitKeysToInt ''' Simple RPC client for Service lofarbus.*Z ''' @@ -17,77 +18,48 @@ class RARPCException(Exception): def __str__(self): return "RARPCException: " + str(self.message) - -class RARPC: +class RARPC(RPCWrapper): def __init__(self, busname=DEFAULT_BUSNAME, servicename=DEFAULT_SERVICENAME, broker=None): - self.busname = busname - self.servicename = servicename - self.broker = broker - - self._serviceRPCs = {} #cache of rpc's for each service - - def __enter__(self): - """ - Internal use only. (handles scope 'with') - """ - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - """ - Internal use only. (handles scope 'with') - """ - for rpc in self._serviceRPCs.values(): - rpc.__exit__(None, None, None) - - def _rpc(self, method, timeout=10, **kwargs): - try: - rpckwargs = {'timeout': timeout} - service_method = self.servicename + '.' + method - - if service_method not in self._serviceRPCs: - rpc = RPC(service_method, busname=self.busname, broker=self.broker, ForwardExceptions=True, **rpckwargs) - rpc.Request.__enter__() - self._serviceRPCs[service_method] = rpc - - rpc = self._serviceRPCs[service_method] - - if kwargs: - res, status = rpc(**kwargs) - else: - res, status = rpc() - - if status != 'OK': - logger.error('status: %s' % status) - logger.error('result: %s' % res) - raise RARPCException("%s %s" % (status, res)) - - return res - except RPCException as e: - logger.error(str(e)) - raise RARPCException(str(e)) + super(RARPC, self).__init__(busname, servicename, broker) def getResourceClaimStatuses(self): - return self._rpc('GetResourceClaimStatuses') - - def getResourceClaims(self): - claims = self._rpc('GetResourceClaims') + return self.rpc('GetResourceClaimStatuses') + + def getResourceClaimPropertyTypes(self): + return self.rpc('GetResourceClaimPropertyTypes') + + def getResourceClaimProperties(self, claim_ids=None, task_id=None): + return self.rpc('GetResourceClaimProperties', claim_ids=claim_ids, task_id=task_id) + + def insertResourceClaimProperty(self, claim_id, property_type, value): + return self.rpc('InsertResourceClaimProperty', claim_id=claim_id, property_type=property_type, value=value) + + def getResourceClaims(self, claim_ids=None, lower_bound=None, upper_bound=None, task_id=None, status=None, resource_type=None, extended=False, include_properties=False): + claims = self.rpc('GetResourceClaims', claim_ids=claim_ids, + lower_bound=lower_bound, + upper_bound=upper_bound, + task_id=task_id, + status=status, + resource_type=resource_type, + extended=extended, + include_properties=include_properties) for claim in claims: claim['starttime'] = claim['starttime'].datetime() claim['endtime'] = claim['endtime'].datetime() return claims def getResourceClaim(self, id): - resource_claim = self._rpc('GetResourceClaim', id=id) + resource_claim = self.rpc('GetResourceClaim', id=id) if resource_claim: resource_claim['starttime'] = resource_claim['starttime'].datetime() resource_claim['endtime'] = resource_claim['endtime'].datetime() return resource_claim - def insertResourceClaim(self, resource_id, task_id, starttime, endtime, status, session_id, claim_size, username, user_id): - return self._rpc('InsertResourceClaim', resource_id=resource_id, + def insertResourceClaim(self, resource_id, task_id, starttime, endtime, status, session_id, claim_size, username, user_id, properties=None): + return self.rpc('InsertResourceClaim', resource_id=resource_id, task_id=task_id, starttime=starttime, endtime=endtime, @@ -95,13 +67,21 @@ class RARPC: session_id=session_id, claim_size=claim_size, username=username, - user_id=user_id) + user_id=user_id, + properties=properties) + + def insertResourceClaims(self, task_id, claims, session_id, username, user_id): + return self.rpc('InsertResourceClaims', task_id=task_id, + claims=claims, + session_id=session_id, + username=username, + user_id=user_id) def deleteResourceClaim(self, id): - return self._rpc('DeleteResourceClaim', id=id) + return self.rpc('DeleteResourceClaim', id=id) def updateResourceClaim(self, id, resource_id=None, task_id=None, starttime=None, endtime=None, status=None, session_id=None, claim_size=None, username=None, user_id=None): - return self._rpc('UpdateResourceClaim', id=id, + return self.rpc('UpdateResourceClaim', id=id, resource_id=resource_id, task_id=task_id, starttime=starttime, @@ -112,74 +92,144 @@ class RARPC: username=username, user_id=user_id) - def getResourceClaimsForTask(self, task_id): - claims = self._rpc('GetResourceClaimsForTask', task_id=task_id) - for claim in claims: - claim['starttime'] = claim['starttime'].datetime() - claim['endtime'] = claim['endtime'].datetime() - return claims - - def updateResourceClaimsForTask(self, task_id, starttime=None, endtime=None, status=None, session_id=None, username=None, user_id=None): - return self._rpc('UpdateResourceClaimsForTask', task_id=task_id, + def updateTaskAndResourceClaims(self, task_id, starttime=None, endtime=None, task_status=None, claim_status=None, session_id=None, username=None, user_id=None): + return self.rpc('UpdateTaskAndResourceClaims', task_id=task_id, starttime=starttime, endtime=endtime, - status=status, + task_status=task_status, + claim_status=claim_status, session_id=session_id, username=username, user_id=user_id) + def getResourceUsages(self, claim_ids=None, lower_bound=None, upper_bound=None, resource_ids=None, task_ids=None, status=None, resource_type=None): + all_usages = self.rpc('GetResourceUsages', + lower_bound=lower_bound, + upper_bound=upper_bound, + resource_ids=resource_ids, + task_ids=task_ids, + status=status, + resource_type=resource_type) + + for resource_usages in all_usages: + for status, usages in resource_usages['usages'].items(): + for usage in usages: + usage['timestamp'] = usage['timestamp'].datetime() + + return all_usages + def getResourceGroupTypes(self): - return self._rpc('GetResourceGroupTypes') + return self.rpc('GetResourceGroupTypes') def getResourceGroups(self): - return self._rpc('GetResourceGroups') + return self.rpc('GetResourceGroups') + + def getResourceGroupMemberships(self): + rg_memberships = self.rpc('GetResourceGroupMemberships') + rg_memberships = convertStringDigitKeysToInt(rg_memberships) + return rg_memberships def getResourceTypes(self): - return self._rpc('GetResourceTypes') + return self.rpc('GetResourceTypes') + + def getResources(self, resource_ids=None, resource_types=None, include_availability=False): + return self.rpc('GetResources', resource_ids=resource_ids, resource_types=resource_types, include_availability=include_availability) - def getResources(self): - return self._rpc('GetResources') + def updateResourceAvailability(self, resource_id, active=None, available_capacity=None, total_capacity=None): + return self.rpc('UpdateResourceAvailability', + resource_id=resource_id, + active=active, + available_capacity=available_capacity, + total_capacity=total_capacity) - def getTask(self, id): - task = self._rpc('GetTask', id=id) + def getTask(self, id=None, mom_id=None, otdb_id=None): + '''get a task for either the given (task)id, or for the given mom_id, or for the given otdb_id''' + task = self.rpc('GetTask', id=id, mom_id=mom_id, otdb_id=otdb_id) if task: task['starttime'] = task['starttime'].datetime() task['endtime'] = task['endtime'].datetime() return task - def insertTask(self, mom_id, otdb_id, status, type, specification_id): - return self._rpc('InsertTask', mom_id=mom_id, + def insertTask(self, mom_id, otdb_id, status, task_type, specification_id): + return self.rpc('InsertTask', mom_id=mom_id, otdb_id=otdb_id, status=status, - type=type, + type=task_type, specification_id=specification_id) def deleteTask(self, id): - return self._rpc('DeleteTask', id=id) + return self.rpc('DeleteTask', id=id) def updateTask(self, task_id, mom_id=None, otdb_id=None, status=None, task_type=None, specification_id=None): - return self._rpc('UpdateTask', task_id=task_id, - mom_id=mom_id, - otdb_id=otdb_id, - status=status, - task_type=task_type, - specification_id=specification_id) + return self.rpc('UpdateTask', + id=task_id, + mom_id=mom_id, + otdb_id=otdb_id, + status=status, + task_type=task_type, + specification_id=specification_id) def getTasks(self): - tasks = self._rpc('GetTasks') + tasks = self.rpc('GetTasks') for task in tasks: task['starttime'] = task['starttime'].datetime() task['endtime'] = task['endtime'].datetime() return tasks + def insertTaskPredecessor(self, task_id, predecessor_id): + return self.rpc('InsertTaskPredecessor', task_id=task_id, predecessor_id=predecessor_id) + + def insertTaskPredecessors(self, task_id, predecessor_ids): + return self.rpc('InsertTaskPredecessors', task_id=task_id, predecessor_ids=predecessor_ids) + def getTaskTypes(self): - return self._rpc('GetTaskTypes') + return self.rpc('GetTaskTypes') def getTaskStatuses(self): - return self._rpc('GetTaskStatuses') + return self.rpc('GetTaskStatuses') + + def getSpecification(self, id): + specification = self.rpc('GetSpecification', id=id) + if specification: + specification['starttime'] = specification['starttime'].datetime() + specification['endtime'] = specification['endtime'].datetime() + return specification + + def insertSpecificationAndTask(self, mom_id, otdb_id, task_status, task_type, starttime, endtime, content): + return self.rpc('InsertSpecificationAndTask', + mom_id=mom_id, + otdb_id=otdb_id, + task_status=task_status, + task_type=task_type, + starttime=starttime, + endtime=endtime, + content=content) + + def insertSpecification(self, starttime, endtime, content): + return self.rpc('InsertSpecification', + starttime=starttime, + endtime=endtime, + content=content) + + def deleteSpecification(self, id): + return self.rpc('DeleteSpecification', id=id) + + def updateSpecification(self, id, starttime=None, endtime=None, content=None): + return self.rpc('UpdateSpecification', + id=id, + starttime=starttime, + endtime=endtime, + content=content) + + def getSpecifications(self): + specifications = self.rpc('GetSpecifications') + for specification in specifications: + specification['starttime'] = specification['starttime'].datetime() + specification['endtime'] = specification['endtime'].datetime() + return specifications def getUnits(self): - return self._rpc('GetUnits') + return self.rpc('GetUnits') def do_tests(busname=DEFAULT_BUSNAME, servicename=DEFAULT_SERVICENAME): with RARPC(busname=busname, servicename=servicename) as rpc: @@ -191,24 +241,35 @@ def do_tests(busname=DEFAULT_BUSNAME, servicename=DEFAULT_SERVICENAME): #print rpc.getResourceClaim(rcId) #print - tasks = rpc.getTasks() - for t in tasks: - print rpc.getTask(t['id']) - for i in range(4,9): - rcId = rpc.insertResourceClaim(i, t['id'], datetime.datetime.utcnow(), datetime.datetime.utcnow() + datetime.timedelta(hours=1), 'CLAIMED', 1, 10, 'einstein', -1)['id'] - #print rpc.deleteTask(t['id']) - #print rpc.getTasks() - #print rpc.getResourceClaims() - - print - taskId = tasks[0]['id'] - print 'taskId=', taskId - print rpc.getResourceClaimsForTask(taskId) - print rpc.updateResourceClaimsForTask(taskId, starttime=datetime.datetime.utcnow(), endtime=datetime.datetime.utcnow() + datetime.timedelta(hours=3)) - print rpc.getResourceClaimsForTask(taskId) + #tasks = rpc.getTasks() + #for t in tasks: + #print rpc.getTask(t['id']) + #for i in range(4,9): + #rcId = rpc.insertResourceClaim(i, t['id'], datetime.datetime.utcnow(), datetime.datetime.utcnow() + datetime.timedelta(hours=1), 'CLAIMED', 1, 10, 'einstein', -1)['id'] + ##print rpc.deleteTask(t['id']) + ##print rpc.getTasks() + ##print rpc.getResourceClaims() + + #print + #taskId = tasks[0]['id'] + #print 'taskId=', taskId + #print rpc.getResourceClaimsForTask(taskId) + #print rpc.updateResourceClaimsForTask(taskId, starttime=datetime.datetime.utcnow(), endtime=datetime.datetime.utcnow() + datetime.timedelta(hours=3)) + #print rpc.getResourceClaimsForTask(taskId) #print rpc.getTasks() #print rpc.getResourceClaims() + #print rpc.getResources() + #print rpc.getResourceGroups() + #print rpc.getResourceGroupMemberships() + + for rc in rpc.getResourceClaims(): + print rc + rpc.insertResourceClaimProperty(rc['id'], 'nr_of_CS_files', 42) + print rpc.getResourceClaimProperties(rc['id']) + + print + print rpc.getResourceClaimProperties(task_id=493) #rpc.deleteTask(taskId) diff --git a/SAS/ResourceAssignment/ResourceAssignmentService/service.py b/SAS/ResourceAssignment/ResourceAssignmentService/service.py index 53696e123e138b33c93e2eb20303d7eadae86f1e..a4d1a9d67608400f7c8ab1f23b35ddb5e3002661 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentService/service.py +++ b/SAS/ResourceAssignment/ResourceAssignmentService/service.py @@ -26,41 +26,55 @@ from lofar.messaging.Service import MessageHandlerInterface from lofar.common.util import waitForInterrupt from lofar.sas.resourceassignment.database import radb from lofar.sas.resourceassignment.resourceassignmentservice.config import DEFAULT_BUSNAME, DEFAULT_SERVICENAME +from lofar.common import dbcredentials +from lofar.common.util import convertIntKeysToString logger = logging.getLogger(__name__) class RADBHandler(MessageHandlerInterface): def __init__(self, **kwargs): super(RADBHandler, self).__init__(**kwargs) - self.username = kwargs.pop("username", 'resourceassignment') - self.password = kwargs.pop("password", '') + self.dbcreds = kwargs.pop("dbcreds", None) + self.log_queries = kwargs.pop("log_queries", False) self.service2MethodMap = { 'GetResourceClaimStatuses': self._getResourceClaimStatuses, + 'GetResourceClaimProperties': self._getResourceClaimProperties, + 'InsertResourceClaimProperty': self._insertResourceClaimProperty, + 'GetResourceClaimPropertyTypes': self._getResourceClaimPropertyTypes, 'GetResourceClaims': self._getResourceClaims, 'GetResourceClaim': self._getResourceClaim, + 'InsertResourceClaims': self._insertResourceClaims, 'InsertResourceClaim': self._insertResourceClaim, 'DeleteResourceClaim': self._deleteResourceClaim, 'UpdateResourceClaim': self._updateResourceClaim, - 'GetResourceClaimsForTask': self._getResourceClaimsForTask, - 'UpdateResourceClaimsForTask': self._updateResourceClaimsForTask, + 'UpdateTaskAndResourceClaims': self._updateTaskAndResourceClaims, + 'GetResourceUsages': self._getResourceUsages, 'GetResourceGroupTypes': self._getResourceGroupTypes, 'GetResourceGroups': self._getResourceGroups, + 'GetResourceGroupMemberships': self._getResourceGroupMemberships, 'GetResourceTypes': self._getResourceTypes, 'GetResources': self._getResources, + 'UpdateResourceAvailability': self._updateResourceAvailability, + 'GetTasks': self._getTasks, 'GetTask': self._getTask, 'InsertTask': self._insertTask, 'DeleteTask': self._deleteTask, 'UpdateTask': self._updateTask, + 'InsertTaskPredecessor': self._insertTaskPredecessor, + 'insertTaskPredecessors': self._insertTaskPredecessors, 'GetTaskStatuses': self._getTaskStatuses, 'GetTaskTypes': self._getTaskTypes, - 'GetTaskTypes': self._getTaskTypes, - 'GetTasks': self._getTasks, + 'GetSpecifications': self._getSpecifications, + 'GetSpecification': self._getSpecification, + 'InsertSpecificationAndTask': self._insertSpecificationAndTask, + 'InsertSpecification': self._insertSpecification, + 'DeleteSpecification': self._deleteSpecification, + 'UpdateSpecification': self._updateSpecification, 'GetUnits': self._getUnits} def prepare_loop(self): - self.radb = radb.RADatabase(username=self.username, - password=self.password) + self.radb = radb.RADatabase(dbcreds=self.dbcreds, log_queries=self.log_queries) def _getTaskStatuses(self): return self.radb.getTaskStatuses() @@ -71,15 +85,47 @@ class RADBHandler(MessageHandlerInterface): def _getResourceClaimStatuses(self): return self.radb.getResourceClaimStatuses() - def _getResourceClaims(self): - return self.radb.getResourceClaims() + def _getResourceClaimPropertyTypes(self): + return self.radb.getResourceClaimPropertyTypes() + + def _getResourceClaimProperties(self, **kwargs): + return self.radb.getResourceClaimProperties(claim_ids=kwargs.get('claim_ids'), task_id=kwargs.get('task_id')) + + def _insertResourceClaimProperty(self, **kwargs): + id = self.radb.insertResourceClaimProperty(kwargs.get('claim_id'), kwargs.get('property_type'), kwargs.get('value')) + return {'id':id} + + def _getResourceClaims(self, **kwargs): + return self.radb.getResourceClaims(claim_ids=kwargs.get('claim_ids'), + lower_bound=kwargs.get('lower_bound'), + upper_bound=kwargs.get('upper_bound'), + resource_ids=kwargs.get('resource_ids'), + task_ids=kwargs.get('task_ids'), + status=kwargs.get('status'), + resource_type=kwargs.get('resource_type'), + extended=kwargs.get('extended', False), + include_properties=kwargs.get('include_properties')) def _getResourceClaim(self, **kwargs): claim = self.radb.getResourceClaim(kwargs['id']) return claim + def _insertResourceClaims(self, **kwargs): + logger.info('InsertResourceClaims: %s' % dict({k:v for k,v in kwargs.items() if v != None})) + claims = kwargs['claims'] + for claim in claims: + claim['starttime'] = claim['starttime'].datetime() + claim['endtime'] = claim['endtime'].datetime() + + ids = self.radb.insertResourceClaims(kwargs['task_id'], + claims, + kwargs['session_id'], + kwargs['username'], + kwargs['user_id']) + return {'ids':ids} + def _insertResourceClaim(self, **kwargs): - logger.info('InsertResourceClaim: %s' % kwargs) + logger.info('InsertResourceClaim: %s' % dict({k:v for k,v in kwargs.items() if v != None})) id = self.radb.insertResourceClaim(kwargs['resource_id'], kwargs['task_id'], kwargs['starttime'].datetime(), @@ -88,17 +134,18 @@ class RADBHandler(MessageHandlerInterface): kwargs['session_id'], kwargs['claim_size'], kwargs['username'], - kwargs['user_id']) + kwargs['user_id'], + kwargs.get('properties')) return {'id':id} def _deleteResourceClaim(self, **kwargs): - logger.info('DeleteResourceClaim: %s' % kwargs) + logger.info('DeleteResourceClaim: %s' % dict({k:v for k,v in kwargs.items() if v != None})) id = kwargs['id'] deleted = self.radb.deleteResourceClaim(id) return {'id': id, 'deleted': deleted} def _updateResourceClaim(self, **kwargs): - logger.info('UpdateResourceClaim: %s' % kwargs) + logger.info('UpdateResourceClaim: %s' % dict({k:v for k,v in kwargs.items() if v != None})) id = kwargs['id'] updated = self.radb.updateResourceClaim(id, resource_id=kwargs.get('resource_id'), @@ -108,48 +155,77 @@ class RADBHandler(MessageHandlerInterface): status=kwargs.get('status_id', kwargs.get('status')), session_id=kwargs.get('session_id'), claim_size=kwargs.get('claim_size'), + nr_of_parts=kwargs.get('nr_of_parts'), username=kwargs.get('username'), user_id=kwargs.get('user_id')) return {'id': id, 'updated': updated} - def _getResourceClaimsForTask(self, task_id): - claims = self.radb.getResourceClaimsForTask(task_id) - return claims - - def _updateResourceClaimsForTask(self, **kwargs): - logger.info('UpdateResourceClaimsForTask: %s' % kwargs) + def _updateTaskAndResourceClaims(self, **kwargs): + logger.info('UpdateTaskAndResourceClaims: %s' % dict({k:v for k,v in kwargs.items() if v != None})) task_id = kwargs['task_id'] - updated = self.radb.updateResourceClaimsForTask(task_id, - starttime=kwargs['starttime'].datetime() if 'starttime' in kwargs else None, - endtime=kwargs['endtime'].datetime() if 'endtime' in kwargs else None, - status=kwargs.get('status_id', kwargs.get('status')), + starttime = kwargs.get('starttime') + if starttime: + starttime = starttime.datetime(); + + endtime = kwargs.get('endtime') + if endtime: + endtime = endtime.datetime(); + + updated = self.radb.updateTaskAndResourceClaims(task_id, + starttime=starttime, + endtime=endtime, + task_status=kwargs.get('task_status_id', kwargs.get('task_status')), + claim_status=kwargs.get('claim_status_id', kwargs.get('claim_status')), session_id=kwargs.get('session_id'), username=kwargs.get('username'), user_id=kwargs.get('user_id')) return {'task_id': task_id, 'updated': updated} + def _getResourceUsages(self, **kwargs): + usages = self.radb.getResourceUsages(claim_ids=kwargs.get('claim_ids'), + lower_bound=kwargs.get('lower_bound'), + upper_bound=kwargs.get('upper_bound'), + resource_ids=kwargs.get('resource_ids'), + task_ids=kwargs.get('task_ids'), + status=kwargs.get('status'), + resource_type=kwargs.get('resource_type')) + return usages + def _getResourceGroupTypes(self): return self.radb.getResourceGroupTypes() def _getResourceGroups(self): return self.radb.getResourceGroups() + def _getResourceGroupMemberships(self): + rg_memberships = self.radb.getResourceGroupMemberships() + rg_memberships = convertIntKeysToString(rg_memberships) + return rg_memberships + def _getResourceTypes(self): return self.radb.getResourceTypes() - def _getResources(self): - return self.radb.getResources() + def _getResources(self, **kwargs): + return self.radb.getResources(resource_ids=kwargs.get('resource_ids'), + resource_types=kwargs.get('resource_types'), + include_availability=kwargs.get('include_availability', False)) + + def _updateResourceAvailability(self, **kwargs): + return self.radb.updateResourceAvailability(resource_id=kwargs['resource_id'], + active=kwargs.get('active'), + available_capacity=kwargs.get('available_capacity'), + total_capacity=kwargs.get('total_capacity')) def _getTasks(self): return self.radb.getTasks() def _getTask(self, **kwargs): - logger.info('GetTask: %s' % kwargs) - task = self.radb.getTask(kwargs['id']) + logger.info('GetTask: %s' % dict({k:v for k,v in kwargs.items() if v != None})) + task = self.radb.getTask(id=kwargs.get('id'), mom_id=kwargs.get('mom_id'), otdb_id=kwargs.get('otdb_id')) return task def _insertTask(self, **kwargs): - logger.info('InsertTask: %s' % kwargs) + logger.info('InsertTask: %s' % dict({k:v for k,v in kwargs.items() if v != None})) task_id = self.radb.insertTask(kwargs['mom_id'], kwargs['otdb_id'], kwargs.get('status_id', kwargs.get('status', 'prepared')), @@ -158,13 +234,13 @@ class RADBHandler(MessageHandlerInterface): return {'id':task_id } def _deleteTask(self, **kwargs): - logger.info('DeleteTask: %s' % kwargs) + logger.info('DeleteTask: %s' % dict({k:v for k,v in kwargs.items() if v != None})) id = kwargs['id'] deleted = self.radb.deleteTask(id) return {'id': id, 'deleted': deleted} def _updateTask(self, **kwargs): - logger.info('UpdateTask: %s' % kwargs) + logger.info('UpdateTask: %s' % dict({k:v for k,v in kwargs.items() if v != None})) id = kwargs['id'] updated = self.radb.updateTask(id, mom_id=kwargs.get('mom_id'), @@ -174,36 +250,96 @@ class RADBHandler(MessageHandlerInterface): specification_id=kwargs.get('specification_id')) return {'id': id, 'updated': updated} + def _insertTaskPredecessor(self, **kwargs): + id = self.radb.insertTaskPredecessor(kwargs['task_id'], + kwargs['predecessor_id']) + return {'id':id} + + def _insertTaskPredecessors(self, **kwargs): + ids = self.radb.insertTaskPredecessors(kwargs['task_id'], + kwargs['predecessor_ids']) + return {'ids':ids} + + def _getSpecifications(self): + return self.radb.getSpecifications() + + def _getSpecification(self, **kwargs): + logger.info('GetSpecification: %s' % dict({k:v for k,v in kwargs.items() if v != None})) + specification = self.radb.getSpecification(kwargs['id']) + return specification + + def _insertSpecificationAndTask(self, **kwargs): + logger.info('InsertSpecificationAndTask: %s' % dict({k:v for k,v in kwargs.items() if v != None and k != 'content'})) + return self.radb.insertSpecificationAndTask(kwargs['mom_id'], + kwargs['otdb_id'], + kwargs['task_status'], + kwargs['task_type'], + kwargs['starttime'].datetime(), + kwargs['endtime'].datetime(), + kwargs['content']) + + def _insertSpecification(self, **kwargs): + logger.info('InsertSpecification: %s' % dict({k:v for k,v in kwargs.items() if v != None})) + specification_id = self.radb.insertSpecification(kwargs['starttime'].datetime(), + kwargs['endtime'].datetime(), + kwargs['content']) + return {'id':specification_id} + + def _deleteSpecification(self, **kwargs): + logger.info('DeleteSpecification: %s' % dict({k:v for k,v in kwargs.items() if v != None})) + id = kwargs['id'] + deleted = self.radb.deleteSpecification(id) + return {'id': id, 'deleted': deleted} + + def _updateSpecification(self, **kwargs): + logger.info('UpdateSpecification: %s' % dict({k:v for k,v in kwargs.items() if v != None})) + id = kwargs['id'] + updated = self.radb.updateSpecification(id, + starttime=kwargs['starttime'].datetime() if 'starttime' in kwargs else None, + endtime=kwargs['endtime'].datetime() if 'endtime' in kwargs else None, + content=kwargs.get('content')) + return {'id': id, 'updated': updated} + def _getUnits(self): return self.radb.getUnits() -def createService(busname=DEFAULT_BUSNAME, servicename=DEFAULT_SERVICENAME, radb_password=''): +def createService(busname=DEFAULT_BUSNAME, servicename=DEFAULT_SERVICENAME, broker=None, dbcreds=None, log_queries=False, verbose=False): return Service(servicename, RADBHandler, busname=busname, + broker=broker, use_service_methods=True, - numthreads=2, - handler_args={'password': radb_password}, - verbose=True) + numthreads=4, + handler_args={'dbcreds': dbcreds, 'log_queries': log_queries}, + verbose=verbose) def main(): # Check the invocation arguments parser = OptionParser("%prog [options]", description='runs the resourceassignment database service') + parser.add_option('-q', '--broker', dest='broker', type='string', default=None, help='Address of the qpid broker, default: localhost') parser.add_option("-b", "--busname", dest="busname", type="string", default=DEFAULT_BUSNAME, help="Name of the bus exchange on the qpid broker, default: %s" % DEFAULT_BUSNAME) parser.add_option("-s", "--servicename", dest="servicename", type="string", default=DEFAULT_SERVICENAME, help="Name for this service, default: %s" % DEFAULT_SERVICENAME) + parser.add_option('-Q', '--log-queries', dest='log_queries', action='store_true', help='log all pqsl queries') parser.add_option('-V', '--verbose', dest='verbose', action='store_true', help='verbose logging') + parser.add_option_group(dbcredentials.options_group(parser)) + parser.set_defaults(dbcredentials="RADB") (options, args) = parser.parse_args() + dbcreds = dbcredentials.parse_options(options) + setQpidLogLevel(logging.INFO) logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.DEBUG if options.verbose else logging.INFO) - from lofar.sas.resourceassignment.database.config import radb_password + logger.info("Using dbcreds: %s" % dbcreds.stringWithHiddenPassword()) with createService(busname=options.busname, servicename=options.servicename, - radb_password=radb_password): + broker=options.broker, + verbose=options.verbose, + log_queries=options.log_queries, + dbcreds=dbcreds): waitForInterrupt() if __name__ == '__main__': diff --git a/SAS/ResourceAssignment/ResourceAssignmentService/test/test_ra_service_and_rpc.py b/SAS/ResourceAssignment/ResourceAssignmentService/test/test_ra_service_and_rpc.py index 01632a4b4d6f8836bdc4dead84e1215c5feb3f83..453be2577e90f0407cb98af43ba7c1033e6775c3 100755 --- a/SAS/ResourceAssignment/ResourceAssignmentService/test/test_ra_service_and_rpc.py +++ b/SAS/ResourceAssignment/ResourceAssignmentService/test/test_ra_service_and_rpc.py @@ -7,6 +7,7 @@ import logging from lofar.messaging import Service from lofar.sas.resourceassignment.resourceassignmentservice.service import createService from lofar.sas.resourceassignment.resourceassignmentservice.rpc import RARPC, RARPCException +from qpid.messaging.exceptions import * try: from qpid.messaging import Connection @@ -24,8 +25,12 @@ except ImportError: print 'Please install MagicMock: pip install mock' exit(3) +connection = None +broker = None + try: logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) + logger = logging.getLogger(__name__) # setup broker connection connection = Connection.establish('127.0.0.1') @@ -70,17 +75,19 @@ try: self.assertEqual(mock.getResourceGroups.return_value, rpc.getResourceGroups()) self.assertEqual(mock.getTasks.return_value, rpc.getTasks()) self.assertEqual(mock.getResourceClaims.return_value, rpc.getResourceClaims()) - self.assertEqual(None, rpc.getTask(1)) - self.assertEqual(mock.getTask.return_value, rpc.getTask(5)) + + #TODO: fix this test + #self.assertEqual(None, rpc.getTask(1)) + #self.assertEqual(mock.getTask.return_value, rpc.getTask(5)) # test non existing service method, should timeout with self.assertRaises(ValueError) as cm: - rpc._rpc('foo', timeout=1) + rpc.rpc('foo', timeout=1) self.assertEqual(cm.exception.message, "{'backtrace': '', 'state': 'TIMEOUT', 'errmsg': 'RPC Timed out'}") # test method with wrong args with self.assertRaises(TypeError) as cm: - rpc._rpc('GetTasks', timeout=1, fooarg='bar') + rpc.rpc('GetTasks', timeout=1, fooarg='bar') self.assertTrue('got an unexpected keyword argument \'fooarg\'' in cm.exception.message) # create and run the service @@ -89,7 +96,12 @@ try: # and run all tests unittest.main(verbosity=2) +except ConnectError as ce: + logger.error(ce) + exit(3) finally: # cleanup test bus and exit - broker.delExchange(busname) - connection.close() + if broker: + broker.delExchange(busname) + if connection: + connection.close() diff --git a/SAS/ResourceAssignment/SystemStatusDatabase/CMakeLists.txt b/SAS/ResourceAssignment/SystemStatusDatabase/CMakeLists.txt index b782fda84f2d556d68bbbac5df3f5fa105c8fdbb..684a158d52a5a77c1d9617b1a36bd90b81148d3e 100644 --- a/SAS/ResourceAssignment/SystemStatusDatabase/CMakeLists.txt +++ b/SAS/ResourceAssignment/SystemStatusDatabase/CMakeLists.txt @@ -12,4 +12,4 @@ set(_py_files python_install(${_py_files} DESTINATION lofar/sas/systemstatus/database) -# add_subdirectory(test) +add_subdirectory(sql) diff --git a/SAS/ResourceAssignment/SystemStatusDatabase/sql/CMakeLists.txt b/SAS/ResourceAssignment/SystemStatusDatabase/sql/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..e12c38bca968c81bb0d306e3fe5092ae92d83eb2 --- /dev/null +++ b/SAS/ResourceAssignment/SystemStatusDatabase/sql/CMakeLists.txt @@ -0,0 +1,6 @@ +# $Id: CMakeLists.txt 32341 2015-08-28 11:59:26Z schaap $ + +set(sql_files SetupDatabase.sql) + +install_files(/share/ssdb/sql FILES ${sql_files}) + diff --git a/SAS/ResourceAssignment/SystemStatusDatabase/ssdb.py b/SAS/ResourceAssignment/SystemStatusDatabase/ssdb.py index e97ac20636637324dd4e791ee233f3e0821b50f3..cb869b21e1a86715a51f26f6a32e96b3daeebd9a 100644 --- a/SAS/ResourceAssignment/SystemStatusDatabase/ssdb.py +++ b/SAS/ResourceAssignment/SystemStatusDatabase/ssdb.py @@ -5,21 +5,16 @@ import psycopg2 as pg import psycopg2.extras as pgdefs from lofar.messaging import Service from lofar.common.util import waitForInterrupt +from lofar.common import dbcredentials import logging import sys logging.basicConfig(stream=sys.stdout, level=logging.INFO) logger = logging.getLogger(__name__) -DATABASE = "datamonitor" -USER = "lofarsys" -PASSWORD = "welkom001" - class SSDB: def __init__(self,**kwargs): - self.username = kwargs.pop("username", USER) - self.password = kwargs.pop("password", PASSWORD) - self.database = kwargs.pop("database", DATABASE) + self.dbcreds = kwargs.pop("dbcreds", None) self.conn = None self.DBconnected = (self.conn and self.conn.status==1) self.Qlistall="select * from hosts inner join datapaths on hosts.id = datapaths.hostid;" @@ -42,10 +37,14 @@ class SSDB: self.DBconnected = (self.conn and self.conn.status==1) if not self.DBconnected: try: - self.conn= pg.connect("dbname=%s user=%s password=%s" % (DATABASE,USER,PASSWORD)) + self.conn = pg.connect(host=self.dbcreds.host, + user=self.dbcreds.user, + password=self.dbcreds.password, + database=self.dbcreds.database, + connect_timeout=5) self.DBconnected = (self.conn and self.conn.status==1) except Exception as e: - logger.error("[SSDBconnector]: DB connection could not be restored.") + logger.error("[SSDBconnector]: DB connection could not be restored: %s" % (e,)) return self.DBconnected def _doquery(self,q): diff --git a/SAS/ResourceAssignment/SystemStatusService/CMakeLists.txt b/SAS/ResourceAssignment/SystemStatusService/CMakeLists.txt index f48a39e4a2d6443942148c852b545228ce801c6a..b075940401b54767091048829b47ddea7ad3393f 100644 --- a/SAS/ResourceAssignment/SystemStatusService/CMakeLists.txt +++ b/SAS/ResourceAssignment/SystemStatusService/CMakeLists.txt @@ -9,6 +9,7 @@ set(_py_files __init__.py SSDBQueryService.py SSDBrpc.py + config.py ) python_install(${_py_files} DESTINATION lofar/sas/systemstatus/service) diff --git a/SAS/ResourceAssignment/SystemStatusService/SSDBQueryService.py b/SAS/ResourceAssignment/SystemStatusService/SSDBQueryService.py index 7201d5d92aee28d686c08d1bf1690f2dd1d0c558..8b6561665cf5a5061fb744c6ec42b66aa454eccb 100644 --- a/SAS/ResourceAssignment/SystemStatusService/SSDBQueryService.py +++ b/SAS/ResourceAssignment/SystemStatusService/SSDBQueryService.py @@ -3,26 +3,21 @@ from lofar.messaging import Service, MessageHandlerInterface from lofar.common.util import waitForInterrupt from lofar.sas.systemstatus.database.ssdb import SSDB +from optparse import OptionParser +from lofar.common import dbcredentials +from lofar.sas.systemstatus.service.config import DEFAULT_SSDB_BUSNAME +from lofar.sas.systemstatus.service.config import DEFAULT_SSDB_SERVICENAME import logging import sys -logging.basicConfig(stream=sys.stdout, level=logging.INFO) logger = logging.getLogger(__name__) -SERVICENAME = "GetServerState" -BUSNAME = "simpletest" -DATABASE = "datamonitor" -USER = "lofarsys" -PASSWORD = "welkom001" - class DataMonitorQueryService(MessageHandlerInterface): def __init__(self,**kwargs): super(DataMonitorQueryService,self).__init__(**kwargs) - self.username = kwargs.pop("username", USER) - self.password = kwargs.pop("password", PASSWORD) - self.database = kwargs.pop("database", DATABASE) + self.dbcreds = kwargs.pop("dbcreds", None) self.service2MethodMap = { 'GetStateNames':self.getstatenames, @@ -35,7 +30,7 @@ class DataMonitorQueryService(MessageHandlerInterface): def prepare_loop(self): - self.ssdb = SSDB(username=self.username,password=self.password,database=self.database) + self.ssdb = SSDB(dbcreds=self.dbcreds) def prepare_receive(self): self.ssdb.ensure_connected() @@ -69,7 +64,8 @@ class DataMonitorQueryService(MessageHandlerInterface): for sid,sname in states.iteritems(): ret[name][sname]=0 for row in qres: - ret[groups[str(row['groupid'])]][states[str(row['statusid'])]]+=1 + if str(row['groupid']) in groups and str(row['statusid']) in states: + ret[groups[str(row['groupid'])]][states[str(row['statusid'])]] += 1 return ret def listall(self): @@ -99,9 +95,37 @@ class DataMonitorQueryService(MessageHandlerInterface): jobinfo = self.ssdb.getIngestJobs() return { "main" : maininfo, "jobs" : jobinfo }; -def createService(busname=BUSNAME,servicename=SERVICENAME): - return Service(servicename,DataMonitorQueryService,busname=busname,numthreads=4,use_service_methods=True) - -def runservice(busname=BUSNAME,servicename=SERVICENAME): - with createService(busname,servicename) as GetServerState: +def createService(busname=DEFAULT_SSDB_BUSNAME,servicename=DEFAULT_SSDB_SERVICENAME, dbcreds=None, broker=None): + return Service(servicename, + DataMonitorQueryService, + busname=busname, + numthreads=1, + broker=broker, + handler_args={'dbcreds': dbcreds}, + use_service_methods=True) + +def main(): + logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) + + # Check the invocation arguments + parser = OptionParser("%prog [options]", + description='runs the systemstatus database service') + parser.add_option('-q', '--broker', dest='broker', type='string', + default=None, + help='Address of the qpid broker, default: localhost') + parser.add_option("-b", "--busname", dest="busname", type="string", + default=DEFAULT_SSDB_BUSNAME, + help="Name of the bus exchange on the qpid broker. [default: %default]") + parser.add_option("-s", "--servicename", dest="servicename", type="string", + default=DEFAULT_SSDB_SERVICENAME, + help="Name for this service. [default: %default]") + parser.add_option_group(dbcredentials.options_group(parser)) + parser.set_defaults(dbcredentials="SSDB") + (options, args) = parser.parse_args() + + dbcreds = dbcredentials.parse_options(options) + + logger.info("Using dbcreds: %s" % dbcreds.stringWithHiddenPassword()) + + with createService(busname=options.busname, servicename=options.servicename, dbcreds=dbcreds, broker=options.broker): waitForInterrupt() diff --git a/SAS/ResourceAssignment/SystemStatusService/SSDBrpc.py b/SAS/ResourceAssignment/SystemStatusService/SSDBrpc.py index e3d3b19fb852abaa5c1ba360e8bd7c90d248bfa6..755c4fba3a3df0767568a513e2b2187da177e825 100644 --- a/SAS/ResourceAssignment/SystemStatusService/SSDBrpc.py +++ b/SAS/ResourceAssignment/SystemStatusService/SSDBrpc.py @@ -1,53 +1,79 @@ #!/usr/bin/python -from lofar.messaging import RPC +from lofar.messaging.RPC import RPC, RPCException, RPCWrapper import logging import sys -logging.basicConfig(stream=sys.stdout, level=logging.INFO) logger = logging.getLogger(__name__) -SERVICENAME = "GetServerState" -BUSNAME = "simpletest" +from lofar.sas.systemstatus.service.config import DEFAULT_SSDB_BUSNAME +from lofar.sas.systemstatus.service.config import DEFAULT_SSDB_SERVICENAME -class SSDBrpc: - - def __init__(self,**kwargs): - self.servicename = kwargs.pop("servicename", SERVICENAME) - self.busname = kwargs.pop("busname",BUSNAME) - self.timeout = kwargs.pop("timeout",None) +class SSDBRPC(RPCWrapper): + def __init__(self, + busname=DEFAULT_SSDB_BUSNAME, + servicename=DEFAULT_SSDB_SERVICENAME, + broker=None): + super(SSDBRPC, self).__init__(busname, servicename, broker) def getstatenames(self): - servicename="%s.GetStateNames" %(self.servicename) - with RPC(servicename,busname=self.busname,timeout=self.timeout) as ssdb: - return ssdb() + return self.rpc('GetStateNames') def getactivegroupnames(self): - servicename="%s.GetActiveGroupNames" %(self.servicename) - with RPC(servicename,busname=self.busname,timeout=self.timeout) as ssdb: - return ssdb() + return self.rpc('GetActiveGroupNames') def gethostsforgid(self,gid): - servicename="%s.GetHostForGID" %(self.servicename) - with RPC(servicename,busname=self.busname,timeout=self.timeout) as ssdb: - return ssdb(gid) + return self.rpc('GetHostForGID', gid=gid) def counthostsforgroups(self,groups,states): - servicename="%s.CountHostsForGroups" %(self.servicename) - with RPC(servicename,busname=self.busname,timeout=self.timeout) as ssdb: - return ssdb(groups,states) + return self.rpc('CountHostsForGroups', groups=groups, states=states) def listall(self): - servicename="%s.ListAll" %(self.servicename) - with RPC(servicename,busname=self.busname,timeout=self.timeout) as ssdb: - return ssdb() + return self.rpc('ListAll') def countactivehosts(self): - servicename="%s.CountActiveHosts" %(self.servicename) - with RPC(servicename,busname=self.busname,timeout=self.timeout) as ssdb: - return ssdb() + return self.rpc('CountActiveHosts') def getArchivingStatus(self,*args,**kwargs): - servicename="%s.GetArchivingStatus" %(self.servicename) - with RPC(servicename,busname=self.busname,timeout=self.timeout) as ssdb: - return ssdb(*args,**kwargs) + return self.rpc('GetArchivingStatus') + + +# test code for all methods +if __name__ == '__main__': + import pprint + + with SSDBRPC(broker='10.149.96.22') as ssdb: + print '\n------------------' + print 'getstatenames' + states = ssdb.getstatenames() + pprint.pprint(states) + + + print '\n------------------' + print 'getactivegroupnames' + groups = ssdb.getactivegroupnames() + pprint.pprint(ssdb.getactivegroupnames()) + + for gid, groupname in groups.items(): + print '\n------------------' + print 'gethostsforgid' + pprint.pprint(ssdb.gethostsforgid(gid)) + + for gid, groupname in groups.items(): + for sid, statename in states.items(): + print '\n------------------' + print 'counthostsforgroups' + pprint.pprint(ssdb.counthostsforgroups({gid:groupname}, {sid:statename})) + + print '\n------------------' + print 'listall' + pprint.pprint(ssdb.listall()) + + print '\n------------------' + print 'countactivehosts' + pprint.pprint(ssdb.countactivehosts()) + + print '\n------------------' + print 'getArchivingStatus' + pprint.pprint(ssdb.getArchivingStatus()) + diff --git a/SAS/ResourceAssignment/SystemStatusService/config.py b/SAS/ResourceAssignment/SystemStatusService/config.py new file mode 100644 index 0000000000000000000000000000000000000000..1ea6c29b457c0119660590f1bf761c49ce9d92cf --- /dev/null +++ b/SAS/ResourceAssignment/SystemStatusService/config.py @@ -0,0 +1,5 @@ +#!/usr/bin/python +# $Id$ + +DEFAULT_SSDB_BUSNAME = 'lofar.ssdb.command' +DEFAULT_SSDB_SERVICENAME = 'SSDBService' diff --git a/SAS/ResourceAssignment/SystemStatusService/ssdbservice b/SAS/ResourceAssignment/SystemStatusService/ssdbservice index 11b7adb47e2e6840552111db4e4d52832fb3ee7a..71e4a6de8235a84aba1490baa9d0b3cc1f7d8aaf 100755 --- a/SAS/ResourceAssignment/SystemStatusService/ssdbservice +++ b/SAS/ResourceAssignment/SystemStatusService/ssdbservice @@ -4,22 +4,7 @@ ''' runs the systemstatus database service ''' -import logging -from optparse import OptionParser -from lofar.sas.systemstatus.service.SSDBQueryService import runservice - -logger = logging.getLogger(__name__) -DEFAULT_BUSNAME="amq.topic" -DEFAULT_SERVICENAME="SSDBQueryService" +from lofar.sas.systemstatus.service.SSDBQueryService import main if __name__ == '__main__': - logging.basicConfig(format='%(asctime)s %(levelname)s %(message)s', level=logging.INFO) - - # Check the invocation arguments - parser = OptionParser("%prog [options]", - description='runs the systemstatus database service') - parser.add_option("-b", "--busname", dest="busname", type="string", default=DEFAULT_BUSNAME, help="Name of the bus exchange on the qpid broker, default: %s" % DEFAULT_BUSNAME) - parser.add_option("-s", "--servicename", dest="servicename", type="string", default=DEFAULT_SERVICENAME, help="Name for this service, default: %s" % DEFAULT_SERVICENAME) - (options, args) = parser.parse_args() - - runservice(busname=options.busname, servicename=options.servicename) + main() diff --git a/SAS/ResourceAssignment/SystemStatusService/ssdbservice.ini b/SAS/ResourceAssignment/SystemStatusService/ssdbservice.ini index 2e360df5996f599c0779c2c91a42afd66af9d9ac..bb5d45837f46e0a77b01484160506f75ec44f805 100644 --- a/SAS/ResourceAssignment/SystemStatusService/ssdbservice.ini +++ b/SAS/ResourceAssignment/SystemStatusService/ssdbservice.ini @@ -1,5 +1,5 @@ [program:ssdbservice] -command=/bin/bash -c 'source $LOFARROOT/lofarinit.sh;ssdbservice --busname=lofar.system --servicename=SSDBService' +command=/bin/bash -c 'source $LOFARROOT/lofarinit.sh;ssdbservice' user=lofarsys stopsignal=INT ; KeyboardInterrupt stopasgroup=true ; bash does not propagate signals diff --git a/SAS/ResourceAssignment/SystemStatusService/test/test_datamonitorqueueservice_and_rpc.py b/SAS/ResourceAssignment/SystemStatusService/test/test_datamonitorqueueservice_and_rpc.py index 6fa27066350393e385baf351aaca691ec3188901..5adf460bdc0d06e017f7ac3b0f8a78fcb953dede 100755 --- a/SAS/ResourceAssignment/SystemStatusService/test/test_datamonitorqueueservice_and_rpc.py +++ b/SAS/ResourceAssignment/SystemStatusService/test/test_datamonitorqueueservice_and_rpc.py @@ -4,8 +4,8 @@ import unittest import uuid import datetime from lofar.messaging import Service -from lofar.sas.systemstatus.service.SSDBQueryService import DataMonitorQueryService -from lofar.sas.systemstatus.service.SSDBrpc import SSDBrpc +from lofar.sas.systemstatus.service.SSDBQueryService import DataMonitorQueryService, createService +from lofar.sas.systemstatus.service.SSDBrpc import SSDBRPC try: from qpid.messaging import Connection @@ -23,6 +23,9 @@ except ImportError: print 'Please install MagicMock: pip install mock' exit(3) +connection = None +broker = None + try: # setup broker connection connection = Connection.establish('127.0.0.1') @@ -31,6 +34,7 @@ try: # add test service busname busname = 'test-lofarbus-%s' % (uuid.uuid1()) broker.addExchange('topic', busname) + servicename = "test-SSDB-service" # the system under test is the service and the rpc, not the SSDatabase # so, patch (mock) the SSDatabase class during these tests. @@ -52,12 +56,12 @@ try: mock.getstatenames.return_value=[{'statename': 'Inactive', 'id': 0L}, {'statename': 'Active', 'id': 1L}] mock.getactivegroupnames.return_value=[{'groupname': 'storagenodes', 'id': 0L}, {'groupname': 'computenodes', 'id': 1L}, {'groupname': 'archivenodes', 'id': 2L}, {'groupname': 'locusnodes', 'id': 3L}, {'groupname': 'cep4', 'id': 4L}] - mock.gethostsforgid.return_value=[{'statename': 'Active', 'totalspace': 702716L, 'hostname': 'lustre001', 'usedspace': 23084L, + mock.gethostsforgid.return_value=[{'statename': 'Active', 'totalspace': 702716L, 'hostname': 'lustre001', 'usedspace': 23084L, 'groupname': 'cep4', 'claimedspace': 0L, 'path': '/lustre', 'id': 1L}] mock.gethostsforgroups.return_value=[{'hostname': 'lse001', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lse002', - 'groupid': 0L, 'statusid': 0L}, {'hostname': 'lse003', 'groupid': 0L, 'statusid': 1L}, + 'groupid': 0L, 'statusid': 0L}, {'hostname': 'lse003', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lse004', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lse005', 'groupid': 0L, - 'statusid': 1L}, {'hostname': 'lse006', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lse007', + 'statusid': 1L}, {'hostname': 'lse006', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lse007', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lse008', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lse009', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lse010', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lse011', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lse012', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lse013', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lse014', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lse015', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lse016', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lse017', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lse018', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lse019', 'groupid': 0L, 'statusid': 0L}, {'hostname': 'lse020', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lse021', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lse022', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lse023', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lse024', 'groupid': 0L, 'statusid': 1L}, {'hostname': 'lce001', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce002', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce003', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce004', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce005', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce006', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce007', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce008', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce009', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce010', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce011', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce012', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce013', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce014', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce015', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce016', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce017', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce018', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce019', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce020', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce021', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce022', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce023', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce024', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce025', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce026', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce027', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce028', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce029', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce030', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce031', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce032', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce033', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce034', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce035', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce036', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce037', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce038', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce039', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce040', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce041', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce042', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce043', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce044', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce045', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce046', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce047', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce048', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce049', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce050', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce051', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce052', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce053', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce054', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce055', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce056', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce057', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce058', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce059', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce060', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce061', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce062', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce063', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce064', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce065', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce066', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce067', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce068', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce069', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce070', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce071', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lce072', 'groupid': 1L, 'statusid': 0L}, {'hostname': 'lexar001', 'groupid': 2L, 'statusid': 0L}, {'hostname': 'lexar002', 'groupid': 2L, 'statusid': 0L}, {'hostname': 'locus001', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus002', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus003', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus004', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus005', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus006', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus007', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus008', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus009', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus010', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus011', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus012', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus013', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus014', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus015', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus016', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus017', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus018', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus019', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus020', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus021', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus022', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus023', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus024', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus025', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus026', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus027', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus028', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus029', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus030', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus031', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus032', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus033', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus034', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus035', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus036', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus037', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus038', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus039', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus040', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus041', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus042', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus043', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus044', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus045', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus046', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus047', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus048', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus049', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus050', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus051', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus052', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus053', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus054', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus055', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus056', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus057', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus058', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus059', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus060', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus061', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus062', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus063', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus064', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus065', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus066', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus067', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus068', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus069', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus070', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus071', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus072', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus073', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus074', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus075', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus076', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus077', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus078', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus079', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus080', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus081', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus082', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus083', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus084', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus085', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus086', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus087', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus088', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus089', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus090', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus091', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus092', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus093', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus094', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus095', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus096', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus097', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus098', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus099', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'locus100', 'groupid': 3L, 'statusid': 0L}, {'hostname': 'lustre001', 'groupid': 4L, 'statusid': 1L}] mock.listall.return_value=[{'hostid': 1L, 'totalspace': 0L, 'hostname': 'lse001', 'usedspace': 0L, 'id': 1L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 1L, 'totalspace': 0L, 'hostname': 'lse001', 'usedspace': 0L, 'id': 2L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 1L, 'totalspace': 0L, 'hostname': 'lse001', 'usedspace': 0L, 'id': 3L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 1L, 'totalspace': 0L, 'hostname': 'lse001', 'usedspace': 0L, 'id': 4L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 2L, 'totalspace': 0L, 'hostname': 'lse002', 'usedspace': 0L, 'id': 5L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 0L}, {'hostid': 2L, 'totalspace': 0L, 'hostname': 'lse002', 'usedspace': 0L, 'id': 6L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 0L}, {'hostid': 2L, 'totalspace': 0L, 'hostname': 'lse002', 'usedspace': 0L, 'id': 7L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 0L}, {'hostid': 2L, 'totalspace': 0L, 'hostname': 'lse002', 'usedspace': 0L, 'id': 8L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 0L}, {'hostid': 3L, 'totalspace': 0L, 'hostname': 'lse003', 'usedspace': 0L, 'id': 9L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 3L, 'totalspace': 0L, 'hostname': 'lse003', 'usedspace': 0L, 'id': 10L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 3L, 'totalspace': 0L, 'hostname': 'lse003', 'usedspace': 0L, 'id': 11L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 3L, 'totalspace': 0L, 'hostname': 'lse003', 'usedspace': 0L, 'id': 12L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 4L, 'totalspace': 0L, 'hostname': 'lse004', 'usedspace': 0L, 'id': 13L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 4L, 'totalspace': 0L, 'hostname': 'lse004', 'usedspace': 0L, 'id': 14L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 4L, 'totalspace': 0L, 'hostname': 'lse004', 'usedspace': 0L, 'id': 15L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 4L, 'totalspace': 0L, 'hostname': 'lse004', 'usedspace': 0L, 'id': 16L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 5L, 'totalspace': 0L, 'hostname': 'lse005', 'usedspace': 0L, 'id': 17L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 5L, 'totalspace': 0L, 'hostname': 'lse005', 'usedspace': 0L, 'id': 18L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 5L, 'totalspace': 0L, 'hostname': 'lse005', 'usedspace': 0L, 'id': 19L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 5L, 'totalspace': 0L, 'hostname': 'lse005', 'usedspace': 0L, 'id': 20L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 6L, 'totalspace': 0L, 'hostname': 'lse006', 'usedspace': 0L, 'id': 21L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 6L, 'totalspace': 0L, 'hostname': 'lse006', 'usedspace': 0L, 'id': 22L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 6L, 'totalspace': 0L, 'hostname': 'lse006', 'usedspace': 0L, 'id': 23L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 6L, 'totalspace': 0L, 'hostname': 'lse006', 'usedspace': 0L, 'id': 24L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 7L, 'totalspace': 0L, 'hostname': 'lse007', 'usedspace': 0L, 'id': 25L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 7L, 'totalspace': 0L, 'hostname': 'lse007', 'usedspace': 0L, 'id': 26L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 7L, 'totalspace': 0L, 'hostname': 'lse007', 'usedspace': 0L, 'id': 27L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 7L, 'totalspace': 0L, 'hostname': 'lse007', 'usedspace': 0L, 'id': 28L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 8L, 'totalspace': 0L, 'hostname': 'lse008', 'usedspace': 0L, 'id': 29L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 8L, 'totalspace': 0L, 'hostname': 'lse008', 'usedspace': 0L, 'id': 30L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 8L, 'totalspace': 0L, 'hostname': 'lse008', 'usedspace': 0L, 'id': 31L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 8L, 'totalspace': 0L, 'hostname': 'lse008', 'usedspace': 0L, 'id': 32L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 9L, 'totalspace': 0L, 'hostname': 'lse009', 'usedspace': 0L, 'id': 33L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 9L, 'totalspace': 0L, 'hostname': 'lse009', 'usedspace': 0L, 'id': 34L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 9L, 'totalspace': 0L, 'hostname': 'lse009', 'usedspace': 0L, 'id': 35L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 9L, 'totalspace': 0L, 'hostname': 'lse009', 'usedspace': 0L, 'id': 36L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 10L, 'totalspace': 0L, 'hostname': 'lse010', 'usedspace': 0L, 'id': 37L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 10L, 'totalspace': 0L, 'hostname': 'lse010', 'usedspace': 0L, 'id': 38L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 10L, 'totalspace': 0L, 'hostname': 'lse010', 'usedspace': 0L, 'id': 39L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 10L, 'totalspace': 0L, 'hostname': 'lse010', 'usedspace': 0L, 'id': 40L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 11L, 'totalspace': 0L, 'hostname': 'lse011', 'usedspace': 0L, 'id': 41L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 11L, 'totalspace': 0L, 'hostname': 'lse011', 'usedspace': 0L, 'id': 42L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 11L, 'totalspace': 0L, 'hostname': 'lse011', 'usedspace': 0L, 'id': 43L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 11L, 'totalspace': 0L, 'hostname': 'lse011', 'usedspace': 0L, 'id': 44L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 12L, 'totalspace': 0L, 'hostname': 'lse012', 'usedspace': 0L, 'id': 45L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 12L, 'totalspace': 0L, 'hostname': 'lse012', 'usedspace': 0L, 'id': 46L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 12L, 'totalspace': 0L, 'hostname': 'lse012', 'usedspace': 0L, 'id': 47L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 12L, 'totalspace': 1L, 'hostname': 'lse012', 'usedspace': 1L, 'id': 48L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 13L, 'totalspace': 0L, 'hostname': 'lse013', 'usedspace': 0L, 'id': 49L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 13L, 'totalspace': 0L, 'hostname': 'lse013', 'usedspace': 0L, 'id': 50L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 13L, 'totalspace': 0L, 'hostname': 'lse013', 'usedspace': 0L, 'id': 51L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 13L, 'totalspace': 0L, 'hostname': 'lse013', 'usedspace': 0L, 'id': 52L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 14L, 'totalspace': 0L, 'hostname': 'lse014', 'usedspace': 0L, 'id': 53L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 14L, 'totalspace': 0L, 'hostname': 'lse014', 'usedspace': 0L, 'id': 54L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 14L, 'totalspace': 0L, 'hostname': 'lse014', 'usedspace': 0L, 'id': 55L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 14L, 'totalspace': 1L, 'hostname': 'lse014', 'usedspace': 1L, 'id': 56L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 15L, 'totalspace': 0L, 'hostname': 'lse015', 'usedspace': 0L, 'id': 57L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 15L, 'totalspace': 0L, 'hostname': 'lse015', 'usedspace': 0L, 'id': 58L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 15L, 'totalspace': 0L, 'hostname': 'lse015', 'usedspace': 0L, 'id': 59L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 15L, 'totalspace': 0L, 'hostname': 'lse015', 'usedspace': 0L, 'id': 60L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 16L, 'totalspace': 0L, 'hostname': 'lse016', 'usedspace': 0L, 'id': 61L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 16L, 'totalspace': 0L, 'hostname': 'lse016', 'usedspace': 0L, 'id': 62L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 16L, 'totalspace': 0L, 'hostname': 'lse016', 'usedspace': 0L, 'id': 63L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 16L, 'totalspace': 1L, 'hostname': 'lse016', 'usedspace': 1L, 'id': 64L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 17L, 'totalspace': 0L, 'hostname': 'lse017', 'usedspace': 0L, 'id': 65L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 17L, 'totalspace': 0L, 'hostname': 'lse017', 'usedspace': 0L, 'id': 66L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 17L, 'totalspace': 0L, 'hostname': 'lse017', 'usedspace': 0L, 'id': 67L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 17L, 'totalspace': 1L, 'hostname': 'lse017', 'usedspace': 1L, 'id': 68L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 18L, 'totalspace': 0L, 'hostname': 'lse018', 'usedspace': 0L, 'id': 69L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 18L, 'totalspace': 0L, 'hostname': 'lse018', 'usedspace': 0L, 'id': 70L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 18L, 'totalspace': 0L, 'hostname': 'lse018', 'usedspace': 0L, 'id': 71L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 18L, 'totalspace': 1L, 'hostname': 'lse018', 'usedspace': 1L, 'id': 72L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 19L, 'totalspace': 0L, 'hostname': 'lse019', 'usedspace': 0L, 'id': 73L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 0L}, {'hostid': 19L, 'totalspace': 0L, 'hostname': 'lse019', 'usedspace': 0L, 'id': 74L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 0L}, {'hostid': 19L, 'totalspace': 0L, 'hostname': 'lse019', 'usedspace': 0L, 'id': 75L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 0L}, {'hostid': 19L, 'totalspace': 1L, 'hostname': 'lse019', 'usedspace': 1L, 'id': 76L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 0L}, {'hostid': 20L, 'totalspace': 0L, 'hostname': 'lse020', 'usedspace': 0L, 'id': 77L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 20L, 'totalspace': 0L, 'hostname': 'lse020', 'usedspace': 0L, 'id': 78L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 20L, 'totalspace': 0L, 'hostname': 'lse020', 'usedspace': 0L, 'id': 79L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 20L, 'totalspace': 1L, 'hostname': 'lse020', 'usedspace': 1L, 'id': 80L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 21L, 'totalspace': 0L, 'hostname': 'lse021', 'usedspace': 0L, 'id': 81L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 21L, 'totalspace': 0L, 'hostname': 'lse021', 'usedspace': 0L, 'id': 82L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 21L, 'totalspace': 0L, 'hostname': 'lse021', 'usedspace': 0L, 'id': 83L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 21L, 'totalspace': 1L, 'hostname': 'lse021', 'usedspace': 1L, 'id': 84L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 22L, 'totalspace': 0L, 'hostname': 'lse022', 'usedspace': 0L, 'id': 85L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 22L, 'totalspace': 0L, 'hostname': 'lse022', 'usedspace': 0L, 'id': 86L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 22L, 'totalspace': 0L, 'hostname': 'lse022', 'usedspace': 0L, 'id': 87L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 22L, 'totalspace': 1L, 'hostname': 'lse022', 'usedspace': 1L, 'id': 88L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 23L, 'totalspace': 0L, 'hostname': 'lse023', 'usedspace': 0L, 'id': 89L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 23L, 'totalspace': 0L, 'hostname': 'lse023', 'usedspace': 0L, 'id': 90L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 23L, 'totalspace': 0L, 'hostname': 'lse023', 'usedspace': 0L, 'id': 91L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 23L, 'totalspace': 1L, 'hostname': 'lse023', 'usedspace': 1L, 'id': 92L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 24L, 'totalspace': 0L, 'hostname': 'lse024', 'usedspace': 0L, 'id': 93L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data1', 'statusid': 1L}, {'hostid': 24L, 'totalspace': 0L, 'hostname': 'lse024', 'usedspace': 0L, 'id': 94L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data2', 'statusid': 1L}, {'hostid': 24L, 'totalspace': 0L, 'hostname': 'lse024', 'usedspace': 0L, 'id': 95L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data3', 'statusid': 1L}, {'hostid': 24L, 'totalspace': 1L, 'hostname': 'lse024', 'usedspace': 1L, 'id': 96L, 'groupid': 0L, 'claimedspace': 0L, 'path': '/data4', 'statusid': 1L}, {'hostid': 25L, 'totalspace': 0L, 'hostname': 'lce001', 'usedspace': 0L, 'id': 97L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 26L, 'totalspace': 0L, 'hostname': 'lce002', 'usedspace': 0L, 'id': 98L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 27L, 'totalspace': 0L, 'hostname': 'lce003', 'usedspace': 0L, 'id': 99L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 28L, 'totalspace': 0L, 'hostname': 'lce004', 'usedspace': 0L, 'id': 100L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 29L, 'totalspace': 0L, 'hostname': 'lce005', 'usedspace': 0L, 'id': 101L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 30L, 'totalspace': 0L, 'hostname': 'lce006', 'usedspace': 0L, 'id': 102L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 31L, 'totalspace': 0L, 'hostname': 'lce007', 'usedspace': 0L, 'id': 103L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 32L, 'totalspace': 1L, 'hostname': 'lce008', 'usedspace': 1L, 'id': 104L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 33L, 'totalspace': 1L, 'hostname': 'lce009', 'usedspace': 1L, 'id': 105L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 34L, 'totalspace': 1L, 'hostname': 'lce010', 'usedspace': 1L, 'id': 106L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 35L, 'totalspace': 1L, 'hostname': 'lce011', 'usedspace': 1L, 'id': 107L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 36L, 'totalspace': 1L, 'hostname': 'lce012', 'usedspace': 1L, 'id': 108L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 37L, 'totalspace': 1L, 'hostname': 'lce013', 'usedspace': 1L, 'id': 109L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 38L, 'totalspace': 1L, 'hostname': 'lce014', 'usedspace': 1L, 'id': 110L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 39L, 'totalspace': 1L, 'hostname': 'lce015', 'usedspace': 1L, 'id': 111L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 40L, 'totalspace': 1L, 'hostname': 'lce016', 'usedspace': 1L, 'id': 112L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 41L, 'totalspace': 1L, 'hostname': 'lce017', 'usedspace': 1L, 'id': 113L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 42L, 'totalspace': 1L, 'hostname': 'lce018', 'usedspace': 1L, 'id': 114L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 43L, 'totalspace': 1L, 'hostname': 'lce019', 'usedspace': 1L, 'id': 115L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 44L, 'totalspace': 1L, 'hostname': 'lce020', 'usedspace': 1L, 'id': 116L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 45L, 'totalspace': 1L, 'hostname': 'lce021', 'usedspace': 0L, 'id': 117L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 46L, 'totalspace': 1L, 'hostname': 'lce022', 'usedspace': 1L, 'id': 118L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 47L, 'totalspace': 1L, 'hostname': 'lce023', 'usedspace': 1L, 'id': 119L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 48L, 'totalspace': 1L, 'hostname': 'lce024', 'usedspace': 1L, 'id': 120L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 49L, 'totalspace': 1L, 'hostname': 'lce025', 'usedspace': 1L, 'id': 121L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 50L, 'totalspace': 1L, 'hostname': 'lce026', 'usedspace': 1L, 'id': 122L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 51L, 'totalspace': 1L, 'hostname': 'lce027', 'usedspace': 1L, 'id': 123L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 52L, 'totalspace': 1L, 'hostname': 'lce028', 'usedspace': 1L, 'id': 124L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 53L, 'totalspace': 1L, 'hostname': 'lce029', 'usedspace': 1L, 'id': 125L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 54L, 'totalspace': 1L, 'hostname': 'lce030', 'usedspace': 1L, 'id': 126L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 55L, 'totalspace': 1L, 'hostname': 'lce031', 'usedspace': 1L, 'id': 127L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 56L, 'totalspace': 1L, 'hostname': 'lce032', 'usedspace': 1L, 'id': 128L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 57L, 'totalspace': 1L, 'hostname': 'lce033', 'usedspace': 1L, 'id': 129L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 58L, 'totalspace': 1L, 'hostname': 'lce034', 'usedspace': 1L, 'id': 130L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 59L, 'totalspace': 1L, 'hostname': 'lce035', 'usedspace': 1L, 'id': 131L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 60L, 'totalspace': 1L, 'hostname': 'lce036', 'usedspace': 1L, 'id': 132L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 61L, 'totalspace': 1L, 'hostname': 'lce037', 'usedspace': 1L, 'id': 133L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 62L, 'totalspace': 1L, 'hostname': 'lce038', 'usedspace': 1L, 'id': 134L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 63L, 'totalspace': 1L, 'hostname': 'lce039', 'usedspace': 1L, 'id': 135L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 64L, 'totalspace': 1L, 'hostname': 'lce040', 'usedspace': 1L, 'id': 136L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 65L, 'totalspace': 1L, 'hostname': 'lce041', 'usedspace': 1L, 'id': 137L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 66L, 'totalspace': 1L, 'hostname': 'lce042', 'usedspace': 1L, 'id': 138L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 67L, 'totalspace': 1L, 'hostname': 'lce043', 'usedspace': 1L, 'id': 139L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 68L, 'totalspace': 1L, 'hostname': 'lce044', 'usedspace': 1L, 'id': 140L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 69L, 'totalspace': 1L, 'hostname': 'lce045', 'usedspace': 1L, 'id': 141L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 70L, 'totalspace': 1L, 'hostname': 'lce046', 'usedspace': 1L, 'id': 142L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 71L, 'totalspace': 1L, 'hostname': 'lce047', 'usedspace': 1L, 'id': 143L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 72L, 'totalspace': 1L, 'hostname': 'lce048', 'usedspace': 1L, 'id': 144L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 73L, 'totalspace': 1L, 'hostname': 'lce049', 'usedspace': 1L, 'id': 145L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 74L, 'totalspace': 1L, 'hostname': 'lce050', 'usedspace': 1L, 'id': 146L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 75L, 'totalspace': 1L, 'hostname': 'lce051', 'usedspace': 1L, 'id': 147L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 76L, 'totalspace': 1L, 'hostname': 'lce052', 'usedspace': 1L, 'id': 148L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 77L, 'totalspace': 1L, 'hostname': 'lce053', 'usedspace': 1L, 'id': 149L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 78L, 'totalspace': 1L, 'hostname': 'lce054', 'usedspace': 1L, 'id': 150L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 79L, 'totalspace': 1L, 'hostname': 'lce055', 'usedspace': 1L, 'id': 151L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 80L, 'totalspace': 1L, 'hostname': 'lce056', 'usedspace': 1L, 'id': 152L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 81L, 'totalspace': 1L, 'hostname': 'lce057', 'usedspace': 1L, 'id': 153L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 82L, 'totalspace': 1L, 'hostname': 'lce058', 'usedspace': 1L, 'id': 154L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 83L, 'totalspace': 1L, 'hostname': 'lce059', 'usedspace': 1L, 'id': 155L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 84L, 'totalspace': 1L, 'hostname': 'lce060', 'usedspace': 1L, 'id': 156L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 85L, 'totalspace': 1L, 'hostname': 'lce061', 'usedspace': 1L, 'id': 157L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 86L, 'totalspace': 1L, 'hostname': 'lce062', 'usedspace': 1L, 'id': 158L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 87L, 'totalspace': 1L, 'hostname': 'lce063', 'usedspace': 1L, 'id': 159L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 88L, 'totalspace': 1L, 'hostname': 'lce064', 'usedspace': 1L, 'id': 160L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 89L, 'totalspace': 1L, 'hostname': 'lce065', 'usedspace': 1L, 'id': 161L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 90L, 'totalspace': 1L, 'hostname': 'lce066', 'usedspace': 1L, 'id': 162L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 91L, 'totalspace': 1L, 'hostname': 'lce067', 'usedspace': 1L, 'id': 163L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 92L, 'totalspace': 1L, 'hostname': 'lce068', 'usedspace': 1L, 'id': 164L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 93L, 'totalspace': 1L, 'hostname': 'lce069', 'usedspace': 1L, 'id': 165L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 94L, 'totalspace': 1L, 'hostname': 'lce070', 'usedspace': 1L, 'id': 166L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 95L, 'totalspace': 1L, 'hostname': 'lce071', 'usedspace': 1L, 'id': 167L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 96L, 'totalspace': 1L, 'hostname': 'lce072', 'usedspace': 1L, 'id': 168L, 'groupid': 1L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 97L, 'totalspace': 1L, 'hostname': 'lexar001', 'usedspace': 1L, 'id': 169L, 'groupid': 2L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 98L, 'totalspace': 1L, 'hostname': 'lexar002', 'usedspace': 1L, 'id': 170L, 'groupid': 2L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 99L, 'totalspace': 1L, 'hostname': 'locus001', 'usedspace': 1L, 'id': 171L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 100L, 'totalspace': 1L, 'hostname': 'locus002', 'usedspace': 1L, 'id': 172L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 101L, 'totalspace': 1L, 'hostname': 'locus003', 'usedspace': 1L, 'id': 173L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 102L, 'totalspace': 1L, 'hostname': 'locus004', 'usedspace': 1L, 'id': 174L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 103L, 'totalspace': 1L, 'hostname': 'locus005', 'usedspace': 1L, 'id': 175L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 104L, 'totalspace': 1L, 'hostname': 'locus006', 'usedspace': 1L, 'id': 176L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 105L, 'totalspace': 1L, 'hostname': 'locus007', 'usedspace': 1L, 'id': 177L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 106L, 'totalspace': 1L, 'hostname': 'locus008', 'usedspace': 1L, 'id': 178L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 107L, 'totalspace': 1L, 'hostname': 'locus009', 'usedspace': 1L, 'id': 179L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 108L, 'totalspace': 1L, 'hostname': 'locus010', 'usedspace': 1L, 'id': 180L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 109L, 'totalspace': 1L, 'hostname': 'locus011', 'usedspace': 1L, 'id': 181L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 110L, 'totalspace': 1L, 'hostname': 'locus012', 'usedspace': 1L, 'id': 182L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 111L, 'totalspace': 1L, 'hostname': 'locus013', 'usedspace': 1L, 'id': 183L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 112L, 'totalspace': 1L, 'hostname': 'locus014', 'usedspace': 1L, 'id': 184L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 113L, 'totalspace': 1L, 'hostname': 'locus015', 'usedspace': 1L, 'id': 185L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 114L, 'totalspace': 1L, 'hostname': 'locus016', 'usedspace': 1L, 'id': 186L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 115L, 'totalspace': 1L, 'hostname': 'locus017', 'usedspace': 1L, 'id': 187L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 116L, 'totalspace': 1L, 'hostname': 'locus018', 'usedspace': 1L, 'id': 188L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 117L, 'totalspace': 1L, 'hostname': 'locus019', 'usedspace': 1L, 'id': 189L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 118L, 'totalspace': 1L, 'hostname': 'locus020', 'usedspace': 1L, 'id': 190L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 119L, 'totalspace': 1L, 'hostname': 'locus021', 'usedspace': 1L, 'id': 191L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 120L, 'totalspace': 1L, 'hostname': 'locus022', 'usedspace': 1L, 'id': 192L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 121L, 'totalspace': 1L, 'hostname': 'locus023', 'usedspace': 1L, 'id': 193L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 122L, 'totalspace': 1L, 'hostname': 'locus024', 'usedspace': 1L, 'id': 194L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 123L, 'totalspace': 1L, 'hostname': 'locus025', 'usedspace': 1L, 'id': 195L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 124L, 'totalspace': 1L, 'hostname': 'locus026', 'usedspace': 1L, 'id': 196L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 125L, 'totalspace': 1L, 'hostname': 'locus027', 'usedspace': 1L, 'id': 197L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 126L, 'totalspace': 1L, 'hostname': 'locus028', 'usedspace': 1L, 'id': 198L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 127L, 'totalspace': 1L, 'hostname': 'locus029', 'usedspace': 1L, 'id': 199L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 128L, 'totalspace': 1L, 'hostname': 'locus030', 'usedspace': 1L, 'id': 200L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 129L, 'totalspace': 1L, 'hostname': 'locus031', 'usedspace': 1L, 'id': 201L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 130L, 'totalspace': 1L, 'hostname': 'locus032', 'usedspace': 1L, 'id': 202L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 131L, 'totalspace': 1L, 'hostname': 'locus033', 'usedspace': 1L, 'id': 203L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 132L, 'totalspace': 1L, 'hostname': 'locus034', 'usedspace': 1L, 'id': 204L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 133L, 'totalspace': 1L, 'hostname': 'locus035', 'usedspace': 1L, 'id': 205L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 134L, 'totalspace': 1L, 'hostname': 'locus036', 'usedspace': 1L, 'id': 206L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 135L, 'totalspace': 1L, 'hostname': 'locus037', 'usedspace': 1L, 'id': 207L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 136L, 'totalspace': 1L, 'hostname': 'locus038', 'usedspace': 1L, 'id': 208L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 137L, 'totalspace': 1L, 'hostname': 'locus039', 'usedspace': 1L, 'id': 209L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 138L, 'totalspace': 1L, 'hostname': 'locus040', 'usedspace': 1L, 'id': 210L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 139L, 'totalspace': 1L, 'hostname': 'locus041', 'usedspace': 1L, 'id': 211L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 140L, 'totalspace': 1L, 'hostname': 'locus042', 'usedspace': 1L, 'id': 212L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 141L, 'totalspace': 1L, 'hostname': 'locus043', 'usedspace': 1L, 'id': 213L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 142L, 'totalspace': 1L, 'hostname': 'locus044', 'usedspace': 1L, 'id': 214L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 143L, 'totalspace': 1L, 'hostname': 'locus045', 'usedspace': 1L, 'id': 215L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 144L, 'totalspace': 1L, 'hostname': 'locus046', 'usedspace': 1L, 'id': 216L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 145L, 'totalspace': 1L, 'hostname': 'locus047', 'usedspace': 1L, 'id': 217L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 146L, 'totalspace': 1L, 'hostname': 'locus048', 'usedspace': 1L, 'id': 218L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 147L, 'totalspace': 1L, 'hostname': 'locus049', 'usedspace': 1L, 'id': 219L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 148L, 'totalspace': 1L, 'hostname': 'locus050', 'usedspace': 1L, 'id': 220L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 149L, 'totalspace': 1L, 'hostname': 'locus051', 'usedspace': 1L, 'id': 221L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 150L, 'totalspace': 1L, 'hostname': 'locus052', 'usedspace': 1L, 'id': 222L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 151L, 'totalspace': 1L, 'hostname': 'locus053', 'usedspace': 1L, 'id': 223L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 152L, 'totalspace': 1L, 'hostname': 'locus054', 'usedspace': 1L, 'id': 224L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 153L, 'totalspace': 1L, 'hostname': 'locus055', 'usedspace': 1L, 'id': 225L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 154L, 'totalspace': 1L, 'hostname': 'locus056', 'usedspace': 1L, 'id': 226L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 155L, 'totalspace': 1L, 'hostname': 'locus057', 'usedspace': 1L, 'id': 227L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 156L, 'totalspace': 1L, 'hostname': 'locus058', 'usedspace': 1L, 'id': 228L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 157L, 'totalspace': 1L, 'hostname': 'locus059', 'usedspace': 1L, 'id': 229L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 158L, 'totalspace': 1L, 'hostname': 'locus060', 'usedspace': 1L, 'id': 230L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 159L, 'totalspace': 1L, 'hostname': 'locus061', 'usedspace': 1L, 'id': 231L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 160L, 'totalspace': 1L, 'hostname': 'locus062', 'usedspace': 1L, 'id': 232L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 161L, 'totalspace': 1L, 'hostname': 'locus063', 'usedspace': 1L, 'id': 233L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 162L, 'totalspace': 1L, 'hostname': 'locus064', 'usedspace': 1L, 'id': 234L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 163L, 'totalspace': 1L, 'hostname': 'locus065', 'usedspace': 1L, 'id': 235L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 164L, 'totalspace': 1L, 'hostname': 'locus066', 'usedspace': 1L, 'id': 236L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 165L, 'totalspace': 1L, 'hostname': 'locus067', 'usedspace': 1L, 'id': 237L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 166L, 'totalspace': 1L, 'hostname': 'locus068', 'usedspace': 1L, 'id': 238L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 167L, 'totalspace': 1L, 'hostname': 'locus069', 'usedspace': 1L, 'id': 239L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 168L, 'totalspace': 1L, 'hostname': 'locus070', 'usedspace': 1L, 'id': 240L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 169L, 'totalspace': 1L, 'hostname': 'locus071', 'usedspace': 1L, 'id': 241L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 170L, 'totalspace': 1L, 'hostname': 'locus072', 'usedspace': 1L, 'id': 242L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 171L, 'totalspace': 1L, 'hostname': 'locus073', 'usedspace': 1L, 'id': 243L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 172L, 'totalspace': 1L, 'hostname': 'locus074', 'usedspace': 1L, 'id': 244L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 173L, 'totalspace': 1L, 'hostname': 'locus075', 'usedspace': 1L, 'id': 245L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 174L, 'totalspace': 1L, 'hostname': 'locus076', 'usedspace': 1L, 'id': 246L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 175L, 'totalspace': 1L, 'hostname': 'locus077', 'usedspace': 1L, 'id': 247L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 176L, 'totalspace': 1L, 'hostname': 'locus078', 'usedspace': 1L, 'id': 248L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 177L, 'totalspace': 1L, 'hostname': 'locus079', 'usedspace': 1L, 'id': 249L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 178L, 'totalspace': 1L, 'hostname': 'locus080', 'usedspace': 1L, 'id': 250L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 179L, 'totalspace': 1L, 'hostname': 'locus081', 'usedspace': 1L, 'id': 251L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 180L, 'totalspace': 1L, 'hostname': 'locus082', 'usedspace': 1L, 'id': 252L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 181L, 'totalspace': 1L, 'hostname': 'locus083', 'usedspace': 1L, 'id': 253L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 182L, 'totalspace': 1L, 'hostname': 'locus084', 'usedspace': 1L, 'id': 254L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 183L, 'totalspace': 1L, 'hostname': 'locus085', 'usedspace': 1L, 'id': 255L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 184L, 'totalspace': 1L, 'hostname': 'locus086', 'usedspace': 1L, 'id': 256L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 185L, 'totalspace': 1L, 'hostname': 'locus087', 'usedspace': 1L, 'id': 257L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 186L, 'totalspace': 1L, 'hostname': 'locus088', 'usedspace': 1L, 'id': 258L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 187L, 'totalspace': 1L, 'hostname': 'locus089', 'usedspace': 1L, 'id': 259L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 188L, 'totalspace': 1L, 'hostname': 'locus090', 'usedspace': 1L, 'id': 260L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 189L, 'totalspace': 1L, 'hostname': 'locus091', 'usedspace': 1L, 'id': 261L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 190L, 'totalspace': 1L, 'hostname': 'locus092', 'usedspace': 1L, 'id': 262L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 191L, 'totalspace': 1L, 'hostname': 'locus093', 'usedspace': 1L, 'id': 263L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 192L, 'totalspace': 1L, 'hostname': 'locus094', 'usedspace': 1L, 'id': 264L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 193L, 'totalspace': 1L, 'hostname': 'locus095', 'usedspace': 1L, 'id': 265L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 194L, 'totalspace': 1L, 'hostname': 'locus096', 'usedspace': 1L, 'id': 266L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 195L, 'totalspace': 1L, 'hostname': 'locus097', 'usedspace': 1L, 'id': 267L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 196L, 'totalspace': 1L, 'hostname': 'locus098', 'usedspace': 1L, 'id': 268L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 197L, 'totalspace': 1L, 'hostname': 'locus099', 'usedspace': 1L, 'id': 269L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 198L, 'totalspace': 1L, 'hostname': 'locus100', 'usedspace': 1L, 'id': 270L, 'groupid': 3L, 'claimedspace': 0L, 'path': '/data', 'statusid': 0L}, {'hostid': 199L, 'totalspace': 702716L, 'hostname': 'lustre001', 'usedspace': 23084L, 'id': 271L, 'groupid': 4L, 'claimedspace': 0L, 'path': '/lustre', 'statusid': 1L}] @@ -75,24 +79,24 @@ try: def test(self): '''basic test ''' - rpc = SSDBrpc(busname=busname,timeout=1000) - self.assertEqual((retvalues_getstatenames,'OK') , rpc.getstatenames()) - self.assertEqual((retvalues_getactivegroupnames,'OK'), rpc.getactivegroupnames()) - self.assertEqual((retvalues_gethostsforgid,'OK') , rpc.gethostsforgid("4")) - #self.assertEqual((retvalues_listall,'OK') , rpc.listall()) + rpc = SSDBRPC(busname=busname, servicename=servicename) + self.assertEqual(retvalues_getstatenames , rpc.getstatenames()) + self.assertEqual(retvalues_getactivegroupnames, rpc.getactivegroupnames()) + self.assertEqual(retvalues_gethostsforgid , rpc.gethostsforgid("4")) + #self.assertEqual((retvalues_listall , rpc.listall()) tempout=rpc.listall() - self.assertEqual((retvalues_countactivehosts,'OK') , rpc.countactivehosts()) - self.assertEqual((retvalues_getArchivingStatus,'OK') , rpc.getArchivingStatus()) + self.assertEqual(retvalues_countactivehosts , rpc.countactivehosts()) + self.assertEqual(retvalues_getArchivingStatus , rpc.getArchivingStatus()) # create and run the service - with Service("GetServerState",DataMonitorQueryService,busname=busname,numthreads=4,use_service_methods=True) as testservice: - #with createService(busname=busname) as testservice: - + with createService(busname=busname, servicename=servicename): # and run all tests unittest.main(verbosity=2) print "done testing" finally: # cleanup test bus and exit - broker.delExchange(busname) - connection.close() + if broker: + broker.delExchange(busname) + if connection: + connection.close() diff --git a/SAS/ResourceAssignment/SystemStatusService/test/test_datamonitorqueueservice_and_rpc.run b/SAS/ResourceAssignment/SystemStatusService/test/test_datamonitorqueueservice_and_rpc.run index 9df2a161588611b2990425748c95d79abc23a7ed..ce03bce95864c4848990ac28ab41c840531fdf74 100755 --- a/SAS/ResourceAssignment/SystemStatusService/test/test_datamonitorqueueservice_and_rpc.run +++ b/SAS/ResourceAssignment/SystemStatusService/test/test_datamonitorqueueservice_and_rpc.run @@ -1,26 +1,5 @@ #!/bin/bash -if type "coverage" > /dev/null; then - #run test using python coverage tool - - #erase previous results - coverage erase - - #setup coverage config file - printf "[report]\nexclude_lines = \n if __name__ == .__main__.\n def main\n" > .coveragerc - - coverage run --branch --include=*service*,*rpc* --omit=test* test_datamonitorqueueservice_and_rpc.py - RESULT=$? - if [ $RESULT -eq 0 ]; then - echo " *** Code coverage results *** " - coverage report -m - echo " *** End coverage results *** " - fi - exit $RESULT -else - #coverage not available - echo "Please run: 'pip install coverage' to enable code coverage reporting of the unit tests" - #run plain test script - python test_datamonitorqueueservice_and_rpc.py - exit $? -fi +# Run the unit test +source python-coverage.sh +python_coverage_test "*service*,*rpc*" test_datamonitorqueueservice_and_rpc.py diff --git a/SAS/Scheduler/src/CMakeLists.txt b/SAS/Scheduler/src/CMakeLists.txt index e82e50db8cb028dc0fe43acf712fec8e0530f820..5a1229fcca2445632d9611265c28f719c5d203bd 100644 --- a/SAS/Scheduler/src/CMakeLists.txt +++ b/SAS/Scheduler/src/CMakeLists.txt @@ -48,7 +48,6 @@ set(scheduler_SRCS pipeline.cpp publishdialog.cpp pulsarpipeline.cpp - qcustomplot.cpp qlofardatamodel.cpp redistributetasksdialog.cpp sasconnectdialog.cpp @@ -74,7 +73,6 @@ set(scheduler_SRCS stationtreewidget.cpp Storage.cpp StorageNode.cpp - storageplot.cpp tablecolumnselectdialog.cpp tableview.cpp taskcopydialog.cpp @@ -103,7 +101,6 @@ set(scheduler_MOC_HDRS ListWidget.h parsettreeviewer.h publishdialog.h - qcustomplot.h qlofardatamodel.h redistributetasksdialog.h sasconnectdialog.h @@ -120,7 +117,6 @@ set(scheduler_MOC_HDRS statehistorydialog.h stationlistwidget.h stationtreewidget.h - storageplot.h tablecolumnselectdialog.h tableview.h taskcopydialog.h @@ -147,7 +143,6 @@ set(scheduler_UIS statehistorydialog.ui stationlistwidget.ui stationtreewidget.ui - storageresourceview.ui tablecolumnselectdialog.ui taskcopydialog.ui taskdialog.ui diff --git a/SAS/Scheduler/src/Controller.cpp b/SAS/Scheduler/src/Controller.cpp index 635cbb692b93d03dd23c33b3f5382b1804d596da..5993c92f8105dbb6182719d466fc6ae5a6284e76 100644 --- a/SAS/Scheduler/src/Controller.cpp +++ b/SAS/Scheduler/src/Controller.cpp @@ -3,9 +3,6 @@ * * Author : Alwin de Jong * e-mail : jong@astron.nl - * Revision : $Revision$ - * Last change by : $Author$ - * Change date : $Date$ * First creation : 4-feb-2009 * URL : $URL: https://svn.astron.nl/ROD/trunk/LOFAR_Scheduler/Controller.cpp $ * @@ -53,8 +50,8 @@ SchedulerSettings Controller::theSchedulerSettings = SchedulerSettings(); unsigned Controller::itsFileVersion = 0; Controller::Controller(QApplication &app) : - application(&app) , gui(0), itsSettingsDialog(0), - possiblySaveMessageBox(0),itsConflictDialog(0) + possiblySaveMessageBox(0), application(&app), gui(0), + itsSettingsDialog(0), itsConflictDialog(0) { itsAutoPublishAllowed = currentUser == "lofarsys" ? true : false; #if defined Q_OS_WINDOWS || _DEBUG_ @@ -1305,7 +1302,7 @@ void Controller::applyTableItemChange(unsigned taskID, data_headers property, co QString newstatus(value.toString()); if ((newstatus == task_states_str[Task::PRESCHEDULED]) || (newstatus == task_states_str[Task::SCHEDULED])) { std::pair<unscheduled_reasons, QString> errCode = doPreScheduleChecks(pTask); - if ((errCode.first == BEAM_DURATION_DIFFERENT)) { + if (errCode.first == BEAM_DURATION_DIFFERENT) { if (QMessageBox::question(gui, tr("Beam duration different"), errCode.second.replace('$','\n') + "\nDo you still want to set the task to " + newstatus + "?", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::No) { @@ -3321,6 +3318,11 @@ std::pair<unscheduled_reasons, QString> Controller::doPreScheduleChecks(Task *ta } } + // TODO: setInputFilesForPipeline should probably not be done here. Only set the input files when a task is downloaded from SAS or when it is just loaded from disk + // now the enabled flags (user selection) gets reset by calling setInputFilesForPipeline which is also a bug. This should not be the case + error = setInputFilesForPipeline(pPipe); + + //WK code commented out // if (pPipe->isCalibrationPipeline() && // !task->storage()->getEqualityInputOutputProducts()) // { @@ -3339,13 +3341,13 @@ std::pair<unscheduled_reasons, QString> Controller::doPreScheduleChecks(Task *ta task->storage()->generateFileList(); } } -// // Check here if the input output locations are the same -// // Check added due to #8174 + // Check here if the input output locations are the same + // Check added due to #8174 // if (task->isPipeline()) // { // // TODO: This is incredibly ugly!!! // Pipeline *pipeline = dynamic_cast<Pipeline *>(task); - +// // if (pipeline->isCalibrationPipeline() && // !task->storage()->getEqualityInputOutputProducts()) // { @@ -3849,7 +3851,7 @@ void Controller::copyTask(unsigned int taskID) { } if (newState == Task::PRESCHEDULED) { std::pair<unscheduled_reasons, QString> errCode(doPreScheduleChecks(newTask)); - if ((errCode.first == BEAM_DURATION_DIFFERENT)) { + if (errCode.first == BEAM_DURATION_DIFFERENT) { if (QMessageBox::question(gui, tr("Beam duration different"), errCode.second.replace('$','\n') + "\nDo you want to maximize the beam durations (Recommended)", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) { @@ -4093,23 +4095,21 @@ bool Controller::doScheduleChecks(Task *pTask) { return false; } +//WK code commented out // if (pTask->isPipeline()) // { // // TODO: This is incredibly ugly!!! // Pipeline *pipeline = dynamic_cast<Pipeline *>(pTask); - // if (pipeline->isCalibrationPipeline() && // !pTask->storage()->getEqualityInputOutputProducts()) // { // QMessageBox::warning(gui, // tr("Error during scheduling") -// ,"Task input and output are different, #8174, LOC3. Retry assigning resources"); +// ,tr("Task input and output are different, #8174, LOC3. Retry assigning resources")); // return false; - // } // } - return true; } @@ -4243,7 +4243,7 @@ void Controller::scheduleTask(unsigned taskID, Task::task_status new_status) { gui->updateTask(pTask); return; } - if ((errCode.first == BEAM_DURATION_DIFFERENT)) { + if (errCode.first == BEAM_DURATION_DIFFERENT) { if (QMessageBox::question(gui, tr("Beam duration different"), errCode.second.replace('$','\n') + "\nDo you still want to set the task to PRESCHEDULED?", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::No) { @@ -4390,7 +4390,7 @@ void Controller::scheduleSelectedTasks(Task::task_status new_status) { if (errCode.first == NO_ERROR) { apply_prescheduled = true; } - else if ((errCode.first == BEAM_DURATION_DIFFERENT)) { + else if (errCode.first == BEAM_DURATION_DIFFERENT) { if (apply_all_beam_duration_diffs) apply_prescheduled = true; else { int choice(QMessageBox::question(gui, tr("Beam duration different"), @@ -4943,10 +4943,12 @@ bool Controller::assignStorageToTask(Task *pTask) { } if (dpit->second == -1) { // the bandwidth required for a single file of this dataproduct exceeds the single storage node network bandwidth - pTask->setConflict(CONFLICT_STORAGE_SINGLE_FILE_BW_TOO_HIGH); - itsConflictDialog->addStorageConflict(pTask, dpit->first, CONFLICT_STORAGE_SINGLE_FILE_BW_TOO_HIGH); - bResult = false; - break; + if (pTask->getOutputDataproductCluster() != "CEP4") { + pTask->setConflict(CONFLICT_STORAGE_SINGLE_FILE_BW_TOO_HIGH); + itsConflictDialog->addStorageConflict(pTask, dpit->first, CONFLICT_STORAGE_SINGLE_FILE_BW_TOO_HIGH); + bResult = false; + break; + } } // get number of available nodes unsigned nrOfAvailableNodes(Controller::theSchedulerSettings.getNrOfStorageNodesAvailable()); @@ -4967,41 +4969,45 @@ bool Controller::assignStorageToTask(Task *pTask) { nrFilesPerNode = minNrFilesPerNode; singleFileBW = dfit->second.first / (double) pTask->getDuration().totalSeconds() * 8; // kbit/sec - // calculate the mininum number of files that have to fit on one storage node - if (nrOfAvailableNodes >= minNrOfNodes) { - if (minNrFilesPerNode <= maxNrFilesPerNode) { - while (!found_sufficient_nodes) { - preferred_locations = data.getStorageLocationOptions(dpit->first, pTask->getScheduledStart(), pTask->getScheduledEnd(), dfit->second.first, singleFileBW, nrFilesPerNode, sort_mode, preferred_nodes); - if (preferred_locations.size() <= minNrOfNodes) { - extra_locations = data.getStorageLocationOptions(dpit->first, pTask->getScheduledStart(), pTask->getScheduledEnd(), dfit->second.first, singleFileBW, nrFilesPerNode, sort_mode, extra_nodes); - if (((preferred_locations.size() + extra_locations.size()) * nrFilesPerNode >= nrFiles) && (preferred_locations.size() + extra_locations.size() >= minNrOfNodes)) { - found_sufficient_nodes = true; - break; - } - } - else { - if (preferred_locations.size() * nrFilesPerNode >= nrFiles) { - found_sufficient_nodes = true; - break; - } - } - if (++nrFilesPerNode > maxNrFilesPerNode) { // nr files per node too high will exceed bandwidth to node - break; - } - } + // calculate the mininum number of files that have to fit on one storage node + if (nrOfAvailableNodes >= minNrOfNodes) { + if (minNrFilesPerNode <= maxNrFilesPerNode) { + while (!found_sufficient_nodes) { + preferred_locations = data.getStorageLocationOptions(dpit->first, pTask->getScheduledStart(), pTask->getScheduledEnd(), dfit->second.first, singleFileBW, nrFilesPerNode, sort_mode, preferred_nodes); + if (preferred_locations.size() <= minNrOfNodes) { + extra_locations = data.getStorageLocationOptions(dpit->first, pTask->getScheduledStart(), pTask->getScheduledEnd(), dfit->second.first, singleFileBW, nrFilesPerNode, sort_mode, extra_nodes); + if (((preferred_locations.size() + extra_locations.size()) * nrFilesPerNode >= nrFiles) && (preferred_locations.size() + extra_locations.size() >= minNrOfNodes)) { + found_sufficient_nodes = true; + break; + } + } + else { + if (preferred_locations.size() * nrFilesPerNode >= nrFiles) { + found_sufficient_nodes = true; + break; + } + } + if (++nrFilesPerNode > maxNrFilesPerNode) { // nr files per node too high will exceed bandwidth to node + break; + } + } if (!found_sufficient_nodes) { - taskStorage->setStorageCheckResult(data.getLastStorageCheckResult()); - pTask->setConflict(CONFLICT_STORAGE_NO_OPTIONS); - itsConflictDialog->addStorageConflict(pTask, dpit->first, CONFLICT_STORAGE_NO_OPTIONS); - bResult = false; - break; + if (pTask->getOutputDataproductCluster() != "CEP4") { + taskStorage->setStorageCheckResult(data.getLastStorageCheckResult()); + pTask->setConflict(CONFLICT_STORAGE_NO_OPTIONS); + itsConflictDialog->addStorageConflict(pTask, dpit->first, CONFLICT_STORAGE_NO_OPTIONS); + bResult = false; + break; + } } } else { - pTask->setConflict(CONFLICT_STORAGE_TOO_FEW_NODES); - itsConflictDialog->addStorageConflict(pTask, dpit->first, CONFLICT_STORAGE_TOO_FEW_NODES); - bResult = false; - break; + if (pTask->getOutputDataproductCluster() != "CEP4") { + pTask->setConflict(CONFLICT_STORAGE_TOO_FEW_NODES); + itsConflictDialog->addStorageConflict(pTask, dpit->first, CONFLICT_STORAGE_TOO_FEW_NODES); + bResult = false; + break; + } } if (bResult) { @@ -5097,10 +5103,12 @@ bool Controller::assignStorageToTask(Task *pTask) { } } else { - pTask->setConflict(CONFLICT_STORAGE_TOO_FEW_NODES); - itsConflictDialog->addStorageConflict(pTask, dpit->first, CONFLICT_STORAGE_TOO_FEW_NODES); - bResult = false; - break; + if (pTask->getOutputDataproductCluster() != "CEP4") { + pTask->setConflict(CONFLICT_STORAGE_TOO_FEW_NODES); + itsConflictDialog->addStorageConflict(pTask, dpit->first, CONFLICT_STORAGE_TOO_FEW_NODES); + bResult = false; + break; + } } } } @@ -5110,15 +5118,15 @@ bool Controller::assignStorageToTask(Task *pTask) { } bool Controller::assignGroupedStorage(void) { // not for manual assignment of storage - bool bResult(true); - std::map<unsigned, std::vector<Task *> > groupedTasks = data.getGroupedTasks(Task::PRESCHEDULED); + bool bResult(true); + std::map<unsigned, std::vector<Task *> > groupedTasks = data.getGroupedTasks(Task::PRESCHEDULED); - std::vector<unsigned> emptyGroups; - if (!groupedTasks.empty()) { - std::vector<Task *> subGroupTasks; + std::vector<unsigned> emptyGroups; + if (!groupedTasks.empty()) { + std::vector<Task *> subGroupTasks; TaskStorage *tStorage; - for (std::map<unsigned, std::vector<Task *> >::iterator groupIt = groupedTasks.begin(); groupIt != groupedTasks.end(); ++groupIt) { - for (std::vector<Task *>::const_iterator taskit = groupIt->second.begin(); taskit != groupIt->second.end(); ++taskit) { + for (std::map<unsigned, std::vector<Task *> >::iterator groupIt = groupedTasks.begin(); groupIt != groupedTasks.end(); ++groupIt) { + for (std::vector<Task *>::const_iterator taskit = groupIt->second.begin(); taskit != groupIt->second.end(); ++taskit) { if ((*taskit)->hasStorage()) { tStorage = (*taskit)->storage(); if (tStorage->getStorageSelectionMode() != STORAGE_MODE_MANUAL) { // don't assign grouped storage to tasks that have manual storage assignment @@ -5130,454 +5138,464 @@ bool Controller::assignGroupedStorage(void) { // not for manual assignment of st } } } - if (subGroupTasks.empty()) { - emptyGroups.push_back(groupIt->first); - } - else { - groupIt->second = subGroupTasks; // removes all 'manual storage' tasks - subGroupTasks.clear(); - } - } - // remove groups that have no tasks with automatic storage assignment left - for (std::vector<unsigned>::const_iterator eit = emptyGroups.begin(); eit != emptyGroups.end(); ++eit) { - groupedTasks.erase(*eit); - } - if (groupedTasks.empty()) return bResult; // if nothing left return - - // get number of available storage nodes - unsigned nrOfAvailableNodes(Controller::theSchedulerSettings.getNrOfStorageNodesAvailable()); - if (nrOfAvailableNodes > 0) { - sortMode sort_mode; - - // the distribution algorithm used - const storageNodeDistribution &distribution(theSchedulerSettings.getStorageDistribution()); - if (distribution == STORAGE_DISTRIBUTION_FLAT_USAGE) { - sort_mode = SORT_USAGE; - } - else if (distribution == STORAGE_DISTIBUTION_LEAST_FRAGMENTED) { - sort_mode = SORT_SIZE; - } - else sort_mode = SORT_NONE; - - const preferredDataProductStorageMap &pdps(theSchedulerSettings.getPreferredDataProductStorage()); - const preferredProjectStorageMap &pps(theSchedulerSettings.getPreferredProjectStorage()); - std::vector<int> extra_nodes, usable_storage_nodes(itsDMConnection->getUsableStorageNodeIDs()); // all existing storage node IDs + if (subGroupTasks.empty()) { + emptyGroups.push_back(groupIt->first); + } + else { + groupIt->second = subGroupTasks; // removes all 'manual storage' tasks + subGroupTasks.clear(); + } + } + // remove groups that have no tasks with automatic storage assignment left + for (std::vector<unsigned>::const_iterator eit = emptyGroups.begin(); eit != emptyGroups.end(); ++eit) { + groupedTasks.erase(*eit); + } + if (groupedTasks.empty()) return bResult; // if nothing left return + // get number of available storage nodes + unsigned nrOfAvailableNodes(Controller::theSchedulerSettings.getNrOfStorageNodesAvailable()); + if (nrOfAvailableNodes > 0) { + sortMode sort_mode; - //determine grouped tasks combined storage needs and settings - dataFileMap combinedOutput; - storage_selection_mode mode; - std::map<dataProductTypes, int> combinedMinimumNrNodes; - std::map<dataProductTypes, double> maxSingleFileBW; - std::map<dataProductTypes, double>::iterator bwit; - dataFileMap::iterator dfit; - std::map<dataProductTypes, int>::iterator mit; - int project_id(0); - std::pair<unscheduled_reasons, QString> error; - for (std::map<unsigned, std::vector<Task *> >::const_iterator groupIt = groupedTasks.begin(); groupIt != groupedTasks.end(); ++groupIt) { // 2 - combinedOutput.clear(); - combinedMinimumNrNodes.clear(); - if (!groupIt->second.empty()) { - mode = groupIt->second.front()->storage()->getStorageSelectionMode(); - project_id = theSchedulerSettings.getCampaignInfo(groupIt->second.front()->getProjectName()).id; // should be the same for all tasks within group (no check done) - for (std::vector<Task *>::const_iterator taskit = groupIt->second.begin(); taskit != groupIt->second.end(); ++taskit) { // 3 - TaskStorage *task_storage((*taskit)->storage()); - if ((*taskit)->isPipeline()) { - Pipeline *pipe(static_cast<Pipeline *>(*taskit)); - error = setInputFilesForPipeline(pipe); - if (error.first == NO_ERROR) { - pipe->calculateDataFiles(); - const storageMap &inputStorageLocations(task_storage->getInputStorageLocations()); - storageMap::const_iterator inpcorit = inputStorageLocations.find(DP_CORRELATED_UV); - if (inpcorit != inputStorageLocations.end()) { - if (task_storage->isOutputDataProduktEnabled(DP_INSTRUMENT_MODEL)) { // set output storage nodes equal to input storage nodes for these type of data products - std::vector<storageResult> result = data.addStorageToTask(pipe, DP_INSTRUMENT_MODEL, inpcorit->second, false); - if (!result.empty()) { - for (std::vector<storageResult>::const_iterator sit = result.begin(); sit != result.end(); ++sit) { - if (sit->conflict != CONFLICT_NO_CONFLICT) { - itsConflictDialog->addStorageConflict(pipe, sit->dataProductType, sit->conflict); - } - pipe->setConflict(sit->conflict); - } - bResult = false; - } - } - if (task_storage->isOutputDataProduktEnabled(DP_CORRELATED_UV)) { - - // inpcorit->second bevat alle storage nodes, dus ook die van de eerdere SAPs waardoor - // dit dataprodukt de storage nodes van SAP000 van de input krijgt en niet die van SAP001 - std::vector<storageResult> result = data.addStorageToTask(pipe, DP_CORRELATED_UV, inpcorit->second, false); - if (!result.empty()) { - for (std::vector<storageResult>::const_iterator sit = result.begin(); sit != result.end(); ++sit) { - if (sit->conflict != CONFLICT_NO_CONFLICT) { - itsConflictDialog->addStorageConflict(pipe, sit->dataProductType, sit->conflict); - } - pipe->setConflict(sit->conflict); - } - bResult = false; - } - } + // the distribution algorithm used + const storageNodeDistribution &distribution(theSchedulerSettings.getStorageDistribution()); + if (distribution == STORAGE_DISTRIBUTION_FLAT_USAGE) { + sort_mode = SORT_USAGE; + } + else if (distribution == STORAGE_DISTIBUTION_LEAST_FRAGMENTED) { + sort_mode = SORT_SIZE; + } + else sort_mode = SORT_NONE; - task_storage->generateFileList(); - } - } - } + const preferredDataProductStorageMap &pdps(theSchedulerSettings.getPreferredDataProductStorage()); + const preferredProjectStorageMap &pps(theSchedulerSettings.getPreferredProjectStorage()); + std::vector<int> extra_nodes, usable_storage_nodes(itsDMConnection->getUsableStorageNodeIDs()); // all existing storage node IDs - double taskDuration((*taskit)->getDuration().totalSeconds() * 8); - const dataFileMap &dataFileSizes = task_storage->getOutputFileSizes(); - if (task_storage->getStorageSelectionMode() != mode) { - itsConflictDialog->addConflict(*taskit, CONFLICT_GROUP_STORAGE_MODE_DIFFERENT); - bResult = false; - } - if (!dataFileSizes.empty()) { - // summing individual file size for same data product types - for (dataFileMap::const_iterator dit = dataFileSizes.begin(); dit != dataFileSizes.end(); ++dit) { // 4 - if ((*taskit)->isObservation() || ((dit->first != DP_INSTRUMENT_MODEL) && (dit->first != DP_CORRELATED_UV))) { // skip this for instrument model and correlated, which is already set above - dfit = combinedOutput.find(dit->first); - if (dfit != combinedOutput.end()) { - dfit->second.first += dit->second.first; - } - else { - combinedOutput[dit->first] = std::pair<double, unsigned>(dit->second.first, dit->second.second); - } - //determine the maximum single file bandwidth for each data product type in the group of tasks - double currentBW = dit->second.first / taskDuration; // kbit/sec - bwit = maxSingleFileBW.find(dit->first); - if (bwit != maxSingleFileBW.end()) { - bwit->second = std::max(bwit->second, currentBW); - } - else { - maxSingleFileBW[dit->first] = currentBW; - } - } - } - // determining the overall minimum number of nodes needed for each data product type - std::map<dataProductTypes, int> minimumNrnodes = task_storage->getMinimumNrOfStorageNodes(); - for (std::map<dataProductTypes, int>::const_iterator minit = minimumNrnodes.begin(); minit != minimumNrnodes.end(); ++minit) { - if ((*taskit)->isObservation() || ((minit->first != DP_INSTRUMENT_MODEL) && (minit->first != DP_CORRELATED_UV))) { // skip for instrument model and correlated,they have been set - if (minit->second == -1) { - (*taskit)->setConflict(CONFLICT_STORAGE_SINGLE_FILE_BW_TOO_HIGH); - itsConflictDialog->addStorageConflict((*taskit), minit->first, CONFLICT_STORAGE_SINGLE_FILE_BW_TOO_HIGH); - bResult = false; - } - else { - mit = combinedMinimumNrNodes.find(minit->first); - if (mit != combinedMinimumNrNodes.end()) { - mit->second = std::max(mit->second, minit->second); - } - else { - combinedMinimumNrNodes[minit->first] = minit->second; - } - } - } - } - } - else { - itsConflictDialog->addConflict(*taskit, CONFLICT_STORAGE_NO_DATA); - bResult = false; - } - } // END 3 - } - else { - std::cout << "Controller::assignGroupedStorage: Warning: trying to assign storage to group:" << groupIt->first << " in which there are no tasks" << std::endl; - continue; - } + //determine grouped tasks combined storage needs and settings + dataFileMap combinedOutput; + storage_selection_mode mode; + std::map<dataProductTypes, int> combinedMinimumNrNodes; + std::map<dataProductTypes, double> maxSingleFileBW; + std::map<dataProductTypes, double>::iterator bwit; + dataFileMap::iterator dfit; + std::map<dataProductTypes, int>::iterator mit; + int project_id(0); + std::pair<unscheduled_reasons, QString> error; + for (std::map<unsigned, std::vector<Task *> >::const_iterator groupIt = groupedTasks.begin(); groupIt != groupedTasks.end(); ++groupIt) { // 2 + combinedOutput.clear(); + combinedMinimumNrNodes.clear(); + if (!groupIt->second.empty()) { + mode = groupIt->second.front()->storage()->getStorageSelectionMode(); + project_id = theSchedulerSettings.getCampaignInfo(groupIt->second.front()->getProjectName()).id; // should be the same for all tasks within group (no check done) + for (std::vector<Task *>::const_iterator taskit = groupIt->second.begin(); taskit != groupIt->second.end(); ++taskit) { // 3 + TaskStorage *task_storage((*taskit)->storage()); + if ((*taskit)->isPipeline()) { + Pipeline *pipe(static_cast<Pipeline *>(*taskit)); + error = setInputFilesForPipeline(pipe); + if (error.first == NO_ERROR) { + pipe->calculateDataFiles(); + const storageMap &inputStorageLocations(task_storage->getInputStorageLocations()); + storageMap::const_iterator inpcorit = inputStorageLocations.find(DP_CORRELATED_UV); + if (inpcorit != inputStorageLocations.end()) { + if (task_storage->isOutputDataProduktEnabled(DP_INSTRUMENT_MODEL)) { // set output storage nodes equal to input storage nodes for these type of data products + std::vector<storageResult> result = data.addStorageToTask(pipe, DP_INSTRUMENT_MODEL, inpcorit->second, false); + if (!result.empty()) { + for (std::vector<storageResult>::const_iterator sit = result.begin(); sit != result.end(); ++sit) { + if (sit->conflict != CONFLICT_NO_CONFLICT) { + itsConflictDialog->addStorageConflict(pipe, sit->dataProductType, sit->conflict); + } + pipe->setConflict(sit->conflict); + } + bResult = false; + } + } + if (task_storage->isOutputDataProduktEnabled(DP_CORRELATED_UV)) { + + // inpcorit->second bevat alle storage nodes, dus ook die van de eerdere SAPs waardoor + // dit dataprodukt de storage nodes van SAP000 van de input krijgt en niet die van SAP001 + std::vector<storageResult> result = data.addStorageToTask(pipe, DP_CORRELATED_UV, inpcorit->second, false); + if (!result.empty()) { + for (std::vector<storageResult>::const_iterator sit = result.begin(); sit != result.end(); ++sit) { + if (sit->conflict != CONFLICT_NO_CONFLICT) { + itsConflictDialog->addStorageConflict(pipe, sit->dataProductType, sit->conflict); + } + pipe->setConflict(sit->conflict); + } + bResult = false; + } + } - if (bResult) { // only do the actual group storage assignment if no conflicts are found + task_storage->generateFileList(); + } + } + } - if (!combinedOutput.empty()) { + double taskDuration((*taskit)->getDuration().totalSeconds() * 8); + const dataFileMap &dataFileSizes = task_storage->getOutputFileSizes(); + if (task_storage->getStorageSelectionMode() != mode) { + itsConflictDialog->addConflict(*taskit, CONFLICT_GROUP_STORAGE_MODE_DIFFERENT); + bResult = false; + } + if (!dataFileSizes.empty()) { + // summing individual file size for same data product types + for (dataFileMap::const_iterator dit = dataFileSizes.begin(); dit != dataFileSizes.end(); ++dit) { // 4 + if ((*taskit)->isObservation() || ((dit->first != DP_INSTRUMENT_MODEL) && (dit->first != DP_CORRELATED_UV))) { // skip this for instrument model and correlated, which is already set above + dfit = combinedOutput.find(dit->first); + if (dfit != combinedOutput.end()) { + dfit->second.first += dit->second.first; - // storage node selection by preferred project nodes? - // storage_selection_mode mode(pTask->getStorageSelectionMode()); - bool project_preferred_nodes; - if ((mode == STORAGE_MODE_MAXIMUM_PROJECT_PREFERRED) || (mode == STORAGE_MODE_MINIMUM_PROJECT_PREFERRED)) project_preferred_nodes = true; - else project_preferred_nodes = false; + } + else { + combinedOutput[dit->first] = std::pair<double, unsigned>(dit->second.first, dit->second.second); + } + //determine the maximum single file bandwidth for each data product type in the group of tasks + double currentBW = dit->second.first / taskDuration; // kbit/sec + bwit = maxSingleFileBW.find(dit->first); + if (bwit != maxSingleFileBW.end()) { + bwit->second = std::max(bwit->second, currentBW); + } + else { + maxSingleFileBW[dit->first] = currentBW; + } + } + } + // determining the overall minimum number of nodes needed for each data product type + std::map<dataProductTypes, int> minimumNrnodes = task_storage->getMinimumNrOfStorageNodes(); + for (std::map<dataProductTypes, int>::const_iterator minit = minimumNrnodes.begin(); minit != minimumNrnodes.end(); ++minit) { + if ((*taskit)->isObservation() || ((minit->first != DP_INSTRUMENT_MODEL) && (minit->first != DP_CORRELATED_UV))) { // skip for instrument model and correlated,they have been set + if (minit->second == -1) { + if ((*taskit)->getOutputDataproductCluster() != "CEP4") { + (*taskit)->setConflict(CONFLICT_STORAGE_SINGLE_FILE_BW_TOO_HIGH); + itsConflictDialog->addStorageConflict((*taskit), minit->first, CONFLICT_STORAGE_SINGLE_FILE_BW_TOO_HIGH); + bResult = false; + } + } + else { + mit = combinedMinimumNrNodes.find(minit->first); + if (mit != combinedMinimumNrNodes.end()) { + mit->second = std::max(mit->second, minit->second); + } + else { + combinedMinimumNrNodes[minit->first] = minit->second; + } + } + } + } + } + else { + itsConflictDialog->addConflict(*taskit, CONFLICT_STORAGE_NO_DATA); + bResult = false; + } + } // END 3 + } + else { + std::cout << "Controller::assignGroupedStorage: Warning: trying to assign storage to group:" << groupIt->first << " in which there are no tasks" << std::endl; + continue; + } + if (bResult) { // only do the actual group storage assignment if no conflicts are found -// double singleFileBW; - unsigned nrFiles(0), minNrOfNodes(0), nrFilesPerNode(0); + if (!combinedOutput.empty()) { - std::vector<int> preferred_nodes;// = emptyVec; + // storage node selection by preferred project nodes? + // storage_selection_mode mode(pTask->getStorageSelectionMode()); + bool project_preferred_nodes; + if ((mode == STORAGE_MODE_MAXIMUM_PROJECT_PREFERRED) || (mode == STORAGE_MODE_MINIMUM_PROJECT_PREFERRED)) project_preferred_nodes = true; + else project_preferred_nodes = false; - // *********************************************************************** - // ******************* SEARCH FOR SUITABLE LOCATIONS ********************* - // *********************************************************************** + // double singleFileBW; + unsigned nrFiles(0), minNrOfNodes(0), nrFilesPerNode(0); - // STEP2: search storageLocations for all dataProducts in sequence according to individual file size (large to small) of the dataProduct (i.e. sequence of sortedDataFiles) + std::vector<int> preferred_nodes;// = emptyVec; - preferredDataProductStorageMap::const_iterator pnit; - preferredProjectStorageMap::const_iterator ppit; - if (project_preferred_nodes) { - ppit = pps.find(project_id); - if (ppit != pps.end()) { - if (ppit->second.empty()) { - preferred_nodes = usable_storage_nodes; - } - else { - preferred_nodes = ppit->second; - for (std::vector<int>::const_iterator asit = usable_storage_nodes.begin(); asit != usable_storage_nodes.end(); ++asit) { - if (std::find(preferred_nodes.begin(), preferred_nodes.end(), *asit) == preferred_nodes.end()) { - extra_nodes.push_back(*asit); - } - } - } - } - else { - preferred_nodes = usable_storage_nodes; - } - } + // *********************************************************************** + // ******************* SEARCH FOR SUITABLE LOCATIONS ********************* + // *********************************************************************** - storageLocationOptions preferred_locations, extra_locations, common_pref_locations, common_extra_locations; - for (std::map<dataProductTypes, int>::const_iterator dpit = combinedMinimumNrNodes.begin(); dpit != combinedMinimumNrNodes.end(); ++dpit) { // 5 - for (std::vector<Task *>::const_iterator taskit = groupIt->second.begin(); taskit != groupIt->second.end(); ++taskit) { //6 + // STEP2: search storageLocations for all dataProducts in sequence according to individual file size (large to small) of the dataProduct (i.e. sequence of sortedDataFiles) - if (!project_preferred_nodes) { - pnit = pdps.find(dpit->first); // are there preferred storage nodes for this data product type specified? - if (pnit != pdps.end()) { - if (pnit->second.empty()) { - preferred_nodes = usable_storage_nodes; - } - else { - preferred_nodes = pnit->second; - for (std::vector<int>::const_iterator asit = usable_storage_nodes.begin(); asit != usable_storage_nodes.end(); ++asit) { - if (std::find(preferred_nodes.begin(), preferred_nodes.end(), *asit) == preferred_nodes.end()) { - extra_nodes.push_back(*asit); - } - } - } - } - else { - preferred_nodes = usable_storage_nodes; - } - } + preferredDataProductStorageMap::const_iterator pnit; + preferredProjectStorageMap::const_iterator ppit; - // now search for storage locations using the combined storage requirements (only search ones, not for all tasks separately, - // final check will be done when really assigning the storage to each grouped task - minNrOfNodes = dpit->second; // the minimum number of storage nodes REQUIRED for this data product - dfit = combinedOutput.find(dpit->first); - bwit = maxSingleFileBW.find(dpit->first); - if (dfit != combinedOutput.end()) { - nrFiles = dfit->second.second; - unsigned minNrFilesPerNode = static_cast<unsigned>(ceil((float)nrFiles / nrOfAvailableNodes)); // the minimum number of files the selected nodes should be able to hold - unsigned maxNrFilesPerNode = static_cast<unsigned>(floor((float)nrFiles / minNrOfNodes)); // the maximum number of files that can be written to one storage node according to bandwidth limitations - nrFilesPerNode = minNrFilesPerNode; + if (project_preferred_nodes) { + ppit = pps.find(project_id); + if (ppit != pps.end()) { + if (ppit->second.empty()) { + preferred_nodes = usable_storage_nodes; + } + else { + preferred_nodes = ppit->second; + for (std::vector<int>::const_iterator asit = usable_storage_nodes.begin(); asit != usable_storage_nodes.end(); ++asit) { + if (std::find(preferred_nodes.begin(), preferred_nodes.end(), *asit) == preferred_nodes.end()) { + extra_nodes.push_back(*asit); + } + } + } + } + else { + preferred_nodes = usable_storage_nodes; + } + } - // calculate the minimum number of files that have to fit on one storage node - if (nrOfAvailableNodes >= minNrOfNodes) { - if (minNrFilesPerNode <= maxNrFilesPerNode) { - preferred_locations = data.getStorageLocationOptions(dpit->first, (*taskit)->getScheduledStart(), (*taskit)->getScheduledEnd(), dfit->second.first, bwit->second, nrFilesPerNode, sort_mode, preferred_nodes); - extra_locations = data.getStorageLocationOptions(dpit->first, (*taskit)->getScheduledStart(), (*taskit)->getScheduledEnd(), dfit->second.first, bwit->second, nrFilesPerNode, sort_mode, extra_nodes); + storageLocationOptions preferred_locations, extra_locations, common_pref_locations, common_extra_locations; + for (std::map<dataProductTypes, int>::const_iterator dpit = combinedMinimumNrNodes.begin(); dpit != combinedMinimumNrNodes.end(); ++dpit) { // 5 + for (std::vector<Task *>::const_iterator taskit = groupIt->second.begin(); taskit != groupIt->second.end(); ++taskit) { //6 - if (preferred_locations.size() + extra_locations.size() >= minNrOfNodes) { + if (!project_preferred_nodes) { + pnit = pdps.find(dpit->first); // are there preferred storage nodes for this data product type specified? + if (pnit != pdps.end()) { + if (pnit->second.empty()) { + preferred_nodes = usable_storage_nodes; + } + else { + preferred_nodes = pnit->second; + for (std::vector<int>::const_iterator asit = usable_storage_nodes.begin(); asit != usable_storage_nodes.end(); ++asit) { + if (std::find(preferred_nodes.begin(), preferred_nodes.end(), *asit) == preferred_nodes.end()) { + extra_nodes.push_back(*asit); + } + } + } + } + else { + preferred_nodes = usable_storage_nodes; + } + } - preferred_nodes.clear(); - extra_nodes.clear(); - for (storageLocationOptions::const_iterator cpit = preferred_locations.begin(); cpit != preferred_locations.end(); ++cpit) { - preferred_nodes.push_back(cpit->first); - } - for (storageLocationOptions::const_iterator cpit = extra_locations.begin(); cpit != extra_locations.end(); ++cpit) { - extra_nodes.push_back(cpit->first); - } + // now search for storage locations using the combined storage requirements (only search ones, not for all tasks separately, + // final check will be done when really assigning the storage to each grouped task + minNrOfNodes = dpit->second; // the minimum number of storage nodes REQUIRED for this data product + dfit = combinedOutput.find(dpit->first); + bwit = maxSingleFileBW.find(dpit->first); + if (dfit != combinedOutput.end()) { + nrFiles = dfit->second.second; + unsigned minNrFilesPerNode = static_cast<unsigned>(ceil((float)nrFiles / nrOfAvailableNodes)); // the minimum number of files the selected nodes should be able to hold + unsigned maxNrFilesPerNode = static_cast<unsigned>(floor((float)nrFiles / minNrOfNodes)); // the maximum number of files that can be written to one storage node according to bandwidth limitations + nrFilesPerNode = minNrFilesPerNode; + + // calculate the minimum number of files that have to fit on one storage node + if (nrOfAvailableNodes >= minNrOfNodes) { + if (minNrFilesPerNode <= maxNrFilesPerNode) { + preferred_locations = data.getStorageLocationOptions(dpit->first, (*taskit)->getScheduledStart(), (*taskit)->getScheduledEnd(), dfit->second.first, bwit->second, nrFilesPerNode, sort_mode, preferred_nodes); + extra_locations = data.getStorageLocationOptions(dpit->first, (*taskit)->getScheduledStart(), (*taskit)->getScheduledEnd(), dfit->second.first, bwit->second, nrFilesPerNode, sort_mode, extra_nodes); + + if (preferred_locations.size() + extra_locations.size() >= minNrOfNodes) { + + preferred_nodes.clear(); + extra_nodes.clear(); + for (storageLocationOptions::const_iterator cpit = preferred_locations.begin(); cpit != preferred_locations.end(); ++cpit) { + preferred_nodes.push_back(cpit->first); + } + for (storageLocationOptions::const_iterator cpit = extra_locations.begin(); cpit != extra_locations.end(); ++cpit) { + extra_nodes.push_back(cpit->first); + } - if (preferred_nodes.empty() && extra_nodes.empty()) { - (*taskit)->setConflict(CONFLICT_STORAGE_NO_OPTIONS); - itsConflictDialog->addStorageConflict((*taskit), dpit->first, CONFLICT_STORAGE_NO_OPTIONS); - bResult = false; - break; - } + if (preferred_nodes.empty() && extra_nodes.empty()) { + (*taskit)->setConflict(CONFLICT_STORAGE_NO_OPTIONS); + itsConflictDialog->addStorageConflict((*taskit), dpit->first, CONFLICT_STORAGE_NO_OPTIONS); + bResult = false; + break; + } - if (nrFilesPerNode > maxNrFilesPerNode) { // nr files per node too high will exceed bandwidth to node - (*taskit)->setConflict(CONFLICT_STORAGE_EXCEEDS_BANDWIDTH); - itsConflictDialog->addStorageConflict((*taskit), dpit->first, CONFLICT_STORAGE_EXCEEDS_BANDWIDTH); - bResult = false; - break; - } - } - else { - (*taskit)->setConflict(CONFLICT_STORAGE_MINIMUM_NODES); - itsConflictDialog->addStorageConflict((*taskit), dpit->first, CONFLICT_STORAGE_MINIMUM_NODES); - bResult = false; - break; - } - } - else { - (*taskit)->setConflict(CONFLICT_STORAGE_EXCEEDS_BANDWIDTH); - itsConflictDialog->addStorageConflict((*taskit), dpit->first, CONFLICT_STORAGE_EXCEEDS_BANDWIDTH); - bResult = false; - break; - } - } - else { - (*taskit)->setConflict(CONFLICT_STORAGE_TOO_FEW_NODES); - itsConflictDialog->addStorageConflict((*taskit), dpit->first, CONFLICT_STORAGE_TOO_FEW_NODES); - bResult = false; - break; - } - } + if (nrFilesPerNode > maxNrFilesPerNode) { // nr files per node too high will exceed bandwidth to node + if ((*taskit)->getOutputDataproductCluster() != "CEP4") { + (*taskit)->setConflict(CONFLICT_STORAGE_EXCEEDS_BANDWIDTH); + itsConflictDialog->addStorageConflict((*taskit), dpit->first, CONFLICT_STORAGE_EXCEEDS_BANDWIDTH); + bResult = false; + break; + } + } + } + else { + if ((*taskit)->getOutputDataproductCluster() != "CEP4") { + (*taskit)->setConflict(CONFLICT_STORAGE_MINIMUM_NODES); + itsConflictDialog->addStorageConflict((*taskit), dpit->first, CONFLICT_STORAGE_MINIMUM_NODES); + bResult = false; + break; + } + } + } + else { + if ((*taskit)->getOutputDataproductCluster() != "CEP4") { + (*taskit)->setConflict(CONFLICT_STORAGE_EXCEEDS_BANDWIDTH); + itsConflictDialog->addStorageConflict((*taskit), dpit->first, CONFLICT_STORAGE_EXCEEDS_BANDWIDTH); + bResult = false; + break; + } + } + } + else { + if ((*taskit)->getOutputDataproductCluster() != "CEP4") { + (*taskit)->setConflict(CONFLICT_STORAGE_TOO_FEW_NODES); + itsConflictDialog->addStorageConflict((*taskit), dpit->first, CONFLICT_STORAGE_TOO_FEW_NODES); + bResult = false; + break; + } + } + } - if (bResult) { - // check which nodes they have in common, assign common nodes with checking! - // *********************************************************************** - // ************* DISTRIBUTION OF DATA OVER STORAGE NODES ***************** - // *********************************************************************** - // use the maximum number of suitable storage nodes (= suitable_locations.size()) - // only keep the locations that are common to all tasks for this data product - if (taskit == groupIt->second.begin()) { // for first task search, keep all options - common_pref_locations = preferred_locations; - common_extra_locations = extra_locations; - } - else { - storageLocationOptions new_common_pref_locations, new_common_extra_locations; - for (storageLocationOptions::const_iterator sit = common_pref_locations.begin(); sit != common_pref_locations.end(); ++sit) { - for (nodeStorageOptions::const_iterator nsit = sit->second.begin(); nsit != sit->second.end(); ++nsit) { // iterates over the raids - if (storageLocationsContains(preferred_locations, sit->first, nsit->raidID)) { - new_common_pref_locations.push_back(*sit); - } - } - } - common_pref_locations = new_common_pref_locations; - for (storageLocationOptions::const_iterator sit = common_extra_locations.begin(); sit != common_extra_locations.end(); ++sit) { - for (nodeStorageOptions::const_iterator nsit = sit->second.begin(); nsit != sit->second.end(); ++nsit) { // iterates over the raids - if (storageLocationsContains(extra_locations, sit->first, nsit->raidID)) { - new_common_extra_locations.push_back(*sit); - } - } - } - common_extra_locations = new_common_extra_locations; - } - } - } // 6, end of search for all task in this group for the current data product + if (bResult) { + // check which nodes they have in common, assign common nodes with checking! + // *********************************************************************** + // ************* DISTRIBUTION OF DATA OVER STORAGE NODES ***************** + // *********************************************************************** + // use the maximum number of suitable storage nodes (= suitable_locations.size()) + // only keep the locations that are common to all tasks for this data product + if (taskit == groupIt->second.begin()) { // for first task search, keep all options + common_pref_locations = preferred_locations; + common_extra_locations = extra_locations; + } + else { + storageLocationOptions new_common_pref_locations, new_common_extra_locations; + for (storageLocationOptions::const_iterator sit = common_pref_locations.begin(); sit != common_pref_locations.end(); ++sit) { + for (nodeStorageOptions::const_iterator nsit = sit->second.begin(); nsit != sit->second.end(); ++nsit) { // iterates over the raids + if (storageLocationsContains(preferred_locations, sit->first, nsit->raidID)) { + new_common_pref_locations.push_back(*sit); + } + } + } + common_pref_locations = new_common_pref_locations; + for (storageLocationOptions::const_iterator sit = common_extra_locations.begin(); sit != common_extra_locations.end(); ++sit) { + for (nodeStorageOptions::const_iterator nsit = sit->second.begin(); nsit != sit->second.end(); ++nsit) { // iterates over the raids + if (storageLocationsContains(extra_locations, sit->first, nsit->raidID)) { + new_common_extra_locations.push_back(*sit); + } + } + } + common_extra_locations = new_common_extra_locations; + } + } + } // 6, end of search for all task in this group for the current data product - unsigned maxFilesToNodes(MAX_UNSIGNED); - storageVector locations; + unsigned maxFilesToNodes(MAX_UNSIGNED); + storageVector locations; - bool sufficient_locations(false); - // select enough locations from the common location solutions - if ((mode == STORAGE_MODE_MAXIMUM_DATA_TYPE_PREFERRED) || (mode == STORAGE_MODE_MAXIMUM_PROJECT_PREFERRED)) { - for (storageLocationOptions::const_iterator sit = common_pref_locations.begin(); sit != common_pref_locations.end(); ++sit) { // iterate over available locations - for (nodeStorageOptions::const_iterator nsit = sit->second.begin(); nsit != sit->second.end(); ++nsit) { // iterates over the raids - locations.push_back(storageVector::value_type(sit->first, nsit->raidID)); // use only the first raid option of each storage node available - // also determine the maximum number of files that can be written to a single suitable node, needed to determine the minimum number of extra (non-preferred) nodes needed in addition to the preferred nodes - maxFilesToNodes = std::min(maxFilesToNodes, nsit->nrUnits); - if (locations.size() * nrFilesPerNode >= nrFiles) { - sufficient_locations = true; -// break; // don't assign more storage nodes than the number of files written - } + bool sufficient_locations(false); + // select enough locations from the common location solutions + if ((mode == STORAGE_MODE_MAXIMUM_DATA_TYPE_PREFERRED) || (mode == STORAGE_MODE_MAXIMUM_PROJECT_PREFERRED)) { + for (storageLocationOptions::const_iterator sit = common_pref_locations.begin(); sit != common_pref_locations.end(); ++sit) { // iterate over available locations + for (nodeStorageOptions::const_iterator nsit = sit->second.begin(); nsit != sit->second.end(); ++nsit) { // iterates over the raids + locations.push_back(storageVector::value_type(sit->first, nsit->raidID)); // use only the first raid option of each storage node available + // also determine the maximum number of files that can be written to a single suitable node, needed to determine the minimum number of extra (non-preferred) nodes needed in addition to the preferred nodes + maxFilesToNodes = std::min(maxFilesToNodes, nsit->nrUnits); + if (locations.size() * nrFilesPerNode >= nrFiles) { + sufficient_locations = true; + // break; // don't assign more storage nodes than the number of files written + } - } -// if (sufficient_locations) break; - } - if (!sufficient_locations && (locations.size() < minNrOfNodes)) { // do we need extra locations (non preferred nodes)? If so, use as few as possible of these - for (storageLocationOptions::const_iterator sit = common_extra_locations.begin(); sit != common_extra_locations.end(); ++sit) { - for (nodeStorageOptions::const_iterator nsit = sit->second.begin(); nsit != sit->second.end(); ++nsit) { - locations.push_back(storageVector::value_type(sit->first, nsit->raidID)); - maxFilesToNodes = std::min(maxFilesToNodes, nsit->nrUnits); - if ((locations.size() * maxFilesToNodes >= nrFiles) && (locations.size() >= minNrOfNodes)) { - sufficient_locations = true; - break; // don't assign more storage nodes than the number of files written - } - } - if (sufficient_locations) break; - } - } - } - else if ((mode == STORAGE_MODE_MINIMUM_DATA_TYPE_PREFERRED) || (mode == STORAGE_MODE_MINIMUM_PROJECT_PREFERRED)) { - bool inserted(false); - vector<std::pair<int, storageOption> > smallest_vec; // first = node ID - for (storageLocationOptions::const_iterator sit = common_pref_locations.begin(); sit != common_pref_locations.end(); ++sit) { - for (nodeStorageOptions::const_iterator nsit = sit->second.begin(); nsit != sit->second.end(); ++nsit) { - maxFilesToNodes = std::min(maxFilesToNodes, nsit->nrUnits); // determine the maximum number of files that can be written to a single suitable node - for (vector<std::pair<int, storageOption> >::iterator ssit = smallest_vec.begin(); ssit != smallest_vec.end(); ++ssit) { - if (nsit->remainingSpacekB < ssit->second.remainingSpacekB) { // sort according to free space in smallest_vec - smallest_vec.insert(ssit, std::pair<int, storageOption>(sit->first, *nsit)); // insert the smallest free space raid arrays in smallest_vec - inserted = true; - break; - } - } - if (!inserted) { - smallest_vec.push_back(std::pair<int, storageOption>(sit->first, *nsit)); // put at the end (it's has the largest free space up to now) - break; // only one raid array per node here - } - } - if (smallest_vec.size() * nrFilesPerNode >= nrFiles) { - sufficient_locations = true; - break; // don't assign more storage nodes than the number of files written - } - } + } + // if (sufficient_locations) break; + } + if (!sufficient_locations && (locations.size() < minNrOfNodes)) { // do we need extra locations (non preferred nodes)? If so, use as few as possible of these + for (storageLocationOptions::const_iterator sit = common_extra_locations.begin(); sit != common_extra_locations.end(); ++sit) { + for (nodeStorageOptions::const_iterator nsit = sit->second.begin(); nsit != sit->second.end(); ++nsit) { + locations.push_back(storageVector::value_type(sit->first, nsit->raidID)); + maxFilesToNodes = std::min(maxFilesToNodes, nsit->nrUnits); + if ((locations.size() * maxFilesToNodes >= nrFiles) && (locations.size() >= minNrOfNodes)) { + sufficient_locations = true; + break; // don't assign more storage nodes than the number of files written + } + } + if (sufficient_locations) break; + } + } + } + else if ((mode == STORAGE_MODE_MINIMUM_DATA_TYPE_PREFERRED) || (mode == STORAGE_MODE_MINIMUM_PROJECT_PREFERRED)) { + bool inserted(false); + vector<std::pair<int, storageOption> > smallest_vec; // first = node ID + for (storageLocationOptions::const_iterator sit = common_pref_locations.begin(); sit != common_pref_locations.end(); ++sit) { + for (nodeStorageOptions::const_iterator nsit = sit->second.begin(); nsit != sit->second.end(); ++nsit) { + maxFilesToNodes = std::min(maxFilesToNodes, nsit->nrUnits); // determine the maximum number of files that can be written to a single suitable node + for (vector<std::pair<int, storageOption> >::iterator ssit = smallest_vec.begin(); ssit != smallest_vec.end(); ++ssit) { + if (nsit->remainingSpacekB < ssit->second.remainingSpacekB) { // sort according to free space in smallest_vec + smallest_vec.insert(ssit, std::pair<int, storageOption>(sit->first, *nsit)); // insert the smallest free space raid arrays in smallest_vec + inserted = true; + break; + } + } + if (!inserted) { + smallest_vec.push_back(std::pair<int, storageOption>(sit->first, *nsit)); // put at the end (it's has the largest free space up to now) + break; // only one raid array per node here + } + } + if (smallest_vec.size() * nrFilesPerNode >= nrFiles) { + sufficient_locations = true; + break; // don't assign more storage nodes than the number of files written + } + } - if (!sufficient_locations && (locations.size() < minNrOfNodes)) { // do we need extra locations (non preferred nodes)? If so, use as few as possible of these - for (storageLocationOptions::const_iterator sit = common_extra_locations.begin(); sit != common_extra_locations.end(); ++sit) { - for (nodeStorageOptions::const_iterator nsit = sit->second.begin(); nsit != sit->second.end(); ++nsit) { - maxFilesToNodes = std::min(maxFilesToNodes, nsit->nrUnits); - for (vector<std::pair<int, storageOption> >::iterator ssit = smallest_vec.begin(); ssit != smallest_vec.end(); ++ssit) { - if (nsit->remainingSpacekB < ssit->second.remainingSpacekB) { // sort according to free space in smallest_vec - smallest_vec.insert(ssit, std::pair<int, storageOption>(sit->first, *nsit)); // insert the smallest free space raid arrays in smallest_vec - inserted = true; - break; - } - } - if (!inserted) { - smallest_vec.push_back(std::pair<int, storageOption>(sit->first, *nsit)); // put at the end (it has the largest free space up to now) - break; // only one raid array per node here - } - } - if ((smallest_vec.size() * maxFilesToNodes >= nrFiles) & (smallest_vec.size() >= minNrOfNodes)) { - break; // don't assign more storage nodes than the number of files written - } - } - } - for (unsigned i = 0; i < minNrOfNodes; ++i) { - locations.push_back(pair<int,int>(smallest_vec.at(i).first, smallest_vec.at(i).second.raidID)); - } - } + if (!sufficient_locations && (locations.size() < minNrOfNodes)) { // do we need extra locations (non preferred nodes)? If so, use as few as possible of these + for (storageLocationOptions::const_iterator sit = common_extra_locations.begin(); sit != common_extra_locations.end(); ++sit) { + for (nodeStorageOptions::const_iterator nsit = sit->second.begin(); nsit != sit->second.end(); ++nsit) { + maxFilesToNodes = std::min(maxFilesToNodes, nsit->nrUnits); + for (vector<std::pair<int, storageOption> >::iterator ssit = smallest_vec.begin(); ssit != smallest_vec.end(); ++ssit) { + if (nsit->remainingSpacekB < ssit->second.remainingSpacekB) { // sort according to free space in smallest_vec + smallest_vec.insert(ssit, std::pair<int, storageOption>(sit->first, *nsit)); // insert the smallest free space raid arrays in smallest_vec + inserted = true; + break; + } + } + if (!inserted) { + smallest_vec.push_back(std::pair<int, storageOption>(sit->first, *nsit)); // put at the end (it has the largest free space up to now) + break; // only one raid array per node here + } + } + if ((smallest_vec.size() * maxFilesToNodes >= nrFiles) & (smallest_vec.size() >= minNrOfNodes)) { + break; // don't assign more storage nodes than the number of files written + } + } + } + for (unsigned i = 0; i < minNrOfNodes; ++i) { + locations.push_back(pair<int,int>(smallest_vec.at(i).first, smallest_vec.at(i).second.raidID)); + } + } - // finally assign the common storage locations for this data product to all tasks in the group and check if the result is ok (i.e. no conflicts) - for (std::vector<Task *>::const_iterator taskit = groupIt->second.begin(); taskit != groupIt->second.end(); ++taskit) { // 7 - if ((*taskit)->storage()->isOutputDataProduktEnabled(dpit->first)) { - std::vector<storageResult> result = data.addStorageToTask(*taskit, dpit->first, locations, false); - if (!result.empty()) { - for (std::vector<storageResult>::const_iterator sit = result.begin(); sit != result.end(); ++sit) { - if (sit->conflict != CONFLICT_NO_CONFLICT) { - itsConflictDialog->addStorageConflict(*taskit, sit->dataProductType, sit->conflict); - } - (*taskit)->setConflict(sit->conflict); - } - bResult = false; - } - } - } // END 7 - } // 5 - for (std::vector<Task *>::const_iterator taskit = groupIt->second.begin(); taskit != groupIt->second.end(); ++taskit) { - if ((*taskit)->isPipeline()) { - Pipeline *pipe(static_cast<Pipeline *>(*taskit)); - setInputFilesForPipeline(pipe); - // we have to re-assign the storage for the pipeline because the predecessor (observation or pipeline) might have changed in the previous loop - for (dataProductTypes dp = _BEGIN_DATA_PRODUCTS_ENUM_; dp < _END_DATA_PRODUCTS_ENUM_; dp = dataProductTypes(dp + 1)) { - if (dp != DP_SKY_IMAGE && pipe->storage()->isOutputDataProduktEnabled(dp)) { // for SKY_IMAGE input nodes are not equal to output nodes - const storageMap &inputStorageLocations(pipe->storage()->getInputStorageLocations()); - storageMap::const_iterator inpcorit = inputStorageLocations.find(DP_CORRELATED_UV); - if (inpcorit != inputStorageLocations.end()) { - data.addStorageToTask(*taskit, dp, inpcorit->second, false); - } - } - } - } - (*taskit)->storage()->generateFileList(); - } + // finally assign the common storage locations for this data product to all tasks in the group and check if the result is ok (i.e. no conflicts) + for (std::vector<Task *>::const_iterator taskit = groupIt->second.begin(); taskit != groupIt->second.end(); ++taskit) { // 7 + if ((*taskit)->storage()->isOutputDataProduktEnabled(dpit->first)) { + std::vector<storageResult> result = data.addStorageToTask(*taskit, dpit->first, locations, false); + if (!result.empty()) { + for (std::vector<storageResult>::const_iterator sit = result.begin(); sit != result.end(); ++sit) { + if (sit->conflict != CONFLICT_NO_CONFLICT) { + itsConflictDialog->addStorageConflict(*taskit, sit->dataProductType, sit->conflict); + } + (*taskit)->setConflict(sit->conflict); + } + bResult = false; + } + } + } // END 7 + } // 5 + for (std::vector<Task *>::const_iterator taskit = groupIt->second.begin(); taskit != groupIt->second.end(); ++taskit) { + if ((*taskit)->isPipeline()) { + Pipeline *pipe(static_cast<Pipeline *>(*taskit)); + setInputFilesForPipeline(pipe); + // we have to re-assign the storage for the pipeline because the predecessor (observation or pipeline) might have changed in the previous loop + for (dataProductTypes dp = _BEGIN_DATA_PRODUCTS_ENUM_; dp < _END_DATA_PRODUCTS_ENUM_; dp = dataProductTypes(dp + 1)) { + if (dp != DP_SKY_IMAGE && pipe->storage()->isOutputDataProduktEnabled(dp)) { // for SKY_IMAGE input nodes are not equal to output nodes + const storageMap &inputStorageLocations(pipe->storage()->getInputStorageLocations()); + storageMap::const_iterator inpcorit = inputStorageLocations.find(DP_CORRELATED_UV); + if (inpcorit != inputStorageLocations.end()) { + data.addStorageToTask(*taskit, dp, inpcorit->second, false); + } + } + } + } + (*taskit)->storage()->generateFileList(); + } - } - } - } // END for loop over individual groups - } - else return false; // no storage nodes available - } + } + } + } // END for loop over individual groups + } + else return false; // no storage nodes available + } - return bResult; + return bResult; } diff --git a/SAS/Scheduler/src/DataHandler.cpp b/SAS/Scheduler/src/DataHandler.cpp index af731159153629499309867baea08a92b3219d7f..bbd0d5908b9f9141ce1e18e3d86fe354bb9f1df0 100644 --- a/SAS/Scheduler/src/DataHandler.cpp +++ b/SAS/Scheduler/src/DataHandler.cpp @@ -519,9 +519,11 @@ bool DataHandler::saveProgramPreferences(void) { return false; } -bool DataHandler::saveSettings(const QString &filename) const { - QFile file(filename); - if (file.open(QIODevice::WriteOnly)) { +bool DataHandler::saveSettings(const QString &filename) const +{ + QFile file(QDir::currentPath() + filename); + if (file.open(QIODevice::WriteOnly)) + { QDataStream out(&file); out << (unsigned)FILE_WRITE_VERSION; out << Controller::theSchedulerSettings; diff --git a/SAS/Scheduler/src/GraphicResourceScene.cpp b/SAS/Scheduler/src/GraphicResourceScene.cpp index 9f3ebad37dd35f9b9cfe531aa744705d17d7b3fa..bdbb1c34557f0c16bddfc7d005073e4e553dc35c 100644 --- a/SAS/Scheduler/src/GraphicResourceScene.cpp +++ b/SAS/Scheduler/src/GraphicResourceScene.cpp @@ -225,13 +225,13 @@ void GraphicResourceScene::updateStationTimeLines() { GraphicStationTaskLine *stationTimeLine = new GraphicStationTaskLine(this, it->second, StationLineYPos); addItem(stationTimeLine); // create station label - QGraphicsSimpleTextItem *stationName = new QGraphicsSimpleTextItem(it->first.c_str(), 0, this); + QGraphicsSimpleTextItem *stationName = new QGraphicsSimpleTextItem(it->first.c_str(), 0); stationName->setPos(labelXpos, StationLineYPos-2); stationName->setFont(QFont("Liberation Sans", 9, QFont::Bold)); stationName->setZValue(10); const QPointF &sp(stationName->pos()); QRectF r(sp.x()-2, sp.y()-2, 9*(it->first.length()-1)+4, 13); - QGraphicsRectItem * rect = new QGraphicsRectItem(r, 0, this); + QGraphicsRectItem * rect = new QGraphicsRectItem(r, 0); rect->setZValue(9); rect->setPen(QPen(Qt::NoPen)); rect->setBrush(QColor(255,255,255,160)); diff --git a/SAS/Scheduler/src/GraphicStationTaskLine.h b/SAS/Scheduler/src/GraphicStationTaskLine.h index 1f21ffb5799fa3702589ddad11e56b8f097c4b60..9199381f0488b7b01001280ef114fa32aabcf130 100644 --- a/SAS/Scheduler/src/GraphicStationTaskLine.h +++ b/SAS/Scheduler/src/GraphicStationTaskLine.h @@ -33,7 +33,7 @@ public: private: GraphicResourceScene *itsScene; - unsigned int itsStationID, itsCurrentHighlightTask; + unsigned int itsStationID; //, itsCurrentHighlightTask; int itsWidth, itsHeight; }; diff --git a/SAS/Scheduler/src/GraphicTask.h b/SAS/Scheduler/src/GraphicTask.h index f5151eccf91ccdb0a1d28200025d87955f3503fc..42362e99659ed2fd6a2b914e491ae548095a1934 100644 --- a/SAS/Scheduler/src/GraphicTask.h +++ b/SAS/Scheduler/src/GraphicTask.h @@ -29,7 +29,7 @@ class QDragMoveEvent; class Task; class GraphicStationTaskLine; -class GraphicTask : public QObject, public QGraphicsItem { +class GraphicTask : /*public QObject,*/ public QGraphicsObject { Q_OBJECT diff --git a/SAS/Scheduler/src/LOFAR_libScheduler.pro b/SAS/Scheduler/src/LOFAR_libScheduler.pro index 2d691fa8ce6a599e78c1e88fd50dc3e203a115ea..f2852070cb875615efc44b2d60879f8524524e03 100644 --- a/SAS/Scheduler/src/LOFAR_libScheduler.pro +++ b/SAS/Scheduler/src/LOFAR_libScheduler.pro @@ -1,225 +1,224 @@ -# ##################################################################### -# Automatically generated by qmake (2.01a) Tue Mar 15 12:58:58 2011 -# ##################################################################### -TEMPLATE = lib -#TEMPLATE = app -TARGET = libScheduler -QT += core \ - gui \ - sql -CONFIG += debug_and_release -CONFIG += staticlib # dynamic link: Problem with linking into app. -# This needs to be fixed with help of Marcel / JD - -CONFIG(debug, debug|release) { - message(Building Makefile.Debug) - DEFINES += _DEBUG_ - DESTDIR = debug - OBJECTS_DIR = debug - MOC_DIR = debug - UI_DIR = debug - RCC_DIR = debug - INCLUDEPATH += . \ - debug - DEPENDPATH += . \ - debug -} -else { - message(Building Makefile.Release) - DEFINES += _RELEASE_ - DESTDIR = release - OBJECTS_DIR = release - MOC_DIR = release - UI_DIR = release - RCC_DIR = release - INCLUDEPATH += . \ - release - DEPENDPATH += . \ - release -} - -# Input -HEADERS += blocksize.h \ - ListWidget.h \ - redistributetasksdialog.h \ - sasconnectdialog.h \ - DataTreeWidgetItem.h \ - shifttasksdialog.h \ - tiedarraybeamdialog.h \ - DigitalBeam.h \ - TiedArrayBeam.h \ - SpinBox.h \ - parsettreeviewer.h \ - FileUtils.h \ - Angle.h \ - astrodate.h \ - astrodatetime.h \ - astrotime.h \ - ComboBox.h \ - conflictdialog.h \ - Controller.h \ - DataHandler.h \ - DataMonitorConnection.h \ - dataslotdialog.h \ - DateEdit.h \ - DateTimeEdit.h \ - digitalbeamdialog.h \ - GraphicCurrentTimeLine.h \ - GraphicResourceScene.h \ - GraphicStationTaskLine.h \ - graphicstoragescene.h \ - GraphicStorageTimeLine.h \ - GraphicTask.h \ - GraphicTimeLine.h \ - LineEdit.h \ - longbaselinepipeline.h \ - lofar_scheduler.h \ - lofar_utils.h \ - neighboursolution.h \ - OTDBnode.h \ - OTDBtree.h \ - publishdialog.h \ - qlofardatamodel.h \ - SASConnection.h \ - sasprogressdialog.h \ - sasstatusdialog.h \ - sasuploaddialog.h \ - Scheduler.h \ - schedulerdata.h \ - schedulerdatablock.h \ - schedulergui.h \ - schedulersettings.h \ - schedulesettingsdialog.h \ - scheduletabledelegate.h \ - statehistorydialog.h \ - station.h \ - stationlistwidget.h \ - stationtreewidget.h \ - Storage.h \ - StorageNode.h \ - tablecolumnselectdialog.h \ - tableview.h \ - task.h \ - taskcopydialog.h \ - taskdialog.h \ - thrashbin.h \ - TimeEdit.h \ - doublespinbox.h \ - pipeline.h \ - pulsarpipeline.h \ - imagingpipeline.h \ - calibrationpipeline.h \ - observation.h \ - taskstorage.h \ - stationtask.h \ - storage_definitions.h \ - demixingsettings.h \ - CheckBox.h \ - schedulerLib.h \ - signalhandler.h -FORMS += \ - redistributetasksdialog.ui \ - sasconnectdialog.ui \ - shifttasksdialog.ui \ - tiedarraybeamdialog.ui \ - parsettreeviewer.ui \ - conflictdialog.ui \ - dataslotdialog.ui \ - digitalbeamdialog.ui \ - graphicstoragescene.ui \ - publishdialog.ui \ - sasprogressdialog.ui \ - sasstatusdialog.ui \ - sasuploaddialog.ui \ - schedulergui.ui \ - schedulesettingsdialog.ui \ - statehistorydialog.ui \ - stationlistwidget.ui \ - stationtreewidget.ui \ - tablecolumnselectdialog.ui \ - taskcopydialog.ui \ - taskdialog.ui \ - thrashbin.ui \ - storageresourceview.ui -SOURCES += \ - ListWidget.cpp \ - redistributetasksdialog.cpp \ - sasconnectdialog.cpp \ - DataTreeWidgetItem.cpp \ - shifttasksdialog.cpp \ - tiedarraybeamdialog.cpp \ - DigitalBeam.cpp \ - TiedArrayBeam.cpp \ - SpinBox.cpp \ - parsettreeviewer.cpp \ - FileUtils.cpp \ - Angle.cpp \ - astrodate.cpp \ - astrodatetime.cpp \ - astrotime.cpp \ - ComboBox.cpp \ - conflictdialog.cpp \ - Controller.cpp \ - DataHandler.cpp \ - DataMonitorConnection.cpp \ - dataslotdialog.cpp \ - DateEdit.cpp \ - DateTimeEdit.cpp \ - debug_lofar.cpp \ - digitalbeamdialog.cpp \ - GraphicCurrentTimeLine.cpp \ - GraphicResourceScene.cpp \ - GraphicStationTaskLine.cpp \ - graphicstoragescene.cpp \ - GraphicStorageTimeLine.cpp \ - GraphicTask.cpp \ - GraphicTimeLine.cpp \ - LineEdit.cpp \ - longbaselinepipeline.cpp \ - lofar_utils.cpp \ - main.cpp \ - neighboursolution.cpp \ - OTDBnode.cpp \ - OTDBtree.cpp \ - publishdialog.cpp \ - qlofardatamodel.cpp \ - SASConnection.cpp \ - sasprogressdialog.cpp \ - sasstatusdialog.cpp \ - sasuploaddialog.cpp \ - Scheduler.cpp \ - schedulerdata.cpp \ - schedulerdatablock.cpp \ - schedulergui.cpp \ - schedulersettings.cpp \ - schedulesettingsdialog.cpp \ - scheduletabledelegate.cpp \ - statehistorydialog.cpp \ - station.cpp \ - stationlistwidget.cpp \ - stationtreewidget.cpp \ - Storage.cpp \ - StorageNode.cpp \ - tablecolumnselectdialog.cpp \ - tableview.cpp \ - task.cpp \ - taskcopydialog.cpp \ - taskdialog.cpp \ - thrashbin.cpp \ - TimeEdit.cpp \ - doublespinbox.cpp \ - pipeline.cpp \ - pulsarpipeline.cpp \ - imagingpipeline.cpp \ - calibrationpipeline.cpp \ - observation.cpp \ - taskstorage.cpp \ - stationtask.cpp \ - demixingsettings.cpp \ - blocksize.cpp \ - CheckBox.cpp \ - schedulerLib.cpp \ - signalhandler.cpp -RESOURCES += scheduler_resources.qrc - - +# ##################################################################### +# Automatically generated by qmake (2.01a) Tue Mar 15 12:58:58 2011 +# ##################################################################### +TEMPLATE = lib +TEMPLATE = app +TARGET = libScheduler +QT += core \ + gui \ + sql +CONFIG += debug_and_release +CONFIG += staticlib # dynamic link: Problem with linking into app. +# This needs to be fixed with help of Marcel / JD + +CONFIG(debug, debug|release) { + message(Building Makefile.Debug) + DEFINES += _DEBUG_ + DESTDIR = debug + OBJECTS_DIR = debug + MOC_DIR = debug + UI_DIR = debug + RCC_DIR = debug + INCLUDEPATH += . \ + debug + DEPENDPATH += . \ + debug +} +else { + message(Building Makefile.Release) + DEFINES += _RELEASE_ + DESTDIR = release + OBJECTS_DIR = release + MOC_DIR = release + UI_DIR = release + RCC_DIR = release + INCLUDEPATH += . \ + release + DEPENDPATH += . \ + release +} + +# Input +HEADERS += blocksize.h \ + ListWidget.h \ + redistributetasksdialog.h \ + sasconnectdialog.h \ + DataTreeWidgetItem.h \ + shifttasksdialog.h \ + tiedarraybeamdialog.h \ + DigitalBeam.h \ + TiedArrayBeam.h \ + SpinBox.h \ + parsettreeviewer.h \ + FileUtils.h \ + Angle.h \ + astrodate.h \ + astrodatetime.h \ + astrotime.h \ + ComboBox.h \ + conflictdialog.h \ + Controller.h \ + DataHandler.h \ + DataMonitorConnection.h \ + dataslotdialog.h \ + DateEdit.h \ + DateTimeEdit.h \ + digitalbeamdialog.h \ + GraphicCurrentTimeLine.h \ + GraphicResourceScene.h \ + GraphicStationTaskLine.h \ + graphicstoragescene.h \ + GraphicStorageTimeLine.h \ + GraphicTask.h \ + GraphicTimeLine.h \ + LineEdit.h \ + longbaselinepipeline.h \ + lofar_scheduler.h \ + lofar_utils.h \ + neighboursolution.h \ + OTDBnode.h \ + OTDBtree.h \ + publishdialog.h \ + qlofardatamodel.h \ + SASConnection.h \ + sasprogressdialog.h \ + sasstatusdialog.h \ + sasuploaddialog.h \ + Scheduler.h \ + schedulerdata.h \ + schedulerdatablock.h \ + schedulergui.h \ + schedulersettings.h \ + schedulesettingsdialog.h \ + scheduletabledelegate.h \ + statehistorydialog.h \ + station.h \ + stationlistwidget.h \ + stationtreewidget.h \ + Storage.h \ + StorageNode.h \ + tablecolumnselectdialog.h \ + tableview.h \ + task.h \ + taskcopydialog.h \ + taskdialog.h \ + thrashbin.h \ + TimeEdit.h \ + doublespinbox.h \ + pipeline.h \ + pulsarpipeline.h \ + imagingpipeline.h \ + calibrationpipeline.h \ + observation.h \ + taskstorage.h \ + stationtask.h \ + storage_definitions.h \ + demixingsettings.h \ + CheckBox.h \ + schedulerLib.h \ + signalhandler.h +FORMS += \ + redistributetasksdialog.ui \ + sasconnectdialog.ui \ + shifttasksdialog.ui \ + tiedarraybeamdialog.ui \ + parsettreeviewer.ui \ + conflictdialog.ui \ + dataslotdialog.ui \ + digitalbeamdialog.ui \ + graphicstoragescene.ui \ + publishdialog.ui \ + sasprogressdialog.ui \ + sasstatusdialog.ui \ + sasuploaddialog.ui \ + schedulergui.ui \ + schedulesettingsdialog.ui \ + statehistorydialog.ui \ + stationlistwidget.ui \ + stationtreewidget.ui \ + tablecolumnselectdialog.ui \ + taskcopydialog.ui \ + taskdialog.ui \ + thrashbin.ui +SOURCES += \ + ListWidget.cpp \ + redistributetasksdialog.cpp \ + sasconnectdialog.cpp \ + DataTreeWidgetItem.cpp \ + shifttasksdialog.cpp \ + tiedarraybeamdialog.cpp \ + DigitalBeam.cpp \ + TiedArrayBeam.cpp \ + SpinBox.cpp \ + parsettreeviewer.cpp \ + FileUtils.cpp \ + Angle.cpp \ + astrodate.cpp \ + astrodatetime.cpp \ + astrotime.cpp \ + ComboBox.cpp \ + conflictdialog.cpp \ + Controller.cpp \ + DataHandler.cpp \ + DataMonitorConnection.cpp \ + dataslotdialog.cpp \ + DateEdit.cpp \ + DateTimeEdit.cpp \ + debug_lofar.cpp \ + digitalbeamdialog.cpp \ + GraphicCurrentTimeLine.cpp \ + GraphicResourceScene.cpp \ + GraphicStationTaskLine.cpp \ + graphicstoragescene.cpp \ + GraphicStorageTimeLine.cpp \ + GraphicTask.cpp \ + GraphicTimeLine.cpp \ + LineEdit.cpp \ + longbaselinepipeline.cpp \ + lofar_utils.cpp \ + main.cpp \ + neighboursolution.cpp \ + OTDBnode.cpp \ + OTDBtree.cpp \ + publishdialog.cpp \ + qlofardatamodel.cpp \ + SASConnection.cpp \ + sasprogressdialog.cpp \ + sasstatusdialog.cpp \ + sasuploaddialog.cpp \ + Scheduler.cpp \ + schedulerdata.cpp \ + schedulerdatablock.cpp \ + schedulergui.cpp \ + schedulersettings.cpp \ + schedulesettingsdialog.cpp \ + scheduletabledelegate.cpp \ + statehistorydialog.cpp \ + station.cpp \ + stationlistwidget.cpp \ + stationtreewidget.cpp \ + Storage.cpp \ + StorageNode.cpp \ + tablecolumnselectdialog.cpp \ + tableview.cpp \ + task.cpp \ + taskcopydialog.cpp \ + taskdialog.cpp \ + thrashbin.cpp \ + TimeEdit.cpp \ + doublespinbox.cpp \ + pipeline.cpp \ + pulsarpipeline.cpp \ + imagingpipeline.cpp \ + calibrationpipeline.cpp \ + observation.cpp \ + taskstorage.cpp \ + stationtask.cpp \ + demixingsettings.cpp \ + blocksize.cpp \ + CheckBox.cpp \ + schedulerLib.cpp \ + signalhandler.cpp +RESOURCES += scheduler_resources.qrc + + diff --git a/SAS/Scheduler/src/SASConnection.cpp b/SAS/Scheduler/src/SASConnection.cpp index 8ad9b60b0f558bc9a37b8d5983bbe2d724078982..a1a2a39dbd71659073322f2913287b778ab870c4 100644 --- a/SAS/Scheduler/src/SASConnection.cpp +++ b/SAS/Scheduler/src/SASConnection.cpp @@ -1898,7 +1898,7 @@ bool SASConnection::getSchedulerInfo(int tree_id, Task &task) { if (query.next()) { int day = query.value(0).toInt(); if (day) task.setWindowFirstDay(day); - else task.setWindowFirstDay(std::max(QDate::currentDate().toJulianDay() - J2000_EPOCH, (int)Controller::theSchedulerSettings.getEarliestSchedulingDay().toJulian())); + else task.setWindowFirstDay(std::max(QDate::currentDate().toJulianDay() - J2000_EPOCH, (qint64)Controller::theSchedulerSettings.getEarliestSchedulingDay().toJulian())); } else { // serious error itsProgressDialog.addError(QString("Error: Scheduler.firstPossibleDay node of SAS tree: ") + treeID + " could not be fetched"); @@ -2559,10 +2559,12 @@ bool SASConnection::saveStationSettings(int treeID, const StationTask &task, con // TBB piggyback allowed? const Observation *obs = dynamic_cast<const Observation *>(&task); if (obs) { + if (diff->TBBPiggybackAllowed) bResult &= setNodeValue(treeID, "LOFAR.ObsSW.Observation.ObservationControl.StationControl.tbbPiggybackAllowed", (obs->getTBBPiggybackAllowed() ? "true" : "false")); - bResult &= setNodeValue(treeID, "LOFAR.ObsSW.Observation.ObservationControl.StationControl.aartfaacPiggybackAllowed", - (obs->getAartfaacPiggybackAllowed() ? "true" : "false")); + if (diff->AartfaacPiggybackAllowed) + bResult &= setNodeValue(treeID, "LOFAR.ObsSW.Observation.ObservationControl.StationControl.aartfaacPiggybackAllowed", + (obs->getAartfaacPiggybackAllowed() ? "true" : "false")); } } @@ -2664,6 +2666,9 @@ bool SASConnection::saveInputStorageSettings(int treeID, const Task &task) { bool SASConnection::saveOutputStorageSettings(int treeID, const Task &task, const task_diff *diff) { bool bResult(true); + if (task.getOutputDataproductCluster() == "CEP4") { //For CEP4 we're skipping this. /AR + return bResult; + } const TaskStorage *task_storage(task.storage()); if (task_storage) { QString trueStr("true"), falseStr("false"); @@ -2705,7 +2710,7 @@ bool SASConnection::saveOutputDataProducts(int treeID, const Task &task) { Task::task_type type(task.getType()); std::map<dataProductTypes, TaskStorage::outputDataProduct>::const_iterator flit; for (dataProductTypes dp = _BEGIN_DATA_PRODUCTS_ENUM_; dp < _END_DATA_PRODUCTS_ENUM_-1; dp = dataProductTypes(dp + 1)) { - flit = outputDataProdukt.find(dp); + flit = outputDataProdukt.find(dp); //flit = file list iterator if (flit != outputDataProdukt.end()) { if (task_storage->isOutputDataProduktAssigned(dp)) { // compile the vector strings for SAS @@ -2997,6 +3002,7 @@ void SASConnection::getOutputStorageSettings(int treeID, Task &task) { if (task_storage) { QStringList nodeList, raidList; QString storageLocationsKey, keyPrefix; + QString outputCluster; // Added to support CEP2/4 switch /AR QVariant enabledKey; bool enabledValue; task_storage->unAssignStorage(); // clear the tasks storage, we will be adding incrementally (Task::setStorage() doesn't delete existing storage locations @@ -3123,6 +3129,29 @@ void SASConnection::getOutputStorageSettings(int treeID, Task &task) { QStringList identificationsList = value.toString().remove('[').remove(']').split(',',QString::SkipEmptyParts);// string2VectorOfStrings(value.toString()); task_storage->addOutputDataProductID(*dpit, identificationsList); } + + // get values for storage cluster /AR + value = getNodeValue(treeID, keyPrefix + "storageClusterName"); + if (value.isValid()) { + QString cluster = value.toString(); + if (!cluster.isEmpty()) { + if (outputCluster.isEmpty()) { + outputCluster = cluster; + } + else { + if (cluster != outputCluster) { + itsProgressDialog.addError(QString("tree:") + QString::number(treeID) + " output data product type:" + DATA_PRODUCTS[*dpit] + " different output clusters are not supported"); + } + } + } + //We probably will not need to support this: task_storage->addOutputDataProductCluster(*dpit, ?); /AR + } + } + if (!outputCluster.isEmpty()) { + task.setOutputDataproductCluster(outputCluster); + } + else { + task.setOutputDataproductCluster("CEP2"); // CEP2 is default for backward compatibility /AR } } } @@ -4444,7 +4473,7 @@ bool SASConnection::saveTaskToSAS(int treeID, Task &task, const task_diff *diff) Task::task_status status = task.getStatus(); bResult &= saveSchedulerProperties(treeID, task, diff); - if (task.isStationTask()) { + if (task.isStationTask()) { //OBSERVATION, RESERVATION or MAINTENANCE bResult &= saveStationSettings(treeID, static_cast<StationTask &>(task), diff); if (task.isObservation()) { @@ -4461,7 +4490,7 @@ bool SASConnection::saveTaskToSAS(int treeID, Task &task, const task_diff *diff) } // Cobalt Correlator BlockSize - if (status == Task::SCHEDULED) { // in SCHEDULED state always update BlockSize + if (status == Task::PRESCHEDULED || status == Task::SCHEDULED) { // in SCHEDULED state always update BlockSize //FIXME? Added PRESCHEDULED for CEP4 /AR bResult &= saveCobaltBlockSize(treeID, obs); } else if (diff) { @@ -4489,7 +4518,7 @@ bool SASConnection::saveTaskToSAS(int treeID, Task &task, const task_diff *diff) } } - if (diff) { + if (diff) { //FIXME if diff than we do this, otherwise we do it any way? This seems redundant. /AR // all the following differences can potentially change the number of output files being written, // therefore, we update the storage keys in SAS when anyone of them has changed if (diff->output_data_types || diff->output_storage_settings || diff->output_data_products || diff --git a/SAS/Scheduler/src/Storage.cpp b/SAS/Scheduler/src/Storage.cpp index febe515321b31e0d7bfd9181bc5a0836ad1bfe3a..b4e3c887a85fb8d8a2d6715861c7f4c00f2cca37 100644 --- a/SAS/Scheduler/src/Storage.cpp +++ b/SAS/Scheduler/src/Storage.cpp @@ -123,61 +123,66 @@ std::vector<storageResult> Storage::addStorageToTask(Task *pTask, const storageM } } itsLastStorageCheckResult.clear(); - // check if the total bandwidths for the nodes used do not exceed the nodes their available bandwidths - for (std::map<int, double>::const_iterator nit = totalBWPerNodeMap.begin(); nit != totalBWPerNodeMap.end(); ++nit) { - storageNodesMap::const_iterator nodeit = itsStorageNodes.find(nit->first); - if (nodeit != itsStorageNodes.end()) { - // std::cout << "Total bandwidth required for node:" << nodeit->second.name() << " = " << nit->second << " kb/s" << std::endl; - res = nodeit->second.checkBandWidth(start, end, nit->second); - if (res != CONFLICT_NO_CONFLICT) { - itsLastStorageCheckResult.push_back(storageResult(_END_DATA_PRODUCTS_ENUM_, nit->first, -1, res)); + if (pTask->getOutputDataproductCluster() == "CEP4") { //Can we just skip this for CEP4 ? /AR + debugWarn("sis","Storage::addStorageToTask: Did not check storage for task:", pTask->getID(), " (CEP4 detected)"); + } + else { + // check if the total bandwidths for the nodes used do not exceed the nodes their available bandwidths + for (std::map<int, double>::const_iterator nit = totalBWPerNodeMap.begin(); nit != totalBWPerNodeMap.end(); ++nit) { + storageNodesMap::const_iterator nodeit = itsStorageNodes.find(nit->first); + if (nodeit != itsStorageNodes.end()) { + // std::cout << "Total bandwidth required for node:" << nodeit->second.name() << " = " << nit->second << " kb/s" << std::endl; + res = nodeit->second.checkBandWidth(start, end, nit->second); + if (res != CONFLICT_NO_CONFLICT) { + itsLastStorageCheckResult.push_back(storageResult(_END_DATA_PRODUCTS_ENUM_, nit->first, -1, res)); + } } } - } - if (itsLastStorageCheckResult.empty()) { // if no total bandwidth error for any node then start the rest of the checks - for (dataFileMap::const_iterator dfit = dataFiles.begin(); dfit != dataFiles.end(); ++dfit) { - storageMap::const_iterator stit = storageLocations.find(dfit->first); - if (stit != storageLocations.end()) { - if (!stit->second.empty()) { - claimSize = (double) dfit->second.first * dfit->second.second / stit->second.size(); // size per file * nrFiles / nr of raid arrays assigned - bandWidth = (double) claimSize / 1000 / durationSec; // MByte/sec, the required remaining disk write speed (or bandwidth) for this array + if (itsLastStorageCheckResult.empty()) { // if no total bandwidth error for any node then start the rest of the checks + for (dataFileMap::const_iterator dfit = dataFiles.begin(); dfit != dataFiles.end(); ++dfit) { + storageMap::const_iterator stit = storageLocations.find(dfit->first); + if (stit != storageLocations.end()) { + if (!stit->second.empty()) { + claimSize = (double) dfit->second.first * dfit->second.second / stit->second.size(); // size per file * nrFiles / nr of raid arrays assigned + bandWidth = (double) claimSize / 1000 / durationSec; // MByte/sec, the required remaining disk write speed (or bandwidth) for this array - // check requested resources - for (storageVector::const_iterator it = stit->second.begin(); it != stit->second.end(); ++it) { - sit = itsStorageNodes.find(it->first); - if (sit != itsStorageNodes.end()) { - // check size requirements - res = sit->second.checkSpaceAndWriteSpeed(start, end, claimSize, bandWidth, it->second); // check space and write speed for every raid array - if (res != CONFLICT_NO_CONFLICT) { - itsLastStorageCheckResult.push_back(storageResult(dfit->first, it->first, it->second, res)); - // itsLastStorageCheckResult[it->first].push_back(std::pair<int, task_conflict>(it->second, res)); // store the error result - } - else { // add the claim - sit->second.addClaim(pTask->getID(), start, end, dfit->first, claimSize, bandWidth, it->second); - } - } - } - // if there were conflicts then remove the claim again from the storage nodes - if (!itsLastStorageCheckResult.empty()) { - std::vector<int> snd; + // check requested resources for (storageVector::const_iterator it = stit->second.begin(); it != stit->second.end(); ++it) { sit = itsStorageNodes.find(it->first); if (sit != itsStorageNodes.end()) { - if (std::find(snd.begin(), snd.end(), stit->first) == snd.end()) { - sit->second.removeClaim(pTask->getID()); // only call removeClaim one time for every storage node (it removes all claims found for the task ID) - snd.push_back(stit->first); + // check size requirements + res = sit->second.checkSpaceAndWriteSpeed(start, end, claimSize, bandWidth, it->second); // check space and write speed for every raid array + if (res != CONFLICT_NO_CONFLICT) { + itsLastStorageCheckResult.push_back(storageResult(dfit->first, it->first, it->second, res)); + // itsLastStorageCheckResult[it->first].push_back(std::pair<int, task_conflict>(it->second, res)); // store the error result + } + else { // add the claim + sit->second.addClaim(pTask->getID(), start, end, dfit->first, claimSize, bandWidth, it->second); } } } + // if there were conflicts then remove the claim again from the storage nodes + if (!itsLastStorageCheckResult.empty()) { + std::vector<int> snd; + for (storageVector::const_iterator it = stit->second.begin(); it != stit->second.end(); ++it) { + sit = itsStorageNodes.find(it->first); + if (sit != itsStorageNodes.end()) { + if (std::find(snd.begin(), snd.end(), stit->first) == snd.end()) { + sit->second.removeClaim(pTask->getID()); // only call removeClaim one time for every storage node (it removes all claims found for the task ID) + snd.push_back(stit->first); + } + } + } + } + } + else { // no storage has been assigned to this data product type + itsLastStorageCheckResult.push_back(storageResult(dfit->first, -1, -1, CONFLICT_NO_STORAGE_ASSIGNED)); } } else { // no storage has been assigned to this data product type itsLastStorageCheckResult.push_back(storageResult(dfit->first, -1, -1, CONFLICT_NO_STORAGE_ASSIGNED)); } } - else { // no storage has been assigned to this data product type - itsLastStorageCheckResult.push_back(storageResult(dfit->first, -1, -1, CONFLICT_NO_STORAGE_ASSIGNED)); - } } } if (itsLastStorageCheckResult.empty()) { @@ -221,7 +226,7 @@ std::vector<storageResult> Storage::addStorageToTask(Task *pTask, dataProductTyp sit = itsStorageNodes.find(it->first); if (sit != itsStorageNodes.end()) { // check size requirements - if (!noCheck) { + if (!noCheck && pTask->getOutputDataproductCluster() != "CEP4") { res = sit->second.checkSpaceAndWriteSpeed(start, end, claimSize, bandWidth, it->second); // check space and bandwidth for every raid array } if (res == CONFLICT_NO_CONFLICT) { diff --git a/SAS/Scheduler/src/StorageNode.cpp b/SAS/Scheduler/src/StorageNode.cpp index d6db94dc196b3fae76a03d6f68b50d15b08bca6e..2eb6e29dbda65b46898759f24b718b5f5e7a3996 100644 --- a/SAS/Scheduler/src/StorageNode.cpp +++ b/SAS/Scheduler/src/StorageNode.cpp @@ -107,34 +107,34 @@ task_conflict StorageNode::checkBandWidth(const AstroDateTime &start, const Astr } task_conflict StorageNode::checkSpaceAndWriteSpeed(const AstroDateTime &startTime, const AstroDateTime &endTime, const double &claimSize, const double &writeSpeed, int raidID) const { - capacityTimeMap::const_iterator cit = itsRemainingSpace.find(raidID); + capacityTimeMap::const_iterator cit = itsRemainingSpace.find(raidID); // std::cout << "checking storage node: " << itsName << std::endl << "partition: " << raidID << std::endl << "claim size for this node: " // << claimSize << std::endl << "writeSpeed for this node: " << writeSpeed << std::endl << "start time: " << startTime.toString() << std::endl // << "end time: " << endTime.toString() << std::endl; - if (cit != itsRemainingSpace.end()) { + if (cit != itsRemainingSpace.end()) { // std::cout << "first free space log: " << cit->second.front().time.toString() << ", space remaining" << cit->second.front().remainingDiskSpacekB << "kB, disk write speed remaining" << cit->second.front().remainingDiskWriteBW << "MByte/s"; - if (startTime > cit->second.front().time) { // start time of observation needs to be after 'now' which is the first time in itsRemainingSpace - for (std::vector<capacityLogPoint>::const_iterator sit = cit->second.begin(); sit != cit->second.end(); ++sit) { + if (startTime > cit->second.front().time) { // start time of observation needs to be after 'now' which is the first time in itsRemainingSpace + for (std::vector<capacityLogPoint>::const_iterator sit = cit->second.begin(); sit != cit->second.end(); ++sit) { // std::cout << sit->time.toString() << ", free space:" << sit->remainingDiskSpacekB << "kB, write speed remaining:" << sit->remainingDiskWriteBW << "MB/s" << std::endl; - if (startTime >= sit->time) { // found the last time that is earlier than the requested start time - while (sit < cit->second.end()) { // iterate over the following free space log-points to check if space stays sufficient during the task's duration - if (claimSize > sit->remainingDiskSpacekB) { - return CONFLICT_STORAGE_NODE_SPACE; // insufficient space - } - else if (writeSpeed > sit->remainingDiskWriteBW) { + if (startTime >= sit->time) { // found the last time that is earlier than the requested start time + while (sit < cit->second.end()) { // iterate over the following free space log-points to check if space stays sufficient during the task's duration + if (claimSize > sit->remainingDiskSpacekB) { + return CONFLICT_STORAGE_NODE_SPACE; // insufficient space + } + else if (writeSpeed > sit->remainingDiskWriteBW) { // std::cerr << "conflict write speed: " << "requested: " << writeSpeed << ", " << "node remaining write speed at " << sit->time.toString().c_str() << ": " << sit->remainingDiskWriteBW << std::endl; - return CONFLICT_STORAGE_WRITE_SPEED; // requested write speed to high - } - else if ((sit++)->time > endTime) return CONFLICT_NO_CONFLICT; - } - return CONFLICT_NO_CONFLICT; // if only the initial entry is logged in itsRemainingSpace we should arrive here. - } - } - return CONFLICT_NO_CONFLICT; // if only the initial entry is logged in itsRemainingSpace we should arrive here. - } - else return CONFLICT_STORAGE_TIME_TOO_EARLY; // Error: start time of observation before now - } - else return CONFLICT_RAID_ARRRAY_NOT_FOUND; // Error: partition not found + return CONFLICT_STORAGE_WRITE_SPEED; // requested write speed to high + } + else if ((sit++)->time > endTime) return CONFLICT_NO_CONFLICT; + } + return CONFLICT_NO_CONFLICT; // if only the initial entry is logged in itsRemainingSpace we should arrive here. + } + } + return CONFLICT_NO_CONFLICT; // if only the initial entry is logged in itsRemainingSpace we should arrive here. + } + else return CONFLICT_STORAGE_TIME_TOO_EARLY; // Error: start time of observation before now + } + else return CONFLICT_RAID_ARRRAY_NOT_FOUND; // Error: partition not found } // return the ids of the raid arrays that meet the specified bandwidth (kbit/sec) and claimSize within the timespan defined by startTime and endTime diff --git a/SAS/Scheduler/src/StorageNode.h b/SAS/Scheduler/src/StorageNode.h index 979510bbc9f1860b6bd8ff05fc7408d41d1b22d4..06e052c8b60d8088d23bba425184ffbae2a3afc1 100644 --- a/SAS/Scheduler/src/StorageNode.h +++ b/SAS/Scheduler/src/StorageNode.h @@ -89,7 +89,7 @@ public: // check bandwidth requirements don't exceed the nodes bandwidth in the specified (start,end) period task_conflict checkBandWidth(const AstroDateTime &start, const AstroDateTime &end, const double &totalBW_kbs) const; // check if space is available to add the requested task to the claims of this storage node using the specified raid array (claimSize units: kByte, bandWidth units kbit/sec) - task_conflict checkSpaceAndWriteSpeed(const AstroDateTime &start, const AstroDateTime &end, const double &claimSize, const double &writeSpeed, int raidID) const; + task_conflict checkSpaceAndWriteSpeed(const AstroDateTime &start, const AstroDateTime &end, const double &claimSize, const double &writeSpeed, int raidID) const; // return the ids of the raid arrays that meet the specified bandwidth (kbit/sec) and fileSize (kByte) within the timespan defined by startTime and endTime nodeStorageOptions getPossibleRaidArrays(const AstroDateTime &startTime, const AstroDateTime &endTime, const double &fileSize, const double &bandWidth, unsigned minNrFiles, std::vector<std::pair<int, task_conflict> > &result) const; diff --git a/SAS/Scheduler/src/conflictdialog.cpp b/SAS/Scheduler/src/conflictdialog.cpp index 2cabb3d7226e066cd7eb9a00f61e77ee08b154be..78e12a7b5a626535dbb0a19168c2bb7a333e7a41 100644 --- a/SAS/Scheduler/src/conflictdialog.cpp +++ b/SAS/Scheduler/src/conflictdialog.cpp @@ -28,7 +28,11 @@ ConflictDialog::ConflictDialog(const Controller *controller) ui.treeWidgetConflicts->header()->resizeSection(2, 55); ui.treeWidgetConflicts->header()->resizeSection(3, 55); ui.treeWidgetConflicts->header()->resizeSection(4, 55); - ui.treeWidgetConflicts->header()->setResizeMode(QHeaderView::ResizeToContents); +#if QT_VERSION >= 0x050000 + ui.treeWidgetConflicts->header()->setSectionResizeMode(QHeaderView::ResizeToContents); +#else + ui.treeWidgetConflicts->header()->setResizeMode(QHeaderView::ResizeToContents); +#endif } ConflictDialog::~ConflictDialog() diff --git a/SAS/Scheduler/src/conflictdialog.h b/SAS/Scheduler/src/conflictdialog.h index d49c4b2641d74de2a14f2c25906d37d94f15415f..6ed701403c1ca89cd9da0166619670344b454b6f 100644 --- a/SAS/Scheduler/src/conflictdialog.h +++ b/SAS/Scheduler/src/conflictdialog.h @@ -14,7 +14,7 @@ #ifndef CONFLICTDIALOG_H #define CONFLICTDIALOG_H -#include <QtGui/QDialog> +#include <QDialog> #include "ui_conflictdialog.h" #include <map> #include "taskstorage.h" diff --git a/SAS/Scheduler/src/dataslotdialog.h b/SAS/Scheduler/src/dataslotdialog.h index 1ccc11256b63b0b714c4f0140ea045eabc20e20e..dac19546194fb46c110c9b6e5f285e0fe55114be 100644 --- a/SAS/Scheduler/src/dataslotdialog.h +++ b/SAS/Scheduler/src/dataslotdialog.h @@ -14,7 +14,7 @@ #ifndef DATASLOTDIALOG_H #define DATASLOTDIALOG_H -#include <QtGui/QDialog> +#include <QDialog> #include "ui_dataslotdialog.h" #include "task.h" #include "stationtask.h" diff --git a/SAS/Scheduler/src/digitalbeamdialog.h b/SAS/Scheduler/src/digitalbeamdialog.h index 0b58d0f80b012eec291da7dc364a11d25634258f..0a633b9b8598f60e955cd406bf0490080dd651fb 100644 --- a/SAS/Scheduler/src/digitalbeamdialog.h +++ b/SAS/Scheduler/src/digitalbeamdialog.h @@ -14,7 +14,7 @@ #ifndef DIGITALBEAMDIALOG_H #define DIGITALBEAMDIALOG_H -#include <QtGui/QDialog> +#include <QDialog> #include "ui_digitalbeamdialog.h" #include "task.h" #include "Angle.h" diff --git a/SAS/Scheduler/src/graphicstoragescene.h b/SAS/Scheduler/src/graphicstoragescene.h index 3ed6e436479cbb50c6cfc266b390b549bfc34856..9bbd3f9455e1cb71336d2c8ddc523db08aaf3415 100644 --- a/SAS/Scheduler/src/graphicstoragescene.h +++ b/SAS/Scheduler/src/graphicstoragescene.h @@ -14,7 +14,7 @@ #ifndef GRAPHICSTORAGESCENE_H #define GRAPHICSTORAGESCENE_H -#include <QtGui/QWidget> +#include <QWidget> #include "ui_graphicstoragescene.h" #include <QGraphicsScene> #include "GraphicTimeLine.h" diff --git a/SAS/Scheduler/src/lofar_scheduler.h b/SAS/Scheduler/src/lofar_scheduler.h index 43797b2808681ca4c9ee9f02e69462450edea572..b96fbc85aa5e82a674c9bc6b3a2242182f0c0d0d 100644 --- a/SAS/Scheduler/src/lofar_scheduler.h +++ b/SAS/Scheduler/src/lofar_scheduler.h @@ -32,7 +32,7 @@ #define FILE_WRITE_VERSION 10 -#define J2000_EPOCH 2451545 +#define J2000_EPOCH 2451545LL // pi #define PI 3.14159265358979323846264338327950288419716939937510 #define PI_DIV2 1.57079632679489661923132169163975144209858469968755 @@ -185,8 +185,9 @@ enum data_headers { TASK_DURATION, TASK_TYPE, TASK_STATUS, - UNSCHEDULED_REASON, - TASK_DESCRIPTION, + CLUSTER_NAME, + UNSCHEDULED_REASON, + TASK_DESCRIPTION, STATION_ID, RESERVATION_NAME, PRIORITY, diff --git a/SAS/Scheduler/src/parsettreeviewer.h b/SAS/Scheduler/src/parsettreeviewer.h index d3f942c01fd6af2456aaa26c25d5a1c712b32d78..3513c74294a28d17057dc23cd26205f9a8a01b97 100644 --- a/SAS/Scheduler/src/parsettreeviewer.h +++ b/SAS/Scheduler/src/parsettreeviewer.h @@ -15,7 +15,7 @@ #ifndef PARSETTREEVIEWER_H #define PARSETTREEVIEWER_H -#include <QtGui/QDialog> +#include <QDialog> #include "ui_parsettreeviewer.h" #include "OTDBtree.h" diff --git a/SAS/Scheduler/src/publishdialog.h b/SAS/Scheduler/src/publishdialog.h index 8b2058ea3069f6e513b2df1ed8ac30797d28c2b3..be94450b8f8895032b5e2708c20980b496ab32e7 100755 --- a/SAS/Scheduler/src/publishdialog.h +++ b/SAS/Scheduler/src/publishdialog.h @@ -14,7 +14,7 @@ #ifndef PUBLISHDIALOG_H #define PUBLISHDIALOG_H -#include <QtGui/QDialog> +#include <QDialog> #include <QFileInfo> #include "ui_publishdialog.h" #include "schedulersettings.h" diff --git a/SAS/Scheduler/src/qlofardatamodel.cpp b/SAS/Scheduler/src/qlofardatamodel.cpp index 7dddb91bf6a1c5efa60289b6233d8246e6cb4ce7..f37a23841928bf950ed7cac08e783e22ab27e289 100644 --- a/SAS/Scheduler/src/qlofardatamodel.cpp +++ b/SAS/Scheduler/src/qlofardatamodel.cpp @@ -47,7 +47,7 @@ QVariant QLofarDataModel::data(const QModelIndex & index, int role) const if (role == Qt::BackgroundRole) { if (isErrorIndex(index)) // error - return Qt::red; + return QColor(Qt::red); else { int task_status = index.model()->data(index.model()->index(index.row(),TASK_STATUS),USERDATA_ROLE).toInt(); if (task_status == Task::FINISHED) { @@ -115,18 +115,18 @@ QVariant QLofarDataModel::data(const QModelIndex & index, int role) const // } } else { // regular tasks - return Qt::white; + return QColor(Qt::white); } } } } else if (role == Qt::ForegroundRole ) { if (isErrorIndex(index)) // error - return Qt::white; + return QColor(Qt::white); else { int task_status = index.model()->data(index.model()->index(index.row(),TASK_STATUS),USERDATA_ROLE).toInt(); if ((task_status >= Task::COMPLETING) && (task_status <= Task::ABORTED)) { - return Qt::black; + return QColor(Qt::black); } else { int task_type = index.model()->data(index.model()->index(index.row(),TASK_TYPE),USERDATA_ROLE).toInt(); @@ -148,10 +148,10 @@ QVariant QLofarDataModel::data(const QModelIndex & index, int role) const case PLANNED_START: case PLANNED_END: case TASK_STATUS: - return Qt::black; // for editable cells + return QColor(Qt::black); // for editable cells break; default: - return Qt::darkGray; // for non-editable cells + return QColor(Qt::darkGray); // for non-editable cells break; } } @@ -170,15 +170,15 @@ QVariant QLofarDataModel::data(const QModelIndex & index, int role) const case PLANNED_START: case PLANNED_END: case TASK_STATUS: - return Qt::black; // for editable cells + return QColor(Qt::black); // for editable cells break; default: - return Qt::darkGray; // for non-editable cells + return QColor(Qt::darkGray); // for non-editable cells break; } } else { // regular tasks - return Qt::black; + return QColor(Qt::black); } } } diff --git a/SAS/Scheduler/src/redistributetasksdialog.h b/SAS/Scheduler/src/redistributetasksdialog.h index ed8d15e19a4b14e5610e2176a7619547cb657950..f2650a2b7acd631a7da08a52e6c25bfe8d4e4cb3 100644 --- a/SAS/Scheduler/src/redistributetasksdialog.h +++ b/SAS/Scheduler/src/redistributetasksdialog.h @@ -14,7 +14,7 @@ #ifndef REDISTRIBUTETASKSDIALOG_H #define REDISTRIBUTETASKSDIALOG_H -#include <QtGui/QDialog> +#include <QDialog> #include "ui_redistributetasksdialog.h" class redistributeTasksDialog : public QDialog diff --git a/SAS/Scheduler/src/sasconnectdialog.h b/SAS/Scheduler/src/sasconnectdialog.h index 14c2c0d94d5601d7c132ea497e6c3b699a910dc1..bd9037d2397739820f4c941d39fe77bc3ca7bc4a 100644 --- a/SAS/Scheduler/src/sasconnectdialog.h +++ b/SAS/Scheduler/src/sasconnectdialog.h @@ -14,7 +14,7 @@ #ifndef SASCONNECTDIALOG_H #define SASCONNECTDIALOG_H -#include <QtGui/QDialog> +#include <QDialog> #include "ui_sasconnectdialog.h" #include <QString> #include <QStringList> diff --git a/SAS/Scheduler/src/sasprogressdialog.h b/SAS/Scheduler/src/sasprogressdialog.h index 3543fcfbd417f6f1b557d4430e05861667382dfa..652b9841c92ffe0b01cac6a27ed0beeeee9ae685 100644 --- a/SAS/Scheduler/src/sasprogressdialog.h +++ b/SAS/Scheduler/src/sasprogressdialog.h @@ -1,7 +1,7 @@ #ifndef SASPROGRESSDIALOG_H #define SASPROGRESSDIALOG_H -#include <QtGui/QDialog> +#include <QDialog> #include "ui_sasprogressdialog.h" class SASProgressDialog : public QDialog diff --git a/SAS/Scheduler/src/sasstatusdialog.h b/SAS/Scheduler/src/sasstatusdialog.h index 51250c9cd5ec0c2f3d49e80fb412b17a756c4c8a..bda129521459209f5e957d08460268918bcf2054 100644 --- a/SAS/Scheduler/src/sasstatusdialog.h +++ b/SAS/Scheduler/src/sasstatusdialog.h @@ -1,7 +1,7 @@ #ifndef SASSTATUSDIALOG_H #define SASSTATUSDIALOG_H -#include <QtGui/QDialog> +#include <QDialog> #include "ui_sasstatusdialog.h" class SASStatusDialog : public QDialog diff --git a/SAS/Scheduler/src/sasuploaddialog.h b/SAS/Scheduler/src/sasuploaddialog.h index 0597ee0c87fa46999a90f19eaa81124ec8247e16..8cb6e512f1f15933eadc9d1d5a7da12dd9a398ae 100644 --- a/SAS/Scheduler/src/sasuploaddialog.h +++ b/SAS/Scheduler/src/sasuploaddialog.h @@ -1,7 +1,7 @@ #ifndef SASUPLOADDIALOG_H #define SASUPLOADDIALOG_H -#include <QtGui/QDialog> +#include <QDialog> #include "ui_sasuploaddialog.h" #include "task.h" diff --git a/SAS/Scheduler/src/schedulerLib.cpp b/SAS/Scheduler/src/schedulerLib.cpp index a1bc4ee448cf7f0c54551eab00553bb3fce92453..448c180078996ecf7b1092e987f5dba725e4f7fc 100644 --- a/SAS/Scheduler/src/schedulerLib.cpp +++ b/SAS/Scheduler/src/schedulerLib.cpp @@ -13,6 +13,7 @@ #include <QtGui> #include <QApplication> +#include <QDir> #include "lofar_scheduler.h" #include "Controller.h" #include "schedulergui.h" @@ -58,6 +59,17 @@ int main_function(int argc, char *argv[]) // specific object handler = new SignalHandler(&app, &c); + #ifdef Q_OS_MACX + if (QSysInfo::MacintoshVersion > QSysInfo::MV_10_8) + { //OSX 10.9+, we find and set the directory of the .app, otherwise QDir::currentPath can be empty. + QDir dir = app.applicationDirPath(); + dir.cdUp(); + dir.cdUp(); + dir.cdUp(); //To get from the executable in the bundle to the .app location + QDir::setCurrent(dir.absolutePath()); + } + #endif + // c.start() does not return it does this after closing gui window. try { c.start(); // controller starts the GUI diff --git a/SAS/Scheduler/src/schedulergui.cpp b/SAS/Scheduler/src/schedulergui.cpp index 1052ce7873d0743f121b55484c46088ffa62773e..204200af9f1b19a49f2eca189850c312d1fff255 100644 --- a/SAS/Scheduler/src/schedulergui.cpp +++ b/SAS/Scheduler/src/schedulergui.cpp @@ -17,6 +17,7 @@ #include <QTableView> #include <QDesktopWidget> #include <QLCDNumber> +#include <QFileDialog> #include <sstream> #include <vector> #include <algorithm> @@ -38,9 +39,9 @@ using std::string; using std::endl; const char * DATA_HEADERS[NR_DATA_HEADERS] = { "task ID", "SAS ID", "MoM ID", "group ID", "project ID", "task name", "planned start (UTC)", "planned end (UTC)", "duration", - "task type", "task status", "error reason", "task description", "stations", "reservation", "priority", "fix day", "fix time", + "task type", "task status" , "cluster", "error reason", "task description", "stations", "reservation", "priority", "fix day", "fix time", "first possible date", "last possible date", "window min time", "window max time", "antenna mode", "clock", "filter", "# subbands", - "contact name", "phone", "e-mail", "predecessors", "pred. min time dif", "pred. max time dif", "night wf.", "data size" }; + "contact name", "phone", "e-mail", "predecessors", "pred. min time dif", "pred. max time dif", "night wf.", "data size"}; extern QString currentUser; @@ -235,7 +236,7 @@ void SchedulerGUI::createMainToolbar(void) { itsLCDtimer->setSegmentStyle(QLCDNumber::Flat); itsLCDtimer->setFrameStyle(QLCDNumber::Sunken); itsLCDtimer->setFrameShape(QLCDNumber::WinPanel); - itsLCDtimer->setNumDigits(8); + itsLCDtimer->setDigitCount(8); itsLCDtimer->setToolTip("current UTC"); itsLCDtimer->display("00:00:00"); itsMainToolBar->addWidget(itsLCDtimer); @@ -361,16 +362,21 @@ void SchedulerGUI::updateGraphicTasks(const scheduledTasksMap &scheduledTasks, c void SchedulerGUI::createTableDock(void) { // create table dock and its layout - itsTableDock = new QDockWidget(tr("Table schedule view"), this); + itsTableDock = new QDockWidget("Table schedule view", this); itsTableDockWidgetContents = new QWidget(); itsTableDockMainLayout = new QGridLayout(itsTableDockWidgetContents); itsTableDockMainLayout->setMargin(5); // create the table view itsTableView = new TableView(itsTableDockWidgetContents); itsTableView->setWordWrap(false); - itsTableView->verticalHeader()->setResizeMode(QHeaderView::Fixed); +#if QT_VERSION >= 0x050000 + itsTableView->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed); + itsTableView->horizontalHeader()->setSectionsMovable(true); +#else + itsTableView->verticalHeader()->setResizeMode(QHeaderView::Fixed); + itsTableView->horizontalHeader()->setMovable(true); +#endif itsTableView->setDragEnabled(false); - itsTableView->horizontalHeader()->setMovable(true); itsTableView->setDropIndicatorShown(true); itsTableView->setAcceptDrops(false); itsTableView->setAlternatingRowColors(true); @@ -721,7 +727,11 @@ void SchedulerGUI::newTable(SchedulerData const &data) { itsTableView->setModel(itsModel); itsTableView->setItemDelegate(&itsDelegate); itsTableView->horizontalHeader()->setStretchLastSection(true); - itsTableView->horizontalHeader()->setClickable(true); +#if QT_VERSION >= 0x050000 + itsTableView->horizontalHeader()->setSectionsClickable(true); +#else + itsTableView->horizontalHeader()->setClickable(true); +#endif itsTableView->horizontalHeader()->setSortIndicatorShown(true); writeTableData(data); } @@ -779,6 +789,7 @@ void SchedulerGUI::setDefaultColumnWidths(void) { itsTableView->setColumnWidth(FIXED_DAY,50); itsTableView->setColumnWidth(FIXED_TIME,50); itsTableView->setColumnWidth(PRIORITY,50); + itsTableView->setColumnWidth(CLUSTER_NAME,50); } void SchedulerGUI::writeTableData(SchedulerData const &data) { @@ -931,6 +942,8 @@ void SchedulerGUI::updateTableTask(const Task *pTask, int row) { itsModel->setData(itsModel->index(row, CONTACT_EMAIL), pTask->getContactEmail(), Qt::UserRole); // for sorting itsModel->setData(itsModel->index(row, TASK_TYPE), pTask->getTypeStr()); itsModel->setData(itsModel->index(row, TASK_TYPE), pTask->getTypeStr(), Qt::UserRole); // for sorting + itsModel->setData(itsModel->index(row, CLUSTER_NAME), pTask->getOutputDataproductCluster()); + itsModel->setData(itsModel->index(row, CLUSTER_NAME), pTask->getOutputDataproductCluster(), Qt::UserRole); // for sorting const StationTask *pStationTask = dynamic_cast<const StationTask *>(pTask); if (pStationTask) { // is this a stationTask? @@ -2101,7 +2114,7 @@ QString SchedulerGUI::fileDialog(const QString &title, const QString &def_suffix QFileDialog dialog; QFileInfo fi; QString path=""; - dialog.setFilters(filter.split('\n')); + dialog.setNameFilters(filter.split('\n')); dialog.setWindowTitle(title); diff --git a/SAS/Scheduler/src/schedulergui.h b/SAS/Scheduler/src/schedulergui.h index df748adc54312a5eef11bb91c2c4c14b0fc49d5e..ead8a6eb64c5f047e349ef65c4b7a05ec127c374 100644 --- a/SAS/Scheduler/src/schedulergui.h +++ b/SAS/Scheduler/src/schedulergui.h @@ -17,9 +17,11 @@ #include <string> #include <vector> #include <map> -#include <QtGui/QMainWindow> +#include <QMainWindow> #include <QFileInfo> #include <QToolBar> +#include <QGraphicsView> +#include <QScrollBar> #include "lofar_scheduler.h" #include "ui_schedulergui.h" #include "taskdialog.h" @@ -37,7 +39,7 @@ class SchedulerData; class QPushButton; class QCheckBox; class QTableWidgetItem; -class QGraphicsView; +//class QGraphicsView; class QWidget; class QDockWidget; class QStatusBar; diff --git a/SAS/Scheduler/src/schedulersettings.h b/SAS/Scheduler/src/schedulersettings.h index 60232ce0939868331276f83209701e0824afe65f..84c67fe4ac26bd36c857493f504c89392470e547 100644 --- a/SAS/Scheduler/src/schedulersettings.h +++ b/SAS/Scheduler/src/schedulersettings.h @@ -219,7 +219,7 @@ private: AstroDate itsEarliestDay, itsLatestDay; scheduleWeekVector itsScheduleWeeks; AstroTime itsMinTimeBetweenTasks; - quint16 uniqueStationID, itsMinNrOfStorageNodes; + quint16 uniqueStationID; //, itsMinNrOfStorageNodes; preferredDataProductStorageMap itsPreferredDataProductStorage; preferredProjectStorageMap itsPreferredProjectStorage; storageNodeDistribution itsDataDistributionScheme; diff --git a/SAS/Scheduler/src/schedulesettingsdialog.cpp b/SAS/Scheduler/src/schedulesettingsdialog.cpp index c90496777cfc853dd1094d0a45d5ce8ae05a4082..1d8b4d75a8d8c05255997a2cc6a9cda5aa4a1820 100644 --- a/SAS/Scheduler/src/schedulesettingsdialog.cpp +++ b/SAS/Scheduler/src/schedulesettingsdialog.cpp @@ -130,7 +130,11 @@ ScheduleSettingsDialog::ScheduleSettingsDialog(Controller * controller) : header << "ID" << "Name" << "Process type" << "Process subtype" << "Strategy" << "Status" << "Description"; ui.tableWidgetDefaultTemplates->setHorizontalHeaderLabels(header); ui.tableWidgetDefaultTemplates->horizontalHeader()->setStretchLastSection(true); - ui.tableWidgetDefaultTemplates->horizontalHeader()->setResizeMode(QHeaderView::Interactive); +#if QT_VERSION >= 0x050000 + ui.tableWidgetDefaultTemplates->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive); +#else + ui.tableWidgetDefaultTemplates->horizontalHeader()->setResizeMode(QHeaderView::Interactive); +#endif ui.checkBoxAutoPublish->setChecked(Controller::theSchedulerSettings.getAutoPublish()); itsPublishLocal = Controller::theSchedulerSettings.publishLocal(); @@ -741,7 +745,7 @@ void ScheduleSettingsDialog::privateKeyBrowseDialog(void) { dialog.setDirectory(prevFile.absoluteDir()); } } - dialog.setFilter("private key files (*.ppk)"); + dialog.setNameFilter("private key files (*.ppk)"); dialog.exec(); if (dialog.result() == QDialog::Accepted) { QStringList files = dialog.selectedFiles(); diff --git a/SAS/Scheduler/src/schedulesettingsdialog.h b/SAS/Scheduler/src/schedulesettingsdialog.h index 47140bc969125d22eb67ae50b51b48c6e4e25d6f..f75bb572ada3ccfd07ca6fb73b38ff9266dd8763 100644 --- a/SAS/Scheduler/src/schedulesettingsdialog.h +++ b/SAS/Scheduler/src/schedulesettingsdialog.h @@ -14,7 +14,7 @@ #ifndef SCHEDULESETTINGSDIALOG_H #define SCHEDULESETTINGSDIALOG_H -#include <QtGui/QDialog> +#include <QDialog> #include "ui_schedulesettingsdialog.h" #include "lofar_scheduler.h" #include "astrodate.h" diff --git a/SAS/Scheduler/src/shifttasksdialog.h b/SAS/Scheduler/src/shifttasksdialog.h index aa613371af17570e8166ab9f1462b74e42461c24..cee4a0152ddf87dd4253342bd03bf4a8bb6b2a02 100644 --- a/SAS/Scheduler/src/shifttasksdialog.h +++ b/SAS/Scheduler/src/shifttasksdialog.h @@ -21,7 +21,7 @@ enum moveType { MOVE_TO_START }; -#include <QtGui/QDialog> +#include <QDialog> #include "ui_shifttasksdialog.h" #include "Controller.h" diff --git a/SAS/Scheduler/src/statehistorydialog.cpp b/SAS/Scheduler/src/statehistorydialog.cpp index c550b53a9f21ded23e50f4adeb5b55a33daddd49..72f2e002140461b1c6e8d15e7e21c1a2caf817ac 100644 --- a/SAS/Scheduler/src/statehistorydialog.cpp +++ b/SAS/Scheduler/src/statehistorydialog.cpp @@ -10,7 +10,11 @@ StateHistoryDialog::StateHistoryDialog(QWidget *parent) ui.tableWidgetStateInfo->setHorizontalHeaderLabels(header); ui.tableWidgetStateInfo->setEditTriggers(QAbstractItemView::NoEditTriggers); ui.tableWidgetStateInfo->horizontalHeader()->setStretchLastSection(true); - ui.tableWidgetStateInfo->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents); +#if QT_VERSION >= 0x050000 + ui.tableWidgetStateInfo->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); +#else + ui.tableWidgetStateInfo->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents); +#endif this->setWindowTitle("Task state change history"); } @@ -34,5 +38,9 @@ void StateHistoryDialog::addStateInfo(const QString &treeID, const QString &momI newItem = new QTableWidgetItem(modtime.toString("yyyy-MM-dd hh:mm:ss")); ui.tableWidgetStateInfo->setItem(row, 4, newItem); - ui.tableWidgetStateInfo->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents); +#if QT_VERSION >= 0x050000 + ui.tableWidgetStateInfo->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); +#else + ui.tableWidgetStateInfo->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents); +#endif } diff --git a/SAS/Scheduler/src/statehistorydialog.h b/SAS/Scheduler/src/statehistorydialog.h index d45e199e8ac4d2424804579dfc3090811b44c2db..87d4915862136914875be489ac6996cc43797765 100644 --- a/SAS/Scheduler/src/statehistorydialog.h +++ b/SAS/Scheduler/src/statehistorydialog.h @@ -1,7 +1,7 @@ #ifndef STATEHISTORYDIALOG_H #define STATEHISTORYDIALOG_H -#include <QtGui/QDialog> +#include <QDialog> #include "ui_statehistorydialog.h" #include <QDateTime> diff --git a/SAS/Scheduler/src/stationlistwidget.h b/SAS/Scheduler/src/stationlistwidget.h index b75e9f63d9644cad1f26a62605b7849b54f299f9..b7dea39d5b923a9ca718e39fcad86662a3a9cb15 100644 --- a/SAS/Scheduler/src/stationlistwidget.h +++ b/SAS/Scheduler/src/stationlistwidget.h @@ -14,7 +14,7 @@ #ifndef STATIONLISTWIDGET_H #define STATIONLISTWIDGET_H -#include <QtGui/QListWidget> +#include <QListWidget> #include "ui_stationlistwidget.h" class QMouseEvents; diff --git a/SAS/Scheduler/src/stationtreewidget.h b/SAS/Scheduler/src/stationtreewidget.h index 8b3df586b635488ce0ca97358901d3fca6fa4683..9d61b8fcd64f83b9ab28f3b006ed4ed7850f8c6b 100644 --- a/SAS/Scheduler/src/stationtreewidget.h +++ b/SAS/Scheduler/src/stationtreewidget.h @@ -14,7 +14,7 @@ #ifndef STATIONTREEWIDGET_H #define STATIONTREEWIDGET_H -#include <QtGui/QTreeWidget> +#include <QTreeWidget> #include "ui_stationtreewidget.h" // class used as tree of used stations diff --git a/SAS/Scheduler/src/tablecolumnselectdialog.h b/SAS/Scheduler/src/tablecolumnselectdialog.h index 21e13ce603c99ffd4f6b53228cdf08de4f91954a..265d19e12a92401a5e2861808d39bb3b38e6cbcd 100644 --- a/SAS/Scheduler/src/tablecolumnselectdialog.h +++ b/SAS/Scheduler/src/tablecolumnselectdialog.h @@ -1,7 +1,7 @@ #ifndef TABLECOLUMNSELECTDIALOG_H #define TABLECOLUMNSELECTDIALOG_H -#include <QtGui/QDialog> +#include <QDialog> #include "ui_tablecolumnselectdialog.h" class tableColumnSelectDialog : public QDialog diff --git a/SAS/Scheduler/src/tableview.h b/SAS/Scheduler/src/tableview.h index 512e03eb18184445f0bce899d682af8939471afe..668579b8e44c1a24df0e157ac3feac06b9c4efe8 100644 --- a/SAS/Scheduler/src/tableview.h +++ b/SAS/Scheduler/src/tableview.h @@ -1,7 +1,7 @@ #ifndef TABLEVIEW_H #define TABLEVIEW_H -#include <QtGui/QTableView> +#include <QTableView> #include <QSet> class TableView : public QTableView diff --git a/SAS/Scheduler/src/task.cpp b/SAS/Scheduler/src/task.cpp index fad5df164da55ec77d48a6c966cc0251b452a076..b25f8fcfa9bec902cda29da766d34260fdba66c6 100755 --- a/SAS/Scheduler/src/task.cpp +++ b/SAS/Scheduler/src/task.cpp @@ -240,7 +240,8 @@ Task::task_status convertSASstatus(SAS_task_status sas_state) { Task::Task() : taskID(0), itsPriority(0.0), itsStatus(DESCRIBED), itsTaskType(UNKNOWN), - fixed_day(false), fixed_time(false), itsPenalty(0), penaltyCalculationNeeded(true), itsShiftDirection(SHIFT_RIGHT) + fixed_day(false), fixed_time(false), itsPenalty(0), penaltyCalculationNeeded(true), itsShiftDirection(SHIFT_RIGHT), + itsOutputDataproductCluster("---") { clearAllConflicts(); // set the time window equal to the schedule boundaries @@ -252,7 +253,7 @@ Task::Task() Task::Task(unsigned task_id) : taskID(task_id), itsPriority(0.0), itsStatus(UNSCHEDULED), itsTaskType(UNKNOWN), fixed_day(false), fixed_time(false), itsPenalty(0), penaltyCalculationNeeded(true), - itsShiftDirection(SHIFT_RIGHT) + itsShiftDirection(SHIFT_RIGHT), itsOutputDataproductCluster("---") { clearAllConflicts(); // set the time window equal to the schedule boundaries @@ -265,7 +266,8 @@ Task::Task(unsigned task_id) Task::Task(unsigned task_id, const OTDBtree &SAS_tree) : itsProjectName(SAS_tree.campaign()), taskID(task_id), itsPriority(0.0), fixed_day(false), fixed_time(false), itsPenalty(0), penaltyCalculationNeeded(true), - itsShiftDirection(SHIFT_RIGHT), itsSASTree(SAS_tree) + itsShiftDirection(SHIFT_RIGHT), itsOutputDataproductCluster("---"), itsSASTree(SAS_tree) + { setType(SAS_tree.processType(), SAS_tree.processSubType(), SAS_tree.strategy()); @@ -280,7 +282,8 @@ Task::Task(unsigned task_id, const OTDBtree &SAS_tree) Task::Task(const QSqlQuery &query, const OTDBtree &SAS_tree) : itsProjectName(SAS_tree.campaign()), - itsPenalty(0), penaltyCalculationNeeded(true), itsShiftDirection(SHIFT_RIGHT), itsSASTree(SAS_tree) + itsPenalty(0), penaltyCalculationNeeded(true), itsShiftDirection(SHIFT_RIGHT), itsOutputDataproductCluster("---"), itsSASTree(SAS_tree) + { setType(SAS_tree.processType(), SAS_tree.processSubType(),SAS_tree.strategy()); @@ -300,7 +303,7 @@ Task::Task(const QSqlQuery &query, const OTDBtree &SAS_tree) firstPossibleDay = day; } else { // first possible day not set use the schedule start day or the current date whichever is latest - firstPossibleDay = std::max(QDate::currentDate().toJulianDay() - J2000_EPOCH, (int)Controller::theSchedulerSettings.getEarliestSchedulingDay().toJulian()); + firstPossibleDay = std::max(QDate::currentDate().toJulianDay() - J2000_EPOCH, (qint64)Controller::theSchedulerSettings.getEarliestSchedulingDay().toJulian()); } QString time = query.value(query.record().indexOf("windowMaximumTime")).toString(); if (!time.isEmpty()) { @@ -474,6 +477,7 @@ Task & Task::operator=(const Task &other) { firstPossibleDay = other.firstPossibleDay; lastPossibleDay = other.lastPossibleDay; itsSASTree = other.itsSASTree; + itsOutputDataproductCluster = other.itsOutputDataproductCluster; } return *this; } @@ -754,13 +758,6 @@ bool Task::setReason(const std::string &reason) { return false; } */ -/* -void Task::addPredecessor(unsigned int pid, AstroTime min, AstroTime max) { - std::pair<AstroTime, AstroTime> minMaxTimes (min, max); - std::pair<unsigned int, std::pair<AstroTime, AstroTime> > predecessor (pid, minMaxTimes); - predecessors.push_back(predecessor); -} -*/ QString Task::getPredecessorsString(const QChar &separater) const { QStringList predlist; diff --git a/SAS/Scheduler/src/task.h b/SAS/Scheduler/src/task.h index d44e502fe013e7793d453606104601dd7a8a73ce..d4f1d90b204d6565e2dfd004b623571af3b9e03c 100755 --- a/SAS/Scheduler/src/task.h +++ b/SAS/Scheduler/src/task.h @@ -319,6 +319,7 @@ public: bool getPenaltyCalculationNeeded(void) const {return penaltyCalculationNeeded;} bool getShiftDirection(void) const {return itsShiftDirection;} const task_conflicts &getConflicts(void) const {return itsConflicts;} + const QString &getOutputDataproductCluster(void) const {return itsOutputDataproductCluster;} // Added to support CEP4, maybe should be std::string /AR // set methods void setID(unsigned id) {taskID = id;} @@ -378,6 +379,8 @@ public: inline void setSASTreeID(int treeID) {itsSASTree.itsTreeID = treeID;} inline void setGroupID(unsigned groupID) {itsSASTree.itsGroupID = groupID;} inline void setMoMID(int momID) {itsSASTree.itsMomID = momID;} + inline void setOutputDataproductCluster(const QString &clusterName) {itsOutputDataproductCluster = clusterName;} // Added to support CEP4, maybe should be std::string /AR + void clearAllStorageConflicts(void); @@ -409,6 +412,7 @@ protected: bool itsShiftDirection; IDvector itsPredecessors, itsSuccessors; task_conflicts itsConflicts; + QString itsOutputDataproductCluster; // Added to support CEP4, maybe should be std::string /AR // objects // std::vector<unsigned int> successors; diff --git a/SAS/Scheduler/src/taskcopydialog.h b/SAS/Scheduler/src/taskcopydialog.h index 8b964e1f3a93b395b331cf3085609d7698b7da19..2a4417451237e5b6c933d098f792d3f8278018c3 100644 --- a/SAS/Scheduler/src/taskcopydialog.h +++ b/SAS/Scheduler/src/taskcopydialog.h @@ -1,7 +1,7 @@ #ifndef TASKCOPYDIALOG_H #define TASKCOPYDIALOG_H -#include <QtGui/QDialog> +#include <QDialog> #include "ui_taskcopydialog.h" #include "astrodatetime.h" #include "astrotime.h" diff --git a/SAS/Scheduler/src/taskdialog.cpp b/SAS/Scheduler/src/taskdialog.cpp index f62311d89ba903a29cc45c508e13b752463a9fbf..49b1ef01849dce5aa4a9f523eefb3f96eb4167db 100644 --- a/SAS/Scheduler/src/taskdialog.cpp +++ b/SAS/Scheduler/src/taskdialog.cpp @@ -162,7 +162,11 @@ TaskDialog::TaskDialog(QWidget *parentGUI, Controller *controller) ui.tableWidgetTiedArrayBeams->setColumnWidth(1,150); ui.tableWidgetTiedArrayBeams->setColumnWidth(2,130); ui.tableWidgetTiedArrayBeams->horizontalHeader()->setStretchLastSection(true); - ui.tableWidgetTiedArrayBeams->horizontalHeader()->setResizeMode(QHeaderView::Interactive); +#if QT_VERSION >= 0x050000 + ui.tableWidgetTiedArrayBeams->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive); +#else + ui.tableWidgetTiedArrayBeams->horizontalHeader()->setResizeMode(QHeaderView::Interactive); +#endif // enable default output data type ui.checkBoxCorrelatedData->blockSignals(true); diff --git a/SAS/Scheduler/src/taskdialog.h b/SAS/Scheduler/src/taskdialog.h index 74c812e6e6987ce27b0fc58240556f31fa1c9d4c..860f1c80a03c8e6a7a61ca0a423721c5ea808e39 100644 --- a/SAS/Scheduler/src/taskdialog.h +++ b/SAS/Scheduler/src/taskdialog.h @@ -14,7 +14,7 @@ #ifndef TASKDIALOG_H #define TASKDIALOG_H -#include <QtGui/QDialog> +#include <QDialog> #include <vector> #include <string> #include "lofar_scheduler.h" diff --git a/SAS/Scheduler/src/taskstorage.cpp b/SAS/Scheduler/src/taskstorage.cpp index 34cac6d7874b11582637415e151c5a4765020fca..a26e85e235f286b78418b03d8cbbb4b131b2443c 100644 --- a/SAS/Scheduler/src/taskstorage.cpp +++ b/SAS/Scheduler/src/taskstorage.cpp @@ -297,49 +297,44 @@ QDataStream& operator>> (QDataStream &in, TaskStorage &storage) { return in; } - +//WK code commented out // Returns True if the input and output node locations are equal for // all the input and output products // THis function should be moved to the pipeline class? -bool TaskStorage::getEqualityInputOutputProducts()const -{ - // Check we have the same number of dataproduct types - //if (itsInputDataProducts.size() != itsOutputDataProducts.size()) - // return false; - - //loop over the input and output data types - std::map<dataProductTypes, inputDataProduct >::const_iterator inputTypePair; - std::map<dataProductTypes, outputDataProduct >::const_iterator outputTypePair; - for (outputTypePair = itsOutputDataProducts.begin(); - outputTypePair != itsOutputDataProducts.end(); // length is the same - ++outputTypePair ) - { - if(itsInputDataProducts.find(outputTypePair->first) != - itsInputDataProducts.end()) - continue; - inputDataProduct input = itsInputDataProducts.at(outputTypePair->first); - - - // Check if we have the same number of input and output entries - if (input.locations.size() != - outputTypePair->second.locations.size()) - return false; - - // Loop over all the input and output locations - QStringList::const_iterator inputLoc; - QStringList::const_iterator outputLoc; - for (inputLoc = input.locations.begin(), - outputLoc = outputTypePair->second.locations.begin(); - inputLoc != input.locations.end(); - ++inputLoc , ++outputLoc) - { - //return false if the nodes are not the same - if (inputLoc->split(":").at(0) != outputLoc->split(":").at(0)) - return false; - } - } - return true; -} +//bool TaskStorage::getEqualityInputOutputProducts()const +//{ +// // Check we have the same number of dataproduct types +// if (itsInputDataProducts.size() != itsOutputDataProducts.size()) +// return false; + +// //loop over the input and output data types +// std::map<dataProductTypes, inputDataProduct >::const_iterator inputTypePair; +// std::map<dataProductTypes, outputDataProduct >::const_iterator outputTypePair; +// for (inputTypePair = itsInputDataProducts.begin(), +// outputTypePair = itsOutputDataProducts.begin(); +// inputTypePair != itsInputDataProducts.end(); // length is the same +// ++inputTypePair, ++outputTypePair ) +// { +// // Check if we have the same number of input and output entries +// if (inputTypePair->second.locations.size() != +// outputTypePair->second.locations.size()) +// return false; + +// // Loop over all the input and output locations +// QStringList::const_iterator inputLoc; +// QStringList::const_iterator outputLoc; +// for (inputLoc = inputTypePair->second.locations.begin(), +// outputLoc = outputTypePair->second.locations.begin(); +// inputLoc != inputTypePair->second.locations.end(); +// ++inputLoc , ++outputLoc) +// { +// //return false if the nodes are not the same +// if (inputLoc->split(":").at(0) != outputLoc->split(":").at(0)) +// return false; +// } +// } +// return true; +//} void TaskStorage::setInputFileSizes(dataProductTypes dpType, const std::pair<double, unsigned> &inputFileSizes) { itsInputDataFiles[dpType] = inputFileSizes; diff --git a/SAS/Scheduler/src/taskstorage.h b/SAS/Scheduler/src/taskstorage.h index e68df5549bef2076bf730a606ca1aa14ee431a01..202898a8f5ad3868fe5f516a6544362407a2dc27 100644 --- a/SAS/Scheduler/src/taskstorage.h +++ b/SAS/Scheduler/src/taskstorage.h @@ -169,7 +169,8 @@ public: bool diff(const TaskStorage *other, task_diff &dif) const; QString diffString(const task_diff &dif) const; - bool getEqualityInputOutputProducts()const; +//WK code commented out +// bool getEqualityInputOutputProducts()const; private: const Task *itsOwner; diff --git a/SAS/Scheduler/src/thrashbin.h b/SAS/Scheduler/src/thrashbin.h index 6bab89d125e8ee9b15d885612549bd0b3fc57385..72e8ff88003c29d2fcca1bba6435c390b7340f14 100644 --- a/SAS/Scheduler/src/thrashbin.h +++ b/SAS/Scheduler/src/thrashbin.h @@ -14,7 +14,7 @@ #ifndef THRASHBIN_H #define THRASHBIN_H -#include <QtGui/QDialog> +#include <QDialog> #include "ui_thrashbin.h" #include <map> #include <vector> diff --git a/SAS/Scheduler/src/tiedarraybeamdialog.h b/SAS/Scheduler/src/tiedarraybeamdialog.h index acfe58d2269845926b951caca7a0d29ea392a1f4..19bba5856d0f174f3075dfc9bbf67109978318af 100644 --- a/SAS/Scheduler/src/tiedarraybeamdialog.h +++ b/SAS/Scheduler/src/tiedarraybeamdialog.h @@ -18,7 +18,7 @@ struct tabProps { bool angle1, angle2, dispersion_measure, coherent; }; -#include <QtGui/QDialog> +#include <QDialog> #include "ui_tiedarraybeamdialog.h" #include "TiedArrayBeam.h" #include "taskdialog.h" diff --git a/SubSystems/RAServices/CMakeLists.txt b/SubSystems/RAServices/CMakeLists.txt index 00d38eb6001b5b699f8e549e9cc420b3620dcd26..19156d9b5f0d66b3642c851502422d6f4814e4b8 100644 --- a/SubSystems/RAServices/CMakeLists.txt +++ b/SubSystems/RAServices/CMakeLists.txt @@ -1,13 +1,17 @@ # $Id: CMakeLists.txt 20934 2012-05-15 09:26:48Z schoenmakers $ lofar_package(RAServices - DEPENDS OTDB_Services - MAC_Services - MoMQueryService - ResourceAssignmentDatabase + DEPENDS MoMQueryService + OTDBtoRATaskStatusPropagator RATaskSpecifiedService + RAtoOTDBTaskSpecificationPropagator + ResourceAssigner + ResourceAssignmentDatabase ResourceAssignmentEditor - ResourceAssignmentService) + ResourceAssignmentEstimator + ResourceAssignmentService + SystemStatusDatabase + SystemStatusService) # supervisord config files install(FILES diff --git a/SubSystems/RAServices/RAServices.ini b/SubSystems/RAServices/RAServices.ini index a9700f3f99920ac2f3f34c36bd465d6f153a4a93..347a0d73e3bb909458827e690777ad9e88d1c5f3 100644 --- a/SubSystems/RAServices/RAServices.ini +++ b/SubSystems/RAServices/RAServices.ini @@ -2,7 +2,8 @@ programs=TreeService,TreeStatusEvents [group:RA_Services] -programs=raewebservice,radbservice,radbpglistener,RATaskSpecified +programs=raewebservice,radbservice,radbpglistener,resourceassigner,RATaskSpecified,raestimatorservice,rotspservice,ortspropagator +priority=200 [group:MAC] programs=pipelinecontrol