diff --git a/.gitignore b/.gitignore index f5b99ae3..0f902190 100644 --- a/.gitignore +++ b/.gitignore @@ -47,7 +47,6 @@ Temporary Items # project files # ======================== .idea -.sass-cache .usage *.gz composer-dev.lock diff --git a/.jshintrc b/.jshintrc index 2ebd120f..c61df68c 100644 --- a/.jshintrc +++ b/.jshintrc @@ -35,7 +35,7 @@ "latedef": false, // Enforce line length to 100 characters - "maxlen": 200, + "maxlen": 220, // Require capitalized names for constructor functions. "newcap": true, diff --git a/README.md b/README.md index bdf15843..bc7d3705 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,16 @@ # ![Pathfinder logo](favicon/favicon-32x32.png "Logo") *PATHFINDER* -Mapping tool for [*EVE ONLINE*](https://www.eveonline.com) +#### Mapping tool for [*EVE ONLINE*](https://www.eveonline.com) - Project URL [https://www.pathfinder-w.space](https://www.pathfinder-w.space) -- Official forum post [https://forums.eveonline.com](https://forums.eveonline.com/default.aspx?g=posts&m=6021776#post6021776) - Screenshots [imgur.com](http://imgur.com/a/k2aVa) - Videos [youtube.com](https://www.youtube.com/channel/UC7HU7XEoMbqRwqxDTbMjSPg) - Licence [MIT](http://opensource.org/licenses/MIT) #### Development -- Test server - - URL: http://www.dev.pathfinder-w.space +- Test server: [https://www.dev.pathfinder-w.space](https://www.dev.pathfinder-w.space) - Running current `develop` branch - _SISI_ _ESI_ (make sure to use your test-server client) - - Available for public testing (e.g. new feature,.. ) + - Available for public testing (e.g. new feature,… ) - Database will be cleared from time to time - Installation guide: - [wiki](https://github.com/exodus4d/pathfinder/wiki) @@ -27,52 +25,55 @@ Issues should be reported in the [Issue](https://github.com/exodus4d/pathfinder/ *** ### Project structure +
+ ─╮
+  ├─ app/              [0755] → PHP root
+  │  ├─ Controller/           → controller classes for app/ajax endpoints (see routes.ini)
+  │  ├─ Cron/                 → controller classes cronjob endpoints (see cron.ini)
+  │  ├─ Data/                 → classes for data handling
+  │  ├─ Db/                   → classes for DB handling
+  │  ├─ Exception/            → custom exceptions
+  │  ├─ Lib/                  → libs
+  │  ├─ Model/                → ORM
+  │  ├─ config.ini            → config - F3 core config: SystemVariables
+  │  ├─ cron.ini              → config - cronjobs
+  │  ├─ environment.ini       → config - system environment
+  │  ├─ pathfinder.ini        → config - pathfinder
+  │  ├─ plugin.ini            → config - custom plugins
+  │  ├─ requirements.ini      → config - system requirements
+  │  └─ routes.ini            → config - routes
+  ├─ export/           [0755] → static data
+  │  ├─ csv/                  → *.csv used by /setup page
+  │  └─ sql/                  → DB dump for import (eve_universe.sql.zip)
+  ├─ favicon/          [0755] → favicons
+  ├─ history/          [0777] → log files (map history logs) [optional]
+  ├─ js/               [0755] → JS source files (not used for production)
+  │  ├─ app/                  → "PATHFINDER" core files
+  │  ├─ lib/                  → 3rd party libs
+  │  └─ app.js                → require.js config
+  ├─ logs/             [0777] → log files
+  │  └─ …
+  ├─ public/           [0755] → static resources
+  │  ├─ css/                  → CSS dist/build folder (minified)
+  │  ├─ fonts/                → icon-/fonts
+  │  ├─ img/                  → images
+  │  ├─ js/                   → JS dist/build folder and source maps (minified, uglified)
+  │  └─ templates/            → templates
+  ├─ sass/                    → SCSS sources (not used for production)
+  ├─ tmp/              [0777] → cache folder (PHP templates)
+  │  └─ cache/         [0777] → cache folder (PHP cache)
+  ├─ .htaccess         [0755] → reroute/caching rules ("Apache" only!)
+  └─ index.php         [0755]
 
-```
-  |-- [0755] app/           --> backend [*.php]
-      |-- app/              --> "Fat Free Framework" extensions
-      |-- lib/              --> "Fat Free Framework"
-      |-- main/             --> "PATHFINDER" root
-      |-- config.ini        --> config "f3" framework
-      |-- cron.ini          --> config - cronjobs
-      |-- environment.ini   --> config - system environment
-      |-- pathfinder.ini    --> config - pathfinder
-      |-- requirements.ini  --> config - system requirements
-      |-- routes.ini        --> config - routes
-  |-- [0755] export/        --> static data
-      |-- csv/              --> *.csv used by /setup page
-      |-- sql/              --> DB dump for import (eve_universe.sql.zip)
-  |-- [0755] favicon/       --> Favicons
-  |-- [0777] history/       --> log files (map history logs) [optional]
-  |-- [0755] js/            --> JS source files
-      |-- app/              --> "PASTHFINDER" core files (not used for production)
-      |-- lib/              --> 3rd partie extension/library (not used for production)
-      |-- app.js            --> require.js config (!required for production!)
-  |-- [0777] logs/          --> log files
-      |-- ...
-  |-- node_modules/         --> node.js modules (not used for production)
-      |-- ...
-  |-- [0755] public/        --> frontend source
-      |-- css/              --> CSS dist/build folder (minified)
-      |-- fonts/            --> (icon)-Fonts
-      |-- img/              --> images
-      |-- js/               --> JS dist/build folder and source maps (minified, uglified)
-      |-- templates/        --> templates
-  |-- sass/                 --> SCSS source (not used for production)
-  |-- [0777] tmp/           --> cache folder
-  |-- [0755] .htaccess      --> reroute/caching rules ("Apache" only!)
-  |-- [0755] index.php
-
-  --------------------------
+  ━━━━━━━━━━━━━━━━━━━━━━━━━━
   CI/CD config files:
-  --------------------------
-  |-- .jshintrc             --> "JSHint" config (not used for production)
-  |-- composer.json         --> Composer package definition
-  |-- config.rb             --> "Compass" config (not used for production)
-  |-- gulpfile.js           --> "Gulp" task config (not used for production )
-  |-- package.json          --> "Node.js" dependency config (not used for production)
-  |-- README.md             --> This file :) (not used for production)
-```
+  
+  ├─ .jshintrc                → "JSHint" config (not used for production)
+  ├─ composer.json            → "Composer" package definition
+  ├─ gulpfile.js              → "Gulp" task config (not used for production)
+  ├─ package.json             → "Node.js" dependency config (not used for production)
+  └─ README.md                → This file :) (not used for production)
+
*** diff --git a/app/main/controller/accesscontroller.php b/app/Controller/AccessController.php similarity index 87% rename from app/main/controller/accesscontroller.php rename to app/Controller/AccessController.php index ab2dca79..63453f37 100644 --- a/app/main/controller/accesscontroller.php +++ b/app/Controller/AccessController.php @@ -6,10 +6,10 @@ * Time: 23:30 */ -namespace Controller; +namespace Exodus4D\Pathfinder\Controller; -use Model\Pathfinder; +use Exodus4D\Pathfinder\Model\Pathfinder; class AccessController extends Controller { @@ -77,11 +77,11 @@ class AccessController extends Controller { /** * broadcast MapModel to clients - * @see broadcastMapData() * @param Pathfinder\MapModel $map + * @param bool $noCache */ - protected function broadcastMap(Pathfinder\MapModel $map) : void { - $this->broadcastMapData($this->getFormattedMapData($map)); + protected function broadcastMap(Pathfinder\MapModel $map, bool $noCache = false) : void { + $this->broadcastMapData($this->getFormattedMapData($map, $noCache)); } @@ -99,18 +99,13 @@ class AccessController extends Controller { /** * get formatted Map Data * @param Pathfinder\MapModel $map - * @return array - * @throws \Exception - */ - - /** - * @param Pathfinder\MapModel $map + * @param bool $noCache * @return array|null */ - protected function getFormattedMapData(Pathfinder\MapModel $map) : ?array { + protected function getFormattedMapData(Pathfinder\MapModel $map, bool $noCache = false) : ?array { $data = null; try{ - $mapData = $map->getData(); + $mapData = $map->getData($noCache); $data = [ 'config' => $mapData->mapData, 'data' => [ diff --git a/app/main/controller/admin.php b/app/Controller/Admin.php similarity index 97% rename from app/main/controller/admin.php rename to app/Controller/Admin.php index 7c9670df..b419daa5 100644 --- a/app/main/controller/admin.php +++ b/app/Controller/Admin.php @@ -6,15 +6,15 @@ * Time: 20:30 */ -namespace Controller; +namespace Exodus4D\Pathfinder\Controller; -use Controller\Ccp\Sso; -use lib\Config; -use Model\Pathfinder\CharacterModel; -use Model\Pathfinder\CorporationModel; -use Model\Pathfinder\MapModel; -use Model\Pathfinder\RoleModel; +use Exodus4D\Pathfinder\Controller\Ccp\Sso; +use Exodus4D\Pathfinder\Lib\Config; +use Exodus4D\Pathfinder\Model\Pathfinder\CharacterModel; +use Exodus4D\Pathfinder\Model\Pathfinder\CorporationModel; +use Exodus4D\Pathfinder\Model\Pathfinder\MapModel; +use Exodus4D\Pathfinder\Model\Pathfinder\RoleModel; class Admin extends Controller{ @@ -203,7 +203,7 @@ class Admin extends Controller{ // character has access to that corporation -> create/update/delete rights... if($corporationRightsData = (array)$settings['rights']){ // get existing corp rights - foreach($corporation->getRights(['addInactive' => true]) as $corporationRight){ + foreach($corporation->getRights($corporation::RIGHTS, ['addInactive' => true]) as $corporationRight){ $corporationRightData = $corporationRightsData[$corporationRight->rightId->_id]; if( $corporationRightData && diff --git a/app/main/controller/api/access.php b/app/Controller/Api/Access.php similarity index 93% rename from app/main/controller/api/access.php rename to app/Controller/Api/Access.php index 01ad9bc2..d1ca15f0 100644 --- a/app/main/controller/api/access.php +++ b/app/Controller/Api/Access.php @@ -6,10 +6,10 @@ * Time: 17:42 */ -namespace Controller\Api; +namespace Exodus4D\Pathfinder\Controller\Api; -use Controller; -use Model\Pathfinder; +use Exodus4D\Pathfinder\Controller; +use Exodus4D\Pathfinder\Model\Pathfinder; class Access extends Controller\AccessController { diff --git a/app/main/controller/api/github.php b/app/Controller/Api/GitHub.php similarity index 85% rename from app/main/controller/api/github.php rename to app/Controller/Api/GitHub.php index 71354a4d..9f3c8c22 100644 --- a/app/main/controller/api/github.php +++ b/app/Controller/Api/GitHub.php @@ -7,12 +7,11 @@ * Time: 03:34 */ -namespace Controller\Api; +namespace Exodus4D\Pathfinder\Controller\Api; -use lib\Config; -use Controller; - +use Exodus4D\Pathfinder\Lib\Config; +use Exodus4D\Pathfinder\Controller; /** * Github controller @@ -36,9 +35,7 @@ class GitHub extends Controller\Controller { $return->version->delta = null; $return->version->dev = false; - $md = \Markdown::instance(); - - $releases = $f3->gitHubClient()->getProjectReleases('exodus4d/pathfinder', $releaseCount); + $releases = $f3->gitHubClient()->send('getProjectReleases', 'exodus4d/pathfinder', $releaseCount); foreach($releases as $key => &$release){ // check version ------------------------------------------------------------------------------------------ @@ -70,12 +67,12 @@ class GitHub extends Controller\Controller { // convert Markdown to HTML -> use either gitHub API (in oder to create abs, issue links) // -> or F3´s markdown as fallback - $html = $f3->gitHubClient()->markdownToHtml('exodus4d/pathfinder', $body); + $html = $f3->gitHubClient()->send('markdownToHtml', 'exodus4d/pathfinder', $body); if(!empty($html)){ $body = $html; }else{ - $body = $md->convert(trim($body)); + $body = \Markdown::instance()->convert(trim($body)); } $release['body'] = $body; diff --git a/app/main/controller/api/map.php b/app/Controller/Api/Map.php similarity index 80% rename from app/main/controller/api/map.php rename to app/Controller/Api/Map.php index 1fa570a2..14611fcf 100644 --- a/app/main/controller/api/map.php +++ b/app/Controller/Api/Map.php @@ -6,15 +6,15 @@ * Time: 20:23 */ -namespace Controller\Api; +namespace Exodus4D\Pathfinder\Controller\Api; -use Controller; -use data\file\FileHandler; -use lib\Config; -use Model\AbstractModel; -use Model\Pathfinder; -use Model\Universe; -use Exception; +use Exodus4D\Pathfinder\Lib\Config; +use Exodus4D\Pathfinder\Controller; +use Exodus4D\Pathfinder\Data\File\FileHandler; +use Exodus4D\Pathfinder\Model\AbstractModel; +use Exodus4D\Pathfinder\Model\Pathfinder; +use Exodus4D\Pathfinder\Model\Universe; +use Exodus4D\Pathfinder\Exception; /** * Map controller @@ -49,7 +49,7 @@ class Map extends Controller\AccessController { /** * Get all required static config data for program initialization * @param \Base $f3 - * @throws Exception + * @throws \Exception */ public function initData(\Base $f3){ $validInitData = true; @@ -170,7 +170,7 @@ class Map extends Controller\AccessController { // get program routes ------------------------------------------------------------------------------------- $return->routes = [ - 'ssoLogin' => $this->getF3()->alias( 'sso', ['action' => 'requestAuthorization'] ) + 'ssoLogin' => $this->getF3()->alias('sso', ['action' => 'requestAuthorization']) ]; // get third party APIs ----------------------------------------------------------------------------------- @@ -179,7 +179,13 @@ class Map extends Controller\AccessController { 'zKillboard' => Config::getPathfinderData('api.z_killboard'), 'eveeye' => Config::getPathfinderData('api.eveeye'), 'dotlan' => Config::getPathfinderData('api.dotlan'), - 'anoik' => Config::getPathfinderData('api.anoik') + 'anoik' => Config::getPathfinderData('api.anoik'), + 'eveScout' => Config::getPathfinderData('api.eve_scout') + ]; + + // get Plugin config -------------------------------------------------------------------------------------- + $return->plugin = [ + 'modules' => Config::getPluginConfig('modules') ]; // Character default config ------------------------------------------------------------------------------- @@ -254,11 +260,11 @@ class Map extends Controller\AccessController { // get SSO error messages that should be shown immediately ---------------------------------------------------- // -> e.g. errors while character switch from previous HTTP requests - if($f3->exists(Controller\Ccp\Sso::SESSION_KEY_SSO_ERROR, $message)){ + if($f3->exists(Controller\Ccp\Sso::SESSION_KEY_SSO_ERROR, $text)){ $ssoError = (object) []; $ssoError->type = 'error'; $ssoError->title = 'Login failed'; - $ssoError->message = $message; + $ssoError->text = $text; $return->error[] = $ssoError; $f3->clear(Controller\Ccp\Sso::SESSION_KEY_SSO_ERROR); }elseif($validInitData){ @@ -272,7 +278,7 @@ class Map extends Controller\AccessController { /** * import new map data * @param \Base $f3 - * @throws Exception + * @throws \Exception */ public function import(\Base $f3){ $importData = (array)$f3->get('POST'); @@ -386,7 +392,7 @@ class Map extends Controller\AccessController { }else{ $maxSystemsError = (object) []; $maxSystemsError->type = 'error'; - $maxSystemsError->message = 'Map has to many systems (' . $systemCount . ').' + $maxSystemsError->text = 'Map has to many systems (' . $systemCount . ').' .' Max system count is ' . $defaultConfig['max_systems'] . ' for ' . $mapType->name . ' maps.'; $return->error[] = $maxSystemsError; } @@ -394,20 +400,20 @@ class Map extends Controller\AccessController { // systems || connections missing $missingConfigError = (object) []; $missingConfigError->type = 'error'; - $missingConfigError->message = 'Map data not valid (systems || connections) missing'; + $missingConfigError->text = 'Map data not valid (systems || connections) missing'; $return->error[] = $missingConfigError; } }else{ $unknownMapScope= (object) []; $unknownMapScope->type = 'error'; - $unknownMapScope->message = 'Map scope unknown!'; + $unknownMapScope->text = 'Map scope unknown!'; $return->error[] = $unknownMapScope; } }else{ // map config || systems/connections missing $missingConfigError = (object) []; $missingConfigError->type = 'error'; - $missingConfigError->message = 'Map data not valid (config || data) missing'; + $missingConfigError->text = 'Map data not valid (config || data) missing'; $return->error[] = $missingConfigError; } @@ -416,250 +422,31 @@ class Map extends Controller\AccessController { }else{ $unknownMapType = (object) []; $unknownMapType->type = 'error'; - $unknownMapType->message = 'Map type unknown!'; + $unknownMapType->text = 'Map type unknown!'; $return->error[] = $unknownMapType; } }else{ // map data missing $missingDataError = (object) []; $missingDataError->type = 'error'; - $missingDataError->message = 'Map data missing'; + $missingDataError->text = 'Map data missing'; $return->error[] = $missingDataError; } echo json_encode($return); } - /** - * save a new map or update an existing map - * @param \Base $f3 - * @throws Exception - */ - public function save(\Base $f3){ - $formData = (array)$f3->get('POST.formData'); - - $return = (object) []; - $return->error = []; - - if( isset($formData['id']) ){ - $activeCharacter = $this->getCharacter(); - - /** - * @var $map Pathfinder\MapModel - */ - $map = Pathfinder\AbstractPathfinderModel::getNew('MapModel'); - $map->getById( (int)$formData['id'] ); - - if( - $map->dry() || - $map->hasAccess($activeCharacter) - ){ - try{ - // new map - $map->setData($formData); - $map = $map->save($activeCharacter); - - $mapDefaultConf = Config::getMapsDefaultConfig(); - - // save global map access. Depends on map "type" - if($map->isPrivate()){ - - // share map between characters -> set access - if(isset($formData['mapCharacters'])){ - // remove character (re-add later) - $accessCharacters = array_diff($formData['mapCharacters'], [$activeCharacter->_id]); - - // avoid abuse -> respect share limits - $maxShared = max($mapDefaultConf['private']['max_shared'] - 1, 0); - $accessCharacters = array_slice($accessCharacters, 0, $maxShared); - - // clear map access. In case something has removed from access list - $map->clearAccess(); - - if($accessCharacters){ - /** - * @var $tempCharacter Pathfinder\CharacterModel - */ - $tempCharacter = Pathfinder\AbstractPathfinderModel::getNew('CharacterModel'); - - foreach($accessCharacters as $characterId){ - $tempCharacter->getById( (int)$characterId ); - - if( - !$tempCharacter->dry() && - $tempCharacter->shared == 1 // check if map shared is enabled - ){ - $map->setAccess($tempCharacter); - } - - $tempCharacter->reset(); - } - } - } - - // the current character itself should always have access - // just in case he removed himself :) - $map->setAccess($activeCharacter); - }elseif($map->isCorporation()){ - $corporation = $activeCharacter->getCorporation(); - - if($corporation){ - // the current user has to have a corporation when - // working on corporation maps! - - // share map between corporations -> set access - if(isset($formData['mapCorporations'])){ - // remove character corporation (re-add later) - $accessCorporations = array_diff($formData['mapCorporations'], [$corporation->_id]); - - // avoid abuse -> respect share limits - $maxShared = max($mapDefaultConf['corporation']['max_shared'] - 1, 0); - $accessCorporations = array_slice($accessCorporations, 0, $maxShared); - - // clear map access. In case something has removed from access list - $map->clearAccess(); - - if($accessCorporations){ - /** - * @var $tempCorporation Pathfinder\CorporationModel - */ - $tempCorporation = Pathfinder\AbstractPathfinderModel::getNew('CorporationModel'); - - foreach($accessCorporations as $corporationId){ - $tempCorporation->getById( (int)$corporationId ); - - if( - !$tempCorporation->dry() && - $tempCorporation->shared == 1 // check if map shared is enabled - ){ - $map->setAccess($tempCorporation); - } - - $tempCorporation->reset(); - } - } - } - - // the corporation of the current user should always have access - $map->setAccess($corporation); - } - }elseif($map->isAlliance()){ - $alliance = $activeCharacter->getAlliance(); - - if($alliance){ - // the current user has to have a alliance when - // working on alliance maps! - - // share map between alliances -> set access - if(isset($formData['mapAlliances'])){ - // remove character alliance (re-add later) - $accessAlliances = array_diff($formData['mapAlliances'], [$alliance->_id]); - - // avoid abuse -> respect share limits - $maxShared = max($mapDefaultConf['alliance']['max_shared'] - 1, 0); - $accessAlliances = array_slice($accessAlliances, 0, $maxShared); - - // clear map access. In case something has removed from access list - $map->clearAccess(); - - if($accessAlliances){ - /** - * @var $tempAlliance Pathfinder\AllianceModel - */ - $tempAlliance = Pathfinder\AbstractPathfinderModel::getNew('AllianceModel'); - - foreach($accessAlliances as $allianceId){ - $tempAlliance->getById( (int)$allianceId ); - - if( - !$tempAlliance->dry() && - $tempAlliance->shared == 1 // check if map shared is enabled - ){ - $map->setAccess($tempAlliance); - } - - $tempAlliance->reset(); - } - } - } - - // the alliance of the current user should always have access - $map->setAccess($alliance); - } - } - // reload the same map model (refresh) - // this makes sure all data is up2date - $map->getById($map->_id, 0); - - // broadcast map Access -> and send map Data - $this->broadcastMapAccess($map); - - $return->mapData = $map->getData(); - }catch(Exception\ValidationException $e){ - $return->error[] = $e->getError(); - } - }else{ - // map access denied - $captchaError = (object) []; - $captchaError->type = 'error'; - $captchaError->message = 'Access denied'; - $return->error[] = $captchaError; - } - }else{ - // map id field missing - $idError = (object) []; - $idError->type = 'error'; - $idError->message = 'Map id missing'; - $return->error[] = $idError; - } - - echo json_encode($return); - } - - /** - * delete a map and all dependencies - * @param \Base $f3 - * @throws Exception - */ - public function delete(\Base $f3){ - $mapData = (array)$f3->get('POST.mapData'); - $mapId = (int)$mapData['id']; - $return = (object) []; - $return->deletedMapIds = []; - - if($mapId){ - $activeCharacter = $this->getCharacter(); - - /** - * @var $map Pathfinder\MapModel - */ - $map = Pathfinder\AbstractPathfinderModel::getNew('MapModel'); - $map->getById($mapId); - - if($map->hasAccess($activeCharacter)){ - $map->setActive(false); - $map->save($activeCharacter); - $return->deletedMapIds[] = $mapId; - - // broadcast map delete - $this->broadcastMapDeleted($mapId); - } - } - - echo json_encode($return); - } - /** * broadcast characters with map access rights to WebSocket server * -> if characters with map access found -> broadcast mapData to them * @param Pathfinder\MapModel $map - * @throws Exception + * @throws \Exception */ protected function broadcastMapAccess(Pathfinder\MapModel $map){ $mapAccess = [ 'id' => $map->_id, 'name' => $map->name, - 'characterIds' => array_map(function ($data){ + 'characterIds' => array_map(function($data){ return $data->id; }, $map->getCharactersData()) ]; @@ -667,22 +454,14 @@ class Map extends Controller\AccessController { $this->getF3()->webSocket()->write('mapAccess', $mapAccess); // map has (probably) active connections that should receive map Data - $this->broadcastMap($map); - } - - /** - * broadcast map delete information to clients - * @param int $mapId - */ - protected function broadcastMapDeleted(int $mapId){ - $this->getF3()->webSocket()->write('mapDeleted', $mapId); + $this->broadcastMap($map, true); } /** * get map access tokens for current character * -> send access tokens via TCP Socket for WebSocket auth * @param \Base $f3 - * @throws Exception + * @throws \Exception */ public function getAccessData(\Base $f3){ $return = (object) []; @@ -827,7 +606,7 @@ class Map extends Controller\AccessController { * update map data * -> function is called continuously (trigger) by any active client * @param \Base $f3 - * @throws Exception + * @throws \Exception */ public function updateData(\Base $f3){ $postData = (array)$f3->get('POST'); @@ -851,7 +630,7 @@ class Map extends Controller\AccessController { * onUnload map sync * @see https://developer.mozilla.org/docs/Web/API/Navigator/sendBeacon * @param \Base $f3 - * @throws Exception + * @throws \Exception */ public function updateUnloadData(\Base $f3){ $postData = (array)$f3->get('POST'); @@ -870,7 +649,7 @@ class Map extends Controller\AccessController { * update map data api * -> function is called continuously by any active client * @param \Base $f3 - * @throws Exception + * @throws \Exception */ public function updateUserData(\Base $f3){ $postData = (array)$f3->get('POST'); @@ -941,7 +720,7 @@ class Map extends Controller\AccessController { * @param Pathfinder\CharacterModel $character * @param array $newSystemPositions * @return Pathfinder\MapModel - * @throws Exception + * @throws \Exception */ protected function updateMapByCharacter(Pathfinder\MapModel $map, Pathfinder\CharacterModel $character, array $newSystemPositions = []) : Pathfinder\MapModel { // map changed. update cache (system/connection) changed @@ -1065,7 +844,7 @@ class Map extends Controller\AccessController { ){ // check distance between systems (in jumps) // -> if > 1 it is !very likely! a wormhole - $route = (new Route())->searchRoute($sourceSystem->systemId, $targetSystem->systemId, 1); + $route = (new Controller\Api\Rest\Route())->searchRoute($sourceSystem->systemId, $targetSystem->systemId, 1); if(!$route['routePossible']){ $addSourceSystem = true; @@ -1165,7 +944,7 @@ class Map extends Controller\AccessController { // .. now we need to check jump distance between systems // -> if > 1 it is !very likely! podded jump if(empty($route)){ - $route = (new Route())->searchRoute($sourceSystem->systemId, $targetSystem->systemId, 1); + $route = (new Controller\Api\Rest\Route())->searchRoute($sourceSystem->systemId, $targetSystem->systemId, 1); } if(!$route['routePossible']){ @@ -1207,7 +986,7 @@ class Map extends Controller\AccessController { /** * get connectionData * @param \Base $f3 - * @throws Exception + * @throws \Exception */ public function getConnectionData(\Base $f3){ $postData = (array)$f3->get('POST'); @@ -1258,7 +1037,7 @@ class Map extends Controller\AccessController { /** * get map log data * @param \Base $f3 - * @throws Exception + * @throws \Exception */ public function getLogData(\Base $f3){ $postData = (array)$f3->get('POST'); diff --git a/app/main/controller/api/rest/abstractrestcontroller.php b/app/Controller/Api/Rest/AbstractRestController.php similarity index 93% rename from app/main/controller/api/rest/abstractrestcontroller.php rename to app/Controller/Api/Rest/AbstractRestController.php index 1d0debea..5bf26d22 100644 --- a/app/main/controller/api/rest/abstractrestcontroller.php +++ b/app/Controller/Api/Rest/AbstractRestController.php @@ -6,9 +6,9 @@ * Time: 16:14 */ -namespace Controller\Api\Rest; +namespace Exodus4D\Pathfinder\Controller\Api\Rest; -use Controller; +use Exodus4D\Pathfinder\Controller; abstract class AbstractRestController extends Controller\AccessController { diff --git a/app/main/controller/api/rest/connection.php b/app/Controller/Api/Rest/Connection.php similarity index 60% rename from app/main/controller/api/rest/connection.php rename to app/Controller/Api/Rest/Connection.php index 9c24bfb3..3b430aaf 100644 --- a/app/main/controller/api/rest/connection.php +++ b/app/Controller/Api/Rest/Connection.php @@ -6,12 +6,58 @@ * Time: 12:10 */ -namespace Controller\Api\Rest; +namespace Exodus4D\Pathfinder\Controller\Api\Rest; -use Model\Pathfinder; + +use Exodus4D\Pathfinder\Model\Pathfinder; class Connection extends AbstractRestController { + /** + * @param \Base $f3 + * @param $params + * @throws \Exception + */ + public function get(\Base $f3, $params){ + $requestData = $this->getRequestData($f3); + $connectionIds = array_map('intval', explode(',', (string)$params['id'])); + $addData = (array)$requestData['addData']; + $filterData = (array)$requestData['filterData']; + $connectionData = []; + + if($mapId = (int)$requestData['mapId']){ + $activeCharacter = $this->getCharacter(); + + /** + * @var $map Pathfinder\MapModel + */ + $map = Pathfinder\AbstractPathfinderModel::getNew('MapModel'); + $map->getById($mapId); + + if($map->hasAccess($activeCharacter)){ + $connections = $map->getConnections($connectionIds, 'wh'); + foreach($connections as $connection){ + $check = true; + $data = $connection->getData(in_array('signatures', $addData), in_array('logs', $addData)); + // filter result + if(in_array('signatures', $filterData) && !$data->signatures){ + $check = false; + } + + if(in_array('logs', $filterData) && !$data->logs){ + $check = false; + } + + if($check){ + $connectionData[] = $data; + } + } + } + } + + $this->out($connectionData); + } + /** * save a new connection or updates an existing (drag/drop) between two systems * if a connection is changed (drag&drop) to another system. -> this function is called for update @@ -47,10 +93,16 @@ class Connection extends AbstractRestController { $connection->mapId = $map; $connection->source = $source; $connection->target = $target; - $connection->copyfrom($connectionData, ['scope', 'type']); - // change the default type for the new connection - $connection->setDefaultTypeData(); + // if scope + type data send -> use them ... + if($requestData['scope'] && !empty($requestData['type'])){ + $connection->copyfrom($requestData, ['scope', 'type']); + } + + // ... set/change default scope + type + if(!$requestData['disableAutoScope']){ + $connection->setAutoScopeAndType(); + } if($connection->save($activeCharacter)){ $connectionData = $connection->getData(); diff --git a/app/main/controller/api/rest/log.php b/app/Controller/Api/Rest/Log.php similarity index 96% rename from app/main/controller/api/rest/log.php rename to app/Controller/Api/Rest/Log.php index 8b872f0c..9696ce00 100644 --- a/app/main/controller/api/rest/log.php +++ b/app/Controller/Api/Rest/Log.php @@ -6,9 +6,10 @@ * Time: 15:28 */ -namespace Controller\Api\Rest; +namespace Exodus4D\Pathfinder\Controller\Api\Rest; -use Model\Pathfinder; + +use Exodus4D\Pathfinder\Model\Pathfinder; class Log extends AbstractRestController { diff --git a/app/Controller/Api/Rest/Map.php b/app/Controller/Api/Rest/Map.php new file mode 100644 index 00000000..05c64cc7 --- /dev/null +++ b/app/Controller/Api/Rest/Map.php @@ -0,0 +1,239 @@ +getRequestData($f3); + + /** + * @var $map Pathfinder\MapModel + */ + $map = Pathfinder\AbstractPathfinderModel::getNew('MapModel'); + $mapData = $this->update($map, $requestData)->getData(); + + $this->out($mapData); + } + + /** + * @param \Base $f3 + * @param $params + * @throws \Exception + */ + public function patch(\Base $f3, $params){ + $requestData = $this->getRequestData($f3); + $mapData = []; + + if($mapId = (int)$params['id']){ + $activeCharacter = $this->getCharacter(); + + /** + * @var $map Pathfinder\MapModel + */ + $map = Pathfinder\AbstractPathfinderModel::getNew('MapModel'); + $map->getById($mapId); + if($map->hasAccess($activeCharacter)){ + $mapData = $this->update($map, $requestData)->getData(true); + } + } + + $this->out($mapData); + } + + /** + * @param \Base $f3 + * @param $params + * @throws \Exception + */ + public function delete(\Base $f3, $params){ + $deletedMapIds = []; + + if($mapId = (int)$params['id']){ + $activeCharacter = $this->getCharacter(); + + /** + * @var $map Pathfinder\MapModel + */ + $map = Pathfinder\AbstractPathfinderModel::getNew('MapModel'); + $map->getById($mapId); + + if($map->hasAccess($activeCharacter)){ + // check if character has delete right for map type + $hasRight = true; + if($map->isCorporation()){ + if($corpRight = $activeCharacter->getCorporation()->getRights(['map_delete'])){ + if($corpRight[0]->get('roleId', true) !== $activeCharacter->get('roleId', true)){ + $hasRight = false; + } + } + } + + if($hasRight){ + $map->setActive(false); + $map->save($activeCharacter); + $deletedMapIds[] = $mapId; + // broadcast map delete + $this->broadcastMapDeleted($mapId); + }else{ + $f3->set('HALT', true); + $f3->error(401, sprintf(self::ERROR_MAP_DELETE, $activeCharacter->name)); + } + } + } + + $this->out($deletedMapIds); + } + + /** + * @param Pathfinder\MapModel $map + * @param array $mapData + * @return Pathfinder\MapModel + * @throws \Exception + */ + private function update(Pathfinder\MapModel $map, array $mapData) : Pathfinder\MapModel { + $activeCharacter = $this->getCharacter(); + + $map->setData($mapData); + $typeChange = $map->changed('typeId'); + $map->save($activeCharacter); + + // save global map access. Depends on map "type" -------------------------------------------------------------- + /** + * @param Pathfinder\AbstractPathfinderModel $primaryModel + * @param array|null $modelIds + * @param int $maxShared + * @return int + */ + $setMapAccess = function(Pathfinder\AbstractPathfinderModel &$primaryModel, ?array $modelIds = [], int $maxShared = 3) use (&$map) : int { + $added = 0; + $deleted = 0; + if(is_array($modelIds)){ + // remove primaryModel id (-> re-add later) + $modelIds = array_diff(array_map('intval', $modelIds), [$primaryModel->_id]); + + // avoid abuse -> respect share limits (-1 is because the primaryModel has also access) + $modelIds = array_slice($modelIds, 0, max($maxShared - 1, 0)); + + // add the primaryModel id back (again) + $modelIds[] = $primaryModel->_id; + + // clear map access for entities that do not match the map "mapType" + $deleted += $map->clearAccessByType(); + + $compare = $map->compareAccess($modelIds); + + foreach((array)$compare['old'] as $modelId) { + $deleted += $map->removeFromAccess($modelId); + } + + $modelClass = (new \ReflectionClass($primaryModel))->getShortName(); + $tempModel = Pathfinder\AbstractPathfinderModel::getNew($modelClass); + foreach((array)$compare['new'] as $modelId) { + $tempModel->getById($modelId); + if( + $tempModel->valid() && + ( + $modelId == $primaryModel->_id || // primary model has always access (regardless of "shared" value) + $tempModel->shared == 1 // check if map shared is enabled + ) + ){ + $added += (int)$map->setAccess($tempModel); + } + + $tempModel->reset(); + } + } + return $added + $deleted; + }; + + $accessChangeCount = 0; + $mapDefaultConf = Config::getMapsDefaultConfig(); + if($map->isPrivate()){ + $accessChangeCount = $setMapAccess( + $activeCharacter, + $typeChange ? [$activeCharacter->_id] : $mapData['mapCharacters'], + (int)$mapDefaultConf['private']['max_shared'] + ); + }elseif($map->isCorporation()){ + if($corporation = $activeCharacter->getCorporation()){ + $accessChangeCount = $setMapAccess( + $corporation, + $typeChange ? [$corporation->_id] : $mapData['mapCorporations'], + (int)$mapDefaultConf['corporation']['max_shared'] + ); + } + }elseif($map->isAlliance()){ + if($alliance = $activeCharacter->getAlliance()){ + $accessChangeCount = $setMapAccess( + $alliance, + $typeChange ? [$alliance->_id] : $mapData['mapAlliances'], + (int)$mapDefaultConf['alliance']['max_shared'] + ); + } + } + + if($accessChangeCount){ + $map->touch('updated'); + $map->save($activeCharacter); + } + + // reload the same map model (refresh) + // this makes sure all data is up2date + $map->getById($map->_id, 0); + + // broadcast map Access -> and send map Data + $this->broadcastMapAccess($map); + + return $map; + } + + /** + * broadcast characters with map access rights to WebSocket server + * -> if characters with map access found -> broadcast mapData to them + * @param Pathfinder\MapModel $map + * @throws \Exception + */ + protected function broadcastMapAccess(Pathfinder\MapModel $map){ + $mapAccess = [ + 'id' => $map->_id, + 'name' => $map->name, + 'characterIds' => array_map(function($data){ + return $data->id; + }, $map->getCharactersData()) + ]; + + $this->getF3()->webSocket()->write('mapAccess', $mapAccess); + + // map has (probably) active connections that should receive map Data + $this->broadcastMap($map, true); + } + + /** + * broadcast map delete information to clients + * @param int $mapId + */ + private function broadcastMapDeleted(int $mapId){ + $this->getF3()->webSocket()->write('mapDeleted', $mapId); + } +} \ No newline at end of file diff --git a/app/main/controller/api/route.php b/app/Controller/Api/Rest/Route.php similarity index 85% rename from app/main/controller/api/route.php rename to app/Controller/Api/Rest/Route.php index a19fe354..af7998a4 100644 --- a/app/main/controller/api/route.php +++ b/app/Controller/Api/Rest/Route.php @@ -1,24 +1,20 @@ getSystemData($row[$systemSourceKey])) ){ $jumpData[$row[$systemSourceKey]] = [ - 'systemId' => (int)$row[$systemSourceKey], - 'systemName' => $staticData->name, - 'constellationId' => $staticData->constellation->id, - 'regionId' => $staticData->constellation->region->id, - 'trueSec' => $staticData->trueSec, + 'systemId' => (int)$row[$systemSourceKey], + 'systemName' => $staticData->name, + 'constellationId' => $staticData->constellation->id, + 'regionId' => $staticData->constellation->region->id, + 'trueSec' => $staticData->trueSec, ]; } @@ -247,20 +249,70 @@ class Route extends Controller\AccessController { $enrichJumpData($rows[$i], 'systemTargetId', 'systemSourceId'); } - // update jump data for this instance $this->updateJumpData($jumpData); } } } } + /** + * set current Thera connections jump data for this instance + * -> Connected wormholes pulled from eve-scout.com + */ + private function setTheraJumpData(){ + if(!$this->getF3()->exists(self::CACHE_KEY_THERA_JUMP_DATA, $jumpData)){ + $jumpData = []; + $connectionsData = $this->getF3()->eveScoutClient()->send('getTheraConnections'); + + if(!empty($connectionsData) && !isset($connectionsData['error'])){ + /** + * map Thera jump data to Pathfinder format + * @param array $row + * @param string $systemSourceKey + * @param string $systemTargetKey + */ + $enrichJumpData = function(array &$row, string $systemSourceKey, string $systemTargetKey) use (&$jumpData) { + // check if response data is valid + if( + is_object($systemSource = $row[$systemSourceKey]) && !empty((array)$systemSource) && + is_object($systemTarget = $row[$systemTargetKey]) && !empty((array)$systemTarget) + ){ + if(!array_key_exists($systemSource->id, $jumpData)){ + $jumpData[$systemSource->id] = [ + 'systemId' => (int)$systemSource->id, + 'systemName' => $systemSource->name, + 'constellationId' => (int)$systemSource->constellationID, + 'regionId' => (int)$systemSource->regionId, + 'trueSec' => $systemSource->security, + ]; + } + + if( !in_array((int)$systemTarget->id, (array)$jumpData[$systemSource->id]['jumpNodes']) ){ + $jumpData[$systemSource->id]['jumpNodes'][] = (int)$systemTarget->id; + } + } + }; + + foreach((array)$connectionsData['connections'] as $connectionData){ + $enrichJumpData($connectionData, 'source', 'target'); + $enrichJumpData($connectionData, 'target', 'source'); + } + + if(!empty($jumpData)){ + $this->getF3()->set(self::CACHE_KEY_THERA_JUMP_DATA, $jumpData, $this->theraJumpDataCacheTime); + } + } + } + + $this->updateJumpData($jumpData); + } + /** * update jump data for this instance * -> data is either coming from CCPs [SDE] OR from map specific data * @param array $rows */ private function updateJumpData(&$rows = []){ - foreach($rows as &$row){ $regionId = (int)$row['regionId']; $constId = (int)$row['constellationId']; @@ -285,7 +337,7 @@ class Route extends Controller\AccessController { if( !is_array($this->jumpArray[$systemId]) ){ $this->jumpArray[$systemId] = []; } - $this->jumpArray[$systemId] = array_merge($row['jumpNodes'], $this->jumpArray[$systemId]); + $this->jumpArray[$systemId] = array_merge((array)$row['jumpNodes'], $this->jumpArray[$systemId]); // add systemName to end (if not already there) if(end($this->jumpArray[$systemId]) != $systemName){ @@ -448,7 +500,7 @@ class Route extends Controller\AccessController { // Endpoint return http:404 in case no route find (e.g. from inside a wh) // we thread that error "no route found" as a valid response! -> no fallback to custom search - if( !empty($routeData['error']) && strtolower($routeData['error']) !== 'no route found' ){ + if(!empty($routeData['error']) && strtolower($routeData['error']) !== 'no route found'){ // ESI route search has errors -> fallback to custom search implementation $routeData = $this->searchRouteCustom($systemFromId, $systemToId, $searchDepth, $mapIds, $filterData); } @@ -484,6 +536,11 @@ class Route extends Controller\AccessController { // add map specific data $this->setDynamicJumpData($mapIds, $filterData); + // add current Thera connections data + if($filterData['wormholesThera']){ + $this->setTheraJumpData(); + } + // filter jump data (e.g. remove some systems (0.0, LS) // --> don´t filter some systems (e.g. systemFrom, systemTo) even if they are are WH,LS,0.0 $this->filterJumpData($filterData, [$systemFromId, $systemToId]); @@ -494,10 +551,10 @@ class Route extends Controller\AccessController { $jumpNum = 0; $depthSearched = 0; - if( isset($this->jumpArray[$systemFromId]) ){ + if(isset($this->jumpArray[$systemFromId])){ // check if the system we are looking for is a direct neighbour - foreach( $this->jumpArray[$systemFromId] as $n ) { - if ($n == $systemToId) { + foreach($this->jumpArray[$systemFromId] as $n){ + if($n == $systemToId){ $jumpNum = 2; $routeData['route'][] = $this->getJumpNodeData($n); break; @@ -505,23 +562,23 @@ class Route extends Controller\AccessController { } // system is not a direct neighbour -> search recursive its neighbours - if ($jumpNum == 0) { + if($jumpNum == 0){ $searchResult = $this->graph_find_path( $this->jumpArray, $systemFromId, $systemToId, $searchDepth ); $depthSearched = $searchResult['depth']; - foreach( $searchResult['path'] as $systemId ) { - if ($jumpNum > 0) { + foreach($searchResult['path'] as $systemId){ + if($jumpNum > 0){ $routeData['route'][] = $this->getJumpNodeData($systemId); } $jumpNum++; } } - if ($jumpNum > 0) { + if($jumpNum > 0){ // route found $routeData['routePossible'] = true; // insert "from" system on top array_unshift($routeData['route'], $this->getJumpNodeData($systemFromId)); - } else { + }else{ // route not found $routeData['routePossible'] = false; } @@ -566,6 +623,11 @@ class Route extends Controller\AccessController { // add map specific data $this->setDynamicJumpData($mapIds, $filterData); + // add current Thera connections data + if($filterData['wormholesThera']){ + $this->setTheraJumpData(); + } + // filter jump data (e.g. remove some systems (0.0, LS) // --> don´t filter some systems (e.g. systemFrom, systemTo) even if they are are WH,LS,0.0 $this->filterJumpData($filterData, [$systemFromId, $systemToId]); @@ -576,7 +638,7 @@ class Route extends Controller\AccessController { if($count > 1){ // ... should always > 1 // loop all connections for current source system - foreach($jumpData as $systemTargetId) { + foreach($jumpData as $systemTargetId){ // skip last entry if(--$count <= 0){ break; @@ -606,7 +668,7 @@ class Route extends Controller\AccessController { 'connections' => $connections ]; - $result = $this->getF3()->ccpClient()->getRouteData($systemFromId, $systemToId, $options); + $result = $this->getF3()->ccpClient()->send('getRoute', $systemFromId, $systemToId, $options); // format result ------------------------------------------------------------------------------------------ @@ -660,9 +722,7 @@ class Route extends Controller\AccessController { ]; $keyParts += $filterData; - $key = 'route_' . hash('md5', implode('_', $keyParts)); - - return $key; + return 'route_' . hash('md5', implode('_', $keyParts)); } /** @@ -670,8 +730,8 @@ class Route extends Controller\AccessController { * @param \Base $f3 * @throws \Exception */ - public function search($f3){ - $requestData = (array)$f3->get('POST'); + public function post(\Base $f3){ + $requestData = $this->getRequestData($f3); $activeCharacter = $this->getCharacter(); @@ -736,6 +796,7 @@ class Route extends Controller\AccessController { 'wormholesReduced' => (bool) $routeData['wormholesReduced'], 'wormholesCritical' => (bool) $routeData['wormholesCritical'], 'wormholesEOL' => (bool) $routeData['wormholesEOL'], + 'wormholesThera' => (bool) $routeData['wormholesThera'], 'wormholesSizeMin' => (string) $routeData['wormholesSizeMin'], 'excludeTypes' => (array) $routeData['excludeTypes'], 'endpointsBubble' => (bool) $routeData['endpointsBubble'], @@ -791,21 +852,6 @@ class Route extends Controller\AccessController { } } - echo json_encode($return); + $this->out($return); } - - -} - - - - - - - - - - - - - +} \ No newline at end of file diff --git a/app/main/controller/api/rest/signature.php b/app/Controller/Api/Rest/Signature.php similarity index 98% rename from app/main/controller/api/rest/signature.php rename to app/Controller/Api/Rest/Signature.php index 92a0db71..e928d9c0 100644 --- a/app/main/controller/api/rest/signature.php +++ b/app/Controller/Api/Rest/Signature.php @@ -6,10 +6,10 @@ * Time: 16:20 */ -namespace Controller\Api\Rest; +namespace Exodus4D\Pathfinder\Controller\Api\Rest; -use Model\Pathfinder; +use Exodus4D\Pathfinder\Model\Pathfinder; class Signature extends AbstractRestController { diff --git a/app/main/controller/api/rest/signaturehistory.php b/app/Controller/Api/Rest/SignatureHistory.php similarity index 97% rename from app/main/controller/api/rest/signaturehistory.php rename to app/Controller/Api/Rest/SignatureHistory.php index f431687b..ffaf2de5 100644 --- a/app/main/controller/api/rest/signaturehistory.php +++ b/app/Controller/Api/Rest/SignatureHistory.php @@ -6,11 +6,11 @@ * Time: 16:44 */ -namespace Controller\Api\Rest; +namespace Exodus4D\Pathfinder\Controller\Api\Rest; -use Model\Pathfinder; -use lib\Config; +use Exodus4D\Pathfinder\Model\Pathfinder; +use Exodus4D\Pathfinder\Lib\Config; class SignatureHistory extends AbstractRestController { diff --git a/app/main/controller/api/rest/structure.php b/app/Controller/Api/Rest/Structure.php similarity index 97% rename from app/main/controller/api/rest/structure.php rename to app/Controller/Api/Rest/Structure.php index b100d77e..19ea8ecb 100644 --- a/app/main/controller/api/rest/structure.php +++ b/app/Controller/Api/Rest/Structure.php @@ -6,10 +6,10 @@ * Time: 23:29 */ -namespace Controller\Api\Rest; +namespace Exodus4D\Pathfinder\Controller\Api\Rest; -use Model\Pathfinder; +use Exodus4D\Pathfinder\Model\Pathfinder; class Structure extends AbstractRestController { diff --git a/app/main/controller/api/rest/system.php b/app/Controller/Api/Rest/System.php similarity index 98% rename from app/main/controller/api/rest/system.php rename to app/Controller/Api/Rest/System.php index 4a5983a8..efceae2d 100644 --- a/app/main/controller/api/rest/system.php +++ b/app/Controller/Api/Rest/System.php @@ -6,10 +6,10 @@ * Time: 12:34 */ -namespace Controller\Api\Rest; +namespace Exodus4D\Pathfinder\Controller\Api\Rest; -use Model\Pathfinder; +use Exodus4D\Pathfinder\Model\Pathfinder; class System extends AbstractRestController { diff --git a/app/main/controller/api/system.php b/app/Controller/Api/Rest/SystemGraph.php similarity index 52% rename from app/main/controller/api/system.php rename to app/Controller/Api/Rest/SystemGraph.php index bf87bfb9..b84a7905 100644 --- a/app/main/controller/api/system.php +++ b/app/Controller/Api/Rest/SystemGraph.php @@ -1,40 +1,28 @@ getRequestData($f3); + $systemIds = (array)$requestData['systemIds']; $graphsData = []; - $systemIds = (array)$f3->get('GET.systemIds'); // valid response (data found) should be cached by server + client $cacheResponse = false; @@ -108,84 +96,17 @@ class System extends Controller\AccessController { $f3->expire(Config::ttlLeft($exists, $ttl)); } - echo json_encode($graphsData); + $this->out($graphsData); } + // ---------------------------------------------------------------------------------------------------------------- + /** - * set destination for system, station or structure - * @param \Base $f3 - * @throws \Exception + * get system graph cache key + * @param int $systemId + * @return string */ - public function setDestination(\Base $f3){ - $postData = (array)$f3->get('POST'); - - $return = (object) []; - $return->error = []; - $return->destData = []; - - if(!empty($destData = (array)$postData['destData'])){ - $activeCharacter = $this->getCharacter(); - - $return->clearOtherWaypoints = (bool)$postData['clearOtherWaypoints']; - $return->first = (bool)$postData['first']; - - if($accessToken = $activeCharacter->getAccessToken()){ - $options = [ - 'clearOtherWaypoints' => $return->clearOtherWaypoints, - 'addToBeginning' => $return->first, - ]; - - foreach($destData as $data){ - $response = $f3->ccpClient()->setWaypoint((int)$data['id'], $accessToken, $options); - - if(empty($response)){ - $return->destData[] = $data; - }else{ - $error = (object) []; - $error->type = 'error'; - $error->message = $response['error']; - $return->error[] = $error; - } - } - - } - } - - echo json_encode($return); + protected function getSystemGraphCacheKey(int $systemId): string { + return sprintf(self::CACHE_KEY_GRAPH, 'SYSTEM_' . $systemId); } - - /** - * send Rally Point poke - * @param \Base $f3 - * @throws \Exception - */ - public function pokeRally(\Base $f3){ - $rallyData = (array)$f3->get('POST'); - $systemId = (int)$rallyData['systemId']; - $return = (object) []; - - if($systemId){ - $activeCharacter = $this->getCharacter(); - - /** - * @var $system Pathfinder\SystemModel - */ - $system = Pathfinder\AbstractPathfinderModel::getNew('SystemModel'); - $system->getById($systemId); - - if($system->hasAccess($activeCharacter)){ - $rallyData['pokeDesktop'] = $rallyData['pokeDesktop'] === '1'; - $rallyData['pokeMail'] = $rallyData['pokeMail'] === '1'; - $rallyData['pokeSlack'] = $rallyData['pokeSlack'] === '1'; - $rallyData['pokeDiscord'] = $rallyData['pokeDiscord'] === '1'; - $rallyData['message'] = trim($rallyData['message']); - - $system->sendRallyPoke($rallyData, $activeCharacter); - } - } - - echo json_encode($return); - } - -} - +} \ No newline at end of file diff --git a/app/Controller/Api/Rest/SystemThera.php b/app/Controller/Api/Rest/SystemThera.php new file mode 100644 index 00000000..d428ca8b --- /dev/null +++ b/app/Controller/Api/Rest/SystemThera.php @@ -0,0 +1,131 @@ +exists(self::CACHE_KEY_THERA_CONNECTIONS, $connectionsData)){ + $connectionsData = $this->getEveScoutTheraConnections(); + $f3->set(self::CACHE_KEY_THERA_CONNECTIONS, $connectionsData, $ttl); + } + + $f3->expire(Config::ttlLeft($exists, $ttl)); + + $this->out($connectionsData); + } + + /** + * get Thera connections data from EveScout API + * -> map response to Pathfinder format + * @return array + */ + protected function getEveScoutTheraConnections() : array { + $connectionsData = []; + + /** + * map system data from eveScout response to Pathfinder´s 'system' format + * @param string $key + * @param array $eveScoutConnection + * @param array $connectionData + */ + $enrichWithSystemData = function(string $key, array $eveScoutConnection, array &$connectionData) : void { + $eveScoutSystem = (array)$eveScoutConnection[$key]; + $systemData = [ + 'id' => (int)$eveScoutSystem['id'], + 'name' => (string)$eveScoutSystem['name'], + 'trueSec' => round((float)$eveScoutSystem['security'], 4) + ]; + if(!empty($eveScoutSystem['constellationID'])){ + $systemData['constellation'] = ['id' => (int)$eveScoutSystem['constellationID']]; + } + if(!empty($region = (array)$eveScoutSystem['region']) && !empty($region['id'])){ + $systemData['region'] = ['id' => (int)$region['id'], 'name' => (string)$region['name']]; + } + $connectionData[$key] = $systemData; + }; + + /** + * @param string $key + * @param array $eveScoutConnection + * @param array $connectionData + */ + $enrichWithSignatureData = function(string $key, array $eveScoutConnection, array &$connectionData) : void { + $eveScoutSignature = (array)$eveScoutConnection[$key]; + $signatureData = [ + 'name' => $eveScoutSignature['name'] ? : null + ]; + if(!empty($sigType = (array)$eveScoutSignature['type']) && !empty($sigType['name'])){ + $signatureData['type'] = ['name' => strtoupper((string)$sigType['name'])]; + } + $connectionData[$key] = $signatureData; + }; + + /** + * map wormhole data from eveScout to Pathfinder´s connection format + * @param array $wormholeData + * @param array $connectionsData + */ + $enrichWithWormholeData = function(array $wormholeData, array &$connectionsData) : void { + $type = []; + if($wormholeData['mass'] === 'reduced'){ + $type[] = 'wh_reduced'; + }else if($wormholeData['mass'] === 'critical'){ + $type[] = 'wh_critical'; + }else{ + $type[] = 'wh_fresh'; + } + + if($wormholeData['eol'] === 'critical'){ + $type[] = 'wh_eol'; + } + $connectionsData['type'] = $type; + $connectionsData['estimatedEol'] = $wormholeData['estimatedEol']; + }; + + $eveScoutResponse = $this->getF3()->eveScoutClient()->send('getTheraConnections'); + if(!empty($eveScoutResponse) && !isset($eveScoutResponse['error'])){ + foreach((array)$eveScoutResponse['connections'] as $eveScoutConnection){ + if( + $eveScoutConnection['type'] === 'wormhole' && + isset($eveScoutConnection['source']) && isset($eveScoutConnection['target']) + ){ + try{ + $data = [ + 'id' => (int)$eveScoutConnection['id'], + 'scope' => 'wh', + 'created' => [ + 'created' => (new \DateTime($eveScoutConnection['created']))->getTimestamp(), + 'character' => (array)$eveScoutConnection['character'] + ], + 'updated' => (new \DateTime($eveScoutConnection['updated']))->getTimestamp() + ]; + $enrichWithWormholeData((array)$eveScoutConnection['wormhole'], $data); + $enrichWithSystemData('source', $eveScoutConnection, $data); + $enrichWithSystemData('target', $eveScoutConnection, $data); + $enrichWithSignatureData('sourceSignature', $eveScoutConnection, $data); + $enrichWithSignatureData('targetSignature', $eveScoutConnection, $data); + $connectionsData[] = $data; + }catch(\Exception $e){ + // new \DateTime Exception -> skip this data + } + } + } + } + + return $connectionsData; + } +} \ No newline at end of file diff --git a/app/main/controller/api/setup.php b/app/Controller/Api/Setup.php similarity index 97% rename from app/main/controller/api/setup.php rename to app/Controller/Api/Setup.php index 8076a9cf..31f85c78 100644 --- a/app/main/controller/api/setup.php +++ b/app/Controller/Api/Setup.php @@ -6,12 +6,13 @@ * Time: 14:17 */ -namespace Controller\Api; +namespace Exodus4D\Pathfinder\Controller\Api; -use Controller; -use lib\Config; -use lib\Cron; -use Model; +use Exodus4D\Pathfinder\Lib\Config; +use Exodus4D\Pathfinder\Lib\Cron; +use Exodus4D\Pathfinder\Lib\Format\Number; +use Exodus4D\Pathfinder\Controller; +use Exodus4D\Pathfinder\Model; class Setup extends Controller\Controller { @@ -91,7 +92,7 @@ class Setup extends Controller\Controller { ], 'tplCounter' => $this->counter(), 'tplConvertBytes' => function(){ - return call_user_func_array([\lib\format\Number::instance(), 'bytesToString'], func_get_args()); + return call_user_func_array([Number::instance(), 'bytesToString'], func_get_args()); } ]; return \Template::instance()->render('templates/ui/cron_table_row.html', null, $tplData, 0); diff --git a/app/main/controller/api/statistic.php b/app/Controller/Api/Statistic.php similarity index 98% rename from app/main/controller/api/statistic.php rename to app/Controller/Api/Statistic.php index e8fed3b8..79688023 100644 --- a/app/main/controller/api/statistic.php +++ b/app/Controller/Api/Statistic.php @@ -6,11 +6,11 @@ * Time: 00:29 */ -namespace controller\api; +namespace Exodus4D\Pathfinder\Controller\Api; -use Controller; -use lib\Config; -use Model\Pathfinder\CharacterModel; +use Exodus4D\Pathfinder\Lib\Config; +use Exodus4D\Pathfinder\Controller; +use Exodus4D\Pathfinder\Model\Pathfinder\CharacterModel; class Statistic extends Controller\AccessController { diff --git a/app/Controller/Api/System.php b/app/Controller/Api/System.php new file mode 100644 index 00000000..8368d1b5 --- /dev/null +++ b/app/Controller/Api/System.php @@ -0,0 +1,94 @@ +get('POST'); + + $return = (object) []; + $return->error = []; + $return->destData = []; + + if(!empty($destData = (array)$postData['destData'])){ + $activeCharacter = $this->getCharacter(); + + $return->clearOtherWaypoints = (bool)$postData['clearOtherWaypoints']; + $return->first = (bool)$postData['first']; + + if($accessToken = $activeCharacter->getAccessToken()){ + $options = [ + 'clearOtherWaypoints' => $return->clearOtherWaypoints, + 'addToBeginning' => $return->first, + ]; + + foreach($destData as $data){ + $response = $f3->ccpClient()->send('setWaypoint', (int)$data['id'], $accessToken, $options); + + if(empty($response)){ + $return->destData[] = $data; + }else{ + $error = (object) []; + $error->type = 'error'; + $error->text = $response['error']; + $return->error[] = $error; + } + } + + } + } + + echo json_encode($return); + } + + /** + * send Rally Point poke + * @param \Base $f3 + * @throws \Exception + */ + public function pokeRally(\Base $f3){ + $rallyData = (array)$f3->get('POST'); + $systemId = (int)$rallyData['systemId']; + $return = (object) []; + + if($systemId){ + $activeCharacter = $this->getCharacter(); + + /** + * @var $system Pathfinder\SystemModel + */ + $system = Pathfinder\AbstractPathfinderModel::getNew('SystemModel'); + $system->getById($systemId); + + if($system->hasAccess($activeCharacter)){ + $rallyData['pokeDesktop'] = $rallyData['pokeDesktop'] === '1'; + $rallyData['pokeMail'] = $rallyData['pokeMail'] === '1'; + $rallyData['pokeSlack'] = $rallyData['pokeSlack'] === '1'; + $rallyData['pokeDiscord'] = $rallyData['pokeDiscord'] === '1'; + $rallyData['message'] = trim($rallyData['message']); + + $system->sendRallyPoke($rallyData, $activeCharacter); + } + } + + echo json_encode($return); + } + +} + diff --git a/app/main/controller/api/universe.php b/app/Controller/Api/Universe.php similarity index 96% rename from app/main/controller/api/universe.php rename to app/Controller/Api/Universe.php index 95156955..907cb62d 100644 --- a/app/main/controller/api/universe.php +++ b/app/Controller/Api/Universe.php @@ -6,11 +6,11 @@ * Time: 15:49 */ -namespace Controller\Api; +namespace Exodus4D\Pathfinder\Controller\Api; -use Controller; -use Controller\Ccp as Ccp; -use Model; +use Exodus4D\Pathfinder\Controller; +use Exodus4D\Pathfinder\Controller\Ccp as Ccp; +use Exodus4D\Pathfinder\Model; class Universe extends Controller\AccessController { diff --git a/app/main/controller/api/user.php b/app/Controller/Api/User.php similarity index 90% rename from app/main/controller/api/user.php rename to app/Controller/Api/User.php index 1a132dc0..36886452 100644 --- a/app/main/controller/api/user.php +++ b/app/Controller/Api/User.php @@ -6,13 +6,13 @@ * Time: 20:50 */ -namespace Controller\Api; +namespace Exodus4D\Pathfinder\Controller\Api; -use Controller; -use lib\Config; -use Model\Pathfinder; -use Exception; +use Exodus4D\Pathfinder\Lib\Config; +use Exodus4D\Pathfinder\Controller; +use Exodus4D\Pathfinder\Model\Pathfinder; +use Exodus4D\Pathfinder\Exception; class User extends Controller\Controller{ @@ -46,7 +46,7 @@ class User extends Controller\Controller{ * login a valid character * @param Pathfinder\CharacterModel $character * @return bool - * @throws Exception + * @throws \Exception */ protected function loginByCharacter(Pathfinder\CharacterModel &$character) : bool { $login = false; @@ -113,7 +113,7 @@ class User extends Controller\Controller{ * validate cookie character information * -> return character data (if valid) * @param \Base $f3 - * @throws Exception + * @throws \Exception */ public function getCookieCharacter(\Base $f3){ $data = $f3->get('POST'); @@ -140,7 +140,7 @@ class User extends Controller\Controller{ }else{ $characterError = (object) []; $characterError->type = 'warning'; - $characterError->message = 'This can happen through "invalid cookies(SSO)", "login restrictions", "ESI problems".'; + $characterError->text = 'This can happen through "invalid cookies(SSO)", "login restrictions", "ESI problems".'; $return->error[] = $characterError; } } @@ -184,7 +184,7 @@ class User extends Controller\Controller{ }else{ $captchaError = (object) []; $captchaError->type = 'error'; - $captchaError->message = 'Could not create captcha image'; + $captchaError->text = 'Could not create captcha image'; $return->error[] = $captchaError; } @@ -194,17 +194,20 @@ class User extends Controller\Controller{ /** * log the current user out + clear character system log data * @param \Base $f3 - * @throws Exception + * @throws \Exception */ public function logout(\Base $f3){ - $this->logoutCharacter($f3, false, true, true, true); + $data = $f3->get('POST'); + $deleteCookie = (bool)$data['deleteCookie']; + + $this->logoutCharacter($f3, false, true, true, $deleteCookie, 200); } /** * remote open ingame information window (character, corporation or alliance) Id * -> the type is auto-recognized by CCP * @param \Base $f3 - * @throws Exception + * @throws \Exception */ public function openIngameWindow(\Base $f3){ $data = $f3->get('POST'); @@ -215,14 +218,14 @@ class User extends Controller\Controller{ if( $targetId = (int)$data['targetId']){ $activeCharacter = $this->getCharacter(); - $response = $f3->ccpClient()->openWindow($targetId, $activeCharacter->getAccessToken()); + $response = $f3->ccpClient()->send('openWindow', $targetId, $activeCharacter->getAccessToken()); if(empty($response)){ $return->targetId = $targetId; }else{ $error = (object) []; $error->type = 'error'; - $error->message = $response['error']; + $error->text = $response['error']; $return->error[] = $error; } } @@ -235,12 +238,12 @@ class User extends Controller\Controller{ * -> a fresh user automatically generated on first login with a new character * -> see SSO login * @param \Base $f3 - * @throws Exception + * @throws \Exception */ public function saveAccount(\Base $f3){ $data = $f3->get('POST'); - $return = (object) []; + $return = (object)[]; $return->error = []; $captcha = $f3->get(self::SESSION_CAPTCHA_ACCOUNT_UPDATE); @@ -250,7 +253,7 @@ class User extends Controller\Controller{ $newUserData = null; - if( isset($data['formData']) ){ + if(isset($data['formData'])){ $formData = $data['formData']; try{ @@ -258,18 +261,12 @@ class User extends Controller\Controller{ $user = $activeCharacter->getUser(); // captcha is send -> check captcha --------------------------------------------------------------- - if( - isset($formData['captcha']) && - !empty($formData['captcha']) - ){ + if(isset($formData['captcha']) && !empty($formData['captcha'])){ if($formData['captcha'] === $captcha){ // change/set sensitive user data requires captcha! // set username - if( - isset($formData['name']) && - !empty($formData['name']) - ){ + if(isset($formData['name']) && !empty($formData['name'])){ $user->name = $formData['name']; } @@ -290,9 +287,9 @@ class User extends Controller\Controller{ }else{ // captcha was send but not valid -> return error - $captchaError = (object) []; + $captchaError = (object)[]; $captchaError->type = 'error'; - $captchaError->message = 'Captcha does not match'; + $captchaError->text = 'Captcha does not match'; $return->error[] = $captchaError; } } @@ -348,7 +345,7 @@ class User extends Controller\Controller{ /** * delete current user account from DB * @param \Base $f3 - * @throws Exception + * @throws \Exception */ public function deleteAccount(\Base $f3){ $data = $f3->get('POST.formData'); @@ -373,14 +370,14 @@ class User extends Controller\Controller{ sprintf(self::LOG_DELETE_ACCOUNT, $user->id, $user->name) ); - $this->logoutCharacter($f3, true, true, true, true); + $this->logoutCharacter($f3, true, true, true, true, 200); $user->erase(); } }else{ // captcha not valid -> return error $captchaError = (object) []; $captchaError->type = 'error'; - $captchaError->message = 'Captcha does not match'; + $captchaError->text = 'Captcha does not match'; $return->error[] = $captchaError; } diff --git a/app/main/controller/appcontroller.php b/app/Controller/AppController.php similarity index 82% rename from app/main/controller/appcontroller.php rename to app/Controller/AppController.php index 529f531b..b9880f4c 100644 --- a/app/main/controller/appcontroller.php +++ b/app/Controller/AppController.php @@ -6,11 +6,12 @@ * Time: 21:27 */ -namespace Controller; +namespace Exodus4D\Pathfinder\Controller; -use Controller\Ccp as Ccp; -use lib\Config; -use lib\Resource; + +use Exodus4D\Pathfinder\Controller\Ccp as Ccp; +use Exodus4D\Pathfinder\Lib\Config; +use Exodus4D\Pathfinder\Lib\Resource; class AppController extends Controller { @@ -67,10 +68,8 @@ class AppController extends Controller { $resource = Resource::instance(); $resource->register('script', 'app/login'); $resource->register('script', 'app/mappage', 'prefetch'); - $resource->register('image', 'pf-bg.jpg'); - $resource->register('image', 'pf-header-bg.jpg'); - $resource->register('image', 'landing/eve_sso_login_buttons_large_black.png'); - $resource->register('image', 'landing/eve_sso_login_buttons_large_black_hover.png'); + $resource->register('image', 'sso/signature.png'); + $resource->register('image', 'sso/gameplay.png'); } } \ No newline at end of file diff --git a/app/main/controller/ccp/sso.php b/app/Controller/Ccp/Sso.php similarity index 97% rename from app/main/controller/ccp/sso.php rename to app/Controller/Ccp/Sso.php index 2b51cdb8..542e007b 100644 --- a/app/main/controller/ccp/sso.php +++ b/app/Controller/Ccp/Sso.php @@ -11,12 +11,12 @@ * - Check "PATHFINDER.API" in "pathfinder.ini" for correct API URLs */ -namespace Controller\Ccp; +namespace Exodus4D\Pathfinder\Controller\Ccp; -use Controller; -use Controller\Api as Api; -use Model\Pathfinder; -use Lib; +use Exodus4D\Pathfinder\Controller; +use Exodus4D\Pathfinder\Controller\Api as Api; +use Exodus4D\Pathfinder\Model\Pathfinder; +use Exodus4D\Pathfinder\Lib; class Sso extends Api\User{ @@ -390,7 +390,7 @@ class Sso extends Api\User{ $accessData->refreshToken = null; $accessData->esiAccessTokenExpires = 0; - $authCodeRequestData = $this->getF3()->ssoClient()->getAccessData($this->getAuthorizationData(), $requestParams); + $authCodeRequestData = $this->getF3()->ssoClient()->send('getAccess', $this->getAuthorizationData(), $requestParams); if( !empty($authCodeRequestData) ){ if( !empty($authCodeRequestData['accessToken']) ){ @@ -429,7 +429,7 @@ class Sso extends Api\User{ * @return array */ public function verifyCharacterData(string $accessToken) : array { - $characterData = $this->getF3()->ssoClient()->getVerifyCharacterData($accessToken); + $characterData = $this->getF3()->ssoClient()->send('getVerifyCharacter', $accessToken); if( !empty($characterData) ){ // convert string with scopes to array @@ -451,8 +451,7 @@ class Sso extends Api\User{ $characterData = (object) []; if($characterId){ - $characterDataBasic = $this->getF3()->ccpClient()->getCharacterData($characterId); - + $characterDataBasic = $this->getF3()->ccpClient()->send('getCharacter', $characterId); if( !empty($characterDataBasic) ){ // remove some "unwanted" data -> not relevant for Pathfinder $characterData->character = array_filter($characterDataBasic, function($key){ diff --git a/app/main/controller/ccp/universe.php b/app/Controller/Ccp/Universe.php similarity index 95% rename from app/main/controller/ccp/universe.php rename to app/Controller/Ccp/Universe.php index 67f1fc68..fe6a1e3b 100644 --- a/app/main/controller/ccp/universe.php +++ b/app/Controller/Ccp/Universe.php @@ -6,13 +6,13 @@ * Time: 11:31 */ -namespace Controller\Ccp; +namespace Exodus4D\Pathfinder\Controller\Ccp; -use Controller\Controller; -use lib\Util; -use Model; +use Exodus4D\Pathfinder\Controller; +use Exodus4D\Pathfinder\Lib\Util; +use Exodus4D\Pathfinder\Model; -class Universe extends Controller { +class Universe extends Controller\Controller { const SESSION_KEY_SYSTEM_IDS = 'SESSION.SETUP.SYSTEM_IDS'; @@ -22,7 +22,7 @@ class Universe extends Controller { $regionsWhitelist = [ 10000002 // The Forge (13 constellations -> 93 systems) ]; - $regionIds = $f3->ccpClient()->getUniverseRegions(); + $regionIds = $f3->ccpClient()->send('getUniverseRegions'); $regionIds = array_intersect($regionsWhitelist, $regionIds); $region = Model\Universe\AbstractUniverseModel::getNew('RegionModel'); @@ -43,7 +43,7 @@ class Universe extends Controller { $constellationsWhitelist = [ 20000014 // Mal (11 systems) ]; - $constellationIds = $f3->ccpClient()->getUniverseConstellations(); + $constellationIds = $f3->ccpClient()->send('getUniverseConstellations'); $constellationIds = array_intersect($constellationsWhitelist, $constellationIds); $constellation = Model\Universe\AbstractUniverseModel::getNew('ConstellationModel'); foreach($constellationIds as $constellationId){ @@ -306,13 +306,13 @@ class Universe extends Controller { $f3 = \Base::instance(); $universeNameData = []; if( !empty($categories) && !empty($search)){ - $universeIds = $f3->ccpClient()->search($categories, $search, $strict); + $universeIds = $f3->ccpClient()->send('search', $categories, $search, $strict); if(isset($universeIds['error'])){ // ESI error $universeNameData = $universeIds; }elseif( !empty($universeIds) ){ $universeIds = Util::arrayFlattenByValue($universeIds); - $universeNameData = $f3->ccpClient()->getUniverseNamesData($universeIds); + $universeNameData = $f3->ccpClient()->send('getUniverseNames', $universeIds); } } return $universeNameData; diff --git a/app/main/controller/controller.php b/app/Controller/Controllerr.php similarity index 92% rename from app/main/controller/controller.php rename to app/Controller/Controllerr.php index 89d78cb1..59460951 100644 --- a/app/main/controller/controller.php +++ b/app/Controller/Controllerr.php @@ -6,22 +6,30 @@ * Time: 23:48 */ -namespace Controller; +namespace Exodus4D\Pathfinder\Controller; -use Controller\Api as Api; -use Exception\PathfinderException; -use lib\api\CcpClient; -use lib\Config; -use lib\db\SQL; -use lib\Resource; -use lib\Monolog; -use lib\Util; -use Model\AbstractModel; -use Model\Pathfinder; -use DB; + +use Exodus4D\Pathfinder\Controller\Api as Api; +use Exodus4D\Pathfinder\Lib\Api\CcpClient; +use Exodus4D\Pathfinder\Lib\Config; +use Exodus4D\Pathfinder\Lib\Db\Sql; +use Exodus4D\Pathfinder\Lib\Resource; +use Exodus4D\Pathfinder\Lib\Monolog; +use Exodus4D\Pathfinder\Lib\Util; +use Exodus4D\Pathfinder\Lib\Format; +use Exodus4D\Pathfinder\Model\AbstractModel; +use Exodus4D\Pathfinder\Model\Pathfinder; +use Exodus4D\Pathfinder\Db\Sql\Mysql; +use Exodus4D\Pathfinder\Exception\PathfinderException; class Controller { + /** + * default HTTP response status for users that logged out + * -> if it is a "graceful" logout (e.g. user clicks "logout" button, we use 200) + */ + const DEFAULT_STATUS_LOGOUT = 403; + // cookie specific keys (names) const COOKIE_NAME_STATE = 'cookie'; const COOKIE_PREFIX_CHARACTER = 'char'; @@ -91,12 +99,12 @@ class Controller { header('Pf-Maintenance: ' . $modeMaintenance); } }else{ - $this->initResource($f3); + $f3->set('tplResource', $this->initResource($f3)); $this->setTemplate(Config::getPathfinderData('view.index')); - $f3->set('tplImage', \lib\format\Image::instance()); + $f3->set('tplImage', Format\Image::instance()); } return true; @@ -132,11 +140,11 @@ class Controller { $f3->get('SESSION_CACHE') === 'mysql' && ($db = $f3->DB->getDB('PF')) instanceof SQL ){ - if(!headers_sent() && session_status()!=PHP_SESSION_ACTIVE){ + if(!headers_sent() && session_status() != PHP_SESSION_ACTIVE){ /** * callback() for suspect sessions - * @param $session - * @param $sid + * @param \DB\SQL\Session $session + * @param string $sid * @return bool */ $onSuspect = function($session, $sid){ @@ -151,7 +159,7 @@ class Controller { return false; }; - new DB\SQL\MySQL\Session($db, 'sessions', true, $onSuspect); + new Mysql\Session($db, 'sessions', true, $onSuspect); } } } @@ -159,15 +167,18 @@ class Controller { /** * init new Resource handler * @param \Base $f3 + * @return Resource */ protected function initResource(\Base $f3){ $resource = Resource::instance(); + $resource->setOption('basePath', $f3->get('BASE')); $resource->setOption('filePath', [ - 'style' => $f3->get('BASE') . '/public/css/' . Config::getPathfinderData('version'), - 'script' => $f3->get('BASE') . '/public/js/' . Config::getPathfinderData('version'), - 'font' => $f3->get('BASE') . '/public/fonts', - 'document' => $f3->get('BASE') . '/public/templates', - 'image' => $f3->get('BASE') . '/public/img' + 'style' => sprintf('/%scss/%s', $f3->get('UI'), Config::getPathfinderData('version')), + 'script' => sprintf('/%sjs/%s', $f3->get('UI'), Config::getPathfinderData('version')), + 'font' => sprintf('/%sfonts', $f3->get('UI')), + 'document' => sprintf('/%stemplates', $f3->get('UI')), + 'image' => sprintf('/%simg/%s', $f3->get('UI'), Config::getPathfinderData('version')), + 'favicon' => $f3->get('FAVICON') ], true); $resource->register('style', 'pathfinder'); @@ -185,7 +196,7 @@ class Controller { $resource->register('url', Config::getPathfinderData('api.ccp_image_server'), 'dns-prefetch'); $resource->register('url', '//i.ytimg.com', 'dns-prefetch'); // YouTube tiny embed domain - $f3->set('tplResource', $resource); + return $resource; } /** @@ -476,9 +487,17 @@ class Controller { * @param bool $deleteSession * @param bool $deleteLog * @param bool $deleteCookie + * @param int $statusCode * @throws \Exception */ - protected function logoutCharacter(\Base $f3, bool $all = false, bool $deleteSession = true, bool $deleteLog = true, bool $deleteCookie = false){ + protected function logoutCharacter( + \Base $f3, + bool $all = false, + bool $deleteSession = true, + bool $deleteLog = true, + bool $deleteCookie = false, + int $statusCode = self::DEFAULT_STATUS_LOGOUT + ){ $sessionCharacterData = (array)$f3->get(Api\User::SESSION_KEY_CHARACTERS); if($sessionCharacterData){ @@ -507,12 +526,11 @@ class Controller { } if($f3->get('AJAX')){ - $status = 403; - $f3->status($status); + $f3->status($statusCode); $return = (object) []; $return->reroute = rtrim(self::getEnvironmentData('URL'), '/') . $f3->alias('login'); - $return->error[] = $this->getErrorObject($status, Config::getMessageFromHTTPStatus($status)); + $return->error[] = $this->getErrorObject($statusCode, Config::getHttpStatusByCode($statusCode), 'Access denied: User not found'); echo json_encode($return); }else{ @@ -560,7 +578,7 @@ class Controller { 'routes' => [] ]; - $serverStatus = $client->getServerStatus(); + $serverStatus = $client->send('getServerStatus'); if( !isset($serverStatus['error']) ){ $statusData = $serverStatus['status']; // calculate time diff since last server restart @@ -582,7 +600,7 @@ class Controller { $return->error[] = (new PathfinderException($serverStatus['error'], 500))->getError(); } - $apiStatus = $client->getStatusForRoutes('latest'); + $apiStatus = $client->send('getStatus', 'latest', true); if( !isset($apiStatus['error']) ){ // find top status $status = 'OK'; @@ -621,18 +639,18 @@ class Controller { /** * @param int $code - * @param string $message * @param string $status + * @param string $text * @param null $trace * @return \stdClass */ - protected function getErrorObject(int $code, string $message = '', string $status = '', $trace = null): \stdClass{ + protected function getErrorObject(int $code, string $status = '', string $text = '', $trace = null) : \stdClass { $object = (object) []; $object->type = 'error'; $object->code = $code; $object->status = empty($status) ? @constant('Base::HTTP_' . $code) : $status; - if(!empty($message)){ - $object->message = $message; + if(!empty($text)){ + $object->text = $text; } if(!empty($trace)){ $object->trace = $trace; @@ -642,15 +660,15 @@ class Controller { /** * @param string $title - * @param string $message + * @param string $text * @param string $type * @return \stdClass */ - protected function getNotificationObject(string $title, $message = '', $type = 'danger') : \stdClass { + protected function getNotificationObject(string $title, $text = '', $type = 'danger') : \stdClass { $notification = (object) []; $notification->type = in_array($type, self::NOTIFICATION_TYPES) ? $type : 'danger'; $notification->title = $title; - $notification->message = $message; + $notification->text = $text; return $notification; } @@ -744,7 +762,7 @@ class Controller { if(count($matches) === 2){ $error->field = $matches[1][1]; - $error->message = 'Value "' . $matches[0][1] . '" already exists'; + $error->text = 'Value "' . $matches[0][1] . '" already exists'; } } diff --git a/app/main/controller/logcontroller.php b/app/Controller/LogController.php similarity index 97% rename from app/main/controller/logcontroller.php rename to app/Controller/LogController.php index 1fc900b3..b17044fa 100644 --- a/app/main/controller/logcontroller.php +++ b/app/Controller/LogController.php @@ -6,12 +6,12 @@ * Time: 15:24 */ -namespace controller; +namespace Exodus4D\Pathfinder\Controller; -use lib\Config; -use lib\logging\MapLog; -use Model\Pathfinder; +use Exodus4D\Pathfinder\Lib\Config; +use Exodus4D\Pathfinder\Lib\Logging\MapLog; +use Exodus4D\Pathfinder\Model\Pathfinder; class LogController extends \Prefab { diff --git a/app/main/controller/mapcontroller.php b/app/Controller/MapController.php similarity index 86% rename from app/main/controller/mapcontroller.php rename to app/Controller/MapController.php index 5e0e2379..fcab21e5 100644 --- a/app/main/controller/mapcontroller.php +++ b/app/Controller/MapController.php @@ -6,11 +6,11 @@ * Time: 21:18 */ -namespace Controller; +namespace Exodus4D\Pathfinder\Controller; -use lib\Config; -use lib\Resource; +use Exodus4D\Pathfinder\Lib\Config; +use Exodus4D\Pathfinder\Lib\Resource; class MapController extends AccessController { diff --git a/app/main/controller/setup.php b/app/Controller/Setup.php similarity index 95% rename from app/main/controller/setup.php rename to app/Controller/Setup.php index 2f61e5f8..07ebd3fa 100644 --- a/app/main/controller/setup.php +++ b/app/Controller/Setup.php @@ -6,17 +6,20 @@ * Time: 10:59 */ -namespace Controller; +namespace Exodus4D\Pathfinder\Controller; + -use Controller\Ccp\Universe as UniverseController; -use data\filesystem\Search; use DB\SQL\Schema; -use DB\SQL\MySQL as MySQL; -use lib\Config; -use lib\Cron; -use lib\Util; -use Model\Pathfinder; -use Model\Universe; +use Exodus4D\Pathfinder\Db\Sql\Mysql; +use Exodus4D\Pathfinder\Lib\Db\Sql; +use Exodus4D\Pathfinder\Lib\Config; +use Exodus4D\Pathfinder\Lib\Cron; +use Exodus4D\Pathfinder\Lib\Util; +use Exodus4D\Pathfinder\Lib\Format\Number; +use Exodus4D\Pathfinder\Model\Pathfinder; +use Exodus4D\Pathfinder\Model\Universe; +use Exodus4D\Pathfinder\Controller\Ccp\Universe as UniverseController; +use Exodus4D\Pathfinder\Data\Filesystem\Search; class Setup extends Controller { @@ -145,7 +148,7 @@ class Setup extends Controller { * @return bool */ function beforeroute(\Base $f3, $params): bool { - $this->initResource($f3); + $f3->set('tplResource', $this->initResource($f3)); // page title $f3->set('tplPageTitle', 'Setup | ' . Config::getPathfinderData('name')); @@ -172,7 +175,7 @@ class Setup extends Controller { $f3->set('tplCounter', $this->counter()); $f3->set('tplConvertBytes', function(){ - return call_user_func_array([\lib\format\Number::instance(), 'bytesToString'], func_get_args()); + return call_user_func_array([Number::instance(), 'bytesToString'], func_get_args()); }); // render view @@ -275,7 +278,7 @@ class Setup extends Controller { * @return array */ protected function getNavigationConfig() : array { - $config = [ + return [ 'server' => [ 'icon' => 'fa-home' ], @@ -301,8 +304,6 @@ class Setup extends Controller { 'icon' => 'fa-wrench' ] ]; - - return $config; } /** @@ -351,7 +352,7 @@ class Setup extends Controller { * @return array */ protected function getServerInformation(\Base $f3) : array { - $serverInfo = [ + return [ 'time' => [ 'label' => 'Time', 'value' => date('Y/m/d H:i:s') . ' - (' . $f3->get('TZ') . ')' @@ -389,8 +390,6 @@ class Setup extends Controller { 'value' => $f3->get('SERVER.SERVER_PROTOCOL') . ' - ' . $f3->get('SCHEME') ] ]; - - return $serverInfo; } /** @@ -399,7 +398,7 @@ class Setup extends Controller { * @return array */ protected function getDirectoryConfig(\Base $f3) : array { - $directoryData = [ + return [ 'TEMP' => [ 'label' => 'TEMP', 'value' => $f3->get('TEMP'), @@ -465,8 +464,6 @@ class Setup extends Controller { 'tooltip' => 'Folder for custom *.ini files. (e.g. when overwriting of default values in app/*.ini)' ] ]; - - return $directoryData; } /** @@ -639,7 +636,7 @@ class Setup extends Controller { $maxExecutionTime = (int)ini_get('max_execution_time'); // 0 == infinite $htmlErrors = (int)ini_get('html_errors'); - $phpConfig = [ + return [ 'exec' => [ 'label' => 'exec()', 'required' => $f3->get('REQUIREMENTS.PHP.EXEC'), @@ -697,8 +694,6 @@ class Setup extends Controller { 'tooltip' => 'PHP Session name.' ] ]; - - return $phpConfig; } /** @@ -717,14 +712,23 @@ class Setup extends Controller { // collection of DSN specific $conf array (host, port, db,..) $dsnData = []; + /** + * @param int $dbNum + * @param string $tag + * @return string + */ + $getDbLabel = function(int $dbNum, string $tag) : string { + return ' db(' . $dbNum . ') : ' . $tag; + }; + /** * get client information for a Redis client * @param \Redis $client - * @param array $conf + * @param array $conf * @return array */ $getClientInfo = function(\Redis $client, array $conf) : array { - $redisInfo = [ + return [ 'dsn' => [ 'label' => 'DSN', 'value' => $conf['host'] . ':' . $conf['port'] @@ -734,8 +738,6 @@ class Setup extends Controller { 'value' => $client->isConnected() ] ]; - - return $redisInfo; }; /** @@ -746,7 +748,7 @@ class Setup extends Controller { $getClientStats = function(\Redis $client) use ($f3) : array { $redisStats = []; - if($client->isConnected()){ + if($client->isConnected() && !$client->getLastError()){ $redisServerInfo = (array)$client->info('SERVER'); $redisClientsInfo = (array)$client->info('CLIENTS'); $redisMemoryInfo = (array)$client->info('MEMORY'); @@ -762,20 +764,20 @@ class Setup extends Controller { ], 'maxMemory' => [ 'label' => 'maxmemory', - 'required' => \lib\format\Number::instance()->bytesToString($f3->get('REQUIREMENTS.REDIS.MAX_MEMORY')), - 'version' => \lib\format\Number::instance()->bytesToString($redisMemoryInfo['maxmemory']), + 'required' => Number::instance()->bytesToString($f3->get('REQUIREMENTS.REDIS.MAX_MEMORY')), + 'version' => Number::instance()->bytesToString($redisMemoryInfo['maxmemory']), 'check' => $redisMemoryInfo['maxmemory'] >= $f3->get('REQUIREMENTS.REDIS.MAX_MEMORY'), 'tooltip' => 'Max memory limit for Redis' ], 'usedMemory' => [ 'label' => 'used_memory', - 'version' => \lib\format\Number::instance()->bytesToString($redisMemoryInfo['used_memory']), + 'version' => Number::instance()->bytesToString($redisMemoryInfo['used_memory']), 'check' => $redisMemoryInfo['used_memory'] < $redisMemoryInfo['maxmemory'], 'tooltip' => 'Current memory used by Redis' ], 'usedMemoryPeak' => [ 'label' => 'used_memory_peak', - 'version' => \lib\format\Number::instance()->bytesToString($redisMemoryInfo['used_memory_peak']), + 'version' => Number::instance()->bytesToString($redisMemoryInfo['used_memory_peak']), 'check' => $redisMemoryInfo['used_memory_peak'] <= $redisMemoryInfo['maxmemory'], 'tooltip' => 'Peak memory used by Redis' ], @@ -819,14 +821,14 @@ class Setup extends Controller { * @param string $tag * @return array */ - $getDatabaseStatus = function(\Redis $client, string $tag) : array { + $getDatabaseStatus = function(\Redis $client, string $tag) use ($getDbLabel) : array { $redisDatabases = []; - if($client->isConnected()){ + if($client->isConnected() && !$client->getLastError()){ $dbNum = $client->getDbNum(); $dbSize = $client->dbSize(); $redisDatabases = [ 'db_' . $dbNum => [ - 'label' => ' db(' . $dbNum . ') : ' . $tag, + 'label' => $getDbLabel($dbNum, $tag), 'version' => $dbSize . ' keys', 'check' => $dbSize > 0, 'tooltip' => 'Keys in db(' . $dbNum . ')', @@ -854,23 +856,28 @@ class Setup extends Controller { * build (modify) $redisConfig with DNS $conf data * @param array $conf */ - $buildRedisConfig = function(array $conf) use (&$redisConfig, $getClientInfo, $getClientStats, $getDatabaseStatus){ + $buildRedisConfig = function(array $conf) use (&$redisConfig, $getDbLabel, $getClientInfo, $getClientStats, $getDatabaseStatus){ if($conf['type'] == 'redis'){ // is Redis -> group all DNS by host:port - $client = new \Redis(); + $uid = $conf['host'] . ':' . $conf['port']; + $client = new \Redis(); try{ $client->pconnect($conf['host'], $conf['port'], 0.3); + if(!empty($conf['auth'])){ + $client->auth($conf['auth']); + } + if(isset($conf['db'])) { $client->select($conf['db']); } $conf['db'] = $client->getDbNum(); }catch(\RedisException $e){ - // connection failed + // connection failed, getLastError() is called further down } - if(!array_key_exists($uid = $conf['host'] . ':' . $conf['port'], $redisConfig)){ + if(!array_key_exists($uid, $redisConfig)){ $redisConfig[$uid] = $getClientInfo($client, $conf); $redisConfig[$uid]['status'] = $getClientStats($client) + $getDatabaseStatus($client, $conf['tag']); }elseif(!array_key_exists($uidDb = 'db_' . $conf['db'], $redisConfig[$uid]['status'])){ @@ -879,6 +886,13 @@ class Setup extends Controller { $redisConfig[$uid]['status'][$uidDb]['label'] .= '; ' . $conf['tag']; } + if($error = $client->getLastError()){ + $redisConfig[$uid]['errors'][] = [ + 'label' => $getDbLabel((int)$conf['db'], $conf['tag']), + 'error' => $error + ]; + } + $client->close(); } }; @@ -910,6 +924,7 @@ class Setup extends Controller { 'host' => $parts['host'], 'port' => $parts['port'], 'db' => !empty($params['database']) ? (int)$params['database'] : 0, + 'auth' => !empty($params['auth']) ? $params['auth'] : null, 'tag' => 'SESSION' ]; $dsnData[] = $conf; @@ -937,14 +952,11 @@ class Setup extends Controller { protected function checkSystemConfig(\Base $f3): array { $systemConf = []; if(function_exists('exec')){ - $gitOut = $composerOut = $rubyOut = $rubyGemsOut = $compassOut = $nodeOut = $npmOut = []; - $gitStatus = $composerStatus = $rubyStatus = $rubyGemsStatus = $compassStatus = $nodeStatus = $npmStatus = 1; + $gitOut = $composerOut = $nodeOut = $npmOut = []; + $gitStatus = $composerStatus = $nodeStatus = $npmStatus = 1; exec('git --version', $gitOut, $gitStatus); exec('composer -V', $composerOut, $composerStatus); - exec('ruby -v', $rubyOut, $rubyStatus); - exec('gem -v', $rubyGemsOut, $rubyGemsStatus); - exec('compass -v', $compassOut, $compassStatus); exec('node -v', $nodeOut, $nodeStatus); exec('npm -v', $npmOut, $npmStatus); @@ -965,24 +977,6 @@ class Setup extends Controller { 'check' => $composerStatus == 0, 'tooltip' => 'Composer # composer -V : ' . $composerOut[0] ], - 'Ruby' => [ - 'label' => 'Ruby', - 'version' => $rubyOut[0] ? 'installed' : 'missing', - 'check' => $rubyStatus == 0, - 'tooltip' => 'Ruby # ruby -v : ' . $rubyOut[0] - ], - 'rubyGems' => [ - 'label' => 'Ruby gem', - 'version' => $normalizeVersion($rubyGemsOut[0]) ?: 'missing', - 'check' => $rubyGemsStatus == 0, - 'tooltip' => 'gem # gem -v' - ], - 'compass' => [ - 'label' => 'Compass', - 'version' => $compassOut[0] ? 'installed' : 'missing', - 'check' => $compassStatus == 0, - 'tooltip' => 'Compass # compass -v : ' . $compassOut[0] - ], 'node' => [ 'label' => 'NodeJs', 'required' => number_format((float)$f3->get('REQUIREMENTS.PATH.NODE'), 1, '.', ''), @@ -1110,7 +1104,7 @@ class Setup extends Controller { // collection for errors $dbErrors = []; /** - * @var $db \lib\db\SQL + * @var $db Sql */ $db = $f3->DB->getDB($dbAlias); @@ -1133,7 +1127,7 @@ class Setup extends Controller { // get table data from model foreach($dbData['models'] as $model){ - $tableConfig = call_user_func($model . '::resolveConfiguration'); + $tableConfig = call_user_func(Config::withNamespace($model) . '::resolveConfiguration'); $requiredTables[$tableConfig['table']] = [ 'model' => $model, 'name' => $tableConfig['table'], @@ -1172,7 +1166,7 @@ class Setup extends Controller { // Table exists $tableExists = true; // get existing table columns and column related constraints (if exists) - $tableModifierTemp = new MySQL\TableModifier($requiredTableName, $schema); + $tableModifierTemp = new Mysql\TableModifier($requiredTableName, $schema); $currentColumns = $tableModifierTemp->getCols(true); // get row count $tableRows = $db->getRowCount($requiredTableName); @@ -1220,16 +1214,16 @@ class Setup extends Controller { // column exists // get tableModifier -> possible column update - $tableModifier = new MySQL\TableModifier($requiredTableName, $schema); + $tableModifier = new Mysql\TableModifier($requiredTableName, $schema); // get new column and copy Schema from existing column - $col = new MySQL\Column($columnName, $tableModifier); + $col = new Mysql\Column($columnName, $tableModifier); $col->copyfrom($currentColumns[$columnName]); $currentColType = $currentColumns[$columnName]['type']; $currentNullable = $currentColumns[$columnName]['nullable']; $hasNullable = $currentNullable ? '1' : '0'; - $currentColIndexData = call_user_func($data['model'] . '::indexExists', [$columnName]); + $currentColIndexData = call_user_func(Config::withNamespace($data['model']) . '::indexExists', [$columnName]); $currentColIndex = is_array($currentColIndexData); $hasIndex = ($currentColIndex) ? '1' : '0'; $hasUnique = ($currentColIndexData['unique']) ? '1' : '0'; @@ -1441,10 +1435,10 @@ class Setup extends Controller { /** * check MySQL params * @param \Base $f3 - * @param \lib\db\SQL $db + * @param Sql $db * @return array */ - protected function checkDBConfig(\Base $f3, \lib\db\SQL $db) : array { + protected function checkDBConfig(\Base $f3, Sql $db) : array { $checkAll = true; // some db like "Maria DB" have some strange version strings.... $dbVersionString = $db->version(); @@ -1555,7 +1549,7 @@ class Setup extends Controller { // setup tables foreach($this->databases[$dbAlias]['models'] as $modelClass){ - $checkTables[] = call_user_func($modelClass . '::setup', $db); + $checkTables[] = call_user_func(Config::withNamespace($modelClass) . '::setup', $db); } } return $checkTables; @@ -1624,7 +1618,7 @@ class Setup extends Controller { $setStats((array)$payload['stats']); }); - $socketInformation = [ + return [ 'tcpSocket' => [ 'label' => 'TCP-Socket (intern)', 'icon' => 'fa-exchange-alt', @@ -1669,8 +1663,6 @@ class Setup extends Controller { ] ] ]; - - return $socketInformation; } /** @@ -1710,13 +1702,11 @@ class Setup extends Controller { ] ]; - $config = [ + return [ 'checkCronConfig' => $cronConf, 'settings' => $f3->constants($cron, 'DEFAULT_'), 'jobs' => $cron->getJobsConfig() ]; - - return $config; } /** @@ -1950,7 +1940,7 @@ class Setup extends Controller { } $bytesAll += $bytes; - $dirAll[$key]['size'] = ($maxHit ? '>' : '') . \lib\format\Number::instance()->bytesToString($bytes); + $dirAll[$key]['size'] = ($maxHit ? '>' : '') . Number::instance()->bytesToString($bytes); $dirAll[$key]['task'] = [ [ 'action' => http_build_query([ @@ -1965,7 +1955,7 @@ class Setup extends Controller { } return [ - 'sizeAll' => ($maxHitAll ? '>' : '') . \lib\format\Number::instance()->bytesToString($bytesAll), + 'sizeAll' => ($maxHitAll ? '>' : '') . Number::instance()->bytesToString($bytesAll), 'dirAll' => $dirAll ]; } diff --git a/app/main/cron/abstractcron.php b/app/Cron/AbstractCron.php similarity index 96% rename from app/main/cron/abstractcron.php rename to app/Cron/AbstractCron.php index 5e98b942..2413a866 100644 --- a/app/main/cron/abstractcron.php +++ b/app/Cron/AbstractCron.php @@ -6,9 +6,10 @@ * Time: 12:13 */ -namespace cron; +namespace Exodus4D\Pathfinder\Cron; -use Model\Pathfinder; +use Exodus4D\Pathfinder\Lib\Format\Number; +use Exodus4D\Pathfinder\Model\Pathfinder; abstract class AbstractCron { @@ -90,7 +91,7 @@ abstract class AbstractCron { protected function logStart(string $job, bool $logging = true){ $this->setMaxExecutionTime(); - $cron = \lib\Cron::instance(); + $cron = \Exodus4D\Pathfinder\Lib\Cron::instance(); if(isset($cron->jobs[$job])){ // set "start" date for current cronjob $jobConf = $cron->getJobDataFromConf($cron->jobs[$job]); @@ -201,7 +202,7 @@ abstract class AbstractCron { $text = sprintf(self::LOG_TEXT_BASE, $state['count'], $state['importCount'], $percent, $state['total'], - \lib\format\Number::instance()->bytesToString($memPeak), $duration + Number::instance()->bytesToString($memPeak), $duration ); $text .= $logText ? $logText: ''; diff --git a/app/main/cron/cache.php b/app/Cron/Cache.php similarity index 96% rename from app/main/cron/cache.php rename to app/Cron/Cache.php index 6bafd0f7..9cc0caf4 100644 --- a/app/main/cron/cache.php +++ b/app/Cron/Cache.php @@ -6,9 +6,9 @@ * Time: 14:59 */ -namespace cron; +namespace Exodus4D\Pathfinder\Cron; -use data\filesystem\Search; +use Exodus4D\Pathfinder\Data\Filesystem\Search; class Cache extends AbstractCron { diff --git a/app/main/cron/ccpsystemsupdate.php b/app/Cron/CcpSystemsUpdate.php similarity index 95% rename from app/main/cron/ccpsystemsupdate.php rename to app/Cron/CcpSystemsUpdate.php index 20d92246..c9880f42 100644 --- a/app/main/cron/ccpsystemsupdate.php +++ b/app/Cron/CcpSystemsUpdate.php @@ -6,8 +6,10 @@ * Time: 21:31 */ -namespace Cron; -use lib\db\SQL; +namespace Exodus4D\Pathfinder\Cron; + + +use Exodus4D\Pathfinder\Lib\Db\Sql; class CcpSystemsUpdate extends AbstractCron { @@ -29,11 +31,11 @@ class CcpSystemsUpdate extends AbstractCron { /** * checks if a table exists in DB or not - * @param SQL$db + * @param Sql $db * @param string $table * @return bool */ - protected function tableExists (SQL $db, string $table) : bool { + protected function tableExists (Sql $db, string $table) : bool { return !empty($db->exec('SHOW TABLES LIKE :table', [':table' => $table])); } @@ -111,19 +113,19 @@ class CcpSystemsUpdate extends AbstractCron { // switch DB for data import.. /** - * @var $pfDB SQL + * @var $pfDB Sql */ $pfDB = $f3->DB->getDB('PF'); // get current jump data -------------------------------------------------------------------------------------- $time_start = microtime(true); - $jumpData = $f3->ccpClient()->getUniverseJumps(); + $jumpData = $f3->ccpClient()->send('getUniverseJumps'); $time_end = microtime(true); $execTimeGetJumpData = $time_end - $time_start; // get current kill data -------------------------------------------------------------------------------------- $time_start = microtime(true); - $killData = $f3->ccpClient()->getUniverseKills(); + $killData = $f3->ccpClient()->send('getUniverseKills'); $time_end = microtime(true); $execTimeGetKillData = $time_end - $time_start; diff --git a/app/main/cron/characterupdate.php b/app/Cron/CharacterUpdate.php similarity index 98% rename from app/main/cron/characterupdate.php rename to app/Cron/CharacterUpdate.php index e99781cb..53eb5921 100644 --- a/app/main/cron/characterupdate.php +++ b/app/Cron/CharacterUpdate.php @@ -6,10 +6,10 @@ * Time: 19:35 */ -namespace Cron; +namespace Exodus4D\Pathfinder\Cron; -use Model\Pathfinder; +use Exodus4D\Pathfinder\Model\Pathfinder; class CharacterUpdate extends AbstractCron { diff --git a/app/main/cron/maphistory.php b/app/Cron/MapHistory.php similarity index 96% rename from app/main/cron/maphistory.php rename to app/Cron/MapHistory.php index 46e24086..70da7d97 100644 --- a/app/main/cron/maphistory.php +++ b/app/Cron/MapHistory.php @@ -6,11 +6,11 @@ * Time: 15:48 */ -namespace Cron; +namespace Exodus4D\Pathfinder\Cron; -use data\mapper\SortingIterator; -use data\file\FileHandler; -use data\filesystem\Search; +use Exodus4D\Pathfinder\Data\Mapper\SortingIterator; +use Exodus4D\Pathfinder\Data\File\FileHandler; +use Exodus4D\Pathfinder\Data\Filesystem\Search; class MapHistory extends AbstractCron { diff --git a/app/main/cron/mapupdate.php b/app/Cron/MapUpdate.php similarity index 98% rename from app/main/cron/mapupdate.php rename to app/Cron/MapUpdate.php index 1535e3ba..1d619636 100644 --- a/app/main/cron/mapupdate.php +++ b/app/Cron/MapUpdate.php @@ -6,11 +6,11 @@ * Time: 17:54 */ -namespace cron; +namespace Exodus4D\Pathfinder\Cron; -use lib\Config; -use Model\Pathfinder; +use Exodus4D\Pathfinder\Lib\Config; +use Exodus4D\Pathfinder\Model\Pathfinder; class MapUpdate extends AbstractCron { diff --git a/app/main/cron/statisticsupdate.php b/app/Cron/StatisticsUpdate.php similarity index 97% rename from app/main/cron/statisticsupdate.php rename to app/Cron/StatisticsUpdate.php index b23e8349..b2dc743e 100644 --- a/app/main/cron/statisticsupdate.php +++ b/app/Cron/StatisticsUpdate.php @@ -6,7 +6,7 @@ * Time: 21:31 */ -namespace cron; +namespace Exodus4D\Pathfinder\Cron; class StatisticsUpdate extends AbstractCron { diff --git a/app/main/cron/universe.php b/app/Cron/Universe.php similarity index 96% rename from app/main/cron/universe.php rename to app/Cron/Universe.php index bfe88568..2caa9368 100644 --- a/app/main/cron/universe.php +++ b/app/Cron/Universe.php @@ -6,9 +6,10 @@ * Time: 03:46 */ -namespace Cron; +namespace Exodus4D\Pathfinder\Cron; -use Model; + +use Exodus4D\Pathfinder\Model; class Universe extends AbstractCron { @@ -185,7 +186,7 @@ class Universe extends AbstractCron { switch($type){ case 'system': // load systems + dependencies (planets, star, types,...) - $ids = $f3->ccpClient()->getUniverseSystems(); + $ids = $f3->ccpClient()->send('getUniverseSystems'); $modelClass = 'SystemModel'; $setupModel = function(Model\Universe\SystemModel &$model, int $id){ $model->loadById($id); @@ -194,7 +195,7 @@ class Universe extends AbstractCron { break; case 'stargate': // load all stargates. Systems must be present first! - $ids = $f3->ccpClient()->getUniverseSystems(); + $ids = $f3->ccpClient()->send('getUniverseSystems'); $modelClass = 'SystemModel'; $setupModel = function(Model\Universe\SystemModel &$model, int $id){ $model->loadById($id); @@ -202,7 +203,7 @@ class Universe extends AbstractCron { }; break; case 'station': - $ids = $f3->ccpClient()->getUniverseSystems(); + $ids = $f3->ccpClient()->send('getUniverseSystems'); $modelClass = 'SystemModel'; $setupModel = function(Model\Universe\SystemModel &$model, int $id){ if($model->getById($id)){ @@ -215,7 +216,7 @@ class Universe extends AbstractCron { break; case 'sovereignty': // load sovereignty map data. Systems must be present first! - $sovData = $f3->ccpClient()->getSovereigntyMap(); + $sovData = $f3->ccpClient()->send('getSovereigntyMap'); $ids = !empty($sovData = $sovData['map']) ? array_keys($sovData): []; $modelClass = 'SystemModel'; $setupModel = function(Model\Universe\SystemModel &$model, int $id) use ($sovData) { @@ -228,7 +229,7 @@ class Universe extends AbstractCron { }; break; case 'faction_war_systems': - $fwSystems = $f3->ccpClient()->getFactionWarSystems(); + $fwSystems = $f3->ccpClient()->send('getFactionWarSystems'); $ids = !empty($fwSystems = $fwSystems['systems']) ? array_keys($fwSystems): []; $modelClass = 'SystemModel'; $setupModel = function(Model\Universe\SystemModel &$model, int $id) use ($fwSystems) { @@ -242,7 +243,7 @@ class Universe extends AbstractCron { break; case 'index_system': // setup system index, Systems must be present first! - $ids = $f3->ccpClient()->getUniverseSystems(); + $ids = $f3->ccpClient()->send('getUniverseSystems'); $modelClass = 'SystemModel'; $setupModel = function(Model\Universe\SystemModel &$model, int $id){ $model->getById($id); // no loadById() here! would take "forever" when system not exists and must be build up first... @@ -309,8 +310,8 @@ class Universe extends AbstractCron { */ $system = Model\Universe\AbstractUniverseModel::getNew('SystemModel'); - $sovData = $f3->ccpClient()->getSovereigntyMap(); - $fwSystems = $f3->ccpClient()->getFactionWarSystems(); + $sovData = $f3->ccpClient()->send('getSovereigntyMap'); + $fwSystems = $f3->ccpClient()->send('getFactionWarSystems'); $fwSystems = $fwSystems['systems']; $ids = !empty($sovData = $sovData['map']) ? array_keys($sovData): []; sort($ids, SORT_NUMERIC); diff --git a/app/main/data/file/filehandler.php b/app/Data/File/FileHandler.php similarity index 98% rename from app/main/data/file/filehandler.php rename to app/Data/File/FileHandler.php index f1c6e75d..e6ff1ddf 100644 --- a/app/main/data/file/filehandler.php +++ b/app/Data/File/FileHandler.php @@ -6,7 +6,7 @@ * Time: 18:47 */ -namespace data\file; +namespace Exodus4D\Pathfinder\Data\File; class FileHandler extends \Prefab { diff --git a/app/main/data/file/reversesplfileobject.php b/app/Data/File/ReverseSplFileObject.php similarity index 99% rename from app/main/data/file/reversesplfileobject.php rename to app/Data/File/ReverseSplFileObject.php index 13b71988..829ae027 100644 --- a/app/main/data/file/reversesplfileobject.php +++ b/app/Data/File/ReverseSplFileObject.php @@ -6,7 +6,7 @@ * Time: 18:42 */ -namespace data\file; +namespace Exodus4D\Pathfinder\Data\File; class ReverseSplFileObject extends \SplFileObject{ diff --git a/app/main/data/filesystem/search.php b/app/Data/Filesystem/Search.php similarity index 98% rename from app/main/data/filesystem/search.php rename to app/Data/Filesystem/Search.php index 8037b1f5..2872faa6 100644 --- a/app/main/data/filesystem/search.php +++ b/app/Data/Filesystem/Search.php @@ -6,7 +6,7 @@ * Time: 16:58 */ -namespace data\filesystem; +namespace Exodus4D\Pathfinder\Data\Filesystem; class Search { diff --git a/app/main/data/mapper/abstractiterator.php b/app/Data/Mapper/AbstractIterator.php similarity index 92% rename from app/main/data/mapper/abstractiterator.php rename to app/Data/Mapper/AbstractIterator.php index 01141172..f81b02e4 100644 --- a/app/main/data/mapper/abstractiterator.php +++ b/app/Data/Mapper/AbstractIterator.php @@ -6,9 +6,9 @@ * Time: 04:06 */ -namespace data\mapper; +namespace Exodus4D\Pathfinder\Data\Mapper; -use lib\Util; +use Exodus4D\Pathfinder\Lib\Util; class AbstractIterator extends \RecursiveArrayIterator { @@ -26,7 +26,10 @@ class AbstractIterator extends \RecursiveArrayIterator { */ protected static $removeUnmapped = true; - + /** + * AbstractIterator constructor. + * @param $data + */ function __construct($data){ parent::__construct($data, \RecursiveIteratorIterator::SELF_FIRST); } @@ -52,10 +55,10 @@ class AbstractIterator extends \RecursiveArrayIterator { /** * recursive iterator function called on every node - * @param $iterator - * @return mixed + * @param AbstractIterator $iterator + * @return AbstractIterator */ - static function recursiveIterator($iterator){ + static function recursiveIterator(AbstractIterator $iterator){ $keyWhitelist = array_keys(static::$map); diff --git a/app/main/data/mapper/sortingiterator.php b/app/Data/Mapper/SortingIterator.php similarity index 89% rename from app/main/data/mapper/sortingiterator.php rename to app/Data/Mapper/SortingIterator.php index 875bc4dc..ceb4b7f3 100644 --- a/app/main/data/mapper/sortingiterator.php +++ b/app/Data/Mapper/SortingIterator.php @@ -6,7 +6,7 @@ * Time: 00:55 */ -namespace data\mapper; +namespace Exodus4D\Pathfinder\Data\Mapper; class SortingIterator extends \ArrayIterator { diff --git a/app/main/db/sql/mysql/session.php b/app/Db/Sql/Mysql/Session.php similarity index 84% rename from app/main/db/sql/mysql/session.php rename to app/Db/Sql/Mysql/Session.php index 1de0eeb8..cce602ec 100644 --- a/app/main/db/sql/mysql/session.php +++ b/app/Db/Sql/Mysql/Session.php @@ -6,12 +6,19 @@ * Time: 15:40 */ -namespace DB\SQL\MySQL; +namespace Exodus4D\Pathfinder\Db\Sql\Mysql; class Session extends \DB\SQL\Session { - + /** + * Session constructor. + * @param \DB\SQL $db + * @param string $table + * @param bool $force + * @param callback $onsuspect + * @param string $key + */ function __construct(\DB\SQL $db, string $table = 'sessions', bool $force = true, $onsuspect = null, $key = null){ if($force){ // create sessions table diff --git a/app/main/db/sql/mysql/tablemodifier.php b/app/Db/Sql/Mysql/tablemodifier.php similarity index 96% rename from app/main/db/sql/mysql/tablemodifier.php rename to app/Db/Sql/Mysql/tablemodifier.php index b28b62f4..7e3312ef 100644 --- a/app/main/db/sql/mysql/tablemodifier.php +++ b/app/Db/Sql/Mysql/tablemodifier.php @@ -12,7 +12,9 @@ * - FOREIGN KEY CONSTRAINTS (single column key) */ -namespace DB\SQL\MySQL; +namespace Exodus4D\Pathfinder\Db\Sql\Mysql; + + use DB\SQL; class TableModifier extends SQL\TableModifier { @@ -23,7 +25,7 @@ class TableModifier extends SQL\TableModifier { /** * return table foreign key constraints as assoc array * -> if §constraint is passed, constraints are limited to that column - * @param null| SQL\MySQL\Constraint $constraint + * @param null| Constraint $constraint * @return Constraint[] */ public function listConstraint($constraint = null){ @@ -65,7 +67,7 @@ class TableModifier extends SQL\TableModifier { /** * checks whether a constraint name exists or not * -> does not check constraint params - * @param SQL\MySQL\Constraint $constraint + * @param Constraint $constraint * @return bool */ public function constraintExists($constraint){ @@ -75,7 +77,7 @@ class TableModifier extends SQL\TableModifier { /** * drop foreign key constraint - * @param SQL\MySQL\Constraint $constraint + * @param Constraint $constraint */ public function dropConstraint($constraint){ if($constraint->isValid()){ @@ -88,7 +90,7 @@ class TableModifier extends SQL\TableModifier { /** * Add/Update foreign key constraint - * @param SQL\MySQL\Constraint $constraint + * @param Constraint $constraint */ public function addConstraint($constraint){ @@ -131,7 +133,6 @@ class Column extends SQL\Column { } /** - * @see \DB\SQL\MySQL\TableModifier->constraintExists(); * @param Constraint $constraint * @return mixed */ @@ -147,7 +148,7 @@ class Column extends SQL\Column { * $constraintData['on-update'] => ON UPDATE action (optional) default: see \DB\SQL\MySQL\Constraint const * * @param array $constraintData - * @return SQL\MySQL\Constraint + * @return Constraint */ public function newConstraint($constraintData){ diff --git a/app/main/exception/configexception.php b/app/Exception/ConfigException.php similarity index 72% rename from app/main/exception/configexception.php rename to app/Exception/ConfigException.php index 9f2bb033..d61d89e4 100644 --- a/app/main/exception/configexception.php +++ b/app/Exception/ConfigException.php @@ -6,11 +6,14 @@ * Time: 18:53 */ -namespace Exception; +namespace Exodus4D\Pathfinder\Exception; class ConfigException extends PathfinderException { + /** + * @var array + */ protected $codes = [ 1000 => 500 ]; diff --git a/app/main/exception/databaseexception.php b/app/Exception/DatabaseException.php similarity index 65% rename from app/main/exception/databaseexception.php rename to app/Exception/DatabaseException.php index 187beeed..79ac3fe3 100644 --- a/app/main/exception/databaseexception.php +++ b/app/Exception/DatabaseException.php @@ -6,14 +6,22 @@ * Time: 20:31 */ -namespace Exception; +namespace Exodus4D\Pathfinder\Exception; + class DatabaseException extends PathfinderException { + /** + * @var array + */ protected $codes = [ 1500 => 500 ]; + /** + * DatabaseException constructor. + * @param string $message + */ public function __construct(string $message){ parent::__construct($message, 1500); } diff --git a/app/main/exception/dateexception.php b/app/Exception/DateException.php similarity index 74% rename from app/main/exception/dateexception.php rename to app/Exception/DateException.php index 4b578fa7..823c49a4 100644 --- a/app/main/exception/dateexception.php +++ b/app/Exception/DateException.php @@ -6,10 +6,14 @@ * Time: 18:12 */ -namespace Exception; +namespace Exodus4D\Pathfinder\Exception; class DateException extends PathfinderException { + + /** + * @var array + */ protected $codes = [ 3000 => 500 // invalid DateRange ]; diff --git a/app/main/exception/pathfinderexception.php b/app/Exception/PathfinderException.php similarity index 86% rename from app/main/exception/pathfinderexception.php rename to app/Exception/PathfinderException.php index 2636e1d4..a65164f2 100644 --- a/app/main/exception/pathfinderexception.php +++ b/app/Exception/PathfinderException.php @@ -6,9 +6,10 @@ * Time: 00:41 */ -namespace Exception; +namespace Exodus4D\Pathfinder\Exception; -use lib\Config; + +use Exodus4D\Pathfinder\Lib\Config; class PathfinderException extends \Exception { @@ -26,6 +27,11 @@ class PathfinderException extends \Exception { 0 => self::DEFAULT_RESPONSECODE ]; + /** + * PathfinderException constructor. + * @param string $message + * @param int $code + */ public function __construct(string $message, int $code = 0){ if( !array_key_exists($code, $this->codes) ){ // exception code not specified by child class @@ -43,7 +49,7 @@ class PathfinderException extends \Exception { $error->type = 'error'; $error->code = $this->getResponseCode(); $error->status = Config::getHttpStatusByCode($this->getResponseCode()); - $error->message = $this->getMessage(); + $error->text = $this->getMessage(); if(\Base::instance()->get('DEBUG') >= 1){ $error->trace = preg_split('/\R/', $this->getTraceAsString()); // no $this->>getTrace() here -> to much data } diff --git a/app/main/exception/registrationexception.php b/app/Exception/RegistrationException.php similarity index 77% rename from app/main/exception/registrationexception.php rename to app/Exception/RegistrationException.php index b98e107b..bd0057b2 100644 --- a/app/main/exception/registrationexception.php +++ b/app/Exception/RegistrationException.php @@ -6,11 +6,14 @@ * Time: 21:21 */ -namespace Exception; +namespace Exodus4D\Pathfinder\Exception; class RegistrationException extends PathfinderException{ + /** + * @var array + */ protected $codes = [ 2000 => 403 ]; @@ -21,6 +24,11 @@ class RegistrationException extends PathfinderException{ */ private $field; + /** + * RegistrationException constructor. + * @param string $message + * @param string $field + */ public function __construct(string $message, string $field = ''){ parent::__construct($message, 2000); $this->field = $field; diff --git a/app/main/exception/validationexception.php b/app/Exception/ValidationException.php similarity index 78% rename from app/main/exception/validationexception.php rename to app/Exception/ValidationException.php index abfbf668..b28e1b80 100644 --- a/app/main/exception/validationexception.php +++ b/app/Exception/ValidationException.php @@ -6,11 +6,14 @@ * Time: 00:12 */ -namespace Exception; +namespace Exodus4D\Pathfinder\Exception; class ValidationException extends PathfinderException { + /** + * @var array + */ protected $codes = [ 2000 => 422 ]; @@ -21,6 +24,11 @@ class ValidationException extends PathfinderException { */ private $field; + /** + * ValidationException constructor. + * @param string $message + * @param string $field + */ public function __construct(string $message, string $field = ''){ parent::__construct($message, 2000); $this->field = $field; diff --git a/app/main/lib/api/AbstractClient.php b/app/Lib/Api/AbstractClient.php similarity index 89% rename from app/main/lib/api/AbstractClient.php rename to app/Lib/Api/AbstractClient.php index 4b8d9756..6579fa52 100644 --- a/app/main/lib/api/AbstractClient.php +++ b/app/Lib/Api/AbstractClient.php @@ -6,7 +6,7 @@ * Time: 17:41 */ -namespace lib\api; +namespace Exodus4D\Pathfinder\Lib\Api; use Cache\Adapter\Filesystem\FilesystemCachePool; use Cache\Adapter\PHPArray\ArrayCachePool; @@ -14,10 +14,10 @@ use Cache\Adapter\Redis\RedisCachePool; use Cache\Namespaced\NamespacedCachePool; use League\Flysystem\Adapter\Local; use League\Flysystem\Filesystem; -use lib\Config; -use lib\Util; -use lib\logging; -use controller\LogController; +use Exodus4D\Pathfinder\Lib\Config; +use Exodus4D\Pathfinder\Lib\Util; +use Exodus4D\Pathfinder\Lib\Logging; +use Exodus4D\Pathfinder\Controller\LogController; use Exodus4D\ESI\Client\ApiInterface; use Psr\Cache\CacheItemPoolInterface; use Psr\Http\Message\RequestInterface; @@ -89,8 +89,8 @@ abstract class AbstractClient extends \Prefab { * @return \Closure */ protected function newLog() : \Closure { - return function(string $action, string $level = 'warning') : logging\LogInterface { - $log = new logging\ApiLog($action, $level); + return function(string $action, string $level = 'warning') : Logging\LogInterface { + $log = new Logging\ApiLog($action, $level); $log->addHandler('stream', 'json', $this->getStreamConfig($action)); return $log; }; @@ -134,6 +134,9 @@ abstract class AbstractClient extends \Prefab { Config::REDIS_OPT_READ_TIMEOUT ) ){ + if(!empty($poolConfig['auth'])){ + $client->auth($poolConfig['auth']); + } if(isset($poolConfig['tag'])){ $name = 'pathfinder|php|tag:' . strtolower($poolConfig['tag']) . '|pid:' . getmypid(); @@ -298,8 +301,8 @@ abstract class AbstractClient extends \Prefab { public function __call(string $name, array $arguments = []){ $return = []; if(is_object($this->client)){ - if( method_exists($this->client, $name) ){ - $return = call_user_func_array([$this->client, $name], $arguments); + if(method_exists($this->client, $name)){ + $return = call_user_func_array([$this->client, $name], $arguments); }else{ $errorMsg = $this->getMissingMethodError(get_class($this->client), $name); $this->getLogger('ERROR')->write($errorMsg); @@ -336,18 +339,20 @@ abstract class AbstractClient extends \Prefab { $client->setNewLog($this->newLog()); $client->setIsLoggable($this->isLoggable($f3)); - $client->setLogStats(true); // add cURL stats (e.g. transferTime) to logged requests - $client->setLogCache(true); // add cache info (e.g. from cached) to logged requests - //$client->setLogAllStatus(true); // log all requests regardless of response HTTP status code - $client->setLogFile('esi_requests');// + $client->setLogStats(true); // add cURL stats (e.g. transferTime) to loggable requests + $client->setLogCache(true); // add cache info (e.g. from cached) to loggable requests + $client->setLogAllStatus(false); // log all requests regardless of response HTTP status code + $client->setLogRequestHeaders(false); // add request HTTP headers to loggable requests + $client->setLogResponseHeaders(false); // add response HTTP headers to loggable requests + $client->setLogFile('esi_requests'); $client->setRetryLogFile('esi_retry_requests'); $client->setCacheDebug(true); $client->setCachePool($this->getCachePool($f3)); - // use local proxy server for debugging requests - //$client->setProxy('127.0.0.1:8888'); + + //$client->setProxy('127.0.0.1:8888'); // use local proxy server for debugging requests // disable SSL certificate verification -> allow proxy to decode(view) request //$client->setVerify(false); diff --git a/app/main/lib/api/CcpClient.php b/app/Lib/Api/CcpClient.php similarity index 76% rename from app/main/lib/api/CcpClient.php rename to app/Lib/Api/CcpClient.php index 567a5849..0d7c8933 100644 --- a/app/main/lib/api/CcpClient.php +++ b/app/Lib/Api/CcpClient.php @@ -6,20 +6,18 @@ * Time: 17:43 */ -namespace lib\api; +namespace Exodus4D\Pathfinder\Lib\Api; -use lib\Config; -use Exodus4D\ESI\Client\ESI as Client; +use Exodus4D\Pathfinder\Lib\Config; use Exodus4D\ESI\Client\ApiInterface; -use Exodus4D\ESI\Client\EsiInterface; - +use Exodus4D\ESI\Client\Ccp\Esi\Esi as Client; /** * Class CcpClient * @package lib\api * - * @method EsiInterface getServerStatus() - * @method EsiInterface getStatusForRoutes(string $version) + * @method ApiInterface send(string $requestHandler, ...$handlerParams) + * @method ApiInterface sendBatch(array $configs) */ class CcpClient extends AbstractClient { diff --git a/app/Lib/Api/EveScoutClient.php b/app/Lib/Api/EveScoutClient.php new file mode 100644 index 00000000..1d124a33 --- /dev/null +++ b/app/Lib/Api/EveScoutClient.php @@ -0,0 +1,38 @@ +getLogger()->write($this->getMissingClassError(Client::class)); + } + + return $client; + } +} \ No newline at end of file diff --git a/app/main/lib/api/GitHubClient.php b/app/Lib/Api/GitHubClient.php similarity index 69% rename from app/main/lib/api/GitHubClient.php rename to app/Lib/Api/GitHubClient.php index ff8bb52c..d87d6c23 100644 --- a/app/main/lib/api/GitHubClient.php +++ b/app/Lib/Api/GitHubClient.php @@ -6,12 +6,19 @@ * Time: 22:23 */ -namespace lib\api; +namespace Exodus4D\Pathfinder\Lib\Api; -use lib\Config; -use Exodus4D\ESI\Client\Github as Client; +use Exodus4D\Pathfinder\Lib\Config; use Exodus4D\ESI\Client\ApiInterface; +use Exodus4D\ESI\Client\GitHub\GitHub as Client; +/** + * Class GitHubClient + * @package lib\api + * + * @method ApiInterface send(string $requestHandler, ...$handlerParams) + * @method ApiInterface sendBatch(array $configs) + */ class GitHubClient extends AbstractClient { /** diff --git a/app/main/lib/api/SsoClient.php b/app/Lib/Api/SsoClient.php similarity index 79% rename from app/main/lib/api/SsoClient.php rename to app/Lib/Api/SsoClient.php index 1a0cb108..30c47327 100644 --- a/app/main/lib/api/SsoClient.php +++ b/app/Lib/Api/SsoClient.php @@ -6,12 +6,16 @@ * Time: 17:39 */ -namespace lib\api; +namespace Exodus4D\Pathfinder\Lib\Api; -use lib\Config; -use Exodus4D\ESI\Client\SSO as Client; +use Exodus4D\Pathfinder\Lib\Config; use Exodus4D\ESI\Client\ApiInterface; +use Exodus4D\ESI\Client\Ccp\Sso\Sso as Client; +/** + * Class SsoClient + * @package lib\api + */ class SsoClient extends AbstractClient { /** diff --git a/app/main/lib/config.php b/app/Lib/Config.php similarity index 91% rename from app/main/lib/config.php rename to app/Lib/Config.php index c87db59b..000b28c7 100644 --- a/app/main/lib/config.php +++ b/app/Lib/Config.php @@ -6,16 +6,16 @@ * Time: 16:05 */ -namespace lib; +namespace Exodus4D\Pathfinder\Lib; - -use lib\db\Pool; -use lib\api\CcpClient; -use lib\api\GitHubClient; -use lib\api\SsoClient; -use lib\socket\AbstractSocket; -use lib\socket\SocketInterface; -use lib\socket\TcpSocket; +use Exodus4D\Pathfinder\Lib\Db\Pool; +use Exodus4D\Pathfinder\Lib\Api\CcpClient; +use Exodus4D\Pathfinder\Lib\Api\GitHubClient; +use Exodus4D\Pathfinder\Lib\Api\SsoClient; +use Exodus4D\Pathfinder\Lib\Api\EveScoutClient; +use Exodus4D\Pathfinder\Lib\Socket\AbstractSocket; +use Exodus4D\Pathfinder\Lib\Socket\SocketInterface; +use Exodus4D\Pathfinder\Lib\Socket\TcpSocket; class Config extends \Prefab { @@ -39,6 +39,11 @@ class Config extends \Prefab { */ const HIVE_KEY_ENVIRONMENT = 'ENVIRONMENT'; + /** + * Hive key for custom plugins (js map modules) + */ + const HIVE_KEY_PLUGIN = 'PLUGIN'; + /** * Hive key for Socket validation check */ @@ -127,7 +132,7 @@ class Config extends \Prefab { * custom HTTP status codes */ const - HTTP_422='Unprocessable Entity'; + HTTP_422 = 'Unprocessable Entity'; /** * all environment data @@ -177,6 +182,7 @@ class Config extends \Prefab { $f3->set(SsoClient::CLIENT_NAME, SsoClient::instance()); $f3->set(CcpClient::CLIENT_NAME, CcpClient::instance()); $f3->set(GitHubClient::CLIENT_NAME, GitHubClient::instance()); + $f3->set(EveScoutClient::CLIENT_NAME, EveScoutClient::instance()); // Socket connectors ------------------------------------------------------------------------------------------ $f3->set(TcpSocket::SOCKET_NAME, function(array $options = ['timeout' => 1]) : SocketInterface { @@ -373,7 +379,7 @@ class Config extends \Prefab { * get SMTP config values * @return \stdClass */ - static function getSMTPConfig(): \stdClass{ + static function getSMTPConfig() : \stdClass{ $config = new \stdClass(); $config->host = self::getEnvironmentData('SMTP_HOST'); $config->port = self::getEnvironmentData('SMTP_PORT'); @@ -391,9 +397,9 @@ class Config extends \Prefab { * @param \stdClass $config * @return bool */ - static function isValidSMTPConfig(\stdClass $config): bool { + static function isValidSMTPConfig(\stdClass $config) : bool { // validate email from either an configured array or plain string - $validateMailConfig = function($mailConf = null): bool { + $validateMailConfig = function($mailConf = null) : bool { $email = null; if(is_array($mailConf)){ reset($mailConf); @@ -436,19 +442,25 @@ class Config extends \Prefab { } /** - * get custom $message for a a HTTP $status - * -> use this in addition to the very general Base::HTTP_XXX labels - * @param int $status - * @return string + * get Plugin config from `plugin.ini` + * @param string|null $key + * @param bool $checkEnabled + * @return array|null */ - static function getMessageFromHTTPStatus(int $status): string { - switch($status){ - case 403: - $message = 'Access denied: User not found'; break; - default: - $message = ''; + static function getPluginConfig(?string $key, bool $checkEnabled = true) : ?array { + $isEnabled = $checkEnabled ? + filter_var(\Base::instance()->get( + self::HIVE_KEY_PLUGIN . '.' . strtoupper($key) . '_ENABLED'), + FILTER_VALIDATE_BOOLEAN + ) : + true; + + $data = null; + if($isEnabled){ + $hiveKey = self::HIVE_KEY_PLUGIN . '.' . strtoupper($key); + $data = (array)\Base::instance()->get($hiveKey); } - return $message; + return $data; } /** @@ -541,7 +553,7 @@ class Config extends \Prefab { } /** - * get HTTP status message by HTTP return code + * get HTTP status by HTTP return code * -> either from F3 or from self::Config constants * @param int $code * @return string @@ -568,7 +580,7 @@ class Config extends \Prefab { if($matches = (bool)preg_match('/^(\w+)\h*=\h*(.+)/', strtolower(trim($dsn)), $parts)){ $conf['type'] = $parts[1]; if($conf['type'] == 'redis'){ - list($conf['host'], $conf['port'], $conf['db']) = explode(':', $parts[2]) + [1 => 6379, 2 => null]; + [$conf['host'], $conf['port'], $conf['db'], $conf['auth']] = explode(':', $parts[2]) + [1 => 6379, 2 => null, 3 => null]; }elseif($conf['type'] == 'folder'){ $conf['folder'] = $parts[2]; } @@ -640,6 +652,11 @@ class Config extends \Prefab { return $format; } + /** + * @param $fromExists + * @param int $ttlMax + * @return int + */ static function ttlLeft($fromExists, int $ttlMax) : int { $ttlMax = max($ttlMax, 0); if($fromExists){ @@ -654,4 +671,16 @@ class Config extends \Prefab { return $ttlMax; } } + + /** + * @param string|null $class + * @return string + */ + static function withNamespace(?string $class) : string { + $path = [\Base::instance()->get('NAMESPACE')]; + if($class){ + $path[] = $class; + } + return implode('\\', $path); + } } \ No newline at end of file diff --git a/app/main/lib/Cron.php b/app/Lib/Cron.php similarity index 86% rename from app/main/lib/Cron.php rename to app/Lib/Cron.php index ae5d69e1..026e8261 100644 --- a/app/main/lib/Cron.php +++ b/app/Lib/Cron.php @@ -1,9 +1,9 @@ getJob($name)){ - if($job->dry()){ - $job->name = $name; + // method is called from /setup page -> DB might not be created at this point! + // -> check if DB exists here. Otherwise Cortex()->__construct() + \Base::instance()->DB->setSilent(true); + if(\Base::instance()->DB->getDB(Pathfinder\AbstractPathfinderModel::DB_ALIAS)){ + if($job = $this->getJob($name)){ + if($job->dry()){ + $job->name = $name; + } + $job->setData($jobConf); + return $job->save(); } - $job->setData($jobConf); - return $job->save(); } + \Base::instance()->DB->setSilent(false); } /** diff --git a/app/main/lib/DateRange.php b/app/Lib/DateRange.php similarity index 92% rename from app/main/lib/DateRange.php rename to app/Lib/DateRange.php index 3327ebb6..f349c7f1 100644 --- a/app/main/lib/DateRange.php +++ b/app/Lib/DateRange.php @@ -6,9 +6,9 @@ * Time: 18:06 */ -namespace lib; +namespace Exodus4D\Pathfinder\Lib; -use Exception\DateException; +use Exodus4D\Pathfinder\Exception\DateException; class DateRange { diff --git a/app/main/lib/db/Pool.php b/app/Lib/Db/Pool.php similarity index 92% rename from app/main/lib/db/Pool.php rename to app/Lib/Db/Pool.php index 2a415f92..3798ea90 100644 --- a/app/main/lib/db/Pool.php +++ b/app/Lib/Db/Pool.php @@ -1,12 +1,12 @@ NO database is used * -> can be used to check if a certain DB exists without connecting to it directly * @param string $alias - * @return SQL|null + * @return Sql|null */ - public function connectToServer(string $alias) : ?SQL { + public function connectToServer(string $alias) : ?Sql { $config = ($this->getConfig)($alias); $config['NAME'] = ''; return $this->newDB($config); @@ -95,9 +95,9 @@ class Pool extends \Prefab { * tries to create a database if not exists * -> DB user needs rights to create a DB * @param string $alias - * @return SQL|null + * @return Sql|null */ - public function createDB(string $alias) : ?SQL { + public function createDB(string $alias) : ?Sql { $db = null; $config = ($this->getConfig)($alias); // remove database from $dsn (we want to crate it) @@ -135,9 +135,9 @@ class Pool extends \Prefab { /** * get active connection from store or init new connection * @param string $alias - * @return SQL|null + * @return Sql|null */ - public function getDB(string $alias) : ?SQL { + public function getDB(string $alias) : ?Sql { if(!isset($this->connectionStore[$alias])){ $db = $this->newDB(($this->getConfig)($alias)); if(!is_null($db)){ @@ -175,14 +175,14 @@ class Pool extends \Prefab { /** * @param array $config - * @return SQL|null + * @return Sql|null */ - protected function newDB(array $config) : ?SQL { + protected function newDB(array $config) : ?Sql { $db = null; if($config['SCHEME'] == 'mysql'){ try{ - $db = new SQL($this->buildDnsFromConfig($config), $config['USER'], $config['PASS'], $config['OPTIONS']); + $db = new Sql($this->buildDnsFromConfig($config), $config['USER'], $config['PASS'], $config['OPTIONS']); }catch(\PDOException $e){ $this->pushError($config['ALIAS'], $e); diff --git a/app/main/lib/db/SQL.php b/app/Lib/Db/Sql.php similarity index 97% rename from app/main/lib/db/SQL.php rename to app/Lib/Db/Sql.php index 6ffc629f..3153e4ac 100644 --- a/app/main/lib/db/SQL.php +++ b/app/Lib/Db/Sql.php @@ -1,12 +1,12 @@ see $processorConfig end getProcessorParams() + * @var array + */ + protected $processorParamsConfig = [ + 'psr' => ['Y-m-d\A\TH:i:s.uP', false] + ]; + /** * multiple Log() objects can be marked as "grouped" * -> Logs with Slack Handler should be grouped by map (send multiple log data in once @@ -110,6 +144,10 @@ abstract class AbstractLog implements LogInterface { private $buffer = true; + /** + * AbstractLog constructor. + * @param string $action + */ public function __construct(string $action){ $this->setF3(); $this->action = $action; @@ -176,7 +214,7 @@ abstract class AbstractLog implements LogInterface { * @param array $data * @return LogInterface */ - public function setData(array $data) : LogInterface{ + public function setData(array $data) : LogInterface { $this->data = $data; return $this; } @@ -185,7 +223,7 @@ abstract class AbstractLog implements LogInterface { * @param array $data * @return LogInterface */ - public function setTempData(array $data) : LogInterface{ + public function setTempData(array $data) : LogInterface { $this->tmpData = $data; return $this; } @@ -227,7 +265,7 @@ abstract class AbstractLog implements LogInterface { /** * @return array */ - public function getHandlerConfig() : array{ + public function getHandlerConfig() : array { return $this->handlerConfig; } @@ -238,8 +276,6 @@ abstract class AbstractLog implements LogInterface { * @throws \Exception */ public function getHandlerParams(string $handlerKey) : array { - $params = []; - if($this->hasHandlerKey($handlerKey)){ switch($handlerKey){ case 'stream': $params = $this->getHandlerParamsStream(); @@ -255,10 +291,10 @@ abstract class AbstractLog implements LogInterface { $params = $this->getHandlerParamsSlack($handlerKey); break; default: - throw new \Exception( sprintf(self::ERROR_HANDLER_PARAMS, $handlerKey)); + throw new \Exception(sprintf(self::ERROR_HANDLER_PARAMS, $handlerKey)); } }else{ - throw new \Exception( sprintf(self::ERROR_HANDLER_KEY, $handlerKey, implode(', ', array_flip($this->handlerConfig)))); + throw new \Exception(sprintf(self::ERROR_HANDLER_KEY, $handlerKey, implode(', ', array_flip($this->handlerConfig)))); } return $params; @@ -278,58 +314,79 @@ abstract class AbstractLog implements LogInterface { return $this->processorConfig; } + /** + * get __construct() parameters for a given $processorKey + * @param string $processorKey + * @return array + * @throws \Exception + */ + public function getProcessorParams(string $processorKey) : array { + if($this->hasProcessorKey($processorKey)){ + switch($processorKey){ + case 'psr': $params = $this->getProcessorParamsPsr(); + break; + default: + throw new \Exception(sprintf(self::ERROR_PROCESSOR_PARAMS, $processorKey)); + } + }else{ + throw new \Exception(sprintf(self::ERROR_PROCESSOR_KEY, $processorKey, implode(', ', array_flip($this->processorConfig)))); + } + + return $params; + } + /** * @return string */ - public function getMessage() : string{ + public function getMessage() : string { return $this->message; } /** * @return string */ - public function getAction() : string{ + public function getAction() : string { return $this->action; } /** * @return string */ - public function getChannelType() : string{ + public function getChannelType() : string { return $this->channelType; } /** * @return string */ - public function getChannelName() : string{ + public function getChannelName() : string { return $this->getChannelType(); } /** * @return string */ - public function getLevel() : string{ + public function getLevel() : string { return $this->level; } /** * @return string */ - public function getTag() : string{ + public function getTag() : string { return $this->tag; } /** * @return array */ - public function getData() : array{ + public function getData() : array { return $this->data; } /** * @return array */ - public function getContext() : array{ + public function getContext() : array { $context = [ 'data' => $this->getData(), 'tag' => $this->getTag() @@ -351,7 +408,7 @@ abstract class AbstractLog implements LogInterface { /** * @return array */ - public function getHandlerGroups() : array{ + public function getHandlerGroups() : array { return $this->handlerGroups; } @@ -372,7 +429,7 @@ abstract class AbstractLog implements LogInterface { * @param string $handlerKey * @return bool */ - public function hasHandlerKey(string $handlerKey) : bool{ + public function hasHandlerKey(string $handlerKey) : bool { return array_key_exists($handlerKey, $this->handlerConfig); } @@ -380,21 +437,29 @@ abstract class AbstractLog implements LogInterface { * @param string $handlerKey * @return bool */ - public function hasHandlerGroupKey(string $handlerKey) : bool{ + public function hasHandlerGroupKey(string $handlerKey) : bool { return in_array($handlerKey, $this->getHandlerGroups()); } + /** + * @param string $processorKey + * @return bool + */ + public function hasProcessorKey(string $processorKey) : bool { + return array_key_exists($processorKey, $this->processorConfig); + } + /** * @return bool */ - public function hasBuffer() : bool{ + public function hasBuffer() : bool { return $this->buffer; } /** * @return bool */ - public function isGrouped() : bool{ + public function isGrouped() : bool { return !empty($this->getHandlerGroups()); } @@ -415,12 +480,12 @@ abstract class AbstractLog implements LogInterface { unset($this->handlerParamsConfig[$handlerKey]); } - // Handler parameters for Monolog\Handler\AbstractHandler --------------------------------------------------------- + // Handler parameters for Monolog\Handler\* instances ------------------------------------------------------------- /** * @return array */ - protected function getHandlerParamsStream() : array{ + protected function getHandlerParamsStream() : array { $params = []; if( !empty($conf = $this->handlerParamsConfig['stream']) ){ $params[] = $conf->stream; @@ -541,6 +606,16 @@ abstract class AbstractLog implements LogInterface { return $params; } + // Processor parameters for Monolog\Processor\* instances --------------------------------------------------------- + + /** + * get __construct() params for PsrLogMessageProcessor() call + * @return array + */ + protected function getProcessorParamsPsr() : array { + return !empty($conf = $this->processorParamsConfig['psr']) ? $conf : []; + } + /** * send this Log to global log buffer storage */ diff --git a/app/main/lib/logging/ApiLog.php b/app/Lib/Logging/ApiLog.php similarity index 81% rename from app/main/lib/logging/ApiLog.php rename to app/Lib/Logging/ApiLog.php index f92943f8..bfb9183e 100644 --- a/app/main/lib/logging/ApiLog.php +++ b/app/Lib/Logging/ApiLog.php @@ -6,7 +6,7 @@ * Time: 16:42 */ -namespace lib\logging; +namespace Exodus4D\Pathfinder\Lib\Logging; class ApiLog extends AbstractLog { @@ -20,8 +20,17 @@ class ApiLog extends AbstractLog { //'stream' => 'json' ]; + /** + * @var string + */ protected $channelType = 'api'; + /** + * ApiLog constructor. + * @param string $action + * @param string $level + * @throws \Exception + */ public function __construct(string $action, string $level){ parent::__construct($action); diff --git a/app/main/lib/logging/DefaultLog.php b/app/Lib/Logging/DefaultLog.php similarity index 83% rename from app/main/lib/logging/DefaultLog.php rename to app/Lib/Logging/DefaultLog.php index 885917d5..6a23a2ae 100644 --- a/app/main/lib/logging/DefaultLog.php +++ b/app/Lib/Logging/DefaultLog.php @@ -6,7 +6,7 @@ * Time: 22:08 */ -namespace lib\logging; +namespace Exodus4D\Pathfinder\Lib\Logging; class DefaultLog extends AbstractLog { diff --git a/app/main/lib/logging/formatter/MailFormatter.php b/app/Lib/Logging/Formatter/MailFormatter.php similarity index 84% rename from app/main/lib/logging/formatter/MailFormatter.php rename to app/Lib/Logging/Formatter/MailFormatter.php index 042872d4..dc990bd3 100644 --- a/app/main/lib/logging/formatter/MailFormatter.php +++ b/app/Lib/Logging/Formatter/MailFormatter.php @@ -6,13 +6,17 @@ * Time: 14:49 */ -namespace lib\logging\formatter; +namespace Exodus4D\Pathfinder\Lib\Logging\Formatter; -use lib\Config; +use Exodus4D\Pathfinder\Lib\Config; use Monolog\Formatter; class MailFormatter implements Formatter\FormatterInterface { + /** + * @param array $record + * @return mixed|string + */ public function format(array $record){ $tplDefaultData = [ @@ -34,6 +38,10 @@ class MailFormatter implements Formatter\FormatterInterface { return \Template::instance()->render('templates/mail/basic_inline.html', 'text/html', $tplData); } + /** + * @param array $records + * @return mixed|string + */ public function formatBatch(array $records){ $message = ''; foreach ($records as $key => $record) { diff --git a/app/main/lib/logging/handler/AbstractMapWebhookHandler.php b/app/Lib/Logging/Handler/AbstractMapWebhookHandler.php similarity index 97% rename from app/main/lib/logging/handler/AbstractMapWebhookHandler.php rename to app/Lib/Logging/Handler/AbstractMapWebhookHandler.php index 0a01ff32..2e34095d 100644 --- a/app/main/lib/logging/handler/AbstractMapWebhookHandler.php +++ b/app/Lib/Logging/Handler/AbstractMapWebhookHandler.php @@ -6,9 +6,9 @@ * Time: 10:18 */ -namespace lib\logging\handler; +namespace Exodus4D\Pathfinder\Lib\Logging\Handler; -use lib\Util; +use Exodus4D\Pathfinder\Lib\Util; abstract class AbstractMapWebhookHandler extends AbstractWebhookHandler { diff --git a/app/main/lib/logging/handler/AbstractRallyWebhookHandler.php b/app/Lib/Logging/Handler/AbstractRallyWebhookHandler.php similarity index 98% rename from app/main/lib/logging/handler/AbstractRallyWebhookHandler.php rename to app/Lib/Logging/Handler/AbstractRallyWebhookHandler.php index f77d4dd2..c8ca5ddf 100644 --- a/app/main/lib/logging/handler/AbstractRallyWebhookHandler.php +++ b/app/Lib/Logging/Handler/AbstractRallyWebhookHandler.php @@ -6,10 +6,10 @@ * Time: 10:09 */ -namespace lib\logging\handler; +namespace Exodus4D\Pathfinder\Lib\Logging\Handler; use League\HTMLToMarkdown\HtmlConverter; -use lib\Util; +use Exodus4D\Pathfinder\Lib\Util; abstract class AbstractRallyWebhookHandler extends AbstractWebhookHandler { @@ -150,7 +150,6 @@ abstract class AbstractRallyWebhookHandler extends AbstractWebhookHandler { protected function htmlToMarkdown($html){ $converter = new HtmlConverter(); $converter->getConfig()->setOption('strip_tags', true); - $markdown = $converter->convert($html); - return $markdown; + return $converter->convert($html); } } \ No newline at end of file diff --git a/app/main/lib/logging/handler/AbstractWebhookHandler.php b/app/Lib/Logging/Handler/AbstractWebhookHandler.php similarity index 98% rename from app/main/lib/logging/handler/AbstractWebhookHandler.php rename to app/Lib/Logging/Handler/AbstractWebhookHandler.php index 2bfaca53..50869218 100644 --- a/app/main/lib/logging/handler/AbstractWebhookHandler.php +++ b/app/Lib/Logging/Handler/AbstractWebhookHandler.php @@ -6,9 +6,9 @@ * Time: 20:08 */ -namespace lib\logging\handler; +namespace Exodus4D\Pathfinder\Lib\Logging\Handler; -use lib\Config; +use Exodus4D\Pathfinder\Lib\Config; use Monolog\Handler; use Monolog\Logger; @@ -127,7 +127,7 @@ abstract class AbstractWebhookHandler extends Handler\AbstractProcessingHandler * * @param array $record */ - protected function write(array $record){ + protected function write(array $record) : void { $record = $this->excludeFields($record); $postData = $this->getSlackData($record); diff --git a/app/main/lib/logging/handler/DiscordMapWebhookHandler.php b/app/Lib/Logging/Handler/DiscordMapWebhookHandler.php similarity index 76% rename from app/main/lib/logging/handler/DiscordMapWebhookHandler.php rename to app/Lib/Logging/Handler/DiscordMapWebhookHandler.php index 1c6b34c0..41f8c1a9 100644 --- a/app/main/lib/logging/handler/DiscordMapWebhookHandler.php +++ b/app/Lib/Logging/Handler/DiscordMapWebhookHandler.php @@ -6,7 +6,7 @@ * Time: 10:23 */ -namespace lib\logging\handler; +namespace Exodus4D\Pathfinder\Lib\Logging\Handler; class DiscordMapWebhookHandler extends AbstractMapWebhookHandler { diff --git a/app/main/lib/logging/handler/DiscordRallyWebhookHandler.php b/app/Lib/Logging/Handler/DiscordRallyWebhookHandler.php similarity index 78% rename from app/main/lib/logging/handler/DiscordRallyWebhookHandler.php rename to app/Lib/Logging/Handler/DiscordRallyWebhookHandler.php index 1078d65e..8ed8d986 100644 --- a/app/main/lib/logging/handler/DiscordRallyWebhookHandler.php +++ b/app/Lib/Logging/Handler/DiscordRallyWebhookHandler.php @@ -6,11 +6,15 @@ * Time: 10:13 */ -namespace lib\logging\handler; +namespace Exodus4D\Pathfinder\Lib\Logging\Handler; class DiscordRallyWebhookHandler extends AbstractRallyWebhookHandler { + /** + * @param $html + * @return string + */ protected function htmlToMarkdown($html){ $markdown = parent::htmlToMarkdown($html); // Discord supports syntax highlighting for MarkDown diff --git a/app/main/lib/logging/handler/SlackMapWebhookHandler.php b/app/Lib/Logging/Handler/SlackMapWebhookHandler.php similarity index 76% rename from app/main/lib/logging/handler/SlackMapWebhookHandler.php rename to app/Lib/Logging/Handler/SlackMapWebhookHandler.php index 72406c81..bff2a7f8 100644 --- a/app/main/lib/logging/handler/SlackMapWebhookHandler.php +++ b/app/Lib/Logging/Handler/SlackMapWebhookHandler.php @@ -6,9 +6,9 @@ * Time: 20:52 */ -namespace lib\logging\handler; +namespace Exodus4D\Pathfinder\Lib\Logging\Handler; + class SlackMapWebhookHandler extends AbstractMapWebhookHandler { - } \ No newline at end of file diff --git a/app/main/lib/logging/handler/SlackRallyWebhookHandler.php b/app/Lib/Logging/Handler/SlackRallyWebhookHandler.php similarity index 76% rename from app/main/lib/logging/handler/SlackRallyWebhookHandler.php rename to app/Lib/Logging/Handler/SlackRallyWebhookHandler.php index 319a7091..e90e2d31 100644 --- a/app/main/lib/logging/handler/SlackRallyWebhookHandler.php +++ b/app/Lib/Logging/Handler/SlackRallyWebhookHandler.php @@ -6,12 +6,9 @@ * Time: 17:32 */ -namespace lib\logging\handler; +namespace Exodus4D\Pathfinder\Lib\Logging\Handler; class SlackRallyWebhookHandler extends AbstractRallyWebhookHandler { - - - } \ No newline at end of file diff --git a/app/main/lib/logging/handler/SocketHandler.php b/app/Lib/Logging/Handler/SocketHandler.php similarity index 81% rename from app/main/lib/logging/handler/SocketHandler.php rename to app/Lib/Logging/Handler/SocketHandler.php index 24d2b9fb..071d87e9 100644 --- a/app/main/lib/logging/handler/SocketHandler.php +++ b/app/Lib/Logging/Handler/SocketHandler.php @@ -6,7 +6,7 @@ * Time: 19:11 */ -namespace lib\logging\handler; +namespace Exodus4D\Pathfinder\Lib\Logging\Handler; use Monolog\Logger; @@ -19,6 +19,13 @@ class SocketHandler extends \Monolog\Handler\SocketHandler { */ protected $metaData = []; + /** + * SocketHandler constructor. + * @param $connectionString + * @param int $level + * @param bool $bubble + * @param array $metaData + */ public function __construct($connectionString, $level = Logger::DEBUG, $bubble = true, $metaData = []){ $this->metaData = $metaData; @@ -31,7 +38,7 @@ class SocketHandler extends \Monolog\Handler\SocketHandler { * @param array $record * @return bool */ - public function handle(array $record){ + public function handle(array $record) : bool { if (!$this->isHandling($record)) { return false; } diff --git a/app/main/lib/logging/LogCollection.php b/app/Lib/Logging/LogCollection.php similarity index 97% rename from app/main/lib/logging/LogCollection.php rename to app/Lib/Logging/LogCollection.php index 5e8ea48b..721a3972 100644 --- a/app/main/lib/logging/LogCollection.php +++ b/app/Lib/Logging/LogCollection.php @@ -6,7 +6,7 @@ * Time: 11:23 */ -namespace lib\logging; +namespace Exodus4D\Pathfinder\Lib\Logging; class LogCollection extends AbstractLog { @@ -32,6 +32,10 @@ class LogCollection extends AbstractLog { */ private $collection = null; + /** + * LogCollection constructor. + * @param string $action + */ public function __construct(string $action){ parent::__construct($action); diff --git a/app/Lib/Logging/LogInterface.php b/app/Lib/Logging/LogInterface.php new file mode 100644 index 00000000..e5346dd6 --- /dev/null +++ b/app/Lib/Logging/LogInterface.php @@ -0,0 +1,71 @@ + 'Monolog\Formatter\LineFormatter', 'json' => 'Monolog\Formatter\JsonFormatter', 'html' => 'Monolog\Formatter\HtmlFormatter', - 'mail' => 'lib\logging\formatter\MailFormatter' + 'mail' => 'Exodus4D\Pathfinder\Lib\Logging\Formatter\MailFormatter' ]; + /** + * available handlers + */ const HANDLER = [ 'stream' => 'Monolog\Handler\StreamHandler', 'mail' => 'Monolog\Handler\SwiftMailerHandler', - 'socket' => 'lib\logging\handler\SocketHandler', - 'slackMap' => 'lib\logging\handler\SlackMapWebhookHandler', - 'slackRally' => 'lib\logging\handler\SlackRallyWebhookHandler', - 'discordMap' => 'lib\logging\handler\DiscordMapWebhookHandler', - 'discordRally' => 'lib\logging\handler\DiscordRallyWebhookHandler' + 'socket' => 'Exodus4D\Pathfinder\Lib\Logging\Handler\SocketHandler', + 'slackMap' => 'Exodus4D\Pathfinder\Lib\Logging\Handler\SlackMapWebhookHandler', + 'slackRally' => 'Exodus4D\Pathfinder\Lib\Logging\Handler\SlackRallyWebhookHandler', + 'discordMap' => 'Exodus4D\Pathfinder\Lib\Logging\Handler\DiscordMapWebhookHandler', + 'discordRally' => 'Exodus4D\Pathfinder\Lib\Logging\Handler\DiscordRallyWebhookHandler' ]; + /** + * available processors + */ const PROCESSOR = [ 'psr' => 'Monolog\Processor\PsrLogMessageProcessor' ]; @@ -54,12 +75,7 @@ class Monolog extends \Prefab { ]; public function __construct(){ - // set timezone for all Logger instances - if(class_exists(Logger::class)){ - if( is_callable($getTimezone = \Base::instance()->get('getTimeZone')) ){ - Logger::setTimezone($getTimezone()); - }; - }else{ + if(!class_exists(Logger::class)){ LogController::getLogger('ERROR')->write(sprintf(Config::ERROR_CLASS_NOT_EXISTS_COMPOSER, Logger::class)); } } @@ -107,6 +123,10 @@ class Monolog extends \Prefab { }else{ $logger = new Logger($log->getChannelName()); + if(is_callable($getTimezone = \Base::instance()->get('getTimeZone'))){ + $logger->setTimezone($getTimezone()); + } + // disable microsecond timestamps (seconds should be fine) $logger->useMicrosecondTimestamps(true); @@ -143,7 +163,8 @@ class Monolog extends \Prefab { $logger->pushProcessor($processorCallback); }else{ // get Monolog Processor class - $processor = $this->getProcessor($processorKey); + $processorParams = $log->getProcessorParams($processorKey); + $processor = $this->getProcessor($processorKey, $processorParams); $logger->pushProcessor($processor); } } @@ -187,7 +208,7 @@ class Monolog extends \Prefab { * @return HandlerInterface * @throws \Exception */ - private function getHandler(string $handlerKey, array $handlerParams = []): HandlerInterface{ + private function getHandler(string $handlerKey, array $handlerParams = []) : HandlerInterface{ if(array_key_exists($handlerKey, self::HANDLER)){ $handlerClass = self::HANDLER[$handlerKey]; $handler = new $handlerClass(...$handlerParams); @@ -201,13 +222,14 @@ class Monolog extends \Prefab { /** * get Monolog Processor instance by key * @param string $processorKey - * @return callable + * @param array $processorParams + * @return ProcessorInterface * @throws \Exception */ - private function getProcessor(string $processorKey): callable { + private function getProcessor(string $processorKey, array $processorParams = []) : ProcessorInterface { if(array_key_exists($processorKey, self::PROCESSOR)){ $ProcessorClass = self::PROCESSOR[$processorKey]; - $processor = new $ProcessorClass(); + $processor = new $ProcessorClass(...$processorParams); }else{ throw new \Exception(sprintf(self::ERROR_PROCESSOR, $processorKey)); } diff --git a/app/main/lib/PriorityCacheStore.php b/app/Lib/PriorityCacheStore.php similarity index 98% rename from app/main/lib/PriorityCacheStore.php rename to app/Lib/PriorityCacheStore.php index 740d0a32..85add008 100644 --- a/app/main/lib/PriorityCacheStore.php +++ b/app/Lib/PriorityCacheStore.php @@ -1,7 +1,7 @@ 'style', - 'script' => 'script', - 'font' => 'font', - 'document' => 'document', - 'image' => 'image', - 'url' => '' + 'style' => 'style', + 'script' => 'script', + 'font' => 'font', + 'document' => 'document', + 'image' => 'image', + 'url' => '' ]; /** * default link "type" attributes */ const ATTR_TYPE = [ - 'font' => 'font/woff2' + 'font' => 'font/woff2' ]; /** * default additional attributes by $group */ const ATTR_ADD = [ - 'font' => ['crossorigin' => 'anonymous'] + 'font' => ['crossorigin' => 'anonymous'] ]; + /** + * BASE path + * @var string + */ + private $basePath = ''; + /** * absolute file path -> use setOption() for update * @var array */ private $filePath = [ - 'style' => '', - 'script' => '', - 'font' => '', - 'document' => '', - 'image' => '', - 'url' => '' + 'style' => '', + 'script' => '', + 'font' => '', + 'document' => '', + 'image' => '', + 'favicon' => '', + 'url' => '' ]; /** @@ -62,10 +69,10 @@ class Resource extends \Prefab { * @var array */ private $fileExt = [ - 'style' => 'css', - 'script' => 'js', - 'document' => 'html', - 'font' => 'woff2' + 'style' => 'css', + 'script' => 'js', + 'document' => 'html', + 'font' => 'woff2' ]; /** @@ -76,7 +83,7 @@ class Resource extends \Prefab { * @see buildHeader() * @var string */ - private $output = 'inline'; + private $output = 'inline'; /** * resource file cache @@ -134,7 +141,7 @@ class Resource extends \Prefab { * @return string */ public function getPath(string $group) : string { - return $this->filePath[$group]; + return rtrim($this->basePath, '/\\') . $this->filePath[$group]; } /** diff --git a/app/main/lib/socket/AbstractSocket.php b/app/Lib/Socket/AbstractSocket.php similarity index 99% rename from app/main/lib/socket/AbstractSocket.php rename to app/Lib/Socket/AbstractSocket.php index 90c79419..94daba1d 100644 --- a/app/main/lib/socket/AbstractSocket.php +++ b/app/Lib/Socket/AbstractSocket.php @@ -6,7 +6,7 @@ * Time: 19:13 */ -namespace lib\socket; +namespace Exodus4D\Pathfinder\Lib\Socket; use React\EventLoop; @@ -237,12 +237,10 @@ abstract class AbstractSocket implements SocketInterface { * @return array */ protected function newPayload(string $task, $load = null) : array { - $payload = [ + return [ 'task' => $task, 'load' => $load ]; - - return $payload; } /** diff --git a/app/main/lib/socket/NullSocket.php b/app/Lib/Socket/NullSocket.php similarity index 94% rename from app/main/lib/socket/NullSocket.php rename to app/Lib/Socket/NullSocket.php index 9b60e3cb..7702f642 100644 --- a/app/main/lib/socket/NullSocket.php +++ b/app/Lib/Socket/NullSocket.php @@ -6,7 +6,7 @@ * Time: 23:22 */ -namespace lib\socket; +namespace Exodus4D\Pathfinder\Lib\Socket; use React\Socket; diff --git a/app/main/lib/socket/SocketInterface.php b/app/Lib/Socket/SocketInterface.php similarity index 93% rename from app/main/lib/socket/SocketInterface.php rename to app/Lib/Socket/SocketInterface.php index e56bf33d..238c97a9 100644 --- a/app/main/lib/socket/SocketInterface.php +++ b/app/Lib/Socket/SocketInterface.php @@ -6,10 +6,9 @@ * Time: 11:26 */ -namespace lib\socket; +namespace Exodus4D\Pathfinder\Lib\Socket; -use React\EventLoop; use React\Promise; interface SocketInterface { diff --git a/app/main/lib/socket/TcpSocket.php b/app/Lib/Socket/TcpSocket.php similarity index 91% rename from app/main/lib/socket/TcpSocket.php rename to app/Lib/Socket/TcpSocket.php index 68dbb875..651a79db 100644 --- a/app/main/lib/socket/TcpSocket.php +++ b/app/Lib/Socket/TcpSocket.php @@ -6,7 +6,7 @@ * Time: 10:04 */ -namespace lib\socket; +namespace Exodus4D\Pathfinder\Lib\Socket; use React\Socket; diff --git a/app/main/lib/util.php b/app/Lib/Util.php similarity index 99% rename from app/main/lib/util.php rename to app/Lib/Util.php index 8d031de6..ec9d3324 100644 --- a/app/main/lib/util.php +++ b/app/Lib/Util.php @@ -6,7 +6,8 @@ * Time: 17:32 */ -namespace lib; +namespace Exodus4D\Pathfinder\Lib; + class Util { diff --git a/app/main/model/abstractmodel.php b/app/Model/AbstractModell.php similarity index 98% rename from app/main/model/abstractmodel.php rename to app/Model/AbstractModell.php index 42411ede..f87e8ad5 100644 --- a/app/main/model/abstractmodel.php +++ b/app/Model/AbstractModell.php @@ -6,16 +6,17 @@ * Time: 22:11 */ -namespace Model; +namespace Exodus4D\Pathfinder\Model; use DB\Cortex; use DB\CortexCollection; use DB\SQL\Schema; -use lib\Util; -use lib\logging; -use Controller; -use Exception\ValidationException; -use Exception\DatabaseException; +use Exodus4D\Pathfinder\Lib\Util; +use Exodus4D\Pathfinder\Lib\Logging; +use Exodus4D\Pathfinder\Controller; +use Exodus4D\Pathfinder\Db\Sql\Mysql; +use Exodus4D\Pathfinder\Exception\ValidationException; +use Exodus4D\Pathfinder\Exception\DatabaseException; abstract class AbstractModel extends Cortex { @@ -326,7 +327,7 @@ abstract class AbstractModel extends Cortex { $valid = $this->$method($key, $val); }else{ self::getF3()->error(501, 'Method ' . get_class($this) . '->' . $method . '() is not implemented'); - }; + } } } @@ -1053,13 +1054,12 @@ abstract class AbstractModel extends Cortex { /** * get tableModifier class for this table - * @return bool|\DB\SQL\TableModifier + * @return bool|Mysql\TableModifier */ public static function getTableModifier(){ $df = parent::resolveConfiguration(); $schema = new Schema($df['db']); - $tableModifier = $schema->alterTable($df['table']); - return $tableModifier; + return $schema->alterTable($df['table']); } /** diff --git a/app/main/model/pathfinder/abstractmaptrackingmodel.php b/app/Model/Pathfinder/AbstractMapTrackingModel.php similarity index 90% rename from app/main/model/pathfinder/abstractmaptrackingmodel.php rename to app/Model/Pathfinder/AbstractMapTrackingModel.php index 8f4b65cf..510a86a8 100644 --- a/app/main/model/pathfinder/abstractmaptrackingmodel.php +++ b/app/Model/Pathfinder/AbstractMapTrackingModel.php @@ -6,9 +6,10 @@ * Time: 18:45 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; +use Exodus4D\Pathfinder\Exception; abstract class AbstractMapTrackingModel extends AbstractPathfinderModel implements LogModelInterface { @@ -19,7 +20,7 @@ abstract class AbstractMapTrackingModel extends AbstractPathfinderModel implemen 'createdCharacterId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\CharacterModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\CharacterModel', 'constraint' => [ [ 'table' => 'character', @@ -31,7 +32,7 @@ abstract class AbstractMapTrackingModel extends AbstractPathfinderModel implemen 'updatedCharacterId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\CharacterModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\CharacterModel', 'constraint' => [ [ 'table' => 'character', @@ -70,7 +71,7 @@ abstract class AbstractMapTrackingModel extends AbstractPathfinderModel implemen /** * validates all required columns of this class * @return bool - * @throws \Exception\DatabaseException + * @throws Exception\DatabaseException */ public function isValid(): bool { if($valid = parent::isValid()){ diff --git a/app/main/model/pathfinder/abstractpathfindermodel.php b/app/Model/Pathfinder/AbstractPathfinderModell.php similarity index 84% rename from app/main/model/pathfinder/abstractpathfindermodel.php rename to app/Model/Pathfinder/AbstractPathfinderModell.php index bbd7532f..4f487c18 100644 --- a/app/main/model/pathfinder/abstractpathfindermodel.php +++ b/app/Model/Pathfinder/AbstractPathfinderModell.php @@ -1,10 +1,9 @@ _id > 0){ - $this->db->exec( - ["UPDATE " . $this->table . " SET updated=NOW() WHERE id=:id"], - [ - [':id' => $this->_id] - ] - ); - } - } - /** * get old and new value from field, in case field is configured with 'activity-log' * @return array @@ -79,7 +63,7 @@ abstract class AbstractPathfinderModel extends AbstractModel { if($this->enableActivityLogging){ // filter fields, where "activity" (changes) should be logged - $fieldConf = array_filter($this->fieldConf, function($fieldConf, $key) { + $fieldConf = array_filter($this->fieldConf, function($fieldConf, $key){ return isset($fieldConf['activity-log']) ? (bool)$fieldConf['activity-log'] : false; }, ARRAY_FILTER_USE_BOTH); diff --git a/app/main/model/pathfinder/abstractsystemapibasicmodel.php b/app/Model/Pathfinder/AbstractSystemApiBasicModel.php similarity index 98% rename from app/main/model/pathfinder/abstractsystemapibasicmodel.php rename to app/Model/Pathfinder/AbstractSystemApiBasicModel.php index b603dd13..89728c64 100644 --- a/app/main/model/pathfinder/abstractsystemapibasicmodel.php +++ b/app/Model/Pathfinder/AbstractSystemApiBasicModel.php @@ -6,7 +6,7 @@ * Time: 22:11 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; diff --git a/app/main/model/pathfinder/activitylogmodel.php b/app/Model/Pathfinder/ActivityLogModel.php similarity index 92% rename from app/main/model/pathfinder/activitylogmodel.php rename to app/Model/Pathfinder/ActivityLogModel.php index efb8631b..bfe47e39 100644 --- a/app/main/model/pathfinder/activitylogmodel.php +++ b/app/Model/Pathfinder/ActivityLogModel.php @@ -6,14 +6,20 @@ * Time: 15:11 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; class ActivityLogModel extends AbstractPathfinderModel { + /** + * @var string + */ protected $table = 'activity_log'; + /** + * @var array + */ protected $fieldConf = [ 'active' => [ 'type' => Schema::DT_BOOL, @@ -24,7 +30,7 @@ class ActivityLogModel extends AbstractPathfinderModel { 'characterId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\CharacterModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\CharacterModel', 'constraint' => [ [ 'table' => 'character', @@ -35,7 +41,7 @@ class ActivityLogModel extends AbstractPathfinderModel { 'mapId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\MapModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\MapModel', 'constraint' => [ [ 'table' => 'map', @@ -129,6 +135,13 @@ class ActivityLogModel extends AbstractPathfinderModel { ], ]; + /** + * ActivityLogModel constructor. + * @param null $db + * @param null $table + * @param null $fluid + * @param int $ttl + */ public function __construct($db = NULL, $table = NULL, $fluid = NULL, $ttl = 0){ $this->addStaticDateFieldConfig(); diff --git a/app/main/model/pathfinder/alliancemapmodel.php b/app/Model/Pathfinder/AllianceMapModel.php similarity index 88% rename from app/main/model/pathfinder/alliancemapmodel.php rename to app/Model/Pathfinder/AllianceMapModel.php index 0152b5ff..e13a39de 100644 --- a/app/main/model/pathfinder/alliancemapmodel.php +++ b/app/Model/Pathfinder/AllianceMapModel.php @@ -6,7 +6,7 @@ * Time: 20:14 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; @@ -30,7 +30,7 @@ class AllianceMapModel extends AbstractPathfinderModel { 'allianceId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\AllianceModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\AllianceModel', 'constraint' => [ [ 'table' => 'alliance', @@ -41,7 +41,7 @@ class AllianceMapModel extends AbstractPathfinderModel { 'mapId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\MapModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\MapModel', 'constraint' => [ [ 'table' => 'map', diff --git a/app/main/model/pathfinder/alliancemodel.php b/app/Model/Pathfinder/AllianceModel.php similarity index 91% rename from app/main/model/pathfinder/alliancemodel.php rename to app/Model/Pathfinder/AllianceModel.php index 680dcacd..7d9e408d 100644 --- a/app/main/model/pathfinder/alliancemodel.php +++ b/app/Model/Pathfinder/AllianceModel.php @@ -6,10 +6,10 @@ * Time: 20:43 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; -use lib\Config; +use Exodus4D\Pathfinder\Lib\Config; class AllianceModel extends AbstractPathfinderModel { @@ -44,10 +44,10 @@ class AllianceModel extends AbstractPathfinderModel { 'default' => 0 ], 'allianceCharacters' => [ - 'has-many' => ['Model\Pathfinder\CharacterModel', 'allianceId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\CharacterModel', 'allianceId'] ], 'mapAlliances' => [ - 'has-many' => ['Model\Pathfinder\AllianceMapModel', 'allianceId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\AllianceMapModel', 'allianceId'] ] ]; @@ -63,7 +63,7 @@ class AllianceModel extends AbstractPathfinderModel { $allianceData->shared = $this->shared; return $allianceData; - }/** @noinspection PhpHierarchyChecksInspection */ + } /** * Event "Hook" function @@ -150,7 +150,7 @@ class AllianceModel extends AbstractPathfinderModel { $loaded = parent::getById($id, $ttl, $isActive); if($this->isOutdated()){ // request alliance data - $allianceData = self::getF3()->ccpClient()->getAllianceData($id); + $allianceData = self::getF3()->ccpClient()->send('getAlliance', $id); if(!empty($allianceData) && !isset($allianceData['error'])){ $this->copyfrom($allianceData, ['id', 'name', 'ticker']); $this->save(); diff --git a/app/main/model/pathfinder/characterauthenticationmodel.php b/app/Model/Pathfinder/CharacterAuthenticationModel.php similarity index 87% rename from app/main/model/pathfinder/characterauthenticationmodel.php rename to app/Model/Pathfinder/CharacterAuthenticationModel.php index b80e773b..f73101c5 100644 --- a/app/main/model/pathfinder/characterauthenticationmodel.php +++ b/app/Model/Pathfinder/CharacterAuthenticationModel.php @@ -6,15 +6,21 @@ * Time: 19:33 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; -use Controller; +use Exodus4D\Pathfinder\Controller; class CharacterAuthenticationModel extends AbstractPathfinderModel{ + /** + * @var string + */ protected $table = 'character_authentication'; + /** + * @var array + */ protected $fieldConf = [ 'active' => [ 'type' => Schema::DT_BOOL, @@ -25,7 +31,7 @@ class CharacterAuthenticationModel extends AbstractPathfinderModel{ 'characterId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\CharacterModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\CharacterModel', 'constraint' => [ [ 'table' => 'character', diff --git a/app/main/model/pathfinder/characterlogmodel.php b/app/Model/Pathfinder/CharacterLogModel.php similarity index 98% rename from app/main/model/pathfinder/characterlogmodel.php rename to app/Model/Pathfinder/CharacterLogModel.php index 1e4a6b10..82afa5d0 100644 --- a/app/main/model/pathfinder/characterlogmodel.php +++ b/app/Model/Pathfinder/CharacterLogModel.php @@ -6,7 +6,7 @@ * Time: 00:04 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; @@ -37,7 +37,7 @@ class CharacterLogModel extends AbstractPathfinderModel { 'type' => Schema::DT_INT, 'index' => true, 'unique' => true, - 'belongs-to-one' => 'Model\Pathfinder\CharacterModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\CharacterModel', 'constraint' => [ [ 'table' => 'character', diff --git a/app/main/model/pathfinder/charactermapmodel.php b/app/Model/Pathfinder/CharacterMapModel.php similarity index 84% rename from app/main/model/pathfinder/charactermapmodel.php rename to app/Model/Pathfinder/CharacterMapModel.php index 688ce91e..83428264 100644 --- a/app/main/model/pathfinder/charactermapmodel.php +++ b/app/Model/Pathfinder/CharacterMapModel.php @@ -6,14 +6,20 @@ * Time: 12:31 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; class CharacterMapModel extends AbstractPathfinderModel { + /** + * @var string + */ protected $table = 'character_map'; + /** + * @var array + */ protected $fieldConf = [ 'active' => [ 'type' => Schema::DT_BOOL, @@ -24,7 +30,7 @@ class CharacterMapModel extends AbstractPathfinderModel { 'characterId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\CharacterModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\CharacterModel', 'constraint' => [ [ 'table' => 'character', @@ -35,7 +41,7 @@ class CharacterMapModel extends AbstractPathfinderModel { 'mapId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\MapModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\MapModel', 'constraint' => [ [ 'table' => 'map', diff --git a/app/main/model/pathfinder/charactermodel.php b/app/Model/Pathfinder/CharacterModel.php similarity index 96% rename from app/main/model/pathfinder/charactermodel.php rename to app/Model/Pathfinder/CharacterModel.php index 49082bf6..ac6af0df 100644 --- a/app/main/model/pathfinder/charactermodel.php +++ b/app/Model/Pathfinder/CharacterModel.php @@ -6,13 +6,13 @@ * Time: 15:20 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; -use Controller\Ccp\Sso as Sso; -use Controller\Api\User as User; +use Exodus4D\Pathfinder\Controller\Ccp\Sso as Sso; +use Exodus4D\Pathfinder\Controller\Api\User as User; +use Exodus4D\Pathfinder\Lib\Config; +use Exodus4D\Pathfinder\Model\Universe; use DB\SQL\Schema; -use lib\Config; -use Model\Universe; class CharacterModel extends AbstractPathfinderModel { @@ -116,7 +116,7 @@ class CharacterModel extends AbstractPathfinderModel { 'corporationId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\CorporationModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\CorporationModel', 'constraint' => [ [ 'table' => 'corporation', @@ -127,7 +127,7 @@ class CharacterModel extends AbstractPathfinderModel { 'allianceId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\AllianceModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\AllianceModel', 'constraint' => [ [ 'table' => 'alliance', @@ -140,7 +140,7 @@ class CharacterModel extends AbstractPathfinderModel { 'nullable' => false, 'default' => 1, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\RoleModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\RoleModel', 'constraint' => [ [ 'table' => 'role', @@ -187,16 +187,16 @@ class CharacterModel extends AbstractPathfinderModel { 'default' => 0 ], 'userCharacter' => [ - 'has-one' => ['Model\Pathfinder\UserCharacterModel', 'characterId'] + 'has-one' => ['Exodus4D\Pathfinder\Model\Pathfinder\UserCharacterModel', 'characterId'] ], 'characterLog' => [ - 'has-one' => ['Model\Pathfinder\CharacterLogModel', 'characterId'] + 'has-one' => ['Exodus4D\Pathfinder\Model\Pathfinder\CharacterLogModel', 'characterId'] ], 'characterMaps' => [ - 'has-many' => ['Model\Pathfinder\CharacterMapModel', 'characterId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\CharacterMapModel', 'characterId'] ], 'characterAuthentications' => [ - 'has-many' => ['Model\Pathfinder\CharacterAuthenticationModel', 'characterId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\CharacterAuthenticationModel', 'characterId'] ] ]; @@ -707,7 +707,7 @@ class CharacterModel extends AbstractPathfinderModel { * @return RoleModel * @throws \Exception */ - protected function requestRole() : RoleModel { + protected function getRole() : RoleModel { $role = null; // check config files for hardcoded character roles @@ -730,11 +730,12 @@ class CharacterModel extends AbstractPathfinderModel { // check in-game roles if( is_null($role) && - !empty($rolesData = $this->requestRoles()) + !empty($rolesData = $this->requestRoles()) && + !empty($roles = $rolesData['roles']) ){ // roles that grant admin access for this character - $adminRoles = array_intersect(CorporationModel::ADMIN_ROLES, $rolesData); - if( !empty($adminRoles) ){ + $adminRoles = array_intersect(CorporationModel::ADMIN_ROLES, $roles); + if(!empty($adminRoles)){ $role = RoleModel::getCorporationManagerRole(); } } @@ -748,26 +749,16 @@ class CharacterModel extends AbstractPathfinderModel { } /** - * request all corporation roles granted to this character + * get all character roles grouped by 'role type' + * -> 'role types' are 'roles', 'rolesAtBase', 'rolesAtHq', 'rolesAtOther' * @return array - * @throws \Exception */ protected function requestRoles() : array { $rolesData = []; - - // check if character has accepted all admin scopes (one of them is required for "role" request) - if( $this->hasAdminScopes() ){ - if( $accessToken = $this->getAccessToken() ){ - // check if corporation exists (should never fail) - if( $corporation = $this->getCorporation() ){ - $characterRolesData = $corporation->getCharactersRoles($accessToken); - if( !empty($characterRolesData[$this->_id]) ){ - $rolesData = $characterRolesData[$this->_id]; - } - } - } + $response = self::getF3()->ccpClient()->send('getCharacterRoles', $this->_id, $this->getAccessToken()); + if(!empty($response) && !isset($response['error'])){ + $rolesData = $response; } - return $rolesData; } @@ -792,7 +783,7 @@ class CharacterModel extends AbstractPathfinderModel { */ public function updateCloneData(){ if($accessToken = $this->getAccessToken()){ - $clonesData = self::getF3()->ccpClient()->getCharacterClonesData($this->_id, $accessToken); + $clonesData = self::getF3()->ccpClient()->send('getCharacterClones', $this->_id, $accessToken); if(!isset($clonesData['error'])){ if(!empty($homeLocationData = $clonesData['home']['location'])){ // clone home location data @@ -807,7 +798,7 @@ class CharacterModel extends AbstractPathfinderModel { * @throws \Exception */ public function updateRoleData(){ - $this->roleId = $this->requestRole(); + $this->roleId = $this->getRole(); } /** @@ -816,7 +807,7 @@ class CharacterModel extends AbstractPathfinderModel { * @return array */ protected function getOnlineData(string $accessToken) : array { - return self::getF3()->ccpClient()->getCharacterOnlineData($this->_id, $accessToken); + return self::getF3()->ccpClient()->send('getCharacterOnline', $this->_id, $accessToken); } /** @@ -855,7 +846,7 @@ class CharacterModel extends AbstractPathfinderModel { // Try to pull data from API if($accessToken = $this->getAccessToken()){ if($this->isOnline($accessToken)){ - $locationData = self::getF3()->ccpClient()->getCharacterLocationData($this->_id, $accessToken); + $locationData = self::getF3()->ccpClient()->send('getCharacterLocation', $this->_id, $accessToken); if(!empty($locationData['system']['id'])){ // character is currently in-game @@ -886,7 +877,7 @@ class CharacterModel extends AbstractPathfinderModel { // get "more" data for systemId --------------------------------------------------------------- if(!empty($lookupUniverseIds)){ // get "more" information for some Ids (e.g. name) - $universeData = self::getF3()->ccpClient()->getUniverseNamesData($lookupUniverseIds); + $universeData = self::getF3()->ccpClient()->send('getUniverseNames', $lookupUniverseIds); if(!empty($universeData) && !isset($universeData['error'])){ // We expect max ONE system AND/OR station data, not an array of e.g. systems @@ -967,7 +958,7 @@ class CharacterModel extends AbstractPathfinderModel { // check ship data for changes ---------------------------------------------------------------- if(!$deleteLog){ - $shipData = self::getF3()->ccpClient()->getCharacterShipData($this->_id, $accessToken); + $shipData = self::getF3()->ccpClient()->send('getCharacterShip', $this->_id, $accessToken); // IDs for "shipTypeId" that require more data $lookupShipTypeId = 0; @@ -1098,7 +1089,7 @@ class CharacterModel extends AbstractPathfinderModel { if($logHistoryData = $this->getLogsHistory()){ // skip logging if no relevant fields changed - list($historyEntryPrev) = $logHistoryData; + [$historyEntryPrev] = $logHistoryData; if($historyLogPrev = $historyEntryPrev['log']){ if( $historyLog['system']['id'] === $historyLogPrev['system']['id'] && diff --git a/app/main/model/pathfinder/characterstatusmodel.php b/app/Model/Pathfinder/CharacterStatusModel.php similarity index 87% rename from app/main/model/pathfinder/characterstatusmodel.php rename to app/Model/Pathfinder/CharacterStatusModel.php index 1d5eab8f..ba98c2e3 100644 --- a/app/main/model/pathfinder/characterstatusmodel.php +++ b/app/Model/Pathfinder/CharacterStatusModel.php @@ -6,14 +6,20 @@ * Time: 21:12 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; class CharacterStatusModel extends AbstractPathfinderModel { + /** + * @var string + */ protected $table = 'character_status'; + /** + * @var array + */ protected $fieldConf = [ 'active' => [ 'type' => Schema::DT_BOOL, @@ -33,6 +39,9 @@ class CharacterStatusModel extends AbstractPathfinderModel { ] ]; + /** + * @var array + */ protected static $tableData = [ [ 'id' => 1, diff --git a/app/main/model/pathfinder/connectionlogmodel.php b/app/Model/Pathfinder/ConnectionLogModel.php similarity index 94% rename from app/main/model/pathfinder/connectionlogmodel.php rename to app/Model/Pathfinder/ConnectionLogModel.php index 8f3aab9c..96ffa6cf 100644 --- a/app/main/model/pathfinder/connectionlogmodel.php +++ b/app/Model/Pathfinder/ConnectionLogModel.php @@ -6,14 +6,20 @@ * Time: 17:51 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; class ConnectionLogModel extends AbstractPathfinderModel { + /** + * @var string + */ protected $table = 'connection_log'; + /** + * @var array + */ protected $fieldConf = [ 'active' => [ 'type' => Schema::DT_BOOL, @@ -24,7 +30,7 @@ class ConnectionLogModel extends AbstractPathfinderModel { 'connectionId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\ConnectionModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\ConnectionModel', 'constraint' => [ [ 'table' => 'connection', diff --git a/app/main/model/pathfinder/connectionmodel.php b/app/Model/Pathfinder/ConnectionModel.php similarity index 89% rename from app/main/model/pathfinder/connectionmodel.php rename to app/Model/Pathfinder/ConnectionModel.php index 9eb3139e..11919d7d 100644 --- a/app/main/model/pathfinder/connectionmodel.php +++ b/app/Model/Pathfinder/ConnectionModel.php @@ -6,11 +6,12 @@ * Time: 21:12 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; -use Controller\Api\Route; -use lib\logging; +use Exodus4D\Pathfinder\Controller\Api\Rest\Route; +use Exodus4D\Pathfinder\Lib\Logging; +use Exodus4D\Pathfinder\Exception; class ConnectionModel extends AbstractMapTrackingModel { @@ -32,7 +33,7 @@ class ConnectionModel extends AbstractMapTrackingModel { 'mapId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\MapModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\MapModel', 'constraint' => [ [ 'table' => 'map', @@ -43,7 +44,7 @@ class ConnectionModel extends AbstractMapTrackingModel { 'source' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\SystemModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\SystemModel', 'constraint' => [ [ 'table' => 'system', @@ -55,7 +56,7 @@ class ConnectionModel extends AbstractMapTrackingModel { 'target' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\SystemModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\SystemModel', 'constraint' => [ [ 'table' => 'system', @@ -87,10 +88,10 @@ class ConnectionModel extends AbstractMapTrackingModel { 'default' => null ], 'signatures' => [ - 'has-many' => ['Model\Pathfinder\SystemSignatureModel', 'connectionId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\SystemSignatureModel', 'connectionId'] ], 'connectionLog' => [ - 'has-many' => ['Model\Pathfinder\ConnectionLogModel', 'connectionId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\ConnectionLogModel', 'connectionId'] ] ]; @@ -129,7 +130,7 @@ class ConnectionModel extends AbstractMapTrackingModel { $connectionData->source = $this->source->id; $connectionData->target = $this->target->id; $connectionData->scope = $this->scope; - $connectionData->type = $this->type; + $connectionData->type = (array)json_decode($this->get('type', true)); $connectionData->updated = strtotime($this->updated); $connectionData->created = strtotime($this->created); $connectionData->eolUpdated = strtotime($this->eolUpdated); @@ -156,7 +157,7 @@ class ConnectionModel extends AbstractMapTrackingModel { /** * setter for connection type * @param $type - * @return int|number + * @return array */ public function set_type($type){ // remove unwanted types -> they should not be send from client @@ -218,10 +219,10 @@ class ConnectionModel extends AbstractMapTrackingModel { } /** - * set default connection type by search route between endpoints + * set default connection scope + type by search route between endpoints * @throws \Exception */ - public function setDefaultTypeData(){ + public function setAutoScopeAndType(){ if( is_object($this->source) && is_object($this->target) @@ -232,17 +233,16 @@ class ConnectionModel extends AbstractMapTrackingModel { ){ $this->scope = 'abyssal'; $this->type = ['abyssal']; + }elseif( + $this->source->isKspace() && + $this->target->isKspace() && + (new Route())->searchRoute($this->source->systemId, $this->target->systemId, 1)['routePossible'] + ){ + $this->scope = 'stargate'; + $this->type = ['stargate']; }else{ - $routeController = new Route(); - $route = $routeController->searchRoute($this->source->systemId, $this->target->systemId, 1); - - if($route['routePossible']){ - $this->scope = 'stargate'; - $this->type = ['stargate']; - }else{ - $this->scope = 'wh'; - $this->type = ['wh_fresh']; - } + $this->scope = 'wh'; + $this->type = ['wh_fresh']; } } } @@ -258,7 +258,7 @@ class ConnectionModel extends AbstractMapTrackingModel { /** * check whether this model is valid or not * @return bool - * @throws \Exception\DatabaseException + * @throws Exception\DatabaseException */ public function isValid() : bool { if($valid = parent::isValid()){ @@ -278,13 +278,14 @@ class ConnectionModel extends AbstractMapTrackingModel { } /** - * Event "Hook" function + * Event "Hook" function * can be overwritten * return false will stop any further action - * @param self $self + * @param \Exodus4D\Pathfinder\Model\AbstractModel $self * @param $pkeys * @return bool - * @throws \Exception\DatabaseException + * @throws Exception\DatabaseException + * @throws \Exception */ public function beforeInsertEvent($self, $pkeys) : bool { // check for "default" connection type and add them if missing @@ -294,7 +295,7 @@ class ConnectionModel extends AbstractMapTrackingModel { !$this->scope || empty($types) ){ - $this->setDefaultTypeData(); + $this->setAutoScopeAndType(); } return $this->isValid() ? parent::beforeInsertEvent($self, $pkeys) : false; @@ -335,8 +336,8 @@ class ConnectionModel extends AbstractMapTrackingModel { /** * @param string $action - * @return logging\LogInterface - * @throws \Exception\ConfigException + * @return Logging\LogInterface + * @throws Exception\ConfigException */ public function newLog(string $action = '') : Logging\LogInterface { return $this->getMap()->newLog($action)->setTempData($this->getLogObjectData()); diff --git a/app/main/model/pathfinder/connectionscopemodel.php b/app/Model/Pathfinder/ConnectionScopeModel.php similarity index 91% rename from app/main/model/pathfinder/connectionscopemodel.php rename to app/Model/Pathfinder/ConnectionScopeModel.php index fd9c3021..5d07fea9 100644 --- a/app/main/model/pathfinder/connectionscopemodel.php +++ b/app/Model/Pathfinder/ConnectionScopeModel.php @@ -6,14 +6,20 @@ * Time: 20:01 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; class ConnectionScopeModel extends AbstractPathfinderModel { + /** + * @var string + */ protected $table = 'connection_scope'; + /** + * @var array + */ protected $fieldConf = [ 'active' => [ 'type' => Schema::DT_BOOL, @@ -38,6 +44,9 @@ class ConnectionScopeModel extends AbstractPathfinderModel { ] ]; + /** + * @var array + */ protected static $tableData = [ [ 'id' => 1, @@ -63,7 +72,6 @@ class ConnectionScopeModel extends AbstractPathfinderModel { 'label' => 'abyssal', 'connectorDefinition' => '[ "Straight", { "stub": [5, 5], "gap": 0 } ]' ] - ]; } \ No newline at end of file diff --git a/app/main/model/pathfinder/corporationmapmodel.php b/app/Model/Pathfinder/CorporationMapModel.php similarity index 87% rename from app/main/model/pathfinder/corporationmapmodel.php rename to app/Model/Pathfinder/CorporationMapModel.php index 8fe73e1c..24ada8c9 100644 --- a/app/main/model/pathfinder/corporationmapmodel.php +++ b/app/Model/Pathfinder/CorporationMapModel.php @@ -6,7 +6,7 @@ * Time: 20:01 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; @@ -30,7 +30,7 @@ class CorporationMapModel extends AbstractPathfinderModel { 'corporationId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\CorporationModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\CorporationModel', 'constraint' => [ [ 'table' => 'corporation', @@ -41,7 +41,7 @@ class CorporationMapModel extends AbstractPathfinderModel { 'mapId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\MapModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\MapModel', 'constraint' => [ [ 'table' => 'map', diff --git a/app/main/model/pathfinder/corporationmodel.php b/app/Model/Pathfinder/CorporationModel.php similarity index 90% rename from app/main/model/pathfinder/corporationmodel.php rename to app/Model/Pathfinder/CorporationModel.php index b2a5cb71..17e39b26 100644 --- a/app/main/model/pathfinder/corporationmodel.php +++ b/app/Model/Pathfinder/CorporationModel.php @@ -6,10 +6,10 @@ * Time: 20:43 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; -use lib\Config; +use Exodus4D\Pathfinder\Lib\Config; class CorporationModel extends AbstractPathfinderModel { @@ -88,10 +88,12 @@ class CorporationModel extends AbstractPathfinderModel { * corp rights that can be stored to a corp */ const RIGHTS = [ + 'map_create', 'map_update', 'map_delete', 'map_import', - 'map_export' + 'map_export', + 'map_share' ]; /** @@ -130,19 +132,19 @@ class CorporationModel extends AbstractPathfinderModel { 'default' => 0 ], 'corporationCharacters' => [ - 'has-many' => ['Model\Pathfinder\CharacterModel', 'corporationId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\CharacterModel', 'corporationId'] ], 'mapCorporations' => [ - 'has-many' => ['Model\Pathfinder\CorporationMapModel', 'corporationId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\CorporationMapModel', 'corporationId'] ], 'corporationRights' => [ - 'has-many' => ['Model\Pathfinder\CorporationRightModel', 'corporationId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\CorporationRightModel', 'corporationId'] ], 'corporationStructures' => [ - 'has-many' => ['Model\Pathfinder\CorporationStructureModel', 'corporationId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\CorporationStructureModel', 'corporationId'] ], 'structures' => [ - 'has-many' => ['Model\Pathfinder\StructureModel', 'corporationId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\StructureModel', 'corporationId'] ] ]; @@ -292,7 +294,7 @@ class CorporationModel extends AbstractPathfinderModel { !empty($accessToken) && !$this->isNPC ){ - $response = self::getF3()->ccpClient()->getCorporationRoles($this->_id, $accessToken); + $response = self::getF3()->ccpClient()->send('getCorporationRoles', $this->_id, $accessToken); if( !empty($response['roles']) ){ $characterRolesData = (array)$response['roles']; } @@ -303,15 +305,16 @@ class CorporationModel extends AbstractPathfinderModel { /** * get all corporation rights + * @param array $names * @param array $options * @return CorporationRightModel[] * @throws \Exception */ - public function getRights($options = []) : array { + public function getRights($names = self::RIGHTS, $options = []) : array { $corporationRights = []; // get available rights $right = self::getNew('RightModel'); - if($rights = $right->find(['active = ? AND name IN (?)', 1, self::RIGHTS])){ + if($rights = $right->find(['active = ? AND name IN (?)', 1, $names])){ // get already stored rights if( !$options['addInactive'] ){ $this->filter('corporationRights', ['active = ?', 1]); @@ -356,10 +359,10 @@ class CorporationModel extends AbstractPathfinderModel { $loaded = parent::getById($id, $ttl, $isActive); if($this->isOutdated()){ // request corporation data - $corporationData = self::getF3()->ccpClient()->getCorporationData($id); + $corporationData = self::getF3()->ccpClient()->send('getCorporation', $id); if(!empty($corporationData) && !isset($corporationData['error'])){ // check for NPC corporation - $corporationData['isNPC'] = self::getF3()->ccpClient()->isNpcCorporation($id); + $corporationData['isNPC'] = in_array($id, self::getF3()->ccpClient()->send('getNpcCorporations')); $this->copyfrom($corporationData, ['id', 'name', 'ticker', 'memberCount', 'isNPC']); $this->save(); diff --git a/app/main/model/pathfinder/corporationrightmodel.php b/app/Model/Pathfinder/CorporationRightModel.php similarity index 89% rename from app/main/model/pathfinder/corporationrightmodel.php rename to app/Model/Pathfinder/CorporationRightModel.php index 1587968c..b42b8c45 100644 --- a/app/main/model/pathfinder/corporationrightmodel.php +++ b/app/Model/Pathfinder/CorporationRightModel.php @@ -6,7 +6,7 @@ * Time: 15:37 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; @@ -30,7 +30,7 @@ class CorporationRightModel extends AbstractPathfinderModel { 'corporationId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\CorporationModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\CorporationModel', 'constraint' => [ [ 'table' => 'corporation', @@ -41,7 +41,7 @@ class CorporationRightModel extends AbstractPathfinderModel { 'rightId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\RightModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\RightModel', 'constraint' => [ [ 'table' => 'right', @@ -52,7 +52,7 @@ class CorporationRightModel extends AbstractPathfinderModel { 'roleId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\RoleModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\RoleModel', 'constraint' => [ [ 'table' => 'role', diff --git a/app/main/model/pathfinder/corporationstructuremodel.php b/app/Model/Pathfinder/CorporationStructureModel.php similarity index 86% rename from app/main/model/pathfinder/corporationstructuremodel.php rename to app/Model/Pathfinder/CorporationStructureModel.php index a9aab364..5ee8f4a7 100644 --- a/app/main/model/pathfinder/corporationstructuremodel.php +++ b/app/Model/Pathfinder/CorporationStructureModel.php @@ -6,7 +6,7 @@ * Time: 19:23 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; @@ -30,7 +30,7 @@ class CorporationStructureModel extends AbstractPathfinderModel { 'corporationId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\CorporationModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\CorporationModel', 'constraint' => [ [ 'table' => 'corporation', @@ -41,7 +41,7 @@ class CorporationStructureModel extends AbstractPathfinderModel { 'structureId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\StructureModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\StructureModel', 'constraint' => [ [ 'table' => 'structure', diff --git a/app/main/model/pathfinder/cronmodel.php b/app/Model/Pathfinder/CronModel.php similarity index 98% rename from app/main/model/pathfinder/cronmodel.php rename to app/Model/Pathfinder/CronModel.php index 3708f6ca..973f9c11 100644 --- a/app/main/model/pathfinder/cronmodel.php +++ b/app/Model/Pathfinder/CronModel.php @@ -1,7 +1,7 @@ [ 'type' => 'warning', @@ -160,6 +163,7 @@ class CronModel extends AbstractPathfinderModel { /** * @param bool $addLastIfFinished * @return array + * @throws \Exception */ protected function getHistory(bool $addLastIfFinished = false) : array { $history = $this->history ? : []; @@ -183,6 +187,7 @@ class CronModel extends AbstractPathfinderModel { /** * get current job status based on its current data * @return array + * @throws \Exception */ protected function getStatus() : array { $status = []; diff --git a/app/main/model/pathfinder/logmodelinterface.php b/app/Model/Pathfinder/LogModelInterface.php similarity index 84% rename from app/main/model/pathfinder/logmodelinterface.php rename to app/Model/Pathfinder/LogModelInterface.php index aa145a57..b2e7245e 100644 --- a/app/main/model/pathfinder/logmodelinterface.php +++ b/app/Model/Pathfinder/LogModelInterface.php @@ -6,7 +6,7 @@ * Time: 04:10 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; interface LogModelInterface { diff --git a/app/main/model/pathfinder/mapmodel.php b/app/Model/Pathfinder/MapModel.php similarity index 89% rename from app/main/model/pathfinder/mapmodel.php rename to app/Model/Pathfinder/MapModel.php index 2be5ad10..93e37f4d 100644 --- a/app/main/model/pathfinder/mapmodel.php +++ b/app/Model/Pathfinder/MapModel.php @@ -6,14 +6,14 @@ * Time: 22:10 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\CortexCollection; use DB\SQL\Schema; -use data\file\FileHandler; -use Exception\ConfigException; -use lib\Config; -use lib\logging; +use Exodus4D\Pathfinder\Data\File\FileHandler; +use Exodus4D\Pathfinder\Lib\Config; +use Exodus4D\Pathfinder\Lib\Logging; +use Exodus4D\Pathfinder\Exception; class MapModel extends AbstractMapTrackingModel { @@ -44,7 +44,7 @@ class MapModel extends AbstractMapTrackingModel { 'scopeId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\MapScopeModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\MapScopeModel', 'constraint' => [ [ 'table' => 'map_scope', @@ -57,7 +57,7 @@ class MapModel extends AbstractMapTrackingModel { 'typeId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\MapTypeModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\MapTypeModel', 'constraint' => [ [ 'table' => 'map_type', @@ -171,19 +171,19 @@ class MapModel extends AbstractMapTrackingModel { 'validate' => true ], 'systems' => [ - 'has-many' => ['Model\Pathfinder\SystemModel', 'mapId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\SystemModel', 'mapId'] ], 'connections' => [ - 'has-many' => ['Model\Pathfinder\ConnectionModel', 'mapId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\ConnectionModel', 'mapId'] ], 'mapCharacters' => [ - 'has-many' => ['Model\Pathfinder\CharacterMapModel', 'mapId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\CharacterMapModel', 'mapId'] ], 'mapCorporations' => [ - 'has-many' => ['Model\Pathfinder\CorporationMapModel', 'mapId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\CorporationMapModel', 'mapId'] ], 'mapAlliances' => [ - 'has-many' => ['Model\Pathfinder\AllianceMapModel', 'mapId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\AllianceMapModel', 'mapId'] ] ]; @@ -217,14 +217,13 @@ class MapModel extends AbstractMapTrackingModel { /** * get data * -> this includes system and connection data as well - * @return \stdClass - * @throws \Exception + * @param bool $noCache + * @return mixed|object|null + * @throws Exception\ConfigException */ - public function getData(){ + public function getData(bool $noCache = false){ // check if there is cached data - $mapDataAll = $this->getCacheData(); - - if(is_null($mapDataAll)){ + if($noCache || is_null($mapDataAll = $this->getCacheData())){ // no cached map data found $mapData = (object) []; @@ -340,7 +339,7 @@ class MapModel extends AbstractMapTrackingModel { * @param string $key * @param string $val * @return bool - * @throws \Exception\ValidationException + * @throws Exception\ValidationException */ protected function validate_name(string $key, string $val) : bool { $valid = true; @@ -356,7 +355,7 @@ class MapModel extends AbstractMapTrackingModel { * @param string $key * @param string $val * @return bool - * @throws \Exception\ValidationException + * @throws Exception\ValidationException */ protected function validate_slackWebHookURL(string $key, string $val) : bool { return $this->validate_WebHookURL($key, $val, 'slack'); @@ -367,7 +366,7 @@ class MapModel extends AbstractMapTrackingModel { * @param string $key * @param string $val * @return bool - * @throws \Exception\ValidationException + * @throws Exception\ValidationException */ protected function validate_discordWebHookURLHistory(string $key, string $val) : bool { return $this->validate_WebHookURL($key, $val, 'discord'); @@ -378,7 +377,7 @@ class MapModel extends AbstractMapTrackingModel { * @param string $key * @param string $val * @return bool - * @throws \Exception\ValidationException + * @throws Exception\ValidationException */ protected function validate_discordWebHookURLRally(string $key, string $val) : bool { return $this->validate_WebHookURL($key, $val, 'discord'); @@ -390,7 +389,7 @@ class MapModel extends AbstractMapTrackingModel { * @param string $val * @param string $type * @return bool - * @throws \Exception\ValidationException + * @throws Exception\ValidationException */ protected function validate_WebHookURL(string $key, string $val, string $type) : bool { $valid = true; @@ -702,99 +701,134 @@ class MapModel extends AbstractMapTrackingModel { /** * set map access for an object (character, corporation or alliance) * @param $obj + * @return bool * @throws \Exception */ - public function setAccess($obj){ - + public function setAccess($obj) : bool { $newAccessGranted = false; if($obj instanceof CharacterModel){ - // private map - // check whether the user has already map access - $this->has('mapCharacters', ['active = 1 AND characterId = :characterId', ':characterId' => $obj->id]); - $result = $this->findone(['id = :id', ':id' => $this->id]); - - if($result === false){ + $result = $this->relFindOne('mapCharacters', self::getFilter('characterId', $obj->_id)); + if(!$result){ // grant access for the character $characterMap = self::getNew('CharacterMapModel'); $characterMap->characterId = $obj; $characterMap->mapId = $this; - $characterMap->save(); - - $newAccessGranted = true; + if($characterMap->save()){ + $newAccessGranted = true; + } } }elseif($obj instanceof CorporationModel){ - // check whether the corporation already has map access - $this->has('mapCorporations', ['active = 1 AND corporationId = :corporationId', ':corporationId' => $obj->id]); - $result = $this->findone(['id = :id', ':id' => $this->id]); - - if($result === false){ + $result = $this->relFindOne('mapCorporations', self::getFilter('corporationId', $obj->_id)); + if(!$result){ // grant access for this corporation $corporationMap = self::getNew('CorporationMapModel'); $corporationMap->corporationId = $obj; $corporationMap->mapId = $this; - $corporationMap->save(); - - $newAccessGranted = true; + if($corporationMap->save()){ + $newAccessGranted = true; + } } }elseif($obj instanceof AllianceModel){ - // check whether the alliance already has map access - $this->has('mapAlliances', ['active = 1 AND allianceId = :allianceId', ':allianceId' => $obj->id]); - $result = $this->findone(['id = :id', ':id' => $this->id]); - - if($result === false){ + $result = $this->relFindOne('mapAlliances', self::getFilter('allianceId', $obj->_id)); + if(!$result){ $allianceMap = self::getNew('AllianceMapModel'); $allianceMap->allianceId = $obj; $allianceMap->mapId = $this; - $allianceMap->save(); - - $newAccessGranted = true; + if($allianceMap->save()){ + $newAccessGranted = true; + } } } + return $newAccessGranted; + } - if($newAccessGranted){ - // mark this map as updated - $this->setUpdated(); + /** + * @param $stack + * @return array + */ + public function compareAccess($stack) : array { + $result = []; + if($this->valid()){ + if($this->isPrivate()){ + $result = $this->mapCharacters ? $this->mapCharacters->compare($stack, 'characterId') : ['new' => $stack]; + }elseif($this->isCorporation()){ + $result = $this->mapCorporations ? $this->mapCorporations->compare($stack, 'corporationId') : ['new' => $stack]; + }elseif($this->isAlliance()){ + $result = $this->mapAlliances ? $this->mapAlliances->compare($stack, 'allianceId') : ['new' => $stack]; + } } + return $result; + } + /** + * @param int $id + * @return int + */ + public function removeFromAccess(int $id) : int { + $count = 0; + if($id && $this->valid()){ + $result = null; + if($this->isPrivate()){ + $result = $this->relFindOne('mapCharacters', self::getFilter('characterId', $id)); + }elseif($this->isCorporation()){ + $result = $this->relFindOne('mapCorporations', self::getFilter('corporationId', $id)); + }elseif($this->isAlliance()){ + $result = $this->relFindOne('mapAlliances', self::getFilter('allianceId', $id)); + } + + if($result && $result->erase()){ + $count++; + } + } + return $count; + } + + /** + * clear map access for entities that do not match the map "mapType" + * @return int + */ + public function clearAccessByType() : int { + $count = 0; + if($this->valid()){ + if($this->isPrivate()){ + $count = $this->clearAccess(['corporation', 'alliance']); + }elseif($this->isCorporation()){ + $count = $this->clearAccess(['character', 'alliance']); + }elseif($this->isAlliance()){ + $count = $this->clearAccess(['character', 'corporation']); + } + } + return $count; } /** * clear access for a given type of objects * @param array $clearKeys + * @return int */ - public function clearAccess($clearKeys = ['character', 'corporation', 'alliance']){ + public function clearAccess($clearKeys = ['character', 'corporation', 'alliance']) : int { + $count = 0; foreach($clearKeys as $key){ + $field = null; switch($key){ - case 'character': - foreach((array)$this->mapCharacters as $characterMapModel){ - /** - * @var CharacterMapModel $characterMapModel - */ - $characterMapModel->erase(); - }; - break; - case 'corporation': - foreach((array)$this->mapCorporations as $corporationMapModel){ - /** - * @var CorporationMapModel $corporationMapModel - */ - $corporationMapModel->erase(); - }; - break; - case 'alliance': - foreach((array)$this->mapAlliances as $allianceMapModel){ - /** - * @var AllianceMapModel $allianceMapModel - */ - $allianceMapModel->erase(); - }; - break; + case 'character': $field = 'mapCharacters'; break; + case 'corporation': $field = 'mapCorporations'; break; + case 'alliance': $field = 'mapAlliances'; break; + } + + if($this->$field){ + foreach((array)$this->$field as $model){ + if($model->erase()){ + $count++; + } + } } } + return $count; } /** @@ -975,13 +1009,14 @@ class MapModel extends AbstractMapTrackingModel { /** * @param string $action - * @return logging\LogInterface - * @throws ConfigException + * @return Logging\LogInterface + * @throws Exception\ConfigException + * @throws \Exception */ public function newLog(string $action = '') : Logging\LogInterface{ $logChannelData = $this->getLogChannelData(); $logObjectData = $this->getLogObjectData(); - $log = (new logging\MapLog($action, $logChannelData))->setTempData($logObjectData); + $log = (new Logging\MapLog($action, $logChannelData))->setTempData($logObjectData); // update map history *.log files ----------------------------------------------------------------------------- if($this->isHistoryLogEnabled()){ @@ -1072,7 +1107,7 @@ class MapModel extends AbstractMapTrackingModel { * check if "Slack WebHook" is enabled for this map type * @param string $channel * @return bool - * @throws ConfigException + * @throws Exception\ConfigException */ public function isSlackChannelEnabled(string $channel) : bool { $enabled = false; @@ -1082,7 +1117,7 @@ class MapModel extends AbstractMapTrackingModel { switch($channel){ case 'slackChannelHistory': $defaultMapConfigKey = 'send_history_slack_enabled'; break; case 'slackChannelRally': $defaultMapConfigKey = 'send_rally_slack_enabled'; break; - default: throw new ConfigException(sprintf(self::ERROR_SLACK_CHANNEL, $channel)); + default: throw new Exception\ConfigException(sprintf(self::ERROR_SLACK_CHANNEL, $channel)); } if((bool) Config::getMapsDefaultConfig($this->typeId->name)[$defaultMapConfigKey]){ @@ -1100,7 +1135,7 @@ class MapModel extends AbstractMapTrackingModel { * check if "Discord WebHook" is enabled for this map type * @param string $channel * @return bool - * @throws ConfigException + * @throws Exception\ConfigException */ public function isDiscordChannelEnabled(string $channel) : bool { $enabled = false; @@ -1110,7 +1145,7 @@ class MapModel extends AbstractMapTrackingModel { switch($channel){ case 'discordWebHookURLHistory': $defaultMapConfigKey = 'send_history_discord_enabled'; break; case 'discordWebHookURLRally': $defaultMapConfigKey = 'send_rally_discord_enabled'; break; - default: throw new ConfigException(sprintf(self::ERROR_DISCORD_CHANNEL, $channel)); + default: throw new Exception\ConfigException(sprintf(self::ERROR_DISCORD_CHANNEL, $channel)); } if((bool) Config::getMapsDefaultConfig($this->typeId->name)[$defaultMapConfigKey]){ @@ -1428,17 +1463,6 @@ class MapModel extends AbstractMapTrackingModel { */ $mapModel = parent::save($characterModel); - // check if map type has changed and clear access objects - if( !$mapModel->dry() ){ - if( $mapModel->isPrivate() ){ - $mapModel->clearAccess(['corporation', 'alliance']); - }elseif( $mapModel->isCorporation() ){ - $mapModel->clearAccess(['character', 'alliance']); - }elseif( $mapModel->isAlliance() ){ - $mapModel->clearAccess(['character', 'corporation']); - } - } - return $mapModel; } diff --git a/app/main/model/pathfinder/mapscopemodel.php b/app/Model/Pathfinder/MapScopeModel.php similarity index 88% rename from app/main/model/pathfinder/mapscopemodel.php rename to app/Model/Pathfinder/MapScopeModel.php index 9ae22291..e3d3d9c3 100644 --- a/app/main/model/pathfinder/mapscopemodel.php +++ b/app/Model/Pathfinder/MapScopeModel.php @@ -6,14 +6,20 @@ * Time: 20:01 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; class MapScopeModel extends AbstractPathfinderModel{ + /** + * @var string + */ protected $table = 'map_scope'; + /** + * @var array + */ protected $fieldConf = [ 'active' => [ 'type' => Schema::DT_BOOL, @@ -33,6 +39,9 @@ class MapScopeModel extends AbstractPathfinderModel{ ] ]; + /** + * @var array + */ protected static $tableData = [ [ 'id' => 1, diff --git a/app/main/model/pathfinder/maptypemodel.php b/app/Model/Pathfinder/MapTypeModel.php similarity index 93% rename from app/main/model/pathfinder/maptypemodel.php rename to app/Model/Pathfinder/MapTypeModel.php index c25f2d6a..35fee514 100644 --- a/app/main/model/pathfinder/maptypemodel.php +++ b/app/Model/Pathfinder/MapTypeModel.php @@ -6,14 +6,20 @@ * Time: 20:01 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; class MapTypeModel extends AbstractPathfinderModel { + /** + * @var string + */ protected $table = 'map_type'; + /** + * @var array + */ protected $fieldConf = [ 'active' => [ 'type' => Schema::DT_BOOL, @@ -43,6 +49,9 @@ class MapTypeModel extends AbstractPathfinderModel { ] ]; + /** + * @var array + */ protected static $tableData = [ [ 'id' => 1, diff --git a/app/main/model/pathfinder/rightmodel.php b/app/Model/Pathfinder/RightModel.php similarity index 80% rename from app/main/model/pathfinder/rightmodel.php rename to app/Model/Pathfinder/RightModel.php index 2c13b877..13cc9c43 100644 --- a/app/main/model/pathfinder/rightmodel.php +++ b/app/Model/Pathfinder/RightModel.php @@ -6,7 +6,7 @@ * Time: 14:38 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; @@ -45,7 +45,7 @@ class RightModel extends AbstractPathfinderModel { 'default' => '' ], 'corporationRights' => [ - 'has-many' => ['Model\Pathfinder\CorporationRightModel', 'rightId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\CorporationRightModel', 'rightId'] ] ]; @@ -76,6 +76,18 @@ class RightModel extends AbstractPathfinderModel { 'name' => 'map_export', 'label' => 'export', 'description' => 'Map export right' + ], + [ + 'id' => 5, + 'name' => 'map_share', + 'label' => 'share', + 'description' => 'Map share right' + ], + [ + 'id' => 6, + 'name' => 'map_create', + 'label' => 'create', + 'description' => 'Map create right' ] ]; diff --git a/app/main/model/pathfinder/rolemodel.php b/app/Model/Pathfinder/RoleModel.php similarity index 91% rename from app/main/model/pathfinder/rolemodel.php rename to app/Model/Pathfinder/RoleModel.php index 75763924..e0d1463c 100644 --- a/app/main/model/pathfinder/rolemodel.php +++ b/app/Model/Pathfinder/RoleModel.php @@ -6,14 +6,20 @@ * Time: 12:42 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; class RoleModel extends AbstractPathfinderModel { + /** + * @var string + */ protected $table = 'role'; + /** + * @var array + */ protected $fieldConf = [ 'active' => [ 'type' => Schema::DT_BOOL, @@ -41,10 +47,13 @@ class RoleModel extends AbstractPathfinderModel { 'default' => '' ], 'corporationRights' => [ - 'has-many' => ['Model\Pathfinder\CorporationRightModel', 'roleId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\CorporationRightModel', 'roleId'] ] ]; + /** + * @var array + */ protected static $tableData = [ [ 'id' => 1, diff --git a/app/main/model/pathfinder/structuremodel.php b/app/Model/Pathfinder/StructureModel.php similarity index 95% rename from app/main/model/pathfinder/structuremodel.php rename to app/Model/Pathfinder/StructureModel.php index ef0fcd89..25533f68 100644 --- a/app/main/model/pathfinder/structuremodel.php +++ b/app/Model/Pathfinder/StructureModel.php @@ -6,10 +6,10 @@ * Time: 19:41 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; -use Model\Universe; +use Exodus4D\Pathfinder\Model\Universe; class StructureModel extends AbstractPathfinderModel { @@ -36,7 +36,7 @@ class StructureModel extends AbstractPathfinderModel { 'corporationId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\CorporationModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\CorporationModel', 'constraint' => [ [ 'table' => 'corporation', @@ -53,7 +53,7 @@ class StructureModel extends AbstractPathfinderModel { 'type' => Schema::DT_INT, 'default' => 1, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\StructureStatusModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\StructureStatusModel', 'constraint' => [ [ 'table' => 'structure_status', @@ -72,7 +72,7 @@ class StructureModel extends AbstractPathfinderModel { 'default' => '' ], 'structureCorporations' => [ - 'has-many' => ['Model\Pathfinder\CorporationStructureModel', 'structureId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\CorporationStructureModel', 'structureId'] ] ]; diff --git a/app/main/model/pathfinder/structurestatusmodel.php b/app/Model/Pathfinder/StructureStatusModel.php similarity index 93% rename from app/main/model/pathfinder/structurestatusmodel.php rename to app/Model/Pathfinder/StructureStatusModel.php index 5d7aca0c..cb814b68 100644 --- a/app/main/model/pathfinder/structurestatusmodel.php +++ b/app/Model/Pathfinder/StructureStatusModel.php @@ -6,7 +6,7 @@ * Time: 20:13 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; @@ -44,7 +44,7 @@ class StructureStatusModel extends AbstractPathfinderModel { 'default' => '' ], 'structures' => [ - 'has-many' => ['Model\Pathfinder\StructureModel', 'statusId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\StructureModel', 'statusId'] ] ]; diff --git a/app/main/model/pathfinder/systemfactionkillmodel.php b/app/Model/Pathfinder/SystemFactionKillModel.php similarity index 92% rename from app/main/model/pathfinder/systemfactionkillmodel.php rename to app/Model/Pathfinder/SystemFactionKillModel.php index 90c654b0..8bd773fb 100644 --- a/app/main/model/pathfinder/systemfactionkillmodel.php +++ b/app/Model/Pathfinder/SystemFactionKillModel.php @@ -6,7 +6,7 @@ * Time: 21:04 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; diff --git a/app/main/model/pathfinder/systemjumpmodel.php b/app/Model/Pathfinder/SystemJumpModel.php similarity index 92% rename from app/main/model/pathfinder/systemjumpmodel.php rename to app/Model/Pathfinder/SystemJumpModel.php index 03d62b8c..9fd6e2e5 100644 --- a/app/main/model/pathfinder/systemjumpmodel.php +++ b/app/Model/Pathfinder/SystemJumpModel.php @@ -6,7 +6,7 @@ * Time: 21:04 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; diff --git a/app/main/model/pathfinder/systemmodel.php b/app/Model/Pathfinder/SystemModel.php similarity index 96% rename from app/main/model/pathfinder/systemmodel.php rename to app/Model/Pathfinder/SystemModel.php index 29ec2de9..a038b2b8 100644 --- a/app/main/model/pathfinder/systemmodel.php +++ b/app/Model/Pathfinder/SystemModel.php @@ -6,12 +6,13 @@ * Time: 23:56 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; -use lib\logging; -use lib\PriorityCacheStore; -use Controller\Ccp\Universe; +use Exodus4D\Pathfinder\Lib\Logging; +use Exodus4D\Pathfinder\Lib\PriorityCacheStore; +use Exodus4D\Pathfinder\Controller\Ccp\Universe; +use Exodus4D\Pathfinder\Exception; class SystemModel extends AbstractMapTrackingModel { @@ -64,7 +65,7 @@ class SystemModel extends AbstractMapTrackingModel { 'mapId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\MapModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\MapModel', 'constraint' => [ [ 'table' => 'map', @@ -86,7 +87,7 @@ class SystemModel extends AbstractMapTrackingModel { 'typeId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\SystemTypeModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\SystemTypeModel', 'constraint' => [ [ 'table' => 'system_type', @@ -99,7 +100,7 @@ class SystemModel extends AbstractMapTrackingModel { 'nullable' => false, 'default' => 1, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\SystemStatusModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\SystemStatusModel', 'constraint' => [ [ 'table' => 'system_status', @@ -141,13 +142,13 @@ class SystemModel extends AbstractMapTrackingModel { 'default' => 0 ], 'signatures' => [ - 'has-many' => ['Model\Pathfinder\SystemSignatureModel', 'systemId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\SystemSignatureModel', 'systemId'] ], 'connectionsSource' => [ - 'has-many' => ['Model\Pathfinder\ConnectionModel', 'source'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\ConnectionModel', 'source'] ], 'connectionsTarget' => [ - 'has-many' => ['Model\Pathfinder\ConnectionModel', 'target'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\ConnectionModel', 'target'] ] ]; @@ -297,7 +298,7 @@ class SystemModel extends AbstractMapTrackingModel { * @param string $key * @param int $val * @return bool - * @throws \Exception\ValidationException + * @throws Exception\ValidationException */ protected function validate_statusId(string $key, int $val) : bool { $valid = true; @@ -313,7 +314,7 @@ class SystemModel extends AbstractMapTrackingModel { * @param string $key * @param string $val * @return bool - * @throws \Exception\ValidationException + * @throws Exception\ValidationException */ protected function validate_description(string $key, string $val) : bool { $valid = true; @@ -554,8 +555,8 @@ class SystemModel extends AbstractMapTrackingModel { /** * @param string $action - * @return logging\LogInterface - * @throws \Exception\ConfigException + * @return Logging\LogInterface + * @throws Exception\ConfigException */ public function newLog(string $action = '') : Logging\LogInterface{ return $this->getMap()->newLog($action)->setTempData($this->getLogObjectData()); @@ -715,12 +716,13 @@ class SystemModel extends AbstractMapTrackingModel { * -> send to an Email * @param array $rallyData * @param CharacterModel $characterModel - * @throws \Exception\ConfigException + * @throws Exception\ConfigException + * @throws \Exception */ public function sendRallyPoke(array $rallyData, CharacterModel $characterModel){ // rally log needs at least one handler to be valid $isValidLog = false; - $log = new logging\RallyLog('rallySet', $this->getMap()->getLogChannelData()); + $log = new Logging\RallyLog('rallySet', $this->getMap()->getLogChannelData()); // Slack poke ----------------------------------------------------------------------------- $slackChannelKey = 'slackChannelRally'; diff --git a/app/main/model/pathfinder/systempodkillmodel.php b/app/Model/Pathfinder/SystemPodKillModel.php similarity index 92% rename from app/main/model/pathfinder/systempodkillmodel.php rename to app/Model/Pathfinder/SystemPodKillModel.php index 7eb847f7..99b5d51d 100644 --- a/app/main/model/pathfinder/systempodkillmodel.php +++ b/app/Model/Pathfinder/SystemPodKillModel.php @@ -6,7 +6,7 @@ * Time: 21:04 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; diff --git a/app/main/model/pathfinder/systemshipkillmodel.php b/app/Model/Pathfinder/SystemShipKillModel.php similarity index 92% rename from app/main/model/pathfinder/systemshipkillmodel.php rename to app/Model/Pathfinder/SystemShipKillModel.php index 15af811a..9c859d0b 100644 --- a/app/main/model/pathfinder/systemshipkillmodel.php +++ b/app/Model/Pathfinder/SystemShipKillModel.php @@ -6,7 +6,7 @@ * Time: 21:04 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; diff --git a/app/main/model/pathfinder/systemsignaturemodel.php b/app/Model/Pathfinder/SystemSignatureModel.php similarity index 95% rename from app/main/model/pathfinder/systemsignaturemodel.php rename to app/Model/Pathfinder/SystemSignatureModel.php index 06be9f3a..8a95f78a 100644 --- a/app/main/model/pathfinder/systemsignaturemodel.php +++ b/app/Model/Pathfinder/SystemSignatureModel.php @@ -6,10 +6,11 @@ * Time: 14:34 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; -use lib\logging; +use Exodus4D\Pathfinder\Lib\Logging; +use Exodus4D\Pathfinder\Exception; class SystemSignatureModel extends AbstractMapTrackingModel { @@ -31,7 +32,7 @@ class SystemSignatureModel extends AbstractMapTrackingModel { 'systemId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\SystemModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\SystemModel', 'constraint' => [ [ 'table' => 'system', @@ -56,7 +57,7 @@ class SystemSignatureModel extends AbstractMapTrackingModel { 'connectionId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\ConnectionModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\ConnectionModel', 'constraint' => [ [ 'table' => 'connection', @@ -163,7 +164,7 @@ class SystemSignatureModel extends AbstractMapTrackingModel { * @param string $key * @param string $val * @return bool - * @throws \Exception\ValidationException + * @throws Exception\ValidationException */ protected function validate_name(string $key, string $val): bool { $valid = true; @@ -176,8 +177,8 @@ class SystemSignatureModel extends AbstractMapTrackingModel { /** * @param string $action - * @return logging\LogInterface - * @throws \Exception\ConfigException + * @return Logging\LogInterface + * @throws Exception\ConfigException */ public function newLog(string $action = ''): Logging\LogInterface{ return $this->getMap()->newLog($action)->setTempData($this->getLogObjectData()); diff --git a/app/main/model/pathfinder/systemstatusmodel.php b/app/Model/Pathfinder/SystemStatusModel.php similarity index 94% rename from app/main/model/pathfinder/systemstatusmodel.php rename to app/Model/Pathfinder/SystemStatusModel.php index 65a236b4..74e0d71d 100644 --- a/app/main/model/pathfinder/systemstatusmodel.php +++ b/app/Model/Pathfinder/SystemStatusModel.php @@ -6,14 +6,20 @@ * Time: 21:53 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; class SystemStatusModel extends AbstractPathfinderModel { + /** + * @var string + */ protected $table = 'system_status'; + /** + * @var array + */ protected $fieldConf = [ 'active' => [ 'type' => Schema::DT_BOOL, @@ -38,6 +44,9 @@ class SystemStatusModel extends AbstractPathfinderModel { ] ]; + /** + * @var array + */ protected static $tableData = [ [ 'id' => 1, diff --git a/app/main/model/pathfinder/systemtypemodel.php b/app/Model/Pathfinder/SystemTypeModel.php similarity index 96% rename from app/main/model/pathfinder/systemtypemodel.php rename to app/Model/Pathfinder/SystemTypeModel.php index b4c18db5..8e026e36 100644 --- a/app/main/model/pathfinder/systemtypemodel.php +++ b/app/Model/Pathfinder/SystemTypeModel.php @@ -6,7 +6,7 @@ * Time: 21:59 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; diff --git a/app/main/model/pathfinder/usercharactermodel.php b/app/Model/Pathfinder/UserCharacterModel.php similarity index 87% rename from app/main/model/pathfinder/usercharactermodel.php rename to app/Model/Pathfinder/UserCharacterModel.php index e96cb7ed..492d7993 100644 --- a/app/main/model/pathfinder/usercharactermodel.php +++ b/app/Model/Pathfinder/UserCharacterModel.php @@ -6,14 +6,20 @@ * Time: 21:49 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; class UserCharacterModel extends AbstractPathfinderModel { + /** + * @var string + */ protected $table = 'user_character'; + /** + * @var array + */ protected $fieldConf = [ 'active' => [ 'type' => Schema::DT_BOOL, @@ -24,7 +30,7 @@ class UserCharacterModel extends AbstractPathfinderModel { 'userId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Pathfinder\UserModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\UserModel', 'constraint' => [ [ 'table' => 'user', @@ -36,7 +42,7 @@ class UserCharacterModel extends AbstractPathfinderModel { 'type' => Schema::DT_INT, 'index' => true, 'unique' => true, - 'belongs-to-one' => 'Model\Pathfinder\CharacterModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Pathfinder\CharacterModel', 'constraint' => [ [ 'table' => 'character', diff --git a/app/main/model/pathfinder/usermodel.php b/app/Model/Pathfinder/UserModel.php similarity index 96% rename from app/main/model/pathfinder/usermodel.php rename to app/Model/Pathfinder/UserModel.php index 6a01c6fa..51bce730 100644 --- a/app/main/model/pathfinder/usermodel.php +++ b/app/Model/Pathfinder/UserModel.php @@ -6,14 +6,14 @@ * Time: 20:43 */ -namespace Model\Pathfinder; +namespace Exodus4D\Pathfinder\Model\Pathfinder; use DB\SQL\Schema; -use Controller; -use Controller\Api\User as User; -use Exception; -use lib\Config; -use lib\logging; +use Exodus4D\Pathfinder\Controller; +use Exodus4D\Pathfinder\Controller\Api\User as User; +use Exodus4D\Pathfinder\Lib\Config; +use Exodus4D\Pathfinder\Lib\Logging; +use Exodus4D\Pathfinder\Exception; class UserModel extends AbstractPathfinderModel { @@ -46,7 +46,7 @@ class UserModel extends AbstractPathfinderModel { 'validate' => true ], 'userCharacters' => [ - 'has-many' => ['Model\Pathfinder\UserCharacterModel', 'userId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Pathfinder\UserCharacterModel', 'userId'] ] ]; @@ -55,7 +55,7 @@ class UserModel extends AbstractPathfinderModel { * -> ! caution ! this function returns sensitive data! (e.g. email,..) * -> user getSimpleData() for faster performance and public user data * @return \stdClass - * @throws Exception + * @throws \Exception */ public function getData() : \stdClass { @@ -207,7 +207,7 @@ class UserModel extends AbstractPathfinderModel { * @param int $characterId * @param int $ttl * @return CharacterModel|null - * @throws Exception + * @throws \Exception */ public function getSessionCharacter(int $characterId = 0, int $ttl = self::DEFAULT_SQL_TTL) : ?CharacterModel { $data = []; @@ -285,7 +285,7 @@ class UserModel extends AbstractPathfinderModel { * -> EITHER - the current active one for the current user * -> OR - get the first active one * @return null|CharacterModel - * @throws Exception + * @throws \Exception */ public function getActiveCharacter() : ?CharacterModel { $activeCharacter = null; diff --git a/app/main/model/universe/alliancemodel.php b/app/Model/Universe/AllianceModel.php similarity index 86% rename from app/main/model/universe/alliancemodel.php rename to app/Model/Universe/AllianceModel.php index 7a1b3f49..325f4745 100644 --- a/app/main/model/universe/alliancemodel.php +++ b/app/Model/Universe/AllianceModel.php @@ -1,7 +1,7 @@ [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\FactionModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\FactionModel', 'constraint' => [ [ 'table' => 'faction', @@ -42,10 +42,10 @@ class AllianceModel extends AbstractUniverseModel { ] ], 'corporations' => [ - 'has-many' => ['Model\Universe\CorporationModel', 'allianceId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\CorporationModel', 'allianceId'] ], 'sovereigntySystems' => [ - 'has-many' => ['Model\Universe\SovereigntyMapModel', 'allianceId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\SovereigntyMapModel', 'allianceId'] ] ]; @@ -85,7 +85,7 @@ class AllianceModel extends AbstractUniverseModel { * @param array $additionalOptions */ protected function loadData(int $id, string $accessToken = '', array $additionalOptions = []){ - $data = self::getF3()->ccpClient()->getAllianceData($id); + $data = self::getF3()->ccpClient()->send('getAlliance', $id); if(!empty($data) && !isset($data['error'])){ if($data['factionId']){ /** diff --git a/app/main/model/universe/categorymodel.php b/app/Model/Universe/CategoryModel.php similarity index 93% rename from app/main/model/universe/categorymodel.php rename to app/Model/Universe/CategoryModel.php index 3d533143..df0b7f3e 100644 --- a/app/main/model/universe/categorymodel.php +++ b/app/Model/Universe/CategoryModel.php @@ -6,14 +6,20 @@ * Time: 23:49 */ -namespace Model\Universe; +namespace Exodus4D\Pathfinder\Model\Universe; use DB\SQL\Schema; class CategoryModel extends AbstractUniverseModel { + /** + * @var string + */ protected $table = 'category'; + /** + * @var array + */ protected $fieldConf = [ 'name' => [ 'type' => Schema::DT_VARCHAR128, @@ -27,7 +33,7 @@ class CategoryModel extends AbstractUniverseModel { 'index' => true ], 'groups' => [ - 'has-many' => ['Model\Universe\GroupModel', 'categoryId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\GroupModel', 'categoryId'] ] ]; @@ -172,14 +178,14 @@ class CategoryModel extends AbstractUniverseModel { * @return array */ public static function getUniverseCategoryData(int $id) : array { - return self::getF3()->ccpClient()->getUniverseCategoryData($id); + return self::getF3()->ccpClient()->send('getUniverseCategory', $id); } /** * @return array */ public static function getUniverseCategories() : array { - return self::getF3()->ccpClient()->getUniverseCategories(); + return self::getF3()->ccpClient()->send('getUniverseCategories'); } /** diff --git a/app/main/model/universe/constellationmodel.php b/app/Model/Universe/ConstellationModel.php similarity index 84% rename from app/main/model/universe/constellationmodel.php rename to app/Model/Universe/ConstellationModel.php index 1f061ecf..9abd2af5 100644 --- a/app/main/model/universe/constellationmodel.php +++ b/app/Model/Universe/ConstellationModel.php @@ -6,7 +6,7 @@ * Time: 16:49 */ -namespace Model\Universe; +namespace Exodus4D\Pathfinder\Model\Universe; use DB\SQL\Schema; @@ -29,7 +29,7 @@ class ConstellationModel extends AbstractUniverseModel { 'regionId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\RegionModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\RegionModel', 'constraint' => [ [ 'table' => 'region', @@ -54,10 +54,10 @@ class ConstellationModel extends AbstractUniverseModel { 'default' => 0 ], 'systems' => [ - 'has-many' => ['Model\Universe\SystemModel', 'constellationId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\SystemModel', 'constellationId'] ], 'systemNeighbours' => [ - 'has-many' => ['Model\Universe\SystemNeighbourModel', 'constellationId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\SystemNeighbourModel', 'constellationId'] ] ]; @@ -80,7 +80,7 @@ class ConstellationModel extends AbstractUniverseModel { * @param array $additionalOptions */ protected function loadData(int $id, string $accessToken = '', array $additionalOptions = []){ - $data = self::getF3()->ccpClient()->getUniverseConstellationData($id); + $data = self::getF3()->ccpClient()->send('getUniverseConstellation', $id); if(!empty($data)){ /** * @var $region RegionModel @@ -99,7 +99,7 @@ class ConstellationModel extends AbstractUniverseModel { */ public function loadSystemsData(){ if( !$this->dry() ){ - $data = self::getF3()->ccpClient()->getUniverseConstellationData($this->_id); + $data = self::getF3()->ccpClient()->send('getUniverseConstellation', $this->_id); if(!empty($data)){ foreach((array)$data['systems'] as $systemId){ /** diff --git a/app/main/model/universe/corporationmodel.php b/app/Model/Universe/CorporationModel.php similarity index 85% rename from app/main/model/universe/corporationmodel.php rename to app/Model/Universe/CorporationModel.php index d672bc13..447f06f9 100644 --- a/app/main/model/universe/corporationmodel.php +++ b/app/Model/Universe/CorporationModel.php @@ -1,7 +1,7 @@ [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\FactionModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\FactionModel', 'constraint' => [ [ 'table' => 'faction', @@ -54,7 +54,7 @@ class CorporationModel extends AbstractUniverseModel { 'allianceId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\AllianceModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\AllianceModel', 'constraint' => [ [ 'table' => 'alliance', @@ -63,10 +63,10 @@ class CorporationModel extends AbstractUniverseModel { ] ], 'sovereigntySystems' => [ - 'has-many' => ['Model\Universe\SovereigntyMapModel', 'corporationId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\SovereigntyMapModel', 'corporationId'] ], 'stations' => [ - 'has-many' => ['Model\Universe\StationModel', 'corporationId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\StationModel', 'corporationId'] ] ]; @@ -105,10 +105,10 @@ class CorporationModel extends AbstractUniverseModel { * @param array $additionalOptions */ protected function loadData(int $id, string $accessToken = '', array $additionalOptions = []){ - $data = self::getF3()->ccpClient()->getCorporationData($id); + $data = self::getF3()->ccpClient()->send('getCorporation', $id); if(!empty($data) && !isset($data['error'])){ // check for NPC corporation - $data['isNPC'] = self::getF3()->ccpClient()->isNpcCorporation($id); + $data['isNPC'] = in_array($id, self::getF3()->ccpClient()->send('getNpcCorporations')); if($data['factionId']){ /** diff --git a/app/main/model/universe/dogmaattributemodel.php b/app/Model/Universe/DogmaAttributeModel.php similarity index 91% rename from app/main/model/universe/dogmaattributemodel.php rename to app/Model/Universe/DogmaAttributeModel.php index 7936c2a8..e06c2851 100644 --- a/app/main/model/universe/dogmaattributemodel.php +++ b/app/Model/Universe/DogmaAttributeModel.php @@ -6,7 +6,7 @@ * Time: 22:00 */ -namespace Model\Universe; +namespace Exodus4D\Pathfinder\Model\Universe; use DB\SQL\Schema; @@ -65,7 +65,7 @@ class DogmaAttributeModel extends AbstractUniverseModel { 'default' => null ], 'attributeTypes' => [ - 'has-many' => ['Model\Universe\TypeAttributeModel', 'attributeId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\TypeAttributeModel', 'attributeId'] ] ]; @@ -88,7 +88,7 @@ class DogmaAttributeModel extends AbstractUniverseModel { * @param array $additionalOptions */ protected function loadData(int $id, string $accessToken = '', array $additionalOptions = []){ - $data = self::getF3()->ccpClient()->getDogmaAttributeData($id); + $data = self::getF3()->ccpClient()->send('getDogmaAttribute', $id); if(!empty($data) && !isset($data['error'])){ $this->copyfrom($data, ['id', 'name', 'displayName', 'description', 'published', 'stackable', 'highIsGood', 'defaultValue', 'iconId', 'unitId']); $this->save(); diff --git a/app/main/model/universe/factionmodel.php b/app/Model/Universe/FactionModel.php similarity index 73% rename from app/main/model/universe/factionmodel.php rename to app/Model/Universe/FactionModel.php index bc4623ac..a4b46661 100644 --- a/app/main/model/universe/factionmodel.php +++ b/app/Model/Universe/FactionModel.php @@ -6,7 +6,7 @@ * Time: 09:51 */ -namespace Model\Universe; +namespace Exodus4D\Pathfinder\Model\Universe; use DB\SQL\Schema; @@ -47,22 +47,22 @@ class FactionModel extends AbstractUniverseModel { 'default' => 0 ], 'race' => [ // faction API endpoint dont have "raceId" data, but race API endpoint has - 'has-one' => ['Model\Universe\RaceModel', 'factionId'] + 'has-one' => ['Exodus4D\Pathfinder\Model\Universe\RaceModel', 'factionId'] ], 'alliances' => [ - 'has-many' => ['Model\Universe\AllianceModel', 'factionId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\AllianceModel', 'factionId'] ], 'corporations' => [ - 'has-many' => ['Model\Universe\CorporationModel', 'factionId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\CorporationModel', 'factionId'] ], 'sovereigntySystems' => [ - 'has-many' => ['Model\Universe\SovereigntyMapModel', 'factionId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\SovereigntyMapModel', 'factionId'] ], 'factionWarSystemOwners' => [ - 'has-many' => ['Model\Universe\FactionWarSystemModel', 'ownerFactionId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\FactionWarSystemModel', 'ownerFactionId'] ], 'factionWarSystemOccupiers' => [ - 'has-many' => ['Model\Universe\FactionWarSystemModel', 'occupierFactionId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\FactionWarSystemModel', 'occupierFactionId'] ] ]; @@ -84,7 +84,7 @@ class FactionModel extends AbstractUniverseModel { * @param array $additionalOptions */ protected function loadData(int $id, string $accessToken = '', array $additionalOptions = []){ - $data = self::getF3()->ccpClient()->getUniverseFactionData($id); + $data = self::getF3()->ccpClient()->send('getUniverseFaction', $id); if(!empty($data) && !isset($data['error'])){ $this->copyfrom($data, ['id', 'name', 'description', 'sizeFactor', 'stationCount', 'stationSystemCount']); $this->save(); diff --git a/app/main/model/universe/factionwarsystemmodel.php b/app/Model/Universe/FactionWarSystemModel.php similarity index 90% rename from app/main/model/universe/factionwarsystemmodel.php rename to app/Model/Universe/FactionWarSystemModel.php index 943cd09b..807010a3 100644 --- a/app/main/model/universe/factionwarsystemmodel.php +++ b/app/Model/Universe/FactionWarSystemModel.php @@ -1,7 +1,7 @@ Schema::DT_INT, 'index' => true, 'unique' => true, - 'belongs-to-one' => 'Model\Universe\SystemModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\SystemModel', 'constraint' => [ [ 'table' => 'system', @@ -32,7 +32,7 @@ class FactionWarSystemModel extends AbstractUniverseModel { 'ownerFactionId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\FactionModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\FactionModel', 'constraint' => [ [ 'table' => 'faction', @@ -43,7 +43,7 @@ class FactionWarSystemModel extends AbstractUniverseModel { 'occupierFactionId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\FactionModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\FactionModel', 'constraint' => [ [ 'table' => 'faction', diff --git a/app/main/model/universe/groupmodel.php b/app/Model/Universe/GroupModel.php similarity index 93% rename from app/main/model/universe/groupmodel.php rename to app/Model/Universe/GroupModel.php index 1bbf5076..69010a01 100644 --- a/app/main/model/universe/groupmodel.php +++ b/app/Model/Universe/GroupModel.php @@ -6,7 +6,7 @@ * Time: 23:58 */ -namespace Model\Universe; +namespace Exodus4D\Pathfinder\Model\Universe; use DB\SQL\Schema; @@ -40,7 +40,7 @@ class GroupModel extends AbstractUniverseModel { 'categoryId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\CategoryModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\CategoryModel', 'constraint' => [ [ 'table' => 'category', @@ -50,7 +50,7 @@ class GroupModel extends AbstractUniverseModel { 'validate' => 'notDry' ], 'types' => [ - 'has-many' => ['Model\Universe\TypeModel', 'groupId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\TypeModel', 'groupId'] ] ]; @@ -178,14 +178,14 @@ class GroupModel extends AbstractUniverseModel { * @return array */ public static function getUniverseGroupData(int $id) : array { - return self::getF3()->ccpClient()->getUniverseGroupData($id); + return self::getF3()->ccpClient()->send('getUniverseGroup', $id); } /** * @return array */ public static function getUniverseGroups() : array { - return self::getF3()->ccpClient()->getUniverseGroups(); + return self::getF3()->ccpClient()->send('getUniverseGroups'); } /** diff --git a/app/main/model/universe/planetmodel.php b/app/Model/Universe/PlanetModel.php similarity index 87% rename from app/main/model/universe/planetmodel.php rename to app/Model/Universe/PlanetModel.php index 6b7eefb4..3d07ab83 100644 --- a/app/main/model/universe/planetmodel.php +++ b/app/Model/Universe/PlanetModel.php @@ -6,14 +6,20 @@ * Time: 01:12 */ -namespace Model\Universe; +namespace Exodus4D\Pathfinder\Model\Universe; use DB\SQL\Schema; class PlanetModel extends AbstractUniverseModel { + /** + * @var string + */ protected $table = 'planet'; + /** + * @var array + */ protected $fieldConf = [ 'name' => [ 'type' => Schema::DT_VARCHAR128, @@ -23,7 +29,7 @@ class PlanetModel extends AbstractUniverseModel { 'systemId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\SystemModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\SystemModel', 'constraint' => [ [ 'table' => 'system', @@ -35,7 +41,7 @@ class PlanetModel extends AbstractUniverseModel { 'typeId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\TypeModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\TypeModel', 'constraint' => [ [ 'table' => 'type', @@ -81,7 +87,7 @@ class PlanetModel extends AbstractUniverseModel { * @param array $additionalOptions */ protected function loadData(int $id, string $accessToken = '', array $additionalOptions = []){ - $data = self::getF3()->ccpClient()->getUniversePlanetData($id); + $data = self::getF3()->ccpClient()->send('getUniversePlanet', $id); if(!empty($data)){ /** * @var $system SystemModel diff --git a/app/main/model/universe/racemodel.php b/app/Model/Universe/RaceModel.php similarity index 86% rename from app/main/model/universe/racemodel.php rename to app/Model/Universe/RaceModel.php index deea0ed0..45c265ff 100644 --- a/app/main/model/universe/racemodel.php +++ b/app/Model/Universe/RaceModel.php @@ -6,7 +6,7 @@ * Time: 03:21 */ -namespace Model\Universe; +namespace Exodus4D\Pathfinder\Model\Universe; use DB\SQL\Schema; @@ -32,7 +32,7 @@ class RaceModel extends AbstractUniverseModel { 'factionId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\FactionModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\FactionModel', 'constraint' => [ [ 'table' => 'faction', @@ -42,7 +42,7 @@ class RaceModel extends AbstractUniverseModel { 'validate' => 'notDry' ], 'stations' => [ - 'has-many' => ['Model\Universe\StationModel', 'raceId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\StationModel', 'raceId'] ] ]; @@ -66,7 +66,7 @@ class RaceModel extends AbstractUniverseModel { * @param array $additionalOptions */ protected function loadData(int $id, string $accessToken = '', array $additionalOptions = []){ - $data = self::getF3()->ccpClient()->getUniverseRaceData($id); + $data = self::getF3()->ccpClient()->send('getUniverseRace', $id); if(!empty($data) && !isset($data['error'])){ /** * @var $faction FactionModel diff --git a/app/main/model/universe/regionmodel.php b/app/Model/Universe/RegionModel.php similarity index 81% rename from app/main/model/universe/regionmodel.php rename to app/Model/Universe/RegionModel.php index 77b84fc7..a5b72f67 100644 --- a/app/main/model/universe/regionmodel.php +++ b/app/Model/Universe/RegionModel.php @@ -6,7 +6,7 @@ * Time: 15:20 */ -namespace Model\Universe; +namespace Exodus4D\Pathfinder\Model\Universe; use DB\SQL\Schema; @@ -31,10 +31,10 @@ class RegionModel extends AbstractUniverseModel { 'type' => Schema::DT_TEXT ], 'constellations' => [ - 'has-many' => ['Model\Universe\ConstellationModel', 'regionId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\ConstellationModel', 'regionId'] ], 'systemNeighbours' => [ - 'has-many' => ['Model\Universe\SystemNeighbourModel', 'regionId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\SystemNeighbourModel', 'regionId'] ] ]; @@ -56,7 +56,7 @@ class RegionModel extends AbstractUniverseModel { * @param array $additionalOptions */ protected function loadData(int $id, string $accessToken = '', array $additionalOptions = []){ - $data = self::getF3()->ccpClient()->getUniverseRegionData($id); + $data = self::getF3()->ccpClient()->send('getUniverseRegion', $id); if(!empty($data)){ $this->copyfrom($data, ['id', 'name', 'description']); $this->save(); @@ -68,7 +68,7 @@ class RegionModel extends AbstractUniverseModel { */ public function loadConstellationsData(){ if( !$this->dry() ){ - $data = self::getF3()->ccpClient()->getUniverseRegionData($this->_id); + $data = self::getF3()->ccpClient()->send('getUniverseRegion', $this->_id); if(!empty($data)){ foreach((array)$data['constellations'] as $constellationsId){ /** diff --git a/app/main/model/universe/sovereigntymapmodel.php b/app/Model/Universe/SovereigntyMapModel.php similarity index 85% rename from app/main/model/universe/sovereigntymapmodel.php rename to app/Model/Universe/SovereigntyMapModel.php index 59b18b2c..6ac02c29 100644 --- a/app/main/model/universe/sovereigntymapmodel.php +++ b/app/Model/Universe/SovereigntyMapModel.php @@ -1,7 +1,7 @@ Schema::DT_INT, 'index' => true, 'unique' => true, - 'belongs-to-one' => 'Model\Universe\SystemModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\SystemModel', 'constraint' => [ [ 'table' => 'system', @@ -32,7 +32,7 @@ class SovereigntyMapModel extends AbstractUniverseModel { 'factionId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\FactionModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\FactionModel', 'constraint' => [ [ 'table' => 'faction', @@ -43,7 +43,7 @@ class SovereigntyMapModel extends AbstractUniverseModel { 'allianceId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\AllianceModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\AllianceModel', 'constraint' => [ [ 'table' => 'alliance', @@ -54,7 +54,7 @@ class SovereigntyMapModel extends AbstractUniverseModel { 'corporationId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\CorporationModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\CorporationModel', 'constraint' => [ [ 'table' => 'corporation', diff --git a/app/main/model/universe/starmodel.php b/app/Model/Universe/StarModel.php similarity index 89% rename from app/main/model/universe/starmodel.php rename to app/Model/Universe/StarModel.php index 94d21876..197273e5 100644 --- a/app/main/model/universe/starmodel.php +++ b/app/Model/Universe/StarModel.php @@ -6,7 +6,7 @@ * Time: 23:52 */ -namespace Model\Universe; +namespace Exodus4D\Pathfinder\Model\Universe; use DB\SQL\Schema; @@ -29,7 +29,7 @@ class StarModel extends AbstractUniverseModel { 'typeId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\TypeModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\TypeModel', 'constraint' => [ [ 'table' => 'type', @@ -64,7 +64,7 @@ class StarModel extends AbstractUniverseModel { 'default' => null ], 'system' => [ - 'has-one' => ['Model\Universe\SystemModel', 'starId'] + 'has-one' => ['Exodus4D\Pathfinder\Model\Universe\SystemModel', 'starId'] ] ]; @@ -86,7 +86,7 @@ class StarModel extends AbstractUniverseModel { * @param array $additionalOptions */ protected function loadData(int $id, string $accessToken = '', array $additionalOptions = []){ - $data = self::getF3()->ccpClient()->getUniverseStarData($id); + $data = self::getF3()->ccpClient()->send('getUniverseStar', $id); if(!empty($data)){ /** * @var $type TypeModel diff --git a/app/main/model/universe/stargatemodel.php b/app/Model/Universe/StargateModel.php similarity index 90% rename from app/main/model/universe/stargatemodel.php rename to app/Model/Universe/StargateModel.php index cbc32a58..f8915d7b 100644 --- a/app/main/model/universe/stargatemodel.php +++ b/app/Model/Universe/StargateModel.php @@ -6,14 +6,20 @@ * Time: 04:30 */ -namespace Model\Universe; +namespace Exodus4D\Pathfinder\Model\Universe; use DB\SQL\Schema; class StargateModel extends AbstractUniverseModel { + /** + * @var string + */ protected $table = 'stargate'; + /** + * @var array + */ protected $fieldConf = [ 'name' => [ 'type' => Schema::DT_VARCHAR128, @@ -23,7 +29,7 @@ class StargateModel extends AbstractUniverseModel { 'systemId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\SystemModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\SystemModel', 'constraint' => [ [ 'table' => 'system', @@ -35,7 +41,7 @@ class StargateModel extends AbstractUniverseModel { 'typeId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\TypeModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\TypeModel', 'constraint' => [ [ 'table' => 'type', @@ -47,7 +53,7 @@ class StargateModel extends AbstractUniverseModel { 'destinationSystemId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\SystemModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\SystemModel', 'constraint' => [ [ 'table' => 'system', @@ -88,7 +94,7 @@ class StargateModel extends AbstractUniverseModel { * @param array $additionalOptions */ protected function loadData(int $id, string $accessToken = '', array $additionalOptions = []){ - $data = self::getF3()->ccpClient()->getUniverseStargateData($id); + $data = self::getF3()->ccpClient()->send('getUniverseStargate', $id); if(!empty($data)){ diff --git a/app/main/model/universe/stationmodel.php b/app/Model/Universe/StationModel.php similarity index 90% rename from app/main/model/universe/stationmodel.php rename to app/Model/Universe/StationModel.php index d890ea59..daafb4a3 100644 --- a/app/main/model/universe/stationmodel.php +++ b/app/Model/Universe/StationModel.php @@ -6,7 +6,7 @@ * Time: 03:00 */ -namespace Model\Universe; +namespace Exodus4D\Pathfinder\Model\Universe; use DB\SQL\Schema; @@ -29,7 +29,7 @@ class StationModel extends AbstractUniverseModel { 'systemId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\SystemModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\SystemModel', 'constraint' => [ [ 'table' => 'system', @@ -41,7 +41,7 @@ class StationModel extends AbstractUniverseModel { 'typeId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\TypeModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\TypeModel', 'constraint' => [ [ 'table' => 'type', @@ -53,7 +53,7 @@ class StationModel extends AbstractUniverseModel { 'corporationId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\CorporationModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\CorporationModel', 'constraint' => [ [ 'table' => 'corporation', @@ -64,7 +64,7 @@ class StationModel extends AbstractUniverseModel { 'raceId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\RaceModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\RaceModel', 'constraint' => [ [ 'table' => 'race', @@ -123,7 +123,7 @@ class StationModel extends AbstractUniverseModel { * @param array $additionalOptions */ protected function loadData(int $id, string $accessToken = '', array $additionalOptions = []){ - $data = self::getF3()->ccpClient()->getUniverseStationData($id); + $data = self::getF3()->ccpClient()->send('getUniverseStation', $id); if(!empty($data) && !isset($data['error'])){ /** * @var $system SystemModel diff --git a/app/main/model/universe/structuremodel.php b/app/Model/Universe/StructureModel.php similarity index 91% rename from app/main/model/universe/structuremodel.php rename to app/Model/Universe/StructureModel.php index a1fc0ae4..3ea0828a 100644 --- a/app/main/model/universe/structuremodel.php +++ b/app/Model/Universe/StructureModel.php @@ -6,7 +6,7 @@ * Time: 15:56 */ -namespace Model\Universe; +namespace Exodus4D\Pathfinder\Model\Universe; use DB\SQL; use DB\SQL\Schema; @@ -30,7 +30,7 @@ class StructureModel extends AbstractUniverseModel { 'systemId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\SystemModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\SystemModel', 'constraint' => [ [ 'table' => 'system', @@ -42,7 +42,7 @@ class StructureModel extends AbstractUniverseModel { 'typeId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\TypeModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\TypeModel', 'constraint' => [ [ 'table' => 'type', @@ -90,7 +90,7 @@ class StructureModel extends AbstractUniverseModel { * @param array $additionalOptions */ protected function loadData(int $id, string $accessToken = '', array $additionalOptions = []){ - $data = self::getF3()->ccpClient()->getUniverseStructureData($id, $accessToken); + $data = self::getF3()->ccpClient()->send('getUniverseStructure', $id, $accessToken); if(!empty($data) && !isset($data['error'])){ /** * @var $type TypeModel diff --git a/app/main/model/universe/systemmodel.php b/app/Model/Universe/SystemModel.php similarity index 93% rename from app/main/model/universe/systemmodel.php rename to app/Model/Universe/SystemModel.php index c59ca342..3775e027 100644 --- a/app/main/model/universe/systemmodel.php +++ b/app/Model/Universe/SystemModel.php @@ -6,7 +6,7 @@ * Time: 19:29 */ -namespace Model\Universe; +namespace Exodus4D\Pathfinder\Model\Universe; use DB\SQL\Schema; @@ -29,7 +29,7 @@ class SystemModel extends AbstractUniverseModel { 'constellationId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\ConstellationModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\ConstellationModel', 'constraint' => [ [ 'table' => 'constellation', @@ -41,7 +41,7 @@ class SystemModel extends AbstractUniverseModel { 'starId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\StarModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\StarModel', 'constraint' => [ [ 'table' => 'star', @@ -85,28 +85,28 @@ class SystemModel extends AbstractUniverseModel { 'default' => 0 ], 'planets' => [ - 'has-many' => ['Model\Universe\PlanetModel', 'systemId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\PlanetModel', 'systemId'] ], 'statics' => [ - 'has-many' => ['Model\Universe\SystemStaticModel', 'systemId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\SystemStaticModel', 'systemId'] ], 'stargates' => [ - 'has-many' => ['Model\Universe\StargateModel', 'systemId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\StargateModel', 'systemId'] ], 'stations' => [ - 'has-many' => ['Model\Universe\StationModel', 'systemId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\StationModel', 'systemId'] ], 'structures' => [ - 'has-many' => ['Model\Universe\StructureModel', 'systemId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\StructureModel', 'systemId'] ], 'neighbour' => [ - 'has-one' => ['Model\Universe\SystemNeighbourModel', 'systemId'] + 'has-one' => ['Exodus4D\Pathfinder\Model\Universe\SystemNeighbourModel', 'systemId'] ], 'sovereignty' => [ - 'has-one' => ['Model\Universe\SovereigntyMapModel', 'systemId'] + 'has-one' => ['Exodus4D\Pathfinder\Model\Universe\SovereigntyMapModel', 'systemId'] ], 'factionWar' => [ - 'has-one' => ['Model\Universe\FactionWarSystemModel', 'systemId'] + 'has-one' => ['Exodus4D\Pathfinder\Model\Universe\FactionWarSystemModel', 'systemId'] ] ]; @@ -491,7 +491,7 @@ class SystemModel extends AbstractUniverseModel { * @param array $additionalOptions */ protected function loadData(int $id, string $accessToken = '', array $additionalOptions = []){ - $data = self::getF3()->ccpClient()->getUniverseSystemData($id); + $data = self::getF3()->ccpClient()->send('getUniverseSystem', $id); if(!empty($data)){ /** @@ -521,7 +521,7 @@ class SystemModel extends AbstractUniverseModel { */ public function loadPlanetsData(){ if($this->valid()){ - $data = self::getF3()->ccpClient()->getUniverseSystemData($this->_id); + $data = self::getF3()->ccpClient()->send('getUniverseSystem', $this->_id); if($data['planets']){ // planets are optional since ESI v4 (e.g. Abyssal systems) foreach((array)$data['planets'] as $planetData){ @@ -542,7 +542,7 @@ class SystemModel extends AbstractUniverseModel { */ public function loadStargatesData(){ if($this->valid()){ - $data = self::getF3()->ccpClient()->getUniverseSystemData($this->_id); + $data = self::getF3()->ccpClient()->send('getUniverseSystem', $this->_id); if($data['stargates']){ foreach((array)$data['stargates'] as $stargateId){ /** @@ -561,7 +561,7 @@ class SystemModel extends AbstractUniverseModel { */ public function loadStationsData(){ if($this->valid()){ - $data = self::getF3()->ccpClient()->getUniverseSystemData($this->_id); + $data = self::getF3()->ccpClient()->send('getUniverseSystem', $this->_id); if($data['stations']){ foreach((array)$data['stations'] as $stationId){ /** diff --git a/app/main/model/universe/systemneighbourmodel.php b/app/Model/Universe/SystemNeighbourModel.php similarity index 87% rename from app/main/model/universe/systemneighbourmodel.php rename to app/Model/Universe/SystemNeighbourModel.php index f598565c..0ef5a20c 100644 --- a/app/main/model/universe/systemneighbourmodel.php +++ b/app/Model/Universe/SystemNeighbourModel.php @@ -1,7 +1,7 @@ [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\RegionModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\RegionModel', 'constraint' => [ [ 'table' => 'region', @@ -38,7 +38,7 @@ class SystemNeighbourModel extends AbstractUniverseModel { 'constellationId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\ConstellationModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\ConstellationModel', 'constraint' => [ [ 'table' => 'constellation', @@ -51,7 +51,7 @@ class SystemNeighbourModel extends AbstractUniverseModel { 'type' => Schema::DT_INT, 'index' => true, 'unique' => true, - 'belongs-to-one' => 'Model\Universe\SystemModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\SystemModel', 'constraint' => [ [ 'table' => 'system', diff --git a/app/main/model/universe/systemstaticmodel.php b/app/Model/Universe/SystemStaticModel.php similarity index 89% rename from app/main/model/universe/systemstaticmodel.php rename to app/Model/Universe/SystemStaticModel.php index a072b123..c62b7b52 100644 --- a/app/main/model/universe/systemstaticmodel.php +++ b/app/Model/Universe/SystemStaticModel.php @@ -6,7 +6,7 @@ * Time: 17:50 */ -namespace Model\Universe; +namespace Exodus4D\Pathfinder\Model\Universe; use DB\SQL\Schema; @@ -24,7 +24,7 @@ class SystemStaticModel extends AbstractUniverseModel { 'systemId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\SystemModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\SystemModel', 'constraint' => [ [ 'table' => 'system', @@ -36,7 +36,7 @@ class SystemStaticModel extends AbstractUniverseModel { 'typeId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\TypeModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\TypeModel', 'constraint' => [ [ 'table' => 'type', diff --git a/app/main/model/universe/typeattributemodel.php b/app/Model/Universe/TypeAttributeModel.php similarity index 90% rename from app/main/model/universe/typeattributemodel.php rename to app/Model/Universe/TypeAttributeModel.php index eec9d4bf..41011af6 100644 --- a/app/main/model/universe/typeattributemodel.php +++ b/app/Model/Universe/TypeAttributeModel.php @@ -6,7 +6,7 @@ * Time: 22:00 */ -namespace Model\Universe; +namespace Exodus4D\Pathfinder\Model\Universe; use DB\SQL\Schema; @@ -24,7 +24,7 @@ class TypeAttributeModel extends AbstractUniverseModel { 'typeId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\TypeModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\TypeModel', 'constraint' => [ [ 'table' => 'type', @@ -36,7 +36,7 @@ class TypeAttributeModel extends AbstractUniverseModel { 'attributeId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\DogmaAttributeModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\DogmaAttributeModel', 'constraint' => [ [ 'table' => 'dogma_attribute', diff --git a/app/main/model/universe/typemodel.php b/app/Model/Universe/TypeModel.php similarity index 92% rename from app/main/model/universe/typemodel.php rename to app/Model/Universe/TypeModel.php index 4402d741..88b78f75 100644 --- a/app/main/model/universe/typemodel.php +++ b/app/Model/Universe/TypeModel.php @@ -6,11 +6,11 @@ * Time: 15:56 */ -namespace Model\Universe; +namespace Exodus4D\Pathfinder\Model\Universe; use DB\SQL\Schema; -use lib\Config; -use lib\Util; +use Exodus4D\Pathfinder\Lib\Config; +use Exodus4D\Pathfinder\Lib\Util; class TypeModel extends AbstractUniverseModel { @@ -72,7 +72,7 @@ class TypeModel extends AbstractUniverseModel { 'groupId' => [ 'type' => Schema::DT_INT, 'index' => true, - 'belongs-to-one' => 'Model\Universe\GroupModel', + 'belongs-to-one' => 'Exodus4D\Pathfinder\Model\Universe\GroupModel', 'constraint' => [ [ 'table' => 'group', @@ -104,25 +104,25 @@ class TypeModel extends AbstractUniverseModel { 'index' => true ], 'stations' => [ - 'has-many' => ['Model\Universe\StationModel', 'typeId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\StationModel', 'typeId'] ], 'structures' => [ - 'has-many' => ['Model\Universe\StructureModel', 'typeId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\StructureModel', 'typeId'] ], 'planets' => [ - 'has-many' => ['Model\Universe\PlanetModel', 'typeId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\PlanetModel', 'typeId'] ], 'stars' => [ - 'has-many' => ['Model\Universe\StarModel', 'typeId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\StarModel', 'typeId'] ], 'attributes' => [ - 'has-many' => ['Model\Universe\TypeAttributeModel', 'typeId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\TypeAttributeModel', 'typeId'] ], 'stargates' => [ - 'has-many' => ['Model\Universe\StargateModel', 'typeId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\StargateModel', 'typeId'] ], 'statics' => [ - 'has-many' => ['Model\Universe\SystemStaticModel', 'typeId'] + 'has-many' => ['Exodus4D\Pathfinder\Model\Universe\SystemStaticModel', 'typeId'] ] ]; @@ -352,7 +352,7 @@ class TypeModel extends AbstractUniverseModel { * @param array $additionalOptions */ protected function loadData(int $id, string $accessToken = '', array $additionalOptions = []){ - $data = self::getF3()->ccpClient()->getUniverseTypesData($id); + $data = self::getF3()->ccpClient()->send('getUniverseType', $id); if(!empty($data)){ $this->manipulateDogmaAttributes($data); diff --git a/app/main/model/universe/abstractuniversemodel.php b/app/Model/Universe/abstractuniversemodel.php similarity index 98% rename from app/main/model/universe/abstractuniversemodel.php rename to app/Model/Universe/abstractuniversemodel.php index f2b85df8..cc5c3a9a 100644 --- a/app/main/model/universe/abstractuniversemodel.php +++ b/app/Model/Universe/abstractuniversemodel.php @@ -6,9 +6,9 @@ * Time: 14:18 */ -namespace Model\Universe; +namespace Exodus4D\Pathfinder\Model\Universe; -use Model\AbstractModel; +use Exodus4D\Pathfinder\Model\AbstractModel; abstract class AbstractUniverseModel extends AbstractModel { diff --git a/app/config.ini b/app/config.ini index 8eb9ab6c..59b0dee6 100644 --- a/app/config.ini +++ b/app/config.ini @@ -52,7 +52,7 @@ SEED = {{ md5(@SERVER.SERVER_NAME) }} ; folder=[DIR] ; - Cache data is stored on disc ; redis=[SERVER] -; - Cache data is stored in Redis. redis=[host]:[port]:[db] (e.g. redis=localhost:6379:1) +; - Cache data is stored in Redis. redis=[host]:[port]:[db]:[auth] (e.g. redis=localhost:6379:1:myPass) CACHE = folder=tmp/cache/ ; Cache backend for API data @@ -67,7 +67,7 @@ CACHE = folder=tmp/cache/ ; folder=[DIR] ; - Cache data is stored on disc ; redis=[SERVER] -; - Cache data is stored in Redis. redis=[host]:[port]:[db] (e.g. redis=localhost:6379:2) +; - Cache data is stored in Redis. redis=[host]:[port]:[db]:[auth] (e.g. redis=localhost:6379:2:myPass) API_CACHE = {{@CACHE}} ; Cache backend used by PHPs Session handler. @@ -85,8 +85,8 @@ API_CACHE = {{@CACHE}} SESSION_CACHE = mysql ; Callback functions ============================================================================== -ONERROR = Controller\Controller->showError -UNLOAD = Controller\Controller->unload +ONERROR = {{ @NAMESPACE }}\Controller\Controller->showError +UNLOAD = {{ @NAMESPACE }}\Controller\Controller->unload ; Path configurations ============================================================================= ; All path configurations are relative to BASE dir and should NOT be changed @@ -111,8 +111,8 @@ UI = public/ ; Autoload folder ; Where PHP attempts to autoload PHP classes at runtime. ; Syntax: [DIR] -; Default: app/main/ -AUTOLOAD = app/main/ +; Default: app/ +;AUTOLOAD = app/ ; Favicon folder ; Syntax: [DIR] @@ -137,6 +137,8 @@ CONF.DEFAULT = app/ [configs] {{@CONF.DEFAULT}}routes.ini = true {{@CONF.DEFAULT}}pathfinder.ini = true +{{@CONF.DEFAULT}}plugin.ini = true {{@CONF.CUSTOM}}pathfinder.ini = true +{{@CONF.CUSTOM}}plugin.ini = true {{@CONF.DEFAULT}}requirements.ini = true {{@CONF.DEFAULT}}cron.ini = true \ No newline at end of file diff --git a/app/cron.ini b/app/cron.ini index de4f53d7..f7c841e1 100644 --- a/app/cron.ini +++ b/app/cron.ini @@ -25,48 +25,48 @@ downtime = 0 11 * * * [CRON.jobs] ; delete EOL connections -deleteEolConnections = Cron\MapUpdate->deleteEolConnections, @fiveMinutes +deleteEolConnections = {{ @NAMESPACE }}\Cron\MapUpdate->deleteEolConnections, @fiveMinutes ; delete expired wh connections -deleteExpiredConnections = Cron\MapUpdate->deleteExpiredConnections, @hourly +deleteExpiredConnections = {{ @NAMESPACE }}\Cron\MapUpdate->deleteExpiredConnections, @hourly ; delete character log data -deleteLogData = Cron\CharacterUpdate->deleteLogData, @instant +deleteLogData = {{ @NAMESPACE }}\Cron\CharacterUpdate->deleteLogData, @instant ; delete expired signatures -deleteSignatures = Cron\MapUpdate->deleteSignatures, @halfHour +deleteSignatures = {{ @NAMESPACE }}\Cron\MapUpdate->deleteSignatures, @halfHour ; import system data (jump, kill,..) from CCP API -importSystemData = Cron\CcpSystemsUpdate->importSystemData, @halfPastHour +importSystemData = {{ @NAMESPACE }}\Cron\CcpSystemsUpdate->importSystemData, @halfPastHour ; disable outdated maps -deactivateMapData = Cron\MapUpdate->deactivateMapData, @hourly +deactivateMapData = {{ @NAMESPACE }}\Cron\MapUpdate->deactivateMapData, @hourly ; clean up character data (kick, ban,..) -cleanUpCharacterData = Cron\CharacterUpdate->cleanUpCharacterData, @hourly +cleanUpCharacterData = {{ @NAMESPACE }}\Cron\CharacterUpdate->cleanUpCharacterData, @hourly ; delete disabled maps -deleteMapData = Cron\MapUpdate->deleteMapData, @downtime +deleteMapData = {{ @NAMESPACE }}\Cron\MapUpdate->deleteMapData, @downtime ; delete expired character cookie authentication data -deleteAuthenticationData = Cron\CharacterUpdate->deleteAuthenticationData, @downtime +deleteAuthenticationData = {{ @NAMESPACE }}\Cron\CharacterUpdate->deleteAuthenticationData, @downtime ; delete expired cache files -deleteExpiredCacheData = Cron\Cache->deleteExpiredCacheData, @downtime +deleteExpiredCacheData = {{ @NAMESPACE }}\Cron\Cache->deleteExpiredCacheData, @downtime ; delete old statistics (activity log) data -deleteStatisticsData = Cron\StatisticsUpdate->deleteStatisticsData, @weekly +deleteStatisticsData = {{ @NAMESPACE }}\Cron\StatisticsUpdate->deleteStatisticsData, @weekly ; truncate map history log files -truncateMapHistoryLogFiles = Cron\MapHistory->truncateMapHistoryLogFiles, @halfHour +truncateMapHistoryLogFiles = {{ @NAMESPACE }}\Cron\MapHistory->truncateMapHistoryLogFiles, @halfHour ; sync "sovereignty" and "faction warfare" data from CCP´s ESI API -updateSovereigntyData = Cron\Universe->updateSovereigntyData, @halfPastHour +updateSovereigntyData = {{ @NAMESPACE }}\Cron\Universe->updateSovereigntyData, @halfPastHour ; sync static system data from CCP´s ESI API ; -> Job is WIP! -;updateUniverseSystems = Cron\Universe->updateUniverseSystems, @instant +;updateUniverseSystems = {{ @NAMESPACE }}\Cron\Universe->updateUniverseSystems, @instant ; bootstrap job for "eve_universe" DB from CCP´s ESI API ; -> Only for development! This job is used to build the initial export/sql/eve_universe.sql -;setup = Cron\Universe->setup, @instant \ No newline at end of file +;setup = {{ @NAMESPACE }}\Cron\Universe->setup, @instant \ No newline at end of file diff --git a/app/environment.ini b/app/environment.ini index 409cdf58..54075b4c 100644 --- a/app/environment.ini +++ b/app/environment.ini @@ -35,7 +35,7 @@ CCP_SSO_DOWNTIME = 11:00 ; CCP ESI API CCP_ESI_URL = https://esi.evetech.net CCP_ESI_DATASOURCE = singularity -CCP_ESI_SCOPES = esi-location.read_online.v1,esi-location.read_location.v1,esi-location.read_ship_type.v1,esi-ui.write_waypoint.v1,esi-ui.open_window.v1,esi-universe.read_structures.v1,esi-corporations.read_corporation_membership.v1,esi-clones.read_clones.v1 +CCP_ESI_SCOPES = esi-location.read_online.v1,esi-location.read_location.v1,esi-location.read_ship_type.v1,esi-ui.write_waypoint.v1,esi-ui.open_window.v1,esi-universe.read_structures.v1,esi-corporations.read_corporation_membership.v1,esi-clones.read_clones.v1,esi-characters.read_corporation_roles.v1 CCP_ESI_SCOPES_ADMIN = ; SMTP settings (optional) @@ -88,7 +88,7 @@ CCP_SSO_DOWNTIME = 11:00 ; CCP ESI API CCP_ESI_URL = https://esi.evetech.net CCP_ESI_DATASOURCE = tranquility -CCP_ESI_SCOPES = esi-location.read_online.v1,esi-location.read_location.v1,esi-location.read_ship_type.v1,esi-ui.write_waypoint.v1,esi-ui.open_window.v1,esi-universe.read_structures.v1,esi-corporations.read_corporation_membership.v1,esi-clones.read_clones.v1 +CCP_ESI_SCOPES = esi-location.read_online.v1,esi-location.read_location.v1,esi-location.read_ship_type.v1,esi-ui.write_waypoint.v1,esi-ui.open_window.v1,esi-universe.read_structures.v1,esi-corporations.read_corporation_membership.v1,esi-clones.read_clones.v1,esi-characters.read_corporation_roles.v1 CCP_ESI_SCOPES_ADMIN = ; SMTP settings (optional) diff --git a/app/lib/CHANGELOG.md b/app/lib/CHANGELOG.md deleted file mode 100644 index 4960ea2c..00000000 --- a/app/lib/CHANGELOG.md +++ /dev/null @@ -1,915 +0,0 @@ -CHANGELOG - -3.6.5 (24 December 2018) -* NEW: Log, added timestamp to each line -* NEW: Auth, added support for custom compare method, [#116](https://github.com/bcosca/fatfree-core/issues/116) -* NEW: cache tag support for mongo & jig mapper, ref [#166](https://github.com/bcosca/fatfree-core/issues/116) -* NEW: Allow PHP functions as template token filters -* Web: Fix double redirect bug when running cURL with open_basedir disabled -* Web: Cope with responses from HTTP/2 servers -* Web->filler: remove very first space, when $std is false -* Web\OAuth2: Cope with HTTP/2 responses -* Web\OAuth2: take Content-Type header into account for json decoding, [#250](https://github.com/bcosca/fatfree-core/issues/250) [#251](https://github.com/bcosca/fatfree-core/issues/251) -* Web\OAuth2: fixed empty results on some endpoints [#250](https://github.com/bcosca/fatfree-core/issues/250) -* DB\SQL\Mapper: optimize mapper->count memory usage -* DB\SQL\Mapper: New table alias operator -* DB\SQL\Mapper: fix count() performance on non-grouped result sets, [bcosca/fatfree#1114](https://github.com/bcosca/fatfree/issues/1114) -* DB\SQL: Support for CTE in postgreSQL, [bcosca/fatfree#1107](https://github.com/bcosca/fatfree/issues/1107), [bcosca/fatfree#1116](https://github.com/bcosca/fatfree/issues/1116), [bcosca/fatfree#1021](https://github.com/bcosca/fatfree/issues/1021) -* DB\SQL->log: Remove extraneous whitespace -* DB\SQL: Added ability to add inline comments per SQL query -* CLI\WS, Refactoring: Streamline socket server -* CLI\WS: Add option for dropping query in OAuth2 URI -* CLI\WS: Add URL-safe base64 encoding -* CLI\WS: Detect errors in returned JSON values -* CLI\WS: Added support for Sec-WebSocket-Protocol header -* Matrix->calendar: Allow unix timestamp as date argument -* Basket: Access basket item by _id [#260](https://github.com/bcosca/fatfree-core/issues/260) -* SMTP: Added TLS 1.2 support [bcosca/fatfree#1115](https://github.com/bcosca/fatfree/issues/1115) -* SMTP->send: Respect $log argument -* Base->cast: recognize binary and octal numbers in config -* Base->cast: add awareness of hexadecimal literals -* Base->abort: Remove unnecessary Content-Encoding header -* Base->abort: Ensure headers have not been flushed -* Base->format: Differentiate between long- and full-date (with localized weekday) formats -* Base->format: Conform with intl extension's number output -* Enable route handler to override Access-Control headers in response to OPTIONS request, [#257](https://github.com/bcosca/fatfree-core/issues/257) -* Augment filters with a var_export function -* Bug fix php7.3: Fix template parse regex to be compatible with strict PCRE2 rules for hyphen placement in a character class -* Bug fix, Cache->set: update creation time when updating existing cache entries -* Bug fix: incorrect ICU date/time formatting -* Bug fix, Jig: lazy write on empty data -* Bug fix: Method uppercase to avoid route failure [#252](https://github.com/bcosca/fatfree-core/issues/252) -* Fixed error description when (PSR-11) `CONTAINER` fails to resolve a class [#253](https://github.com/bcosca/fatfree-core/issues/253) -* Mitigate CSRF predictability/vulnerability -* Expose Mapper->factory() method - -3.6.4 (19 April 2018) -* NEW: Added Dependency Injection support with CONTAINER variable [#221](https://github.com/bcosca/fatfree-core/issues/221) -* NEW: configurable LOGGABLE error codes [#1091](https://github.com/bcosca/fatfree/issues/1091#issuecomment-364674701) -* NEW: JAR.lifetime option, [#178](https://github.com/bcosca/fatfree-core/issues/178) -* Template: reduced Prefab calls -* Template: optimized reflection for better derivative support, [bcosca/fatfree#1088](https://github.com/bcosca/fatfree/issues/1088) -* Template: optimized parsing for template attributes and tokens -* DB\Mongo: fixed logging with mongodb extention -* DB\Jig: added lazy-loading [#7e1cd9b9b89](https://github.com/bcosca/fatfree-core/commit/7e1cd9b9b89c4175d0f6b86ced9d9bd49c04ac39) -* DB\Jig\Mapper: Added group feature, bcosca/fatfree#616 -* DB\SQL\Mapper: fix PostgreSQL RETURNING ID when no pkey is available, [bcosca/fatfree#1069](https://github.com/bcosca/fatfree/issues/1069), [#230](https://github.com/bcosca/fatfree-core/issues/230) -* DB\SQL\Mapper: disable order clause auto-quoting when it's already been quoted -* Web->location: add failsafe for geoip_region_name_by_code() [#GB:Bxyn9xn9AgAJ](https://groups.google.com/d/msg/f3-framework/APau4wnwNzE/Bxyn9xn9AgAJ) -* Web->request: Added proxy support [#e936361b](https://github.com/bcosca/fatfree-core/commit/e936361bc03010c4c7c38a396562e5e96a8a100d) -* Web->mime: Added JFIF format -* Markdown: handle line breaks in paragraph blocks, [bcosca/fatfree#1100](https://github.com/bcosca/fatfree/issues/1100) -* config: reduced cast calls on parsing config sections -* Patch empty SERVER_NAME [bcosca/fatfree#1084](https://github.com/bcosca/fatfree/issues/1084) -* Bugfix: unreliable request headers in Web->request() response [bcosca/fatfree#1092](https://github.com/bcosca/fatfree/issues/1092) -* Fixed, View->render: utilizing multiple UI paths, [bcosca/fatfree#1083](https://github.com/bcosca/fatfree/issues/1083) -* Fixed URL parsing with PHP 5.4 [#247](https://github.com/bcosca/fatfree-core/issues/247) -* Fixed PHP 7.2 warnings when session is active prematurely, [#238](https://github.com/bcosca/fatfree-core/issues/238) -* Fixed setcookie $expire variable type [#240](https://github.com/bcosca/fatfree-core/issues/240) -* Fixed expiration time when updating an existing cookie - -3.6.3 (31 December 2017) -* PHP7 fix: remove deprecated (unset) cast -* Web->request: restricted follow_location to 3XX responses only -* CLI mode: refactored arguments parsing -* CLI mode: fixed query string encoding -* SMTP: Refactor parsing of attachments -* SMTP: clean-up mail headers for multipart messages, [#1065](https://github.com/bcosca/fatfree/issues/1065) -* config: fixed performance issues on parsing config files -* config: cast command parameters in config entries to php type & constant, [#1030](https://github.com/bcosca/fatfree/issues/1030) -* config: reduced registry calls -* config: skip hive escaping when resolving dynamic config vars, [#1030](https://github.com/bcosca/fatfree/issues/1030) -* Bug fix: Incorrect cookie lifetime computation, [#1070](https://github.com/bcosca/fatfree/issues/1070), [#1016](https://github.com/bcosca/fatfree/issues/1016) -* DB\SQL\Mapper: use RETURNING option instead of a sequence query to get lastInsertId in PostgreSQL, [#1069](https://github.com/bcosca/fatfree/issues/1069), [#230](https://github.com/bcosca/fatfree-core/issues/230) -* DB\SQL\Session: check if _agent is too long for SQL based sessions [#236](https://github.com/bcosca/fatfree-core/issues/236) -* DB\SQL\Session: fix Session handler table creation issue on SQL Server, [#899](https://github.com/bcosca/fatfree/issues/899) -* DB\SQL: fix oracle db issue with empty error variable, [#1072](https://github.com/bcosca/fatfree/issues/1072) -* DB\SQL\Mapper: fix sorting issues on SQL Server, [#1052](https://github.com/bcosca/fatfree/issues/1052) [#225](https://github.com/bcosca/fatfree-core/issues/225) -* Prevent directory traversal attacks on filesystem based cache [#1073](https://github.com/bcosca/fatfree/issues/1073) -* Bug fix, Template: PHP constants used in include with attribute, [#983](https://github.com/bcosca/fatfree/issues/983) -* Bug fix, Template: Numeric value in expression alters PHP_EOL context -* Template: use existing linefeed instead of PHP_EOL, [#1048](https://github.com/bcosca/fatfree/issues/1048) -* Template: make newline interpolation handling configurable [#223](https://github.com/bcosca/fatfree-core/issues/223) -* Template: add beforerender to Preview -* fix custom FORMATS without modifiers -* Cache: Refactor Cache->reset for XCache -* Cache: loosen reset cache key pattern, [#1041](https://github.com/bcosca/fatfree/issues/1041) -* XCache: suffix reset only works if xcache.admin.enable_auth is disabled -* Added HTTP 103 as recently approved by the IETF -* LDAP changes to for AD flexibility [#227](https://github.com/bcosca/fatfree-core/issues/227) -* Hide debug trace from ajax errors when DEBUG=0 [#1071](https://github.com/bcosca/fatfree/issues/1071) -* fix View->render using potentially wrong cache entry - -3.6.2 (26 June 2017) -* Return a status code > 0 when dying on error [#220](https://github.com/bcosca/fatfree-core/issues/220) -* fix SMTP line width [#215](https://github.com/bcosca/fatfree-core/issues/215) -* Allow using a custom field for ldap user id checking [#217](https://github.com/bcosca/fatfree-core/issues/217) -* NEW: DB\SQL->exists: generic method to check if SQL table exists -* Pass handler to route handler and hooks [#1035](https://github.com/bcosca/fatfree/issues/1035) -* pass carriage return of multiline dictionary keys -* Better Web->slug customization -* fix incorrect header issue [#211](https://github.com/bcosca/fatfree-core/issues/211) -* fix schema issue on databases with case-sensitive collation, fixes [#209](https://github.com/bcosca/fatfree-core/issues/209) -* Add filter for deriving C-locale equivalent of a number -* Bug fix: @LANGUAGE remains unchanged after override -* abort: added Header pre-check -* Assemble URL after ONREROUTE -* Add reroute argument to skip script termination -* Invoke ONREROUTE after headers are sent -* SQLite switch to backtick as quote -* Bug fix: Incorrect timing in SQL query logs -* DB\SQL\Mapper: Cast return value of count to integer -* Patched $_SERVER['REQUEST_URI'] to ensure it contains a relative URI -* Tweak debug verbosity -* fix php carriage return issue in preview->build [#205](https://github.com/bcosca/fatfree-core/pull/205) -* fixed template string resolution [#205](https://github.com/bcosca/fatfree-core/pull/205) -* Fixed unexpected default seed on CACHE set [#1028](https://github.com/bcosca/fatfree/issues/1028) -* DB\SQL\Mapper: Optimized field escaping on options -* Optimize template conversion to PHP file - -3.6.1 (2 April 2017) -* NEW: Recaptcha plugin [#194](https://github.com/bcosca/fatfree-core/pull/194) -* NEW: MB variable for detecting multibyte support -* NEW: DB\SQL: Cache parsed schema for the TTL duration -* NEW: quick erase flag on Jig/Mongo/SQL mappers [#193](https://github.com/bcosca/fatfree-core/pull/193) -* NEW: Allow OPTIONS method to return a response body [#171](https://github.com/bcosca/fatfree-core/pull/171) -* NEW: Add support for Memcached (bcosca/fatfree#997) -* NEW: Rudimentary preload resource (HTTP2 server) support via template push() -* NEW: Add support for new MongoDB driver [#177](https://github.com/bcosca/fatfree-core/pull/177) -* Changed: template filter are all lowercase now -* Changed: Fix template lookup inconsistency: removed base dir from UI on render -* Changed: count() method now has an options argument [#192](https://github.com/bcosca/fatfree-core/pull/192) -* Changed: SMTP, Spit out error message if any -* \DB\SQL\Mapper: refactored row count strategy -* DB\SQL\Mapper: Allow non-scalar values to be assigned as mapper property -* DB\SQL::PARAM_FLOAT: remove cast to float (#106 and bcosca/fatfree#984) (#191) -* DB\SQL\mapper->erase: allow empty string -* DB\SQL\mapper->insert: fields reset after successful INSERT -* Add option to debounce Cursor->paginate subset [#195](https://github.com/bcosca/fatfree-core/pull/195) -* View: Don't delete sandboxed variables (#198) -* Preview: Optimize compilation of template expressions -* Preview: Use shorthand tag for direct rendering -* Preview->resolve(): new tweak to allow template persistence as option -* Web: Expose diacritics translation table -* SMTP: Enable logging of message body only when $log argument is 'verbose' -* SMTP: Convert headers to camelcase for consistency -* make cache seed more flexible, #164 -* Improve trace details for DEBUG>2 -* Enable config() to read from an array of input files -* Improved alias and reroute regex -* Make camelCase and snakeCase Unicode-aware -* format: Provision for optional whitespaces -* Break APCu-BC dependence -* Old PHP 5.3 cleanup -* Debug log must include HTTP query -* Recognize X-Forwarded-Port header (bcosca/fatfree#1002) -* Avoid use of deprecated mcrypt module -* Return only the client's IP when using the `X-Forwarded-For` header to deduce an IP address -* Remove orphan mutex locks on termination (#157) -* Use 80 as default port number to avoid issues when `$_SERVER['SERVER_PORT']` is not existing -* fread replaced with readfile() for simple send() usecase -* Bug fix: request URI with multiple leading slashes, #203 -* Bug fix: Query generates wrong adhoc field value -* Bug fix: SMTP stream context issue #200 -* Bug fix: child pseudo class selector in minify, bcosca/fatfree#1008 -* Bug fix: "Undefined index: CLI" error (#197) -* Bug fix: cast Cache-Control expire time to int, bcosca/fatfree#1004 -* Bug fix: Avoid issuance of multiple Content-Type headers for nested templates -* Bug fix: wildcard token issue with digits (bcosca/fatfree#996) -* Bug fix: afterupdate ignored when row does not change -* Bug fix: session handler read() method for PHP7 (need strict string) #184 #185 -* Bug fix: reroute mocking in CLI mode (#183) -* Bug fix: Reroute authoritative relative references (#181) -* Bug fix: locales order and charset hyphen -* Bug fix: base stripped twice in router (#176) - -3.6.0 (19 November 2016) -* NEW: [cli] request type -* NEW: console-friendly CLI mode -* NEW: lexicon caching -* NEW: Silent operator skips startup error check (#125) -* NEW: DB\SQL->trans() -* NEW: custom config section parser, i.e. [conf > Foo::bar] -* NEW: support for cache tags in SQL -* NEW: custom FORMATS -* NEW: Mongo mapper fields whitelist -* NEW: WebSocket server -* NEW: Base->extend method (#158) -* NEW: Implement framework variable caching via config, i.e. FOO = "bar" | 3600 -* NEW: Lightweight OAuth2 client -* NEW: SEED variable, configurable app-specific hashing prefix (#149, bcosca/fatfree#951, bcosca/fatfree#884, bcosca/fatfree#629) -* NEW: CLI variable -* NEW: Web->send, specify custom filename (#124) -* NEW: Web->send, added flushing flag (#131) -* NEW: Indexed route wildcards, now exposed in PARAMS['*'] -* Changed: PHP 5.4 is now the minimum version requirement -* Changed: Prevent database wrappers from being cloned -* Changed: Router works on PATH instead of URI (#126) NB: PARAMS.0 no longer contains the query string -* Changed: Removed ALIASES autobuilding (#118) -* Changed: Route wildcards match empty strings (#119) -* Changed: Disable default debug highlighting, HIGHLIGHT is false now -* General PHP 5.4 optimizations -* Optimized config parsing -* Optimized Base->recursive -* Optimized header extraction -* Optimized cache/expire headers -* Optimized session_start behaviour (bcosca/fatfree#673) -* Optimized reroute regex -* Tweaked cookie removal -* Better route precedence order -* Performance tweak: reduced cache calls -* Refactored lexicon (LOCALES) build-up, much faster now -* Added turkish locale bug workaround -* Geo->tzinfo Update to UTC -* Added Xcache reset (bcosca/fatfree#928) -* Redis cache: allow db name in dsn -* SMTP: Improve server emulation responses -* SMTP: Optimize transmission envelope -* SMTP: Implement mock transmission -* SMTP: Various bug fixes and feature improvements -* SMTP: quit on failed authentication -* Geo->weather: force metric units -* Base->until: Implement CLI interoperability -* Base->format: looser plural syntax -* Base->format: Force decimal as default number format -* Base->merge: Added $keep flag to save result to the hive key -* Base->reroute: Allow array as URL argument for aliasing -* Base->alias: Allow query string (or array) to be appended to alias -* Permit reroute to named routes with URL query segment -* Sync COOKIE global on set() -* Permit non-hive variables to use JS dot notation -* RFC2616: Use absolute URIs for Location header -* Matrix->calendar: Check if calendar extension is loaded -* Markdown: require start of line/whitespace for text processing (#136) -* DB\[SQL|Jig|Mongo]->log(FALSE) disables logging -* DB\SQL->exec: Added timestamp toggle to db log -* DB\SQL->schema: Remove unnecessary line terminators -* DB\SQL\Mapper: allow array filter with empty string -* DB\SQL\Mapper: optimized handling for key-less tables -* DB\SQL\Mapper: added float support (#106) -* DB\SQL\Session: increased default column sizes (#148, bcosca/fatfree#931, bcosca/fatfree#950) -* Web: Catch cURL errors -* Optimize Web->receive (bcosca/fatfree#930) -* Web->minify: fix arbitrary file download vulnerability -* Web->request: fix cache control max-age detection (bcosca/fatfree#908) -* Web->request: Add request headers & error message to return value (bcosca/fatfree#737) -* Web->request: Refactored response to HTTP request -* Web->send flush while sending big files -* Image->rgb: allow hex strings -* Image->captcha: Check if GD module supports TrueType -* Image->load: Return FALSE on load failure -* Image->resize: keep aspect ratio when only width or height was given -* Updated OpenID lib (bcosca/fatfree#965) -* Audit->card: add new mastercard "2" BIN range (bcosca/fatfree#954) -* Deprecated: Bcrypt class -* Preview->render: optimized detection to remove short open PHP tags and allow xml tags (#133) -* Display file and line number in exception handler (bcosca/fatfree#967) -* Added error reporting level to Base->error and ERROR.level (bcosca/fatfree#957) -* Added optional custom cache instance to Session (#141) -* CLI-aware mock() -* XFRAME and PACKAGE can be switched off now (#128) -* Bug fix: wrong time calculation on memcache reset (#170) -* Bug fix: encode CLI parameters -* Bug fix: Close connection on abort explicitly (#162) -* Bug fix: Image->identicon, Avoid double-size sprite rotation (and possible segfault) -* Bug fix: Image->render and Image->dump, removed unnecessary 2nd argument (#146) -* Bug fix: Magic->offsetset, access property as array element (#147) -* Bug fix: multi-line custom template tag parsing (bcosca/fatfree#935) -* Bug fix: cache headers on errors (bcosca/fatfree#885) -* Bug fix: Web, deprecated CURLOPT_SSL_VERIFYHOST in curl -* Bug fix: Web, Invalid user error constant (bcosca/fatfree#962) -* Bug fix: Web->request, redirections for domain-less location (#135) -* Bug fix: DB\SQL\Mapper, reset changed flag after update (#142, #152) -* Bug fix: DB\SQL\Mapper, fix changed flag when using assignment operator #143 #150 #151 -* Bug fix: DB\SQL\Mapper, revival of the HAVING clause -* Bug fix: DB\SQL\Mapper, pgsql with non-integer primary keys (bcosca/fatfree#916) -* Bug fix: DB\SQL\Session, quote table name (bcosca/fatfree#977) -* Bug fix: snakeCase returns word starting with underscore (bcosca/fatfree#927) -* Bug fix: mock does not populate PATH variable -* Bug fix: Geo->weather API key (#129) -* Bug fix: Incorrect compilation of array element with zero index -* Bug fix: Compilation of array construct is incorrect -* Bug fix: Trailing slash redirection on UTF-8 paths (#121) - -3.5.1 (31 December 2015) -* NEW: ttl attribute in template tag -* NEW: allow anonymous function for template filter -* NEW: format modifier for international and custom currency symbol -* NEW: Image->data() returns image resource -* NEW: extract() get prefixed array keys from an assoc array -* NEW: Optimized and faster Template parser with full support for HTML5 empty tags -* NEW: Added support for {@token} encapsulation syntax in routes definition -* NEW: DB\SQL->exec(), automatically shift to 1-based query arguments -* NEW: abort() flush output -* Added referenced value to devoid() -* Template token filters are now resolved within Preview->token() -* Web->_curl: restrict redirections to HTTP -* Web->minify(), skip importing of external files -* Improved session and error handling in until() -* Get the error trace array with the new $format parameter -* Better support for unicode URLs -* Optimized TZ detection with date_default_timezone_get() -* format() Provide default decimal places -* Optimize code: remove redundant TTL checks -* Optimized timeout handling in Web->request() -* Improved PHPDoc hints -* Added missing russian DIACRITICS letters -* DB\Cursor: allow child implementation of reset() -* DB\Cursor: Copyfrom now does an internal call to set() -* DB\SQL: Provide the ability to disable SQL logging -* DB\SQL: improved query analysis to trigger fetchAll -* DB\SQL\Mapper: added support for binary table columns -* SQL,JIG,MONGO,CACHE Session handlers refactored and optimized -* SMTP Refactoring and optimization -* Bug fix: SMTP, Align quoted_printable_encode() with SMTP specs (dot-stuffing) -* Bug fix: SMTP, Send buffered optional headers to output -* Bug fix: SMTP, Content-Transfer-Encoding for non-TLS connections -* Bug fix: SMTP, Single attachment error -* Bug fix: Cursor->load not always mapping to first record -* Bug fix: dry SQL mapper should not trigger 'load' -* Bug fix: Code highlighting on empty text -* Bug fix: Image->resize, round dimensions instead of cast -* Bug fix: whitespace handling in $f3->compile() -* Bug fix: TTL of `View` and `Preview` (`Template`) -* Bug fix: token filter regex -* Bug fix: Template, empty attributes -* Bug fix: Preview->build() greedy regex -* Bug fix: Web->minify() single-line comment on last line -* Bug fix: Web->request(), follow_location with cURL and open_basedir -* Bug fix: Web->send() Single quotes around filename not interpreted correctly by some browsers - -3.5.0 (2 June 2015) -* NEW: until() method for long polling -* NEW: abort() to disconnect HTTP client (and continue execution) -* NEW: SQL Mapper->required() returns TRUE if field is not nullable -* NEW: PREMAP variable for allowing prefixes to handlers named after HTTP verbs -* NEW: [configs] section to allow config includes -* NEW: Test->passed() returns TRUE if no test failed -* NEW: SQL mapper changed() function -* NEW: fatfree-core composer support -* NEW: constants() method to expose constants -* NEW: Preview->filter() for configurable token filters -* NEW: CORS variable for Cross-Origin Resource Sharing support, #731 -* Change in behavior: Switch to htmlspecialchars for escaping -* Change in behavior: No movement in cursor position after erase(), #797 -* Change in behavior: ERROR.trace is a multiline string now -* Change in behavior: Strict token recognition in href attribute -* Router fix: loose method search -* Better route precedence order, #12 -* Preserve contents of ROUTES, #723 -* Alias: allow array of parameters -* Improvements on reroute method -* Fix for custom Jig session files -* Audit: better mobile detection -* Audit: add argument to test string as browser agent -* DB mappers: abort insert/update/erase from hooks, #684 -* DB mappers: Allow array inputs in copyfrom() -* Cache,SQL,Jig,Mongo Session: custom callback for suspect sessions -* Fix for unexpected HIVE values when defining an empty HIVE array -* SQL mapper: check for results from CALL and EXEC queries, #771 -* SQL mapper: consider SQL schema prefix, #820 -* SQL mapper: write to log before execution to - enable tracking of PDOStatement error -* Add SQL Mapper->table() to return table name -* Allow override of the schema in SQL Mapper->schema() -* Improvement: Keep JIG table as reference, #758 -* Expand regex to include whitespaces in SQL DB dsn, #817 -* View: Removed reserved variables $fw and $implicit -* Add missing newlines after template expansion -* Web->receive: fix for complex field names, #806 -* Web: Improvements in socket engine -* Web: customizable user_agent for all engines, #822 -* SMTP: Provision for Content-ID in attachments -* Image + minify: allow absolute paths -* Promote framework error to E_USER_ERROR -* Geo->weather switch to OpenWeather -* Expose mask() and grab() methods for routing -* Expose trace() method to expose the debug backtrace -* Implement recursion strategy using IteratorAggregate, #714 -* Exempt whitespace between % and succeeding operator from being minified, #773 -* Optimized error detection and ONERROR handler, fatfree-core#18 -* Tweak error log output -* Optimized If-Modified-Since cache header usage -* Improved APCu compatibility, #724 -* Bug fix: Web::send fails on filename with spaces, #810 -* Bug fix: overwrite limit in findone() -* Bug fix: locale-specific edge cases affecting SQL schema, #772 -* Bug fix: Newline stripping in config() -* Bug fix: bracket delimited identifier for sybase and dblib driver -* Bug fix: Mongo mapper collection->count driver compatibility -* Bug fix: SQL Mapper->set() forces adhoc value if already defined -* Bug fix: Mapper ignores HAVING clause -* Bug fix: Constructor invocation in call() -* Bug fix: Wrong element returned by ajax/sync request -* Bug fix: handling of non-consecutive compound key members -* Bug fix: Virtual fields not retrieved when group option is present, #757 -* Bug fix: group option generates incorrect SQL query, #757 -* Bug fix: ONERROR does not receive PARAMS on fatal error - -3.4.0 (1 January 2015) -* NEW: [redirects] section -* NEW: Custom config sections -* NEW: User-defined AUTOLOAD function -* NEW: ONREROUTE variable -* NEW: Provision for in-memory Jig database (#727) -* Return run() result (#687) -* Pass result of run() to mock() (#687) -* Add port suffix to REALM variable -* New attribute in tag to extend hive -* Adjust unit tests and clean up templates -* Expose header-related methods -* Web->request: allow content array -* Preserve contents of ROUTES (#723) -* Smart detection of PHP functions in template expressions -* Add afterrender() hook to View class -* Implement ArrayAccess and magic properties on hive -* Improvement on mocking of superglobals and request body -* Fix table creation for pgsql handled sessions -* Add QUERY to hive -* Exempt E_NOTICE from default error_reporting() -* Add method to build alias routes from template, fixes #693 -* Fix dangerous caching of cookie values -* Fix multiple encoding in nested templates -* Fix node attribute parsing for empty/zero values -* Apply URL encoding on BASE to emulate v2 behavior (#123) -* Improve Base->map performance (#595) -* Add simple backtrace for fatal errors -* Count Cursor->load() results (#581) -* Add form field name to Web->receive() callback arguments -* Fix missing newlines after template expansion -* Fix overwrite of ENCODING variable -* limit & offset workaround for SQL Server, fixes #671 -* SQL Mapper->find: GROUP BY SQL compliant statement -* Bug fix: Missing abstract method fields() -* Bug fix: Auto escaping does not work with mapper objects (#710) -* Bug fix: 'with' attribute in tag raise error when no token - inside -* View rendering: optional Content-Type header -* Bug fix: Undefined variable: cache (#705) -* Bug fix: Routing does not work if project base path includes valid - special URI character (#704) -* Bug fix: Template hash collision (#702) -* Bug fix: Property visibility is incorrect (#697) -* Bug fix: Missing Allow header on HTTP 405 response -* Bug fix: Double quotes in lexicon files (#681) -* Bug fix: Space should not be mandatory in ICU pluralization format string -* Bug fix: Incorrect log entry when SQL query contains a question mark -* Bug fix: Error stack trace -* Bug fix: Cookie expiration (#665) -* Bug fix: OR operator (||) parsed incorrectly -* Bug fix: Routing treatment of * wildcard character -* Bug fix: Mapper copyfrom() method doesn't allow class/object callbacks - (#590) -* Bug fix: exists() creates elements/properties (#591) -* Bug fix: Wildcard in routing pattern consumes entire query string (#592) -* Bug fix: Workaround bug in latest MongoDB driver -* Bug fix: Default error handler silently fails for AJAX request with - DEBUG>0 (#599) -* Bug fix: Mocked BODY overwritten (#601) -* Bug fix: Undefined pkey (#607) - -3.3.0 (8 August 2014) -* NEW: Attribute in tag to extend hive -* NEW: Image overlay with transparency and alignment control -* NEW: Allow redirection of specified route patterns to a URL -* Bug fix: Missing AND operator in SQL Server schema query (Issue #576) -* Count Cursor->load() results (Feature request #581) -* Mapper copyfrom() method doesn't allow class/object callbacks (Issue #590) -* Bug fix: exists() creates elements/properties (Issue #591) -* Bug fix: Wildcard in routing pattern consumes entire query string - (Issue #592) -* Tweak Base->map performance (Issue #595) -* Bug fix: Default error handler silently fails for AJAX request with - DEBUG>0 (Issue #599) -* Bug fix: Mocked BODY overwritten (Issue #601) -* Bug fix: Undefined pkey (Issue #607) -* Bug fix: beforeupdate() position (Issue #633) -* Bug fix: exists() return value for cached keys -* Bug fix: Missing error code in UNLOAD handler -* Bug fix: OR operator (||) parsed incorrectly -* Add input name parameter to custom slug function -* Apply URL encoding on BASE to emulate v2 behavior (Issue #123) -* Reduce mapper update() iterations -* Bug fix: Routing treatment of * wildcard character -* SQL Mapper->find: GROUP BY SQL compliant statement -* Work around bug in latest MongoDB driver -* Work around probable race condition and optimize cache access -* View rendering: Optional Content-Type header -* Fix missing newlines after template expansion -* Add form field name to Web->receive() callback arguments -* Quick reference: add RAW variable - -3.2.2 (19 March 2014) -* NEW: Locales set automatically (Feature request #522) -* NEW: Mapper dbtype() -* NEW: before- and after- triggers for all mappers -* NEW: Decode HTML5 entities if PHP>5.3 detected (Feature request #552) -* NEW: Send credentials only if AUTH is present in the SMTP extension - response (Feature request #545) -* NEW: BITMASK variable to allow ENT_COMPAT override -* NEW: Redis support for caching -* Enable SMTP feature detection -* Enable extended ICU custom date format (Feature request #555) -* Enable custom time ICU format -* Add option to turn off session table creation (Feature request #557) -* Enhanced template token rendering and custom filters (Feature request - #550) -* Avert multiple loads in DB-managed sessions (Feature request #558) -* Add EXEC to associative fetch -* Bug fix: Building template tokens breaks on inline OR condition (Issue - #573) -* Bug fix: SMTP->send does not use the $log parameter (Issue #571) -* Bug fix: Allow setting sqlsrv primary keys on insert (Issue #570) -* Bug fix: Generated query for obtaining table schema in sqlsrv incorrect - (Bug #565) -* Bug fix: SQL mapper flag set even when value has not changed (Bug #562) -* Bug fix: Add XFRAME config option (Feature request #546) -* Bug fix: Incorrect parsing of comments (Issue #541) -* Bug fix: Multiple Set-Cookie headers (Issue #533) -* Bug fix: Mapper is dry after save() -* Bug fix: Prevent infinite loop when error handler is triggered - (Issue #361) -* Bug fix: Mapper tweaks not passing primary keys as arguments -* Bug fix: Zero indexes in dot-notated arrays fail to compile -* Bug fix: Prevent GROUP clause double-escaping -* Bug fix: Regression of zlib compression bug -* Bug fix: Method copyto() does not include ad hoc fields -* Check existence of OpenID mode (Issue #529) -* Generate a 404 when a tokenized class doesn't exist -* Fix SQLite quotes (Issue #521) -* Bug fix: BASE is incorrect on Windows - -3.2.1 (7 January 2014) -* NEW: EMOJI variable, UTF->translate(), UTF->emojify(), and UTF->strrev() -* Allow empty strings in config() -* Add support for turning off php://input buffering via RAW - (FALSE by default) -* Add Cursor->load() and Cursor->find() TTL support -* Support Web->receive() large file downloads via PUT -* ONERROR safety check -* Fix session CSRF cookie detection -* Framework object now passed to route handler contructors -* Allow override of DIACRITICS -* Various code optimizations -* Support log disabling (Issue #483) -* Implicit mapper load() on authentication -* Declare abstract methods for Cursor derivatives -* Support single-quoted HTML/XML attributes (Feature request #503) -* Relax property visibility of mappers and derivatives -* Deprecated: {{~ ~}} instructions and {{* *}} comments; Use {~ ~} and - {* *} instead -* Minor fix: Audit->ipv4() return value -* Bug fix: Backslashes in BASE not converted on Windows -* Bug fix: UTF->substr() with negative offset and specified length -* Bug fix: Replace named URL tokens on render() -* Bug fix: BASE is not empty when run from document root -* Bug fix: stringify() recursion - -3.2.0 (18 December 2013) -* NEW: Automatic CSRF protection (with IP and User-Agent checks) for - sessions mapped to SQL-, Jig-, Mongo- and Cache-based backends -* NEW: Named routes -* NEW: PATH variable; returns the URL relative to BASE -* NEW: Image->captcha() color parameters -* NEW: Ability to access MongoCuror thru the cursor() method -* NEW: Mapper->fields() method returns array of field names -* NEW: Mapper onload(), oninsert(), onupdate(), and onerase() event - listeners/triggers -* NEW: Preview class (a lightweight template engine) -* NEW: rel() method derives path from URL relative to BASE; useful for - rerouting -* NEW: PREFIX variable for prepending a string to a dictionary term; - Enable support for prefixed dictionary arrays and .ini files (Feature - request #440) -* NEW: Google static map plugin -* NEW: devoid() method -* Introduce clean(); similar to scrub(), except that arg is passed by - value -* Use $ttl for cookie expiration (Issue #457) -* Fix needs_rehash() cost comparison -* Add pass-by-reference argument to exists() so if method returns TRUE, - a subsequent get() is unnecessary -* Improve MySQL support -* Move esc(), raw(), and dupe() to View class where they more - appropriately belong -* Allow user-defined fields in SQL mapper constructor (Feature request - #450) -* Re-implement the pre-3.0 template resolve() feature -* Remove redundant instances of session_commit() -* Add support for input filtering in Mapper->copyfrom() -* Prevent intrusive behavior of Mapper->copyfrom() -* Support multiple SQL primary keys -* Support custom tag attributes/inline tokens defined at runtime - (Feature request #438) -* Broader support for HTTP basic auth -* Prohibit Jig _id clear() -* Add support for detailed stringify() output -* Add base directory to UI path as fallback -* Support Test->expect() chaining -* Support __tostring() in stringify() -* Trigger error on invalid CAPTCHA length (Issue #458) -* Bug fix: exists() pass-by-reference argument returns incorrect value -* Bug fix: DB Exec does not return affected row if query contains a - sub-SELECT (Issue #437) -* Improve seed generator and add code for detecting of acceptable - limits in Image->captcha() (Feature request #460) -* Add decimal format ICU extension -* Bug fix: 404-reported URI contains HTTP query -* Bug fix: Data type detection in DB->schema() -* Bug fix: TZ initialization -* Bug fix: paginate() passes incorrect argument to count() -* Bug fix: Incorrect query when reloading after insert() -* Bug fix: SQL preg_match error in pdo_type matching (Issue #447) -* Bug fix: Missing merge() function (Issue #444) -* Bug fix: BASE misdefined in command line mode -* Bug fix: Stringifying hive may run infinite (Issue #436) -* Bug fix: Incomplete stringify() when DEBUG<3 (Issue #432) -* Bug fix: Redirection of basic auth (Issue #430) -* Bug fix: Filter only PHP code (including short tags) in templates -* Bug fix: Markdown paragraph parser does not convert PHP code blocks - properly -* Bug fix: identicon() colors on same keys are randomized -* Bug fix: quotekey() fails on aliased keys -* Bug fix: Missing _id in Jig->find() return value -* Bug fix: LANGUAGE/LOCALES handling -* Bug fix: Loose comparison in stringify() - -3.1.2 (5 November 2013) -* Abandon .chm help format; Package API documentation in plain HTML; - (Launch lib/api/index.html in your browser) -* Deprecate BAIL in favor of HALT (default: TRUE) -* Revert to 3.1.0 autoload behavior; Add support for lowercase folder - names -* Allow Spring-style HTTP method overrides -* Add support for SQL Server-based sessions -* Capture full X-Forwarded-For header -* Add protection against malicious scripts; Extra check if file was really - uploaded -* Pass-thru page limit in return value of Cursor->paginate() -* Optimize code: Implement single-pass escaping -* Short circuit Jig->find() if source file is empty -* Bug fix: PHP globals passed by reference in hive() result (Issue #424) -* Bug fix: ZIP mime type incorrect behavior -* Bug fix: Jig->erase() filter malfunction -* Bug fix: Mongo->select() group -* Bug fix: Unknown bcrypt constant - -3.1.1 (13 October 2013) -* NEW: Support OpenID attribute exchange -* NEW: BAIL variable enables/disables continuance of execution on non-fatal - errors -* Deprecate BAIL in favor of HALT (default: FALSE) -* Add support for Oracle -* Mark cached queries in log (Feature Request #405) -* Implement Bcrypt->needs_reshash() -* Add entropy to SQL cache hash; Add uuid() method to DB backends -* Find real document root; Simplify debug paths -* Permit OpenID required fields to be declared as comma-separated string or - array -* Pass modified filename as argument to user-defined function in - Web->receive() -* Quote keys in optional SQL clauses (Issue #408) -* Allow UNLOAD to override fatal error detection (Issue #404) -* Mutex operator precedence error (Issue #406) -* Bug fix: exists() malfunction (Issue #401) -* Bug fix: Jig mapper triggers error when loading from CACHE (Issue #403) -* Bug fix: Array index check -* Bug fix: OpenID verified() return value -* Bug fix: Basket->find() should return a set of results (Issue #407); - Also implemented findone() for consistency with mappers -* Bug fix: PostgreSQL last insert ID (Issue #410) -* Bug fix: $port component URL overwritten by _socket() -* Bug fix: Calculation of elapsed time - -3.1.0 (20 August 2013) -* NEW: Web->filler() returns a chunk of text from the standard - Lorem Ipsum passage -* Change in behavior: Drop support for JSON serialization -* SQL->exec() now returns value of RETURNING clause -* Add support for $ttl argument in count() (Issue #393) -* Allow UI to be overridden by custom $path -* Return result of PDO primitives: begintransaction(), rollback(), and - commit() -* Full support for PHP 5.5 -* Flush buffers only when DEBUG=0 -* Support class->method, class::method, and lambda functions as - Web->basic() arguments -* Commit session on Basket->save() -* Optional enlargement in Image->resize() -* Support authentication on hosts running PHP-CGI -* Change visibility level of Cache properties -* Prevent ONERROR recursion -* Work around Apache pre-2.4 VirtualDocumentRoot bug -* Prioritize cURL in HTTP engine detection -* Bug fix: Minify tricky JS -* Bug fix: desktop() detection -* Bug fix: Double-slash on TEMP-relative path -* Bug fix: Cursor mapping of first() and last() records -* Bug fix: Premature end of Web->receive() on multiple files -* Bug fix: German umlaute to its corresponding grammatically-correct - equivalent - -3.0.9 (12 June 2013) -* NEW: Web->whois() -* NEW: Template tags -* Improve CACHE consistency -* Case-insensitive MIME type detection -* Support pre-PHP 5.3.4 in Prefab->instance() -* Refactor isdesktop() and ismobile(); Add isbot() -* Add support for Markdown strike-through -* Work around ODBC's lack of quote() support -* Remove useless Prefab destructor -* Support multiple cache instances -* Bug fix: Underscores in OpenId keys mangled -* Refactor format() -* Numerous tweaks -* Bug fix: MongoId object not preserved -* Bug fix: Double-quotes included in lexicon() string (Issue #341) -* Bug fix: UTF-8 formatting mangled on Windows (Issue #342) -* Bug fix: Cache->load() error when CACHE is FALSE (Issue #344) -* Bug fix: send() ternary expression -* Bug fix: Country code constants - -3.0.8 (17 May 2013) -* NEW: Bcrypt lightweight hashing library\ -* Return total number of records in superset in Cursor->paginate() -* ONERROR short-circuit (Enhancement #334) -* Apply quotes/backticks on DB identifiers -* Allow enabling/disabling of SQL log -* Normalize glob() behavior (Issue #330) -* Bug fix: mbstring 2-byte text truncation (Issue #325) -* Bug fix: Unsupported operand types (Issue #324) - -3.0.7 (2 May 2013) -* NEW: route() now allows an array of routing patterns as first argument; - support array as first argument of map() -* NEW: entropy() for calculating password strength (NIST 800-63) -* NEW: AGENT variable containing auto-detected HTTP user agent string -* NEW: ismobile() and isdesktop() methods -* NEW: Prefab class and descendants now accept constructor arguments -* Change in behavior: Cache->exists() now returns timestamp and TTL of - cache entry or FALSE if not found (Feature request #315) -* Preserve timestamp and TTL when updating cache entry (Feature request - #316) -* Improved currency formatting with C99 compliance -* Suppress unnecessary program halt at startup caused by misconfigured - server -* Add support for dashes in custom attribute names in templates -* Bug fix: Routing precedene (Issue #313) -* Bug fix: Remove Jig _id element from document property -* Bug fix: Web->rss() error when not enough items in the feed (Issue #299) -* Bug fix: Web engine fallback (Issue #300) -* Bug fix: and formatting -* Bug fix: Text rendering of text with trailing punctuation (Issue #303) -* Bug fix: Incorrect regex in SMTP - -3.0.6 (31 Mar 2013) -* NEW: Image->crop() -* Modify documentation blocks for PHPDoc interoperability -* Allow user to control whether Base->rerouet() uses a permanent or - temporary redirect -* Allow JAR elements to be set individually -* Refactor DB\SQL\Mapper->insert() to cope with autoincrement fields -* Trigger error when captcha() font is missing -* Remove unnecessary markdown regex recursion -* Check for scalars instead of DB\SQL strings -* Implement more comprehensive diacritics table -* Add option for disabling 401 errors when basic auth() fails -* Add markdown syntax highlighting for Apache configuration -* Markdown->render() deprecated to remove dependency on UI variable; - Feature replaced by Markdown->convert() to enable translation from - markdown string to HTML -* Optimize factory() code of all data mappers -* Apply backticks on MySQL table names -* Bug fix: Routing failure when directory path contains a tilde (Issue #291) -* Bug fix: Incorrect markdown parsing of strong/em sequences and inline HTML -* Bug fix: Cached page not echoed (Issue #278) -* Bug fix: Object properties not escaped when rendering -* Bug fix: OpenID error response ignored -* Bug fix: memcache_get_extended_stats() timeout -* Bug fix: Base->set() doesn't pass TTL to Cache->set() -* Bug fix: Base->scrub() ignores pass-thru * argument (Issue #274) - -3.0.5 (16 Feb 2013) -* NEW: Markdown class with PHP, HTML, and .ini syntax highlighting support -* NEW: Options for caching of select() and find() results -* NEW: Web->acceptable() -* Add send() argument for forcing downloads -* Provide read() option for applying Unix LF as standard line ending -* Bypass lexicon() call if LANGUAGE is undefined -* Load fallback language dictionary if LANGUAGE is undefined -* map() now checks existence of class/methods for non-tokenized URLs -* Improve error reporting of non-existent Template methods -* Address output buffer issues on some servers -* Bug fix: Setting DEBUG to 0 won't suppress the stack trace when the - content type is application/json (Issue #257) -* Bug fix: Image dump/render additional arguments shifted -* Bug fix: ob_clean() causes buffer issues with zlib compression -* Bug fix: minify() fails when commenting CSS @ rules (Issue #251) -* Bug fix: Handling of commas inside quoted strings -* Bug fix: Glitch in stringify() handling of closures -* Bug fix: dry() in mappers returns TRUE despite being hydrated by - factory() (Issue #265) -* Bug fix: expect() not handling flags correctly -* Bug fix: weather() fails when server is unreachable - -3.0.4 (29 Jan 2013) -* NEW: Support for ICU/CLDR pluralization -* NEW: User-defined FALLBACK language -* NEW: minify() now recognizes CSS @import directives -* NEW: UTF->bom() returns byte order mark for UTF-8 encoding -* Expose SQL\Mapper->schema() -* Change in behavior: Send error response as JSON string if AJAX request is - detected -* Deprecated: afind*() methods -* Discard output buffer in favor of debug output -* Make _id available to Jig queries -* Magic class now implements ArrayAccess -* Abort execution on startup errors -* Suppress stack trace on DEBUG level 0 -* Allow single = as equality operator in Jig query expressions -* Abort OpenID discovery if Web->request() fails -* Mimic PHP *RECURSION* in stringify() -* Modify Jig parser to allow wildcard-search using preg_match() -* Abort execution after error() execution -* Concatenate cached/uncached minify() iterations; Prevent spillover - caching of previous minify() result -* Work around obscure PHP session id regeneration bug -* Revise algorithm for Jig filter involving undefined fields (Issue #230) -* Use checkdnsrr() instead of gethostbyname() in DNSBL check -* Auto-adjust pagination to cursor boundaries -* Add Romanian diacritics -* Bug fix: Root namespace reference and sorting with undefined Jig fields -* Bug fix: Greedy receive() regex -* Bug fix: Default LANGUAGE always 'en' -* Bug fix: minify() hammers cache backend -* Bug fix: Previous values of primary keys not saved during factory() - instantiation -* Bug fix: Jig find() fails when search key is not present in all records -* Bug fix: Jig SORT_DESC (Issue #233) -* Bug fix: Error reporting (Issue #225) -* Bug fix: language() return value - -3.0.3 (29 Dec 2013) -* NEW: [ajax] and [sync] routing pattern modifiers -* NEW: Basket class (session-based pseudo-mapper, shopping cart, etc.) -* NEW: Test->message() method -* NEW: DB profiling via DB->log() -* NEW: Matrix->calendar() -* NEW: Audit->card() and Audit->mod10() for credit card verification -* NEW: Geo->weather() -* NEW: Base->relay() accepts comma-separated callbacks; but unlike - Base->chain(), result of previous callback becomes argument of the next -* Numerous performance tweaks -* Interoperability with new MongoClient class -* Web->request() now recognizes gzip and deflate encoding -* Differences in behavior of Web->request() engines rectified -* mutex() now uses an ID as argument (instead of filename to make it clear - that specified file is not the target being locked, but a primitive - cross-platform semaphore) -* DB\SQL\Mapper field _id now returned even in the absence of any - auto-increment field -* Magic class spinned off as a separate file -* ISO 3166-1 alpha-2 table updated -* Apache redirect emulation for PHP 5.4 CLI server mode -* Framework instance now passed as argument to any user-defined shutdown - function -* Cache engine now used as storage for Web->minify() output -* Flag added for enabling/disabling Image class filter history -* Bug fix: Trailing routing token consumes HTTP query -* Bug fix: LANGUAGE spills over to LOCALES setting -* Bug fix: Inconsistent dry() return value -* Bug fix: URL-decoding - -3.0.2 (23 Dec 2013) -* NEW: Syntax-highlighted stack traces via Base->highlight(); boolean - HIGHLIGHT global variable can be used to enable/disable this feature -* NEW: Template engine tag -* NEW: Image->captcha() -* NEW: DNSBL-based spammer detection (ported from 2.x) -* NEW: paginate(), first(), and last() methods for data mappers -* NEW: X-HTTP-Method-Override header now recognized -* NEW: Base->chain() method for executing callbacks in succession -* NEW: HOST global variable; derived from either $_SERVER['SERVER_NAME'] or - gethostname() -* NEW: REALM global variable representing full canonical URI -* NEW: Auth plug-in -* NEW: Pingback plug-in (implements both Pingback 1.0 protocol client and - server) -* NEW: DEBUG verbosity can now reach up to level 3; Base->stringify() drills - down to object properties at this setting -* NEW: HTTP PATCH method added to recognized HTTP ReST methods -* Web->slug() now trims trailing dashes -* Web->request() now allows relative local URLs as argument -* Use of PARAMS in route handlers now unnecessary; framework now passes two - arguments to route handlers: the framework object instance and an array - containing the captured values of tokens in route patterns -* Standardized timeout settings among Web->request() backends -* Session IDs regenerated for additional security -* Automatic HTTP 404 responses by Base->call() now restricted to route - handlers -* Empty comments in ini-style files now parsed properly -* Use file_get_contents() in methods that don't involve high concurrency - -3.0.1 (14 Dec 2013) -* Major rewrite of much of the framework's core features diff --git a/app/lib/COPYING b/app/lib/COPYING deleted file mode 100644 index 3c7236c8..00000000 --- a/app/lib/COPYING +++ /dev/null @@ -1,621 +0,0 @@ -GNU GENERAL PUBLIC LICENSE -Version 3, 29 June 2007 - -Copyright (C) 2007 Free Software Foundation, Inc. -Everyone is permitted to copy and distribute verbatim copies -of this license document, but changing it is not allowed. - -Preamble - -The GNU General Public License is a free, copyleft license for -software and other kinds of works. - -The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - -When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - -To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - -For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - -Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - -For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - -Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - -Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - -The precise terms and conditions for copying, distribution and -modification follow. - -TERMS AND CONDITIONS - -0. Definitions. - -"This License" refers to version 3 of the GNU General Public License. - -"Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - -"The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - -To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - -A "covered work" means either the unmodified Program or a work based -on the Program. - -To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - -To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - -An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - -1. Source Code. - -The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - -A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - -The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - -The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - -The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - -The Corresponding Source for a work in source code form is that -same work. - -2. Basic Permissions. - -All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - -You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - -Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - -3. Protecting Users' Legal Rights From Anti-Circumvention Law. - -No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - -When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - -4. Conveying Verbatim Copies. - -You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - -You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - -5. Conveying Modified Source Versions. - -You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - -a) The work must carry prominent notices stating that you modified -it, and giving a relevant date. - -b) The work must carry prominent notices stating that it is -released under this License and any conditions added under section -7. This requirement modifies the requirement in section 4 to -"keep intact all notices". - -c) You must license the entire work, as a whole, under this -License to anyone who comes into possession of a copy. This -License will therefore apply, along with any applicable section 7 -additional terms, to the whole of the work, and all its parts, -regardless of how they are packaged. This License gives no -permission to license the work in any other way, but it does not -invalidate such permission if you have separately received it. - -d) If the work has interactive user interfaces, each must display -Appropriate Legal Notices; however, if the Program has interactive -interfaces that do not display Appropriate Legal Notices, your -work need not make them do so. - -A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - -6. Conveying Non-Source Forms. - -You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - -a) Convey the object code in, or embodied in, a physical product -(including a physical distribution medium), accompanied by the -Corresponding Source fixed on a durable physical medium -customarily used for software interchange. - -b) Convey the object code in, or embodied in, a physical product -(including a physical distribution medium), accompanied by a -written offer, valid for at least three years and valid for as -long as you offer spare parts or customer support for that product -model, to give anyone who possesses the object code either (1) a -copy of the Corresponding Source for all the software in the -product that is covered by this License, on a durable physical -medium customarily used for software interchange, for a price no -more than your reasonable cost of physically performing this -conveying of source, or (2) access to copy the -Corresponding Source from a network server at no charge. - -c) Convey individual copies of the object code with a copy of the -written offer to provide the Corresponding Source. This -alternative is allowed only occasionally and noncommercially, and -only if you received the object code with such an offer, in accord -with subsection 6b. - -d) Convey the object code by offering access from a designated -place (gratis or for a charge), and offer equivalent access to the -Corresponding Source in the same way through the same place at no -further charge. You need not require recipients to copy the -Corresponding Source along with the object code. If the place to -copy the object code is a network server, the Corresponding Source -may be on a different server (operated by you or a third party) -that supports equivalent copying facilities, provided you maintain -clear directions next to the object code saying where to find the -Corresponding Source. Regardless of what server hosts the -Corresponding Source, you remain obligated to ensure that it is -available for as long as needed to satisfy these requirements. - -e) Convey the object code using peer-to-peer transmission, provided -you inform other peers where the object code and Corresponding -Source of the work are being offered to the general public at no -charge under subsection 6d. - -A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - -A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - -"Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - -If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - -The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - -Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - -7. Additional Terms. - -"Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - -When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - -Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - -a) Disclaiming warranty or limiting liability differently from the -terms of sections 15 and 16 of this License; or - -b) Requiring preservation of specified reasonable legal notices or -author attributions in that material or in the Appropriate Legal -Notices displayed by works containing it; or - -c) Prohibiting misrepresentation of the origin of that material, or -requiring that modified versions of such material be marked in -reasonable ways as different from the original version; or - -d) Limiting the use for publicity purposes of names of licensors or -authors of the material; or - -e) Declining to grant rights under trademark law for use of some -trade names, trademarks, or service marks; or - -f) Requiring indemnification of licensors and authors of that -material by anyone who conveys the material (or modified versions of -it) with contractual assumptions of liability to the recipient, for -any liability that these contractual assumptions directly impose on -those licensors and authors. - -All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - -If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - -Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - -8. Termination. - -You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - -However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - -Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - -Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - -9. Acceptance Not Required for Having Copies. - -You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - -10. Automatic Licensing of Downstream Recipients. - -Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - -An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - -You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - -11. Patents. - -A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - -A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - -Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - -In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - -If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - -If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - -A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - -Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - -12. No Surrender of Others' Freedom. - -If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - -13. Use with the GNU Affero General Public License. - -Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - -14. Revised Versions of this License. - -The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - -If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - -Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - -15. Disclaimer of Warranty. - -THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -16. Limitation of Liability. - -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - -17. Interpretation of Sections 15 and 16. - -If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - -END OF TERMS AND CONDITIONS diff --git a/app/lib/LICENSE b/app/lib/LICENSE deleted file mode 100644 index 3c7236c8..00000000 --- a/app/lib/LICENSE +++ /dev/null @@ -1,621 +0,0 @@ -GNU GENERAL PUBLIC LICENSE -Version 3, 29 June 2007 - -Copyright (C) 2007 Free Software Foundation, Inc. -Everyone is permitted to copy and distribute verbatim copies -of this license document, but changing it is not allowed. - -Preamble - -The GNU General Public License is a free, copyleft license for -software and other kinds of works. - -The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - -When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - -To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - -For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - -Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - -For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - -Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - -Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - -The precise terms and conditions for copying, distribution and -modification follow. - -TERMS AND CONDITIONS - -0. Definitions. - -"This License" refers to version 3 of the GNU General Public License. - -"Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - -"The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - -To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - -A "covered work" means either the unmodified Program or a work based -on the Program. - -To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - -To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - -An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - -1. Source Code. - -The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - -A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - -The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - -The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - -The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - -The Corresponding Source for a work in source code form is that -same work. - -2. Basic Permissions. - -All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - -You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - -Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - -3. Protecting Users' Legal Rights From Anti-Circumvention Law. - -No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - -When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - -4. Conveying Verbatim Copies. - -You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - -You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - -5. Conveying Modified Source Versions. - -You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - -a) The work must carry prominent notices stating that you modified -it, and giving a relevant date. - -b) The work must carry prominent notices stating that it is -released under this License and any conditions added under section -7. This requirement modifies the requirement in section 4 to -"keep intact all notices". - -c) You must license the entire work, as a whole, under this -License to anyone who comes into possession of a copy. This -License will therefore apply, along with any applicable section 7 -additional terms, to the whole of the work, and all its parts, -regardless of how they are packaged. This License gives no -permission to license the work in any other way, but it does not -invalidate such permission if you have separately received it. - -d) If the work has interactive user interfaces, each must display -Appropriate Legal Notices; however, if the Program has interactive -interfaces that do not display Appropriate Legal Notices, your -work need not make them do so. - -A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - -6. Conveying Non-Source Forms. - -You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - -a) Convey the object code in, or embodied in, a physical product -(including a physical distribution medium), accompanied by the -Corresponding Source fixed on a durable physical medium -customarily used for software interchange. - -b) Convey the object code in, or embodied in, a physical product -(including a physical distribution medium), accompanied by a -written offer, valid for at least three years and valid for as -long as you offer spare parts or customer support for that product -model, to give anyone who possesses the object code either (1) a -copy of the Corresponding Source for all the software in the -product that is covered by this License, on a durable physical -medium customarily used for software interchange, for a price no -more than your reasonable cost of physically performing this -conveying of source, or (2) access to copy the -Corresponding Source from a network server at no charge. - -c) Convey individual copies of the object code with a copy of the -written offer to provide the Corresponding Source. This -alternative is allowed only occasionally and noncommercially, and -only if you received the object code with such an offer, in accord -with subsection 6b. - -d) Convey the object code by offering access from a designated -place (gratis or for a charge), and offer equivalent access to the -Corresponding Source in the same way through the same place at no -further charge. You need not require recipients to copy the -Corresponding Source along with the object code. If the place to -copy the object code is a network server, the Corresponding Source -may be on a different server (operated by you or a third party) -that supports equivalent copying facilities, provided you maintain -clear directions next to the object code saying where to find the -Corresponding Source. Regardless of what server hosts the -Corresponding Source, you remain obligated to ensure that it is -available for as long as needed to satisfy these requirements. - -e) Convey the object code using peer-to-peer transmission, provided -you inform other peers where the object code and Corresponding -Source of the work are being offered to the general public at no -charge under subsection 6d. - -A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - -A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - -"Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - -If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - -The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - -Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - -7. Additional Terms. - -"Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - -When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - -Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - -a) Disclaiming warranty or limiting liability differently from the -terms of sections 15 and 16 of this License; or - -b) Requiring preservation of specified reasonable legal notices or -author attributions in that material or in the Appropriate Legal -Notices displayed by works containing it; or - -c) Prohibiting misrepresentation of the origin of that material, or -requiring that modified versions of such material be marked in -reasonable ways as different from the original version; or - -d) Limiting the use for publicity purposes of names of licensors or -authors of the material; or - -e) Declining to grant rights under trademark law for use of some -trade names, trademarks, or service marks; or - -f) Requiring indemnification of licensors and authors of that -material by anyone who conveys the material (or modified versions of -it) with contractual assumptions of liability to the recipient, for -any liability that these contractual assumptions directly impose on -those licensors and authors. - -All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - -If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - -Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - -8. Termination. - -You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - -However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - -Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - -Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - -9. Acceptance Not Required for Having Copies. - -You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - -10. Automatic Licensing of Downstream Recipients. - -Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - -An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - -You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - -11. Patents. - -A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - -A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - -Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - -In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - -If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - -If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - -A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - -Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - -12. No Surrender of Others' Freedom. - -If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - -13. Use with the GNU Affero General Public License. - -Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - -14. Revised Versions of this License. - -The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - -If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - -Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - -15. Disclaimer of Warranty. - -THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -16. Limitation of Liability. - -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - -17. Interpretation of Sections 15 and 16. - -If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - -END OF TERMS AND CONDITIONS diff --git a/app/lib/audit.php b/app/lib/audit.php deleted file mode 100644 index 0e69b56a..00000000 --- a/app/lib/audit.php +++ /dev/null @@ -1,191 +0,0 @@ -. - -*/ - -//! Data validator -class Audit extends Prefab { - - //@{ User agents - const - UA_Mobile='android|blackberry|phone|ipod|palm|windows\s+ce', - UA_Desktop='bsd|linux|os\s+[x9]|solaris|windows', - UA_Bot='bot|crawl|slurp|spider'; - //@} - - /** - * Return TRUE if string is a valid URL - * @return bool - * @param $str string - **/ - function url($str) { - return is_string(filter_var($str,FILTER_VALIDATE_URL)); - } - - /** - * Return TRUE if string is a valid e-mail address; - * Check DNS MX records if specified - * @return bool - * @param $str string - * @param $mx boolean - **/ - function email($str,$mx=TRUE) { - $hosts=[]; - return is_string(filter_var($str,FILTER_VALIDATE_EMAIL)) && - (!$mx || getmxrr(substr($str,strrpos($str,'@')+1),$hosts)); - } - - /** - * Return TRUE if string is a valid IPV4 address - * @return bool - * @param $addr string - **/ - function ipv4($addr) { - return (bool)filter_var($addr,FILTER_VALIDATE_IP,FILTER_FLAG_IPV4); - } - - /** - * Return TRUE if string is a valid IPV6 address - * @return bool - * @param $addr string - **/ - function ipv6($addr) { - return (bool)filter_var($addr,FILTER_VALIDATE_IP,FILTER_FLAG_IPV6); - } - - /** - * Return TRUE if IP address is within private range - * @return bool - * @param $addr string - **/ - function isprivate($addr) { - return !(bool)filter_var($addr,FILTER_VALIDATE_IP, - FILTER_FLAG_IPV4|FILTER_FLAG_IPV6|FILTER_FLAG_NO_PRIV_RANGE); - } - - /** - * Return TRUE if IP address is within reserved range - * @return bool - * @param $addr string - **/ - function isreserved($addr) { - return !(bool)filter_var($addr,FILTER_VALIDATE_IP, - FILTER_FLAG_IPV4|FILTER_FLAG_IPV6|FILTER_FLAG_NO_RES_RANGE); - } - - /** - * Return TRUE if IP address is neither private nor reserved - * @return bool - * @param $addr string - **/ - function ispublic($addr) { - return (bool)filter_var($addr,FILTER_VALIDATE_IP, - FILTER_FLAG_IPV4|FILTER_FLAG_IPV6| - FILTER_FLAG_NO_PRIV_RANGE|FILTER_FLAG_NO_RES_RANGE); - } - - /** - * Return TRUE if user agent is a desktop browser - * @return bool - * @param $agent string - **/ - function isdesktop($agent=NULL) { - if (!isset($agent)) - $agent=Base::instance()->AGENT; - return (bool)preg_match('/('.self::UA_Desktop.')/i',$agent) && - !$this->ismobile($agent); - } - - /** - * Return TRUE if user agent is a mobile device - * @return bool - * @param $agent string - **/ - function ismobile($agent=NULL) { - if (!isset($agent)) - $agent=Base::instance()->AGENT; - return (bool)preg_match('/('.self::UA_Mobile.')/i',$agent); - } - - /** - * Return TRUE if user agent is a Web bot - * @return bool - * @param $agent string - **/ - function isbot($agent=NULL) { - if (!isset($agent)) - $agent=Base::instance()->AGENT; - return (bool)preg_match('/('.self::UA_Bot.')/i',$agent); - } - - /** - * Return TRUE if specified ID has a valid (Luhn) Mod-10 check digit - * @return bool - * @param $id string - **/ - function mod10($id) { - if (!ctype_digit($id)) - return FALSE; - $id=strrev($id); - $sum=0; - for ($i=0,$l=strlen($id);$i<$l;$i++) - $sum+=$id[$i]+$i%2*(($id[$i]>4)*-4+$id[$i]%5); - return !($sum%10); - } - - /** - * Return credit card type if number is valid - * @return string|FALSE - * @param $id string - **/ - function card($id) { - $id=preg_replace('/[^\d]/','',$id); - if ($this->mod10($id)) { - if (preg_match('/^3[47][0-9]{13}$/',$id)) - return 'American Express'; - if (preg_match('/^3(?:0[0-5]|[68][0-9])[0-9]{11}$/',$id)) - return 'Diners Club'; - if (preg_match('/^6(?:011|5[0-9][0-9])[0-9]{12}$/',$id)) - return 'Discover'; - if (preg_match('/^(?:2131|1800|35\d{3})\d{11}$/',$id)) - return 'JCB'; - if (preg_match('/^5[1-5][0-9]{14}$|'. - '^(222[1-9]|2[3-6]\d{2}|27[0-1]\d|2720)\d{12}$/',$id)) - return 'MasterCard'; - if (preg_match('/^4[0-9]{12}(?:[0-9]{3})?$/',$id)) - return 'Visa'; - } - return FALSE; - } - - /** - * Return entropy estimate of a password (NIST 800-63) - * @return int|float - * @param $str string - **/ - function entropy($str) { - $len=strlen($str); - return 4*min($len,1)+($len>1?(2*(min($len,8)-1)):0)+ - ($len>8?(1.5*(min($len,20)-8)):0)+($len>20?($len-20):0)+ - 6*(bool)(preg_match( - '/[A-Z].*?[0-9[:punct:]]|[0-9[:punct:]].*?[A-Z]/',$str)); - } - -} diff --git a/app/lib/auth.php b/app/lib/auth.php deleted file mode 100644 index d043cf22..00000000 --- a/app/lib/auth.php +++ /dev/null @@ -1,262 +0,0 @@ -. - -*/ - -//! Authorization/authentication plug-in -class Auth { - - //@{ Error messages - const - E_LDAP='LDAP connection failure', - E_SMTP='SMTP connection failure'; - //@} - - protected - //! Auth storage - $storage, - //! Mapper object - $mapper, - //! Storage options - $args, - //! Custom compare function - $func; - - /** - * Jig storage handler - * @return bool - * @param $id string - * @param $pw string - * @param $realm string - **/ - protected function _jig($id,$pw,$realm) { - $success = (bool) - call_user_func_array( - [$this->mapper,'load'], - [ - array_merge( - [ - '@'.$this->args['id'].'==?'. - ($this->func?'':' AND @'.$this->args['pw'].'==?'). - (isset($this->args['realm'])? - (' AND @'.$this->args['realm'].'==?'):''), - $id - ], - ($this->func?[]:[$pw]), - (isset($this->args['realm'])?[$realm]:[]) - ) - ] - ); - if ($success && $this->func) - $success = call_user_func($this->func,$pw,$this->mapper->get($this->args['pw'])); - return $success; - } - - /** - * MongoDB storage handler - * @return bool - * @param $id string - * @param $pw string - * @param $realm string - **/ - protected function _mongo($id,$pw,$realm) { - $success = (bool) - $this->mapper->load( - [$this->args['id']=>$id]+ - ($this->func?[]:[$this->args['pw']=>$pw])+ - (isset($this->args['realm'])? - [$this->args['realm']=>$realm]:[]) - ); - if ($success && $this->func) - $success = call_user_func($this->func,$pw,$this->mapper->get($this->args['pw'])); - return $success; - } - - /** - * SQL storage handler - * @return bool - * @param $id string - * @param $pw string - * @param $realm string - **/ - protected function _sql($id,$pw,$realm) { - $success = (bool) - call_user_func_array( - [$this->mapper,'load'], - [ - array_merge( - [ - $this->args['id'].'=?'. - ($this->func?'':' AND '.$this->args['pw'].'=?'). - (isset($this->args['realm'])? - (' AND '.$this->args['realm'].'=?'):''), - $id - ], - ($this->func?[]:[$pw]), - (isset($this->args['realm'])?[$realm]:[]) - ) - ] - ); - if ($success && $this->func) - $success = call_user_func($this->func,$pw,$this->mapper->get($this->args['pw'])); - return $success; - } - - /** - * LDAP storage handler - * @return bool - * @param $id string - * @param $pw string - **/ - protected function _ldap($id,$pw) { - $port=(int)($this->args['port']?:389); - $filter=$this->args['filter']=$this->args['filter']?:"uid=".$id; - $this->args['attr']=$this->args['attr']?:["uid"]; - array_walk($this->args['attr'], - function($attr)use(&$filter,$id) { - $filter=str_ireplace($attr."=*",$attr."=".$id,$filter);}); - $dc=@ldap_connect($this->args['dc'],$port); - if ($dc && - ldap_set_option($dc,LDAP_OPT_PROTOCOL_VERSION,3) && - ldap_set_option($dc,LDAP_OPT_REFERRALS,0) && - ldap_bind($dc,$this->args['rdn'],$this->args['pw']) && - ($result=ldap_search($dc,$this->args['base_dn'], - $filter,$this->args['attr'])) && - ldap_count_entries($dc,$result) && - ($info=ldap_get_entries($dc,$result)) && - $info['count']==1 && - @ldap_bind($dc,$info[0]['dn'],$pw) && - @ldap_close($dc)) { - return in_array($id,(array_map(function($value){return $value[0];}, - array_intersect_key($info[0], - array_flip($this->args['attr'])))),TRUE); - } - user_error(self::E_LDAP,E_USER_ERROR); - } - - /** - * SMTP storage handler - * @return bool - * @param $id string - * @param $pw string - **/ - protected function _smtp($id,$pw) { - $socket=@fsockopen( - (strtolower($this->args['scheme'])=='ssl'? - 'ssl://':'').$this->args['host'], - $this->args['port']); - $dialog=function($cmd=NULL) use($socket) { - if (!is_null($cmd)) - fputs($socket,$cmd."\r\n"); - $reply=''; - while (!feof($socket) && - ($info=stream_get_meta_data($socket)) && - !$info['timed_out'] && $str=fgets($socket,4096)) { - $reply.=$str; - if (preg_match('/(?:^|\n)\d{3} .+\r\n/s', - $reply)) - break; - } - return $reply; - }; - if ($socket) { - stream_set_blocking($socket,TRUE); - $dialog(); - $fw=Base::instance(); - $dialog('EHLO '.$fw->HOST); - if (strtolower($this->args['scheme'])=='tls') { - $dialog('STARTTLS'); - stream_socket_enable_crypto( - $socket,TRUE,STREAM_CRYPTO_METHOD_TLS_CLIENT); - $dialog('EHLO '.$fw->HOST); - } - // Authenticate - $dialog('AUTH LOGIN'); - $dialog(base64_encode($id)); - $reply=$dialog(base64_encode($pw)); - $dialog('QUIT'); - fclose($socket); - return (bool)preg_match('/^235 /',$reply); - } - user_error(self::E_SMTP,E_USER_ERROR); - } - - /** - * Login auth mechanism - * @return bool - * @param $id string - * @param $pw string - * @param $realm string - **/ - function login($id,$pw,$realm=NULL) { - return $this->{'_'.$this->storage}($id,$pw,$realm); - } - - /** - * HTTP basic auth mechanism - * @return bool - * @param $func callback - **/ - function basic($func=NULL) { - $fw=Base::instance(); - $realm=$fw->REALM; - $hdr=NULL; - if (isset($_SERVER['HTTP_AUTHORIZATION'])) - $hdr=$_SERVER['HTTP_AUTHORIZATION']; - elseif (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) - $hdr=$_SERVER['REDIRECT_HTTP_AUTHORIZATION']; - if (!empty($hdr)) - list($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW'])= - explode(':',base64_decode(substr($hdr,6))); - if (isset($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']) && - $this->login( - $_SERVER['PHP_AUTH_USER'], - $func? - $fw->call($func,$_SERVER['PHP_AUTH_PW']): - $_SERVER['PHP_AUTH_PW'], - $realm - )) - return TRUE; - if (PHP_SAPI!='cli') - header('WWW-Authenticate: Basic realm="'.$realm.'"'); - $fw->status(401); - return FALSE; - } - - /** - * Instantiate class - * @return object - * @param $storage string|object - * @param $args array - * @param $func callback - **/ - function __construct($storage,array $args=NULL,$func=NULL) { - if (is_object($storage) && is_a($storage,'DB\Cursor')) { - $this->storage=$storage->dbtype(); - $this->mapper=$storage; - unset($ref); - } - else - $this->storage=$storage; - $this->args=$args; - $this->func=$func; - } - -} diff --git a/app/lib/base.php b/app/lib/base.php deleted file mode 100644 index 8990c299..00000000 --- a/app/lib/base.php +++ /dev/null @@ -1,3496 +0,0 @@ -. - -*/ - -//! Factory class for single-instance objects -abstract class Prefab { - - /** - * Return class instance - * @return static - **/ - static function instance() { - if (!Registry::exists($class=get_called_class())) { - $ref=new Reflectionclass($class); - $args=func_get_args(); - Registry::set($class, - $args?$ref->newinstanceargs($args):new $class); - } - return Registry::get($class); - } - -} - -//! Base structure -final class Base extends Prefab implements ArrayAccess { - - //@{ Framework details - const - PACKAGE='Fat-Free Framework', - VERSION='3.6.5-Release'; - //@} - - //@{ HTTP status codes (RFC 2616) - const - HTTP_100='Continue', - HTTP_101='Switching Protocols', - HTTP_103='Early Hints', - HTTP_200='OK', - HTTP_201='Created', - HTTP_202='Accepted', - HTTP_203='Non-Authorative Information', - HTTP_204='No Content', - HTTP_205='Reset Content', - HTTP_206='Partial Content', - HTTP_300='Multiple Choices', - HTTP_301='Moved Permanently', - HTTP_302='Found', - HTTP_303='See Other', - HTTP_304='Not Modified', - HTTP_305='Use Proxy', - HTTP_307='Temporary Redirect', - HTTP_400='Bad Request', - HTTP_401='Unauthorized', - HTTP_402='Payment Required', - HTTP_403='Forbidden', - HTTP_404='Not Found', - HTTP_405='Method Not Allowed', - HTTP_406='Not Acceptable', - HTTP_407='Proxy Authentication Required', - HTTP_408='Request Timeout', - HTTP_409='Conflict', - HTTP_410='Gone', - HTTP_411='Length Required', - HTTP_412='Precondition Failed', - HTTP_413='Request Entity Too Large', - HTTP_414='Request-URI Too Long', - HTTP_415='Unsupported Media Type', - HTTP_416='Requested Range Not Satisfiable', - HTTP_417='Expectation Failed', - HTTP_500='Internal Server Error', - HTTP_501='Not Implemented', - HTTP_502='Bad Gateway', - HTTP_503='Service Unavailable', - HTTP_504='Gateway Timeout', - HTTP_505='HTTP Version Not Supported'; - //@} - - const - //! Mapped PHP globals - GLOBALS='GET|POST|COOKIE|REQUEST|SESSION|FILES|SERVER|ENV', - //! HTTP verbs - VERBS='GET|HEAD|POST|PUT|PATCH|DELETE|CONNECT|OPTIONS', - //! Default directory permissions - MODE=0755, - //! Syntax highlighting stylesheet - CSS='code.css'; - - //@{ Request types - const - REQ_SYNC=1, - REQ_AJAX=2, - REQ_CLI=4; - //@} - - //@{ Error messages - const - E_Pattern='Invalid routing pattern: %s', - E_Named='Named route does not exist: %s', - E_Fatal='Fatal error: %s', - E_Open='Unable to open %s', - E_Routes='No routes specified', - E_Class='Invalid class %s', - E_Method='Invalid method %s', - E_Hive='Invalid hive key %s'; - //@} - - private - //! Globals - $hive, - //! Initial settings - $init, - //! Language lookup sequence - $languages, - //! Mutex locks - $locks=[], - //! Default fallback language - $fallback='en'; - - /** - * Sync PHP global with corresponding hive key - * @return array - * @param $key string - **/ - function sync($key) { - return $this->hive[$key]=&$GLOBALS['_'.$key]; - } - - /** - * Return the parts of specified hive key - * @return array - * @param $key string - **/ - private function cut($key) { - return preg_split('/\[\h*[\'"]?(.+?)[\'"]?\h*\]|(->)|\./', - $key,NULL,PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE); - } - - /** - * Replace tokenized URL with available token values - * @return string - * @param $url array|string - * @param $args array - **/ - function build($url,$args=[]) { - $args+=$this->hive['PARAMS']; - if (is_array($url)) - foreach ($url as &$var) { - $var=$this->build($var,$args); - unset($var); - } - else { - $i=0; - $url=preg_replace_callback('/@(\w+)|(\*)/', - function($match) use(&$i,$args) { - if (isset($match[1]) && - array_key_exists($match[1],$args)) - return $args[$match[1]]; - if (isset($match[2]) && - array_key_exists($match[2],$args)) { - if (!is_array($args[$match[2]])) - return $args[$match[2]]; - $i++; - return $args[$match[2]][$i-1]; - } - return $match[0]; - },$url); - } - return $url; - } - - /** - * Parse string containing key-value pairs - * @return array - * @param $str string - **/ - function parse($str) { - preg_match_all('/(\w+|\*)\h*=\h*(?:\[(.+?)\]|(.+?))(?=,|$)/', - $str,$pairs,PREG_SET_ORDER); - $out=[]; - foreach ($pairs as $pair) - if ($pair[2]) { - $out[$pair[1]]=[]; - foreach (explode(',',$pair[2]) as $val) - array_push($out[$pair[1]],$val); - } - else - $out[$pair[1]]=trim($pair[3]); - return $out; - } - - /** - * Cast string variable to PHP type or constant - * @param $val - * @return mixed - */ - function cast($val) { - if (preg_match('/^(?:0x[0-9a-f]+|0[0-7]+|0b[01]+)$/i',$val)) - return intval($val,0); - if (is_numeric($val)) - return $val+0; - $val=trim($val); - if (preg_match('/^\w+$/i',$val) && defined($val)) - return constant($val); - return $val; - } - - /** - * Convert JS-style token to PHP expression - * @return string - * @param $str string - **/ - function compile($str) { - return preg_replace_callback( - '/(?|::)\w+)?)'. - '((?:\.\w+|\[(?:(?:[^\[\]]*|(?R))*)\]|(?:\->|::)\w+|\()*)/', - function($expr) { - $str='$'.$expr[1]; - if (isset($expr[2])) - $str.=preg_replace_callback( - '/\.(\w+)(\()?|\[((?:[^\[\]]*|(?R))*)\]/', - function($sub) { - if (empty($sub[2])) { - if (ctype_digit($sub[1])) - $sub[1]=(int)$sub[1]; - $out='['. - (isset($sub[3])? - $this->compile($sub[3]): - $this->export($sub[1])). - ']'; - } - else - $out=function_exists($sub[1])? - $sub[0]: - ('['.$this->export($sub[1]).']'.$sub[2]); - return $out; - }, - $expr[2] - ); - return $str; - }, - $str - ); - } - - /** - * Get hive key reference/contents; Add non-existent hive keys, - * array elements, and object properties by default - * @return mixed - * @param $key string - * @param $add bool - * @param $var mixed - **/ - function &ref($key,$add=TRUE,&$var=NULL) { - $null=NULL; - $parts=$this->cut($key); - if ($parts[0]=='SESSION') { - if (!headers_sent() && session_status()!=PHP_SESSION_ACTIVE) - session_start(); - $this->sync('SESSION'); - } - elseif (!preg_match('/^\w+$/',$parts[0])) - user_error(sprintf(self::E_Hive,$this->stringify($key)), - E_USER_ERROR); - if (is_null($var)) { - if ($add) - $var=&$this->hive; - else - $var=$this->hive; - } - $obj=FALSE; - foreach ($parts as $part) - if ($part=='->') - $obj=TRUE; - elseif ($obj) { - $obj=FALSE; - if (!is_object($var)) - $var=new stdclass; - if ($add || property_exists($var,$part)) - $var=&$var->$part; - else { - $var=&$null; - break; - } - } - else { - if (!is_array($var)) - $var=[]; - if ($add || array_key_exists($part,$var)) - $var=&$var[$part]; - else { - $var=&$null; - break; - } - } - return $var; - } - - /** - * Return TRUE if hive key is set - * (or return timestamp and TTL if cached) - * @return bool - * @param $key string - * @param $val mixed - **/ - function exists($key,&$val=NULL) { - $val=$this->ref($key,FALSE); - return isset($val)? - TRUE: - (Cache::instance()->exists($this->hash($key).'.var',$val)?:FALSE); - } - - /** - * Return TRUE if hive key is empty and not cached - * @param $key string - * @param $val mixed - * @return bool - **/ - function devoid($key,&$val=NULL) { - $val=$this->ref($key,FALSE); - return empty($val) && - (!Cache::instance()->exists($this->hash($key).'.var',$val) || - !$val); - } - - /** - * Bind value to hive key - * @return mixed - * @param $key string - * @param $val mixed - * @param $ttl int - **/ - function set($key,$val,$ttl=0) { - $time=(int)$this->hive['TIME']; - if (preg_match('/^(GET|POST|COOKIE)\b(.+)/',$key,$expr)) { - $this->set('REQUEST'.$expr[2],$val); - if ($expr[1]=='COOKIE') { - $parts=$this->cut($key); - $jar=$this->unserialize($this->serialize($this->hive['JAR'])); - unset($jar['lifetime']); - if (isset($_COOKIE[$parts[1]])) - call_user_func_array('setcookie', - array_merge([$parts[1],NULL],['expire'=>0]+$jar)); - if ($ttl) - $jar['expire']=$time+$ttl; - call_user_func_array('setcookie',[$parts[1],$val]+$jar); - $_COOKIE[$parts[1]]=$val; - return $val; - } - } - else switch ($key) { - case 'CACHE': - $val=Cache::instance()->load($val); - break; - case 'ENCODING': - ini_set('default_charset',$val); - if (extension_loaded('mbstring')) - mb_internal_encoding($val); - break; - case 'FALLBACK': - $this->fallback=$val; - $lang=$this->language($this->hive['LANGUAGE']); - case 'LANGUAGE': - if (!isset($lang)) - $val=$this->language($val); - $lex=$this->lexicon($this->hive['LOCALES'],$ttl); - case 'LOCALES': - if (isset($lex) || $lex=$this->lexicon($val,$ttl)) - foreach ($lex as $dt=>$dd) { - $ref=&$this->ref($this->hive['PREFIX'].$dt); - $ref=$dd; - unset($ref); - } - break; - case 'TZ': - date_default_timezone_set($val); - break; - } - $ref=&$this->ref($key); - $ref=$val; - if (preg_match('/^JAR\b/',$key)) { - if ($key=='JAR.lifetime') - $this->set('JAR.expire',$val==0?0: - (is_int($val)?$time+$val:strtotime($val))); - else { - if ($key=='JAR.expire') - $this->hive['JAR']['lifetime']=max(0,$val-$time); - $jar=$this->unserialize($this->serialize($this->hive['JAR'])); - unset($jar['expire']); - if (!headers_sent() && session_status()!=PHP_SESSION_ACTIVE) - call_user_func_array('session_set_cookie_params',$jar); - } - } - if ($ttl) - // Persist the key-value pair - Cache::instance()->set($this->hash($key).'.var',$val,$ttl); - return $ref; - } - - /** - * Retrieve contents of hive key - * @return mixed - * @param $key string - * @param $args string|array - **/ - function get($key,$args=NULL) { - if (is_string($val=$this->ref($key,FALSE)) && !is_null($args)) - return call_user_func_array( - [$this,'format'], - array_merge([$val],is_array($args)?$args:[$args]) - ); - if (is_null($val)) { - // Attempt to retrieve from cache - if (Cache::instance()->exists($this->hash($key).'.var',$data)) - return $data; - } - return $val; - } - - /** - * Unset hive key - * @return NULL - * @param $key string - **/ - function clear($key) { - // Normalize array literal - $cache=Cache::instance(); - $parts=$this->cut($key); - if ($key=='CACHE') - // Clear cache contents - $cache->reset(); - elseif (preg_match('/^(GET|POST|COOKIE)\b(.+)/',$key,$expr)) { - $this->clear('REQUEST'.$expr[2]); - if ($expr[1]=='COOKIE') { - $parts=$this->cut($key); - $jar=$this->hive['JAR']; - unset($jar['lifetime']); - $jar['expire']=0; - call_user_func_array('setcookie', - array_merge([$parts[1],NULL],$jar)); - unset($_COOKIE[$parts[1]]); - } - } - elseif ($parts[0]=='SESSION') { - if (!headers_sent() && session_status()!=PHP_SESSION_ACTIVE) - session_start(); - if (empty($parts[1])) { - // End session - session_unset(); - session_destroy(); - $this->clear('COOKIE.'.session_name()); - } - $this->sync('SESSION'); - } - if (!isset($parts[1]) && array_key_exists($parts[0],$this->init)) - // Reset global to default value - $this->hive[$parts[0]]=$this->init[$parts[0]]; - else { - eval('unset('.$this->compile('@this->hive.'.$key).');'); - if ($parts[0]=='SESSION') { - session_commit(); - session_start(); - } - if ($cache->exists($hash=$this->hash($key).'.var')) - // Remove from cache - $cache->clear($hash); - } - } - - /** - * Return TRUE if hive variable is 'on' - * @return bool - * @param $key string - **/ - function checked($key) { - $ref=&$this->ref($key); - return $ref=='on'; - } - - /** - * Return TRUE if property has public visibility - * @return bool - * @param $obj object - * @param $key string - **/ - function visible($obj,$key) { - if (property_exists($obj,$key)) { - $ref=new ReflectionProperty(get_class($obj),$key); - $out=$ref->ispublic(); - unset($ref); - return $out; - } - return FALSE; - } - - /** - * Multi-variable assignment using associative array - * @return NULL - * @param $vars array - * @param $prefix string - * @param $ttl int - **/ - function mset(array $vars,$prefix='',$ttl=0) { - foreach ($vars as $key=>$val) - $this->set($prefix.$key,$val,$ttl); - } - - /** - * Publish hive contents - * @return array - **/ - function hive() { - return $this->hive; - } - - /** - * Copy contents of hive variable to another - * @return mixed - * @param $src string - * @param $dst string - **/ - function copy($src,$dst) { - $ref=&$this->ref($dst); - return $ref=$this->ref($src,FALSE); - } - - /** - * Concatenate string to hive string variable - * @return string - * @param $key string - * @param $val string - **/ - function concat($key,$val) { - $ref=&$this->ref($key); - $ref.=$val; - return $ref; - } - - /** - * Swap keys and values of hive array variable - * @return array - * @param $key string - * @public - **/ - function flip($key) { - $ref=&$this->ref($key); - return $ref=array_combine(array_values($ref),array_keys($ref)); - } - - /** - * Add element to the end of hive array variable - * @return mixed - * @param $key string - * @param $val mixed - **/ - function push($key,$val) { - $ref=&$this->ref($key); - $ref[]=$val; - return $val; - } - - /** - * Remove last element of hive array variable - * @return mixed - * @param $key string - **/ - function pop($key) { - $ref=&$this->ref($key); - return array_pop($ref); - } - - /** - * Add element to the beginning of hive array variable - * @return mixed - * @param $key string - * @param $val mixed - **/ - function unshift($key,$val) { - $ref=&$this->ref($key); - array_unshift($ref,$val); - return $val; - } - - /** - * Remove first element of hive array variable - * @return mixed - * @param $key string - **/ - function shift($key) { - $ref=&$this->ref($key); - return array_shift($ref); - } - - /** - * Merge array with hive array variable - * @return array - * @param $key string - * @param $src string|array - * @param $keep bool - **/ - function merge($key,$src,$keep=FALSE) { - $ref=&$this->ref($key); - if (!$ref) - $ref=[]; - $out=array_merge($ref,is_string($src)?$this->hive[$src]:$src); - if ($keep) - $ref=$out; - return $out; - } - - /** - * Extend hive array variable with default values from $src - * @return array - * @param $key string - * @param $src string|array - * @param $keep bool - **/ - function extend($key,$src,$keep=FALSE) { - $ref=&$this->ref($key); - if (!$ref) - $ref=[]; - $out=array_replace_recursive( - is_string($src)?$this->hive[$src]:$src,$ref); - if ($keep) - $ref=$out; - return $out; - } - - /** - * Convert backslashes to slashes - * @return string - * @param $str string - **/ - function fixslashes($str) { - return $str?strtr($str,'\\','/'):$str; - } - - /** - * Split comma-, semi-colon, or pipe-separated string - * @return array - * @param $str string - * @param $noempty bool - **/ - function split($str,$noempty=TRUE) { - return array_map('trim', - preg_split('/[,;|]/',$str,0,$noempty?PREG_SPLIT_NO_EMPTY:0)); - } - - /** - * Convert PHP expression/value to compressed exportable string - * @return string - * @param $arg mixed - * @param $stack array - **/ - function stringify($arg,array $stack=NULL) { - if ($stack) { - foreach ($stack as $node) - if ($arg===$node) - return '*RECURSION*'; - } - else - $stack=[]; - switch (gettype($arg)) { - case 'object': - $str=''; - foreach (get_object_vars($arg) as $key=>$val) - $str.=($str?',':''). - $this->export($key).'=>'. - $this->stringify($val, - array_merge($stack,[$arg])); - return get_class($arg).'::__set_state(['.$str.'])'; - case 'array': - $str=''; - $num=isset($arg[0]) && - ctype_digit(implode('',array_keys($arg))); - foreach ($arg as $key=>$val) - $str.=($str?',':''). - ($num?'':($this->export($key).'=>')). - $this->stringify($val,array_merge($stack,[$arg])); - return '['.$str.']'; - default: - return $this->export($arg); - } - } - - /** - * Flatten array values and return as CSV string - * @return string - * @param $args array - **/ - function csv(array $args) { - return implode(',',array_map('stripcslashes', - array_map([$this,'stringify'],$args))); - } - - /** - * Convert snakecase string to camelcase - * @return string - * @param $str string - **/ - function camelcase($str) { - return preg_replace_callback( - '/_(\pL)/u', - function($match) { - return strtoupper($match[1]); - }, - $str - ); - } - - /** - * Convert camelcase string to snakecase - * @return string - * @param $str string - **/ - function snakecase($str) { - return strtolower(preg_replace('/(?!^)\p{Lu}/u','_\0',$str)); - } - - /** - * Return -1 if specified number is negative, 0 if zero, - * or 1 if the number is positive - * @return int - * @param $num mixed - **/ - function sign($num) { - return $num?($num/abs($num)):0; - } - - /** - * Extract values of array whose keys start with the given prefix - * @return array - * @param $arr array - * @param $prefix string - **/ - function extract($arr,$prefix) { - $out=[]; - foreach (preg_grep('/^'.preg_quote($prefix,'/').'/',array_keys($arr)) - as $key) - $out[substr($key,strlen($prefix))]=$arr[$key]; - return $out; - } - - /** - * Convert class constants to array - * @return array - * @param $class object|string - * @param $prefix string - **/ - function constants($class,$prefix='') { - $ref=new ReflectionClass($class); - return $this->extract($ref->getconstants(),$prefix); - } - - /** - * Generate 64bit/base36 hash - * @return string - * @param $str - **/ - function hash($str) { - return str_pad(base_convert( - substr(sha1($str),-16),16,36),11,'0',STR_PAD_LEFT); - } - - /** - * Return Base64-encoded equivalent - * @return string - * @param $data string - * @param $mime string - **/ - function base64($data,$mime) { - return 'data:'.$mime.';base64,'.base64_encode($data); - } - - /** - * Convert special characters to HTML entities - * @return string - * @param $str string - **/ - function encode($str) { - return @htmlspecialchars($str,$this->hive['BITMASK'], - $this->hive['ENCODING'])?:$this->scrub($str); - } - - /** - * Convert HTML entities back to characters - * @return string - * @param $str string - **/ - function decode($str) { - return htmlspecialchars_decode($str,$this->hive['BITMASK']); - } - - /** - * Invoke callback recursively for all data types - * @return mixed - * @param $arg mixed - * @param $func callback - * @param $stack array - **/ - function recursive($arg,$func,$stack=[]) { - if ($stack) { - foreach ($stack as $node) - if ($arg===$node) - return $arg; - } - switch (gettype($arg)) { - case 'object': - $ref=new ReflectionClass($arg); - if ($ref->iscloneable()) { - $arg=clone($arg); - $cast=is_a($arg,'IteratorAggregate')? - iterator_to_array($arg):get_object_vars($arg); - foreach ($cast as $key=>$val) - $arg->$key=$this->recursive( - $val,$func,array_merge($stack,[$arg])); - } - return $arg; - case 'array': - $copy=[]; - foreach ($arg as $key=>$val) - $copy[$key]=$this->recursive($val,$func, - array_merge($stack,[$arg])); - return $copy; - } - return $func($arg); - } - - /** - * Remove HTML tags (except those enumerated) and non-printable - * characters to mitigate XSS/code injection attacks - * @return mixed - * @param $arg mixed - * @param $tags string - **/ - function clean($arg,$tags=NULL) { - return $this->recursive($arg, - function($val) use($tags) { - if ($tags!='*') - $val=trim(strip_tags($val, - '<'.implode('><',$this->split($tags)).'>')); - return trim(preg_replace( - '/[\x00-\x08\x0B\x0C\x0E-\x1F]/','',$val)); - } - ); - } - - /** - * Similar to clean(), except that variable is passed by reference - * @return mixed - * @param $var mixed - * @param $tags string - **/ - function scrub(&$var,$tags=NULL) { - return $var=$this->clean($var,$tags); - } - - /** - * Return locale-aware formatted string - * @return string - **/ - function format() { - $args=func_get_args(); - $val=array_shift($args); - // Get formatting rules - $conv=localeconv(); - return preg_replace_callback( - '/\{\s*(?P\d+)\s*(?:,\s*(?P\w+)\s*'. - '(?:,\s*(?P(?:\w+(?:\s*\{.+?\}\s*,?\s*)?)*)'. - '(?:,\s*(?P.+?))?)?)?\s*\}/', - function($expr) use($args,$conv) { - extract($expr); - extract($conv); - if (!array_key_exists($pos,$args)) - return $expr[0]; - if (isset($type)) { - if (isset($this->hive['FORMATS'][$type])) - return $this->call( - $this->hive['FORMATS'][$type], - [ - $args[$pos], - isset($mod)?$mod:null, - isset($prop)?$prop:null - ] - ); - switch ($type) { - case 'plural': - preg_match_all('/(?\w+)'. - '(?:\s*\{\s*(?.+?)\s*\})/', - $mod,$matches,PREG_SET_ORDER); - $ord=['zero','one','two']; - foreach ($matches as $match) { - extract($match); - if (isset($ord[$args[$pos]]) && - $tag==$ord[$args[$pos]] || $tag=='other') - return str_replace('#',$args[$pos],$data); - } - case 'number': - if (isset($mod)) - switch ($mod) { - case 'integer': - return number_format( - $args[$pos],0,'',$thousands_sep); - case 'currency': - $int=$cstm=FALSE; - if (isset($prop) && - $cstm=!$int=($prop=='int')) - $currency_symbol=$prop; - if (!$cstm && - function_exists('money_format')) - return money_format( - '%'.($int?'i':'n'),$args[$pos]); - $fmt=[ - 0=>'(nc)',1=>'(n c)', - 2=>'(nc)',10=>'+nc', - 11=>'+n c',12=>'+ nc', - 20=>'nc+',21=>'n c+', - 22=>'nc +',30=>'n+c', - 31=>'n +c',32=>'n+ c', - 40=>'nc+',41=>'n c+', - 42=>'nc +',100=>'(cn)', - 101=>'(c n)',102=>'(cn)', - 110=>'+cn',111=>'+c n', - 112=>'+ cn',120=>'cn+', - 121=>'c n+',122=>'cn +', - 130=>'+cn',131=>'+c n', - 132=>'+ cn',140=>'c+n', - 141=>'c+ n',142=>'c +n' - ]; - if ($args[$pos]<0) { - $sgn=$negative_sign; - $pre='n'; - } - else { - $sgn=$positive_sign; - $pre='p'; - } - return str_replace( - ['+','n','c'], - [$sgn,number_format( - abs($args[$pos]), - $frac_digits, - $decimal_point, - $thousands_sep), - $int?$int_curr_symbol - :$currency_symbol], - $fmt[(int)( - (${$pre.'_cs_precedes'}%2). - (${$pre.'_sign_posn'}%5). - (${$pre.'_sep_by_space'}%3) - )] - ); - case 'percent': - return number_format( - $args[$pos]*100,0,$decimal_point, - $thousands_sep).'%'; - } - $frac=$args[$pos]-(int)$args[$pos]; - return number_format( - $args[$pos], - isset($prop)? - $prop: - $frac?strlen($frac)-2:0, - $decimal_point,$thousands_sep); - case 'date': - $prop='%d %B %Y'; - if (empty($mod) || $mod=='short') - $prop='%x'; - elseif ($mod=='full') - $prop='%A, '.$prop; - return strftime($prop,$args[$pos]); - case 'time': - $prop='%r'; - if (empty($mod) || $mod=='short') - $prop='%X'; - return strftime($prop,$args[$pos]); - default: - return $expr[0]; - } - } - return $args[$pos]; - }, - $val - ); - } - - /** - * Return string representation of expression - * @return string - * @param $expr mixed - **/ - function export($expr) { - return var_export($expr,TRUE); - } - - /** - * Assign/auto-detect language - * @return string - * @param $code string - **/ - function language($code) { - $code=preg_replace('/\h+|;q=[0-9.]+/','',$code); - $code.=($code?',':'').$this->fallback; - $this->languages=[]; - foreach (array_reverse(explode(',',$code)) as $lang) - if (preg_match('/^(\w{2})(?:-(\w{2}))?\b/i',$lang,$parts)) { - // Generic language - array_unshift($this->languages,$parts[1]); - if (isset($parts[2])) { - // Specific language - $parts[0]=$parts[1].'-'.($parts[2]=strtoupper($parts[2])); - array_unshift($this->languages,$parts[0]); - } - } - $this->languages=array_unique($this->languages); - $locales=[]; - $windows=preg_match('/^win/i',PHP_OS); - // Work around PHP's Turkish locale bug - foreach (preg_grep('/^(?!tr)/i',$this->languages) as $locale) { - if ($windows) { - $parts=explode('-',$locale); - $locale=@constant('ISO::LC_'.$parts[0]); - if (isset($parts[1]) && - $country=@constant('ISO::CC_'.strtolower($parts[1]))) - $locale.='-'.$country; - } - $locale=str_replace('-','_',$locale); - $locales[]=$locale.'.'.ini_get('default_charset'); - $locales[]=$locale; - } - setlocale(LC_ALL,$locales); - return $this->hive['LANGUAGE']=implode(',',$this->languages); - } - - /** - * Return lexicon entries - * @return array - * @param $path string - * @param $ttl int - **/ - function lexicon($path,$ttl=0) { - $languages=$this->languages?:explode(',',$this->fallback); - $cache=Cache::instance(); - if ($cache->exists( - $hash=$this->hash(implode(',',$languages)).'.dic',$lex)) - return $lex; - $lex=[]; - foreach ($languages as $lang) - foreach ($this->split($path) as $dir) - if ((is_file($file=($base=$dir.$lang).'.php') || - is_file($file=$base.'.php')) && - is_array($dict=require($file))) - $lex+=$dict; - elseif (is_file($file=$base.'.ini')) { - preg_match_all( - '/(?<=^|\n)(?:'. - '\[(?.+?)\]|'. - '(?[^\h\r\n;].*?)\h*=\h*'. - '(?(?:\\\\\h*\r?\n|.+?)*)'. - ')(?=\r?\n|$)/', - $this->read($file),$matches,PREG_SET_ORDER); - if ($matches) { - $prefix=''; - foreach ($matches as $match) - if ($match['prefix']) - $prefix=$match['prefix'].'.'; - elseif (!array_key_exists( - $key=$prefix.$match['lval'],$lex)) - $lex[$key]=trim(preg_replace( - '/\\\\\h*\r?\n/',"\n",$match['rval'])); - } - } - if ($ttl) - $cache->set($hash,$lex,$ttl); - return $lex; - } - - /** - * Return string representation of PHP value - * @return string - * @param $arg mixed - **/ - function serialize($arg) { - switch (strtolower($this->hive['SERIALIZER'])) { - case 'igbinary': - return igbinary_serialize($arg); - default: - return serialize($arg); - } - } - - /** - * Return PHP value derived from string - * @return string - * @param $arg mixed - **/ - function unserialize($arg) { - switch (strtolower($this->hive['SERIALIZER'])) { - case 'igbinary': - return igbinary_unserialize($arg); - default: - return unserialize($arg); - } - } - - /** - * Send HTTP status header; Return text equivalent of status code - * @return string - * @param $code int - **/ - function status($code) { - $reason=@constant('self::HTTP_'.$code); - if (!$this->hive['CLI'] && !headers_sent()) - header($_SERVER['SERVER_PROTOCOL'].' '.$code.' '.$reason); - return $reason; - } - - /** - * Send cache metadata to HTTP client - * @return NULL - * @param $secs int - **/ - function expire($secs=0) { - if (!$this->hive['CLI'] && !headers_sent()) { - $secs=(int)$secs; - if ($this->hive['PACKAGE']) - header('X-Powered-By: '.$this->hive['PACKAGE']); - if ($this->hive['XFRAME']) - header('X-Frame-Options: '.$this->hive['XFRAME']); - header('X-XSS-Protection: 1; mode=block'); - header('X-Content-Type-Options: nosniff'); - if ($this->hive['VERB']=='GET' && $secs) { - $time=microtime(TRUE); - header_remove('Pragma'); - header('Cache-Control: max-age='.$secs); - header('Expires: '.gmdate('r',$time+$secs)); - header('Last-Modified: '.gmdate('r')); - } - else { - header('Pragma: no-cache'); - header('Cache-Control: no-cache, no-store, must-revalidate'); - header('Expires: '.gmdate('r',0)); - } - } - } - - /** - * Return HTTP user agent - * @return string - **/ - function agent() { - $headers=$this->hive['HEADERS']; - return isset($headers['X-Operamini-Phone-UA'])? - $headers['X-Operamini-Phone-UA']: - (isset($headers['X-Skyfire-Phone'])? - $headers['X-Skyfire-Phone']: - (isset($headers['User-Agent'])? - $headers['User-Agent']:'')); - } - - /** - * Return TRUE if XMLHttpRequest detected - * @return bool - **/ - function ajax() { - $headers=$this->hive['HEADERS']; - return isset($headers['X-Requested-With']) && - $headers['X-Requested-With']=='XMLHttpRequest'; - } - - /** - * Sniff IP address - * @return string - **/ - function ip() { - $headers=$this->hive['HEADERS']; - return isset($headers['Client-IP'])? - $headers['Client-IP']: - (isset($headers['X-Forwarded-For'])? - explode(',',$headers['X-Forwarded-For'])[0]: - (isset($_SERVER['REMOTE_ADDR'])? - $_SERVER['REMOTE_ADDR']:'')); - } - - /** - * Return filtered stack trace as a formatted string (or array) - * @return string|array - * @param $trace array|NULL - * @param $format bool - **/ - function trace(array $trace=NULL,$format=TRUE) { - if (!$trace) { - $trace=debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); - $frame=$trace[0]; - if (isset($frame['file']) && $frame['file']==__FILE__) - array_shift($trace); - } - $debug=$this->hive['DEBUG']; - $trace=array_filter( - $trace, - function($frame) use($debug) { - return isset($frame['file']) && - ($debug>1 || - ($frame['file']!=__FILE__ || $debug) && - (empty($frame['function']) || - !preg_match('/^(?:(?:trigger|user)_error|'. - '__call|call_user_func)/',$frame['function']))); - } - ); - if (!$format) - return $trace; - $out=''; - $eol="\n"; - // Analyze stack trace - foreach ($trace as $frame) { - $line=''; - if (isset($frame['class'])) - $line.=$frame['class'].$frame['type']; - if (isset($frame['function'])) - $line.=$frame['function'].'('. - ($debug>2 && isset($frame['args'])? - $this->csv($frame['args']):'').')'; - $src=$this->fixslashes(str_replace($_SERVER['DOCUMENT_ROOT']. - '/','',$frame['file'])).':'.$frame['line']; - $out.='['.$src.'] '.$line.$eol; - } - return $out; - } - - /** - * Log error; Execute ONERROR handler if defined, else display - * default error page (HTML for synchronous requests, JSON string - * for AJAX requests) - * @return NULL - * @param $code int - * @param $text string - * @param $trace array - * @param $level int - **/ - function error($code,$text='',array $trace=NULL,$level=0) { - $prior=$this->hive['ERROR']; - $header=$this->status($code); - $req=$this->hive['VERB'].' '.$this->hive['PATH']; - if ($this->hive['QUERY']) - $req.='?'.$this->hive['QUERY']; - if (!$text) - $text='HTTP '.$code.' ('.$req.')'; - $trace=$this->trace($trace); - $loggable=$this->hive['LOGGABLE']; - if (!is_array($loggable)) - $loggable=$this->split($loggable); - foreach ($loggable as $status) - if ($status=='*' || - preg_match('/^'.preg_replace('/\D/','\d',$status).'$/',$code)) { - error_log($text); - foreach (explode("\n",$trace) as $nexus) - if ($nexus) - error_log($nexus); - break; - } - if ($highlight=!$this->hive['CLI'] && !$this->hive['AJAX'] && - $this->hive['HIGHLIGHT'] && is_file($css=__DIR__.'/'.self::CSS)) - $trace=$this->highlight($trace); - $this->hive['ERROR']=[ - 'status'=>$header, - 'code'=>$code, - 'text'=>$text, - 'trace'=>$trace, - 'level'=>$level - ]; - $this->expire(-1); - $handler=$this->hive['ONERROR']; - $this->hive['ONERROR']=NULL; - $eol="\n"; - if ((!$handler || - $this->call($handler,[$this,$this->hive['PARAMS']], - 'beforeroute,afterroute')===FALSE) && - !$prior && !$this->hive['CLI'] && !$this->hive['QUIET']) - echo $this->hive['AJAX']? - json_encode( - array_diff_key( - $this->hive['ERROR'], - $this->hive['DEBUG']? - []: - ['trace'=>1] - ) - ): - (''.$eol. - ''.$eol. - ''. - ''.$code.' '.$header.''. - ($highlight? - (''):''). - ''.$eol. - ''.$eol. - '

'.$header.'

'.$eol. - '

'.$this->encode($text?:$req).'

'.$eol. - ($this->hive['DEBUG']?('
'.$trace.'
'.$eol):''). - ''.$eol. - ''); - if ($this->hive['HALT']) - die(1); - } - - /** - * Mock HTTP request - * @return mixed - * @param $pattern string - * @param $args array - * @param $headers array - * @param $body string - **/ - function mock($pattern, - array $args=NULL,array $headers=NULL,$body=NULL) { - if (!$args) - $args=[]; - $types=['sync','ajax','cli']; - preg_match('/([\|\w]+)\h+(?:@(\w+)(?:(\(.+?)\))*|([^\h]+))'. - '(?:\h+\[('.implode('|',$types).')\])?/',$pattern,$parts); - $verb=strtoupper($parts[1]); - if ($parts[2]) { - if (empty($this->hive['ALIASES'][$parts[2]])) - user_error(sprintf(self::E_Named,$parts[2]),E_USER_ERROR); - $parts[4]=$this->hive['ALIASES'][$parts[2]]; - $parts[4]=$this->build($parts[4], - isset($parts[3])?$this->parse($parts[3]):[]); - } - if (empty($parts[4])) - user_error(sprintf(self::E_Pattern,$pattern),E_USER_ERROR); - $url=parse_url($parts[4]); - parse_str(@$url['query'],$GLOBALS['_GET']); - if (preg_match('/GET|HEAD/',$verb)) - $GLOBALS['_GET']=array_merge($GLOBALS['_GET'],$args); - $GLOBALS['_POST']=$verb=='POST'?$args:[]; - $GLOBALS['_REQUEST']=array_merge($GLOBALS['_GET'],$GLOBALS['_POST']); - foreach ($headers?:[] as $key=>$val) - $_SERVER['HTTP_'.strtr(strtoupper($key),'-','_')]=$val; - $this->hive['VERB']=$verb; - $this->hive['PATH']=$url['path']; - $this->hive['URI']=$this->hive['BASE'].$url['path']; - if ($GLOBALS['_GET']) - $this->hive['URI'].='?'.http_build_query($GLOBALS['_GET']); - $this->hive['BODY']=''; - if (!preg_match('/GET|HEAD/',$verb)) - $this->hive['BODY']=$body?:http_build_query($args); - $this->hive['AJAX']=isset($parts[5]) && - preg_match('/ajax/i',$parts[5]); - $this->hive['CLI']=isset($parts[5]) && - preg_match('/cli/i',$parts[5]); - return $this->run(); - } - - /** - * Assemble url from alias name - * @return string - * @param $name string - * @param $params array|string - * @param $query string|array - **/ - function alias($name,$params=[],$query=NULL) { - if (!is_array($params)) - $params=$this->parse($params); - if (empty($this->hive['ALIASES'][$name])) - user_error(sprintf(self::E_Named,$name),E_USER_ERROR); - $url=$this->build($this->hive['ALIASES'][$name],$params); - if (is_array($query)) - $query=http_build_query($query); - return $url.($query?('?'.$query):''); - } - - /** - * Bind handler to route pattern - * @return NULL - * @param $pattern string|array - * @param $handler callback - * @param $ttl int - * @param $kbps int - **/ - function route($pattern,$handler,$ttl=0,$kbps=0) { - $types=['sync','ajax','cli']; - $alias=null; - if (is_array($pattern)) { - foreach ($pattern as $item) - $this->route($item,$handler,$ttl,$kbps); - return; - } - preg_match('/([\|\w]+)\h+(?:(?:@?(.+?)\h*:\h*)?(@(\w+)|[^\h]+))'. - '(?:\h+\[('.implode('|',$types).')\])?/u',$pattern,$parts); - if (isset($parts[2]) && $parts[2]) - $this->hive['ALIASES'][$alias=$parts[2]]=$parts[3]; - elseif (!empty($parts[4])) { - if (empty($this->hive['ALIASES'][$parts[4]])) - user_error(sprintf(self::E_Named,$parts[4]),E_USER_ERROR); - $parts[3]=$this->hive['ALIASES'][$alias=$parts[4]]; - } - if (empty($parts[3])) - user_error(sprintf(self::E_Pattern,$pattern),E_USER_ERROR); - $type=empty($parts[5])?0:constant('self::REQ_'.strtoupper($parts[5])); - foreach ($this->split($parts[1]) as $verb) { - if (!preg_match('/'.self::VERBS.'/',$verb)) - $this->error(501,$verb.' '.$this->hive['URI']); - $this->hive['ROUTES'][$parts[3]][$type][strtoupper($verb)]= - [$handler,$ttl,$kbps,$alias]; - } - } - - /** - * Reroute to specified URI - * @return NULL - * @param $url array|string - * @param $permanent bool - * @param $die bool - **/ - function reroute($url=NULL,$permanent=FALSE,$die=TRUE) { - if (!$url) - $url=$this->hive['REALM']; - if (is_array($url)) - $url=call_user_func_array([$this,'alias'],$url); - elseif (preg_match('/^(?:@?([^\/()?]+)(?:(\(.+?)\))*(\?.+)*)/', - $url,$parts) && - isset($this->hive['ALIASES'][$parts[1]])) - $url=$this->hive['ALIASES'][$parts[1]]; - $url=$this->build($url,isset($parts[2])?$this->parse($parts[2]):[]). - (isset($parts[3])?$parts[3]:''); - if (($handler=$this->hive['ONREROUTE']) && - $this->call($handler,[$url,$permanent])!==FALSE) - return; - if ($url[0]=='/' && (empty($url[1]) || $url[1]!='/')) { - $port=$this->hive['PORT']; - $port=in_array($port,[80,443])?'':(':'.$port); - $url=$this->hive['SCHEME'].'://'. - $this->hive['HOST'].$port.$this->hive['BASE'].$url; - } - if ($this->hive['CLI']) - $this->mock('GET '.$url.' [cli]'); - else { - header('Location: '.$url); - $this->status($permanent?301:302); - if ($die) - die; - } - } - - /** - * Provide ReST interface by mapping HTTP verb to class method - * @return NULL - * @param $url string - * @param $class string|object - * @param $ttl int - * @param $kbps int - **/ - function map($url,$class,$ttl=0,$kbps=0) { - if (is_array($url)) { - foreach ($url as $item) - $this->map($item,$class,$ttl,$kbps); - return; - } - foreach (explode('|',self::VERBS) as $method) - $this->route($method.' '.$url,is_string($class)? - $class.'->'.$this->hive['PREMAP'].strtolower($method): - [$class,$this->hive['PREMAP'].strtolower($method)], - $ttl,$kbps); - } - - /** - * Redirect a route to another URL - * @return NULL - * @param $pattern string|array - * @param $url string - * @param $permanent bool - */ - function redirect($pattern,$url,$permanent=TRUE) { - if (is_array($pattern)) { - foreach ($pattern as $item) - $this->redirect($item,$url,$permanent); - return; - } - $this->route($pattern,function($fw) use($url,$permanent) { - $fw->reroute($url,$permanent); - }); - } - - /** - * Return TRUE if IPv4 address exists in DNSBL - * @return bool - * @param $ip string - **/ - function blacklisted($ip) { - if ($this->hive['DNSBL'] && - !in_array($ip, - is_array($this->hive['EXEMPT'])? - $this->hive['EXEMPT']: - $this->split($this->hive['EXEMPT']))) { - // Reverse IPv4 dotted quad - $rev=implode('.',array_reverse(explode('.',$ip))); - foreach (is_array($this->hive['DNSBL'])? - $this->hive['DNSBL']: - $this->split($this->hive['DNSBL']) as $server) - // DNSBL lookup - if (checkdnsrr($rev.'.'.$server,'A')) - return TRUE; - } - return FALSE; - } - - /** - * Applies the specified URL mask and returns parameterized matches - * @return $args array - * @param $pattern string - * @param $url string|NULL - **/ - function mask($pattern,$url=NULL) { - if (!$url) - $url=$this->rel($this->hive['URI']); - $case=$this->hive['CASELESS']?'i':''; - $wild=preg_quote($pattern,'/'); - $i=0; - while (is_int($pos=strpos($wild,'\*'))) { - $wild=substr_replace($wild,'(?P<_'.$i.'>[^\?]*)',$pos,2); - $i++; - } - preg_match('/^'. - preg_replace( - '/((\\\{)?@(\w+\b)(?(2)\\\}))/', - '(?P<\3>[^\/\?]+)', - $wild).'\/?$/'.$case.'um',$url,$args); - foreach (array_keys($args) as $key) { - if (preg_match('/^_\d+$/',$key)) { - if (empty($args['*'])) - $args['*']=$args[$key]; - else { - if (is_string($args['*'])) - $args['*']=[$args['*']]; - array_push($args['*'],$args[$key]); - } - unset($args[$key]); - } - elseif (is_numeric($key) && $key) - unset($args[$key]); - } - return $args; - } - - /** - * Match routes against incoming URI - * @return mixed - **/ - function run() { - if ($this->blacklisted($this->hive['IP'])) - // Spammer detected - $this->error(403); - if (!$this->hive['ROUTES']) - // No routes defined - user_error(self::E_Routes,E_USER_ERROR); - // Match specific routes first - $paths=[]; - foreach ($keys=array_keys($this->hive['ROUTES']) as $key) { - $path=preg_replace('/@\w+/','*@',$key); - if (substr($path,-1)!='*') - $path.='+'; - $paths[]=$path; - } - $vals=array_values($this->hive['ROUTES']); - array_multisort($paths,SORT_DESC,$keys,$vals); - $this->hive['ROUTES']=array_combine($keys,$vals); - // Convert to BASE-relative URL - $req=urldecode($this->hive['PATH']); - $preflight=FALSE; - if ($cors=(isset($this->hive['HEADERS']['Origin']) && - $this->hive['CORS']['origin'])) { - $cors=$this->hive['CORS']; - header('Access-Control-Allow-Origin: '.$cors['origin']); - header('Access-Control-Allow-Credentials: '. - $this->export($cors['credentials'])); - $preflight= - isset($this->hive['HEADERS']['Access-Control-Request-Method']); - } - $allowed=[]; - foreach ($this->hive['ROUTES'] as $pattern=>$routes) { - if (!$args=$this->mask($pattern,$req)) - continue; - ksort($args); - $route=NULL; - $ptr=$this->hive['CLI']?self::REQ_CLI:$this->hive['AJAX']+1; - if (isset($routes[$ptr][$this->hive['VERB']]) || - isset($routes[$ptr=0])) - $route=$routes[$ptr]; - if (!$route) - continue; - if (isset($route[$this->hive['VERB']]) && !$preflight) { - if ($this->hive['VERB']=='GET' && - preg_match('/.+\/$/',$this->hive['PATH'])) - $this->reroute(substr($this->hive['PATH'],0,-1). - ($this->hive['QUERY']?('?'.$this->hive['QUERY']):'')); - list($handler,$ttl,$kbps,$alias)=$route[$this->hive['VERB']]; - // Capture values of route pattern tokens - $this->hive['PARAMS']=$args; - // Save matching route - $this->hive['ALIAS']=$alias; - $this->hive['PATTERN']=$pattern; - if ($cors && $cors['expose']) - header('Access-Control-Expose-Headers: '. - (is_array($cors['expose'])? - implode(',',$cors['expose']):$cors['expose'])); - if (is_string($handler)) { - // Replace route pattern tokens in handler if any - $handler=preg_replace_callback('/({)?@(\w+\b)(?(1)})/', - function($id) use($args) { - $pid=count($id)>2?2:1; - return isset($args[$id[$pid]])? - $args[$id[$pid]]: - $id[0]; - }, - $handler - ); - if (preg_match('/(.+)\h*(?:->|::)/',$handler,$match) && - !class_exists($match[1])) - $this->error(404); - } - // Process request - $result=NULL; - $body=''; - $now=microtime(TRUE); - if (preg_match('/GET|HEAD/',$this->hive['VERB']) && $ttl) { - // Only GET and HEAD requests are cacheable - $headers=$this->hive['HEADERS']; - $cache=Cache::instance(); - $cached=$cache->exists( - $hash=$this->hash($this->hive['VERB'].' '. - $this->hive['URI']).'.url',$data); - if ($cached) { - if (isset($headers['If-Modified-Since']) && - strtotime($headers['If-Modified-Since'])+ - $ttl>$now) { - $this->status(304); - die; - } - // Retrieve from cache backend - list($headers,$body,$result)=$data; - if (!$this->hive['CLI']) - array_walk($headers,'header'); - $this->expire($cached[0]+$ttl-$now); - } - else - // Expire HTTP client-cached page - $this->expire($ttl); - } - else - $this->expire(0); - if (!strlen($body)) { - if (!$this->hive['RAW'] && !$this->hive['BODY']) - $this->hive['BODY']=file_get_contents('php://input'); - ob_start(); - // Call route handler - $result=$this->call($handler,[$this,$args,$handler], - 'beforeroute,afterroute'); - $body=ob_get_clean(); - if (isset($cache) && !error_get_last()) { - // Save to cache backend - $cache->set($hash,[ - // Remove cookies - preg_grep('/Set-Cookie\:/',headers_list(), - PREG_GREP_INVERT),$body,$result],$ttl); - } - } - $this->hive['RESPONSE']=$body; - if (!$this->hive['QUIET']) { - if ($kbps) { - $ctr=0; - foreach (str_split($body,1024) as $part) { - // Throttle output - $ctr++; - if ($ctr/$kbps>($elapsed=microtime(TRUE)-$now) && - !connection_aborted()) - usleep(1e6*($ctr/$kbps-$elapsed)); - echo $part; - } - } - else - echo $body; - } - if ($result || $this->hive['VERB']!='OPTIONS') - return $result; - } - $allowed=array_merge($allowed,array_keys($route)); - } - if (!$allowed) - // URL doesn't match any route - $this->error(404); - elseif (!$this->hive['CLI']) { - if (!preg_grep('/Allow:/',$headers_send=headers_list())) - // Unhandled HTTP method - header('Allow: '.implode(',',array_unique($allowed))); - if ($cors) { - if (!preg_grep('/Access-Control-Allow-Methods:/',$headers_send)) - header('Access-Control-Allow-Methods: OPTIONS,'. - implode(',',$allowed)); - if ($cors['headers'] && - !preg_grep('/Access-Control-Allow-Headers:/',$headers_send)) - header('Access-Control-Allow-Headers: '. - (is_array($cors['headers'])? - implode(',',$cors['headers']): - $cors['headers'])); - if ($cors['ttl']>0) - header('Access-Control-Max-Age: '.$cors['ttl']); - } - if ($this->hive['VERB']!='OPTIONS') - $this->error(405); - } - return FALSE; - } - - /** - * Loop until callback returns TRUE (for long polling) - * @return mixed - * @param $func callback - * @param $args array - * @param $timeout int - **/ - function until($func,$args=NULL,$timeout=60) { - if (!$args) - $args=[]; - $time=time(); - $max=ini_get('max_execution_time'); - $limit=max(0,($max?min($timeout,$max):$timeout)-1); - $out=''; - // Turn output buffering on - ob_start(); - // Not for the weak of heart - while ( - // No error occurred - !$this->hive['ERROR'] && - // Got time left? - time()-$time+1<$limit && - // Still alive? - !connection_aborted() && - // Restart session - !headers_sent() && - (session_status()==PHP_SESSION_ACTIVE || session_start()) && - // CAUTION: Callback will kill host if it never becomes truthy! - !$out=$this->call($func,$args)) { - if (!$this->hive['CLI']) - session_commit(); - // Hush down - sleep(1); - } - ob_flush(); - flush(); - return $out; - } - - /** - * Disconnect HTTP client; - * Set FcgidOutputBufferSize to zero if server uses mod_fcgid; - * Disable mod_deflate when rendering text/html output - **/ - function abort() { - if (!headers_sent() && session_status()!=PHP_SESSION_ACTIVE) - session_start(); - $out=''; - while (ob_get_level()) - $out=ob_get_clean().$out; - if (!headers_sent()) { - header('Content-Length: '.strlen($out)); - header('Connection: close'); - } - session_commit(); - echo $out; - flush(); - if (function_exists('fastcgi_finish_request')) - fastcgi_finish_request(); - } - - /** - * Grab the real route handler behind the string expression - * @return string|array - * @param $func string - * @param $args array - **/ - function grab($func,$args=NULL) { - if (preg_match('/(.+)\h*(->|::)\h*(.+)/s',$func,$parts)) { - // Convert string to executable PHP callback - if (!class_exists($parts[1])) - user_error(sprintf(self::E_Class,$parts[1]),E_USER_ERROR); - if ($parts[2]=='->') { - if (is_subclass_of($parts[1],'Prefab')) - $parts[1]=call_user_func($parts[1].'::instance'); - elseif ($container=$this->get('CONTAINER')) { - if (is_object($container) && is_callable([$container,'has']) - && $container->has($parts[1])) // PSR11 - $parts[1]=call_user_func([$container,'get'],$parts[1]); - elseif (is_callable($container)) - $parts[1]=call_user_func($container,$parts[1],$args); - elseif (is_string($container) && - is_subclass_of($container,'Prefab')) - $parts[1]=call_user_func($container.'::instance')-> - get($parts[1]); - else - user_error(sprintf(self::E_Class, - $this->stringify($parts[1])), - E_USER_ERROR); - } - else { - $ref=new ReflectionClass($parts[1]); - $parts[1]=method_exists($parts[1],'__construct') && $args? - $ref->newinstanceargs($args): - $ref->newinstance(); - } - } - $func=[$parts[1],$parts[3]]; - } - return $func; - } - - /** - * Execute callback/hooks (supports 'class->method' format) - * @return mixed|FALSE - * @param $func callback - * @param $args mixed - * @param $hooks string - **/ - function call($func,$args=NULL,$hooks='') { - if (!is_array($args)) - $args=[$args]; - // Grab the real handler behind the string representation - if (is_string($func)) - $func=$this->grab($func,$args); - // Execute function; abort if callback/hook returns FALSE - if (!is_callable($func)) - // No route handler - if ($hooks=='beforeroute,afterroute') { - $allowed=[]; - if (is_array($func)) - $allowed=array_intersect( - array_map('strtoupper',get_class_methods($func[0])), - explode('|',self::VERBS) - ); - header('Allow: '.implode(',',$allowed)); - $this->error(405); - } - else - user_error(sprintf(self::E_Method, - is_string($func)?$func:$this->stringify($func)), - E_USER_ERROR); - $obj=FALSE; - if (is_array($func)) { - $hooks=$this->split($hooks); - $obj=TRUE; - } - // Execute pre-route hook if any - if ($obj && $hooks && in_array($hook='beforeroute',$hooks) && - method_exists($func[0],$hook) && - call_user_func_array([$func[0],$hook],$args)===FALSE) - return FALSE; - // Execute callback - $out=call_user_func_array($func,$args?:[]); - if ($out===FALSE) - return FALSE; - // Execute post-route hook if any - if ($obj && $hooks && in_array($hook='afterroute',$hooks) && - method_exists($func[0],$hook) && - call_user_func_array([$func[0],$hook],$args)===FALSE) - return FALSE; - return $out; - } - - /** - * Execute specified callbacks in succession; Apply same arguments - * to all callbacks - * @return array - * @param $funcs array|string - * @param $args mixed - **/ - function chain($funcs,$args=NULL) { - $out=[]; - foreach (is_array($funcs)?$funcs:$this->split($funcs) as $func) - $out[]=$this->call($func,$args); - return $out; - } - - /** - * Execute specified callbacks in succession; Relay result of - * previous callback as argument to the next callback - * @return array - * @param $funcs array|string - * @param $args mixed - **/ - function relay($funcs,$args=NULL) { - foreach (is_array($funcs)?$funcs:$this->split($funcs) as $func) - $args=[$this->call($func,$args)]; - return array_shift($args); - } - - /** - * Configure framework according to .ini-style file settings; - * If optional 2nd arg is provided, template strings are interpreted - * @return object - * @param $source string|array - * @param $allow bool - **/ - function config($source,$allow=FALSE) { - if (is_string($source)) - $source=$this->split($source); - if ($allow) - $preview=Preview::instance(); - foreach ($source as $file) { - preg_match_all( - '/(?<=^|\n)(?:'. - '\[(?
.+?)\]|'. - '(?[^\h\r\n;].*?)\h*=\h*'. - '(?(?:\\\\\h*\r?\n|.+?)*)'. - ')(?=\r?\n|$)/', - $this->read($file), - $matches,PREG_SET_ORDER); - if ($matches) { - $sec='globals'; - $cmd=[]; - foreach ($matches as $match) { - if ($match['section']) { - $sec=$match['section']; - if (preg_match( - '/^(?!(?:global|config|route|map|redirect)s\b)'. - '((?:\.?\w)+)/i',$sec,$msec) && - !$this->exists($msec[0])) - $this->set($msec[0],NULL); - preg_match('/^(config|route|map|redirect)s\b|'. - '^((?:\.?\w)+)\s*\>\s*(.*)/i',$sec,$cmd); - continue; - } - if ($allow) - foreach (['lval','rval'] as $ndx) - $match[$ndx]=$preview-> - resolve($match[$ndx],NULL,0,FALSE,FALSE); - if (!empty($cmd)) { - isset($cmd[3])? - $this->call($cmd[3], - [$match['lval'],$match['rval'],$cmd[2]]): - call_user_func_array( - [$this,$cmd[1]], - array_merge([$match['lval']], - str_getcsv($cmd[1]=='config'? - $this->cast($match['rval']): - $match['rval'])) - ); - } - else { - $rval=preg_replace( - '/\\\\\h*(\r?\n)/','\1',$match['rval']); - $ttl=NULL; - if (preg_match('/^(.+)\|\h*(\d+)$/',$rval,$tmp)) { - array_shift($tmp); - list($rval,$ttl)=$tmp; - } - $args=array_map( - function($val) { - $val=$this->cast($val); - if (is_string($val)) - $val=strlen($val)? - preg_replace('/\\\\"/','"',$val): - NULL; - return $val; - }, - // Mark quoted strings with 0x00 whitespace - str_getcsv(preg_replace( - '/(?[^:]+)(?:\:(?.+))?/', - $sec,$parts); - $func=isset($parts['func'])?$parts['func']:NULL; - $custom=(strtolower($parts['section'])!='globals'); - if ($func) - $args=[$this->call($func,$args)]; - if (count($args)>1) - $args=[$args]; - if (isset($ttl)) - $args=array_merge($args,[$ttl]); - call_user_func_array( - [$this,'set'], - array_merge( - [ - ($custom?($parts['section'].'.'):''). - $match['lval'] - ], - $args - ) - ); - } - } - } - } - return $this; - } - - /** - * Create mutex, invoke callback then drop ownership when done - * @return mixed - * @param $id string - * @param $func callback - * @param $args mixed - **/ - function mutex($id,$func,$args=NULL) { - if (!is_dir($tmp=$this->hive['TEMP'])) - mkdir($tmp,self::MODE,TRUE); - // Use filesystem lock - if (is_file($lock=$tmp. - $this->get('SEED').'.'.$this->hash($id).'.lock') && - filemtime($lock)+ini_get('max_execution_time')locks[$id]=$lock; - $out=$this->call($func,$args); - fclose($handle); - @unlink($lock); - unset($this->locks[$id]); - return $out; - } - - /** - * Read file (with option to apply Unix LF as standard line ending) - * @return string - * @param $file string - * @param $lf bool - **/ - function read($file,$lf=FALSE) { - $out=@file_get_contents($file); - return $lf?preg_replace('/\r\n|\r/',"\n",$out):$out; - } - - /** - * Exclusive file write - * @return int|FALSE - * @param $file string - * @param $data mixed - * @param $append bool - **/ - function write($file,$data,$append=FALSE) { - return file_put_contents($file,$data,LOCK_EX|($append?FILE_APPEND:0)); - } - - /** - * Apply syntax highlighting - * @return string - * @param $text string - **/ - function highlight($text) { - $out=''; - $pre=FALSE; - $text=trim($text); - if ($text && !preg_match('/^<\?php/',$text)) { - $text=''. - $this->encode($token[1]).''): - ('>'.$this->encode($token))). - ''; - return $out?(''.$out.''):$text; - } - - /** - * Dump expression with syntax highlighting - * @return NULL - * @param $expr mixed - **/ - function dump($expr) { - echo $this->highlight($this->stringify($expr)); - } - - /** - * Return path (and query parameters) relative to the base directory - * @return string - * @param $url string - **/ - function rel($url) { - return preg_replace('/^(?:https?:\/\/)?'. - preg_quote($this->hive['BASE'],'/').'(\/.*|$)/','\1',$url); - } - - /** - * Namespace-aware class autoloader - * @return mixed - * @param $class string - **/ - protected function autoload($class) { - $class=$this->fixslashes(ltrim($class,'\\')); - $func=NULL; - if (is_array($path=$this->hive['AUTOLOAD']) && - isset($path[1]) && is_callable($path[1])) - list($path,$func)=$path; - foreach ($this->split($this->hive['PLUGINS'].';'.$path) as $auto) - if ($func && is_file($file=$func($auto.$class).'.php') || - is_file($file=$auto.$class.'.php') || - is_file($file=$auto.strtolower($class).'.php') || - is_file($file=strtolower($auto.$class).'.php')) - return require($file); - } - - /** - * Execute framework/application shutdown sequence - * @param $cwd string - **/ - function unload($cwd) { - chdir($cwd); - if (!($error=error_get_last()) && - session_status()==PHP_SESSION_ACTIVE) - session_commit(); - foreach ($this->locks as $lock) - @unlink($lock); - $handler=$this->hive['UNLOAD']; - if ((!$handler || $this->call($handler,$this)===FALSE) && - $error && in_array($error['type'], - [E_ERROR,E_PARSE,E_CORE_ERROR,E_COMPILE_ERROR])) - // Fatal error detected - $this->error(500, - sprintf(self::E_Fatal,$error['message']),[$error]); - } - - /** - * Convenience method for checking hive key - * @return mixed - * @param $key string - **/ - function offsetexists($key) { - return $this->exists($key); - } - - /** - * Convenience method for assigning hive value - * @return mixed - * @param $key string - * @param $val scalar - **/ - function offsetset($key,$val) { - return $this->set($key,$val); - } - - /** - * Convenience method for retrieving hive value - * @return mixed - * @param $key string - **/ - function &offsetget($key) { - $val=&$this->ref($key); - return $val; - } - - /** - * Convenience method for removing hive key - * @return NULL - * @param $key string - **/ - function offsetunset($key) { - $this->clear($key); - } - - /** - * Alias for offsetexists() - * @return mixed - * @param $key string - **/ - function __isset($key) { - return $this->offsetexists($key); - } - - /** - * Alias for offsetset() - * @return mixed - * @param $key string - * @param $val mixed - **/ - function __set($key,$val) { - return $this->offsetset($key,$val); - } - - /** - * Alias for offsetget() - * @return mixed - * @param $key string - **/ - function &__get($key) { - $val=&$this->offsetget($key); - return $val; - } - - /** - * Alias for offsetunset() - * @return mixed - * @param $key string - **/ - function __unset($key) { - $this->offsetunset($key); - } - - /** - * Call function identified by hive key - * @return mixed - * @param $key string - * @param $args array - **/ - function __call($key,array $args) { - if ($this->exists($key,$val)) - return call_user_func_array($val,$args); - user_error(sprintf(self::E_Method,$key),E_USER_ERROR); - } - - //! Prohibit cloning - private function __clone() { - } - - //! Bootstrap - function __construct() { - // Managed directives - ini_set('default_charset',$charset='UTF-8'); - if (extension_loaded('mbstring')) - mb_internal_encoding($charset); - ini_set('display_errors',0); - // Deprecated directives - @ini_set('magic_quotes_gpc',0); - @ini_set('register_globals',0); - // Intercept errors/exceptions; PHP5.3-compatible - $check=error_reporting((E_ALL|E_STRICT)&~(E_NOTICE|E_USER_NOTICE)); - set_exception_handler( - function($obj) { - $this->hive['EXCEPTION']=$obj; - $this->error(500, - $obj->getmessage().' '. - '['.$obj->getFile().':'.$obj->getLine().']', - $obj->gettrace()); - } - ); - set_error_handler( - function($level,$text,$file,$line) { - if ($level & error_reporting()) - $this->error(500,$text,NULL,$level); - } - ); - if (!isset($_SERVER['SERVER_NAME']) || $_SERVER['SERVER_NAME']==='') - $_SERVER['SERVER_NAME']=gethostname(); - $headers=[]; - if ($cli=PHP_SAPI=='cli') { - // Emulate HTTP request - $_SERVER['REQUEST_METHOD']='GET'; - if (!isset($_SERVER['argv'][1])) { - $_SERVER['argc']++; - $_SERVER['argv'][1]='/'; - } - $req=$query=''; - if (substr($_SERVER['argv'][1],0,1)=='/') { - $req=$_SERVER['argv'][1]; - $query=parse_url($req,PHP_URL_QUERY); - } else { - foreach($_SERVER['argv'] as $i=>$arg) { - if (!$i) continue; - if (preg_match('/^\-(\-)?(\w+)(?:\=(.*))?$/',$arg,$m)) { - foreach($m[1]?[$m[2]]:str_split($m[2]) as $k) - $query.=($query?'&':'').urlencode($k).'='; - if (isset($m[3])) - $query.=urlencode($m[3]); - } else - $req.='/'.$arg; - } - if (!$req) - $req='/'; - if ($query) - $req.='?'.$query; - } - $_SERVER['REQUEST_URI']=$req; - parse_str($query,$GLOBALS['_GET']); - } - elseif (function_exists('getallheaders')) { - foreach (getallheaders() as $key=>$val) { - $tmp=strtoupper(strtr($key,'-','_')); - // TODO: use ucwords delimiters for php 5.4.32+ & 5.5.16+ - $key=strtr(ucwords(strtolower(strtr($key,'-',' '))),' ','-'); - $headers[$key]=$val; - if (isset($_SERVER['HTTP_'.$tmp])) - $headers[$key]=&$_SERVER['HTTP_'.$tmp]; - } - } - else { - if (isset($_SERVER['CONTENT_LENGTH'])) - $headers['Content-Length']=&$_SERVER['CONTENT_LENGTH']; - if (isset($_SERVER['CONTENT_TYPE'])) - $headers['Content-Type']=&$_SERVER['CONTENT_TYPE']; - foreach (array_keys($_SERVER) as $key) - if (substr($key,0,5)=='HTTP_') - $headers[strtr(ucwords(strtolower(strtr( - substr($key,5),'_',' '))),' ','-')]=&$_SERVER[$key]; - } - if (isset($headers['X-HTTP-Method-Override'])) - $_SERVER['REQUEST_METHOD']=$headers['X-HTTP-Method-Override']; - elseif ($_SERVER['REQUEST_METHOD']=='POST' && isset($_POST['_method'])) - $_SERVER['REQUEST_METHOD']=strtoupper($_POST['_method']); - $scheme=isset($_SERVER['HTTPS']) && $_SERVER['HTTPS']=='on' || - isset($headers['X-Forwarded-Proto']) && - $headers['X-Forwarded-Proto']=='https'?'https':'http'; - // Create hive early on to expose header methods - $this->hive=['HEADERS'=>&$headers]; - if (function_exists('apache_setenv')) { - // Work around Apache pre-2.4 VirtualDocumentRoot bug - $_SERVER['DOCUMENT_ROOT']=str_replace($_SERVER['SCRIPT_NAME'],'', - $_SERVER['SCRIPT_FILENAME']); - apache_setenv("DOCUMENT_ROOT",$_SERVER['DOCUMENT_ROOT']); - } - $_SERVER['DOCUMENT_ROOT']=realpath($_SERVER['DOCUMENT_ROOT']); - $base=''; - if (!$cli) - $base=rtrim($this->fixslashes( - dirname($_SERVER['SCRIPT_NAME'])),'/'); - $uri=parse_url((preg_match('/^\w+:\/\//',$_SERVER['REQUEST_URI'])?'': - $scheme.'://'.$_SERVER['SERVER_NAME']).$_SERVER['REQUEST_URI']); - $_SERVER['REQUEST_URI']=$uri['path']. - (isset($uri['query'])?'?'.$uri['query']:''). - (isset($uri['fragment'])?'#'.$uri['fragment']:''); - $path=preg_replace('/^'.preg_quote($base,'/').'/','',$uri['path']); - $jar=[ - 'expire'=>0, - 'lifetime'=>0, - 'path'=>$base?:'/', - 'domain'=>is_int(strpos($_SERVER['SERVER_NAME'],'.')) && - !filter_var($_SERVER['SERVER_NAME'],FILTER_VALIDATE_IP)? - $_SERVER['SERVER_NAME']:'', - 'secure'=>($scheme=='https'), - 'httponly'=>TRUE - ]; - $port=80; - if (isset($headers['X-Forwarded-Port'])) - $port=$headers['X-Forwarded-Port']; - elseif (isset($_SERVER['SERVER_PORT'])) - $port=$_SERVER['SERVER_PORT']; - // Default configuration - $this->hive+=[ - 'AGENT'=>$this->agent(), - 'AJAX'=>$this->ajax(), - 'ALIAS'=>NULL, - 'ALIASES'=>[], - 'AUTOLOAD'=>'./', - 'BASE'=>$base, - 'BITMASK'=>ENT_COMPAT, - 'BODY'=>NULL, - 'CACHE'=>FALSE, - 'CASELESS'=>TRUE, - 'CLI'=>$cli, - 'CORS'=>[ - 'headers'=>'', - 'origin'=>FALSE, - 'credentials'=>FALSE, - 'expose'=>FALSE, - 'ttl'=>0 - ], - 'DEBUG'=>0, - 'DIACRITICS'=>[], - 'DNSBL'=>'', - 'EMOJI'=>[], - 'ENCODING'=>$charset, - 'ERROR'=>NULL, - 'ESCAPE'=>TRUE, - 'EXCEPTION'=>NULL, - 'EXEMPT'=>NULL, - 'FALLBACK'=>$this->fallback, - 'FORMATS'=>[], - 'FRAGMENT'=>isset($uri['fragment'])?$uri['fragment']:'', - 'HALT'=>TRUE, - 'HIGHLIGHT'=>FALSE, - 'HOST'=>$_SERVER['SERVER_NAME'], - 'IP'=>$this->ip(), - 'JAR'=>$jar, - 'LANGUAGE'=>isset($headers['Accept-Language'])? - $this->language($headers['Accept-Language']): - $this->fallback, - 'LOCALES'=>'./', - 'LOGGABLE'=>'*', - 'LOGS'=>'./', - 'MB'=>extension_loaded('mbstring'), - 'ONERROR'=>NULL, - 'ONREROUTE'=>NULL, - 'PACKAGE'=>self::PACKAGE, - 'PARAMS'=>[], - 'PATH'=>$path, - 'PATTERN'=>NULL, - 'PLUGINS'=>$this->fixslashes(__DIR__).'/', - 'PORT'=>$port, - 'PREFIX'=>NULL, - 'PREMAP'=>'', - 'QUERY'=>isset($uri['query'])?$uri['query']:'', - 'QUIET'=>FALSE, - 'RAW'=>FALSE, - 'REALM'=>$scheme.'://'.$_SERVER['SERVER_NAME']. - ($port && !in_array($port,[80,443])?(':'.$port):''). - $_SERVER['REQUEST_URI'], - 'RESPONSE'=>'', - 'ROOT'=>$_SERVER['DOCUMENT_ROOT'], - 'ROUTES'=>[], - 'SCHEME'=>$scheme, - 'SEED'=>$this->hash($_SERVER['SERVER_NAME'].$base), - 'SERIALIZER'=>extension_loaded($ext='igbinary')?$ext:'php', - 'TEMP'=>'tmp/', - 'TIME'=>&$_SERVER['REQUEST_TIME_FLOAT'], - 'TZ'=>@date_default_timezone_get(), - 'UI'=>'./', - 'UNLOAD'=>NULL, - 'UPLOADS'=>'./', - 'URI'=>&$_SERVER['REQUEST_URI'], - 'VERB'=>&$_SERVER['REQUEST_METHOD'], - 'VERSION'=>self::VERSION, - 'XFRAME'=>'SAMEORIGIN' - ]; - if (!headers_sent() && session_status()!=PHP_SESSION_ACTIVE) { - unset($jar['expire']); - session_cache_limiter(''); - call_user_func_array('session_set_cookie_params',$jar); - } - if (PHP_SAPI=='cli-server' && - preg_match('/^'.preg_quote($base,'/').'$/',$this->hive['URI'])) - $this->reroute('/'); - if (ini_get('auto_globals_jit')) - // Override setting - $GLOBALS+=['_ENV'=>$_ENV,'_REQUEST'=>$_REQUEST]; - // Sync PHP globals with corresponding hive keys - $this->init=$this->hive; - foreach (explode('|',self::GLOBALS) as $global) { - $sync=$this->sync($global); - $this->init+=[ - $global=>preg_match('/SERVER|ENV/',$global)?$sync:[] - ]; - } - if ($check && $error=error_get_last()) - // Error detected - $this->error(500, - sprintf(self::E_Fatal,$error['message']),[$error]); - date_default_timezone_set($this->hive['TZ']); - // Register framework autoloader - spl_autoload_register([$this,'autoload']); - // Register shutdown handler - register_shutdown_function([$this,'unload'],getcwd()); - } - -} - -//! Cache engine -class Cache extends Prefab { - - protected - //! Cache DSN - $dsn, - //! Prefix for cache entries - $prefix, - //! MemCache or Redis object - $ref; - - /** - * Return timestamp and TTL of cache entry or FALSE if not found - * @return array|FALSE - * @param $key string - * @param $val mixed - **/ - function exists($key,&$val=NULL) { - $fw=Base::instance(); - if (!$this->dsn) - return FALSE; - $ndx=$this->prefix.'.'.$key; - $parts=explode('=',$this->dsn,2); - switch ($parts[0]) { - case 'apc': - case 'apcu': - $raw=call_user_func($parts[0].'_fetch',$ndx); - break; - case 'redis': - $raw=$this->ref->get($ndx); - break; - case 'memcache': - $raw=memcache_get($this->ref,$ndx); - break; - case 'memcached': - $raw=$this->ref->get($ndx); - break; - case 'wincache': - $raw=wincache_ucache_get($ndx); - break; - case 'xcache': - $raw=xcache_get($ndx); - break; - case 'folder': - $raw=$fw->read($parts[1].$ndx); - break; - } - if (!empty($raw)) { - list($val,$time,$ttl)=(array)$fw->unserialize($raw); - if ($ttl===0 || $time+$ttl>microtime(TRUE)) - return [$time,$ttl]; - $val=null; - $this->clear($key); - } - return FALSE; - } - - /** - * Store value in cache - * @return mixed|FALSE - * @param $key string - * @param $val mixed - * @param $ttl int - **/ - function set($key,$val,$ttl=0) { - $fw=Base::instance(); - if (!$this->dsn) - return TRUE; - $ndx=$this->prefix.'.'.$key; - if ($cached=$this->exists($key)) - $ttl=$cached[1]; - $data=$fw->serialize([$val,microtime(TRUE),$ttl]); - $parts=explode('=',$this->dsn,2); - switch ($parts[0]) { - case 'apc': - case 'apcu': - return call_user_func($parts[0].'_store',$ndx,$data,$ttl); - case 'redis': - return $this->ref->set($ndx,$data,$ttl?['ex'=>$ttl]:[]); - case 'memcache': - return memcache_set($this->ref,$ndx,$data,0,$ttl); - case 'memcached': - return $this->ref->set($ndx,$data,$ttl); - case 'wincache': - return wincache_ucache_set($ndx,$data,$ttl); - case 'xcache': - return xcache_set($ndx,$data,$ttl); - case 'folder': - return $fw->write($parts[1]. - str_replace(['/','\\'],'',$ndx),$data); - } - return FALSE; - } - - /** - * Retrieve value of cache entry - * @return mixed|FALSE - * @param $key string - **/ - function get($key) { - return $this->dsn && $this->exists($key,$data)?$data:FALSE; - } - - /** - * Delete cache entry - * @return bool - * @param $key string - **/ - function clear($key) { - if (!$this->dsn) - return; - $ndx=$this->prefix.'.'.$key; - $parts=explode('=',$this->dsn,2); - switch ($parts[0]) { - case 'apc': - case 'apcu': - return call_user_func($parts[0].'_delete',$ndx); - case 'redis': - return $this->ref->del($ndx); - case 'memcache': - return memcache_delete($this->ref,$ndx); - case 'memcached': - return $this->ref->delete($ndx); - case 'wincache': - return wincache_ucache_delete($ndx); - case 'xcache': - return xcache_unset($ndx); - case 'folder': - return @unlink($parts[1].$ndx); - } - return FALSE; - } - - /** - * Clear contents of cache backend - * @return bool - * @param $suffix string - **/ - function reset($suffix=NULL) { - if (!$this->dsn) - return TRUE; - $regex='/'.preg_quote($this->prefix.'.','/').'.*'. - preg_quote($suffix,'/').'/'; - $parts=explode('=',$this->dsn,2); - switch ($parts[0]) { - case 'apc': - case 'apcu': - $info=call_user_func($parts[0].'_cache_info', - $parts[0]=='apcu'?FALSE:'user'); - if (!empty($info['cache_list'])) { - $key=array_key_exists('info', - $info['cache_list'][0])?'info':'key'; - foreach ($info['cache_list'] as $item) - if (preg_match($regex,$item[$key])) - call_user_func($parts[0].'_delete',$item[$key]); - } - return TRUE; - case 'redis': - $keys=$this->ref->keys($this->prefix.'.*'.$suffix); - foreach($keys as $key) - $this->ref->del($key); - return TRUE; - case 'memcache': - foreach (memcache_get_extended_stats( - $this->ref,'slabs') as $slabs) - foreach (array_filter(array_keys($slabs),'is_numeric') - as $id) - foreach (memcache_get_extended_stats( - $this->ref,'cachedump',$id) as $data) - if (is_array($data)) - foreach (array_keys($data) as $key) - if (preg_match($regex,$key)) - memcache_delete($this->ref,$key); - return TRUE; - case 'memcached': - foreach ($this->ref->getallkeys()?:[] as $key) - if (preg_match($regex,$key)) - $this->ref->delete($key); - return TRUE; - case 'wincache': - $info=wincache_ucache_info(); - foreach ($info['ucache_entries'] as $item) - if (preg_match($regex,$item['key_name'])) - wincache_ucache_delete($item['key_name']); - return TRUE; - case 'xcache': - if ($suffix && !ini_get('xcache.admin.enable_auth')) { - $cnt=xcache_count(XC_TYPE_VAR); - for ($i=0;$i<$cnt;$i++) { - $list=xcache_list(XC_TYPE_VAR,$i); - foreach ($list['cache_list'] as $item) - if (preg_match($regex,$item['name'])) - xcache_unset($item['name']); - } - } else - xcache_unset_by_prefix($this->prefix.'.'); - return TRUE; - case 'folder': - if ($glob=@glob($parts[1].'*')) - foreach ($glob as $file) - if (preg_match($regex,basename($file))) - @unlink($file); - return TRUE; - } - return FALSE; - } - - /** - * Load/auto-detect cache backend - * @return string - * @param $dsn bool|string - * @param $seed bool|string - **/ - function load($dsn,$seed=NULL) { - $fw=Base::instance(); - if ($dsn=trim($dsn)) { - if (preg_match('/^redis=(.+)/',$dsn,$parts) && - extension_loaded('redis')) { - list($host,$port,$db)=explode(':',$parts[1])+[1=>6379,2=>NULL]; - $this->ref=new Redis; - if(!$this->ref->connect($host,$port,2)) - $this->ref=NULL; - if(isset($db)) - $this->ref->select($db); - } - elseif (preg_match('/^memcache=(.+)/',$dsn,$parts) && - extension_loaded('memcache')) - foreach ($fw->split($parts[1]) as $server) { - list($host,$port)=explode(':',$server)+[1=>11211]; - if (empty($this->ref)) - $this->ref=@memcache_connect($host,$port)?:NULL; - else - memcache_add_server($this->ref,$host,$port); - } - elseif (preg_match('/^memcached=(.+)/',$dsn,$parts) && - extension_loaded('memcached')) - foreach ($fw->split($parts[1]) as $server) { - list($host,$port)=explode(':',$server)+[1=>11211]; - if (empty($this->ref)) - $this->ref=new Memcached(); - $this->ref->addServer($host,$port); - } - if (empty($this->ref) && !preg_match('/^folder\h*=/',$dsn)) - $dsn=($grep=preg_grep('/^(apc|wincache|xcache)/', - array_map('strtolower',get_loaded_extensions())))? - // Auto-detect - current($grep): - // Use filesystem as fallback - ('folder='.$fw->TEMP.'cache/'); - if (preg_match('/^folder\h*=\h*(.+)/',$dsn,$parts) && - !is_dir($parts[1])) - mkdir($parts[1],Base::MODE,TRUE); - } - $this->prefix=$seed?:$fw->SEED; - return $this->dsn=$dsn; - } - - /** - * Class constructor - * @param $dsn bool|string - **/ - function __construct($dsn=FALSE) { - if ($dsn) - $this->load($dsn); - } - -} - -//! View handler -class View extends Prefab { - - private - //! Temporary hive - $temp; - - protected - //! Template file - $file, - //! Post-rendering handler - $trigger, - //! Nesting level - $level=0; - - /** @var \Base Framework instance */ - protected $fw; - - function __construct() { - $this->fw=\Base::instance(); - } - - /** - * Encode characters to equivalent HTML entities - * @return string - * @param $arg mixed - **/ - function esc($arg) { - return $this->fw->recursive($arg, - function($val) { - return is_string($val)?$this->fw->encode($val):$val; - } - ); - } - - /** - * Decode HTML entities to equivalent characters - * @return string - * @param $arg mixed - **/ - function raw($arg) { - return $this->fw->recursive($arg, - function($val) { - return is_string($val)?$this->fw->decode($val):$val; - } - ); - } - - /** - * Create sandbox for template execution - * @return string - * @param $hive array - * @param $mime string - **/ - protected function sandbox(array $hive=NULL,$mime=NULL) { - $fw=$this->fw; - $implicit=FALSE; - if (is_null($hive)) { - $implicit=TRUE; - $hive=$fw->hive(); - } - if ($this->level<1 || $implicit) { - if (!$fw->CLI && $mime && !headers_sent() && - !preg_grep ('/^Content-Type:/',headers_list())) - header('Content-Type: '.$mime.'; '. - 'charset='.$fw->ENCODING); - if ($fw->ESCAPE) - $hive=$this->esc($hive); - if (isset($hive['ALIASES'])) - $hive['ALIASES']=$fw->build($hive['ALIASES']); - } - $this->temp=$hive; - unset($fw,$hive,$implicit,$mime); - extract($this->temp); - $this->temp=NULL; - $this->level++; - ob_start(); - require($this->file); - $this->level--; - return ob_get_clean(); - } - - /** - * Render template - * @return string - * @param $file string - * @param $mime string - * @param $hive array - * @param $ttl int - **/ - function render($file,$mime='text/html',array $hive=NULL,$ttl=0) { - $fw=$this->fw; - $cache=Cache::instance(); - foreach ($fw->split($fw->UI) as $dir) { - if ($cache->exists($hash=$fw->hash($dir.$file),$data)) - return $data; - if (is_file($this->file=$fw->fixslashes($dir.$file))) { - if (isset($_COOKIE[session_name()]) && - !headers_sent() && session_status()!=PHP_SESSION_ACTIVE) - session_start(); - $fw->sync('SESSION'); - $data=$this->sandbox($hive,$mime); - if (isset($this->trigger['afterrender'])) - foreach($this->trigger['afterrender'] as $func) - $data=$fw->call($func,[$data, $dir.$file]); - if ($ttl) - $cache->set($hash,$data,$ttl); - return $data; - } - } - user_error(sprintf(Base::E_Open,$file),E_USER_ERROR); - } - - /** - * post rendering handler - * @param $func callback - */ - function afterrender($func) { - $this->trigger['afterrender'][]=$func; - } - -} - -//! Lightweight template engine -class Preview extends View { - - protected - //! token filter - $filter=[ - 'c'=>'$this->c', - 'esc'=>'$this->esc', - 'raw'=>'$this->raw', - 'export'=>'Base::instance()->export', - 'alias'=>'Base::instance()->alias', - 'format'=>'Base::instance()->format' - ]; - - protected - //! newline interpolation - $interpolation=true; - - /** - * Enable/disable markup parsing interpolation - * mainly used for adding appropriate newlines - * @param $bool bool - */ - function interpolation($bool) { - $this->interpolation=$bool; - } - - /** - * Return C-locale equivalent of number - * @return string - * @param $val int|float - **/ - function c($val) { - $locale=setlocale(LC_NUMERIC,0); - setlocale(LC_NUMERIC,'C'); - $out=(string)(float)$val; - $locale=setlocale(LC_NUMERIC,$locale); - return $out; - } - - /** - * Convert token to variable - * @return string - * @param $str string - **/ - function token($str) { - $fw=$this->fw; - $str=trim(preg_replace('/\{\{(.+?)\}\}/s',trim('\1'), - $fw->compile($str))); - if (preg_match('/^(.+)(?split(trim($parts[2],"\xC2\xA0")) as $func) - $str=((empty($this->filter[$cmd=$func]) && - function_exists($cmd)) || - is_string($cmd=$this->filter($func)))? - $cmd.'('.$str.')': - 'Base::instance()->'. - 'call($this->filter(\''.$func.'\'),['.$str.'])'; - } - return $str; - } - - /** - * Register or get (one specific or all) token filters - * @param string $key - * @param string|closure $func - * @return array|closure|string - */ - function filter($key=NULL,$func=NULL) { - if (!$key) - return array_keys($this->filter); - $key=strtolower($key); - if (!$func) - return $this->filter[$key]; - $this->filter[$key]=$func; - } - - /** - * Assemble markup - * @return string - * @param $node string - **/ - protected function build($node) { - return preg_replace_callback( - '/\{~(.+?)~\}|\{\*(.+?)\*\}|\{\-(.+?)\-\}|'. - '\{\{(.+?)\}\}((\r?\n)*)/s', - function($expr) { - if ($expr[1]) - $str='token($expr[1]).' ?>'; - elseif ($expr[2]) - return ''; - elseif ($expr[3]) - $str=$expr[3]; - else { - $str='token($expr[4])).')'. - ($this->interpolation? - (!empty($expr[6])?'."'.$expr[6].'"':''):'').' ?>'; - if (isset($expr[5])) - $str.=$expr[5]; - } - return $str; - }, - $node - ); - } - - /** - * Render template string - * @return string - * @param $node string|array - * @param $hive array - * @param $ttl int - * @param $persist bool - * @param $escape bool - **/ - function resolve($node,array $hive=NULL,$ttl=0,$persist=FALSE,$escape=NULL) { - $fw=$this->fw; - $cache=Cache::instance(); - if ($escape!==NULL) { - $esc=$fw->ESCAPE; - $fw->ESCAPE=$escape; - } - if ($ttl || $persist) - $hash=$fw->hash($fw->serialize($node)); - if ($ttl && $cache->exists($hash,$data)) - return $data; - if ($persist) { - if (!is_dir($tmp=$fw->TEMP)) - mkdir($tmp,Base::MODE,TRUE); - if (!is_file($this->file=($tmp. - $fw->SEED.'.'.$hash.'.php'))) - $fw->write($this->file,$this->build($node)); - if (isset($_COOKIE[session_name()]) && - !headers_sent() && session_status()!=PHP_SESSION_ACTIVE) - session_start(); - $fw->sync('SESSION'); - $data=$this->sandbox($hive); - } - else { - if (!$hive) - $hive=$fw->hive(); - if ($fw->ESCAPE) - $hive=$this->esc($hive); - extract($hive); - unset($hive); - ob_start(); - eval(' ?>'.$this->build($node).'set($hash,$data,$ttl); - if ($escape!==NULL) - $fw->ESCAPE=$esc; - return $data; - } - - /** - * Parse template string - * @return string - * @param $text string - **/ - function parse($text) { - // Remove PHP code and comments - return preg_replace( - '/\h*<\?(?!xml)(?:php|\s*=)?.+?\?>\h*|'. - '\{\*.+?\*\}/is','', $text); - } - - /** - * Render template - * @return string - * @param $file string - * @param $mime string - * @param $hive array - * @param $ttl int - **/ - function render($file,$mime='text/html',array $hive=NULL,$ttl=0) { - $fw=$this->fw; - $cache=Cache::instance(); - if (!is_dir($tmp=$fw->TEMP)) - mkdir($tmp,Base::MODE,TRUE); - foreach ($fw->split($fw->UI) as $dir) { - if ($cache->exists($hash=$fw->hash($dir.$file),$data)) - return $data; - if (is_file($view=$fw->fixslashes($dir.$file))) { - if (!is_file($this->file=($tmp. - $fw->SEED.'.'.$fw->hash($view).'.php')) || - filemtime($this->file)read($view); - if (isset($this->trigger['beforerender'])) - foreach ($this->trigger['beforerender'] as $func) - $contents=$fw->call($func, [$contents, $view]); - $text=$this->parse($contents); - $fw->write($this->file,$this->build($text)); - } - if (isset($_COOKIE[session_name()]) && - !headers_sent() && session_status()!=PHP_SESSION_ACTIVE) - session_start(); - $fw->sync('SESSION'); - $data=$this->sandbox($hive,$mime); - if(isset($this->trigger['afterrender'])) - foreach ($this->trigger['afterrender'] as $func) - $data=$fw->call($func, [$data, $view]); - if ($ttl) - $cache->set($hash,$data,$ttl); - return $data; - } - } - user_error(sprintf(Base::E_Open,$file),E_USER_ERROR); - } - - /** - * post rendering handler - * @param $func callback - */ - function beforerender($func) { - $this->trigger['beforerender'][]=$func; - } - -} - -//! ISO language/country codes -class ISO extends Prefab { - - //@{ ISO 3166-1 country codes - const - CC_af='Afghanistan', - CC_ax='Åland Islands', - CC_al='Albania', - CC_dz='Algeria', - CC_as='American Samoa', - CC_ad='Andorra', - CC_ao='Angola', - CC_ai='Anguilla', - CC_aq='Antarctica', - CC_ag='Antigua and Barbuda', - CC_ar='Argentina', - CC_am='Armenia', - CC_aw='Aruba', - CC_au='Australia', - CC_at='Austria', - CC_az='Azerbaijan', - CC_bs='Bahamas', - CC_bh='Bahrain', - CC_bd='Bangladesh', - CC_bb='Barbados', - CC_by='Belarus', - CC_be='Belgium', - CC_bz='Belize', - CC_bj='Benin', - CC_bm='Bermuda', - CC_bt='Bhutan', - CC_bo='Bolivia', - CC_bq='Bonaire, Sint Eustatius and Saba', - CC_ba='Bosnia and Herzegovina', - CC_bw='Botswana', - CC_bv='Bouvet Island', - CC_br='Brazil', - CC_io='British Indian Ocean Territory', - CC_bn='Brunei Darussalam', - CC_bg='Bulgaria', - CC_bf='Burkina Faso', - CC_bi='Burundi', - CC_kh='Cambodia', - CC_cm='Cameroon', - CC_ca='Canada', - CC_cv='Cape Verde', - CC_ky='Cayman Islands', - CC_cf='Central African Republic', - CC_td='Chad', - CC_cl='Chile', - CC_cn='China', - CC_cx='Christmas Island', - CC_cc='Cocos (Keeling) Islands', - CC_co='Colombia', - CC_km='Comoros', - CC_cg='Congo', - CC_cd='Congo, The Democratic Republic of', - CC_ck='Cook Islands', - CC_cr='Costa Rica', - CC_ci='Côte d\'ivoire', - CC_hr='Croatia', - CC_cu='Cuba', - CC_cw='Curaçao', - CC_cy='Cyprus', - CC_cz='Czech Republic', - CC_dk='Denmark', - CC_dj='Djibouti', - CC_dm='Dominica', - CC_do='Dominican Republic', - CC_ec='Ecuador', - CC_eg='Egypt', - CC_sv='El Salvador', - CC_gq='Equatorial Guinea', - CC_er='Eritrea', - CC_ee='Estonia', - CC_et='Ethiopia', - CC_fk='Falkland Islands (Malvinas)', - CC_fo='Faroe Islands', - CC_fj='Fiji', - CC_fi='Finland', - CC_fr='France', - CC_gf='French Guiana', - CC_pf='French Polynesia', - CC_tf='French Southern Territories', - CC_ga='Gabon', - CC_gm='Gambia', - CC_ge='Georgia', - CC_de='Germany', - CC_gh='Ghana', - CC_gi='Gibraltar', - CC_gr='Greece', - CC_gl='Greenland', - CC_gd='Grenada', - CC_gp='Guadeloupe', - CC_gu='Guam', - CC_gt='Guatemala', - CC_gg='Guernsey', - CC_gn='Guinea', - CC_gw='Guinea-Bissau', - CC_gy='Guyana', - CC_ht='Haiti', - CC_hm='Heard Island and McDonald Islands', - CC_va='Holy See (Vatican City State)', - CC_hn='Honduras', - CC_hk='Hong Kong', - CC_hu='Hungary', - CC_is='Iceland', - CC_in='India', - CC_id='Indonesia', - CC_ir='Iran, Islamic Republic of', - CC_iq='Iraq', - CC_ie='Ireland', - CC_im='Isle of Man', - CC_il='Israel', - CC_it='Italy', - CC_jm='Jamaica', - CC_jp='Japan', - CC_je='Jersey', - CC_jo='Jordan', - CC_kz='Kazakhstan', - CC_ke='Kenya', - CC_ki='Kiribati', - CC_kp='Korea, Democratic People\'s Republic of', - CC_kr='Korea, Republic of', - CC_kw='Kuwait', - CC_kg='Kyrgyzstan', - CC_la='Lao People\'s Democratic Republic', - CC_lv='Latvia', - CC_lb='Lebanon', - CC_ls='Lesotho', - CC_lr='Liberia', - CC_ly='Libya', - CC_li='Liechtenstein', - CC_lt='Lithuania', - CC_lu='Luxembourg', - CC_mo='Macao', - CC_mk='Macedonia, The Former Yugoslav Republic of', - CC_mg='Madagascar', - CC_mw='Malawi', - CC_my='Malaysia', - CC_mv='Maldives', - CC_ml='Mali', - CC_mt='Malta', - CC_mh='Marshall Islands', - CC_mq='Martinique', - CC_mr='Mauritania', - CC_mu='Mauritius', - CC_yt='Mayotte', - CC_mx='Mexico', - CC_fm='Micronesia, Federated States of', - CC_md='Moldova, Republic of', - CC_mc='Monaco', - CC_mn='Mongolia', - CC_me='Montenegro', - CC_ms='Montserrat', - CC_ma='Morocco', - CC_mz='Mozambique', - CC_mm='Myanmar', - CC_na='Namibia', - CC_nr='Nauru', - CC_np='Nepal', - CC_nl='Netherlands', - CC_nc='New Caledonia', - CC_nz='New Zealand', - CC_ni='Nicaragua', - CC_ne='Niger', - CC_ng='Nigeria', - CC_nu='Niue', - CC_nf='Norfolk Island', - CC_mp='Northern Mariana Islands', - CC_no='Norway', - CC_om='Oman', - CC_pk='Pakistan', - CC_pw='Palau', - CC_ps='Palestinian Territory, Occupied', - CC_pa='Panama', - CC_pg='Papua New Guinea', - CC_py='Paraguay', - CC_pe='Peru', - CC_ph='Philippines', - CC_pn='Pitcairn', - CC_pl='Poland', - CC_pt='Portugal', - CC_pr='Puerto Rico', - CC_qa='Qatar', - CC_re='Réunion', - CC_ro='Romania', - CC_ru='Russian Federation', - CC_rw='Rwanda', - CC_bl='Saint Barthélemy', - CC_sh='Saint Helena, Ascension and Tristan da Cunha', - CC_kn='Saint Kitts and Nevis', - CC_lc='Saint Lucia', - CC_mf='Saint Martin (French Part)', - CC_pm='Saint Pierre and Miquelon', - CC_vc='Saint Vincent and The Grenadines', - CC_ws='Samoa', - CC_sm='San Marino', - CC_st='Sao Tome and Principe', - CC_sa='Saudi Arabia', - CC_sn='Senegal', - CC_rs='Serbia', - CC_sc='Seychelles', - CC_sl='Sierra Leone', - CC_sg='Singapore', - CC_sk='Slovakia', - CC_sx='Sint Maarten (Dutch Part)', - CC_si='Slovenia', - CC_sb='Solomon Islands', - CC_so='Somalia', - CC_za='South Africa', - CC_gs='South Georgia and The South Sandwich Islands', - CC_ss='South Sudan', - CC_es='Spain', - CC_lk='Sri Lanka', - CC_sd='Sudan', - CC_sr='Suriname', - CC_sj='Svalbard and Jan Mayen', - CC_sz='Swaziland', - CC_se='Sweden', - CC_ch='Switzerland', - CC_sy='Syrian Arab Republic', - CC_tw='Taiwan, Province of China', - CC_tj='Tajikistan', - CC_tz='Tanzania, United Republic of', - CC_th='Thailand', - CC_tl='Timor-Leste', - CC_tg='Togo', - CC_tk='Tokelau', - CC_to='Tonga', - CC_tt='Trinidad and Tobago', - CC_tn='Tunisia', - CC_tr='Turkey', - CC_tm='Turkmenistan', - CC_tc='Turks and Caicos Islands', - CC_tv='Tuvalu', - CC_ug='Uganda', - CC_ua='Ukraine', - CC_ae='United Arab Emirates', - CC_gb='United Kingdom', - CC_us='United States', - CC_um='United States Minor Outlying Islands', - CC_uy='Uruguay', - CC_uz='Uzbekistan', - CC_vu='Vanuatu', - CC_ve='Venezuela', - CC_vn='Viet Nam', - CC_vg='Virgin Islands, British', - CC_vi='Virgin Islands, U.S.', - CC_wf='Wallis and Futuna', - CC_eh='Western Sahara', - CC_ye='Yemen', - CC_zm='Zambia', - CC_zw='Zimbabwe'; - //@} - - //@{ ISO 639-1 language codes (Windows-compatibility subset) - const - LC_af='Afrikaans', - LC_am='Amharic', - LC_ar='Arabic', - LC_as='Assamese', - LC_ba='Bashkir', - LC_be='Belarusian', - LC_bg='Bulgarian', - LC_bn='Bengali', - LC_bo='Tibetan', - LC_br='Breton', - LC_ca='Catalan', - LC_co='Corsican', - LC_cs='Czech', - LC_cy='Welsh', - LC_da='Danish', - LC_de='German', - LC_dv='Divehi', - LC_el='Greek', - LC_en='English', - LC_es='Spanish', - LC_et='Estonian', - LC_eu='Basque', - LC_fa='Persian', - LC_fi='Finnish', - LC_fo='Faroese', - LC_fr='French', - LC_gd='Scottish Gaelic', - LC_gl='Galician', - LC_gu='Gujarati', - LC_he='Hebrew', - LC_hi='Hindi', - LC_hr='Croatian', - LC_hu='Hungarian', - LC_hy='Armenian', - LC_id='Indonesian', - LC_ig='Igbo', - LC_is='Icelandic', - LC_it='Italian', - LC_ja='Japanese', - LC_ka='Georgian', - LC_kk='Kazakh', - LC_km='Khmer', - LC_kn='Kannada', - LC_ko='Korean', - LC_lb='Luxembourgish', - LC_lo='Lao', - LC_lt='Lithuanian', - LC_lv='Latvian', - LC_mi='Maori', - LC_ml='Malayalam', - LC_mr='Marathi', - LC_ms='Malay', - LC_mt='Maltese', - LC_ne='Nepali', - LC_nl='Dutch', - LC_no='Norwegian', - LC_oc='Occitan', - LC_or='Oriya', - LC_pl='Polish', - LC_ps='Pashto', - LC_pt='Portuguese', - LC_qu='Quechua', - LC_ro='Romanian', - LC_ru='Russian', - LC_rw='Kinyarwanda', - LC_sa='Sanskrit', - LC_si='Sinhala', - LC_sk='Slovak', - LC_sl='Slovenian', - LC_sq='Albanian', - LC_sv='Swedish', - LC_ta='Tamil', - LC_te='Telugu', - LC_th='Thai', - LC_tk='Turkmen', - LC_tr='Turkish', - LC_tt='Tatar', - LC_uk='Ukrainian', - LC_ur='Urdu', - LC_vi='Vietnamese', - LC_wo='Wolof', - LC_yo='Yoruba', - LC_zh='Chinese'; - //@} - - /** - * Return list of languages indexed by ISO 639-1 language code - * @return array - **/ - function languages() { - return \Base::instance()->constants($this,'LC_'); - } - - /** - * Return list of countries indexed by ISO 3166-1 country code - * @return array - **/ - function countries() { - return \Base::instance()->constants($this,'CC_'); - } - -} - -//! Container for singular object instances -final class Registry { - - private static - //! Object catalog - $table; - - /** - * Return TRUE if object exists in catalog - * @return bool - * @param $key string - **/ - static function exists($key) { - return isset(self::$table[$key]); - } - - /** - * Add object to catalog - * @return object - * @param $key string - * @param $obj object - **/ - static function set($key,$obj) { - return self::$table[$key]=$obj; - } - - /** - * Retrieve object from catalog - * @return object - * @param $key string - **/ - static function get($key) { - return self::$table[$key]; - } - - /** - * Delete object from catalog - * @return NULL - * @param $key string - **/ - static function clear($key) { - self::$table[$key]=NULL; - unset(self::$table[$key]); - } - - //! Prohibit cloning - private function __clone() { - } - - //! Prohibit instantiation - private function __construct() { - } - -} - -return Base::instance(); diff --git a/app/lib/basket.php b/app/lib/basket.php deleted file mode 100644 index 08515ee2..00000000 --- a/app/lib/basket.php +++ /dev/null @@ -1,239 +0,0 @@ -. - -*/ - -//! Session-based pseudo-mapper -class Basket extends Magic { - - //@{ Error messages - const - E_Field='Undefined field %s'; - //@} - - protected - //! Session key - $key, - //! Current item identifier - $id, - //! Current item contents - $item=[]; - - /** - * Return TRUE if field is defined - * @return bool - * @param $key string - **/ - function exists($key) { - return array_key_exists($key,$this->item); - } - - /** - * Assign value to field - * @return scalar|FALSE - * @param $key string - * @param $val scalar - **/ - function set($key,$val) { - return ($key=='_id')?FALSE:($this->item[$key]=$val); - } - - /** - * Retrieve value of field - * @return scalar|FALSE - * @param $key string - **/ - function &get($key) { - if ($key=='_id') - return $this->id; - if (array_key_exists($key,$this->item)) - return $this->item[$key]; - user_error(sprintf(self::E_Field,$key),E_USER_ERROR); - return FALSE; - } - - /** - * Delete field - * @return NULL - * @param $key string - **/ - function clear($key) { - unset($this->item[$key]); - } - - /** - * Return items that match key/value pair; - * If no key/value pair specified, return all items - * @return array - * @param $key string - * @param $val mixed - **/ - function find($key=NULL,$val=NULL) { - $out=[]; - if (isset($_SESSION[$this->key])) { - foreach ($_SESSION[$this->key] as $id=>$item) - if (!isset($key) || - array_key_exists($key,$item) && $item[$key]==$val || - $key=='_id' && $id==$val) { - $obj=clone($this); - $obj->id=$id; - $obj->item=$item; - $out[]=$obj; - } - } - return $out; - } - - /** - * Return first item that matches key/value pair - * @return object|FALSE - * @param $key string - * @param $val mixed - **/ - function findone($key,$val) { - return ($data=$this->find($key,$val))?$data[0]:FALSE; - } - - /** - * Map current item to matching key/value pair - * @return array - * @param $key string - * @param $val mixed - **/ - function load($key,$val) { - if ($found=$this->find($key,$val)) { - $this->id=$found[0]->id; - return $this->item=$found[0]->item; - } - $this->reset(); - return []; - } - - /** - * Return TRUE if current item is empty/undefined - * @return bool - **/ - function dry() { - return !$this->item; - } - - /** - * Return number of items in basket - * @return int - **/ - function count() { - return isset($_SESSION[$this->key])?count($_SESSION[$this->key]):0; - } - - /** - * Save current item - * @return array - **/ - function save() { - if (!$this->id) - $this->id=uniqid(NULL,TRUE); - $_SESSION[$this->key][$this->id]=$this->item; - return $this->item; - } - - /** - * Erase item matching key/value pair - * @return bool - * @param $key string - * @param $val mixed - **/ - function erase($key,$val) { - $found=$this->find($key,$val); - if ($found && $id=$found[0]->id) { - unset($_SESSION[$this->key][$id]); - if ($id==$this->id) - $this->reset(); - return TRUE; - } - return FALSE; - } - - /** - * Reset cursor - * @return NULL - **/ - function reset() { - $this->id=NULL; - $this->item=[]; - } - - /** - * Empty basket - * @return NULL - **/ - function drop() { - unset($_SESSION[$this->key]); - } - - /** - * Hydrate item using hive array variable - * @return NULL - * @param $var array|string - **/ - function copyfrom($var) { - if (is_string($var)) - $var=\Base::instance()->$var; - foreach ($var as $key=>$val) - $this->set($key,$val); - } - - /** - * Populate hive array variable with item contents - * @return NULL - * @param $key string - **/ - function copyto($key) { - $var=&\Base::instance()->ref($key); - foreach ($this->item as $key=>$field) - $var[$key]=$field; - } - - /** - * Check out basket contents - * @return array - **/ - function checkout() { - if (isset($_SESSION[$this->key])) { - $out=$_SESSION[$this->key]; - unset($_SESSION[$this->key]); - return $out; - } - return []; - } - - /** - * Instantiate class - * @return void - * @param $key string - **/ - function __construct($key='basket') { - $this->key=$key; - if (session_status()!=PHP_SESSION_ACTIVE) - session_start(); - Base::instance()->sync('SESSION'); - $this->reset(); - } - -} diff --git a/app/lib/bcrypt.php b/app/lib/bcrypt.php deleted file mode 100644 index 23554719..00000000 --- a/app/lib/bcrypt.php +++ /dev/null @@ -1,96 +0,0 @@ -. -* -**/ - -/** -* Lightweight password hashing library (PHP 5.5+ only) -* @deprecated Use http://php.net/manual/en/ref.password.php instead -**/ -class Bcrypt extends Prefab { - - //@{ Error messages - const - E_CostArg='Invalid cost parameter', - E_SaltArg='Salt must be at least 22 alphanumeric characters'; - //@} - - //! Default cost - const - COST=10; - - /** - * Generate bcrypt hash of string - * @return string|FALSE - * @param $pw string - * @param $salt string - * @param $cost int - **/ - function hash($pw,$salt=NULL,$cost=self::COST) { - if ($cost<4 || $cost>31) - user_error(self::E_CostArg,E_USER_ERROR); - $len=22; - if ($salt) { - if (!preg_match('/^[[:alnum:]\.\/]{'.$len.',}$/',$salt)) - user_error(self::E_SaltArg,E_USER_ERROR); - } - else { - $raw=16; - $iv=''; - if (!$iv && extension_loaded('openssl')) - $iv=openssl_random_pseudo_bytes($raw); - if (!$iv) - for ($i=0;$i<$raw;$i++) - $iv.=chr(mt_rand(0,255)); - $salt=str_replace('+','.',base64_encode($iv)); - } - $salt=substr($salt,0,$len); - $hash=crypt($pw,sprintf('$2y$%02d$',$cost).$salt); - return strlen($hash)>13?$hash:FALSE; - } - - /** - * Check if password is still strong enough - * @return bool - * @param $hash string - * @param $cost int - **/ - function needs_rehash($hash,$cost=self::COST) { - list($pwcost)=sscanf($hash,"$2y$%d$"); - return $pwcost<$cost; - } - - /** - * Verify password against hash using timing attack resistant approach - * @return bool - * @param $pw string - * @param $hash string - **/ - function verify($pw,$hash) { - $val=crypt($pw,$hash); - $len=strlen($val); - if ($len!=strlen($hash) || $len<14) - return FALSE; - $out=0; - for ($i=0;$i<$len;$i++) - $out|=(ord($val[$i])^ord($hash[$i])); - return $out===0; - } - -} diff --git a/app/lib/changelog.txt b/app/lib/changelog.txt deleted file mode 100644 index 6a4ddd29..00000000 --- a/app/lib/changelog.txt +++ /dev/null @@ -1,509 +0,0 @@ -CHANGELOG - -3.4.0 (1 January 2015) -* NEW: [redirects] section -* NEW: Custom config sections -* NEW: User-defined AUTOLOAD function -* NEW: ONREROUTE variable -* NEW: Provision for in-memory Jig database (#727) -* Return run() result (#687) -* Pass result of run() to mock() (#687) -* Add port suffix to REALM variable -* New attribute in tag to extend hive -* Adjust unit tests and clean up templates -* Expose header-related methods -* Web->request: allow content array -* Preserve contents of ROUTES (#723) -* Smart detection of PHP functions in template expressions -* Add afterrender() hook to View class -* Implement ArrayAccess and magic properties on hive -* Improvement on mocking of superglobals and request body -* Fix table creation for pgsql handled sessions -* Add QUERY to hive -* Exempt E_NOTICE from default error_reporting() -* Add method to build alias routes from template, fixes #693 -* Fix dangerous caching of cookie values -* Fix multiple encoding in nested templates -* Fix node attribute parsing for empty/zero values -* Apply URL encoding on BASE to emulate v2 behavior (#123) -* Improve Base->map performance (#595) -* Add simple backtrace for fatal errors -* Count Cursor->load() results (#581) -* Add form field name to Web->receive() callback arguments -* Fix missing newlines after template expansion -* Fix overwrite of ENCODING variable -* limit & offset workaround for SQL Server, fixes #671 -* SQL Mapper->find: GROUP BY SQL compliant statement -* Bug fix: Missing abstract method fields() -* Bug fix: Auto escaping does not work with mapper objects (#710) -* Bug fix: 'with' attribute in tag raise error when no token - inside -* View rendering: optional Content-Type header -* Bug fix: Undefined variable: cache (#705) -* Bug fix: Routing does not work if project base path includes valid - special URI character (#704) -* Bug fix: Template hash collision (#702) -* Bug fix: Property visibility is incorrect (#697) -* Bug fix: Missing Allow header on HTTP 405 response -* Bug fix: Double quotes in lexicon files (#681) -* Bug fix: Space should not be mandatory in ICU pluralization format string -* Bug fix: Incorrect log entry when SQL query contains a question mark -* Bug fix: Error stack trace -* Bug fix: Cookie expiration (#665) -* Bug fix: OR operator (||) parsed incorrectly -* Bug fix: Routing treatment of * wildcard character -* Bug fix: Mapper copyfrom() method doesn't allow class/object callbacks - (#590) -* Bug fix: exists() creates elements/properties (#591) -* Bug fix: Wildcard in routing pattern consumes entire query string (#592) -* Bug fix: Workaround bug in latest MongoDB driver -* Bug fix: Default error handler silently fails for AJAX request with - DEBUG>0 (#599) -* Bug fix: Mocked BODY overwritten (#601) -* Bug fix: Undefined pkey (#607) - -3.3.0 (8 August 2014) -* NEW: Attribute in tag to extend hive -* NEW: Image overlay with transparency and alignment control -* NEW: Allow redirection of specified route patterns to a URL -* Bug fix: Missing AND operator in SQL Server schema query (Issue #576) -* Count Cursor->load() results (Feature request #581) -* Mapper copyfrom() method doesn't allow class/object callbacks (Issue #590) -* Bug fix: exists() creates elements/properties (Issue #591) -* Bug fix: Wildcard in routing pattern consumes entire query string - (Issue #592) -* Tweak Base->map performance (Issue #595) -* Bug fix: Default error handler silently fails for AJAX request with - DEBUG>0 (Issue #599) -* Bug fix: Mocked BODY overwritten (Issue #601) -* Bug fix: Undefined pkey (Issue #607) -* Bug fix: beforeupdate() position (Issue #633) -* Bug fix: exists() return value for cached keys -* Bug fix: Missing error code in UNLOAD handler -* Bug fix: OR operator (||) parsed incorrectly -* Add input name parameter to custom slug function -* Apply URL encoding on BASE to emulate v2 behavior (Issue #123) -* Reduce mapper update() iterations -* Bug fix: Routing treatment of * wildcard character -* SQL Mapper->find: GROUP BY SQL compliant statement -* Work around bug in latest MongoDB driver -* Work around probable race condition and optimize cache access -* View rendering: Optional Content-Type header -* Fix missing newlines after template expansion -* Add form field name to Web->receive() callback arguments -* Quick reference: add RAW variable - -3.2.2 (19 March 2014) -* NEW: Locales set automatically (Feature request #522) -* NEW: Mapper dbtype() -* NEW: before- and after- triggers for all mappers -* NEW: Decode HTML5 entities if PHP>5.3 detected (Feature request #552) -* NEW: Send credentials only if AUTH is present in the SMTP extension - response (Feature request #545) -* NEW: BITMASK variable to allow ENT_COMPAT override -* NEW: Redis support for caching -* Enable SMTP feature detection -* Enable extended ICU custom date format (Feature request #555) -* Enable custom time ICU format -* Add option to turn off session table creation (Feature request #557) -* Enhanced template token rendering and custom filters (Feature request - #550) -* Avert multiple loads in DB-managed sessions (Feature request #558) -* Add EXEC to associative fetch -* Bug fix: Building template tokens breaks on inline OR condition (Issue - #573) -* Bug fix: SMTP->send does not use the $log parameter (Issue #571) -* Bug fix: Allow setting sqlsrv primary keys on insert (Issue #570) -* Bug fix: Generated query for obtaining table schema in sqlsrv incorrect - (Bug #565) -* Bug fix: SQL mapper flag set even when value has not changed (Bug #562) -* Bug fix: Add XFRAME config option (Feature request #546) -* Bug fix: Incorrect parsing of comments (Issue #541) -* Bug fix: Multiple Set-Cookie headers (Issue #533) -* Bug fix: Mapper is dry after save() -* Bug fix: Prevent infinite loop when error handler is triggered - (Issue #361) -* Bug fix: Mapper tweaks not passing primary keys as arguments -* Bug fix: Zero indexes in dot-notated arrays fail to compile -* Bug fix: Prevent GROUP clause double-escaping -* Bug fix: Regression of zlib compression bug -* Bug fix: Method copyto() does not include ad hoc fields -* Check existence of OpenID mode (Issue #529) -* Generate a 404 when a tokenized class doesn't exist -* Fix SQLite quotes (Issue #521) -* Bug fix: BASE is incorrect on Windows - -3.2.1 (7 January 2014) -* NEW: EMOJI variable, UTF->translate(), UTF->emojify(), and UTF->strrev() -* Allow empty strings in config() -* Add support for turning off php://input buffering via RAW - (FALSE by default) -* Add Cursor->load() and Cursor->find() TTL support -* Support Web->receive() large file downloads via PUT -* ONERROR safety check -* Fix session CSRF cookie detection -* Framework object now passed to route handler contructors -* Allow override of DIACRITICS -* Various code optimizations -* Support log disabling (Issue #483) -* Implicit mapper load() on authentication -* Declare abstract methods for Cursor derivatives -* Support single-quoted HTML/XML attributes (Feature request #503) -* Relax property visibility of mappers and derivatives -* Deprecated: {{~ ~}} instructions and {{* *}} comments; Use {~ ~} and - {* *} instead -* Minor fix: Audit->ipv4() return value -* Bug fix: Backslashes in BASE not converted on Windows -* Bug fix: UTF->substr() with negative offset and specified length -* Bug fix: Replace named URL tokens on render() -* Bug fix: BASE is not empty when run from document root -* Bug fix: stringify() recursion - -3.2.0 (18 December 2013) -* NEW: Automatic CSRF protection (with IP and User-Agent checks) for - sessions mapped to SQL-, Jig-, Mongo- and Cache-based backends -* NEW: Named routes -* NEW: PATH variable; returns the URL relative to BASE -* NEW: Image->captcha() color parameters -* NEW: Ability to access MongoCuror thru the cursor() method -* NEW: Mapper->fields() method returns array of field names -* NEW: Mapper onload(), oninsert(), onupdate(), and onerase() event - listeners/triggers -* NEW: Preview class (a lightweight template engine) -* NEW: rel() method derives path from URL relative to BASE; useful for - rerouting -* NEW: PREFIX variable for prepending a string to a dictionary term; - Enable support for prefixed dictionary arrays and .ini files (Feature - request #440) -* NEW: Google static map plugin -* NEW: devoid() method -* Introduce clean(); similar to scrub(), except that arg is passed by - value -* Use $ttl for cookie expiration (Issue #457) -* Fix needs_rehash() cost comparison -* Add pass-by-reference argument to exists() so if method returns TRUE, - a subsequent get() is unnecessary -* Improve MySQL support -* Move esc(), raw(), and dupe() to View class where they more - appropriately belong -* Allow user-defined fields in SQL mapper constructor (Feature request - #450) -* Re-implement the pre-3.0 template resolve() feature -* Remove redundant instances of session_commit() -* Add support for input filtering in Mapper->copyfrom() -* Prevent intrusive behavior of Mapper->copyfrom() -* Support multiple SQL primary keys -* Support custom tag attributes/inline tokens defined at runtime - (Feature request #438) -* Broader support for HTTP basic auth -* Prohibit Jig _id clear() -* Add support for detailed stringify() output -* Add base directory to UI path as fallback -* Support Test->expect() chaining -* Support __tostring() in stringify() -* Trigger error on invalid CAPTCHA length (Issue #458) -* Bug fix: exists() pass-by-reference argument returns incorrect value -* Bug fix: DB Exec does not return affected row if query contains a - sub-SELECT (Issue #437) -* Improve seed generator and add code for detecting of acceptable - limits in Image->captcha() (Feature request #460) -* Add decimal format ICU extension -* Bug fix: 404-reported URI contains HTTP query -* Bug fix: Data type detection in DB->schema() -* Bug fix: TZ initialization -* Bug fix: paginate() passes incorrect argument to count() -* Bug fix: Incorrect query when reloading after insert() -* Bug fix: SQL preg_match error in pdo_type matching (Issue #447) -* Bug fix: Missing merge() function (Issue #444) -* Bug fix: BASE misdefined in command line mode -* Bug fix: Stringifying hive may run infinite (Issue #436) -* Bug fix: Incomplete stringify() when DEBUG<3 (Issue #432) -* Bug fix: Redirection of basic auth (Issue #430) -* Bug fix: Filter only PHP code (including short tags) in templates -* Bug fix: Markdown paragraph parser does not convert PHP code blocks - properly -* Bug fix: identicon() colors on same keys are randomized -* Bug fix: quotekey() fails on aliased keys -* Bug fix: Missing _id in Jig->find() return value -* Bug fix: LANGUAGE/LOCALES handling -* Bug fix: Loose comparison in stringify() - -3.1.2 (5 November 2013) -* Abandon .chm help format; Package API documentation in plain HTML; - (Launch lib/api/index.html in your browser) -* Deprecate BAIL in favor of HALT (default: TRUE) -* Revert to 3.1.0 autoload behavior; Add support for lowercase folder - names -* Allow Spring-style HTTP method overrides -* Add support for SQL Server-based sessions -* Capture full X-Forwarded-For header -* Add protection against malicious scripts; Extra check if file was really - uploaded -* Pass-thru page limit in return value of Cursor->paginate() -* Optimize code: Implement single-pass escaping -* Short circuit Jig->find() if source file is empty -* Bug fix: PHP globals passed by reference in hive() result (Issue #424) -* Bug fix: ZIP mime type incorrect behavior -* Bug fix: Jig->erase() filter malfunction -* Bug fix: Mongo->select() group -* Bug fix: Unknown bcrypt constant - -3.1.1 (13 October 2013) -* NEW: Support OpenID attribute exchange -* NEW: BAIL variable enables/disables continuance of execution on non-fatal - errors -* Deprecate BAIL in favor of HALT (default: FALSE) -* Add support for Oracle -* Mark cached queries in log (Feature Request #405) -* Implement Bcrypt->needs_reshash() -* Add entropy to SQL cache hash; Add uuid() method to DB backends -* Find real document root; Simplify debug paths -* Permit OpenID required fields to be declared as comma-separated string or - array -* Pass modified filename as argument to user-defined function in - Web->receive() -* Quote keys in optional SQL clauses (Issue #408) -* Allow UNLOAD to override fatal error detection (Issue #404) -* Mutex operator precedence error (Issue #406) -* Bug fix: exists() malfunction (Issue #401) -* Bug fix: Jig mapper triggers error when loading from CACHE (Issue #403) -* Bug fix: Array index check -* Bug fix: OpenID verified() return value -* Bug fix: Basket->find() should return a set of results (Issue #407); - Also implemented findone() for consistency with mappers -* Bug fix: PostgreSQL last insert ID (Issue #410) -* Bug fix: $port component URL overwritten by _socket() -* Bug fix: Calculation of elapsed time - -3.1.0 (20 August 2013) -* NEW: Web->filler() returns a chunk of text from the standard - Lorem Ipsum passage -* Change in behavior: Drop support for JSON serialization -* SQL->exec() now returns value of RETURNING clause -* Add support for $ttl argument in count() (Issue #393) -* Allow UI to be overridden by custom $path -* Return result of PDO primitives: begintransaction(), rollback(), and - commit() -* Full support for PHP 5.5 -* Flush buffers only when DEBUG=0 -* Support class->method, class::method, and lambda functions as - Web->basic() arguments -* Commit session on Basket->save() -* Optional enlargement in Image->resize() -* Support authentication on hosts running PHP-CGI -* Change visibility level of Cache properties -* Prevent ONERROR recursion -* Work around Apache pre-2.4 VirtualDocumentRoot bug -* Prioritize cURL in HTTP engine detection -* Bug fix: Minify tricky JS -* Bug fix: desktop() detection -* Bug fix: Double-slash on TEMP-relative path -* Bug fix: Cursor mapping of first() and last() records -* Bug fix: Premature end of Web->receive() on multiple files -* Bug fix: German umlaute to its corresponding grammatically-correct - equivalent - -3.0.9 (12 June 2013) -* NEW: Web->whois() -* NEW: Template tags -* Improve CACHE consistency -* Case-insensitive MIME type detection -* Support pre-PHP 5.3.4 in Prefab->instance() -* Refactor isdesktop() and ismobile(); Add isbot() -* Add support for Markdown strike-through -* Work around ODBC's lack of quote() support -* Remove useless Prefab destructor -* Support multiple cache instances -* Bug fix: Underscores in OpenId keys mangled -* Refactor format() -* Numerous tweaks -* Bug fix: MongoId object not preserved -* Bug fix: Double-quotes included in lexicon() string (Issue #341) -* Bug fix: UTF-8 formatting mangled on Windows (Issue #342) -* Bug fix: Cache->load() error when CACHE is FALSE (Issue #344) -* Bug fix: send() ternary expression -* Bug fix: Country code constants - -3.0.8 (17 May 2013) -* NEW: Bcrypt lightweight hashing library\ -* Return total number of records in superset in Cursor->paginate() -* ONERROR short-circuit (Enhancement #334) -* Apply quotes/backticks on DB identifiers -* Allow enabling/disabling of SQL log -* Normalize glob() behavior (Issue #330) -* Bug fix: mbstring 2-byte text truncation (Issue #325) -* Bug fix: Unsupported operand types (Issue #324) - -3.0.7 (2 May 2013) -* NEW: route() now allows an array of routing patterns as first argument; - support array as first argument of map() -* NEW: entropy() for calculating password strength (NIST 800-63) -* NEW: AGENT variable containing auto-detected HTTP user agent string -* NEW: ismobile() and isdesktop() methods -* NEW: Prefab class and descendants now accept constructor arguments -* Change in behavior: Cache->exists() now returns timestamp and TTL of - cache entry or FALSE if not found (Feature request #315) -* Preserve timestamp and TTL when updating cache entry (Feature request - #316) -* Improved currency formatting with C99 compliance -* Suppress unnecessary program halt at startup caused by misconfigured - server -* Add support for dashes in custom attribute names in templates -* Bug fix: Routing precedene (Issue #313) -* Bug fix: Remove Jig _id element from document property -* Bug fix: Web->rss() error when not enough items in the feed (Issue #299) -* Bug fix: Web engine fallback (Issue #300) -* Bug fix: and formatting -* Bug fix: Text rendering of text with trailing punctuation (Issue #303) -* Bug fix: Incorrect regex in SMTP - -3.0.6 (31 Mar 2013) -* NEW: Image->crop() -* Modify documentation blocks for PHPDoc interoperability -* Allow user to control whether Base->rerouet() uses a permanent or - temporary redirect -* Allow JAR elements to be set individually -* Refactor DB\SQL\Mapper->insert() to cope with autoincrement fields -* Trigger error when captcha() font is missing -* Remove unnecessary markdown regex recursion -* Check for scalars instead of DB\SQL strings -* Implement more comprehensive diacritics table -* Add option for disabling 401 errors when basic auth() fails -* Add markdown syntax highlighting for Apache configuration -* Markdown->render() deprecated to remove dependency on UI variable; - Feature replaced by Markdown->convert() to enable translation from - markdown string to HTML -* Optimize factory() code of all data mappers -* Apply backticks on MySQL table names -* Bug fix: Routing failure when directory path contains a tilde (Issue #291) -* Bug fix: Incorrect markdown parsing of strong/em sequences and inline HTML -* Bug fix: Cached page not echoed (Issue #278) -* Bug fix: Object properties not escaped when rendering -* Bug fix: OpenID error response ignored -* Bug fix: memcache_get_extended_stats() timeout -* Bug fix: Base->set() doesn't pass TTL to Cache->set() -* Bug fix: Base->scrub() ignores pass-thru * argument (Issue #274) - -3.0.5 (16 Feb 2013) -* NEW: Markdown class with PHP, HTML, and .ini syntax highlighting support -* NEW: Options for caching of select() and find() results -* NEW: Web->acceptable() -* Add send() argument for forcing downloads -* Provide read() option for applying Unix LF as standard line ending -* Bypass lexicon() call if LANGUAGE is undefined -* Load fallback language dictionary if LANGUAGE is undefined -* map() now checks existence of class/methods for non-tokenized URLs -* Improve error reporting of non-existent Template methods -* Address output buffer issues on some servers -* Bug fix: Setting DEBUG to 0 won't suppress the stack trace when the - content type is application/json (Issue #257) -* Bug fix: Image dump/render additional arguments shifted -* Bug fix: ob_clean() causes buffer issues with zlib compression -* Bug fix: minify() fails when commenting CSS @ rules (Issue #251) -* Bug fix: Handling of commas inside quoted strings -* Bug fix: Glitch in stringify() handling of closures -* Bug fix: dry() in mappers returns TRUE despite being hydrated by - factory() (Issue #265) -* Bug fix: expect() not handling flags correctly -* Bug fix: weather() fails when server is unreachable - -3.0.4 (29 Jan 2013) -* NEW: Support for ICU/CLDR pluralization -* NEW: User-defined FALLBACK language -* NEW: minify() now recognizes CSS @import directives -* NEW: UTF->bom() returns byte order mark for UTF-8 encoding -* Expose SQL\Mapper->schema() -* Change in behavior: Send error response as JSON string if AJAX request is - detected -* Deprecated: afind*() methods -* Discard output buffer in favor of debug output -* Make _id available to Jig queries -* Magic class now implements ArrayAccess -* Abort execution on startup errors -* Suppress stack trace on DEBUG level 0 -* Allow single = as equality operator in Jig query expressions -* Abort OpenID discovery if Web->request() fails -* Mimic PHP *RECURSION* in stringify() -* Modify Jig parser to allow wildcard-search using preg_match() -* Abort execution after error() execution -* Concatenate cached/uncached minify() iterations; Prevent spillover - caching of previous minify() result -* Work around obscure PHP session id regeneration bug -* Revise algorithm for Jig filter involving undefined fields (Issue #230) -* Use checkdnsrr() instead of gethostbyname() in DNSBL check -* Auto-adjust pagination to cursor boundaries -* Add Romanian diacritics -* Bug fix: Root namespace reference and sorting with undefined Jig fields -* Bug fix: Greedy receive() regex -* Bug fix: Default LANGUAGE always 'en' -* Bug fix: minify() hammers cache backend -* Bug fix: Previous values of primary keys not saved during factory() - instantiation -* Bug fix: Jig find() fails when search key is not present in all records -* Bug fix: Jig SORT_DESC (Issue #233) -* Bug fix: Error reporting (Issue #225) -* Bug fix: language() return value - -3.0.3 (29 Dec 2013) -* NEW: [ajax] and [sync] routing pattern modifiers -* NEW: Basket class (session-based pseudo-mapper, shopping cart, etc.) -* NEW: Test->message() method -* NEW: DB profiling via DB->log() -* NEW: Matrix->calendar() -* NEW: Audit->card() and Audit->mod10() for credit card verification -* NEW: Geo->weather() -* NEW: Base->relay() accepts comma-separated callbacks; but unlike - Base->chain(), result of previous callback becomes argument of the next -* Numerous performance tweaks -* Interoperability with new MongoClient class -* Web->request() now recognizes gzip and deflate encoding -* Differences in behavior of Web->request() engines rectified -* mutex() now uses an ID as argument (instead of filename to make it clear - that specified file is not the target being locked, but a primitive - cross-platform semaphore) -* DB\SQL\Mapper field _id now returned even in the absence of any - auto-increment field -* Magic class spinned off as a separate file -* ISO 3166-1 alpha-2 table updated -* Apache redirect emulation for PHP 5.4 CLI server mode -* Framework instance now passed as argument to any user-defined shutdown - function -* Cache engine now used as storage for Web->minify() output -* Flag added for enabling/disabling Image class filter history -* Bug fix: Trailing routing token consumes HTTP query -* Bug fix: LANGUAGE spills over to LOCALES setting -* Bug fix: Inconsistent dry() return value -* Bug fix: URL-decoding - -3.0.2 (23 Dec 2013) -* NEW: Syntax-highlighted stack traces via Base->highlight(); boolean - HIGHLIGHT global variable can be used to enable/disable this feature -* NEW: Template engine tag -* NEW: Image->captcha() -* NEW: DNSBL-based spammer detection (ported from 2.x) -* NEW: paginate(), first(), and last() methods for data mappers -* NEW: X-HTTP-Method-Override header now recognized -* NEW: Base->chain() method for executing callbacks in succession -* NEW: HOST global variable; derived from either $_SERVER['SERVER_NAME'] or - gethostname() -* NEW: REALM global variable representing full canonical URI -* NEW: Auth plug-in -* NEW: Pingback plug-in (implements both Pingback 1.0 protocol client and - server) -* NEW: DEBUG verbosity can now reach up to level 3; Base->stringify() drills - down to object properties at this setting -* NEW: HTTP PATCH method added to recognized HTTP ReST methods -* Web->slug() now trims trailing dashes -* Web->request() now allows relative local URLs as argument -* Use of PARAMS in route handlers now unnecessary; framework now passes two - arguments to route handlers: the framework object instance and an array - containing the captured values of tokens in route patterns -* Standardized timeout settings among Web->request() backends -* Session IDs regenerated for additional security -* Automatic HTTP 404 responses by Base->call() now restricted to route - handlers -* Empty comments in ini-style files now parsed properly -* Use file_get_contents() in methods that don't involve high concurrency - -3.0.1 (14 Dec 2013) -* Major rewrite of much of the framework's core features diff --git a/app/lib/cli/ws.php b/app/lib/cli/ws.php deleted file mode 100644 index b9c575bb..00000000 --- a/app/lib/cli/ws.php +++ /dev/null @@ -1,491 +0,0 @@ -. - -*/ - -namespace CLI; - -//! RFC6455 WebSocket server -class WS { - - const - //! UUID magic string - Magic='258EAFA5-E914-47DA-95CA-C5AB0DC85B11', - //! Max packet size - Packet=65536; - - //@{ Mask bits for first byte of header - const - Text=0x01, - Binary=0x02, - Close=0x08, - Ping=0x09, - Pong=0x0a, - OpCode=0x0f, - Finale=0x80; - //@} - - //@{ Mask bits for second byte of header - const - Length=0x7f; - //@} - - protected - $addr, - $ctx, - $wait, - $sockets, - $protocol, - $agents=[], - $events=[]; - - /** - * Allocate stream socket - * @return NULL - * @param $socket resource - **/ - function alloc($socket) { - if (is_bool($buf=$this->read($socket))) - return; - // Get WebSocket headers - $hdrs=[]; - $EOL="\r\n"; - $verb=NULL; - $uri=NULL; - foreach (explode($EOL,trim($buf)) as $line) - if (preg_match('/^(\w+)\s(.+)\sHTTP\/1\.\d$/', - trim($line),$match)) { - $verb=$match[1]; - $uri=$match[2]; - } - else - if (preg_match('/^(.+): (.+)/',trim($line),$match)) - // Standardize header - $hdrs[ - strtr( - ucwords( - strtolower( - strtr($match[1],'-',' ') - ) - ),' ','-' - ) - ]=$match[2]; - else { - $this->close($socket); - return; - } - if (empty($hdrs['Upgrade']) && - empty($hdrs['Sec-Websocket-Key'])) { - // Not a WebSocket request - if ($verb && $uri) - $this->write( - $socket, - 'HTTP/1.1 400 Bad Request'.$EOL. - 'Connection: close'.$EOL.$EOL - ); - $this->close($socket); - return; - } - // Handshake - $buf='HTTP/1.1 101 Switching Protocols'.$EOL. - 'Upgrade: websocket'.$EOL. - 'Connection: Upgrade'.$EOL; - if (isset($hdrs['Sec-Websocket-Protocol'])) - $buf.='Sec-WebSocket-Protocol: '. - $hdrs['Sec-Websocket-Protocol'].$EOL; - $buf.='Sec-WebSocket-Accept: '. - base64_encode( - sha1($hdrs['Sec-Websocket-Key'].WS::Magic,TRUE) - ).$EOL.$EOL; - if ($this->write($socket,$buf)) { - // Connect agent to server - $this->sockets[(int)$socket]=$socket; - $this->agents[(int)$socket]= - new Agent($this,$socket,$verb,$uri,$hdrs); - } - } - - /** - * Close stream socket - * @return NULL - * @param $socket resource - **/ - function close($socket) { - if (isset($this->agents[(int)$socket])) - unset($this->sockets[(int)$socket],$this->agents[(int)$socket]); - stream_socket_shutdown($socket,STREAM_SHUT_WR); - @fclose($socket); - } - - /** - * Read from stream socket - * @return string|FALSE - * @param $socket resource - **/ - function read($socket) { - if (is_string($buf=@fread($socket,WS::Packet)) && - strlen($buf) && - strlen($buf)events['error']) && - is_callable($func=$this->events['error'])) - $func($this); - $this->close($socket); - return FALSE; - } - - /** - * Write to stream socket - * @return int|FALSE - * @param $socket resource - * @param $buf string - **/ - function write($socket,$buf) { - for ($i=0,$bytes=0;$ievents['error']) && - is_callable($func=$this->events['error'])) - $func($this); - $this->close($socket); - return FALSE; - } - return $bytes; - } - - /** - * Return socket agents - * @return array - * @param $uri string - ***/ - function agents($uri=NULL) { - return array_filter( - $this->agents, - function($val) use($uri) { - return $uri?($val->uri()==$uri):TRUE; - } - ); - } - - /** - * Return event handlers - * @return array - **/ - function events() { - return $this->events; - } - - /** - * Bind function to event handler - * @return object - * @param $event string - * @param $func callable - **/ - function on($event,$func) { - $this->events[$event]=$func; - return $this; - } - - /** - * Terminate server - * @return NULL - * @param $signal int - **/ - function kill($signal) { - die; - } - - /** - * Execute the server process - * @return object - **/ - function run() { - $fw=\Base::instance(); - // Assign signal handlers - declare(ticks=1); - pcntl_signal(SIGINT,[$this,'kill']); - pcntl_signal(SIGTERM,[$this,'kill']); - gc_enable(); - // Activate WebSocket listener - $listen=stream_socket_server( - $this->addr,$errno,$errstr, - STREAM_SERVER_BIND|STREAM_SERVER_LISTEN, - $this->ctx - ); - $socket=socket_import_stream($listen); - register_shutdown_function(function() use($listen) { - foreach ($this->sockets as $socket) - if ($socket!=$listen) - $this->close($socket); - $this->close($listen); - if (isset($this->events['stop']) && - is_callable($func=$this->events['stop'])) - $func($this); - }); - if ($errstr) - user_error($errstr,E_USER_ERROR); - if (isset($this->events['start']) && - is_callable($func=$this->events['start'])) - $func($this); - $this->sockets=[(int)$listen=>$listen]; - $empty=[]; - $wait=$this->wait; - while (TRUE) { - $active=$this->sockets; - $mark=microtime(TRUE); - $count=@stream_select( - $active,$empty,$empty,(int)$wait,round(1e6*($wait-(int)$wait)) - ); - if (is_bool($count) && $wait) { - if (isset($this->events['error']) && - is_callable($func=$this->events['error'])) - $func($this); - die; - } - if ($count) { - // Process active connections - foreach ($active as $socket) { - if (!is_resource($socket)) - continue; - if ($socket==$listen) { - if ($socket=@stream_socket_accept($listen,0)) - $this->alloc($socket); - else - if (isset($this->events['error']) && - is_callable($func=$this->events['error'])) - $func($this); - } - else { - $id=(int)$socket; - if (isset($this->agents[$id])) - $this->agents[$id]->fetch(); - } - } - $wait-=microtime(TRUE)-$mark; - while ($wait<1e-6) { - $wait+=$this->wait; - $count=0; - } - } - if (!$count) { - $mark=microtime(TRUE); - foreach ($this->sockets as $id=>$socket) { - if (!is_resource($socket)) - continue; - if ($socket!=$listen && - isset($this->agents[$id]) && - isset($this->events['idle']) && - is_callable($func=$this->events['idle'])) - $func($this->agents[$id]); - } - $wait=$this->wait-microtime(TRUE)+$mark; - } - gc_collect_cycles(); - } - } - - /** - * Instantiate object - * @return object - * @param $addr string - * @param $ctx resource - * @param $wait int - **/ - function __construct($addr,$ctx=NULL,$wait=60) { - $this->addr=$addr; - $this->ctx=$ctx?:stream_context_create(); - $this->wait=$wait; - $this->events=[]; - } - -} - -//! RFC6455 remote socket -class Agent { - - protected - $server, - $id, - $socket, - $flag, - $verb, - $uri, - $headers, - $events; - - /** - * Return server instance - * @return object - **/ - function server() { - return $this->server; - } - - /** - * Return socket ID - * @return string - **/ - function id() { - return $this->id; - } - - /** - * Return socket - * @return object - **/ - function socket() { - return $this->socket; - } - - /** - * Return request method - * @return string - **/ - function verb() { - return $this->verb; - } - - /** - * Return request URI - * @return string - **/ - function uri() { - return $this->uri; - } - - /** - * Return socket headers - * @return string - **/ - function headers() { - return $this->headers; - } - - /** - * Frame and transmit payload - * @return string|FALSE - * @param $socket resource - * @param $op int - * @param $payload string - **/ - function send($op,$data='') { - $server=$this->server; - $mask=WS::Finale | $op & WS::OpCode; - $len=strlen($data); - $buf=''; - if ($len>0xffff) - $buf=pack('CCNN',$mask,0x7f,$len); - else - if ($len>0x7d) - $buf=pack('CCn',$mask,0x7e,$len); - else - $buf=pack('CC',$mask,$len); - $buf.=$data; - if (is_bool($server->write($this->socket,$buf))) - return FALSE; - if (!in_array($op,[WS::Pong,WS::Close]) && - isset($this->events['send']) && - is_callable($func=$this->events['send'])) - $func($this,$op,$data); - return $data; - } - - /** - * Retrieve and unmask payload - * @return array|FALSE - **/ - function fetch() { - // Unmask payload - $server=$this->server; - if (is_bool($buf=$server->read($this->socket))) - return FALSE; - $op=ord($buf[0]) & WS::OpCode; - $len=ord($buf[1]) & WS::Length; - $pos=2; - if ($len==0x7e) { - $len=ord($buf[2])*256+ord($buf[3]); - $pos+=2; - } - else - if ($len==0x7f) { - for ($i=0,$len=0;$i<8;$i++) - $len=$len*256+ord($buf[$i+2]); - $pos+=8; - } - for ($i=0,$mask=[];$i<4;$i++) - $mask[$i]=ord($buf[$pos+$i]); - $pos+=4; - if (strlen($buf)<$len+$pos) - return FALSE; - for ($i=0,$data='';$i<$len;$i++) - $data.=chr(ord($buf[$pos+$i])^$mask[$i%4]); - // Dispatch - switch ($op & WS::OpCode) { - case WS::Ping: - $this->send(WS::Pong); - break; - case WS::Close: - $server->close($this->socket); - break; - case WS::Text: - $data=trim($data); - case WS::Binary: - if (isset($this->events['receive']) && - is_callable($func=$this->events['receive'])) - $func($this,$op,$data); - break; - } - return [$op,$data]; - } - - /** - * Destroy object - * @return NULL - **/ - function __destruct() { - if (isset($this->events['disconnect']) && - is_callable($func=$this->events['disconnect'])) - $func($this); - } - - /** - * Instantiate object - * @return object - * @param $server object - * @param $socket resource - * @param $verb string - * @param $uri string - * @param $hdrs array - **/ - function __construct($server,$socket,$verb,$uri,array $hdrs) { - $this->server=$server; - $this->id=stream_socket_get_name($socket,TRUE); - $this->socket=$socket; - $this->verb=$verb; - $this->uri=$uri; - $this->headers=$hdrs; - $this->events=$server->events(); - if (isset($this->events['connect']) && - is_callable($func=$this->events['connect'])) - $func($this); - } - -} diff --git a/app/lib/code.css b/app/lib/code.css deleted file mode 100644 index 618703f9..00000000 --- a/app/lib/code.css +++ /dev/null @@ -1 +0,0 @@ -code{word-wrap:break-word;color:black}.comment,.doc_comment,.ml_comment{color:dimgray;font-style:italic}.variable{color:blueviolet}.const,.constant_encapsed_string,.class_c,.dir,.file,.func_c,.halt_compiler,.line,.method_c,.lnumber,.dnumber{color:crimson}.string,.and_equal,.boolean_and,.boolean_or,.concat_equal,.dec,.div_equal,.inc,.is_equal,.is_greater_or_equal,.is_identical,.is_not_equal,.is_not_identical,.is_smaller_or_equal,.logical_and,.logical_or,.logical_xor,.minus_equal,.mod_equal,.mul_equal,.ns_c,.ns_separator,.or_equal,.plus_equal,.sl,.sl_equal,.sr,.sr_equal,.xor_equal,.start_heredoc,.end_heredoc,.object_operator,.paamayim_nekudotayim{color:black}.abstract,.array,.array_cast,.as,.break,.case,.catch,.class,.clone,.continue,.declare,.default,.do,.echo,.else,.elseif,.empty.enddeclare,.endfor,.endforach,.endif,.endswitch,.endwhile,.eval,.exit,.extends,.final,.for,.foreach,.function,.global,.goto,.if,.implements,.include,.include_once,.instanceof,.interface,.isset,.list,.namespace,.new,.print,.private,.public,.protected,.require,.require_once,.return,.static,.switch,.throw,.try,.unset,.use,.var,.while{color:royalblue}.open_tag,.open_tag_with_echo,.close_tag{color:orange}.ini_section{color:black}.ini_key{color:royalblue}.ini_value{color:crimson}.xml_tag{color:dodgerblue}.xml_attr{color:blueviolet}.xml_data{color:red}.section{color:black}.directive{color:blue}.data{color:dimgray} diff --git a/app/lib/composer.json b/app/lib/composer.json deleted file mode 100644 index 01bdca12..00000000 --- a/app/lib/composer.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "bcosca/fatfree-core", - "description": "A powerful yet easy-to-use PHP micro-framework designed to help you build dynamic and robust Web applications - fast!", - "homepage": "http://fatfreeframework.com/", - "license": "GPL-3.0", - "require": { - "php": ">=5.4" - }, - "autoload": { - "classmap": ["."] - } -} diff --git a/app/lib/cron.php b/app/lib/cron.php deleted file mode 100644 index 563783c2..00000000 --- a/app/lib/cron.php +++ /dev/null @@ -1,259 +0,0 @@ -'0 0 1 1 *', - 'annually'=>'0 0 1 1 *', - 'monthly'=>'0 0 1 * *', - 'weekly'=>'0 0 * * 0', - 'daily'=>'0 0 * * *', - 'hourly'=>'0 * * * *', - ); - - /** @var bool */ - private $windows; - - /** - * Set binary path after checking that it can be executed and is CLI - * @param string $path - * @return string - */ - function binary($path) { - if (function_exists('exec')) { - exec($path.' -v 2>&1',$out,$ret); - if ($ret==0 && preg_match('/cli/',@$out[0],$out)) - $this->binary=$path; - } - return $this->binary; - } - - /** - * Schedule a job - * @param string $job - * @param string $handler - * @param string $expr - */ - function set($job,$handler,$expr) { - if (!preg_match('/^[\w\-]+$/',$job)) - user_error(sprintf(self::E_Invalid,$job),E_USER_ERROR); - $this->jobs[$job]=array($handler,$expr); - } - - /** - * Define a schedule preset - * @param string $name - * @param string $expr - */ - function preset($name,$expr) { - $this->presets[$name]=$expr; - } - - /** - * Returns TRUE if the requested job is due at the given time - * @param string $job - * @param int $time - * @return bool - */ - function isDue($job,$time) { - if (!isset($this->jobs[$job]) || !$parts=$this->parseExpr($this->jobs[$job][1])) - return FALSE; - foreach($this->parseTimestamp($time) as $i=>$k) - if (!in_array($k,$parts[$i])) - return FALSE; - return TRUE; - } - - /** - * Execute a job - * @param string $job - * @param bool $async - * @return bool TRUE = job has been executed / FALSE = job has been delegated to a background process - */ - function execute($job,$async=TRUE) { - if (!isset($this->jobs[$job])) - user_error(sprintf(self::E_NotFound,$job),E_USER_ERROR); - $f3=\Base::instance(); - if (is_string($func=$this->jobs[$job][0])) - $func=$f3->grab($func); - if (!is_callable($func)) - user_error(sprintf(self::E_Callable,$job),E_USER_ERROR); - if ($async && isset($this->binary)) { - // PHP docs: If a program is started with this function, in order for it to continue running in the background, - // the output of the program must be redirected to a file or another output stream. - // Failing to do so will cause PHP to hang until the execution of the program ends. - $dir=dirname($this->script); - $file=basename($this->script); - if (!preg_match($this->windows?'/^[A-Z]:\\\\/i':'/^\//',$dir)) - $dir=getcwd().'/'.$dir; - if ($this->windows) { - pclose(popen(sprintf('start /b "cron" "%s" "%s\\%s" "/cron/%s"',$this->binary,$dir,$file,$job),'r')); - } else { - exec(sprintf('cd "%s" && %s %s /cron/%s >/dev/null 2>/dev/null &',$dir,$this->binary,$file,$job)); - } - return FALSE; - } - $start=microtime(TRUE); - call_user_func_array($func,array($f3)); - if ($this->log) { - $log=new Log('cron.log'); - $log->write(sprintf(self::L_Execution,$job,microtime(TRUE)-$start)); - } - return TRUE; - } - - /** - * Run scheduler, i.e executes all due jobs at a given time - * @param int $time - * @param bool $async - * @return array List of executed jobs - */ - function run($time=NULL,$async=TRUE) { - if (!isset($time)) - $time=time(); - $exec=array(); - foreach(array_keys($this->jobs) as $job) - if ($this->isDue($job,$time)) - $exec[$job]=$this->execute($job,$async); - return $exec; - } - - /** - * Route controller code - * @param \Base $f3 - * @param array $params - */ - function route($f3,$params) { - if (PHP_SAPI!='cli' && !$this->web) - $f3->error(404); - $exec=isset($params['job'])? - array($params['job']=>$this->execute($params['job'],FALSE)): - $this->run(); - if (!$this->silent) { - if (PHP_SAPI!='cli') - header('Content-Type: text/plain'); - if (!$exec) - die('Nothing to do'); - foreach($exec as $job=>$ok) - echo sprintf('%s [%s]',$job,$ok?'OK':'async')."\r\n"; - } - } - - /** - * Parse a timestamp - * @param int $time - * @return array - */ - function parseTimestamp($time) { - return array( - (int)date('i',$time),//minute - (int)date('H',$time),//hour - (int)date('d',$time),//day of month - (int)date('m',$time),//month - (int)date('w',$time),//day of week - ); - } - - /** - * Parse a cron expression - * @param string $expr - * @return array|FALSE - */ - function parseExpr($expr) { - $parts=array(); - if (preg_match('/^@(\w+)$/',$expr,$m)) { - if (!isset($this->presets[$m[1]])) - return FALSE; - $expr=$this->presets[$m[1]]; - } - $expr=preg_split('/\s+/',$expr,-1,PREG_SPLIT_NO_EMPTY); - $ranges=array( - 0=>59,//minute - 1=>23,//hour - 2=>31,//day of month - 3=>12,//month - 4=>6,//day of week - ); - foreach($ranges as $i=>$max) - if (isset($expr[$i]) && preg_match_all('/(?<=,|^)\h*(?:(\d+)(?:-(\d+))?|(\*))(?:\/(\d+))?\h*(?=,|$)/', - $expr[$i],$matches,PREG_SET_ORDER)) { - $parts[$i]=array(); - foreach($matches as $m) { - if (!$range=@range(@$m[3]?0:$m[1],@$m[3]?$max:(@$m[2]?:$m[1]),@$m[4]?:1)) - return FALSE;//step exceeds specified range - $parts[$i]=array_merge($parts[$i],$range); - } - } else - return FALSE; - return $parts; - } - - //! Read-only public properties - function __get($name) { - if (in_array($name,array('binary','jobs','presets'))) - return $this->$name; - if ($name=='clipath') // alias for script [deprecated] - return $this->script; - trigger_error(sprintf(self::E_Undefined,__CLASS__,$name)); - } - - //! Constructor - function __construct() { - $f3=\Base::instance(); - $config=(array)$f3->get('CRON'); - foreach(array('log','web','script','silent') as $k) - if (isset($config[$k])) { - settype($config[$k],gettype($this->$k)); - $this->$k=$config[$k]; - } - if (isset($config['binary'])) - $this->binary($config['binary']); - if (isset($config['jobs'])) - foreach($config['jobs'] as $job=>$arr) { - $handler=array_shift($arr); - $this->set($job,$handler,implode(',',$arr)); - } - if (isset($config['presets'])) - foreach($config['presets'] as $name=>$expr) - $this->preset($name,is_array($expr)?implode(',',$expr):$expr); - if (!isset($this->binary)) - foreach(array('php','php-cli') as $path) // try to guess the binary name - if ($this->binary($path)) - break; - $this->windows=(bool)preg_match('/^win/i',PHP_OS); - $f3->route(array('GET /cron','GET /cron/@job'),array($this,'route')); - } - -} \ No newline at end of file diff --git a/app/lib/db/cortex.php b/app/lib/db/cortex.php deleted file mode 100644 index a8e5b5e0..00000000 --- a/app/lib/db/cortex.php +++ /dev/null @@ -1,3077 +0,0 @@ - - * https://github.com/ikkez/F3-Sugar/ - * - * @package DB - * @version 1.6.0 - * @date 03.02.2019 - * @since 24.04.2012 - */ - -namespace DB; -use DB\SQL\Schema; - -class Cortex extends Cursor { - - protected - // config - $db, // DB object [ \DB\SQL, \DB\Jig, \DB\Mongo ] - $table, // selected table, string - $fluid, // fluid sql schema mode, boolean - $fieldConf, // field configuration, array - $ttl, // default mapper schema ttl - $rel_ttl, // default mapper rel ttl - $primary, // SQL table primary key - // behaviour - $smartLoading, // intelligent lazy eager loading, boolean - $standardiseID, // return standardized '_id' field for SQL when casting - // internals - $dbsType, // mapper engine type [jig, sql, mongo] - $fieldsCache, // relation field cache - $saveCsd, // mm rel save cascade - $collection, // collection - $relFilter, // filter for loading related models - $hasCond, // IDs of records the next find should have - $whitelist, // restrict to these fields - $relWhitelist, // restrict relations to these fields - $grp_stack, // stack of group conditions - $countFields, // relational counter buffer - $preBinds, // bind values to be prepended to $filter - $vFields, // virtual fields buffer - $_ttl, // rel_ttl overwrite - $charset; // sql collation charset - - /** @var Cursor */ - protected $mapper; - - /** @var CortexQueryParser */ - protected $queryParser; - - /** @var bool initialization flag */ - static $init = false; - - /** @var array sql table schema cache */ - static $schema_cache = []; - - const - // special datatypes - DT_SERIALIZED = 'SERIALIZED', - DT_JSON = 'JSON', - - // error messages - E_ARRAY_DATATYPE = 'Unable to save an Array in field %s. Use DT_SERIALIZED or DT_JSON.', - E_CONNECTION = 'No valid DB Connection given.', - E_NO_TABLE = 'No table specified.', - E_UNKNOWN_DB_ENGINE = 'This unknown DB system is not supported: %s', - E_FIELD_SETUP = 'No field setup defined', - E_UNKNOWN_FIELD = 'Field %s does not exist in %s.', - E_INVALID_RELATION_OBJECT = 'You can only save hydrated mapper objects', - E_NULLABLE_COLLISION = 'Unable to set NULL to the NOT NULLABLE field: %s', - E_WRONG_RELATION_CLASS = 'Relations only works with Cortex objects', - E_MM_REL_VALUE = 'Invalid value for many field "%s". Expecting null, split-able string, hydrated mapper object, or array of mapper objects.', - E_MM_REL_CLASS = 'Mismatching m:m relation config from class `%s` to `%s`.', - E_MM_REL_FIELD = 'Mismatching m:m relation keys from `%s` to `%s`.', - E_REL_CONF_INC = 'Incomplete relation config for `%s`. Linked key is missing.', - E_MISSING_REL_CONF = 'Cannot create related model. Specify a model name or relConf array.', - E_HAS_COND = 'Cannot use a "has"-filter on a non-bidirectional relation field'; - - /** - * init the ORM, based on given DBS - * @param null|object $db - * @param string $table - * @param null|bool $fluid - * @param int $ttl - */ - public function __construct($db = NULL, $table = NULL, $fluid = NULL, $ttl = 0) { - if (!is_null($fluid)) - $this->fluid = $fluid; - if (!is_object($this->db=(is_string($db=($db?:$this->db)) - ? \Base::instance()->get($db):$db)) && !static::$init) - trigger_error(self::E_CONNECTION,E_USER_ERROR); - if ($this->db instanceof Jig) - $this->dbsType = 'jig'; - elseif ($this->db instanceof SQL) - $this->dbsType = 'sql'; - elseif ($this->db instanceof Mongo) - $this->dbsType = 'mongo'; - if ($table) - $this->table = $table; - if ($this->dbsType != 'sql') - $this->primary = '_id'; - elseif (!$this->primary) - $this->primary = 'id'; - $this->table = $this->getTable(); - if (!$this->table) - trigger_error(self::E_NO_TABLE,E_USER_ERROR); - $this->ttl = $ttl ?: ($this->ttl ?: 60); - if (!$this->rel_ttl) - $this->rel_ttl = 0; - $this->_ttl = $this->rel_ttl ?: 0; - if (static::$init == TRUE) return; - if ($this->fluid) - static::setup($this->db,$this->table,array()); - $this->initMapper(); - } - - /** - * create mapper instance - */ - public function initMapper() { - switch ($this->dbsType) { - case 'jig': - $this->mapper = new Jig\Mapper($this->db, $this->table); - break; - case 'sql': - // ensure to load full table schema, so we can work with it at runtime - $this->mapper = new SQL\Mapper($this->db, $this->table, null, - ($this->fluid)?0:$this->ttl); - $this->applyWhitelist(); - break; - case 'mongo': - $this->mapper = new Mongo\Mapper($this->db, $this->table); - break; - default: - trigger_error(sprintf(self::E_UNKNOWN_DB_ENGINE,$this->dbsType),E_USER_ERROR); - } - $this->queryParser = CortexQueryParser::instance(); - $this->reset(); - $this->clearFilter(); - $f3 = \Base::instance(); - $this->smartLoading = $f3->exists('CORTEX.smartLoading') ? - $f3->get('CORTEX.smartLoading') : TRUE; - $this->standardiseID = $f3->exists('CORTEX.standardiseID') ? - $f3->get('CORTEX.standardiseID') : TRUE; - if(!empty($this->fieldConf)) - foreach($this->fieldConf as &$conf) { - $conf=static::resolveRelationConf($conf,$this->primary); - unset($conf); - } - } - - /** - * return raw mapper instance - * @return Cursor - */ - public function getMapper() { - return $this->mapper; - } - - /** - * get fields or set whitelist / blacklist of fields - * @param array $fields - * @param bool $exclude - * @return array - */ - public function fields(array $fields=array(), $exclude=false) { - $addInc=[]; - if ($fields) - // collect & set restricted fields for related mappers - foreach($fields as $i=>$val) - if(is_int(strpos($val,'.'))) { - list($key, $relField) = explode('.',$val,2); - $this->relWhitelist[$key][(int)$exclude][] = $relField; - unset($fields[$i]); - $addInc[] = $key; - } - $fields = array_unique($fields); - $schema = $this->whitelist ?: $this->mapper->fields(); - if (!$schema && $this->dbsType != 'sql' && $this->dry()) { - $this->load(); - $schema = $this->mapper->fields(); - $this->reset(); - } - // include relation linkage fields to $fields (if $fields is a whitelist) - if (!$exclude && !empty($fields) && !empty($addInc)) - $fields=array_unique(array_merge($fields,$addInc)); - // include relation linkage fields to existing whitelist (if $fields is a blacklist or there's nothing else to whitelist) - elseif (!empty($addInc) && $this->whitelist) - $this->whitelist=array_unique(array_merge($this->whitelist,$addInc)); - // initially merge configured fields into schema (add virtual/rel fields to schema) - if (!$this->whitelist && $this->fieldConf) - $schema=array_unique(array_merge($schema, - array_keys($this->fieldConf),array_keys($this->vFields?:[]))); - // skip if there's nothing to set for own model - if (!$fields || empty($fields)) - return $schema; - elseif ($exclude) { - $this->whitelist=array_diff($schema,$fields); - } else - $this->whitelist=$fields; - $id=$this->dbsType=='sql'?$this->primary:'_id'; - if (!in_array($id,$this->whitelist) && !($exclude && in_array($id,$fields))) - $this->whitelist[]=$id; - $this->applyWhitelist(); - return $this->whitelist; - } - - /** - * apply whitelist to active mapper schema - */ - protected function applyWhitelist() { - if ($this->dbsType == 'sql') { - // fetch full schema - if (!$this->fluid && isset(self::$schema_cache[$key=$this->table.$this->db->uuid()])) - $schema = self::$schema_cache[$key]; - else { - $schema = $this->mapper->schema(); - self::$schema_cache[$this->table.$this->db->uuid()] = $schema; - } - // apply reduced fields schema - if ($this->whitelist) - $schema = array_intersect_key($schema, array_flip($this->whitelist)); - $this->mapper->schema($schema); - $this->mapper->reset(); - } - } - - /** - * set model definition - * config example: - * array('title' => array( - * 'type' => \DB\SQL\Schema::DT_TEXT, - * 'default' => 'new record title', - * 'nullable' => true - * ) - * '...' => ... - * ) - * @param array $config - */ - function setFieldConfiguration(array $config) { - $this->fieldConf = $config; - $this->reset(); - } - - /** - * returns model field conf array - * @return array|null - */ - public function getFieldConfiguration() { - return $this->fieldConf; - } - - /** - * kick start to just fetch the config - * @return array - */ - static public function resolveConfiguration() { - static::$init=true; - $self = new static(); - static::$init=false; - $conf = array ( - 'table'=>$self->getTable(), - 'fieldConf'=>$self->getFieldConfiguration(), - 'db'=>$self->db, - 'fluid'=>$self->fluid, - 'primary'=>$self->primary, - 'charset'=>$self->charset, - ); - unset($self); - return $conf; - } - - /** - * give this model a reference to the collection it is part of - * @param CortexCollection $cx - */ - public function addToCollection($cx) { - $this->collection = $cx; - } - - /** - * returns the collection where this model lives in - * @return CortexCollection - */ - protected function getCollection() { - return ($this->collection && $this->smartLoading) - ? $this->collection : false; - } - - /** - * returns model table name - * @return string - */ - public function getTable() { - if (!$this->table && ($this->fluid || static::$init)) - $this->table = strtolower(get_class($this)); - return $this->table; - } - - /** - * setup / update table schema - * @static - * @param $db - * @param $table - * @param $fields - * @return bool - */ - static public function setup($db=null, $table=null, $fields=null) { - /** @var Cortex $self */ - $self = get_called_class(); - $self::$schema_cache=[]; - if (is_null($db) || is_null($table) || is_null($fields)) - $df = $self::resolveConfiguration(); - if (!is_object($db=(is_string($db=($db?:$df['db']))?\Base::instance()->get($db):$db))) - trigger_error(self::E_CONNECTION,E_USER_ERROR); - if (strlen($table=$table?:$df['table'])==0) - trigger_error(self::E_NO_TABLE,E_USER_ERROR); - if (is_null($fields)) - if (!empty($df['fieldConf'])) - $fields = $df['fieldConf']; - elseif(!$df['fluid']) { - trigger_error(self::E_FIELD_SETUP,E_USER_ERROR); - return false; - } else - $fields = array(); - if ($db instanceof SQL) { - $schema = new Schema($db); - // prepare field configuration - foreach($fields as $key => &$field) { - // fetch relation field types - $field = static::resolveRelationConf($field); - // check m:m relation - if (array_key_exists('has-many', $field)) { - // m:m relation conf [class,to-key,from-key] - if (is_array($relConf = $field['has-many'])) { - $rel = $relConf[0]::resolveConfiguration(); - // check if foreign conf matches m:m - if (array_key_exists($relConf[1],$rel['fieldConf']) - && !is_null($rel['fieldConf'][$relConf[1]]) - && $relConf['hasRel'] == 'has-many') { - // compute mm table name - $mmTable = isset($relConf[2]) ? $relConf[2] : - static::getMMTableName($rel['table'], $relConf['relField'], - $table, $key, $rel['fieldConf'][$relConf[1]]['has-many']); - if (!in_array($mmTable,$schema->getTables())) { - $mmt = $schema->createTable($mmTable); - $relField = $relConf['relField'].($relConf['isSelf']?'_ref':''); - $mmt->addColumn($relField)->type($relConf['relFieldType']); - $mmt->addColumn($key)->type($field['type']); - $index = array($relField,$key); - sort($index); - $mmt->addIndex($index); - $mmt->build(); - } - } - } - unset($fields[$key]); - continue; - } - // skip virtual fields with no type - if (!array_key_exists('type', $field)) { - unset($fields[$key]); - continue; - } - // transform array fields - if (in_array($field['type'], array(self::DT_JSON, self::DT_SERIALIZED))) - $field['type']=$schema::DT_TEXT; - // defaults values - if (!array_key_exists('nullable', $field)) - $field['nullable'] = true; - unset($field); - } - if (!in_array($table, $schema->getTables())) { - // create table - $table = $schema->createTable($table); - if (isset($df) && $df['charset']) - $table->setCharset($df['charset']); - foreach ($fields as $field_key => $field_conf) - $table->addColumn($field_key, $field_conf); - if(isset($df) && $df['primary'] != 'id') { - $table->addColumn($df['primary'])->type_int(); - $table->primary($df['primary']); - } - $table->build(); - } else { - // add missing fields - $table = $schema->alterTable($table); - $existingCols = $table->getCols(); - foreach ($fields as $field_key => $field_conf) - if (!in_array($field_key, $existingCols)) - $table->addColumn($field_key, $field_conf); - // remove unused fields - // foreach ($existingCols as $col) - // if (!in_array($col, array_keys($fields)) && $col!='id') - // $table->dropColumn($col); - $table->build(); - } - } - return true; - } - - /** - * erase all model data, handle with care - * @param null $db - * @param null $table - */ - static public function setdown($db=null, $table=null) { - $self = get_called_class(); - if (is_null($db) || is_null($table)) - $df = $self::resolveConfiguration(); - if (!is_object($db=(is_string($db=($db?:$df['db']))?\Base::instance()->get($db):$db))) - trigger_error(self::E_CONNECTION,E_USER_ERROR); - if (strlen($table=strtolower($table?:$df['table']))==0) - trigger_error(self::E_NO_TABLE,E_USER_ERROR); - if (isset($df) && !empty($df['fieldConf'])) - $fields = $df['fieldConf']; - else - $fields = array(); - $deletable = array(); - $deletable[] = $table; - foreach ($fields as $key => $field) { - $field = static::resolveRelationConf($field); - if (array_key_exists('has-many',$field)) { - if (!is_array($relConf = $field['has-many'])) - continue; - $rel = $relConf[0]::resolveConfiguration(); - // check if foreign conf matches m:m - if (array_key_exists($relConf[1],$rel['fieldConf']) && !is_null($relConf[1]) - && key($rel['fieldConf'][$relConf[1]]) == 'has-many') { - // compute mm table name - $deletable[] = isset($relConf[2]) ? $relConf[2] : - static::getMMTableName( - $rel['table'], $relConf[1], $table, $key, - $rel['fieldConf'][$relConf[1]]['has-many']); - } - } - } - - if($db instanceof Jig) { - /** @var Jig $db */ - $dir = $db->dir(); - foreach ($deletable as $item) - if(file_exists($dir.$item)) - unlink($dir.$item); - } elseif($db instanceof SQL) { - /** @var SQL $db */ - $schema = new Schema($db); - $tables = $schema->getTables(); - foreach ($deletable as $item) - if(in_array($item, $tables)) - $schema->dropTable($item); - } elseif($db instanceof Mongo) { - /** @var Mongo $db */ - foreach ($deletable as $item) - $db->selectCollection($item)->drop(); - } - } - - /** - * computes the m:m table name - * @param string $ftable foreign table - * @param string $fkey foreign key - * @param string $ptable own table - * @param string $pkey own key - * @param null|array $fConf foreign conf [class,key] - * @return string - */ - static protected function getMMTableName($ftable, $fkey, $ptable, $pkey, $fConf=null) { - if ($fConf) { - list($fclass, $pfkey) = $fConf; - $self = get_called_class(); - // check for a matching config - if ($pfkey != $pkey) - trigger_error(sprintf(self::E_MM_REL_FIELD, - $fclass.'.'.$pfkey, $self.'.'.$pkey),E_USER_ERROR); - } - $mmTable = array($ftable.'__'.$fkey, $ptable.'__'.$pkey); - natcasesort($mmTable); - // shortcut for self-referencing mm tables - if ($mmTable[0] == $mmTable[1] || - ($fConf && isset($fConf['isSelf']) && $fConf['isSelf']==true)) - return array_shift($mmTable); - $return = strtolower(str_replace('\\', '_', implode('_mm_', $mmTable))); - return $return; - } - - /** - * get mm table name from config - * @param array $conf own relation config - * @param string $key relation field - * @param null|array $fConf optional foreign config - * @return string - */ - protected function mmTable($conf, $key, $fConf=null) { - if (!isset($conf['refTable'])) { - // compute mm table name - $mmTable = isset($conf[2]) ? $conf[2] : - static::getMMTableName($conf['relTable'], - $conf['relField'], $this->table, $key, $fConf); - $this->fieldConf[$key]['has-many']['refTable'] = $mmTable; - } else - $mmTable = $conf['refTable']; - return $mmTable; - } - - /** - * resolve relation field types - * @param array $field - * @param string $pkey - * @return array - */ - protected static function resolveRelationConf($field,$pkey=NULL) { - if (array_key_exists('belongs-to-one', $field)) { - // find primary field definition - if (!is_array($relConf = $field['belongs-to-one'])) - $relConf = array($relConf, '_id'); - // set field type - if ($relConf[1] == '_id') - $field['type'] = Schema::DT_INT4; - else { - // find foreign field type - $fc = $relConf[0]::resolveConfiguration(); - $field['belongs-to-one']['relPK'] = $fc['primary']; - $field['type'] = $fc['fieldConf'][$relConf[1]]['type']; - } - $field['nullable'] = true; - $field['relType'] = 'belongs-to-one'; - } - elseif (array_key_exists('belongs-to-many', $field)){ - $field['type'] = self::DT_JSON; - $field['nullable'] = true; - $field['relType'] = 'belongs-to-many'; - } - elseif (array_key_exists('has-many', $field)){ - $field['relType'] = 'has-many'; - if (!isset($field['type'])) - $field['type'] = Schema::DT_INT; - $relConf = $field['has-many']; - if(!is_array($relConf)) - return $field; - $rel = $relConf[0]::resolveConfiguration(); - if(array_key_exists('has-many',$rel['fieldConf'][$relConf[1]])) { - // has-many <> has-many (m:m) - $field['has-many']['hasRel'] = 'has-many'; - $field['has-many']['isSelf'] = (ltrim($relConf[0],'\\')==get_called_class()); - $field['has-many']['relTable'] = $rel['table']; - $field['has-many']['relField'] = $relConf[1]; - $field['has-many']['relFieldType'] = isset($rel['fieldConf'][$relConf[1]]['type']) ? - $rel['fieldConf'][$relConf[1]]['type'] : Schema::DT_INT; - $field['has-many']['relPK'] = isset($relConf['relPK'])? - $relConf['relPK']:$rel['primary']; - $field['has-many']['localKey'] = isset($relConf['localKey'])? - $relConf['localKey']:($pkey?:'_id'); - } else { - // has-many <> belongs-to-one (m:1) - $field['has-many']['hasRel'] = 'belongs-to-one'; - $toConf=$rel['fieldConf'][$relConf[1]]['belongs-to-one']; - $field['has-many']['relField'] = is_array($toConf) ? - $toConf[1] : $rel['primary']; - } - } elseif(array_key_exists('has-one', $field)) - $field['relType'] = 'has-one'; - return $field; - } - - /** - * Return an array of result arrays matching criteria - * @param null $filter - * @param array $options - * @param int $ttl - * @param int $rel_depths - * @return array - */ - public function afind($filter = NULL, array $options = NULL, $ttl = 0, $rel_depths = 1) { - $result = $this->find($filter, $options, $ttl); - return $result ? $result->castAll($rel_depths): NULL; - } - - /** - * Return an array of objects matching criteria - * @param array|null $filter - * @param array|null $options - * @param int $ttl - * @return CortexCollection|false - */ - public function find($filter = NULL, array $options = NULL, $ttl = 0) { - $sort=false; - if ($this->dbsType!='sql') { - // see if reordering is needed - foreach($this->countFields?:[] as $counter) { - if ($options && isset($options['order']) && - preg_match('/count_'.$counter.'\h+(asc|desc)/i',$options['order'],$match)) - $sort=true; - } - if ($sort) { - // backup slice settings - if (isset($options['limit'])) { - $limit = $options['limit']; - unset($options['limit']); - } - if (isset($options['offset'])) { - $offset = $options['offset']; - unset($options['offset']); - } - } - } - $this->_ttl=$ttl?:$this->rel_ttl; - $result = $this->filteredFind($filter,$options,$ttl); - if (empty($result)) - return false; - foreach($result as &$record) { - $record = $this->factory($record); - unset($record); - } - // add counter for NoSQL engines - foreach($this->countFields?:[] as $counter) - foreach($result as &$mapper) { - $cr=$mapper->get($counter); - $mapper->virtual('count_'.$counter,$cr?count($cr):null); - unset($mapper); - } - $cc = new CortexCollection(); - $cc->setModels($result); - if($sort) { - $cc->orderBy($options['order']); - $cc->slice(isset($offset)?$offset:0,isset($limit)?$limit:NULL); - } - $this->clearFilter(); - return $cc; - } - - /** - * wrapper for custom find queries - * @param array $filter - * @param array $options - * @param int $ttl - * @param bool $count - * @return array|int|false array of underlying cursor objects - */ - protected function filteredFind($filter = NULL, array $options = NULL, $ttl = 0, $count=false) { - if ($this->grp_stack) { - if ($this->dbsType == 'mongo') { - $group = array( - 'keys' => $this->grp_stack['keys'], - 'reduce' => 'function (obj, prev) {'.$this->grp_stack['reduce'].'}', - 'initial' => $this->grp_stack['initial'], - 'finalize' => $this->grp_stack['finalize'], - ); - if ($options && isset($options['group'])) { - if(is_array($options['group'])) - $options['group'] = array_merge($options['group'],$group); - else { - $keys = explode(',',$options['group']); - $keys = array_combine($keys,array_fill(0,count($keys),1)); - $group['keys'] = array_merge($group['keys'],$keys); - $options['group'] = $group; - } - } else - $options = array('group'=>$group); - } - if($this->dbsType == 'sql') { - if ($options && isset($options['group'])) - $options['group'].= ','.$this->grp_stack; - else - $options['group'] = $this->grp_stack; - } - // Jig can't group yet, but pending enhancement https://github.com/bcosca/fatfree/pull/616 - } - if ($this->dbsType == 'sql' && !$count) { - $m_refl=new \ReflectionObject($this->mapper); - $m_ad_prop=$m_refl->getProperty('adhoc'); - $m_ad_prop->setAccessible(true); - $m_refl_adhoc=$m_ad_prop->getValue($this->mapper); - $m_ad_prop->setAccessible(false); - unset($m_ad_prop,$m_refl); - } - $hasJoin = array(); - if ($this->hasCond) { - foreach($this->hasCond as $key => $hasCond) { - $addToFilter = null; - if ($deep = is_int(strpos($key,'.'))) { - $key = rtrim($key,'.'); - $hasCond = array(null,null); - } - list($has_filter,$has_options) = $hasCond; - $type = $this->fieldConf[$key]['relType']; - $fromConf = $this->fieldConf[$key][$type]; - switch($type) { - case 'has-one': - case 'has-many': - if (!is_array($fromConf)) - trigger_error(sprintf(self::E_REL_CONF_INC, $key),E_USER_ERROR); - $id = $this->dbsType == 'sql' ? $this->primary : '_id'; - if ($type=='has-many' && isset($fromConf['relField']) - && $fromConf['hasRel'] == 'belongs-to-one') - $id=$fromConf['relField']; - // many-to-many - if ($type == 'has-many' && $fromConf['hasRel'] == 'has-many') { - if (!$deep && $this->dbsType == 'sql' - && !isset($has_options['limit']) && !isset($has_options['offset'])) { - $hasJoin = array_merge($hasJoin, - $this->_hasJoinMM_sql($key,$hasCond,$filter,$options)); - if (!isset($options['group'])) - $options['group'] = ''; - $groupFields = explode(',', preg_replace('/"/','',$options['group'])); - if (!in_array($this->table.'.'.$this->primary,$groupFields)) { - $options['group'] = ($options['group']?',':'').$this->table.'.'.$this->primary; - $groupFields[]=$this->table.'.'.$this->primary; - } - // all non-aggregated fields need to be present in the GROUP BY clause - if (isset($m_refl_adhoc) && preg_match('/sybase|dblib|odbc|sqlsrv/i',$this->db->driver())) - foreach (array_diff($this->mapper->fields(),array_keys($m_refl_adhoc)) as $field) - if (!in_array($this->table.'.'.$field,$groupFields)) - $options['group'] .= ', '.$this->table.'.'.$field; - } - elseif ($result = $this->_hasRefsInMM($key,$has_filter,$has_options,$ttl)) - $addToFilter = array($id.' IN ?', $result); - } - // *-to-one - elseif (!$deep && $this->dbsType == 'sql') { - // use sub-query inclusion - $has_filter=$this->mergeFilter([$has_filter, - [$this->rel($key)->getTable().'.'.$fromConf[1].'='.$this->getTable().'.'.$id]]); - $result = $this->_refSubQuery($key,$has_filter,$has_options); - $addToFilter = array_merge(['exists('.$result[0].')'],$result[1]); - } - elseif ($result = $this->_hasRefsIn($key,$has_filter,$has_options,$ttl)) - $addToFilter = array($id.' IN ?', $result); - break; - // one-to-* - case 'belongs-to-one': - if (!$deep && $this->dbsType == 'sql' - && !isset($has_options['limit']) && !isset($has_options['offset'])) { - if (!is_array($fromConf)) - $fromConf = array($fromConf, '_id'); - $rel = $fromConf[0]::resolveConfiguration(); - if ($this->dbsType == 'sql' && $fromConf[1] == '_id') - $fromConf[1] = $rel['primary']; - $hasJoin[] = $this->_hasJoin_sql($key,$rel['table'],$hasCond,$filter,$options); - } elseif ($result = $this->_hasRefsIn($key,$has_filter,$has_options,$ttl)) - $addToFilter = array($key.' IN ?', $result); - break; - default: - trigger_error(self::E_HAS_COND,E_USER_ERROR); - } - if (isset($result) && !isset($addToFilter)) - return false; - elseif (isset($addToFilter)) { - if (!$filter) - $filter = array(''); - if (!empty($filter[0])) - $filter[0] .= ' and '; - $cond = array_shift($addToFilter); - if ($this->dbsType=='sql') - $cond = $this->queryParser->sql_prependTableToFields($cond,$this->table); - $filter[0] .= '('.$cond.')'; - $filter = array_merge($filter, $addToFilter); - } - } - $this->hasCond = null; - } - $filter = $this->queryParser->prepareFilter($filter, $this->dbsType, $this->db, $this->fieldConf); - if ($this->dbsType=='sql') { - $qtable = $this->db->quotekey($this->table); - if (isset($options['order']) && $this->db->driver() == 'pgsql') - // PostgreSQLism: sort NULL values to the end of a table - $options['order'] = preg_replace('/\h+DESC(?=\s*(?:$|,))/i',' DESC NULLS LAST',$options['order']); - // assemble full sql query for joined queries - if ($hasJoin) { - $adhoc=[]; - // when in count-mode and grouping is active, wrap the query later - // otherwise add a an adhoc counter field here - if (!($subquery_mode=($options && !empty($options['group']))) && $count) - $adhoc[]='(COUNT(*)) as _rows'; - if (!$count) - // add bind parameters for filters in adhoc fields - if ($this->preBinds) { - $crit = array_shift($filter); - $filter = array_merge($this->preBinds,$filter); - array_unshift($filter,$crit); - } - if (!empty($m_refl_adhoc)) - // add adhoc field expressions - foreach ($m_refl_adhoc as $key=>$val) - $adhoc[]=$val['expr'].' AS '.$this->db->quotekey($key); - $fields=implode(',',$adhoc); - if ($count && $subquery_mode) { - if (empty($fields)) - // Select at least one field, ideally the grouping fields or sqlsrv fails - $fields=preg_replace('/HAVING.+$/i','',$options['group']); - if (preg_match('/mssql|dblib|sqlsrv/',$this->engine)) - $fields='TOP 100 PERCENT '.$fields; - } - if (!$count) - // add only selected fields to field list - $fields.=($fields?', ':'').implode(', ',array_map(function($field) use($qtable){ - return $qtable.'.'.$this->db->quotekey($field); - },array_diff($this->mapper->fields(),array_keys($m_refl_adhoc)))); - // assemble query - $sql = 'SELECT '.$fields.' FROM '.$qtable.' ' - .implode(' ',$hasJoin).' WHERE '.$filter[0]; - $db=$this->db; - // add grouping in both, count & selection mode - if (isset($options['group'])) - $sql.=' GROUP BY '.preg_replace_callback('/\w+[._\-\w]*/i', - function($match) use($db) { - return $db->quotekey($match[0]); - }, $options['group']); - if (!$count) { - if (isset($options['order'])) - $sql.=' ORDER BY '.implode(',',array_map( - function($str) use($db) { - return preg_match('/^\h*(\w+[._\-\w]*)(?:\h+((?:ASC|DESC)[\w\h]*))?\h*$/i', - $str,$parts)? - ($db->quotekey($parts[1]). - (isset($parts[2])?(' '.$parts[2]):'')):$str; - }, - explode(',',$options['order']))); - // SQL Server fixes - if (preg_match('/mssql|sqlsrv|odbc/', $this->db->driver()) && - (isset($options['limit']) || isset($options['offset']))) { - $ofs=isset($options['offset'])?(int)$options['offset']:0; - $lmt=isset($options['limit'])?(int)$options['limit']:0; - if (strncmp($this->db->version(),'11',2)>=0) { - // SQL Server >= 2012 - if (!isset($options['order'])) - $sql.=' ORDER BY '.$this->db->quotekey($this->primary); - $sql.=' OFFSET '.$ofs.' ROWS'.($lmt?' FETCH NEXT '.$lmt.' ROWS ONLY':''); - } else { - // SQL Server 2008 - $order=(!isset($options['order'])) - ?($this->db->quotekey($this->table.'.'.$this->primary)):$options['order']; - $sql=str_replace('SELECT','SELECT '.($lmt>0?'TOP '.($ofs+$lmt):'').' ROW_NUMBER() '. - 'OVER (ORDER BY '.$order.') AS rnum,',$sql); - $sql='SELECT * FROM ('.$sql.') x WHERE rnum > '.($ofs); - } - } else { - if (isset($options['limit'])) - $sql.=' LIMIT '.(int)$options['limit']; - if (isset($options['offset'])) - $sql.=' OFFSET '.(int)$options['offset']; - } - } elseif ($subquery_mode) - // wrap count query if necessary - $sql='SELECT COUNT(*) AS '.$this->db->quotekey('_rows').' '. - 'FROM ('.$sql.') AS '.$this->db->quotekey('_temp'); - unset($filter[0]); - $result = $this->db->exec($sql, $filter, $ttl); - if ($count) - return $result[0]['_rows']; - foreach ($result as &$record) { - // factory new mappers - $mapper = clone($this->mapper); - $mapper->reset(); - $mapper->query= array($record); - foreach ($record as $key=>$val) - $mapper->set($key, $val); - $record = $mapper; - unset($record, $mapper); - } - return $result; - } elseif (!empty($this->preBinds)) { - // bind values to adhoc queries - if (!$filter) - // we (PDO) need any filter to bind values - $filter = array('1=1'); - $crit = array_shift($filter); - $filter = array_merge($this->preBinds,$filter); - array_unshift($filter,$crit); - } - } - if ($options) { - $options = $this->queryParser->prepareOptions($options,$this->dbsType,$this->db); - if ($count) - unset($options['order']); - } - return ($count) - ? $this->mapper->count($filter,$options,$ttl) - : $this->mapper->find($filter,$options,$ttl); - } - - /** - * Retrieve first object that satisfies criteria - * @param null $filter - * @param array $options - * @param int $ttl - * @return bool - */ - public function load($filter = NULL, array $options = NULL, $ttl = 0) { - $this->reset(); - $this->_ttl=$ttl?:$this->rel_ttl; - $res = $this->filteredFind($filter, $options, $ttl); - if ($res) { - $this->mapper->query = $res; - $this->first(); - } else - $this->mapper->reset(); - $this->emit('load'); - return $this->valid(); - } - - /** - * add has-conditional filter to next find call - * @param string $key - * @param array $filter - * @param null $options - * @return $this - */ - public function has($key, $filter, $options = null) { - if (is_string($filter)) - $filter=array($filter); - if (is_int(strpos($key,'.'))) { - list($key,$fkey) = explode('.',$key,2); - if (!isset($this->hasCond[$key.'.'])) - $this->hasCond[$key.'.'] = array(); - $this->hasCond[$key.'.'][$fkey] = array($filter,$options); - } else { - if (!isset($this->fieldConf[$key])) - trigger_error(sprintf(self::E_UNKNOWN_FIELD,$key,get_called_class()),E_USER_ERROR); - if (!isset($this->fieldConf[$key]['relType'])) - trigger_error(self::E_HAS_COND,E_USER_ERROR); - $this->hasCond[$key] = array($filter,$options); - } - return $this; - } - - /** - * return IDs of records that has a linkage to this mapper - * @param string $key relation field - * @param array $filter condition for foreign records - * @param array $options filter options for foreign records - * @param int $ttl - * @return array|false - */ - protected function _hasRefsIn($key, $filter, $options, $ttl = 0) { - $type = $this->fieldConf[$key]['relType']; - $fieldConf = $this->fieldConf[$key][$type]; - // one-to-many shortcut - $rel = $this->getRelFromConf($fieldConf,$key); - $hasSet = $rel->find($filter, $options, $ttl); - if (!$hasSet) - return false; - $hasSetByRelId = array_unique($hasSet->getAll($fieldConf[1], true)); - return empty($hasSetByRelId) ? false : $hasSetByRelId; - } - - /** - * build sub query on relation - * @param $key - * @param $filter - * @param $options - * @return mixed - */ - protected function _refSubQuery($key, $filter, $options,$fields=null) { - $type = $this->fieldConf[$key]['relType']; - $fieldConf = $this->fieldConf[$key][$type]; - $rel = $this->getRelFromConf($fieldConf,$key); - $filter[0]=$this->queryParser->sql_quoteCondition($filter[0],$this->db); - return $rel->mapper->stringify(implode(',',array_map([$this->db,'quotekey'], - $fields?:[$rel->primary])),$filter,$options); - } - - /** - * return IDs of own mappers that match the given relation filter on pivot tables - * @param string $key - * @param array $filter - * @param array $options - * @param int $ttl - * @return array|false - */ - protected function _hasRefsInMM($key, $filter, $options, $ttl=0) { - $fieldConf = $this->fieldConf[$key]['has-many']; - $rel = $this->getRelInstance($fieldConf[0],null,$key,true); - $hasSet = $rel->find($filter,$options,$ttl); - $result = false; - if ($hasSet) { - $hasIDs = $hasSet->getAll('_id',true); - $mmTable = $this->mmTable($fieldConf,$key); - $pivot = $this->getRelInstance(null,array('db'=>$this->db,'table'=>$mmTable)); - $filter = [$key.' IN ?',$hasIDs]; - if ($fieldConf['isSelf']) { - $filter[0].= ' OR '.$key.'_ref IN ?'; - $filter[] = $hasIDs; - } - $pivotSet = $pivot->find($filter,null,$ttl); - if ($pivotSet) { - $result = $pivotSet->getAll($fieldConf['relField'],true); - if ($fieldConf['isSelf']) - $result = array_merge($result, - $pivotSet->getAll($fieldConf['relField'].'_ref',true)); - $result = array_diff(array_unique($result),$hasIDs); - } - } - return $result; - } - - /** - * build query for SQL pivot table join and merge conditions - */ - protected function _hasJoinMM_sql($key, $hasCond, &$filter, &$options) { - $fieldConf = $this->fieldConf[$key]['has-many']; - $relTable = $fieldConf['relTable']; - $hasJoin = array(); - $mmTable = $this->mmTable($fieldConf,$key); - if ($fieldConf['isSelf']) { - $relTable .= '_ref'; - $hasJoin[] = $this->_sql_left_join($this->primary,$this->table,$fieldConf['relField'].'_ref',$mmTable); - $hasJoin[] = $this->_sql_left_join($key,$mmTable,$fieldConf['relPK'], - [$fieldConf['relTable'],$relTable]); - // cross-linked - $hasJoin[] = $this->_sql_left_join($this->primary,$this->table, - $fieldConf['relField'],[$mmTable,$mmTable.'_c']); - $hasJoin[] = $this->_sql_left_join($key.'_ref',$mmTable.'_c',$fieldConf['relPK'], - [$fieldConf['relTable'],$relTable.'_c']); - $this->_sql_mergeRelCondition($hasCond,$relTable,$filter,$options); - $this->_sql_mergeRelCondition($hasCond,$relTable.'_c',$filter,$options,'OR'); - } else { - $hasJoin[] = $this->_sql_left_join($this->primary,$this->table,$fieldConf['relField'],$mmTable); - $hasJoin[] = $this->_sql_left_join($key,$mmTable,$fieldConf['relPK'],$relTable); - $this->_sql_mergeRelCondition($hasCond,$relTable,$filter,$options); - } - return $hasJoin; - } - - /** - * build query for single SQL table join and merge conditions - */ - protected function _hasJoin_sql($key, $table, $cond, &$filter, &$options) { - $relConf = $this->fieldConf[$key]['belongs-to-one']; - $relModel = is_array($relConf)?$relConf[0]:$relConf; - $rel = $this->getRelInstance($relModel,null,$key); - $fkey = is_array($this->fieldConf[$key]['belongs-to-one']) ? - $this->fieldConf[$key]['belongs-to-one'][1] : $rel->primary; - $alias = $table.'__'.$key; - $query = $this->_sql_left_join($key,$this->table,$fkey,[$table,$alias]); - $this->_sql_mergeRelCondition($cond,$alias,$filter,$options); - return $query; - } - - /** - * assemble SQL join query string - * @param string $skey - * @param string $sTable - * @param string $fkey - * @param string|array $fTable - * @return string - */ - protected function _sql_left_join($skey, $sTable, $fkey, $fTable) { - if (is_array($fTable)) - list($fTable,$fTable_alias) = $fTable; - $skey = $this->db->quotekey($skey); - $sTable = $this->db->quotekey($sTable); - $fkey = $this->db->quotekey($fkey); - $fTable = $this->db->quotekey($fTable); - if (isset($fTable_alias)) { - $fTable_alias = $this->db->quotekey($fTable_alias); - return 'LEFT JOIN '.$fTable.' AS '.$fTable_alias.' ON '.$sTable.'.'.$skey.' = '.$fTable_alias.'.'.$fkey; - } else - return 'LEFT JOIN '.$fTable.' ON '.$sTable.'.'.$skey.' = '.$fTable.'.'.$fkey; - } - - /** - * merge condition of relation with current condition - * @param array $cond condition of related model - * @param string $table table of related model - * @param array $filter current filter to merge with - * @param array $options current options to merge with - * @param string $glue - */ - protected function _sql_mergeRelCondition($cond, $table, &$filter, &$options, $glue='AND') { - if (!empty($cond[0])) { - $whereClause = '('.array_shift($cond[0]).')'; - $whereClause = $this->queryParser->sql_prependTableToFields($whereClause,$table); - if (!$filter) - $filter = array($whereClause); - elseif (!empty($filter[0])) - $filter[0] = '('.$this->queryParser->sql_prependTableToFields($filter[0],$this->table) - .') '.$glue.' '.$whereClause; - $filter = array_merge($filter, $cond[0]); - } - if ($cond[1] && isset($cond[1]['group'])) { - $hasGroup = preg_replace('/(\w+)/i', $table.'.$1', $cond[1]['group']); - $options['group'] .= ','.$hasGroup; - } - } - - /** - * add filter for loading related models - * @param string $key - * @param array $filter - * @param array $option - * @return $this - */ - public function filter($key, $filter=null, $option=null) { - if (is_int(strpos($key,'.'))) { - list($key,$fkey) = explode('.',$key,2); - if (!isset($this->relFilter[$key.'.'])) - $this->relFilter[$key.'.'] = array(); - $this->relFilter[$key.'.'][$fkey] = array($filter,$option); - } else - $this->relFilter[$key] = array($filter,$option); - return $this; - } - - /** - * removes one or all relation filter - * @param null|string $key - */ - public function clearFilter($key = null) { - if (!$key) - $this->relFilter = array(); - elseif(isset($this->relFilter[$key])) - unset($this->relFilter[$key]); - } - - /** - * merge the relation filter to the query criteria if it exists - * @param string $key - * @param array $crit - * @return array - */ - protected function mergeWithRelFilter($key, $crit) { - if (array_key_exists($key, $this->relFilter) && - !empty($this->relFilter[$key][0])) - $crit=$this->mergeFilter(array($this->relFilter[$key][0],$crit)); - return $crit; - } - - /** - * merge multiple filters - * @param array $filters - * @param string $glue - * @return array - */ - public function mergeFilter($filters, $glue='and') { - $crit = array(); - $params = array(); - if ($filters) { - foreach($filters as $filter) { - $crit[] = array_shift($filter); - $params = array_merge($params,$filter); - } - array_unshift($params,'( '.implode(' ) '.$glue.' ( ',$crit).' )'); - } - return $params; - } - - /** - * returns the option condition for a relation filter, if defined - * @param string $key - * @return array null - */ - protected function getRelFilterOption($key) { - return (array_key_exists($key, $this->relFilter) && - !empty($this->relFilter[$key][1])) - ? $this->relFilter[$key][1] : null; - } - - /** - * Delete object/s and reset ORM - * @param $filter - * @return bool - */ - public function erase($filter = null) { - $filter = $this->queryParser->prepareFilter($filter, $this->dbsType, $this->db); - if (!$filter) { - if ($this->emit('beforeerase')===false) - return false; - if ($this->fieldConf) { - // clear all m:m references - foreach($this->fieldConf as $key => $conf) - if (isset($conf['has-many']) && - $conf['has-many']['hasRel']=='has-many') { - $rel = $this->getRelInstance(null, array( - 'db'=>$this->db, - 'table'=>$this->mmTable($conf['has-many'],$key))); - $id = $this->get($conf['has-many']['relPK'],true); - $rel->erase(array($conf['has-many']['relField'].' = ?', $id)); - } - } - $this->mapper->erase(); - $this->emit('aftererase'); - } elseif($filter) - $this->mapper->erase($filter); - return true; - } - - /** - * Save mapped record - * @return mixed - **/ - function save() { - // update changed collections - $fields = $this->fieldConf; - if ($fields) - foreach($fields as $key=>$conf) - if (!empty($this->fieldsCache[$key]) && $this->fieldsCache[$key] instanceof CortexCollection - && $this->fieldsCache[$key]->hasChanged()) - $this->set($key,$this->fieldsCache[$key]->getAll('_id',true)); - // perform event & save operations - if ($new = $this->dry()) { - if ($this->emit('beforeinsert')===false) - return false; - $result=$this->insert(); - } else { - if ($this->emit('beforeupdate')===false) - return false; - $result=$this->update(); - } - // m:m save cascade - if (!empty($this->saveCsd)) { - foreach($this->saveCsd as $key => $val) { - if ($fields[$key]['relType'] == 'has-many') { - $relConf = $fields[$key]['has-many']; - if ($relConf['hasRel'] == 'has-many') { - $mmTable = $this->mmTable($relConf,$key); - $mm = $this->getRelInstance(null, array('db'=>$this->db, 'table'=>$mmTable)); - $id = $this->get($relConf['localKey'],true); - $filter = [$relConf['relField'].' = ?',$id]; - if ($relConf['isSelf']) { - $filter[0].= ' OR '.$relConf['relField'].'_ref = ?'; - $filter[] = $id; - } - // delete all refs - if (empty($val)) - $mm->erase($filter); - // update refs - elseif (is_array($val)) { - $mm->erase($filter); - foreach(array_unique($val) as $v) { - if ($relConf['isSelf'] && $v==$id) - continue; - $mm->set($key,$v); - $mm->set($relConf['relField'].($relConf['isSelf']?'_ref':''),$id); - $mm->save(); - $mm->reset(); - } - } - unset($mm); - } - elseif($relConf['hasRel'] == 'belongs-to-one') { - $rel = $this->getRelInstance($relConf[0],$relConf,$key); - // find existing relations - $refs = $rel->find([$relConf[1].' = ?',$this->getRaw($relConf['relField'])]); - if (empty($val)) { - foreach ($refs?:[] as $model) { - $model->set($relConf[1],NULL); - $model->save(); - } - $this->fieldsCache[$key] = NULL; - } else { - if ($refs) { - $ref_ids = $refs->getAll('_id'); - // unlink removed relations - $remove_refs = array_diff($ref_ids,$val); - foreach ($refs as $model) - if (in_array($model->getRaw($relConf['relField']),$remove_refs)) { - $model->set($relConf[1],null); - $model->save(); - } - // get new relation keys - $val = array_diff($val,$ref_ids); - } else - $refs = new CortexCollection(); - if (!empty($val)) { - // find models that need to be linked - $new_refs = $rel->find([$relConf['relField'].' IN ?',$val]); - foreach ($new_refs?:[] as $model) { - // set relation to new models - $model->set($relConf[1],$this->getRaw($relConf['relField'])); - $model->save(); - $refs->add($model); - } - } - $this->fieldsCache[$key] = $refs; - } - } - } elseif($fields[$key]['relType'] == 'has-one') { - $val->save(); - } - } - $this->saveCsd = array(); - } - $this->emit($new?'afterinsert':'afterupdate'); - return $result; - } - - /** - * Count records that match criteria - * @param null $filter - * @param array $options - * @param int $ttl - * @return mixed - */ - public function count($filter=NULL, array $options=NULL, $ttl=60) { - $has=$this->hasCond; - $count=$this->filteredFind($filter,$options,$ttl,true); - $this->hasCond=$has; - return $count; - } - - /** - * Count records that are currently loaded - * @return int - */ - public function loaded() { - return count($this->mapper->query); - } - - /** - * add a virtual field that counts occurring relations - * @param $key - */ - public function countRel($key, $alias=null, $filter=null, $option=null) { - if (!$alias) - $alias = 'count_'.$key; - $filter_bak = null; - if ($filter || $option) { - $filter_bak = isset($this->relFilter[$key]) ? $this->relFilter[$key] : false; - $this->filter($key,$filter,$option); - } - if (isset($this->fieldConf[$key])){ - // one-to-one, one-to-many - if ($this->fieldConf[$key]['relType'] == 'belongs-to-one') { - if ($this->dbsType == 'sql') { - $this->mapper->set($alias,'count('.$this->db->quotekey($key).')'); - $this->grp_stack=(!$this->grp_stack)?$key:$this->grp_stack.','.$key; - if ($this->whitelist && !in_array($alias,$this->whitelist)) - $this->whitelist[] = $alias; - } elseif ($this->dbsType == 'mongo') - $this->_mongo_addGroup(array( - 'keys'=>array($key=>1), - 'reduce' => 'prev.'.$alias.'++;', - "initial" => array($alias => 0) - )); - else - trigger_error('Cannot add direct relational counter.',E_USER_ERROR); - } elseif($this->fieldConf[$key]['relType'] == 'has-many') { - $relConf=$this->fieldConf[$key]['has-many']; - if ($relConf['hasRel']=='has-many') { - // many-to-many - if ($this->dbsType == 'sql') { - $mmTable = $this->mmTable($relConf,$key); - $filter = array($mmTable.'.'.$relConf['relField'] - .' = '.$this->table.'.'.$this->primary); - $from = $this->db->quotekey($mmTable); - if (array_key_exists($key, $this->relFilter) && - !empty($this->relFilter[$key][0])) { - $options=array(); - $from = $this->db->quotekey($mmTable).' '. - $this->_sql_left_join($key,$mmTable,$relConf['relPK'],$relConf['relTable']); - $relFilter = $this->relFilter[$key]; - $this->_sql_mergeRelCondition($relFilter,$relConf['relTable'], - $filter,$options); - } - $filter = $this->queryParser->prepareFilter($filter, - $this->dbsType, $this->db, $this->fieldConf); - $crit = array_shift($filter); - if (count($filter)>0) - $this->preBinds=array_merge($this->preBinds,$filter); - $this->mapper->set($alias, - '(select count('.$this->db->quotekey($mmTable.'.'.$relConf['relField']).')'. - ' from '.$from.' where '.$crit. - ' group by '.$this->db->quotekey($mmTable.'.'.$relConf['relField']).')'); - if ($this->whitelist && !in_array($alias,$this->whitelist)) - $this->whitelist[] = $alias; - } else { - // count rel - $this->countFields[]=$key; - } - } elseif($this->fieldConf[$key]['has-many']['hasRel']=='belongs-to-one') { - // many-to-one - if ($this->dbsType == 'sql') { - $fConf=$relConf[0]::resolveConfiguration(); - $fTable=$fConf['table']; - $fAlias=$fTable.'__count'; - $rKey=$relConf[1]; - $crit = $fAlias.'.'.$rKey.' = '.$this->table.'.'.$relConf['relField']; - $filter = $this->mergeWithRelFilter($key,array($crit)); - $filter[0] = $this->queryParser->sql_prependTableToFields($filter[0],$fAlias); - $filter = $this->queryParser->prepareFilter($filter, - $this->dbsType, $this->db, $this->fieldConf); - $crit = array_shift($filter); - if (count($filter)>0) - $this->preBinds=array_merge($this->preBinds,$filter); - $this->mapper->set($alias, - '(select count('.$this->db->quotekey($fAlias.'.'.$fConf['primary']).') from '. - $this->db->quotekey($fTable).' AS '.$this->db->quotekey($fAlias).' where '. - $crit.' group by '.$this->db->quotekey($fAlias.'.'.$rKey).')'); - if ($this->whitelist && !in_array($alias,$this->whitelist)) - $this->whitelist[] = $alias; - } else { - // count rel - $this->countFields[]=$key; - } - } - } - } - if ($filter_bak!==null) { - if ($filter_bak) - $this->relFilter[$key] = $filter_bak; - else - $this->clearFilter($key); - } - } - - /** - * merge mongo group options array - * @param $opt - */ - protected function _mongo_addGroup($opt) { - if (!$this->grp_stack) - $this->grp_stack = array('keys'=>array(),'initial'=>array(),'reduce'=>'','finalize'=>''); - if (isset($opt['keys'])) - $this->grp_stack['keys']+=$opt['keys']; - if (isset($opt['reduce'])) - $this->grp_stack['reduce'].=$opt['reduce']; - if (isset($opt['initial'])) - $this->grp_stack['initial']+=$opt['initial']; - if (isset($opt['finalize'])) - $this->grp_stack['finalize'].=$opt['finalize']; - } - - /** - * update a given date or time field with the current time - * @param string $key - */ - public function touch($key) { - if (isset($this->fieldConf[$key]) - && isset($this->fieldConf[$key]['type'])) { - $type = $this->fieldConf[$key]['type']; - $date = ($this->dbsType=='sql' && preg_match('/mssql|sybase|dblib|odbc|sqlsrv/', - $this->db->driver())) ? 'Ymd' : 'Y-m-d'; - if ($type == Schema::DT_DATETIME || $type == Schema::DT_TIMESTAMP) - $this->set($key,date($date.' H:i:s')); - elseif ($type == Schema::DT_DATE) - $this->set($key,date($date)); - elseif ($type == Schema::DT_INT4) - $this->set($key,time()); - } - } - - /** - * Bind value to key - * @return mixed - * @param $key string - * @param $val mixed - */ - function set($key, $val) { - if ($key == '_id' && $this->dbsType == 'sql') - $key = $this->primary; - $fields = $this->fieldConf; - unset($this->fieldsCache[$key]); - // pre-process if field config available - if (!empty($fields) && isset($fields[$key]) && is_array($fields[$key])) { - // handle relations - if (isset($fields[$key]['belongs-to-one'])) { - // one-to-many, one-to-one - if (empty($val)) - $val = NULL; - elseif (is_object($val) && - !($this->dbsType=='mongo' && ( - ($this->db->legacy() && $val instanceof \MongoId) || - (!$this->db->legacy() && $val instanceof \MongoDB\BSON\ObjectId)))) { - // fetch fkey from mapper - if (!$val instanceof Cortex || $val->dry()) - trigger_error(self::E_INVALID_RELATION_OBJECT,E_USER_ERROR); - else { - $relConf = $fields[$key]['belongs-to-one']; - $rel_field = (is_array($relConf) ? $relConf[1] : '_id'); - $val = $val->get($rel_field,true); - } - } elseif ($this->dbsType == 'mongo' && (($this->db->legacy() && !$val instanceof \MongoId) - || (!$this->db->legacy() && !$val instanceof \MongoDB\BSON\ObjectId))) - $val = $this->db->legacy() ? new \MongoId($val) : new \MongoDB\BSON\ObjectId($val); - } elseif (isset($fields[$key]['has-one'])){ - $relConf = $fields[$key]['has-one']; - if (empty($val)) { - $val = $this->get($key); - $val->set($relConf[1],NULL); - } else { - if (!$val instanceof Cortex) { - $rel = $this->getRelInstance($relConf[0],null,$key); - $rel->load(array('_id = ?', $val)); - $val = $rel; - } - $val->set($relConf[1], $this->_id); - } - $this->saveCsd[$key] = $val; - return $val; - } elseif (isset($fields[$key]['belongs-to-many'])) { - // many-to-many, unidirectional - $fields[$key]['type'] = self::DT_JSON; - $relConf = $fields[$key]['belongs-to-many']; - $rel_field = (is_array($relConf) ? $relConf[1] : '_id'); - $val = $this->getForeignKeysArray($val, $rel_field, $key); - } - elseif (isset($fields[$key]['has-many'])) { - $relConf = $fields[$key]['has-many']; - // many-to-many, bidirectional - // many-to-one, inverse - if ($relConf['hasRel'] == 'has-many' - || $relConf['hasRel'] == 'belongs-to-one') { - // custom setter - $val = $this->emit('set_'.$key, $val); - $val = $this->getForeignKeysArray($val,'_id',$key); - if (empty($val) && is_array($val)) - $val=new CortexCollection(); - $this->saveCsd[$key] = $val; // array of keys - $this->fieldsCache[$key] = $val; - return $val; - } - } - // add nullable polyfill - if ($val === NULL && ($this->dbsType == 'jig' || $this->dbsType == 'mongo') - && array_key_exists('nullable', $fields[$key]) && $fields[$key]['nullable'] === false) - trigger_error(sprintf(self::E_NULLABLE_COLLISION,$key),E_USER_ERROR); - // MongoId shorthand - if ($this->dbsType == 'mongo' && (($this->db->legacy() && !$val instanceof \MongoId) - || (!$this->db->legacy() && !$val instanceof \MongoDB\BSON\ObjectId))) { - if ($key == '_id') - $val = $this->db->legacy() ? new \MongoId($val) : new \MongoDB\BSON\ObjectId($val); - elseif (preg_match('/INT/i',$fields[$key]['type']) - && !isset($fields[$key]['relType'])) - $val = (int) $val; - } - // cast boolean - if (preg_match('/BOOL/i',$fields[$key]['type'])) { - $val = !$val || $val==='false' ? false : (bool) $val; - if ($this->dbsType == 'sql') - $val = (int) $val; - } - // custom setter - $val = $this->emit('set_'.$key, $val); - // clean datetime - if (isset($fields[$key]['type']) && empty($val) && - in_array($fields[$key]['type'], [Schema::DT_DATE,Schema::DT_DATETIME]) - ) - $val=NULL; - // convert array content - if (is_array($val) && $this->dbsType == 'sql') { - if ($fields[$key]['type']==self::DT_SERIALIZED) - $val=serialize($val); - elseif ($fields[$key]['type']==self::DT_JSON) - $val=json_encode($val); - else - trigger_error(sprintf(self::E_ARRAY_DATATYPE,$key),E_USER_ERROR); - } - } else { - // custom setter - $val = $this->emit('set_'.$key, $val); - } - // fluid SQL - if ($this->fluid && $this->dbsType == 'sql') { - $schema = new Schema($this->db); - $table = $schema->alterTable($this->table); - // add missing field - if (!in_array($key,$table->getCols())) { - // determine data type - if (isset($this->fieldConf[$key]) && isset($this->fieldConf[$key]['type'])) - $type = $this->fieldConf[$key]['type']; - elseif (is_int($val)) $type = $schema::DT_INT; - elseif (is_double($val)) $type = $schema::DT_DOUBLE; - elseif (is_float($val)) $type = $schema::DT_FLOAT; - elseif (is_bool($val)) $type = $schema::DT_BOOLEAN; - elseif (strlen($val)>10 && strtotime($val)) $type = $schema::DT_DATETIME; - elseif (date('Y-m-d H:i:s', strtotime($val)) == $val) $type = $schema::DT_DATETIME; - elseif (date('Y-m-d', strtotime($val)) == $val) $type = $schema::DT_DATE; - elseif (\UTF::instance()->strlen($val)<=255) $type = $schema::DT_VARCHAR256; - else $type = $schema::DT_TEXT; - $table->addColumn($key)->type($type); - $table->build(); - // update mapper fields - $newField = $table->getCols(true); - $newField = $newField[$key]; - $fields = $this->mapper->schema(); - $fields[$key] = $newField + array('value'=>NULL,'initial'=>NULL,'changed'=>NULL); - $this->mapper->schema($fields); - } - } - return $this->mapper->set($key, $val); - } - - /** - * call custom field handlers - * @param $event - * @param $val - * @return mixed - */ - protected function emit($event, $val=null) { - if (isset($this->trigger[$event])) { - if (preg_match('/^[sg]et_/',$event)) { - $val = (is_string($f=$this->trigger[$event]) - && preg_match('/^[sg]et_/',$f)) - ? call_user_func(array($this,$event),$val) - : \Base::instance()->call($f,array($this,$val)); - } else - $val = \Base::instance()->call($this->trigger[$event],array($this,$val)); - } elseif (preg_match('/^[sg]et_/',$event) && method_exists($this,$event)) { - $this->trigger[] = $event; - $val = call_user_func(array($this,$event),$val); - } - return $val; - } - - /** - * Define a custom field setter - * @param $key - * @param $func - */ - public function onset($key, $func) { - $this->trigger['set_'.$key] = $func; - } - - /** - * Define a custom field getter - * @param $key - * @param $func - */ - public function onget($key, $func) { - $this->trigger['get_'.$key] = $func; - } - - /** - * virtual mapper field setter - * @param string $key - * @param mixed|callback $val - */ - public function virtual($key, $val) { - $this->vFields[$key]=$val; - if (!empty($this->whitelist)) { - $this->whitelist[] = $key; - $this->whitelist = array_unique($this->whitelist); - } - } - - /** - * reset virtual fields - * @param string $key - */ - public function clearVirtual($key=NULL) { - if ($key) - unset($this->vFields[$key]); - else - $this->vFields=[]; - } - - /** - * Retrieve contents of key - * @return mixed - * @param string $key - * @param bool $raw - */ - function &get($key, $raw = false) { - // handle virtual fields - if (isset($this->vFields[$key])) { - $out = (is_callable($this->vFields[$key])) - ? call_user_func($this->vFields[$key], $this) : $this->vFields[$key]; - return $out; - } - $fields = $this->fieldConf; - $id = $this->primary; - if ($key == '_id' && $this->dbsType == 'sql') - $key = $id; - if ($this->whitelist && !in_array($key,$this->whitelist)) { - $out = null; - return $out; - } - if ($raw) { - $out = $this->exists($key) ? $this->mapper->{$key} : NULL; - if ($this->dbsType == 'mongo' && !$this->db->legacy() && $out instanceof \MongoDB\Model\BSONArray) - $out = (array) $out; - return $out; - } - if (!empty($fields) && isset($fields[$key]) && is_array($fields[$key]) - && !array_key_exists($key,$this->fieldsCache)) { - // load relations - if (isset($fields[$key]['belongs-to-one'])) { - // one-to-X, bidirectional, direct way - if (!$this->exists($key) || is_null($this->mapper->{$key})) - $this->fieldsCache[$key] = null; - else { - // get config for this field - $relConf = $fields[$key]['belongs-to-one']; - // fetch related model - $rel = $this->getRelFromConf($relConf,$key); - // am i part of a result collection? - if ($cx = $this->getCollection()) { - // does the collection has cached results for this key? - if (!$cx->hasRelSet($key)) { - // build the cache, find all values of current key - $relKeys = array_unique($cx->getAll($key,true)); - // find related models - $crit = array($relConf[1].' IN ?', $relKeys); - $relSet = $rel->find($this->mergeWithRelFilter($key, $crit), - $this->getRelFilterOption($key),$this->_ttl); - // cache relSet, sorted by ID - $cx->setRelSet($key, $relSet ? $relSet->getBy($relConf[1]) : NULL); - } - // get a subset of the preloaded set - $result = $cx->getSubset($key,(string) $this->get($key,true)); - $this->fieldsCache[$key] = $result ? $result[0] : NULL; - } else { - $crit = array($relConf[1].' = ?', $this->get($key, true)); - $crit = $this->mergeWithRelFilter($key, $crit); - $this->fieldsCache[$key] = $rel->findone($crit, - $this->getRelFilterOption($key),$this->_ttl); - } - } - } - elseif (($type = isset($fields[$key]['has-one'])) - || isset($fields[$key]['has-many'])) { - $type = $type ? 'has-one' : 'has-many'; - $fromConf = $fields[$key][$type]; - if (!is_array($fromConf)) - trigger_error(sprintf(self::E_REL_CONF_INC, $key),E_USER_ERROR); - $rel = $this->getRelInstance($fromConf[0],null,$key,true); - $relFieldConf = $rel->getFieldConfiguration(); - $relType = isset($relFieldConf[$fromConf[1]]['belongs-to-one']) ? - 'belongs-to-one' : 'has-many'; - // one-to-*, bidirectional, inverse way - if ($relType == 'belongs-to-one') { - $toConf = $relFieldConf[$fromConf[1]]['belongs-to-one']; - if (!is_array($toConf)) - $toConf = array($toConf, $id); - if ($toConf[1] != $id && (!$this->exists($toConf[1]) - || is_null($this->mapper->get($toConf[1])))) - $this->fieldsCache[$key] = null; - elseif ($cx=$this->getCollection()) { - // part of a result set - if (!$cx->hasRelSet($key)) { - // emit eager loading - $relKeys = $cx->getAll($toConf[1],true); - $crit = array($fromConf[1].' IN ?', $relKeys); - $relSet = $rel->find($this->mergeWithRelFilter($key,$crit), - $this->getRelFilterOption($key),$this->_ttl); - $cx->setRelSet($key, $relSet ? $relSet->getBy($fromConf[1],true) : NULL); - } - $result = $cx->getSubset($key, array($this->get($toConf[1]))); - $this->fieldsCache[$key] = $result ? (($type == 'has-one') - ? $result[0][0] : CortexCollection::factory($result[0])) : NULL; - } // no collection - elseif (($val=$this->getRaw($toConf[1])) && $val!==NULL) { - $crit=[$fromConf[1].' = ?',$val]; - $crit=$this->mergeWithRelFilter($key,$crit); - $opt=$this->getRelFilterOption($key); - $this->fieldsCache[$key]=(($type=='has-one') - ?$rel->findone($crit,$opt,$this->_ttl) - :$rel->find($crit,$opt,$this->_ttl))?:NULL; - } else - $this->fieldsCache[$key] = NULL; - } - // many-to-many, bidirectional - elseif ($relType == 'has-many') { - $toConf = $relFieldConf[$fromConf[1]]['has-many']; - $mmTable = $this->mmTable($fromConf,$key,$toConf); - // create mm table mapper - if (!$this->get($id,true)) { - $this->fieldsCache[$key] = null; - return $this->fieldsCache[$key]; - } - $id = $toConf['relPK']; - $rel = $this->getRelInstance(null,array('db'=>$this->db,'table'=>$mmTable)); - if ($cx = $this->getCollection()) { - if (!$cx->hasRelSet($key)) { - // get IDs of all results - $relKeys = $cx->getAll($id,true); - // get all pivot IDs - $filter = [$fromConf['relField'].' IN ?',$relKeys]; - if ($fromConf['isSelf']) { - $filter[0].= ' OR '.$fromConf['relField'].'_ref IN ?'; - $filter[] = $relKeys; - } - $mmRes = $rel->find($filter,null,$this->_ttl); - if (!$mmRes) - $cx->setRelSet($key, NULL); - else { - $pivotRel = array(); - $pivotKeys = array(); - foreach($mmRes as $model) { - $val = $model->get($key,true); - if ($fromConf['isSelf']) { - $refVal = $model->get($fromConf['relField'].'_ref',true); - $pivotRel[(string) $refVal][] = $val; - $pivotRel[(string) $val][] = $refVal; - $pivotKeys[] = $val; - $pivotKeys[] = $refVal; - } else { - $pivotRel[ (string) $model->get($fromConf['relField'])][] = $val; - $pivotKeys[] = $val; - } - } - // cache pivot keys - $cx->setRelSet($key.'_pivot', $pivotRel); - // preload all rels - $pivotKeys = array_unique($pivotKeys); - $fRel = $this->getRelInstance($fromConf[0],null,$key,true); - $crit = array($id.' IN ?', $pivotKeys); - $relSet = $fRel->find($this->mergeWithRelFilter($key, $crit), - $this->getRelFilterOption($key),$this->_ttl); - $cx->setRelSet($key, $relSet ? $relSet->getBy($id) : NULL); - unset($fRel); - } - } - // fetch subset from preloaded rels using cached pivot keys - $fkeys = $cx->getSubset($key.'_pivot', array($this->get($id))); - $this->fieldsCache[$key] = $fkeys ? - CortexCollection::factory($cx->getSubset($key, $fkeys[0])) : NULL; - } // no collection - else { - // find foreign keys - $fId=$this->get($fromConf['localKey'],true); - $filter = [$fromConf['relField'].' = ?',$fId]; - if ($fromConf['isSelf']) { - $filter = [$fromConf['relField'].' = ?',$fId]; - $filter[0].= ' OR '.$fromConf['relField'].'_ref = ?'; - $filter[] = $filter[1]; - } - $results = $rel->find($filter,null,$this->_ttl); - if (!$results) - $this->fieldsCache[$key] = NULL; - else { - $fkeys = $results->getAll($key,true); - if ($fromConf['isSelf']) { - // merge both rel sides and remove itself - $fkeys = array_diff(array_merge($fkeys, - $results->getAll($key.'_ref',true)),[$fId]); - } - // create foreign table mapper - unset($rel); - $rel = $this->getRelInstance($fromConf[0],null,$key,true); - // load foreign models - $filter = array($fromConf['relPK'].' IN ?', $fkeys); - $filter = $this->mergeWithRelFilter($key, $filter); - $this->fieldsCache[$key] = $rel->find($filter, - $this->getRelFilterOption($key),$this->_ttl); - } - } - } - } - elseif (isset($fields[$key]['belongs-to-many'])) { - // many-to-many, unidirectional - $fields[$key]['type'] = self::DT_JSON; - $result = $this->getRaw($key); - if ($this->dbsType == 'sql') - $result = json_decode($result, true); - if (!is_array($result)) - $this->fieldsCache[$key] = $result; - else { - // create foreign table mapper - $relConf = $fields[$key]['belongs-to-many']; - $rel = $this->getRelFromConf($relConf,$key); - $fkeys = array(); - foreach ($result as $el) - $fkeys[] = (is_int($el)||ctype_digit($el))?(int)$el:(string)$el; - // if part of a result set - if ($cx = $this->getCollection()) { - if (!$cx->hasRelSet($key)) { - // find all keys - $relKeys = ($cx->getAll($key,true)); - if ($this->dbsType == 'sql'){ - foreach ($relKeys as &$val) { - $val = substr($val, 1, -1); - unset($val); - } - $relKeys = json_decode('['.implode(',',$relKeys).']'); - } else - $relKeys = call_user_func_array('array_merge', $relKeys); - // get related models - if (!empty($relKeys)) { - $crit = array($relConf[1].' IN ?', array_unique($relKeys)); - $relSet = $rel->find($this->mergeWithRelFilter($key, $crit), - $this->getRelFilterOption($key),$this->_ttl); - // cache relSet, sorted by ID - $cx->setRelSet($key, $relSet ? $relSet->getBy($relConf[1]) : NULL); - } else - $cx->setRelSet($key, NULL); - } - // get a subset of the preloaded set - $this->fieldsCache[$key] = CortexCollection::factory($cx->getSubset($key, $fkeys)); - } else { - // load foreign models - $filter = array($relConf[1].' IN ?', $fkeys); - $filter = $this->mergeWithRelFilter($key, $filter); - $this->fieldsCache[$key] = $rel->find($filter, - $this->getRelFilterOption($key),$this->_ttl); - } - } - } - // resolve array fields - elseif (isset($fields[$key]['type'])) { - if ($this->dbsType == 'sql') { - if ($fields[$key]['type'] == self::DT_SERIALIZED) - $this->fieldsCache[$key] = unserialize($this->mapper->{$key}); - elseif ($fields[$key]['type'] == self::DT_JSON) - $this->fieldsCache[$key] = json_decode($this->mapper->{$key},true); - } - if ($this->exists($key) && preg_match('/BOOL/i',$fields[$key]['type'])) { - $this->fieldsCache[$key] = (bool) $this->mapper->{$key}; - } - } - } - // fetch cached value, if existing - // TODO: fix array key reference editing, #71 -// if (array_key_exists($key,$this->fieldsCache)) -// $val = $this->fieldsCache[$key]; -// elseif ($this->exists($key)) { -// $val =& $this->mapper->{$key}; -// } else -// $val = NULL; - $val = array_key_exists($key,$this->fieldsCache) ? $this->fieldsCache[$key] - : (($this->exists($key)) ? $this->mapper->{$key} : null); - if ($this->dbsType == 'mongo' && (($this->db->legacy() && $val instanceof \MongoId) || - (!$this->db->legacy() && $val instanceof \MongoDB\BSON\ObjectId))) { - // conversion to string makes further processing in template, etc. much easier - $val = (string) $val; - } - // custom getter - $out = $this->emit('get_'.$key, $val); - return $out; - } - - /** - * return raw value of a field - * @param $key - * @return mixed - */ - function &getRaw($key) { - return $this->get($key, true); - } - - /** - * find the ID values of given relation collection - * @param $val string|array|object|bool - * @param $rel_field string - * @param $key string - * @return array|Cortex|null|object - */ - protected function getForeignKeysArray($val, $rel_field, $key) { - if (is_null($val)) - return NULL; - if (is_object($val) && $val instanceof CortexCollection) - $val = $val->getAll($rel_field,true); - elseif (is_string($val)) - // split-able string of collection IDs - $val = \Base::instance()->split($val); - elseif (!is_array($val) && !(is_object($val) - && ($val instanceof Cortex && !$val->dry()))) - trigger_error(sprintf(self::E_MM_REL_VALUE, $key),E_USER_ERROR); - // hydrated mapper as collection - if (is_object($val)) { - $nval = array(); - while (!$val->dry()) { - $nval[] = $val->get($rel_field,true); - $val->next(); - } - $val = $nval; - } - elseif (is_array($val)) { - // array of single hydrated mappers, raw ID value or mixed - $isMongo = ($this->dbsType == 'mongo'); - foreach ($val as &$item) { - if (is_object($item) && - !($isMongo && (($this->db->legacy() && $item instanceof \MongoId) || - (!$this->db->legacy() && $item instanceof \MongoDB\BSON\ObjectId)))) { - if (!$item instanceof Cortex || $item->dry()) - trigger_error(self::E_INVALID_RELATION_OBJECT,E_USER_ERROR); - else $item = $item->get($rel_field,true); - } - if ($isMongo && $rel_field == '_id' && is_string($item)) - $item = $this->db->legacy() ? new \MongoId($item) : new \MongoDB\BSON\ObjectId($item); - if (is_numeric($item)) - $item = (int) $item; - unset($item); - } - } - return $val; - } - - /** - * creates and caches related mapper objects - * @param string $model - * @param array $relConf - * @param string $key - * @param bool $pushFilter - * @return Cortex - */ - protected function getRelInstance($model=null, $relConf=null, $key='', $pushFilter=false) { - if (!$model && !$relConf) - trigger_error(self::E_MISSING_REL_CONF,E_USER_ERROR); - $relConf = $model ? $model::resolveConfiguration() : $relConf; - $relName = ($model?:'Cortex').'\\'.$relConf['db']->uuid(). - '\\'.$relConf['table'].'\\'.$key; - if (\Registry::exists($relName)) { - $rel = \Registry::get($relName); - $rel->reset(); - } else { - $rel = $model ? new $model : new Cortex($relConf['db'], $relConf['table']); - if (!$rel instanceof Cortex) - trigger_error(self::E_WRONG_RELATION_CLASS,E_USER_ERROR); - \Registry::set($relName, $rel); - } - // restrict fields of related mapper - if(!empty($key) && isset($this->relWhitelist[$key])) { - if (isset($this->relWhitelist[$key][0])) - $rel->fields($this->relWhitelist[$key][0],false); - if (isset($this->relWhitelist[$key][1])) - $rel->fields($this->relWhitelist[$key][1],true); - } - if ($pushFilter && !empty($key)) { - if (isset($this->relFilter[$key.'.'])) { - foreach($this->relFilter[$key.'.'] as $fkey=>$conf) - $rel->filter($fkey,$conf[0],$conf[1]); - } - if (isset($this->hasCond[$key.'.'])) { - foreach($this->hasCond[$key.'.'] as $fkey=>$conf) - $rel->has($fkey,$conf[0],$conf[1]); - } - } - return $rel; - } - - /** - * get relation model from config - * @param $relConf - * @param $key - * @return Cortex - */ - protected function getRelFromConf(&$relConf, $key) { - if (!is_array($relConf)) - $relConf = array($relConf, '_id'); - $rel = $this->getRelInstance($relConf[0],null,$key,true); - if($this->dbsType=='sql' && $relConf[1] == '_id') - $relConf[1] = $rel->primary; - return $rel; - } - - /** - * returns a clean/dry model from a relation - * @param string $key - * @return Cortex - */ - public function rel($key) { - $rt = $this->fieldConf[$key]['relType']; - $rc = $this->fieldConf[$key][$rt]; - if (!is_array($rc)) - $rc = array($rc,'_id'); - return $this->getRelInstance($rc[0],null,$key); - } - - /** - * Return fields of mapper object as an associative array - * @return array - * @param bool|Cortex $obj - * @param int|array $rel_depths depths to resolve relations - */ - public function cast($obj = NULL, $rel_depths = 1) { - $fields = $this->mapper->cast( ($obj) ? $obj->mapper : null ); - if (!empty($this->vFields)) - foreach(array_keys($this->vFields) as $key) - $fields[$key]=$this->get($key); - if (is_int($rel_depths)) - $rel_depths = array('*'=>$rel_depths-1); - elseif (is_array($rel_depths)) - $rel_depths['*'] = isset($rel_depths['*'])?--$rel_depths['*']:-1; - if ($this->fieldConf) { - $fields += array_fill_keys(array_keys($this->fieldConf),NULL); - if ($this->whitelist) - $fields = array_intersect_key($fields, array_flip($this->whitelist)); - $mp = $obj ? : $this; - foreach ($fields as $key => &$val) { - // post process configured fields - if (isset($this->fieldConf[$key]) && is_array($this->fieldConf[$key])) { - // handle relations - $rd = isset($rel_depths[$key]) ? $rel_depths[$key] : $rel_depths['*']; - if ((is_array($rd) || $rd >= 0) && $type=preg_grep('/[belongs|has]-(to-)*[one|many]/', - array_keys($this->fieldConf[$key]))) { - $relType=current($type); - // cast relations - $val = (($relType == 'belongs-to-one' || $relType == 'belongs-to-many') - && !$mp->exists($key)) ? NULL : $mp->get($key); - if ($val instanceof Cortex) - $val = $val->cast(null, $rd); - elseif ($val instanceof CortexCollection) - $val = $val->castAll($rd); - } - // extract array fields - elseif (isset($this->fieldConf[$key]['type'])) { - if ($this->dbsType == 'sql') { - if ($this->fieldConf[$key]['type'] == self::DT_SERIALIZED) - $val=unserialize($mp->mapper->{$key}); - elseif ($this->fieldConf[$key]['type'] == self::DT_JSON) - $val=json_decode($mp->mapper->{$key}, true); - } - if ($this->exists($key) - && preg_match('/BOOL/i',$this->fieldConf[$key]['type'])) { - $val = (bool) $mp->mapper->{$key}; - } - } - } - if ($this->dbsType == 'mongo' && $key == '_id') - $val = (string) $val; - if ($this->dbsType == 'sql' && $key == 'id' && $this->standardiseID) { - $fields['_id'] = $val; - unset($fields[$key]); - } - unset($val); - } - } - // custom getter - foreach ($fields as $key => &$val) { - $val = $this->emit('get_'.$key, $val); - unset($val); - } - return $fields; - } - - /** - * cast a related collection of mappers - * @param string $key field name - * @param int $rel_depths depths to resolve relations - * @return array array of associative arrays - */ - function castField($key, $rel_depths=0) { - if (!$key) - return NULL; - $mapper_arr = $this->get($key); - if(!$mapper_arr) - return NULL; - $out = array(); - foreach ($mapper_arr as $mp) - $out[] = $mp->cast(null,$rel_depths); - return $out; - } - - /** - * wrap result mapper - * @param Cursor|array $mapper - * @return Cortex - */ - protected function factory($mapper) { - if (is_array($mapper)) { - $mp = clone($this->mapper); - $mp->reset(); - $cx = $this->factory($mp); - $cx->copyfrom($mapper); - } else { - $cx = clone($this); - $cx->reset(false); - $cx->mapper = $mapper; - } - $cx->emit('load'); - return $cx; - } - - public function dry() { - return $this->mapper->dry(); - } - - /** - * hydrate the mapper from hive key or given array - * @param string|array $key - * @param callback|array|string $fields - * @return NULL - */ - public function copyfrom($key, $fields = null) { - $f3 = \Base::instance(); - $srcfields = is_array($key) ? $key : $f3->get($key); - if ($fields) - if (is_callable($fields)) - $srcfields = $fields($srcfields); - else { - if (is_string($fields)) - $fields = $f3->split($fields); - $srcfields = array_intersect_key($srcfields, array_flip($fields)); - } - foreach ($srcfields as $key => $val) { - if (isset($this->fieldConf[$key]) && isset($this->fieldConf[$key]['type'])) { - if ($this->fieldConf[$key]['type'] == self::DT_JSON && is_string($val)) - $val = json_decode($val); - elseif ($this->fieldConf[$key]['type'] == self::DT_SERIALIZED && is_string($val)) - $val = unserialize($val); - } - $this->set($key, $val); - } - } - - /** - * copy mapper values into hive key - * @param string $key the hive key to copy into - * @param int $relDepth the depth of relations to resolve - * @return NULL|void - */ - public function copyto($key, $relDepth=0) { - \Base::instance()->set($key, $this->cast(null,$relDepth)); - } - - /** - * copy to hive key with relations being simple arrays of keys - * @param $key - */ - function copyto_flat($key) { - /** @var \Base $f3 */ - $f3 = \Base::instance(); - $this->copyto($key); - foreach ($this->fields() as $field) { - if (isset($this->fieldConf[$field]) && isset($this->fieldConf[$field]['relType']) - && $this->fieldConf[$field]['relType']=='has-many' - && $f3->devoid($key.'.'.$field)) { - $val = $this->get($field); - if ($val instanceof CortexCollection) - $f3->set($key.'.'.$field,$val->getAll('_id')); - elseif (is_array($val)) - $f3->set($key.'.'.$field,$val); - else - $f3->clear($key.'.'.$field); - } - } - } - - public function skip($ofs = 1) { - $this->reset(false); - if ($this->mapper->skip($ofs)) - return $this; - else - $this->reset(false); - } - - public function first() { - $this->reset(false); - $this->mapper->first(); - return $this; - } - - public function last() { - $this->reset(false); - $this->mapper->last(); - return $this; - } - - /** - * reset and re-initialize the mapper - * @param bool $mapper - * @return NULL|void - */ - public function reset($mapper = true) { - if ($mapper) - $this->mapper->reset(); - $this->fieldsCache=[]; - $this->saveCsd=[]; - $this->countFields=[]; - $this->preBinds=[]; - $this->grp_stack=null; - // set default values - if (($this->dbsType == 'jig' || $this->dbsType == 'mongo') - && !empty($this->fieldConf)) - foreach($this->fieldConf as $field_key => $field_conf) - if (array_key_exists('default',$field_conf)) { - $val = ($field_conf['default'] === \DB\SQL\Schema::DF_CURRENT_TIMESTAMP) - ? date('Y-m-d H:i:s') : $field_conf['default']; - $this->set($field_key, $val); - } - } - - /** - * reset only specific fields and return to their default values - * @param array $fields - */ - public function resetFields(array $fields) { - $defaults = $this->defaults(); - foreach ($fields as $field) { - unset($this->fieldsCache[$field]); - unset($this->saveCsd[$field]); - if (isset($defaults[$field])) - $this->set($field,$defaults[$field]); - else { - $this->set($field,NULL); - } - } - } - - /** - * return default values from schema configuration - * @param bool $set set default values to mapper - * @return array - */ - function defaults($set=false) { - $out = []; - $fields = $this->fieldConf; - if ($this->dbsType == 'sql') - $fields = array_replace_recursive($this->mapper->schema(),$fields); - foreach($fields as $field_key => $field_conf) - if (array_key_exists('default',$field_conf)) { - $val = ($field_conf['default'] === \DB\SQL\Schema::DF_CURRENT_TIMESTAMP) - ? date('Y-m-d H:i:s') : $field_conf['default']; - if ($val!==NULL) { - $out[$field_key]=$val; - if ($set) - $this->set($field_key, $val); - } - } - return $out; - } - - /** - * check if a certain field exists in the mapper or - * or is a virtual relation field - * @param string $key - * @param bool $relField - * @return bool - */ - function exists($key, $relField = false) { - if (!$this->dry() && $key == '_id') return true; - return $this->mapper->exists($key) || - ($relField && isset($this->fieldConf[$key]['relType'])); - } - - /** - * return TRUE if any/specified field value has changed - * @param string $key - * @return mixed - */ - public function changed($key=null) { - if ($key=='_id') - $key = $this->primary; - if (method_exists($this->mapper,'changed')) - return $this->mapper->changed($key); - else - trigger_error('method does not exist on mapper',E_USER_ERROR); - } - - /** - * clear any mapper field or relation - * @param string $key - * @return NULL|void - */ - function clear($key) { - unset($this->fieldsCache[$key]); - if (isset($this->fieldConf[$key]['relType'])) - $this->set($key,null); - $this->mapper->clear($key); - } - - function insert() { - $res = $this->mapper->insert(); - if (is_array($res)) - $res = $this->mapper; - if (is_object($res)) - $res = $this->factory($res); - return is_int($res) ? $this : $res; - } - - function update() { - $res = $this->mapper->update(); - if (is_array($res)) - $res = $this->mapper; - if (is_object($res)) - $res = $this->factory($res); - return is_int($res) ? $this : $res; - } - - function dbtype() { - return $this->mapper->dbtype(); - } - - public function __clone() { - $this->mapper = clone($this->mapper); - } - - function getiterator() { -// return new \ArrayIterator($this->cast(null,false)); - return new \ArrayIterator(array()); - } -} - - -class CortexQueryParser extends \Prefab { - - const - E_BRACKETS = 'Invalid query: unbalanced brackets found', - E_INBINDVALUE = 'Bind value for IN operator must be a populated array', - E_ENGINEERROR = 'Engine not supported', - E_MISSINGBINDKEY = 'Named bind parameter `%s` does not exist in filter arguments'; - - protected - $queryCache = array(); - - /** - * converts the given filter array to fit the used DBS - * - * example filter: - * array('text = ? AND num = ?','bar',5) - * array('num > ? AND num2 <= ?',5,10) - * array('num1 > num2') - * array('text like ?','%foo%') - * array('(text like ? OR text like ?) AND num != ?','foo%','%bar',23) - * - * @param array $cond - * @param string $engine - * @param object $db - * @param null $fieldConf - * @return array|bool|null - */ - public function prepareFilter($cond, $engine, $db, $fieldConf=null) { - if (is_null($cond)) return $cond; - if (is_string($cond)) - $cond = array($cond); - $f3 = \Base::instance(); - $cacheHash = $f3->hash($f3->stringify($cond)).'.'.$engine; - if ($engine=='sql') - $cacheHash.='-'.$db->driver(); - if (isset($this->queryCache[$cacheHash])) - // load from memory - return $this->queryCache[$cacheHash]; - elseif ($f3->exists('CORTEX.queryParserCache') - && ($ttl = (int) $f3->get('CORTEX.queryParserCache'))) { - $cache = \Cache::instance(); - // load from cache - if ($f3->get('CACHE') && $ttl && ($cached = $cache->exists($cacheHash, $ncond)) - && $cached[0] + $ttl > microtime(TRUE)) { - $this->queryCache[$cacheHash] = $ncond; - return $ncond; - } - } - $where = array_shift($cond); - $args = $cond; - $where = str_replace(array('&&', '||'), array('AND', 'OR'), $where); - // prepare IN condition - $where = preg_replace('/\bIN\b\s*\(\s*(\?|:\w+)?\s*\)/i', 'IN $1', $where); - switch ($engine) { - case 'jig': - $ncond = $this->_jig_parse_filter($where, $args); - break; - case 'mongo': - $parts = $this->splitLogical($where); - if (is_int(strpos($where, ':'))) - list($parts, $args) = $this->convertNamedParams($parts, $args); - foreach ($parts as &$part) { - $part = $this->_mongo_parse_relational_op($part, $args, $db, $fieldConf); - unset($part); - } - $ncond = $this->_mongo_parse_logical_op($parts); - break; - case 'sql': - if (!$f3->exists('CORTEX.quoteConditions',$qc) || $qc) - $where = $this->sql_quoteCondition($where,$db); - // preserve identifier - $where = preg_replace('/(?!\B)_id/', 'id', $where); - if ($db->driver() == 'pgsql') - $where = preg_replace('/\s+like\s+/i', ' ILIKE ', $where); - $parts = $this->splitLogical($where); - // ensure positional bind params - if (is_int(strpos($where, ':'))) - list($parts, $args) = $this->convertNamedParams($parts, $args); - $ncond = array(); - foreach ($parts as &$part) { - // enhanced IN handling - if (is_int(strpos($part, '?'))) { - $val = array_shift($args); - if (is_int($pos = strpos($part, ' IN ?'))) { - if ($val instanceof CortexCollection) - $val = $val->getAll('_id',TRUE); - if (!is_array($val) || empty($val)) - trigger_error(self::E_INBINDVALUE,E_USER_ERROR); - $bindMarks = str_repeat('?,',count($val) - 1).'?'; - $part = substr($part, 0, $pos).' IN ('.$bindMarks.') '; - $ncond = array_merge($ncond, $val); - } elseif($val === null && - preg_match('/((?:\S[\w\-]+\S.?)+)\s*'. - '(!?==?)\s*(?:\?|:\w+)/i',$part,$match)) { - $part = ' '.$match[1].' IS '.($match[2][0]=='!'?'NOT ':'').'NULL '; - } else - $ncond[] = $val; - } - unset($part); - } - array_unshift($ncond, implode($parts)); - break; - default: - trigger_error(self::E_ENGINEERROR,E_USER_ERROR); - } - $this->queryCache[$cacheHash] = $ncond; - if(isset($ttl) && $f3->get('CACHE')) { - // save to cache - $cache = \Cache::instance(); - $cache->set($cacheHash,$ncond,$ttl); - } - return $ncond; - } - - /** - * split where criteria string into logical chunks - * @param $cond - * @return array - */ - protected function splitLogical($cond) { - return preg_split('/(\s*(?[^()]+)|\((?:(?>[^()]+)|^(?R))*\))*\)|'. // exclude SQL function names "foo(" - '(?:(\b(?=!)]|$))/i', // only when part of condition or within brackets - function($match) use($db) { - if (!isset($match[1])) - return $match[0]; - if (preg_match('/\b(AND|OR|IN|LIKE|NOT|HAVING|SELECT|FROM|WHERE)\b/i',$match[1])) - return $match[1]; - return $db->quotekey($match[1]); - }, $cond); - return $out ?: $cond; - } - - /** - * add table prefix to identifiers which do not have a table prefix yet - * @param string $cond - * @param string $table - * @return string - */ - public function sql_prependTableToFields($cond, $table) { - $out = preg_replace_callback('/'. - '(\w+\((?:[^)(]+|\((?:[^)(]+|(?R))*\))*\))|'. - '(?:(\s)|^|(?<=[(]))'. - '([a-zA-Z_](?:[\w\-_]+))'. - '(?=[\s<>=!)]|$)/i', - function($match) use($table) { - if (!isset($match[3])) - return $match[1]; - if (preg_match('/\b(AND|OR|IN|LIKE|NOT|HAVING|SELECT|FROM|WHERE)\b/i',$match[3])) - return $match[0]; - return $match[2].$table.'.'.$match[3]; - }, $cond); - return $out ?: $cond; - } - - /** - * convert filter array to jig syntax - * @param $where - * @param $args - * @return array - */ - protected function _jig_parse_filter($where, $args) { - $parts = $this->splitLogical($where); - if (is_int(strpos($where, ':'))) - list($parts, $args) = $this->convertNamedParams($parts, $args); - $ncond = array(); - foreach ($parts as &$part) { - if (preg_match('/\s*\b(AND|OR)\b\s*/i',$part)) - continue; - // prefix field names - $part = preg_replace('/([a-z_-]+(?:[\w-]+))/i', '@$1', $part, -1, $count); - // value comparison - if (is_int(strpos($part, '?'))) { - $val = array_shift($args); - preg_match('/(@\w+)/i', $part, $match); - $skipVal=false; - // find like operator - if (is_int(strpos($upart = strtoupper($part), ' @LIKE '))) { - if ($not = is_int($npos = strpos($upart, '@NOT'))) - $pos = $npos; - $val = '/'.$this->_likeValueToRegEx($val).'/iu'; - $part = ($not ? '!' : '').'preg_match(?,'.$match[0].')'; - } // find IN operator - elseif (is_int($pos = strpos($upart, ' @IN '))) { - if ($val instanceof CortexCollection) - $val = $val->getAll('_id',TRUE); - if ($not = is_int($npos = strpos($upart, '@NOT'))) - $pos = $npos; - $part = ($not ? '!' : '').'in_array('.substr($part, 0, $pos). - ',array(\''.implode('\',\'', $val).'\'))'; - $skipVal=true; - } - elseif($val===null && preg_match('/(\w+)\s*([!=<>]+)\s*\?/i',$part,$nmatch) - && ($nmatch[2]=='=' || $nmatch[2]=='==')){ - $kval=ltrim($nmatch[1],'@'); - $part = '(!array_key_exists(\''.$kval.'\',$_row) || '. - '(array_key_exists(\''.$kval.'\',$_row) && $_row[\''.$kval.'\']===NULL))'; - unset($part); - continue; - } - // add existence check - $part = ($val===null && !$skipVal) - ? '(array_key_exists(\''.ltrim($match[0],'@').'\',$_row) && '.$part.')' - : '(isset('.$match[0].') && '.$part.')'; - if (!$skipVal) - $ncond[] = $val; - } elseif ($count >= 1) { - // field comparison - preg_match_all('/(@\w+)/i', $part, $matches); - $chks = array(); - foreach ($matches[0] as $field) - $chks[] = 'isset('.$field.')'; - $part = '('.implode(' && ',$chks).' && ('.$part.'))'; - } - unset($part); - } - array_unshift($ncond, implode(' ', $parts)); - return $ncond; - } - - /** - * find and wrap logical operators AND, OR, (, ) - * @param $parts - * @return array - */ - protected function _mongo_parse_logical_op($parts) { - $b_offset = 0; - $ncond = array(); - $child = array(); - for ($i = 0, $max = count($parts); $i < $max; $i++) { - $part = $parts[$i]; - if (is_string($part)) - $part = trim($part); - if ($part == '(') { - // add sub-bracket to parse array - if ($b_offset > 0) - $child[] = $part; - $b_offset++; - } elseif ($part == ')') { - $b_offset--; - // found closing bracket - if ($b_offset == 0) { - $ncond[] = ($this->_mongo_parse_logical_op($child)); - $child = array(); - } elseif ($b_offset < 0) - trigger_error(self::E_BRACKETS,E_USER_ERROR); - else - // add sub-bracket to parse array - $child[] = $part; - } - elseif ($b_offset > 0) { - // add to parse array - $child[]=$part; - // condition type - } elseif (!is_array($part)) { - if (strtoupper($part) == 'AND') - $add = true; - elseif (strtoupper($part) == 'OR') - $or = true; - } else // skip - $ncond[] = $part; - } - if ($b_offset > 0) - trigger_error(self::E_BRACKETS,E_USER_ERROR); - if (isset($add)) - return array('$and' => $ncond); - elseif (isset($or)) - return array('$or' => $ncond); - else - return $ncond[0]; - } - - /** - * find and convert relational operators - * @param $part - * @param $args - * @param \DB\Mongo $db - * @param null $fieldConf - * @return array|null - */ - protected function _mongo_parse_relational_op($part, &$args, \DB\Mongo $db, $fieldConf=null) { - if (is_null($part)) - return $part; - if (preg_match('/\<\=|\>\=|\<\>|\<|\>|\!\=|\=\=|\=|like|not like|in|not in/i', $part, $match)) { - $var = is_int(strpos($part, '?')) ? array_shift($args) : null; - $exp = explode($match[0], $part); - $key = trim($exp[0]); - // unbound value - if (is_numeric($exp[1])) - $var = $exp[1]; - // field comparison - elseif (!is_int(strpos($exp[1], '?'))) - return array('$where' => 'this.'.$key.' '.$match[0].' this.'.trim($exp[1])); - $upart = strtoupper($match[0]); - // MongoID shorthand - if ($key == '_id' || (isset($fieldConf[$key]) && isset($fieldConf[$key]['relType']))) { - if (is_array($var)) - foreach ($var as &$id) { - if ($db->legacy() && !$id instanceof \MongoId) - $id = new \MongoId($id); - elseif (!$db->legacy() && !$id instanceof \MongoDB\BSON\ObjectId) - $id = new \MongoDB\BSON\ObjectId($id); - unset($id); - } - elseif($db->legacy() && !$var instanceof \MongoId) - $var = new \MongoId($var); - elseif(!$db->legacy() && !$var instanceof \MongoDB\BSON\ObjectId) - $var = new \MongoDB\BSON\ObjectId($var); - } - // find LIKE operator - if (in_array($upart, array('LIKE','NOT LIKE'))) { - $rgx = $this->_likeValueToRegEx($var); - $var = $db->legacy() ? new \MongoRegex('/'.$rgx.'/iu') : new \MongoDB\BSON\Regex($rgx,'iu'); - if ($upart == 'NOT LIKE') - $var = array('$not' => $var); - } // find IN operator - elseif (in_array($upart, array('IN','NOT IN'))) { - if ($var instanceof CortexCollection) - $var = $var->getAll('_id',true); - $var = array(($upart=='NOT IN')?'$nin':'$in' => array_values($var)); - } // translate operators - elseif (!in_array($match[0], array('==', '='))) { - $opr = str_replace(array('<>', '<', '>', '!', '='), - array('$ne', '$lt', '$gt', '$n', 'e'), $match[0]); - $var = array($opr => (strtolower($var) == 'null') ? null : - (is_object($var) ? $var : (is_numeric($var) ? $var + 0 : $var))); - } - return array($key => $var); - } - return $part; - } - - /** - * @param string $var - * @return string - */ - protected function _likeValueToRegEx($var) { - $lC = substr($var, -1, 1); - // %var% -> /var/ - if ($var[0] == '%' && $lC == '%') - $var = substr($var, 1, -1); - // var% -> /^var/ - elseif ($lC == '%') - $var = '^'.substr($var, 0, -1); - // %var -> /var$/ - elseif ($var[0] == '%') - $var = substr($var, 1).'$'; - return $var; - } - - /** - * convert options array syntax to given engine type - * - * example: - * array('order'=>'location') // default direction is ASC - * array('order'=>'num1 desc, num2 asc') - * - * @param array $options - * @param string $engine - * @param object $db - * @return array|null - */ - public function prepareOptions($options, $engine, $db) { - if (empty($options) || !is_array($options)) - return null; - switch ($engine) { - case 'jig': - if (array_key_exists('order', $options)) - $options['order'] = preg_replace( - ['/(?<=\h)(ASC)(?=\W|$)/i','/(?<=\h)(DESC)(?=\W|$)/i'], - ['SORT_ASC','SORT_DESC'],$options['order']); - break; - case 'mongo': - if (array_key_exists('order', $options)) { - $sorts = explode(',', $options['order']); - $sorting = array(); - foreach ($sorts as $sort) { - $sp = explode(' ', trim($sort)); - $sorting[$sp[0]] = (array_key_exists(1, $sp) && - strtoupper($sp[1]) == 'DESC') ? -1 : 1; - } - $options['order'] = $sorting; - } - if (array_key_exists('group', $options) && is_string($options['group'])) { - $keys = explode(',',$options['group']); - $options['group']=array('keys'=>array(),'initial'=>array(), - 'reduce'=>'function (obj, prev) {}','finalize'=>''); - $keys = array_combine($keys,array_fill(0,count($keys),1)); - $options['group']['keys']=$keys; - $options['group']['initial']=$keys; - } - break; - case 'sql': - $char=substr($db->quotekey(''),0,1); - if (array_key_exists('order', $options) && - FALSE===strpos($options['order'],$char)) - $options['order']=preg_replace_callback( - '/(\w+\h?\(|'. // skip function names - '\b(?!\w+)(?:\s+\w+)+|' . // skip field args - '\)\s+\w+)|'. // skip function args - '(\b\d?[a-zA-Z_](?:[\w\-.])*)/i', // match table/field keys - function($match) use($db) { - if (!isset($match[2])) - return $match[1]; - return $db->quotekey($match[2]); - }, $options['order']); - break; - } - return $options; - } -} - -class CortexCollection extends \ArrayIterator { - - protected - $relSets = array(), - $pointer = 0, - $changed = false, - $cid; - - const - E_UnknownCID = 'This Collection does not exist: %s', - E_SubsetKeysValue = '$keys must be an array or split-able string, but %s was given.'; - - public function __construct() { - $this->cid = uniqid('cortex_collection_'); - parent::__construct(); - } - - //! Prohibit cloning to ensure an existing relation cache - private function __clone() { } - - /** - * set a collection of models - * @param $models - */ - function setModels($models, $init=true) { - array_map(array($this,'add'),$models); - if ($init) - $this->changed = false; - } - - /** - * add single model to collection - * @param $model - */ - function add(Cortex $model) { - $model->addToCollection($this); - $this->append($model); - } - - public function offsetSet($i, $val) { - $this->changed=true; - parent::offsetSet($i,$val); - } - - public function hasChanged() { - return $this->changed; - } - - /** - * get a related collection - * @param $key - * @return null - */ - public function getRelSet($key) { - return (isset($this->relSets[$key])) ? $this->relSets[$key] : null; - } - - /** - * set a related collection for caching it for the lifetime of this collection - * @param $key - * @param $set - */ - public function setRelSet($key,$set) { - $this->relSets[$key] = $set; - } - - /** - * check if a related collection exists in runtime cache - * @param $key - * @return bool - */ - public function hasRelSet($key) { - return array_key_exists($key,$this->relSets); - } - - public function expose() { - return $this->getArrayCopy(); - } - - /** - * get an intersection from a cached relation-set, based on given keys - * @param string $prop - * @param array|string $keys - * @return array - */ - public function getSubset($prop, $keys) { - if (is_string($keys)) - $keys = \Base::instance()->split($keys); - if (!is_array($keys)) - trigger_error(sprintf(self::E_SubsetKeysValue,gettype($keys)),E_USER_ERROR); - if (!$this->hasRelSet($prop) || !($relSet = $this->getRelSet($prop))) - return null; - foreach ($keys as &$key) { - if ($key instanceof \MongoId || $key instanceof \MongoDB\BSON\ObjectId) - $key = (string) $key; - unset($key); - } - return array_values(array_intersect_key($relSet, array_flip($keys))); - } - - /** - * returns all values of a specified property from all models - * @param string $prop - * @param bool $raw - * @return array - */ - public function getAll($prop, $raw = false) { - $out = array(); - foreach ($this->getArrayCopy() as $model) { - if ($model instanceof Cortex && $model->exists($prop,true)) { - $val = $model->get($prop, $raw); - if (!empty($val)) - $out[] = $val; - } elseif($raw) - $out[] = $model; - } - return $out; - } - - /** - * cast all contained mappers to a nested array - * @param int|array $rel_depths depths to resolve relations - * @return array - */ - public function castAll($rel_depths=1) { - $out = array(); - foreach ($this->getArrayCopy() as $model) - $out[] = $model->cast(null,$rel_depths); - return $out; - } - - /** - * return all models keyed by a specified index key - * @param string $index - * @param bool $nested - * @return array - */ - public function getBy($index, $nested = false) { - $out = array(); - foreach ($this->getArrayCopy() as $model) - if ($model->exists($index)) { - $val = $model->get($index, true); - if (!empty($val)) - if($nested) $out[(string) $val][] = $model; - else $out[(string) $val] = $model; - } - return $out; - } - - /** - * re-assort the current collection using a sql-like syntax - * @param $cond - */ - public function orderBy($cond) { - $cols=\Base::instance()->split($cond); - $this->uasort(function($val1,$val2) use($cols) { - foreach ($cols as $col) { - $parts=explode(' ',$col,2); - $order=empty($parts[1])?'ASC':$parts[1]; - $col=$parts[0]; - list($v1,$v2)=array($val1[$col],$val2[$col]); - if ($out=strnatcmp($v1,$v2)* - ((strtoupper($order)=='ASC')*2-1)) - return $out; - } - return 0; - }); - } - - /** - * slice the collection - * @param $offset - * @param null $limit - */ - public function slice($offset, $limit=null) { - $this->rewind(); - $i=0; - $del=array(); - while ($this->valid()) { - if ($i < $offset) - $del[]=$this->key(); - elseif ($i >= $offset && $limit && $i >= ($offset+$limit)) - $del[]=$this->key(); - $i++; - $this->next(); - } - foreach ($del as $ii) - unset($this[$ii]); - } - - /** - * compare collection with a given ID stack - * @param array|CortexCollection $stack - * @param string $cpm_key - * @return array - */ - public function compare($stack,$cpm_key='_id') { - if ($stack instanceof CortexCollection) - $stack = $stack->getAll($cpm_key,true); - $keys = $this->getAll($cpm_key,true); - $out = []; - $new = array_diff($stack,$keys); - $old = array_diff($keys,$stack); - if ($new) - $out['new'] = $new; - if ($old) - $out['old'] = $old; - return $out; - } - - /** - * check if the collection contains a record with the given key-val set - * @param mixed $val - * @param string $key - * @return bool - */ - public function contains($val,$key='_id') { - $rel_ids = $this->getAll($key, true); - if ($val instanceof Cursor) - $val = $val->{$key}; - return in_array($val,$rel_ids); - } - - /** - * create a new hydrated collection from the given records - * @param $records - * @return CortexCollection - */ - static public function factory($records) { - $cc = new self(); - $cc->setModels($records); - return $cc; - } - -} \ No newline at end of file diff --git a/app/lib/db/cursor.php b/app/lib/db/cursor.php deleted file mode 100644 index 6edbc0e0..00000000 --- a/app/lib/db/cursor.php +++ /dev/null @@ -1,388 +0,0 @@ -. - -*/ - -namespace DB; - -//! Simple cursor implementation -abstract class Cursor extends \Magic implements \IteratorAggregate { - - //@{ Error messages - const - E_Field='Undefined field %s'; - //@} - - protected - //! Query results - $query=[], - //! Current position - $ptr=0, - //! Event listeners - $trigger=[]; - - /** - * Return database type - * @return string - **/ - abstract function dbtype(); - - /** - * Return field names - * @return array - **/ - abstract function fields(); - - /** - * Return fields of mapper object as an associative array - * @return array - * @param $obj object - **/ - abstract function cast($obj=NULL); - - /** - * Return records (array of mapper objects) that match criteria - * @return array - * @param $filter string|array - * @param $options array - * @param $ttl int - **/ - abstract function find($filter=NULL,array $options=NULL,$ttl=0); - - /** - * Count records that match criteria - * @return int - * @param $filter array - * @param $options array - * @param $ttl int - **/ - abstract function count($filter=NULL,array $options=NULL,$ttl=0); - - /** - * Insert new record - * @return array - **/ - abstract function insert(); - - /** - * Update current record - * @return array - **/ - abstract function update(); - - /** - * Hydrate mapper object using hive array variable - * @return NULL - * @param $var array|string - * @param $func callback - **/ - abstract function copyfrom($var,$func=NULL); - - /** - * Populate hive array variable with mapper fields - * @return NULL - * @param $key string - **/ - abstract function copyto($key); - - /** - * Get cursor's equivalent external iterator - * Causes a fatal error in PHP 5.3.5 if uncommented - * return ArrayIterator - **/ - abstract function getiterator(); - - - /** - * Return TRUE if current cursor position is not mapped to any record - * @return bool - **/ - function dry() { - return empty($this->query[$this->ptr]); - } - - /** - * Return first record (mapper object) that matches criteria - * @return static|FALSE - * @param $filter string|array - * @param $options array - * @param $ttl int - **/ - function findone($filter=NULL,array $options=NULL,$ttl=0) { - if (!$options) - $options=[]; - // Override limit - $options['limit']=1; - return ($data=$this->find($filter,$options,$ttl))?$data[0]:FALSE; - } - - /** - * Return array containing subset of records matching criteria, - * total number of records in superset, specified limit, number of - * subsets available, and actual subset position - * @return array - * @param $pos int - * @param $size int - * @param $filter string|array - * @param $options array - * @param $ttl int - * @param $bounce bool - **/ - function paginate( - $pos=0,$size=10,$filter=NULL,array $options=NULL,$ttl=0,$bounce=TRUE) { - $total=$this->count($filter,$options,$ttl); - $count=ceil($total/$size); - if ($bounce) - $pos=max(0,min($pos,$count-1)); - return [ - 'subset'=>($bounce || $pos<$count)?$this->find($filter, - array_merge( - $options?:[], - ['limit'=>$size,'offset'=>$pos*$size] - ), - $ttl - ):[], - 'total'=>$total, - 'limit'=>$size, - 'count'=>$count, - 'pos'=>$bounce?($pos<$count?$pos:0):$pos - ]; - } - - /** - * Map to first record that matches criteria - * @return array|FALSE - * @param $filter string|array - * @param $options array - * @param $ttl int - **/ - function load($filter=NULL,array $options=NULL,$ttl=0) { - $this->reset(); - return ($this->query=$this->find($filter,$options,$ttl)) && - $this->skip(0)?$this->query[$this->ptr]:FALSE; - } - - /** - * Return the count of records loaded - * @return int - **/ - function loaded() { - return count($this->query); - } - - /** - * Map to first record in cursor - * @return mixed - **/ - function first() { - return $this->skip(-$this->ptr); - } - - /** - * Map to last record in cursor - * @return mixed - **/ - function last() { - return $this->skip(($ofs=count($this->query)-$this->ptr)?$ofs-1:0); - } - - /** - * Map to nth record relative to current cursor position - * @return mixed - * @param $ofs int - **/ - function skip($ofs=1) { - $this->ptr+=$ofs; - return $this->ptr>-1 && $this->ptrquery)? - $this->query[$this->ptr]:FALSE; - } - - /** - * Map next record - * @return mixed - **/ - function next() { - return $this->skip(); - } - - /** - * Map previous record - * @return mixed - **/ - function prev() { - return $this->skip(-1); - } - - /** - * Return whether current iterator position is valid. - */ - function valid() { - return !$this->dry(); - } - - /** - * Save mapped record - * @return mixed - **/ - function save() { - return $this->query?$this->update():$this->insert(); - } - - /** - * Delete current record - * @return int|bool - **/ - function erase() { - $this->query=array_slice($this->query,0,$this->ptr,TRUE)+ - array_slice($this->query,$this->ptr,NULL,TRUE); - $this->skip(0); - } - - /** - * Define onload trigger - * @return callback - * @param $func callback - **/ - function onload($func) { - return $this->trigger['load']=$func; - } - - /** - * Define beforeinsert trigger - * @return callback - * @param $func callback - **/ - function beforeinsert($func) { - return $this->trigger['beforeinsert']=$func; - } - - /** - * Define afterinsert trigger - * @return callback - * @param $func callback - **/ - function afterinsert($func) { - return $this->trigger['afterinsert']=$func; - } - - /** - * Define oninsert trigger - * @return callback - * @param $func callback - **/ - function oninsert($func) { - return $this->afterinsert($func); - } - - /** - * Define beforeupdate trigger - * @return callback - * @param $func callback - **/ - function beforeupdate($func) { - return $this->trigger['beforeupdate']=$func; - } - - /** - * Define afterupdate trigger - * @return callback - * @param $func callback - **/ - function afterupdate($func) { - return $this->trigger['afterupdate']=$func; - } - - /** - * Define onupdate trigger - * @return callback - * @param $func callback - **/ - function onupdate($func) { - return $this->afterupdate($func); - } - - /** - * Define beforesave trigger - * @return callback - * @param $func callback - **/ - function beforesave($func) { - $this->trigger['beforeinsert']=$func; - $this->trigger['beforeupdate']=$func; - return $func; - } - - /** - * Define aftersave trigger - * @return callback - * @param $func callback - **/ - function aftersave($func) { - $this->trigger['afterinsert']=$func; - $this->trigger['afterupdate']=$func; - return $func; - } - - /** - * Define onsave trigger - * @return callback - * @param $func callback - **/ - function onsave($func) { - return $this->aftersave($func); - } - - /** - * Define beforeerase trigger - * @return callback - * @param $func callback - **/ - function beforeerase($func) { - return $this->trigger['beforeerase']=$func; - } - - /** - * Define aftererase trigger - * @return callback - * @param $func callback - **/ - function aftererase($func) { - return $this->trigger['aftererase']=$func; - } - - /** - * Define onerase trigger - * @return callback - * @param $func callback - **/ - function onerase($func) { - return $this->aftererase($func); - } - - /** - * Reset cursor - * @return NULL - **/ - function reset() { - $this->query=[]; - $this->ptr=0; - } - -} diff --git a/app/lib/db/jig.php b/app/lib/db/jig.php deleted file mode 100644 index fe3a302c..00000000 --- a/app/lib/db/jig.php +++ /dev/null @@ -1,175 +0,0 @@ -. - -*/ - -namespace DB; - -//! In-memory/flat-file DB wrapper -class Jig { - - //@{ Storage formats - const - FORMAT_JSON=0, - FORMAT_Serialized=1; - //@} - - protected - //! UUID - $uuid, - //! Storage location - $dir, - //! Current storage format - $format, - //! Jig log - $log, - //! Memory-held data - $data, - //! lazy load/save files - $lazy; - - /** - * Read data from memory/file - * @return array - * @param $file string - **/ - function &read($file) { - if (!$this->dir || !is_file($dst=$this->dir.$file)) { - if (!isset($this->data[$file])) - $this->data[$file]=[]; - return $this->data[$file]; - } - if ($this->lazy && isset($this->data[$file])) - return $this->data[$file]; - $fw=\Base::instance(); - $raw=$fw->read($dst); - switch ($this->format) { - case self::FORMAT_JSON: - $data=json_decode($raw,TRUE); - break; - case self::FORMAT_Serialized: - $data=$fw->unserialize($raw); - break; - } - $this->data[$file] = $data; - return $this->data[$file]; - } - - /** - * Write data to memory/file - * @return int - * @param $file string - * @param $data array - **/ - function write($file,array $data=NULL) { - if (!$this->dir || $this->lazy) - return count($this->data[$file]=$data); - $fw=\Base::instance(); - switch ($this->format) { - case self::FORMAT_JSON: - $out=json_encode($data,JSON_PRETTY_PRINT); - break; - case self::FORMAT_Serialized: - $out=$fw->serialize($data); - break; - } - return $fw->write($this->dir.'/'.$file,$out); - } - - /** - * Return directory - * @return string - **/ - function dir() { - return $this->dir; - } - - /** - * Return UUID - * @return string - **/ - function uuid() { - return $this->uuid; - } - - /** - * Return profiler results (or disable logging) - * @param $flag bool - * @return string - **/ - function log($flag=TRUE) { - if ($flag) - return $this->log; - $this->log=FALSE; - } - - /** - * Jot down log entry - * @return NULL - * @param $frame string - **/ - function jot($frame) { - if ($frame) - $this->log.=date('r').' '.$frame.PHP_EOL; - } - - /** - * Clean storage - * @return NULL - **/ - function drop() { - if ($this->lazy) // intentional - $this->data=[]; - if (!$this->dir) - $this->data=[]; - elseif ($glob=@glob($this->dir.'/*',GLOB_NOSORT)) - foreach ($glob as $file) - @unlink($file); - } - - //! Prohibit cloning - private function __clone() { - } - - /** - * Instantiate class - * @param $dir string - * @param $format int - **/ - function __construct($dir=NULL,$format=self::FORMAT_JSON,$lazy=FALSE) { - if ($dir && !is_dir($dir)) - mkdir($dir,\Base::MODE,TRUE); - $this->uuid=\Base::instance()->hash($this->dir=$dir); - $this->format=$format; - $this->lazy=$lazy; - } - - /** - * save file on destruction - **/ - function __destruct() { - if ($this->lazy) { - $this->lazy = FALSE; - foreach ($this->data?:[] as $file => $data) - $this->write($file,$data); - } - } - -} diff --git a/app/lib/db/jig/mapper.php b/app/lib/db/jig/mapper.php deleted file mode 100644 index ef878f13..00000000 --- a/app/lib/db/jig/mapper.php +++ /dev/null @@ -1,541 +0,0 @@ -. - -*/ - -namespace DB\Jig; - -//! Flat-file DB mapper -class Mapper extends \DB\Cursor { - - protected - //! Flat-file DB wrapper - $db, - //! Data file - $file, - //! Document identifier - $id, - //! Document contents - $document=[], - //! field map-reduce handlers - $_reduce; - - /** - * Return database type - * @return string - **/ - function dbtype() { - return 'Jig'; - } - - /** - * Return TRUE if field is defined - * @return bool - * @param $key string - **/ - function exists($key) { - return array_key_exists($key,$this->document); - } - - /** - * Assign value to field - * @return scalar|FALSE - * @param $key string - * @param $val scalar - **/ - function set($key,$val) { - return ($key=='_id')?FALSE:($this->document[$key]=$val); - } - - /** - * Retrieve value of field - * @return scalar|FALSE - * @param $key string - **/ - function &get($key) { - if ($key=='_id') - return $this->id; - if (array_key_exists($key,$this->document)) - return $this->document[$key]; - user_error(sprintf(self::E_Field,$key),E_USER_ERROR); - } - - /** - * Delete field - * @return NULL - * @param $key string - **/ - function clear($key) { - if ($key!='_id') - unset($this->document[$key]); - } - - /** - * Convert array to mapper object - * @return object - * @param $id string - * @param $row array - **/ - function factory($id,$row) { - $mapper=clone($this); - $mapper->reset(); - $mapper->id=$id; - foreach ($row as $field=>$val) - $mapper->document[$field]=$val; - $mapper->query=[clone($mapper)]; - if (isset($mapper->trigger['load'])) - \Base::instance()->call($mapper->trigger['load'],$mapper); - return $mapper; - } - - /** - * Return fields of mapper object as an associative array - * @return array - * @param $obj object - **/ - function cast($obj=NULL) { - if (!$obj) - $obj=$this; - return $obj->document+['_id'=>$this->id]; - } - - /** - * Convert tokens in string expression to variable names - * @return string - * @param $str string - **/ - function token($str) { - $str=preg_replace_callback( - '/(?stringify(substr($expr[1],1)): - (preg_match('/^\w+/', - $mix=$this->token($expr[2]))? - $fw->stringify($mix): - $mix)). - ']'; - }, - $token[1] - ); - }, - $str - ); - return trim($str); - } - - /** - * Return records that match criteria - * @return static[]|FALSE - * @param $filter array - * @param $options array - * @param $ttl int|array - * @param $log bool - **/ - function find($filter=NULL,array $options=NULL,$ttl=0,$log=TRUE) { - if (!$options) - $options=[]; - $options+=[ - 'order'=>NULL, - 'limit'=>0, - 'offset'=>0, - 'group'=>NULL, - ]; - $fw=\Base::instance(); - $cache=\Cache::instance(); - $db=$this->db; - $now=microtime(TRUE); - $data=[]; - $tag=''; - if (is_array($ttl)) - list($ttl,$tag)=$ttl; - if (!$fw->CACHE || !$ttl || !($cached=$cache->exists( - $hash=$fw->hash($this->db->dir(). - $fw->stringify([$filter,$options])).($tag?'.'.$tag:'').'.jig',$data)) || - $cached[0]+$ttlread($this->file); - if (is_null($data)) - return FALSE; - foreach ($data as $id=>&$doc) { - $doc['_id']=$id; - unset($doc); - } - if ($filter) { - if (!is_array($filter)) - return FALSE; - // Normalize equality operator - $expr=preg_replace('/(?<=[^<>!=])=(?!=)/','==',$filter[0]); - // Prepare query arguments - $args=isset($filter[1]) && is_array($filter[1])? - $filter[1]: - array_slice($filter,1,NULL,TRUE); - $args=is_array($args)?$args:[1=>$args]; - $keys=$vals=[]; - $tokens=array_slice( - token_get_all('token($expr)),1); - $data=array_filter($data, - function($_row) use($fw,$args,$tokens) { - $_expr=''; - $ctr=0; - $named=FALSE; - foreach ($tokens as $token) { - if (is_string($token)) - if ($token=='?') { - // Positional - $ctr++; - $key=$ctr; - } - else { - if ($token==':') - $named=TRUE; - else - $_expr.=$token; - continue; - } - elseif ($named && - token_name($token[0])=='T_STRING') { - $key=':'.$token[1]; - $named=FALSE; - } - else { - $_expr.=$token[1]; - continue; - } - $_expr.=$fw->stringify( - is_string($args[$key])? - addcslashes($args[$key],'\''): - $args[$key]); - } - // Avoid conflict with user code - unset($fw,$tokens,$args,$ctr,$token,$key,$named); - extract($_row); - // Evaluate pseudo-SQL expression - return eval('return '.$_expr.';'); - } - ); - } - if (isset($options['group'])) { - $cols=array_reverse($fw->split($options['group'])); - // sort into groups - $data=$this->sort($data,$options['group']); - foreach($data as $i=>&$row) { - if (!isset($prev)) { - $prev=$row; - $prev_i=$i; - } - $drop=false; - foreach ($cols as $col) - if ($prev_i!=$i && array_key_exists($col,$row) && - array_key_exists($col,$prev) && $row[$col]==$prev[$col]) - // reduce/modify - $drop=!isset($this->_reduce[$col]) || call_user_func_array( - $this->_reduce[$col][0],[&$prev,&$row])!==FALSE; - elseif (isset($this->_reduce[$col])) { - $null=null; - // initial - call_user_func_array($this->_reduce[$col][0],[&$row,&$null]); - } - if ($drop) - unset($data[$i]); - else { - $prev=&$row; - $prev_i=$i; - } - unset($row); - } - // finalize - if ($this->_reduce[$col][1]) - foreach($data as $i=>&$row) { - $row=call_user_func($this->_reduce[$col][1],$row); - if (!$row) - unset($data[$i]); - unset($row); - } - } - if (isset($options['order'])) - $data=$this->sort($data,$options['order']); - $data=array_slice($data, - $options['offset'],$options['limit']?:NULL,TRUE); - if ($fw->CACHE && $ttl) - // Save to cache backend - $cache->set($hash,$data,$ttl); - } - $out=[]; - foreach ($data as $id=>&$doc) { - unset($doc['_id']); - $out[]=$this->factory($id,$doc); - unset($doc); - } - if ($log && isset($args)) { - if ($filter) - foreach ($args as $key=>$val) { - $vals[]=$fw->stringify(is_array($val)?$val[0]:$val); - $keys[]='/'.(is_numeric($key)?'\?':preg_quote($key)).'/'; - } - $db->jot('('.sprintf('%.1f',1e3*(microtime(TRUE)-$now)).'ms) '. - $this->file.' [find] '. - ($filter?preg_replace($keys,$vals,$filter[0],1):'')); - } - return $out; - } - - /** - * Sort a collection - * @param $data - * @param $cond - * @return mixed - */ - protected function sort($data,$cond) { - $cols=\Base::instance()->split($cond); - uasort( - $data, - function($val1,$val2) use($cols) { - foreach ($cols as $col) { - $parts=explode(' ',$col,2); - $order=empty($parts[1])? - SORT_ASC: - constant($parts[1]); - $col=$parts[0]; - if (!array_key_exists($col,$val1)) - $val1[$col]=NULL; - if (!array_key_exists($col,$val2)) - $val2[$col]=NULL; - list($v1,$v2)=[$val1[$col],$val2[$col]]; - if ($out=strnatcmp($v1,$v2)* - (($order==SORT_ASC)*2-1)) - return $out; - } - return 0; - } - ); - return $data; - } - - /** - * Add reduce handler for grouped fields - * @param $key string - * @param $handler callback - * @param $finalize callback - */ - function reduce($key,$handler,$finalize=null){ - $this->_reduce[$key]=[$handler,$finalize]; - } - - /** - * Count records that match criteria - * @return int - * @param $filter array - * @param $options array - * @param $ttl int|array - **/ - function count($filter=NULL,array $options=NULL,$ttl=0) { - $now=microtime(TRUE); - $out=count($this->find($filter,$options,$ttl,FALSE)); - $this->db->jot('('.sprintf('%.1f',1e3*(microtime(TRUE)-$now)).'ms) '. - $this->file.' [count] '.($filter?json_encode($filter):'')); - return $out; - } - - /** - * Return record at specified offset using criteria of previous - * load() call and make it active - * @return array - * @param $ofs int - **/ - function skip($ofs=1) { - $this->document=($out=parent::skip($ofs))?$out->document:[]; - $this->id=$out?$out->id:NULL; - if ($this->document && isset($this->trigger['load'])) - \Base::instance()->call($this->trigger['load'],$this); - return $out; - } - - /** - * Insert new record - * @return array - **/ - function insert() { - if ($this->id) - return $this->update(); - $db=$this->db; - $now=microtime(TRUE); - while (($id=uniqid(NULL,TRUE)) && - ($data=&$db->read($this->file)) && isset($data[$id]) && - !connection_aborted()) - usleep(mt_rand(0,100)); - $this->id=$id; - $pkey=['_id'=>$this->id]; - if (isset($this->trigger['beforeinsert']) && - \Base::instance()->call($this->trigger['beforeinsert'], - [$this,$pkey])===FALSE) - return $this->document; - $data[$id]=$this->document; - $db->write($this->file,$data); - $db->jot('('.sprintf('%.1f',1e3*(microtime(TRUE)-$now)).'ms) '. - $this->file.' [insert] '.json_encode($this->document)); - if (isset($this->trigger['afterinsert'])) - \Base::instance()->call($this->trigger['afterinsert'], - [$this,$pkey]); - $this->load(['@_id=?',$this->id]); - return $this->document; - } - - /** - * Update current record - * @return array - **/ - function update() { - $db=$this->db; - $now=microtime(TRUE); - $data=&$db->read($this->file); - if (isset($this->trigger['beforeupdate']) && - \Base::instance()->call($this->trigger['beforeupdate'], - [$this,['_id'=>$this->id]])===FALSE) - return $this->document; - $data[$this->id]=$this->document; - $db->write($this->file,$data); - $db->jot('('.sprintf('%.1f',1e3*(microtime(TRUE)-$now)).'ms) '. - $this->file.' [update] '.json_encode($this->document)); - if (isset($this->trigger['afterupdate'])) - \Base::instance()->call($this->trigger['afterupdate'], - [$this,['_id'=>$this->id]]); - return $this->document; - } - - /** - * Delete current record - * @return bool - * @param $filter array - * @param $quick bool - **/ - function erase($filter=NULL,$quick=FALSE) { - $db=$this->db; - $now=microtime(TRUE); - $data=&$db->read($this->file); - $pkey=['_id'=>$this->id]; - if ($filter) { - foreach ($this->find($filter,NULL,FALSE) as $mapper) - if (!$mapper->erase(null,$quick)) - return FALSE; - return TRUE; - } - elseif (isset($this->id)) { - unset($data[$this->id]); - parent::erase(); - } - else - return FALSE; - if (!$quick && isset($this->trigger['beforeerase']) && - \Base::instance()->call($this->trigger['beforeerase'], - [$this,$pkey])===FALSE) - return FALSE; - $db->write($this->file,$data); - if ($filter) { - $args=isset($filter[1]) && is_array($filter[1])? - $filter[1]: - array_slice($filter,1,NULL,TRUE); - $args=is_array($args)?$args:[1=>$args]; - foreach ($args as $key=>$val) { - $vals[]=\Base::instance()-> - stringify(is_array($val)?$val[0]:$val); - $keys[]='/'.(is_numeric($key)?'\?':preg_quote($key)).'/'; - } - } - $db->jot('('.sprintf('%.1f',1e3*(microtime(TRUE)-$now)).'ms) '. - $this->file.' [erase] '. - ($filter?preg_replace($keys,$vals,$filter[0],1):'')); - if (!$quick && isset($this->trigger['aftererase'])) - \Base::instance()->call($this->trigger['aftererase'], - [$this,$pkey]); - return TRUE; - } - - /** - * Reset cursor - * @return NULL - **/ - function reset() { - $this->id=NULL; - $this->document=[]; - parent::reset(); - } - - /** - * Hydrate mapper object using hive array variable - * @return NULL - * @param $var array|string - * @param $func callback - **/ - function copyfrom($var,$func=NULL) { - if (is_string($var)) - $var=\Base::instance()->$var; - if ($func) - $var=call_user_func($func,$var); - foreach ($var as $key=>$val) - $this->set($key,$val); - } - - /** - * Populate hive array variable with mapper fields - * @return NULL - * @param $key string - **/ - function copyto($key) { - $var=&\Base::instance()->ref($key); - foreach ($this->document as $key=>$field) - $var[$key]=$field; - } - - /** - * Return field names - * @return array - **/ - function fields() { - return array_keys($this->document); - } - - /** - * Retrieve external iterator for fields - * @return object - **/ - function getiterator() { - return new \ArrayIterator($this->cast()); - } - - /** - * Instantiate class - * @return void - * @param $db object - * @param $file string - **/ - function __construct(\DB\Jig $db,$file) { - $this->db=$db; - $this->file=$file; - $this->reset(); - } - -} diff --git a/app/lib/db/jig/session.php b/app/lib/db/jig/session.php deleted file mode 100644 index 03faa6cc..00000000 --- a/app/lib/db/jig/session.php +++ /dev/null @@ -1,194 +0,0 @@ -. - -*/ - -namespace DB\Jig; - -//! Jig-managed session handler -class Session extends Mapper { - - protected - //! Session ID - $sid, - //! Anti-CSRF token - $_csrf, - //! User agent - $_agent, - //! IP, - $_ip, - //! Suspect callback - $onsuspect; - - /** - * Open session - * @return TRUE - * @param $path string - * @param $name string - **/ - function open($path,$name) { - return TRUE; - } - - /** - * Close session - * @return TRUE - **/ - function close() { - $this->reset(); - $this->sid=NULL; - return TRUE; - } - - /** - * Return session data in serialized format - * @return string - * @param $id string - **/ - function read($id) { - $this->load(['@session_id=?',$this->sid=$id]); - if ($this->dry()) - return ''; - if ($this->get('ip')!=$this->_ip || $this->get('agent')!=$this->_agent) { - $fw=\Base::instance(); - if (!isset($this->onsuspect) || - $fw->call($this->onsuspect,[$this,$id])===FALSE) { - // NB: `session_destroy` can't be called at that stage; - // `session_start` not completed - $this->destroy($id); - $this->close(); - unset($fw->{'COOKIE.'.session_name()}); - $fw->error(403); - } - } - return $this->get('data'); - } - - /** - * Write session data - * @return TRUE - * @param $id string - * @param $data string - **/ - function write($id,$data) { - $this->set('session_id',$id); - $this->set('data',$data); - $this->set('ip',$this->_ip); - $this->set('agent',$this->_agent); - $this->set('stamp',time()); - $this->save(); - return TRUE; - } - - /** - * Destroy session - * @return TRUE - * @param $id string - **/ - function destroy($id) { - $this->erase(['@session_id=?',$id]); - return TRUE; - } - - /** - * Garbage collector - * @return TRUE - * @param $max int - **/ - function cleanup($max) { - $this->erase(['@stamp+?sid; - } - - /** - * Return anti-CSRF token - * @return string - **/ - function csrf() { - return $this->_csrf; - } - - /** - * Return IP address - * @return string - **/ - function ip() { - return $this->_ip; - } - - /** - * Return Unix timestamp - * @return string|FALSE - **/ - function stamp() { - if (!$this->sid) - session_start(); - return $this->dry()?FALSE:$this->get('stamp'); - } - - /** - * Return HTTP user agent - * @return string|FALSE - **/ - function agent() { - return $this->_agent; - } - - /** - * Instantiate class - * @param $db \DB\Jig - * @param $file string - * @param $onsuspect callback - * @param $key string - **/ - function __construct(\DB\Jig $db,$file='sessions',$onsuspect=NULL,$key=NULL) { - parent::__construct($db,$file); - $this->onsuspect=$onsuspect; - session_set_save_handler( - [$this,'open'], - [$this,'close'], - [$this,'read'], - [$this,'write'], - [$this,'destroy'], - [$this,'cleanup'] - ); - register_shutdown_function('session_commit'); - $fw=\Base::instance(); - $headers=$fw->HEADERS; - $this->_csrf=$fw->hash($fw->SEED. - extension_loaded('openssl')? - implode(unpack('L',openssl_random_pseudo_bytes(4))): - mt_rand() - ); - if ($key) - $fw->$key=$this->_csrf; - $this->_agent=isset($headers['User-Agent'])?$headers['User-Agent']:''; - $this->_ip=$fw->IP; - } - -} diff --git a/app/lib/db/mongo.php b/app/lib/db/mongo.php deleted file mode 100644 index 86ac184c..00000000 --- a/app/lib/db/mongo.php +++ /dev/null @@ -1,145 +0,0 @@ -. - -*/ - -namespace DB; - -//! MongoDB wrapper -class Mongo { - - //@{ - const - E_Profiler='MongoDB profiler is disabled'; - //@} - - protected - //! UUID - $uuid, - //! Data source name - $dsn, - //! MongoDB object - $db, - //! Legacy flag - $legacy, - //! MongoDB log - $log; - - /** - * Return data source name - * @return string - **/ - function dsn() { - return $this->dsn; - } - - /** - * Return UUID - * @return string - **/ - function uuid() { - return $this->uuid; - } - - /** - * Return MongoDB profiler results (or disable logging) - * @param $flag bool - * @return string - **/ - function log($flag=TRUE) { - if ($flag) { - $cursor=$this->db->selectcollection('system.profile')->find(); - foreach (iterator_to_array($cursor) as $frame) - if (!preg_match('/\.system\..+$/',$frame['ns'])) - $this->log.=date('r',$this->legacy() ? - $frame['ts']->sec : (round((string)$frame['ts'])/1000)). - ' ('.sprintf('%.1f',$frame['millis']).'ms) '. - $frame['ns'].' ['.$frame['op'].'] '. - (empty($frame['query'])? - '':json_encode($frame['query'])). - (empty($frame['command'])? - '':json_encode($frame['command'])). - PHP_EOL; - } else { - $this->log=FALSE; - if ($this->legacy) - $this->db->setprofilinglevel(-1); - else - $this->db->command(['profile'=>-1]); - } - return $this->log; - } - - /** - * Intercept native call to re-enable profiler - * @return int - **/ - function drop() { - $out=$this->db->drop(); - if ($this->log!==FALSE) { - if ($this->legacy) - $this->db->setprofilinglevel(2); - else - $this->db->command(['profile'=>2]); - } - return $out; - } - - /** - * Redirect call to MongoDB object - * @return mixed - * @param $func string - * @param $args array - **/ - function __call($func,array $args) { - return call_user_func_array([$this->db,$func],$args); - } - - /** - * Return TRUE if legacy driver is loaded - * @return bool - **/ - function legacy() { - return $this->legacy; - } - - //! Prohibit cloning - private function __clone() { - } - - /** - * Instantiate class - * @param $dsn string - * @param $dbname string - * @param $options array - **/ - function __construct($dsn,$dbname,array $options=NULL) { - $this->uuid=\Base::instance()->hash($this->dsn=$dsn); - if ($this->legacy=class_exists('\MongoClient')) { - $this->db=new \MongoDB(new \MongoClient($dsn,$options?:[]),$dbname); - $this->db->setprofilinglevel(2); - } - else { - $this->db=(new \MongoDB\Client($dsn,$options?:[]))->$dbname; - $this->db->command(['profile'=>2]); - } - } - -} diff --git a/app/lib/db/mongo/mapper.php b/app/lib/db/mongo/mapper.php deleted file mode 100644 index 4ad4cdfe..00000000 --- a/app/lib/db/mongo/mapper.php +++ /dev/null @@ -1,405 +0,0 @@ -. - -*/ - -namespace DB\Mongo; - -//! MongoDB mapper -class Mapper extends \DB\Cursor { - - protected - //! MongoDB wrapper - $db, - //! Legacy flag - $legacy, - //! Mongo collection - $collection, - //! Mongo document - $document=[], - //! Mongo cursor - $cursor, - //! Defined fields - $fields; - - /** - * Return database type - * @return string - **/ - function dbtype() { - return 'Mongo'; - } - - /** - * Return TRUE if field is defined - * @return bool - * @param $key string - **/ - function exists($key) { - return array_key_exists($key,$this->document); - } - - /** - * Assign value to field - * @return scalar|FALSE - * @param $key string - * @param $val scalar - **/ - function set($key,$val) { - return $this->document[$key]=$val; - } - - /** - * Retrieve value of field - * @return scalar|FALSE - * @param $key string - **/ - function &get($key) { - if ($this->exists($key)) - return $this->document[$key]; - user_error(sprintf(self::E_Field,$key),E_USER_ERROR); - } - - /** - * Delete field - * @return NULL - * @param $key string - **/ - function clear($key) { - unset($this->document[$key]); - } - - /** - * Convert array to mapper object - * @return static - * @param $row array - **/ - function factory($row) { - $mapper=clone($this); - $mapper->reset(); - foreach ($row as $key=>$val) - $mapper->document[$key]=$val; - $mapper->query=[clone($mapper)]; - if (isset($mapper->trigger['load'])) - \Base::instance()->call($mapper->trigger['load'],$mapper); - return $mapper; - } - - /** - * Return fields of mapper object as an associative array - * @return array - * @param $obj object - **/ - function cast($obj=NULL) { - if (!$obj) - $obj=$this; - return $obj->document; - } - - /** - * Build query and execute - * @return static[] - * @param $fields string - * @param $filter array - * @param $options array - * @param $ttl int|array - **/ - function select($fields=NULL,$filter=NULL,array $options=NULL,$ttl=0) { - if (!$options) - $options=[]; - $options+=[ - 'group'=>NULL, - 'order'=>NULL, - 'limit'=>0, - 'offset'=>0 - ]; - $tag=''; - if (is_array($ttl)) - list($ttl,$tag)=$ttl; - $fw=\Base::instance(); - $cache=\Cache::instance(); - if (!($cached=$cache->exists($hash=$fw->hash($this->db->dsn(). - $fw->stringify([$fields,$filter,$options])).($tag?'.'.$tag:'').'.mongo', - $result)) || !$ttl || $cached[0]+$ttlcollection->group( - $options['group']['keys'], - $options['group']['initial'], - $options['group']['reduce'], - [ - 'condition'=>$filter, - 'finalize'=>$options['group']['finalize'] - ] - ); - $tmp=$this->db->selectcollection( - $fw->HOST.'.'.$fw->BASE.'.'. - uniqid(NULL,TRUE).'.tmp' - ); - $tmp->batchinsert($grp['retval'],['w'=>1]); - $filter=[]; - $collection=$tmp; - } - else { - $filter=$filter?:[]; - $collection=$this->collection; - } - if ($this->legacy) { - $this->cursor=$collection->find($filter,$fields?:[]); - if ($options['order']) - $this->cursor=$this->cursor->sort($options['order']); - if ($options['limit']) - $this->cursor=$this->cursor->limit($options['limit']); - if ($options['offset']) - $this->cursor=$this->cursor->skip($options['offset']); - $result=[]; - while ($this->cursor->hasnext()) - $result[]=$this->cursor->getnext(); - } - else { - $this->cursor=$collection->find($filter,[ - 'sort'=>$options['order'], - 'limit'=>$options['limit'], - 'skip'=>$options['offset'] - ]); - $result=$this->cursor->toarray(); - } - if ($options['group']) - $tmp->drop(); - if ($fw->CACHE && $ttl) - // Save to cache backend - $cache->set($hash,$result,$ttl); - } - $out=[]; - foreach ($result as $doc) - $out[]=$this->factory($doc); - return $out; - } - - /** - * Return records that match criteria - * @return static[] - * @param $filter array - * @param $options array - * @param $ttl int|array - **/ - function find($filter=NULL,array $options=NULL,$ttl=0) { - if (!$options) - $options=[]; - $options+=[ - 'group'=>NULL, - 'order'=>NULL, - 'limit'=>0, - 'offset'=>0 - ]; - return $this->select($this->fields,$filter,$options,$ttl); - } - - /** - * Count records that match criteria - * @return int - * @param $filter array - * @param $options array - * @param $ttl int|array - **/ - function count($filter=NULL,array $options=NULL,$ttl=0) { - $fw=\Base::instance(); - $cache=\Cache::instance(); - $tag=''; - if (is_array($ttl)) - list($ttl,$tag)=$ttl; - if (!($cached=$cache->exists($hash=$fw->hash($fw->stringify( - [$filter])).($tag?'.'.$tag:'').'.mongo',$result)) || !$ttl || - $cached[0]+$ttlcollection->count($filter?:[]); - if ($fw->CACHE && $ttl) - // Save to cache backend - $cache->set($hash,$result,$ttl); - } - return $result; - } - - /** - * Return record at specified offset using criteria of previous - * load() call and make it active - * @return array - * @param $ofs int - **/ - function skip($ofs=1) { - $this->document=($out=parent::skip($ofs))?$out->document:[]; - if ($this->document && isset($this->trigger['load'])) - \Base::instance()->call($this->trigger['load'],$this); - return $out; - } - - /** - * Insert new record - * @return array - **/ - function insert() { - if (isset($this->document['_id'])) - return $this->update(); - if (isset($this->trigger['beforeinsert']) && - \Base::instance()->call($this->trigger['beforeinsert'], - [$this,['_id'=>$this->document['_id']]])===FALSE) - return $this->document; - if ($this->legacy) { - $this->collection->insert($this->document); - $pkey=['_id'=>$this->document['_id']]; - } - else { - $result=$this->collection->insertone($this->document); - $pkey=['_id'=>$result->getinsertedid()]; - } - if (isset($this->trigger['afterinsert'])) - \Base::instance()->call($this->trigger['afterinsert'], - [$this,$pkey]); - $this->load($pkey); - return $this->document; - } - - /** - * Update current record - * @return array - **/ - function update() { - $pkey=['_id'=>$this->document['_id']]; - if (isset($this->trigger['beforeupdate']) && - \Base::instance()->call($this->trigger['beforeupdate'], - [$this,$pkey])===FALSE) - return $this->document; - $upsert=['upsert'=>TRUE]; - if ($this->legacy) - $this->collection->update($pkey,$this->document,$upsert); - else - $this->collection->replaceone($pkey,$this->document,$upsert); - if (isset($this->trigger['afterupdate'])) - \Base::instance()->call($this->trigger['afterupdate'], - [$this,$pkey]); - return $this->document; - } - - /** - * Delete current record - * @return bool - * @param $quick bool - * @param $filter array - **/ - function erase($filter=NULL,$quick=TRUE) { - if ($filter) { - if (!$quick) { - foreach ($this->find($filter) as $mapper) - if (!$mapper->erase()) - return FALSE; - return TRUE; - } - return $this->legacy? - $this->collection->remove($filter): - $this->collection->deletemany($filter); - } - $pkey=['_id'=>$this->document['_id']]; - if (isset($this->trigger['beforeerase']) && - \Base::instance()->call($this->trigger['beforeerase'], - [$this,$pkey])===FALSE) - return FALSE; - $result=$this->legacy? - $this->collection->remove(['_id'=>$this->document['_id']]): - $this->collection->deleteone(['_id'=>$this->document['_id']]); - parent::erase(); - if (isset($this->trigger['aftererase'])) - \Base::instance()->call($this->trigger['aftererase'], - [$this,$pkey]); - return $result; - } - - /** - * Reset cursor - * @return NULL - **/ - function reset() { - $this->document=[]; - parent::reset(); - } - - /** - * Hydrate mapper object using hive array variable - * @return NULL - * @param $var array|string - * @param $func callback - **/ - function copyfrom($var,$func=NULL) { - if (is_string($var)) - $var=\Base::instance()->$var; - if ($func) - $var=call_user_func($func,$var); - foreach ($var as $key=>$val) - $this->set($key,$val); - } - - /** - * Populate hive array variable with mapper fields - * @return NULL - * @param $key string - **/ - function copyto($key) { - $var=&\Base::instance()->ref($key); - foreach ($this->document as $key=>$field) - $var[$key]=$field; - } - - /** - * Return field names - * @return array - **/ - function fields() { - return array_keys($this->document); - } - - /** - * Return the cursor from last query - * @return object|NULL - **/ - function cursor() { - return $this->cursor; - } - - /** - * Retrieve external iterator for fields - * @return object - **/ - function getiterator() { - return new \ArrayIterator($this->cast()); - } - - /** - * Instantiate class - * @return void - * @param $db object - * @param $collection string - * @param $fields array - **/ - function __construct(\DB\Mongo $db,$collection,$fields=NULL) { - $this->db=$db; - $this->legacy=$db->legacy(); - $this->collection=$db->selectcollection($collection); - $this->fields=$fields; - $this->reset(); - } - -} diff --git a/app/lib/db/mongo/session.php b/app/lib/db/mongo/session.php deleted file mode 100644 index e0194771..00000000 --- a/app/lib/db/mongo/session.php +++ /dev/null @@ -1,194 +0,0 @@ -. - -*/ - -namespace DB\Mongo; - -//! MongoDB-managed session handler -class Session extends Mapper { - - protected - //! Session ID - $sid, - //! Anti-CSRF token - $_csrf, - //! User agent - $_agent, - //! IP, - $_ip, - //! Suspect callback - $onsuspect; - - /** - * Open session - * @return TRUE - * @param $path string - * @param $name string - **/ - function open($path,$name) { - return TRUE; - } - - /** - * Close session - * @return TRUE - **/ - function close() { - $this->reset(); - $this->sid=NULL; - return TRUE; - } - - /** - * Return session data in serialized format - * @return string - * @param $id string - **/ - function read($id) { - $this->load(['session_id'=>$this->sid=$id]); - if ($this->dry()) - return ''; - if ($this->get('ip')!=$this->_ip || $this->get('agent')!=$this->_agent) { - $fw=\Base::instance(); - if (!isset($this->onsuspect) || - $fw->call($this->onsuspect,[$this,$id])===FALSE) { - // NB: `session_destroy` can't be called at that stage; - // `session_start` not completed - $this->destroy($id); - $this->close(); - unset($fw->{'COOKIE.'.session_name()}); - $fw->error(403); - } - } - return $this->get('data'); - } - - /** - * Write session data - * @return TRUE - * @param $id string - * @param $data string - **/ - function write($id,$data) { - $this->set('session_id',$id); - $this->set('data',$data); - $this->set('ip',$this->_ip); - $this->set('agent',$this->_agent); - $this->set('stamp',time()); - $this->save(); - return TRUE; - } - - /** - * Destroy session - * @return TRUE - * @param $id string - **/ - function destroy($id) { - $this->erase(['session_id'=>$id]); - return TRUE; - } - - /** - * Garbage collector - * @return TRUE - * @param $max int - **/ - function cleanup($max) { - $this->erase(['$where'=>'this.stamp+'.$max.'<'.time()]); - return TRUE; - } - - /** - * Return session id (if session has started) - * @return string|NULL - **/ - function sid() { - return $this->sid; - } - - /** - * Return anti-CSRF token - * @return string - **/ - function csrf() { - return $this->_csrf; - } - - /** - * Return IP address - * @return string - **/ - function ip() { - return $this->_ip; - } - - /** - * Return Unix timestamp - * @return string|FALSE - **/ - function stamp() { - if (!$this->sid) - session_start(); - return $this->dry()?FALSE:$this->get('stamp'); - } - - /** - * Return HTTP user agent - * @return string - **/ - function agent() { - return $this->_agent; - } - - /** - * Instantiate class - * @param $db \DB\Mongo - * @param $table string - * @param $onsuspect callback - * @param $key string - **/ - function __construct(\DB\Mongo $db,$table='sessions',$onsuspect=NULL,$key=NULL) { - parent::__construct($db,$table); - $this->onsuspect=$onsuspect; - session_set_save_handler( - [$this,'open'], - [$this,'close'], - [$this,'read'], - [$this,'write'], - [$this,'destroy'], - [$this,'cleanup'] - ); - register_shutdown_function('session_commit'); - $fw=\Base::instance(); - $headers=$fw->HEADERS; - $this->_csrf=$fw->hash($fw->SEED. - extension_loaded('openssl')? - implode(unpack('L',openssl_random_pseudo_bytes(4))): - mt_rand() - ); - if ($key) - $fw->$key=$this->_csrf; - $this->_agent=isset($headers['User-Agent'])?$headers['User-Agent']:''; - $this->_ip=$fw->IP; - } - -} diff --git a/app/lib/db/sql.php b/app/lib/db/sql.php deleted file mode 100644 index 923f3d87..00000000 --- a/app/lib/db/sql.php +++ /dev/null @@ -1,523 +0,0 @@ -. - -*/ - -namespace DB; - -//! PDO wrapper -class SQL { - - //@{ Error messages - const - E_PKey='Table %s does not have a primary key'; - //@} - - const - PARAM_FLOAT='float'; - - protected - //! UUID - $uuid, - //! Raw PDO - $pdo, - //! Data source name - $dsn, - //! Database engine - $engine, - //! Database name - $dbname, - //! Transaction flag - $trans=FALSE, - //! Number of rows affected by query - $rows=0, - //! SQL log - $log; - - /** - * Begin SQL transaction - * @return bool - **/ - function begin() { - $out=$this->pdo->begintransaction(); - $this->trans=TRUE; - return $out; - } - - /** - * Rollback SQL transaction - * @return bool - **/ - function rollback() { - $out=$this->pdo->rollback(); - $this->trans=FALSE; - return $out; - } - - /** - * Commit SQL transaction - * @return bool - **/ - function commit() { - $out=$this->pdo->commit(); - $this->trans=FALSE; - return $out; - } - - /** - * Return transaction flag - * @return bool - **/ - function trans() { - return $this->trans; - } - - /** - * Map data type of argument to a PDO constant - * @return int - * @param $val scalar - **/ - function type($val) { - switch (gettype($val)) { - case 'NULL': - return \PDO::PARAM_NULL; - case 'boolean': - return \PDO::PARAM_BOOL; - case 'integer': - return \PDO::PARAM_INT; - case 'resource': - return \PDO::PARAM_LOB; - case 'float': - return self::PARAM_FLOAT; - default: - return \PDO::PARAM_STR; - } - } - - /** - * Cast value to PHP type - * @return mixed - * @param $type string - * @param $val mixed - **/ - function value($type,$val) { - switch ($type) { - case self::PARAM_FLOAT: - if (!is_string($val)) - $val=str_replace(',','.',$val); - return $val; - case \PDO::PARAM_NULL: - return NULL; - case \PDO::PARAM_INT: - return (int)$val; - case \PDO::PARAM_BOOL: - return (bool)$val; - case \PDO::PARAM_STR: - return (string)$val; - case \PDO::PARAM_LOB: - return (binary)$val; - } - } - - /** - * Execute SQL statement(s) - * @return array|int|FALSE - * @param $cmds string|array - * @param $args string|array - * @param $ttl int|array - * @param $log bool - * @param $stamp bool - **/ - function exec($cmds,$args=NULL,$ttl=0,$log=TRUE,$stamp=FALSE) { - $tag=''; - if (is_array($ttl)) - list($ttl,$tag)=$ttl; - $auto=FALSE; - if (is_null($args)) - $args=[]; - elseif (is_scalar($args)) - $args=[1=>$args]; - if (is_array($cmds)) { - if (count($args)<($count=count($cmds))) - // Apply arguments to SQL commands - $args=array_fill(0,$count,$args); - if (!$this->trans) { - $this->begin(); - $auto=TRUE; - } - } - else { - $count=1; - $cmds=[$cmds]; - $args=[$args]; - } - if ($this->log===FALSE) - $log=FALSE; - $fw=\Base::instance(); - $cache=\Cache::instance(); - $result=FALSE; - for ($i=0;$i<$count;$i++) { - $cmd=$cmds[$i]; - $arg=$args[$i]; - // ensure 1-based arguments - if (array_key_exists(0,$arg)) { - array_unshift($arg,''); - unset($arg[0]); - } - if (!preg_replace('/(^\s+|[\s;]+$)/','',$cmd)) - continue; - $now=microtime(TRUE); - $keys=$vals=[]; - if ($fw->CACHE && $ttl && ($cached=$cache->exists( - $hash=$fw->hash($this->dsn.$cmd. - $fw->stringify($arg)).($tag?'.'.$tag:'').'.sql',$result)) && - $cached[0]+$ttl>microtime(TRUE)) { - foreach ($arg as $key=>$val) { - $vals[]=$fw->stringify(is_array($val)?$val[0]:$val); - $keys[]='/'.preg_quote(is_numeric($key)?chr(0).'?':$key). - '/'; - } - if ($log) - $this->log.=($stamp?(date('r').' '):'').'('. - sprintf('%.1f',1e3*(microtime(TRUE)-$now)).'ms) '. - '[CACHED] '. - preg_replace($keys,$vals, - str_replace('?',chr(0).'?',$cmd),1).PHP_EOL; - } - elseif (is_object($query=$this->pdo->prepare($cmd))) { - foreach ($arg as $key=>$val) { - if (is_array($val)) { - // User-specified data type - $query->bindvalue($key,$val[0], - $val[1]==self::PARAM_FLOAT?\PDO::PARAM_STR:$val[1]); - $vals[]=$fw->stringify($this->value($val[1],$val[0])); - } - else { - // Convert to PDO data type - $query->bindvalue($key,$val, - ($type=$this->type($val))==self::PARAM_FLOAT? - \PDO::PARAM_STR:$type); - $vals[]=$fw->stringify($this->value($type,$val)); - } - $keys[]='/'.preg_quote(is_numeric($key)?chr(0).'?':$key). - '/'; - } - if ($log) - $this->log.=($stamp?(date('r').' '):'').'(-0ms) '. - preg_replace($keys,$vals, - str_replace('?',chr(0).'?',$cmd),1).PHP_EOL; - $query->execute(); - if ($log) - $this->log=str_replace('(-0ms)', - '('.sprintf('%.1f',1e3*(microtime(TRUE)-$now)).'ms)', - $this->log); - if (($error=$query->errorinfo()) && $error[0]!=\PDO::ERR_NONE) { - // Statement-level error occurred - if ($this->trans) - $this->rollback(); - user_error('PDOStatement: '.$error[2],E_USER_ERROR); - } - if (preg_match('/(?:^[\s\(]*'. - '(?:WITH|EXPLAIN|SELECT|PRAGMA|SHOW)|RETURNING)\b/is',$cmd) || - (preg_match('/^\s*(?:CALL|EXEC)\b/is',$cmd) && - $query->columnCount())) { - $result=$query->fetchall(\PDO::FETCH_ASSOC); - // Work around SQLite quote bug - if (preg_match('/sqlite2?/',$this->engine)) - foreach ($result as $pos=>$rec) { - unset($result[$pos]); - $result[$pos]=[]; - foreach ($rec as $key=>$val) - $result[$pos][trim($key,'\'"[]`')]=$val; - } - $this->rows=count($result); - if ($fw->CACHE && $ttl) - // Save to cache backend - $cache->set($hash,$result,$ttl); - } - else - $this->rows=$result=$query->rowcount(); - $query->closecursor(); - unset($query); - } - elseif (($error=$this->errorinfo()) && $error[0]!=\PDO::ERR_NONE) { - // PDO-level error occurred - if ($this->trans) - $this->rollback(); - user_error('PDO: '.$error[2],E_USER_ERROR); - } - - } - if ($this->trans && $auto) - $this->commit(); - return $result; - } - - /** - * Return number of rows affected by last query - * @return int - **/ - function count() { - return $this->rows; - } - - /** - * Return SQL profiler results (or disable logging) - * @return string - * @param $flag bool - **/ - function log($flag=TRUE) { - if ($flag) - return $this->log; - $this->log=FALSE; - } - - /** - * Return TRUE if table exists - * @return bool - * @param $table string - **/ - function exists($table) { - $mode=$this->pdo->getAttribute(\PDO::ATTR_ERRMODE); - $this->pdo->setAttribute(\PDO::ATTR_ERRMODE,\PDO::ERRMODE_SILENT); - $out=$this->pdo-> - query('SELECT 1 FROM '.$this->quotekey($table).' LIMIT 1'); - $this->pdo->setAttribute(\PDO::ATTR_ERRMODE,$mode); - return is_object($out); - } - - /** - * Retrieve schema of SQL table - * @return array|FALSE - * @param $table string - * @param $fields array|string - * @param $ttl int|array - **/ - function schema($table,$fields=NULL,$ttl=0) { - $fw=\Base::instance(); - $cache=\Cache::instance(); - if ($fw->CACHE && $ttl && - ($cached=$cache->exists( - $hash=$fw->hash($this->dsn.$table).'.schema',$result)) && - $cached[0]+$ttl>microtime(TRUE)) - return $result; - if (strpos($table,'.')) - list($schema,$table)=explode('.',$table); - // Supported engines - $cmd=[ - 'sqlite2?'=>[ - 'PRAGMA table_info(`'.$table.'`)', - 'name','type','dflt_value','notnull',0,'pk',TRUE], - 'mysql'=>[ - 'SHOW columns FROM `'.$this->dbname.'`.`'.$table.'`', - 'Field','Type','Default','Null','YES','Key','PRI'], - 'mssql|sqlsrv|sybase|dblib|pgsql|odbc'=>[ - 'SELECT '. - 'C.COLUMN_NAME AS field,'. - 'C.DATA_TYPE AS type,'. - 'C.COLUMN_DEFAULT AS defval,'. - 'C.IS_NULLABLE AS nullable,'. - 'T.CONSTRAINT_TYPE AS pkey '. - 'FROM INFORMATION_SCHEMA.COLUMNS AS C '. - 'LEFT OUTER JOIN '. - 'INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS K '. - 'ON '. - 'C.TABLE_NAME=K.TABLE_NAME AND '. - 'C.COLUMN_NAME=K.COLUMN_NAME AND '. - 'C.TABLE_SCHEMA=K.TABLE_SCHEMA '. - ($this->dbname? - ('AND C.TABLE_CATALOG=K.TABLE_CATALOG '):''). - 'LEFT OUTER JOIN '. - 'INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS T ON '. - 'K.TABLE_NAME=T.TABLE_NAME AND '. - 'K.CONSTRAINT_NAME=T.CONSTRAINT_NAME AND '. - 'K.TABLE_SCHEMA=T.TABLE_SCHEMA '. - ($this->dbname? - ('AND K.TABLE_CATALOG=T.TABLE_CATALOG '):''). - 'WHERE '. - 'C.TABLE_NAME='.$this->quote($table). - ($this->dbname? - (' AND C.TABLE_CATALOG='. - $this->quote($this->dbname)):''), - 'field','type','defval','nullable','YES','pkey','PRIMARY KEY'], - 'oci'=>[ - 'SELECT c.column_name AS field, '. - 'c.data_type AS type, '. - 'c.data_default AS defval, '. - 'c.nullable AS nullable, '. - '(SELECT t.constraint_type '. - 'FROM all_cons_columns acc '. - 'LEFT OUTER JOIN all_constraints t '. - 'ON acc.constraint_name=t.constraint_name '. - 'WHERE acc.table_name='.$this->quote($table).' '. - 'AND acc.column_name=c.column_name '. - 'AND constraint_type='.$this->quote('P').') AS pkey '. - 'FROM all_tab_cols c '. - 'WHERE c.table_name='.$this->quote($table), - 'FIELD','TYPE','DEFVAL','NULLABLE','Y','PKEY','P'] - ]; - if (is_string($fields)) - $fields=\Base::instance()->split($fields); - $conv=[ - 'int\b|integer'=>\PDO::PARAM_INT, - 'bool'=>\PDO::PARAM_BOOL, - 'blob|bytea|image|binary'=>\PDO::PARAM_LOB, - 'float|real|double|decimal|numeric'=>self::PARAM_FLOAT, - '.+'=>\PDO::PARAM_STR - ]; - foreach ($cmd as $key=>$val) - if (preg_match('/'.$key.'/',$this->engine)) { - $rows=[]; - foreach ($this->exec($val[0],NULL) as $row) - if (!$fields || in_array($row[$val[1]],$fields)) { - foreach ($conv as $regex=>$type) - if (preg_match('/'.$regex.'/i',$row[$val[2]])) - break; - $rows[$row[$val[1]]]=[ - 'type'=>$row[$val[2]], - 'pdo_type'=>$type, - 'default'=>is_string($row[$val[3]])? - preg_replace('/^\s*([\'"])(.*)\1\s*/','\2', - $row[$val[3]]):$row[$val[3]], - 'nullable'=>$row[$val[4]]==$val[5], - 'pkey'=>$row[$val[6]]==$val[7] - ]; - } - if ($fw->CACHE && $ttl) - // Save to cache backend - $cache->set($hash,$rows,$ttl); - return $rows; - } - user_error(sprintf(self::E_PKey,$table),E_USER_ERROR); - return FALSE; - } - - /** - * Quote string - * @return string - * @param $val mixed - * @param $type int - **/ - function quote($val,$type=\PDO::PARAM_STR) { - return $this->engine=='odbc'? - (is_string($val)? - \Base::instance()->stringify(str_replace('\'','\'\'',$val)): - $val): - $this->pdo->quote($val,$type); - } - - /** - * Return UUID - * @return string - **/ - function uuid() { - return $this->uuid; - } - - /** - * Return parent object - * @return \PDO - **/ - function pdo() { - return $this->pdo; - } - - /** - * Return database engine - * @return string - **/ - function driver() { - return $this->engine; - } - - /** - * Return server version - * @return string - **/ - function version() { - return $this->pdo->getattribute(\PDO::ATTR_SERVER_VERSION); - } - - /** - * Return database name - * @return string - **/ - function name() { - return $this->dbname; - } - - /** - * Return quoted identifier name - * @return string - * @param $key - * @param bool $split - **/ - function quotekey($key, $split=TRUE) { - $delims=[ - 'sqlite2?|mysql'=>'``', - 'pgsql|oci'=>'""', - 'mssql|sqlsrv|odbc|sybase|dblib'=>'[]' - ]; - $use=''; - foreach ($delims as $engine=>$delim) - if (preg_match('/'.$engine.'/',$this->engine)) { - $use=$delim; - break; - } - return $use[0].($split ? implode($use[1].'.'.$use[0],explode('.',$key)) - : $key).$use[1]; - } - - /** - * Redirect call to PDO object - * @return mixed - * @param $func string - * @param $args array - **/ - function __call($func,array $args) { - return call_user_func_array([$this->pdo,$func],$args); - } - - //! Prohibit cloning - private function __clone() { - } - - /** - * Instantiate class - * @param $dsn string - * @param $user string - * @param $pw string - * @param $options array - **/ - function __construct($dsn,$user=NULL,$pw=NULL,array $options=NULL) { - $fw=\Base::instance(); - $this->uuid=$fw->hash($this->dsn=$dsn); - if (preg_match('/^.+?(?:dbname|database)=(.+?)(?=;|$)/is',$dsn,$parts)) - $this->dbname=$parts[1]; - if (!$options) - $options=[]; - if (isset($parts[0]) && strstr($parts[0],':',TRUE)=='mysql') - $options+=[\PDO::MYSQL_ATTR_INIT_COMMAND=>'SET NAMES '. - strtolower(str_replace('-','',$fw->ENCODING)).';']; - $this->pdo=new \PDO($dsn,$user,$pw,$options); - $this->engine=$this->pdo->getattribute(\PDO::ATTR_DRIVER_NAME); - } - -} diff --git a/app/lib/db/sql/mapper.php b/app/lib/db/sql/mapper.php deleted file mode 100644 index ed7ef533..00000000 --- a/app/lib/db/sql/mapper.php +++ /dev/null @@ -1,700 +0,0 @@ -. - -*/ - -namespace DB\SQL; - -//! SQL data mapper -class Mapper extends \DB\Cursor { - - protected - //! PDO wrapper - $db, - //! Database engine - $engine, - //! SQL table - $source, - //! SQL table (quoted) - $table, - //! Alias for SQL table - $as, - //! Last insert ID - $_id, - //! Defined fields - $fields, - //! Adhoc fields - $adhoc=[], - //! Dynamic properties - $props=[]; - - /** - * Return database type - * @return string - **/ - function dbtype() { - return 'SQL'; - } - - /** - * Return mapped table - * @return string - **/ - function table() { - return $this->source; - } - - /** - * Return TRUE if any/specified field value has changed - * @return bool - * @param $key string - **/ - function changed($key=NULL) { - if (isset($key)) - return $this->fields[$key]['changed']; - foreach($this->fields as $key=>$field) - if ($field['changed']) - return TRUE; - return FALSE; - } - - /** - * Return TRUE if field is defined - * @return bool - * @param $key string - **/ - function exists($key) { - return array_key_exists($key,$this->fields+$this->adhoc); - } - - /** - * Assign value to field - * @return scalar - * @param $key string - * @param $val scalar - **/ - function set($key,$val) { - if (array_key_exists($key,$this->fields)) { - $val=is_null($val) && $this->fields[$key]['nullable']? - NULL:$this->db->value($this->fields[$key]['pdo_type'],$val); - if ($this->fields[$key]['initial']!==$val || - $this->fields[$key]['default']!==$val && is_null($val)) - $this->fields[$key]['changed']=TRUE; - return $this->fields[$key]['value']=$val; - } - // Adjust result on existing expressions - if (isset($this->adhoc[$key])) - $this->adhoc[$key]['value']=$val; - elseif (is_string($val)) - // Parenthesize expression in case it's a subquery - $this->adhoc[$key]=['expr'=>'('.$val.')','value'=>NULL]; - else - $this->props[$key]=$val; - return $val; - } - - /** - * Retrieve value of field - * @return scalar - * @param $key string - **/ - function &get($key) { - if ($key=='_id') - return $this->_id; - elseif (array_key_exists($key,$this->fields)) - return $this->fields[$key]['value']; - elseif (array_key_exists($key,$this->adhoc)) - return $this->adhoc[$key]['value']; - elseif (array_key_exists($key,$this->props)) - return $this->props[$key]; - user_error(sprintf(self::E_Field,$key),E_USER_ERROR); - } - - /** - * Clear value of field - * @return NULL - * @param $key string - **/ - function clear($key) { - if (array_key_exists($key,$this->adhoc)) - unset($this->adhoc[$key]); - else - unset($this->props[$key]); - } - - /** - * Invoke dynamic method - * @return mixed - * @param $func string - * @param $args array - **/ - function __call($func,$args) { - return call_user_func_array( - (array_key_exists($func,$this->props)? - $this->props[$func]: - $this->$func),$args - ); - } - - /** - * Convert array to mapper object - * @return static - * @param $row array - **/ - function factory($row) { - $mapper=clone($this); - $mapper->reset(); - foreach ($row as $key=>$val) { - if (array_key_exists($key,$this->fields)) - $var='fields'; - elseif (array_key_exists($key,$this->adhoc)) - $var='adhoc'; - else - continue; - $mapper->{$var}[$key]['value']=$val; - $mapper->{$var}[$key]['initial']=$val; - if ($var=='fields' && $mapper->{$var}[$key]['pkey']) - $mapper->{$var}[$key]['previous']=$val; - } - $mapper->query=[clone($mapper)]; - if (isset($mapper->trigger['load'])) - \Base::instance()->call($mapper->trigger['load'],$mapper); - return $mapper; - } - - /** - * Return fields of mapper object as an associative array - * @return array - * @param $obj object - **/ - function cast($obj=NULL) { - if (!$obj) - $obj=$this; - return array_map( - function($row) { - return $row['value']; - }, - $obj->fields+$obj->adhoc - ); - } - - /** - * Build query string and arguments - * @return array - * @param $fields string - * @param $filter string|array - * @param $options array - **/ - function stringify($fields,$filter=NULL,array $options=NULL) { - if (!$options) - $options=[]; - $options+=[ - 'group'=>NULL, - 'order'=>NULL, - 'limit'=>0, - 'offset'=>0, - 'comment'=>NULL - ]; - $db=$this->db; - $sql='SELECT '.$fields.' FROM '.$this->table; - if (isset($this->as)) - $sql.=' AS '.$this->db->quotekey($this->as); - $args=[]; - if (is_array($filter)) { - $args=isset($filter[1]) && is_array($filter[1])? - $filter[1]: - array_slice($filter,1,NULL,TRUE); - $args=is_array($args)?$args:[1=>$args]; - list($filter)=$filter; - } - if ($filter) - $sql.=' WHERE '.$filter; - if ($options['group']) { - $sql.=' GROUP BY '.implode(',',array_map( - function($str) use($db) { - return preg_replace_callback( - '/\b(\w+[._\-\w]*)\h*(HAVING.+|$)/i', - function($parts) use($db) { - return $db->quotekey($parts[1]). - (isset($parts[2])?(' '.$parts[2]):''); - }, - $str - ); - }, - explode(',',$options['group']))); - } - if ($options['order']) { - $char=substr($db->quotekey(''),0,1);// quoting char - $order=' ORDER BY '.(is_bool(strpos($options['order'],$char))? - implode(',',array_map(function($str) use($db) { - return preg_match('/^\h*(\w+[._\-\w]*)'. - '(?:\h+((?:ASC|DESC)[\w\h]*))?\h*$/i', - $str,$parts)? - ($db->quotekey($parts[1]). - (isset($parts[2])?(' '.$parts[2]):'')):$str; - },explode(',',$options['order']))): - $options['order']); - } - // SQL Server fixes - if (preg_match('/mssql|sqlsrv|odbc/', $this->engine) && - ($options['limit'] || $options['offset'])) { - // order by pkey when no ordering option was given - if (!$options['order']) - foreach ($this->fields as $key=>$field) - if ($field['pkey']) { - $order=' ORDER BY '.$db->quotekey($key); - break; - } - $ofs=$options['offset']?(int)$options['offset']:0; - $lmt=$options['limit']?(int)$options['limit']:0; - if (strncmp($db->version(),'11',2)>=0) { - // SQL Server >= 2012 - $sql.=$order.' OFFSET '.$ofs.' ROWS'; - if ($lmt) - $sql.=' FETCH NEXT '.$lmt.' ROWS ONLY'; - } - else { - // SQL Server 2008 - $sql=preg_replace('/SELECT/', - 'SELECT '. - ($lmt>0?'TOP '.($ofs+$lmt):'').' ROW_NUMBER() '. - 'OVER ('.$order.') AS rnum,',$sql.$order,1); - $sql='SELECT * FROM ('.$sql.') x WHERE rnum > '.($ofs); - } - } - else { - if (isset($order)) - $sql.=$order; - if ($options['limit']) - $sql.=' LIMIT '.(int)$options['limit']; - if ($options['offset']) - $sql.=' OFFSET '.(int)$options['offset']; - } - if ($options['comment']) - $sql.="\n".' /* '.$options['comment'].' */'; - return [$sql,$args]; - } - - /** - * Build query string and execute - * @return static[] - * @param $fields string - * @param $filter string|array - * @param $options array - * @param $ttl int|array - **/ - function select($fields,$filter=NULL,array $options=NULL,$ttl=0) { - list($sql,$args)=$this->stringify($fields,$filter,$options); - $result=$this->db->exec($sql,$args,$ttl); - $out=[]; - foreach ($result as &$row) { - foreach ($row as $field=>&$val) { - if (array_key_exists($field,$this->fields)) { - if (!is_null($val) || !$this->fields[$field]['nullable']) - $val=$this->db->value( - $this->fields[$field]['pdo_type'],$val); - } - unset($val); - } - $out[]=$this->factory($row); - unset($row); - } - return $out; - } - - /** - * Return records that match criteria - * @return static[] - * @param $filter string|array - * @param $options array - * @param $ttl int|array - **/ - function find($filter=NULL,array $options=NULL,$ttl=0) { - if (!$options) - $options=[]; - $options+=[ - 'group'=>NULL, - 'order'=>NULL, - 'limit'=>0, - 'offset'=>0 - ]; - $adhoc=''; - foreach ($this->adhoc as $key=>$field) - $adhoc.=','.$field['expr'].' AS '.$this->db->quotekey($key); - return $this->select( - ($options['group'] && !preg_match('/mysql|sqlite/',$this->engine)? - $options['group']: - implode(',',array_map([$this->db,'quotekey'], - array_keys($this->fields)))).$adhoc,$filter,$options,$ttl); - } - - /** - * Count records that match criteria - * @return int - * @param $filter string|array - * @param $options array - * @param $ttl int|array - **/ - function count($filter=NULL,array $options=NULL,$ttl=0) { - if (!($subquery_mode=($options && !empty($options['group'])))) - $this->adhoc['_rows']=['expr'=>'COUNT(*)','value'=>NULL]; - $adhoc=[]; - foreach ($this->adhoc as $key=>$field) - // Add all adhoc fields - // (make them available for grouping, sorting, having) - $adhoc[]=$field['expr'].' AS '.$this->db->quotekey($key); - $fields=implode(',',$adhoc); - if ($subquery_mode) { - if (empty($fields)) - // Select at least one field, ideally the grouping fields - // or sqlsrv fails - $fields=preg_replace('/HAVING.+$/i','',$options['group']); - if (preg_match('/mssql|dblib|sqlsrv/',$this->engine)) - $fields='TOP 100 PERCENT '.$fields; - } - list($sql,$args)=$this->stringify($fields,$filter,$options); - if ($subquery_mode) - $sql='SELECT COUNT(*) AS '.$this->db->quotekey('_rows').' '. - 'FROM ('.$sql.') AS '.$this->db->quotekey('_temp'); - $result=$this->db->exec($sql,$args,$ttl); - unset($this->adhoc['_rows']); - return (int)$result[0]['_rows']; - } - /** - * Return record at specified offset using same criteria as - * previous load() call and make it active - * @return static - * @param $ofs int - **/ - function skip($ofs=1) { - $out=parent::skip($ofs); - $dry=$this->dry(); - foreach ($this->fields as $key=>&$field) { - $field['value']=$dry?NULL:$out->fields[$key]['value']; - $field['initial']=$field['value']; - $field['changed']=FALSE; - if ($field['pkey']) - $field['previous']=$dry?NULL:$out->fields[$key]['value']; - unset($field); - } - foreach ($this->adhoc as $key=>&$field) { - $field['value']=$dry?NULL:$out->adhoc[$key]['value']; - unset($field); - } - if (!$dry && isset($this->trigger['load'])) - \Base::instance()->call($this->trigger['load'],$this); - return $out; - } - - /** - * Insert new record - * @return static - **/ - function insert() { - $args=[]; - $actr=0; - $nctr=0; - $fields=''; - $values=''; - $filter=''; - $pkeys=[]; - $nkeys=[]; - $ckeys=[]; - $inc=NULL; - foreach ($this->fields as $key=>$field) - if ($field['pkey']) - $pkeys[$key]=$field['previous']; - if (isset($this->trigger['beforeinsert']) && - \Base::instance()->call($this->trigger['beforeinsert'], - [$this,$pkeys])===FALSE) - return $this; - foreach ($this->fields as $key=>&$field) { - if ($field['pkey']) { - $field['previous']=$field['value']; - if (!$inc && $field['pdo_type']==\PDO::PARAM_INT && - empty($field['value']) && !$field['nullable']) - $inc=$key; - $filter.=($filter?' AND ':'').$this->db->quotekey($key).'=?'; - $nkeys[$nctr+1]=[$field['value'],$field['pdo_type']]; - $nctr++; - } - if ($field['changed'] && $key!=$inc) { - $fields.=($actr?',':'').$this->db->quotekey($key); - $values.=($actr?',':'').'?'; - $args[$actr+1]=[$field['value'],$field['pdo_type']]; - $actr++; - $ckeys[]=$key; - } - } - if ($fields) { - $add=$aik=''; - if ($this->engine=='pgsql' && !empty($pkeys)) { - $names=array_keys($pkeys); - $aik=end($names); - $add=' RETURNING '.$this->db->quotekey($aik); - } - $lID=$this->db->exec( - (preg_match('/mssql|dblib|sqlsrv/',$this->engine) && - array_intersect(array_keys($pkeys),$ckeys)? - 'SET IDENTITY_INSERT '.$this->table.' ON;':''). - 'INSERT INTO '.$this->table.' ('.$fields.') '. - 'VALUES ('.$values.')'.$add,$args - ); - if ($this->engine=='pgsql' && $lID && $aik) - $this->_id=$lID[0][$aik]; - elseif ($this->engine!='oci') - $this->_id=$this->db->lastinsertid(); - // Reload to obtain default and auto-increment field values - if ($reload=(($inc && $this->_id) || $filter)) - $this->load($inc? - [$inc.'=?',$this->db->value( - $this->fields[$inc]['pdo_type'],$this->_id)]: - [$filter,$nkeys]); - if (isset($this->trigger['afterinsert'])) - \Base::instance()->call($this->trigger['afterinsert'], - [$this,$pkeys]); - // reset changed flag after calling afterinsert - if (!$reload) - foreach ($this->fields as $key=>&$field) { - $field['changed']=FALSE; - $field['initial']=$field['value']; - unset($field); - } - } - return $this; - } - - /** - * Update current record - * @return static - **/ - function update() { - $args=[]; - $ctr=0; - $pairs=''; - $filter=''; - $pkeys=[]; - foreach ($this->fields as $key=>$field) - if ($field['pkey']) - $pkeys[$key]=$field['previous']; - if (isset($this->trigger['beforeupdate']) && - \Base::instance()->call($this->trigger['beforeupdate'], - [$this,$pkeys])===FALSE) - return $this; - foreach ($this->fields as $key=>$field) - if ($field['changed']) { - $pairs.=($pairs?',':'').$this->db->quotekey($key).'=?'; - $args[++$ctr]=[$field['value'],$field['pdo_type']]; - } - foreach ($this->fields as $key=>$field) - if ($field['pkey']) { - $filter.=($filter?' AND ':' WHERE '). - $this->db->quotekey($key).'=?'; - $args[++$ctr]=[$field['previous'],$field['pdo_type']]; - } - if ($pairs) { - $sql='UPDATE '.$this->table.' SET '.$pairs.$filter; - $this->db->exec($sql,$args); - } - if (isset($this->trigger['afterupdate'])) - \Base::instance()->call($this->trigger['afterupdate'], - [$this,$pkeys]); - // reset changed flag after calling afterupdate - foreach ($this->fields as $key=>&$field) { - $field['changed']=FALSE; - $field['initial']=$field['value']; - unset($field); - } - return $this; - } - - /** - * Delete current record - * @return int - * @param $quick bool - * @param $filter string|array - **/ - function erase($filter=NULL,$quick=TRUE) { - if (isset($filter)) { - if (!$quick) { - $out=0; - foreach ($this->find($filter) as $mapper) - $out+=$mapper->erase(); - return $out; - } - $args=[]; - if (is_array($filter)) { - $args=isset($filter[1]) && is_array($filter[1])? - $filter[1]: - array_slice($filter,1,NULL,TRUE); - $args=is_array($args)?$args:[1=>$args]; - list($filter)=$filter; - } - return $this->db-> - exec('DELETE FROM '.$this->table. - ($filter?' WHERE '.$filter:'').';',$args); - } - $args=[]; - $ctr=0; - $filter=''; - $pkeys=[]; - foreach ($this->fields as $key=>&$field) { - if ($field['pkey']) { - $filter.=($filter?' AND ':'').$this->db->quotekey($key).'=?'; - $args[$ctr+1]=[$field['previous'],$field['pdo_type']]; - $pkeys[$key]=$field['previous']; - $ctr++; - } - $field['value']=NULL; - $field['changed']=(bool)$field['default']; - if ($field['pkey']) - $field['previous']=NULL; - unset($field); - } - foreach ($this->adhoc as &$field) { - $field['value']=NULL; - unset($field); - } - parent::erase(); - if (isset($this->trigger['beforeerase']) && - \Base::instance()->call($this->trigger['beforeerase'], - [$this,$pkeys])===FALSE) - return 0; - $out=$this->db-> - exec('DELETE FROM '.$this->table.' WHERE '.$filter.';',$args); - if (isset($this->trigger['aftererase'])) - \Base::instance()->call($this->trigger['aftererase'], - [$this,$pkeys]); - return $out; - } - - /** - * Reset cursor - * @return NULL - **/ - function reset() { - foreach ($this->fields as &$field) { - $field['value']=NULL; - $field['initial']=NULL; - $field['changed']=FALSE; - if ($field['pkey']) - $field['previous']=NULL; - unset($field); - } - foreach ($this->adhoc as &$field) { - $field['value']=NULL; - unset($field); - } - parent::reset(); - } - - /** - * Hydrate mapper object using hive array variable - * @return NULL - * @param $var array|string - * @param $func callback - **/ - function copyfrom($var,$func=NULL) { - if (is_string($var)) - $var=\Base::instance()->$var; - if ($func) - $var=call_user_func($func,$var); - foreach ($var as $key=>$val) - if (in_array($key,array_keys($this->fields))) - $this->set($key,$val); - } - - /** - * Populate hive array variable with mapper fields - * @return NULL - * @param $key string - **/ - function copyto($key) { - $var=&\Base::instance()->ref($key); - foreach ($this->fields+$this->adhoc as $key=>$field) - $var[$key]=$field['value']; - } - - /** - * Return schema and, if the first argument is provided, update it - * @return array - * @param $fields NULL|array - **/ - function schema($fields=null) { - if ($fields) - $this->fields = $fields; - return $this->fields; - } - - /** - * Return field names - * @return array - * @param $adhoc bool - **/ - function fields($adhoc=TRUE) { - return array_keys($this->fields+($adhoc?$this->adhoc:[])); - } - - /** - * Return TRUE if field is not nullable - * @return bool - * @param $field string - **/ - function required($field) { - return isset($this->fields[$field]) && - !$this->fields[$field]['nullable']; - } - - /** - * Retrieve external iterator for fields - * @return object - **/ - function getiterator() { - return new \ArrayIterator($this->cast()); - } - - /** - * Assign alias for table - * @param $alias string - **/ - function alias($alias) { - $this->as=$alias; - return $this; - } - - /** - * Instantiate class - * @param $db \DB\SQL - * @param $table string - * @param $fields array|string - * @param $ttl int|array - **/ - function __construct(\DB\SQL $db,$table,$fields=NULL,$ttl=60) { - $this->db=$db; - $this->engine=$db->driver(); - if ($this->engine=='oci') - $table=strtoupper($table); - $this->source=$table; - $this->table=$this->db->quotekey($table); - $this->fields=$db->schema($table,$fields,$ttl); - $this->reset(); - } - -} diff --git a/app/lib/db/sql/schema.php b/app/lib/db/sql/schema.php deleted file mode 100644 index 015fccbd..00000000 --- a/app/lib/db/sql/schema.php +++ /dev/null @@ -1,1320 +0,0 @@ - - * https://github.com/ikkez/F3-Sugar/ - * - * @package DB - * @version 2.2.3 - * @date 15.05.2018 - **/ - - -namespace DB\SQL; - -class Schema { - - use DB_Utils; - - public - $dataTypes = array( - 'BOOLEAN' => array('mysql' => 'tinyint(1)', - 'sqlite2?|pgsql' => 'BOOLEAN', - 'mssql|sybase|dblib|odbc|sqlsrv' => 'bit', - 'ibm' => 'numeric(1,0)', - ), - 'INT1' => array('mysql' => 'tinyint(4)', - 'sqlite2?' => 'integer(4)', - 'mssql|sybase|dblib|odbc|sqlsrv' => 'tinyint', - 'pgsql|ibm' => 'smallint', - ), - 'INT2' => array('mysql' => 'smallint(6)', - 'sqlite2?' => 'integer(6)', - 'pgsql|ibm|mssql|sybase|dblib|odbc|sqlsrv' => 'smallint', - ), - 'INT4' => array('sqlite2?' => 'integer(11)', - 'pgsql|imb' => 'integer', - 'mysql' => 'int(11)', - 'mssql|dblib|sybase|odbc|sqlsrv' => 'int', - ), - 'INT8' => array('sqlite2?' => 'integer(20)', - 'pgsql|mssql|sybase|dblib|odbc|sqlsrv|imb' => 'bigint', - 'mysql' => 'bigint(20)', - ), - 'FLOAT' => array('mysql|sqlite2?' => 'FLOAT', - 'pgsql' => 'double precision', - 'mssql|sybase|dblib|odbc|sqlsrv' => 'float', - 'imb' => 'decfloat' - ), - 'DOUBLE' => array('mysql|ibm' => 'decimal(18,6)', - 'sqlite2?' => 'decimal(15,6)', // max 15-digit on sqlite - 'pgsql' => 'numeric(18,6)', - 'mssql|dblib|sybase|odbc|sqlsrv' => 'decimal(18,6)', - ), - 'VARCHAR128' => array('mysql|sqlite2?|ibm|mssql|sybase|dblib|odbc|sqlsrv' => 'varchar(128)', - 'pgsql' => 'character varying(128)', - ), - 'VARCHAR256' => array('mysql|sqlite2?|ibm|mssql|sybase|dblib|odbc|sqlsrv' => 'varchar(255)', - 'pgsql' => 'character varying(255)', - ), - 'VARCHAR512' => array('mysql|sqlite2?|ibm|mssql|sybase|dblib|odbc|sqlsrv' => 'varchar(512)', - 'pgsql' => 'character varying(512)', - ), - 'TEXT' => array('mysql|sqlite2?|pgsql|mssql' => 'text', - 'sybase|dblib|odbc|sqlsrv' => 'nvarchar(max)', - 'ibm' => 'BLOB SUB_TYPE TEXT', - ), - 'LONGTEXT' => array('mysql' => 'LONGTEXT', - 'sqlite2?|pgsql|mssql' => 'text', - 'sybase|dblib|odbc|sqlsrv' => 'nvarchar(max)', - 'ibm' => 'CLOB(2000000000)', - ), - 'DATE' => array('mysql|sqlite2?|pgsql|mssql|sybase|dblib|odbc|sqlsrv|ibm' => 'date', - ), - 'DATETIME' => array('pgsql' => 'timestamp without time zone', - 'mysql|sqlite2?|mssql|sybase|dblib|odbc|sqlsrv' => 'datetime', - 'ibm' => 'timestamp', - ), - 'TIMESTAMP' => array('mysql|ibm' => 'timestamp', - 'pgsql|odbc' => 'timestamp without time zone', - 'sqlite2?|mssql|sybase|dblib|sqlsrv'=>'DATETIME', - ), - 'BLOB' => array('mysql|odbc|sqlite2?|ibm' => 'blob', - 'pgsql' => 'bytea', - 'mssql|sybase|dblib' => 'image', - 'sqlsrv' => 'varbinary(max)', - ), - ), - $defaultTypes = array( - 'CUR_STAMP' => array('mysql' => 'CURRENT_TIMESTAMP', - 'mssql|sybase|dblib|odbc|sqlsrv' => 'getdate()', - 'pgsql' => 'LOCALTIMESTAMP(0)', - 'sqlite2?' => "(datetime('now','localtime'))", - ), - ); - - public - $name; - - public static - $strict = FALSE; - - const - // DataTypes and Aliases - DT_BOOL = 'BOOLEAN', - DT_BOOLEAN = 'BOOLEAN', - DT_INT1 = 'INT1', - DT_TINYINT = 'INT1', - DT_INT2 = 'INT2', - DT_SMALLINT = 'INT2', - DT_INT4 = 'INT4', - DT_INT = 'INT4', - DT_INT8 = 'INT8', - DT_BIGINT = 'INT8', - DT_FLOAT = 'FLOAT', - DT_DOUBLE = 'DOUBLE', - DT_DECIMAL = 'DOUBLE', - DT_VARCHAR128 = 'VARCHAR128', - DT_VARCHAR256 = 'VARCHAR256', - DT_VARCHAR512 = 'VARCHAR512', - DT_TEXT = 'TEXT', - DT_LONGTEXT = 'LONGTEXT', - DT_DATE = 'DATE', - DT_DATETIME = 'DATETIME', - DT_TIMESTAMP = 'TIMESTAMP', - DT_BLOB = 'BLOB', - DT_BINARY = 'BLOB', - - // column default values - DF_CURRENT_TIMESTAMP = 'CUR_STAMP'; - - - public function __construct(\DB\SQL $db) - { - $this->db = $db; - } - - /** - * get a list of all databases - * @return array|bool - */ - public function getDatabases() - { - $cmd = array( - 'mysql' => 'SHOW DATABASES', - 'pgsql' => 'SELECT datname FROM pg_catalog.pg_database', - 'mssql|sybase|dblib|sqlsrv|odbc' => 'EXEC SP_HELPDB', - ); - $query = $this->findQuery($cmd); - if (!$query) return false; - $result = $this->db->exec($query); - if (!is_array($result)) return false; - foreach($result as &$db) - if (is_array($db)) $db = array_shift($db); - return $result; - } - - /** - * get all tables of current DB - * @return bool|array list of tables, or false - */ - public function getTables() - { - $cmd = array( - 'mysql' => array( - "show tables"), - 'sqlite2?' => array( - "SELECT name FROM sqlite_master WHERE type='table' AND name!='sqlite_sequence'"), - 'pgsql|sybase|dblib' => array( - "select table_name from information_schema.tables where table_schema = 'public'"), - 'mssql|sqlsrv|odbc' => array( - "select table_name from information_schema.tables"), - 'ibm' => array("select TABLE_NAME from sysibm.tables"), - ); - $query = $this->findQuery($cmd); - if (!$query[0]) return false; - $tables = $this->db->exec($query[0]); - if ($tables && is_array($tables) && count($tables) > 0) - foreach ($tables as &$table) - $table = array_shift($table); - return $tables; - } - - /** - * returns a table object for creation - * @param $name - * @return bool|TableCreator - */ - public function createTable($name) - { - return new TableCreator($name,$this); - } - - /** - * returns a table object for altering operations - * @param $name - * @return bool|TableModifier - */ - public function alterTable($name) - { - return new TableModifier($name,$this); - } - - /** - * rename a table - * @param string $name - * @param string $new_name - * @param bool $exec - * @return bool - */ - public function renameTable($name, $new_name, $exec = true) - { - $name = $this->db->quotekey($name); - $new_name = $this->db->quotekey($new_name); - if (preg_match('/odbc/', $this->db->driver())) { - $queries = array(); - $queries[] = "SELECT * INTO $new_name FROM $name;"; - $queries[] = $this->dropTable($name, false); - return ($exec) ? $this->db->exec($queries) : implode("\n",$queries); - } else { - $cmd = array( - 'sqlite2?|pgsql' => - "ALTER TABLE $name RENAME TO $new_name;", - 'mysql|ibm' => - "RENAME TABLE $name TO $new_name;", - 'mssql|sqlsrv|sybase|dblib|odbc' => - "sp_rename {$name}, $new_name" - ); - $query = $this->findQuery($cmd); - if (!$exec) return $query; - return (preg_match('/mssql|sybase|dblib|sqlsrv/', $this->db->driver())) - ? @$this->db->exec($query) : $this->db->exec($query); - } - } - - /** - * drop a table - * @param \DB\SQL\TableBuilder|string $name - * @param bool $exec - * @return bool - */ - public function dropTable($name, $exec = true) - { - if (is_object($name) && $name instanceof TableBuilder) - $name = $name->name; - $cmd = array( - 'mysql|ibm|sqlite2?|pgsql|sybase|dblib' => - 'DROP TABLE IF EXISTS '.$this->db->quotekey($name).';', - 'mssql|sqlsrv|odbc' => - "IF OBJECT_ID('[$name]', 'U') IS NOT NULL DROP TABLE [$name];" - ); - $query = $this->findQuery($cmd); - return ($exec) ? $this->db->exec($query) : $query; - } - - /** - * clear a table - * @param $name - * @param bool $exec - * @return array|bool|FALSE|int|string - */ - public function truncateTable($name, $exec = true) { - if (is_object($name) && $name instanceof TableBuilder) - $name = $name->name; - $cmd = array( - 'mysql|ibm|pgsql|sybase|dblib|mssql|sqlsrv|odbc' => - 'TRUNCATE TABLE '.$this->db->quotekey($name).';', - 'sqlite2?' => array( - 'DELETE FROM '.$this->db->quotekey($name).';', -// 'UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE name = '.$this->db->quotekey($name).';', - ), - ); - $query = $this->findQuery($cmd); - return ($exec) ? $this->db->exec($query) : $query; - } - - /** - * check if a data type is compatible with a given column definition - * @param string $colType (i.e: BOOLEAN) - * @param string $colDef (i.e: tinyint(1)) - * @return int - */ - public function isCompatible($colType,$colDef) { - $raw_type=$this->findQuery($this->dataTypes[strtoupper($colType)]); - preg_match_all('/(?P\w+)($|\((?P(\d+|(.*)))\))/', $raw_type, $match); - return (bool) preg_match_all('/'.preg_quote($match['type'][0]).'($|\('. - preg_quote($match['length'][0]).'\))/i',$colDef); - } -} - -abstract class TableBuilder { - - use DB_Utils; - - protected $columns, $pkeys, $queries, $increments, $rebuild_cmd, $suppress; - public $name; - /** @var Schema */ - public $schema; - - const - TEXT_NoDefaultForTEXT = "Column `%s` of type TEXT can't have a default value.", - TEXT_ColumnExists = "Cannot add the column `%s`. It already exists."; - - /** - * @param string $name - * @param Schema $schema - */ - public function __construct($name, Schema $schema) - { - $this->name = $name; - $this->schema = $schema; - $this->columns = array(); - $this->queries = array(); - $this->pkeys = array('id'); - $this->increments = 'id'; - $this->db = $schema->db; - } - - /** - * generate SQL query and execute it if $exec is true - * @param bool $exec - */ - abstract public function build($exec = TRUE); - - /** - * add a new column to this table - * @param string|Column $key column name or object - * @param null|array $args optional config array - * @return \DB\SQL\Column - */ - public function addColumn($key,$args = null) - { - if ($key instanceof Column) { - $args = $key->getColumnArray(); - $key = $key->name; - } - if (array_key_exists($key,$this->columns)) - trigger_error(sprintf(self::TEXT_ColumnExists,$key),E_USER_ERROR); - $column = new Column($key, $this); - if ($args) - foreach ($args as $arg => $val) - $column->{$arg} = $val; - // skip default pkey field - if (count($this->pkeys) == 1 && in_array($key,$this->pkeys)) - return $column; - return $this->columns[$key] =& $column; - } - - /** - * create index on one or more columns - * @param string|array $index_cols Column(s) to be indexed - * @param $search_cols - * @param bool $unique Unique index - * @param int $length index length for text fields in mysql - */ - protected function _addIndex($index_cols, $search_cols, $unique, $length) - { - if (!is_array($index_cols)) - $index_cols = array($index_cols); - $quotedCols = array_map(array($this->db, 'quotekey'), $index_cols); - if (preg_match('/mysql/', $this->db->driver())) - foreach($quotedCols as $i=>&$col) - if(strtoupper($search_cols[$index_cols[$i]]['type']) == 'TEXT') - $col.='('.$length.')'; - $cols = implode(',', $quotedCols); - $name = $this->assembleIndexKey($index_cols,$this->name); - $name = $this->db->quotekey($name); - $table = $this->db->quotekey($this->name); - $index = $unique ? 'UNIQUE INDEX' : 'INDEX'; - $cmd = array( - 'pgsql|sqlite2?|ibm|mssql|sybase|dblib|odbc|sqlsrv' => - "CREATE $index $name ON $table ($cols);", - 'mysql' => //ALTER TABLE is used because of MySQL bug #48875 - "ALTER TABLE $table ADD $index $name ($cols);", - ); - $query = $this->findQuery($cmd); - $this->queries[] = $query; - } - - /** - * create index name from one or more given column names, max. 64 char lengths - * @param string|array $index_cols - * @return string - */ - protected function assembleIndexKey($index_cols,$table_name) { - if (!is_array($index_cols)) - $index_cols = array($index_cols); - $name = $table_name.'___'.implode('__', $index_cols); - if (strlen($name)>64) - $name=$table_name.'___'.\Base::instance()->hash(implode('__', $index_cols)); - if (strlen($name)>64) - $name='___'.\Base::instance()->hash($table_name.'___'.implode('__', $index_cols)); - return $name; - } - - /** - * set primary / composite key to table - * @param string|array $pkeys - * @return bool - */ - public function primary($pkeys) { - if (empty($pkeys)) - return false; - if (!is_array($pkeys)) - $pkeys = array($pkeys); - // single pkey - $this->increments = $pkeys[0]; - $this->pkeys = $pkeys; - // drop duplicate pkey definition - if (array_key_exists($this->increments,$this->columns)) - unset($this->columns[$this->increments]); - // set flag on new fields - foreach ($pkeys as $name) - if(array_key_exists($name,$this->columns)) - $this->columns[$name]->pkey = true; - // composite key - if (count($pkeys) > 1) { - $pkeys_quoted = array_map(array($this->db,'quotekey'), $pkeys); - $pk_string = implode(', ', $pkeys_quoted); - if (preg_match('/sqlite2?/', $this->db->driver())) { - // rebuild table with new primary keys - $this->rebuild_cmd['pkeys'] = $pkeys; - return; - } else { - $table = $this->db->quotekey($this->name); - $table_key = $this->db->quotekey($this->name.'_pkey'); - $cmd = array( - 'odbc' => - "CREATE INDEX $table_key ON $table ( $pk_string );", - 'mysql' => - "ALTER TABLE $table DROP PRIMARY KEY, ADD PRIMARY KEY ( $pk_string );", - 'mssql|sybase|dblib|sqlsrv' => array( - "ALTER TABLE $table DROP CONSTRAINT PK_".$this->name."_ID;", - "ALTER TABLE $table ADD CONSTRAINT $table_key PRIMARY KEY ( $pk_string );", - ), - 'pgsql' => array( - "ALTER TABLE $table DROP CONSTRAINT $table_key;", - "ALTER TABLE $table ADD CONSTRAINT $table_key PRIMARY KEY ( $pk_string );", - ), - ); - $query = $this->findQuery($cmd); - if (!is_array($query)) - $query = array($query); - foreach ($query as $q) - $this->queries[] = $q; - } - } - } - -} - -class TableCreator extends TableBuilder { - - const - TEXT_TableAlreadyExists = "Table `%s` already exists. Cannot create it."; - - protected $charset='utf8'; - - public function setCharset($str) { - $this->charset=$str; - } - - /** - * generate SQL query for creating a basic table, containing an ID serial field - * and execute it if $exec is true, otherwise just return the generated query string - * @param bool $exec - * @return bool|TableModifier|string - */ - public function build($exec = TRUE) - { - // check if already existing - if ($exec && in_array($this->name, $this->schema->getTables())) { - trigger_error(sprintf(self::TEXT_TableAlreadyExists,$this->name),E_USER_ERROR); - return false; - } - $cols = ''; - if (!empty($this->columns)) - foreach ($this->columns as $cname => $column) { - // no defaults for TEXT type - if ($column->default !== false && is_int(strpos(strtoupper($column->type),'TEXT'))) { - trigger_error(sprintf(self::TEXT_NoDefaultForTEXT, $column->name),E_USER_ERROR); - return false; - } - $cols .= ', '.$column->getColumnQuery(); - } - $table = $this->db->quotekey($this->name); - $id = $this->db->quotekey($this->increments); - $cmd = array( - 'sqlite2?|sybase|dblib' => - "CREATE TABLE $table ($id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT".$cols.");", - 'mysql' => - "CREATE TABLE $table ($id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT".$cols.") DEFAULT CHARSET=$this->charset COLLATE ".$this->charset."_unicode_ci;", - 'pgsql' => - "CREATE TABLE $table ($id SERIAL PRIMARY KEY".$cols.");", - 'mssql|odbc|sqlsrv' => - "CREATE TABLE $table ($id INT IDENTITY CONSTRAINT PK_".$this->name."_ID PRIMARY KEY".$cols.");", - 'ibm' => - "CREATE TABLE $table ($id INTEGER AS IDENTITY NOT NULL $cols, PRIMARY KEY($id));", - ); - $query = $this->findQuery($cmd); - // composite key for sqlite - if (count($this->pkeys) > 1 && preg_match('/sqlite2?/', $this->db->driver())) { - $pk_string = implode(', ', $this->pkeys); - $query = "CREATE TABLE $table ($id INTEGER NULL".$cols.", PRIMARY KEY ($pk_string) );"; - $newTable = new TableModifier($this->name, $this->schema); - // auto-incrementation in composite primary keys - $pk_queries = $newTable->_sqlite_increment_trigger($this->increments); - $this->queries = array_merge($this->queries, $pk_queries); - } - array_unshift($this->queries, $query); - // indexes - foreach ($this->columns as $cname => $column) - if ($column->index) - $this->addIndex($cname, $column->unique); - if (!$exec) - return $this->queries; - $this->db->exec($this->queries); - return isset($newTable) ? $newTable : new TableModifier($this->name,$this->schema); - } - - /** - * create index on one or more columns - * @param string|array $columns Column(s) to be indexed - * @param bool $unique Unique index - * @param int $length index length for text fields in mysql - */ - public function addIndex($columns, $unique = FALSE, $length = 20) - { - if (!is_array($columns)) - $columns = array($columns); - $cols = $this->columns; - foreach ($cols as &$col) - $col = $col->getColumnArray(); - parent::_addIndex($columns,$cols,$unique,$length); - } - -} - - -class TableModifier extends TableBuilder { - - protected - $colTypes, $rebuild_cmd; - - const - // error messages - TEXT_TableNotExisting = "Unable to alter table `%s`. It does not exist.", - TEXT_NotNullFieldNeedsDefault = 'You cannot add the not nullable column `%s` without specifying a default value', - TEXT_ENGINE_NOT_SUPPORTED = 'DB Engine `%s` is not supported for this action.'; - - /** - * generate SQL queries for altering the table and execute it if $exec is true, - * otherwise return the generated query string - * @param bool $exec - * @return array|FALSE - */ - public function build($exec = TRUE) - { - // check if table exists - if (!in_array($this->name, $this->schema->getTables())) - trigger_error(sprintf(self::TEXT_TableNotExisting, $this->name),E_USER_ERROR); - - if ($sqlite = preg_match('/sqlite2?/', $this->db->driver())) { - $sqlite_queries = array(); - } - $rebuild = false; - $additional_queries = $this->queries; - $this->queries = array(); - // add new columns - foreach ($this->columns as $cname => $column) { - /** @var Column $column */ - // not nullable fields should have a default value, when altering a table - if ($column->default === false && $column->nullable === false) { - trigger_error(sprintf(self::TEXT_NotNullFieldNeedsDefault, $column->name),E_USER_ERROR); - return false; - } - // no defaults for TEXT type - if($column->default !== false && is_int(strpos(strtoupper($column->type),'TEXT'))) { - trigger_error(sprintf(self::TEXT_NoDefaultForTEXT, $column->name),E_USER_ERROR); - return false; - } - $table = $this->db->quotekey($this->name); - $col_query = $column->getColumnQuery(); - if ($sqlite) { - // sqlite: dynamic column default only works when rebuilding the table - if($column->default === Schema::DF_CURRENT_TIMESTAMP) { - $rebuild = true; - break; - } else - $sqlite_queries[] = "ALTER TABLE $table ADD $col_query;"; - } else { - $cmd = array( - 'mysql|pgsql|mssql|sybase|dblib|odbc|sqlsrv' => - "ALTER TABLE $table ADD $col_query;", - 'ibm' => - "ALTER TABLE $table ADD COLUMN $col_query;", - ); - $this->queries[] = $this->findQuery($cmd); - } - } - if ($sqlite) - if ($rebuild || !empty($this->rebuild_cmd)) $this->_sqlite_rebuild($exec); - else $this->queries += $sqlite_queries; - $this->queries = array_merge($this->queries,$additional_queries); - // add new indexes - foreach ($this->columns as $cname => $column) - if ($column->index) - $this->addIndex($cname, $column->unique); - if (empty($this->queries)) - return false; - if (is_array($this->queries) && count($this->queries) == 1) - $this->queries = $this->queries[0]; - if (!$exec) return $this->queries; - $result = ($this->suppress) - ? @$this->db->exec($this->queries) : $this->db->exec($this->queries); - $this->queries = $this->columns = $this->rebuild_cmd = array(); - return $result; - } - - /** - * rebuild a sqlite table with additional schema changes - */ - protected function _sqlite_rebuild($exec=true) - { - $new_columns = $this->columns; - $existing_columns = $this->getCols(true); - // find after sorts - $after = array(); - foreach ($new_columns as $cname => $column) - if(!empty($column->after)) - $after[$column->after][] = $cname; - // find rename commands - $rename = (!empty($this->rebuild_cmd) && array_key_exists('rename',$this->rebuild_cmd)) - ? $this->rebuild_cmd['rename'] : array(); - // get primary-key fields - foreach ($existing_columns as $key => $col) - if ($col['pkey']) - $pkeys[array_key_exists($key,$rename) ? $rename[$key] : $key] = $col; - foreach ($new_columns as $key => $col) - if ($col->pkey) - $pkeys[$key] = $col; - // indexes - $indexes = $this->listIndex(); - // drop fields - if (!empty($this->rebuild_cmd) && array_key_exists('drop', $this->rebuild_cmd)) - foreach ($this->rebuild_cmd['drop'] as $name) - if (array_key_exists($name, $existing_columns)) { - if (array_key_exists($name, $pkeys)) { - unset($pkeys[$name]); - // drop composite key - if(count($pkeys) == 1) { - $incrementTrigger = $this->db->quotekey($this->name.'_insert'); - $this->queries[] = 'DROP TRIGGER IF EXISTS '.$incrementTrigger; - } - } - unset($existing_columns[$name]); - // drop index - foreach (array_keys($indexes) as $col) { - // new index names - if ($col == $this->name.'___'.$name) - unset($indexes[$this->name.'___'.$name]); - // check if column is part of an existing combined index - if (is_int(strpos($col, '__'))) { - if (is_int(strpos($col, '___'))) { - $col = explode('___', $col); - $ci = explode('__', $col[1]); - $col = implode('___',$col); - // drop combined index - if (in_array($name, $ci)) - unset($indexes[$col]); - } - } - } - } - // create new table - $oname = $this->name; - $this->queries[] = $this->rename($oname.'_temp', false); - $newTable = $this->schema->createTable($oname); - // add existing fields - foreach ($existing_columns as $name => $col) { - $colName = array_key_exists($name, $rename) ? $rename[$name] : $name; - // update column datatype - if (array_key_exists('update',$this->rebuild_cmd) - && in_array($name,array_keys($this->rebuild_cmd['update']))) { - $cdat = $this->rebuild_cmd['update'][$name]; - if ($cdat instanceof Column) - $col = $cdat->getColumnArray(); - else - $col['type'] = $cdat; - } - $newTable->addColumn($colName, $col)->passThrough(); - // add new fields with after flag - if (array_key_exists($name,$after)) - foreach (array_reverse($after[$name]) as $acol) { - $newTable->addColumn($new_columns[$acol]); - unset($new_columns[$acol]); - } - } - // add remaining new fields - foreach ($new_columns as $ncol) - $newTable->addColumn($ncol); - $newTable->primary(array_keys($pkeys)); - // add existing indexes - foreach (array_reverse($indexes) as $name=>$conf) { - if (is_int(strpos($name, '___'))) - list($tname,$name) = explode('___', $name); - if (is_int(strpos($name, '__'))) - $name = explode('__', $name); - if ($exec) { - $t = $this->schema->alterTable($oname); - $t->dropIndex($name); - $t->build(); - } - $newTable->addIndex($name,$conf['unique']); - } - // build new table - $newTableQueries = $newTable->build(false); - $this->queries = array_merge($this->queries,$newTableQueries); - // copy data - if (!empty($existing_columns)) { - foreach (array_keys($existing_columns) as $name) { - $fields_from[] = $this->db->quotekey($name); - $toName = array_key_exists($name, $rename) ? $rename[$name] : $name; - $fields_to[] = $this->db->quotekey($toName); - } - $this->queries[] = - 'INSERT INTO '.$this->db->quotekey($newTable->name).' ('.implode(', ', $fields_to).') '. - 'SELECT '.implode(', ', $fields_from).' FROM '.$this->db->quotekey($this->name).';'; - } - $this->queries[] = $this->drop(false); - $this->name = $oname; - } - - /** - * create an insert trigger to work-a-round auto-incrementation in composite primary keys - * @param $pkey - * @return array - */ - public function _sqlite_increment_trigger($pkey) { - $table = $this->db->quotekey($this->name); - $pkey = $this->db->quotekey($pkey); - $triggerName = $this->db->quotekey($this->name.'_insert'); - $queries[] = "DROP TRIGGER IF EXISTS $triggerName;"; - $queries[] = 'CREATE TRIGGER '.$triggerName.' AFTER INSERT ON '.$table. - ' WHEN (NEW.'.$pkey.' IS NULL) BEGIN'. - ' UPDATE '.$table.' SET '.$pkey.' = ('. - ' select coalesce( max( '.$pkey.' ), 0 ) + 1 from '.$table. - ') WHERE ROWID = NEW.ROWID;'. - ' END;'; - return $queries; - } - - /** - * get columns of a table - * @param bool $types - * @return array - */ - public function getCols($types = false) - { - $schema = $this->db->schema($this->name, null, 0); - if (!$types) - return array_keys($schema); - else - foreach ($schema as $name => &$cols) { - $default = ($cols['default'] === '') ? null : $cols['default']; - if (!is_null($default) && ((is_int(strpos($curdef=strtolower( - $this->findQuery($this->schema->defaultTypes['CUR_STAMP'])), - strtolower($default))) || is_int(strpos(strtolower($default),$curdef))) - || $default == "('now'::text)::timestamp(0) without time zone")) - { - $default = 'CUR_STAMP'; - } elseif (!is_null($default)) { - // remove single-qoutes - if (preg_match('/sqlite2?/', $this->db->driver())) - $default=preg_replace('/^\s*([\'"])(.*)\1\s*$/','\2',$default); - elseif (preg_match('/mssql|sybase|dblib|odbc|sqlsrv/', $this->db->driver())) - $default=preg_replace('/^\s*(\(\')(.*)(\'\))\s*$/','\2',$default); - // extract value from character_data in postgre - elseif (preg_match('/pgsql/', $this->db->driver())) - if (is_int(strpos($default, 'nextval'))) - $default = null; // drop autoincrement default - elseif (preg_match("/^\'*(.*)\'*::(\s*\w)+/", $default, $match)) - $default = $match[1]; - } else - $default=false; - $cols['default'] = $default; - } - return $schema; - } - - /** - * check if a data type is compatible with an existing column type - * @param string $colType (i.e: BOOLEAN) - * @param string $column (i.e: active) - * @return bool - */ - public function isCompatible($colType,$column) { - $cols = $this->getCols(true); - return $this->schema->isCompatible($colType,$cols[$column]['type']); - } - - /** - * removes a column from a table - * @param string $name - * @return bool - */ - public function dropColumn($name) - { - $colTypes = $this->getCols(true); - // check if column exists - if (!in_array($name, array_keys($colTypes))) return true; - if (preg_match('/sqlite2?/', $this->db->driver())) { - // SQlite does not support drop column directly - $this->rebuild_cmd['drop'][] = $name; - } else { - $quotedTable = $this->db->quotekey($this->name); - $quotedColumn = $this->db->quotekey($name); - $cmd = array( - 'mysql' => - "ALTER TABLE $quotedTable DROP $quotedColumn;", - 'pgsql|odbc|ibm|mssql|sybase|dblib|sqlsrv' => - "ALTER TABLE $quotedTable DROP COLUMN $quotedColumn;", - ); - if (preg_match('/mssql|sybase|dblib|sqlsrv/', $this->db->driver())) - $this->suppress=true; - $this->queries[] = $this->findQuery($cmd); - } - } - - /** - * rename a column - * @param $name - * @param $new_name - * @return void - */ - public function renameColumn($name, $new_name) - { - $existing_columns = $this->getCols(true); - // check if column is already existing - if (!in_array($name, array_keys($existing_columns))) - trigger_error('cannot rename column. it does not exist.',E_USER_ERROR); - if (in_array($new_name, array_keys($existing_columns))) - trigger_error('cannot rename column. new column already exist.',E_USER_ERROR); - - if (preg_match('/sqlite2?/', $this->db->driver())) - // SQlite does not support drop or rename column directly - $this->rebuild_cmd['rename'][$name] = $new_name; - elseif (preg_match('/odbc/', $this->db->driver())) { - // no rename column for odbc, create temp column - $this->addColumn($new_name, $existing_columns[$name])->passThrough(); - $this->queries[] = "UPDATE $this->name SET $new_name = $name"; - $this->dropColumn($name); - } else { - $existing_columns = $this->getCols(true); - $quotedTable = $this->db->quotekey($this->name); - $quotedColumn = $this->db->quotekey($name); - $quotedColumnNew = $this->db->quotekey($new_name); - $cmd = array( - 'mysql' => - "ALTER TABLE $quotedTable CHANGE $quotedColumn $quotedColumnNew ".$existing_columns[$name]['type'].";", - 'pgsql|ibm' => - "ALTER TABLE $quotedTable RENAME COLUMN $quotedColumn TO $quotedColumnNew;", - 'mssql|sybase|dblib|sqlsrv' => - "sp_rename [$this->name.$name], '$new_name', 'Column'", - ); - if (preg_match('/mssql|sybase|dblib|sqlsrv/', $this->db->driver())) - $this->suppress = true; - $this->queries[] = $this->findQuery($cmd); - } - } - - /** - * modifies column datatype - * @param string $name - * @param string|Column $datatype - * @param bool $force - */ - public function updateColumn($name, $datatype, $force = false) - { - if ($datatype instanceof Column) { - $col = $datatype; - $datatype = $col->type; - $force = $col->passThrough; - } - if(!$force) - $datatype = $this->findQuery($this->schema->dataTypes[strtoupper($datatype)]); - $table = $this->db->quotekey($this->name); - $column = $this->db->quotekey($name); - if (preg_match('/sqlite2?/', $this->db->driver())){ - $this->rebuild_cmd['update'][$name] = isset($col)?$col:$datatype; - } else { - $dat = isset($col) ? $col->getColumnQuery() : - $column.' '.$datatype; - $cmd = array( - 'mysql' => - "ALTER TABLE $table MODIFY COLUMN $dat;", - 'pgsql' => - "ALTER TABLE $table ALTER COLUMN $column TYPE $datatype;", - 'sqlsrv|mssql|sybase|dblib|ibm' => - "ALTER TABLE $table ALTER COLUMN $column $datatype;", - ); - if (isset($col)) { - $cmd['pgsql'] = array($cmd['pgsql']); - $cmd['pgsql'][] = "ALTER TABLE $table ALTER COLUMN $column SET DEFAULT ".$col->getDefault().";"; - if ($col->nullable) - $cmd['pgsql'][] = "ALTER TABLE $table ALTER COLUMN $column DROP NOT NULL;"; - else - $cmd['pgsql'][] = "ALTER TABLE $table ALTER COLUMN $column SET NOT NULL;"; - $df_key = 'DF_'.$this->name.'_'.$name; - $cmd['sqlsrv|mssql|sybase|dblib|ibm'] = array( - "ALTER TABLE $table ALTER COLUMN $column $datatype ".$col->getNullable().";", - "DECLARE @ConstraintName nvarchar(200) - SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS WHERE PARENT_OBJECT_ID = OBJECT_ID('$this->name') - AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns WHERE NAME = N'$name' - AND object_id = OBJECT_ID(N'$this->name')) - IF @ConstraintName IS NOT NULL - EXEC('ALTER TABLE $this->name DROP CONSTRAINT ' + @ConstraintName) - ", - "ALTER TABLE $table ADD CONSTRAINT $df_key DEFAULT ".$col->getDefault()." FOR $column;", - ); - } - $this->queries[] = $this->findQuery($cmd); - } - } - - /** - * create index on one or more columns - * @param string|array $columns Column(s) to be indexed - * @param bool $unique Unique index - * @param int $length index length for text fields in mysql - */ - public function addIndex($columns, $unique = FALSE, $length = 20) - { - if (!is_array($columns)) - $columns = array($columns); - $existingCol = $this->columns; - foreach ($existingCol as &$col) - $col = $col->getColumnArray(); - $allCols = array_merge($this->getCols(true), $existingCol); - parent::_addIndex($columns, $allCols, $unique, $length); - } - - /** - * drop a column index - * @param string|array $name - */ - public function dropIndex($name) - { - if (is_array($name)) - $name = $this->name.'___'.implode('__', $name); - elseif(!is_int(strpos($name,'___'))) - $name = $this->name.'___'.$name; - $name = $this->db->quotekey($name); - $table = $this->db->quotekey($this->name); - $cmd = array( - 'pgsql|sqlite2?|ibm' => - "DROP INDEX $name;", - 'mssql|sybase|dblib|odbc|sqlsrv' => - "DROP INDEX $table.$name;", - 'mysql'=> - "ALTER TABLE $table DROP INDEX $name;", - ); - $query = $this->findQuery($cmd); - $this->queries[] = $query; - } - - /** - * returns table indexes as assoc array - * @return array - */ - public function listIndex() - { - $table = $this->db->quotekey($this->name); - $cmd = array( - 'sqlite2?' => - "PRAGMA index_list($table);", - 'mysql' => - "SHOW INDEX FROM $table;", - 'mssql|sybase|dblib|sqlsrv' => - "select * from sys.indexes ". - "where object_id = (select object_id from sys.objects where name = '$this->name')", - 'pgsql' => - "select i.relname as name, ix.indisunique as unique ". - "from pg_class t, pg_class i, pg_index ix ". - "where t.oid = ix.indrelid and i.oid = ix.indexrelid ". - "and t.relkind = 'r' and t.relname = '$this->name'". - "group by t.relname, i.relname, ix.indisunique;", - ); - $result = $this->db->exec($this->findQuery($cmd)); - $indexes = array(); - if (preg_match('/pgsql|sqlite2?/', $this->db->driver())) { - foreach($result as $row) - $indexes[$row['name']] = array('unique' => $row['unique']); - } elseif (preg_match('/mssql|sybase|dblib|sqlsrv/', $this->db->driver())) { - foreach ($result as $row) - $indexes[$row['name']] = array('unique' => $row['is_unique']); - } elseif (preg_match('/mysql/', $this->db->driver())) { - foreach($result as $row) - $indexes[$row['Key_name']] = array('unique' => !(bool)$row['Non_unique']); - } else - trigger_error(sprintf(self::TEXT_ENGINE_NOT_SUPPORTED, $this->db->driver()),E_USER_ERROR); - return $indexes; - } - - /** - * rename this table - * @param string $new_name - * @param bool $exec - * @return $this|bool - */ - public function rename($new_name, $exec = true) { - $query = $this->schema->renameTable($this->name, $new_name, $exec); - $this->name = $new_name; - return ($exec) ? $this : $query; - } - - /** - * drop this table - * @param bool $exec - * @return mixed - */ - public function drop($exec = true) { - return $this->schema->dropTable($this,$exec); - } - -} - -/** - * defines a table column configuration - * Class Column - * @package DB\SQL - */ -class Column { - - use DB_Utils; - - public $name, $type, $nullable, $default, $after, $index, $unique, $passThrough, $pkey; - protected $table, $schema, $type_val; - - const - TEXT_NoDataType = 'The specified datatype %s is not defined in %s driver. Add passThrough option to enforce this datatype.', - TEXT_CurrentStampDataType = 'Current timestamp as column default is only possible for TIMESTAMP datatype'; - - /** - * @param string $name - * @param TableBuilder $table - */ - public function __construct($name, TableBuilder $table) { - $this->name = $name; - $this->nullable = true; - $this->default = false; - $this->after = false; - $this->index = false; - $this->unique = false; - $this->passThrough = false; - $this->pkey = false; - - $this->table = $table; - $this->schema = $table->schema; - $this->db = $this->schema->db; - } - - /** - * @param string $datatype - * @param bool $force don't match datatype against DT array - * @return $this - */ - public function type($datatype, $force = FALSE) { - $this->type = $datatype; - $this->passThrough = $force; - return $this; - } - - public function type_tinyint() { - $this->type = Schema::DT_INT1; - return $this; - } - - public function type_smallint() { - $this->type = Schema::DT_INT2; - return $this; - } - - public function type_int() { - $this->type = Schema::DT_INT4; - return $this; - } - - public function type_bigint() { - $this->type = Schema::DT_INT8; - return $this; - } - - public function type_float() { - $this->type = Schema::DT_FLOAT; - return $this; - } - - public function type_decimal() { - $this->type = Schema::DT_DOUBLE; - return $this; - } - - public function type_text() { - $this->type = Schema::DT_TEXT; - return $this; - } - - public function type_longtext() { - $this->type = Schema::DT_LONGTEXT; - return $this; - } - - public function type_varchar($length = 255) { - $this->type = "varchar($length)"; - $this->passThrough = true; - return $this; - } - - public function type_date() { - $this->type = Schema::DT_DATE; - return $this; - } - - public function type_datetime() { - $this->type = Schema::DT_DATETIME; - return $this; - } - - public function type_timestamp($asDefault=false) { - $this->type = Schema::DT_TIMESTAMP; - if ($asDefault) - $this->default = Schema::DF_CURRENT_TIMESTAMP; - return $this; - } - - public function type_blob() { - $this->type = Schema::DT_BLOB; - return $this; - } - - public function type_bool() { - $this->type = Schema::DT_BOOLEAN; - return $this; - } - - public function passThrough($state = TRUE) { - $this->passThrough = $state; - return $this; - } - - public function nullable($nullable) { - $this->nullable = $nullable; - return $this; - } - - public function defaults($default) { - $this->default = $default; - return $this; - } - - public function after($name) { - $this->after = $name; - return $this; - } - - public function index($unique = FALSE) { - $this->index = true; - $this->unique = $unique; - return $this; - } - - /** - * feed column from array or hive key - * @param string|array $args - */ - public function copyfrom($args) { - if (($args || \Base::instance()->exists($args,$args)) - && is_array($args)) - foreach ($args as $arg => $val) - $this->{$arg} = $val; - } - - /** - * returns an array of this column configuration - * @return array - */ - public function getColumnArray() { - $fields = array('name','type','passThrough','default','nullable', - 'index','unique','after','pkey'); - $fields = array_flip($fields); - foreach($fields as $key => &$val) - $val = $this->{$key}; - unset($val); - return $fields; - } - - /** - * return resolved column datatype - * @return bool|string - */ - public function getTypeVal() { - if (!$this->type) - trigger_error(sprintf('Cannot build a column query for `%s`: no column type set',$this->name),E_USER_ERROR); - if ($this->passThrough) - $this->type_val = $this->type; - else { - $this->type_val = $this->findQuery($this->schema->dataTypes[strtoupper($this->type)]); - if (!$this->type_val) { - if (Schema::$strict) { - trigger_error(sprintf(self::TEXT_NoDataType, strtoupper($this->type), - $this->db->driver()),E_USER_ERROR); - return FALSE; - } else { - // auto pass-through if not found - $this->type_val = $this->type; - } - } - } - return $this->type_val; - } - - /** - * generate SQL column definition query - * @return bool|string - */ - public function getColumnQuery() { - // prepare column types - $type_val = $this->getTypeVal(); - // build query - $query = $this->db->quotekey($this->name).' '.$type_val.' '. - $this->getNullable(); - // unify default for booleans - if (preg_match('/bool/i', $type_val) && $this->default!==null) - $this->default = (int) $this->default; - // default value - if ($this->default !== false) { - $def_cmds = array( - 'sqlite2?|mysql|pgsql' => 'DEFAULT', - 'mssql|sybase|dblib|odbc|sqlsrv' => 'constraint DF_'.$this->table->name.'_'.$this->name.' DEFAULT', - 'ibm' => 'WITH DEFAULT', - ); - $def_cmd = $this->findQuery($def_cmds).' '.$this->getDefault(); - $query .= ' '.$def_cmd; - } - if (!empty($this->after) && $this->table instanceof TableModifier) { - // `after` feature only works for mysql - if (preg_match('/mysql/', $this->db->driver())) { - $after_cmd = 'AFTER '.$this->db->quotekey($this->after); - $query .= ' '.$after_cmd; - } - } - return $query; - } - - /** - * return query part for nullable - * @return string - */ - public function getNullable() { - return $this->nullable ? 'NULL' : 'NOT NULL'; - } - - /** - * return query part for default value - * @return string - */ - public function getDefault() { - // timestamp default - if ($this->default === Schema::DF_CURRENT_TIMESTAMP) { - // check for right datatpye - $stamp_type = $this->findQuery($this->schema->dataTypes['TIMESTAMP']); - if ($this->type != 'TIMESTAMP' && - ($this->passThrough && strtoupper($this->type) != strtoupper($stamp_type)) - ) - trigger_error(self::TEXT_CurrentStampDataType,E_USER_ERROR); - return $this->findQuery($this->schema->defaultTypes[strtoupper($this->default)]); - } else { - // static defaults - $type_val = $this->getTypeVal(); - $pdo_type = preg_match('/int|bool/i', $type_val, $parts) ? - constant('\PDO::PARAM_'.strtoupper($parts[0])) : \PDO::PARAM_STR; - return ($this->default === NULL ? 'NULL' : - $this->db->quote(htmlspecialchars($this->default, ENT_QUOTES, - \Base::instance()->get('ENCODING')), $pdo_type)); - } - } -} - - -trait DB_Utils { - - /** @var \DB\SQL */ - public $db; - - /** - * parse command array and return backend specific query - * @param $cmd - * @param $cmd array - * @return bool|string - */ - public function findQuery($cmd) { - foreach ($cmd as $backend => $val) - if (preg_match('/'.$backend.'/', $this->db->driver())) - return $val; - trigger_error(sprintf('DB Engine `%s` is not supported for this action.', $this->db->driver()),E_USER_ERROR); - } -} \ No newline at end of file diff --git a/app/lib/db/sql/session.php b/app/lib/db/sql/session.php deleted file mode 100644 index efabd600..00000000 --- a/app/lib/db/sql/session.php +++ /dev/null @@ -1,221 +0,0 @@ -. - -*/ - -namespace DB\SQL; - -//! SQL-managed session handler -class Session extends Mapper { - - protected - //! Session ID - $sid, - //! Anti-CSRF token - $_csrf, - //! User agent - $_agent, - //! IP, - $_ip, - //! Suspect callback - $onsuspect; - - /** - * Open session - * @return TRUE - * @param $path string - * @param $name string - **/ - function open($path,$name) { - return TRUE; - } - - /** - * Close session - * @return TRUE - **/ - function close() { - $this->reset(); - $this->sid=NULL; - return TRUE; - } - - /** - * Return session data in serialized format - * @return string - * @param $id string - **/ - function read($id) { - $this->load(['session_id=?',$this->sid=$id]); - if ($this->dry()) - return ''; - if ($this->get('ip')!=$this->_ip || $this->get('agent')!=$this->_agent) { - $fw=\Base::instance(); - if (!isset($this->onsuspect) || - $fw->call($this->onsuspect,[$this,$id])===FALSE) { - //NB: `session_destroy` can't be called at that stage (`session_start` not completed) - $this->destroy($id); - $this->close(); - unset($fw->{'COOKIE.'.session_name()}); - $fw->error(403); - } - } - return $this->get('data'); - } - - /** - * Write session data - * @return TRUE - * @param $id string - * @param $data string - **/ - function write($id,$data) { - $this->set('session_id',$id); - $this->set('data',$data); - $this->set('ip',$this->_ip); - $this->set('agent',$this->_agent); - $this->set('stamp',time()); - $this->save(); - return TRUE; - } - - /** - * Destroy session - * @return TRUE - * @param $id string - **/ - function destroy($id) { - $this->erase(['session_id=?',$id]); - return TRUE; - } - - /** - * Garbage collector - * @return TRUE - * @param $max int - **/ - function cleanup($max) { - $this->erase(['stamp+?sid; - } - - /** - * Return anti-CSRF token - * @return string - **/ - function csrf() { - return $this->_csrf; - } - - /** - * Return IP address - * @return string - **/ - function ip() { - return $this->_ip; - } - - /** - * Return Unix timestamp - * @return string|FALSE - **/ - function stamp() { - if (!$this->sid) - session_start(); - return $this->dry()?FALSE:$this->get('stamp'); - } - - /** - * Return HTTP user agent - * @return string - **/ - function agent() { - return $this->_agent; - } - - /** - * Instantiate class - * @param $db \DB\SQL - * @param $table string - * @param $force bool - * @param $onsuspect callback - * @param $key string - **/ - function __construct(\DB\SQL $db,$table='sessions',$force=TRUE,$onsuspect=NULL,$key=NULL) { - if ($force) { - $eol="\n"; - $tab="\t"; - $sqlsrv=preg_match('/mssql|sqlsrv|sybase/',$db->driver()); - $db->exec( - ($sqlsrv? - ('IF NOT EXISTS (SELECT * FROM sysobjects WHERE '. - 'name='.$db->quote($table).' AND xtype=\'U\') '. - 'CREATE TABLE dbo.'): - ('CREATE TABLE IF NOT EXISTS '. - ((($name=$db->name())&&$db->driver()!='pgsql')? - ($db->quotekey($name,FALSE).'.'):''))). - $db->quotekey($table,FALSE).' ('.$eol. - ($sqlsrv?$tab.$db->quotekey('id').' INT IDENTITY,'.$eol:''). - $tab.$db->quotekey('session_id').' VARCHAR(255),'.$eol. - $tab.$db->quotekey('data').' TEXT,'.$eol. - $tab.$db->quotekey('ip').' VARCHAR(45),'.$eol. - $tab.$db->quotekey('agent').' VARCHAR(300),'.$eol. - $tab.$db->quotekey('stamp').' INTEGER,'.$eol. - $tab.'PRIMARY KEY ('.$db->quotekey($sqlsrv?'id':'session_id').')'.$eol. - ($sqlsrv?',CONSTRAINT [UK_session_id] UNIQUE(session_id)':''). - ');' - ); - } - parent::__construct($db,$table); - $this->onsuspect=$onsuspect; - session_set_save_handler( - [$this,'open'], - [$this,'close'], - [$this,'read'], - [$this,'write'], - [$this,'destroy'], - [$this,'cleanup'] - ); - register_shutdown_function('session_commit'); - $fw=\Base::instance(); - $headers=$fw->HEADERS; - $this->_csrf=$fw->hash($fw->SEED. - extension_loaded('openssl')? - implode(unpack('L',openssl_random_pseudo_bytes(4))): - mt_rand() - ); - if ($key) - $fw->$key=$this->_csrf; - $this->_agent=isset($headers['User-Agent'])?$headers['User-Agent']:''; - if (strlen($this->_agent) > 300) { - $this->_agent = substr($this->_agent, 0, 300); - } - $this->_ip=$fw->IP; - } - -} diff --git a/app/lib/f3.php b/app/lib/f3.php deleted file mode 100644 index 3b96a63c..00000000 --- a/app/lib/f3.php +++ /dev/null @@ -1,42 +0,0 @@ -. - -*/ - -//! Legacy mode enabler -class F3 { - - static - //! Framework instance - $fw; - - /** - * Forward function calls to framework - * @return mixed - * @param $func callback - * @param $args array - **/ - static function __callstatic($func,array $args) { - if (!self::$fw) - self::$fw=Base::instance(); - return call_user_func_array([self::$fw,$func],$args); - } - -} diff --git a/app/lib/image.php b/app/lib/image.php deleted file mode 100644 index 3efc0cca..00000000 --- a/app/lib/image.php +++ /dev/null @@ -1,616 +0,0 @@ -. - -*/ - -//! Image manipulation tools -class Image { - - //@{ Messages - const - E_Color='Invalid color specified: %s', - E_File='File not found', - E_Font='CAPTCHA font not found', - E_TTF='No TrueType support in GD module', - E_Length='Invalid CAPTCHA length: %s'; - //@} - - //@{ Positional cues - const - POS_Left=1, - POS_Center=2, - POS_Right=4, - POS_Top=8, - POS_Middle=16, - POS_Bottom=32; - //@} - - protected - //! Source filename - $file, - //! Image resource - $data, - //! Enable/disable history - $flag=FALSE, - //! Filter count - $count=0; - - /** - * Convert RGB hex triad to array - * @return array|FALSE - * @param $color int|string - **/ - function rgb($color) { - if (is_string($color)) - $color=hexdec($color); - $hex=str_pad($hex=dechex($color),$color<4096?3:6,'0',STR_PAD_LEFT); - if (($len=strlen($hex))>6) - user_error(sprintf(self::E_Color,'0x'.$hex),E_USER_ERROR); - $color=str_split($hex,$len/3); - foreach ($color as &$hue) { - $hue=hexdec(str_repeat($hue,6/$len)); - unset($hue); - } - return $color; - } - - /** - * Invert image - * @return object - **/ - function invert() { - imagefilter($this->data,IMG_FILTER_NEGATE); - return $this->save(); - } - - /** - * Adjust brightness (range:-255 to 255) - * @return object - * @param $level int - **/ - function brightness($level) { - imagefilter($this->data,IMG_FILTER_BRIGHTNESS,$level); - return $this->save(); - } - - /** - * Adjust contrast (range:-100 to 100) - * @return object - * @param $level int - **/ - function contrast($level) { - imagefilter($this->data,IMG_FILTER_CONTRAST,$level); - return $this->save(); - } - - /** - * Convert to grayscale - * @return object - **/ - function grayscale() { - imagefilter($this->data,IMG_FILTER_GRAYSCALE); - return $this->save(); - } - - /** - * Adjust smoothness - * @return object - * @param $level int - **/ - function smooth($level) { - imagefilter($this->data,IMG_FILTER_SMOOTH,$level); - return $this->save(); - } - - /** - * Emboss the image - * @return object - **/ - function emboss() { - imagefilter($this->data,IMG_FILTER_EMBOSS); - return $this->save(); - } - - /** - * Apply sepia effect - * @return object - **/ - function sepia() { - imagefilter($this->data,IMG_FILTER_GRAYSCALE); - imagefilter($this->data,IMG_FILTER_COLORIZE,90,60,45); - return $this->save(); - } - - /** - * Pixelate the image - * @return object - * @param $size int - **/ - function pixelate($size) { - imagefilter($this->data,IMG_FILTER_PIXELATE,$size,TRUE); - return $this->save(); - } - - /** - * Blur the image using Gaussian filter - * @return object - * @param $selective bool - **/ - function blur($selective=FALSE) { - imagefilter($this->data, - $selective?IMG_FILTER_SELECTIVE_BLUR:IMG_FILTER_GAUSSIAN_BLUR); - return $this->save(); - } - - /** - * Apply sketch effect - * @return object - **/ - function sketch() { - imagefilter($this->data,IMG_FILTER_MEAN_REMOVAL); - return $this->save(); - } - - /** - * Flip on horizontal axis - * @return object - **/ - function hflip() { - $tmp=imagecreatetruecolor( - $width=$this->width(),$height=$this->height()); - imagesavealpha($tmp,TRUE); - imagefill($tmp,0,0,IMG_COLOR_TRANSPARENT); - imagecopyresampled($tmp,$this->data, - 0,0,$width-1,0,$width,$height,-$width,$height); - imagedestroy($this->data); - $this->data=$tmp; - return $this->save(); - } - - /** - * Flip on vertical axis - * @return object - **/ - function vflip() { - $tmp=imagecreatetruecolor( - $width=$this->width(),$height=$this->height()); - imagesavealpha($tmp,TRUE); - imagefill($tmp,0,0,IMG_COLOR_TRANSPARENT); - imagecopyresampled($tmp,$this->data, - 0,0,0,$height-1,$width,$height,$width,-$height); - imagedestroy($this->data); - $this->data=$tmp; - return $this->save(); - } - - /** - * Crop the image - * @return object - * @param $x1 int - * @param $y1 int - * @param $x2 int - * @param $y2 int - **/ - function crop($x1,$y1,$x2,$y2) { - $tmp=imagecreatetruecolor($width=$x2-$x1+1,$height=$y2-$y1+1); - imagesavealpha($tmp,TRUE); - imagefill($tmp,0,0,IMG_COLOR_TRANSPARENT); - imagecopyresampled($tmp,$this->data, - 0,0,$x1,$y1,$width,$height,$width,$height); - imagedestroy($this->data); - $this->data=$tmp; - return $this->save(); - } - - /** - * Resize image (Maintain aspect ratio); Crop relative to center - * if flag is enabled; Enlargement allowed if flag is enabled - * @return object - * @param $width int - * @param $height int - * @param $crop bool - * @param $enlarge bool - **/ - function resize($width=NULL,$height=NULL,$crop=TRUE,$enlarge=TRUE) { - if (is_null($width) && is_null($height)) - return $this; - $origw=$this->width(); - $origh=$this->height(); - if (is_null($width)) - $width=round(($height/$origh)*$origw); - if (is_null($height)) - $height=round(($width/$origw)*$origh); - // Adjust dimensions; retain aspect ratio - $ratio=$origw/$origh; - if (!$crop) { - if ($width/$ratio<=$height) - $height=round($width/$ratio); - else - $width=round($height*$ratio); - } - if (!$enlarge) { - $width=min($origw,$width); - $height=min($origh,$height); - } - // Create blank image - $tmp=imagecreatetruecolor($width,$height); - imagesavealpha($tmp,TRUE); - imagefill($tmp,0,0,IMG_COLOR_TRANSPARENT); - // Resize - if ($crop) { - if ($width/$ratio<=$height) { - $cropw=round($origh*$width/$height); - imagecopyresampled($tmp,$this->data, - 0,0,($origw-$cropw)/2,0,$width,$height,$cropw,$origh); - } - else { - $croph=round($origw*$height/$width); - imagecopyresampled($tmp,$this->data, - 0,0,0,($origh-$croph)/2,$width,$height,$origw,$croph); - } - } - else - imagecopyresampled($tmp,$this->data, - 0,0,0,0,$width,$height,$origw,$origh); - imagedestroy($this->data); - $this->data=$tmp; - return $this->save(); - } - - /** - * Rotate image - * @return object - * @param $angle int - **/ - function rotate($angle) { - $this->data=imagerotate($this->data,$angle, - imagecolorallocatealpha($this->data,0,0,0,127)); - imagesavealpha($this->data,TRUE); - return $this->save(); - } - - /** - * Apply an image overlay - * @return object - * @param $img object - * @param $align int|array - * @param $alpha int - **/ - function overlay(Image $img,$align=NULL,$alpha=100) { - if (is_null($align)) - $align=self::POS_Right|self::POS_Bottom; - if (is_array($align)) { - list($posx,$posy)=$align; - $align = 0; - } - $ovr=imagecreatefromstring($img->dump()); - imagesavealpha($ovr,TRUE); - $imgw=$this->width(); - $imgh=$this->height(); - $ovrw=imagesx($ovr); - $ovrh=imagesy($ovr); - if ($align & self::POS_Left) - $posx=0; - if ($align & self::POS_Center) - $posx=($imgw-$ovrw)/2; - if ($align & self::POS_Right) - $posx=$imgw-$ovrw; - if ($align & self::POS_Top) - $posy=0; - if ($align & self::POS_Middle) - $posy=($imgh-$ovrh)/2; - if ($align & self::POS_Bottom) - $posy=$imgh-$ovrh; - if (empty($posx)) - $posx=0; - if (empty($posy)) - $posy=0; - if ($alpha==100) - imagecopy($this->data,$ovr,$posx,$posy,0,0,$ovrw,$ovrh); - else { - $cut=imagecreatetruecolor($ovrw,$ovrh); - imagecopy($cut,$this->data,0,0,$posx,$posy,$ovrw,$ovrh); - imagecopy($cut,$ovr,0,0,0,0,$ovrw,$ovrh); - imagecopymerge($this->data, - $cut,$posx,$posy,0,0,$ovrw,$ovrh,$alpha); - } - return $this->save(); - } - - /** - * Generate identicon - * @return object - * @param $str string - * @param $size int - * @param $blocks int - **/ - function identicon($str,$size=64,$blocks=4) { - $sprites=[ - [.5,1,1,0,1,1], - [.5,0,1,0,.5,1,0,1], - [.5,0,1,0,1,1,.5,1,1,.5], - [0,.5,.5,0,1,.5,.5,1,.5,.5], - [0,.5,1,0,1,1,0,1,1,.5], - [1,0,1,1,.5,1,1,.5,.5,.5], - [0,0,1,0,1,.5,0,0,.5,1,0,1], - [0,0,.5,0,1,.5,.5,1,0,1,.5,.5], - [.5,0,.5,.5,1,.5,1,1,.5,1,.5,.5,0,.5], - [0,0,1,0,.5,.5,1,.5,.5,1,.5,.5,0,1], - [0,.5,.5,1,1,.5,.5,0,1,0,1,1,0,1], - [.5,0,1,0,1,1,.5,1,1,.75,.5,.5,1,.25], - [0,.5,.5,0,.5,.5,1,0,1,.5,.5,1,.5,.5,0,1], - [0,0,1,0,1,1,0,1,1,.5,.5,.25,.5,.75,0,.5,.5,.25], - [0,.5,.5,.5,.5,0,1,0,.5,.5,1,.5,.5,1,.5,.5,0,1], - [0,0,1,0,.5,.5,.5,0,0,.5,1,.5,.5,1,.5,.5,0,1] - ]; - $hash=sha1($str); - $this->data=imagecreatetruecolor($size,$size); - list($r,$g,$b)=$this->rgb(hexdec(substr($hash,-3))); - $fg=imagecolorallocate($this->data,$r,$g,$b); - imagefill($this->data,0,0,IMG_COLOR_TRANSPARENT); - $ctr=count($sprites); - $dim=$blocks*floor($size/$blocks)*2/$blocks; - for ($j=0,$y=ceil($blocks/2);$j<$y;$j++) - for ($i=$j,$x=$blocks-1-$j;$i<$x;$i++) { - $sprite=imagecreatetruecolor($dim,$dim); - imagefill($sprite,0,0,IMG_COLOR_TRANSPARENT); - $block=$sprites[hexdec($hash[($j*$blocks+$i)*2])%$ctr]; - for ($k=0,$pts=count($block);$k<$pts;$k++) - $block[$k]*=$dim; - imagefilledpolygon($sprite,$block,$pts/2,$fg); - for ($k=0;$k<4;$k++) { - imagecopyresampled($this->data,$sprite, - $i*$dim/2,$j*$dim/2,0,0,$dim/2,$dim/2,$dim,$dim); - $this->data=imagerotate($this->data,90, - imagecolorallocatealpha($this->data,0,0,0,127)); - } - imagedestroy($sprite); - } - imagesavealpha($this->data,TRUE); - return $this->save(); - } - - /** - * Generate CAPTCHA image - * @return object|FALSE - * @param $font string - * @param $size int - * @param $len int - * @param $key string - * @param $path string - * @param $fg int - * @param $bg int - **/ - function captcha($font,$size=24,$len=5, - $key=NULL,$path='',$fg=0xFFFFFF,$bg=0x000000) { - if ((!$ssl=extension_loaded('openssl')) && ($len<4 || $len>13)) { - user_error(sprintf(self::E_Length,$len),E_USER_ERROR); - return FALSE; - } - if (!function_exists('imagettftext')) { - user_error(self::E_TTF,E_USER_ERROR); - return FALSE; - } - $fw=Base::instance(); - foreach ($fw->split($path?:$fw->UI.';./') as $dir) - if (is_file($path=$dir.$font)) { - $seed=strtoupper(substr( - $ssl?bin2hex(openssl_random_pseudo_bytes($len)):uniqid(), - -$len)); - $block=$size*3; - $tmp=[]; - for ($i=0,$width=0,$height=0;$i<$len;$i++) { - // Process at 2x magnification - $box=imagettfbbox($size*2,0,$path,$seed[$i]); - $w=$box[2]-$box[0]; - $h=$box[1]-$box[5]; - $char=imagecreatetruecolor($block,$block); - imagefill($char,0,0,$bg); - imagettftext($char,$size*2,0, - ($block-$w)/2,$block-($block-$h)/2, - $fg,$path,$seed[$i]); - $char=imagerotate($char,mt_rand(-30,30), - imagecolorallocatealpha($char,0,0,0,127)); - // Reduce to normal size - $tmp[$i]=imagecreatetruecolor( - ($w=imagesx($char))/2,($h=imagesy($char))/2); - imagefill($tmp[$i],0,0,IMG_COLOR_TRANSPARENT); - imagecopyresampled($tmp[$i], - $char,0,0,0,0,$w/2,$h/2,$w,$h); - imagedestroy($char); - $width+=$i+1<$len?$block/2:$w/2; - $height=max($height,$h/2); - } - $this->data=imagecreatetruecolor($width,$height); - imagefill($this->data,0,0,IMG_COLOR_TRANSPARENT); - for ($i=0;$i<$len;$i++) { - imagecopy($this->data,$tmp[$i], - $i*$block/2,($height-imagesy($tmp[$i]))/2,0,0, - imagesx($tmp[$i]),imagesy($tmp[$i])); - imagedestroy($tmp[$i]); - } - imagesavealpha($this->data,TRUE); - if ($key) - $fw->$key=$seed; - return $this->save(); - } - user_error(self::E_Font,E_USER_ERROR); - return FALSE; - } - - /** - * Return image width - * @return int - **/ - function width() { - return imagesx($this->data); - } - - /** - * Return image height - * @return int - **/ - function height() { - return imagesy($this->data); - } - - /** - * Send image to HTTP client - * @return NULL - **/ - function render() { - $args=func_get_args(); - $format=$args?array_shift($args):'png'; - if (PHP_SAPI!='cli') { - header('Content-Type: image/'.$format); - header('X-Powered-By: '.Base::instance()->PACKAGE); - } - call_user_func_array( - 'image'.$format, - array_merge([$this->data,NULL],$args) - ); - } - - /** - * Return image as a string - * @return string - **/ - function dump() { - $args=func_get_args(); - $format=$args?array_shift($args):'png'; - ob_start(); - call_user_func_array( - 'image'.$format, - array_merge([$this->data,NULL],$args) - ); - return ob_get_clean(); - } - - /** - * Return image resource - * @return resource - **/ - function data() { - return $this->data; - } - - /** - * Save current state - * @return object - **/ - function save() { - $fw=Base::instance(); - if ($this->flag) { - if (!is_dir($dir=$fw->TEMP)) - mkdir($dir,Base::MODE,TRUE); - $this->count++; - $fw->write($dir.'/'.$fw->SEED.'.'. - $fw->hash($this->file).'-'.$this->count.'.png', - $this->dump()); - } - return $this; - } - - /** - * Revert to specified state - * @return object - * @param $state int - **/ - function restore($state=1) { - $fw=Base::instance(); - if ($this->flag && is_file($file=($path=$fw->TEMP. - $fw->SEED.'.'.$fw->hash($this->file).'-').$state.'.png')) { - if (is_resource($this->data)) - imagedestroy($this->data); - $this->data=imagecreatefromstring($fw->read($file)); - imagesavealpha($this->data,TRUE); - foreach (glob($path.'*.png',GLOB_NOSORT) as $match) - if (preg_match('/-(\d+)\.png/',$match,$parts) && - $parts[1]>$state) - @unlink($match); - $this->count=$state; - } - return $this; - } - - /** - * Undo most recently applied filter - * @return object - **/ - function undo() { - if ($this->flag) { - if ($this->count) - $this->count--; - return $this->restore($this->count); - } - return $this; - } - - /** - * Load string - * @return object|FALSE - * @param $str string - **/ - function load($str) { - if (!$this->data=@imagecreatefromstring($str)) - return FALSE; - imagesavealpha($this->data,TRUE); - $this->save(); - return $this; - } - - /** - * Instantiate image - * @param $file string - * @param $flag bool - * @param $path string - **/ - function __construct($file=NULL,$flag=FALSE,$path=NULL) { - $this->flag=$flag; - if ($file) { - $fw=Base::instance(); - // Create image from file - $this->file=$file; - if (!isset($path)) - $path=$fw->UI.';./'; - foreach ($fw->split($path,FALSE) as $dir) - if (is_file($dir.$file)) - return $this->load($fw->read($dir.$file)); - user_error(self::E_File,E_USER_ERROR); - } - } - - /** - * Wrap-up - * @return NULL - **/ - function __destruct() { - if (is_resource($this->data)) { - imagedestroy($this->data); - $fw=Base::instance(); - $path=$fw->TEMP.$fw->SEED.'.'.$fw->hash($this->file); - if ($glob=@glob($path.'*.png',GLOB_NOSORT)) - foreach ($glob as $match) - if (preg_match('/-(\d+)\.png/',$match)) - @unlink($match); - } - } - -} diff --git a/app/lib/log.php b/app/lib/log.php deleted file mode 100644 index a80ea695..00000000 --- a/app/lib/log.php +++ /dev/null @@ -1,68 +0,0 @@ -. - -*/ - -//! Custom logger -class Log { - - protected - //! File name - $file; - - /** - * Write specified text to log file - * @return string - * @param $text string - * @param $format string - **/ - function write($text,$format='r') { - $fw=Base::instance(); - foreach (preg_split('/\r?\n|\r/',trim($text)) as $line) - $fw->write( - $this->file, - date($format). - (isset($_SERVER['REMOTE_ADDR'])? - (' ['.$_SERVER['REMOTE_ADDR'].']'):'').' '. - trim($line).PHP_EOL, - TRUE - ); - } - - /** - * Erase log - * @return NULL - **/ - function erase() { - @unlink($this->file); - } - - /** - * Instantiate class - * @param $file string - **/ - function __construct($file) { - $fw=Base::instance(); - if (!is_dir($dir=$fw->LOGS)) - mkdir($dir,Base::MODE,TRUE); - $this->file=$dir.$file; - } - -} diff --git a/app/lib/magic.php b/app/lib/magic.php deleted file mode 100644 index 2502bf19..00000000 --- a/app/lib/magic.php +++ /dev/null @@ -1,139 +0,0 @@ -. - -*/ - -//! PHP magic wrapper -abstract class Magic implements ArrayAccess { - - /** - * Return TRUE if key is not empty - * @return bool - * @param $key string - **/ - abstract function exists($key); - - /** - * Bind value to key - * @return mixed - * @param $key string - * @param $val mixed - **/ - abstract function set($key,$val); - - /** - * Retrieve contents of key - * @return mixed - * @param $key string - **/ - abstract function &get($key); - - /** - * Unset key - * @return NULL - * @param $key string - **/ - abstract function clear($key); - - /** - * Convenience method for checking property value - * @return mixed - * @param $key string - **/ - function offsetexists($key) { - return Base::instance()->visible($this,$key)? - isset($this->$key):$this->exists($key); - } - - /** - * Convenience method for assigning property value - * @return mixed - * @param $key string - * @param $val scalar - **/ - function offsetset($key,$val) { - return Base::instance()->visible($this,$key)? - ($this->$key=$val):$this->set($key,$val); - } - - /** - * Convenience method for retrieving property value - * @return mixed - * @param $key string - **/ - function &offsetget($key) { - if (Base::instance()->visible($this,$key)) - $val=&$this->$key; - else - $val=&$this->get($key); - return $val; - } - - /** - * Convenience method for removing property value - * @return NULL - * @param $key string - **/ - function offsetunset($key) { - if (Base::instance()->visible($this,$key)) - unset($this->$key); - else - $this->clear($key); - } - - /** - * Alias for offsetexists() - * @return mixed - * @param $key string - **/ - function __isset($key) { - return $this->offsetexists($key); - } - - /** - * Alias for offsetset() - * @return mixed - * @param $key string - * @param $val scalar - **/ - function __set($key,$val) { - return $this->offsetset($key,$val); - } - - /** - * Alias for offsetget() - * @return mixed - * @param $key string - **/ - function &__get($key) { - $val=&$this->offsetget($key); - return $val; - } - - /** - * Alias for offsetunset() - * @return NULL - * @param $key string - **/ - function __unset($key) { - $this->offsetunset($key); - } - -} diff --git a/app/lib/markdown.php b/app/lib/markdown.php deleted file mode 100644 index 9abcd183..00000000 --- a/app/lib/markdown.php +++ /dev/null @@ -1,572 +0,0 @@ -. - -*/ - -//! Markdown-to-HTML converter -class Markdown extends Prefab { - - protected - //! Parsing rules - $blocks, - //! Special characters - $special; - - /** - * Process blockquote - * @return string - * @param $str string - **/ - protected function _blockquote($str) { - $str=preg_replace('/(?<=^|\n)\h?>\h?(.*?(?:\n+|$))/','\1',$str); - return strlen($str)? - ('
'.$this->build($str).'
'."\n\n"):''; - } - - /** - * Process whitespace-prefixed code block - * @return string - * @param $str string - **/ - protected function _pre($str) { - $str=preg_replace('/(?<=^|\n)(?: {4}|\t)(.+?(?:\n+|$))/','\1', - $this->esc($str)); - return strlen($str)? - ('
'.
-				$this->esc($this->snip($str)).
-			'
'."\n\n"): - ''; - } - - /** - * Process fenced code block - * @return string - * @param $hint string - * @param $str string - **/ - protected function _fence($hint,$str) { - $str=$this->snip($str); - $fw=Base::instance(); - if ($fw->HIGHLIGHT) { - switch (strtolower($hint)) { - case 'php': - $str=$fw->highlight($str); - break; - case 'apache': - preg_match_all('/(?<=^|\n)(\h*)'. - '(?:(<\/?)(\w+)((?:\h+[^>]+)*)(>)|'. - '(?:(\w+)(\h.+?)))(\h*(?:\n+|$))/', - $str,$matches,PREG_SET_ORDER); - $out=''; - foreach ($matches as $match) - $out.=$match[1]. - ($match[3]? - (''. - $this->esc($match[2]).$match[3]. - ''. - ($match[4]? - (''. - $this->esc($match[4]). - ''): - ''). - ''. - $this->esc($match[5]). - ''): - (''. - $match[6]. - ''. - ''. - $this->esc($match[7]). - '')). - $match[8]; - $str=''.$out.''; - break; - case 'html': - preg_match_all( - '/(?:(?:<(\/?)(\w+)'. - '((?:\h+(?:\w+\h*=\h*)?".+?"|[^>]+)*|'. - '\h+.+?)(\h*\/?)>)|(.+?))/s', - $str,$matches,PREG_SET_ORDER - ); - $out=''; - foreach ($matches as $match) { - if ($match[2]) { - $out.='<'. - $match[1].$match[2].''; - if ($match[3]) { - preg_match_all( - '/(?:\h+(?:(?:(\w+)\h*=\h*)?'. - '(".+?")|(.+)))/', - $match[3],$parts,PREG_SET_ORDER - ); - foreach ($parts as $part) - $out.=' '. - (empty($part[3])? - ((empty($part[1])? - '': - (''. - $part[1].'=')). - ''. - $part[2].''): - (''. - $part[3].'')); - } - $out.=''. - $match[4].'>'; - } - else - $out.=$this->esc($match[5]); - } - $str=''.$out.''; - break; - case 'ini': - preg_match_all( - '/(?<=^|\n)(?:'. - '(;[^\n]*)|(?:<\?php.+?\?>?)|'. - '(?:\[(.+?)\])|'. - '(.+?)\h*=\h*'. - '((?:\\\\\h*\r?\n|.+?)*)'. - ')((?:\r?\n)+|$)/', - $str,$matches,PREG_SET_ORDER - ); - $out=''; - foreach ($matches as $match) { - if ($match[1]) - $out.=''.$match[1]. - ''; - elseif ($match[2]) - $out.='['.$match[2].']'. - ''; - elseif ($match[3]) - $out.=''.$match[3]. - '='. - ($match[4]? - (''. - $match[4].''):''); - else - $out.=$match[0]; - if (isset($match[5])) - $out.=$match[5]; - } - $str=''.$out.''; - break; - default: - $str=''.$this->esc($str).''; - break; - } - } - else - $str=''.$this->esc($str).''; - return '
'.$str.'
'."\n\n"; - } - - /** - * Process horizontal rule - * @return string - **/ - protected function _hr() { - return '
'."\n\n"; - } - - /** - * Process atx-style heading - * @return string - * @param $type string - * @param $str string - **/ - protected function _atx($type,$str) { - $level=strlen($type); - return ''. - $this->scan($str).''."\n\n"; - } - - /** - * Process setext-style heading - * @return string - * @param $str string - * @param $type string - **/ - protected function _setext($str,$type) { - $level=strpos('=-',$type)+1; - return ''. - $this->scan($str).''."\n\n"; - } - - /** - * Process ordered/unordered list - * @return string - * @param $str string - **/ - protected function _li($str) { - // Initialize list parser - $len=strlen($str); - $ptr=0; - $dst=''; - $first=TRUE; - $tight=TRUE; - $type='ul'; - // Main loop - while ($ptr<$len) { - if (preg_match('/^\h*[*-](?:\h?[*-]){2,}(?:\n+|$)/', - substr($str,$ptr),$match)) { - $ptr+=strlen($match[0]); - // Embedded horizontal rule - return (strlen($dst)? - ('<'.$type.'>'."\n".$dst.''."\n\n"):''). - '
'."\n\n".$this->build(substr($str,$ptr)); - } - elseif (preg_match('/(?<=^|\n)([*+-]|\d+\.)\h'. - '(.+?(?:\n+|$))((?:(?: {4}|\t)+.+?(?:\n+|$))*)/s', - substr($str,$ptr),$match)) { - $match[3]=preg_replace('/(?<=^|\n)(?: {4}|\t)/','',$match[3]); - $found=FALSE; - foreach (array_slice($this->blocks,0,-1) as $regex) - if (preg_match($regex,$match[3])) { - $found=TRUE; - break; - } - // List - if ($first) { - // First pass - if (is_numeric($match[1])) - $type='ol'; - if (preg_match('/\n{2,}$/',$match[2]. - ($found?'':$match[3]))) - // Loose structure; Use paragraphs - $tight=FALSE; - $first=FALSE; - } - // Strip leading whitespaces - $ptr+=strlen($match[0]); - $tmp=$this->snip($match[2].$match[3]); - if ($tight) { - if ($found) - $tmp=$match[2].$this->build($this->snip($match[3])); - } - else - $tmp=$this->build($tmp); - $dst.='
  • '.$this->scan(trim($tmp)).'
  • '."\n"; - } - } - return strlen($dst)? - ('<'.$type.'>'."\n".$dst.''."\n\n"):''; - } - - /** - * Ignore raw HTML - * @return string - * @param $str string - **/ - protected function _raw($str) { - return $str; - } - - /** - * Process paragraph - * @return string - * @param $str string - **/ - protected function _p($str) { - $str=trim($str); - if (strlen($str)) { - if (preg_match('/^(.+?\n)([>#].+)$/s',$str,$parts)) - return $this->_p($parts[1]).$this->build($parts[2]); - $str=preg_replace_callback( - '/([^<>\[]+)?(<[\?%].+?[\?%]>|<.+?>|\[.+?\]\s*\(.+?\))|'. - '(.+)/s', - function($expr) { - $tmp=''; - if (isset($expr[4])) - $tmp.=$this->esc($expr[4]); - else { - if (isset($expr[1])) - $tmp.=$this->esc($expr[1]); - $tmp.=$expr[2]; - if (isset($expr[3])) - $tmp.=$this->esc($expr[3]); - } - return $tmp; - }, - $str - ); - $str=preg_replace('/\s{2}\r?\n/','
    ',$str); - return '

    '.$this->scan($str).'

    '."\n\n"; - } - return ''; - } - - /** - * Process strong/em/strikethrough spans - * @return string - * @param $str string - **/ - protected function _text($str) { - $tmp=''; - while ($str!=$tmp) - $str=preg_replace_callback( - '/(?<=\s|^)(?'.$expr[2].'
    '; - case 2: - return ''.$expr[2].''; - case 3: - return ''.$expr[2].''; - } - }, - preg_replace( - '/(?\1', - $tmp=$str - ) - ); - return $str; - } - - /** - * Process image span - * @return string - * @param $str string - **/ - protected function _img($str) { - return preg_replace_callback( - '/!(?:\[(.+?)\])?\h*\(?(?:\h*"(.*?)"\h*)?\)/', - function($expr) { - return ''.$this->esc($expr[1]).''; - }, - $str - ); - } - - /** - * Process anchor span - * @return string - * @param $str string - **/ - protected function _a($str) { - return preg_replace_callback( - '/(??(?:\h*"(.*?)"\h*)?\)/', - function($expr) { - return ''.$this->scan($expr[1]).''; - }, - $str - ); - } - - /** - * Auto-convert links - * @return string - * @param $str string - **/ - protected function _auto($str) { - return preg_replace_callback( - '/`.*?<(.+?)>.*?`|<(.+?)>/', - function($expr) { - if (empty($expr[1]) && parse_url($expr[2],PHP_URL_SCHEME)) { - $expr[2]=$this->esc($expr[2]); - return ''.$expr[2].''; - } - return $expr[0]; - }, - $str - ); - } - - /** - * Process code span - * @return string - * @param $str string - **/ - protected function _code($str) { - return preg_replace_callback( - '/`` (.+?) ``|(?'. - $this->esc(empty($expr[1])?$expr[2]:$expr[1]).''; - }, - $str - ); - } - - /** - * Convert characters to HTML entities - * @return string - * @param $str string - **/ - function esc($str) { - if (!$this->special) - $this->special=[ - '...'=>'…', - '(tm)'=>'™', - '(r)'=>'®', - '(c)'=>'©' - ]; - foreach ($this->special as $key=>$val) - $str=preg_replace('/'.preg_quote($key,'/').'/i',$val,$str); - return htmlspecialchars($str,ENT_COMPAT, - Base::instance()->ENCODING,FALSE); - } - - /** - * Reduce multiple line feeds - * @return string - * @param $str string - **/ - protected function snip($str) { - return preg_replace('/(?:(?<=\n)\n+)|\n+$/',"\n",$str); - } - - /** - * Scan line for convertible spans - * @return string - * @param $str string - **/ - function scan($str) { - $inline=['img','a','text','auto','code']; - foreach ($inline as $func) - $str=$this->{'_'.$func}($str); - return $str; - } - - /** - * Assemble blocks - * @return string - * @param $str string - **/ - protected function build($str) { - if (!$this->blocks) { - // Regexes for capturing entire blocks - $this->blocks=[ - 'blockquote'=>'/^(?:\h?>\h?.*?(?:\n+|$))+/', - 'pre'=>'/^(?:(?: {4}|\t).+?(?:\n+|$))+/', - 'fence'=>'/^`{3}\h*(\w+)?.*?[^\n]*\n+(.+?)`{3}[^\n]*'. - '(?:\n+|$)/s', - 'hr'=>'/^\h*[*_-](?:\h?[\*_-]){2,}\h*(?:\n+|$)/', - 'atx'=>'/^\h*(#{1,6})\h?(.+?)\h*(?:#.*)?(?:\n+|$)/', - 'setext'=>'/^\h*(.+?)\h*\n([=-])+\h*(?:\n+|$)/', - 'li'=>'/^(?:(?:[*+-]|\d+\.)\h.+?(?:\n+|$)'. - '(?:(?: {4}|\t)+.+?(?:\n+|$))*)+/s', - 'raw'=>'/^((?:|'. - '<(address|article|aside|audio|blockquote|canvas|dd|'. - 'div|dl|fieldset|figcaption|figure|footer|form|h\d|'. - 'header|hgroup|hr|noscript|object|ol|output|p|pre|'. - 'section|table|tfoot|ul|video).*?'. - '(?:\/>|>(?:(?>[^><]+)|(?R))*<\/\2>))'. - '\h*(?:\n{2,}|\n*$)|<[\?%].+?[\?%]>\h*(?:\n?$|\n*))/s', - 'p'=>'/^(.+?(?:\n{2,}|\n*$))/s' - ]; - } - // Treat lines with nothing but whitespaces as empty lines - $str=preg_replace('/\n\h+(?=\n)/',"\n",$str); - // Initialize block parser - $len=strlen($str); - $ptr=0; - $dst=''; - // Main loop - while ($ptr<$len) { - if (preg_match('/^ {0,3}\[([^\[\]]+)\]:\s*?\s*'. - '(?:"([^\n]*)")?(?:\n+|$)/s',substr($str,$ptr),$match)) { - // Reference-style link; Backtrack - $ptr+=strlen($match[0]); - $tmp=''; - // Catch line breaks in title attribute - $ref=preg_replace('/\h/','\s',preg_quote($match[1],'/')); - while ($dst!=$tmp) { - $dst=preg_replace_callback( - '/(?esc($match[2]).'"'. - (empty($match[3])? - '': - (' title="'. - $this->esc($match[3]).'"')).'>'. - // Link - $this->scan( - empty($expr[3])? - (empty($expr[1])? - $expr[4]: - $expr[1]): - $expr[3] - ).''): - // Image - (''.
-										$this->esc($expr[3]).''); - }, - $tmp=$dst - ); - } - } - else - foreach ($this->blocks as $func=>$regex) - if (preg_match($regex,substr($str,$ptr),$match)) { - $ptr+=strlen($match[0]); - $dst.=call_user_func_array( - [$this,'_'.$func], - count($match)>1?array_slice($match,1):$match - ); - break; - } - } - return $dst; - } - - /** - * Render HTML equivalent of markdown - * @return string - * @param $txt string - **/ - function convert($txt) { - $txt=preg_replace_callback( - '/(.+?<\/code>|'. - '<[^>\n]+>|\([^\n\)]+\)|"[^"\n]+")|'. - '\\\\(.)/s', - function($expr) { - // Process escaped characters - return empty($expr[1])?$expr[2]:$expr[1]; - }, - $this->build(preg_replace('/\r\n|\r/',"\n",$txt)) - ); - return $this->snip($txt); - } - -} diff --git a/app/lib/matrix.php b/app/lib/matrix.php deleted file mode 100644 index d643f492..00000000 --- a/app/lib/matrix.php +++ /dev/null @@ -1,113 +0,0 @@ -. - -*/ - -//! Generic array utilities -class Matrix extends Prefab { - - /** - * Retrieve values from a specified column of a multi-dimensional - * array variable - * @return array - * @param $var array - * @param $col mixed - **/ - function pick(array $var,$col) { - return array_map( - function($row) use($col) { - return $row[$col]; - }, - $var - ); - } - - /** - * Rotate a two-dimensional array variable - * @return NULL - * @param $var array - **/ - function transpose(array &$var) { - $out=[]; - foreach ($var as $keyx=>$cols) - foreach ($cols as $keyy=>$valy) - $out[$keyy][$keyx]=$valy; - $var=$out; - } - - /** - * Sort a multi-dimensional array variable on a specified column - * @return bool - * @param $var array - * @param $col mixed - * @param $order int - **/ - function sort(array &$var,$col,$order=SORT_ASC) { - uasort( - $var, - function($val1,$val2) use($col,$order) { - list($v1,$v2)=[$val1[$col],$val2[$col]]; - $out=is_numeric($v1) && is_numeric($v2)? - Base::instance()->sign($v1-$v2):strcmp($v1,$v2); - if ($order==SORT_DESC) - $out=-$out; - return $out; - } - ); - $var=array_values($var); - } - - /** - * Change the key of a two-dimensional array element - * @return NULL - * @param $var array - * @param $old string - * @param $new string - **/ - function changekey(array &$var,$old,$new) { - $keys=array_keys($var); - $vals=array_values($var); - $keys[array_search($old,$keys)]=$new; - $var=array_combine($keys,$vals); - } - - /** - * Return month calendar of specified date, with optional setting for - * first day of week (0 for Sunday) - * @return array - * @param $date string|int - * @param $first int - **/ - function calendar($date='now',$first=0) { - $out=FALSE; - if (extension_loaded('calendar')) { - if (is_string($date)) - $date=strtotime($date); - $parts=getdate($date); - $days=cal_days_in_month(CAL_GREGORIAN,$parts['mon'],$parts['year']); - $ref=date('w',strtotime(date('Y-m',$parts[0]).'-01'))+(7-$first)%7; - $out=[]; - for ($i=0;$i<$days;$i++) - $out[floor(($ref+$i)/7)][($ref+$i)%7]=$i+1; - } - return $out; - } - -} diff --git a/app/lib/session.php b/app/lib/session.php deleted file mode 100644 index 5ab88948..00000000 --- a/app/lib/session.php +++ /dev/null @@ -1,196 +0,0 @@ -. - -*/ - -//! Cache-based session handler -class Session { - - protected - //! Session ID - $sid, - //! Anti-CSRF token - $_csrf, - //! User agent - $_agent, - //! IP, - $_ip, - //! Suspect callback - $onsuspect, - //! Cache instance - $_cache; - - /** - * Open session - * @return TRUE - * @param $path string - * @param $name string - **/ - function open($path,$name) { - return TRUE; - } - - /** - * Close session - * @return TRUE - **/ - function close() { - $this->sid=NULL; - return TRUE; - } - - /** - * Return session data in serialized format - * @return string - * @param $id string - **/ - function read($id) { - $this->sid=$id; - if (!$data=$this->_cache->get($id.'.@')) - return ''; - if ($data['ip']!=$this->_ip || $data['agent']!=$this->_agent) { - $fw=Base::instance(); - if (!isset($this->onsuspect) || - $fw->call($this->onsuspect,[$this,$id])===FALSE) { - //NB: `session_destroy` can't be called at that stage (`session_start` not completed) - $this->destroy($id); - $this->close(); - unset($fw->{'COOKIE.'.session_name()}); - $fw->error(403); - } - } - return $data['data']; - } - - /** - * Write session data - * @return TRUE - * @param $id string - * @param $data string - **/ - function write($id,$data) { - $fw=Base::instance(); - $jar=$fw->JAR; - $this->_cache->set($id.'.@', - [ - 'data'=>$data, - 'ip'=>$this->_ip, - 'agent'=>$this->_agent, - 'stamp'=>time() - ], - $jar['expire'] - ); - return TRUE; - } - - /** - * Destroy session - * @return TRUE - * @param $id string - **/ - function destroy($id) { - $this->_cache->clear($id.'.@'); - return TRUE; - } - - /** - * Garbage collector - * @return TRUE - * @param $max int - **/ - function cleanup($max) { - $this->_cache->reset('.@',$max); - return TRUE; - } - - /** - * Return session id (if session has started) - * @return string|NULL - **/ - function sid() { - return $this->sid; - } - - /** - * Return anti-CSRF token - * @return string - **/ - function csrf() { - return $this->_csrf; - } - - /** - * Return IP address - * @return string - **/ - function ip() { - return $this->_ip; - } - - /** - * Return Unix timestamp - * @return string|FALSE - **/ - function stamp() { - if (!$this->sid) - session_start(); - return $this->_cache->exists($this->sid.'.@',$data)? - $data['stamp']:FALSE; - } - - /** - * Return HTTP user agent - * @return string - **/ - function agent() { - return $this->_agent; - } - - /** - * Instantiate class - * @param $onsuspect callback - * @param $key string - **/ - function __construct($onsuspect=NULL,$key=NULL,$cache=null) { - $this->onsuspect=$onsuspect; - $this->_cache=$cache?:Cache::instance(); - session_set_save_handler( - [$this,'open'], - [$this,'close'], - [$this,'read'], - [$this,'write'], - [$this,'destroy'], - [$this,'cleanup'] - ); - register_shutdown_function('session_commit'); - $fw=\Base::instance(); - $headers=$fw->HEADERS; - $this->_csrf=$fw->hash($fw->SEED. - extension_loaded('openssl')? - implode(unpack('L',openssl_random_pseudo_bytes(4))): - mt_rand() - ); - if ($key) - $fw->$key=$this->_csrf; - $this->_agent=isset($headers['User-Agent'])?$headers['User-Agent']:''; - $this->_ip=$fw->IP; - } - -} diff --git a/app/lib/sheet.php b/app/lib/sheet.php deleted file mode 100644 index f9f9ec48..00000000 --- a/app/lib/sheet.php +++ /dev/null @@ -1,216 +0,0 @@ -read($filepath,true); - - if(!preg_match_all('/((?:.*?)'.$delimiter.'(?:'.$enclosure.'.*?'. - $enclosure.'|['.$delimiter.'(?:\d|\.|\/)*\d])*\n)/s',$data,$matches)) - user_error('no rows found'); - - $out = array_map(function($val) use($delimiter,$enclosure) { - return str_getcsv($val,$delimiter,$enclosure); - },$matches[0]); - return $out; - } - - /** - * use specified headers or first row as label for each row item key - * @param $rows - * @param null $headers - * @return array - */ - public function applyHeader($rows,$headers=null) { - if (!$headers) - $headers=array_shift($rows); - return array_map(function($row) use($headers) { - return array_combine(array_values($headers),array_values($row)); - },$rows); - } - - /** - * build and return xls file data - * @param $rows - * @param $headers - * @return string - */ - public function dumpXLS($rows,$headers) { - $numColumns = count($headers); - $numRows = count($rows); - foreach($headers as $key=>$val) - if (is_numeric($key)) { - $headers[$val]=ucfirst($val); - unset($headers[$key]); - } - $xls = $this->xlsBOF(); - for ($i = 0; $i <= $numRows; $i++) { - for ($c = 0; $c <= $numColumns; $c++) { - $ckey = key($headers); - $val=''; - if ($i==0) - $val = current($headers); - elseif (isset($rows[$i-1][$ckey])) - $val = trim($rows[$i-1][$ckey]); - if (is_array($val)) - $val = json_encode($val); - $xls.= (is_int($val) - || (ctype_digit($val) && ($val[0]!='0' && strlen($val)>1))) - ? $this->xlsWriteNumber($i,$c,$val) - : $this->xlsWriteString($i,$c,utf8_decode($val)); - next($headers); - } - reset($headers); - } - $xls .= $this->xlsEOF(); - return $xls; - } - - /** - * render xls file and send to HTTP client - * @param $rows - * @param $headers - * @param $filename - */ - function renderXLS($rows,$headers,$filename) { - $data = $this->dumpXLS($rows,$headers); - header("Expires: 0"); - header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); - header('Content-Type: application/xls'); - header("Content-Disposition: attachment;filename=".$filename); - header("Content-Transfer-Encoding: binary"); - echo $data; - exit(); - } - - /** - * start file - * @return string - */ - protected function xlsBOF() { - return pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); - } - - /** - * end file - * @return string - */ - protected function xlsEOF() { - return pack("ss", 0x0A, 0x00); - } - - /** - * put number - * @param $row - * @param $col - * @param $val - * @return string - */ - protected function xlsWriteNumber($row, $col, $val) { - $out = pack("sssss", 0x203, 14, $row, $col, 0x0); - $out.= pack("d", $val); - return $out; - } - - /** - * put string - * @param $row - * @param $col - * @param $val - * @return string - */ - protected function xlsWriteString($row, $col, $val ) { - $l = strlen($val); - $out = pack("ssssss", 0x204, 8+$l, $row, $col, 0x0, $l); - $out.= $val; - return $out; - } - - /** - * build and return CSV data sheet - * @param $rows - * @param $headers - * @param string $delimiter - * @param string $enclosure - * @param bool $encloseAll - * @return string - */ - public function dumpCSV($rows,$headers,$delimiter=';',$enclosure='"',$encloseAll=true) { - $numColumns = count($headers); - $numRows = count($rows); - foreach($headers as $key=>$val) - if (is_numeric($key)) { - $headers[$val]=ucfirst($val); - unset($headers[$key]); - } - $out = array(); - for ($i = 0; $i <= $numRows; $i++) { - $line = array(); - for ($c = 0; $c <= $numColumns; $c++) { - $ckey = key($headers); - $field=''; - if ($i==0) - $field = current($headers); - elseif (isset($rows[$i-1][$ckey])) - $field = trim($rows[$i-1][$ckey]); - if (is_array($field)) - $field = json_encode($field); - if (empty($field) && $field !== 0) - $line[] = ''; - elseif ($encloseAll || preg_match('/(?:'.preg_quote($delimiter, '/').'|'. - preg_quote($enclosure, '/').'|\s)/', $field)) - $line[] = $enclosure.str_replace($enclosure, $enclosure.$enclosure, $field).$enclosure; - else - $line[] = $field; - next($headers); - } - $out[] = implode($delimiter, $line); - reset($headers); - } - return implode("\n",$out); - } - - /** - * send CSV file to client - * @param $rows - * @param $headers - * @param $filename - */ - function renderCSV($rows,$headers,$filename) { - $data = $this->dumpCSV($rows,$headers); - header("Expires: 0"); - header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); - header('Content-Type: text/csv;charset=UTF-16LE'); - header("Content-Disposition: attachment;filename=".$filename); - header("Content-Transfer-Encoding: binary"); - echo "\xFF"."\xFE".mb_convert_encoding($data, 'UTF-16LE', 'UTF-8'); - exit(); - } - -} \ No newline at end of file diff --git a/app/lib/smtp.php b/app/lib/smtp.php deleted file mode 100644 index caaebd56..00000000 --- a/app/lib/smtp.php +++ /dev/null @@ -1,358 +0,0 @@ -. - -*/ - -//! SMTP plug-in -class SMTP extends Magic { - - //@{ Locale-specific error/exception messages - const - E_Header='%s: header is required', - E_Blank='Message must not be blank', - E_Attach='Attachment %s not found'; - //@} - - protected - //! Message properties - $headers, - //! E-mail attachments - $attachments, - //! SMTP host - $host, - //! SMTP port - $port, - //! TLS/SSL - $scheme, - //! User ID - $user, - //! Password - $pw, - //! TLS/SSL stream context - $context, - //! TCP/IP socket - $socket, - //! Server-client conversation - $log; - - /** - * Fix header - * @return string - * @param $key string - **/ - protected function fixheader($key) { - return str_replace(' ','-', - ucwords(preg_replace('/[_-]/',' ',strtolower($key)))); - } - - /** - * Return TRUE if header exists - * @return bool - * @param $key - **/ - function exists($key) { - $key=$this->fixheader($key); - return isset($this->headers[$key]); - } - - /** - * Bind value to e-mail header - * @return string - * @param $key string - * @param $val string - **/ - function set($key,$val) { - $key=$this->fixheader($key); - return $this->headers[$key]=$val; - } - - /** - * Return value of e-mail header - * @return string|NULL - * @param $key string - **/ - function &get($key) { - $key=$this->fixheader($key); - if (isset($this->headers[$key])) - $val=&$this->headers[$key]; - else - $val=NULL; - return $val; - } - - /** - * Remove header - * @return NULL - * @param $key string - **/ - function clear($key) { - $key=$this->fixheader($key); - unset($this->headers[$key]); - } - - /** - * Return client-server conversation history - * @return string - **/ - function log() { - return str_replace("\n",PHP_EOL,$this->log); - } - - /** - * Send SMTP command and record server response - * @return string - * @param $cmd string - * @param $log bool|string - * @param $mock bool - **/ - protected function dialog($cmd=NULL,$log=TRUE,$mock=FALSE) { - $reply=''; - if ($mock) { - $host=str_replace('ssl://','',$this->host); - switch ($cmd) { - case NULL: - $reply='220 '.$host.' ESMTP ready'."\n"; - break; - case 'DATA': - $reply='354 Go ahead'."\n"; - break; - case 'QUIT': - $reply='221 '.$host.' closing connection'."\n"; - break; - default: - $reply='250 OK'."\n"; - break; - } - } - else { - $socket=&$this->socket; - if ($cmd) - fputs($socket,$cmd."\r\n"); - while (!feof($socket) && ($info=stream_get_meta_data($socket)) && - !$info['timed_out'] && $str=fgets($socket,4096)) { - $reply.=$str; - if (preg_match('/(?:^|\n)\d{3} .+?\r\n/s',$reply)) - break; - } - } - if ($log) { - if ($cmd) - $this->log.=$cmd."\n"; - $this->log.=str_replace("\r",'',$reply); - } - return $reply; - } - - /** - * Add e-mail attachment - * @return NULL - * @param $file string - * @param $alias string - * @param $cid string - **/ - function attach($file,$alias=NULL,$cid=NULL) { - if (!is_file($file)) - user_error(sprintf(self::E_Attach,$file),E_USER_ERROR); - if ($alias) - $file=[$alias,$file]; - $this->attachments[]=['filename'=>$file,'cid'=>$cid]; - } - - /** - * Transmit message - * @return bool - * @param $message string - * @param $log bool|string - * @param $mock bool - **/ - function send($message,$log=TRUE,$mock=FALSE) { - if ($this->scheme=='ssl' && !extension_loaded('openssl')) - return FALSE; - // Message should not be blank - if (!$message) - user_error(self::E_Blank,E_USER_ERROR); - $fw=Base::instance(); - // Retrieve headers - $headers=$this->headers; - // Connect to the server - if (!$mock) { - $socket=&$this->socket; - $socket=@stream_socket_client($this->host.':'.$this->port, - $errno,$errstr,ini_get('default_socket_timeout'), - STREAM_CLIENT_CONNECT,$this->context); - if (!$socket) { - $fw->error(500,$errstr); - return FALSE; - } - stream_set_blocking($socket,TRUE); - } - // Get server's initial response - $this->dialog(NULL,$log,$mock); - // Announce presence - $reply=$this->dialog('EHLO '.$fw->HOST,$log,$mock); - if (strtolower($this->scheme)=='tls') { - $this->dialog('STARTTLS',$log,$mock); - if (!$mock) { - $method=STREAM_CRYPTO_METHOD_TLS_CLIENT; - if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) { - $method|=STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT; - $method|=STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT; - } - stream_socket_enable_crypto($socket,TRUE,$method); - } - $reply=$this->dialog('EHLO '.$fw->HOST,$log,$mock); - } - $message=wordwrap($message,998); - if (preg_match('/8BITMIME/',$reply)) - $headers['Content-Transfer-Encoding']='8bit'; - else { - $headers['Content-Transfer-Encoding']='quoted-printable'; - $message=preg_replace('/^\.(.+)/m', - '..$1',quoted_printable_encode($message)); - } - if ($this->user && $this->pw && preg_match('/AUTH/',$reply)) { - // Authenticate - $this->dialog('AUTH LOGIN',$log,$mock); - $this->dialog(base64_encode($this->user),$log,$mock); - $reply=$this->dialog(base64_encode($this->pw),$log,$mock); - if (!preg_match('/^235\s.*/',$reply)) { - $this->dialog('QUIT',$log,$mock); - if (!$mock && $socket) - fclose($socket); - return FALSE; - } - } - if (empty($headers['Message-Id'])) - $headers['Message-Id']='<'.uniqid('',TRUE).'@'.$this->host.'>'; - if (empty($headers['Date'])) - $headers['Date']=date('r'); - // Required headers - $reqd=['From','To','Subject']; - foreach ($reqd as $id) - if (empty($headers[$id])) - user_error(sprintf(self::E_Header,$id),E_USER_ERROR); - $eol="\r\n"; - // Stringify headers - foreach ($headers as $key=>&$val) { - if (in_array($key,['From','To','Cc','Bcc'])) { - $email=''; - preg_match_all('/(?:".+?" )?(?:<.+?>|[^ ,]+)/', - $val,$matches,PREG_SET_ORDER); - foreach ($matches as $raw) - $email.=($email?', ':''). - (preg_match('/<.+?>/',$raw[0])? - $raw[0]: - ('<'.$raw[0].'>')); - $val=$email; - } - unset($val); - } - // Start message dialog - $this->dialog('MAIL FROM: '.strstr($headers['From'],'<'),$log,$mock); - foreach ($fw->split($headers['To']. - (isset($headers['Cc'])?(';'.$headers['Cc']):''). - (isset($headers['Bcc'])?(';'.$headers['Bcc']):'')) as $dst) { - $this->dialog('RCPT TO: '.strstr($dst,'<'),$log,$mock); - } - $this->dialog('DATA',$log,$mock); - if ($this->attachments) { - // Replace Content-Type - $type=$headers['Content-Type']; - unset($headers['Content-Type']); - $enc=$headers['Content-Transfer-Encoding']; - unset($headers['Content-Transfer-Encoding']); - $hash=uniqid(NULL,TRUE); - // Send mail headers - $out='Content-Type: multipart/mixed; boundary="'.$hash.'"'.$eol; - foreach ($headers as $key=>$val) - if ($key!='Bcc') - $out.=$key.': '.$val.$eol; - $out.=$eol; - $out.='This is a multi-part message in MIME format'.$eol; - $out.=$eol; - $out.='--'.$hash.$eol; - $out.='Content-Type: '.$type.$eol; - $out.='Content-Transfer-Encoding: '.$enc.$eol; - $out.=$eol; - $out.=$message.$eol; - foreach ($this->attachments as $attachment) { - if (is_array($attachment['filename'])) - list($alias,$file)=$attachment['filename']; - else - $alias=basename($file=$attachment['filename']); - $out.='--'.$hash.$eol; - $out.='Content-Type: application/octet-stream'.$eol; - $out.='Content-Transfer-Encoding: base64'.$eol; - if ($attachment['cid']) - $out.='Content-Id: '.$attachment['cid'].$eol; - $out.='Content-Disposition: attachment; '. - 'filename="'.$alias.'"'.$eol; - $out.=$eol; - $out.=chunk_split(base64_encode( - file_get_contents($file))).$eol; - } - $out.=$eol; - $out.='--'.$hash.'--'.$eol; - $out.='.'; - $this->dialog($out,preg_match('/verbose/i',$log),$mock); - } - else { - // Send mail headers - $out=''; - foreach ($headers as $key=>$val) - if ($key!='Bcc') - $out.=$key.': '.$val.$eol; - $out.=$eol; - $out.=$message.$eol; - $out.='.'; - // Send message - $this->dialog($out,preg_match('/verbose/i',$log),$mock); - } - $this->dialog('QUIT',$log,$mock); - if (!$mock && $socket) - fclose($socket); - return TRUE; - } - - /** - * Instantiate class - * @param $host string - * @param $port int - * @param $scheme string - * @param $user string - * @param $pw string - * @param $ctx resource - **/ - function __construct( - $host='localhost',$port=25,$scheme=NULL,$user=NULL,$pw=NULL,$ctx=NULL) { - $this->headers=[ - 'MIME-Version'=>'1.0', - 'Content-Type'=>'text/plain; '. - 'charset='.Base::instance()->ENCODING - ]; - $this->host=strtolower((($this->scheme=strtolower($scheme))=='ssl'? - 'ssl':'tcp').'://'.$host); - $this->port=$port; - $this->user=$user; - $this->pw=$pw; - $this->context=stream_context_create($ctx); - } - -} diff --git a/app/lib/template.php b/app/lib/template.php deleted file mode 100644 index 0e130344..00000000 --- a/app/lib/template.php +++ /dev/null @@ -1,353 +0,0 @@ -. - -*/ - -//! XML-style template engine -class Template extends Preview { - - //@{ Error messages - const - E_Method='Call to undefined method %s()'; - //@} - - protected - //! Template tags - $tags, - //! Custom tag handlers - $custom=[]; - - /** - * Template -set- tag handler - * @return string - * @param $node array - **/ - protected function _set(array $node) { - $out=''; - foreach ($node['@attrib'] as $key=>$val) - $out.='$'.$key.'='. - (preg_match('/\{\{(.+?)\}\}/',$val)? - $this->token($val): - Base::instance()->stringify($val)).'; '; - return ''; - } - - /** - * Template -include- tag handler - * @return string - * @param $node array - **/ - protected function _include(array $node) { - $attrib=$node['@attrib']; - $hive=isset($attrib['with']) && - ($attrib['with']=$this->token($attrib['with'])) && - preg_match_all('/(\w+)\h*=\h*(.+?)(?=,|$)/', - $attrib['with'],$pairs,PREG_SET_ORDER)? - ('['.implode(',', - array_map(function($pair) { - return '\''.$pair[1].'\'=>'. - (preg_match('/^\'.*\'$/',$pair[2]) || - preg_match('/\$/',$pair[2])? - $pair[2]:Base::instance()->stringify( - Base::instance()->cast($pair[2]))); - },$pairs)).']+get_defined_vars()'): - 'get_defined_vars()'; - $ttl=isset($attrib['ttl'])?(int)$attrib['ttl']:0; - return - 'token($attrib['if']).') '):''). - ('echo $this->render('. - (preg_match('/^\{\{(.+?)\}\}$/',$attrib['href'])? - $this->token($attrib['href']): - Base::instance()->stringify($attrib['href'])).','. - 'NULL,'.$hive.','.$ttl.'); ?>'); - } - - /** - * Template -exclude- tag handler - * @return string - **/ - protected function _exclude() { - return ''; - } - - /** - * Template -ignore- tag handler - * @return string - * @param $node array - **/ - protected function _ignore(array $node) { - return $node[0]; - } - - /** - * Template -loop- tag handler - * @return string - * @param $node array - **/ - protected function _loop(array $node) { - $attrib=$node['@attrib']; - unset($node['@attrib']); - return - 'token($attrib['from']).';'. - $this->token($attrib['to']).';'. - $this->token($attrib['step']).'): ?>'. - $this->build($node). - ''; - } - - /** - * Template -repeat- tag handler - * @return string - * @param $node array - **/ - protected function _repeat(array $node) { - $attrib=$node['@attrib']; - unset($node['@attrib']); - return - 'token($attrib['counter'])).'=0; '):''). - 'foreach (('. - $this->token($attrib['group']).'?:[]) as '. - (isset($attrib['key'])? - ($this->token($attrib['key']).'=>'):''). - $this->token($attrib['value']).'):'. - (isset($ctr)?(' '.$ctr.'++;'):'').' ?>'. - $this->build($node). - ''; - } - - /** - * Template -check- tag handler - * @return string - * @param $node array - **/ - protected function _check(array $node) { - $attrib=$node['@attrib']; - unset($node['@attrib']); - // Grab and blocks - foreach ($node as $pos=>$block) - if (isset($block['true'])) - $true=[$pos,$block]; - elseif (isset($block['false'])) - $false=[$pos,$block]; - if (isset($true,$false) && $true[0]>$false[0]) - // Reverse and blocks - list($node[$true[0]],$node[$false[0]])=[$false[1],$true[1]]; - return - 'token($attrib['if']).'): ?>'. - $this->build($node). - ''; - } - - /** - * Template -true- tag handler - * @return string - * @param $node array - **/ - protected function _true(array $node) { - return $this->build($node); - } - - /** - * Template -false- tag handler - * @return string - * @param $node array - **/ - protected function _false(array $node) { - return ''.$this->build($node); - } - - /** - * Template -switch- tag handler - * @return string - * @param $node array - **/ - protected function _switch(array $node) { - $attrib=$node['@attrib']; - unset($node['@attrib']); - foreach ($node as $pos=>$block) - if (is_string($block) && !preg_replace('/\s+/','',$block)) - unset($node[$pos]); - return - 'token($attrib['expr']).'): ?>'. - $this->build($node). - ''; - } - - /** - * Template -case- tag handler - * @return string - * @param $node array - **/ - protected function _case(array $node) { - $attrib=$node['@attrib']; - unset($node['@attrib']); - return - 'token($attrib['value']): - Base::instance()->stringify($attrib['value'])).': ?>'. - $this->build($node). - 'token($attrib['break']).') ':''). - 'break; ?>'; - } - - /** - * Template -default- tag handler - * @return string - * @param $node array - **/ - protected function _default(array $node) { - return - ''. - $this->build($node). - ''; - } - - /** - * Assemble markup - * @return string - * @param $node array|string - **/ - function build($node) { - if (is_string($node)) - return parent::build($node); - $out=''; - foreach ($node as $key=>$val) - $out.=is_int($key)?$this->build($val):$this->{'_'.$key}($val); - return $out; - } - - /** - * Extend template with custom tag - * @return NULL - * @param $tag string - * @param $func callback - **/ - function extend($tag,$func) { - $this->tags.='|'.$tag; - $this->custom['_'.$tag]=$func; - } - - /** - * Call custom tag handler - * @return string|FALSE - * @param $func string - * @param $args array - **/ - function __call($func,array $args) { - if ($func[0]=='_') - return call_user_func_array($this->custom[$func],$args); - if (method_exists($this,$func)) - return call_user_func_array([$this,$func],$args); - user_error(sprintf(self::E_Method,$func),E_USER_ERROR); - } - - /** - * Parse string for template directives and tokens - * @return array - * @param $text string - **/ - function parse($text) { - $text=parent::parse($text); - // Build tree structure - for ($ptr=0,$w=5,$len=strlen($text),$tree=[],$tmp='';$ptr<$len;) - if (preg_match('/^(.{0,'.$w.'}?)<(\/?)(?:F3:)?'. - '('.$this->tags.')\b((?:\s+[\w.:@!-]+'. - '(?:\h*=\h*(?:"(?:.*?)"|\'(?:.*?)\'))?|'. - '\h*\{\{.+?\}\})*)\h*(\/?)>/is', - substr($text,$ptr),$match)) { - if (strlen($tmp) || $match[1]) - $tree[]=$tmp.$match[1]; - // Element node - if ($match[2]) { - // Find matching start tag - $stack=[]; - for($i=count($tree)-1;$i>=0;$i--) { - $item=$tree[$i]; - if (is_array($item) && - array_key_exists($match[3],$item) && - !isset($item[$match[3]][0])) { - // Start tag found - $tree[$i][$match[3]]+=array_reverse($stack); - $tree=array_slice($tree,0,$i+1); - break; - } - else $stack[]=$item; - } - } - else { - // Start tag - $node=&$tree[][$match[3]]; - $node=[]; - if ($match[4]) { - // Process attributes - preg_match_all( - '/(?:(\{\{.+?\}\})|([^\s\/"\'=]+))'. - '\h*(?:=\h*(?:"(.*?)"|\'(.*?)\'))?/s', - $match[4],$attr,PREG_SET_ORDER); - foreach ($attr as $kv) - if (!empty($kv[1]) && !isset($kv[3]) && !isset($kv[4])) - $node['@attrib'][]=$kv[1]; - else - $node['@attrib'][$kv[1]?:$kv[2]]= - (isset($kv[3]) && $kv[3]!==''? - $kv[3]: - (isset($kv[4]) && $kv[4]!==''? - $kv[4]:NULL)); - } - } - $tmp=''; - $ptr+=strlen($match[0]); - $w=5; - } - else { - // Text node - $tmp.=substr($text,$ptr,$w); - $ptr+=$w; - if ($w<50) - $w++; - } - if (strlen($tmp)) - // Append trailing text - $tree[]=$tmp; - // Break references - unset($node); - return $tree; - } - - /** - * Class constructor - * return object - **/ - function __construct() { - $ref=new ReflectionClass(get_called_class()); - $this->tags=''; - foreach ($ref->getmethods() as $method) - if (preg_match('/^_(?=[[:alpha:]])/',$method->name)) - $this->tags.=(strlen($this->tags)?'|':''). - substr($method->name,1); - parent::__construct(); - } - -} diff --git a/app/lib/test.php b/app/lib/test.php deleted file mode 100644 index 721faf76..00000000 --- a/app/lib/test.php +++ /dev/null @@ -1,96 +0,0 @@ -. - -*/ - -//! Unit test kit -class Test { - - //@{ Reporting level - const - FLAG_False=0, - FLAG_True=1, - FLAG_Both=2; - //@} - - protected - //! Test results - $data=[], - //! Success indicator - $passed=TRUE; - - /** - * Return test results - * @return array - **/ - function results() { - return $this->data; - } - - /** - * Return FALSE if at least one test case fails - * @return bool - **/ - function passed() { - return $this->passed; - } - - /** - * Evaluate condition and save test result - * @return object - * @param $cond bool - * @param $text string - **/ - function expect($cond,$text=NULL) { - $out=(bool)$cond; - if ($this->level==$out || $this->level==self::FLAG_Both) { - $data=['status'=>$out,'text'=>$text,'source'=>NULL]; - foreach (debug_backtrace() as $frame) - if (isset($frame['file'])) { - $data['source']=Base::instance()-> - fixslashes($frame['file']).':'.$frame['line']; - break; - } - $this->data[]=$data; - } - if (!$out && $this->passed) - $this->passed=FALSE; - return $this; - } - - /** - * Append message to test results - * @return NULL - * @param $text string - **/ - function message($text) { - $this->expect(TRUE,$text); - } - - /** - * Class constructor - * @return NULL - * @param $level int - **/ - function __construct($level=self::FLAG_Both) { - $this->level=$level; - } - -} diff --git a/app/lib/utf.php b/app/lib/utf.php deleted file mode 100644 index a010c66f..00000000 --- a/app/lib/utf.php +++ /dev/null @@ -1,199 +0,0 @@ -. - -*/ - -//! Unicode string manager -class UTF extends Prefab { - - /** - * Get string length - * @return int - * @param $str string - **/ - function strlen($str) { - preg_match_all('/./us',$str,$parts); - return count($parts[0]); - } - - /** - * Reverse a string - * @return string - * @param $str string - **/ - function strrev($str) { - preg_match_all('/./us',$str,$parts); - return implode('',array_reverse($parts[0])); - } - - /** - * Find position of first occurrence of a string (case-insensitive) - * @return int|FALSE - * @param $stack string - * @param $needle string - * @param $ofs int - **/ - function stripos($stack,$needle,$ofs=0) { - return $this->strpos($stack,$needle,$ofs,TRUE); - } - - /** - * Find position of first occurrence of a string - * @return int|FALSE - * @param $stack string - * @param $needle string - * @param $ofs int - * @param $case bool - **/ - function strpos($stack,$needle,$ofs=0,$case=FALSE) { - return preg_match('/^(.{'.$ofs.'}.*?)'. - preg_quote($needle,'/').'/us'.($case?'i':''),$stack,$match)? - $this->strlen($match[1]):FALSE; - } - - /** - * Returns part of haystack string from the first occurrence of - * needle to the end of haystack (case-insensitive) - * @return string|FALSE - * @param $stack string - * @param $needle string - * @param $before bool - **/ - function stristr($stack,$needle,$before=FALSE) { - return $this->strstr($stack,$needle,$before,TRUE); - } - - /** - * Returns part of haystack string from the first occurrence of - * needle to the end of haystack - * @return string|FALSE - * @param $stack string - * @param $needle string - * @param $before bool - * @param $case bool - **/ - function strstr($stack,$needle,$before=FALSE,$case=FALSE) { - if (!$needle) - return FALSE; - preg_match('/^(.*?)'.preg_quote($needle,'/').'/us'.($case?'i':''), - $stack,$match); - return isset($match[1])? - ($before? - $match[1]: - $this->substr($stack,$this->strlen($match[1]))): - FALSE; - } - - /** - * Return part of a string - * @return string|FALSE - * @param $str string - * @param $start int - * @param $len int - **/ - function substr($str,$start,$len=0) { - if ($start<0) - $start=$this->strlen($str)+$start; - if (!$len) - $len=$this->strlen($str)-$start; - return preg_match('/^.{'.$start.'}(.{0,'.$len.'})/us',$str,$match)? - $match[1]:FALSE; - } - - /** - * Count the number of substring occurrences - * @return int - * @param $stack string - * @param $needle string - **/ - function substr_count($stack,$needle) { - preg_match_all('/'.preg_quote($needle,'/').'/us',$stack, - $matches,PREG_SET_ORDER); - return count($matches); - } - - /** - * Strip whitespaces from the beginning of a string - * @return string - * @param $str string - **/ - function ltrim($str) { - return preg_replace('/^[\pZ\pC]+/u','',$str); - } - - /** - * Strip whitespaces from the end of a string - * @return string - * @param $str string - **/ - function rtrim($str) { - return preg_replace('/[\pZ\pC]+$/u','',$str); - } - - /** - * Strip whitespaces from the beginning and end of a string - * @return string - * @param $str string - **/ - function trim($str) { - return preg_replace('/^[\pZ\pC]+|[\pZ\pC]+$/u','',$str); - } - - /** - * Return UTF-8 byte order mark - * @return string - **/ - function bom() { - return chr(0xef).chr(0xbb).chr(0xbf); - } - - /** - * Convert code points to Unicode symbols - * @return string - * @param $str string - **/ - function translate($str) { - return html_entity_decode( - preg_replace('/\\\\u([[:xdigit:]]+)/i','&#x\1;',$str)); - } - - /** - * Translate emoji tokens to Unicode font-supported symbols - * @return string - * @param $str string - **/ - function emojify($str) { - $map=[ - ':('=>'\u2639', // frown - ':)'=>'\u263a', // smile - '<3'=>'\u2665', // heart - ':D'=>'\u1f603', // grin - 'XD'=>'\u1f606', // laugh - ';)'=>'\u1f609', // wink - ':P'=>'\u1f60b', // tongue - ':,'=>'\u1f60f', // think - ':/'=>'\u1f623', // skeptic - '8O'=>'\u1f632', // oops - ]+Base::instance()->EMOJI; - return $this->translate(str_replace(array_keys($map), - array_values($map),$str)); - } - -} diff --git a/app/lib/web.php b/app/lib/web.php deleted file mode 100644 index 9c1b546e..00000000 --- a/app/lib/web.php +++ /dev/null @@ -1,932 +0,0 @@ -. - -*/ - -//! Wrapper for various HTTP utilities -class Web extends Prefab { - - //@{ Error messages - const - E_Request='No suitable HTTP request engine found'; - //@} - - protected - //! HTTP request engine - $wrapper; - - /** - * Detect MIME type using file extension - * @return string - * @param $file string - **/ - function mime($file) { - if (preg_match('/\w+$/',$file,$ext)) { - $map=[ - 'au'=>'audio/basic', - 'avi'=>'video/avi', - 'bmp'=>'image/bmp', - 'bz2'=>'application/x-bzip2', - 'css'=>'text/css', - 'dtd'=>'application/xml-dtd', - 'doc'=>'application/msword', - 'gif'=>'image/gif', - 'gz'=>'application/x-gzip', - 'hqx'=>'application/mac-binhex40', - 'html?'=>'text/html', - 'jar'=>'application/java-archive', - 'jpe?g|jfif?'=>'image/jpeg', - 'js'=>'application/x-javascript', - 'midi'=>'audio/x-midi', - 'mp3'=>'audio/mpeg', - 'mpe?g'=>'video/mpeg', - 'ogg'=>'audio/vorbis', - 'pdf'=>'application/pdf', - 'png'=>'image/png', - 'ppt'=>'application/vnd.ms-powerpoint', - 'ps'=>'application/postscript', - 'qt'=>'video/quicktime', - 'ram?'=>'audio/x-pn-realaudio', - 'rdf'=>'application/rdf', - 'rtf'=>'application/rtf', - 'sgml?'=>'text/sgml', - 'sit'=>'application/x-stuffit', - 'svg'=>'image/svg+xml', - 'swf'=>'application/x-shockwave-flash', - 'tgz'=>'application/x-tar', - 'tiff'=>'image/tiff', - 'txt'=>'text/plain', - 'wav'=>'audio/wav', - 'xls'=>'application/vnd.ms-excel', - 'xml'=>'application/xml', - 'zip'=>'application/x-zip-compressed' - ]; - foreach ($map as $key=>$val) - if (preg_match('/'.$key.'/',strtolower($ext[0]))) - return $val; - } - return 'application/octet-stream'; - } - - /** - * Return the MIME types stated in the HTTP Accept header as an array; - * If a list of MIME types is specified, return the best match; or - * FALSE if none found - * @return array|string|FALSE - * @param $list string|array - **/ - function acceptable($list=NULL) { - $accept=[]; - foreach (explode(',',str_replace(' ','',@$_SERVER['HTTP_ACCEPT'])) - as $mime) - if (preg_match('/(.+?)(?:;q=([\d\.]+)|$)/',$mime,$parts)) - $accept[$parts[1]]=isset($parts[2])?$parts[2]:1; - if (!$accept) - $accept['*/*']=1; - else { - krsort($accept); - arsort($accept); - } - if ($list) { - if (is_string($list)) - $list=explode(',',$list); - foreach ($accept as $mime=>$q) - if ($q && $out=preg_grep('/'. - str_replace('\*','.*',preg_quote($mime,'/')).'/',$list)) - return current($out); - return FALSE; - } - return $accept; - } - - /** - * Transmit file to HTTP client; Return file size if successful, - * FALSE otherwise - * @return int|FALSE - * @param $file string - * @param $mime string - * @param $kbps int - * @param $force bool - * @param $name string - * @param $flush bool - **/ - function send($file,$mime=NULL,$kbps=0,$force=TRUE,$name=NULL,$flush=TRUE) { - if (!is_file($file)) - return FALSE; - $size=filesize($file); - if (PHP_SAPI!='cli') { - header('Content-Type: '.($mime?:$this->mime($file))); - if ($force) - header('Content-Disposition: attachment; '. - 'filename="'.($name!==NULL?$name:basename($file)).'"'); - header('Accept-Ranges: bytes'); - header('Content-Length: '.$size); - header('X-Powered-By: '.Base::instance()->PACKAGE); - } - if (!$kbps && $flush) { - while (ob_get_level()) - ob_end_clean(); - readfile($file); - } - else { - $ctr=0; - $handle=fopen($file,'rb'); - $start=microtime(TRUE); - while (!feof($handle) && - ($info=stream_get_meta_data($handle)) && - !$info['timed_out'] && !connection_aborted()) { - if ($kbps) { - // Throttle output - $ctr++; - if ($ctr/$kbps>$elapsed=microtime(TRUE)-$start) - usleep(1e6*($ctr/$kbps-$elapsed)); - } - // Send 1KiB and reset timer - echo fread($handle,1024); - if ($flush) { - ob_flush(); - flush(); - } - } - fclose($handle); - } - return $size; - } - - /** - * Receive file(s) from HTTP client - * @return array|bool - * @param $func callback - * @param $overwrite bool - * @param $slug callback|bool - **/ - function receive($func=NULL,$overwrite=FALSE,$slug=TRUE) { - $fw=Base::instance(); - $dir=$fw->UPLOADS; - if (!is_dir($dir)) - mkdir($dir,Base::MODE,TRUE); - if ($fw->VERB=='PUT') { - $tmp=$fw->TEMP.$fw->SEED.'.'.$fw->hash(uniqid()); - if (!$fw->RAW) - $fw->write($tmp,$fw->BODY); - else { - $src=@fopen('php://input','r'); - $dst=@fopen($tmp,'w'); - if (!$src || !$dst) - return FALSE; - while (!feof($src) && - ($info=stream_get_meta_data($src)) && - !$info['timed_out'] && $str=fgets($src,4096)) - fputs($dst,$str,strlen($str)); - fclose($dst); - fclose($src); - } - $base=basename($fw->URI); - $file=[ - 'name'=>$dir. - ($slug && preg_match('/(.+?)(\.\w+)?$/',$base,$parts)? - (is_callable($slug)? - $slug($base): - ($this->slug($parts[1]). - (isset($parts[2])?$parts[2]:''))): - $base), - 'tmp_name'=>$tmp, - 'type'=>$this->mime($base), - 'size'=>filesize($tmp) - ]; - return (!file_exists($file['name']) || $overwrite) && - (!$func || $fw->call($func,[$file])!==FALSE) && - rename($tmp,$file['name']); - } - $fetch=function($arr) use(&$fetch) { - if (!is_array($arr)) - return [$arr]; - $data=[]; - foreach($arr as $k=>$sub) - $data=array_merge($data,$fetch($sub)); - return $data; - }; - $out=[]; - foreach ($_FILES as $name=>$item) { - $files=[]; - foreach ($item as $k=>$mix) - foreach ($fetch($mix) as $i=>$val) - $files[$i][$k]=$val; - foreach ($files as $file) { - if (empty($file['name'])) - continue; - $base=basename($file['name']); - $file['name']=$dir. - ($slug && preg_match('/(.+?)(\.\w+)?$/',$base,$parts)? - (is_callable($slug)? - $slug($base,$name): - ($this->slug($parts[1]). - (isset($parts[2])?$parts[2]:''))): - $base); - $out[$file['name']]=!$file['error'] && - (!file_exists($file['name']) || $overwrite) && - (!$func || $fw->call($func,[$file,$name])!==FALSE) && - move_uploaded_file($file['tmp_name'],$file['name']); - } - } - return $out; - } - - /** - * Return upload progress in bytes, FALSE on failure - * @return int|FALSE - * @param $id string - **/ - function progress($id) { - // ID returned by session.upload_progress.name - return ini_get('session.upload_progress.enabled') && - isset($_SESSION[$id]['bytes_processed'])? - $_SESSION[$id]['bytes_processed']:FALSE; - } - - /** - * HTTP request via cURL - * @return array - * @param $url string - * @param $options array - **/ - protected function _curl($url,$options) { - $curl=curl_init($url); - if (!$open_basedir=ini_get('open_basedir')) - curl_setopt($curl,CURLOPT_FOLLOWLOCATION, - $options['follow_location']); - curl_setopt($curl,CURLOPT_MAXREDIRS, - $options['max_redirects']); - curl_setopt($curl,CURLOPT_PROTOCOLS,CURLPROTO_HTTP|CURLPROTO_HTTPS); - curl_setopt($curl,CURLOPT_REDIR_PROTOCOLS,CURLPROTO_HTTP|CURLPROTO_HTTPS); - curl_setopt($curl,CURLOPT_CUSTOMREQUEST,$options['method']); - if (isset($options['header'])) - curl_setopt($curl,CURLOPT_HTTPHEADER,$options['header']); - if (isset($options['content'])) - curl_setopt($curl,CURLOPT_POSTFIELDS,$options['content']); - if (isset($options['proxy'])) - curl_setopt($curl,CURLOPT_PROXY,$options['proxy']); - curl_setopt($curl,CURLOPT_ENCODING,'gzip,deflate'); - $timeout=isset($options['timeout'])? - $options['timeout']: - ini_get('default_socket_timeout'); - curl_setopt($curl,CURLOPT_CONNECTTIMEOUT,$timeout); - curl_setopt($curl,CURLOPT_TIMEOUT,$timeout); - $headers=[]; - curl_setopt($curl,CURLOPT_HEADERFUNCTION, - // Callback for response headers - function($curl,$line) use(&$headers) { - if ($trim=trim($line)) - $headers[]=$trim; - return strlen($line); - } - ); - curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,2); - curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,FALSE); - ob_start(); - curl_exec($curl); - $err=curl_error($curl); - curl_close($curl); - $body=ob_get_clean(); - if (!$err && - $options['follow_location'] && $open_basedir && - preg_grep('/HTTP\/1\.\d 3\d{2}/',$headers) && - preg_match('/^Location: (.+)$/m',implode(PHP_EOL,$headers),$loc)) { - $options['max_redirects']--; - if($loc[1][0] == '/') { - $parts=parse_url($url); - $loc[1]=$parts['scheme'].'://'.$parts['host']. - ((isset($parts['port']) && !in_array($parts['port'],[80,443])) - ?':'.$parts['port']:'').$loc[1]; - } - return $this->request($loc[1],$options); - } - return [ - 'body'=>$body, - 'headers'=>$headers, - 'engine'=>'cURL', - 'cached'=>FALSE, - 'error'=>$err - ]; - } - - /** - * HTTP request via PHP stream wrapper - * @return array - * @param $url string - * @param $options array - **/ - protected function _stream($url,$options) { - $eol="\r\n"; - if (isset($options['proxy'])) { - $options['proxy']=preg_replace('/https?/i','tcp',$options['proxy']); - $options['request_fulluri']=true; - if (preg_match('/socks4?/i',$options['proxy'])) - return $this->_socket($url,$options); - } - $options['header']=implode($eol,$options['header']); - $body=@file_get_contents($url,FALSE, - stream_context_create(['http'=>$options])); - $headers=isset($http_response_header)? - $http_response_header:[]; - $err=''; - if (is_string($body)) { - $match=NULL; - foreach ($headers as $header) - if (preg_match('/Content-Encoding: (.+)/i',$header,$match)) - break; - if ($match) - switch ($match[1]) { - case 'gzip': - $body=gzdecode($body); - break; - case 'deflate': - $body=gzuncompress($body); - break; - } - } - else { - $tmp=error_get_last(); - $err=$tmp['message']; - } - return [ - 'body'=>$body, - 'headers'=>$headers, - 'engine'=>'stream', - 'cached'=>FALSE, - 'error'=>$err - ]; - } - - /** - * HTTP request via low-level TCP/IP socket - * @return array - * @param $url string - * @param $options array - **/ - protected function _socket($url,$options) { - $eol="\r\n"; - $headers=[]; - $body=''; - $parts=parse_url($url); - $hostname=$parts['host']; - $proxy=false; - if ($parts['scheme']=='https') - $parts['host']='ssl://'.$parts['host']; - if (empty($parts['port'])) - $parts['port']=$parts['scheme']=='https'?443:80; - if (empty($parts['path'])) - $parts['path']='/'; - if (empty($parts['query'])) - $parts['query']=''; - if (isset($options['proxy'])) { - $req=$url; - $pp=parse_url($options['proxy']); - $proxy=$pp['scheme']; - if ($pp['scheme']=='https') - $pp['host']='ssl://'.$pp['host']; - if (empty($pp['port'])) - $pp['port']=$pp['scheme']=='https'?443:80; - $socket=@fsockopen($pp['host'],$pp['port'],$code,$err); - } else { - $req=$parts['path'].($parts['query']?('?'.$parts['query']):''); - $socket=@fsockopen($parts['host'],$parts['port'],$code,$err); - } - if ($socket) { - stream_set_blocking($socket,TRUE); - stream_set_timeout($socket,isset($options['timeout'])? - $options['timeout']:ini_get('default_socket_timeout')); - if ($proxy=='socks4') { - // SOCKS4; http://en.wikipedia.org/wiki/SOCKS#Protocol - $packet="\x04\x01".pack("n", $parts['port']). - pack("H*",dechex(ip2long(gethostbyname($hostname))))."\0"; - fputs($socket, $packet, strlen($packet)); - $response=fread($socket, 9); - if (strlen($response)==8 && (ord($response[0])==0 || ord($response[0])==4) - && ord($response[1])==90) { - $options['header'][]='Host: '.$hostname; - } else - $err='Socket Status '.ord($response[1]); - } - fputs($socket,$options['method'].' '.$req.' HTTP/1.0'.$eol); - fputs($socket,implode($eol,$options['header']).$eol.$eol); - if (isset($options['content'])) - fputs($socket,$options['content'].$eol); - // Get response - $content=''; - while (!feof($socket) && - ($info=stream_get_meta_data($socket)) && - !$info['timed_out'] && !connection_aborted() && - $str=fgets($socket,4096)) - $content.=$str; - fclose($socket); - $html=explode($eol.$eol,$content,2); - $body=isset($html[1])?$html[1]:''; - $headers=array_merge($headers,$current=explode($eol,$html[0])); - $match=NULL; - foreach ($current as $header) - if (preg_match('/Content-Encoding: (.+)/i',$header,$match)) - break; - if ($match) - switch ($match[1]) { - case 'gzip': - $body=gzdecode($body); - break; - case 'deflate': - $body=gzuncompress($body); - break; - } - if ($options['follow_location'] && - preg_grep('/HTTP\/1\.\d 3\d{2}/',$headers) && - preg_match('/Location: (.+?)'.preg_quote($eol).'/', - $html[0],$loc)) { - $options['max_redirects']--; - return $this->request($loc[1],$options); - } - } - return [ - 'body'=>$body, - 'headers'=>$headers, - 'engine'=>'socket', - 'cached'=>FALSE, - 'error'=>$err - ]; - } - - /** - * Specify the HTTP request engine to use; If not available, - * fall back to an applicable substitute - * @return string - * @param $arg string - **/ - function engine($arg='curl') { - $arg=strtolower($arg); - $flags=[ - 'curl'=>extension_loaded('curl'), - 'stream'=>ini_get('allow_url_fopen'), - 'socket'=>function_exists('fsockopen') - ]; - if ($flags[$arg]) - return $this->wrapper=$arg; - foreach ($flags as $key=>$val) - if ($val) - return $this->wrapper=$key; - user_error(self::E_Request,E_USER_ERROR); - } - - /** - * Replace old headers with new elements - * @return NULL - * @param $old array - * @param $new string|array - **/ - function subst(array &$old,$new) { - if (is_string($new)) - $new=[$new]; - foreach ($new as $hdr) { - $old=preg_grep('/'.preg_quote(strstr($hdr,':',TRUE),'/').':.+/', - $old,PREG_GREP_INVERT); - array_push($old,$hdr); - } - } - - /** - * Submit HTTP request; Use HTTP context options (described in - * http://www.php.net/manual/en/context.http.php) if specified; - * Cache the page as instructed by remote server - * @return array|FALSE - * @param $url string - * @param $options array - **/ - function request($url,array $options=NULL) { - $fw=Base::instance(); - $parts=parse_url($url); - if (empty($parts['scheme'])) { - // Local URL - $url=$fw->SCHEME.'://'.$fw->HOST. - (in_array($fw->PORT,[80,443])?'':(':'.$fw->PORT)). - ($url[0]!='/'?($fw->BASE.'/'):'').$url; - $parts=parse_url($url); - } - elseif (!preg_match('/https?/',$parts['scheme'])) - return FALSE; - if (!is_array($options)) - $options=[]; - if (empty($options['header'])) - $options['header']=[]; - elseif (is_string($options['header'])) - $options['header']=[$options['header']]; - if (!$this->wrapper) - $this->engine(); - if ($this->wrapper!='stream') { - // PHP streams can't cope with redirects when Host header is set - $this->subst($options['header'],'Host: '.$parts['host']); - } - $this->subst($options['header'], - [ - 'Accept-Encoding: gzip,deflate', - 'User-Agent: '.(isset($options['user_agent'])? - $options['user_agent']: - 'Mozilla/5.0 (compatible; '.php_uname('s').')'), - 'Connection: close' - ] - ); - if (isset($options['content']) && is_string($options['content'])) { - if ($options['method']=='POST' && - !preg_grep('/^Content-Type:/i',$options['header'])) - $this->subst($options['header'], - 'Content-Type: application/x-www-form-urlencoded'); - $this->subst($options['header'], - 'Content-Length: '.strlen($options['content'])); - } - if (isset($parts['user'],$parts['pass'])) - $this->subst($options['header'], - 'Authorization: Basic '. - base64_encode($parts['user'].':'.$parts['pass']) - ); - $options+=[ - 'method'=>'GET', - 'header'=>$options['header'], - 'follow_location'=>TRUE, - 'max_redirects'=>20, - 'ignore_errors'=>FALSE - ]; - $eol="\r\n"; - if ($fw->CACHE && - preg_match('/GET|HEAD/',$options['method'])) { - $cache=Cache::instance(); - if ($cache->exists( - $hash=$fw->hash($options['method'].' '.$url).'.url',$data)) { - if (preg_match('/Last-Modified: (.+?)'.preg_quote($eol).'/', - implode($eol,$data['headers']),$mod)) - $this->subst($options['header'], - 'If-Modified-Since: '.$mod[1]); - } - } - $result=$this->{'_'.$this->wrapper}($url,$options); - if ($result && isset($cache)) { - if (preg_match('/HTTP\/1\.\d 304/', - implode($eol,$result['headers']))) { - $result=$cache->get($hash); - $result['cached']=TRUE; - } - elseif (preg_match('/Cache-Control:(?:.*)max-age=(\d+)(?:,?.*'. - preg_quote($eol).')/i',implode($eol,$result['headers']),$exp)) - $cache->set($hash,$result,$exp[1]); - } - $req=[$options['method'].' '.$url]; - foreach ($options['header'] as $header) - array_push($req,$header); - return array_merge(['request'=>$req],$result); - } - - /** - * Strip Javascript/CSS files of extraneous whitespaces and comments; - * Return combined output as a minified string - * @return string - * @param $files string|array - * @param $mime string - * @param $header bool - * @param $path string - **/ - function minify($files,$mime=NULL,$header=TRUE,$path=NULL) { - $fw=Base::instance(); - if (is_string($files)) - $files=$fw->split($files); - if (!$mime) - $mime=$this->mime($files[0]); - preg_match('/\w+$/',$files[0],$ext); - $cache=Cache::instance(); - $dst=''; - if (!isset($path)) - $path=$fw->UI.';./'; - foreach ($fw->split($path,FALSE) as $dir) - foreach ($files as $file) - if (is_file($save=$fw->fixslashes($dir.$file)) && - is_bool(strpos($save,'../')) && - preg_match('/\.(css|js)$/i',$file)) { - if ($fw->CACHE && - ($cached=$cache->exists( - $hash=$fw->hash($save).'.'.$ext[0],$data)) && - $cached[0]>filemtime($save)) - $dst.=$data; - else { - $data=''; - $src=$fw->read($save); - for ($ptr=0,$len=strlen($src);$ptr<$len;) { - if (preg_match('/^@import\h+url'. - '\(\h*([\'"])((?!(?:https?:)?\/\/).+?)\1\h*\)[^;]*;/', - substr($src,$ptr),$parts)) { - $path=dirname($file); - $data.=$this->minify( - ($path?($path.'/'):'').$parts[2], - $mime,$header - ); - $ptr+=strlen($parts[0]); - continue; - } - if ($src[$ptr]=='/') { - if ($src[$ptr+1]=='*') { - // Multiline comment - $str=strstr( - substr($src,$ptr+2),'*/',TRUE); - $ptr+=strlen($str)+4; - } - elseif ($src[$ptr+1]=='/') { - // Single-line comment - $str=strstr( - substr($src,$ptr+2),"\n",TRUE); - $ptr+=(empty($str))? - strlen(substr($src,$ptr)):strlen($str)+2; - } - else { - // Presume it's a regex pattern - $regex=TRUE; - // Backtrack and validate - for ($ofs=$ptr;$ofs;$ofs--) { - // Pattern should be preceded by - // open parenthesis, colon, - // object property or operator - if (preg_match( - '/(return|[(:=!+\-*&|])$/', - substr($src,0,$ofs))) { - $data.='/'; - $ptr++; - while ($ptr<$len) { - $data.=$src[$ptr]; - $ptr++; - if ($src[$ptr-1]=='\\') { - $data.=$src[$ptr]; - $ptr++; - } - elseif ($src[$ptr-1]=='/') - break; - } - break; - } - elseif (!ctype_space($src[$ofs-1])) { - // Not a regex pattern - $regex=FALSE; - break; - } - } - if (!$regex) { - // Division operator - $data.=$src[$ptr]; - $ptr++; - } - } - continue; - } - if (in_array($src[$ptr],['\'','"'])) { - $match=$src[$ptr]; - $data.=$match; - $ptr++; - // String literal - while ($ptr<$len) { - $data.=$src[$ptr]; - $ptr++; - if ($src[$ptr-1]=='\\') { - $data.=$src[$ptr]; - $ptr++; - } - elseif ($src[$ptr-1]==$match) - break; - } - continue; - } - if (ctype_space($src[$ptr])) { - if ($ptr+1CACHE) - $cache->set($hash,$data); - $dst.=$data; - } - } - if (PHP_SAPI!='cli' && $header) - header('Content-Type: '.$mime.'; charset='.$fw->ENCODING); - return $dst; - } - - /** - * Retrieve RSS feed and return as an array - * @return array|FALSE - * @param $url string - * @param $max int - * @param $tags string - **/ - function rss($url,$max=10,$tags=NULL) { - if (!$data=$this->request($url)) - return FALSE; - // Suppress errors caused by invalid XML structures - libxml_use_internal_errors(TRUE); - $xml=simplexml_load_string($data['body'], - NULL,LIBXML_NOBLANKS|LIBXML_NOERROR); - if (!is_object($xml)) - return FALSE; - $out=[]; - if (isset($xml->channel)) { - $out['source']=(string)$xml->channel->title; - $max=min($max,count($xml->channel->item)); - for ($i=0;$i<$max;$i++) { - $item=$xml->channel->item[$i]; - $list=[''=>NULL]+$item->getnamespaces(TRUE); - $fields=[]; - foreach ($list as $ns=>$uri) - foreach ($item->children($uri) as $key=>$val) - $fields[$ns.($ns?':':'').$key]=(string)$val; - $out['feed'][]=$fields; - } - } - else - return FALSE; - Base::instance()->scrub($out,$tags); - return $out; - } - - /** - * Retrieve information from whois server - * @return string|FALSE - * @param $addr string - * @param $server string - **/ - function whois($addr,$server='whois.internic.net') { - $socket=@fsockopen($server,43,$errno,$errstr); - if (!$socket) - // Can't establish connection - return FALSE; - // Set connection timeout parameters - stream_set_blocking($socket,FALSE); - stream_set_timeout($socket,ini_get('default_socket_timeout')); - // Send request - fputs($socket,$addr."\r\n"); - $info=stream_get_meta_data($socket); - // Get response - $response=''; - while (!feof($socket) && !$info['timed_out']) { - $response.=fgets($socket,4096); // MDFK97 - $info=stream_get_meta_data($socket); - } - fclose($socket); - return $info['timed_out']?FALSE:trim($response); - } - - /** - * Return preset diacritics translation table - * @return array - **/ - function diacritics() { - return [ - 'Ǎ'=>'A','А'=>'A','Ā'=>'A','Ă'=>'A','Ą'=>'A','Å'=>'A', - 'Ǻ'=>'A','Ä'=>'Ae','Á'=>'A','À'=>'A','Ã'=>'A','Â'=>'A', - 'Æ'=>'AE','Ǽ'=>'AE','Б'=>'B','Ç'=>'C','Ć'=>'C','Ĉ'=>'C', - 'Č'=>'C','Ċ'=>'C','Ц'=>'C','Ч'=>'Ch','Ð'=>'Dj','Đ'=>'Dj', - 'Ď'=>'Dj','Д'=>'Dj','É'=>'E','Ę'=>'E','Ё'=>'E','Ė'=>'E', - 'Ê'=>'E','Ě'=>'E','Ē'=>'E','È'=>'E','Е'=>'E','Э'=>'E', - 'Ë'=>'E','Ĕ'=>'E','Ф'=>'F','Г'=>'G','Ģ'=>'G','Ġ'=>'G', - 'Ĝ'=>'G','Ğ'=>'G','Х'=>'H','Ĥ'=>'H','Ħ'=>'H','Ï'=>'I', - 'Ĭ'=>'I','İ'=>'I','Į'=>'I','Ī'=>'I','Í'=>'I','Ì'=>'I', - 'И'=>'I','Ǐ'=>'I','Ĩ'=>'I','Î'=>'I','IJ'=>'IJ','Ĵ'=>'J', - 'Й'=>'J','Я'=>'Ja','Ю'=>'Ju','К'=>'K','Ķ'=>'K','Ĺ'=>'L', - 'Л'=>'L','Ł'=>'L','Ŀ'=>'L','Ļ'=>'L','Ľ'=>'L','М'=>'M', - 'Н'=>'N','Ń'=>'N','Ñ'=>'N','Ņ'=>'N','Ň'=>'N','Ō'=>'O', - 'О'=>'O','Ǿ'=>'O','Ǒ'=>'O','Ơ'=>'O','Ŏ'=>'O','Ő'=>'O', - 'Ø'=>'O','Ö'=>'Oe','Õ'=>'O','Ó'=>'O','Ò'=>'O','Ô'=>'O', - 'Œ'=>'OE','П'=>'P','Ŗ'=>'R','Р'=>'R','Ř'=>'R','Ŕ'=>'R', - 'Ŝ'=>'S','Ş'=>'S','Š'=>'S','Ș'=>'S','Ś'=>'S','С'=>'S', - 'Ш'=>'Sh','Щ'=>'Shch','Ť'=>'T','Ŧ'=>'T','Ţ'=>'T','Ț'=>'T', - 'Т'=>'T','Ů'=>'U','Ű'=>'U','Ŭ'=>'U','Ũ'=>'U','Ų'=>'U', - 'Ū'=>'U','Ǜ'=>'U','Ǚ'=>'U','Ù'=>'U','Ú'=>'U','Ü'=>'Ue', - 'Ǘ'=>'U','Ǖ'=>'U','У'=>'U','Ư'=>'U','Ǔ'=>'U','Û'=>'U', - 'В'=>'V','Ŵ'=>'W','Ы'=>'Y','Ŷ'=>'Y','Ý'=>'Y','Ÿ'=>'Y', - 'Ź'=>'Z','З'=>'Z','Ż'=>'Z','Ž'=>'Z','Ж'=>'Zh','á'=>'a', - 'ă'=>'a','â'=>'a','à'=>'a','ā'=>'a','ǻ'=>'a','å'=>'a', - 'ä'=>'ae','ą'=>'a','ǎ'=>'a','ã'=>'a','а'=>'a','ª'=>'a', - 'æ'=>'ae','ǽ'=>'ae','б'=>'b','č'=>'c','ç'=>'c','ц'=>'c', - 'ċ'=>'c','ĉ'=>'c','ć'=>'c','ч'=>'ch','ð'=>'dj','ď'=>'dj', - 'д'=>'dj','đ'=>'dj','э'=>'e','é'=>'e','ё'=>'e','ë'=>'e', - 'ê'=>'e','е'=>'e','ĕ'=>'e','è'=>'e','ę'=>'e','ě'=>'e', - 'ė'=>'e','ē'=>'e','ƒ'=>'f','ф'=>'f','ġ'=>'g','ĝ'=>'g', - 'ğ'=>'g','г'=>'g','ģ'=>'g','х'=>'h','ĥ'=>'h','ħ'=>'h', - 'ǐ'=>'i','ĭ'=>'i','и'=>'i','ī'=>'i','ĩ'=>'i','į'=>'i', - 'ı'=>'i','ì'=>'i','î'=>'i','í'=>'i','ï'=>'i','ij'=>'ij', - 'ĵ'=>'j','й'=>'j','я'=>'ja','ю'=>'ju','ķ'=>'k','к'=>'k', - 'ľ'=>'l','ł'=>'l','ŀ'=>'l','ĺ'=>'l','ļ'=>'l','л'=>'l', - 'м'=>'m','ņ'=>'n','ñ'=>'n','ń'=>'n','н'=>'n','ň'=>'n', - 'ʼn'=>'n','ó'=>'o','ò'=>'o','ǒ'=>'o','ő'=>'o','о'=>'o', - 'ō'=>'o','º'=>'o','ơ'=>'o','ŏ'=>'o','ô'=>'o','ö'=>'oe', - 'õ'=>'o','ø'=>'o','ǿ'=>'o','œ'=>'oe','п'=>'p','р'=>'r', - 'ř'=>'r','ŕ'=>'r','ŗ'=>'r','ſ'=>'s','ŝ'=>'s','ș'=>'s', - 'š'=>'s','ś'=>'s','с'=>'s','ş'=>'s','ш'=>'sh','щ'=>'shch', - 'ß'=>'ss','ţ'=>'t','т'=>'t','ŧ'=>'t','ť'=>'t','ț'=>'t', - 'у'=>'u','ǘ'=>'u','ŭ'=>'u','û'=>'u','ú'=>'u','ų'=>'u', - 'ù'=>'u','ű'=>'u','ů'=>'u','ư'=>'u','ū'=>'u','ǚ'=>'u', - 'ǜ'=>'u','ǔ'=>'u','ǖ'=>'u','ũ'=>'u','ü'=>'ue','в'=>'v', - 'ŵ'=>'w','ы'=>'y','ÿ'=>'y','ý'=>'y','ŷ'=>'y','ź'=>'z', - 'ž'=>'z','з'=>'z','ż'=>'z','ж'=>'zh','ь'=>'','ъ'=>'', - '\''=>'', - ]; - } - - /** - * Return a URL/filesystem-friendly version of string - * @return string - * @param $text string - **/ - function slug($text) { - return trim(strtolower(preg_replace('/([^\pL\pN])+/u','-', - trim(strtr($text,Base::instance()->DIACRITICS+$this->diacritics())))),'-'); - } - - /** - * Return chunk of text from standard Lorem Ipsum passage - * @return string - * @param $count int - * @param $max int - * @param $std bool - **/ - function filler($count=1,$max=20,$std=TRUE) { - $out=''; - if ($std) - $out='Lorem ipsum dolor sit amet, consectetur adipisicing elit, '. - 'sed do eiusmod tempor incididunt ut labore et dolore magna '. - 'aliqua.'; - $rnd=explode(' ', - 'a ab ad accusamus adipisci alias aliquam amet animi aperiam '. - 'architecto asperiores aspernatur assumenda at atque aut beatae '. - 'blanditiis cillum commodi consequatur corporis corrupti culpa '. - 'cum cupiditate debitis delectus deleniti deserunt dicta '. - 'dignissimos distinctio dolor ducimus duis ea eaque earum eius '. - 'eligendi enim eos error esse est eum eveniet ex excepteur '. - 'exercitationem expedita explicabo facere facilis fugiat harum '. - 'hic id illum impedit in incidunt ipsa iste itaque iure iusto '. - 'laborum laudantium libero magnam maiores maxime minim minus '. - 'modi molestiae mollitia nam natus necessitatibus nemo neque '. - 'nesciunt nihil nisi nobis non nostrum nulla numquam occaecati '. - 'odio officia omnis optio pariatur perferendis perspiciatis '. - 'placeat porro possimus praesentium proident quae quia quibus '. - 'quo ratione recusandae reiciendis rem repellat reprehenderit '. - 'repudiandae rerum saepe sapiente sequi similique sint soluta '. - 'suscipit tempora tenetur totam ut ullam unde vel veniam vero '. - 'vitae voluptas'); - for ($i=0,$add=$count-(int)$std;$i<$add;$i++) { - shuffle($rnd); - $words=array_slice($rnd,0,mt_rand(3,$max)); - $out.=(!$std&&$i==0?'':' ').ucfirst(implode(' ',$words)).'.'; - } - return $out; - } - -} - -if (!function_exists('gzdecode')) { - - /** - * Decode gzip-compressed string - * @param $str string - **/ - function gzdecode($str) { - $fw=Base::instance(); - if (!is_dir($tmp=$fw->TEMP)) - mkdir($tmp,Base::MODE,TRUE); - file_put_contents($file=$tmp.'/'.$fw->SEED.'.'. - $fw->hash(uniqid(NULL,TRUE)).'.gz',$str,LOCK_EX); - ob_start(); - readgzfile($file); - $out=ob_get_clean(); - @unlink($file); - return $out; - } - -} diff --git a/app/lib/web/geo.php b/app/lib/web/geo.php deleted file mode 100644 index 80031cf3..00000000 --- a/app/lib/web/geo.php +++ /dev/null @@ -1,111 +0,0 @@ -. - -*/ - -namespace Web; - -//! Geo plug-in -class Geo extends \Prefab { - - /** - * Return information about specified Unix time zone - * @return array - * @param $zone string - **/ - function tzinfo($zone) { - $ref=new \DateTimeZone($zone); - $loc=$ref->getLocation(); - $trn=$ref->getTransitions($now=time(),$now); - $out=[ - 'offset'=>$ref-> - getOffset(new \DateTime('now',new \DateTimeZone('UTC')))/3600, - 'country'=>$loc['country_code'], - 'latitude'=>$loc['latitude'], - 'longitude'=>$loc['longitude'], - 'dst'=>$trn[0]['isdst'] - ]; - unset($ref); - return $out; - } - - /** - * Return geolocation data based on specified/auto-detected IP address - * @return array|FALSE - * @param $ip string - **/ - function location($ip=NULL) { - $fw=\Base::instance(); - $web=\Web::instance(); - if (!$ip) - $ip=$fw->IP; - $public=filter_var($ip,FILTER_VALIDATE_IP, - FILTER_FLAG_IPV4|FILTER_FLAG_IPV6| - FILTER_FLAG_NO_RES_RANGE|FILTER_FLAG_NO_PRIV_RANGE); - if (function_exists('geoip_db_avail') && - geoip_db_avail(GEOIP_CITY_EDITION_REV1) && - $out=@geoip_record_by_name($ip)) { - $out['request']=$ip; - $out['region_code']=$out['region']; - $out['region_name']=''; - if (!empty($out['country_code']) && !empty($out['region'])) - $out['region_name']=geoip_region_name_by_code( - $out['country_code'],$out['region'] - ); - unset($out['country_code3'],$out['region'],$out['postal_code']); - return $out; - } - if (($req=$web->request('http://www.geoplugin.net/json.gp'. - ($public?('?ip='.$ip):''))) && - $data=json_decode($req['body'],TRUE)) { - $out=[]; - foreach ($data as $key=>$val) - if (!strpos($key,'currency') && $key!=='geoplugin_status' - && $key!=='geoplugin_region') - $out[$fw->snakecase(substr($key, 10))]=$val; - return $out; - } - return FALSE; - } - - /** - * Return weather data based on specified latitude/longitude - * @return array|FALSE - * @param $latitude float - * @param $longitude float - * @param $key string - **/ - function weather($latitude,$longitude,$key) { - $fw=\Base::instance(); - $web=\Web::instance(); - $query=[ - 'lat'=>$latitude, - 'lon'=>$longitude, - 'APPID'=>$key, - 'units'=>'metric' - ]; - return ($req=$web->request( - 'http://api.openweathermap.org/data/2.5/weather?'. - http_build_query($query)))? - json_decode($req['body'],TRUE): - FALSE; - } - -} diff --git a/app/lib/web/google/recaptcha.php b/app/lib/web/google/recaptcha.php deleted file mode 100644 index 9c32979c..00000000 --- a/app/lib/web/google/recaptcha.php +++ /dev/null @@ -1,58 +0,0 @@ -. - -*/ - -namespace Web\Google; - -//! Google ReCAPTCHA v2 plug-in -class Recaptcha { - - const - //! API URL - URL_Recaptcha='https://www.google.com/recaptcha/api/siteverify'; - - /** - * Verify reCAPTCHA response - * @param string $secret - * @param string $response - * @return bool - **/ - static function verify($secret,$response=NULL) { - $fw=\Base::instance(); - if (!isset($response)) - $response=$fw->{'POST.g-recaptcha-response'}; - if (!$response) - return FALSE; - $web=\Web::instance(); - $out=$web->request(self::URL_Recaptcha,[ - 'method'=>'POST', - 'content'=>http_build_query([ - 'secret'=>$secret, - 'response'=>$response, - 'remoteip'=>$fw->IP - ]), - ]); - return isset($out['body']) && - ($json=json_decode($out['body'],TRUE)) && - isset($json['success']) && $json['success']; - } - -} diff --git a/app/lib/web/google/staticmap.php b/app/lib/web/google/staticmap.php deleted file mode 100644 index 8310fe4c..00000000 --- a/app/lib/web/google/staticmap.php +++ /dev/null @@ -1,65 +0,0 @@ -. - -*/ - -namespace Web\Google; - -//! Google Static Maps API v2 plug-in -class StaticMap { - - const - //! API URL - URL_Static='http://maps.googleapis.com/maps/api/staticmap'; - - protected - //! Query arguments - $query=array(); - - /** - * Specify API key-value pair via magic call - * @return object - * @param $func string - * @param $args array - **/ - function __call($func,array $args) { - $this->query[]=array($func,$args[0]); - return $this; - } - - /** - * Generate map - * @return string - **/ - function dump() { - $fw=\Base::instance(); - $web=\Web::instance(); - $out=''; - return ($req=$web->request( - self::URL_Static.'?'.array_reduce( - $this->query, - function($out,$item) { - return ($out.=($out?'&':''). - urlencode($item[0]).'='.urlencode($item[1])); - } - ))) && $req['body']?$req['body']:FALSE; - } - -} diff --git a/app/lib/web/oauth2.php b/app/lib/web/oauth2.php deleted file mode 100644 index fd9acf9f..00000000 --- a/app/lib/web/oauth2.php +++ /dev/null @@ -1,152 +0,0 @@ -. - -*/ - -namespace Web; - -//! Lightweight OAuth2 client -class OAuth2 extends \Magic { - - protected - //! Scopes and claims - $args=[]; - - /** - * Return OAuth2 authentication URI - * @return string - * @param $endpoint string - * @param $query bool - **/ - function uri($endpoint,$query=TRUE) { - return $endpoint.($query?('?'.http_build_query($this->args)):''); - } - - /** - * Send request to API/token endpoint - * @return string|FALSE - * @param $uri string - * @param $method string - * @param $token array - **/ - function request($uri,$method,$token=NULL) { - $web=\Web::instance(); - $options=[ - 'method'=>$method, - 'content'=>http_build_query($this->args), - 'header'=>['Accept: application/json'] - ]; - if ($token) - array_push($options['header'],'Authorization: Bearer '.$token); - elseif ($method=='POST' && isset($this->args['client_id'])) - array_push($options['header'],'Authorization: Basic '. - base64_encode( - $this->args['client_id'].':'. - $this->args['client_secret'] - ) - ); - $response=$web->request($uri,$options); - if ($response['error']) - user_error($response['error'],E_USER_ERROR); - if (isset($response['body'])) { - if (preg_grep('/^Content-Type:.*application\/json/i', - $response['headers'])) { - $token=json_decode($response['body'],TRUE); - if (isset($token['error_description'])) - user_error($token['error_description'],E_USER_ERROR); - if (isset($token['error'])) - user_error($token['error'],E_USER_ERROR); - return $token; - } - else - return $response['body']; - } - return FALSE; - } - - /** - * Parse JSON Web token - * @return array - * @param $token string - **/ - function jwt($token) { - return json_decode( - base64_decode( - str_replace(['-','_'],['+','/'],explode('.',$token)[1]) - ), - TRUE - ); - } - - /** - * URL-safe base64 encoding - * @return array - * @param $data string - **/ - function b64url($data) { - return trim(strtr(base64_encode($data),'+/','-_'),'='); - } - - /** - * Return TRUE if scope/claim exists - * @return bool - * @param $key string - **/ - function exists($key) { - return isset($this->args[$key]); - } - - /** - * Bind value to scope/claim - * @return string - * @param $key string - * @param $val string - **/ - function set($key,$val) { - return $this->args[$key]=$val; - } - - /** - * Return value of scope/claim - * @return mixed - * @param $key string - **/ - function &get($key) { - if (isset($this->args[$key])) - $val=&$this->args[$key]; - else - $val=NULL; - return $val; - } - - /** - * Remove scope/claim - * @return NULL - * @param $key string - **/ - function clear($key=NULL) { - if ($key) - unset($this->args[$key]); - else - $this->args=[]; - } - -} - diff --git a/app/lib/web/openid.php b/app/lib/web/openid.php deleted file mode 100644 index 435d89ca..00000000 --- a/app/lib/web/openid.php +++ /dev/null @@ -1,248 +0,0 @@ -. - -*/ - -namespace Web; - -//! OpenID consumer -class OpenID extends \Magic { - - protected - //! OpenID provider endpoint URL - $url, - //! HTTP request parameters - $args=[]; - - /** - * Determine OpenID provider - * @return string|FALSE - * @param $proxy string - **/ - protected function discover($proxy) { - // Normalize - if (!preg_match('/https?:\/\//i',$this->args['endpoint'])) - $this->args['endpoint']='http://'.$this->args['endpoint']; - $url=parse_url($this->args['endpoint']); - // Remove fragment; reconnect parts - $this->args['endpoint']=$url['scheme'].'://'. - (isset($url['user'])? - ($url['user']. - (isset($url['pass'])?(':'.$url['pass']):'').'@'):''). - strtolower($url['host']).(isset($url['path'])?$url['path']:'/'). - (isset($url['query'])?('?'.$url['query']):''); - // HTML-based discovery of OpenID provider - $req=\Web::instance()-> - request($this->args['endpoint'],['proxy'=>$proxy]); - if (!$req) - return FALSE; - $type=array_values(preg_grep('/Content-Type:/',$req['headers'])); - if ($type && - preg_match('/application\/xrds\+xml|text\/xml/',$type[0]) && - ($sxml=simplexml_load_string($req['body'])) && - ($xrds=json_decode(json_encode($sxml),TRUE)) && - isset($xrds['XRD'])) { - // XRDS document - $svc=$xrds['XRD']['Service']; - if (isset($svc[0])) - $svc=$svc[0]; - $svc_type=is_array($svc['Type'])?$svc['Type']:array($svc['Type']); - if (preg_grep('/http:\/\/specs\.openid\.net\/auth\/2.0\/'. - '(?:server|signon)/',$svc_type)) { - $this->args['provider']=$svc['URI']; - if (isset($svc['LocalID'])) - $this->args['localidentity']=$svc['LocalID']; - elseif (isset($svc['CanonicalID'])) - $this->args['localidentity']=$svc['CanonicalID']; - } - $this->args['server']=$svc['URI']; - if (isset($svc['Delegate'])) - $this->args['delegate']=$svc['Delegate']; - } - else { - $len=strlen($req['body']); - $ptr=0; - // Parse document - while ($ptr<$len) - if (preg_match( - '/^/is', - substr($req['body'],$ptr),$parts)) { - if ($parts[1] && - // Process attributes - preg_match_all('/\b(rel|href)\h*=\h*'. - '(?:"(.+?)"|\'(.+?)\')/s',$parts[1],$attr, - PREG_SET_ORDER)) { - $node=[]; - foreach ($attr as $kv) - $node[$kv[1]]=isset($kv[2])?$kv[2]:$kv[3]; - if (isset($node['rel']) && - preg_match('/openid2?\.(\w+)/', - $node['rel'],$var) && - isset($node['href'])) - $this->args[$var[1]]=$node['href']; - - } - $ptr+=strlen($parts[0]); - } - else - $ptr++; - } - // Get OpenID provider's endpoint URL - if (isset($this->args['provider'])) { - // OpenID 2.0 - $this->args['ns']='http://specs.openid.net/auth/2.0'; - if (isset($this->args['localidentity'])) - $this->args['identity']=$this->args['localidentity']; - if (isset($this->args['trust_root'])) - $this->args['realm']=$this->args['trust_root']; - } - elseif (isset($this->args['server'])) { - // OpenID 1.1 - $this->args['ns']='http://openid.net/signon/1.1'; - if (isset($this->args['delegate'])) - $this->args['identity']=$this->args['delegate']; - } - if (isset($this->args['provider'])) { - // OpenID 2.0 - if (empty($this->args['claimed_id'])) - $this->args['claimed_id']=$this->args['identity']; - return $this->args['provider']; - } - elseif (isset($this->args['server'])) - // OpenID 1.1 - return $this->args['server']; - else - return FALSE; - } - - /** - * Initiate OpenID authentication sequence; Return FALSE on failure - * or redirect to OpenID provider URL - * @return bool - * @param $proxy string - * @param $attr array - * @param $reqd string|array - **/ - function auth($proxy=NULL,$attr=[],array $reqd=NULL) { - $fw=\Base::instance(); - $root=$fw->SCHEME.'://'.$fw->HOST; - if (empty($this->args['trust_root'])) - $this->args['trust_root']=$root.$fw->BASE.'/'; - if (empty($this->args['return_to'])) - $this->args['return_to']=$root.$_SERVER['REQUEST_URI']; - $this->args['mode']='checkid_setup'; - if ($this->url=$this->discover($proxy)) { - if ($attr) { - $this->args['ns.ax']='http://openid.net/srv/ax/1.0'; - $this->args['ax.mode']='fetch_request'; - foreach ($attr as $key=>$val) - $this->args['ax.type.'.$key]=$val; - $this->args['ax.required']=is_string($reqd)? - $reqd:implode(',',$reqd); - } - $var=[]; - foreach ($this->args as $key=>$val) - $var['openid.'.$key]=$val; - $fw->reroute($this->url.'?'.http_build_query($var)); - } - return FALSE; - } - - /** - * Return TRUE if OpenID verification was successful - * @return bool - * @param $proxy string - **/ - function verified($proxy=NULL) { - preg_match_all('/(?<=^|&)openid\.([^=]+)=([^&]+)/', - $_SERVER['QUERY_STRING'],$matches,PREG_SET_ORDER); - foreach ($matches as $match) - $this->args[$match[1]]=urldecode($match[2]); - if (isset($this->args['mode']) && - $this->args['mode']!='error' && - $this->url=$this->discover($proxy)) { - $this->args['mode']='check_authentication'; - $var=[]; - foreach ($this->args as $key=>$val) - $var['openid.'.$key]=$val; - $req=\Web::instance()->request( - $this->url, - [ - 'method'=>'POST', - 'content'=>http_build_query($var), - 'proxy'=>$proxy - ] - ); - return (bool)preg_match('/is_valid:true/i',$req['body']); - } - return FALSE; - } - - /** - * Return OpenID response fields - * @return array - **/ - function response() { - return $this->args; - } - - /** - * Return TRUE if OpenID request parameter exists - * @return bool - * @param $key string - **/ - function exists($key) { - return isset($this->args[$key]); - } - - /** - * Bind value to OpenID request parameter - * @return string - * @param $key string - * @param $val string - **/ - function set($key,$val) { - return $this->args[$key]=$val; - } - - /** - * Return value of OpenID request parameter - * @return mixed - * @param $key string - **/ - function &get($key) { - if (isset($this->args[$key])) - $val=&$this->args[$key]; - else - $val=NULL; - return $val; - } - - /** - * Remove OpenID request parameter - * @return NULL - * @param $key - **/ - function clear($key) { - unset($this->args[$key]); - } - -} diff --git a/app/lib/web/pingback.php b/app/lib/web/pingback.php deleted file mode 100644 index a68430ca..00000000 --- a/app/lib/web/pingback.php +++ /dev/null @@ -1,176 +0,0 @@ -. - -*/ - -namespace Web; - -//! Pingback 1.0 protocol (client and server) implementation -class Pingback extends \Prefab { - - protected - //! Transaction history - $log; - - /** - * Return TRUE if URL points to a pingback-enabled resource - * @return bool - * @param $url - **/ - protected function enabled($url) { - $web=\Web::instance(); - $req=$web->request($url); - $found=FALSE; - if ($req['body']) { - // Look for pingback header - foreach ($req['headers'] as $header) - if (preg_match('/^X-Pingback:\h*(.+)/',$header,$href)) { - $found=$href[1]; - break; - } - if (!$found && - // Scan page for pingback link tag - preg_match('//i',$req['body'],$parts) && - preg_match('/rel\h*=\h*"pingback"/i',$parts[1]) && - preg_match('/href\h*=\h*"\h*(.+?)\h*"/i',$parts[1],$href)) - $found=$href[1]; - } - return $found; - } - - /** - * Load local page contents, parse HTML anchor tags, find permalinks, - * and send XML-RPC calls to corresponding pingback servers - * @return NULL - * @param $source string - **/ - function inspect($source) { - $fw=\Base::instance(); - $web=\Web::instance(); - $parts=parse_url($source); - if (empty($parts['scheme']) || empty($parts['host']) || - $parts['host']==$fw->HOST) { - $req=$web->request($source); - $doc=new \DOMDocument('1.0',$fw->ENCODING); - $doc->stricterrorchecking=FALSE; - $doc->recover=TRUE; - if (@$doc->loadhtml($req['body'])) { - // Parse anchor tags - $links=$doc->getelementsbytagname('a'); - foreach ($links as $link) { - $permalink=$link->getattribute('href'); - // Find pingback-enabled resources - if ($permalink && $found=$this->enabled($permalink)) { - $req=$web->request($found, - [ - 'method'=>'POST', - 'header'=>'Content-Type: application/xml', - 'content'=>xmlrpc_encode_request( - 'pingback.ping', - [$source,$permalink], - ['encoding'=>$fw->ENCODING] - ) - ] - ); - if ($req['body']) - $this->log.=date('r').' '. - $permalink.' [permalink:'.$found.']'.PHP_EOL. - $req['body'].PHP_EOL; - } - } - } - unset($doc); - } - } - - /** - * Receive ping, check if local page is pingback-enabled, verify - * source contents, and return XML-RPC response - * @return string - * @param $func callback - * @param $path string - **/ - function listen($func,$path=NULL) { - $fw=\Base::instance(); - if (PHP_SAPI!='cli') { - header('X-Powered-By: '.$fw->PACKAGE); - header('Content-Type: application/xml; '. - 'charset='.$charset=$fw->ENCODING); - } - if (!$path) - $path=$fw->BASE; - $web=\Web::instance(); - $args=xmlrpc_decode_request($fw->BODY,$method,$charset); - $options=['encoding'=>$charset]; - if ($method=='pingback.ping' && isset($args[0],$args[1])) { - list($source,$permalink)=$args; - $doc=new \DOMDocument('1.0',$fw->ENCODING); - // Check local page if pingback-enabled - $parts=parse_url($permalink); - if ((empty($parts['scheme']) || - $parts['host']==$fw->HOST) && - preg_match('/^'.preg_quote($path,'/').'/'. - ($fw->CASELESS?'i':''),$parts['path']) && - $this->enabled($permalink)) { - // Check source - $parts=parse_url($source); - if ((empty($parts['scheme']) || - $parts['host']==$fw->HOST) && - ($req=$web->request($source)) && - $doc->loadhtml($req['body'])) { - $links=$doc->getelementsbytagname('a'); - foreach ($links as $link) { - if ($link->getattribute('href')==$permalink) { - call_user_func_array($func,[$source,$req['body']]); - // Success - die(xmlrpc_encode_request(NULL,$source,$options)); - } - } - // No link to local page - die(xmlrpc_encode_request(NULL,0x11,$options)); - } - // Source failure - die(xmlrpc_encode_request(NULL,0x10,$options)); - } - // Doesn't exist (or not pingback-enabled) - die(xmlrpc_encode_request(NULL,0x21,$options)); - } - // Access denied - die(xmlrpc_encode_request(NULL,0x31,$options)); - } - - /** - * Return transaction history - * @return string - **/ - function log() { - return $this->log; - } - - /** - * Instantiate class - * @return object - **/ - function __construct() { - // Suppress errors caused by invalid HTML structures - libxml_use_internal_errors(TRUE); - } - -} diff --git a/app/main/lib/logging/LogInterface.php b/app/main/lib/logging/LogInterface.php deleted file mode 100644 index 00d50c0b..00000000 --- a/app/main/lib/logging/LogInterface.php +++ /dev/null @@ -1,67 +0,0 @@ -init +GET @setup: /setup [sync] = {{ @NAMESPACE }}\Controller\Setup->init ; login (index) page -GET @login: / [sync] = Controller\AppController->init +GET @login: / [sync] = {{ @NAMESPACE }}\Controller\AppController->init ; CCP SSO redirect -GET @sso: /sso/@action [sync] = Controller\Ccp\Sso->@action +GET @sso: /sso/@action [sync] = {{ @NAMESPACE }}\Controller\Ccp\Sso->@action ; map page -GET @map: /map* [sync] = Controller\MapController->init +GET @map: /map* [sync] = {{ @NAMESPACE }}\Controller\MapController->init ; admin panel -GET @admin: /admin* [sync] = Controller\Admin->dispatch +GET @admin: /admin* [sync] = {{ @NAMESPACE }}\Controller\Admin->dispatch ; AJAX API wildcard endpoints (not cached, throttled) -GET|POST /api/@controller/@action [ajax] = Controller\Api\@controller->@action, 0, 512 -GET|POST /api/@controller/@action/@arg1 [ajax] = Controller\Api\@controller->@action, 0, 512 -GET|POST /api/@controller/@action/@arg1/@arg2 [ajax] = Controller\Api\@controller->@action, 0, 512 +GET|POST /api/@controller/@action [ajax] = {{ @NAMESPACE }}\Controller\Api\@controller->@action, 0, 512 +GET|POST /api/@controller/@action/@arg1 [ajax] = {{ @NAMESPACE }}\Controller\Api\@controller->@action, 0, 512 +GET|POST /api/@controller/@action/@arg1/@arg2 [ajax] = {{ @NAMESPACE }}\Controller\Api\@controller->@action, 0, 512 ; onUnload route or final map sync (@see https://developer.mozilla.org/docs/Web/API/Navigator/sendBeacon) -POST /api/map/updateUnloadData = Controller\Api\map->updateUnloadData, 0, 512 +POST /api/Map/updateUnloadData = {{ @NAMESPACE }}\Controller\Api\Map->updateUnloadData, 0, 512 [maps] ; REST API wildcard endpoints (not cached, throttled) -/api/rest/@controller* [ajax] = Controller\Api\Rest\@controller, 0, 512 -/api/rest/@controller/@id [ajax] = Controller\Api\Rest\@controller, 0, 512 \ No newline at end of file +/api/rest/@controller* [ajax] = {{ @NAMESPACE }}\Controller\Api\Rest\@controller, 0, 512 +/api/rest/@controller/@id [ajax] = {{ @NAMESPACE }}\Controller\Api\Rest\@controller, 0, 512 \ No newline at end of file diff --git a/composer-dev.json b/composer-dev.json index 8a3b377f..933df363 100644 --- a/composer-dev.json +++ b/composer-dev.json @@ -1,6 +1,8 @@ { "name": "exodus4d/pathfinder", "description": "Mapping tool for EVE ONLINE", + "type": "project", + "homepage": "https://github.com/exodus4d/pathfinder", "minimum-stability": "stable", "license": "MIT", "authors": [ @@ -9,35 +11,45 @@ "email": "pathfinder@exodus4d.de" } ], + "config": { + "optimize-autoloader": true, + "lock": false + }, "autoload": { "psr-4": { - "Exodus4D\\Pathfinder\\": "app/main" + "Exodus4D\\Pathfinder\\": "app/" } }, "repositories": [ { "type": "vcs", "url": "../pathfinder_esi" - }], + } + ], "require": { - "php-64bit": ">=7.1", + "php-64bit": ">=7.2", "ext-pdo": "*", "ext-openssl": "*", "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", "ext-ctype": "*", - "monolog/monolog": "1.*", - "swiftmailer/swiftmailer": "^6.0", - "league/html-to-markdown": "4.8.*", + "ext-gd": "*", + "bcosca/fatfree-core": "3.7.*", + "ikkez/f3-cortex": "dev-master#0d7754a5897a639e563add6b8d6db53fc0fae677", + "ikkez/f3-sheet": "0.4.*", + "xfra35/f3-cron": "1.2.*", + "monolog/monolog": "2.*", + "swiftmailer/swiftmailer": "6.2.*", + "league/html-to-markdown": "4.9.*", "cache/redis-adapter": "1.0.*", "cache/filesystem-adapter": "1.0.*", "cache/array-adapter": "1.0.*", "cache/void-adapter": "1.0.*", "cache/namespaced-cache": "1.0.*", - "react/socket": "1.2.*", - "react/promise-stream": "1.1.*", - "clue/ndjson-react": "1.0.*", + "react/socket": "1.3.*", + "react/promise-stream": "1.2.*", + "clue/ndjson-react": "1.1.*", "exodus4d/pathfinder_esi": "dev-develop as 0.0.x-dev" }, "suggest": { diff --git a/composer.json b/composer.json index 40fa6e9b..7ee9b2a3 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,8 @@ { "name": "exodus4d/pathfinder", "description": "Mapping tool for EVE ONLINE", + "type": "project", + "homepage": "https://github.com/exodus4d/pathfinder", "minimum-stability": "stable", "license": "MIT", "authors": [ @@ -9,36 +11,40 @@ "email": "pathfinder@exodus4d.de" } ], + "config": { + "optimize-autoloader": true, + "lock": true + }, "autoload": { "psr-4": { - "Exodus4D\\Pathfinder\\": "app/main" + "Exodus4D\\Pathfinder\\": "app/" } }, - "repositories": [ - { - "type": "vcs", - "url": "https://github.com/exodus4d/pathfinder_esi" - }], "require": { - "php-64bit": ">=7.1", + "php-64bit": ">=7.2", "ext-pdo": "*", "ext-openssl": "*", "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", "ext-ctype": "*", - "monolog/monolog": "1.*", - "swiftmailer/swiftmailer": "^6.0", - "league/html-to-markdown": "4.8.*", + "ext-gd": "*", + "bcosca/fatfree-core": "3.7.*", + "ikkez/f3-cortex": "dev-master#0d7754a5897a639e563add6b8d6db53fc0fae677", + "ikkez/f3-sheet": "0.4.*", + "xfra35/f3-cron": "1.2.*", + "monolog/monolog": "2.*", + "swiftmailer/swiftmailer": "6.2.*", + "league/html-to-markdown": "4.9.*", "cache/redis-adapter": "1.0.*", "cache/filesystem-adapter": "1.0.*", "cache/array-adapter": "1.0.*", "cache/void-adapter": "1.0.*", "cache/namespaced-cache": "1.0.*", - "react/socket": "1.2.*", - "react/promise-stream": "1.1.*", - "clue/ndjson-react": "1.0.*", - "exodus4d/pathfinder_esi": "v1.3.2" + "react/socket": "1.3.*", + "react/promise-stream": "1.2.*", + "clue/ndjson-react": "1.1.*", + "exodus4d/pathfinder_esi": "2.0.1" }, "suggest": { "ext-redis": "Redis can be used as cache backend." diff --git a/composer.lock b/composer.lock index 7c1b92cf..5c6d038b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,39 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "cd6689b64084cbe1bdbf74b1165fd472", + "content-hash": "335a3680cd2d074fd048b76d16a6f4d2", "packages": [ + { + "name": "bcosca/fatfree-core", + "version": "3.7.1", + "source": { + "type": "git", + "url": "https://github.com/bcosca/fatfree-core.git", + "reference": "64318caa00de4da0f558d2334dc70538bdbcd1ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bcosca/fatfree-core/zipball/64318caa00de4da0f558d2334dc70538bdbcd1ad", + "reference": "64318caa00de4da0f558d2334dc70538bdbcd1ad", + "shasum": "" + }, + "require": { + "php": ">=5.4" + }, + "type": "library", + "autoload": { + "classmap": [ + "." + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0" + ], + "description": "A powerful yet easy-to-use PHP micro-framework designed to help you build dynamic and robust Web applications - fast!", + "homepage": "http://fatfreeframework.com/", + "time": "2019-12-30T20:49:06+00:00" + }, { "name": "cache/adapter-common", "version": "1.1.0", @@ -520,26 +551,26 @@ }, { "name": "caseyamcl/guzzle_retry_middleware", - "version": "v2.2", + "version": "v2.3.2", "source": { "type": "git", "url": "https://github.com/caseyamcl/guzzle_retry_middleware.git", - "reference": "6f4b6950d5f6f848c847bd516a9f4ceeb4332287" + "reference": "e591e4b4b7cd0644716cd83e5f9fcf78c26f4aa2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/caseyamcl/guzzle_retry_middleware/zipball/6f4b6950d5f6f848c847bd516a9f4ceeb4332287", - "reference": "6f4b6950d5f6f848c847bd516a9f4ceeb4332287", + "url": "https://api.github.com/repos/caseyamcl/guzzle_retry_middleware/zipball/e591e4b4b7cd0644716cd83e5f9fcf78c26f4aa2", + "reference": "e591e4b4b7cd0644716cd83e5f9fcf78c26f4aa2", "shasum": "" }, "require": { - "guzzlehttp/guzzle": "^6.3", - "php": "~5.5|~7.0" + "guzzlehttp/guzzle": "^6.3 || ^7.0", + "php": "^7.1" }, "require-dev": { - "nesbot/carbon": "~1.22", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", - "squizlabs/php_codesniffer": "^2.3" + "nesbot/carbon": "^2.0", + "phpunit/phpunit": "^7.0", + "squizlabs/php_codesniffer": "^3.5" }, "type": "library", "extra": { @@ -575,20 +606,20 @@ "retry", "retry-after" ], - "time": "2018-06-06T18:20:12+00:00" + "time": "2020-01-27T17:11:00+00:00" }, { "name": "clue/ndjson-react", - "version": "v1.0.0", + "version": "v1.1.0", "source": { "type": "git", "url": "https://github.com/clue/reactphp-ndjson.git", - "reference": "c41a30e7f888dc0e4af18881b2c9ab260ba8d6ce" + "reference": "767ec9543945802b5766fab0da4520bf20626f66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/c41a30e7f888dc0e4af18881b2c9ab260ba8d6ce", - "reference": "c41a30e7f888dc0e4af18881b2c9ab260ba8d6ce", + "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/767ec9543945802b5766fab0da4520bf20626f66", + "reference": "767ec9543945802b5766fab0da4520bf20626f66", "shasum": "" }, "require": { @@ -596,7 +627,7 @@ "react/stream": "^1.0 || ^0.7 || ^0.6" }, "require-dev": { - "phpunit/phpunit": "^6.0 || ^5.7 || ^4.8.35", + "phpunit/phpunit": "^7.0 || ^6.0 || ^5.7 || ^4.8.35", "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3" }, "type": "library", @@ -612,7 +643,7 @@ "authors": [ { "name": "Christian Lück", - "email": "christian@lueck.tv" + "email": "christian@clue.engineering" } ], "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.", @@ -625,20 +656,20 @@ "reactphp", "streaming" ], - "time": "2018-05-17T15:31:04+00:00" + "time": "2020-02-04T11:48:52+00:00" }, { "name": "doctrine/lexer", - "version": "1.1.0", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/lexer.git", - "reference": "e17f069ede36f7534b95adec71910ed1b49c74ea" + "reference": "5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/lexer/zipball/e17f069ede36f7534b95adec71910ed1b49c74ea", - "reference": "e17f069ede36f7534b95adec71910ed1b49c74ea", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6", + "reference": "5242d66dbeb21a30dd8a3e66bf7a73b66e05e1f6", "shasum": "" }, "require": { @@ -652,7 +683,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { @@ -687,31 +718,31 @@ "parser", "php" ], - "time": "2019-07-30T19:33:28+00:00" + "time": "2019-10-30T14:39:59+00:00" }, { "name": "egulias/email-validator", - "version": "2.1.11", + "version": "2.1.17", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "92dd169c32f6f55ba570c309d83f5209cefb5e23" + "reference": "ade6887fd9bd74177769645ab5c474824f8a418a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/92dd169c32f6f55ba570c309d83f5209cefb5e23", - "reference": "92dd169c32f6f55ba570c309d83f5209cefb5e23", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ade6887fd9bd74177769645ab5c474824f8a418a", + "reference": "ade6887fd9bd74177769645ab5c474824f8a418a", "shasum": "" }, "require": { "doctrine/lexer": "^1.0.1", - "php": ">= 5.5" + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.10" }, "require-dev": { - "dominicsayers/isemail": "dev-master", - "phpunit/phpunit": "^4.8.35||^5.7||^6.0", - "satooshi/php-coveralls": "^1.0.1", - "symfony/phpunit-bridge": "^4.4@dev" + "dominicsayers/isemail": "^3.0.7", + "phpunit/phpunit": "^4.8.36|^7.5.15", + "satooshi/php-coveralls": "^1.0.1" }, "suggest": { "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" @@ -745,7 +776,7 @@ "validation", "validator" ], - "time": "2019-08-13T17:33:27+00:00" + "time": "2020-02-13T22:36:52+00:00" }, { "name": "evenement/evenement", @@ -792,23 +823,24 @@ }, { "name": "exodus4d/pathfinder_esi", - "version": "v1.3.2", + "version": "v2.0.1", "source": { "type": "git", "url": "https://github.com/exodus4d/pathfinder_esi.git", - "reference": "7eecfe27bb15fab5142aceeee30e07355d660773" + "reference": "3fbd58eaa86c472f91b8c3a0fdb029d9fd903525" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/exodus4d/pathfinder_esi/zipball/7eecfe27bb15fab5142aceeee30e07355d660773", - "reference": "7eecfe27bb15fab5142aceeee30e07355d660773", + "url": "https://api.github.com/repos/exodus4d/pathfinder_esi/zipball/3fbd58eaa86c472f91b8c3a0fdb029d9fd903525", + "reference": "3fbd58eaa86c472f91b8c3a0fdb029d9fd903525", "shasum": "" }, "require": { "cache/void-adapter": "1.0.*", - "caseyamcl/guzzle_retry_middleware": "2.2.*", - "guzzlehttp/guzzle": "6.3.*", - "php-64bit": ">=7.1" + "caseyamcl/guzzle_retry_middleware": "2.3.*", + "ext-json": "*", + "guzzlehttp/guzzle": "6.5.*", + "php-64bit": ">=7.2" }, "type": "library", "autoload": { @@ -816,6 +848,7 @@ "Exodus4D\\ESI\\": "app/" } }, + "notification-url": "https://packagist.org/downloads/", "license": [ "MIT" ], @@ -826,51 +859,51 @@ } ], "description": "ESI API library for Pathfinder", - "support": { - "source": "https://github.com/exodus4d/pathfinder_esi/tree/v1.3.2" - }, - "time": "2019-10-08T10:20:37+00:00" + "homepage": "https://github.com/exodus4d/pathfinder_esi", + "time": "2020-03-22T14:23:42+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "6.3.3", + "version": "6.5.2", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" + "reference": "43ece0e75098b7ecd8d13918293029e555a50f82" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", - "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/43ece0e75098b7ecd8d13918293029e555a50f82", + "reference": "43ece0e75098b7ecd8d13918293029e555a50f82", "shasum": "" }, "require": { + "ext-json": "*", "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.4", + "guzzlehttp/psr7": "^1.6.1", "php": ">=5.5" }, "require-dev": { "ext-curl": "*", "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", - "psr/log": "^1.0" + "psr/log": "^1.1" }, "suggest": { + "ext-intl": "Required for Internationalized Domain Name (IDN) support", "psr/log": "Required for using the Log middleware" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "6.3-dev" + "dev-master": "6.5-dev" } }, "autoload": { - "files": [ - "src/functions_include.php" - ], "psr-4": { "GuzzleHttp\\": "src/" - } + }, + "files": [ + "src/functions_include.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -894,7 +927,7 @@ "rest", "web service" ], - "time": "2018-04-22T15:46:56+00:00" + "time": "2019-12-23T11:57:10+00:00" }, { "name": "guzzlehttp/promises", @@ -1019,17 +1052,127 @@ "time": "2019-07-01T23:21:34+00:00" }, { - "name": "league/flysystem", - "version": "1.0.55", + "name": "ikkez/f3-cortex", + "version": "dev-master", "source": { "type": "git", - "url": "https://github.com/thephpleague/flysystem.git", - "reference": "33c91155537c6dc899eacdc54a13ac6303f156e6" + "url": "https://github.com/ikkez/f3-cortex.git", + "reference": "0d7754a5897a639e563add6b8d6db53fc0fae677" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/33c91155537c6dc899eacdc54a13ac6303f156e6", - "reference": "33c91155537c6dc899eacdc54a13ac6303f156e6", + "url": "https://api.github.com/repos/ikkez/f3-cortex/zipball/0d7754a5897a639e563add6b8d6db53fc0fae677", + "reference": "0d7754a5897a639e563add6b8d6db53fc0fae677", + "shasum": "" + }, + "require": { + "ikkez/f3-schema-builder": "2.*" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0" + ], + "description": "A multi-engine ORM / ODM for the PHP Fat-Free Framework", + "homepage": "https://github.com/ikkez/f3-cortex", + "keywords": [ + "F3", + "fatfree", + "mongo", + "orm", + "sql" + ], + "time": "2019-10-29T12:10:01+00:00" + }, + { + "name": "ikkez/f3-schema-builder", + "version": "v2.2.4", + "source": { + "type": "git", + "url": "https://github.com/ikkez/f3-schema-builder.git", + "reference": "89281f27056dc41adb6fba3f9d6eaf5dc6f81739" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ikkez/f3-schema-builder/zipball/89281f27056dc41adb6fba3f9d6eaf5dc6f81739", + "reference": "89281f27056dc41adb6fba3f9d6eaf5dc6f81739", + "shasum": "" + }, + "require": { + "bcosca/fatfree-core": "^3.6" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0" + ], + "description": "SQL Schema Builder Plugin for PHP Fat-Free Framework", + "homepage": "https://github.com/ikkez/f3-schema-builder", + "keywords": [ + "F3", + "fatfree", + "sql" + ], + "time": "2019-11-25T17:04:32+00:00" + }, + { + "name": "ikkez/f3-sheet", + "version": "v0.4.1", + "source": { + "type": "git", + "url": "https://github.com/ikkez/f3-sheet.git", + "reference": "5191e4b8b30dc860d36ce58ef19e7063304f09a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ikkez/f3-sheet/zipball/5191e4b8b30dc860d36ce58ef19e7063304f09a2", + "reference": "5191e4b8b30dc860d36ce58ef19e7063304f09a2", + "shasum": "" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0" + ], + "description": "Some Excel and CSV utilities for PHP Fat-Free Framework", + "homepage": "https://github.com/ikkez/f3-sheet", + "keywords": [ + "F3", + "csv", + "excel", + "export", + "fatfree", + "xls" + ], + "time": "2017-08-11T09:40:18+00:00" + }, + { + "name": "league/flysystem", + "version": "1.0.66", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "021569195e15f8209b1c4bebb78bd66aa4f08c21" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/021569195e15f8209b1c4bebb78bd66aa4f08c21", + "reference": "021569195e15f8209b1c4bebb78bd66aa4f08c21", "shasum": "" }, "require": { @@ -1041,7 +1184,7 @@ }, "require-dev": { "phpspec/phpspec": "^3.4", - "phpunit/phpunit": "^5.7.10" + "phpunit/phpunit": "^5.7.26" }, "suggest": { "ext-fileinfo": "Required for MimeType", @@ -1100,20 +1243,20 @@ "sftp", "storage" ], - "time": "2019-08-24T11:17:19+00:00" + "time": "2020-03-17T18:58:12+00:00" }, { "name": "league/html-to-markdown", - "version": "4.8.2", + "version": "4.9.1", "source": { "type": "git", "url": "https://github.com/thephpleague/html-to-markdown.git", - "reference": "e747489191f8e9144a7270eb61f8b9516e99e413" + "reference": "1dcd0f85de786f46a7f224a27cc3d709ddd2a68c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/e747489191f8e9144a7270eb61f8b9516e99e413", - "reference": "e747489191f8e9144a7270eb61f8b9516e99e413", + "url": "https://api.github.com/repos/thephpleague/html-to-markdown/zipball/1dcd0f85de786f46a7f224a27cc3d709ddd2a68c", + "reference": "1dcd0f85de786f46a7f224a27cc3d709ddd2a68c", "shasum": "" }, "require": { @@ -1123,7 +1266,7 @@ }, "require-dev": { "mikehaertl/php-shellcommand": "~1.1.0", - "phpunit/phpunit": "4.*", + "phpunit/phpunit": "^4.8|^5.7", "scrutinizer/ocular": "~1.1" }, "bin": [ @@ -1132,7 +1275,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.9-dev" + "dev-master": "4.10-dev" } }, "autoload": { @@ -1164,25 +1307,25 @@ "html", "markdown" ], - "time": "2019-08-02T11:57:39+00:00" + "time": "2019-12-28T01:32:28+00:00" }, { "name": "monolog/monolog", - "version": "1.25.1", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "70e65a5470a42cfec1a7da00d30edb6e617e8dcf" + "reference": "c861fcba2ca29404dc9e617eedd9eff4616986b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/70e65a5470a42cfec1a7da00d30edb6e617e8dcf", - "reference": "70e65a5470a42cfec1a7da00d30edb6e617e8dcf", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c861fcba2ca29404dc9e617eedd9eff4616986b8", + "reference": "c861fcba2ca29404dc9e617eedd9eff4616986b8", "shasum": "" }, "require": { - "php": ">=5.3.0", - "psr/log": "~1.0" + "php": "^7.2", + "psr/log": "^1.0.1" }, "provide": { "psr/log-implementation": "1.0.0" @@ -1190,33 +1333,36 @@ "require-dev": { "aws/aws-sdk-php": "^2.4.9 || ^3.0", "doctrine/couchdb": "~1.0@dev", - "graylog2/gelf-php": "~1.0", - "jakub-onderka/php-parallel-lint": "0.9", + "elasticsearch/elasticsearch": "^6.0", + "graylog2/gelf-php": "^1.4.2", + "jakub-onderka/php-parallel-lint": "^0.9", "php-amqplib/php-amqplib": "~2.4", "php-console/php-console": "^3.1.3", - "phpunit/phpunit": "~4.5", - "phpunit/phpunit-mock-objects": "2.3.0", + "phpspec/prophecy": "^1.6.1", + "phpunit/phpunit": "^8.3", + "predis/predis": "^1.1", + "rollbar/rollbar": "^1.3", "ruflin/elastica": ">=0.90 <3.0", - "sentry/sentry": "^0.13", "swiftmailer/swiftmailer": "^5.3|^6.0" }, "suggest": { "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", - "ext-mongo": "Allow sending log messages to a MongoDB server", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", - "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", "php-console/php-console": "Allow sending log messages to Google Chrome", "rollbar/rollbar": "Allow sending log messages to Rollbar", - "ruflin/elastica": "Allow sending log messages to an Elastic Search server", - "sentry/sentry": "Allow sending log messages to a Sentry server" + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "2.x-dev" } }, "autoload": { @@ -1242,7 +1388,7 @@ "logging", "psr-3" ], - "time": "2019-09-06T13:49:17+00:00" + "time": "2019-12-20T14:22:59+00:00" }, { "name": "psr/cache", @@ -1342,16 +1488,16 @@ }, { "name": "psr/log", - "version": "1.1.0", + "version": "1.1.2", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd" + "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", - "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd", + "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801", + "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801", "shasum": "" }, "require": { @@ -1360,7 +1506,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.1.x-dev" } }, "autoload": { @@ -1385,7 +1531,7 @@ "psr", "psr-3" ], - "time": "2018-11-20T15:27:04+00:00" + "time": "2019-11-01T11:05:21+00:00" }, { "name": "psr/simple-cache", @@ -1517,25 +1663,24 @@ }, { "name": "react/dns", - "version": "v0.4.19", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/reactphp/dns.git", - "reference": "6852fb98e22d2e5bb35fe5aeeaa96551b120e7c9" + "reference": "a214d90c2884dac18d0cac6176202f247b66d762" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/dns/zipball/6852fb98e22d2e5bb35fe5aeeaa96551b120e7c9", - "reference": "6852fb98e22d2e5bb35fe5aeeaa96551b120e7c9", + "url": "https://api.github.com/repos/reactphp/dns/zipball/a214d90c2884dac18d0cac6176202f247b66d762", + "reference": "a214d90c2884dac18d0cac6176202f247b66d762", "shasum": "" }, "require": { "php": ">=5.3.0", "react/cache": "^1.0 || ^0.6 || ^0.5", - "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", - "react/promise": "^2.1 || ^1.2.1", - "react/promise-timer": "^1.2", - "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4.5" + "react/event-loop": "^1.0 || ^0.5", + "react/promise": "^2.7 || ^1.2.1", + "react/promise-timer": "^1.2" }, "require-dev": { "clue/block-react": "^1.2", @@ -1558,20 +1703,20 @@ "dns-resolver", "reactphp" ], - "time": "2019-07-10T21:00:53+00:00" + "time": "2019-08-15T09:06:31+00:00" }, { "name": "react/event-loop", - "version": "v1.1.0", + "version": "v1.1.1", "source": { "type": "git", "url": "https://github.com/reactphp/event-loop.git", - "reference": "a0ecac955c67b57c40fe4a1b88a7cca1b58c982d" + "reference": "6d24de090cd59cfc830263cfba965be77b563c13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/event-loop/zipball/a0ecac955c67b57c40fe4a1b88a7cca1b58c982d", - "reference": "a0ecac955c67b57c40fe4a1b88a7cca1b58c982d", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/6d24de090cd59cfc830263cfba965be77b563c13", + "reference": "6d24de090cd59cfc830263cfba965be77b563c13", "shasum": "" }, "require": { @@ -1600,7 +1745,7 @@ "asynchronous", "event-loop" ], - "time": "2019-02-07T16:19:49+00:00" + "time": "2020-01-01T18:39:52+00:00" }, { "name": "react/promise", @@ -1650,26 +1795,26 @@ }, { "name": "react/promise-stream", - "version": "v1.1.1", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise-stream.git", - "reference": "00e269d611e9c9a29356aef64c07f7e513e73dc9" + "reference": "6384d8b76cf7dcc44b0bf3343fb2b2928412d1fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise-stream/zipball/00e269d611e9c9a29356aef64c07f7e513e73dc9", - "reference": "00e269d611e9c9a29356aef64c07f7e513e73dc9", + "url": "https://api.github.com/repos/reactphp/promise-stream/zipball/6384d8b76cf7dcc44b0bf3343fb2b2928412d1fe", + "reference": "6384d8b76cf7dcc44b0bf3343fb2b2928412d1fe", "shasum": "" }, "require": { "php": ">=5.3", "react/promise": "^2.1 || ^1.2", - "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4 || ^0.3" + "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4.6" }, "require-dev": { "clue/block-react": "^1.0", - "phpunit/phpunit": "^6.4 || ^5.7 || ^4.8.35", + "phpunit/phpunit": "^7.0 || ^6.4 || ^5.7 || ^4.8.35", "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3", "react/promise-timer": "^1.0" }, @@ -1702,7 +1847,7 @@ "stream", "unwrap" ], - "time": "2017-12-22T12:02:05+00:00" + "time": "2019-07-03T12:29:10+00:00" }, { "name": "react/promise-timer", @@ -1759,22 +1904,22 @@ }, { "name": "react/socket", - "version": "v1.2.1", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/reactphp/socket.git", - "reference": "4d49bd3d6ca0257ada8645dd0f8a2f1885e290b3" + "reference": "10f0629ec83ea0fa22597f348623f554227e3ca0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket/zipball/4d49bd3d6ca0257ada8645dd0f8a2f1885e290b3", - "reference": "4d49bd3d6ca0257ada8645dd0f8a2f1885e290b3", + "url": "https://api.github.com/repos/reactphp/socket/zipball/10f0629ec83ea0fa22597f348623f554227e3ca0", + "reference": "10f0629ec83ea0fa22597f348623f554227e3ca0", "shasum": "" }, "require": { "evenement/evenement": "^3.0 || ^2.0 || ^1.0", "php": ">=5.3.0", - "react/dns": "^0.4.13", + "react/dns": "^1.0 || ^0.4.13", "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3.5", "react/promise": "^2.6.0 || ^1.2.1", "react/promise-timer": "^1.4.0", @@ -1802,7 +1947,7 @@ "reactphp", "stream" ], - "time": "2019-06-03T09:04:16+00:00" + "time": "2019-07-10T10:11:14+00:00" }, { "name": "react/stream", @@ -1852,16 +1997,16 @@ }, { "name": "swiftmailer/swiftmailer", - "version": "v6.2.1", + "version": "v6.2.3", "source": { "type": "git", "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "5397cd05b0a0f7937c47b0adcb4c60e5ab936b6a" + "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/5397cd05b0a0f7937c47b0adcb4c60e5ab936b6a", - "reference": "5397cd05b0a0f7937c47b0adcb4c60e5ab936b6a", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/149cfdf118b169f7840bbe3ef0d4bc795d1780c9", + "reference": "149cfdf118b169f7840bbe3ef0d4bc795d1780c9", "shasum": "" }, "require": { @@ -1910,20 +2055,20 @@ "mail", "mailer" ], - "time": "2019-04-21T09:21:45+00:00" + "time": "2019-11-12T09:31:26+00:00" }, { "name": "symfony/polyfill-iconv", - "version": "v1.12.0", + "version": "v1.14.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "685968b11e61a347c18bf25db32effa478be610f" + "reference": "926832ce51059bb58211b7b2080a88e0c3b5328e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/685968b11e61a347c18bf25db32effa478be610f", - "reference": "685968b11e61a347c18bf25db32effa478be610f", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/926832ce51059bb58211b7b2080a88e0c3b5328e", + "reference": "926832ce51059bb58211b7b2080a88e0c3b5328e", "shasum": "" }, "require": { @@ -1935,7 +2080,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.12-dev" + "dev-master": "1.14-dev" } }, "autoload": { @@ -1969,26 +2114,26 @@ "portable", "shim" ], - "time": "2019-08-06T08:03:45+00:00" + "time": "2020-01-13T11:15:53+00:00" }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.12.0", + "version": "v1.14.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "6af626ae6fa37d396dc90a399c0ff08e5cfc45b2" + "reference": "6842f1a39cf7d580655688069a03dd7cd83d244a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6af626ae6fa37d396dc90a399c0ff08e5cfc45b2", - "reference": "6af626ae6fa37d396dc90a399c0ff08e5cfc45b2", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/6842f1a39cf7d580655688069a03dd7cd83d244a", + "reference": "6842f1a39cf7d580655688069a03dd7cd83d244a", "shasum": "" }, "require": { "php": ">=5.3.3", "symfony/polyfill-mbstring": "^1.3", - "symfony/polyfill-php72": "^1.9" + "symfony/polyfill-php72": "^1.10" }, "suggest": { "ext-intl": "For best performance" @@ -1996,7 +2141,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.12-dev" + "dev-master": "1.14-dev" } }, "autoload": { @@ -2031,20 +2176,20 @@ "portable", "shim" ], - "time": "2019-08-06T08:03:45+00:00" + "time": "2020-01-17T12:01:36+00:00" }, { "name": "symfony/polyfill-mbstring", - "version": "v1.12.0", + "version": "v1.14.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17" + "reference": "34094cfa9abe1f0f14f48f490772db7a775559f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/b42a2f66e8f1b15ccf25652c3424265923eb4f17", - "reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/34094cfa9abe1f0f14f48f490772db7a775559f2", + "reference": "34094cfa9abe1f0f14f48f490772db7a775559f2", "shasum": "" }, "require": { @@ -2056,7 +2201,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.12-dev" + "dev-master": "1.14-dev" } }, "autoload": { @@ -2090,20 +2235,20 @@ "portable", "shim" ], - "time": "2019-08-06T08:03:45+00:00" + "time": "2020-01-13T11:15:53+00:00" }, { "name": "symfony/polyfill-php72", - "version": "v1.12.0", + "version": "v1.14.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php72.git", - "reference": "04ce3335667451138df4307d6a9b61565560199e" + "reference": "46ecacf4751dd0dc81e4f6bf01dbf9da1dc1dadf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/04ce3335667451138df4307d6a9b61565560199e", - "reference": "04ce3335667451138df4307d6a9b61565560199e", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/46ecacf4751dd0dc81e4f6bf01dbf9da1dc1dadf", + "reference": "46ecacf4751dd0dc81e4f6bf01dbf9da1dc1dadf", "shasum": "" }, "require": { @@ -2112,7 +2257,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.12-dev" + "dev-master": "1.14-dev" } }, "autoload": { @@ -2145,23 +2290,63 @@ "portable", "shim" ], - "time": "2019-08-06T08:03:45+00:00" + "time": "2020-01-13T11:15:53+00:00" + }, + { + "name": "xfra35/f3-cron", + "version": "v1.2.1", + "source": { + "type": "git", + "url": "https://github.com/xfra35/f3-cron.git", + "reference": "eba0a5574a8c35623307dd27135a67d76e4da12e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/xfra35/f3-cron/zipball/eba0a5574a8c35623307dd27135a67d76e4da12e", + "reference": "eba0a5574a8c35623307dd27135a67d76e4da12e", + "shasum": "" + }, + "require": { + "bcosca/fatfree-core": "~3.5" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-only" + ], + "description": "Job scheduling for the PHP Fat-Free Framework", + "homepage": "https://github.com/xfra35/f3-cron", + "keywords": [ + "F3", + "cron", + "fatfree", + "scheduling" + ], + "time": "2018-06-19T08:29:49+00:00" } ], "packages-dev": [], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "ikkez/f3-cortex": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { - "php-64bit": ">=7.1", + "php-64bit": ">=7.2", "ext-pdo": "*", "ext-openssl": "*", "ext-curl": "*", "ext-json": "*", "ext-mbstring": "*", - "ext-ctype": "*" + "ext-ctype": "*", + "ext-gd": "*" }, "platform-dev": [] } diff --git a/config.rb b/config.rb deleted file mode 100644 index 8335fdf8..00000000 --- a/config.rb +++ /dev/null @@ -1,34 +0,0 @@ -# Compass 1.0.1 (Polaris) - -require 'compass/import-once/activate' - -# Require any additional compass plugins here. - - -http_path = "/" -# project_path = '' -# css_dir = 'public/css' -# sass_dir = 'sass' -images_dir = 'public/img' -generated_images_path = 'img_cache' -# javascripts_dir = 'javascripts' -fonts_dir = 'public/fonts' - -# You can select your preferred output style here (can be overridden via the command line): -# output_style = :expanded or :nested or :compact or :compressed -output_style = :compressed - -# To enable relative paths to assets via compass helper functions. Uncomment: -relative_assets = true - -# To disable debugging comments that display the original location of your selectors. Uncomment: -line_comments = false - -# Define the location of a the compass / sass cache directory. -cache_path = '.sass-cache' - -# If you prefer the indented syntax, you might want to regenerate this -# project again passing --syntax sass, or you can uncomment this: -# preferred_syntax = :sass -# and then run: -# sass-convert -R --from scss --to sass sass scss && rm -rf sass && mv scss sass diff --git a/gulpfile.js b/gulpfile.js index 00c65202..e0311285 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,6 +1,7 @@ /* GULP itself */ 'use strict'; +let util = require('util'); let fs = require('fs'); let ini = require('ini'); @@ -10,12 +11,18 @@ let filter = require('gulp-filter'); let gulpif = require('gulp-if'); let jshint = require('gulp-jshint'); let sourcemaps = require('gulp-sourcemaps'); +let zlib = require('zlib'); let gzip = require('gulp-gzip'); let brotli = require('gulp-brotli'); let uglifyjs = require('uglify-es'); let composer = require('gulp-uglify/composer'); -let compass = require('gulp-compass'); +let sass = require('gulp-sass'); +let autoprefixer = require('gulp-autoprefixer'); let cleanCSS = require('gulp-clean-css'); +let imageResize = require('gulp-image-resize'); +let imagemin = require('gulp-imagemin'); +let imageminWebp = require('imagemin-webp'); +let rename = require('gulp-rename'); let bytediff = require('gulp-bytediff'); let debug = require('gulp-debug'); let notifier = require('node-notifier'); @@ -36,24 +43,32 @@ let del = require('promised-del'); let minify = composer(uglifyjs, console); +sass.compiler = require('node-sass'); + // == Settings ======================================================================================================== // build/src directories let PATH = { JS_HINT: { - CONF: '/.jshintrc' + CONF: '/.jshintrc' }, ASSETS: { - DIST: './public' + DEST: './public' }, JS: { - SRC: 'js/**/*.js', - SRC_LIBS: './js/lib/**/*', - DIST: 'public/js', - DIST_BUILD: './public/js/vX.X.X' + SRC: 'js/**/*.js', + SRC_LIBS: './js/lib/**/*', + DEST: 'public/js', + DEST_BUILD: './public/js/vX.X.X' }, CSS: { - SRC: './sass/**/*.scss', + SRC: 'sass/**/*.scss', + }, + IMG: { + SRC: 'img/**/*.{jpg,png,svg}', + SRC_HEADER: 'img/header/*.{jpg,png}', + SRC_GALLERY: 'img/gallery/**/*.{jpg,png}', + SRC_SVG: 'img/svg/*.svg' } }; @@ -94,7 +109,9 @@ let trackTable = { let uglifyJsOptions = { warnings: true, toplevel: false, - ecma: 8 + ecma: 8, + nameCache: {}, // cache mangled variable and property names across multiple invocations of minify() + keep_classnames: true // pass true to prevent discarding or mangling of class names. }; // Sourcemaps options @@ -108,17 +125,13 @@ let uglifyJsOptions = { * @param example */ let printError = (title, example) => { - let cliLineLength = (cliBoxLength - 8); - log(''); - log(colors.red( '= ERROR ' + '=' . repeat(cliLineLength))); - log(colors.red(title)); + log(colors.danger.divider('error')); + log(colors.iconDanger(title)); if(example){ - log(` - ${colors.gray(example)} - `); + log(` ${colors.gray(example)}`); } - log(colors.red('='.repeat(cliBoxLength))); + log(colors.danger.divider(' ')); log(''); }; @@ -165,16 +178,33 @@ let CONF = { GZIP: options.hasOwnProperty('cssGzip') ? options.cssGzip === 'true': undefined, BROTLI: options.hasOwnProperty('cssBrotli') ? options.cssBrotli === 'true': undefined }, + IMG: { + ACTIVE: options.hasOwnProperty('imgActive') ? options.imgActive === 'true': undefined, + }, DEBUG: false }; // -- Plugin options ---------------------------------------------------------- +let sassOptions = { + errorLogToConsole: true, + outputStyle: 'compressed' // nested, expanded, compact, compressed +}; + +let autoprefixerOptions = { + // browsers: ['last 2 versions'], read from package.json key: "browserslist" + cascade: false +}; + +let cleanCssOptions = { + compatibility: '*', + level: 2 +}; let gZipOptions = { append: false, // disables default append ext .gz extension: 'gz', // use "custom" ext: .gz threshold: '1kb', // min size required to compress a file - deleteMode: PATH.JS.DIST_BUILD, // replace *.gz files if size < 'threshold' + deleteMode: PATH.JS.DEST_BUILD, // replace *.gz files if size < 'threshold' gzipOptions: { level: 9 // zlib.Gzip compression level [0-9] }, @@ -183,21 +213,71 @@ let gZipOptions = { let brotliOptions = { extension: 'br', // use "custom" ext: .br - mode: 1, // compression mode for UTF-8 formatted text - quality: 11, // quality [1 worst - 11 best] - skipLarger: true // use orig. files in case of *.br size > orig. size -}; - -let compassOptions = { - config_file: './config.rb', - css: 'public/css/' + CONF.TAG, // #VERSION# will be replaced with version tag - sass: 'sass', - time: true, // show execution time - sourcemap: true + skipLarger: true, // use orig. files in case of *.br size > orig. size + params: { + [zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT, // compression mode for UTF-8 formatted text + [zlib.constants.BROTLI_PARAM_QUALITY]: zlib.constants.BROTLI_MAX_QUALITY // quality [1 worst - 11 best] + } }; let compressionExt = [gZipOptions.extension, brotliOptions.extension]; +let imageminWebpOptions = {quality: 80}; + +let imgResizeOptions = { + crop : true, + upscale : false, + noProfile: true +}; + +colors.theme({ + primary: colors.cyan, + success: colors.green, + info: colors.blue, + warning: colors.yellow, + danger: colors.red, + + disabled: (...args) => colors.dim.gray(util.format(...args)), + comment: (...args) => colors.disabled.italic(util.format(...args)), + + iconSuccess: text => ` ${colors.success(`✔`)} ${colors.success(text)}`, + iconDanger: text => ` ${colors.danger(`✘`)} ${colors.danger(text)}`, + + divider: text => colors.disabled(`${(text || '').trim().length ? `═ ${(text || '').trim().toUpperCase()} ═` : ''}`.padEnd(cliBoxLength, '═')) +}); + +/** + * example output formatting + */ +/* +log(colors.primary('primary')); +log(colors.success('success')); +log(colors.info('info')); +log(colors.warning('warning')); +log(colors.danger('danger')); + +log(colors.disabled('disabled')); +log(colors.comment('comment')); + +log(colors.iconSuccess('success')); +log(colors.iconDanger('danger')); + +log(colors.bold('bold')); +log(colors.italic('italic')); +log(colors.underline('underline')); +log(''); +log(colors.magenta('magenta')); +log(colors.magentaBright('magentaBright')); +log(colors.cyan('cyan')); +log(colors.cyanBright('cyanBright')); +log(colors.blue('blue')); +log(colors.blueBright('blueBright')); +log(colors.yellow('yellow')); +log(colors.yellowBright('yellowBright')); +log(''); +log(''); +*/ + // == Helper methods ================================================================================================== /** @@ -272,35 +352,33 @@ let mergeConf = (confUser, confDefault) => { * print help information for all Gulp tasks */ let printHelp = () => { - let cliLineLength = (cliBoxLength - 7); - log(''); - log(colors.cyan( '= HELP ' + '='.repeat(cliLineLength))); log(` - ${colors.cyan('documentation:')} ${colors.gray('https://github.com/exodus4d/pathfinder/wiki/GulpJs')} - - ${colors.cyan('usage:')} ${colors.gray('$ npm run gulp [task] -- [--options] ...')} - - ${colors.cyan('tasks:')} - ${colors.gray('help')} This view - ${colors.gray('default')} Development environment. Working with row src files and file watcher, default: - ${colors.gray('')} ${colors.gray('--jsUglify=false --jsSourcemaps=false --cssSourcemaps=false --jsGzip=false --cssGzip=false --jsBrotli=false --cssBrotli=false')} - ${colors.gray('production')} Production build. Concat and uglify static resources, default: - ${colors.gray('')} ${colors.gray('--jsUglify=true --jsSourcemaps=true --cssSourcemaps=true --jsGzip=true --cssGzip=true --jsBrotli=true --cssBrotli=true')} - - ${colors.cyan('options:')} - ${colors.gray('--tag')} Set build version. ${colors.gray('default: --tag="v1.2.4" -> dest path: public/js/v1.2.4')} - ${colors.gray('--jsUglify')} Set js uglification. ${colors.gray('(true || false)')} - ${colors.gray('--jsSourcemaps')} Set js sourcemaps generation. ${colors.gray('(true || false)')} - ${colors.gray('--jsGzip')} Set js "gzip" compression mode. ${colors.gray('(true || false)')} - ${colors.gray('--jsBrotli')} Set js "brotli" compression mode. ${colors.gray('(true || false)')} - - ${colors.gray('--cssSourcemaps')} Set CSS sourcemaps generation. ${colors.gray('(true || false)')} - ${colors.gray('--cssGzip')} Set CSS "gzip" compression mode. ${colors.gray('(true || false)')} - ${colors.gray('--cssBrotli')} Set CSS "brotli" compression mode. ${colors.gray('(true || false)')} - ${colors.gray('--debug')} Set debug mode (more output). ${colors.gray('(true || false)')} + ${colors.divider('help')} + ${colors.bold('docs:')} ${colors.info('https://github.com/exodus4d/pathfinder/wiki/GulpJs')} + ${colors.bold('command:')} ${colors.magenta('$ npm run gulp')} ${colors.primary.italic('[task]')} ${colors.yellow.italic('-- [--options] …')} + ${colors.bold('tasks:')} + ${colors.primary('help')} This view + ${colors.primary('default')} Development environment. Working with row src files and file watcher, default: + ${colors.primary('')} ${colors.gray('--jsUglify=false --jsSourcemaps=false --cssSourcemaps=false --jsGzip=false --cssGzip=false --jsBrotli=false --cssBrotli=false --imgActive=true')} + ${colors.primary('production')} Production build. Concat and uglify static resources, default: + ${colors.primary('')} ${colors.gray('--jsUglify=true --jsSourcemaps=true --cssSourcemaps=true --jsGzip=true --cssGzip=true --jsBrotli=true --cssBrotli=true --imgActive=true')} + ${colors.bold('helper tasks:')} + ${colors.primary('images')} Build images. Convert src *.png images to *.webp and *.jpg. Crop & resize tasks + ${colors.primary('')} ${colors.gray('--imgActive=true')} + + ${colors.bold('options:')} + ${colors.yellow('--tag')} Set build version. ${colors.gray(`default: --tag="${tagVersion}" -> dest path: public/js/${tagVersion}`)} + ${colors.yellow('--jsUglify')} Set js uglification. ${colors.gray('(true || false)')} + ${colors.yellow('--jsSourcemaps')} Set js sourcemaps generation. ${colors.gray('(true || false)')} + ${colors.yellow('--jsGzip')} Set js "gzip" compression mode. ${colors.gray('(true || false)')} + ${colors.yellow('--jsBrotli')} Set js "brotli" compression mode. ${colors.gray('(true || false)')} + ${colors.yellow('--cssSourcemaps')} Set CSS sourcemaps generation. ${colors.gray('(true || false)')} + ${colors.yellow('--cssGzip')} Set CSS "gzip" compression mode. ${colors.gray('(true || false)')} + ${colors.yellow('--cssBrotli')} Set CSS "brotli" compression mode. ${colors.gray('(true || false)')} + ${colors.yellow('--imgActive')} Disables all image tasks. ${colors.gray('(true || false)')} + ${colors.yellow('--debug')} Set debug mode (more output). ${colors.gray('(true || false)')} + ${colors.divider(' ')} `); - log(colors.cyan('='.repeat(cliBoxLength))); - log(''); }; /** @@ -488,18 +566,24 @@ let printJsSummary = () => { // == clean up tasks ================================================================================================== /** - * clean temp JS build dir + * clean temp JS dest dir */ -gulp.task('task:cleanJsBuild', () => del([PATH.JS.DIST_BUILD])); -/** - * clean CSS build dir - */ -gulp.task('task:cleanCssBuild', () => del([PATH.ASSETS.DIST + '/css/' + CONF.TAG])); +gulp.task('task:cleanJsDestBuild', () => del([PATH.JS.DEST_BUILD])); /** - * clean JS destination (final) dir + * clean JS dest dir */ -gulp.task('task:cleanJsDest', () => del([PATH.JS.DIST + '/' + CONF.TAG])); +gulp.task('task:cleanJsDest', () => del([PATH.JS.DEST + '/' + CONF.TAG])); + +/** + * clean CSS dest dir + */ +gulp.task('task:cleanCssDest', () => del([PATH.ASSETS.DEST + '/css/' + CONF.TAG])); + +/** + * clean IMG dest dir + */ +gulp.task('task:cleanImgDest', () => del([PATH.ASSETS.DEST + '/img/' + CONF.TAG])); // == Dev tasks (code analyses) ======================================================================================= gulp.task('task:hintJS', () => { @@ -514,7 +598,7 @@ gulp.task('task:hintJS', () => { * concat/build JS files by modules */ gulp.task('task:concatJS', () => { - let modules = ['login', 'mappage', 'setup', 'admin', 'notification', 'datatables.loader']; + let modules = ['login', 'mappage', 'setup', 'admin', 'pnotify.loader', 'datatables.loader', 'summernote.loader']; let srcModules = ['./js/app/*(' + modules.join('|') + ').js']; return gulp.src(srcModules, {base: 'js'}) @@ -551,7 +635,7 @@ gulp.task('task:concatJS', () => { trackFile(data, {src: 'startSize', src_percent: 'percent', uglify: 'endSize'}); return colors.green('Build concat file "' + data.fileName + '"'); })) - .pipe(gulp.dest(PATH.JS.DIST_BUILD)); + .pipe(gulp.dest(PATH.JS.DEST_BUILD)); }); /** @@ -569,32 +653,32 @@ gulp.task('task:diffJS', () => { .pipe(gulpif(CONF.JS.SOURCEMAPS, sourcemaps.write('.', {includeContent: false, sourceRoot: '/js'}))) .pipe(bytediff.stop(data => { trackFile(data, {src: 'startSize', src_percent: 'percent', uglify: 'endSize'}); - return colors.green('Build file "' + data.fileName + '"'); + return colors.iconSuccess(`build → ${colors.magenta(data.fileName)}`); })) - .pipe(gulp.dest(PATH.JS.DIST_BUILD, {overwrite: false})); + .pipe(gulp.dest(PATH.JS.DEST_BUILD, {overwrite: false})); }); /** * get assets filter options e.g. for gZip or Brotli assets * @param compression * @param fileExt - * @returns {{srcModules: *[], fileFilter}} + * @returns {{fileFilter, srcModules: string[]}} */ let getAssetFilterOptions = (compression, fileExt) => { return { srcModules: [ - PATH.ASSETS.DIST +'/**/*.' + fileExt, - '!' + PATH.ASSETS.DIST + '/js/' + CONF.TAG + '{,/**/*}' + PATH.ASSETS.DEST +'/**/*.' + fileExt, + '!' + PATH.ASSETS.DEST + '/js/' + CONF.TAG + '{,/**/*}' ], fileFilter: filter(file => CONF[fileExt.toUpperCase()][compression.toUpperCase()]) }; }; /** - * build gZip or Brotli assets + * build gZip assets * @param config * @param taskName - * @returns {JQuery.PromiseBase} + * @returns {*} */ let gzipAssets = (config, taskName) => { return gulp.src(config.srcModules, {base: 'public', since: gulp.lastRun(taskName)}) @@ -610,21 +694,21 @@ let gzipAssets = (config, taskName) => { return colors.gray('Gzip skip "' + data.fileName + '". Size < ' + gZipOptions.threshold + ' (threehold)'); } })) - .pipe(gulp.dest(PATH.ASSETS.DIST)); + .pipe(gulp.dest(PATH.ASSETS.DEST)); }; /** - * build Brotli or Brotli assets + * build Brotli assets * @param config * @param taskName - * @returns {JQuery.PromiseBase} + * @returns {*} */ let brotliAssets = (config, taskName) => { return gulp.src(config.srcModules, {base: 'public', since: gulp.lastRun(taskName)}) .pipe(config.fileFilter) .pipe(debug({title: 'Brotli asses dest: ', showFiles: false})) .pipe(bytediff.start()) - .pipe(brotli.compress(brotliOptions)) + .pipe(brotli(brotliOptions)) .pipe(bytediff.stop(data => { trackFile(data, {brotliFile: 'fileName', brotli: 'endSize'}); if(fileExtension(data.fileName) === brotliOptions.extension){ @@ -633,7 +717,7 @@ let brotliAssets = (config, taskName) => { return colors.gray('Brotli skip "' + data.fileName + '"'); } })) - .pipe(gulp.dest(PATH.ASSETS.DIST)); + .pipe(gulp.dest(PATH.ASSETS.DEST)); }; gulp.task('task:gzipJsAssets', () => { @@ -653,42 +737,135 @@ gulp.task('task:brotliCssAssets', () => { }); /** - * rename "temp" build JS folder to final dist folder + * rename "temp" build JS folder to final dest folder * (keep "old" build data as long as possible in case of build failure) */ gulp.task('task:renameJsDest', () => { let fileExt = ['js', 'map'].concat(compressionExt); - return gulp.src( PATH.JS.DIST_BUILD + '/**/*.{' + fileExt.join(',') + '}', {base: PATH.JS.DIST_BUILD, since: gulp.lastRun('task:renameJsDest')}) + return gulp.src( PATH.JS.DEST_BUILD + '/**/*.{' + fileExt.join(',') + '}', {base: PATH.JS.DEST_BUILD, since: gulp.lastRun('task:renameJsDest')}) .pipe(debug({title: 'Rename JS dest: ', showFiles: false})) - .pipe(gulp.dest(PATH.JS.DIST_BUILD + '/../' + CONF.TAG)); + .pipe(gulp.dest(PATH.JS.DEST_BUILD + '/../' + CONF.TAG)); }); +// == CSS build tasks ================================================================================================= + /** - * build CSS rom SASS files (Compass) + * build CSS rom SASS files + * -> 1. node-sass + * 2. autoprefixer */ gulp.task('task:sass', () => { - compassOptions.sourcemap = CONF.CSS.SOURCEMAPS; - - return gulp.src( './sass/**/*.scss') - .pipe(compass(compassOptions)) + return gulp.src(PATH.CSS.SRC) + .pipe(gulpif(CONF.CSS.SOURCEMAPS, sourcemaps.init())) + .pipe(sass(sassOptions).on('error', sass.logError)) .pipe(bytediff.start()) .pipe(bytediff.stop(data => { trackFile(data, {src: 'startSize', src_percent: 'percent', uglify: 'endSize'}); - return colors.green('Build CSS file "' + data.fileName + '"'); + return colors.iconSuccess(`build → ${colors.magenta(data.fileName)}`); })) - .pipe(gulp.dest(PATH.ASSETS.DIST + '/css/' + CONF.TAG)); + .pipe(gulpif(CONF.CSS.SOURCEMAPS, sourcemaps.write('.', {includeContent: false, sourceRoot: '../../../sass'}))) + .pipe(gulp.dest(PATH.ASSETS.DEST + '/css/' + CONF.TAG)) + + .pipe(filter(['!*.map'])) + .pipe(gulpif(CONF.CSS.SOURCEMAPS, sourcemaps.init({loadMaps: true}))) + .pipe(autoprefixer(autoprefixerOptions)) + .pipe(bytediff.start()) + .pipe(bytediff.stop(data => { + trackFile(data, {src: 'startSize', src_percent: 'percent', uglify: 'endSize'}); + return colors.green('Autoprefix CSS file "' + data.fileName + '"'); + })) + .pipe(gulpif(CONF.CSS.SOURCEMAPS, sourcemaps.write('.', {includeContent: false}))) + .pipe(gulp.dest(PATH.ASSETS.DEST + '/css/' + CONF.TAG)); }); /** * css-clean can be used to "optimize" generated CSS [optional] */ gulp.task('task:cleanCss', () => { - return gulp.src( PATH.ASSETS.DIST +'/css/**/*.css') - .pipe(cleanCSS({ - compatibility: '*', - level: 2 - })) - .pipe(gulp.dest(PATH.ASSETS.DIST +'/css/' + CONF.TAG)); + return gulp.src('public/css/' + CONF.TAG + '/*.css') + .pipe(gulpif(CONF.CSS.SOURCEMAPS, sourcemaps.init({loadMaps: true}))) + .pipe(cleanCSS(cleanCssOptions)) + .pipe(gulpif(CONF.CSS.SOURCEMAPS, sourcemaps.write('.', {includeContent: false}))) + .pipe(gulp.dest(PATH.ASSETS.DEST + '/css/' + CONF.TAG)); +}); + +// == Image build tasks =============================================================================================== + +let imgWebpHandler = (config, taskName) => { + return gulp.src(config.src, {base: config.base, since: gulp.lastRun(taskName)}) + .pipe(imagemin([imageminWebp(config.options)], {verbose: true})) + .pipe(rename({extname: '.webp'})) + .pipe(gulp.dest(PATH.ASSETS.DEST + '/img/' + CONF.TAG)); +}; + +gulp.task('task:imgHeadToWEBP', () => { + return imgWebpHandler({ + src: PATH.ASSETS.DEST + '/img/' + CONF.TAG + '/header/**/*.png', + base: PATH.ASSETS.DEST + '/img/' + CONF.TAG, + options: imageminWebpOptions + }, 'task:imgHeadToWEBP'); +}); + +gulp.task('task:imgGalleryToWEBP', () => { + return imgWebpHandler({ + src: PATH.ASSETS.DEST + '/img/' + CONF.TAG + '/gallery/**/*.jpg', + base: PATH.ASSETS.DEST + '/img/' + CONF.TAG, + options: Object.assign({}, imageminWebpOptions, {quality: 90}) // unfortunately src jpg´s are already high compressed + }, 'task:imgGalleryToWEBP'); +}); + +let imgResizeHandler = (config, taskName) => { + return gulp.src(config.src, {base: 'img', since: gulp.lastRun(taskName)}) + .pipe(imageResize(config.options)) + .pipe(gulpif(config.rename, rename(config.rename))) + .pipe(gulp.dest(PATH.ASSETS.DEST + '/img/' + CONF.TAG)); +}; + +let imgResizeHeaderTasks = []; +[480, 780, 1200, 1600, 3840].forEach(size => { + ['png', 'jpg'].forEach(format => { + let taskName = `task:imgHead${size}${format}`; + gulp.task(taskName, () => { + return imgResizeHandler({ + src: PATH.IMG.SRC_HEADER, + options: Object.assign({}, imgResizeOptions, {format: format, width: size}), + rename: {suffix: `-${size}`} + }, taskName); + }); + imgResizeHeaderTasks.push(taskName); + }); +}); + +gulp.task('task:imgHeadResize', gulp.series( + gulp.parallel(...imgResizeHeaderTasks), + 'task:imgHeadToWEBP' +)); + +gulp.task('task:imgGalleryCopy', () => { + return gulp.src(PATH.IMG.SRC_GALLERY, {base: 'img', since: gulp.lastRun('task:imgGalleryCopy')}) + .pipe(gulp.dest(PATH.ASSETS.DEST + '/img/' + CONF.TAG)); +}); + +gulp.task('task:imgGallery', gulp.series( + 'task:imgGalleryCopy', + 'task:imgGalleryToWEBP' +)); + +gulp.task('task:imgRest', () => { + return gulp.src([ + PATH.IMG.SRC, + `!${PATH.IMG.SRC_HEADER}`, + `!${PATH.IMG.SRC_GALLERY}`, + `!${PATH.IMG.SRC_SVG}` + ], {base: 'img', since: gulp.lastRun('task:imgRest')}) + .pipe(debug({title: 'Copy img "rest" dest: ', showFiles: false})) + .pipe(gulp.dest(PATH.ASSETS.DEST + '/img/' + CONF.TAG)); +}); + +gulp.task('task:imgSVG', () => { + return gulp.src(PATH.IMG.SRC_SVG, {base: 'img', since: gulp.lastRun('task:imgSVG')}) + .pipe(debug({title: 'Copy img SVG dest: ', showFiles: false})) + .pipe(gulp.dest(PATH.ASSETS.DEST + '/img/' + CONF.TAG)); }); // == Helper tasks ==================================================================================================== @@ -713,18 +890,19 @@ gulp.task('task:printJsSummary', done => { * print task configuration (e.g. CLI parameters) */ gulp.task('task:printConfig', done => { - let error = colors.red; - let success = colors.green; - + let error = colors.danger; let columnLength = Math.round(cliBoxLength / 2); - let cliLineLength = cliBoxLength - 9; - log(colors.gray( '= CONFIG ' + '='.repeat(cliLineLength))); + log(colors.divider('config')); let configFlat = flatten(CONF); for (let key in configFlat) { if (configFlat.hasOwnProperty(key)){ let value = configFlat[key]; + let success = colors.success; + switch(key){ + case 'TASK': success = colors.primary; break; + } // format value value = padEnd((typeof value === 'undefined') ? 'undefined': value, columnLength); log( @@ -733,7 +911,7 @@ gulp.task('task:printConfig', done => { ); } } - log(colors.gray('='.repeat(cliBoxLength))); + log(colors.divider(' ')); done(); }); @@ -742,9 +920,7 @@ gulp.task('task:printConfig', done => { */ gulp.task('task:checkConfig', done => { if(!CONF.TAG){ - printError( - 'Missing TAG version. Add param ' + colors.cyan('--tag'), - '$ npm run gulp default -- --tag="v1.2.4"'); + printError(`Missing TAG version. Add param: ${colors.yellow('--tag')}`, `$ npm run gulp default -- --tag="${tagVersion}"`); process.exit(0); } done(); @@ -767,6 +943,9 @@ gulp.task('task:configDevelop', SOURCEMAPS: true, GZIP: false, BROTLI: false + }, + IMG: { + ACTIVE: true } }; @@ -794,6 +973,9 @@ gulp.task('task:configProduction', SOURCEMAPS: true, GZIP: true, BROTLI: true + }, + IMG: { + ACTIVE: true } }; @@ -806,35 +988,64 @@ gulp.task('task:configProduction', ); /** - * updates JS destination move to (final) dir + * configure "image" task (standalone) */ -gulp.task('task:updateJsDest', gulp.series( - 'task:gzipJsAssets', - 'task:brotliJsAssets', - 'task:renameJsDest', - // 'task:printJsSummary', - 'task:cleanJsBuild' +gulp.task('task:configImages', + gulp.series( + done => { + let CONF_IMAGES = { + IMG: { + ACTIVE: true + } + }; + + CONF = mergeConf(['TASK', 'TAG', 'IMG'].reduce((obj, key) => ({ ...obj, [key]: CONF[key] }), {}), CONF_IMAGES); + done(); + }, + 'task:printConfig', + 'task:checkConfig' ) ); /** - * build JS source files (concat, uglify, sourcemaps) + * updates JS destination move to (final) dir + */ +gulp.task('task:updateJsDest', gulp.series( + gulp.parallel( + 'task:gzipJsAssets', + 'task:brotliJsAssets' + ), + 'task:renameJsDest', + // 'task:printJsSummary', + 'task:cleanJsDestBuild' +)); + +/** + * build JS dest files (concat, uglify, sourcemaps) */ gulp.task('task:buildJs', gulp.series( 'task:concatJS', 'task:diffJS', 'task:cleanJsDest', 'task:updateJsDest' - ) -); +)); /** - * build SCSS source files + * build SCSS dest files */ gulp.task('task:buildCss', gulp.series( 'task:sass' - ) -); +)); + +/** + * build IMG dest files + */ +gulp.task('task:buildImg', gulp.parallel( + 'task:imgHeadResize', + 'task:imgGallery', + 'task:imgRest', + 'task:imgSVG' +)); // == Notification tasks ============================================================================================== @@ -842,29 +1053,27 @@ gulp.task('task:buildCss', gulp.series( * JS Build done notification */ gulp.task('task:notifyJsDone', done => { - notifier.notify({ - title: 'Done JS build', - message: 'JS build task finished', - icon: PATH.ASSETS.DIST + '/img/logo.png', - wait: false - }); - done(); - } -); + notifier.notify({ + title: 'Done JS build', + message: 'JS build task finished', + icon: PATH.ASSETS.DEST + '/img/logo.png', + wait: false + }); + done(); +}); /** * CSS Build done notification */ gulp.task('task:notifyCssDone', done => { - notifier.notify({ - title: 'Done CSS build', - message: 'CSS build task finished', - icon: PATH.ASSETS.DIST + '/img/logo.png', - wait: false - }); - done(); - } -); + notifier.notify({ + title: 'Done CSS build', + message: 'CSS build task finished', + icon: PATH.ASSETS.DEST + '/img/logo.png', + wait: false + }); + done(); +}); // == Watcher tasks =================================================================================================== @@ -888,30 +1097,36 @@ gulp.task( 'task:watchCss', gulp.series( 'task:buildCss', - // 'task:cleanCss', - 'task:gzipCssAssets', - 'task:brotliCssAssets', - // 'task:printJsSummary', + // 'task:cleanCss', + gulp.parallel( + 'task:gzipCssAssets', + 'task:brotliCssAssets' + ), + // 'task:printJsSummary', 'task:notifyCssDone' ) ); +gulp.task( + 'task:watchImg', + gulp.series( + 'task:buildImg' + ) +); + /** * watch files for changes */ -gulp.task('task:setWatcherJs', function() { - return gulp.watch(PATH.JS.SRC, gulp.series('task:watchJsSrc', 'task:printJsSummary')); -}); - -gulp.task('task:setWatcherCss', function() { - return gulp.watch(PATH.CSS.SRC, gulp.series('task:watchCss', 'task:printJsSummary')); -}); +gulp.task('task:setWatcherJs', () => gulp.watch(PATH.JS.SRC, gulp.series('task:watchJsSrc', 'task:printJsSummary'))); +gulp.task('task:setWatcherCss', () => gulp.watch(PATH.CSS.SRC, gulp.series('task:watchCss', 'task:printJsSummary'))); +gulp.task('task:setWatcherImg', () => gulp.watch(PATH.IMG.SRC, gulp.series('task:watchImg', 'task:printJsSummary'))); gulp.task('task:setWatcher', gulp.parallel( 'task:setWatcherJs', - 'task:setWatcherCss' + 'task:setWatcherCss', + 'task:setWatcherImg' ) ); @@ -930,12 +1145,16 @@ gulp.task( 'task:configDevelop', gulp.parallel( gulp.series( - 'task:cleanJsBuild', + 'task:cleanJsDestBuild', 'task:watchJsSrc' ), gulp.series( - 'task:cleanCssBuild', + 'task:cleanCssDest', 'task:watchCss' + ), + gulp.series( + 'task:cleanImgDest', + 'task:watchImg' ) ), 'task:printJsSummary', @@ -949,15 +1168,29 @@ gulp.task( 'task:configProduction', gulp.parallel( gulp.series( - 'task:cleanJsBuild', + 'task:cleanJsDestBuild', 'task:buildJs' ), gulp.series( - 'task:cleanCssBuild', + 'task:cleanCssDest', 'task:watchCss' + ), + gulp.series( + 'task:cleanImgDest', + 'task:watchImg' ) ), 'task:printJsSummary' ) ); +gulp.task( + 'images', + gulp.series( + 'task:configImages', + 'task:cleanImgDest', + 'task:watchImg', + //'task:printJsSummary' + ) +); + diff --git a/public/img/landing/admin_1.jpg b/img/gallery/admin_1.jpg similarity index 100% rename from public/img/landing/admin_1.jpg rename to img/gallery/admin_1.jpg diff --git a/public/img/landing/admin_2.jpg b/img/gallery/admin_2.jpg similarity index 100% rename from public/img/landing/admin_2.jpg rename to img/gallery/admin_2.jpg diff --git a/public/img/landing/connection_1.jpg b/img/gallery/connection_1.jpg similarity index 100% rename from public/img/landing/connection_1.jpg rename to img/gallery/connection_1.jpg diff --git a/public/img/landing/development_1.jpg b/img/gallery/development_1.jpg similarity index 100% rename from public/img/landing/development_1.jpg rename to img/gallery/development_1.jpg diff --git a/public/img/landing/development_2.jpg b/img/gallery/development_2.jpg similarity index 100% rename from public/img/landing/development_2.jpg rename to img/gallery/development_2.jpg diff --git a/public/img/landing/discord_1.jpg b/img/gallery/discord_1.jpg similarity index 100% rename from public/img/landing/discord_1.jpg rename to img/gallery/discord_1.jpg diff --git a/public/img/landing/install_db.jpg b/img/gallery/install_db.jpg similarity index 100% rename from public/img/landing/install_db.jpg rename to img/gallery/install_db.jpg diff --git a/public/img/landing/install_settings.jpg b/img/gallery/install_settings.jpg similarity index 100% rename from public/img/landing/install_settings.jpg rename to img/gallery/install_settings.jpg diff --git a/public/img/landing/intel_1.jpg b/img/gallery/intel_1.jpg similarity index 100% rename from public/img/landing/intel_1.jpg rename to img/gallery/intel_1.jpg diff --git a/public/img/landing/kb_1.jpg b/img/gallery/kb_1.jpg similarity index 100% rename from public/img/landing/kb_1.jpg rename to img/gallery/kb_1.jpg diff --git a/public/img/landing/kb_2.jpg b/img/gallery/kb_2.jpg similarity index 100% rename from public/img/landing/kb_2.jpg rename to img/gallery/kb_2.jpg diff --git a/public/img/landing/log_1.jpg b/img/gallery/log_1.jpg similarity index 100% rename from public/img/landing/log_1.jpg rename to img/gallery/log_1.jpg diff --git a/public/img/landing/login_1.jpg b/img/gallery/login_1.jpg similarity index 100% rename from public/img/landing/login_1.jpg rename to img/gallery/login_1.jpg diff --git a/public/img/landing/map_1.jpg b/img/gallery/map_1.jpg similarity index 100% rename from public/img/landing/map_1.jpg rename to img/gallery/map_1.jpg diff --git a/public/img/landing/map_2.jpg b/img/gallery/map_2.jpg similarity index 100% rename from public/img/landing/map_2.jpg rename to img/gallery/map_2.jpg diff --git a/public/img/landing/map_3.jpg b/img/gallery/map_3.jpg similarity index 100% rename from public/img/landing/map_3.jpg rename to img/gallery/map_3.jpg diff --git a/public/img/landing/route_1.jpg b/img/gallery/route_1.jpg similarity index 100% rename from public/img/landing/route_1.jpg rename to img/gallery/route_1.jpg diff --git a/public/img/landing/route_2.jpg b/img/gallery/route_2.jpg similarity index 100% rename from public/img/landing/route_2.jpg rename to img/gallery/route_2.jpg diff --git a/public/img/landing/settings_1.jpg b/img/gallery/settings_1.jpg similarity index 100% rename from public/img/landing/settings_1.jpg rename to img/gallery/settings_1.jpg diff --git a/public/img/landing/signatures_1.jpg b/img/gallery/signatures_1.jpg similarity index 100% rename from public/img/landing/signatures_1.jpg rename to img/gallery/signatures_1.jpg diff --git a/public/img/landing/signatures_2.jpg b/img/gallery/signatures_2.jpg similarity index 100% rename from public/img/landing/signatures_2.jpg rename to img/gallery/signatures_2.jpg diff --git a/public/img/landing/statistics_1.jpg b/img/gallery/statistics_1.jpg similarity index 100% rename from public/img/landing/statistics_1.jpg rename to img/gallery/statistics_1.jpg diff --git a/public/img/landing/statistics_2.jpg b/img/gallery/statistics_2.jpg similarity index 100% rename from public/img/landing/statistics_2.jpg rename to img/gallery/statistics_2.jpg diff --git a/public/img/landing/system_1.jpg b/img/gallery/system_1.jpg similarity index 100% rename from public/img/landing/system_1.jpg rename to img/gallery/system_1.jpg diff --git a/public/img/landing/system_2.jpg b/img/gallery/system_2.jpg similarity index 100% rename from public/img/landing/system_2.jpg rename to img/gallery/system_2.jpg diff --git a/public/img/landing/taskmanager_1.jpg b/img/gallery/taskmanager_1.jpg similarity index 100% rename from public/img/landing/taskmanager_1.jpg rename to img/gallery/taskmanager_1.jpg diff --git a/public/img/landing/thumbs/admin_1.jpg b/img/gallery/thumbs/admin_1.jpg similarity index 100% rename from public/img/landing/thumbs/admin_1.jpg rename to img/gallery/thumbs/admin_1.jpg diff --git a/public/img/landing/thumbs/admin_2.jpg b/img/gallery/thumbs/admin_2.jpg similarity index 100% rename from public/img/landing/thumbs/admin_2.jpg rename to img/gallery/thumbs/admin_2.jpg diff --git a/public/img/landing/thumbs/connection_1.jpg b/img/gallery/thumbs/connection_1.jpg similarity index 100% rename from public/img/landing/thumbs/connection_1.jpg rename to img/gallery/thumbs/connection_1.jpg diff --git a/public/img/landing/thumbs/development_1.jpg b/img/gallery/thumbs/development_1.jpg similarity index 100% rename from public/img/landing/thumbs/development_1.jpg rename to img/gallery/thumbs/development_1.jpg diff --git a/public/img/landing/thumbs/development_2.jpg b/img/gallery/thumbs/development_2.jpg similarity index 100% rename from public/img/landing/thumbs/development_2.jpg rename to img/gallery/thumbs/development_2.jpg diff --git a/public/img/landing/thumbs/discord_1.jpg b/img/gallery/thumbs/discord_1.jpg similarity index 100% rename from public/img/landing/thumbs/discord_1.jpg rename to img/gallery/thumbs/discord_1.jpg diff --git a/public/img/landing/thumbs/install_db.jpg b/img/gallery/thumbs/install_db.jpg similarity index 100% rename from public/img/landing/thumbs/install_db.jpg rename to img/gallery/thumbs/install_db.jpg diff --git a/public/img/landing/thumbs/install_settings.jpg b/img/gallery/thumbs/install_settings.jpg similarity index 100% rename from public/img/landing/thumbs/install_settings.jpg rename to img/gallery/thumbs/install_settings.jpg diff --git a/public/img/landing/thumbs/intel_1.jpg b/img/gallery/thumbs/intel_1.jpg similarity index 100% rename from public/img/landing/thumbs/intel_1.jpg rename to img/gallery/thumbs/intel_1.jpg diff --git a/public/img/landing/thumbs/kb_1.jpg b/img/gallery/thumbs/kb_1.jpg similarity index 100% rename from public/img/landing/thumbs/kb_1.jpg rename to img/gallery/thumbs/kb_1.jpg diff --git a/public/img/landing/thumbs/kb_2.jpg b/img/gallery/thumbs/kb_2.jpg similarity index 100% rename from public/img/landing/thumbs/kb_2.jpg rename to img/gallery/thumbs/kb_2.jpg diff --git a/public/img/landing/thumbs/log_1.jpg b/img/gallery/thumbs/log_1.jpg similarity index 100% rename from public/img/landing/thumbs/log_1.jpg rename to img/gallery/thumbs/log_1.jpg diff --git a/public/img/landing/thumbs/login_1.jpg b/img/gallery/thumbs/login_1.jpg similarity index 100% rename from public/img/landing/thumbs/login_1.jpg rename to img/gallery/thumbs/login_1.jpg diff --git a/public/img/landing/thumbs/map_1.jpg b/img/gallery/thumbs/map_1.jpg similarity index 100% rename from public/img/landing/thumbs/map_1.jpg rename to img/gallery/thumbs/map_1.jpg diff --git a/public/img/landing/thumbs/map_2.jpg b/img/gallery/thumbs/map_2.jpg similarity index 100% rename from public/img/landing/thumbs/map_2.jpg rename to img/gallery/thumbs/map_2.jpg diff --git a/public/img/landing/thumbs/map_3.jpg b/img/gallery/thumbs/map_3.jpg similarity index 100% rename from public/img/landing/thumbs/map_3.jpg rename to img/gallery/thumbs/map_3.jpg diff --git a/public/img/landing/thumbs/route_1.jpg b/img/gallery/thumbs/route_1.jpg similarity index 100% rename from public/img/landing/thumbs/route_1.jpg rename to img/gallery/thumbs/route_1.jpg diff --git a/public/img/landing/thumbs/route_2.jpg b/img/gallery/thumbs/route_2.jpg similarity index 100% rename from public/img/landing/thumbs/route_2.jpg rename to img/gallery/thumbs/route_2.jpg diff --git a/public/img/landing/thumbs/settings_1.jpg b/img/gallery/thumbs/settings_1.jpg similarity index 100% rename from public/img/landing/thumbs/settings_1.jpg rename to img/gallery/thumbs/settings_1.jpg diff --git a/public/img/landing/thumbs/signatures_1.jpg b/img/gallery/thumbs/signatures_1.jpg similarity index 100% rename from public/img/landing/thumbs/signatures_1.jpg rename to img/gallery/thumbs/signatures_1.jpg diff --git a/public/img/landing/thumbs/signatures_2.jpg b/img/gallery/thumbs/signatures_2.jpg similarity index 100% rename from public/img/landing/thumbs/signatures_2.jpg rename to img/gallery/thumbs/signatures_2.jpg diff --git a/public/img/landing/thumbs/statistics_1.jpg b/img/gallery/thumbs/statistics_1.jpg similarity index 100% rename from public/img/landing/thumbs/statistics_1.jpg rename to img/gallery/thumbs/statistics_1.jpg diff --git a/public/img/landing/thumbs/statistics_2.jpg b/img/gallery/thumbs/statistics_2.jpg similarity index 100% rename from public/img/landing/thumbs/statistics_2.jpg rename to img/gallery/thumbs/statistics_2.jpg diff --git a/public/img/landing/thumbs/system_1.jpg b/img/gallery/thumbs/system_1.jpg similarity index 100% rename from public/img/landing/thumbs/system_1.jpg rename to img/gallery/thumbs/system_1.jpg diff --git a/public/img/landing/thumbs/system_2.jpg b/img/gallery/thumbs/system_2.jpg similarity index 100% rename from public/img/landing/thumbs/system_2.jpg rename to img/gallery/thumbs/system_2.jpg diff --git a/public/img/landing/thumbs/taskmanager_1.jpg b/img/gallery/thumbs/taskmanager_1.jpg similarity index 100% rename from public/img/landing/thumbs/taskmanager_1.jpg rename to img/gallery/thumbs/taskmanager_1.jpg diff --git a/public/img/landing/thumbs/wip.jpg b/img/gallery/thumbs/wip.jpg similarity index 100% rename from public/img/landing/thumbs/wip.jpg rename to img/gallery/thumbs/wip.jpg diff --git a/img/header/pf-header.png b/img/header/pf-header.png new file mode 100644 index 00000000..556c9012 Binary files /dev/null and b/img/header/pf-header.png differ diff --git a/public/img/icons/client/ui/window/charcustomization.png b/img/icons/client/ui/window/charcustomization.png similarity index 100% rename from public/img/icons/client/ui/window/charcustomization.png rename to img/icons/client/ui/window/charcustomization.png diff --git a/public/img/icons/client/ui/window/clonebay.png b/img/icons/client/ui/window/clonebay.png similarity index 100% rename from public/img/icons/client/ui/window/clonebay.png rename to img/icons/client/ui/window/clonebay.png diff --git a/public/img/icons/client/ui/window/concord.png b/img/icons/client/ui/window/concord.png similarity index 100% rename from public/img/icons/client/ui/window/concord.png rename to img/icons/client/ui/window/concord.png diff --git a/public/img/icons/client/ui/window/docking.png b/img/icons/client/ui/window/docking.png similarity index 100% rename from public/img/icons/client/ui/window/docking.png rename to img/icons/client/ui/window/docking.png diff --git a/public/img/icons/client/ui/window/factionalwarfare.png b/img/icons/client/ui/window/factionalwarfare.png similarity index 100% rename from public/img/icons/client/ui/window/factionalwarfare.png rename to img/icons/client/ui/window/factionalwarfare.png diff --git a/public/img/icons/client/ui/window/fitting.png b/img/icons/client/ui/window/fitting.png similarity index 100% rename from public/img/icons/client/ui/window/fitting.png rename to img/icons/client/ui/window/fitting.png diff --git a/public/img/icons/client/ui/window/industry.png b/img/icons/client/ui/window/industry.png similarity index 100% rename from public/img/icons/client/ui/window/industry.png rename to img/icons/client/ui/window/industry.png diff --git a/public/img/icons/client/ui/window/insurance.png b/img/icons/client/ui/window/insurance.png similarity index 100% rename from public/img/icons/client/ui/window/insurance.png rename to img/icons/client/ui/window/insurance.png diff --git a/public/img/icons/client/ui/window/jumpclones.png b/img/icons/client/ui/window/jumpclones.png similarity index 100% rename from public/img/icons/client/ui/window/jumpclones.png rename to img/icons/client/ui/window/jumpclones.png diff --git a/public/img/icons/client/ui/window/lpstore.png b/img/icons/client/ui/window/lpstore.png similarity index 100% rename from public/img/icons/client/ui/window/lpstore.png rename to img/icons/client/ui/window/lpstore.png diff --git a/public/img/icons/client/ui/window/market.png b/img/icons/client/ui/window/market.png similarity index 100% rename from public/img/icons/client/ui/window/market.png rename to img/icons/client/ui/window/market.png diff --git a/public/img/icons/client/ui/window/repairshop.png b/img/icons/client/ui/window/repairshop.png similarity index 100% rename from public/img/icons/client/ui/window/repairshop.png rename to img/icons/client/ui/window/repairshop.png diff --git a/public/img/icons/client/ui/window/reprocess.png b/img/icons/client/ui/window/reprocess.png similarity index 100% rename from public/img/icons/client/ui/window/reprocess.png rename to img/icons/client/ui/window/reprocess.png diff --git a/public/img/icons/client/ui/window/research.png b/img/icons/client/ui/window/research.png similarity index 100% rename from public/img/icons/client/ui/window/research.png rename to img/icons/client/ui/window/research.png diff --git a/public/img/icons/client/ui/window/skins.png b/img/icons/client/ui/window/skins.png similarity index 100% rename from public/img/icons/client/ui/window/skins.png rename to img/icons/client/ui/window/skins.png diff --git a/img/icons/grid_left.png b/img/icons/grid_left.png new file mode 100644 index 00000000..fc0a67b7 Binary files /dev/null and b/img/icons/grid_left.png differ diff --git a/img/icons/grid_right.png b/img/icons/grid_right.png new file mode 100644 index 00000000..0728df8a Binary files /dev/null and b/img/icons/grid_right.png differ diff --git a/public/img/icons/logo_anoik.png b/img/icons/logo_anoik.png similarity index 100% rename from public/img/icons/logo_anoik.png rename to img/icons/logo_anoik.png diff --git a/public/img/icons/logo_dotlan.png b/img/icons/logo_dotlan.png similarity index 100% rename from public/img/icons/logo_dotlan.png rename to img/icons/logo_dotlan.png diff --git a/public/img/icons/logo_eve.png b/img/icons/logo_eve.png similarity index 100% rename from public/img/icons/logo_eve.png rename to img/icons/logo_eve.png diff --git a/public/img/icons/logo_eveeye.png b/img/icons/logo_eveeye.png similarity index 100% rename from public/img/icons/logo_eveeye.png rename to img/icons/logo_eveeye.png diff --git a/public/img/landing/donate_patreon.png b/img/misc/donate_patreon.png similarity index 100% rename from public/img/landing/donate_patreon.png rename to img/misc/donate_patreon.png diff --git a/public/img/landing/donate_paypal.png b/img/misc/donate_paypal.png similarity index 100% rename from public/img/landing/donate_paypal.png rename to img/misc/donate_paypal.png diff --git a/public/img/grid_40x40.png b/img/misc/grid_40x40.png similarity index 100% rename from public/img/grid_40x40.png rename to img/misc/grid_40x40.png diff --git a/public/img/logo.png b/img/misc/logo.png similarity index 100% rename from public/img/logo.png rename to img/misc/logo.png diff --git a/public/img/logo_alpha.png b/img/misc/logo_alpha.png similarity index 100% rename from public/img/logo_alpha.png rename to img/misc/logo_alpha.png diff --git a/public/img/notifications/logo.png b/img/misc/notification.png similarity index 100% rename from public/img/notifications/logo.png rename to img/misc/notification.png diff --git a/public/img/landing/data.png b/img/sso/data.png similarity index 100% rename from public/img/landing/data.png rename to img/sso/data.png diff --git a/public/img/landing/eve_sso_login_buttons_large_black.png b/img/sso/eve_sso_login_buttons_large_black.png similarity index 100% rename from public/img/landing/eve_sso_login_buttons_large_black.png rename to img/sso/eve_sso_login_buttons_large_black.png diff --git a/public/img/landing/eve_sso_login_buttons_large_black_hover.png b/img/sso/eve_sso_login_buttons_large_black_hover.png similarity index 100% rename from public/img/landing/eve_sso_login_buttons_large_black_hover.png rename to img/sso/eve_sso_login_buttons_large_black_hover.png diff --git a/public/img/landing/gameplay.png b/img/sso/gameplay.png similarity index 100% rename from public/img/landing/gameplay.png rename to img/sso/gameplay.png diff --git a/public/img/landing/signature.png b/img/sso/signature.png similarity index 100% rename from public/img/landing/signature.png rename to img/sso/signature.png diff --git a/public/img/bubble.svg b/img/svg/bubble.svg similarity index 100% rename from public/img/bubble.svg rename to img/svg/bubble.svg diff --git a/img/svg/ccp_sso.svg b/img/svg/ccp_sso.svg new file mode 100644 index 00000000..b4a537cc --- /dev/null +++ b/img/svg/ccp_sso.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/img/svg/logo_inline.svg b/img/svg/logo_inline.svg new file mode 100644 index 00000000..af3c150e --- /dev/null +++ b/img/svg/logo_inline.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/img/svg/logo_simple.svg b/img/svg/logo_simple.svg new file mode 100644 index 00000000..3fd9c082 --- /dev/null +++ b/img/svg/logo_simple.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/public/img/svg/swords.svg b/img/svg/swords.svg similarity index 87% rename from public/img/svg/swords.svg rename to img/svg/swords.svg index 585465ba..9e1f2d7e 100644 --- a/public/img/svg/swords.svg +++ b/img/svg/swords.svg @@ -1,4 +1,4 @@ - + set('NAMESPACE', __NAMESPACE__); // load main config $f3->config('app/config.ini', true); // load environment dependent config -lib\Config::instance($f3); +Lib\Config::instance($f3); // initiate cron-jobs -lib\Cron::instance(); +Lib\Cron::instance(); $f3->run(); \ No newline at end of file diff --git a/js/app.js b/js/app.js index 1de1cc05..8657126f 100644 --- a/js/app.js +++ b/js/app.js @@ -25,7 +25,6 @@ requirejs.config({ mappage: './app/mappage', // initial start "map page" view setup: './app/setup', // initial start "setup page" view admin: './app/admin', // initial start "admin page" view - notification: './app/notification', // "notification" view jquery: 'lib/jquery-3.4.1.min', // v3.4.1 jQuery bootstrap: 'lib/bootstrap.min', // v3.3.0 Bootstrap js code - http://getbootstrap.com/javascript @@ -41,48 +40,42 @@ requirejs.config({ customScrollbar: 'lib/jquery.mCustomScrollbar.min', // v3.1.5 Custom scroll bars - http://manos.malihu.gr mousewheel: 'lib/jquery.mousewheel.min', // v3.1.13 Mousewheel - https://github.com/jquery/jquery-mousewheel xEditable: 'lib/bootstrap-editable.min', // v1.5.1 X-editable - in placed editing - morris: 'lib/morris.min', // v0.5.1 Morris.js - graphs and charts - raphael: 'lib/raphael.min', // v2.2.8 Raphaël - required for morris - https://dmitrybaranovskiy.github.io/raphael + morris: 'lib/morris.min', // v0.6.4 Morris.js - graphs and charts - https://github.com/pierresh/morris.js + raphael: 'lib/raphael.min', // v2.3.0 Raphaël - required for morris - https://dmitrybaranovskiy.github.io/raphael bootbox: 'lib/bootbox.min', // v5.2.0 Bootbox.js - custom dialogs - http://bootboxjs.com easyPieChart: 'lib/jquery.easypiechart.min', // v2.1.6 Easy Pie Chart - HTML 5 pie charts - http://rendro.github.io/easy-pie-chart peityInlineChart: 'lib/jquery.peity.min', // v3.3.0 Inline Chart - http://benpickles.github.io/peity/ hoverIntent: 'lib/jquery.hoverIntent.min', // v1.10.0 Hover intention - http://cherne.net/brian/resources/jquery.hoverIntent.html - select2: 'lib/select2.min', // v4.0.3 Drop Down customization - https://select2.github.io + select2: 'lib/select2.min', // v4.0.13 Drop Down customization - https://select2.github.io validator: 'lib/validator.min', // v0.10.1 Validator for Bootstrap 3 - https://github.com/1000hz/bootstrap-validator - lazylinepainter: 'lib/jquery.lazylinepainter-1.5.1.min', // v1.5.1 SVG line animation plugin - http://lazylinepainter.info blueImpGallery: 'lib/blueimp-gallery', // v2.21.3 Image Gallery - https://github.com/blueimp/Gallery blueImpGalleryHelper: 'lib/blueimp-helper', // helper function for Blue Imp Gallery blueImpGalleryBootstrap: 'lib/bootstrap-image-gallery', // v3.4.2 Bootstrap extension for Blue Imp Gallery - https://blueimp.github.io/Bootstrap-Image-Gallery bootstrapConfirmation: 'lib/bootstrap-confirmation.min', // v1.0.7 Bootstrap extension for inline confirm dialog - https://github.com/tavicu/bs-confirmation bootstrapToggle: 'lib/bootstrap-toggle.min', // v2.2.0 Bootstrap Toggle (Checkbox) - http://www.bootstraptoggle.com - lazyload: 'lib/jquery.lazyload.min', // v1.9.7 LazyLoader images - https://appelsiini.net/projects/lazyload/ - sortable: 'lib/sortable.min', // v1.6.0 Sortable - drag&drop reorder - https://github.com/rubaxa/Sortable + lazyload: 'lib/lazyload.min', // v14.0.0 LazyLoader images - https://github.com/verlok/lazyload + sortable: 'lib/sortable.min', // v1.10.1 Sortable - drag&drop reorder - https://github.com/SortableJS/Sortable 'summernote.loader': './app/summernote.loader', // v0.8.10 Summernote WYSIWYG editor -https://summernote.org 'summernote': 'lib/summernote/summernote.min', - // header animation - easePack: 'lib/EasePack.min', - tweenLite: 'lib/TweenLite.min', - - // datatables // v1.10.18 DataTables - https://datatables.net + // DataTables // v1.10.18 DataTables - https://datatables.net 'datatables.loader': './app/datatables.loader', 'datatables.net': 'lib/datatables/DataTables-1.10.18/js/jquery.dataTables.min', 'datatables.net-buttons': 'lib/datatables/Buttons-1.5.6/js/dataTables.buttons.min', 'datatables.net-buttons-html': 'lib/datatables/Buttons-1.5.6/js/buttons.html5.min', 'datatables.net-responsive': 'lib/datatables/Responsive-2.2.2/js/dataTables.responsive.min', + 'datatables.net-rowgroup': 'lib/datatables/RowGroup-1.1.1/js/dataTables.rowGroup.min', 'datatables.net-select': 'lib/datatables/Select-1.3.0/js/dataTables.select.min', 'datatables.plugins.render.ellipsis': 'lib/datatables/plugins/render/ellipsis', - // notification plugin - pnotify: 'lib/pnotify/pnotify', // v3.2.1 PNotify - notification core file - https://sciactive.com/pnotify/ - 'pnotify.buttons': 'lib/pnotify/pnotify.buttons', // PNotify - buttons notification extension - 'pnotify.confirm': 'lib/pnotify/pnotify.confirm', // PNotify - confirmation notification extension - 'pnotify.nonblock': 'lib/pnotify/pnotify.nonblock', // PNotify - notification non-block extension (hover effect) - 'pnotify.desktop': 'lib/pnotify/pnotify.desktop', // PNotify - desktop push notification extension - 'pnotify.history': 'lib/pnotify/pnotify.history', // PNotify - history push notification history extension - 'pnotify.callbacks': 'lib/pnotify/pnotify.callbacks', // PNotify - callbacks push notification extension - 'pnotify.reference': 'lib/pnotify/pnotify.reference' // PNotify - reference push notification extension + // PNotify // v4.0.0 PNotify - notification core file - https://sciactive.com/pnotify + 'pnotify.loader': './app/pnotify.loader', + 'PNotify': 'lib/pnotify/PNotify', + 'PNotifyButtons': 'lib/pnotify/PNotifyButtons', + 'PNotifyCallbacks': 'lib/pnotify/PNotifyCallbacks', + 'PNotifyDesktop': 'lib/pnotify/PNotifyDesktop', + 'NonBlock': 'lib/pnotify/NonBlock' // v1.0.8 NonBlock.js - for PNotify "nonblock" feature }, shim: { bootstrap: { @@ -118,6 +111,9 @@ requirejs.config({ 'datatables.net-responsive': { deps: ['datatables.net'] }, + 'datatables.net-rowgroup': { + deps: ['datatables.net'] + }, 'datatables.net-select': { deps: ['datatables.net'] }, @@ -138,9 +134,6 @@ requirejs.config({ window.Raphael = Raphael; } }, - pnotify: { - deps: ['jquery'] - }, easyPieChart: { deps: ['jquery'] }, @@ -157,9 +150,6 @@ requirejs.config({ validator: { deps: ['jquery', 'bootstrap'] }, - lazylinepainter: { - deps: ['jquery', 'bootstrap'] - }, blueImpGallery: { deps: ['jquery'] }, @@ -167,10 +157,7 @@ requirejs.config({ deps: ['bootstrap'] }, bootstrapToggle: { - deps: ['jquery'] - }, - lazyload: { - deps: ['jquery'] + deps: ['jquery', 'bootstrap'] }, summernote: { deps: ['jquery'] diff --git a/js/app/admin.js b/js/app/admin.js index 64c7198b..e09d119a 100644 --- a/js/app/admin.js +++ b/js/app/admin.js @@ -7,7 +7,7 @@ define([ 'app/init', 'app/util', 'datatables.loader' -], ($, Init, Util) => { +], ($, Init, Util, dtLoader) => { 'use strict'; @@ -73,21 +73,23 @@ define([ setPageObserver(); - let temp = $('.dataTable').dataTable({ - pageLength: 100, - paging: true, - ordering: true, - autoWidth: false, - hover: false, - language: { - emptyTable: 'No entries', - zeroRecords: 'No entries found', - lengthMenu: 'Show _MENU_ entries', - info: 'Showing _START_ to _END_ of _TOTAL_ entries' - }, - data: null // use DOM data overwrites [] default -> data.loader.js + dtLoader.initDefaultConfig({ + breakpoints: Init.breakpoints + }).then(() => { + let temp = $('.dataTable').dataTable({ + pageLength: 100, + paging: true, + ordering: true, + autoWidth: false, + hover: false, + language: { + emptyTable: 'No entries', + zeroRecords: 'No entries found', + lengthMenu: 'Show _MENU_ entries', + info: 'Showing _START_ to _END_ of _TOTAL_ entries' + }, + data: null // use DOM data overwrites [] default -> data.loader.js + }); }); - - }); }); \ No newline at end of file diff --git a/js/app/conf/signature_type.js b/js/app/conf/signature_type.js index 311c2148..333fe5a0 100644 --- a/js/app/conf/signature_type.js +++ b/js/app/conf/signature_type.js @@ -184,7 +184,7 @@ define([], () => { 22: 'Central Blood Raider Sparking Transmitter', 23: 'Central Blood Raider Survey Site', 24: 'Central Guristas Command Center', - 25: 'Central Guristas Data Mining Center', + 25: 'Central Guristas Data Mining Site', 26: 'Central Guristas Sparking Transmitter', 27: 'Central Guristas Survey Site', 28: 'Central Sansha Command Center', @@ -357,58 +357,85 @@ define([], () => { // all k-space exits are static or K162 let c1WH = { - 1: 'H121 - C1', - 2: 'C125 - C2', - 3: 'O883 - C3', - 4: 'M609 - C4', - 5: 'L614 - C5', - 6: 'S804 - C6', - 7: 'F353 - C12 Thera' + 1: 'H121 - C1', + 2: 'C125 - C2', + 3: 'O883 - C3', + 4: 'M609 - C4', + 5: 'L614 - C5', + 6: 'S804 - C6', + 7: 'N110 - H', + 8: 'J244 - L', + 9: 'Z060 - 0.0', + 10: 'F353 - C12 Thera' }; // all w-space -> w-space are statics or K162 let c2WH = { - 1: 'Z647 - C1', - 2: 'D382 - C2', - 3: 'O477 - C3', - 4: 'Y683 - C4', - 5: 'N062 - C5', - 6: 'R474 - C6', - 7: 'F135 - C12 Thera' + 1: 'Z647 - C1', + 2: 'D382 - C2', + 3: 'O477 - C3', + 4: 'Y683 - C4', + 5: 'N062 - C5', + 6: 'R474 - C6', + 7: 'B274 - H', + 8: 'A239 - L', + 9: 'E545 - 0.0', + 10: 'F135 - C12 Thera' }; // all k-space exits are static or K162 let c3WH = { - 1: 'V301 - C1', - 2: 'I182 - C2', - 3: 'N968 - C3', - 4: 'T405 - C4', - 5: 'N770 - C5', - 6: 'A982 - C6', - 7: 'F135 - C12 Thera' + 1: 'V301 - C1', + 2: 'I182 - C2', + 3: 'N968 - C3', + 4: 'T405 - C4', + 5: 'N770 - C5', + 6: 'A982 - C6', + 7: 'D845 - H', + 8: 'U210 - L', + 9: 'K346 - 0.0', + 10: 'F135 - C12 Thera' }; // no *wandering* w-space -> w-space // all holes are statics or K162 let c4WH = { - 1: 'S047 - H', - 2: 'N290 - L', - 3: 'K329 - 0.0' + 1: 'P060 - C1', + 2: 'N766 - C2', + 3: 'C247 - C3', + 4: 'X877 - C4', + 5: 'H900 - C5', + 6: 'U574 - C6', + 7: 'S047 - H', + 8: 'N290 - L', + 9: 'K329 - 0.0' }; let c5WH = { - 1: 'D792 - H', - 2: 'C140 - L', - 3: 'Z142 - 0.0' + 1: 'Y790 - C1', + 2: 'D364 - C2', + 3: 'M267 - C3', + 4: 'E175 - C4', + 5: 'H296 - C5', + 6: 'V753 - C6', + 7: 'D792 - H', + 8: 'C140 - L', + 9: 'Z142 - 0.0' }; let c6WH = { - 1: 'B520 - H', - 2: 'D792 - H', - 3: 'C140 - L', - 4: 'C391 - L', - 5: 'C248 - 0.0', - 6: 'Z142 - 0.0' + 1: 'Q317 - C1', + 2: 'G024 - C2', + 3: 'L477 - C3', + 4: 'Z457 - C4', + 5: 'V911 - C5', + 6: 'W237 - C6', + 7: 'B520 - H', + 8: 'D792 - H', + 9: 'C140 - L', + 10: 'C391 - L', + 11: 'C248 - 0.0', + 12: 'Z142 - 0.0' }; // Shattered WH (some of them are static) diff --git a/js/app/counter.js b/js/app/counter.js index 866c92c9..4e2d0fc8 100644 --- a/js/app/counter.js +++ b/js/app/counter.js @@ -107,7 +107,7 @@ define([ updateDateDiff(element, date, round); } }; - Cron.set(counterTask); + counterTask.start(); element.attr(config.counterTaskAttr, taskName); } @@ -138,7 +138,7 @@ define([ counterTask.task = timer => { tableApi.cells(null, columnSelector).every(cellUpdate); }; - Cron.set(counterTask); + counterTask.start(); tableElement.attr(config.counterTaskAttr, taskName); }; diff --git a/js/app/datatables.loader.js b/js/app/datatables.loader.js index 6f0aa089..21dab020 100644 --- a/js/app/datatables.loader.js +++ b/js/app/datatables.loader.js @@ -1,19 +1,23 @@ define([ 'jquery', - 'app/init', - 'app/counter', 'app/promises/promise.deferred', 'app/promises/promise.timeout', 'datatables.net', + 'datatables.net-select', 'datatables.net-buttons', 'datatables.net-buttons-html', 'datatables.net-responsive', - 'datatables.net-select' -], ($, Init, Counter, DeferredPromise, TimeoutPromise) => { + 'datatables.net-rowgroup' +], ($, DeferredPromise, TimeoutPromise) => { 'use strict'; - // all Datatables stuff is available... - let initDefaultDatatablesConfig = () => { + /** + * DataTable dependencies loaded + * -> init default DataTables config (e.g. custom plugins) + * @param options + * @returns {Promise} + */ + let initDefaultConfig = options => new Promise(resolve => { $.extend(true, $.fn.dataTable.defaults, { pageLength: -1, @@ -25,14 +29,14 @@ define([ info: '_START_ - _END_ of _TOTAL_ entries' }, responsive: { - breakpoints: Init.breakpoints, + breakpoints: options.breakpoints, details: false }, columnDefs: [], data: [] }); - // global open event + // global destroy event $(document).on('destroy.dt', '.dataTable ', function(e, settings){ let table = $(this); let tableApi = new $.fn.dataTable.Api(settings); @@ -42,8 +46,9 @@ define([ tableApi.endProcesses(); } - // remove all active counters in table - Counter.destroyTimestampCounter(table, true); + if(typeof options.onDestroy === 'function'){ + options.onDestroy(table); + } }); // Status Plugin ============================================================================================== @@ -157,7 +162,11 @@ define([ cFeature: 'S', sFeature: 'StatusTable' }); - }; - initDefaultDatatablesConfig(); + resolve(); + }); + + return { + initDefaultConfig + }; }); \ No newline at end of file diff --git a/js/app/init.js b/js/app/init.js index 5345b4dc..cdcf0886 100644 --- a/js/app/init.js +++ b/js/app/init.js @@ -18,45 +18,39 @@ define([], () => { return { path: { - img: '/public/img/', // path for images api: '/api/rest', //ajax URL - REST API // user API - getCaptcha: '/api/user/getCaptcha', // ajax URL - get captcha image - getServerStatus: '/api/user/getEveServerStatus', // ajax URL - get EVE-Online server status - getCookieCharacterData: '/api/user/getCookieCharacter', // ajax URL - get character data from cookie - logIn: '/api/user/logIn', // ajax URL - login - logout: '/api/user/logout', // ajax URL - logout - openIngameWindow: '/api/user/openIngameWindow', // ajax URL - open inGame Window - saveUserConfig: '/api/user/saveAccount', // ajax URL - saves/update user account - deleteAccount: '/api/user/deleteAccount', // ajax URL - delete Account data + getCaptcha: '/api/User/getCaptcha', // ajax URL - get captcha image + getServerStatus: '/api/User/getEveServerStatus', // ajax URL - get EVE-Online server status + getCookieCharacterData: '/api/User/getCookieCharacter', // ajax URL - get character data from cookie + logIn: '/api/User/logIn', // ajax URL - login + logout: '/api/User/logout', // ajax URL - logout + openIngameWindow: '/api/User/openIngameWindow', // ajax URL - open inGame Window + saveUserConfig: '/api/User/saveAccount', // ajax URL - saves/update user account + deleteAccount: '/api/User/deleteAccount', // ajax URL - delete Account data // access API - searchAccess: '/api/access/search', // ajax URL - search user/corporation/ally by name + searchAccess: '/api/Access/search', // ajax URL - search user/corporation/ally by name // main config/map ping API - initData: '/api/map/initData', // ajax URL - get static configuration data - getAccessData: '/api/map/getAccessData', // ajax URL - get map access tokens (WebSocket) - updateMapData: '/api/map/updateData', // ajax URL - main map update trigger - updateUserData: '/api/map/updateUserData', // ajax URL - main map user data trigger - updateUnloadData: '/api/map/updateUnloadData', // post URL - for my sync onUnload + initData: '/api/Map/initData', // ajax URL - get static configuration data + getAccessData: '/api/Map/getAccessData', // ajax URL - get map access tokens (WebSocket) + updateMapData: '/api/Map/updateData', // ajax URL - main map update trigger + updateUserData: '/api/Map/updateUserData', // ajax URL - main map user data trigger + updateUnloadData: '/api/Map/updateUnloadData', // post URL - for my sync onUnload // map API - saveMap: '/api/map/save', // ajax URL - save/update map - deleteMap: '/api/map/delete', // ajax URL - delete map - importMap: '/api/map/import', // ajax URL - import map - getMapConnectionData: '/api/map/getConnectionData', // ajax URL - get connection data - getMapLogData: '/api/map/getLogData', // ajax URL - get logs data + importMap: '/api/Map/import', // ajax URL - import map + getMapConnectionData: '/api/Map/getConnectionData', // ajax URL - get connection data + getMapLogData: '/api/Map/getLogData', // ajax URL - get logs data // system API - getSystemGraphData: '/api/system/graphData', // ajax URL - get all system graph data - setDestination: '/api/system/setDestination', // ajax URL - set destination - pokeRally: '/api/system/pokeRally', // ajax URL - send rally point pokes - // route API - searchRoute: '/api/route/search', // ajax URL - search system routes + setDestination: '/api/System/setDestination', // ajax URL - set destination + pokeRally: '/api/System/pokeRally', // ajax URL - send rally point pokes // stats API - getStatisticsData: '/api/statistic/getData', // ajax URL - get statistics data (activity log) + getStatisticsData: '/api/Statistic/getData', // ajax URL - get statistics data (activity log) // universe API - searchUniverseData: '/api/universe/search', // ajax URL - search universe data by category Ids - searchUniverseSystemData: '/api/universe/systems', // ajax URL - search universe system data by name - getConstellationData: '/api/universe/constellationData', // ajax URL - get system constellation data + searchUniverseData: '/api/Universe/search', // ajax URL - search universe data by category Ids + searchUniverseSystemData: '/api/Universe/systems', // ajax URL - search universe system data by name + getConstellationData: '/api/Universe/constellationData', // ajax URL - get system constellation data // GitHub API - gitHubReleases: '/api/github/releases' // ajax URL - get release info from GitHub + gitHubReleases: '/api/GitHub/releases' // ajax URL - get release info from GitHub }, breakpoints: [ {name: 'screen-xl', width: Infinity}, @@ -141,6 +135,18 @@ define([], () => { class: 'fa-hat-wizard', label: 'hat wizard', unicode: '' + },{ + class: 'fa-cross', + label: 'cross', + unicode: '' + }, { + class: 'fa-cannabis', + label: 'cannabis', + unicode: '' + }, { + class: 'fa-spider', + label: 'spider', + unicode: '' }, { class: 'fa-plane', label: 'plane', diff --git a/js/app/lib/cache.js b/js/app/lib/cache.js index 0ef63b56..2b541343 100644 --- a/js/app/lib/cache.js +++ b/js/app/lib/cache.js @@ -5,7 +5,7 @@ define([], () => { * Abstract Cache Strategy class * @type {AbstractStrategy} */ - let AbstractStrategy = class AbstractStrategy { + class AbstractStrategy { constructor(){ if(new.target === AbstractStrategy){ throw new TypeError('Cannot construct AbstractStrategy instances directly'); @@ -19,7 +19,7 @@ define([], () => { static create(){ return new this(); } - }; + } /** * LIFO Cache Strategy - First In First Out @@ -27,7 +27,7 @@ define([], () => { * without any regard to how often or how many times they were accessed before. * @type {StrategyFIFO} */ - let StrategyFIFO = class StrategyFIFO extends AbstractStrategy { + class StrategyFIFO extends AbstractStrategy { valueToCompare(metaData){ return metaData.age(); } @@ -35,7 +35,7 @@ define([], () => { compare(a, b){ return b - a; } - }; + } /** * LFU Cache Strategy - Least Frequently Used @@ -43,7 +43,7 @@ define([], () => { * Those that are used least often are discarded first * @type {StrategyLFU} */ - let StrategyLFU = class StrategyLFU extends AbstractStrategy { + class StrategyLFU extends AbstractStrategy { valueToCompare(metaData){ return metaData.hitCount; } @@ -51,7 +51,7 @@ define([], () => { compare(a, b){ return a - b; } - }; + } /** * LRU Cache Strategy - Least Recently Used @@ -59,7 +59,7 @@ define([], () => { * No matter how often they have been accessed. * @type {StrategyLRU} */ - let StrategyLRU = class StrategyLRU extends AbstractStrategy { + class StrategyLRU extends AbstractStrategy { valueToCompare(metaData){ return metaData.hits[metaData.hits.length - 1] || metaData.set; } @@ -67,26 +67,26 @@ define([], () => { compare(a, b){ return a - b; } - }; + } /** * Each entry in cache also has its own instance of CacheEntryMeta * -> The configured Cache Strategy use this meta data for eviction policy * @type {CacheEntryMeta} */ - let CacheEntryMeta = class CacheEntryMeta { + class CacheEntryMeta { constructor(ttl, tSet){ - this.ttl = ttl; - this.tSet = tSet || this.constructor.now(); - this.tHits = []; + this._ttl = ttl; // ttl < 0 => no expire + this._tSet = tSet || this.constructor.now(); + this._tHits = []; } get set(){ - return this.tSet; + return this._tSet; } get hits(){ - return this.tHits; + return this._tHits; } get hitCount(){ @@ -94,15 +94,15 @@ define([], () => { } newHit(current){ - this.tHits.push(current || this.constructor.now()); + this._tHits.push(current || this.constructor.now()); } age(current){ - return (current || this.constructor.now()) - this.tSet; + return (current || this.constructor.now()) - this._tSet; } expired(current){ - return this.ttl < this.age(current); + return this._ttl < 0 ? false : this._ttl < this.age(current); } static now(){ @@ -112,7 +112,7 @@ define([], () => { static create(ttl, tSet){ return new this(ttl, tSet); } - }; + } /** * Each instance of Cache represents a key value in memory data store @@ -123,26 +123,18 @@ define([], () => { * if cache reaches maxSize limit, to increase performance. * @type {Cache} */ - let Cache = class Cache { + class Cache { - constructor(config){ - this.config = Object.assign({},{ - name: 'Default', // custom name for identification - ttl: 3600, // default ttl for cache entries - maxSize: 600, // max cache entries - bufferSize: 10, // cache entry count in percent to be removed if maxSize reached - strategy: 'FIFO', // cache strategy policy - debug: false // debug output in console - }, config); - - this.store = new Map(); - this.metaStore = new WeakMap(); - this.strategy = this.constructor.setStrategy(this.config.strategy); + constructor(config = {}){ + this._config = Object.assign({}, Cache.defaultConfig, config); + this._store = new Map(); + this._metaStore = new WeakMap(); + this._strategy = this.constructor.setStrategy(this._config.strategy); this.debug = (msg,...data) => { - if(this.config.debug){ + if(this._config.debug){ data = (data || []); - data.unshift(this.config.name); + data.unshift(this._config.name); console.debug('debug: CACHE %o | ' + msg, ...data); } }; @@ -151,34 +143,34 @@ define([], () => { } get size(){ - return this.store.size; + return this._store.size; } isFull(){ - return this.size>= this.config.maxSize; + return this.size>= this._config.maxSize; } set(key, value, ttl){ - if(this.store.has(key)){ + if(this._store.has(key)){ this.debug('SET key %o, UPDATE value %o', key, value); - this.store.set(key, value); + this._store.set(key, value); }else{ this.debug('SET key %o, NEW value %o', key, value); if(this.isFull()){ this.debug(' ↪ FULL trim cache…'); this.trim(this.trimCount(1)); } - this.store.set(key, value); + this._store.set(key, value); } - this.metaStore.set(value, CacheEntryMeta.create(ttl || this.config.ttl)); + this._metaStore.set(value, CacheEntryMeta.create(ttl || this._config.ttl)); } get(key){ - if(this.store.has(key)){ - let value = this.store.get(key); + if(this._store.has(key)){ + let value = this._store.get(key); if(value){ - let metaData = this.metaStore.get(value); + let metaData = this._metaStore.get(value); if(metaData.expired()){ this.debug('EXPIRED key %o delete', key); this.delete(key); @@ -199,8 +191,8 @@ define([], () => { keysForTrim(count){ let trimKeys = []; let compare = []; - for(let [key, value] of this.store){ - let metaData = this.metaStore.get(value); + for(let [key, value] of this._store){ + let metaData = this._metaStore.get(value); if(metaData.expired()){ trimKeys.push(key); if(count === trimKeys.length){ @@ -209,14 +201,14 @@ define([], () => { }else{ compare.push({ key: key, - value: this.strategy.valueToCompare(metaData) + value: this._strategy.valueToCompare(metaData) }); } } let countLeft = count - trimKeys.length; if(countLeft > 0){ - compare = compare.sort((a, b) => this.strategy.compare(a.value, b.value)); + compare = compare.sort((a, b) => this._strategy.compare(a.value, b.value)); trimKeys = trimKeys.concat(compare.splice(0, countLeft).map(a => a.key)); } @@ -224,20 +216,20 @@ define([], () => { } keys(){ - return this.store.keys(); + return this._store.keys(); } delete(key){ - return this.store.delete(key); + return this._store.delete(key); } clear(){ - this.store.clear(); + this._store.clear(); } trimCount(spaceLeft){ - let bufferSize = Math.max(Math.round(this.config.maxSize / 100 * this.config.bufferSize), spaceLeft); - return Math.min(Math.max(this.size - this.config.maxSize + bufferSize, 0), this.size); + let bufferSize = Math.max(Math.round(this._config.maxSize / 100 * this._config.bufferSize), spaceLeft); + return Math.min(Math.max(this.size - this._config.maxSize + bufferSize, 0), this.size); } trim(count){ @@ -253,9 +245,9 @@ define([], () => { status(){ return { - config: this.config, - store: this.store, - metaStore: this.metaStore + config: this._config, + store: this._store, + metaStore: this._metaStore }; } @@ -269,6 +261,15 @@ define([], () => { } } + } + + Cache.defaultConfig = { + name: 'Default', // custom unique name for identification + ttl: 3600, // default ttl for cache entries + maxSize: 600, // max cache entries + bufferSize: 10, // cache entry count in percent to be removed if maxSize reached + strategy: 'FIFO', // cache strategy policy + debug: false // debug output in console }; return Cache; diff --git a/js/app/lib/cron.js b/js/app/lib/cron.js index 3f7ef16c..2775a442 100644 --- a/js/app/lib/cron.js +++ b/js/app/lib/cron.js @@ -11,7 +11,7 @@ define([ console.info('task1 function():', timer.getTotalTimeValues()); return 'OK'; }; - Cron.set(task1); + task1.start(); Example2 run task every 3 seconds --------------------------------------------------------------------------------- let task1 = Cron.new('task1', {precision: 'seconds', interval: 3, timeout: 100}); @@ -19,7 +19,7 @@ define([ console.info('task1 function():', timer.getTotalTimeValues()); return 'OK'; }; - Cron.set(task1); + task1.start(); Example3 resolve Promise on run ---------------------------------------------------------------------------------- let task1 = Cron.new('task1', {precision: 'seconds', interval: 1, timeout: 100}); @@ -35,14 +35,14 @@ define([ }); }); }; - Cron.set(task1); + task1.start(); Example4 run task once at given Date() -------------------------------------------------------------------------- let dueDate = new Date(); dueDate.setSeconds(dueDate.getSeconds() + 5); let task2 = Cron.new('task2', {precision: 'seconds', timeout: 100, dueDate: dueDate}); task2.task = () => 'OK task2'; - Cron.set(task2); + task2.start(); */ /** @@ -51,35 +51,42 @@ define([ * @type {Task} */ let Task = class Task { - constructor(name, config){ + /** + * + * @param {string} name + * @param {{}} config + * @param {CronManager} manager + */ + constructor(name, config, manager = null){ if(typeof name !== 'string'){ throw new TypeError('Task "name" must be instance of String, Type of "' + typeof name + '" given'); } this._config = Object.assign({}, this.constructor.defaultConfig, config); this._name = name; // unique name for identification - this._task = undefined; // task to run, instanceof Function, can also return a Promise - this._manager = undefined; // reference to CronManager() that handles this task + this._task = (timer, task) => {}; // task to run, instanceof Function, can also return a Promise + this._manager = manager; // reference to CronManager() that handles this task + this._runCount = 0; // counter for run() calls this._runQueue = new Map(); // current run() processes. > 1 requires config.isParallel: true - this._runCount = 0; // total run counter for this task this._lastTotalTimeValues = undefined; // time values of last run() } + /** + * @returns {string} + */ get name(){ return this._name; } - get task(){ + /** + * @returns {(function())} task + */ + get task() { return this._task; } - get runCount(){ - return this._runCount; - } - - get precision(){ - return this._config.precision; - } - + /** + * @param {(function())} task + */ set task(task){ if(task instanceof Function){ this._task = task; @@ -88,34 +95,120 @@ define([ } } + /** + * @returns {number} + */ + get runCount(){ + return this._runCount; + } + + /** + * @returns {string} + */ + get precision(){ + return this.get('precision'); + } + + /** + * @returns {boolean} + */ + get paused(){ + return this.get('paused'); + } + + /** + * @returns {boolean} + */ + get targetAchieved(){ + return this.get('targetRunCount') ? this.runCount >= this.get('targetRunCount') : false; + } + + /** + * @returns {number} + */ + get targetProgress(){ + return parseFloat( + parseFloat( + (!this.get('targetRunCount') || !this.runCount) ? + 0 : + (100 / this.get('targetRunCount') * this.runCount) + ).toFixed(2)); + } + + /** + * @param option + * @returns {*} + */ get(option){ return this._config[option]; } + /** + * @param {string} option + * @param {*} value + */ set(option, value){ this._config[option] = value; } - setManager(manager){ - this._manager = manager; + /** + * connect CronManager with instance + * @param {CronManager} manager + */ + connect(manager = this._manager){ + if(manager instanceof CronManager){ + if(manager !== this._manager){ + // disconnect from current manager (if exists) + this.disconnect(); + this._manager = manager; + } + this._manager.set(this); + }else{ + throw new TypeError('Parameter must be instance of CronManager. Type of "' + typeof manager + '" given'); + } } + /** + * disconnect from CronManager + * @param {CronManager} manager + */ + disconnect(manager = this._manager){ + if(manager instanceof CronManager){ + if(this.isConnected(manager)){ + this._manager.delete(this._name); + } + }else{ + throw new TypeError('Parameter must be instance of CronManager. Type of "' + typeof manager + '" given'); + } + } + + /** + * checks if CronManager is connected with instance + * @param {CronManager} manager + * @returns {boolean} + */ + isConnected(manager = this._manager){ + return (manager instanceof CronManager) && + manager === this._manager && + manager.has(this._name); + } + + /** + * if task is currently running + * @returns {boolean} + */ isRunning(){ return !!this._runQueue.size; } - delete(){ - let isDeleted = false; - if(this._manager){ - isDeleted = this._manager.delete(this.name); - } - return isDeleted; - } - + /** + * @param timer + * @returns {boolean} + */ isDue(timer){ - if(this._config.dueDate instanceof Date){ + if(this.get('dueDate') instanceof Date){ // run once at dueDate - if(new Date().getTime() >= this._config.dueDate.getTime()){ + if(new Date().getTime() >= this.get('dueDate').getTime()){ return true; } }else{ @@ -124,8 +217,8 @@ define([ let totalTimeValuePrecision = totalTimeValues[this.precision]; totalTimeValuePrecision -= this._lastTotalTimeValues ? this._lastTotalTimeValues[this.precision] : 0; if( - this._config.interval === 1 || - totalTimeValuePrecision % this._config.interval === 0 + this.get('interval') === 1 || + totalTimeValuePrecision % this.get('interval') === 0 ){ return true; } @@ -133,23 +226,30 @@ define([ return false; } + /** + * @param timer + */ invoke(timer){ if( + !this.paused && this.isDue(timer) && - (!this.isRunning() || this._config.isParallel) + (!this.isRunning() || this.get('isParallel')) ){ this.run(timer); } } + /** + * @param timer + */ run(timer){ this._lastTotalTimeValues = Object.assign({}, timer.getTotalTimeValues()); let runId = 'run_' + (++this._runCount); let runExec = resolve => { - resolve(this.task(timer, this)); + resolve(this._task(timer, this)); }; - let myProm = this._config.timeout > 0 ? new TimeoutPromise(runExec, this._config.timeout) : new Promise(runExec); + let myProm = this.get('timeout') > 0 ? new TimeoutPromise(runExec, this.get('timeout')) : new Promise(runExec); myProm.then(payload => { // resolved within timeout -> wait for finally() block }).catch(error => { @@ -162,14 +262,37 @@ define([ // -> remove from _runQueue this._runQueue.delete(runId); - // remove this task from store after run - if(this._config.dueDate instanceof Date){ - this.delete(); + if(this.get('dueDate') instanceof Date){ + this.disconnect(); + } + + if(this.targetAchieved){ + this.stop(); } }); this._runQueue.set(runId, myProm); } + + // Task controls ---------------------------------------------------------------------------------------------- + + start(){ + this.set('paused', false); + this.connect(); + } + + stop(){ + this.reset(); + this.disconnect(); + } + + pause(){ + this.set('paused', true); + } + + reset(){ + this._runCount = 0; + } }; Task.defaultConfig = { @@ -177,7 +300,9 @@ define([ isParallel: false, // if true this task can run parallel, e.g. if prev execution has not finished interval: 1, // relates to 'precision'. 'interval' = 3 and 'precision' = "seconds" -> run every 3 seconds dueDate: undefined, // if Date() instance is set, task only runs once at dueDate - timeout: 50 // if > 0, execution time that exceeds timeout (ms) throw error + timeout: 50, // if > 0, execution time that exceeds timeout (ms) throw error + paused: false, // if true this task will not run() but will be invoce()´ed + targetRunCount: 0 // if > 0, task will stop if targetRunCount is reached }; @@ -188,6 +313,9 @@ define([ */ let CronManager = class CronManager { + /** + * @param {{}} config + */ constructor(config){ this._config = Object.assign({}, this.constructor.defaultConfig, config); this._timerConfig = Object.assign({}, this.constructor.defaultTimerConfig); @@ -211,47 +339,75 @@ define([ }; } + /** + * @param {string} name + * @param {{}} config + * @returns {Task} + */ new(name, config){ - return new Task(name, config); + return new Task(name, config, this); } + /** + * @param {Task} task + */ set(task){ if(task instanceof Task){ - // check for unique task name, or update existing task - if(!this.has(task.name) || (this.get(task.name) === task)){ - // set new or update existing task - task.setManager(this); + // check for unique task name + if(!this.has(task.name)){ + // connect new task + // -> must be before connect(this)! (prevents infinite loop) this._tasks.set(task.name, task); + task.connect(this); + this.debug('SET/UPDATE task: %o config: %o', task.name, task); // start timer (if it is not already running) this.auto(); - }else{ - console.warn('FAILED to set task. Task name %o already exists', task.name); } }else{ throw new TypeError('Parameter must be instance of Task'); } } + /** + * @param {string} name + * @param {{}} config + */ setNew(name, config){ this.set(this.new(name, config)); } + /** + * @param {string} name + * @returns {Task|undefined} + */ get(name){ return this._tasks.get(name); } + /** + * @param {string} name + * @returns {boolean} + */ has(name){ return this._tasks.has(name); } + /** + * @param {string} name + */ delete(name){ - let isDeleted = this._tasks.delete(name); - if(isDeleted){ + if(this.has(name)){ + let task = this._tasks.get(name); + // disconnect task + // -> must be before disconnect(this)! (prevents infinite loop) + this._tasks.delete(name); + task.disconnect(this); + this.debug('DELETE task: %o', name); + // stop timer (if no more tasks connected) this.auto(); } - return isDeleted; } clear(){ @@ -260,6 +416,10 @@ define([ this.auto(); } + /** + * @param {string} precision + * @returns {Task[]} + */ tasksByPrecision(precision){ let tasks = []; this._tasks.forEach(task => { diff --git a/js/app/lib/dataStore.js b/js/app/lib/dataStore.js new file mode 100644 index 00000000..3a52c853 --- /dev/null +++ b/js/app/lib/dataStore.js @@ -0,0 +1,57 @@ +define([], () => { + 'use strict'; + + /* + // Example usage -------------------------------------------------------------------------------------------------- + // global accessible DataStore instance + window.dataStore = new DataStore(); + + // extend HTMLElement class with an interface to set/get data to it + HTMLElement.prototype.setData = function(key, value){ + window.dataStore.set(this, key, value); + }; + + HTMLElement.prototype.getData = function(key){ + return window.dataStore.get(this, key); + }; + */ + + /** + * Stores data to an object + * -> can be used as a replacement for jQuery $.data() + */ + return class DataStore { + constructor() { + this._store = new WeakMap(); + } + + set(obj, key, value) { + if (!this._store.has(obj)) { + this._store.set(obj, new Map()); + } + this._store.get(obj).set(key, value); + return obj; + } + + get(obj, key) { + return this._store.has(obj) && (key ? this._store.get(obj).get(key) : this._store.get(obj)); + } + + has(obj, key) { + return this._store.has(obj) && this._store.get(obj).has(key); + } + + remove(obj, key) { + let ret = false; + if (this._store.has(obj)) { + ret = this._store.get(obj).delete(key); + // remove obj if store is empty + // -> 'size' property is does not exist if valueStore is WeakMap + if (!this._store.get(obj).size) { + this._store.delete(obj); + } + } + return ret; + } + }; +}); \ No newline at end of file diff --git a/js/app/lib/dragSelect.js b/js/app/lib/dragSelect.js index f47a165b..a2998679 100644 --- a/js/app/lib/dragSelect.js +++ b/js/app/lib/dragSelect.js @@ -135,7 +135,6 @@ define(['app/lib/eventHandler'], (EventHandler) => { this._selectBox = document.createElement('div'); this._selectBox.id = this._instanceName; this._selectBox.classList.add(this._config.selectBoxClass); - this._selectBox.style.position = 'absolute'; this._config.target.after(this._selectBox); } @@ -149,12 +148,11 @@ define(['app/lib/eventHandler'], (EventHandler) => { top: e.pageY - this._targetDim.top }); - Object.assign(this._selectBox.style,{ - left: this._selectBoxOrigin.left + 'px', - top: this._selectBoxOrigin.top + 'px', - width: '1px', - height: '1px' - }); + // limit render "reflow" bny adding all properties at once + this._selectBox.style.cssText = `--selectBox-left: ${this._selectBoxOrigin.left}px; ` + + `--selectBox-top: ${this._selectBoxOrigin.top}px; ` + + `--selectBox-width: 1px; ` + + `--selectBox-height: 1px;`; this._selectBox.classList.add(this._config.activeClass); @@ -195,12 +193,10 @@ define(['app/lib/eventHandler'], (EventHandler) => { let dimensionHash = [newWidth, newHeight].join('_'); if(this._selectBoxDimHash !== dimensionHash){ this._selectBoxDimHash = dimensionHash; - Object.assign(this._selectBox.style,{ - left: newLeft + 'px', - top: newTop + 'px', - width: newWidth + 'px', - height: newHeight + 'px' - }); + this._selectBox.style.cssText = `--selectBox-left: ${newLeft}px; ` + + `--selectBox-top: ${newTop}px; ` + + `--selectBox-width: ${newWidth}px; ` + + `--selectBox-height: ${newHeight}px;`; // set drag position data (which corner) this._selectBox.dataset.origin = this.getSelectBoxDragOrigin(left, top, newLeft, newTop).join('|'); diff --git a/js/app/lib/localStore.js b/js/app/lib/localStore.js new file mode 100644 index 00000000..68283d22 --- /dev/null +++ b/js/app/lib/localStore.js @@ -0,0 +1,394 @@ +define([ + 'localForage', + 'app/promises/promise.queue', + 'app/promises/promise.deferred', +], (LocalForage, PromiseQueue, DeferredPromise) => { + 'use strict'; + + /** + * Instances of LocalStore handle its own LocalForage instance + */ + class LocalStore { + constructor(config, LocalForageConfig){ + this._config = Object.assign({}, this.constructor.defaultConfig, config); + + let initPromise = new DeferredPromise(); + this._processQueue = new PromiseQueue(); + this._processQueue.enqueue(() => initPromise); + + this._localforage = LocalForage.createInstance(Object.assign({}, LocalStore.LocalForageConfig, LocalForageConfig)); + this._localforage.ready().then(() => initPromise.resolve()); + + this._manager = null; // reference to LocalStoreManager() that manages this LocalStore instance + + this.debug = (msg,...data) => { + if(this._config.debug){ + data = (data || []); + data.unshift(this.constructor.name, this._config.name); + console.debug('debug: %s %o | ' + msg, ...data); + } + }; + } + + /** + * set scope for this instance + * -> all read/write actions are scoped + * this is a prefix for all keys! + * @param scope + */ + set scope(scope){ + if(LocalStore.isString(scope)){ + this._config.scope = scope; + }else{ + throw new TypeError('Scope must be instance of "String", Type of "' + typeof scope + '" given'); + } + } + + get scope(){ + return this._config.scope; + } + + /** + * get item + * @param key + * @param successCallback + * @returns {Promise} + */ + getItem(key, successCallback = undefined){ + key = this.fixKey(key); + let propArray = LocalStore.keyToArray(key); + let rootKey = propArray.shift(); + + let getItem = () => this._localforage.getItem(key, successCallback); + if(propArray.length){ + getItem = () => { + return this._localforage.getItem(rootKey) + .then(data => { + if(LocalStore.isObject(data)){ + // find nested property + return LocalStore.findObjProp(data, propArray); + }else{ + // rootKey not found -> propArray path not exists + return Promise.resolve(null); + } + }); + }; + } + + return this._processQueue.enqueue(() => getItem()); + } + + /** + * set/update existing value + * @param key e.g. nested object key' first.a.b.test' + * @param value + * @param successCallback + * @returns {Promise} + */ + setItem(key, value, successCallback = undefined){ + key = this.fixKey(key); + let propArray = LocalStore.keyToArray(key); + let rootKey = propArray.shift(); + + let getItem = () => Promise.resolve(value); + if(propArray.length){ + getItem = () => { + return this._localforage.getItem(rootKey) + .then(rootVal => { + rootVal = (rootVal === null) ? {} : rootVal; + // update data with new value (merge obj) + LocalStore.updateObjProp(rootVal, value, propArray); + return rootVal; + }); + }; + } + + return this._processQueue.enqueue(() => + getItem() + .then(rootVal => this._localforage.setItem(rootKey, rootVal, successCallback)) + .then(() => Promise.resolve(value)) + ); + } + + /** + * remove item by key + * -> allows deep obj delete if key points to a nested obj prop + * @param key + * @param successCallback + * @returns {Promise} + */ + removeItem(key, successCallback = undefined){ + key = this.fixKey(key); + let propArray = LocalStore.keyToArray(key); + let rootKey = propArray.shift(); + + let removeItem = () => this._localforage.removeItem(rootKey, successCallback); + if(propArray.length){ + removeItem = () => { + return this._localforage.getItem(rootKey) + .then(data => { + if(LocalStore.isObject(data)){ + // update data -> delete nested prop + LocalStore.deleteObjProp(data, propArray); + return data; + }else{ + // rootKey not found -> nothing to delete + return Promise.reject(new RangeError('No data found for key: ' + rootKey)); + } + }) + .then(value => this._localforage.setItem(rootKey, value, successCallback)) + .catch(e => this.debug('removeItem() error',e)); + }; + } + + return this._processQueue.enqueue(() => removeItem()); + } + + /** + * clear all items in store + * @param successCallback + * @returns {Promise} + */ + clear(successCallback = undefined){ + return this._processQueue.enqueue(() => this._localforage.clear(successCallback)); + } + + /** + * get number of keys in store + * @param successCallback + * @returns {Promise} + */ + length(successCallback = undefined){ + return this._processQueue.enqueue(() => this._localforage.length(successCallback)); + } + + /** + * Get the name of a key based on its index + * @param keyIndex + * @param successCallback + * @returns {Promise|void} + */ + key(keyIndex, successCallback = undefined){ + return this._processQueue.enqueue(() => this._localforage.key(keyIndex, successCallback)); + } + + /** + * get list of all keys in store + * @param successCallback + * @returns {Promise|void} + */ + keys(successCallback = undefined){ + return this._processQueue.enqueue(() => this._localforage.keys(successCallback)); + } + + /** + * drop current LocalForage instance + * -> removes this from LocalStoreManager + * @returns {Promise|void} + */ + dropInstance(){ + return this._processQueue.enqueue(() => + this._localforage.dropInstance().then(() => this._manager.deleteStore(this._config.name)) + ); + } + + /** + * connect LocalStoreManager with instance + * @param {LocalStoreManager} manager + */ + connect(manager){ + if(manager instanceof LocalStoreManager){ + this._manager = manager; + }else{ + throw new TypeError('Parameter must be instance of LocalStoreManager. Type of "' + typeof manager + '" given'); + } + } + + /** + * check if key is Int or String with Int at pos 0 + * -> prefix key + * @param key + * @returns {string} + */ + fixKey(key){ + if(LocalStore.isString(this.scope) && this.scope.length){ + key = [this.scope, key].join('.'); + } + + if( + Number.isInteger(key) || + (LocalStore.isString(key) && parseInt(key.charAt(0), 10)) + ){ + key = [this._config.name, key].join('_'); + } + return key; + } + + /** + * find data from obj prop + * -> deep object search + * @param obj + * @param propArray + * @returns {null|*} + */ + static findObjProp(obj, propArray){ + let [head, ...rest] = propArray; + if(!rest.length){ + return obj[head]; + }else{ + if(LocalStore.isObject(obj[head])){ + return LocalStore.findObjProp(obj[head], rest); + }else{ + return null; + } + } + } + + /** + * update/extend obj with new value + * -> deep object manipulation + * @param obj + * @param value + * @param propArray + */ + static updateObjProp(obj, value, propArray){ + let [head, ...rest] = propArray; + if(!rest.length){ + obj[head] = value; + }else{ + if(!LocalStore.isObject(obj[head])) obj[head] = {}; + LocalStore.updateObjProp(obj[head], value, rest); + } + } + + /** + * delete object prop by propArray path + * -> deep object delete + * @param obj + * @param propArray + */ + static deleteObjProp(obj, propArray){ + let [head, ...rest] = propArray; + if(!rest.length){ + delete obj[head]; + }else{ + if(LocalStore.isObject(obj[head])){ + LocalStore.deleteObjProp(obj[head], rest); + } + } + } + + /** + * converts string key to array + * @param propPath + * @returns {*|string[]} + */ + static keyToArray(propPath){ + return propPath.split('.'); + } + + /** + * build DB name + * @param name + * @returns {string} + */ + static buildDbName(name){ + return [LocalStore.dbNamePrefix, name].join(' '); + } + + /** + * check var for Object + * @param obj + * @returns {boolean} + */ + static isObject(obj){ + return (!!obj) && (obj.constructor === Object); + } + + /** + * check var for Array + * @param arr + * @returns {boolean} + */ + static isArray(arr){ + return (!!arr) && (arr.constructor === Array); + } + + /** + * check var for String + * @param str + * @returns {boolean} + */ + static isString(str){ + return typeof str === 'string'; + } + } + + LocalStore.defaultConfig = { + name: 'default', // custom unique name for identification + debug: false + }; + + LocalStore.dbNamePrefix = 'PathfinderDB'; + LocalStore.LocalForageConfig = { + driver: [LocalForage.INDEXEDDB, LocalForage.WEBSQL, LocalForage.LOCALSTORAGE], + name: LocalStore.dbNamePrefix + }; + + /** + * An instance of LocalStoreManager() handles multiple LocalStore()´s + * -> LocalStore()´s can be set()/delete() from LocalStore() instance + */ + class LocalStoreManager { + + constructor(){ + if(!this.constructor.instance){ + this._store = new Map(); + this.constructor.instance = this; + } + + return this.constructor.instance; + } + + /** + * get LocalStore instance by name + * @param name + * @returns {LocalStore} + */ + getStore(name){ + return this.newStore(name); + } + + /** + * get either existing LocalStore instance + * -> or create new instance + * @param name + * @returns {LocalStore|undefined} + */ + newStore(name){ + if(!this._store.has(name)){ + let store = new LocalStore({ + name: name + }, { + name: LocalStore.buildDbName(name) + }); + store.connect(this); + this._store.set(name, store); + } + return this._store.get(name); + } + + /** + * removes LocalStore instance from Manager + * -> this will not drop LocalForage instance! + * check LocalStore.dropInstance() for graceful delete + * @param name + * @returns {boolean} + */ + deleteStore(name){ + return this._store.delete(name); + } + } + + return new LocalStoreManager(); +}); \ No newline at end of file diff --git a/js/app/lib/prototypes.js b/js/app/lib/prototypes.js index 3ec05362..29954370 100644 --- a/js/app/lib/prototypes.js +++ b/js/app/lib/prototypes.js @@ -1,6 +1,44 @@ -define([], () => { +define([ + 'app/lib/dataStore' +], (DataStore) => { 'use strict'; + // DOM node data store ============================================================================================ + window.dataStore = new DataStore(); + + /** + * @param key + * @param value + * @returns {HTMLElement} + */ + HTMLElement.prototype.setData = function(key, value){ + return window.dataStore.set(this, key, value); + }; + + /** + * @param key + * @returns {*} + */ + HTMLElement.prototype.getData = function(key){ + return window.dataStore.get(this, key); + }; + + /** + * @param key + * @returns {*} + */ + HTMLElement.prototype.hasData = function(key){ + return window.dataStore.has(this, key); + }; + + /** + * @param key + * @returns {*} + */ + HTMLElement.prototype.removeData = function(key){ + return window.dataStore.remove(this, key); + }; + /** * Array diff * [1,2,3,4,5].diff([4,5,6]) => [1,2,3] @@ -21,6 +59,17 @@ define([], () => { return this.filter(i => a.includes(i)); }; + /** + * inverse of Array.filter(), + * [1,2,3,4,5].not(val => val === 3) => [1, 2, 4, 5] + * [1,2,3,4,5].filter(val => val === 3) => [3] + * @param callback + * @returns {*[]} + */ + Array.prototype.not = function(callback) { + return this.filter((...args) => !callback(...args)); + }; + /** * compares two arrays if all elements in a are also in b * element order is ignored @@ -65,14 +114,9 @@ define([], () => { * @returns {number} */ String.prototype.hashCode = function(){ - let hash = 0, i, chr; - if(this.length === 0) return hash; - for(i = 0; i < this.length; i++){ - chr = this.charCodeAt(i); - hash = ((hash << 5) - hash) + chr; - hash |= 0; // Convert to 32bit integer - } - return hash; + let hash = this.split('').reduce((a,b) => (((a << 5) - a) + b.charCodeAt(0))|0, 0); + // make positive + return (hash + 2147483647) + 1; }; String.prototype.trimLeftChars = function(charList){ diff --git a/js/app/lib/resize.js b/js/app/lib/resize.js new file mode 100644 index 00000000..243149cd --- /dev/null +++ b/js/app/lib/resize.js @@ -0,0 +1,92 @@ +define([], () => { + 'use strict'; + + class ResizeManager { + constructor(config = {}) { + this._config = Object.assign({}, ResizeManager.defaultConfig, config); + this._observables = new WeakMap(); + this._observer = new ResizeObserver((entries, observer) => { // jshint ignore:line + for (let entry of entries) { + if (this._observables.has(entry.target)) { + this._observables + .get(entry.target) + .callback(entry.target, entry.contentRect); + } else { + this._observer.unobserve(entry.target); + } + } + }); + } + + debounce(callback, ms = this._config.msDebounce, immediate = false) { + let timer; + return (...args) => { + let later = () => { + timer = null; + if (!immediate) callback(...args); + }; + let callNow = immediate && !timer; + clearTimeout(timer); + timer = setTimeout(later, ms); + if (callNow) callback(...args); + }; + } + + throttle(callback, ms = this._config.msThrottle) { + let lastFunc; + let lastRan; + return function (...args) { + if (!lastRan) { + callback(...args); + lastRan = Date.now(); + } else { + clearTimeout(lastFunc); + lastFunc = setTimeout(() => { + if (Date.now() - lastRan >= ms) { + callback(...args); + lastRan = Date.now(); + } + }, ms - (Date.now() - lastRan)); + } + }; + } + + observe(target, callback, config = {}, options = ResizeManager.observeOptions) { + if (!this._observables.has(target)) { + if (config.hasOwnProperty('debounce')) { + let {ms, immediate} = config; + callback = this.debounce(callback, ms, immediate); + } + + if (config.hasOwnProperty('throttle')) { + let {ms} = config; + callback = this.throttle(callback, ms); + } + + this._observables.set(target, {callback}); + this._observer.observe(target, options); + } + } + + unobserve(target) { + this._observer.unobserve(target); + this._observables.delete(target); + } + + disconnect() { + this._observer.disconnect(); + this._observables = new WeakMap(); + } + } + + ResizeManager.observeOptions = { + box: 'border-box' // sets which box model the observer will observe changes to + }; + + ResizeManager.defaultConfig = { + msDebounce: 250, // setTimeout for debounced calls + msThrottle: 100 // setTimeout for throttled calls + }; + + return new ResizeManager(); +}); \ No newline at end of file diff --git a/js/app/logging.js b/js/app/logging.js index dd85f9f1..a24d3cc0 100644 --- a/js/app/logging.js +++ b/js/app/logging.js @@ -7,7 +7,8 @@ define([ 'app/init', 'app/util', 'app/counter', - 'bootbox' + 'bootbox', + 'app/lib/resize' ], ($, Init, Util, Counter, bootbox) => { 'use strict'; @@ -37,6 +38,7 @@ define([ if(logDialog.length){ // dialog is open let statusArea = logDialog.find('.' + config.taskDialogStatusAreaClass); + statusArea.destroyTooltips(true); requirejs(['text!templates/modules/sync_status.html', 'mustache'], (templateSyncStatus, Mustache) => { let data = { timestampCounterClass: config.timestampCounterClass, @@ -57,7 +59,7 @@ define([ let counterElements = syncStatusElement.find('.' + config.timestampCounterClass); Counter.initTimestampCounter(counterElements); - syncStatusElement.initTooltips({ + statusArea.initTooltips({ placement: 'right' }); }); @@ -69,9 +71,7 @@ define([ * shows the logging dialog */ let showDialog = () => { - // dialog content - - requirejs(['text!templates/dialog/task_manager.html', 'mustache', 'datatables.loader'], function(templateTaskManagerDialog, Mustache){ + requirejs(['text!templates/dialog/task_manager.html', 'mustache'], function(templateTaskManagerDialog, Mustache){ let data = { id: config.taskDialogId, dialogDynamicAreaClass: Util.config.dynamicAreaClass, @@ -92,9 +92,9 @@ define([ // init log table logDataTable = logTable.DataTable({ - dom: '<"row"<"col-xs-3"l><"col-xs-5"B><"col-xs-4"fS>>' + - '<"row"<"col-xs-12"tr>>' + - '<"row"<"col-xs-5"i><"col-xs-7"p>>', + dom: '<"flex-row flex-between"<"flex-col"l><"flex-col"B><"flex-col"fS>>' + + '<"flex-row"<"flex-col flex-grow"tr>>' + + '<"flex-row flex-between"<"flex-col"i><"flex-col"p>>', buttons: { name: 'tableTools', buttons: [ @@ -282,51 +282,61 @@ define([ xkey: 'x', ykeys: ['y'], labels: [key], - units: 'ms', - parseTime: false, - ymin: 0, - yLabelFormat: labelYFormat, - padding: 10, - hideHover: true, - pointSize: 3, lineColors: ['#375959'], + lineWidth: 2, + pointSize: 3, pointFillColors: ['#477372'], pointStrokeColors: ['#313335'], - lineWidth: 2, - grid: false, - gridStrokeWidth: 0.3, - gridTextSize: 9, - gridTextFamily: 'Oxygen Bold', - gridTextColor: '#63676a', - behaveLikeLine: true, - goals: [], - goalLineColors: ['#66c84f'], + ymin: 0, smooth: false, - fillOpacity: 0.3, - resize: true + hideHover: true, + parseTime: false, + postUnits: 'ms', + yLabelFormat: labelYFormat, + goals: [], + goalStrokeWidth: 1, + goalLineColors: ['#66c84f'], + grid: true, + gridTextColor: '#63676a', + gridTextSize: 9, + gridTextFamily: 'Arial, "Oxygen Bold"', + gridTextWeight: 'bold', + gridStrokeWidth: 0.3, + resize: true, // we use our own resize function + dataLabels: false, + hoverReversed: true, + // Area chart specific options + behaveLikeLine: true, + fillOpacity: 0.5, + belowArea: true, + areaColors: ['#3c3f41'], + // Not documented but working + padding: 8, }); updateLogGraph(key); graphArea.hideLoadingAnimation(); - - } - } - }); - - - // modal dialog is closed - logDialog.on('hidden.bs.modal', function(e){ - // clear memory -> destroy all charts - for(let key in chartData){ - if(chartData.hasOwnProperty(key)){ - chartData[key].graph = null; } } +/* + Util.getResizeManager().observe( + this.querySelector('.modal-dialog'), + (el, contentRect) => Object.values(chartData).forEach(data => { + if(data.graph) data.graph.redraw(); + }), + {debounce: true, ms: 100} + );*/ }); // modal dialog before hide logDialog.on('hide.bs.modal', function(e){ + Object.entries(chartData).forEach(([key, data]) => { + if(data.graph){ + data.graph.destroy(); + delete chartData[key].graph; + } + }); // destroy logTable logDataTable.destroy(true); @@ -348,12 +358,13 @@ define([ let updateLogGraph = (key, duration) => { // check if graph data already exist - if(!(chartData.hasOwnProperty(key))){ - chartData[key] = {}; - chartData[key].data = []; - chartData[key].graph = null; - chartData[key].averageElement = null; - chartData[key].updateElement = null; + if(!chartData.hasOwnProperty(key)){ + chartData[key] = { + data: [], + graph: null, + averageElement: null, + updateElement: null + }; } // add new value @@ -394,7 +405,7 @@ define([ let tempChartData = getGraphData(chartData[key].data); // add new data to graph (Morris chart) - if is already initialized - if(chartData[key].graph !== null){ + if(chartData[key].graph){ let avgElement = chartData[key].averageElement; let updateElement = chartData[key].updateElement; @@ -472,16 +483,16 @@ define([ /** * init logging -> set global log events */ - let init = function(){ + let init = () => { let maxEntries = 150; - $(window).on('pf:syncStatus', function(){ + $(window).on('pf:syncStatus', () => { updateSyncStatus(); }); // set global logging listener - $(window).on('pf:log', function(e, logKey, options){ + $(window).on('pf:log', (e, logKey, options) => { // check required logging information if( @@ -520,10 +531,7 @@ define([ } // delete old log entries from table --------------------------------- - let rowCount = logData.length; - - if(rowCount >= maxEntries){ - + if(logData.length >= maxEntries){ if(logDataTable){ logDataTable.rows(0, {order:'index'}).remove().draw(false); }else{ diff --git a/js/app/login.js b/js/app/login.js index 170dffdc..ed4b3ded 100644 --- a/js/app/login.js +++ b/js/app/login.js @@ -8,18 +8,16 @@ define([ 'app/util', 'app/render', 'blueImpGallery', - 'bootbox', - 'lazyload', 'layout/header_login', - 'layout/logo', - 'layout/demo_map', + 'lazyload', + 'bootbox', 'dialog/account_settings', 'dialog/notification', 'dialog/manual', 'dialog/changelog', 'dialog/credit', - 'dialog/api_status', -], ($, Init, Util, Render, Gallery, bootbox) => { + 'dialog/api_status' +], ($, Init, Util, Render, Gallery, HeaderLogin, LazyLoad, bootbox) => { 'use strict'; @@ -29,7 +27,6 @@ define([ // header headerId: 'pf-landing-top', // id for header headerContainerId: 'pf-header-container', // id for header container - logoContainerId: 'pf-logo-container', // id for main header logo container headHeaderMapId: 'pf-header-map', // id for header image (svg animation) // map bg @@ -177,7 +174,7 @@ define([ // license ------------------------------------------------------------ $('.' + config.navigationLinkLicenseClass).on('click', function(e){ e.preventDefault(); - $.fn.showCreditsDialog(false, true); + $.fn.showCreditsDialog(); }); // releases ----------------------------------------------------------- @@ -404,7 +401,7 @@ define([ * init scrollSpy for navigation bar */ let initScrollSpy = () => { - let scrollElement = window; + let scrollElement = document; let timeout; // show elements that are currently in the viewport @@ -515,7 +512,7 @@ define([ let showNotificationPanel = () => { let data = { - version: Util.getVersion() + version: currentVersion }; requirejs(['text!templates/ui/notice.html', 'mustache'], (template, Mustache) => { @@ -529,16 +526,16 @@ define([ setVersionLinkObserver(); // mark panel as "shown" - Util.getLocalStorage().setItem(storageKey, currentVersion); + Util.getLocalStore('default').setItem(storageKey, currentVersion); } }); }); }; - Util.getLocalStorage().getItem(storageKey).then(function(data){ + Util.getLocalStore('default').getItem(storageKey).then(data => { // check if panel was shown before if(data){ - if(data !== this.version){ + if(data !== currentVersion){ // show current panel showNotificationPanel(); } @@ -546,9 +543,7 @@ define([ // show current panel showNotificationPanel(); } - }.bind({ - version: currentVersion - })); + }); }; /** @@ -756,6 +751,9 @@ define([ * main init "landing" page */ $(() => { + // passive event listener + Util.initPassiveEvents(); + // clear sessionStorage Util.clearSessionStorage(); @@ -769,26 +767,36 @@ define([ Util.showVersionInfo(); // show log off message - let isLogOut = location.search.split('logout')[1]; - if(isLogOut !== undefined){ + let searchParams = new URLSearchParams(location.search); // jshint ignore:line + if( + searchParams.has('logout') || + searchParams.has('logoutGraceful') + ){ + let cls = 'txt-color-warning'; + let text = [ + 'For security reasons, you were logged out automatically', + 'Please log in again' + ]; + + if(searchParams.has('logoutGraceful')){ + cls = 'txt-color-success'; + text = ['You have successfully logged out']; + } // show logout dialog let options = { buttons: { close: { label: 'close', - className: ['btn-default'].join(' ') + className: 'btn-default' } }, content: { icon: 'fa-sign-out-alt', - class: 'txt-color-warning', + class: cls, title: 'Logout', headline: 'Logout', - text: [ - 'For security reasons, you were logged out automatically', - 'Please log in again' - ] + text: text } }; @@ -807,8 +815,9 @@ define([ }); // init "lazy loading" for images - $('.' + config.galleryThumbImageClass).lazyload({ - threshold : 300 + let lazyLoadInstance = new LazyLoad({ + elements_selector: `.${config.galleryThumbImageClass}`, + use_native: true }); // hide splash loading animation @@ -837,13 +846,8 @@ define([ initYoutube(); // draw header logo - $('#' + config.logoContainerId).drawLogo(() => { - // init header animation - $('#' + config.headerContainerId).initHeader(() => { - - }); - }, false); - + document.querySelector(`.logo-ploygon-top-right`).addEventListener('animationend', () => { + HeaderLogin.init(document.getElementById(config.headerContainerId)); + }); }); - }); \ No newline at end of file diff --git a/js/app/map/contextmenu.js b/js/app/map/contextmenu.js index 55c01859..f2622862 100644 --- a/js/app/map/contextmenu.js +++ b/js/app/map/contextmenu.js @@ -10,6 +10,7 @@ define([ 'use strict'; let config = { + contextMenuContainerId: 'pf-contextmenu-container', // id for container element that holds (hidden) context menus mapContextMenuId: 'pf-map-contextmenu', // id for "maps" context menu connectionContextMenuId: 'pf-map-connection-contextmenu', // id for "connections" context menu endpointContextMenuId: 'pf-map-endpoint-contextmenu', // id for "endpoints" context menu @@ -221,7 +222,7 @@ define([ * @param excludeMenu */ let closeMenus = excludeMenu => { - let allMenus = $('.' + config.contextMenuClass + '[role="menu"]'); + let allMenus = $('.' + config.contextMenuClass + '[role="menu"][style*="display: block"]'); if(excludeMenu){ allMenus = allMenus.not(excludeMenu); } @@ -290,17 +291,15 @@ define([ /** * default config (skeleton) for valid context menu configuration - * @returns {{hidden: Array, active: Array, disabled: Array, id: string, selectCallback: null}} + * @returns {{hidden: [], active: [], disabled: [], id: string, selectCallback: null}} */ - let defaultMenuOptionConfig = () => { - return { - 'id': '', - 'selectCallback': null, - 'hidden': [], - 'active': [], - 'disabled': [] - }; - }; + let defaultMenuOptionConfig = () => ({ + 'id': '', + 'selectCallback': null, + 'hidden': [], + 'active': [], + 'disabled': [] + }); return { config: config, diff --git a/js/app/map/local.js b/js/app/map/local.js index 9b693e34..0a789579 100644 --- a/js/app/map/local.js +++ b/js/app/map/local.js @@ -100,7 +100,7 @@ define([ let isOpenStatus = isOpen(overlayMain); // store current state in indexDB (client) - MapUtil.storeLocalData('map', mapId, 'showLocal', !isOpenStatus ); + Util.getLocalStore('map').setItem(`${mapId}.showLocal`, !isOpenStatus); // trigger open/close if( isOpenStatus ){ @@ -111,8 +111,8 @@ define([ }); // trigger table re-draw() ------------------------------------------------------------------------------------ - let mapWrapper = overlay.parents('.' + MapUtil.config.mapWrapperClass); - mapWrapper.on('pf:mapResize', function(e){ + let areaMap = overlay.closest('.' + Util.getMapTabContentAreaClass('map')); + areaMap.on('pf:mapResize', function(e){ let tableElement = overlay.find('.' + config.overlayLocalTableClass); let tableApi = tableElement.DataTable(); tableApi.draw('full-hold'); @@ -120,7 +120,6 @@ define([ // tooltips --------------------------------------------------------------------------------------------------- overlayMain.initTooltips({ - container: 'body', placement: 'bottom' }); }; @@ -247,8 +246,7 @@ define([ // open Overlay ------------------------------------------------------------------------------------------- if( !isOpen(overlay) ){ - let promiseStore = MapUtil.getLocaleData('map', mapId); - promiseStore.then(dataStore => { + Util.getLocalStore('map').getItem(mapId).then(dataStore => { if( dataStore && dataStore.showLocal @@ -289,282 +287,278 @@ define([ $.fn.initLocalOverlay = function(mapId){ let parentElements = $(this); - require(['datatables.loader'], () => { - parentElements.each(function(){ - let parentElement = $(this); + parentElements.each(function(){ + let parentElement = $(this); - let overlay = $('
    ', { - class: [config.overlayClass, config.overlayLocalClass].join(' ') - }); + let overlay = $('
    ', { + class: [config.overlayClass, config.overlayLocalClass].join(' ') + }); - let content = $('
    ', { - class: [ 'text-right', config.overlayLocalContentClass].join(' ') - }); + let content = $('
    ', { + class: [ 'text-right', config.overlayLocalContentClass].join(' ') + }); - // crate new route table - let table = $('', { - class: ['compact', 'order-column', config.overlayLocalTableClass].join(' ') - }); + // crate new route table + let table = $('
    ', { + class: ['compact', 'order-column', config.overlayLocalTableClass].join(' ') + }); - let overlayMain = $('
    ', { - text: '', - class: config.overlayLocalMainClass - }).append( - $('', { - class: ['fas', 'fa-chevron-down', 'fa-fw', 'pf-animate-rotate', config.overlayLocalTriggerClass].join(' ') - }), - $('', { - class: ['badge', 'txt-color', 'txt-color-red', config.overlayLocalUsersClass].join(' '), - text: 0 - }), - $('
    ', { - class: config.overlayLocalJumpsClass - }).append( - $('', { - class: ['badge', 'txt-color', 'txt-color-grayLight'].join(' '), - text: MapUtil.config.defaultLocalJumpRadius - }).attr('title', 'jumps') - ) - ); - - let headline = $('
    ', { - class: config.overlayLocalHeadlineClass + let overlayMain = $('
    ', { + text: '', + class: config.overlayLocalMainClass + }).append( + $('', { + class: ['fas', 'fa-chevron-down', 'fa-fw', 'pf-animate-rotate', config.overlayLocalTriggerClass].join(' ') + }), + $('', { + class: ['badge', 'txt-color', 'txt-color-red', config.overlayLocalUsersClass].join(' '), + text: 0 + }), + $('
    ', { + class: config.overlayLocalJumpsClass }).append( $('', { - html: 'Nearby   ', - class: 'pull-left' - }), - $(''), - $(''), - $('', { - class: ['badge', ' txt-color', 'txt-color-red'].join(' '), - text: 0 - }) - ); + class: ['badge', 'txt-color', 'txt-color-grayLight'].join(' '), + text: MapUtil.config.defaultLocalJumpRadius + }).attr('title', 'jumps') + ) + ); - content.append(headline); - content.append(table); - // toolbar not used for now - // content.append(initToolbar()); + let headline = $('
    ', { + class: config.overlayLocalHeadlineClass + }).append( + $('', { + html: 'Nearby   ', + class: 'pull-left' + }), + $(''), + $(''), + $('', { + class: ['badge', ' txt-color', 'txt-color-red'].join(' '), + text: 0 + }) + ); - overlay.append(overlayMain); - overlay.append(content); + content.append(headline); + content.append(table); + // toolbar not used for now + // content.append(initToolbar()); - parentElement.append(overlay); + overlay.append(overlayMain); + overlay.append(content); - // set observer - setOverlayObserver(overlay, mapId); + parentElement.append(overlay); - // init local table --------------------------------------------------------------------------------------- - table.on('preDraw.dt', function(e, settings){ - let table = $(this); - let mapWrapper = table.parents('.' + MapUtil.config.mapWrapperClass); + // set observer + setOverlayObserver(overlay, mapId); - // mapWrapper should always exist - if(mapWrapper && mapWrapper.length) { - // check available maxHeight for "locale" table based on current map height (resizable) - let mapHeight = mapWrapper[0].offsetHeight; - let localOverlay = MapOverlayUtil.getMapOverlay(table, 'local'); - let paginationElement = localOverlay.find('.dataTables_paginate'); + // init local table --------------------------------------------------------------------------------------- + table.on('preDraw.dt', function(e, settings){ + let table = $(this); + let areaMap = table.closest('.' + Util.getMapTabContentAreaClass('map')); - let tableApi = table.DataTable(); - let pageInfo = tableApi.page.info(); - let localTableRowHeight = 26; + // areaMap should always exist + if(areaMap && areaMap.length) { + // check available maxHeight for "locale" table based on current map height (resizable) + let mapHeight = areaMap[0].offsetHeight; + let localOverlay = MapOverlayUtil.getMapOverlay(table, 'local'); + let paginationElement = localOverlay.find('.dataTables_paginate'); - let localTop = localOverlay[0].offsetTop; - let bottomSpace = 38 + 10; // "timer" overlay + some spacing top - bottomSpace += 16 + 5 + 5; // horizontal scrollBar height + some spacing top + bottom - let localHeightMax = mapHeight - bottomSpace - localTop; // max available for local overlay + let tableApi = table.DataTable(); + let pageInfo = tableApi.page.info(); + let localTableRowHeight = 26; - let localTableBodyMaxHeight = localHeightMax - 53; // - headline height +
    height - let newPageLength = Math.floor(localTableBodyMaxHeight / localTableRowHeight); - if(pageInfo.recordsDisplay > newPageLength){ - // show pagination and limit page length - localTableBodyMaxHeight -= 30; // - pagination height - newPageLength = Math.floor(localTableBodyMaxHeight / localTableRowHeight); - } + let localTop = localOverlay[0].offsetTop; + let bottomSpace = 38 + 10; // "timer" overlay + some spacing top + bottomSpace += 16 + 5 + 5; // horizontal scrollBar height + some spacing top + bottom + let localHeightMax = mapHeight - bottomSpace - localTop; // max available for local overlay - if(pageInfo.length !== newPageLength){ - tableApi.page.len(newPageLength); + let localTableBodyMaxHeight = localHeightMax - 53; // - headline height + height + let newPageLength = Math.floor(localTableBodyMaxHeight / localTableRowHeight); + if(pageInfo.recordsDisplay > newPageLength){ + // show pagination and limit page length + localTableBodyMaxHeight -= 30; // - pagination height + newPageLength = Math.floor(localTableBodyMaxHeight / localTableRowHeight); + } - // page length changed -> show/hide pagination - pageInfo = tableApi.page.info(); - if(pageInfo.pages <= 1){ - paginationElement.hide(); - }else{ - paginationElement.show(); - } + if(pageInfo.length !== newPageLength){ + tableApi.page.len(newPageLength); + + // page length changed -> show/hide pagination + pageInfo = tableApi.page.info(); + if(pageInfo.pages <= 1){ + paginationElement.hide(); + }else{ + paginationElement.show(); } } - }); + } + }); - table.on('draw.dt', function(e, settings){ - // init table tooltips - $(this).find('td').initTooltips({ - container: 'body', - placement: 'left' - }); + table.on('draw.dt', function(e, settings){ + // init table tooltips + $(this).find('td').initTooltips({ + placement: 'left' }); + }); - // table init complete - table.on('init.dt', function(){ - // init table head tooltips - $(this).initTooltips({ - container: 'body', - placement: 'top' - }); + // table init complete + table.on('init.dt', function(){ + // init table head tooltips + $(this).initTooltips({ + placement: 'top' }); + }); - let localTable = table.DataTable({ - pageLength: 5, - paging: true, - pagingType: 'simple', - lengthChange: false, - ordering: true, - order: [ 0, 'asc' ], - info: false, - searching: false, - hover: false, - responsive: false, // true "hides" some columns on init (why?) - rowId: function(rowData){ - return 'pf-local-row_' + rowData.id; // characterId - }, - language: { - emptyTable: 'You are alone', - paginate: { - next: ' ', - previous: ' ' + let localTable = table.DataTable({ + pageLength: 3, // default page length, smaller then max page length (4) if map is vertical resized to min. + paging: true, + pagingType: 'simple', + lengthChange: false, + ordering: true, + order: [ 0, 'asc' ], + info: false, + searching: false, + hover: false, + responsive: false, // true "hides" some columns on init (why?) + rowId: function(rowData){ + return 'pf-local-row_' + rowData.id; // characterId + }, + language: { + emptyTable: 'You are alone', + paginate: { + next: ' ', + previous: ' ' + } + }, + columnDefs: [ + { + targets: 0, + orderable: true, + title: ' ', + width: '1px', + className: [Util.config.helpDefaultClass, 'text-center'].join(' '), + data: 'jumps', + render: { + _: (data, type, row, meta) => { + let value = data; + if(type === 'display'){ + if(value === 0){ + value = ''; + } + } + return value; + } + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let api = this.DataTable(); + initCellTooltip(api, cell, 'log.system.name'); } - }, - columnDefs: [ - { - targets: 0, - orderable: true, - title: ' ', - width: '1px', - className: [Util.config.helpDefaultClass, 'text-center'].join(' '), - data: 'jumps', - render: { - _: (data, type, row, meta) => { - let value = data; - if(type === 'display'){ - if(value === 0){ - value = ''; - } - } - return value; + },{ + targets: 1, + orderable: false, + title: '', + width: '26px', + className: [Util.config.helpDefaultClass, 'text-center', config.tableCellImageClass].join(' '), + data: 'log.ship', + render: { + _: (data, type, row, meta) => { + let value = data.typeName; + if(type === 'display'){ + value = ''; } + return value; + } + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let api = this.DataTable(); + initCellTooltip(api, cell, 'log.ship.typeName'); + } + }, { + targets: 2, + orderable: true, + title: 'ship name', + width: '80px', + data: 'log.ship', + render: { + _: (data, type, row, meta) => { + let value = data.name; + if(type === 'display'){ + value = '
    ' + data.name + '
    '; + } + return value; }, - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - let api = this.DataTable(); - initCellTooltip(api, cell, 'log.system.name'); - } - },{ - targets: 1, - orderable: false, - title: '', - width: '26px', - className: [Util.config.helpDefaultClass, 'text-center', config.tableCellImageClass].join(' '), - data: 'log.ship', - render: { - _: (data, type, row, meta) => { - let value = data.typeName; - if(type === 'display'){ - value = ''; - } - return value; + sort: 'name' + } + },{ + targets: 3, + orderable: true, + title: 'pilot', + data: 'name', + render: { + _: (data, type, row, meta) => { + let value = data; + if(type === 'display'){ + value = '
    ' + data + '
    '; } - }, - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - let api = this.DataTable(); - initCellTooltip(api, cell, 'log.ship.typeName'); - } - }, { - targets: 2, - orderable: true, - title: 'ship name', - width: '80px', - data: 'log.ship', - render: { - _: (data, type, row, meta) => { - let value = data.name; - if(type === 'display'){ - value = '
    ' + data.name + '
    '; - } - return value; - }, - sort: 'name' - } - },{ - targets: 3, - orderable: true, - title: 'pilot', - data: 'name', - render: { - _: (data, type, row, meta) => { - let value = data; - if(type === 'display'){ - value = '
    ' + data + '
    '; - } - return value; - } - } - },{ - targets: 4, - orderable: false, - title: '', - width: '10px', - className: [Util.config.helpDefaultClass].join(' '), - data: 'log', - render: { - _: (data, type, row, meta) => { - let value = ''; - if(type === 'display'){ - if(data.station && data.station.id > 0){ - value = ''; - }else if(data.structure && data.structure.id > 0){ - value = ''; - } - } - return value; - } - }, - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - let selector = ''; - if(cellData.station && cellData.station.id > 0){ - selector = 'log.station.name'; - }else if(cellData.structure && cellData.structure.id > 0){ - selector = 'log.structure.name'; - } - let api = this.DataTable(); - initCellTooltip(api, cell, selector); - } - },{ - targets: 5, - orderable: false, - title: '', - width: '10px', - className: [config.tableCellActionClass].join(' '), - data: 'id', - render: { - _: (data, type, row, meta) => { - let value = data; - if(type === 'display'){ - value = ''; - } - return value; - } - }, - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - // open character information window (ingame) - $(cell).on('click', { tableApi: this.DataTable(), cellData: cellData }, function(e){ - let cellData = e.data.tableApi.cell(this).data(); - Util.openIngameWindow(e.data.cellData); - }); + return value; } } - ] - }); + },{ + targets: 4, + orderable: false, + title: '', + width: '10px', + className: [Util.config.helpDefaultClass].join(' '), + data: 'log', + render: { + _: (data, type, row, meta) => { + let value = ''; + if(type === 'display'){ + if(data.station && data.station.id > 0){ + value = ''; + }else if(data.structure && data.structure.id > 0){ + value = ''; + } + } + return value; + } + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let selector = ''; + if(cellData.station && cellData.station.id > 0){ + selector = 'log.station.name'; + }else if(cellData.structure && cellData.structure.id > 0){ + selector = 'log.structure.name'; + } + let api = this.DataTable(); + initCellTooltip(api, cell, selector); + } + },{ + targets: 5, + orderable: false, + title: '', + width: '10px', + className: [config.tableCellActionClass].join(' '), + data: 'id', + render: { + _: (data, type, row, meta) => { + let value = data; + if(type === 'display'){ + value = ''; + } + return value; + } + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + // open character information window (ingame) + $(cell).on('click', { tableApi: this.DataTable(), cellData: cellData }, function(e){ + let cellData = e.data.tableApi.cell(this).data(); + Util.openIngameWindow(e.data.cellData); + }); + } + } + ] }); }); }; diff --git a/js/app/map/map.js b/js/app/map/map.js index 045066ff..1b910383 100644 --- a/js/app/map/map.js +++ b/js/app/map/map.js @@ -27,12 +27,8 @@ define([ zIndexCounter: 110, maxActiveConnections: 8, - mapWrapperClass: 'pf-map-wrapper', // wrapper div (scrollable) - - mapClass: 'pf-map', // class for all maps mapIdPrefix: 'pf-map-', // id prefix for all maps systemClass: 'pf-system', // class for all systems - systemActiveClass: 'pf-system-active', // class for an active system on a map systemSelectedClass: 'pf-system-selected', // class for selected systems on a map systemHeadClass: 'pf-system-head', // class for system head systemHeadNameClass: 'pf-system-head-name', // class for system name @@ -45,7 +41,6 @@ define([ systemBodyItemStatusClass: 'pf-user-status', // class for player status in system body systemBodyItemNameClass: 'pf-system-body-item-name', // class for player name in system body systemBodyRightClass: 'pf-system-body-right', // class for player ship name in system body - dynamicElementWrapperId: 'pf-dialog-wrapper', // wrapper div for dynamic content (dialogs, context-menus,...) // endpoint classes endpointSourceClass: 'pf-map-endpoint-source', @@ -120,7 +115,7 @@ define([ }, connectionsDetachable: true, // dragOptions are set -> allow detaching them maxConnections: 10, // due to isTarget is true, this is the max count of !out!-going connections - // isSource:true + //isSource:true }, target: { filter: filterSystemHeadEvent, @@ -129,10 +124,10 @@ define([ //allowLoopBack: false, // loopBack connections are not allowed cssClass: config.endpointTargetClass, dropOptions: { - hoverClass: config.systemActiveClass, + //hoverClass: '', activeClass: 'dragActive' }, - // uniqueEndpoint: false + //uniqueEndpoint: false }, endpointTypes: Init.endpointTypes, connectionTypes: Init.connectionTypes @@ -199,7 +194,7 @@ define([ currentUserIsHere && !userWasHere && Boolean(Util.getObjVal(Init, 'character.autoLocationSelect')) && - Boolean(Util.getObjVal(Util.getCurrentUserData(), 'character.selectLocation')) + Boolean(Util.getCurrentCharacterData('selectLocation')) ){ Util.triggerMenuAction(map.getContainer(), 'SelectSystem', {systemId: system.data('id'), forceSelect: false}); } @@ -578,7 +573,7 @@ define([ * @param system */ let systemActions = (action, system) => { - let mapContainer = system.closest('.' + config.mapClass); + let mapContainer = system.closest('.' + Util.config.mapClass); let map = MapUtil.getMapInstance(system.attr('data-mapid')); let systemData = {}; @@ -685,8 +680,7 @@ define([ let filterScope = action.split('_')[1]; let filterScopeLabel = MapUtil.getScopeInfoForConnection( filterScope, 'label'); - let promiseStore = MapUtil.getLocaleData('map', mapId); - promiseStore.then(data => { + Util.getLocalStore('map').getItem(mapId).then(data => { let filterScopes = []; if(data && data.filterScopes){ filterScopes = data.filterScopes; @@ -704,7 +698,7 @@ define([ } // store filterScopes in IndexDB - MapUtil.storeLocalData('map', mapId, 'filterScopes', filterScopes); + Util.getLocalStore('map').setItem(`${mapId}.filterScopes`, filterScopes); MapUtil.filterMapByScopes(map, filterScopes); Util.showNotify({title: 'Scope filter changed', text: filterScopeLabel, type: 'success'}); @@ -881,23 +875,23 @@ define([ * connect two systems * @param map * @param connectionData - * @returns new connection + * @returns {Promise} */ - let drawConnection = (map, connectionData) => { + let drawConnection = (map, connectionData) => new Promise((resolve, reject) => { let mapContainer = $(map.getContainer()); let mapId = mapContainer.data('id'); let connectionId = connectionData.id || 0; - let connection; let sourceSystem = $('#' + MapUtil.getSystemId(mapId, connectionData.source)); let targetSystem = $('#' + MapUtil.getSystemId(mapId, connectionData.target)); // check if both systems exists // (If not -> something went wrong e.g. DB-Foreign keys for "ON DELETE",...) - if( - sourceSystem.length && - targetSystem.length - ){ - connection = map.connect({ + if(!sourceSystem.length){ + reject(new Error(`drawConnection(): source system (id: ${connectionData.source}) not found`)); + }else if(!targetSystem.length){ + reject(new Error(`drawConnection(): target system (id: ${connectionData.target}) not found`)); + }else{ + let connection = map.connect({ source: sourceSystem[0], target: targetSystem[0], scope: connectionData.scope || map.Defaults.Scope, @@ -953,18 +947,18 @@ define([ } } } - } - }else{ - if( !sourceSystem.length ){ - console.warn('drawConnection(): source system (id: ' + connectionData.source + ') not found'); - } - if( !targetSystem.length ){ - console.warn('drawConnection(): target system (id: ' + connectionData.target + ') not found'); + + resolve({ + action: 'drawConnection', + data: { + connection: connection + } + }); + }else{ + reject(new Error(`drawConnection(): connection must be instanceof jsPlumb.Connection`)); } } - - return connection; - }; + }); /** * compares the current data and new data of a connection and updates status @@ -1085,17 +1079,17 @@ define([ }; /** - * set map wrapper observer - * @param mapWrapper + * set map area observer + * @param areaMap * @param mapConfig */ - let setMapWrapperObserver = (mapWrapper, mapConfig) => { + let setMapAreaObserver = (areaMap, mapConfig) => { /** * save current map dimension to local storage * @param entry */ - let saveMapSize = (entry) => { + let saveMapSize = entry => { let width = ''; let height = ''; if(entry.constructor.name === 'HTMLDivElement'){ @@ -1109,10 +1103,9 @@ define([ width = parseInt(width.substring(0, width.length - 2)) || 0; height = parseInt(height.substring(0, height.length - 2)) || 0; - mapWrapper.trigger('pf:mapResize'); + areaMap.trigger('pf:mapResize'); - let promiseStore = MapUtil.getLocaleData('map', mapConfig.config.id ); - promiseStore.then((data) => { + Util.getLocalStore('map').getItem(mapConfig.config.id).then((data) => { let storeData = true; if( @@ -1125,7 +1118,7 @@ define([ } if(storeData){ - MapUtil.storeLocalData('map', mapConfig.config.id, 'style', { + Util.getLocalStore('map').setItem(`${mapConfig.config.id}.style`, { width: width, height: height }); @@ -1148,7 +1141,7 @@ define([ } }); - wrapperResize.observe(mapWrapper[0]); + wrapperResize.observe(areaMap[0]); }else if(requestAnimationFrame){ // ResizeObserver() not supported let checkMapSize = (entry) => { @@ -1156,17 +1149,18 @@ define([ return setTimeout(checkMapSize, 500, entry); }; - checkMapSize(mapWrapper[0]); + checkMapSize(areaMap[0]); } }; /** * get a mapMapElement - * @param parentElement + * @param areaMap * @param mapConfig * @returns {Promise} */ - let newMapElement = (parentElement, mapConfig) => { + let newMapElement = (areaMap, mapConfig) => { + areaMap = $(areaMap); /** * new map element promise @@ -1175,45 +1169,37 @@ define([ */ let newMapElementExecutor = (resolve, reject) => { // get map dimension from local storage - let promiseStore = MapUtil.getLocaleData('map', mapConfig.config.id ); - promiseStore.then((data) => { + Util.getLocalStore('map').getItem(mapConfig.config.id).then(data => { let height = 0; if(data && data.style){ height = data.style.height; } - // create map wrapper - let mapWrapper = $('
    ', { - class: config.mapWrapperClass, - height: height - }); + areaMap.css('height', height); - setMapWrapperObserver(mapWrapper, mapConfig); + setMapAreaObserver(areaMap, mapConfig); let mapId = mapConfig.config.id; // create new map container let mapContainer = $('
    ', { id: config.mapIdPrefix + mapId, - class: config.mapClass + class: Util.config.mapClass }).data('id', mapId); - mapWrapper.append(mapContainer); - - // append mapWrapper to parent element (at the top) - parentElement.prepend(mapWrapper); + areaMap.append(mapContainer); // set main Container for current map -> the container exists now in DOM !! very important mapConfig.map.setContainer(mapContainer); // init custom scrollbars and add overlay - initMapScrollbar(mapWrapper); + initMapScrollbar(areaMap); // set map observer setMapObserver(mapConfig.map); // set shortcuts - mapWrapper.setMapShortcuts(); + areaMap.setMapShortcuts(); // show static overlay actions let mapOverlay = MapOverlayUtil.getMapOverlay(mapContainer, 'info'); @@ -1246,168 +1232,178 @@ define([ * @param reject */ let updateMapExecutor = (resolve, reject) => { - // jsPlumb needs to be initialized. This is not the case when switching between map tabs right after refresh - let mapContainer = mapConfig.map ? $(mapConfig.map.getContainer()) : null; - if(mapContainer){ - let mapId = mapConfig.config.id; - - // add additional information for this map - if(mapContainer.data('updated') !== mapConfig.config.updated.updated){ - mapContainer.data('name', mapConfig.config.name); - mapContainer.data('scopeId', mapConfig.config.scope.id); - mapContainer.data('typeId', mapConfig.config.type.id); - mapContainer.data('typeName', mapConfig.config.type.name); - mapContainer.data('icon', mapConfig.config.icon); - mapContainer.data('created', mapConfig.config.created.created); - mapContainer.data('updated', mapConfig.config.updated.updated); - } - - // get map data - let mapData = getMapDataForSync(mapContainer, [], true); - - - if(mapData !== false){ - // map data available -> map not locked by update counter :) - let currentSystemData = mapData.data.systems; - let currentConnectionData = mapData.data.connections; - - // update systems ================================================================================= - for(let i = 0; i < mapConfig.data.systems.length; i++){ - let systemData = mapConfig.data.systems[i]; - - // add system - let addNewSystem = true; - - for(let k = 0; k < currentSystemData.length; k++){ - if(currentSystemData[k].id === systemData.id){ - if(currentSystemData[k].updated.updated < systemData.updated.updated){ - // system changed -> update - mapContainer.getSystem(mapConfig.map, systemData); - } - - addNewSystem = false; - break; - } - } - - if(addNewSystem === true){ - drawSystem(mapConfig.map, systemData); - } - } - - // check for systems that are gone -> delete system - for(let a = 0; a < currentSystemData.length; a++){ - let deleteThisSystem = true; - - for(let b = 0; b < mapConfig.data.systems.length; b++){ - let deleteSystemData = mapConfig.data.systems[b]; - - if(deleteSystemData.id === currentSystemData[a].id){ - deleteThisSystem = false; - break; - } - } - - if(deleteThisSystem === true){ - let deleteSystem = $('#' + MapUtil.getSystemId(mapContainer.data('id'), currentSystemData[a].id)); - - // system not found -> delete system - System.removeSystems(mapConfig.map, deleteSystem); - } - } - - // update connections ============================================================================= - - // jsPlumb batch() is used, otherwise there are some "strange" visual bugs - // when switching maps (Endpoints are not displayed correctly) - mapConfig.map.batch(function(){ - - for(let j = 0; j < mapConfig.data.connections.length; j++){ - let connectionData = mapConfig.data.connections[j]; - - // add connection - let addNewConnection= true; - - for(let c = 0; c < currentConnectionData.length; c++){ - if(currentConnectionData[c].id === connectionData.id){ - // connection already exists -> check for updates - if(currentConnectionData[c].updated < connectionData.updated){ - // connection changed -> update - updateConnection(currentConnectionData[c].connection, connectionData); - } - - addNewConnection = false; - break; - }else if( - currentConnectionData[c].id === 0 && - currentConnectionData[c].source === connectionData.source && - currentConnectionData[c].target === connectionData.target - ){ - // if ids don´t match -> check for unsaved connection - updateConnection(currentConnectionData[c].connection, connectionData); - - addNewConnection = false; - break; - } - } - - if(addNewConnection === true){ - drawConnection(mapConfig.map, connectionData); - } - } - - // check for connections that are gone -> delete connection - for(let d = 0; d < currentConnectionData.length; d++){ - // skip connections with id = 0 -> they might get updated before - if(currentConnectionData[d].id === 0){ - continue; - } - - let deleteThisConnection = true; - - for(let e = 0; e < mapConfig.data.connections.length;e++){ - let deleteConnectionData = mapConfig.data.connections[e]; - - if(deleteConnectionData.id === currentConnectionData[d].id){ - deleteThisConnection = false; - break; - } - } - - if(deleteThisConnection === true){ - // connection not found -> delete connection - let deleteConnection = currentConnectionData[d].connection; - - if(deleteConnection){ - // check if "source" and "target" still exist before remove - // this is NOT the case if the system was removed previous - if( - deleteConnection.source && - deleteConnection.target - ){ - mapConfig.map.deleteConnection(deleteConnection, {fireEvent: false}); - } - } - } - } - }); - - // update local connection cache - updateConnectionsCache(mapConfig.map); - }else{ - // map is currently logged -> queue update for this map until unlock - if( mapUpdateQueue.indexOf(mapId) === -1 ){ - mapUpdateQueue.push(mapId); - } - } - } - - resolve({ + let payload = { action: 'updateMap', data: { mapConfig: mapConfig } - }); + }; + + // jsPlumb needs to be initialized. This is not the case when switching between map tabs right after refresh + let mapContainer = mapConfig.map ? mapConfig.map.getContainer() : null; + if(!mapContainer){ + return resolve(payload); + } + + let mapId = mapConfig.config.id; + + // mapData == false -> map locked by update counter. Skip update + let mapData = getMapDataForSync(mapContainer, [], true); + + if(!mapData){ + // map is currently locked -> queue update for this map until unlock + if(mapUpdateQueue.indexOf(mapId) === -1){ + mapUpdateQueue.push(mapId); + } + return resolve(payload); + } + + mapContainer = $(mapContainer); + + // add additional information for this map + if(mapContainer.data('updated') !== mapConfig.config.updated.updated){ + mapContainer.data('name', mapConfig.config.name); + mapContainer.data('scopeId', mapConfig.config.scope.id); + mapContainer.data('typeId', mapConfig.config.type.id); + mapContainer.data('typeName', mapConfig.config.type.name); + mapContainer.data('icon', mapConfig.config.icon); + mapContainer.data('created', mapConfig.config.created.created); + mapContainer.data('updated', mapConfig.config.updated.updated); + } + + // map data available -> map not locked by update counter :) + let currentSystemData = mapData.data.systems; + let currentConnectionData = mapData.data.connections; + + // update systems ========================================================================================= + for(let i = 0; i < mapConfig.data.systems.length; i++){ + let systemData = mapConfig.data.systems[i]; + + // add system + let addNewSystem = true; + + for(let k = 0; k < currentSystemData.length; k++){ + if(currentSystemData[k].id === systemData.id){ + if(currentSystemData[k].updated.updated < systemData.updated.updated){ + // system changed -> update + mapContainer.getSystem(mapConfig.map, systemData); + } + + addNewSystem = false; + break; + } + } + + if(addNewSystem === true){ + drawSystem(mapConfig.map, systemData).catch(console.warn); + } + } + + // check for systems that are gone -> delete system + for(let a = 0; a < currentSystemData.length; a++){ + let deleteThisSystem = true; + + for(let b = 0; b < mapConfig.data.systems.length; b++){ + let deleteSystemData = mapConfig.data.systems[b]; + + if(deleteSystemData.id === currentSystemData[a].id){ + deleteThisSystem = false; + break; + } + } + + if(deleteThisSystem === true){ + let deleteSystem = $('#' + MapUtil.getSystemId(mapContainer.data('id'), currentSystemData[a].id)); + + // system not found -> delete system + System.removeSystems(mapConfig.map, deleteSystem); + } + } + + // update connections ===================================================================================== + + // jsPlumb setSuspendDrawing() (batch() did not work because it async 'scopes' out updates). + // -> Otherwise there are some "strange" visual bugs when switching maps (Endpoints are not displayed correctly) + // -> needs to be "disabled" later in this method. + mapConfig.map.setSuspendDrawing(true); + + for(let j = 0; j < mapConfig.data.connections.length; j++){ + let connectionData = mapConfig.data.connections[j]; + + // add connection + let addNewConnection= true; + + for(let c = 0; c < currentConnectionData.length; c++){ + if(currentConnectionData[c].id === connectionData.id){ + // connection already exists -> check for updates + if(currentConnectionData[c].updated < connectionData.updated){ + // connection changed -> update + updateConnection(currentConnectionData[c].connection, connectionData); + } + + addNewConnection = false; + break; + }else if( + currentConnectionData[c].id === 0 && + currentConnectionData[c].source === connectionData.source && + currentConnectionData[c].target === connectionData.target + ){ + // if ids don´t match -> check for unsaved connection + updateConnection(currentConnectionData[c].connection, connectionData); + + addNewConnection = false; + break; + } + } + + if(addNewConnection === true){ + drawConnection(mapConfig.map, connectionData).catch(console.warn); + } + } + + // check for connections that are gone -> delete connection + for(let d = 0; d < currentConnectionData.length; d++){ + // skip connections with id = 0 -> they might get updated before + if(currentConnectionData[d].id === 0){ + continue; + } + + let deleteThisConnection = true; + + for(let e = 0; e < mapConfig.data.connections.length;e++){ + let deleteConnectionData = mapConfig.data.connections[e]; + + if(deleteConnectionData.id === currentConnectionData[d].id){ + deleteThisConnection = false; + break; + } + } + + if(deleteThisConnection === true){ + // connection not found -> delete connection + let deleteConnection = currentConnectionData[d].connection; + + if(deleteConnection){ + // check if "source" and "target" still exist before remove + // this is NOT the case if the system was removed previous + if( + deleteConnection.source && + deleteConnection.target + ){ + mapConfig.map.deleteConnection(deleteConnection, {fireEvent: false}); + } + } + } + } + + mapConfig.map.setSuspendDrawing(false, true); + + // update local connection cache + updateConnectionsCache(mapConfig.map); + + + + return resolve(payload); }; /** @@ -1415,46 +1411,53 @@ define([ * @param payload * @returns {Promise} */ - let filterMapByScopes = payload => { - let filterMapByScopesExecutor = resolve => { - let promiseStore = MapUtil.getLocaleData('map', payload.data.mapConfig.config.id); - promiseStore.then(dataStore => { - let scopes = []; - if(dataStore && dataStore.filterScopes){ - scopes = dataStore.filterScopes; - } - - MapUtil.filterMapByScopes(payload.data.mapConfig.map, scopes); - resolve(payload); - }); - }; - - return new Promise(filterMapByScopesExecutor); - }; + let filterMapByScopes = payload => new Promise(resolve => { + Util.getLocalStore('map').getItem(payload.data.mapConfig.config.id).then(dataStore => { + let scopes = []; + if(dataStore && dataStore.filterScopes){ + scopes = dataStore.filterScopes; + } + MapUtil.filterMapByScopes(payload.data.mapConfig.map, scopes); + resolve(payload); + }); + }); /** * show signature overlays * @param payload * @returns {Promise} */ - let showInfoSignatureOverlays = payload => { - let showInfoSignatureOverlaysExecutor = resolve => { - let promiseStore = MapUtil.getLocaleData('map', payload.data.mapConfig.config.id); - promiseStore.then(dataStore => { - if(dataStore && dataStore.mapSignatureOverlays){ - MapOverlay.showInfoSignatureOverlays($(payload.data.mapConfig.map.getContainer())); - } + let showInfoSignatureOverlays = payload => new Promise(resolve => { + Util.getLocalStore('map').getItem(payload.data.mapConfig.config.id).then(dataStore => { + if(dataStore && dataStore.mapSignatureOverlays){ + MapOverlay.showInfoSignatureOverlays($(payload.data.mapConfig.map.getContainer())); + } + resolve(payload); + }); + }); - resolve(payload); + /** + * after map update is complete + * -> trigger update event for 'global' modules + * @param payload + * @returns {Promise} + */ + let afterUpdate = payload => new Promise(resolve => { + // in rare cases there is a bug where map is undefined (hard to reproduce + let map = Util.getObjVal(payload, 'data.mapConfig.map'); + if(map){ + let tabContentEl = map.getContainer().closest(`.${Util.config.mapTabContentClass}`); + $(tabContentEl).trigger('pf:updateGlobalModules', { + payload: Util.getObjVal(payload, 'data.mapConfig.config.id') }); - }; - - return new Promise(showInfoSignatureOverlaysExecutor); - }; + } + resolve(payload); + }); return new Promise(updateMapExecutor) .then(showInfoSignatureOverlays) - .then(filterMapByScopes); + .then(filterMapByScopes) + .then(afterUpdate); }; /** @@ -1545,28 +1548,22 @@ define([ * @param systemData * @returns {boolean} */ - let isValidSystem = systemData => { - let isValid = true; - if( - !systemData.hasOwnProperty('name') || - systemData.name.length === 0 - ){ - return false; - } - - return isValid; - }; + let isValidSystem = systemData => (Util.getObjVal(systemData, 'name') || '').length > 0; /** * draw a system with its data to a map * @param map * @param systemData * @param connectedSystem + * @param connectionData + * @returns {Promise} */ - let drawSystem = (map, systemData, connectedSystem) => { - - // check if systemData is valid + let drawSystem = (map, systemData, connectedSystem, connectionData = null) => new Promise((resolve, reject) => { if(isValidSystem(systemData)){ + let payloadDrawSystem = { + action: 'drawSystem' + }; + let mapContainer = $(map.getContainer()); // get System Element by data @@ -1590,24 +1587,37 @@ define([ // register system to "magnetizer" Magnetizer.addElement(systemData.mapId, newSystem[0]); + payloadDrawSystem.data = { + system: newSystem + }; + // connect new system (if connection data is given) if(connectedSystem){ - // hint: "scope + type" might be changed automatically when it gets saved // -> based on jump distance,.. - let connectionData = { + connectionData = Object.assign({}, { source: $(connectedSystem).data('id'), target: newSystem.data('id'), scope: map.Defaults.Scope, type: [MapUtil.getDefaultConnectionTypeByScope(map.Defaults.Scope)] - }; - let connection = drawConnection(map, connectionData); + }, connectionData); - // store connection - saveConnection(connection); + drawConnection(map, connectionData) + .then(payload => saveConnection(payload.data.connection, Boolean(connectionData.disableAutoScope))) + .then(payload => { + payloadDrawSystem.data = { + connection: payload.data.connection + }; + resolve(payloadDrawSystem); + }) + .catch(reject); + }else{ + resolve(payloadDrawSystem); } + }else{ + reject(new Error(`drawSystem() failed. Invalid systemData`)); } - }; + }); /** * make a system name/alias editable by x-editable @@ -1625,7 +1635,6 @@ define([ title: 'System alias', placement: 'top', onblur: 'submit', - container: 'body', toggle: 'manual', // is triggered manually on dblClick showbuttons: false }); @@ -1672,56 +1681,69 @@ define([ /** * stores a connection in database * @param connection + * @param disableAutoScope + * @returns {Promise} */ - let saveConnection = connection => { - if(connection instanceof jsPlumb.Connection){ - connection.addType('state_process'); - - let map = connection._jsPlumb.instance; - let mapContainer = $(map.getContainer()); - let mapId = mapContainer.data('id'); - - let connectionData = MapUtil.getDataByConnection(connection); - connectionData.mapId = mapId; - - Util.request('PUT', 'connection', [], connectionData, { - connection: connection, - map: map, - mapId: mapId, - oldConnectionData: connectionData - }).then( - payload => { - let newConnectionData = payload.data; - - if(!$.isEmptyObject(newConnectionData)){ - // update connection data e.g. "scope" has auto detected - connection = updateConnection(payload.context.connection, newConnectionData); - - // new/updated connection should be cached immediately! - updateConnectionCache(payload.context.mapId, connection); - - // connection scope - let scope = MapUtil.getScopeInfoForConnection(newConnectionData.scope, 'label'); - - let title = 'New connection established'; - if(payload.context.oldConnectionData.id > 0){ - title = 'Connection switched'; - } - - Util.showNotify({title: title, text: 'Scope: ' + scope, type: 'success'}); - }else{ - // some save errors - payload.context.map.deleteConnection(payload.context.connection, {fireEvent: false}); - } - }, - payload => { - // remove this connection from map - payload.context.map.deleteConnection(payload.context.connection, {fireEvent: false}); - Util.handleAjaxErrorResponse(payload); - } - ); + let saveConnection = (connection, disableAutoScope = false) => new Promise((resolve, reject) => { + if(!(connection instanceof jsPlumb.Connection)){ + reject(new Error(`saveConnection(): connection must be instanceof jsPlumb.Connection`)); } - }; + + connection.addType('state_process'); + + let map = connection._jsPlumb.instance; + let mapContainer = $(map.getContainer()); + let mapId = mapContainer.data('id'); + + let connectionData = MapUtil.getDataByConnection(connection); + connectionData.mapId = mapId; + connectionData.disableAutoScope = disableAutoScope; + + Util.request('PUT', 'Connection', [], connectionData, { + connection: connection, + map: map, + mapId: mapId, + oldConnectionData: connectionData + }).then( + payload => { + let newConnectionData = payload.data; + + if(!$.isEmptyObject(newConnectionData)){ + // update connection data e.g. "scope" has auto detected + connection = updateConnection(payload.context.connection, newConnectionData); + + // new/updated connection should be cached immediately! + updateConnectionCache(payload.context.mapId, connection); + + // connection scope + let scope = MapUtil.getScopeInfoForConnection(newConnectionData.scope, 'label'); + + let title = 'New connection established'; + if(payload.context.oldConnectionData.id > 0){ + title = 'Connection switched'; + } + + Util.showNotify({title: title, text: 'Scope: ' + scope, type: 'success'}); + resolve({ + action: 'saveConnection', + data: { + connection: connection + } + }); + }else{ + // some save errors + payload.context.map.deleteConnection(payload.context.connection, {fireEvent: false}); + reject(new Error(`saveConnection(): response error`)); + } + }, + payload => { + // remove this connection from map + payload.context.map.deleteConnection(payload.context.connection, {fireEvent: false}); + Util.handleAjaxErrorResponse(payload); + reject(new Error(`saveConnection(): request error`)); + } + ); + }); /** * get context menu config for a map component (e.g. system, connection,..) @@ -1751,14 +1773,14 @@ define([ options.id = MapContextMenu.config.systemContextMenuId; options.selectCallback = systemActions; - let mapContainer = system.closest('.' + config.mapClass); + let mapContainer = system.closest('.' + Util.config.mapClass); // hidden menu actions if(system.data('locked') === true){ options.hidden.push('delete_system'); } - if( !mapContainer.find('.' + config.systemActiveClass).length){ + if( !mapContainer.find('.' + MapUtil.config.systemActiveClass).length){ options.hidden.push('find_route'); } @@ -1771,7 +1793,7 @@ define([ } // disabled menu actions - if(system.hasClass(config.systemActiveClass)){ + if(system.hasClass(MapUtil.config.systemActiveClass)){ options.disabled.push('find_route'); } @@ -1795,8 +1817,7 @@ define([ let mapContainer = $(map.getContainer()); // active menu actions - let promiseStore = MapUtil.getLocaleData('map', mapContainer.data('id')); - promiseStore.then(dataStore => { + Util.getLocalStore('map').getItem(mapContainer.data('id')).then(dataStore => { if(dataStore && dataStore.filterScopes){ options.active = dataStore.filterScopes.map(scope => 'filter_' + scope); } @@ -1915,6 +1936,8 @@ define([ // map overlay will be set on "drag" start let mapOverlayTimer = null; + let debounceDrag = false; + // make system draggable map.draggable(system, { containment: 'parent', @@ -1924,7 +1947,7 @@ define([ snapThreshold: MapUtil.config.mapSnapToGridDimension, // distance for grid snapping "magnet" effect (optional) start: function(params){ let dragSystem = $(params.el); - + dragSystem.css('pointer-events','none'); mapOverlayTimer = MapOverlayUtil.getMapOverlay(dragSystem, 'timer'); // start map update timer @@ -1937,9 +1960,6 @@ define([ delete( params.drag.params.grid ); } - // stop "system click event" right after drop event is finished - dragSystem.addClass('no-click'); - // drag system is not always selected let selectedSystems = mapContainer.getSelectedSystems().get(); selectedSystems = selectedSystems.concat(dragSystem.get()); @@ -1955,12 +1975,19 @@ define([ $(selectedSystems).updateSystemZIndex(); }, drag: function(p){ - // start map update timer - mapOverlayTimer.startMapUpdateCounter(); + if(!debounceDrag) { + requestAnimationFrame(() => { + // start map update timer + mapOverlayTimer.startMapUpdateCounter(); - // update system positions for "all" systems that are effected by drag&drop - // this requires "magnet" feature to be active! (optional) - Magnetizer.executeAtEvent(map, p.e); + // update system positions for "all" systems that are effected by drag&drop + // this requires "magnet" feature to be active! (optional) + Magnetizer.executeAtEvent(map, p.e); + + debounceDrag = false; + }); + } + debounceDrag = true; }, stop: function(params){ let dragSystem = $(params.el); @@ -1968,10 +1995,6 @@ define([ // start map update timer mapOverlayTimer.startMapUpdateCounter(); - setTimeout(function(){ - dragSystem.removeClass('no-click'); - }, Init.timer.DBL_CLICK + 50); - // show tooltip dragSystem.toggleSystemTooltip('show', {show: true}); @@ -1992,7 +2015,7 @@ define([ // update all dragged systems -> added to DragSelection params.selection.forEach(elData => { - MapUtil.markAsChanged($(elData[0])); + MapUtil.markAsChanged($(elData[0]).css('pointer-events','initial')); }); } }); @@ -2005,10 +2028,9 @@ define([ let systemTooltipOptions = { toggle: 'tooltip', placement: 'right', - container: 'body', viewport: system.id }; - system.find('.fas').tooltip(systemTooltipOptions); + //system.find('.fas').tooltip(systemTooltipOptions); // system click events ======================================================================================== let double = function(e){ @@ -2034,23 +2056,20 @@ define([ if(!popoverClick){ let system = $(this); - // check if system is locked for "click" events - if(!system.hasClass('no-click')){ - // left mouse button - if(e.which === 1){ - if(e.ctrlKey === true){ - // select system - MapUtil.toggleSystemsSelect(map, [system]); - }else{ - MapUtil.showSystemInfo(map, system); - } + // left mouse button + if(e.which === 1){ + if(e.ctrlKey === true){ + // select system + MapUtil.toggleSystemsSelect(map, [system]); + }else{ + MapUtil.showSystemInfo(map, system); } } } }; - Util.singleDoubleClick(system, single, double); + Util.singleDoubleClick(system[0], single, double); }; /** @@ -2058,10 +2077,10 @@ define([ * @param map * @param newSystemData * @param sourceSystem + * @param connectionData + * @returns {Promise} */ - let saveSystemCallback = (map, newSystemData, sourceSystem) => { - drawSystem(map, newSystemData, sourceSystem); - }; + let saveSystemCallback = (map, newSystemData, sourceSystem, connectionData = null) => drawSystem(map, newSystemData, sourceSystem, connectionData); /** * select all (selectable) systems on a mapElement @@ -2211,17 +2230,8 @@ define([ return false; } - // lock the target system for "click" events - // to prevent loading system information let sourceSystem = $('#' + sourceId); let targetSystem = $('#' + targetId); - sourceSystem.addClass('no-click'); - targetSystem.addClass('no-click'); - - setTimeout(() => { - sourceSystem.removeClass('no-click'); - targetSystem.removeClass('no-click'); - }, Init.timer.DBL_CLICK + 50); // switch connection type to "abyss" in case source OR target system belongs to "a-space" if(sourceSystem.data('typeId') === 3 || targetSystem.data('typeId') === 3){ @@ -2245,7 +2255,7 @@ define([ } // always save the new connection - saveConnection(connection); + saveConnection(connection).catch(console.warn); return true; }); @@ -2316,9 +2326,9 @@ define([ // store new zoom level in IndexDB if(zoom === 1){ - MapUtil.deleteLocalData('map', mapId, 'mapZoom'); + Util.getLocalStore('map').removeItem(`${mapId}.mapZoom`); }else{ - MapUtil.storeLocalData('map', mapId, 'mapZoom', zoom); + Util.getLocalStore('map').setItem(`${mapId}.mapZoom`, zoom); } }); @@ -2406,7 +2416,7 @@ define([ e.stopPropagation(); // make sure map is clicked and NOT a connection - if($(e.target).hasClass(config.mapClass)){ + if($(e.target).hasClass(Util.config.mapClass)){ getContextMenuConfig(map).then(payload => { let context = { component: map @@ -2532,6 +2542,20 @@ define([ selector: '.' + config.systemClass + ' .' + config.systemHeadExpandClass }); + mapContainer.hoverIntent({ + over: function(e){ + $(this).tooltip({ + trigger: 'manual', + placement: 'right', + viewport: this.closest(`.${config.systemClass}`) + }).tooltip('show'); + }, + out: function(e){ + $(this).tooltip('destroy'); + }, + selector: `.${config.systemClass} .fas[title]` + }); + // system "active users" popover ------------------------------------------------------------------------------ mapContainer.hoverIntent({ over: function(e){ @@ -2611,8 +2635,7 @@ define([ // get map menu config options let mapOption = mapOptions[data.option]; - let promiseStore = MapUtil.getLocaleData('map', mapContainer.data('id')); - promiseStore.then(function(dataStore){ + Util.getLocalStore('map').getItem(mapContainer.data('id')).then(function(dataStore){ let notificationText = 'disabled'; let button = $('#' + this.mapOption.buttonId); let dataExists = false; @@ -2643,7 +2666,7 @@ define([ MapOverlayUtil.getMapOverlay(this.mapContainer, 'info').updateOverlayIcon(this.data.option, 'hide'); // delete map option - MapUtil.deleteLocalData('map', this.mapContainer.data('id'), this.data.option); + Util.getLocalStore('map').removeItem(`${this.mapContainer.data('id')}.${this.data.option}`); }else{ // toggle button class button.addClass('active'); @@ -2662,7 +2685,7 @@ define([ MapOverlayUtil.getMapOverlay(this.mapContainer, 'info').updateOverlayIcon(this.data.option, 'show'); // store map option - MapUtil.storeLocalData('map', this.mapContainer.data('id'), this.data.option, 1); + Util.getLocalStore('map').setItem(`${this.mapContainer.data('id')}.${this.data.option}`, 1); notificationText = 'enabled'; } @@ -2701,8 +2724,8 @@ define([ } if(select){ - let mapWrapper = mapContainer.closest('.' + config.mapWrapperClass); - Scrollbar.scrollToCenter(mapWrapper, system); + let areaMap = mapContainer.closest('.' + Util.getMapTabContentAreaClass('map')); + Scrollbar.scrollToCenter(areaMap, system); // select system MapUtil.showSystemInfo(map, system); } @@ -2726,7 +2749,7 @@ define([ selectSystem(mapContainer, data); break; case 'AddSystem': - System.showNewSystemDialog(map, data, saveSystemCallback); + System.showNewSystemDialog(map, data, typeof data.callback === 'function' ? data.callback : saveSystemCallback); break; default: console.warn('Unknown menuAction %o event name', action); @@ -2771,7 +2794,7 @@ define([ let mapElement = $(this); let mapOverlay = MapOverlayUtil.getMapOverlay(mapElement, 'local'); let currentMapData = Util.getCurrentMapData(mapId); - let currentCharacterLog = Util.getCurrentCharacterLog(); + let currentCharacterLog = Util.getCurrentCharacterData('log'); let clearLocal = true; if( @@ -2868,7 +2891,7 @@ define([ let compactView = mapElement.hasClass(MapUtil.config.mapCompactClass); // get current character log data - let characterLogSystemId = Util.getObjVal(Util.getCurrentCharacterLog(), 'system.id') || 0; + let characterLogSystemId = Util.getObjVal(Util.getCurrentCharacterData('log'), 'system.id') || 0; // data for header update let headerUpdateData = { @@ -2943,16 +2966,16 @@ define([ /** * collect all map data from client for server or client sync - * @param mapContainer + * @param {HTMLElement} mapContainer * @param filter * @param minimal - * @returns {boolean} + * @returns {boolean|{}} */ let getMapDataForSync = (mapContainer, filter = [], minimal = false) => { let mapData = false; // check if there is an active map counter that prevents collecting map data (locked map) - if(!MapOverlayUtil.getMapOverlayInterval(mapContainer)){ - mapData = mapContainer.getMapDataFromClient(filter, minimal); + if(!MapOverlayUtil.isMapCounterOverlayActive(mapContainer)){ + mapData = $(mapContainer).getMapDataFromClient(filter, minimal); } return mapData; }; @@ -2962,6 +2985,7 @@ define([ * this function returns the "client" data NOT the "server" data for a map * @param filter * @param minimal + * @returns {{}} */ $.fn.getMapDataFromClient = function(filter = [], minimal = false){ let mapContainer = $(this); @@ -3104,43 +3128,41 @@ define([ * @param options * @returns {Promise} */ - let initMapOptions = (mapConfig, options) => { - - let initMapOptionsExecutor = (resolve, reject) => { - let payload = { - action: 'initMapOptions', - data: { - mapConfig: mapConfig - } - }; - - if(options.showAnimation){ - let mapElement = $(mapConfig.map.getContainer()); - MapUtil.setMapDefaultOptions(mapElement, mapConfig.config) - .then(payload => MapUtil.visualizeMap(mapElement, 'show')) - .then(payload => MapUtil.zoomToDefaultScale(mapConfig.map)) - .then(payload => MapUtil.scrollToDefaultPosition(mapConfig.map)) - .then(payload => { - Util.showNotify({title: 'Map initialized', text: mapConfig.config.name + ' - loaded', type: 'success'}); - }) - .then(() => resolve(payload)); - }else{ - // nothing to do here... - resolve(payload); + let initMapOptions = (mapConfig, options) => new Promise((resolve, reject) => { + let payload = { + action: 'initMapOptions', + data: { + mapConfig: mapConfig } }; - return new Promise(initMapOptionsExecutor); - }; + if(options.showAnimation){ + let mapElement = $(mapConfig.map.getContainer()); + MapUtil.setMapDefaultOptions(mapElement, mapConfig.config) + .then(payload => MapUtil.visualizeMap(mapElement, 'show')) + .then(payload => MapUtil.zoomToDefaultScale(mapConfig.map)) + .then(payload => MapUtil.scrollToDefaultPosition(mapConfig.map)) + .then(payload => { + Util.showNotify({title: 'Map initialized', text: mapConfig.config.name + ' - loaded', type: 'success'}); + }) + .then(() => resolve(payload)); + }else{ + // nothing to do here... + resolve(payload); + } + }); /** * load OR updates system map - * @param tabContentElement parent element where the map will be loaded + * @param areaMap parent element where the map will be loaded * @param mapConfig * @param options * @returns {Promise} */ - let loadMap = (tabContentElement, mapConfig, options) => { + let loadMap = (areaMap, mapConfig, options) => { + // whether map gets loaded (initialized) for the first time + // or just updated an existing map + let isFirstLoad = false; /** * load map promise @@ -3155,7 +3177,8 @@ define([ if(mapConfig.map.getContainer() === undefined){ // map not loaded -> create & update - newMapElement(tabContentElement, mapConfig) + isFirstLoad = true; + newMapElement(areaMap, mapConfig) .then(payload => updateMap(payload.data.mapConfig)) .then(payload => resolve(payload)); }else{ @@ -3167,19 +3190,24 @@ define([ }; return new Promise(loadMapExecutor) - .then(payload => initMapOptions(payload.data.mapConfig, options)); + .then(payload => initMapOptions(payload.data.mapConfig, options)) + .then(payload => ({ + action: 'loadMap', + data: payload.data, + isFirstLoad + })); }; /** * init scrollbar for Map element - * @param mapWrapper + * @param areaMap */ - let initMapScrollbar = mapWrapper => { - let mapElement = mapWrapper.find('.' + config.mapClass); + let initMapScrollbar = areaMap => { + let mapElement = areaMap.find('.' + Util.config.mapClass); let mapId = mapElement.data('id'); let dragSelect; - Scrollbar.initScrollbar(mapWrapper, { + Scrollbar.initScrollbar(areaMap, { callbacks: { onInit: function(){ let scrollWrapper = this; @@ -3215,7 +3243,7 @@ define([ let animationFrameId = 0; let toggleDragScroll = active => { - mapElement.toggleClass('disabled', active).toggleClass(' pf-map-move', active); + mapElement.toggleClass('disabled', active).toggleClass('pf-map-move', active); }; let stopDragScroll = () => { @@ -3303,7 +3331,7 @@ define([ mapElement.attr('data-scroll-top', this.mcs.top); // store new map scrollOffset -> localDB - MapUtil.storeLocalData('map', mapId, 'scrollOffset', { + Util.getLocalStore('map').setItem(`${mapId}.scrollOffset`, { x: Math.abs(this.mcs.left), y: Math.abs(this.mcs.top) }); @@ -3326,8 +3354,8 @@ define([ // ------------------------------------------------------------------------------------------------------------ // add map overlays after scrollbar is initialized // because of its absolute position - mapWrapper.initMapOverlays(); - mapWrapper.initLocalOverlay(mapId); + areaMap.initMapOverlays(); + areaMap.initLocalOverlay(mapId); }; return { @@ -3335,7 +3363,9 @@ define([ loadMap: loadMap, updateUserData: updateUserData, getMapDataForSync: getMapDataForSync, - saveSystemCallback: saveSystemCallback + saveSystemCallback: saveSystemCallback, + drawConnection: drawConnection, + saveConnection: saveConnection }; }); \ No newline at end of file diff --git a/js/app/map/overlay/overlay.js b/js/app/map/overlay/overlay.js index cc408159..550dbe04 100644 --- a/js/app/map/overlay/overlay.js +++ b/js/app/map/overlay/overlay.js @@ -7,8 +7,9 @@ define([ 'app/init', 'app/util', 'app/map/overlay/util', - 'app/map/util' -], ($, Init, Util, MapOverlayUtil, MapUtil) => { + 'app/map/util', + 'app/lib/cron' +], ($, Init, Util, MapOverlayUtil, MapUtil, Cron) => { 'use strict'; /** @@ -17,7 +18,7 @@ define([ * @returns {*} */ let getMapObjectFromOverlayIcon = overlayIcon => { - return MapUtil.getMapInstance(Util.getMapElementFromOverlay(overlayIcon).data('id')); + return MapUtil.getMapInstance(MapOverlayUtil.getMapElementFromOverlay(overlayIcon).data('id')); }; /** @@ -107,119 +108,120 @@ define([ let type = 'info_signature'; connectionsData = Util.arrayToObject(connectionsData); - map.batch(() => { - map.getAllConnections().forEach(connection => { - let connectionId = connection.getParameter('connectionId'); - let sourceEndpoint = connection.endpoints[0]; - let targetEndpoint = connection.endpoints[1]; + map.setSuspendDrawing(true); - let connectionData = connectionsData.hasOwnProperty(connectionId) ? connectionsData[connectionId] : undefined; - let signatureTypeData = MapUtil.getConnectionDataFromSignatures(connection, connectionData); + map.getAllConnections().forEach(connection => { + let connectionId = connection.getParameter('connectionId'); + let sourceEndpoint = connection.endpoints[0]; + let targetEndpoint = connection.endpoints[1]; - let sizeLockedBySignature = false; + let connectionData = Util.getObjVal(connectionsData, `${connectionId}`); + let signatureTypeData = MapUtil.getConnectionDataFromSignatures(connection, connectionData); - if(connection.scope === 'wh'){ - if(!connection.hasType(type)){ - connection.addType(type); - } + let sizeLockedBySignature = false; - let overlayArrow = connection.getOverlay(MapOverlayUtil.config.connectionOverlayArrowId); + if(connection.scope === 'wh'){ + if(!connection.hasType(type)){ + connection.addType(type); + } - // Arrow overlay needs to be cleared() (removed) if 'info_signature' gets removed! - // jsPlumb does not handle overlay updates for Arrow overlays... so we need to re-apply the the overlay manually - if(overlayArrow.path && !overlayArrow.path.isConnected){ - connection.canvas.appendChild(overlayArrow.path); - } + let overlayArrow = connection.getOverlay(MapOverlayUtil.config.connectionOverlayArrowId); - // since there "could" be multiple sig labels on each endpoint, - // there can only one "primary label picked up for wormhole jump mass detection! - let primLabel; + // Arrow overlay needs to be cleared() (removed) if 'info_signature' gets removed! + // jsPlumb does not handle overlay updates for Arrow overlays... so we need to re-apply the the overlay manually + if(overlayArrow.path && !overlayArrow.path.isConnected){ + connection.canvas.appendChild(overlayArrow.path); + } - let overlayType = 'diamond'; // not specified - let arrowDirection = 1; + // since there "could" be multiple sig labels on each endpoint, + // there can only one "primary label picked up for wormhole jump mass detection! + let primeLabel; - if(connectionData && connectionData.signatures){ - // signature data found for current connection - let sourceLabel = signatureTypeData.source.labels; - let targetLabel = signatureTypeData.target.labels; + let overlayType = 'diamond'; // not specified + let arrowDirection = 1; - // add arrow (connection) overlay that points from "XXX" => "K162" ---------------------------- - if( - (sourceLabel.includes('K162') && targetLabel.includes('K162')) || - (sourceLabel.length === 0 && targetLabel.length === 0) || - ( - sourceLabel.length > 0 && targetLabel.length > 0 && - !sourceLabel.includes('K162') && !targetLabel.includes('K162') - ) - ){ - // unknown direction -> show default 'diamond' overlay - overlayType = 'diamond'; - }else if( - (sourceLabel.includes('K162')) || - (sourceLabel.length === 0 && !targetLabel.includes('K162')) - ){ - // convert default arrow direction - overlayType = 'arrow'; - arrowDirection = -1; + if(connectionData && connectionData.signatures){ + // signature data found for current connection + let sourceLabel = signatureTypeData.source.labels; + let targetLabel = signatureTypeData.target.labels; - primLabel = targetLabel.find(label => label !== 'K162'); - }else{ - // default arrow direction is fine - overlayType = 'arrow'; + // add arrow (connection) overlay that points from "XXX" => "K162" ---------------------------- + if( + (sourceLabel.includes('K162') && targetLabel.includes('K162')) || + (sourceLabel.length === 0 && targetLabel.length === 0) || + ( + sourceLabel.length > 0 && targetLabel.length > 0 && + !sourceLabel.includes('K162') && !targetLabel.includes('K162') + ) + ){ + // unknown direction -> show default 'diamond' overlay + overlayType = 'diamond'; + }else if( + (sourceLabel.includes('K162')) || + (sourceLabel.length === 0 && !targetLabel.includes('K162')) + ){ + // convert default arrow direction + overlayType = 'arrow'; + arrowDirection = -1; - primLabel = sourceLabel.find(label => label !== 'K162'); - } - } - - // class changes must be done on "connection" itself not on "overlayArrow" - // -> because Arrow might not be rendered to map at this point (if it does not exist already) - if(overlayType === 'arrow'){ - connection.updateClasses( - MapOverlayUtil.config.connectionArrowOverlaySuccessClass, - MapOverlayUtil.config.connectionArrowOverlayDangerClass - ); + primeLabel = targetLabel.find(label => label !== 'K162'); }else{ - connection.updateClasses( - MapOverlayUtil.config.connectionArrowOverlayDangerClass, - MapOverlayUtil.config.connectionArrowOverlaySuccessClass - ); - } + // default arrow direction is fine + overlayType = 'arrow'; - overlayArrow.updateFrom(getConnectionArrowOverlayParams(overlayType, arrowDirection)); - - // update/add endpoint overlays ------------------------------------------------------------------- - updateEndpointOverlaySignatureLabel(sourceEndpoint, signatureTypeData.source); - updateEndpointOverlaySignatureLabel(targetEndpoint, signatureTypeData.target); - - // fix/overwrite existing jump mass connection type ----------------------------------------------- - // if a connection type for "jump mass" (e.g. S, M, L, XL) is set for this connection - // we should check/compare it with the current primary signature label from signature mapping - // and change it if necessary - if(Init.wormholes.hasOwnProperty(primLabel)){ - // connection size from mapped signature - sizeLockedBySignature = true; - - let wormholeData = Object.assign({}, Init.wormholes[primLabel]); - // get 'connection mass type' from wormholeData - let massType = Util.getObjVal(wormholeData, 'size.type'); - - if(massType && !connection.hasType(massType)){ - MapOverlayUtil.getMapOverlay(connection.canvas, 'timer').startMapUpdateCounter(); - MapUtil.setConnectionJumpMassType(connection, wormholeData.size.type); - MapUtil.markAsChanged(connection); - } - } - }else{ - // connection is not 'wh' scope - if(connection.hasType(type)){ - connection.removeType(type); + primeLabel = sourceLabel.find(label => label !== 'K162'); } } - // lock/unlock connection for manual size changes (from contextmenu) - connection.setParameter('sizeLocked', sizeLockedBySignature); - }); + // class changes must be done on "connection" itself not on "overlayArrow" + // -> because Arrow might not be rendered to map at this point (if it does not exist already) + if(overlayType === 'arrow'){ + connection.updateClasses( + MapOverlayUtil.config.connectionArrowOverlaySuccessClass, + MapOverlayUtil.config.connectionArrowOverlayDangerClass + ); + }else{ + connection.updateClasses( + MapOverlayUtil.config.connectionArrowOverlayDangerClass, + MapOverlayUtil.config.connectionArrowOverlaySuccessClass + ); + } + + overlayArrow.updateFrom(getConnectionArrowOverlayParams(overlayType, arrowDirection)); + + // update/add endpoint overlays ------------------------------------------------------------------- + updateEndpointOverlaySignatureLabel(sourceEndpoint, signatureTypeData.source); + updateEndpointOverlaySignatureLabel(targetEndpoint, signatureTypeData.target); + + // fix/overwrite existing jump mass connection type ----------------------------------------------- + // if a connection type for "jump mass" (e.g. S, M, L, XL) is set for this connection + // we should check/compare it with the current primary signature label from signature mapping + // and change it if necessary + if(Init.wormholes.hasOwnProperty(primeLabel)){ + // connection size from mapped signature + sizeLockedBySignature = true; + + // get 'connection mass type' from wormholeData + let massType = Util.getObjVal(Object.assign({}, Init.wormholes[primeLabel]), 'size.type'); + + if(massType && !connection.hasType(massType)){ + MapOverlayUtil.getMapOverlay(connection.canvas, 'timer').startMapUpdateCounter(); + MapUtil.setConnectionJumpMassType(connection, massType); + MapUtil.markAsChanged(connection); + } + } + }else{ + // connection is not 'wh' scope + if(connection.hasType(type)){ + connection.removeType(type); + } + } + + // lock/unlock connection for manual size changes (from contextmenu) + connection.setParameter('sizeLocked', sizeLockedBySignature); }); + + map.setSuspendDrawing(false, true); }; /** @@ -291,21 +293,23 @@ define([ let map = MapUtil.getMapInstance(mapId); let type = 'info_signature'; - map.batch(() => { - map.getAllConnections().forEach(connection => { - let overlayArrow = connection.getOverlay(MapOverlayUtil.config.connectionOverlayArrowId); + map.setSuspendDrawing(true); - if(overlayArrow){ - overlayArrow.cleanup(); - } + map.getAllConnections().forEach(connection => { + let overlayArrow = connection.getOverlay(MapOverlayUtil.config.connectionOverlayArrowId); - if(connection.hasType(type)){ - connection.removeType(type, {}, true); - } - }); + if(overlayArrow){ + overlayArrow.cleanup(); + } - map.selectEndpoints().removeOverlay(MapOverlayUtil.config.endpointOverlayId); + if(connection.hasType(type)){ + connection.removeType(type, {}, true); + } }); + + map.selectEndpoints().removeOverlay(MapOverlayUtil.config.endpointOverlayId); + + map.setSuspendDrawing(false, true); }; /** @@ -321,9 +325,9 @@ define([ trigger: 'active', class: 'pf-map-overlay-filter', iconClass: ['fas', 'fa-fw', 'fa-filter'], - onClick: function(e){ + onClick: function(e){ // clear all filter - let mapElement = Util.getMapElementFromOverlay(this); + let mapElement = MapOverlayUtil.getMapElementFromOverlay(this); let map = getMapObjectFromOverlayIcon(this); MapUtil.storeLocalData('map', mapElement.data('id'), 'filterScopes', []); @@ -349,7 +353,7 @@ define([ iconClass: ['fas', 'fa-fw', 'fa-tags'], hoverIntent: { over: function(e){ - let mapElement = Util.getMapElementFromOverlay(this); + let mapElement = MapOverlayUtil.getMapElementFromOverlay(this); mapElement.find('.' + MapOverlayUtil.config.systemHeadClass).each(function(){ let systemHead = $(this); // init popover if not already exists @@ -373,7 +377,7 @@ define([ }); }, out: function(e){ - let mapElement = Util.getMapElementFromOverlay(this); + let mapElement = MapOverlayUtil.getMapElementFromOverlay(this); mapElement.find('.' + MapOverlayUtil.config.systemHeadClass).popover('hide'); } } @@ -484,108 +488,96 @@ define([ * @param mapOverlayTimer * @param percent * @param value - * @returns {*} */ - let setMapUpdateCounter = (mapOverlayTimer, percent, value) => { + let setMapUpdateCounter = (mapOverlayTimer, percent, value = '') => { // check if counter already exists - let counterChart = MapOverlayUtil.getMapCounter(mapOverlayTimer); - - if(counterChart.length === 0){ + if(!MapOverlayUtil.getMapCounter(mapOverlayTimer)){ // create new counter + let chartEl = Object.assign(document.createElement('div'), { + className: `${Init.classes.pieChart.class} ${Init.classes.pieChart.pieChartMapCounterClass}` + }); - counterChart = $('
    ', { - class: [Init.classes.pieChart.class, Init.classes.pieChart.pieChartMapCounterClass].join(' ') - }).attr('data-percent', percent).append( - $('', { - text: value - }) - ); + let chartInnerEl = Object.assign(document.createElement('span'), { + textContent: value + }); + let iconEl = Object.assign(document.createElement('i'), { + className: ['fas', 'fa-fw', 'fa-lock'].join(' ') + }); - mapOverlayTimer.append(counterChart); + chartInnerEl.append(iconEl); + chartEl.append(chartInnerEl); + mapOverlayTimer.append(chartEl); // init counter - counterChart.initMapUpdateCounter(); + $(chartEl).initMapUpdateCounter(); // set tooltip - mapOverlayTimer.attr('data-placement', 'left'); - mapOverlayTimer.attr('title', 'update counter'); - mapOverlayTimer.tooltip(); + mapOverlayTimer.dataset.placement = 'left'; + mapOverlayTimer.setAttribute('title', 'update counter'); + $(mapOverlayTimer).tooltip(); } - - return counterChart; }; /** * start the map update counter or reset */ $.fn.startMapUpdateCounter = function(){ - let mapOverlayTimer = $(this); - let counterChart = MapOverlayUtil.getMapCounter(mapOverlayTimer); - - let maxSeconds = MapOverlayUtil.config.logTimerCount; - - let counterChartLabel = counterChart.find('span'); - - let percentPerCount = 100 / maxSeconds; - - // update counter - let updateChart = tempSeconds => { - let pieChart = counterChart.data('easyPieChart'); - - if(pieChart !== undefined){ - counterChart.data('easyPieChart').update( percentPerCount * tempSeconds); - } - counterChartLabel.text(tempSeconds); - }; - - // main timer function is called on any counter update - let timer = mapUpdateCounter => { - // decrease timer - let currentSeconds = counterChart.data('currentSeconds'); - currentSeconds--; - counterChart.data('currentSeconds', currentSeconds); - - if(currentSeconds >= 0){ - // update counter - updateChart(currentSeconds); - }else{ - // hide counter and reset - clearInterval(mapUpdateCounter); - - mapOverlayTimer.velocity('transition.whirlOut', { - duration: Init.animationSpeed.mapOverlay, - complete: function(){ - counterChart.data('interval', false); - Util.getMapElementFromOverlay(mapOverlayTimer).trigger('pf:unlocked'); - } - }); - } - }; - - // get current seconds (in case the timer is already running) - let currentSeconds = counterChart.data('currentSeconds'); - - // start values for timer and chart - counterChart.data('currentSeconds', maxSeconds); - updateChart(maxSeconds); - - if( - currentSeconds === undefined || - currentSeconds < 0 - ){ - // start timer - let mapUpdateCounter = setInterval(() => { - timer(mapUpdateCounter); - }, 1000); - - // store counter interval - counterChart.data('interval', mapUpdateCounter); - - // show overlay - if(mapOverlayTimer.is(':hidden')){ - mapOverlayTimer.velocity('stop').velocity('transition.whirlIn', { duration: Init.animationSpeed.mapOverlay }); - } + if(!this.length){ + console.warn('startMapUpdateCounter() failed. Missing DOM node'); + return; } + let mapOverlayTimer = this[0]; + let counterChart = MapOverlayUtil.getMapCounter(mapOverlayTimer); + let pieChart = $(counterChart).data('easyPieChart'); + + if(!pieChart){ + console.warn('startMapUpdateCounter() failed. easyPieChart not initialized'); + return; + } + + let updateChart = (percent = 0) => { + if(pieChart){ + pieChart.update(percent); + } + }; + + let task = counterChart.getData('counterTask'); + if(!task){ + let tabContentEl = mapOverlayTimer.closest(`.${Util.config.mapTabContentClass}`); + let mapId = parseInt(tabContentEl.dataset.mapId) || 0; + task = Cron.new(`mapUpdateCounter_${mapId}`, { + precision: 'secondTenths', + isParallel: true, + targetRunCount: 10 * MapOverlayUtil.config.logTimerCount + }); + + task.task = (timer, task) => { + // debounce 80% (reduce repaint) + if(task.runCount % 5 === 0){ + let progress = Math.round(task.targetProgress); + updateChart(100 - progress); + } + + if(task.targetAchieved){ + $(mapOverlayTimer).velocity('transition.whirlOut', { + duration: Init.animationSpeed.mapOverlay, + complete: function(){ + MapOverlayUtil.getMapElementFromOverlay(mapOverlayTimer).trigger('pf:unlocked'); + } + }); + } + }; + + counterChart.setData('counterTask', task); + } + + // task is not connected if: 'targetAchieved' or not started + if(!task.isConnected()){ + $(mapOverlayTimer).velocity('stop').velocity('transition.whirlIn', { duration: Init.animationSpeed.mapOverlay }); + } + updateChart(100); + task.reset(); + task.start(); }; /** @@ -836,36 +828,35 @@ define([ }); // add all overlay elements - for(let prop in options){ - if(options.hasOwnProperty(prop)){ - let icon = $('', { - class: options[prop].iconClass.concat( ['pull-right', options[prop].class] ).join(' ') - }).attr('title', options[prop].title).tooltip({ - placement: 'bottom', - container: 'body', - delay: 150 - }); + Object.entries(options).forEach(([key, option]) => { + let icon = $('', { + class: option.iconClass.concat(['pull-right', option.class]).join(' ') + }).attr('title', option.title).tooltip({ + placement: 'bottom', + container: 'body', + delay: 150 + }); - // add "hover" action for some icons - if( - options[prop].trigger === 'hover' || - options[prop].trigger === 'refresh' - ){ - icon.hoverIntent(options[prop].hoverIntent); - } - - // add "click" handler for some icons - if(options[prop].hasOwnProperty('onClick')){ - icon.on('click', options[prop].onClick); - } - - mapOverlayInfo.append(icon); + // add "hover" action for some icons + if( + option.trigger === 'hover' || + option.trigger === 'refresh' + ){ + icon.hoverIntent(option.hoverIntent); } - } + + // add "click" handler for some icons + if(option.hasOwnProperty('onClick')){ + icon.on('click', option.onClick); + } + + mapOverlayInfo.append(icon); + }); + parentElement.append(mapOverlayInfo); // reset map update timer - setMapUpdateCounter(mapOverlayTimer, 100, MapOverlayUtil.config.logTimerCount); + setMapUpdateCounter(mapOverlayTimer[0], 100); }); }; diff --git a/js/app/map/overlay/util.js b/js/app/map/overlay/util.js index 21fc49ab..10b5a9bc 100644 --- a/js/app/map/overlay/util.js +++ b/js/app/map/overlay/util.js @@ -13,8 +13,6 @@ define([ let config = { logTimerCount: 3, // map log timer in seconds - mapWrapperClass: 'pf-map-wrapper', // wrapper div (scrollable) - // map overlays sections mapOverlayClass: 'pf-map-overlay', // class for all map overlays mapOverlayTimerClass: 'pf-map-overlay-timer', // class for map overlay timer e.g. map timer @@ -53,21 +51,21 @@ define([ * @returns {null} */ let getMapOverlay = (element, overlayType) => { - let mapWrapperElement = $(element).parents('.' + config.mapWrapperClass); + let areaMap = $(element).closest('.' + Util.getMapTabContentAreaClass('map')); let mapOverlay = null; switch(overlayType){ case 'timer': - mapOverlay = mapWrapperElement.find('.' + config.mapOverlayTimerClass); + mapOverlay = areaMap.find('.' + config.mapOverlayTimerClass); break; case 'info': - mapOverlay = mapWrapperElement.find('.' + config.mapOverlayInfoClass); + mapOverlay = areaMap.find('.' + config.mapOverlayInfoClass); break; case 'zoom': - mapOverlay = mapWrapperElement.find('.' + config.mapOverlayZoomClass); + mapOverlay = areaMap.find('.' + config.mapOverlayZoomClass); break; case 'local': - mapOverlay = mapWrapperElement.find('.' + config.overlayLocalClass); + mapOverlay = areaMap.find('.' + config.overlayLocalClass); break; } @@ -75,23 +73,43 @@ define([ }; /** - * get the map counter chart from overlay - * @param element + * get mapElement from overlay or any child of that + * @param mapOverlay * @returns {jQuery} */ - let getMapCounter = element => $(element).find('.' + Init.classes.pieChart.pieChartMapCounterClass); + let getMapElementFromOverlay = mapOverlay => { + return $(mapOverlay).closest('.' + Util.getMapTabContentAreaClass('map')).find('.' + Util.config.mapClass); + }; /** - * get interval value from map timer overlay + * get the map counter chart from overlay * @param element - * @returns {*} + * @returns {Element} */ - let getMapOverlayInterval = element => getMapCounter(getMapOverlay(element, 'timer')).data('interval'); + let getMapCounter = element => element.querySelector(`.${Init.classes.pieChart.pieChartMapCounterClass}`); + + /** + * if there is an "active" (connected) counter task + * -> lock overlay + * @param {HTMLElement} element + * @returns {boolean} + */ + let isMapCounterOverlayActive = element => { + let mapOverlay = getMapOverlay(element, 'timer'); + if(mapOverlay){ + let mapCounter = getMapCounter(mapOverlay[0]); + if(mapCounter && mapCounter.getData('counterTask')){ + return mapCounter.getData('counterTask').isConnected(); + } + } + return false; + }; return { config: config, getMapOverlay: getMapOverlay, + getMapElementFromOverlay: getMapElementFromOverlay, getMapCounter: getMapCounter, - getMapOverlayInterval: getMapOverlayInterval + isMapCounterOverlayActive: isMapCounterOverlayActive }; }); \ No newline at end of file diff --git a/js/app/map/scrollbar.js b/js/app/map/scrollbar.js index 9a072db5..4b5d452c 100644 --- a/js/app/map/scrollbar.js +++ b/js/app/map/scrollbar.js @@ -15,10 +15,10 @@ define([ let defaultConfig = { axis: 'yx', - theme: 'light-3' , + theme: 'light-3', scrollInertia: 200, autoExpandScrollbar: false, - scrollButtons:{ + scrollButtons: { enable: true, scrollAmount: 30, scrollType: 'stepless' @@ -226,25 +226,25 @@ define([ /** * scroll to a specific position on map * demo: http://manos.malihu.gr/repository/custom-scrollbar/demo/examples/scrollTo_demo.html - * @param scrollWrapper + * @param scrollArea * @param position * @param options */ - let scrollToPosition = (scrollWrapper, position, options) => { - $(scrollWrapper).mCustomScrollbar('scrollTo', position, options); + let scrollToPosition = (scrollArea, position, options) => { + $(scrollArea).mCustomScrollbar('scrollTo', position, options); }; /** * scroll to center an element * -> subtract some offset for tooltips/connections - * @param scrollWrapper + * @param scrollArea * @param element */ - let scrollToCenter = (scrollWrapper, element) => { + let scrollToCenter = (scrollArea, element) => { // no scroll if element is already FULL visible in scrollable viewport if(!isInView(element)){ // get scrollTo position for centered element - scrollToPosition(scrollWrapper, getCenterScrollPosition(element)); + scrollToPosition(scrollArea, getCenterScrollPosition(element)); } }; diff --git a/js/app/map/system.js b/js/app/map/system.js index f04c9836..ce95c282 100644 --- a/js/app/map/system.js +++ b/js/app/map/system.js @@ -19,13 +19,10 @@ define([ y: 0 }, - mapClass: 'pf-map', // class for all maps - systemHeadInfoClass: 'pf-system-head-info', // class for system info systemHeadInfoLeftClass: 'pf-system-head-info-left', // class for left system info systemHeadInfoRightClass: 'pf-system-head-info-right', // class for right system info - systemActiveClass: 'pf-system-active', // class for an active system on a map systemTooltipInnerIdPrefix: 'pf-system-tooltip-inner-', // id prefix for system tooltip content systemTooltipInnerClass: 'pf-system-tooltip-inner', // class for system tooltip content @@ -138,7 +135,7 @@ define([ // show loading animation dialogElement.find('[data-type="spinner"]').addClass('in'); - Util.request('GET', 'system', systemId, {mapId: mapId, isCcpId: 1}, {dialogElement: dialogElement}) + Util.request('GET', 'System', systemId, {mapId: mapId, isCcpId: 1}, {dialogElement: dialogElement}) .then(payload => updateDialog(payload.context.dialogElement, payload.data)) .catch(payload => updateDialog(payload.context.dialogElement)); }; @@ -189,7 +186,7 @@ define([ systemData = options.systemData; }else{ // ... check for current active system (characterLog) ----------------------------------------------------- - let currentCharacterLog = Util.getCurrentCharacterLog(); + let currentCharacterLog = Util.getCurrentCharacterData('log'); if(currentCharacterLog !== false){ // set system from 'characterLog' data as pre-selected system systemData = Util.getObjVal(currentCharacterLog, 'system'); @@ -233,24 +230,26 @@ define([ if(formValid === false) return false; // calculate new system position ---------------------------------------------------------- - let newPosition = { - x: 0, - y: 0 - }; + let newPosition; // add new position let sourceSystem = null; + let connectionData = null; if(options.sourceSystem !== undefined){ + // new position based on sourceSystem´s position sourceSystem = options.sourceSystem; + connectionData = options.connectionData || null; - // get new position newPosition = newSystemPositionBySystem(sourceSystem); }else if(options.position){ - // check mouse cursor position (add system to map) + // new position based on coordinated (e.g. mouse event) newPosition = { x: options.position.x, y: options.position.y }; + }else{ + // new position based on current map scroll offset + newPosition = MapUtil.newSystemPositionsByMapOffset(mapContainer)[0]; } formData.position = newPosition; @@ -260,11 +259,12 @@ define([ this.find('.modal-content').showLoadingAnimation(); - Util.request('PUT', 'system', [], formData, { + Util.request('PUT', 'System', [], formData, { systemDialog: systemDialog, formElement: form, map: map, - sourceSystem: sourceSystem + sourceSystem: sourceSystem, + connectionData: connectionData }, context => { // always do context.systemDialog.find('.modal-content').hideLoadingAnimation(); @@ -272,7 +272,7 @@ define([ payload => { Util.showNotify({title: 'New system', text: payload.data.name, type: 'success'}); - callback(payload.context.map, payload.data, payload.context.sourceSystem); + callback(payload.context.map, payload.data, payload.context.sourceSystem, payload.context.connectionData); bootbox.hideAll(); }, Util.handleAjaxErrorResponse @@ -617,8 +617,8 @@ define([ placement: getSystemTooltipPlacement(system), html: true, animation: true, - template: template, - viewport: system.closest('.' + config.mapClass) + template: template, + container: system.closest('.' + Util.config.mapClass) }; // init new tooltip -> Do not show automatic maybe system is currently dragged @@ -666,7 +666,7 @@ define([ let mapContainer = $( map.getContainer() ); let systemIds = systems.map(system => $(system).data('id')); - Util.request('DELETE', 'system', systemIds, { + Util.request('DELETE', 'System', systemIds, { mapId: mapContainer.data('id') }, { map: map, @@ -701,10 +701,12 @@ define([ for(let system of systems){ system = $(system); + let mapId = parseInt(system.data('mapid')) || 0; // check if system is "active" - if(system.hasClass(config.systemActiveClass)){ - delete Init.currentSystemData; + if(system.hasClass(MapUtil.config.systemActiveClass)){ + Util.deleteCurrentSystemData(mapId); + // get parent Tab Content and fire clear modules event let tabContentElement = MapUtil.getTabContentElementByMapElement(system); $(tabContentElement).trigger('pf:removeSystemModules'); @@ -714,7 +716,7 @@ define([ map.deleteConnectionsForElement(system, {fireEvent: false}); // unregister from "magnetizer" - Magnetizer.removeElement(system.data('mapid'), system[0]); + Magnetizer.removeElement(mapId, system[0]); // destroy tooltip/popover system.toggleSystemTooltip('destroy', {}); diff --git a/js/app/map/util.js b/js/app/map/util.js index 3edb62ec..79c68823 100644 --- a/js/app/map/util.js +++ b/js/app/map/util.js @@ -18,14 +18,6 @@ define([ zoomMax: 1.5, zoomMin: 0.5, - // local storage - characterLocalStoragePrefix: 'character_', // prefix for character data local storage key - mapLocalStoragePrefix: 'map_', // prefix for map data local storage key - mapTabContentClass: 'pf-map-tab-content', // Tab-Content element (parent element) - - mapWrapperClass: 'pf-map-wrapper', // wrapper div (scrollable) - - mapClass: 'pf-map', // class for all maps mapGridClass: 'pf-grid-small', // class for map grid snapping mapCompactClass: 'pf-compact', // class for map compact system UI @@ -83,44 +75,47 @@ define([ /** * get all available map Types - * optional they can be filtered by current access level of a user - * @param {bool} filterByUser + * optional they can be filtered by current access level of current character + * @param {bool} filterByCharacter + * @param {string} filterRight * @returns {Array} */ - let getMapTypes = (filterByUser) => { + let getMapTypes = (filterByCharacter, filterRight) => { let mapTypes = Object.assign({}, Init.mapTypes); - if(filterByUser === true){ + if(filterByCharacter === true){ let authorizedMapTypes = []; - let checkMapTypes = ['private', 'corporation', 'alliance']; + let checkMapTypes = [ + {type: 'private', hasRight: false, selector: 'id'}, + {type: 'corporation', hasRight: true, selector: 'corporation.id'}, + {type: 'alliance', hasRight: false, selector: 'alliance.id'} + ]; - for(let i = 0; i < checkMapTypes.length; i++){ - let objectId = Util.getCurrentUserInfo(checkMapTypes[i] + 'Id'); - if(objectId > 0){ - // check if User could add new map with a mapType - let currentObjectMapData = Util.filterCurrentMapData('config.type.id', Util.getObjVal(mapTypes, checkMapTypes[i] + '.id')); - let maxCountObject = Util.getObjVal(mapTypes, checkMapTypes[i] + '.defaultConfig.max_count'); + checkMapTypes.forEach(data => { + // check if current character is e.g. in alliance + if(Util.getCurrentCharacterData(data.selector)){ + // check if User could add new map with a mapType -> check map limit + let currentObjectMapData = Util.filterCurrentMapData('config.type.id', Util.getObjVal(mapTypes, data.selector)); + let maxCountObject = Util.getObjVal(mapTypes, `${data.type}.defaultConfig.max_count`); if(currentObjectMapData.length < maxCountObject){ - authorizedMapTypes.push(checkMapTypes[i]); + // check if character has the "right" for creating a map with this type + if((data.hasRight && filterRight) ? Util.hasRight(filterRight, data.type) : true){ + authorizedMapTypes.push(data.type); + } } } - } + }); - for(let mapType in mapTypes){ - if(authorizedMapTypes.indexOf(mapType) < 0){ - delete( mapTypes[mapType] ); - } - } + mapTypes = Util.filterObjByKeys(mapTypes, authorizedMapTypes); } - // convert to array - let mapTypesFlat = []; - for(let mapType in mapTypes){ - mapTypes[mapType].name = mapType; - mapTypesFlat.push(mapTypes[mapType]); - } + // add "name" to mapType data + Object.entries(mapTypes).forEach(([mapType, data]) => { + data.name = mapType; + }); - return mapTypesFlat; + // obj to array + return Object.keys(mapTypes).map(mapType => mapTypes[mapType]); }; /** @@ -194,25 +189,50 @@ define([ * @param mapData * @param value * @param key - * @returns {any} + * @returns {{}|boolean} */ let getSystemDataFromMapData = (mapData, value, key = 'id') => { - return mapData ? mapData.data.systems.find(system => system[key] === value) || false : false; + return (Util.getObjVal(mapData, `data.systems`) || []) + .find(systemData => systemData[key] === value) || false; }; /** - * get system data by mapId system data selector + * get system data by mapId + system data selector * -> e.g. value = 2 and key = 'id' * -> e.g. value = 30002187 and key = 'systemId' => looks for 'Amarr' CCP systemId * @param mapId * @param value * @param key - * @returns {any} + * @returns {{}|boolean} */ let getSystemData = (mapId, value, key = 'id') => { return getSystemDataFromMapData(Util.getCurrentMapData(mapId), value, key); }; + /** + * get connection data from mapData + * @see getConnectionData + * @param mapData + * @param value + * @param key + * @returns {{}|boolean} + */ + let getConnectionDataFromMapData = (mapData, value, key = 'id') => { + return (Util.getObjVal(mapData, `data.connections`) || []) + .find(connectionData => connectionData[key] === value) || false; + }; + + /** + * get connection data by mapId + connection data selector + * @param mapId + * @param value + * @param key + * @returns {{}|boolean} + */ + let getConnectionData = (mapId, value, key = 'id') => { + return getConnectionDataFromMapData(Util.getCurrentMapData(mapId), value, key); + }; + /** * get system type information * @param {number} systemTypeId @@ -220,14 +240,7 @@ define([ * @returns {string} */ let getSystemTypeInfo = (systemTypeId, option) => { - let systemTypeInfo = ''; - $.each(Init.systemType, function(prop, data){ - if(systemTypeId === data.id){ - systemTypeInfo = data[option]; - return; - } - }); - return systemTypeInfo; + return (Object.values(Init.systemType).find(data => data.id === systemTypeId) || {})[option] || ''; }; /** @@ -237,11 +250,7 @@ define([ * @returns {string} */ let getEffectInfoForSystem = (effect, option) => { - let effectInfo = ''; - if( Init.classes.systemEffects.hasOwnProperty(effect) ){ - effectInfo = Init.classes.systemEffects[effect][option]; - } - return effectInfo; + return Util.getObjVal(Init.classes.systemEffects, `${effect}.${option}`) || ''; }; /** @@ -438,7 +447,7 @@ define([ } if(connectionIds.length > 0){ - Util.request('DELETE', 'connection', connectionIds, { + Util.request('DELETE', 'Connection', connectionIds, { mapId: mapContainer.data('id') }, { connections: connections @@ -486,13 +495,16 @@ define([ let getConnectionDataFromSignatures = (connection, connectionData) => { let signatureTypeData = { source: { + ids: [], names: [], labels: [] }, target: { + ids: [], names: [], labels: [] - } + }, + hash: false // unique hash key build from all relevant signature for connection }; if( @@ -500,7 +512,7 @@ define([ connectionData && connectionData.signatures // signature data is required... ){ - let SystemSignatures = require('module/system_signature'); + let SystemSignatureModule = require('module/system_signature'); let sourceEndpoint = connection.endpoints[0]; let targetEndpoint = connection.endpoints[1]; @@ -509,41 +521,50 @@ define([ let sourceId = sourceSystem.data('id'); let targetId = targetSystem.data('id'); + // in case connection is currently "dragged" between systems, sourceId and/or targetId is undefined + if(!sourceId || !targetId){ + return signatureTypeData; + } + + let hash = []; // ... collect overlay/label data from signatures for(let signatureData of connectionData.signatures){ - // ... typeId is required to get a valid name - if(signatureData.typeId > 0){ + hash.push(Util.getObjVal(signatureData, 'updated.updated')); - // whether "source" or "target" system is relevant for current connection and current signature... - let tmpSystem = null; - let tmpSystemType = null; + // whether "source" or "target" system is relevant for current connection and current signature... + let tmpSystem = null; + let tmpSystemType = null; - if(signatureData.system.id === sourceId){ - // relates to "source" endpoint - tmpSystemType = 'source'; - tmpSystem = sourceSystem; - }else if(signatureData.system.id === targetId){ - // relates to "target" endpoint - tmpSystemType = 'target'; - tmpSystem = targetSystem; - } + if(signatureData.system.id === sourceId){ + // relates to "source" endpoint + tmpSystemType = 'source'; + tmpSystem = sourceSystem; + }else if(signatureData.system.id === targetId){ + // relates to "target" endpoint + tmpSystemType = 'target'; + tmpSystem = targetSystem; + } - // ... get endpoint label for source || target system - if(tmpSystem && tmpSystem){ - // ... get all available signature type (wormholes) names - let availableSigTypeNames = SystemSignatures.getSignatureTypeOptionsBySystem(tmpSystem, 5); - let flattenSigTypeNames = Util.flattenXEditableSelectArray(availableSigTypeNames); + signatureTypeData[tmpSystemType].ids.push(signatureData.id); + signatureTypeData[tmpSystemType].names.push(signatureData.name.toUpperCase()); - if(flattenSigTypeNames.hasOwnProperty(signatureData.typeId)){ - let label = flattenSigTypeNames[signatureData.typeId]; - // shorten label, just take the ingame name - label = label.substr(0, label.indexOf(' ')); - signatureTypeData[tmpSystemType].names.push(signatureData.name); - signatureTypeData[tmpSystemType].labels.push(label); - } + // ... typeId is required to get a valid labels + // ... get endpoint label for source || target system + if(signatureData.typeId > 0 && tmpSystem && tmpSystem){ + // ... get all available signature type (wormholes) names + let availableSigTypeNames = SystemSignatureModule.getSignatureTypeOptionsBySystem(tmpSystem, 5); + let flattenSigTypeNames = Util.flattenXEditableSelectArray(availableSigTypeNames); + + if(flattenSigTypeNames.hasOwnProperty(signatureData.typeId)){ + let label = flattenSigTypeNames[signatureData.typeId]; + // shorten label, just take the ingame name + label = label.substr(0, label.indexOf(' ')); + signatureTypeData[tmpSystemType].labels.push(label); } } } + // ... build unique hash + signatureTypeData.hash = hash.join().hashCode(); } return signatureTypeData; @@ -609,7 +630,7 @@ define([ * @param element * @returns {*} */ - let getTabContentElementByMapElement = element => $(element).closest('.' + config.mapTabContentClass); + let getTabContentElementByMapElement = element => $(element).closest('.' + Util.config.mapTabContentClass); /** * checks if there is an "active" connection on a map @@ -629,64 +650,66 @@ define([ */ let filterMapByScopes = (map, scopes) => { if(map){ - map.batch(() => { - let mapElement = $(map.getContainer()); - let allSystems = mapElement.getSystems(); - let allConnections = map.getAllConnections(); + map.setSuspendDrawing(true); - if(scopes && scopes.length){ - // filter connections ------------------------------------------------------------------------------------- - let visibleSystems = []; - let visibleConnections = searchConnectionsByScopeAndType(map, scopes); + let mapElement = $(map.getContainer()); + let allSystems = mapElement.getSystems(); + let allConnections = map.getAllConnections(); - for(let connection of allConnections){ - if(visibleConnections.indexOf(connection) >= 0){ - setConnectionVisible(connection, true); - // source/target system should always be visible -> even if filter scope not matches system type - if(visibleSystems.indexOf(connection.endpoints[0].element) < 0){ - visibleSystems.push(connection.endpoints[0].element); - } - if(visibleSystems.indexOf(connection.endpoints[1].element) < 0){ - visibleSystems.push(connection.endpoints[1].element); - } - }else{ - setConnectionVisible(connection, false); - } - } + if(scopes && scopes.length){ + // filter connections ------------------------------------------------------------------------------------- + let visibleSystems = []; + let visibleConnections = searchConnectionsByScopeAndType(map, scopes); - // filter systems ----------------------------------------------------------------------------------------- - let visibleTypeIds = []; - if(scopes.indexOf('wh') >= 0){ - visibleTypeIds.push(1); - } - if(scopes.indexOf('abyssal') >= 0){ - visibleTypeIds.push(4); - } - - for(let system of allSystems){ - if( - visibleTypeIds.indexOf($(system).data('typeId')) >= 0 || - visibleSystems.indexOf(system) >= 0 - ){ - setSystemVisible(system, map, true); - }else{ - setSystemVisible(system, map, false); - } - } - - MapOverlayUtil.getMapOverlay(mapElement, 'info').updateOverlayIcon('filter', 'show'); - }else{ - // clear filter - for(let system of allSystems){ - setSystemVisible(system, map, true); - } - for(let connection of allConnections){ + for(let connection of allConnections){ + if(visibleConnections.indexOf(connection) >= 0){ setConnectionVisible(connection, true); + // source/target system should always be visible -> even if filter scope not matches system type + if(visibleSystems.indexOf(connection.endpoints[0].element) < 0){ + visibleSystems.push(connection.endpoints[0].element); + } + if(visibleSystems.indexOf(connection.endpoints[1].element) < 0){ + visibleSystems.push(connection.endpoints[1].element); + } + }else{ + setConnectionVisible(connection, false); } - - MapOverlayUtil.getMapOverlay(mapElement, 'info').updateOverlayIcon('filter', 'hide'); } - }); + + // filter systems ----------------------------------------------------------------------------------------- + let visibleTypeIds = []; + if(scopes.indexOf('wh') >= 0){ + visibleTypeIds.push(1); + } + if(scopes.indexOf('abyssal') >= 0){ + visibleTypeIds.push(4); + } + + for(let system of allSystems){ + if( + visibleTypeIds.indexOf($(system).data('typeId')) >= 0 || + visibleSystems.indexOf(system) >= 0 + ){ + setSystemVisible(system, map, true); + }else{ + setSystemVisible(system, map, false); + } + } + + MapOverlayUtil.getMapOverlay(mapElement, 'info').updateOverlayIcon('filter', 'show'); + }else{ + // clear filter + for(let system of allSystems){ + setSystemVisible(system, map, true); + } + for(let connection of allConnections){ + setConnectionVisible(connection, true); + } + + MapOverlayUtil.getMapOverlay(mapElement, 'info').updateOverlayIcon('filter', 'hide'); + } + + map.setSuspendDrawing(false, true); } }; @@ -753,11 +776,11 @@ define([ 'height': scrollableHeight ? scaledHeight + 'px' : (wrapperHeight) + 'px', }); - let mapWrapperElement = mapContainer.closest('.mCustomScrollbar'); + let areaMap = mapContainer.closest('.mCustomScrollbar'); if(scrollableWidth && scrollableHeight){ - mapWrapperElement.mCustomScrollbar('update'); + areaMap.mCustomScrollbar('update'); }else{ - mapWrapperElement.mCustomScrollbar('scrollTo', '#' + mapContainer.attr('id'), { + areaMap.mCustomScrollbar('scrollTo', '#' + mapContainer.attr('id'), { scrollInertia: 0, scrollEasing: 'linear', timeout: 0, @@ -800,17 +823,19 @@ define([ */ let setSystemActive = (map, system) => { // deselect all selected systems on map - let mapContainer = $( map.getContainer() ); - mapContainer.find('.' + config.systemClass).removeClass(config.systemActiveClass); + let mapContainer = map.getContainer(); + [...mapContainer.getElementsByClassName(config.systemClass)] + .forEach(systemEl => + systemEl.classList.remove(config.systemActiveClass) + ); // set current system active system.addClass(config.systemActiveClass); - // collect all required data from map module to update the info element - // store them global and assessable for each module + // collect all required systemData from map module -> cache let systemData = system.getSystemData(); systemData.mapId = parseInt(system.attr('data-mapid')) || 0; - Util.setCurrentSystemData(systemData); + Util.setCurrentSystemData(systemData.mapId, systemData); }; /** @@ -921,20 +946,22 @@ define([ * @param connections */ let setConnectionsActive = (map, connections) => { - map.batch(() => { - // set all inactive - for(let connection of getConnectionsByType(map, 'state_active')){ - if(!connections.includes(connection)){ - removeConnectionType(connection, 'state_active'); - } - } + map.setSuspendDrawing(true); - for(let connection of connections){ - if(!connection.hasType('state_active')){ - addConnectionType(connection, 'state_active'); - } + // set all inactive + for(let connection of getConnectionsByType(map, 'state_active')){ + if(!connections.includes(connection)){ + removeConnectionType(connection, 'state_active'); } - }); + } + + for(let connection of connections){ + if(!connection.hasType('state_active')){ + addConnectionType(connection, 'state_active'); + } + } + + map.setSuspendDrawing(false, true); }; /** @@ -977,21 +1004,38 @@ define([ let toggleConnectionActive = (map, connections) => { let selectedConnections = []; let deselectedConnections = []; - map.batch(() => { - for(let connection of connections){ - if(connection.hasType('state_active')){ - removeConnectionType(connection, 'state_active'); - deselectedConnections.push(connection); - }else{ - addConnectionType(connection, 'state_active'); - selectedConnections.push(connection); - } + + map.setSuspendDrawing(true); + + for(let connection of connections){ + if(connection.hasType('state_active')){ + removeConnectionType(connection, 'state_active'); + deselectedConnections.push(connection); + }else{ + addConnectionType(connection, 'state_active'); + selectedConnections.push(connection); } - }); + } + + map.setSuspendDrawing(false, true); updateConnectionInfo(map, selectedConnections, deselectedConnections); }; + /** + * show global map info panels + * @param map + */ + let showMapInfo = map => { + // get parent Tab Content and fire update event + let mapContainer = $(map.getContainer()); + + getTabContentElementByMapElement(mapContainer).trigger('pf:renderGlobalModules', { + mapId: parseInt(mapContainer.data('id')), + payload: null + }); + }; + /** * show system info panels * @param map @@ -1001,7 +1045,13 @@ define([ setSystemActive(map, system); // get parent Tab Content and fire update event - getTabContentElementByMapElement(system).trigger('pf:drawSystemModules'); + let mapContainer = $(map.getContainer()); + let mapId = parseInt(mapContainer.data('id')) || 0; + + getTabContentElementByMapElement(mapContainer).trigger('pf:renderSystemModules', { + mapId: mapId, + payload: Util.getCurrentSystemData(mapId) + }); }; /** @@ -1015,9 +1065,9 @@ define([ // get parent Tab Content and fire update event let mapContainer = $(map.getContainer()); - getTabContentElementByMapElement(mapContainer).trigger('pf:drawConnectionModules', { - connections: connections, - mapId: parseInt(mapContainer.data('id')) + getTabContentElementByMapElement(mapContainer).trigger('pf:renderConnectionModules', { + mapId: parseInt(mapContainer.data('id')), + payload: connections }); }; @@ -1046,9 +1096,11 @@ define([ let showFindRouteDialog = (mapContainer, systemToData) => { // get parent Tab Content and fire update event getTabContentElementByMapElement(mapContainer).trigger('pf:updateRouteModules', { - task: 'showFindRouteDialog', - systemToData: systemToData, - mapId: parseInt(mapContainer.data('id')) + mapId: parseInt(mapContainer.data('id')), + payload: { + task: 'showFindRouteDialog', + systemToData: systemToData + } }); }; @@ -1059,9 +1111,11 @@ define([ */ let findRoute = (mapContainer, systemToData) => { getTabContentElementByMapElement(mapContainer).trigger('pf:updateRouteModules', { - task: 'findRoute', - systemToData: systemToData, - mapId: parseInt(mapContainer.data('id')) + mapId: parseInt(mapContainer.data('id')), + payload: { + task: 'findRoute', + systemToData: systemToData + } }); }; @@ -1237,10 +1291,12 @@ define([ let setUniqueConnectionType = (connection, type, types) => { type = types.includes(type) ? [type] : []; - connection._jsPlumb.instance.batch(() => { - removeConnectionTypes(connection, types.diff(type)); - addConnectionTypes(connection, type); - }); + connection._jsPlumb.instance.setSuspendDrawing(true); + + removeConnectionTypes(connection, types.diff(type)); + addConnectionTypes(connection, type); + + connection._jsPlumb.instance.setSuspendDrawing(false, true); }; /** @@ -1267,84 +1323,6 @@ define([ return scopeInfo; }; - /** - * store local data for current user (IndexDB) - * @param key - * @param value - */ - let storeLocaleCharacterData = (key, value) => { - if(key.length && value){ - let userData = Util.getCurrentUserData(); - if( - userData && - userData.character - ){ - storeLocalData('character', userData.character.id, key, value); - } - } - }; - - /** - * get key prefix for local storage data - * @param type - * @returns {boolean} - */ - let getLocalStoragePrefixByType = (type) => { - let prefix = false; - switch(type){ - case 'character': prefix = config.characterLocalStoragePrefix; break; - case 'map': prefix = config.mapLocalStoragePrefix; break; - default: prefix = config.mapLocalStoragePrefix; - } - return prefix; - }; - - /** - * get stored local data from client cache (IndexedDB) - * @param type - * @param objectId - * @returns {*} - */ - let getLocaleData = (type, objectId) => { - if(objectId > 0){ - let storageKey = getLocalStoragePrefixByType(type) + objectId; - return Util.getLocalStorage().getItem(storageKey); - }else{ - console.warn('Local storage requires object id > 0'); - } - }; - - /** - * store local config data to client cache (IndexedDB) - * @param type - * @param objectId - * @param key - * @param value - */ - let storeLocalData = (type, objectId, key, value) => { - if(objectId > 0){ - // get current map config - let storageKey = getLocalStoragePrefixByType(type) + objectId; - Util.getLocalStorage().getItem(storageKey).then(function(data){ - // This code runs once the value has been loaded - // from the offline store. - data = (data === null) ? {} : data; - // set/update value - data[this.key] = this.value; - Util.getLocalStorage().setItem(this.storageKey, data); - }.bind({ - key: key, - value: value, - storageKey: storageKey - })).catch(function(err){ - // This code runs if there were any errors - console.error('Map local storage can not be accessed!'); - }); - }else{ - console.warn('storeLocalData(): Local storage requires object id > 0'); - } - }; - /** * show map animations when a new map gets visual * @param mapElement @@ -1461,7 +1439,8 @@ define([ let setMapDefaultOptionsExecutor = (resolve, reject) => { // update main menu options based on the active map ----------------------------------------------- $(document).trigger('pf:updateMenuOptions', { - mapConfig: mapConfig + menuGroup: 'mapOptions', + payload: mapConfig }); // init compact system layout --------------------------------------------------------------------- @@ -1531,11 +1510,10 @@ define([ // -> implementation would be difficult... if(map.getZoom() === 1){ let mapElement = $(map.getContainer()); - let promiseStore = getLocaleData('map', mapElement.data('id')); - promiseStore.then(data => { + Util.getLocalStore('map').getItem(mapElement.data('id')).then(data => { if(data && data.scrollOffset){ - let mapWrapper = mapElement.parents('.' + config.mapWrapperClass); - Scrollbar.scrollToPosition(mapWrapper, [data.scrollOffset.y, data.scrollOffset.x]); + let areaMap = mapElement.closest('.' + Util.getMapTabContentAreaClass('map')); + Scrollbar.scrollToPosition(areaMap, [data.scrollOffset.y, data.scrollOffset.x]); } resolve(payload); @@ -1557,8 +1535,7 @@ define([ let zoomToDefaultScaleExecutor = resolve => { let mapElement = $(map.getContainer()); - let promiseStore = getLocaleData('map', mapElement.data('id')); - promiseStore.then(data => { + Util.getLocalStore('map').getItem(mapElement.data('id')).then(data => { if(data && data.mapZoom){ setZoom(map, data.mapZoom); } @@ -1573,32 +1550,6 @@ define([ return new Promise(zoomToDefaultScaleExecutor); }; - /** - * delete local map configuration by key (IndexedDB) - * @param type - * @param objectId - * @param key - */ - let deleteLocalData = (type, objectId, key) => { - if(objectId > 0){ - // get current map config - let storageKey = getLocalStoragePrefixByType(type) + objectId; - Util.getLocalStorage().getItem(storageKey).then(function(data){ - if( - data && - data.hasOwnProperty(key) - ){ - delete data[key]; - Util.getLocalStorage().setItem(this.storageKey, data); - } - }.bind({ - storageKey: storageKey - })); - }else{ - console.warn('deleteLocalData(): Local storage requires object id > 0'); - } - }; - /** * set or change rallyPoint for systems * @param rallyUpdated @@ -1650,8 +1601,7 @@ define([ // check if desktop notification was already send let mapId = system.data('mapid'); let systemId = system.data('id'); - let promiseStore = getLocaleData('map', mapId); - promiseStore.then(function(data){ + Util.getLocalStore('map').getItem(mapId).then(function(data){ // This code runs once the value has been loaded // from the offline store. let rallyPokeData = {}; @@ -1669,7 +1619,7 @@ define([ rallyPokeData[this.systemId] !== rallyUpdated // already send to that system but in the past ){ rallyPokeData[this.systemId] = rallyUpdated; - storeLocalData('map', this.mapId, 'rallyPoke', rallyPokeData); + Util.getLocalStore('map').setItem(`${this.mapId}.rallyPoke`, rallyPokeData); notificationOptions.type = 'info'; Util.showNotify(notificationOptions, { @@ -1686,7 +1636,7 @@ define([ } // update active "route" module -> add rally point row -------------------------------------------- - let mapContainer = system.parents('.' + config.mapClass); + let mapContainer = system.parents('.' + Util.config.mapClass); findRoute(mapContainer, { systemId: system.data('systemId'), name: system.data('name'), @@ -1711,28 +1661,27 @@ define([ * set map "shortcut" events */ $.fn.setMapShortcuts = function(){ - return this.each((i, mapWrapper) => { - mapWrapper = $(mapWrapper); - let mapElement = mapWrapper.find('.' + config.mapClass); + return this.each((i, areaMap) => { + areaMap = $(areaMap); + let mapElement = areaMap.find('.' + Util.config.mapClass); // dynamic require Map module -> otherwise there is a require(), loop let Map = require('app/map/map'); let System = require('app/map/system'); - let map = Map.getMapInstance( mapElement.data('id')); + let map = Map.getMapInstance(mapElement.data('id')); - mapWrapper.watchKey('mapSystemAdd', (mapWrapper) => { + areaMap.watchKey('mapSystemAdd', areaMap => { System.showNewSystemDialog(map, {position: {x: 0, y: 0}}, Map.saveSystemCallback); },{focus: true}); - mapWrapper.watchKey('mapSystemsSelect', (mapWrapper) => { + areaMap.watchKey('mapSystemsSelect', areaMap => { mapElement.selectAllSystems(); },{focus: true}); - mapWrapper.watchKey('mapSystemsDelete', (mapWrapper) => { + areaMap.watchKey('mapSystemsDelete', areaMap => { let selectedSystems = mapElement.getSelectedSystems(); $.fn.showDeleteSystemDialog(map, selectedSystems); },{focus: true}); - }); }; @@ -1810,7 +1759,7 @@ define([ for(let i = 0; i < services.length; i++){ let icon = getServiceIcon(services[i]); if(icon){ - content += '' + services[i] + ''; + content += `${services[i]}`; } } return content; @@ -2059,60 +2008,26 @@ define([ */ let checkRight = (right, mapConfig) => { let hasAccess = false; - let currentUserData = Util.getCurrentUserData(); - if(currentUserData){ - // ...there is an active user - let currentCharacterData = Util.getObjVal(currentUserData, 'character'); - if(currentCharacterData){ - // ... there is an active character - let currentCharacterRole = Util.getObjVal(currentCharacterData, 'role'); - if(currentCharacterRole){ - // ... active character has a role assigned + let mapType = Util.getObjVal(mapConfig, 'type.name'); + let accessObjectId = Util.getCurrentUserInfo(mapType + 'Id'); - let mapType = Util.getObjVal(mapConfig, 'type.name'); - let mapAccess = Util.getObjVal(mapConfig, 'access.' + (mapType === 'private' ? 'character' : mapType)) || []; - - // this is either Ally/Corp or Character Id - let accessObjectId = Util.getCurrentUserInfo(mapType + 'Id'); - - // check whether character has map access - let hasMapAccess = mapAccess.some((accessObj) => { - return (accessObj.id === accessObjectId); - }); - - if(hasMapAccess){ - // ... this should ALWAYS be be true! - switch(mapType){ - case 'private': - hasAccess = true; - break; - case 'corporation': - let objectRights = Util.getObjVal(currentCharacterData, mapType + '.rights') || []; - - let objectRight = objectRights.find((objectRight) => { - return objectRight.right.name === right; - }); - - if(objectRight){ - // ... Ally/Corp has the right we are looking for assigned with a required role - if( - currentCharacterRole.name === 'SUPER' || - objectRight.role.name === 'MEMBER' || - objectRight.role.name === currentCharacterRole.name - ){ - hasAccess = true; - } - } - break; - case 'alliance': - hasAccess = true; - break; - } - } - } + // check whether character has map access + let mapAccess = Util.getObjVal(mapConfig, 'access.' + (mapType === 'private' ? 'character' : mapType)) || []; + let hasMapAccess = mapAccess.some(accessObj => accessObj.id === accessObjectId); + if(hasMapAccess){ + // ... this should ALWAYS be be true! + switch(mapType){ + case 'private': + hasAccess = true; + break; + case 'corporation': + hasAccess = Util.hasRight(right, mapType); + break; + case 'alliance': + hasAccess = true; + break; } } - return hasAccess; }; @@ -2181,6 +2096,40 @@ define([ return findNonOverlappingDimensions(options, maxResults, findChain); }; + /** + * calculate the x/y coordinates for a new system - relative to current map scroll offset + * @param mapContainer + * @param maxResults + * @returns {[{x: number, y: number}]} + */ + let newSystemPositionsByMapOffset = (mapContainer, maxResults = 1) => { + let scrollPosition = { + x: Math.abs(parseInt(mapContainer.attr('data-scroll-left')) || 0), + y: Math.abs(parseInt(mapContainer.attr('data-scroll-top')) || 0) + }; + + // space new positions from map top (e.g. used for tooltips) + scrollPosition.y = Math.max(scrollPosition.y, 30); + + // default position -> current map section top/left + let positions = [scrollPosition]; + + // check default position for overlapping + let dimensions = newSystemPositionByCoordinates(mapContainer, { + center: [scrollPosition.x, scrollPosition.y], + minX: scrollPosition.x, + minY: scrollPosition.y + }, maxResults, true); + + if(dimensions.length){ + positions = dimensions.map(dim => ({ + x: parseInt(dim.left) || 0, + y: parseInt(dim.top) || 0 + })); + } + return positions; + }; + /** * * @param mapContainer @@ -2190,30 +2139,8 @@ define([ if(mapContainer){ let mapId = mapContainer.data('id'); - let scrollPosition = { - x: Math.abs(parseInt(mapContainer.attr('data-scroll-left')) || 0), - y: Math.abs(parseInt(mapContainer.attr('data-scroll-top')) || 0) - }; - // space new positions from map top (e.g. used for tooltips) - scrollPosition.y = Math.max(scrollPosition.y, 30); - - // default position -> current map section top/left ------------------------------------------------------- - positions.defaults = [scrollPosition]; - - // check default position for overlapping ----------------------------------------------------------------- - let dimensions = newSystemPositionByCoordinates(mapContainer, { - center: [scrollPosition.x, scrollPosition.y], - minX: scrollPosition.x, - minY: scrollPosition.y - }, 2, true); - - if(dimensions.length){ - positions.defaults = dimensions.map(dim => ({ - x: parseInt(dim.left) || 0, - y: parseInt(dim.top) || 0 - })); - } + positions.defaults = newSystemPositionsByMapOffset(mapContainer, 2); // -> calc possible coordinates for new system that should be used based on current user location --------- let currentLocationData = Util.getCurrentLocationData(); @@ -2269,6 +2196,8 @@ define([ getInfoForSystem: getInfoForSystem, getSystemDataFromMapData: getSystemDataFromMapData, getSystemData: getSystemData, + getConnectionDataFromMapData: getConnectionDataFromMapData, + getConnectionData: getConnectionData, getSystemTypeInfo: getSystemTypeInfo, getEffectInfoForSystem: getEffectInfoForSystem, markAsChanged: markAsChanged, @@ -2279,6 +2208,7 @@ define([ toggleConnectionType: toggleConnectionType, toggleConnectionActive: toggleConnectionActive, setSystemActive: setSystemActive, + showMapInfo: showMapInfo, showSystemInfo: showSystemInfo, showConnectionInfo: showConnectionInfo, showFindRouteDialog: showFindRouteDialog, @@ -2287,6 +2217,7 @@ define([ getConnectionsByType: getConnectionsByType, getEndpointsDataByConnection: getEndpointsDataByConnection, getDataByConnection: getDataByConnection, + getDataByConnections: getDataByConnections, searchConnectionsBySystems: searchConnectionsBySystems, searchConnectionsByScopeAndType: searchConnectionsByScopeAndType, getConnectionInfo: getConnectionInfo, @@ -2298,7 +2229,6 @@ define([ setConnectionMassStatusType: setConnectionMassStatusType, setConnectionJumpMassType: setConnectionJumpMassType, getScopeInfoForConnection: getScopeInfoForConnection, - getDataByConnections: getDataByConnections, deleteConnections: deleteConnections, getConnectionDataFromSignatures: getConnectionDataFromSignatures, getEndpointOverlaySignatureLocation: getEndpointOverlaySignatureLocation, @@ -2309,10 +2239,6 @@ define([ changeZoom: changeZoom, setZoom: setZoom, toggleSystemAliasEditable: toggleSystemAliasEditable, - storeLocaleCharacterData: storeLocaleCharacterData, - getLocaleData: getLocaleData, - storeLocalData: storeLocalData, - deleteLocalData: deleteLocalData, visualizeMap: visualizeMap, setMapDefaultOptions: setMapDefaultOptions, getSystemPosition: getSystemPosition, @@ -2323,6 +2249,7 @@ define([ checkRight: checkRight, newSystemPositionBySystem: newSystemPositionBySystem, newSystemPositionByCoordinates: newSystemPositionByCoordinates, + newSystemPositionsByMapOffset: newSystemPositionsByMapOffset, newSystemPositionsByMap: newSystemPositionsByMap, getMapDeeplinkUrl: getMapDeeplinkUrl }; diff --git a/js/app/mappage.js b/js/app/mappage.js index e129b841..1ecc4702 100644 --- a/js/app/mappage.js +++ b/js/app/mappage.js @@ -8,608 +8,633 @@ define([ 'app/util', 'app/logging', 'app/page', + 'app/counter', 'app/map/worker', 'app/map/util', 'app/module_map', 'app/key', 'app/ui/form_element' -], ($, Init, Util, Logging, Page, MapWorker, MapUtil, ModuleMap) => { - +], ($, Init, Util, Logging, Page, Counter, MapWorker, MapUtil, ModuleMap) => { 'use strict'; + // main update intervals/trigger (heartbeat) + let updateTimeouts = { + mapUpdate: 0, + userUpdate: 0 + }; + + // log keys ----------------------------------------------------------------------------------------------- + let logKeyServerMapData = Init.performanceLogging.keyServerMapData; + let logKeyServerUserData = Init.performanceLogging.keyServerUserData; + + let initApp = rootEl => new Promise(resolve => { + Page.renderPage(rootEl) + .then(pageEls => { + // passive event listener + Util.initPassiveEvents(); + + // clear sessionStorage + //Util.clearSessionStorage(); + + // set default tooltip config + Util.initDefaultTooltipConfig(pageEls.pageEl); + + // set default popover config + Util.initDefaultPopoverConfig(pageEls.pageEl); + + // set default confirmation popover config + Util.initDefaultConfirmationConfig(); + + // set default xEditable config + Util.initDefaultEditableConfig(pageEls.pageEl); + + // set default select2 config + Util.initDefaultSelect2Config(); + + // set default dialog config + Util.initDefaultBootboxConfig(); + + // show app information in browser console + Util.showVersionInfo(); + + // init logging + Logging.init(); + + return Promise.resolve(pageEls); + }) + .then(Page.loadPageStructure) + .then(() => resolve(document.getElementById(Util.config.mapModuleId))); + }); + /** - * main init "map" page + * get static init data and store response + * @returns {Promise} */ - $(() => { - Util.initPrototypes(); - - // clear sessionStorage - //Util.clearSessionStorage(); - - // set default AJAX config - Util.ajaxSetup(); - - // set default dialog config - Util.initDefaultBootboxConfig(); - - // set default confirmation popover config - Util.initDefaultConfirmationConfig(); - - // set default select2 config - Util.initDefaultSelect2Config(); - - // set default xEditable config - Util.initDefaultEditableConfig(); - - // load page - Page.loadPageStructure(); - - // show app information in browser console - Util.showVersionInfo(); - - // init logging - Logging.init(); - - let mapModule = $('#' + Util.config.mapModuleId); - - // main update intervals/trigger (heartbeat) - let updateTimeouts = { - mapUpdate: 0, - userUpdate: 0 - }; + let initData = () => { /** - * clear both main update timeouts - * -> stop program from working -> shutdown + * add wormhole size data for each wormhole + * @param wormholes + * @returns {*} */ - let clearUpdateTimeouts = () => { - for(let intervalKey in updateTimeouts){ - if(updateTimeouts.hasOwnProperty(intervalKey)){ - clearTimeout(updateTimeouts[intervalKey]); - } - } - }; - - /** - * Ajax error response handler function for main-ping functions - * @param jqXHR - * @param status - * @param error - */ - let handleAjaxErrorResponse = (jqXHR, status, error) => { - // clear both main update request trigger timer - clearUpdateTimeouts(); - - let reason = status + ' ' + jqXHR.status + ': ' + error; - let errorData = []; - let redirect = false; // redirect user to other page e.g. login - let reload = true; // reload current page (default: true) - - if(jqXHR.responseJSON){ - // handle JSON - let responseObj = jqXHR.responseJSON; - if( - responseObj.error && - responseObj.error.length > 0 - ){ - errorData = responseObj.error; - } - - if(responseObj.reroute){ - redirect = responseObj.reroute; - } - }else{ - // handle HTML - errorData.push({ - type: 'error', - message: 'Please restart and reload this page' - }); - } - - console.error(' ↪ %s Error response: %o', jqXHR.url, errorData); - $(document).trigger('pf:shutdown', { - status: jqXHR.status, - reason: reason, - error: errorData, - redirect: redirect, - reload: reload - }); - }; - - // map init functions ========================================================================================= - - /** - * get static init data and store response - * @returns {Promise} - */ - let initData = () => { - - /** - * add wormhole size data for each wormhole - * @param wormholes - * @returns {*} - */ - let addWormholeSizeData = wormholes => { - for(let [wormholeName, wormholeData] of Object.entries(wormholes)){ - wormholeData.class = Util.getSecurityClassForSystem(wormholeData.security); - - for(let [sizeName, sizeData] of Object.entries(Init.wormholeSizes)){ - if(wormholeData.massIndividual >= sizeData.jumpMassMin){ - wormholeData.size = sizeData; - break; - } + let addWormholeSizeData = wormholes => { + for(let wormholeData of Object.values(wormholes)){ + wormholeData.class = Util.getSecurityClassForSystem(wormholeData.security); + for(let sizeData of Object.values(Init.wormholeSizes)){ + if(wormholeData.massIndividual >= sizeData.jumpMassMin){ + wormholeData.size = sizeData; + break; } } - return wormholes; - }; - - let initDataExecutor = (resolve, reject) => { - $.getJSON(Init.path.initData).done(response => { - if( response.error.length > 0 ){ - for(let i = 0; i < response.error.length; i++){ - Util.showNotify({ - title: response.error[i].title, - text: response.error[i].message, - type: response.error[i].type - }); - } - } - - Init.timer = response.timer; - Init.mapTypes = response.mapTypes; - Init.mapScopes = response.mapScopes; - Init.connectionScopes = response.connectionScopes; - Init.systemStatus = response.systemStatus; - Init.systemType = response.systemType; - Init.wormholes = addWormholeSizeData(response.wormholes); - Init.characterStatus = response.characterStatus; - Init.routes = response.routes; - Init.url = response.url; - Init.character = response.character; - Init.slack = response.slack; - Init.discord = response.discord; - Init.structureStatus = response.structureStatus; - Init.universeCategories = response.universeCategories; - Init.routeSearch = response.routeSearch; - - resolve({ - action: 'initData', - data: false - }); - }).fail((jqXHR, status, error) => { - reject({ - action: 'shutdown', - data: { - jqXHR: jqXHR, - status: status, - error: error - } - }); - }); - }; - - return new Promise(initDataExecutor); + } + return wormholes; }; - /** - * get mapAccess Data for WebSocket subscription - * @returns {Promise} - */ - let getMapAccessData = () => { - - let getMapAccessDataExecutor = (resolve, reject) => { - $.getJSON(Init.path.getAccessData).done(response => { - resolve({ - action: 'mapAccessData', - data: response - }); - }).fail((jqXHR, status, error) => { - reject({ - action: 'shutdown', - data: { - jqXHR: jqXHR, - status: status, - error: error - } - }); - }); - }; - - return new Promise(getMapAccessDataExecutor); - }; - - /** - * init main mapModule - * -> initData() needs to be resolved first! - * @param payload - * @returns {Promise} - */ - let initMapModule = payload => { - - let initMapModuleExecutor = (resolve, reject) => { - // init browser tab change observer, Once the timers are available - Page.initTabChangeObserver(); - - // init hidden context menu elements - Page.renderMapContextMenus(); - - // init map module - mapModule.initMapModule(); - - resolve({ - action: 'initMapModule', - data: false - }); - }; - - return new Promise(initMapModuleExecutor); - }; - - /** - * request all map access data (tokens) -> required wor WebSocket subscription - * -> initData() needs to be resolved first! - * @param payloadMapAccessData - * @returns {Promise} - */ - let initMapWorker = payloadMapAccessData => { - - let initMapWorkerExecutor = (resolve, reject) => { - let getPayload = command => { - return { - action: 'initMapWorker', - data: { - syncStatus: Init.syncStatus.type, - command: command - } - }; - }; - - let validMapAccessData = false; - - if(payloadMapAccessData && payloadMapAccessData.action === 'mapAccessData'){ - let response = payloadMapAccessData.data; - if(response.status === 'OK'){ - validMapAccessData = true; - - // init SharedWorker for maps - MapWorker.init({ - characterId: response.data.id, - callbacks: { - onInit: (MsgWorkerMessage) => { - Util.setSyncStatus(MsgWorkerMessage.command); - - }, - onOpen: (MsgWorkerMessage) => { - Util.setSyncStatus(MsgWorkerMessage.command, MsgWorkerMessage.meta()); - MapWorker.send('subscribe', response.data); - - resolve(getPayload(MsgWorkerMessage.command)); - }, - onGet: (MsgWorkerMessage) => { - switch(MsgWorkerMessage.task()){ - case 'mapUpdate': - Util.updateCurrentMapData(MsgWorkerMessage.data()); - ModuleMap.updateMapModule(mapModule); - break; - case 'mapAccess': - case 'mapDeleted': - Util.deleteCurrentMapData(MsgWorkerMessage.data()); - ModuleMap.updateMapModule(mapModule); - break; - case 'mapSubscriptions': - Util.updateCurrentMapUserData(MsgWorkerMessage.data()); - ModuleMap.updateActiveMapUserData(mapModule); - break; - } - - Util.setSyncStatus('ws:get'); - }, - onClosed: (MsgWorkerMessage) => { - Util.setSyncStatus(MsgWorkerMessage.command, MsgWorkerMessage.meta()); - reject(getPayload(MsgWorkerMessage.command)); - - }, - onError: (MsgWorkerMessage) => { - Util.setSyncStatus(MsgWorkerMessage.command, MsgWorkerMessage.meta()); - reject(getPayload(MsgWorkerMessage.command)); - } - } + let initDataExecutor = (resolve, reject) => { + $.getJSON(Init.path.initData).done(response => { + if(response.error.length > 0){ + for(let i = 0; i < response.error.length; i++){ + Util.showNotify({ + title: response.error[i].title, + text: response.error[i].message, + type: response.error[i].type }); } } - if( !validMapAccessData ){ - reject(getPayload('Invalid mapAccessData')); - } - }; + Init.timer = response.timer; + Init.mapTypes = response.mapTypes; + Init.mapScopes = response.mapScopes; + Init.connectionScopes = response.connectionScopes; + Init.systemStatus = response.systemStatus; + Init.systemType = response.systemType; + Init.wormholes = addWormholeSizeData(response.wormholes); + Init.characterStatus = response.characterStatus; + Init.routes = response.routes; + Init.url = response.url; + Init.plugin = response.plugin; + Init.character = response.character; + Init.slack = response.slack; + Init.discord = response.discord; + Init.structureStatus = response.structureStatus; + Init.universeCategories = response.universeCategories; + Init.routeSearch = response.routeSearch; - return new Promise(initMapWorkerExecutor); + resolve({ + action: 'initData', + data: false + }); + }).fail((jqXHR, status, error) => { + reject({ + action: 'shutdown', + data: { + jqXHR: jqXHR, + status: status, + error: error + } + }); + }); }; - // run all init functions for mainModule and WebSocket configuration async - Promise.all([initData(), getMapAccessData()]) - .then(payload => Promise.all([initMapModule(payload[0]), initMapWorker(payload[1])])) - .then(payload => { - // mapModule initialized and WebSocket configuration working - console.ok('Client syncStatus: %s. %O resolved by command: %s!', - payload[1].data.syncStatus, - payload[1].action + '()', - payload[1].data.command - ); - }) - .catch(payload => { - switch(payload.action){ - case 'shutdown': - // ajax error - handleAjaxErrorResponse(payload.data.jqXHR, payload.data.status, payload.data.error); - break; - case 'initMapWorker': - // WebSocket not working -> no error here -> fallback to Ajax - console.info('Client syncStatus: %s. %O rejected by command: %s! payload: %o', - payload.data.syncStatus, - payload.action + '()', - payload.data.command, - payload.data - ); - break; - default: - console.error('Unhandled error thrown while initialization: %o ', payload); + return new Promise(initDataExecutor); + }; + + /** + * get mapAccess Data for WebSocket subscription + * @returns {Promise} + */ + let getMapAccessData = () => new Promise((resolve, reject) => { + $.getJSON(Init.path.getAccessData).done(accessData => { + resolve(accessData); + }).fail((jqXHR, status, error) => { + reject({ + action: 'shutdown', + data: { + jqXHR: jqXHR, + status: status, + error: error } }); - - /** - * main function for init all map relevant trigger calls - */ - $.fn.initMapModule = function(){ - let mapModule = $(this); - - // log keys ----------------------------------------------------------------------------------------------- - let logKeyServerMapData = Init.performanceLogging.keyServerMapData; - let logKeyServerUserData = Init.performanceLogging.keyServerUserData; - let locationToggle = $('#' + Util.config.headMapTrackingId); - - // ping for main map update =============================================================================== - /** - * @param forceUpdateMapData // force request to be send - */ - let triggerMapUpdatePing = (forceUpdateMapData) => { - - // check each interval if map module is still available - let check = $('#' + mapModule.attr('id')).length; - - if(check === 0){ - // program crash stop any update - return; - } - - // get updated map data - let updatedMapData = { - mapData: ModuleMap.getMapModuleDataForUpdate(mapModule), - getUserData: Util.getCurrentUserData() ? 0 : 1 - }; - - // check if mapUpdate trigger should be send - // -> if "syncType" === "ajax" -> send always - // -> if "syncType" === "webSocket" -> send initial AND on map changes - if( - forceUpdateMapData || - Util.getSyncType() === 'ajax' || - ( - Util.getSyncType() === 'webSocket' && - updatedMapData.mapData.length - ) - ){ - // start log - Util.timeStart(logKeyServerMapData); - - // store updatedMapData - $.ajax({ - type: 'POST', - url: Init.path.updateMapData, - data: updatedMapData, - dataType: 'json' - }).done((data) => { - // log request time - let duration = Util.timeStop(logKeyServerMapData); - Util.log(logKeyServerMapData, {duration: duration, type: 'server', description: 'request map data'}); - - Util.setSyncStatus('ajax:get'); - - if( - data.error && - data.error.length > 0 - ){ - // any error in the main trigger functions result in a user log-off - Util.triggerMenuAction(document, 'Logout'); - }else{ - $(document).setProgramStatus('online'); - - if(data.userData !== undefined){ - // store current user data global (cache) - Util.setCurrentUserData(data.userData); - } - - // map data found - Util.setCurrentMapData(data.mapData); - - // load/update main map module - ModuleMap.updateMapModule(mapModule).then(() => { - // map update done, init new trigger - - // get the current update delay (this can change if a user is inactive) - let mapUpdateDelay = Util.getCurrentTriggerDelay(logKeyServerMapData, 0); - - // init new trigger - initMapUpdatePing(false); - - // initial start for the userUpdate trigger - // this should only be called at the first time! - if(updateTimeouts.userUpdate === 0){ - // start user update trigger after map loaded - updateTimeouts.userUpdate = setTimeout(() => { - triggerUserUpdatePing(); - }, 500); - } - }); - } - - }).fail(handleAjaxErrorResponse); - }else{ - // skip this mapUpdate trigger and init next one - initMapUpdatePing(false); - } - }; - - // ping for user data update ============================================================================== - let triggerUserUpdatePing = () => { - - // IMPORTANT: Get user data for ONE map that is currently visible - // On later releases this can be easy changed to "full update" all maps for a user - let mapIds = []; - let newSystemPositions = null; - let activeMap = Util.getMapModule().getActiveMap(); - - if(activeMap){ - mapIds = [activeMap.data('id')]; - newSystemPositions = MapUtil.newSystemPositionsByMap(activeMap); - } - - let updatedUserData = { - mapIds: mapIds, - getMapUserData: Util.getSyncType() === 'webSocket' ? 0 : 1, - mapTracking: locationToggle.is(':checked') ? 1 : 0, // location tracking - systemData: Util.getCurrentSystemData() - }; - - if(newSystemPositions){ - updatedUserData.newSystemPositions = newSystemPositions; - } - - Util.timeStart(logKeyServerUserData); - - $.ajax({ - type: 'POST', - url: Init.path.updateUserData, - data: updatedUserData, - dataType: 'json' - }).done((data) => { - // log request time - let duration = Util.timeStop(logKeyServerUserData); - Util.log(logKeyServerUserData, {duration: duration, type: 'server', description:'request user data'}); - - if( - data.error && - data.error.length > 0 - ){ - // any error in the main trigger functions result in a user log-off - Util.triggerMenuAction(document, 'Logout'); - }else{ - $(document).setProgramStatus('online'); - - if(data.userData !== undefined){ - // store current user data global (cache) - Util.setCurrentUserData(data.userData); - - // update system info panels - if(data.system){ - ModuleMap.updateSystemModulesData(mapModule, data.system); - } - - // store current map user data (cache) - if(data.mapUserData !== undefined){ - Util.setCurrentMapUserData(data.mapUserData); - } - - // update map module character data - ModuleMap.updateActiveMapUserData(mapModule).then(() => { - // map module update done, init new trigger - initMapUserUpdatePing(); - }); - } - } - - }).fail(handleAjaxErrorResponse); - }; - - /** - * init (schedule) next MapUpdate Ping - */ - let initMapUpdatePing = (forceUpdateMapData) => { - // get the current update delay (this can change if a user is inactive) - let delay = Util.getCurrentTriggerDelay(logKeyServerMapData, 0); - - updateTimeouts.mapUpdate = setTimeout((forceUpdateMapData) => { - triggerMapUpdatePing(forceUpdateMapData); - }, delay, forceUpdateMapData); - }; - - /** - * init (schedule) next MapUserUpdate Ping - */ - let initMapUserUpdatePing = () => { - // get the current update delay (this can change if a user is inactive) - let delay = Util.getCurrentTriggerDelay(logKeyServerUserData, 0); - - updateTimeouts.userUpdate = setTimeout(() => { - triggerUserUpdatePing(); - }, delay); - }; - - // initial start of the map update function - triggerMapUpdatePing(true); - - /** - * handles "final" map update request before window.unload event - * -> navigator.sendBeacon browser support required - * ajax would not work here, because browsers might cancel the request! - * @param mapModule - */ - let mapUpdateUnload = mapModule => { - // get updated map data - let mapData = ModuleMap.getMapModuleDataForUpdate(mapModule); - - if(mapData.length){ - let fd = new FormData(); - fd.set('mapData', JSON.stringify(mapData)); - navigator.sendBeacon(Init.path.updateUnloadData, fd); - - console.info('Map update request send by: %O', navigator.sendBeacon); - } - }; - - // Send map update request on tab close/reload, in order to save map changes that - // haven´t been saved through default update trigger - window.addEventListener('beforeunload', function(e){ - // close "SharedWorker" connection - MapWorker.close(); - - // clear periodic update timeouts - // -> this function will handle the final map update request - clearUpdateTimeouts(); - - // save unsaved map changes ... - if(navigator.sendBeacon){ - mapUpdateUnload(mapModule); - }else{ - // fallback if sendBeacon() is not supported by browser - triggerMapUpdatePing(); - } - - // check if character should be switched on reload or current character should be loaded afterwards - let characterSwitch = Boolean( $('body').data('characterSwitch') ); - if(!characterSwitch){ - let characterId = Util.getCurrentCharacterId(); - if(characterId){ - Util.setCookie('old_char_id', characterId, 3, 's'); - } - } - - // IMPORTANT, return false in order to not "abort" ajax request in background! - return false; - }, false); - - }; - + }); }); + /** + * init DataTables plugin + dependencies + default config + * @returns {Promise} + */ + let initDataTables = () => new Promise(resolve => { + let payload = { + action: 'initDataTables', + data: false + }; + + require(['datatables.loader'], dtLoader => { + dtLoader.initDefaultConfig({ + breakpoints: Init.breakpoints, + onDestroy: table => { + // remove all active counters in table + Counter.destroyTimestampCounter(table, true); + } + }).then(() => resolve(payload)); + }); + }); + + /** + * init main mapModule + * -> initData() needs to be resolved first! + * @param mapModule + * @returns {Promise} + */ + let initMapModule = mapModule => new Promise(resolve => { + Promise.all([ + Page.initTabChangeObserver(), // init browser tab change observer, Once the timers are available + Page.renderMapContextMenus() // init hidden context menu elements + ]).then(() => { + // initial start of the map update function + triggerMapUpdatePing(mapModule, true); + }).then(() => resolve({ + action: 'initMapModule', + data: false + })); + }); + + /** + * request all map access data (tokens) -> required wor WebSocket subscription + * -> initData() needs to be resolved first! + * @param mapModule + * @param accessData + * @returns {Promise} + */ + let initMapWorker = (mapModule, accessData) => new Promise((resolve, reject) => { + let getPayload = command => ({ + action: 'initMapWorker', + data: { + syncStatus: Init.syncStatus.type, + command: command + } + }); + + if(accessData && accessData.status === 'OK'){ + // init SharedWorker for maps + MapWorker.init({ + characterId: accessData.data.id, + callbacks: { + onInit: (MsgWorkerMessage) => { + Util.setSyncStatus(MsgWorkerMessage.command); + + }, + onOpen: (MsgWorkerMessage) => { + Util.setSyncStatus(MsgWorkerMessage.command, MsgWorkerMessage.meta()); + MapWorker.send('subscribe', accessData.data); + + resolve(getPayload(MsgWorkerMessage.command)); + }, + onGet: (MsgWorkerMessage) => { + switch(MsgWorkerMessage.task()){ + case 'mapUpdate': + Util.updateCurrentMapData(MsgWorkerMessage.data()); + ModuleMap.updateMapModule(mapModule); + break; + case 'mapAccess': + case 'mapDeleted': + Util.deleteCurrentMapData(MsgWorkerMessage.data()); + ModuleMap.updateMapModule(mapModule); + break; + case 'mapSubscriptions': + Util.updateCurrentMapUserData(MsgWorkerMessage.data()); + ModuleMap.updateActiveMapUserData(mapModule); + break; + } + + Util.setSyncStatus('ws:get'); + }, + onClosed: (MsgWorkerMessage) => { + Util.setSyncStatus(MsgWorkerMessage.command, MsgWorkerMessage.meta()); + reject(getPayload(MsgWorkerMessage.command)); + + }, + onError: (MsgWorkerMessage) => { + Util.setSyncStatus(MsgWorkerMessage.command, MsgWorkerMessage.meta()); + reject(getPayload(MsgWorkerMessage.command)); + } + } + }); + }else{ + reject(getPayload('Invalid mapAccessData')); + } + }); + + /** + * init 'beforeunload' event + * @param mapModule + * @returns {Promise} + */ + let initUnload = mapModule => new Promise(resolve => { + + /** + * handles "final" map update request before window.unload event + * -> navigator.sendBeacon browser support required + * ajax would not work here, because browsers might cancel the request! + * @param mapModule + */ + let mapUpdateUnload = mapModule => { + // get updated map data + let mapData = ModuleMap.getMapModuleDataForUpdate(mapModule); + + if(mapData.length){ + let fd = new FormData(); + fd.set('mapData', JSON.stringify(mapData)); + navigator.sendBeacon(Init.path.updateUnloadData, fd); + + console.info('Map update request send by: %O', navigator.sendBeacon); + } + }; + + // Send map update request on tab close/reload, in order to save map changes that + // haven´t been saved through default update trigger + window.addEventListener('beforeunload', e => { + // close "SharedWorker" connection + MapWorker.close(); + + // clear periodic update timeouts + // -> this function will handle the final map update request + clearUpdateTimeouts(); + + // save unsaved map changes ... + if(navigator.sendBeacon){ + mapUpdateUnload(mapModule); + }else{ + // fallback if sendBeacon() is not supported by browser + triggerMapUpdatePing(); + } + + // check if character should be switched on reload or current character should be loaded afterwards + let characterSwitch = Boolean( $('body').data('characterSwitch') ); + if(!characterSwitch){ + let characterId = Util.getCurrentCharacterId(); + if(characterId){ + Util.setCookie('old_char_id', characterId, 3, 's'); + } + } + + // IMPORTANT, return false in order to not "abort" ajax request in background! + return false; + }, false); + + resolve({ + action: 'initUnload', + data: false + }); + }); + + + /** + * clear both main update timeouts, and reset values + * -> stop program from working -> shutdown + */ + let clearUpdateTimeouts = () => { + Object.keys(updateTimeouts).forEach(intervalKey => { + clearTimeout(updateTimeouts[intervalKey]); + updateTimeouts[intervalKey] = 0; + }); + }; + + + // ping for main map update ======================================================================================= + /** + * @param forceUpdateMapData // force request to be send + * @param mapModule + * @param forceUpdateMapData + */ + let triggerMapUpdatePing = (mapModule, forceUpdateMapData) => { + + // check each interval if map module is still available + if(!mapModule){ + // program crash stop any update + return; + } + + // get updated map data + let updatedMapData = { + mapData: ModuleMap.getMapModuleDataForUpdate(mapModule), + getUserData: Util.getCurrentUserData() ? 0 : 1 + }; + + // check if mapUpdate trigger should be send + // -> if "syncType" === "ajax" -> send always + // -> if "syncType" === "webSocket" -> send initial AND on map changes + if( + forceUpdateMapData || + Util.getSyncType() === 'ajax' || + ( + Util.getSyncType() === 'webSocket' && + updatedMapData.mapData.length + ) + ){ + // start log + Util.timeStart(logKeyServerMapData); + + // store updatedMapData + $.ajax({ + type: 'POST', + url: Init.path.updateMapData, + data: updatedMapData, + dataType: 'json' + }).done((data) => { + // log request time + let duration = Util.timeStop(logKeyServerMapData); + Util.log(logKeyServerMapData, {duration: duration, type: 'server', description: 'request map data'}); + + Util.setSyncStatus('ajax:get'); + + if( + data.error && + data.error.length > 0 + ){ + // any error in the main trigger functions result in a user log-off + Util.triggerMenuAction(document, 'Logout'); + }else{ + $(document).setProgramStatus('online'); + + if(data.userData !== undefined){ + // store current user data global (cache) + Util.setCurrentUserData(data.userData); + } + + // map data found + Util.setCurrentMapData(data.mapData); + + // load/update main map module + ModuleMap.updateMapModule(mapModule).then(() => { + // map update done, init new trigger + + // get the current update delay (this can change if a user is inactive) + let mapUpdateDelay = Util.getCurrentTriggerDelay(logKeyServerMapData, 0); + + // init new trigger + initMapUpdatePing(mapModule, false); + + // initial start for the userUpdate trigger + // this should only be called at the first time! + if(updateTimeouts.userUpdate === 0){ + // start user update trigger after map loaded + updateTimeouts.userUpdate = setTimeout(() => { + triggerUserUpdatePing(mapModule); + }, 500); + } + }); + } + + }).fail(handleAjaxErrorResponse); + }else{ + // skip this mapUpdate trigger and init next one + initMapUpdatePing(mapModule, false); + } + }; + + // ping for user data update ============================================================================== + let triggerUserUpdatePing = mapModule => { + + // IMPORTANT: Get user data for ONE map that is currently visible + // On later releases this can be easy changed to "full update" all maps for a user + let mapId; + let newSystemPositions = null; + let locationToggle = document.getElementById(Util.config.headMapTrackingId); + let activeMap = Util.getMapModule().getActiveMap(); + + if(activeMap){ + mapId = activeMap.data('id'); + newSystemPositions = MapUtil.newSystemPositionsByMap(activeMap); + } + + let updatedUserData = { + mapIds: mapId ? [mapId] : [], + getMapUserData: Util.getSyncType() === 'webSocket' ? 0 : 1, + mapTracking: locationToggle ? locationToggle.checked | 0 : 0, // location tracking + systemData: mapId ? Util.getCurrentSystemData(mapId) : [] + }; + + if(newSystemPositions){ + updatedUserData.newSystemPositions = newSystemPositions; + } + + Util.timeStart(logKeyServerUserData); + + $.ajax({ + type: 'POST', + url: Init.path.updateUserData, + data: updatedUserData, + dataType: 'json' + }).done((data) => { + // log request time + let duration = Util.timeStop(logKeyServerUserData); + Util.log(logKeyServerUserData, {duration: duration, type: 'server', description:'request user data'}); + + if( + data.error && + data.error.length > 0 + ){ + // any error in the main trigger functions result in a user log-off + Util.triggerMenuAction(document, 'Logout'); + }else{ + $(document).setProgramStatus('online'); + + if(data.userData !== undefined){ + // store current user data global (cache) + Util.setCurrentUserData(data.userData); + + // update system info panels + if(data.system){ + ModuleMap.updateSystemModulesData(mapModule, data.system); + } + + // store current map user data (cache) + if(data.mapUserData !== undefined){ + Util.setCurrentMapUserData(data.mapUserData); + } + + // update map module character data + ModuleMap.updateActiveMapUserData(mapModule).then(() => { + // map module update done, init new trigger + initMapUserUpdatePing(mapModule); + }); + } + } + }).fail(handleAjaxErrorResponse); + }; + + /** + * init (schedule) next MapUpdate Ping + * @param mapModule + * @param forceUpdateMapData + */ + let initMapUpdatePing = (mapModule, forceUpdateMapData) => { + // get the current update delay (this can change if a user is inactive) + let delay = Util.getCurrentTriggerDelay(logKeyServerMapData, 0); + + updateTimeouts.mapUpdate = setTimeout((mapModule, forceUpdateMapData) => { + triggerMapUpdatePing(mapModule, forceUpdateMapData); + }, delay, mapModule, forceUpdateMapData); + }; + + /** + * init (schedule) next MapUserUpdate Ping + * @param mapModule + */ + let initMapUserUpdatePing = mapModule => { + // get the current update delay (this can change if a user is inactive) + let delay = Util.getCurrentTriggerDelay(logKeyServerUserData, 0); + + updateTimeouts.userUpdate = setTimeout(mapModule => { + triggerUserUpdatePing(mapModule); + }, delay, mapModule); + }; + + /** + * Ajax error response handler function for main-ping functions + * @param jqXHR + * @param status + * @param error + */ + let handleAjaxErrorResponse = (jqXHR, status, error) => { + // clear both main update request trigger timer + clearUpdateTimeouts(); + + let reason = `${status} ${jqXHR.status}`; + let firstError = error; + let errorData = []; + let redirect = false; // redirect user to other page e.g. login + let reload = true; // reload current page (default: true) + + if(jqXHR.responseJSON){ + // handle JSON + let responseObj = jqXHR.responseJSON; + if( + responseObj.error && + responseObj.error.length > 0 + ){ + firstError = responseObj.error[0].status; + errorData = responseObj.error; + } + + if(responseObj.reroute){ + redirect = responseObj.reroute; + } + }else{ + // handle HTML + errorData.push({ + type: 'error', + message: 'Please restart and reload this page' + }); + } + + console.error(' ↪ %s Error response: %o', jqXHR.url, errorData); + $(document).trigger('pf:shutdown', { + status: jqXHR.status, + reason: `${reason}: ${firstError}`, + error: errorData, + redirect: redirect, + reload: reload + }); + }; + + // ================================================================================================================ + // main thread -> init "map" page + // ================================================================================================================ + // set default AJAX config + Util.ajaxSetup(); + + /** + * run app + * @param rootEl + * @returns {Promise} + */ + let run = (rootEl = document.body) => new Promise(resolve => { + // run all init functions for mainModule and WebSocket configuration async + Promise.all([ + initApp(rootEl), + initData(), + getMapAccessData(), + initDataTables(), + ]) + .then(([mapModule, initData, accessData]) => Promise.all([ + initMapModule(mapModule), + initMapWorker(mapModule, accessData), + initUnload(mapModule) + ])) + .then(([payloadMapModule, payloadMapWorker]) => { + // mapModule initialized and WebSocket configuration working + console.ok('Client syncStatus: %s. %O resolved by command: %s!', + payloadMapWorker.data.syncStatus, + payloadMapWorker.action + '()', + payloadMapWorker.data.command + ); + resolve('OK'); + }) + .catch(payload => { + switch(payload.action){ + case 'shutdown': + // ajax error + handleAjaxErrorResponse(payload.data.jqXHR, payload.data.status, payload.data.error); + break; + case 'initMapWorker': + // WebSocket not working -> no error here -> fallback to Ajax + console.info('Client syncStatus: %s. %O rejected by command: %s! payload: %o', + payload.data.syncStatus, + payload.action + '()', + payload.data.command, + payload.data + ); + break; + default: + console.error('Unhandled error thrown while initialization: %o ', payload); + } + }); + }); + + if(document.readyState === 'loading'){ // Loading hasn't finished yet + document.addEventListener('DOMContentLoaded', run); + }else{ // `DOMContentLoaded` has already fired + run(); + } }); \ No newline at end of file diff --git a/js/app/module_map.js b/js/app/module_map.js index 51bf9aa8..2581a90c 100644 --- a/js/app/module_map.js +++ b/js/app/module_map.js @@ -4,13 +4,16 @@ define([ 'app/util', 'app/map/map', 'app/map/util', + 'app/lib/eventHandler', 'sortable', + 'module/base', 'module/system_info', 'module/system_graph', 'module/system_signature', 'module/system_route', 'module/system_intel', 'module/system_killboard', + 'module/global_thera', 'module/connection_info', 'app/counter' ], ( @@ -19,58 +22,58 @@ define([ Util, Map, MapUtil, + EventHandler, Sortable, + BaseModule, SystemInfoModule, SystemGraphModule, SystemSignatureModule, SystemRouteModule, SystemIntelModule, SystemKillboardModule, + TheraModule, ConnectionInfoModule ) => { 'use strict'; let config = { mapTabElementId: 'pf-map-tab-element', // id for map tab element (tabs + content) - mapTabBarId: 'pf-map-tabs', // id for map tab bar mapTabIdPrefix: 'pf-map-tab-', // id prefix for a map tab mapTabClass: 'pf-map-tab', // class for a map tab - mapTabDragHandlerClass: 'pf-map-tab-handler', // class for drag handler mapTabIconClass: 'pf-map-tab-icon', // class for map icon mapTabLinkTextClass: 'nav-tabs-link', // class for span elements in a tab mapTabSharedIconClass: 'pf-map-tab-shared-icon', // class for map shared icon - mapTabContentClass: 'pf-map-tab-content', // class for tab content container - mapTabContentSystemInfoClass: 'pf-map-tab-content-system', - mapWrapperClass: 'pf-map-wrapper', // scrollable - mapClass: 'pf-map', // class for each map - - // TabContentStructure - mapTabContentRow: 'pf-map-content-row', // main row for Tab content (grid) - mapTabContentCell: 'pf-map-content-col', // column - mapTabContentCellFirst: 'pf-map-content-col-first', // first column - mapTabContentCellSecond: 'pf-map-content-col-second', // second column + mapTabContentWrapperClass: 'pf-map-tab-content-wrapper', // class for map tab content wrapper // module moduleClass: 'pf-module', // class for a module moduleSpacerClass: 'pf-module-spacer', // class for "spacer" module (preserves height during hide/show animation) - moduleClosedClass: 'pf-module-closed' // class for a closed module + moduleCollapsedClass: 'collapsed', // class for a collapsed module + + // sortable + sortableHandleClass: 'pf-sortable-handle', + sortableDropzoneClass: 'pf-sortable-dropzone', + sortableGhostClass: 'pf-sortable-ghost', + sortableChosenClass: 'pf-sortable-chosen', + + // editable 'settings' popover + editableSettingsClass: 'pf-editable-settings', + editableHeadlineClass: 'pf-editable-headline', + editableToggleClass: 'pf-editable-toggle', + editableToggleItemClass: 'pf-editable-toggle-item', + + mapTabContentLayoutOptions: ['left', 'right'], + defaultMapTabContentLayout: 'right', }; let mapTabChangeBlocked = false; // flag for preventing map tab switch - /** - * get all maps for a maps module - * @param mapModule - * @returns {jQuery} - */ - let getMaps = mapModule => $(mapModule).find('.' + config.mapClass); - /** * get the current active mapElement - * @returns {JQuery|*|T|{}|jQuery} + * @returns {bool|jQuery} */ $.fn.getActiveMap = function(){ - let map = $(this).find('.active.' + config.mapTabContentClass + ' .' + config.mapClass); + let map = $(this).find('.active.' + Util.config.mapTabContentClass + ' .' + Util.config.mapClass); if(!map.length){ map = false; } @@ -78,341 +81,411 @@ define([ }; /** - * set mapContent Observer, events are triggered within map.js - * @param tabElement + * set map tab content wrapper observer. + * -> Events are triggered within map.js + * @param tabContentWrapperEl */ - let setMapContentObserver = (tabElement) => { - - tabElement.on('pf:drawSystemModules', '.' + config.mapTabContentClass, function(e){ - drawSystemModules($(e.target)); + let setMapTabContentWrapperObserver = tabContentWrapperEl => { + $(tabContentWrapperEl).on('pf:renderGlobalModules', `.${Util.config.mapTabContentClass}`, function(e, data){ + getModules() + .then(modules => filterModules(modules, 'global')) + .then(modules => renderModules(modules, e.target, data)); }); - tabElement.on('pf:removeSystemModules', '.' + config.mapTabContentClass, function(e){ - removeSystemModules($(e.target)); + $(tabContentWrapperEl).on('pf:renderSystemModules', `.${Util.config.mapTabContentClass}`, function(e, data){ + getModules() + .then(modules => filterModules(modules, 'system')) + .then(modules => renderModules(modules, e.target, data)); }); - tabElement.on('pf:drawConnectionModules', '.' + config.mapTabContentClass, function(e, data){ - drawConnectionModules($(e.target), data); + $(tabContentWrapperEl).on('pf:removeSystemModules', `.${Util.config.mapTabContentClass}`, e => { + getModules() + .then(modules => filterModules(modules, 'system')) + .then(modules => removeModules(modules, e.target)); }); - tabElement.on('pf:removeConnectionModules', '.' + config.mapTabContentClass, function(e){ - removeConnectionModules($(e.target)); + $(tabContentWrapperEl).on('pf:renderConnectionModules', `.${Util.config.mapTabContentClass}`, (e, data) => { + getModules() + .then(modules => filterModules(modules, 'connection')) + .then(modules => renderModules(modules, e.target, data)); }); - tabElement.on('pf:updateSystemModules', '.' + config.mapTabContentClass, function(e, data){ - updateSystemModules($(e.target), data); + $(tabContentWrapperEl).on('pf:removeConnectionModules', `.${Util.config.mapTabContentClass}`, e => { + getModules() + .then(modules => filterModules(modules, 'connection')) + .then(modules => removeModules(modules, e.target)); }); - tabElement.on('pf:updateRouteModules', '.' + config.mapTabContentClass, function(e, data){ - updateRouteModules($(e.target), data); + $(tabContentWrapperEl).on('pf:updateGlobalModules', `.${Util.config.mapTabContentClass}`, (e, data) => { + getModules() + .then(modules => filterModules(modules, 'global')) + .then(modules => updateModules(modules, e.target, data)); + }); + + $(tabContentWrapperEl).on('pf:updateSystemModules', `.${Util.config.mapTabContentClass}`, (e, data) => { + getModules() + .then(modules => filterModules(modules, true, 'fullDataUpdate')) + .then(modules => updateModules(modules, e.target, data)); + }); + + $(tabContentWrapperEl).on('pf:updateRouteModules', `.${Util.config.mapTabContentClass}`, (e, data) => { + getModules() + .then(modules => filterModules(modules, 'SystemRouteModule', 'name')) + .then(modules => updateModules(modules, e.target, data)); }); }; /** - * update (multiple) modules - * @param tabContentElement - * @param modules - * @param data + * get/load module classes + * -> default modules + custom plugin modules + * @returns {Promise} */ - let updateModules = (tabContentElement, modules, data) => { - for(let Module of modules){ - let moduleElement = tabContentElement.find('.' + Module.config.moduleTypeClass); - if(moduleElement.length > 0){ - Module.updateModule(moduleElement, data); + let getModules = () => { + return new Promise(resolve => { + let modules = [ + SystemInfoModule, + SystemGraphModule, + SystemSignatureModule, + SystemRouteModule, + SystemIntelModule, + SystemKillboardModule, + TheraModule, + ConnectionInfoModule + ]; + + // try to load custom plugin modules (see: plugin.ihi) + let pluginModulesConfig = Util.getObjVal(Init, 'plugin.modules'); + if(pluginModulesConfig === Object(pluginModulesConfig)){ + requirejs(Object.values(pluginModulesConfig), (...pluginModules) => { + modules.push(...pluginModules); + resolve(modules); + }, err => { + console.error(err.message); + resolve(modules); + }); + }else{ + // custom plugins disabled + resolve(modules); } + }); + }; + + /** + * filer array of module classes by property filterVal(s) + * @param modules + * @param filterVal + * @param filterProp + * @returns BaseModule[] + */ + let filterModules = (modules, filterVal = false, filterProp = 'scope') => modules.filter(Module => + filterVal ? + ( + Array.isArray(filterVal) ? + filterVal.includes(Module[filterProp]) : + Module[filterProp] === filterVal + ) : + true + ); + + /** + * @param modules + * @param tabContentElement + * @param data + * @returns {PromiseLike | Promise | *} + */ + let renderModules = (modules, tabContentElement, data) => { + /** + * @param dataStore + * @returns {Promise} + */ + let render = dataStore => { + let promiseRenderAll = []; + for(let Module of modules){ + let defaultGridArea = Module.sortArea || 'a'; + let defaultPosition = Module.position || 0; + + for(let areaAlias of Util.config.mapTabContentAreaAliases){ + let key = 'modules_area_' + areaAlias; + if(dataStore && dataStore[key]){ + let positionIndex = dataStore[key].indexOf(Module.name); + if(positionIndex !== -1){ + // first index (0) => is position 1 + defaultPosition = positionIndex + 1; + defaultGridArea = areaAlias; + break; + } + } + } + + // check if gridArea exists + let gridArea = tabContentElement.getElementsByClassName(Util.getMapTabContentAreaClass(defaultGridArea)); + if(gridArea.length){ + gridArea = gridArea[0]; + promiseRenderAll.push(renderModule(Module, gridArea, defaultPosition, data.mapId, data.payload)); + }else{ + console.warn( + 'renderModules() failed for %o. GridArea class=%o not found', + Module.name, + Util.getMapTabContentAreaClass(defaultGridArea) + ); + } + } + + return Promise.all(promiseRenderAll); + }; + + let renderModulesAndUpdateExecutor = resolve => { + // get local data for map + // -> filter out disabled modules + // -> get default module positions + Util.getLocalStore('map').getItem(data.mapId).then(dataStore => { + // filter disabled modules (layout settings) + let modulesDisabled = Util.getObjVal(dataStore, 'modulesDisabled') || []; + modules = modules.filter(Module => !modulesDisabled.includes(Module.name)); + + // check if modules require "additional" data (e.g. structures, description) + // -> this is used to update some modules after initial draw + let requestSystemData = false; + for(let Module of modules){ + if(Module.scope === 'system' && Module.fullDataUpdate){ + requestSystemData = true; + } + } + + let renderPromises = []; + if(requestSystemData){ + renderPromises.push(Util.request('GET', 'System', data.payload.id, {mapId: data.mapId})); + } + renderPromises.push(render(dataStore)); + + Promise.all(renderPromises) + .then(payload => { + let promiseUpdateAll = []; + + let systemData; + if(requestSystemData){ + // get systemData from first Promise (ajax call) + let responseData = payload.shift(); + systemData = Util.getObjVal(responseData, 'data'); + } + + if(systemData){ + // get all rendered modules + let modules = payload.shift().map(payload => payload.data.module); + + // get modules that require "additional" data + let systemModules = modules.filter(Module => Module.scope === 'system' && Module.fullDataUpdate); + promiseUpdateAll.push(updateModules(systemModules, tabContentElement, { + payload: systemData + })); + } + + Promise.all(promiseUpdateAll).then(payload => resolve(payload)); + }); + }); + }; + + return new Promise(renderModulesAndUpdateExecutor); + }; + + /** + * @param Module + * @param gridArea + * @param defaultPosition + * @param mapId + * @param payload + * @returns {Promise} + */ + let renderModule = (Module, gridArea, defaultPosition, mapId, payload) => { + let renderModuleExecutor = (resolve, reject) => { + + /** + * remove "Spacer" Module + * @param gridArea + * @param Module + */ + let removeSpacerModule = (gridArea, Module) => { + for(let spacerEl of gridArea.querySelectorAll('.' + Module.className + '-spacer[data-module="' + Module.name + '"]')){ + spacerEl.remove(); + } + }; + + /** + * render module + * @param Module + * @param gridArea + * @param defaultPosition + * @param mapId + * @param payload + */ + let render = (Module, gridArea, defaultPosition, mapId, payload) => { + let payBack = { + action: 'renderModule', + data: { + module: Module + } + }; + + // hide "spacer" Module (in case it exist) + // -> Must be done BEFORE position calculation! Spacer Modules should not be counted! + removeSpacerModule(gridArea, Module); + + let module = new Module({ + position: defaultPosition + }); + + let moduleElement = module.handle('render', mapId, payload); + + if(!(moduleElement instanceof HTMLElement)){ + // module should not be rendered + resolve(payBack); + return; + } + + // find correct position for new moduleElement + let position = getModulePosition(gridArea, '.' + Module.className, defaultPosition); + + // insert at correct position + // -> no :nth-child or :nth-of-type here because there might be temporary "spacer" div "modules" + // that should be ignored for positioning + let prevModuleElement = [...gridArea.getElementsByClassName(Module.className)].find((el, i) => ++i === position); + if(prevModuleElement){ + prevModuleElement.insertAdjacentElement('afterend', moduleElement); + }else{ + gridArea.prepend(moduleElement); + } + + // show animation ------------------------------------------------------------------------------------- + $(moduleElement).velocity({ + opacity: [1, 0], + translateY: [0, +20], + translateZ: 0 // Force HA by animating a 3D property + }, { + duration: Init.animationSpeed.mapModule, + easing: 'easeOutSine', + complete: moduleElement => { + moduleElement[0].getData('module').handle('init'); + resolve(payBack); + } + }); + }; + + removeModule(Module, gridArea, false).then(abc => render(Module, gridArea, defaultPosition, mapId, payload)); + }; + + return new Promise(renderModuleExecutor); + }; + + /** + * update multiple modules + * @param modules + * @param tabContentElement + * @param data + * @returns {Promise} + */ + let updateModules = (modules, tabContentElement, data) => { + let promiseUpdateAll = []; + for(let Module of modules){ + promiseUpdateAll.push(updateModule(Module, tabContentElement, data.payload)); } + return Promise.all(promiseUpdateAll); }; /** - * update system modules with new data - * @param tabContentElement - * @param data + * update module + * @param Module + * @param parentElement + * @param payload + * @returns {Promise} */ - let updateSystemModules = (tabContentElement, data) => { - let systemModules = [SystemInfoModule, SystemSignatureModule, SystemIntelModule]; - updateModules(tabContentElement, systemModules, data); - }; + let updateModule = (Module, parentElement, payload) => { + let updateModuleExecutor = resolve => { + let promiseUpdateAll = []; + let moduleElements = parentElement.querySelectorAll('.' + Module.className + '[data-module="' + Module.name + '"]'); + for(let moduleElement of moduleElements){ + promiseUpdateAll.push(moduleElement.getData('module').handle('update', payload)); + } + Promise.all(promiseUpdateAll).then(payload => resolve(payload)); + }; - /** - * update route modules with new data - * @param tabContentElement - * @param data - */ - let updateRouteModules = (tabContentElement, data) => { - let routeModules = [SystemRouteModule]; - updateModules(tabContentElement, routeModules, data); + return new Promise(updateModuleExecutor); }; /** * remove multiple modules - * @param tabContentElement * @param modules + * @param tabContentElement + * @returns {Promise} */ - let removeModules = (tabContentElement, modules) => { + let removeModules = (modules, tabContentElement) => { + let promiseRemoveAll = []; for(let Module of modules){ - let moduleElement = tabContentElement.find('.' + Module.config.moduleTypeClass); - removeModule(moduleElement, Module); + promiseRemoveAll.push(removeModule(Module, tabContentElement)); } + return Promise.all(promiseRemoveAll); }; /** - * clear all system modules and remove them - * @param tabContentElement - */ - let removeSystemModules = (tabContentElement) => { - let systemModules = [SystemInfoModule, SystemGraphModule, SystemSignatureModule, SystemRouteModule, SystemIntelModule, SystemKillboardModule]; - removeModules(tabContentElement, systemModules); - }; - - /** - * clear all connection modules and remove them - * @param tabContentElement - */ - let removeConnectionModules = (tabContentElement) => { - let connectionModules = [ConnectionInfoModule]; - removeModules(tabContentElement, connectionModules); - }; - - /** - * remove a single module - * @param moduleElement + * remove module * @param Module - * @param callback - * @param addSpacer - */ - let removeModule = (moduleElement, Module, callback, addSpacer) => { - if(moduleElement.length > 0){ - if(typeof Module.beforeHide === 'function'){ - Module.beforeHide(moduleElement); - } - - moduleElement.velocity('reverse',{ - complete: function(moduleElement){ - moduleElement = $(moduleElement); - let oldModuleHeight = moduleElement.outerHeight(); - - if(typeof Module.beforeDestroy === 'function'){ - Module.beforeDestroy(moduleElement); - } - - // [optional] add a "spacer"
    that fakes Module height during hide->show animation - if(addSpacer){ - moduleElement.after($('
    ', { - class: [config.moduleSpacerClass, Module.config.moduleTypeClass + '-spacer'].join(' '), - css: { - height: oldModuleHeight + 'px' - } - })); - } - - moduleElement.remove(); - - if(typeof callback === 'function'){ - callback(); - } - } - }); - } - }; - - /** - * generic function that draws a modulePanel for a given Module object * @param parentElement - * @param Module - * @param mapId - * @param data + * @param addSpacer + * @returns {Promise} */ - let drawModule = (parentElement, Module, mapId, data) => { + let removeModule = (Module, parentElement, addSpacer = false) => { - let drawModuleExecutor = (resolve, reject) => { + let removeModuleElement = moduleElement => { + let removeModuleElementExecutor = (resolve, reject) => { + let payload = { + action: 'removeModule', + data: {} + }; - /** - * remove "Spacer" Module - * @param parentElement - * @param Module - */ - let removeSpacerModule = (parentElement, Module) => { - parentElement.find('.' + Module.config.moduleTypeClass + '-spacer').remove(); - }; + // get module instance + let module = moduleElement.getData('module'); + if(module instanceof BaseModule){ + module.handle('beforeHide'); - /** - * show/render a Module - * @param parentElement - * @param Module - * @param mapId - * @param data - */ - let showPanel = (parentElement, Module, mapId, data) => { - let moduleElement = Module.getModule(parentElement, mapId, data); - if(moduleElement){ - // store Module object to DOM element for further access - moduleElement.data('module', Module); - moduleElement.data('data', data); - moduleElement.addClass([config.moduleClass, Module.config.moduleTypeClass].join(' ')); - moduleElement.css({opacity: 0}); // will be animated + $(moduleElement).velocity('reverse', { + complete: moduleElement => { + moduleElement = moduleElement[0]; + let module = moduleElement.getData('module'); + module.handle('beforeDestroy'); - // check module position from local storage - let promiseStore = MapUtil.getLocaleData('map', mapId); - promiseStore.then(function(dataStore){ - let Module = this.moduleElement.data('module'); - let defaultPosition = Module.config.modulePosition || 0; + // [optional] add a "spacer"
    that fakes Module height during hide->show animation + if(addSpacer){ + let spacerEl = document.createElement('div'); + spacerEl.classList.add(Module.className + '-spacer'); + spacerEl.setAttribute('data-module', Module.name); + spacerEl.style.height = moduleElement.offsetHeight + 'px'; - // hide "spacer" Module (in case it exist) - // -> Must be done BEFORE position calculation! Spacer Modules should not be counted! - removeSpacerModule(this.parentElement, Module); - - // check for stored module order in indexDB (client) ---------------------------------------------- - let key = 'modules_cell_' + this.parentElement.attr('data-position'); - if( - dataStore && - dataStore[key] - ){ - let positionIndex = dataStore[key].indexOf(Module.config.moduleName); - if(positionIndex !== -1){ - // first index (0) => is position 1 - defaultPosition = positionIndex + 1; + moduleElement.insertAdjacentElement('afterend', spacerEl); } + + moduleElement.remove(); + + resolve(payload); } - - // find correct position for new moduleElement ---------------------------------------------------- - let position = getModulePosition(this.parentElement, '.' + config.moduleClass, defaultPosition); - - this.moduleElement.attr('data-position', defaultPosition); - this.moduleElement.attr('data-module', Module.config.moduleName); - - // insert at correct position --------------------------------------------------------------------- - // -> no :nth-child or :nth-of-type here because there might be temporary "spacer" div "modules" - // that should be ignored for positioning - let prevModuleElement = this.parentElement.find('.' + config.moduleClass).filter(i => ++i === position); - if(prevModuleElement.length){ - this.moduleElement.insertAfter(prevModuleElement); - }else{ - this.parentElement.prepend(this.moduleElement); - } - - if(typeof Module.beforeShow === 'function'){ - Module.beforeShow(this.moduleElement, moduleElement.data('data')); - } - - // show animation --------------------------------------------------------------------------------- - this.moduleElement.velocity({ - opacity: [1, 0], - translateY: [0, +20] - }, { - duration: Init.animationSpeed.mapModule, - easing: 'easeOutSine', - complete: function(moduleElement){ - moduleElement = $(moduleElement); - let Module = $(moduleElement).data('module'); - if(typeof Module.initModule === 'function'){ - Module.initModule(moduleElement, mapId, moduleElement.data('data')); - } - - resolve({ - action: 'drawModule', - data: { - module: Module - } - }); - } - }); - }.bind({ - parentElement: parentElement, - moduleElement: moduleElement - })); + }); }else{ - // Module should not be shown (e.g. "Graph" module on WH systems) - removeSpacerModule(parentElement, Module); + console.warn('Invalid module. Instance of %O expected for %o', BaseModule, moduleElement); + resolve(payload); } }; - // check if module already exists - let moduleElement = parentElement.find('.' + Module.config.moduleTypeClass); - if(moduleElement.length > 0){ - removeModule(moduleElement, Module, () => { - showPanel(parentElement, Module, mapId, data); - }, true); - }else{ - showPanel(parentElement, Module, mapId, data); - } + return new Promise(removeModuleElementExecutor); }; - return new Promise(drawModuleExecutor); - }; + let removeModuleExecutor = resolve => { + let promiseRemoveAll = []; + let moduleElements = parentElement.querySelectorAll('.' + Module.className + '[data-module="' + Module.name + '"]'); + for(let moduleElement of moduleElements){ + promiseRemoveAll.push(removeModuleElement(moduleElement)); + } + Promise.all(promiseRemoveAll).then(payload => resolve(payload)); + }; - /** - * clears and updates the system info element (signature table, system info,...) - * @param tabContentElement - */ - let drawSystemModules = (tabContentElement) => { - - require(['datatables.loader'], () => { - let currentSystemData = Util.getCurrentSystemData(); - - let promiseDrawAll = []; - - // request "additional" system data (e.g. Structures, Description) - // -> this is used to update some modules after initial draw - let promiseRequestData = Util.request('GET', 'system', currentSystemData.id, {mapId: currentSystemData.mapId}); - - // draw modules ------------------------------------------------------------------------------------------- - - let firstCell = tabContentElement.find('.' + config.mapTabContentCellFirst); - let secondCell = tabContentElement.find('.' + config.mapTabContentCellSecond); - - // draw system info module - let promiseInfo = drawModule(firstCell, SystemInfoModule, currentSystemData.mapId, currentSystemData); - - // draw system graph module - drawModule(firstCell, SystemGraphModule, currentSystemData.mapId, currentSystemData); - - // draw signature table module - let promiseSignature = drawModule(firstCell, SystemSignatureModule, currentSystemData.mapId, currentSystemData); - - // draw system routes module - drawModule(secondCell, SystemRouteModule, currentSystemData.mapId, currentSystemData); - - // draw system intel module - let promiseIntel = drawModule(secondCell, SystemIntelModule, currentSystemData.mapId, currentSystemData); - - // draw system killboard module - drawModule(secondCell, SystemKillboardModule, currentSystemData.mapId, currentSystemData); - - // update some modules ------------------------------------------------------------------------------------ - promiseDrawAll.push(promiseRequestData, promiseInfo, promiseSignature, promiseIntel); - - // update "some" modules after draw AND additional system data was requested - Promise.all(promiseDrawAll).then(payload => { - // get systemData from first Promise (ajax call) - let responseData = payload.shift(); - if(responseData.data){ - let systemData = responseData.data; - - // update all Modules - let modules = []; - for(let responseData of payload){ - modules.push(responseData.data.module); - } - updateModules(tabContentElement, modules, systemData); - } - }); - }); - }; - - /** - * clears and updates the connection info element (mass log) - * @param tabContentElement - * @param data - */ - let drawConnectionModules = (tabContentElement, data) => { - require(['datatables.loader'], function(){ - - // get grid cells - let firstCell = $(tabContentElement).find('.' + config.mapTabContentCellFirst); - - // draw connection info module - drawModule(firstCell, ConnectionInfoModule, this.mapId, this.connections); - }.bind(data)); + return new Promise(removeModuleExecutor); }; /** @@ -420,17 +493,11 @@ define([ * @param mapModule * @returns {Promise} */ - let updateActiveMapUserData = (mapModule) => { - - let updateActiveMapModuleExecutor = (resolve, reject) => { - // get all active map elements for module - let mapElement = mapModule.getActiveMap(); - - updateMapUserData(mapElement).then(payload => resolve()); - }; - - return new Promise(updateActiveMapModuleExecutor); - }; + let updateActiveMapUserData = mapModule => new Promise(resolve => { + // get all active map elements for module + let mapElement = $(mapModule).getActiveMap(); + updateMapUserData(mapElement).then(() => resolve()); + }); /** * updates mapElement with user data @@ -438,12 +505,12 @@ define([ * @param mapElement * @returns {Promise} */ - let updateMapUserData = (mapElement) => { + let updateMapUserData = mapElement => { // performance logging (time measurement) let logKeyClientUserData = Init.performanceLogging.keyClientUserData; Util.timeStart(logKeyClientUserData); - let updateMapUserDataExecutor = (resolve, reject) => { + let updateMapUserDataExecutor = resolve => { if(mapElement !== false){ let mapId = mapElement.data('id'); let currentMapUserData = Util.getCurrentMapUserData(mapId); @@ -475,162 +542,259 @@ define([ let updateSystemModulesData = (mapModule, systemData) => { if(systemData){ // check if current open system is still the requested info system - let currentSystemData = Util.getCurrentSystemData(); + let currentSystemData = Util.getCurrentSystemData(systemData.mapId); if( currentSystemData && systemData.id === currentSystemData.id ){ // trigger system update events - let tabContentElement = $('#' + config.mapTabIdPrefix + systemData.mapId + '.' + config.mapTabContentClass); - tabContentElement.trigger('pf:updateSystemModules', [systemData]); + let tabContentEl = document.getElementById(config.mapTabIdPrefix + systemData.mapId); + $(tabContentEl).trigger('pf:updateSystemModules', { + payload: systemData + }); } } }; /** - * set observer for tab content (area where modules will be shown) - * @param contentStructure + * set observer for tab content (areas where modules will be shown) + * @param tabContent * @param mapId */ - let setContentStructureObserver = (contentStructure, mapId) => { - contentStructure.find('.' + config.mapTabContentCell).each((index, cellElement) => { - let sortable = Sortable.create(cellElement, { - group: { - name: 'cell_' + cellElement.getAttribute('data-position') + let setTabContentObserver = (tabContent, mapId) => { + + let defaultSortableOptions = { + invertSwap: true, + animation: Init.animationSpeed.mapModule, + handle: '.' + config.sortableHandleClass, + draggable: '.' + config.moduleClass, + ghostClass: config.sortableGhostClass, + chosenClass: config.sortableChosenClass, + scroll: true, + scrollSensitivity: 50, + scrollSpeed: 20, + dataIdAttr: 'data-module', + sort: true, + store: { + get: function(sortable){ + return []; }, - animation: Init.animationSpeed.mapModule, - handle: '.pf-module-handler-drag', - draggable: '.' + config.moduleClass, - ghostClass: 'pf-sortable-ghost', - scroll: true, - scrollSensitivity: 50, - scrollSpeed: 20, - dataIdAttr: 'data-module', - sort: true, - store: { - get: function(sortable){ - return []; - }, - set: function(sortable){ - let key = 'modules_' + sortable.options.group.name; - MapUtil.storeLocalData('map', mapId, key, sortable.toArray()); - } - }, - onStart: function(e){ - // Element dragging started - // -> save initial sort state -> see store.set() - this.save(); + set: function(sortable){ + // function is called to frequently for different "groups" + // if an element moved between groups -> async local store can not handle this in time + // -> queue up store calls + let key = 'modules_' + sortable.options.group.name; + Util.getLocalStore('map').setItem(`${mapId}.${key}`, sortable.toArray()); } - }); + }, + onStart: function(e){ + // Element dragging started + // -> save initial sort state -> see store.set() + this.save(); + + // highlight valid grid areas where module could be dropped + let module = e.item.getData('module'); + let sortTargetAreas = module.config.sortTargetAreas || []; + + tabContent.querySelectorAll('.' + Util.getMapTabContentAreaClass()).forEach(gridArea => { + if(sortTargetAreas.includes(gridArea.getAttribute('data-area'))){ + gridArea.classList.add(config.sortableDropzoneClass); + }else{ + gridArea.classList.remove(config.sortableDropzoneClass); + } + }); + }, + onEnd: function(e){ + // remove highlight grid areas + tabContent.querySelectorAll('.' + Util.getMapTabContentAreaClass()).forEach(gridArea => { + gridArea.classList.remove(config.sortableDropzoneClass); + }); + } + }; + + [ + 'onChoose', + 'onStart', + 'onEnd', + 'onAdd', + 'onUpdate', + 'onSort', + 'onRemove', + 'onChange', + 'onUnchoose', + //'onMove' + ].forEach(name => { + defaultSortableOptions[name] = function(e){ + // onMove is the only event where e.item does not exist + // -> e.related is the element that is moved by the dragged one + let target = e.item || e.related; + let module = target.getData('module'); + + switch(name){ + case 'onStart': + // Element dragging started + // -> save initial sort state -> see store.set() + this.save(); + + // highlight valid grid areas where module could be dropped + let sortTargetAreas = module.config.sortTargetAreas || []; + tabContent.querySelectorAll('.' + Util.getMapTabContentAreaClass()).forEach(gridArea => { + if(sortTargetAreas.includes(gridArea.getAttribute('data-area'))){ + gridArea.classList.add(config.sortableDropzoneClass); + }else{ + gridArea.classList.remove(config.sortableDropzoneClass); + } + }); + break; + case 'onEnd': + // remove highlight grid areas + tabContent.querySelectorAll('.' + Util.getMapTabContentAreaClass()).forEach(gridArea => { + gridArea.classList.remove(config.sortableDropzoneClass); + }); + break; + + } + // pipe events to module + module.handle('onSortableEvent', name, e); + }; }); - // toggle height for a module - contentStructure.on('click.toggleModuleHeight', '.' + config.moduleClass, function(e){ - let moduleElement = $(this); - // get click position - let posX = moduleElement.offset().left; - let posY = moduleElement.offset().top; - let clickX = e.pageX - posX; - let clickY = e.pageY - posY; + /** + * sortable map modules + */ + tabContent.querySelectorAll('.' + Util.getMapTabContentAreaClass()).forEach(gridArea => { - // check for top-left click - if(clickX <= 9 && clickY <= 9 && clickX >= 0 && clickY >= 0){ + let sortable = Sortable.create(gridArea, Object.assign({}, defaultSortableOptions, { + group: { + name: 'area_' + gridArea.getAttribute('data-area'), + pull: (to, from, dragEl, e) => { + // set allowed droppable target areas for module + let module = dragEl.getData('module'); + return (module.config.sortTargetAreas || []).map(area => 'area_' + area); + }, + put: (to, from, dragEl, e) => { + return true; + } + } + })); + }); + + /** + * toggle module height + * @param e + */ + let toggleModuleHeight = e => { + if( + e.target.classList.contains(config.moduleClass) && + e.layerX <= 9 && e.layerY <= 9 && e.layerX >= 0 && e.layerY >= 0 + ){ + e.stopPropagation(); + let moduleElement = e.target; // remember height - if( !moduleElement.data('origHeight') ){ - moduleElement.data('origHeight', moduleElement.outerHeight()); + if(!moduleElement.dataset.origHeight){ + moduleElement.dataset.origHeight = moduleElement.offsetHeight; } - if(moduleElement.hasClass(config.moduleClosedClass)){ - let moduleHeight = moduleElement.data('origHeight'); - moduleElement.velocity('finish').velocity({ - height: [ moduleHeight + 'px', [ 400, 15 ] ] + if(moduleElement.classList.contains(config.moduleCollapsedClass)){ + $(moduleElement).velocity('finish').velocity({ + height: [moduleElement.dataset.origHeight + 'px', [400, 15]] },{ duration: 400, easing: 'easeOutSine', - complete: function(moduleElement){ - moduleElement = $(moduleElement); - moduleElement.removeClass(config.moduleClosedClass); - moduleElement.removeData('origHeight'); - moduleElement.css({height: ''}); + complete: moduleElement => { + moduleElement[0].classList.remove(config.moduleCollapsedClass); + delete moduleElement[0].dataset.origHeight; + moduleElement[0].style.height = null; } }); }else{ - moduleElement.velocity('finish').velocity({ - height: [ '35px', [ 400, 15 ] ] + $(moduleElement).velocity('finish').velocity({ + height: ['38px', [400, 15]] },{ duration: 400, easing: 'easeOutSine', - complete: function(moduleElement){ - moduleElement = $(moduleElement); - moduleElement.addClass(config.moduleClosedClass); + complete: moduleElement => { + moduleElement[0].classList.add(config.moduleCollapsedClass); } }); } } - }); + }; + + EventHandler.addEventListener(tabContent, 'click.toggleModuleHeight', toggleModuleHeight, {passive: false}); }; /** - * load all structure elements into a TabsContent div (tab body) - * @param tabContentElements + * get grid item (area) elements for map tab content + * @returns {[]} */ - let initContentStructure = (tabContentElements) => { - tabContentElements.each(function(){ - let tabContentElement = $(this); - let mapId = parseInt( tabContentElement.attr('data-mapid') ); + let getTabContentAreaElements = () => { + let gridAreas = []; + for(let areaAlias of Util.config.mapTabContentAreaAliases){ + let gridArea = document.createElement('div'); + gridArea.classList.add(Util.getMapTabContentAreaClass(), Util.getMapTabContentAreaClass(areaAlias)); + gridArea.setAttribute('data-area', areaAlias); - // "add" tab does not need a structure and observer... - if(mapId > 0){ - let contentStructure = $('
    ', { - class: ['row', config.mapTabContentRow].join(' ') - }).append( - $('
    ', { - class: ['col-xs-12', 'col-md-8', config.mapTabContentCellFirst, config.mapTabContentCell].join(' ') - }).attr('data-position', 1) - ).append( - $('
    ', { - class: ['col-xs-12', 'col-md-4', config.mapTabContentCellSecond, config.mapTabContentCell].join(' ') - }).attr('data-position', 2) - ); - - // append grid structure - tabContentElement.append(contentStructure); - - // set content structure observer - setContentStructureObserver(contentStructure, mapId); - } - }); + gridAreas.push(gridArea); + } + return gridAreas; }; /** - * get a fresh tab element - * @param options - * @param currentUserData - * @returns {*|jQuery|HTMLElement} + * new tabs element + * @returns {HTMLDivElement} */ - let getMapTabElement = (options, currentUserData) => { - let tabElement = $('
    ', { + let newMapTabsElement = () => { + let tabEl = Object.assign(document.createElement('div'), { id: config.mapTabElementId }); - let tabBar = $('
    ', { - id: Util.getTableId(config.tableId, 'systems', mapData.config.id, ''), - class: ['compact', 'stripe', 'order-column', 'row-border'].join(' ') - }); - systemsElement.append(systemTable); + if(tableApi){ + tableApi.clear(); + tableApi.rows.add(mapData.data.systems); + tableApi.draw(); + }else{ + let systemsElement = $(this); - systemsElement.showLoadingAnimation(config.loadingOptions); + let systemTable = $('
    ', { + id: Util.getTableId(config.tableId, 'systems', mapData.config.id), + class: ['compact', 'stripe', 'order-column', 'row-border'].join(' ') + }); + systemsElement.append(systemTable); - systemTable.on('init.dt', function(){ - systemsElement.hideLoadingAnimation(); + systemsElement.showLoadingAnimation(config.loadingOptions); - // init table tooltips - let tooltipElements = systemsElement.find('[data-toggle="tooltip"]'); - tooltipElements.tooltip(); - }); - - let systemsDataTable = systemTable.DataTable({ - pageLength: 20, - paging: true, - lengthMenu: [[5, 10, 20, 50, -1], [5, 10, 20, 50, 'All']], - ordering: true, - order: [15, 'desc'], - hover: false, - data: mapData.data.systems, - columnDefs: [], - language: { - emptyTable: 'Map is empty', - zeroRecords: 'No systems found', - lengthMenu: 'Show _MENU_ systems', - info: 'Showing _START_ to _END_ of _TOTAL_ systems' - }, - columns: [ - { - name: 'type', - title: 'type', - width: 25, - className: ['min-screen-l'].join(' '), - data: 'type', - render: { - _: (cellData, type, rowData, meta) => { - return MapUtil.getSystemTypeInfo(cellData.id, 'name'); - } - } - },{ - name: 'security', - title: '', - width: 1, - data: 'security', - render: { - display: (cellData, type, rowData, meta) => { - let securityClass = Util.getSecurityClassForSystem(cellData); - return '' + cellData + ''; - } - } - },{ - name: 'trueSec', - title: 'sec', - width: 18, - className: ['text-center', 'min-screen-l'].join(' '), - searchable: false, - data: 'trueSec', - render: { - display: (cellData, type, rowData, meta) => { - let systemTrueSecClass = Util.getTrueSecClassForSystem(cellData); - return '' + cellData.toFixed(1) + ''; - } - } - },{ - name: 'shattered', - title: '', - width: 10, - className: ['text-center', 'min-screen-l'].join(' '), - searchable: false, - data: 'shattered', - render: { - display: (cellData, type, rowData, meta) => { - let value = ''; - if(cellData){ - value = ''; + let systemsDataTable = systemTable.DataTable({ + pageLength: 20, + paging: true, + lengthMenu: [[5, 10, 20, 50, -1], [5, 10, 20, 50, 'All']], + ordering: true, + order: [15, 'desc'], + hover: false, + data: mapData.data.systems, + columnDefs: [], + language: { + emptyTable: 'Map is empty', + zeroRecords: 'No systems found', + lengthMenu: 'Show _MENU_ systems', + info: 'Showing _START_ to _END_ of _TOTAL_ systems' + }, + columns: [ + { + name: 'type', + title: 'type', + width: 25, + className: ['min-screen-l'].join(' '), + data: 'type', + render: { + _: (cellData, type, rowData, meta) => { + return MapUtil.getSystemTypeInfo(cellData.id, 'name'); } - return value; } - } - },{ - name: 'name', - title: 'system', - data: 'name', - className: [config.tableCellLinkClass].join(' '), - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - // select system - $(cell).on('click', function(e){ - Util.triggerMenuAction(Util.getMapModule().getActiveMap(), 'SelectSystem', {systemId: rowData.id}); - }); - } - },{ - name: 'alias', - title: 'alias', - data: 'alias', - render: { - _: (cellData, type, rowData, meta) => { - return (cellData === rowData.name) ? '' : cellData; - } - } - },{ - name: 'region', - title: 'region', - data: 'region.name', - className: 'min-screen-l', - },{ - name: 'sovereignty', - title: 'sov.', - width: 30, - className: 'text-center', - data: 'sovereignty.alliance.ticker', - defaultContent: '', - render: { - display: (cellData, type, rowData, meta) => { - let value = ''; - if(cellData){ - value = '<' + cellData + '>'; + },{ + name: 'security', + title: '', + width: 1, + data: 'security', + render: { + display: (cellData, type, rowData, meta) => { + let securityClass = Util.getSecurityClassForSystem(cellData); + return '' + cellData + ''; } - return value; } - } - },{ - name: 'planets', - title: '', - width: 10, - className: ['text-right', config.systemInfoPlanetsClass, Util.config.helpDefaultClass, Util.config.popoverTriggerClass].join(' '), - searchable: false, - orderSequence: ['desc', 'asc'], - data: 'planets', - render: { - _: (cellData, type, rowData, meta) => { - return cellData.length; - } - } - },{ - name: 'status', - title: '', - width: 10, - className: 'text-center', - searchable: false, - data: 'status.id', - render: { - display: (cellData, type, rowData, meta) => { - let value = ''; - let systemStatusClass = Util.getStatusInfoForSystem(cellData, 'class'); - if(systemStatusClass !== ''){ - value = ''; + },{ + name: 'trueSec', + title: 'sec', + width: 18, + className: ['text-center', 'min-screen-l'].join(' '), + searchable: false, + data: 'trueSec', + render: { + display: (cellData, type, rowData, meta) => { + let systemTrueSecClass = Util.getTrueSecClassForSystem(cellData); + return '' + cellData.toFixed(1) + ''; } - return value; } - } - },{ - name: 'effect', - title: '', - width: 10, - className: 'text-center', - searchable: false, - data: 'effect', - render: { - display: (cellData, type, rowData, meta) => { - let value = ''; - let systemEffectClass = MapUtil.getEffectInfoForSystem(cellData, 'class'); - if(systemEffectClass !== ''){ - value = ''; - } - return value; - } - } - },{ - name: 'statics', - title: 'statics', - width: 30, - searchable: false, - data: 'statics', - render: { - _: (cellData, type, rowData, meta) => { - let statics = []; - for(let wormholeName of cellData){ - let wormholeData = Object.assign({}, Init.wormholes[wormholeName]); - statics.push('' + wormholeData.security + ''); - } - return statics.join('  '); - } - } - },{ - name: 'position', - title: '', - width: 8, - className: 'text-center', - searchable: false, - data: 'currentUser', - defaultContent: false, - render: { - display: (cellData, type, rowData, meta) => { - let value = ''; - if(cellData === true){ - value = ''; - } - return value; - } - } - },{ - name: 'userCount', - title: '', - width: 12, - className: 'text-center', - searchable: false, - data: 'userCount', - render: { - display: (cellData, type, rowData, meta) => { - let value = ''; - if(cellData > 0){ - value = cellData; - } - return value; - } - } - },{ - name: 'locked', - title: '', - width: 10, - className: 'text-center', - searchable: false, - data: 'locked', - render: { - display: (cellData, type, rowData, meta) => { - let value = ''; - if(cellData === 1){ - value = ''; - } - return value; - } - } - },{ - name: 'updated', - title: 'updated', - width: 80, - searchable: false, - className: ['text-right', config.tableCellCounterClass].join(' '), - data: 'updated.updated', - defaultContent: '', - },{ - name: 'action', - title: '', - orderable: false, - searchable: false, - width: 10, - className: ['text-center', config.tableCellActionClass].join(' '), - data: null, - defaultContent: '', - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - let tempTableElement = this; - - let confirmationSettings = { - placement: 'left', - title: 'Delete system', - template: Util.getConfirmationTemplate(null, { - size: 'small', - noTitle: true - }), - onConfirm: function(e, target){ - let deleteRowElement = $(target).parents('tr'); - - let activeMap = Util.getMapModule().getActiveMap(); - let systemElement = $('#' + MapUtil.getSystemId(mapData.config.id, rowData.id) ); - - if(systemElement.length){ - // trigger system delete event - activeMap.trigger('pf:deleteSystems', [{ - systems: [systemElement[0]], - callback: function(deletedSystems){ - // callback function after ajax "delete" success - // check if system was deleted - if(deletedSystems.length === 1){ - // remove table row - tempTableElement.DataTable().rows(deleteRowElement).remove().draw(); - - Util.showNotify({title: 'System deleted', text: rowData.name, type: 'success'}); - - // refresh connection table (connections might have changed) -------------- - let connectionsElement = $('#' + config.mapInfoConnectionsId); - let mapDataNew = activeMap.getMapDataFromClient(['hasId']); - - connectionsElement.initConnectionInfoTable(mapDataNew); - }else{ - // error - Util.showNotify({title: 'Failed to delete system', text: rowData.name, type: 'error'}); - } - } - }]); + },{ + name: 'shattered', + title: '', + width: 10, + className: ['text-center', 'min-screen-l'].join(' '), + searchable: false, + data: 'shattered', + render: { + display: (cellData, type, rowData, meta) => { + let value = ''; + if(cellData){ + value = ''; } + return value; } - }; + } + },{ + name: 'name', + title: 'system', + data: 'name', + className: [config.tableCellLinkClass].join(' '), + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + // select system + $(cell).on('click', function(e){ + Util.triggerMenuAction(Util.getMapModule().getActiveMap(), 'SelectSystem', {systemId: rowData.id}); + }); + } + },{ + name: 'alias', + title: 'alias', + data: 'alias', + render: { + _: (cellData, type, rowData, meta) => { + return (cellData === rowData.name) ? '' : cellData; + } + } + },{ + name: 'region', + title: 'region', + data: 'region.name', + className: 'min-screen-l', + },{ + name: 'sovereignty', + title: 'sov.', + width: 30, + className: 'text-center', + data: 'sovereignty.alliance.ticker', + defaultContent: '', + render: { + display: (cellData, type, rowData, meta) => { + let value = ''; + if(cellData){ + value = '<' + cellData + '>'; + } + return value; + } + } + },{ + name: 'planets', + title: '', + width: 10, + className: ['text-right', config.systemInfoPlanetsClass, Util.config.helpDefaultClass, Util.config.popoverTriggerClass].join(' '), + searchable: false, + orderSequence: ['desc', 'asc'], + data: 'planets', + render: { + _: (cellData, type, rowData, meta) => { + return cellData.length; + } + } + },{ + name: 'status', + title: '', + width: 10, + className: 'text-center', + searchable: false, + data: 'status.id', + render: { + display: (cellData, type, rowData, meta) => { + let value = ''; + let systemStatusClass = Util.getStatusInfoForSystem(cellData, 'class'); + if(systemStatusClass !== ''){ + value = ''; + } + return value; + } + } + },{ + name: 'effect', + title: '', + width: 10, + className: 'text-center', + searchable: false, + data: 'effect', + render: { + display: (cellData, type, rowData, meta) => { + let value = ''; + let systemEffectClass = MapUtil.getEffectInfoForSystem(cellData, 'class'); + if(systemEffectClass !== ''){ + value = ''; + } + return value; + } + } + },{ + name: 'statics', + title: 'statics', + width: 30, + searchable: false, + data: 'statics', + render: { + _: (cellData, type, rowData, meta) => { + let statics = []; + for(let wormholeName of cellData){ + let wormholeData = Object.assign({}, Init.wormholes[wormholeName]); + statics.push('' + wormholeData.security + ''); + } + return statics.join('  '); + } + } + },{ + name: 'position', + title: '', + width: 8, + className: 'text-center', + searchable: false, + data: 'currentUser', + defaultContent: false, + render: { + display: (cellData, type, rowData, meta) => { + let value = ''; + if(cellData === true){ + value = ''; + } + return value; + } + } + },{ + name: 'userCount', + title: '', + width: 12, + className: 'text-center', + searchable: false, + data: 'userCount', + render: { + display: (cellData, type, rowData, meta) => { + let value = ''; + if(cellData > 0){ + value = cellData; + } + return value; + } + } + },{ + name: 'locked', + title: '', + width: 10, + className: 'text-center', + searchable: false, + data: 'locked', + render: { + display: (cellData, type, rowData, meta) => { + let value = ''; + if(cellData === 1){ + value = ''; + } + return value; + } + } + },{ + name: 'updated', + title: 'updated', + width: 80, + searchable: false, + className: ['text-right', config.tableCellCounterClass].join(' '), + data: 'updated.updated', + defaultContent: '', + },{ + name: 'action', + title: '', + orderable: false, + searchable: false, + width: 10, + className: ['text-center', config.tableCellActionClass].join(' '), + data: null, + defaultContent: '', + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let tempTableElement = this; - // init confirmation dialog - $(cell).confirmation(confirmationSettings); + let confirmationSettings = { + placement: 'left', + title: '---', + template: Util.getConfirmationTemplate(null, { + size: 'small', + noTitle: true + }), + onConfirm: function(e, target){ + let deleteRowElement = $(target).parents('tr'); + + let activeMap = Util.getMapModule().getActiveMap(); + let systemElement = $('#' + MapUtil.getSystemId(mapData.config.id, rowData.id) ); + + if(systemElement.length){ + // trigger system delete event + activeMap.trigger('pf:deleteSystems', [{ + systems: [systemElement[0]], + callback: function(deletedSystems){ + // callback function after ajax "delete" success + // check if system was deleted + if(deletedSystems.length === 1){ + // remove table row + tempTableElement.DataTable().rows(deleteRowElement).remove().draw(); + + Util.showNotify({title: 'System deleted', text: rowData.name, type: 'success'}); + + // refresh connection table (connections might have changed) -------------- + let connectionsElement = $('#' + config.mapInfoConnectionsId); + let mapDataNew = activeMap.getMapDataFromClient(['hasId']); + + connectionsElement.initConnectionInfoTable(mapDataNew); + }else{ + // error + Util.showNotify({title: 'Failed to delete system', text: rowData.name, type: 'error'}); + } + } + }]); + } + } + }; + + // init confirmation dialog + $(cell).confirmation(confirmationSettings); + } } - } - ], - initComplete: function(settings){ - Counter.initTableCounter(this, ['updated:name']); - } - }); + ], + initComplete: function(settings){ + systemsElement.hideLoadingAnimation(); + systemsElement.initTooltips({container: '.modal'}); + Counter.initTableCounter(this, ['updated:name']); + } + }); + } }; /** @@ -518,179 +513,180 @@ define([ * @param mapData */ $.fn.initConnectionInfoTable = function(mapData){ - let connectionsElement = $(this).empty(); + let tableApi = Util.getDataTableInstance(config.tableId, mapData.config.id, '', 'connections'); - let connectionTable = $('
    ', { - class: ['compact', 'stripe', 'order-column', 'row-border'].join(' ') - }); - connectionsElement.append(connectionTable); + if(tableApi){ + tableApi.clear(); + tableApi.rows.add(mapData.data.connections); + tableApi.draw(); + }else{ + let connectionsElement = $(this); - connectionsElement.showLoadingAnimation(config.loadingOptions); + let connectionTable = $('
    ', { + id: Util.getTableId(config.tableId, 'connections', mapData.config.id), + class: ['compact', 'stripe', 'order-column', 'row-border'].join(' ') + }); + connectionsElement.append(connectionTable); - // table init complete - connectionTable.on('init.dt', function(){ - connectionsElement.hideLoadingAnimation(); + connectionsElement.showLoadingAnimation(config.loadingOptions); - // init table tooltips - let tooltipElements = connectionsElement.find('[data-toggle="tooltip"]'); - tooltipElements.tooltip(); - }); - - // connections table ------------------------------------------------------------------------------------------ - let connectionDataTable = connectionTable.dataTable({ - pageLength: 20, - paging: true, - lengthMenu: [[5, 10, 20, 50, -1], [5, 10, 20, 50, 'All']], - ordering: true, - order: [ 6, 'desc' ], - autoWidth: false, - hover: false, - data: mapData.data.connections, - columnDefs: [], - language: { - emptyTable: 'No connections', - zeroRecords: 'No connections found', - lengthMenu: 'Show _MENU_ connections', - info: 'Showing _START_ to _END_ of _TOTAL_ connections' - }, - columns: [ - { - name: 'scope', - title: 'scope', - width: 50, - orderable: true, - data: 'scope', - render: { - display: (cellData, type, rowData, meta) => { - return MapUtil.getScopeInfoForConnection(cellData, 'label'); - } - } - },{ - name: 'sourceName', - title: 'source system', - data: 'sourceName', - className: [config.tableCellLinkClass].join(' '), - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - // select system - $(cell).on('click', function(e){ - Util.triggerMenuAction(Util.getMapModule().getActiveMap(), 'SelectSystem', {systemId: rowData.source}); - }); - } - },{ - name: 'sourceBubble', - title: '', - width: 10, - data: 'endpoints.source', - className: 'text-right', - render: { - display: (cellData, type, rowData, meta) => { - let value = ''; - if(cellData.types.includes('bubble')){ - value = ''; - } - return value; - } - } - },{ - name: 'connection', - title: 'connection', - width: 80, - className: 'text-center', - orderable: false, - searchable: false, - data: 'type', - render: { - display: (cellData, type, rowData, meta) => { - let connectionClasses = MapUtil.getConnectionFakeClassesByTypes(cellData); - connectionClasses = connectionClasses.join(' '); - return '
    '; - } - } - },{ - name: 'targetBubble', - title: '', - width: 10, - data: 'endpoints.target', - className: 'text-left', - render: { - display: (cellData, type, rowData, meta) => { - let value = ''; - if(cellData.types.includes('bubble')){ - value = ''; - } - return value; - } - } - },{ - name: 'targetName', - title: 'target system', - data: 'targetName', - className: [config.tableCellLinkClass].join(' '), - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - // select system - $(cell).on('click', function(e){ - Util.triggerMenuAction(Util.getMapModule().getActiveMap(), 'SelectSystem', {systemId: rowData.target}); - }); - } - },{ - name: 'updated', - title: 'updated', - width: 80, - searchable: false, - className: ['text-right', config.tableCellCounterClass].join(' '), - data: 'updated', - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - if(rowData.scope.scope_sort === 'wh'){ - // highlight cell - let diff = new Date().getTime() - cellData * 1000; - let dateDiff = new Date(diff); - if(dateDiff.getUTCDate() > 1){ - $(cell).addClass('txt-color txt-color-warning'); + // connections table ------------------------------------------------------------------------------------------ + let connectionDataTable = connectionTable.dataTable({ + pageLength: 20, + paging: true, + lengthMenu: [[5, 10, 20, 50, -1], [5, 10, 20, 50, 'All']], + ordering: true, + order: [ 6, 'desc' ], + autoWidth: false, + hover: false, + data: mapData.data.connections, + columnDefs: [], + language: { + emptyTable: 'No connections', + zeroRecords: 'No connections found', + lengthMenu: 'Show _MENU_ connections', + info: 'Showing _START_ to _END_ of _TOTAL_ connections' + }, + columns: [ + { + name: 'scope', + title: 'scope', + width: 50, + orderable: true, + data: 'scope', + render: { + display: (cellData, type, rowData, meta) => { + return MapUtil.getScopeInfoForConnection(cellData, 'label'); } } - } - },{ - name: 'action', - title: '', - orderable: false, - searchable: false, - width: 10, - className: ['text-center', config.tableCellActionClass].join(' '), - data: null, - defaultContent: '', - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - let tempTableElement = this; - - let confirmationSettings = { - placement: 'left', - title: 'Delete connection', - template: Util.getConfirmationTemplate(null, { - size: 'small', - noTitle: true - }), - onConfirm: function(e, target){ - let deleteRowElement = $(target).parents('tr'); - - // deleteSignatures(row); - let connection = $().getConnectionById(mapData.config.id, rowData.id); - - MapUtil.deleteConnections([connection], () => { - // callback function after ajax "delete" success - // remove table row - tempTableElement.DataTable().rows(deleteRowElement).remove().draw(); - }); + },{ + name: 'sourceName', + title: 'source system', + data: 'sourceName', + className: [config.tableCellLinkClass].join(' '), + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + // select system + $(cell).on('click', function(e){ + Util.triggerMenuAction(Util.getMapModule().getActiveMap(), 'SelectSystem', {systemId: rowData.source}); + }); + } + },{ + name: 'sourceBubble', + title: '', + width: 10, + data: 'endpoints.source', + className: 'text-right', + render: { + display: (cellData, type, rowData, meta) => { + let value = ''; + if(cellData.types.includes('bubble')){ + value = ''; + } + return value; } - }; + } + },{ + name: 'connection', + title: 'connection', + width: 80, + className: 'text-center', + orderable: false, + searchable: false, + data: 'type', + render: { + display: (cellData, type, rowData, meta) => { + let connectionClasses = MapUtil.getConnectionFakeClassesByTypes(cellData); + connectionClasses = connectionClasses.join(' '); + return '
    '; + } + } + },{ + name: 'targetBubble', + title: '', + width: 10, + data: 'endpoints.target', + className: 'text-left', + render: { + display: (cellData, type, rowData, meta) => { + let value = ''; + if(cellData.types.includes('bubble')){ + value = ''; + } + return value; + } + } + },{ + name: 'targetName', + title: 'target system', + data: 'targetName', + className: [config.tableCellLinkClass].join(' '), + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + // select system + $(cell).on('click', function(e){ + Util.triggerMenuAction(Util.getMapModule().getActiveMap(), 'SelectSystem', {systemId: rowData.target}); + }); + } + },{ + name: 'updated', + title: 'updated', + width: 80, + searchable: false, + className: ['text-right', config.tableCellCounterClass].join(' '), + data: 'updated', + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + if(rowData.scope.scope_sort === 'wh'){ + // highlight cell + let diff = new Date().getTime() - cellData * 1000; + let dateDiff = new Date(diff); + if(dateDiff.getUTCDate() > 1){ + $(cell).addClass('txt-color txt-color-warning'); + } + } + } + },{ + name: 'action', + title: '', + orderable: false, + searchable: false, + width: 10, + className: ['text-center', config.tableCellActionClass].join(' '), + data: null, + defaultContent: '', + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let tempTableElement = this; - // init confirmation dialog - $(cell).confirmation(confirmationSettings); + let confirmationSettings = { + placement: 'left', + title: '---', + template: Util.getConfirmationTemplate(null, { + size: 'small', + noTitle: true + }), + onConfirm: function(e, target){ + let deleteRowElement = $(target).parents('tr'); + + let connection = $().getConnectionById(mapData.config.id, rowData.id); + MapUtil.deleteConnections([connection], () => { + // callback function after ajax "delete" success + // remove table row + tempTableElement.DataTable().rows(deleteRowElement).remove().draw(); + }); + } + }; + + // init confirmation dialog + $(cell).confirmation(confirmationSettings); + } } + ], + initComplete: function(settings){ + connectionsElement.hideLoadingAnimation(); + connectionsElement.initTooltips({container: '.modal'}); + + Counter.initTableCounter(this, ['updated:name']); } - ], - initComplete: function(settings){ - Counter.initTableCounter(this, ['updated:name']); - } - }); + }); + } }; /** @@ -707,17 +703,6 @@ define([ usersElement.showLoadingAnimation(config.loadingOptions); - // table init complete - userTable.on('init.dt', function(){ - usersElement.hideLoadingAnimation(); - - // init table tooltips - let tooltipElements = usersElement.find('[data-toggle="tooltip"]'); - tooltipElements.tooltip({ - container: usersElement.parent() - }); - }); - // users table ------------------------------------------------------------------------------------------------ // prepare users data for dataTables let currentMapUserData = Util.getCurrentMapUserData( mapData.config.id ); @@ -927,7 +912,11 @@ define([ } } } - ] + ], + initComplete: function(settings){ + usersElement.hideLoadingAnimation(); + usersElement.initTooltips({container: '.modal'}); + } }); }; @@ -1017,7 +1006,7 @@ define([ // get to last page (pageIndex starts at zero) -> check if last page > 0 context.tableApi.page(newPageIndex).draw(false); }else{ - Util.showNotify({title: 'No logs found', text: 'No more entries', type: 'danger'}); + Util.showNotify({title: 'No logs found', text: 'No more entries', type: 'warning'}); } }; @@ -1069,20 +1058,35 @@ define([ title: '', width: 100, className: ['text-right'].join(' '), - data: 'datetime.date', + data: 'datetime', render: { _: function(data, type, row, meta){ - // strip microseconds - let logDateString = data.substring(0, 19); - let logDate = new Date(logDateString.replace(/-/g, '/')); - data = Util.convertDateToString(logDate, true); - - // check whether log is new (today) -> - if(logDate.setHours(0,0,0,0) === serverHours){ - // replace dd/mm/YYYY - data = 'today' + data.substring(10); + let value = ''; + let logDateString; + if(typeof data === 'string' && data.length){ + // NEW: > v1.5.5 e.g: '2019-12-09T22:07:01.382455+00:00' + logDateString = data; + }else if(data && data.date){ + // OLD: <= v1.5.5 object data.date: '2019-12-09 14:50:46.608484' + logDateString = data.date; } - return data; + + if(logDateString){ + logDateString = logDateString + .substring(0, 19) + .replace(/-/g, '/') + .replace(/T/g, ' '); + let logDate = new Date(logDateString); + value = Util.convertDateToString(logDate, true); + + // check whether log is new (today) -> + if(logDate.setHours(0,0,0,0) === serverHours){ + // replace dd/mm/YYYY + value = 'today' + value.substring(10); + } + } + + return value; } } },{ @@ -1287,7 +1291,7 @@ define([ // "log" tab -> get "Origin", not all config options are set in mapData let mapDataOrigin = Util.getCurrentMapData(mapData.config.id); - requirejs(['text!templates/dialog/map_info.html', 'mustache', 'datatables.loader'], (template, Mustache) => { + requirejs(['text!templates/dialog/map_info.html', 'mustache'], (template, Mustache) => { let data = { dialogSummaryContainerId: config.dialogMapInfoSummaryId, diff --git a/js/app/ui/dialog/map_settings.js b/js/app/ui/dialog/map_settings.js index 56389ea0..d5e89e6c 100644 --- a/js/app/ui/dialog/map_settings.js +++ b/js/app/ui/dialog/map_settings.js @@ -9,8 +9,9 @@ define([ 'app/render', 'bootbox', 'app/map/util', - 'app/module_map' -], ($, Init, Util, Render, bootbox, MapUtil, ModuleMap) => { + 'app/module_map', + 'app/map/overlay/util', +], ($, Init, Util, Render, bootbox, MapUtil, ModuleMap, MapOverlayUtil) => { 'use strict'; let config = { @@ -22,11 +23,13 @@ define([ dialogMapDownloadContainerId: 'pf-map-dialog-download', // id for the "download" container // new map form + newNameInputId: 'pf-map-dialog-new-name-input', // id for "name" input newIconSelectId: 'pf-map-dialog-new-icon-select', // id for "icon" select newScopeSelectId: 'pf-map-dialog-new-scope-select', // id for "scope" select newTypeSelectId: 'pf-map-dialog-new-type-select', // id for "type" select // edit map form + editNameInputId: 'pf-map-dialog-edit-name-input', // id for "name" input editIconSelectId: 'pf-map-dialog-edit-icon-select', // id for "icon" select editScopeSelectId: 'pf-map-dialog-edit-scope-select', // id for "scope" select editTypeSelectId: 'pf-map-dialog-edit-type-select', // id for "type" select @@ -97,141 +100,42 @@ define([ 'text!templates/form/map.html', 'mustache' ], (templateMapDialog, templateMapForm, Mustache) => { + let selectOption = value => () => (val, render) => { + if(render(val) === String(value)){ + return 'selected'; + } + }; let dialogTitle = 'Map settings'; // if there are no maps -> hide settings tab - let hideSettingsTab = false; - let hideEditTab = false; - let hideDownloadTab = false; + let hideEditTab = mapData === false; + let hideSettingsTab = mapData === false; + let hideDownloadTab = mapData === false; let hasRightMapCreate = true; - let hasRightMapUpdate = true; - let hasRightMapExport = true; - let hasRightMapImport = true; + let hasRightMapUpdate = MapUtil ? MapUtil.checkRight('map_update', mapData.config) : true; + let hasRightMapExport = MapUtil ? MapUtil.checkRight('map_export', mapData.config) : true; + let hasRightMapImport = MapUtil ? MapUtil.checkRight('map_import', mapData.config) : true; + let hasRightMapShare = MapUtil ? MapUtil.checkRight('map_share', mapData.config) : true; - if(mapData === false){ - hideSettingsTab = true; - hideEditTab = true; - hideDownloadTab = true; - }else{ - hasRightMapUpdate = MapUtil.checkRight('map_update', mapData.config); - hasRightMapExport = MapUtil.checkRight('map_export', mapData.config); - hasRightMapImport = MapUtil.checkRight('map_import', mapData.config); - } - - // available map "types" for a new or existing map - let mapTypes = MapUtil.getMapTypes(true); - - let mapFormData = { - select2Class: Util.config.select2Class, - scope: MapUtil.getMapScopes(), - type: mapTypes, - icon: MapUtil.getMapIcons(), - formErrorContainerClass: Util.config.formErrorContainerClass, - formWarningContainerClass: Util.config.formWarningContainerClass, - formInfoContainerClass: Util.config.formInfoContainerClass - }; - - // render "new map" tab content ----------------------------------------------------------------------- - let mapFormDataNew = $.extend({}, mapFormData, { - hasRightMapForm: hasRightMapCreate, - iconSelectId: config.newIconSelectId, - scopeSelectId: config.newScopeSelectId, - typeSelectId: config.newTypeSelectId - }); - let contentNewMap = Mustache.render(templateMapForm, mapFormDataNew); - - // render "edit map" tab content ---------------------------------------------------------------------- - let mapFormDataEdit = $.extend({}, mapFormData, { - hasRightMapForm: hasRightMapUpdate, - iconSelectId: config.editIconSelectId, - scopeSelectId: config.editScopeSelectId, - typeSelectId: config.editTypeSelectId - }); - let contentEditMap = Mustache.render(templateMapForm, mapFormDataEdit); - contentEditMap = $(contentEditMap); - - // current map access info - let accessCharacter = []; - let accessCorporation = []; - let accessAlliance = []; - let deleteExpiredConnections = true; - let deleteEolConnections = true; - let persistentAliases = true; - let persistentSignatures = true; - let trackAbyssalJumps = true; - - let logActivity = true; - let logHistory = true; - - let slackWebHookURL = ''; - let slackUsername = ''; - let slackIcon = ''; - let slackChannelHistory = ''; - let slackChannelRally = ''; - let slackEnabled = false; - let slackHistoryEnabled = false; - let slackRallyEnabled = false; - let slackSectionShow = false; - - let discordUsername = ''; - let discordWebHookURLRally = ''; - let discordWebHookURLHistory = ''; - let discordEnabled = false; - let discordRallyEnabled = false; - let discordHistoryEnabled = false; - let discordSectionShow = false; - - if(mapData !== false){ - // set current map information - contentEditMap.find('input[name="id"]').val( mapData.config.id ); - contentEditMap.find('select[name="icon"]').val( mapData.config.icon ); - contentEditMap.find('input[name="name"]').val( mapData.config.name ); - contentEditMap.find('select[name="scopeId"]').val( mapData.config.scope.id ); - contentEditMap.find('select[name="typeId"]').val( mapData.config.type.id ); - - accessCharacter = mapData.config.access.character; - accessCorporation = mapData.config.access.corporation; - accessAlliance = mapData.config.access.alliance; - - deleteExpiredConnections = mapData.config.deleteExpiredConnections; - deleteEolConnections = mapData.config.deleteEolConnections; - persistentAliases = mapData.config.persistentAliases; - persistentSignatures = mapData.config.persistentSignatures; - trackAbyssalJumps = mapData.config.trackAbyssalJumps; - - logActivity = mapData.config.logging.activity; - logHistory = mapData.config.logging.history; - - slackWebHookURL = mapData.config.logging.slackWebHookURL; - slackUsername = mapData.config.logging.slackUsername; - slackIcon = mapData.config.logging.slackIcon; - slackChannelHistory = mapData.config.logging.slackChannelHistory; - slackChannelRally = mapData.config.logging.slackChannelRally; - slackEnabled = Boolean(Util.getObjVal(Init, 'slack.status')); - slackHistoryEnabled = slackEnabled && Boolean(Util.getObjVal(Init.mapTypes, mapData.config.type.name + '.defaultConfig.send_history_slack_enabled')); - slackRallyEnabled = slackEnabled && Boolean(Util.getObjVal(Init.mapTypes, mapData.config.type.name + '.defaultConfig.send_rally_slack_enabled')); - slackSectionShow = (slackEnabled && slackWebHookURL.length > 0); - - discordUsername = Util.getObjVal(mapData, 'config.logging.discordUsername'); - discordWebHookURLRally = Util.getObjVal(mapData, 'config.logging.discordWebHookURLRally'); - discordWebHookURLHistory = Util.getObjVal(mapData, 'config.logging.discordWebHookURLHistory'); - discordEnabled = Boolean(Util.getObjVal(Init, 'discord.status')); - discordRallyEnabled = discordEnabled && Boolean(Util.getObjVal(Init.mapTypes, mapData.config.type.name + '.defaultConfig.send_rally_discord_enabled')); - discordHistoryEnabled = discordEnabled && Boolean(Util.getObjVal(Init.mapTypes, mapData.config.type.name + '.defaultConfig.send_history_discord_enabled')); - discordSectionShow = (discordEnabled && (discordWebHookURLRally.length > 0 || discordWebHookURLHistory.length > 0)); - - // remove "#" from Slack channels - slackChannelHistory = slackChannelHistory.indexOf('#') === 0 ? slackChannelHistory.substr(1) : slackChannelHistory; - slackChannelRally = slackChannelRally.indexOf('#') === 0 ? slackChannelRally.substr(1) : slackChannelRally; - } + // available map "type" options data + // -> for "new" map tab + let mapTypesCreate = MapUtil.getMapTypes(true, 'map_create'); + // -> for "edit" map tab + let mapTypesUpdate = MapUtil.getMapTypes(true, 'map_update'); // render main dialog --------------------------------------------------------------------------------- let mapDialogData = { id: config.newMapDialogId, mapData: mapData, - type: mapTypes, + type: mapTypesCreate, + select2Class: Util.config.select2Class, + + hasRightMapUpdate, + hasRightMapExport, + hasRightMapImport, + hasRightMapShare, // message container formErrorContainerClass: Util.config.formErrorContainerClass, @@ -249,9 +153,9 @@ define([ dialogMapSettingsContainerId: config.dialogMapSettingsContainerId, dialogMapDownloadContainerId: config.dialogMapDownloadContainerId, - hideEditTab: hideEditTab, - hideSettingsTab: hideSettingsTab, - hideDownloadTab: hideDownloadTab, + hideEditTab, + hideSettingsTab, + hideDownloadTab, // settings tab -------------- deleteExpiredConnectionsId : config.deleteExpiredConnectionsId, @@ -259,57 +163,59 @@ define([ persistentAliasesId : config.persistentAliasesId, persistentSignaturesId : config.persistentSignaturesId, trackAbyssalJumpsId : config.trackAbyssalJumpsId, - deleteExpiredConnections: deleteExpiredConnections, - deleteEolConnections: deleteEolConnections, - persistentAliases: persistentAliases, - persistentSignatures: persistentSignatures, - trackAbyssalJumps: trackAbyssalJumps, - logHistoryId: config.logHistoryId, logActivityId: config.logActivityId, - logActivity: logActivity, - logHistory: logHistory, + + deleteExpiredConnections: true, + deleteEolConnections: true, + persistentAliases: true, + persistentSignatures: true, + trackAbyssalJumps: true, + logActivity: true, + logHistory: true, slackWebHookURLId: config.slackWebHookURLId, slackUsernameId: config.slackUsernameId, slackIconId: config.slackIconId, slackChannelHistoryId: config.slackChannelHistoryId, slackChannelRallyId: config.slackChannelRallyId, - slackWebHookURL: slackWebHookURL, - slackUsername: slackUsername, - slackIcon: slackIcon, - slackChannelHistory: slackChannelHistory, - slackChannelRally: slackChannelRally, - slackEnabled: slackEnabled, - slackHistoryEnabled: slackHistoryEnabled, - slackRallyEnabled: slackRallyEnabled, - slackSectionShow: slackSectionShow, + + slackWebHookURL: '', + slackUsername: '', + slackIcon: '', + slackChannelHistory: '', + slackChannelRally: '', + slackEnabled: false, + slackHistoryEnabled: false, + slackRallyEnabled: false, + slackSectionShow: false, discordUsernameId: config.discordUsernameId, discordWebHookURLRallyId: config.discordWebHookURLRallyId, discordWebHookURLHistoryId: config.discordWebHookURLHistoryId, - discordUsername: discordUsername, - discordWebHookURLRally: discordWebHookURLRally, - discordWebHookURLHistory: discordWebHookURLHistory, - discordEnabled: discordEnabled, - discordRallyEnabled: discordRallyEnabled, - discordHistoryEnabled: discordHistoryEnabled, - discordSectionShow: discordSectionShow, + discordUsername: '', + discordWebHookURLRally: '', + discordWebHookURLHistory: '', + discordEnabled: false, + discordRallyEnabled: false, + discordHistoryEnabled: false, + discordSectionShow: false, + + // map access ---------------- characterSelectId: config.characterSelectId, corporationSelectId: config.corporationSelectId, allianceSelectId: config.allianceSelectId, - // map access objects -------- - accessCharacter: accessCharacter, - accessCorporation: accessCorporation, - accessAlliance: accessAlliance, - // access limitations -------- maxCharacter: Init.mapTypes.private.defaultConfig.max_shared, maxCorporation: Init.mapTypes.corporation.defaultConfig.max_shared, maxAlliance: Init.mapTypes.alliance.defaultConfig.max_shared, + accessCharacter: [], + accessCorporation: [], + accessAlliance: [], + // download tab -------------- dialogMapExportFormId: config.dialogMapExportFormId, dialogMapImportFormId: config.dialogMapImportFormId, @@ -319,25 +225,101 @@ define([ fieldImportId: config.fieldImportId, dialogMapImportInfoId: config.dialogMapImportInfoId, - hasRightMapUpdate: hasRightMapUpdate, - hasRightMapExport: hasRightMapExport, - hasRightMapImport: hasRightMapImport, - - formatFilename: function(){ - // format filename from "map name" (initial) - return function(mapName, render){ - let filename = render(mapName); - return formatFilename(filename); - }; - } + formatFilename: () => (mapName, render) => formatFilename(render(mapName)) }; + if(mapData !== false){ + Object.assign(mapDialogData, { + deleteExpiredConnections: mapData.config.deleteExpiredConnections, + deleteEolConnections: mapData.config.deleteEolConnections, + persistentAliases: mapData.config.persistentAliases, + persistentSignatures: mapData.config.persistentSignatures, + trackAbyssalJumps: mapData.config.trackAbyssalJumps, + logActivity: mapData.config.logging.activity, + logHistory: mapData.config.logging.history, + + slackWebHookURL: mapData.config.logging.slackWebHookURL, + slackUsername: mapData.config.logging.slackUsername, + slackIcon: mapData.config.logging.slackIcon, + slackChannelHistory: mapData.config.logging.slackChannelHistory, + slackChannelRally: mapData.config.logging.slackChannelRally, + slackEnabled: Boolean(Util.getObjVal(Init, 'slack.status')), + + discordUsername: Util.getObjVal(mapData, 'config.logging.discordUsername'), + discordWebHookURLRally: Util.getObjVal(mapData, 'config.logging.discordWebHookURLRally'), + discordWebHookURLHistory: Util.getObjVal(mapData, 'config.logging.discordWebHookURLHistory'), + discordEnabled: Boolean(Util.getObjVal(Init, 'discord.status')), + + accessCharacter: mapData.config.access.character, + accessCorporation: mapData.config.access.corporation, + accessAlliance: mapData.config.access.alliance + }); + + Object.assign(mapDialogData, { + // remove "#" from Slack channels + slackChannelHistory: mapDialogData.slackChannelHistory.indexOf('#') === 0 ? mapDialogData.slackChannelHistory.substr(1) : mapDialogData.slackChannelHistory, + slackChannelRally: mapDialogData.slackChannelRally.indexOf('#') === 0 ? mapDialogData.slackChannelRally.substr(1) : mapDialogData.slackChannelRally, + + slackHistoryEnabled: mapDialogData.slackEnabled && Boolean(Util.getObjVal(Init.mapTypes, mapData.config.type.name + '.defaultConfig.send_history_slack_enabled')), + slackRallyEnabled: mapDialogData.slackEnabled && Boolean(Util.getObjVal(Init.mapTypes, mapData.config.type.name + '.defaultConfig.send_rally_slack_enabled')), + slackSectionShow: (mapDialogData.slackEnabled && mapDialogData.slackWebHookURL.length > 0), + + discordRallyEnabled: mapDialogData.discordEnabled && Boolean(Util.getObjVal(Init.mapTypes, mapData.config.type.name + '.defaultConfig.send_rally_discord_enabled')), + discordHistoryEnabled: mapDialogData.discordEnabled && Boolean(Util.getObjVal(Init.mapTypes, mapData.config.type.name + '.defaultConfig.send_history_discord_enabled')), + discordSectionShow: (mapDialogData.discordEnabled && (mapDialogData.discordWebHookURLRally.length > 0 || mapDialogData.discordWebHookURLHistory.length > 0)), + }); + } + let contentDialog = Mustache.render(templateMapDialog, mapDialogData); contentDialog = $(contentDialog); - // set tab content + // "new map" + "edit map" tab base -------------------------------------------------------------------- + let mapFormData = { + select2Class: Util.config.select2Class, + scope: MapUtil.getMapScopes(), + icon: MapUtil.getMapIcons(), + formErrorContainerClass: Util.config.formErrorContainerClass, + formWarningContainerClass: Util.config.formWarningContainerClass, + formInfoContainerClass: Util.config.formInfoContainerClass + }; + + // render "new map" tab content ----------------------------------------------------------------------- + let mapFormDataNew = Object.assign({}, mapFormData, { + type: mapTypesCreate, + hasRightMapForm: hasRightMapCreate, + nameInputId: config.newNameInputId, + iconSelectId: config.newIconSelectId, + scopeSelectId: config.newScopeSelectId, + typeSelectId: config.newTypeSelectId, + + mapId: 0, + mapIcon: undefined, + mapName: undefined, + mapScopeId: undefined, + mapTypeId: undefined + }); + let contentNewMap = Mustache.render(templateMapForm, mapFormDataNew); $('#' + config.dialogMapNewContainerId, contentDialog).html(contentNewMap); - $('#' + config.dialogMapEditContainerId, contentDialog).html(contentEditMap); + + // render "edit map" tab content ---------------------------------------------------------------------- + if(!hideEditTab){ + let mapFormDataEdit = Object.assign({}, mapFormData, { + type: mapTypesUpdate, + hasRightMapForm: hasRightMapUpdate, + nameInputId: config.editNameInputId, + iconSelectId: config.editIconSelectId, + scopeSelectId: config.editScopeSelectId, + typeSelectId: config.editTypeSelectId, + + mapId: mapData.config.id, + mapIcon: selectOption(mapData.config.icon), + mapName: mapData.config.name, + mapScopeId: selectOption(mapData.config.scope.id), + mapTypeId: selectOption(mapData.config.type.id) + }); + let contentEditMap = Mustache.render(templateMapForm, mapFormDataEdit); + $('#' + config.dialogMapEditContainerId, contentDialog).html(contentEditMap); + } let mapInfoDialog = bootbox.dialog({ title: dialogTitle, @@ -351,7 +333,6 @@ define([ label: ' save', className: 'btn-success', callback: function(){ - // get the current active form let form = $('#' + config.newMapDialogId).find('form').filter(':visible'); @@ -371,9 +352,7 @@ define([ }); // check whether the form is valid - let formValid = form.isValidForm(); - - if(formValid === true){ + if(form.isValidForm()){ // lock dialog let dialogContent = mapInfoDialog.find('.modal-content'); dialogContent.showLoadingAnimation(); @@ -382,69 +361,39 @@ define([ let formData = form.getFormValues(); // add value prefixes (Slack channels) - let tmpVal; - if(typeof (tmpVal = Util.getObjVal(formData, 'slackChannelHistory')) === 'string' && tmpVal.length){ - formData.slackChannelHistory = '#' + tmpVal; - } - if(typeof (tmpVal = Util.getObjVal(formData, 'slackChannelRally')) === 'string' && tmpVal.length){ - formData.slackChannelRally = '#' + tmpVal; + Object.keys(formData).map((key, index) => { + if(['slackChannelHistory', 'slackChannelRally'].includes(key)) + formData[key] = (formData[key].length ? '#' : '') + formData[key]; + }); + + if(mapData){ + // no map data found -> probably new user + MapOverlayUtil.getMapOverlay(mapData.map.getContainer(), 'timer').startMapUpdateCounter(); } - // checkbox fix -> settings tab - if( form.find('#' + config.deleteExpiredConnectionsId).length ){ - formData.deleteExpiredConnections = formData.hasOwnProperty('deleteExpiredConnections') ? parseInt( formData.deleteExpiredConnections ) : 0; - } - if( form.find('#' + config.deleteEolConnectionsId).length ){ - formData.deleteEolConnections = formData.hasOwnProperty('deleteEolConnections') ? parseInt( formData.deleteEolConnections ) : 0; - } - if( form.find('#' + config.persistentAliasesId).length ){ - formData.persistentAliases = formData.hasOwnProperty('persistentAliases') ? parseInt( formData.persistentAliases ) : 0; - } - if( form.find('#' + config.persistentSignaturesId).length ){ - formData.persistentSignatures = formData.hasOwnProperty('persistentSignatures') ? parseInt( formData.persistentSignatures ) : 0; - } - if( form.find('#' + config.trackAbyssalJumpsId).length ){ - formData.trackAbyssalJumps = formData.hasOwnProperty('trackAbyssalJumps') ? parseInt( formData.trackAbyssalJumps ) : 0; - } - if( form.find('#' + config.logHistoryId).length ){ - formData.logHistory = formData.hasOwnProperty('logHistory') ? parseInt( formData.logHistory ) : 0; - } - if( form.find('#' + config.logActivityId).length ){ - formData.logActivity = formData.hasOwnProperty('logActivity') ? parseInt( formData.logActivity ) : 0; - } + let method = formData.id ? 'PATCH' : 'PUT'; - let requestData = {formData: formData}; - - $.ajax({ - type: 'POST', - url: Init.path.saveMap, - data: requestData, - dataType: 'json' - }).done(function(responseData){ - if(responseData.error.length){ - form.showFormMessage(responseData.error); - }else{ - // success - Util.showNotify({title: dialogTitle, text: 'Map: ' + responseData.mapData.mapData.name, type: 'success'}); + Util.request(method, 'Map', formData.id, formData, { + formElement: form // for error form messages + }, context => { + // always do + dialogContent.hideLoadingAnimation(); + }).then( + payload => { + let mapData = Util.getObjVal(payload, 'data.mapData'); + Util.showNotify({title: dialogTitle, text: `Map: ${Util.getObjVal(mapData, 'name')}`, type: 'success'}); // update map-tab Element - let tabLinkElement = Util.getMapModule().getMapTabElements(responseData.mapData.mapData.id); - - if(tabLinkElement.length === 1){ - ModuleMap.updateTabData(tabLinkElement, responseData.mapData.mapData); + let tabLinkEls = Util.getMapTabLinkElements(Util.getMapModule()[0], Util.getObjVal(mapData, 'id')); + if(tabLinkEls.length === 1){ + ModuleMap.updateTabData(tabLinkEls[0], mapData); } $(mapInfoDialog).modal('hide'); Util.triggerMenuAction(document, 'Close'); - } - }).fail(function(jqXHR, status, error){ - let reason = status + ' ' + error; - Util.showNotify({title: jqXHR.status + ': saveMap', text: reason, type: 'warning'}); - $(document).setProgramStatus('problem'); - - }).always(function(){ - dialogContent.hideLoadingAnimation(); - }); + }, + Util.handleAjaxErrorResponse + ); } return false; @@ -471,7 +420,8 @@ define([ // make
    ', { + class: ['compact', 'stripe', 'order-column', 'row-border', config.systemEffectTableClass].join(' ') }); - let systemEffectData = Util.getSystemEffectData(); + let tbody = $(''); + let thead = $(''); - // last active (hover) table columnName - let lastActiveColName = null; + let rows = []; - let colCount = 0; - for(let [effectName, effectData] of Object.entries(systemEffectData.wh)){ - colCount++; + // get formatted system effect name + let systemEffectName = MapUtil.getEffectInfoForSystem(effectName, 'name'); + let systemEffectClass = MapUtil.getEffectInfoForSystem(effectName, 'class'); - let table = $('
    ', { - class: ['compact', 'stripe', 'order-column', 'row-border', config.systemEffectTableClass].join(' ') - }); + for(let [areaId, areaData] of Object.entries(effectData)){ + let systemType = 'C' + areaId; + let securityClass = Util.getSecurityClassForSystem(systemType); - let tbody = $(''); - let thead = $(''); + if(areaId === '1'){ + rows.push( $('') ); + rows.push( $('') ); + thead.append( rows[0] ); + thead.append( rows[1] ); - let rows = []; + rows[0].append( + $('') ); - rows.push( $('') ); - thead.append( rows[0] ); - thead.append( rows[1] ); + tbody.append(rows[i + 2]); - rows[0].append( - $('') ); - tbody.append(rows[i + 2]); - - // add label - rows[i + 2].append( $('";return a+='",a+="",a+="",a+='",a+='",a+=""},r=0;t+="
    ').html('  ' + systemEffectName).prepend( + $('', { + class: ['fas', 'fa-square', systemEffectClass].join(' ') + }) + ) + ); - // get formatted system effect name - let systemEffectName = MapUtil.getEffectInfoForSystem(effectName, 'name'); - let systemEffectClass = MapUtil.getEffectInfoForSystem(effectName, 'class'); + rows[1].append($('')); + } - for(let [areaId, areaData] of Object.entries(effectData)){ - let systemType = 'C' + areaId; - let securityClass = Util.getSecurityClassForSystem(systemType); + rows[0].append( $('', { + class: ['text-right', 'col-xs-1', securityClass].join(' ') + }).text( systemType ).attr('data-name', systemType)); + rows[1].append( $('', { + class: ['text-right', 'txt-color', 'txt-color-grayLight'].join(' ') + }).text(Util.getSystemEffectMultiplierByAreaId(parseInt(areaId)) + ' x').attr('data-name', systemType)); + + for(let [i, data] of Object.entries(areaData)){ + i = parseInt(i); if(areaId === '1'){ rows.push( $('
    ').html('  ' + systemEffectName).prepend( - $('', { - class: ['fas', 'fa-square', systemEffectClass].join(' ') - }) - ) - ); - - rows[1].append($('')); + // add label + rows[i + 2].append( $('').text( data.effect )); } - rows[0].append( $('', { - class: ['text-right', 'col-xs-1', securityClass].join(' ') - }).text( systemType ).attr('data-name', systemType)); - rows[1].append( $('', { - class: ['text-right', 'txt-color', 'txt-color-grayLight'].join(' ') - }).text(Util.getSystemEffectMultiplierByAreaId(parseInt(areaId)) + ' x').attr('data-name', systemType)); - - for(let [i, data] of Object.entries(areaData)){ - i = parseInt(i); - if(areaId === '1'){ - rows.push( $('
    ').text( data.effect )); - } - - - rows[i + 2].append( $('', { - class: 'text-right' - }).text( data.value )); - } + rows[i + 2].append( $('', { + class: 'text-right' + }).text( data.value )); } - - let colElement = $('
    ', { - class: ['col-md-6'].join(' ') - }).append( - $('
    ', { - class: [Util.config.dynamicAreaClass].join(' ') - }).append( - table.append(thead).append(tbody) - ) - ); - - rowElement.append(colElement); - - // add clearfix after even col count - if(colCount % 2 === 0){ - rowElement.append( - $('
    ', { - class: ['clearfix', 'visible-md', 'visible-lg'].join(' ') - }) - ); - } - - cache.systemEffectDialog = rowElement; } - let effectsDialog = bootbox.dialog({ - className: config.systemEffectDialogClass, - title: 'System effect information', - message: cache.systemEffectDialog, - size: 'large', - show: false - }); + let colElement = $('
    ', { + class: ['col-md-6'].join(' ') + }).append( + $('
    ', { + class: [Util.config.dynamicAreaClass].join(' ') + }).append( + table.append(thead).append(tbody) + ) + ); - effectsDialog.on('show.bs.modal', function(e){ - let headerAll = $(); - let columnsAll = $(); + rowElement.append(colElement); - let removeColumnHighlight = () => { - headerAll.removeClass('colHighlight'); - columnsAll.removeClass('colHighlight'); - }; + // add clearfix after even col count + if(colCount % 2 === 0){ + rowElement.append( + $('
    ', { + class: ['clearfix', 'visible-md', 'visible-lg'].join(' ') + }) + ); + } - let tableApis = $(this).find('table').DataTable({ - pageLength: -1, - paging: false, - lengthChange: false, - ordering: false, - searching: false, - info: false, - columnDefs: [], - data: null, // use DOM data overwrites [] default -> data.loader.js - initComplete: function(settings, json){ - let tableApi = this.api(); + cache.systemEffectDialog = rowElement; + } - tableApi.tables().nodes().to$().on('mouseover', 'td', function(){ - // inside table cell -> get current hover colIndex - let colIndex = tableApi.cell(this).index().column; - let colName = tableApi.column(colIndex).header().dataset.name || ''; - - if(colName !== lastActiveColName){ - removeColumnHighlight(); - - lastActiveColName = colName; - - if(colName.length){ - // active column changed -> highlight same colName on other tables - let tableApis = $.fn.dataTable.tables({ visible: false, api: true }) - .tables('.' + config.systemEffectTableClass); - - let columns = tableApis.columns([colName + ':name']); - columns.header().flatten().to$().addClass('colHighlight'); - columns.nodes().flatten().to$().addClass('colHighlight'); - } - } - }).on('mouseleave', function(){ - // no longer inside table - lastActiveColName = null; - removeColumnHighlight(); - }); - } - }); - - // table cells will not change so we should cache them once - headerAll = tableApis.columns().header().to$(); - columnsAll = tableApis.cells().nodes().to$(); - }); - - effectsDialog.on('hide.bs.modal', function(e){ - // destroy logTable - $(this).find('table').DataTable().destroy(true); - }); - - effectsDialog.modal('show'); + let effectsDialog = bootbox.dialog({ + className: config.systemEffectDialogClass, + title: 'System effect information', + message: cache.systemEffectDialog, + size: 'large', + show: false }); + + effectsDialog.on('show.bs.modal', function(e){ + let headerAll = $(); + let columnsAll = $(); + + let removeColumnHighlight = () => { + headerAll.removeClass('colHighlight'); + columnsAll.removeClass('colHighlight'); + }; + + let tableApis = $(this).find('table').DataTable({ + pageLength: -1, + paging: false, + lengthChange: false, + ordering: false, + searching: false, + info: false, + columnDefs: [], + data: null, // use DOM data overwrites [] default -> data.loader.js + initComplete: function(settings, json){ + let tableApi = this.api(); + + tableApi.tables().nodes().to$().on('mouseover', 'td', function(){ + // inside table cell -> get current hover colIndex + let colIndex = tableApi.cell(this).index().column; + let colName = tableApi.column(colIndex).header().dataset.name || ''; + + if(colName !== lastActiveColName){ + removeColumnHighlight(); + + lastActiveColName = colName; + + if(colName.length){ + // active column changed -> highlight same colName on other tables + let tableApis = $.fn.dataTable.tables({ visible: false, api: true }) + .tables('.' + config.systemEffectTableClass); + + let columns = tableApis.columns([colName + ':name']); + columns.header().flatten().to$().addClass('colHighlight'); + columns.nodes().flatten().to$().addClass('colHighlight'); + } + } + }).on('mouseleave', function(){ + // no longer inside table + lastActiveColName = null; + removeColumnHighlight(); + }); + } + }); + + // table cells will not change so we should cache them once + headerAll = tableApis.columns().header().to$(); + columnsAll = tableApis.cells().nodes().to$(); + }); + + effectsDialog.on('hide.bs.modal', function(e){ + // destroy logTable + $(this).find('table').DataTable().destroy(true); + }); + + effectsDialog.modal('show'); }; }); \ No newline at end of file diff --git a/js/app/ui/form_element.js b/js/app/ui/form_element.js index 9817cc7d..814ed2de 100644 --- a/js/app/ui/form_element.js +++ b/js/app/ui/form_element.js @@ -25,12 +25,12 @@ define([ if(data.loading) return data.text; if(data.placeholder) return data.placeholder; - let markup = '
    '; + let markup = `
    `; if(data.hasOwnProperty('children')){ // category group label - markup += '
    ' + data.text + '
    '; - markup += '
    (' + data.children.length + ')
    '; + markup += `
    ${data.text}
    `; + markup += `
    (${data.children.length})
    `; }else{ let imagePath = ''; let iconName = ''; @@ -61,13 +61,13 @@ define([ } if(imagePath){ - thumb = ''; + thumb = ``; }else if(iconName){ - thumb = ''; + thumb = ``; } - markup += '
    ' + thumb + '
    '; - markup += '
    ' + data.text + '
    '; + markup += `
    ${thumb}
    `; + markup += `
    ${data.text}
    `; } markup += '
    '; @@ -90,8 +90,7 @@ define([ let name = parts[0]; let sizeLabel; if(Util.getObjVal(customOptions, 'showWhSizeLabel')){ - let wormholeSizeData = Util.getObjVal(Init, 'wormholes.' + name + '.size'); - sizeLabel = Util.getObjVal(wormholeSizeData, 'label') || ''; + sizeLabel = Util.getObjVal(Init, `wormholes.${name}.size.label`) || ''; } let securityClass = Util.getSecurityClassForSystem(getSystemSecurityFromLabel(parts[1])); @@ -102,19 +101,17 @@ define([ let classes = [securityClass, Util.config.popoverTriggerClass, Util.config.helpDefaultClass]; - markup += '' + name + ''; + markup += `${name}`; if(sizeLabel !== undefined){ - markup += '' + sizeLabel + ''; - }else{ - markup += '  '; + markup += `${sizeLabel}`; } markup += ''; - markup += '  ' + label + ''; + markup += `  ${label}`; if(suffix.length){ - markup += ' ' + suffix + ''; + markup += ` ${suffix}`; } }else{ - markup += '' + state.text + ''; + markup += `${state.text}`; } return $(markup); @@ -152,7 +149,7 @@ define([ markup += '
    ' + parts[0] + '
    '; - markup += '
    '; + markup += '
    '; markup += '
    ' + label + '
    '; markup += '
    ' + suffix + '
    '; break; @@ -203,10 +200,10 @@ define([ } let securityClass = Util.getSecurityClassForSystem(parts[1]); - markup += '' + parts[0] + '  '; - markup += '' + parts[1] + ''; + markup += `${parts[0]}`; + markup += `  ${parts[1]}`; }else{ - markup += '' + state.text + ''; + markup += `${state.text}`; } return $(markup); @@ -250,7 +247,7 @@ define([ let defaultConfig = { dropdownParent: selectElement.parents('.modal-body'), - minimumResultsForSearch: -1, + minimumResultsForSearch: Infinity, width: '100%', maxSelectionLength: 1 }; @@ -296,7 +293,7 @@ define([ $.fn.initStatusSelect = function(options){ let defaultConfig = { - minimumResultsForSearch: -1, + minimumResultsForSearch: Infinity, width: '100%', iconClass: 'fa-circle' }; @@ -787,7 +784,7 @@ define([ */ $.fn.initSignatureGroupSelect = function(options){ let defaultConfig = { - minimumResultsForSearch: -1, + minimumResultsForSearch: Infinity, width: '110px', dropdownParent: this.parents('.popover-content') }; @@ -883,7 +880,7 @@ define([ */ $.fn.initSignatureConnectionSelect = function(options){ let defaultConfig = { - minimumResultsForSearch: -1, + minimumResultsForSearch: Infinity, width: '140px', dropdownParent: this.parents('.popover-content') }; diff --git a/js/app/ui/layout/demo_map.js b/js/app/ui/layout/demo_map.js deleted file mode 100644 index 3803037b..00000000 --- a/js/app/ui/layout/demo_map.js +++ /dev/null @@ -1,314 +0,0 @@ -/** - * Demo SVG map - */ - -define([ - 'jquery', - 'lazylinepainter' -], ($) => { - - 'use strict'; - - let config = { - headerSystemsContainerId: 'pf-header-systems', // id for systems layer - headerSystemConnectorsId: 'pf-header-connectors', // id for connectors layer - headerConnectionsContainerId: 'pf-header-connections', // id for connections layer - headerBackgroundContainerId: 'pf-header-background', // id for background layer - - headerSystemClass: 'pf-header-system', // class for all header background systems - - // map dimensions - mapWidth: 600, // map width (px) - mapHeight: 380 // map height (px) - }; - - /** - * draw systems layer - * @param callback - */ - let drawSystems = function(callback){ - - let pathObj = { - systems: { - strokepath: [ - // systems ======================================================================= - // 1 - { - path: 'm 155 30 90 0 c 2.8 0 5 2.2 5 5 l 0 10 c 0 2.8 -2.2 5 -5 5 l -90 0 c -2.8 0 -5 -2.2 -5 -5 l 0 -10 c 0 -2.8 2.2 -5 5 -5 z', - duration: 500, - strokeColor: '#568A89' //teal - }, - // 2 - { - path: 'm 374 91 110 0 c 2.8 0 5 2.2 5 5 l 0 10 c 0 2.8 -2.2 5 -5 5 l -110 0 c -2.8 0 -5 -2.2 -5 -5 l 0 -10 c 0 -2.8 2.2 -5 5 -5 z', - duration: 500, - strokeColor: '#63676A' //gray - }, - // 3 - { - path: 'm 15 149 90 0 c 2.8 0 5 2.2 5 5 l 0 30 c 0 2.8 -2.2 5 -5 5 l -90 0 c -2.8 0 -5 -2.2 -5 -5 l 0 -30 c 0 -2.8 2.2 -5 5 -5 z', - duration: 500, - strokeColor: '#D9534F ' //red - }, - // 4 - { - path: 'm 235 230 90 0 c 2.8 0 5 2.2 5 5 l 0 10 c 0 2.8 -2.2 5 -5 5 l -90 0 c -2.8 0 -5 -2.2 -5 -5 l 0 -10 c 0 -2.8 2.2 -5 5 -5 z', - duration: 500, - strokeColor: '#63676A' //gray - }, - // 5 - { - path: 'm 175 330 90 0 c 2.8 0 5 2.2 5 5 l 0 30 c 0 2.8 -2.2 5 -5 5 l -90 0 c -2.8 0 -5 -2.2 -5 -5 l 0 -30 c 0 -2.8 2.2 -5 5 -5 z', - duration: 500, - strokeColor: '#E28A0D ' //orange - }, - // 6 - { - path: 'm 436 312 90 0 c 2.8 0 5 2.2 5 5 l 0 10 c 0 2.8 -2.2 5 -5 5 l -90 0 c -2.8 0 -5 -2.2 -5 -5 l 0 -10 c 0 -2.8 2.2 -5 5 -5 z', - duration: 500, - strokeColor: '#5CB85C ' //green - } - ], - dimensions: { - width: config.mapWidth, - height: config.mapHeight - } - } - }; - - - // draw systems into header - $('#' + config.headerSystemsContainerId).lazylinepainter( - { - svgData: pathObj, - strokeWidth: 2, - strokeOpacity: 1, - overrideKey: 'systems', - strokeJoin: 'miter', - strokeCap: 'butt', - delay: 1000, - onComplete: function(){ - drawConnectors(callback); - } - - }).lazylinepainter('paint'); - }; - - /** - * draw connectors layer - * @param callback - */ - let drawConnectors = function(callback){ - - let connectorDuration = 150; - - let pathObj = { - connectors: { - strokepath: [ - // connectors ==================================================================== - // 1 - { - path: 'm 250.4 34.8 c 1.7 0 3.1 1.3 3.9 2.9 0.8 1.7 0.8 3.7 0 5.3 -0.8 1.7 -2.4 2.7 -4 2.7', - duration: connectorDuration - }, - { - path: 'm 150 34.7 c -1.7 0 -3.1 1.3 -3.9 2.9 -0.8 1.7 -0.8 3.7 0 5.3 0.8 1.7 2.4 2.7 4 2.7', - duration: connectorDuration - }, - // 2 - { - path: 'm 369 96 c -1.7 0 -3.1 1.3 -3.9 2.9 -0.8 1.7 -0.8 3.7 0 5.3 0.8 1.7 2.4 2.7 4 2.7', - duration: connectorDuration - }, - // 3 - { - path: 'm 110.4 165 c 1.7 0 3.1 1.3 3.9 2.9 0.8 1.7 0.8 3.7 0 5.3 -0.8 1.7 -2.4 2.7 -4 2.7', - duration: connectorDuration - }, - { - path: 'm 56 148 c 0 -1.7 1.3 -3.1 2.9 -3.9 1.7 -0.8 3.7 -0.8 5.3 0 1.7 0.8 2.7 2.4 2.7 4', - duration: connectorDuration - }, - // 4 - { - path: 'm 229 236 c -1.7 0 -3.1 1.3 -3.9 2.9 -0.8 1.7 -0.8 3.7 0 5.3 0.8 1.7 2.4 2.7 4 2.7', - duration: connectorDuration - }, - { - path: 'm 331 234.7 c 1.7 0 3.1 1.3 3.9 2.9 0.8 1.7 0.8 3.7 0 5.3 -0.8 1.7 -2.4 2.7 -4 2.7', - duration: connectorDuration - }, - { - path: 'm 285 251 c 0 1.7 -1.3 3.1 -2.9 3.9 -1.7 0.8 -3.7 0.8 -5.3 0 -1.7 -0.8 -2.7 -2.4 -2.7 -4', - duration: connectorDuration - }, - // 5 - { - path: 'm 213 329.5 c 0 -1.7 1.3 -3.1 2.9 -3.9 1.7 -0.8 3.7 -0.8 5.3 0 1.7 0.8 2.7 2.4 2.7 4', - duration: connectorDuration - }, - // 6 - { - path: 'm 430 316 c -1.7 0 -3.1 1.3 -3.9 2.9 -0.8 1.7 -0.8 3.7 0 5.3 0.8 1.7 2.4 2.7 4 2.7', - duration: connectorDuration - } - ], - dimensions: { - width: config.mapWidth, - height: config.mapHeight - } - } - }; - - - // draw systems into header - $('#' + config.headerConnectionsContainerId).lazylinepainter( - { - svgData: pathObj, - strokeWidth: 2, - duration: 600, - drawSequential: false, - strokeOpacity: 1, - overrideKey: 'connectors', - strokeJoin: 'miter', - strokeCap: 'butt', - strokeColor: '#63676A', //gray - onComplete: function(){ - drawConnections(callback); - } - - }).lazylinepainter('paint'); - }; - - /** - * draw connections layer - * @param callback - */ - let drawConnections = function(callback){ - - let connectionDuration = 250; - let connectionWidth = 8; - let connectionInnerWidth = 4; - let connectionBorderColor = '#63676A'; //gray - - let pathObj = { - connections: { - strokepath: [ - // connections ==================================================================== - // 1 - 2 - { - path: 'm 255,40 c 44.5,0 64.2,61.1 109.0,61.15', - duration: connectionDuration, - strokeWidth: connectionWidth - }, - { - path: 'm 255,40 c 44.5,0 64.2,61.1 109.0,61.15', - duration: connectionDuration, - strokeWidth: connectionInnerWidth, - strokeColor: '#3C3F41' // gray - }, - // 2 - 3 - { - path: 'm 146,40.0 c -51.7,0 -83.8,58.8 -83.8,104.5', - duration: connectionDuration, - strokeWidth: connectionWidth - }, - { - path: 'm 146,40.0 c -51.7,0 -83.8,58.8 -83.8,104.5', - duration: connectionDuration, - strokeWidth: connectionInnerWidth, - strokeColor: '#E28A0D' // orange - }, - // 3 - 4 - { - path: 'm 115,171 c 45.7,0 64.1,71.2 109.6,70.8', - duration: connectionDuration, - strokeWidth: connectionWidth - }, - { - path: 'm 115,171 c 45.7,0 64.1,71.2 109.6,70.8', - duration: connectionDuration, - strokeWidth: connectionInnerWidth, - strokeColor: '#A52521' // red - }, - // 4 - 5 - { - path: 'm 279,256 c 0.5,35.9 -60.1,35.1 -60.1,70.0', - duration: connectionDuration, - strokeWidth: connectionWidth - }, - { - path: 'm 279,256 c 0.5,35.9 -60.1,35.1 -60.1,70.0', - duration: connectionDuration, - strokeWidth: connectionInnerWidth, - strokeColor: '#3C3F41' // gray - }, - // 4 - 6 - { - path: 'm 335,240 c 44.2,0 43.7,81.6 89.9,81.6', - duration: connectionDuration, - strokeWidth: connectionWidth - }, - { - path: 'm 335,240 c 44.2,0 43.7,81.6 89.9,81.6', - duration: connectionDuration, - strokeWidth: connectionInnerWidth, - strokeColor: '#3C3F41' // gray - } - ], - dimensions: { - width: config.mapWidth, - height: config.mapHeight - } - } - }; - - - // draw systems into header - $('#' + config.headerSystemConnectorsId).lazylinepainter( - { - svgData: pathObj, - strokeWidth: 2, - duration: 600, - // drawSequential: false, - strokeOpacity: 1, - overrideKey: 'connections', - strokeJoin: 'miter', - strokeCap: 'butt', - strokeColor: connectionBorderColor, - onComplete: function(){ - drawBackground(callback); - } - - }).lazylinepainter('paint'); - - }; - - /** - * draw background layer - * @param callback - */ - let drawBackground = function(callback){ - $('#' + config.headerBackgroundContainerId + ' .' + config.headerSystemClass).velocity('transition.bounceUpIn', { - stagger: 150, - complete: function(){ - if(typeof callback === 'function'){ - callback(); - } - } - }); - }; - - /** - * draws the demo map - * @param callback - */ - $.fn.drawDemoMap = function(callback){ - let canvasElement = $(this); - - - // draw systems - drawSystems(callback); - }; - -}); \ No newline at end of file diff --git a/js/app/ui/layout/header_login.js b/js/app/ui/layout/header_login.js index 8d491be7..d35ad50d 100644 --- a/js/app/ui/layout/header_login.js +++ b/js/app/ui/layout/header_login.js @@ -4,236 +4,565 @@ define([ 'jquery', - 'easePack', - 'tweenLite' -], ($) => { + 'app/util' +], ($, Util) => { 'use strict'; let config = { - previewElementClass: 'pf-header-preview-element' // class for "preview" elements + headerId: 'pf-landing-top', // id for page header + canvasId: 'pf-header-canvas', // id for canvas background + previewElementClass: 'pf-header-preview-element' // class for "preview" elements }; + class Color { + constructor(r, g, b, a = 1){ + this._r = r; + this._g = g; + this._b = b; + this._a = a; + } - let width, height, largeHeader, canvas, ctx, points, target, animateHeader = true; + get r(){ + return this._r; + } - let canvasHeight = 355; - let colorRGB = '108, 174, 173'; - let connectionCount = 4; + get g(){ + return this._g; + } + get b(){ + return this._b; + } - let initHeader = function(){ - width = window.innerWidth; - height = canvasHeight; - target = {x: width * 1, y: 230}; + style(a = this.a){ + return `rgba(${this.r}, ${this.g}, ${this.b}, ${a})`; + } + } - largeHeader.style.height = height+'px'; + class Node { + constructor(x, y, ctx, config = {}){ + this._anchorX = x; + this._anchorY = y; + this._ctx = ctx; + this._config = config; + this._x = Math.random() * (x - (x - this._config.anchorLength)) + (x - this._config.anchorLength); + this._y = Math.random() * (y - (y - this._config.anchorLength)) + (y - this._config.anchorLength); + this._vx = Math.random() * 2 - 1; + this._vy = Math.random() * 2 - 1; + this._energy = Math.random() * 100; + this._radius = Math.random(); + this._siblings = []; + this._brightness = 0; + this._isPointer = false; + } - canvas.width = width; - canvas.height = height; - ctx = canvas.getContext('2d'); + set x(x){ + this._x = x; + } - // create points - points = []; - for(let x = 0; x < width; x = x + width/20){ - for(let y = 0; y < height; y = y + height/15){ - let px = x + Math.random()*width/15; - let py = y + Math.random()*height/15; - let p = {x: px, originX: px, y: py, originY: py }; - points.push(p); + get x(){ + return this._x; + } + + set y(y){ + this._y = y; + } + + get y(){ + return this._y; + } + + set siblings(siblings){ + this._siblings = siblings; + } + + get siblings(){ + return this._siblings; + } + + get radius(){ + if(this.isPointer){ + return 3; } + return 2 * this._radius + 2 * this._siblings.length / this._config.siblingsLimit; } - // for each point find the 5 closest points - for(let i = 0; i < points.length; i++){ - let closest = []; - let p1 = points[i]; - for(let j = 0; j < points.length; j++){ - let p2 = points[j]; - if(p1 !== p2){ - let placed = false; - for(let k = 0; k < connectionCount; k++){ - if(!placed){ - if(closest[k] === undefined){ - closest[k] = p2; - placed = true; - } - } - } - - for(let m = 0; m < connectionCount; m++){ - if(!placed){ - if(getDistance(p1, p2) < getDistance(p1, closest[m])){ - closest[m] = p2; - placed = true; - } - } - } - } - } - p1.closest = closest; + set brightness(brightness){ + this._brightness = brightness; } - // assign a circle to each point - for(let n in points){ - let c = new Circle(points[n], 2+Math.random()*2, 'rgba(255,255,255,0.3)'); - points[n].circle = c; + get brightness(){ + return this.isPointer ? 1 : this._brightness; } - }; - // Event handling - let addListeners = function(){ - if(!('ontouchstart' in window)){ - window.addEventListener('mousemove', mouseMove); + set color(color){ + this._color = color; } - window.addEventListener('scroll', scrollCheck); - window.addEventListener('resize', resize); - }; - let mouseMove = function(e){ - let posx = 0; - let posy = 0; - if(e.pageX || e.pageY){ - posx = e.pageX; - posy = e.pageY; - }else if(e.clientX || e.clientY){ - posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; - posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; + get color(){ + return this._color; } - target.x = posx; - target.y = posy; - }; - let scrollCheck = function(){ - if(document.body.scrollTop > height){ - animateHeader = false; - }else{ - animateHeader = true; + set isPointer(isPointer){ + this._isPointer = isPointer; } - }; - let resize = function(){ - width = window.innerWidth; - height = canvasHeight; - largeHeader.style.height = height+'px'; - canvas.width = width; - canvas.height = height; - }; - - // animation - let initAnimation = function(){ - animate(); - for(let i in points){ - shiftPoint(points[i]); + get isPointer(){ + return this._isPointer; } - }; - let animate = function animate(){ - if(animateHeader){ - ctx.clearRect(0,0,width,height); - for(let i in points){ - // detect points in range - if(Math.abs(getDistance(target, points[i])) < 4000){ - points[i].active = 0.25; - points[i].circle.active = 0.45; - }else if(Math.abs(getDistance(target, points[i])) < 20000){ - points[i].active = 0.1; - points[i].circle.active = 0.3; - }else if(Math.abs(getDistance(target, points[i])) < 40000){ - points[i].active = 0.02; - points[i].circle.active = 0.1; + drawNode(){ + this._ctx.beginPath(); + this._ctx.arc(this.x, this.y, this.radius, 0, StarCanvas.circ); + this._ctx.fillStyle = this.color.style(this.brightness * this._config.brightnessMultiplierNode); + this._ctx.fill(); + } + + drawConnections(){ + for(let i = 0; i < this._siblings.length; i++){ + this._ctx.beginPath(); + this._ctx.moveTo(this.x, this.y); + this._ctx.lineTo(this._siblings[i].x, this._siblings[i].y); + this._ctx.lineWidth = 1 - StarCanvas.calcDistance(this, this._siblings[i]) / this._config.sensitivity; + if(this.color === this._siblings[i].color){ + // no gradient + this._ctx.strokeStyle = this.color.style(this.brightness * this._config.brightnessMultiplierConnection); }else{ - points[i].active = 0; - points[i].circle.active = 0; + // gradient + this._ctx.strokeStyle = this.gradient(this._siblings[i], StarCanvas.lineStyle(this, this._siblings[i])) ; } - - drawLines(points[i]); - points[i].circle.draw(); + this._ctx.stroke(); } } - requestAnimationFrame(animate); - }; - let shiftPoint = function(p){ - TweenLite.to(p, 1 + 1 * Math.random(), {x: p.originX - 50 + Math.random() * 100, - y: p.originY - 50 + Math.random() * 100, ease: Circ.easeInOut, - onComplete: function(){ - shiftPoint(p); - }}); - }; - - // Canvas manipulation - let drawLines = function(p){ - if(!p.active) return; - for(let i in p.closest){ - ctx.beginPath(); - ctx.moveTo(p.x, p.y); - ctx.lineTo(p.closest[i].x, p.closest[i].y); - ctx.strokeStyle = 'rgba(' + colorRGB +','+ p.active+')'; - ctx.stroke(); + gradient(node2, midColor){ + let grad = this._ctx.createLinearGradient(Math.floor(this.x), Math.floor(this.y), Math.floor(node2.x), Math.floor(node2.y)); + grad.addColorStop(0, this.color.style(this.brightness * this._config.brightnessMultiplierConnection)); + grad.addColorStop(0.5, midColor); + grad.addColorStop(1, node2.color.style(node2.brightness * this._config.brightnessMultiplierConnection)); + return grad; } + + moveNode(){ + this._energy -= 2; + if(this._energy < 1){ + this._energy = Math.random() * 100; + if(this.x - this._anchorX < -this._config.anchorLength){ + this._vx = Math.random() * 2; + }else if(this.x - this._anchorX > this._config.anchorLength){ + this._vx = Math.random() * -2; + }else{ + this._vx = Math.random() * 4 - 2; + } + if(this.y - this._anchorY < -this._config.anchorLength){ + this._vy = Math.random() * 2; + }else if (this.y - this._anchorY > this._config.anchorLength){ + this._vy = Math.random() * -2; + }else{ + this._vy = Math.random() * 4 - 2; + } + } + this.x += this._vx * this._energy / 100; + this.y += this._vy * this._energy / 100; + } + } + + class StarCanvas { + constructor(canvas, config = {}) { + this._canvas = canvas; + this._config = Object.assign({}, new.target.defaultConfig, config); + this._nodes = []; + this._nodesQty = 0; + this._updateActive = true; + this._minWait = Math.floor(1 / this._config.fps * 1000); + + this.resizeWindow(); + this._mouse = this._config.startCoordinates(this._canvas); + + this._ctx = this._canvas.getContext('2d', {alpha: true, desynchronized: true}); + this.initHandlers(); + + // must be bind to this instance -> https://stackoverflow.com/a/46014225/4329969 + this.onPointerDown = this.onPointerDown.bind(this); + this.onPointerEnter = this.onPointerEnter.bind(this); + this.onPointerLeave = this.onPointerLeave.bind(this); + this.onPointerMove = this.onPointerMove.bind(this); + + this.initPointerLock(); + this.initIntersectionObserver(); + this.setColorBase(); + this.initNodes(); + this.redrawCheck(); + } + + setColorBase(){ + // if base color does not change -> re-use same instance for all nodes + this._colorBase = Array.isArray(this._config.colorBase) ? new Color(...this._config.colorBase) : null; + } + + isPaused(){ + return (typeof this._config.isPaused === 'function') ? this._config.isPaused(this) : this._config.isPaused; + } + + findSiblings(){ + let node1, node2, distance; + for(let i = 0; i < this._nodesQty; i++){ + node1 = this._nodes[i]; + node1.siblings = []; + for(let j = 0; j < this._nodesQty; j++){ + node2 = this._nodes[j]; + if(node1 !== node2){ + distance = StarCanvas.calcDistance(node1, node2); + if(distance < this._config.sensitivity){ + if(node1.siblings.length < this._config.siblingsLimit){ + node1.siblings.push(node2); + }else{ + let node_sibling_distance = 0; + let max_distance = 0; + let s; + for(let k = 0; k < this._config.siblingsLimit; k++){ + node_sibling_distance = StarCanvas.calcDistance(node1, node1.siblings[k]); + if(node_sibling_distance > max_distance){ + max_distance = node_sibling_distance; + s = k; + } + } + if(distance < max_distance){ + node1.siblings.splice(s, 1); + node1.siblings.push(node2); + } + } + } + } + } + } + } + + redrawScene(){ + //this.resizeWindow(); + this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height); + this.findSiblings(); + // skip nodes move to move if they are outside the visible radius -> performance boost + let haltRadius = this._config.mouseRadius + this._config.anchorLength; + // mouse pointer node moves on mousemove + this._pointerNode.x = this._mouse.x; + this._pointerNode.y = this._mouse.y; + let skipNodesMove = [0]; // pointer node + + let i, node, distance; + for(i = 0; i < this._nodesQty; i++){ + node = this._nodes[i]; + distance = StarCanvas.calcDistance({ + x: this._mouse.x, + y: this._mouse.y + }, node); + + if(distance < this._config.mouseRadius){ + node.brightness = 1 - distance / this._config.mouseRadius; + }else{ + node.brightness = 0; + } + + if(distance > haltRadius){ + skipNodesMove.push(i); + } + skipNodesMove = []; + } + + for(i = 0; i < this._nodesQty; i++){ + node = this._nodes[i]; + if(node.brightness){ + node.drawNode(); + node.drawConnections(); + } + + if(!skipNodesMove.includes(i)){ + node.moveNode(); + } + } + } + + redrawCheck(){ + if(this._animationFrameId){ + cancelAnimationFrame(this._animationFrameId); + } + + this._animationFrameId = requestAnimationFrame(() => { + let now = Date.now(); + + if( + this._updateActive && !this.isPaused() && + now - (this._lastRender || 0) >= this._minWait + ){ + this._lastRender = now; + this.redrawScene(); + } + + + this._animationFrameId = null; + this.redrawCheck(); + }); + } + + initNodes(){ + this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height); + this._nodes = []; + for(let i = this._config.density; i < this._canvas.width; i += this._config.density) { + for(let j = this._config.density; j < this._canvas.height; j += this._config.density) { + let node = new Node(i, j, this._ctx, this._config); + if(typeof this._config.colorBase === 'function'){ + node.color = this._config.colorBase(node, this); + }else{ + node.color = this._colorBase; + } + this._nodes.push(node); + this._nodesQty++; + } + } + + // mouse cursor node + this._pointerNode = new Node( + this._mouse.x, + this._mouse.y, + this._ctx, + this._config + ); + this._pointerNode.color = new Color(...this._config.colorCursor); + this._pointerNode.brightness = 1; + this._pointerNode.isPointer = true; + this._nodes.unshift(this._pointerNode); + this._nodesQty++; + } + + initHandlers(){ + this._canvas.addEventListener('pointerover', e => this.onPointerEnter(e), {passive: true}); + this._canvas.addEventListener('pointermove', e => this.onPointerMove(e), {passive: true}); + } + + initPointerLock(){ + if(!this._config.pointerLock){ + return; + } + + let lockChange = (e) => { + /* + if(document.pointerLockElement === this._canvas){ + this._canvas.addEventListener('pointermove', this.onPointerMove, {passive: true}); + }else{ + this._canvas.removeEventListener('pointermove', this.onPointerMove, {passive: true}); + }*/ + }; + + //this._canvas.requestPointerLock() + this._canvas.addEventListener('pointerdown', this.onPointerDown, false); + //this._canvas.addEventListener('mouseenter', this.onPointerEnter, false); + //this._canvas.addEventListener('mouseleave', this.onPointerLeave, false); + + document.addEventListener('pointerlockchange', lockChange, false); + } + + initIntersectionObserver(){ + let intersectionCallback = entries => { + let visiblePct = Math.floor(entries[0].intersectionRatio * 100); + this._updateActive = visiblePct > 0; + }; + + this._intersectionObserver = new IntersectionObserver(intersectionCallback, { + threshold: [0.0, 0.2, 0.4, 0.6, 0.8, 1.0] + }); + this._intersectionObserver.observe(this._canvas); + } + + mousemoveHandler(e){ + this._mouse.x = e.clientX; + this._mouse.y = e.clientY; + } + + onPointerMove(e){ + let x = this._mouse.x + Math.floor(e.movementX); + let y = this._mouse.y + Math.floor(e.movementY); + + this._mouse.x = Math.min(this._canvas.width, Math.max(0, x)); + this._mouse.y = Math.min(this._canvas.height, Math.max(0, y)); + + /* + if(x !== this._mouse.x || y !== this._mouse.y){ + // cursor outside canvas + document.exitPointerLock(); + } + */ + } + + onPointerDown(e){ + this._mouse.x = e.clientX; + this._mouse.y = e.clientY; + if(document.pointerLockElement === this._canvas){ + document.exitPointerLock(); + }else{ + this._canvas.requestPointerLock(); + } + } + + onPointerEnter(e){ + this._mouse.x = e.clientX; + this._mouse.y = e.clientY; + } + + onPointerLeave(e){ + document.exitPointerLock(); + } + + resizeWindow(){ + let dimension = this._config.newDimension(this); + this._canvas.width = dimension.width; + this._canvas.height = dimension.height; + } + } + + StarCanvas.circ = 2 * Math.PI; + + StarCanvas.calcDistance = (node1, node2) => { + return Math.sqrt(Math.pow(node1.x - node2.x, 2) + (Math.pow(node1.y - node2.y, 2))); }; - let Circle = function(pos,rad,color){ - let _this = this; - - // constructor - (function(){ - _this.pos = pos || null; - _this.radius = rad || null; - _this.color = color || null; - })(); - - this.draw = function(){ - if(!_this.active) return; - ctx.beginPath(); - ctx.arc(_this.pos.x, _this.pos.y, _this.radius, 0, 2 * Math.PI, false); - ctx.fillStyle = 'rgba(' + colorRGB + ','+ _this.active+')'; - ctx.fill(); - }; + StarCanvas.lineStyle = (node1, node2) => { + let r = StarCanvas.mixComponents(node1.color.r, node2.color.r, node1.radius, node2.radius); + let g = StarCanvas.mixComponents(node1.color.g, node2.color.g, node1.radius, node2.radius); + let b = StarCanvas.mixComponents(node1.color.b, node2.color.b, node1.radius, node2.radius); + let a = (node1.brightness + node2.brightness) / 2; + return `rgba(${Math.floor(r)}, ${Math.floor(g)}, ${Math.floor(b)}, ${a})`; }; - // Util - let getDistance = function(p1, p2){ - return Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2); + StarCanvas.mixComponents = (comp1, comp2, weight1, weight2) => { + return (comp1*weight1 + comp2*weight2) / (weight1 + weight2); }; - /** - * init header animation - * @param callback - */ - $.fn.initHeader = function(callback){ - largeHeader = $(this)[0]; - canvas = $(this).find('canvas:visible')[0]; + StarCanvas.getRandomIntInclusive = (min, max) => { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min +1)) + min; + }; - // header preview elements - $('.' + config.previewElementClass).velocity('transition.bounceIn', { + + StarCanvas.defaultConfig = { + // limit render interval to max fps + // lower fps == less CPU + fps: 80, + // how close next node must be to activate connection (in px) + // shorter distance == better connection (line width) + sensitivity: 90, + // note that siblings limit is not 'accurate' as the node can actually have more connections than this value + // that's because the node accepts sibling nodes with no regard to their current connections this is acceptable + // because potential fix would not result in significant visual difference + // more siblings == bigger node + siblingsLimit: 15, + // default node margin + density: 50, + // avoid nodes spreading + anchorLength: 80, + // highlight radius + mouseRadius: 150, + // values < 1 will lower the calculated node brightness [0-1] + brightnessMultiplierNode: 1, + // values < 1 will lower the calculated connection brightness [0-1] + brightnessMultiplierConnection: 1, + colorBase: [108, 174, 173], // teal + colorCursor: [226, 138, 13], // orange + // callback for canvas dimension re-calc + newDimension: () => ({width: window.innerWidth, height: window.innerHeight}), + // start coordinates (before mouse move) + startCoordinates: canvas => ({ + x: canvas.width / 2, + y: canvas.height / 2 + }), + // callback/boolean to pause canvas updated (e.g. while page scroll). Better scroll performance + isPaused: false, + pointerLock: true + }; + + // custom configuration ------------------------------------------------------------------------------------------- + let defaultConfig = { + brightnessMultiplierConnection: 0.95, + colorCursor: [200, 184, 71], // yellow dark + newDimension: starCanvas => ({ + width: window.innerWidth, + height: 354 // max height + 1px border + }), + startCoordinates: canvas => ({ + x: canvas.width / 2 + 500, + y: canvas.height / 2 + 50 + }), + isPaused: () => document.body.classList.contains('on-scroll') + }; + + if(navigator.userAgent.indexOf('Chrome') > -1){ + // Chrome user + Object.assign(defaultConfig, { + sensitivity: 85, + siblingsLimit: 10, + density: 60, + anchorLength: 20, + colorBase: (node, instance) => { + let colorId = StarCanvas.getRandomIntInclusive(0, 4); + let colorKey = `_randColor${colorId}`; + if(instance[colorKey]){ + return instance[colorKey]; + } + + let rgb = StarCanvas.defaultConfig.colorBase; + switch(colorId){ + case 1: rgb = [ 92, 184, 92]; break; // green + case 2: rgb = [ 68, 170, 130]; break; // aqua + case 3: rgb = [194, 118, 12]; break; // orange dark + case 4: rgb = StarCanvas.defaultConfig.colorBase; break; + } + + instance[colorKey] = new Color(...rgb); + return instance[colorKey]; + } + }); + }else{ + // Non Chrome user + Object.assign(defaultConfig, { + sensitivity: 85, + siblingsLimit: 6, + density: 60, + anchorLength: 20, + mouseRadius: 120 + }); + } + + let init = headerEl => { + let previewEls = headerEl.getElementsByClassName(config.previewElementClass); + + $(previewEls).velocity('transition.bounceIn', { duration: 600, stagger: 60, delay: 120, complete: function(){ - - // show header canvas animation + let canvas = document.getElementById(config.canvasId); + // not on mobile if(canvas){ - // header animation - initHeader(); - initAnimation(); - addListeners(); + let starCanvasInstance = new StarCanvas(canvas, defaultConfig); + canvas.classList.add('in'); - $(canvas).velocity('fadeIn', { - duration: 900, - visibility: 'visible', - complete: function(){ - if(callback !== undefined){ - callback(); + // watch for resize + Util.getResizeManager().observe( + canvas.parentNode, + (el, contentRect) => { + // ignore "height" change (css transition) (no canvas repaint) + if(canvas.width !== contentRect.width){ + starCanvasInstance.resizeWindow(); } - } - }); + }, + {debounce: true, ms: 260} + ); } } - }); - - }; + return { + init + }; }); \ No newline at end of file diff --git a/js/app/ui/layout/logo.js b/js/app/ui/layout/logo.js deleted file mode 100644 index 7d62b125..00000000 --- a/js/app/ui/layout/logo.js +++ /dev/null @@ -1,149 +0,0 @@ -/** - * Logo - */ - -define([ - 'jquery', - 'lazylinepainter' -], ($) => { - - 'use strict'; - - let config = { - staticLogoId: 'pf-static-logo-svg', // id for "static" logo - - logoPartTopRightClass: 'logo-ploygon-top-right', // class for logo part "top right" - logoPartBottomLeftClass: 'logo-ploygon-bottom-left', // class for logo part "bottom left" - logoPartBottomRightClass: 'logo-ploygon-bottom-right', // class for logo part "bottom right" - logoPartTopLeftClass: 'logo-ploygon-top-left' - }; - - - /** - * draws the pathfinder logo to an element and add some animation features - * @param callback - * @param enableHover - */ - $.fn.drawLogo = function(callback, enableHover){ - let canvasElement = $(this); - - let pathObj = { - logo: { - strokepath: [ - { - path: 'M195.9 9.6 226.9 297.1 354.2 365 196.2 9.8 ', - strokeColor: '#477372', - duration: 1600 - }, - { - path: 'M1.7 361.3 73.9 284.9 178.6 286.7 2.2 361.4 ', - strokeColor: '#5cb85c', - duration: 1000 - }, - { - path: 'M192.9 286.7 121.2 318.6 335.6 363.5 193.4 286.7 ', - strokeColor: '#375959', - duration: 900 - }, - { - path: 'M202.8 141.9 0.2 352.6 189.1 0.8 202.7 141.3 ', - strokeColor: '#63676a', - duration: 1500 - } - ], - dimensions: { - width: 355, - height: 366 - } - } - }; - - // load Logo svg - requirejs(['text!templates/layout/logo.html', 'mustache'], function(template, Mustache){ - let logoData = { - staticLogoId: config.staticLogoId, - logoPartTopRightClass: config.logoPartTopRightClass, - logoPartBottomLeftClass: config.logoPartBottomLeftClass, - logoPartBottomRightClass: config.logoPartBottomRightClass, - logoPartTopLeftClass: config.logoPartTopLeftClass - }; - - let logoContent = Mustache.render(template, logoData); - - canvasElement.html(logoContent); - - // draw the logo - canvasElement.lazylinepainter( - { - svgData: pathObj, - strokeWidth: 2, - drawSequential: false, - delay: 300, - overrideKey: 'logo', - strokeJoin: 'bevel', - onComplete: function(){ - - // hide lines - canvasElement.find('svg:not(#' + config.staticLogoId + ')').velocity({ - opacity: 0 - },{ - delay: 100 - }); - - // show full logo - canvasElement.find('#' + config.staticLogoId + '').velocity({ - opacity: 1 - },{ - delay: 100, - duration: 200, - complete: function(){ - - // execute callback - if(typeof callback === 'function'){ - callback(); - } - - // init logo animation - if(enableHover === true){ - let logoElements = $('#' + config.staticLogoId + ' path'); - - let animate = []; - logoElements.on('mouseover', function(e){ - let currentLogoElement = $(e.target); - let currentLogoElementIndex = logoElements.index(currentLogoElement); - - let animationXValue = currentLogoElement.attr('data-animationX'); - let animationYValue = currentLogoElement.attr('data-animationY'); - - let animationConfig = {}; - animationConfig.opacity = [1, 1]; - animationConfig.translateZ = [0, 0]; - animationConfig.translateX = [animationXValue, 0 ]; - animationConfig.translateY = [animationYValue, 0]; - - if(animate[currentLogoElementIndex] !== false){ - $(this).velocity(animationConfig,{ - duration: 120, - begin: function(){ - animate[currentLogoElementIndex] = false; - } - }).velocity('reverse',{ - delay: 240, - complete: function(){ - animate[currentLogoElementIndex] = true; - } - }); - } - - }); - } - - - } - }); - } - }).lazylinepainter('paint'); - }); - }; - -}); \ No newline at end of file diff --git a/js/app/ui/module/base.js b/js/app/ui/module/base.js new file mode 100644 index 00000000..edfa3447 --- /dev/null +++ b/js/app/ui/module/base.js @@ -0,0 +1,513 @@ +define([ + 'jquery', + 'app/init', + 'app/util', + 'app/map/util', + 'app/lib/cache', + 'app/promises/promise.deferred', + 'app/promises/promise.queue' +], ($, Init, Util, MapUtil, Cache, DeferredPromise, PromiseQueue) => { + 'use strict'; + + /** + * abstract BaseModel class + * -> custom/plugin modules must extend from it + * @type {BaseModule} + */ + let BaseModule = class BaseModule { + + constructor(config= {}){ + if(new.target === BaseModule){ + throw new TypeError('Cannot construct ' + this.constructor.name + ' instances directly'); + } + + // check for abstract methods to be implemented in child + if(this.render === undefined){ + throw new TypeError('Abstract method render() missing in ' + new.target.name + ' class'); + } + + this._config = Object.assign({}, BaseModule.defaultConfig, config); + this._updateQueue = new PromiseQueue(); + } + + /** + * get current module configuration + * @returns {*} + */ + get config(){ + return this._config; + } + + /** + * get root node for this module + * -> parent container for custom body HTML + * @returns {HTMLElement} + */ + get moduleElement(){ + if(!this._moduleEl){ + // init new moduleElement + this._moduleEl = Object.assign(document.createElement('div'), { + className: `${BaseModule.className} ${this._config.className}`, + style: { + opacity: '0' + } + }).setData('module', this); + + this._moduleEl.dataset.position = this._config.position; + this._moduleEl.dataset.module = this.constructor.name; + + // module header + this._moduleEl.append(this.newHeaderElement()); + } + return this._moduleEl; + } + + /** + * module header element + * -> dragHandler + headline + * @param text + * @returns {HTMLDivElement} + */ + newHeaderElement(text){ + let headEl = this.newHeadElement(); + headEl.append( + this.newHandlerElement(), + this.newHeadlineElement(text || this._config.headline) + ); + return headEl; + } + + /** + * module head element + * @returns {HTMLDivElement} + */ + newHeadElement(){ + return Object.assign(document.createElement('div'), { + className: this._config.headClassName + }); + } + + /** + * module dragHandler element + * @returns {HTMLHeadingElement} + */ + newHandlerElement(){ + return Object.assign(document.createElement('h5'), { + className: this._config.handlerClassName + }); + } + + /** + * module headline element + * @param text + * @returns {HTMLHeadingElement} + */ + newHeadlineElement(text){ + return Object.assign(document.createElement('h5'), { + textContent: typeof text === 'string' ? text : '' + }); + } + + /** + * module toolbar element (wrapper) + * @returns {HTMLHeadingElement} + */ + newHeadlineToolbarElement(){ + return Object.assign(document.createElement('h5'), { + className: 'pull-right' + }); + } + + /** + * icon element + * @param cls + * @returns {HTMLElement} + */ + newIconElement(cls = []){ + return Object.assign(document.createElement('i'), { + className: ['fas', ...cls].join(' ') + }); + } + + /** + * label element + * @param text + * @param cls + * @returns {HTMLSpanElement} + */ + newLabelElement(text, cls = []){ + let labelEl = document.createElement('span'); + labelEl.classList.add('label', 'center-block', ...cls); + labelEl.textContent = text || ''; + return labelEl; + } + + /** + * control button element + * @param text + * @param cls + * @param iconCls + * @returns {HTMLDivElement} + */ + newControlElement(text, cls = [], iconCls = ['fa-sync']){ + let controlEl = document.createElement('div'); + controlEl.classList.add(...[BaseModule.Util.config.dynamicAreaClass, this._config.controlAreaClass, ...cls]); + controlEl.insertAdjacentHTML('beforeend', `  ${text}`); + controlEl.prepend(this.newIconElement(iconCls)); + return controlEl; + } + + /** + * HTTP request handler for internal (Pathfinder) ajax calls + * @param args + * @returns {Promise} + */ + request(...args){ + return BaseModule.Util.request(...args); + } + + /** + * scoped instance for LocalStore for current module + * @returns {LocalStore} + */ + getLocalStore(){ + if(!this._localStore){ + // make accessible -> scope Store keys! + this._localStore = BaseModule.Util.getLocalStore('module'); + this._localStore.scope = this.constructor.name; + } + return this._localStore; + } + + /** + * visual notification handler (UI popover) + * -> can be used for info/error on-screen messages + * @param args + */ + showNotify(...args){ + return BaseModule.Util.showNotify(...args); + } + + /** + * responsible for dispatching all incoming method calls + * @param handler + * @param data + * @returns {*} + */ + handle(handler, ...data){ + try{ + if(BaseModule.handler.includes(handler)){ + // .. run module handler + let returnData = this[handler].apply(this, data); + if(returnData instanceof Promise){ + // log returned Promise from handler call resolved + returnData.then(() => { this.logHandler(handler, 0);}); + } + // log handler call + this.logHandler(handler); + + return returnData; + }else{ + console.error('Error in module %o. Invalid handler %o', this.constructor.name, handler); + } + }catch(e){ + console.error('Error in module %o in handler %s() %o', this.constructor.name, handler, e); + } + } + + /** + * log handler calls for this instance + * -> can be helpful for debugging + * @param handler + * @param increment + */ + logHandler(handler, increment = 1){ + if(increment){ + if(!this._config.logHandler){ + this._config.logHandler = {}; + } + + this._config.logHandler[handler] = (this._config.logHandler[handler] || 0) + increment; + } + } + + /** + * init module + */ + init(){} + + /** + * update module + * @param data + * @returns {Promise} + */ + update(data){ + return this._updateQueue.enqueue(() => Promise.resolve(data), 'end', 'upd'); + } + + beforeHide(){} + + beforeDestroy(){ + $(this.moduleElement).destroyPopover(true); + + // destroy DataTable instances + for(let table of $(this.moduleElement).find('table.dataTable')){ + $(table).DataTable().destroy(true); + } + } + + /** + * events from 'Sortable' lib + * @see https://github.com/SortableJS/Sortable + * @param name + * @param e + */ + onSortableEvent(name, e){ + if(name === 'onUnchoose' && this._sortableChoosePromise){ + this._sortableChoosePromise.resolve(); + } + + if(name === 'onChoose' && !this._sortableChoosePromise){ + this._sortableChoosePromise = BaseModule.newDeferredPromise(); + this._updateQueue.enqueue(() => this._sortableChoosePromise.then(() => { + this._sortableChoosePromise = null; + }), 'start'); + } + } + + /** + * get a unique cache key name for "source"/"target"-name + * @param sourceName + * @param targetName + * @returns {string|boolean} + */ + static getConnectionDataCacheKey(sourceName, targetName){ + let key = false; + if(sourceName && targetName){ + // names can be "undefined" in case system is currently in drag/drop state + // sort() is important -> ignore direction + key = `con_` + `${ [String(sourceName).toLowerCase(), String(targetName).toLowerCase()].sort() }`.hashCode(); + } + return key; + } + + /** + * get a connectionsData object that holds all connections for given mapIds (used as cache for route search) + * @param mapIds + * @returns {{}} + */ + static getConnectionsDataFromMaps(mapIds){ + let data = {}; + for(let mapId of mapIds){ + let map = MapUtil.getMapInstance(mapId); + if(map){ + let cacheKey = `map_${mapId}`; + let cache = BaseModule.getCache('mapConnections'); + let mapConnectionsData = cache.get(cacheKey); + + if(!mapConnectionsData){ + mapConnectionsData = this.getConnectionsDataFromConnections(mapId, map.getAllConnections()); + // update cache + cache.set(cacheKey, mapConnectionsData); + } + Object.assign(data, mapConnectionsData); + } + } + return data; + } + + /** + * get a connectionsData object for all connections + * @param mapId + * @param connections + * @returns {{}} + */ + static getConnectionsDataFromConnections(mapId = 0, connections = []){ + let data = {}; + if(connections.length){ + let connectionsData = MapUtil.getDataByConnections(connections); + for(let connectionData of connectionsData){ + let connectionDataCacheKey = BaseModule.getConnectionDataCacheKey(connectionData.sourceName, connectionData.targetName); + + // skip double connections between same systems + if(connectionDataCacheKey && !Object.keys(data).includes(connectionDataCacheKey)){ + data[connectionDataCacheKey] = { + map: { + id: mapId + }, + connection: { + id: connectionData.id, + type: connectionData.type, + scope: connectionData.scope, + updated: connectionData.updated + }, + source: { + id: connectionData.source, + name: connectionData.sourceName, + alias: connectionData.sourceAlias + }, + target: { + id: connectionData.target, + name: connectionData.targetName, + alias: connectionData.targetAlias + } + }; + } + } + } + return data; + } + + /** + * search for a specific connection by "source"/"target"-name inside connectionsData cache + * @param connectionsData + * @param sourceName + * @param targetName + * @returns {*} + */ + static findConnectionsData(connectionsData, sourceName, targetName){ + return this.Util.getObjVal(connectionsData, this.getConnectionDataCacheKey(sourceName, targetName)); + } + + /** + * get fake connection data (default connection type in case connection was not found on a map) + * @param sourceSystemData + * @param targetSystemData + * @param scope + * @param types + * @returns {{connection: {scope: string, id: number, type: [*]}, source: {name: number, alias: number, id: number}, target: {name: number, alias: number, id: number}}} + */ + static getFakeConnectionData(sourceSystemData, targetSystemData, scope = 'stargate', types = []){ + return { + connection: { + id: 0, + scope: scope, + type: types.length ? types : [MapUtil.getDefaultConnectionTypeByScope(scope)], + updated: 0 + }, + source: { + id: 0, + name: sourceSystemData.system, + alias: sourceSystemData.system + }, + target: { + id: 0, + name: targetSystemData.system, + alias: targetSystemData.system + } + }; + } + + /** + * get fake connection Element + * @param connectionData + * @returns {string} + */ + static getFakeConnectionElement(connectionData){ + let mapId = this.Util.getObjVal(connectionData, 'map.id') || 0; + let connectionId = this.Util.getObjVal(connectionData, 'connection.id') || 0; + let scope = this.Util.getObjVal(connectionData, 'connection.scope') || ''; + let classes = MapUtil.getConnectionFakeClassesByTypes(this.Util.getObjVal(connectionData, 'connection.type') || []); + let disabled = !mapId || !connectionId; + + let connectionElement = '
    '; + return connectionElement; + } + + /** + * get static instance of in-memory Cache() store by 'name' + * -> not persistent across page reloads + * -> persistent across module instances (different and same maps) + * @param name + * @returns {Cache} + */ + static getCache(name){ + let key = `CACHE-${name}`; + if(!this.Util.getObjVal(this, key)){ + let configKey = `cacheConfig.${name}`; + let cacheConfig = this.Util.getObjVal(this, configKey); + if(!cacheConfig){ + console.warn('Missing Cache config for %o. Expected at %o. Default config loaded…', + name, `${this.name}.${configKey}` + ); + cacheConfig = {}; + }else{ + // set cache name + cacheConfig.name = name; + } + + this[key] = new Cache(cacheConfig); + } + return this[key]; + } + + static now(){ + return new Date().getTime() / 1000; + } + + static getOrderPrio(){ + return this.isPlugin ? + this.scopeOrder.indexOf('plugin') : + (this.scopeOrder.indexOf(this.scope) !== -1 ? + this.scopeOrder.indexOf(this.scope) : + this.scopeOrder.length - 1 + ); + } + + static newDeferredPromise(){ + return new DeferredPromise(); + } + }; + + BaseModule.isPlugin = true; // module is defined as 'plugin' + BaseModule.scope = 'system'; // static module scope controls how module gets updated and what type of data is injected + BaseModule.sortArea = 'a'; // static default sortable area + BaseModule.position = 0; // static default sort/order position within sortable area + BaseModule.label = '???'; // static module label (e.g. description) + BaseModule.className = 'pf-module'; // static CSS class name + BaseModule.fullDataUpdate = false; // static module requires additional data (e.g. system description,...) + BaseModule.Util = Util; // static access to Pathfinders Util object + + BaseModule.scopeOrder = [ + 'system', + 'connection', + 'global', + 'plugin', + 'undefined' + ]; + + BaseModule.handler = [ + 'render', + 'init', + 'update', + 'beforeHide', + 'beforeDestroy', + 'onSortableEvent' + ]; + + BaseModule.cacheConfig = { + mapConnections: { + ttl: 5, + maxSize: 600, + debug: false + } + }; + + BaseModule.defaultConfig = { + position: 1, + className: 'pf-base-module', // class for module + headClassName: 'pf-module-head', // class for module header + handlerClassName: 'pf-sortable-handle', // class for "drag" handler + sortTargetAreas: ['a', 'b', 'c'], // sortable areas where module can be dragged into + headline: 'Base headline', // module headline + bodyClassName: 'pf-module-body', // class for module body [optional: can be used] + controlAreaClass: 'pf-module-control-area', // class for "control" areas + + moduleHeadlineIconClass: 'pf-module-icon-button' // class for toolbar icons in the head + }; + + return BaseModule; +}); diff --git a/js/app/ui/module/connection_info.js b/js/app/ui/module/connection_info.js index 10429887..11702972 100644 --- a/js/app/ui/module/connection_info.js +++ b/js/app/ui/module/connection_info.js @@ -6,31 +6,1252 @@ define([ 'jquery', 'app/init', 'app/util', + 'module/base', 'bootbox', 'app/counter', 'app/map/util' -], ($, Init, Util, bootbox, Counter, MapUtil) => { +], ($, Init, Util, BaseModule, bootbox, Counter, MapUtil) => { 'use strict'; - let config = { - // module info - modulePosition: 1, - moduleName: 'connectionInfo', - moduleHeadClass: 'pf-module-head', // class for module header - moduleHandlerClass: 'pf-module-handler-drag', // class for "drag" handler + let ConnectionInfoModule = class ConnectionInfoModule extends BaseModule { + constructor(config = {}) { + super(Object.assign({}, new.target.defaultConfig, config)); + } - // connection info module - moduleTypeClass: 'pf-connection-info-module', // class for this module + /** + * get HTML id by connectionId + * @param connectionId + * @returns {string} + */ + getConnectionElementId(connectionId = 0){ + return [ + this._config.connectionInfoPanelClass, + this._mapId, + connectionId + ].join('-'); + } + + /** + * get all visible connection panel elements + * @returns {*|T|{}} + */ + getConnectionElements(){ + return [...this.moduleElement.getElementsByClassName(this._config.connectionInfoPanelClass)] + .filter(el => el.id !== this.getConnectionElementId()); + } + + /** + * module header + * @param text + * @returns {HTMLDivElement} + */ + newHeaderElement(text){ + let headEl = super.newHeaderElement(text); + + let toolbarEl = this.newHeadlineToolbarElement(); + + let iconMassEl = this.newIconElement([ + 'fa-male', 'fa-fw', + this._config.moduleHeadlineIconClass, + this._config.moduleHeadlineIconCurrentMassClass, + this._config.showShip ? 'active' : '' + ]); + iconMassEl.setAttribute('title', 'toggle current ship mass'); + + let iconRefreshEl = this.newIconElement([ + 'fa-sync', 'fa-fw', + this._config.moduleHeadlineIconClass, + this._config.moduleHeadlineIconRefreshClass + ]); + iconRefreshEl.setAttribute('title', 'refresh all'); + + toolbarEl.append(iconMassEl, iconRefreshEl); + headEl.append(toolbarEl); + + return headEl; + } + + /** + * get info control panel element + * @param mapId + * @returns {HTMLDivElement} + */ + newInfoPanelControlEl(mapId){ + let connectionEl = this.newConnectionElement(mapId); + connectionEl.append( + this.newControlElement('add connection  ctrl + click', [], ['fa-plus']) + ); + + return connectionEl; + } + + /** + * get new connection element + * @param mapId + * @param connectionId + * @returns {HTMLDivElement} + */ + newConnectionElement(mapId, connectionId = 0){ + let connectionEl = document.createElement('div'); + connectionEl.id = this.getConnectionElementId(connectionId); + connectionEl.classList.add(this._config.connectionInfoPanelClass); + $(connectionEl).data({ + mapId: mapId, + connectionId: connectionId + }); + + return connectionEl; + } + + /** + * render module + * @param mapId + * @param connections + * @returns {HTMLElement} + */ + render(mapId, connections){ + this._mapId = mapId; + + let rowEl = document.createElement('div'); + rowEl.classList.add(this._config.bodyClassName, 'grid'); + rowEl.append(this.newInfoPanelControlEl(mapId)); + this.moduleElement.append(rowEl); + + this.updateConnectionPanels(mapId, MapUtil.getDataByConnections(connections), []); + this.setModuleObserver(); + + return this.moduleElement; + } + + /** + * set module observer + */ + setModuleObserver(){ + $(document).off('pf:updateConnectionInfoModule').on('pf:updateConnectionInfoModule', (e, data) => { + this.updateConnectionPanels( + data.mapId, + MapUtil.getDataByConnections(data.connectionsUpdate), + MapUtil.getDataByConnections(data.connectionsRemove) + ); + }); + + $(document).off('pf:activeShip').on('pf:activeShip', (e) => { + $(this.moduleElement).find('.' + this._config.connectionInfoPanelClass).each((i, connectionElement) => { + $(connectionElement).find('.' + this._config.moduleTableClass).each((i, tableElement) => { + $(tableElement).trigger('pf:calcInfoTable'); + }); + }); + }); + + // init toggle active ship ---------------------------------------------------------------- + $(this.moduleElement).find('.' + this._config.moduleHeadlineIconCurrentMassClass).on('click', e => { + let currentMassIcon = $(e.target).toggleClass('active'); + $(this.moduleElement).find('.' + this._config.connectionInfoPanelClass).each((i, connectionElement) => { + $(connectionElement).find('.' + this._config.moduleTableClass).each((i, tableElement) => { + $(tableElement).data('showShip', currentMassIcon.hasClass('active')).trigger('pf:calcInfoTable'); + }); + }); + }); + + // init refresh connections --------------------------------------------------------------- + $(this.moduleElement).find('.' + this._config.moduleHeadlineIconRefreshClass).on('click', e => { + this.refreshConnectionPanels(); + }); + + // init tooltips + $(this.moduleElement).initTooltips({ + html: true + }); + } + + /** + * refresh all connection panels in a module + */ + refreshConnectionPanels(){ + let connectionsData = this.getConnectionsDataFromModule(); + this.updateConnectionPanels(this._mapId, connectionsData.connectionsDataUpdate, connectionsData.connectionsDataRemove); + } + + + /** + * get connections from ModuleElement + * -> validate with current map data + * @returns {{connectionsDataUpdate: Array, connectionsDataRemove: Array}} + */ + getConnectionsDataFromModule(){ + let activeMap = Util.getMapModule().getActiveMap(); + let mapData = activeMap.getMapDataFromClient(['hasId']); + let connectionsData = { + connectionsDataUpdate: [], + connectionsDataRemove: [], + }; + + if(mapData !== false){ + this.getConnectionElements().forEach((connectionElement, i) => { + let removeConnectionPanel = true; + let connectionData = {id: $(connectionElement).data('connectionId') }; + + let connection = $().getConnectionById(this._mapId, connectionData.id); + if(connection){ + let connectionDataTemp = MapUtil.getDataByConnection(connection); + if(connectionDataTemp.id > 0){ + // connection still on map - OK + removeConnectionPanel = false; + connectionData = connectionDataTemp; + } + } + + if(removeConnectionPanel){ + connectionsData.connectionsDataRemove.push(connectionData); + }else{ + connectionsData.connectionsDataUpdate.push(connectionData); + } + }); + } + + return connectionsData; + } + + /** + * enrich connectionData with "logs" data (if available) and other "missing" data + * @param connectionsData + * @param newConnectionsData + * @returns {*} + */ + enrichConnectionsData(connectionsData, newConnectionsData){ + for(let i = 0; i < connectionsData.length; i++){ + for(let newConnectionData of newConnectionsData){ + if(connectionsData[i].id === newConnectionData.id){ + // copy some missing data + connectionsData[i].character = newConnectionData.character; + connectionsData[i].created = newConnectionData.created; + connectionsData[i].type = newConnectionData.type; + // check for mass logs and copy data + if(newConnectionData.logs && newConnectionData.logs.length){ + connectionsData[i].logs = newConnectionData.logs; + } + // check for signatures and copy data + if(newConnectionData.signatures && newConnectionData.signatures.length){ + connectionsData[i].signatures = newConnectionData.signatures; + } + break; + } + } + } + return connectionsData; + } + + /** + * @param mapId + * @param connectionsData + * @returns {Promise} + */ + getConnectionsLogData(mapId, connectionsData){ + let connectionIds = connectionsData.map(connectionData => connectionData.id); + + // show loading animation + for(let connectionId of connectionIds){ + let tableEls = this.moduleElement.querySelector('#' + this.getConnectionElementId(connectionId)) + .getElementsByTagName('table'); + $(tableEls).showLoadingAnimation(); + } + + return this.request('GET', 'Connection', connectionIds, { + mapId: mapId, + addData : ['signatures', 'logs'], + // filterData : ['logs'] // do not exclude connections with NO "logs" -> sig data will be used as well + }, { + connectionsData: connectionsData + }, context => { + // hide loading animation + for(let contextData of context.connectionsData){ + let connectionEl = this.moduleElement.querySelector('#' + this.getConnectionElementId(contextData.id)); + // connectionEl might be removed in meantime ( e.g. module removed) + if(connectionEl){ + let tableEls = connectionEl.getElementsByTagName('table'); + $(tableEls).hideLoadingAnimation(); + } + } + }); + } + + /** + * replace/insert dataTables log data + * @param connectionsData + */ + addConnectionsData(connectionsData){ + + let getRowIndexesByData = (tableApi, colName, value) => { + return tableApi.rows().eq(0).filter((rowIdx) => { + return (tableApi.cell(rowIdx, colName + ':name').data() === value); + }); + }; + + for(let connectionData of connectionsData){ + // find related dom element for current connection + let connectionElement = document.getElementById(this.getConnectionElementId(connectionData.id)); + if(connectionElement){ + // attach connectionData to connection information for later use ------------------ + let connectionInfoElement = $(connectionElement.querySelector('.' + this._config.moduleTableClass)); + connectionInfoElement.data('connectionData', connectionData); + + // update dataTable --------------------------------------------------------------- + let tableApi = $(connectionElement).find('.dataTable').dataTable().api(); + + if(connectionData.logs && connectionData.logs.length > 0){ + for(let i = 0; i < connectionData.logs.length; i++){ + let rowData = connectionData.logs[i]; + let rowNew; + let animationStatus = null; + let indexes = getRowIndexesByData(tableApi, 'index', rowData.id); + if(indexes.length === 0){ + // row not found -> add new row + rowNew = tableApi.row.add(rowData); + animationStatus = 'added'; + }else{ + // update row with FIRST index + let row = tableApi.row(parseInt(indexes[0])); + let rowDataCurrent = row.data(); + + // check if row data changed + if(rowDataCurrent.updated.updated !== rowData.updated.updated){ + // ... row changed -> delete old and re-add + // -> cell actions might have changed + row.remove(); + rowNew = tableApi.row.add(rowData); + animationStatus = 'changed'; + } + } + + if( + animationStatus !== null && + rowNew.length > 0 + ){ + rowNew.nodes().to$().data('animationStatus', animationStatus); + } + } + }else{ + // clear table or leave empty + tableApi.clear(); + } + + // redraw dataTable + tableApi.draw(false); + } + } + } + + /** + * get connection information element + * @param connectionData + * @returns {HTMLDivElement} + */ + getInformationElement(connectionData){ + + // connection scope ----------------------------------------------------------------------- + let scopeLabel = MapUtil.getScopeInfoForConnection(connectionData.scope, 'label'); + + let element = document.createElement('div'); + element.classList.add(BaseModule.Util.config.dynamicAreaClass, this._config.controlAreaClass); + + $(element).append( + $('', { + class: ['table', 'table-condensed', 'pf-table-fixed', this._config.moduleTableClass].join(' ') + }).data('showShip', this._config.showShip).append( + $('').append( + $('').append( + $('').append( + $('').append( + $('').append( + $('', { + class: this._config.connectionInfoTableRowMassLogClass + }).append( + $('', { + class: this._config.connectionInfoTableRowMassShipClass + }).append( + $('').append( + $(''); + + connectionElement.append(tableEl); + + // init empty table + let tableApi = $(tableEl).DataTable({ + dom: '<"flex-row flex-between ' + module._config.tableToolbarCondensedClass + '"' + + '<"flex-col"i><"flex-col flex-grow"p><"flex-col"BS>>' + + '<"flex-row"<"flex-col flex-grow"tr>>', + buttons: { + name: 'tableTools', + buttons: [ + { + name: 'addLog', + tag: 'a', + className: module._config.moduleHeadlineIconClass, + text: '', + action: function(e, tableApi, node, conf){ + let logData = {}; + + // pre-fill form with current character data (if available) + let currentUserData = Util.getCurrentUserData(); + if(currentUserData && currentUserData.character){ + logData.character = { + id: currentUserData.character.id, + name: currentUserData.character.name + }; + if(currentUserData.character.log){ + logData.ship = { + id: currentUserData.character.log.ship.typeId, + name: currentUserData.character.log.ship.typeName, + mass: currentUserData.character.log.ship.mass + }; + } + } + + module.showLogDialog(connectionElement, connectionData, logData); + } + } + ] + }, + pageLength: 8, + paging: true, + pagingType: 'simple', + lengthChange: false, + ordering: true, + order: [[ 4, 'desc' ]], + info: true, + searching: false, + hover: false, + autoWidth: false, + language: { + emptyTable: 'No jumps recorded', + info: '_START_ - _END_ of _MAX_', + infoEmpty: '', + paginate: { + previous: '', + next: '' + } + }, + columnDefs: [ + { + targets: 0, + name: 'index', + title: '', + orderable: false, + searchable: false, + width: 20, + className: ['text-center', 'txt-color'].join(' '), + data: 'id', + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + if( + !rowData.record || + (rowData.updated.updated !== rowData.created.created) + ){ + // log was manually modified or added + $(cell) + .addClass(Util.config.helpClass) + .addClass( 'txt-color-orange').tooltip({ + title: 'added/updated manually' + }); + } + } + },{ + targets: 1, + name: 'ship', + title: '', + width: 26, + orderable: false, + className: [Util.config.helpDefaultClass, 'text-center', module._config.tableCellImageClass].join(' '), + data: 'ship', + render: { + _: function(data, type, row){ + let value = data.typeId; + if(type === 'display'){ + value = ''; + } + return value; + } + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + $(cell).find('img').tooltip(); + } + },{ + targets: 2, + name: 'character', + title: '', + width: 26, + orderable: false, + className: [Util.config.helpDefaultClass, 'text-center', module._config.tableCellImageClass].join(' '), + data: 'character', + render: { + _: (cellData, type, rowData, meta) => { + let value = cellData.name; + if(type === 'display'){ + value = ''; + } + return value; + } + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + $(cell).find('img').tooltip(); + } + },{ + targets: 3, + name: 'mass', + title: 'mass', + className: ['text-right'].join(' ') , + data: 'ship.mass', + render: { + _: (cellData, type, rowData, meta) => { + let value = cellData; + if(type === 'display'){ + value = Util.formatMassValue(value); + if(!rowData.active){ + // log is "deleted" + value = '' + value + ''; + } + } + return value; + } + } + },{ + targets: 4, + name: 'created', + title: 'log', + width: 55, + className: ['text-right', module._config.tableCellCounterClass].join(' '), + data: 'created.created' + },{ + targets: 5, + name: 'edit', + title: '', + orderable: false, + searchable: false, + width: 10, + className: ['text-center', module._config.tableCellActionClass, module._config.moduleHeadlineIconClass].join(' '), + data: null, + render: { + display: data => { + let icon = ''; + if(data.active){ + icon = ''; + } + return icon; + } + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let tableApi = this.api(); + + if($(cell).is(':empty')){ + $(cell).removeClass(module._config.tableCellActionClass + ' ' + module._config.moduleHeadlineIconClass); + }else{ + $(cell).on('click', function(e){ + module.showLogDialog(connectionElement, connectionData, rowData); + }); + } + } + },{ + targets: 6, + name: 'delete', + title: '', + orderable: false, + searchable: false, + width: 10, + className: ['text-center', module._config.tableCellActionClass].join(' '), + data: 'active', + render: { + display: data => { + let val = ''; + if(data){ + val = ''; + } + return val; + } + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let tableApi = this.api(); + + if(rowData.active){ + let confirmationSettings = { + title: '---', + template: Util.getConfirmationTemplate(null, { + size: 'small', + noTitle: true + }), + onConfirm : function(e, target){ + // get current row data (important!) + // -> "rowData" param is not current state, values are "on createCell()" state + rowData = tableApi.row($(cell).parents('tr')).data(); + + $(connectionElement.getElementsByTagName('table')).showLoadingAnimation(); + + module.request('DELETE', 'Log', rowData.id, {}, { + connectionElement: connectionElement + }, module.requestAlways) + .then( + payload => { + module.addConnectionsData(module.enrichConnectionsData([connectionData], payload.data)); + }, + Util.handleAjaxErrorResponse + ); + } + }; + + // init confirmation dialog + $(cell).confirmation(confirmationSettings); + }else { + $(cell).on('click', function(e){ + $(connectionElement.getElementsByTagName('table')).showLoadingAnimation(); + + let requestData = { + active: 1 + }; + + module.request('PATCH', 'Log', rowData.id, requestData, { + connectionElement: connectionElement + }, module.requestAlways) + .then( + payload => { + module.addConnectionsData(module.enrichConnectionsData([connectionData], payload.data)); + }, + Util.handleAjaxErrorResponse + ); + }); + } + } + } + ], + initComplete: function(settings, json){ + Counter.initTableCounter(this, ['created:name']); + }, + drawCallback: function(settings){ + let animationRows = this.api().rows().nodes().to$().filter(function(a,b ){ + return ( + $(this).data('animationStatus') || + $(this).data('animationTimer') + ); + }); + + for(let i = 0; i < animationRows.length; i++){ + $(animationRows[i]).pulseBackgroundColor($(animationRows[i]).data('animationStatus')); + $(animationRows[i]).removeData('animationStatus'); + } + + }, + footerCallback: function(row, data, start, end, display ){ + let tableApi = this.api(); + let sumColumnIndexes = ['mass:name', 'delete:name']; + + // column data for "sum" columns over this page + let pageTotalColumns = tableApi + .columns(sumColumnIndexes, { page: 'all'} ) + .data(); + + // sum columns for "total" sum + pageTotalColumns.each((colData, colIndex) => { + pageTotalColumns[colIndex] = colData.reduce((sum, val, rowIndex) => { + // sum "mass" (colIndex 0) only if not "deleted" (colIndex 1) + if(colIndex === 0 && pageTotalColumns[1][rowIndex]){ + return sum + parseInt(val); + }else{ + return sum; + } + }, 0); + }); + + sumColumnIndexes.forEach((colSelector, index) => { + // only "mass" column footer needs updates + if(colSelector === 'mass:name'){ + $(tableApi.column(colSelector).footer()).text( Util.formatMassValue(pageTotalColumns[index]) ); + + // save mass for further reCalculation of "info" table + $(connectionElement).find('.' + module._config.connectionInfoTableCellMassLogClass).data('mass', pageTotalColumns[index]); + } + }); + + // calculate "info" table ----------------------------------------------------- + $(connectionElement).find('.' + module._config.moduleTableClass).trigger('pf:updateInfoTable', $(connectionElement).data()); + } + }); + + // find position to insert + rowElement.querySelector('#' + module.getConnectionElementId()).insertAdjacentElement('beforebegin', connectionElement); + + + tableApi.on('order.dt search.dt', function(){ + let pageInfo = tableApi.page.info(); + tableApi.column('index:name', {search:'applied', order:'applied'}).nodes().each((cell, i) => { + let content = (pageInfo.recordsTotal - i) + '.'; + $(cell).html(content); + }); + }); + } + } + + /** + * callback after ajax request + * -> is always called regardless of error response or not + * @param context + */ + requestAlways(context){ + $(context.connectionElement.getElementsByTagName('table')).hideLoadingAnimation(); + } + + /** + * show jump log dialog + * @param connectionElement + * @param connectionData + * @param logData + */ + showLogDialog(connectionElement, connectionData, logData = {}){ + + let data = { + id: this._config.connectionDialogId, + typeSelectId: this._config.typeSelectId, + shipMassId: this._config.shipMassId, + characterSelectId: this._config.characterSelectId, + logData: logData, + massFormat: () => { + return (val, render) => { + return (parseInt(render(val) || 0) / 1000) || ''; + }; + } + }; + + requirejs(['text!templates/dialog/connection_log.html', 'mustache'], (template, Mustache) => { + let content = Mustache.render(template, data); + + let connectionDialog = bootbox.dialog({ + title: 'Jump log', + message: content, + show: false, + buttons: { + close: { + label: 'cancel', + className: 'btn-default' + }, + success: { + label: ' save', + className: 'btn-success', + callback: e => { + let form = $(e.delegateTarget).find('form'); + + // validate form + form.validator('validate'); + + // check whether the form is valid + let formValid = form.isValidForm(); + + if(formValid){ + // get form data + let formData = form.getFormValues(); + formData.id = Util.getObjVal(logData, 'id') || 0; + formData.connectionId = Util.getObjVal(connectionData, 'id') || 0; + formData.shipTypeId = Util.getObjVal(formData, 'shipTypeId') || 0; + formData.shipMass = parseInt((Util.getObjVal(formData, 'shipMass') || 0) * 1000); + formData.characterId = Util.getObjVal(formData, 'characterId') || 0; + + // we need some "additional" form data from the Select2 dropdown + // -> data is required on the backend side + let formDataShip = form.find('#' + this._config.typeSelectId).select2('data'); + let formDataCharacter = form.find('#' + this._config.characterSelectId).select2('data'); + formData.shipTypeName = formDataShip.length ? formDataShip[0].text : ''; + formData.characterName = formDataCharacter.length ? formDataCharacter[0].text : ''; + + let method = formData.id ? 'PATCH' : 'PUT'; + + this.request(method, 'Log', formData.id, formData, { + connectionElement: connectionElement, + formElement: form + }, this.requestAlways) + .then( + payload => { + this.addConnectionsData(this.enrichConnectionsData([connectionData], payload.data)); + $(e.delegateTarget).modal('hide'); + }, + Util.handleAjaxErrorResponse + ); + + } + + return false; + } + } + } + }); + + connectionDialog.on('show.bs.modal', e => { + let modalContent = $(e.target); + + // init type select live search + let selectElementType = modalContent.find('#' + this._config.typeSelectId); + selectElementType.initUniverseTypeSelect({ + categoryIds: [6], + maxSelectionLength: 1, + selected: [Util.getObjVal(logData, 'ship.typeId')] + }).on('select2:select select2:unselecting', e => { + // get ship mass from selected ship type and update mass input field + let shipMass = e.params.data ? e.params.data.mass / 1000 : ''; + modalContent.find('#' + this._config.shipMassId).val(shipMass); + }); + + // init character select live search + let selectElementCharacter = modalContent.find('#' + this._config.characterSelectId); + selectElementCharacter.initUniverseSearch({ + categoryNames: ['character'], + maxSelectionLength: 1 + }); + + }); + + // show dialog + connectionDialog.modal('show'); + }); + } + + /** + * init module + */ + init(){ + super.init(); + } + }; + + ConnectionInfoModule.isPlugin = false; // module is defined as 'plugin' + ConnectionInfoModule.scope = 'connection'; // module scope controls how module gets updated and what type of data is injected + ConnectionInfoModule.sortArea = 'a'; // default sortable area + ConnectionInfoModule.position = 1; // default sort/order position within sortable area + ConnectionInfoModule.label = 'Mass tracking'; // static module label (e.g. description) + + ConnectionInfoModule.defaultConfig = { + className: 'pf-connection-info-module', // class for module + sortTargetAreas: ['a', 'b', 'c'], // sortable areas where module can be dragged into + headline: 'Connection', // headline toolbar - moduleHeadlineIconClass: 'pf-module-icon-button', // class for toolbar icons in the head moduleHeadlineIconRefreshClass: 'pf-module-icon-button-refresh', // class for "refresh" icon moduleHeadlineIconCurrentMassClass: 'pf-module-icon-button-mass', // class for "current ship mass" toggle icon + // body connectionInfoPanelClass: 'pf-connection-info-panel', // class for connection info panels - connectionInfoPanelId: 'pf-connection-info-panel-', // id prefix for connection info panels - - controlAreaClass: 'pf-module-control-area', // class for "control" areas // info table moduleTableClass: 'pf-module-table', // class for module tables @@ -62,1257 +1283,5 @@ define([ showShip: true // default for "show current ship mass" toggle }; - /** - * get module toolbar element - * @returns {*|jQuery|HTMLElement|void} - */ - let getHeadlineToolbar = () => { - let headlineToolbar = $('
    ', { - class: 'pull-right' - }).append( - $('', { - class: ['fas', 'fa-fw', 'fa-male', - config.showShip ? 'active' : '' , - config.moduleHeadlineIconClass, - config.moduleHeadlineIconCurrentMassClass].join(' '), - title: 'toggle current ship mass' - }).attr('data-html', 'true').attr('data-toggle', 'tooltip'), - $('', { - class: ['fas', 'fa-fw', 'fa-sync', - config.moduleHeadlineIconClass, - config.moduleHeadlineIconRefreshClass].join(' '), - title: 'refresh all' - }).attr('data-html', 'true').attr('data-toggle', 'tooltip') - ); - - headlineToolbar.find('[data-toggle="tooltip"]').tooltip({ - container: 'body' - }); - - return headlineToolbar; - }; - - /** - * get new connection element - * @param mapId - * @param connectionId - * @returns {jQuery} - */ - let getConnectionElement = (mapId, connectionId) => { - return $('
    ', { - id: getConnectionElementId(connectionId), - class: ['col-xs-12', 'col-sm-4', 'col-lg-3' , config.connectionInfoPanelClass].join(' ') - }).data({ - mapId: mapId, - connectionId: connectionId - }); - }; - - /** - * get info control panel element - * @param mapId - * @returns {void|jQuery|*} - */ - let getInfoPanelControl = mapId => { - return getConnectionElement(mapId, 0).append($('
    ', { - class: [Util.config.dynamicAreaClass, config.controlAreaClass].join(' '), - html: ' add connection  ctrl + click' - })); - }; - - /** - * get connection information element - * @param connectionData - * @returns {void|*|jQuery|HTMLElement} - */ - let getInformationElement = (connectionData) => { - - // connection scope ----------------------------------------------------------------------- - let scopeLabel = MapUtil.getScopeInfoForConnection(connectionData.scope, 'label'); - - let element = $('
    ', { - class: [Util.config.dynamicAreaClass, config.controlAreaClass].join(' ') - }).append( - $('
    ', { + class: ['pf-table-cell-20', 'text-right', Util.config.helpClass, 'pf-pie-chart'].join(' ') + }).attr('data-toggle', 'tooltip').attr('data-percent', '-100').easyPieChart({ + barColor: (percent) => { + let color = '#e28a0d'; + if((percent * -1) >= 100){ + color = '#a52521'; + } + return color; + }, + overrideOptions: 'signed', + trackColor: '#5cb85c', + size: 14, + scaleColor: false, + lineWidth: 2, + lineCap: 'butt', + animate: false + }), + $('', { + class: ['text-right'].join(' ') + }).attr('colspan', 2).append( + $('', { + class: 'pf-link', + html: connectionData.sourceAlias + '  ' + }).on('click', function(){ + Util.triggerMenuAction(Util.getMapModule().getActiveMap(), 'SelectSystem', {systemId: connectionData.source}); + }), + $('', { + class: [this._config.connectionInfoTableLabelSourceClass].join(' ') + }), + $('', { + class: 'fas fa-fw fa-angle-double-right' + }), + $('', { + class: [this._config.connectionInfoTableLabelTargetClass].join(' ') + }), + $('', { + class: 'pf-link', + html: '  ' + connectionData.targetAlias + }).on('click', function(){ + Util.triggerMenuAction(Util.getMapModule().getActiveMap(), 'SelectSystem', {systemId: connectionData.target}); + }) + ) + ) + ), + $('
    ', { + class: ['text-right', Util.config.helpClass, this._config.connectionInfoTableCellMassTotalTooltipClass].join(' '), + html: '' + }), + $('', { + text: scopeLabel.capitalize() + }), + $('', { + class: ['text-right', this._config.connectionInfoTableCellConnectionClass].join(' ') + }).append( + $('
    ', { + class: MapUtil.getConnectionFakeClassesByTypes(connectionData.type).join(' ') + }) + ) + ), + $('
    ', { + class: ['text-right', Util.config.helpClass].join(' '), + html: '', + title: 'initial mass. From signature table' + }).attr('data-toggle', 'tooltip'), + $('', { + text: 'Total mass' + }), + $('', { + class: ['text-right', 'txt-color', this._config.connectionInfoTableCellMassTotalClass].join(' ') + }) + ), + $('
    ', { + class: ['text-right', Util.config.helpClass].join(' '), + title: 'recorded total jump mass' + }).attr('data-toggle', 'tooltip').append( + $('', { + class: [ + 'fas', 'fa-fw', 'fa-question-circle' + ].join(' ') + }), + $('', { + class: [ + 'fas', 'fa-fw', 'fa-adjust', + 'txt-color', 'txt-color-warning', + 'hidden' + ].join(' ') + }), + $('', { + class: [ + 'far', 'fa-fw', 'fa-circle', + 'txt-color', 'txt-color-danger', + 'hidden' + ].join(' ') + }) + ), + $('', { + text: 'Logged mass' + }), + $('', { + class: ['text-right', this._config.connectionInfoTableCellMassLogClass].join(' ') + }) + ), + $('
    ', { + class: ['text-right', Util.config.helpClass].join(' '), + title: 'current ship mass' + }).attr('data-toggle', 'tooltip').append( + $('', { + class: ['fas', 'fa-fw', 'fa-question-circle'].join(' ') + }), + $('', { + class: [ + 'fas', 'fa-fw', 'fa-exclamation-triangle', + 'txt-color', 'txt-color-danger', + 'hidden' + ].join(' ') + }) + ), + $('', { + class: ['pf-table-cell-ellipses-auto'].join(' '), + text: 'Ship mass' + }), + $('', { + class: ['text-right', 'txt-color', this._config.connectionInfoTableCellMassShipClass].join(' ') + }) + ), + $('
    ', { + class: ['text-right', Util.config.helpClass].join(' '), + html: '', + title: 'max. mass left' + }).attr('data-toggle', 'tooltip'), + $('', { + text: 'Mass left' + }), + $('', { + class: ['text-right', 'txt-color', this._config.connectionInfoTableCellMassLeftClass].join(' ') + }) + ) + ) + ).on('pf:updateInfoTable', (e, data) => { + // update information table ------------------------------------------------------- + let tableElement = $(e.target); + let connectionData = tableElement.data('connectionData'); + if(connectionData){ + if(connectionData.scope === 'wh'){ + // update signature information ------------------------------------------- + let sourceLabelElement = tableElement.find('.' + this._config.connectionInfoTableLabelSourceClass); + let targetLabelElement = tableElement.find('.' + this._config.connectionInfoTableLabelTargetClass); + + // get related jsPlumb connection + let connection = $().getConnectionById(data.mapId, data.connectionId); + let signatureTypeNames = MapUtil.getConnectionDataFromSignatures(connection, connectionData); + + let sourceLabels = signatureTypeNames.source.labels; + let targetLabels = signatureTypeNames.target.labels; + sourceLabelElement.html(MapUtil.formatEndpointOverlaySignatureLabel(sourceLabels)); + targetLabelElement.html(MapUtil.formatEndpointOverlaySignatureLabel(targetLabels)); + + // remove K162 + sourceLabels = sourceLabels.diff(['K162']); + targetLabels = targetLabels.diff(['K162']); + + // get static wormhole data by endpoint Labels + let wormholeName = ''; + let wormholeData = null; + if(sourceLabels.length === 1 && targetLabels.length === 0){ + wormholeName = sourceLabels[0]; + }else if(sourceLabels.length === 0 && targetLabels.length === 1){ + wormholeName = targetLabels[0]; + } + + if( + wormholeName && + Init.wormholes.hasOwnProperty(wormholeName) + ){ + wormholeData = Object.assign({}, Init.wormholes[wormholeName]); + + // init wormhole tooltip ---------------------------------------------- + let massTotalTooltipCell = tableElement.find('.' + this._config.connectionInfoTableCellMassTotalTooltipClass); + massTotalTooltipCell.addWormholeInfoTooltip(wormholeData); + } + + // all required data is set -> re-calculate rows + tableElement.data('wormholeData', wormholeData); + tableElement.trigger('pf:calcInfoTable'); + } + + } + }).on('pf:calcInfoTable', e => { + // re-calculate information table from .data() cell values ------------------------ + let tableElement = $(e.target); + let connectionData = tableElement.data('connectionData'); + let massChartCell = tableElement.find('[data-percent]'); + + let wormholeData = tableElement.data('wormholeData'); + let shipData = null; + let shipName = ''; + let showShip = Boolean(tableElement.data('showShip')); + let massLogRow = tableElement.find('.' + this._config.connectionInfoTableRowMassLogClass); + let massShipRow = tableElement.find('.' + this._config.connectionInfoTableRowMassShipClass); + + // icons + let massLogTooltipIcon = massLogRow.find('i.fa-question-circle'); + let massLogStage2Icon = massLogRow.find('i.fa-adjust'); + let massLogStage3Icon = massLogRow.find('i.fa-circle'); + + let massShipTooltipIcon = massShipRow.find('i.fa-question-circle'); + let massShipWarningIcon = massShipRow.find('i.fa-exclamation-triangle'); + + // table cells + let connectionCell = tableElement.find('.' + this._config.connectionInfoTableCellConnectionClass); + let massTotalCell = tableElement.find('.' + this._config.connectionInfoTableCellMassTotalClass); + let massLogCell = tableElement.find('.' + this._config.connectionInfoTableCellMassLogClass); + let massShipCell = tableElement.find('.' + this._config.connectionInfoTableCellMassShipClass); + let massLeftCell = tableElement.find('.' + this._config.connectionInfoTableCellMassLeftClass); + let massTotal = null; // initial connection mass + let massReduction = 0; // default reduction (e.g. reduced, crit) in percent + let massLog = massLogCell.data('mass'); // recorded mass + let massLogTotal = massLog; // recorded mass + current ship + let massIndividual = null; // mass mass per jump + let massShip = 0; // current ship + let massIndividualError = false; + + // get wormhole data from signature binding --------------------------------------- + if(wormholeData){ + massTotal = parseInt(wormholeData.massTotal); + massIndividual = parseInt(wormholeData.massIndividual); + } + + // get connection type (show fake connection div) --------------------------------- + connectionCell.find('div').removeClass().addClass(MapUtil.getConnectionFakeClassesByTypes(connectionData.type).join(' ')); + + // get wormhole status ------------------------------------------------------------ + if(connectionData.type.indexOf('wh_critical') !== -1){ + massReduction = 90; + massLogTooltipIcon.toggleClass('hidden', true); + massLogStage2Icon.toggleClass('hidden', true); + massLogStage3Icon.toggleClass('hidden', false); + massLogStage3Icon.parent().attr('title', 'stage 3 (critical)').tooltip('fixTitle'); + }else if(connectionData.type.indexOf('wh_reduced') !== -1){ + massReduction = 50; + massLogTooltipIcon.toggleClass('hidden', true); + massLogStage2Icon.toggleClass('hidden', false); + massLogStage3Icon.toggleClass('hidden', true); + massLogStage3Icon.parent().attr('title', 'stage 2 (reduced)').tooltip('fixTitle'); + }else{ + massLogTooltipIcon.toggleClass('hidden', false); + massLogStage2Icon.toggleClass('hidden', true); + massLogStage3Icon.toggleClass('hidden', true); + massLogStage3Icon.parent().attr('title', 'recorded total jump mass').tooltip('fixTitle'); + } + + if(massReduction){ + let massLogReduction = massTotal / 100 * massReduction; + if(massLogReduction > massLog){ + massLog = massLogTotal = massLogReduction; + } + } + + // get current ship data ---------------------------------------------------------- + massShipCell.parent().toggle(showShip); + if(showShip){ + shipData = Util.getObjVal(Util.getCurrentCharacterData('log'), 'ship'); + if(shipData){ + if(shipData.mass){ + massShip = parseInt(shipData.mass); + + // check individual mass jump + if(massIndividual){ + massIndividualError = massShip > massIndividual; + } + } + if(shipData.typeId && shipData.typeName){ + shipName = shipData.typeName; + } + } + } + + // update ship mass and "individual mass" cells ---------------------------------- + massShipTooltipIcon.toggleClass('hidden', massIndividualError); + massShipWarningIcon.toggleClass('hidden', !massIndividualError); + let shipMassTooltip = 'current ship mass ' + (shipName ? '"' + shipName + '"' : ''); + if(massIndividualError){ + shipMassTooltip = '"' + shipName + '" exceeds max jump mass for this connection: ' + Util.formatMassValue(massIndividual); + }else{ + // current ship mass check is OK -> add to massLogTotal + massLogTotal += massShip; + } + massShipTooltipIcon.parent().attr('title', shipMassTooltip).tooltip('fixTitle'); + + // current ship mass -------------------------------------------------------------- + massShipCell.html( function(){ + let cell = $(this); + let value = ' '; + let error = false; + let textLineThrough = false; + if(massShip > 0){ + value += Util.formatMassValue(massShip); + if(massIndividualError){ + error = textLineThrough = true; + value = '  ' + value; + }else{ + value = '-' + value; + } + }else{ + error = true; + value = 'undefined'; + } + + // change cell style + cell.toggleClass('txt-color-red', error) + .toggleClass('txt-color-warning', !error) + .toggleClass('pf-font-line-through', textLineThrough); + + return value; + }); + + // calculate mass left ------------------------------------------------------------ + let massLeft = massTotal - massLogTotal; + massLeft = (massLeft < 0) ? 0 : massLeft; + let massPercentLog = (massTotal > 0) ? Math.floor((100 / massTotal) * massLogTotal) : 0; + + // update easyPieChart and tooltip ------------------------------------------------ + let massPercentLeft = (100 - massPercentLog <= 0) ? 0 : '< ' + (100 - massPercentLog); + massChartCell.data('easyPieChart').enableAnimation().update(massPercentLog * -1); + massChartCell.attr('title', massPercentLeft + '% mass left').tooltip('fixTitle'); + + // update mass cells -------------------------------------------------------------- + massTotalCell.html(massTotal > 0 ? Util.formatMassValue(massTotal) : 'undefined') + .toggleClass('txt-color-red', massTotal <= 0); + massLogCell.html('- ' + Util.formatMassValue(massLog)); + massLeftCell.html( + massLeft > 0 ? + '~ ' + Util.formatMassValue(massLeft) : + (massLeft === 0 && massTotal) ? + 'will collapse' : 'undefined') + .toggleClass('txt-color-red', massLeft <= 0) + .toggleClass('txt-color-success', massLeft > 0); + }) + ); + + $(element).find('[data-toggle="tooltip"]').tooltip({ + container: 'body' + }); + + return element; + } + + /** + * update/init multiple connection panels at once + * @param mapId + * @param connectionsDataUpdate + * @param connectionsDataRemove + */ + updateConnectionPanels(mapId, connectionsDataUpdate, connectionsDataRemove){ + for(let connectionData of connectionsDataRemove){ + let connectionElement = this.moduleElement.querySelector('#' + this.getConnectionElementId(connectionData.id)); + this.removeConnectionPanel(connectionElement); + } + + for(let connectionData of connectionsDataUpdate){ + this.updateConnectionPanel(mapId, connectionData); + } + + // request connectionsLogData for each updated connection + if(connectionsDataUpdate.length){ + this.getConnectionsLogData(mapId, connectionsDataUpdate) + //.then(payload => this.addConnectionsData(payload.data)) + .then(payload => this.addConnectionsData( + this.enrichConnectionsData(payload.context.connectionsData, payload.data) + )) + .catch(payload => { + console.error(payload); + }); + } + + // remove module if no connection panel left + // --> all connection deselected on map + let connectionElements = this.getConnectionElements(); + if(connectionElements.length === 0){ + MapUtil.getTabContentElementByMapElement(this.moduleElement).trigger('pf:removeConnectionModules'); + } + + // hide "control" panel when multiple connection + let connectionEl = this.moduleElement.querySelector('#' + this.getConnectionElementId()); + connectionEl.style.display = connectionElements.length < 2 ? 'block' : 'none'; + } + + + /** + * remove connection Panel from moduleElement + * @param connectionElement + */ + removeConnectionPanel(connectionElement){ + connectionElement = $(connectionElement); + if(connectionElement.length){ + // destroy dataTable (and remove table from DOM) + let logTable = connectionElement.find('.' + this._config.connectionInfoTableClass); + logTable.dataTable().api().destroy(true); + // remove belonging connectionElement + connectionElement.remove(); + } + } + + /** + * @param mapId + * @param connectionData + */ + updateConnectionPanel(mapId, connectionData){ + let module = this; + + let rowElement = module.moduleElement.querySelector('.' + module._config.bodyClassName); + let connectionElement = rowElement.querySelector('#' + module.getConnectionElementId(connectionData.id)); + + if(!connectionElement){ + connectionElement = module.newConnectionElement(mapId, connectionData.id); + connectionElement.append(module.getInformationElement(connectionData)); + + let tableEl = document.createElement('table'); + tableEl.classList.add('compact', 'stripe', 'order-column', 'row-border', 'nowrap', module._config.connectionInfoTableClass); + tableEl.insertAdjacentHTML('beforeend', '
    ', { - class: ['table', 'table-condensed', 'pf-table-fixed', config.moduleTableClass].join(' ') - }).data('showShip', config.showShip).append( - $('').append( - $('').append( - $('').append( - $('').append( - $('').append( - $('', { - class: config.connectionInfoTableRowMassLogClass - }).append( - $('', { - class: config.connectionInfoTableRowMassShipClass - }).append( - $('').append( - $(' DOM id by id - * @param tableApi - * @param id - * @returns {*} - */ - let getRowById = (tableApi, id) => { - return tableApi.rows().ids().toArray().find(rowId => rowId === getRowId(Util.getObjVal(getTableMetaData(tableApi), 'type'), id)); - }; - - /** - * get custom "metaData" from dataTables API - * @param tableApi - * @returns {*} - */ - let getTableMetaData = tableApi => { - let data = null; - if(tableApi){ - data = tableApi.init().pfMeta; - } - return data; - }; - - /** - * vormat roman numeric string to int - * -> e.g. 'VII' => 7 - * @param str - * @returns {number} - */ - let romanToInt = str => { - let charToTnt = char => { - switch (char) { - case 'I': return 1; - case 'V': return 5; - case 'X': return 10; - case 'L': return 50; - case 'C': return 100; - case 'D': return 500; - case 'M': return 1000; - default: return -1; - } - }; - - if(str == null) return -1; - let num = charToTnt(str.charAt(0)); - let pre, curr; - - for(let i = 1; i < str.length; i++){ - curr = charToTnt(str.charAt(i)); - pre = charToTnt(str.charAt(i - 1)); - if(curr <= pre){ - num += curr; - }else{ - num = num - pre * 2 + curr; - } + let SystemIntelModule = class SystemIntelModule extends BaseModule { + constructor(config = {}) { + super(Object.assign({}, new.target.defaultConfig, config)); } - return num; - }; + /** + * get status icon for structure + * @param statusData + * @returns {string} + */ + getIconForStatusData(statusData){ + return ''; + } - /** - * callback -> add table rows from grouped tableData - * @param context - * @param tableData - * @param groupedDataKey - */ - let callbackUpdateTableRows = (context, tableData, groupedDataKey = 'structures') => { - let touchedRows = []; - let hadData = context.tableApi.rows().any(); - let notificationCounter = { - added: 0, - changed: 0, - deleted: 0 - }; + /** + * get icon that marks a table cell as clickable + * @returns {string} + */ + getIconForInformationWindow(){ + return ''; + } - if(tableData){ - for(let [rowGroupId, rowGroupData] of Object.entries(tableData)){ - if(rowGroupData[groupedDataKey] && rowGroupData[groupedDataKey].length){ - for(let rowData of rowGroupData[groupedDataKey]){ - let rowId = getRowById(context.tableApi, rowData.id); + /** + * get a dataTableApi instance from global cache + * @param mapId + * @param systemId + * @param tableType + * @returns {*} + */ + getDataTableInstance(mapId, systemId, tableType){ + return BaseModule.Util.getDataTableInstance(this._config.intelTableId, mapId, systemId, tableType); + } - // add rowGroupData as well to each rowData - rowData.rowGroupData = { - id: rowGroupData.id, - name: rowGroupData.name, - groupedDataKey: groupedDataKey - }; + /** + * get dataTable id + * @param {...string} parts e.g. 'tableType', 'mapId', 'systemId' + * @returns {string} + */ + getTableId(...parts){ + return BaseModule.Util.getTableId(this._config.intelTableId, ...parts); + } - if(rowId){ - // update row - let api = context.tableApi.row('#' + rowId); - let rowDataCurrent = api.data(); + /** + * get dataTable row id + * @param tableType + * @param id + * @returns {string} + */ + getRowId(tableType, id){ + return BaseModule.Util.getTableRowId(this._config.intelTableRowIdPrefix, tableType, id); + } - // check for update - if(rowDataCurrent.updated.updated !== rowData.updated.updated){ - // row data changed -> update - api.data(rowData); - notificationCounter.changed++; - } + /** + * get DOM id by id + * @param tableApi + * @param id + * @returns {*} + */ + getRowById(tableApi, id){ + return tableApi.rows().ids().toArray().find(rowId => rowId === this.getRowId(BaseModule.Util.getObjVal(this.getTableMetaData(tableApi), 'type'), id)); + } - touchedRows.push(api.id()); - }else{ - // insert new row - let api = context.tableApi.row.add(rowData); - api.nodes().to$().data('animationStatus', 'added'); - notificationCounter.added++; + /** + * get custom "metaData" from dataTables API + * @param tableApi + * @returns {*} + */ + getTableMetaData(tableApi){ + return tableApi ? tableApi.init().pfMeta : null; + } - touchedRows.push(api.id()); - } - } + /** + * vormat roman numeric string to int + * -> e.g. 'VII' => 7 + * @param str + * @returns {number} + */ + romanToInt(str){ + let charToTnt = char => { + switch (char) { + case 'I': return 1; + case 'V': return 5; + case 'X': return 10; + case 'L': return 50; + case 'C': return 100; + case 'D': return 500; + case 'M': return 1000; + default: return -1; + } + }; + + if(str == null) return -1; + let num = charToTnt(str.charAt(0)); + let pre, curr; + + for(let i = 1; i < str.length; i++){ + curr = charToTnt(str.charAt(i)); + pre = charToTnt(str.charAt(i - 1)); + if(curr <= pre){ + num += curr; + }else{ + num = num - pre * 2 + curr; } } + + return num; } - if(context.removeMissing){ - let api = context.tableApi.rows((idx, data, node) => !touchedRows.includes(node.id)); - notificationCounter.deleted += api.ids().count(); - api.remove(); - } + /** + * render module + * @param mapId + * @param systemData + * @returns {HTMLElement} + */ + render(mapId, systemData){ + this._systemData = systemData; + let showStationTable = ['H', 'L', '0.0', 'C12'].includes(Util.getObjVal(this._systemData, 'security')); - if( - notificationCounter.added > 0 || - notificationCounter.changed > 0 || - notificationCounter.deleted > 0 - ){ - context.tableApi.draw(); - } - - // show notification ------------------------------------------------------------------------------------------ - let notification = ''; - notification += notificationCounter.added > 0 ? notificationCounter.added + ' added
    ' : ''; - notification += notificationCounter.changed > 0 ? notificationCounter.changed + ' changed
    ' : ''; - notification += notificationCounter.deleted > 0 ? notificationCounter.deleted + ' deleted
    ' : ''; - - if(hadData && notification.length){ - Util.showNotify({title: 'Structures updated', text: notification, type: 'success'}); - } - }; - - /** - * callback -> delete structure rows - * @param context - * @param structureIds - */ - let callbackDeleteStructures = (context, structureIds) => { - let deletedCounter = 0; - if(structureIds && structureIds.length){ - for(let structureId of structureIds){ - let rowId = getRowById(context.tableApi, structureId); - if(rowId){ - context.tableApi.row('#' + rowId).remove(); - deletedCounter++; - } - } - } - - if(deletedCounter){ - context.tableApi.draw(); - Util.showNotify({title: 'Structure deleted', text: deletedCounter + ' deleted', type: 'success'}); - } - }; - - /** - * send ajax request - * @param url - * @param requestData - * @param context - * @param callback - */ - let sendRequest = (url, requestData, context, callback) => { - context.moduleElement.showLoadingAnimation(); - - $.ajax({ - url: url, - type: 'POST', - dataType: 'json', - data: requestData, - context: context - }).done(function(data){ - callback(this, data); - }).fail(function(jqXHR, status, error){ - let reason = status + ' ' + error; - Util.showNotify({title: jqXHR.status + ': System intel data', text: reason, type: 'warning'}); - $(document).setProgramStatus('problem'); - }).always(function(){ - // hide loading animation - this.moduleElement.hideLoadingAnimation(); - }); - }; - - /** - * show structure dialog - * @param moduleElement - * @param tableApi - * @param systemId - * @param structureData - * @param bulkData - */ - let showStructureDialog = (moduleElement, tableApi, systemId, structureData = null, bulkData = null) => { - let structureStatusData = Util.getObjVal(Init, 'structureStatus'); - - let statusData = Object.keys(structureStatusData).map((k) => { - let data = structureStatusData[k]; - data.selected = data.id === Util.getObjVal(structureData, 'status.id'); - return data; - }); - - // if current user is currently docked at a structure (not station) - // -> add a modal button for pre-fill modal with it - // -> systemId must match systemId from current character log - let currentUserData = Util.getCurrentUserData(); - let isCurrentLocation = false; - let characterStructureId = Util.getObjVal(currentUserData, 'character.log.structure.id') || 0; - let characterStructureName = Util.getObjVal(currentUserData, 'character.log.structure.name') || ''; - let characterStructureTypeId = Util.getObjVal(currentUserData, 'character.log.structure.type.id') || 0; - let characterStructureTypeName = Util.getObjVal(currentUserData, 'character.log.structure.type.name') || ''; - - if(systemId === Util.getObjVal(currentUserData, 'character.log.system.id')){ - isCurrentLocation = true; - } - - let disableButtonAutoFill = true; - let buttonLabelAutoFill = ' '; - if(characterStructureId){ - buttonLabelAutoFill += characterStructureTypeName + ' "' + characterStructureName + '"'; - if(isCurrentLocation){ - disableButtonAutoFill = false; - } - }else{ - buttonLabelAutoFill += 'unknown structure'; - } - - let data = { - id: config.structureDialogId, - structureData: structureData, - bulkData: bulkData, - structureStatus: statusData, - nameInputId: config.nameInputId, - statusSelectId: config.statusSelectId, - typeSelectId: config.typeSelectId, - corporationSelectId: config.corporationSelectId, - descriptionTextareaId: config.descriptionTextareaId, - descriptionTextareaCharCounter: config.descriptionTextareaCharCounter, - maxDescriptionLength: maxDescriptionLength - }; - - requirejs(['text!templates/dialog/structure.html', 'mustache'], (template, Mustache) => { - let content = Mustache.render(template, data); - let title = 'Structure'; - if(bulkData){ - title += '  (' + bulkData.length + ' rows) '; - } - - let structureDialog = bootbox.dialog({ - title: title, - message: content, - show: false, - buttons: { - close: { - label: 'cancel', - className: 'btn-default pull-left' - }, - autoFill: { - label: buttonLabelAutoFill, - className: 'btn-primary' + - (disableButtonAutoFill ? ' pf-font-italic disabled' : '') + - (bulkData ? ' hidden' : ''), - callback: function(){ - let form = this.find('form'); - form.find('#' + config.nameInputId).val(characterStructureName); - form.find('#' + config.statusSelectId).val(2).trigger('change'); - form.find('#' + config.typeSelectId).val(characterStructureTypeId).trigger('change'); - return false; - } - }, - success: { - label: ' save', - className: 'btn-success', - callback: function(){ - let form = this.find('form'); - - // validate form - form.validator('validate'); - - // check whether the form is valid - let formValid = form.isValidForm(); - - if(formValid){ - // get form data - let formData = form.getFormValues(); - formData.id = Util.getObjVal(structureData, 'id') | 0; - formData.structureId = Util.getObjVal(formData, 'structureId') | 0; - formData.corporationId = Util.getObjVal(formData, 'corporationId') | 0; - formData.systemId = systemId | 0; - - moduleElement.showLoadingAnimation(); - - let method = formData.id ? 'PATCH' : 'PUT'; - let ids = formData.id; - let data = formData; - - if(bulkData){ - // bulk update multiple rows - method = 'POST'; - ids = []; - data = bulkData.map(structureData => { - structureData.corporationId = formData.corporationId; - return structureData; - }); - } - - Util.request(method, 'structure', ids, data, - { - moduleElement: moduleElement, - tableApi: tableApi - }, - context => context.moduleElement.hideLoadingAnimation() - ).then( - payload => callbackUpdateTableRows(payload.context, payload.data), - Util.handleAjaxErrorResponse - ); - }else{ - return false; - } - } - } - } + this._bodyEl = Object.assign(document.createElement('div'), { + className: this._config.bodyClassName }); + this.moduleElement.append(this._bodyEl); - structureDialog.on('show.bs.modal', function(e){ - let modalContent = $('#' + config.structureDialogId); + $(this.moduleElement).showLoadingAnimation(); - // init type select live search - let selectElementType = modalContent.find('#' + config.typeSelectId); - selectElementType.initUniverseTypeSelect({ - categoryIds: [65], - maxSelectionLength: 1, - selected: [Util.getObjVal(structureData, 'structure.id')] - }); - - // init corporation select live search - let selectElementCorporation = modalContent.find('#' + config.corporationSelectId); - selectElementCorporation.initUniverseSearch({ - categoryNames: ['corporation'], - maxSelectionLength: 1 - }); - - // init status select2 - modalContent.find('#' + config.statusSelectId).initStatusSelect({ - data: statusData - }); - - // init char counter - let textarea = modalContent.find('#' + config.descriptionTextareaId); - let charCounter = modalContent.find('.' + config.descriptionTextareaCharCounter); - Util.updateCounter(textarea, charCounter, maxDescriptionLength); - - textarea.on('keyup', function(){ - Util.updateCounter($(this), charCounter, maxDescriptionLength); - }); - - // set form validator (after select2 init finish) - modalContent.find('form').initFormValidation(); - }); - - // show dialog - structureDialog.modal('show'); - }); - }; - - /** - * show D-Scan reader dialog - * @param moduleElement - * @param tableApi - * @param systemData - */ - let showDscanReaderDialog = (moduleElement, tableApi, systemData) => { - requirejs(['text!templates/dialog/dscan_reader.html', 'mustache'], (template, Mustache) => { - let structureDialog = bootbox.dialog({ - title: 'D-Scan reader', - message: Mustache.render(template, {}), - show: true, - buttons: { - close: { - label: 'cancel', - className: 'btn-default' - }, - success: { - label: ' update intel', - className: 'btn-success', - callback: function(){ - let form = this.find('form'); - let formData = form.getFormValues(); - - updateStructureTableByClipboard(systemData, formData.clipboard, { - moduleElement: moduleElement, - tableApi: tableApi - }); - } - } - } - }); - - // dialog shown event - structureDialog.on('shown.bs.modal', function(e){ - // set focus on textarea - structureDialog.find('textarea').focus(); - }); - }); - }; - - /** - * init station services tooltips - * @param element - * @param tableApi - */ - let initStationServiceTooltip = (element, tableApi) => { - element.hoverIntent({ - over: function(e){ - let cellElement = $(this); - let rowData = tableApi.row(cellElement.parents('tr')).data(); - cellElement.addStationServiceTooltip(Util.getObjVal(rowData, 'services'), { - placement: 'left', - trigger: 'manual', - show: true - }); - }, - out: function(e){ - $(this).destroyPopover(); - }, - selector: 'td.' + config.tableCellServicesClass - }); - }; - - /** - * get dataTables default options for intel tables - * @returns {*} - */ - let getDataTableDefaults = () => { - return { - paging: false, - lengthChange: false, - ordering: true, - info: false, - searching: false, - hover: false, - autoWidth: false, - drawCallback: function (settings) { - let tableApi = this.api(); - let columnCount = tableApi.columns(':visible').count(); - let rows = tableApi.rows({page: 'current'}).nodes(); - let last = null; - - tableApi.column('rowGroupData:name', {page: 'current'}).data().each(function (group, i) { - if (!last || last.id !== group.id) { - // "stations" are grouped by "raceId" with its "factionId" - // "structures" are grouped by "corporationId" that ADDED it (not the ingame "owner" of it) - let imgType = 'stations' === group.groupedDataKey ? 'factions' : 'corporations'; - - $(rows).eq(i).before( - '
    ' + - '' + - '' + - '' + - '' - ); - last = group; - } - }); - - let animationRows = rows.to$().filter(function () { - return ( - $(this).data('animationStatus') || - $(this).data('animationTimer') - ); - }); - - for (let i = 0; i < animationRows.length; i++) { - let animationRow = $(animationRows[i]); - animationRow.pulseBackgroundColor(animationRow.data('animationStatus')); - animationRow.removeData('animationStatus'); - } + this.initStructureTable(); + if(showStationTable){ + this.initStationTable(); } - }; - }; - /** - * get module element - * @param parentElement - * @param mapId - * @param systemData - * @returns {jQuery} - */ - let getModule = (parentElement, mapId, systemData) => { - let showStationTable = ['H', 'L', '0.0', 'C12'].includes(Util.getObjVal(systemData, 'security')); - let corporationId = Util.getCurrentUserInfo('corporationId'); + this.setModuleObserver(); - let moduleElement = $('
    ').append( - $('
    ', { - class: config.moduleHeadClass - }).append( - $('
    ', { - class: config.moduleHandlerClass - }), - $('
    ', { - text: 'Structures' - }) - ) - ); + return this.moduleElement; + } - // "Structures" table ----------------------------------------------------------------------------------------- - let structureTable = $('
    ', { - class: ['pf-table-cell-20', 'text-right', Util.config.helpClass, 'pf-pie-chart'].join(' ') - }).attr('data-toggle', 'tooltip').attr('data-percent', '-100').easyPieChart({ - barColor: (percent) => { - let color = '#e28a0d'; - if((percent * -1) >= 100){ - color = '#a52521'; - } - return color; - }, - overrideOptions: 'signed', - trackColor: '#5cb85c', - size: 14, - scaleColor: false, - lineWidth: 2, - lineCap: 'butt', - animate: false - }), - $('', { - class: ['text-right'].join(' ') - }).attr('colspan', 2).append( - $('', { - class: 'pf-link', - html: connectionData.sourceAlias + '  ' - }).on('click', function(){ - Util.triggerMenuAction(Util.getMapModule().getActiveMap(), 'SelectSystem', {systemId: connectionData.source}); - }), - $('', { - class: [config.connectionInfoTableLabelSourceClass].join(' ') - }), - $('', { - class: 'fas fa-fw fa-angle-double-right' - }), - $('', { - class: [config.connectionInfoTableLabelTargetClass].join(' ') - }), - $('', { - class: 'pf-link', - html: '  ' + connectionData.targetAlias - }).on('click', function(){ - Util.triggerMenuAction(Util.getMapModule().getActiveMap(), 'SelectSystem', {systemId: connectionData.target}); - }) - ) - ) - ), - $('
    ', { - class: ['text-right', Util.config.helpClass, config.connectionInfoTableCellMassTotalTooltipClass].join(' '), - html: '' - }), - $('', { - text: scopeLabel.capitalize() - }), - $('', { - class: ['text-right', config.connectionInfoTableCellConnectionClass].join(' ') - }).append( - $('
    ', { - class: MapUtil.getConnectionFakeClassesByTypes(connectionData.type).join(' ') - }) - ) - ), - $('
    ', { - class: ['text-right', Util.config.helpClass].join(' '), - html: '', - title: 'initial mass. From signature table' - }).attr('data-toggle', 'tooltip'), - $('', { - text: 'Total mass' - }), - $('', { - class: ['text-right', 'txt-color', config.connectionInfoTableCellMassTotalClass].join(' ') - }) - ), - $('
    ', { - class: ['text-right', Util.config.helpClass].join(' '), - title: 'recorded total jump mass' - }).attr('data-toggle', 'tooltip').append( - $('', { - class: [ - 'fas', 'fa-fw', 'fa-question-circle' - ].join(' ') - }), - $('', { - class: [ - 'fas', 'fa-fw', 'fa-adjust', - 'txt-color', 'txt-color-warning', - 'hidden' - ].join(' ') - }), - $('', { - class: [ - 'far', 'fa-fw', 'fa-circle', - 'txt-color', 'txt-color-danger', - 'hidden' - ].join(' ') - }) - ), - $('', { - text: 'Logged mass' - }), - $('', { - class: ['text-right', config.connectionInfoTableCellMassLogClass].join(' ') - }) - ), - $('
    ', { - class: ['text-right', Util.config.helpClass].join(' '), - title: 'current ship mass' - }).attr('data-toggle', 'tooltip').append( - $('', { - class: ['fas', 'fa-fw', 'fa-question-circle'].join(' ') - }), - $('', { - class: [ - 'fas', 'fa-fw', 'fa-exclamation-triangle', - 'txt-color', 'txt-color-danger', - 'hidden' - ].join(' ') - }) - ), - $('', { - class: ['pf-table-cell-ellipses-auto'].join(' '), - text: 'Ship mass' - }), - $('', { - class: ['text-right', 'txt-color', config.connectionInfoTableCellMassShipClass].join(' ') - }) - ), - $('
    ', { - class: ['text-right', Util.config.helpClass].join(' '), - html: '', - title: 'max. mass left' - }).attr('data-toggle', 'tooltip'), - $('', { - text: 'Mass left' - }), - $('', { - class: ['text-right', 'txt-color', config.connectionInfoTableCellMassLeftClass].join(' ') - }) - ) - ) - ).on('pf:updateInfoTable', function(e, data){ - // update information table ------------------------------------------------------- - let tableElement = $(this); - let connectionData = tableElement.data('connectionData'); - if(connectionData){ - if(connectionData.scope === 'wh'){ - // update signature information ------------------------------------------- - let sourceLabelElement = tableElement.find('.' + config.connectionInfoTableLabelSourceClass); - let targetLabelElement = tableElement.find('.' + config.connectionInfoTableLabelTargetClass); - - // get related jsPlumb connection - let connection = $().getConnectionById(data.mapId, data.connectionId); - let signatureTypeNames = MapUtil.getConnectionDataFromSignatures(connection, connectionData); - - let sourceLabels = signatureTypeNames.source.labels; - let targetLabels = signatureTypeNames.target.labels; - sourceLabelElement.html(MapUtil.formatEndpointOverlaySignatureLabel(sourceLabels)); - targetLabelElement.html(MapUtil.formatEndpointOverlaySignatureLabel(targetLabels)); - - // remove K162 - sourceLabels = sourceLabels.diff(['K162']); - targetLabels = targetLabels.diff(['K162']); - - // get static wormhole data by endpoint Labels - let wormholeName = ''; - let wormholeData = null; - if(sourceLabels.length === 1 && targetLabels.length === 0){ - wormholeName = sourceLabels[0]; - }else if(sourceLabels.length === 0 && targetLabels.length === 1){ - wormholeName = targetLabels[0]; - } - - if( - wormholeName && - Init.wormholes.hasOwnProperty(wormholeName) - ){ - wormholeData = Object.assign({}, Init.wormholes[wormholeName]); - - // init wormhole tooltip ---------------------------------------------- - let massTotalTooltipCell = tableElement.find('.' + config.connectionInfoTableCellMassTotalTooltipClass); - massTotalTooltipCell.addWormholeInfoTooltip(wormholeData); - } - - // all required data is set -> re-calculate rows - tableElement.data('wormholeData', wormholeData); - tableElement.trigger('pf:calcInfoTable'); - } - - } - }).on('pf:calcInfoTable', function(e){ - // re-calculate information table from .data() cell values ------------------------ - let tableElement = $(this); - let connectionData = tableElement.data('connectionData'); - let massChartCell = tableElement.find('[data-percent]'); - - let wormholeData = tableElement.data('wormholeData'); - let shipData = null; - let shipName = ''; - let showShip = Boolean(tableElement.data('showShip')); - let massLogRow = tableElement.find('.' + config.connectionInfoTableRowMassLogClass); - let massShipRow = tableElement.find('.' + config.connectionInfoTableRowMassShipClass); - - // icons - let massLogTooltipIcon = massLogRow.find('i.fa-question-circle'); - let massLogStage2Icon = massLogRow.find('i.fa-adjust'); - let massLogStage3Icon = massLogRow.find('i.fa-circle'); - - let massShipTooltipIcon = massShipRow.find('i.fa-question-circle'); - let massShipWarningIcon = massShipRow.find('i.fa-exclamation-triangle'); - - // table cells - let connectionCell = tableElement.find('.' + config.connectionInfoTableCellConnectionClass); - let massTotalCell = tableElement.find('.' + config.connectionInfoTableCellMassTotalClass); - let massLogCell = tableElement.find('.' + config.connectionInfoTableCellMassLogClass); - let massShipCell = tableElement.find('.' + config.connectionInfoTableCellMassShipClass); - let massLeftCell = tableElement.find('.' + config.connectionInfoTableCellMassLeftClass); - let massTotal = null; // initial connection mass - let massReduction = 0; // default reduction (e.g. reduced, crit) in percent - let massLog = massLogCell.data('mass'); // recorded mass - let massLogTotal = massLog; // recorded mass + current ship - let massIndividual = null; // mass mass per jump - let massShip = 0; // current ship - let massIndividualError = false; - - // get wormhole data from signature binding --------------------------------------- - if(wormholeData){ - massTotal = parseInt(wormholeData.massTotal); - massIndividual = parseInt(wormholeData.massIndividual); - } - - // get connection type (show fake connection div) --------------------------------- - connectionCell.find('div').removeClass().addClass(MapUtil.getConnectionFakeClassesByTypes(connectionData.type).join(' ')); - - // get wormhole status ------------------------------------------------------------ - if(connectionData.type.indexOf('wh_critical') !== -1){ - massReduction = 90; - massLogTooltipIcon.toggleClass('hidden', true); - massLogStage2Icon.toggleClass('hidden', true); - massLogStage3Icon.toggleClass('hidden', false); - massLogStage3Icon.parent().attr('title', 'stage 3 (critical)').tooltip('fixTitle'); - }else if(connectionData.type.indexOf('wh_reduced') !== -1){ - massReduction = 50; - massLogTooltipIcon.toggleClass('hidden', true); - massLogStage2Icon.toggleClass('hidden', false); - massLogStage3Icon.toggleClass('hidden', true); - massLogStage3Icon.parent().attr('title', 'stage 2 (reduced)').tooltip('fixTitle'); - }else{ - massLogTooltipIcon.toggleClass('hidden', false); - massLogStage2Icon.toggleClass('hidden', true); - massLogStage3Icon.toggleClass('hidden', true); - massLogStage3Icon.parent().attr('title', 'recorded total jump mass').tooltip('fixTitle'); - } - - if(massReduction){ - let massLogReduction = massTotal / 100 * massReduction; - if(massLogReduction > massLog){ - massLog = massLogTotal = massLogReduction; - } - } - - // get current ship data ---------------------------------------------------------- - massShipCell.parent().toggle(showShip); - if(showShip){ - shipData = Util.getObjVal(Util.getCurrentCharacterLog(), 'ship'); - if(shipData){ - if(shipData.mass){ - massShip = parseInt(shipData.mass); - - // check individual mass jump - if(massIndividual){ - massIndividualError = massShip > massIndividual; - } - } - if(shipData.typeId && shipData.typeName){ - shipName = shipData.typeName; - } - } - } - - // update ship mass and "individual mass" cells ---------------------------------- - massShipTooltipIcon.toggleClass('hidden', massIndividualError); - massShipWarningIcon.toggleClass('hidden', !massIndividualError); - let shipMassTooltip = 'current ship mass ' + (shipName ? '"' + shipName + '"' : ''); - if(massIndividualError){ - shipMassTooltip = '"' + shipName + '" exceeds max jump mass for this connection: ' + Util.formatMassValue(massIndividual); - }else{ - // current ship mass check is OK -> add to massLogTotal - massLogTotal += massShip; - } - massShipTooltipIcon.parent().attr('title', shipMassTooltip).tooltip('fixTitle'); - - // current ship mass -------------------------------------------------------------- - massShipCell.html( function(){ - let cell = $(this); - let value = ' '; - let error = false; - let textLineThrough = false; - if(massShip > 0){ - value += Util.formatMassValue(massShip); - if(massIndividualError){ - error = textLineThrough = true; - value = '  ' + value; - }else{ - value = '-' + value; - } - }else{ - error = true; - value = 'undefined'; - } - - // change cell style - cell.toggleClass('txt-color-red', error) - .toggleClass('txt-color-warning', !error) - .toggleClass('pf-font-line-through', textLineThrough); - - return value; - }); - - // calculate mass left ------------------------------------------------------------ - let massLeft = massTotal - massLogTotal; - massLeft = (massLeft < 0) ? 0 : massLeft; - let massPercentLog = (massTotal > 0) ? Math.floor((100 / massTotal) * massLogTotal) : 0; - - // update easyPieChart and tooltip ------------------------------------------------ - let massPercentLeft = (100 - massPercentLog <= 0) ? 0 : '< ' + (100 - massPercentLog); - massChartCell.data('easyPieChart').enableAnimation().update(massPercentLog * -1); - massChartCell.attr('title', massPercentLeft + '% mass left').tooltip('fixTitle'); - - // update mass cells -------------------------------------------------------------- - massTotalCell.html(massTotal > 0 ? Util.formatMassValue(massTotal) : 'undefined') - .toggleClass('txt-color-red', massTotal <= 0); - massLogCell.html('- ' + Util.formatMassValue(massLog)); - massLeftCell.html( - massLeft > 0 ? - '~ ' + Util.formatMassValue(massLeft) : - (massLeft === 0 && massTotal) ? - 'will collapse' : 'undefined') - .toggleClass('txt-color-red', massLeft <= 0) - .toggleClass('txt-color-success', massLeft > 0); - }) - ); - - element.find('[data-toggle="tooltip"]').tooltip({ - container: 'body' - }); - - return element; - }; - - /** - * get HTML id by connectionId - * @param connectionId - * @returns {string} - */ - let getConnectionElementId = connectionId => config.connectionInfoPanelId + connectionId; - - /** - * get all visible connection panel elements - * @param moduleElement - * @returns {*|T|{}} - */ - let getConnectionElements = moduleElement => moduleElement.find('.' + config.connectionInfoPanelClass).not('#' + getConnectionElementId(0)); - - /** - * enrich connectionData with "logs" data (if available) and other "missing" data - * @param connectionsData - * @param newConnectionsData - * @returns {*} - */ - let enrichConnectionsData = (connectionsData, newConnectionsData) => { - for(let i = 0; i < connectionsData.length; i++){ - for(let newConnectionData of newConnectionsData){ - if(connectionsData[i].id === newConnectionData.id){ - // copy some missing data - connectionsData[i].character = newConnectionData.character; - connectionsData[i].created = newConnectionData.created; - connectionsData[i].type = newConnectionData.type; - // check for mass logs and copy data - if(newConnectionData.logs && newConnectionData.logs.length){ - connectionsData[i].logs = newConnectionData.logs; - } - // check for signatures and copy data - if(newConnectionData.signatures && newConnectionData.signatures.length){ - connectionsData[i].signatures = newConnectionData.signatures; - } - break; - } - } - } - return connectionsData; - }; - - /** - * request connection log data - * @param requestData - * @param context - * @param callback - */ - let requestConnectionLogData = (requestData, context, callback) => { - // show loading animation - for(let connectionId of requestData.connectionIds){ - context.moduleElement.find('#' + getConnectionElementId(connectionId) + ' table').showLoadingAnimation(); - } - - $.ajax({ - type: 'POST', - url: Init.path.getMapConnectionData, - data: requestData, - dataType: 'json', - context: context - }).done(function(connectionsData){ - this.connectionsData = enrichConnectionsData(this.connectionsData, connectionsData); - - callback(this.moduleElement, this.connectionsData); - }).always(function(){ - // hide loading animation - for(let contextData of this.connectionsData){ - context.moduleElement.find('#' + getConnectionElementId(contextData.id) + ' table').hideLoadingAnimation(); - } - }); - }; - - /** - * @see requestConnectionLogData - * @param moduleElement - * @param mapId - * @param connectionsData - */ - let getConnectionsLogData = (moduleElement, mapId, connectionsData) => { - let connectionIds = []; - for(let connectionData of connectionsData){ - connectionIds.push(connectionData.id); - } - - let requestData = { - mapId: mapId, - connectionIds: connectionIds, - addData : ['signatures', 'logs'], - // filterData : ['logs'] // do not exclude connections with NO "logs" -> sig data will be used as well - }; - - let contextData = { - moduleElement: moduleElement, - connectionsData: connectionsData - }; - - requestConnectionLogData(requestData, contextData, addConnectionsData); - }; - - /** - * replace/insert dataTables log data - * @param moduleElement - * @param connectionsData - */ - let addConnectionsData = (moduleElement, connectionsData) => { - - let getRowIndexesByData = (tableApi, colName, value) => { - return tableApi.rows().eq(0).filter((rowIdx) => { - return (tableApi.cell(rowIdx, colName + ':name').data() === value); - }); - }; - - for(let connectionData of connectionsData){ - // find related dom element for current connection - let connectionElement = moduleElement.find('#' + getConnectionElementId(connectionData.id)); - if(connectionElement.length){ - // attach connectionData to connection information for later use ------------------ - let connectionInfoElement = connectionElement.find('.' + config.moduleTableClass); - connectionInfoElement.data('connectionData', connectionData); - - // update dataTable --------------------------------------------------------------- - let tableApi = connectionElement.find('.dataTable').dataTable().api(); - - if(connectionData.logs && connectionData.logs.length > 0){ - for(let i = 0; i < connectionData.logs.length; i++){ - let rowData = connectionData.logs[i]; - let rowNew = null; - let animationStatus = null; - let indexes = getRowIndexesByData(tableApi, 'index', rowData.id); - if(indexes.length === 0){ - // row not found -> add new row - rowNew = tableApi.row.add(rowData); - animationStatus = 'added'; - }else{ - // update row with FIRST index - let row = tableApi.row( parseInt(indexes[0])); - let rowDataCurrent = row.data(); - - // check if row data changed - if(rowDataCurrent.updated.updated !== rowData.updated.updated){ - // ... row changed -> delete old and re-add - // -> cell actions might have changed - row.remove(); - rowNew = tableApi.row.add(rowData); - animationStatus = 'changed'; - } - } - - if( - animationStatus !== null && - rowNew.length > 0 - ){ - rowNew.nodes().to$().data('animationStatus', animationStatus); - } - } - }else{ - // clear table or leave empty - tableApi.clear(); - } - - // redraw dataTable - tableApi.draw(false); - } - } - }; - - /** - * - * @param moduleElement - * @param mapId - * @param connectionData - */ - let updateConnectionPanel = (moduleElement, mapId, connectionData) => { - let rowElement = moduleElement.find('.row'); - let connectionElement = rowElement.find('#' + getConnectionElementId(connectionData.id)); - - if( !connectionElement.length ){ - connectionElement = getConnectionElement(mapId, connectionData.id); - connectionElement.append(getInformationElement(connectionData)); - - let table = $('', { - class: ['compact', 'stripe', 'order-column', 'row-border', 'nowrap', config.connectionInfoTableClass].join(' ') - }).append(''); - connectionElement.append(table); - - // init empty table - let logTable = table.DataTable({ - dom: '<"container-fluid"' + - '<"row ' + config.tableToolbarCondensedClass + '"' + - '<"col-xs-5"i><"col-xs-5"p><"col-xs-2 text-right"B>>' + - '<"row"tr>>', - buttons: { - name: 'tableTools', - buttons: [ - { - name: 'addLog', - tag: 'a', - className: config.moduleHeadlineIconClass, - text: '', - action: function(e, tableApi, node, conf){ - let logData = {}; - - // pre-fill form with current character data (if available) - let currentUserData = Util.getCurrentUserData(); - if(currentUserData && currentUserData.character){ - logData.character = { - id: currentUserData.character.id, - name: currentUserData.character.name - }; - if(currentUserData.character.log){ - logData.ship = { - id: currentUserData.character.log.ship.typeId, - name: currentUserData.character.log.ship.typeName, - mass: currentUserData.character.log.ship.mass - }; - } - } - - showLogDialog(moduleElement, connectionElement, connectionData, logData); - } - } - ] - }, - pageLength: 8, - paging: true, - pagingType: 'simple', - lengthChange: false, - ordering: true, - order: [[ 4, 'desc' ]], - info: true, - searching: false, - hover: false, - autoWidth: false, - language: { - emptyTable: 'No jumps recorded', - info: '_START_ - _END_ of _MAX_', - infoEmpty: '', - paginate: { - previous: '', - next: '' - } - }, - columnDefs: [ - { - targets: 0, - name: 'index', - title: '', - orderable: false, - searchable: false, - width: 20, - className: ['text-center', 'txt-color'].join(' '), - data: 'id', - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - if( - !rowData.record || - (rowData.updated.updated !== rowData.created.created) - ){ - // log was manually modified or added - $(cell) - .addClass(Util.config.helpClass) - .addClass( 'txt-color-orange').tooltip({ - container: 'body', - title: 'added/updated manually' - }); - } - } - },{ - targets: 1, - name: 'ship', - title: '', - width: 26, - orderable: false, - className: [Util.config.helpDefaultClass, 'text-center', config.tableCellImageClass].join(' '), - data: 'ship', - render: { - _: function(data, type, row){ - let value = data.typeId; - if(type === 'display'){ - value = ''; - } - return value; - } - }, - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - $(cell).find('img').tooltip(); - } - },{ - targets: 2, - name: 'character', - title: '', - width: 26, - orderable: false, - className: [Util.config.helpDefaultClass, 'text-center', config.tableCellImageClass].join(' '), - data: 'character', - render: { - _: (cellData, type, rowData, meta) => { - let value = cellData.name; - if(type === 'display'){ - value = ''; - } - return value; - } - }, - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - $(cell).find('img').tooltip(); - } - },{ - targets: 3, - name: 'mass', - title: 'mass', - className: ['text-right'].join(' ') , - data: 'ship.mass', - render: { - _: (cellData, type, rowData, meta) => { - let value = cellData; - if(type === 'display'){ - value = Util.formatMassValue(value); - if(!rowData.active){ - // log is "deleted" - value = '' + value + ''; - } - } - return value; - } - } - },{ - targets: 4, - name: 'created', - title: 'log', - width: 55, - className: ['text-right', config.tableCellCounterClass].join(' '), - data: 'created.created' - },{ - targets: 5, - name: 'edit', - title: '', - orderable: false, - searchable: false, - width: 10, - className: ['text-center', config.tableCellActionClass, config.moduleHeadlineIconClass].join(' '), - data: null, - render: { - display: data => { - let icon = ''; - if(data.active){ - icon = ''; - } - return icon; - } - }, - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - let tableApi = this.api(); - - if($(cell).is(':empty')){ - $(cell).removeClass(config.tableCellActionClass + ' ' + config.moduleHeadlineIconClass); - }else{ - $(cell).on('click', function(e){ - showLogDialog(moduleElement, connectionElement, connectionData, rowData); - }); - } - } - },{ - targets: 6, - name: 'delete', - title: '', - orderable: false, - searchable: false, - width: 10, - className: ['text-center', config.tableCellActionClass].join(' '), - data: 'active', - render: { - display: data => { - let val = ''; - if(data){ - val = ''; - } - return val; - } - }, - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - let tableApi = this.api(); - - if(rowData.active){ - let confirmationSettings = { - title: 'delete jump log', - template: Util.getConfirmationTemplate(null, { - size: 'small', - noTitle: true - }), - onConfirm : function(e, target){ - // get current row data (important!) - // -> "rowData" param is not current state, values are "on createCell()" state - rowData = tableApi.row($(cell).parents('tr')).data(); - - connectionElement.find('table').showLoadingAnimation(); - - Util.request('DELETE', 'log', rowData.id, {}, { - connectionElement: connectionElement - }, requestAlways) - .then( - payload => { - addConnectionsData(moduleElement, enrichConnectionsData([connectionData], payload.data)); - }, - Util.handleAjaxErrorResponse - ); - } - }; - - // init confirmation dialog - $(cell).confirmation(confirmationSettings); - }else { - $(cell).on('click', function(e){ - connectionElement.find('table').showLoadingAnimation(); - - let requestData = { - active: 1 - }; - - Util.request('PATCH', 'log', rowData.id, requestData, { - connectionElement: connectionElement - }, requestAlways) - .then( - payload => { - addConnectionsData(moduleElement, enrichConnectionsData([connectionData], payload.data)); - }, - Util.handleAjaxErrorResponse - ); - }); - } - } - } - ], - initComplete: function(settings, json){ - Counter.initTableCounter(this, ['created:name']); - }, - drawCallback: function(settings){ - let animationRows = this.api().rows().nodes().to$().filter(function(a,b ){ - return ( - $(this).data('animationStatus') || - $(this).data('animationTimer') - ); - }); - - for(let i = 0; i < animationRows.length; i++){ - $(animationRows[i]).pulseBackgroundColor($(animationRows[i]).data('animationStatus')); - $(animationRows[i]).removeData('animationStatus'); - } - - }, - footerCallback: function(row, data, start, end, display ){ - let tableApi = this.api(); - let sumColumnIndexes = ['mass:name', 'delete:name']; - - // column data for "sum" columns over this page - let pageTotalColumns = tableApi - .columns( sumColumnIndexes, { page: 'all'} ) - .data(); - - // sum columns for "total" sum - pageTotalColumns.each((colData, colIndex) => { - pageTotalColumns[colIndex] = colData.reduce((sum, val, rowIndex) => { - // sum "mass" (colIndex 0) only if not "deleted" (colIndex 1) - if(colIndex === 0 && pageTotalColumns[1][rowIndex]){ - return sum + parseInt(val); - }else{ - return sum; - } - }, 0); - }); - - sumColumnIndexes.forEach((colSelector, index) => { - // only "mass" column footer needs updates - if(colSelector === 'mass:name'){ - $(tableApi.column(colSelector).footer()).text( Util.formatMassValue(pageTotalColumns[index]) ); - - // save mass for further reCalculation of "info" table - connectionElement.find('.' + config.connectionInfoTableCellMassLogClass).data('mass', pageTotalColumns[index]); - } - }); - - // calculate "info" table ----------------------------------------------------- - connectionElement.find('.' + config.moduleTableClass).trigger('pf:updateInfoTable', connectionElement.data()); - } - }); - - // find position to insert - connectionElement.insertBefore(rowElement.find('#' + getConnectionElementId(0))); - - logTable.on('order.dt search.dt', function(){ - let pageInfo = logTable.page.info(); - logTable.column('index:name', {search:'applied', order:'applied'}).nodes().each((cell, i) => { - let content = (pageInfo.recordsTotal - i) + '.'; - $(cell).html(content); - }); - }); - } - }; - - /** - * - * @param context - */ - let requestAlways = (context) => { - context.connectionElement.find('table').hideLoadingAnimation(); - }; - - /** - * show jump log dialog - * @param moduleElement - * @param connectionElement - * @param connectionData - * @param logData - */ - let showLogDialog = (moduleElement, connectionElement, connectionData, logData = {}) => { - - let data = { - id: config.connectionDialogId, - typeSelectId: config.typeSelectId, - shipMassId: config.shipMassId, - characterSelectId: config.characterSelectId, - logData: logData, - massFormat: () => { - return (val, render) => { - return (parseInt(render(val) || 0) / 1000) || ''; - }; - } - }; - - requirejs(['text!templates/dialog/connection_log.html', 'mustache'], (template, Mustache) => { - let content = Mustache.render(template, data); - - let connectionDialog = bootbox.dialog({ - title: 'Jump log', - message: content, - show: false, - buttons: { - close: { - label: 'cancel', - className: 'btn-default' - }, - success: { - label: ' save', - className: 'btn-success', - callback: function(){ - let form = this.find('form'); - - // validate form - form.validator('validate'); - - // check whether the form is valid - let formValid = form.isValidForm(); - - if(formValid){ - // get form data - let formData = form.getFormValues(); - formData.id = Util.getObjVal(logData, 'id') || 0; - formData.connectionId = Util.getObjVal(connectionData, 'id') || 0; - formData.shipTypeId = Util.getObjVal(formData, 'shipTypeId') || 0; - formData.shipMass = parseInt((Util.getObjVal(formData, 'shipMass') || 0) * 1000); - formData.characterId = Util.getObjVal(formData, 'characterId') || 0; - - // we need some "additional" form data from the Select2 dropdown - // -> data is required on the backend side - let formDataShip = form.find('#' + config.typeSelectId).select2('data'); - let formDataCharacter = form.find('#' + config.characterSelectId).select2('data'); - formData.shipTypeName = formDataShip.length ? formDataShip[0].text : ''; - formData.characterName = formDataCharacter.length ? formDataCharacter[0].text : ''; - - let method = formData.id ? 'PATCH' : 'PUT'; - - Util.request(method, 'log', formData.id, formData, { - connectionElement: connectionElement, - formElement: form - }, requestAlways) - .then( - payload => { - addConnectionsData(moduleElement, enrichConnectionsData([connectionData], payload.data)); - this.modal('hide'); - }, - Util.handleAjaxErrorResponse - ); - - } - - return false; - } - } - } - }); - - connectionDialog.on('show.bs.modal', function(e){ - let modalContent = $('#' + config.connectionDialogId); - - // init type select live search - let selectElementType = modalContent.find('#' + config.typeSelectId); - selectElementType.initUniverseTypeSelect({ - categoryIds: [6], - maxSelectionLength: 1, - selected: [Util.getObjVal(logData, 'ship.typeId')] - }).on('select2:select select2:unselecting', function(e){ - // get ship mass from selected ship type and update mass input field - let shipMass = e.params.data ? e.params.data.mass / 1000 : ''; - modalContent.find('#' + config.shipMassId).val(shipMass); - }); - - // init character select live search - let selectElementCharacter = modalContent.find('#' + config.characterSelectId); - selectElementCharacter.initUniverseSearch({ - categoryNames: ['character'], - maxSelectionLength: 1 - }); - - }); - - // show dialog - connectionDialog.modal('show'); - }); - }; - - /** - * remove connection Panel from moduleElement - * @param connectionElement - */ - let removeConnectionPanel = (connectionElement) => { - connectionElement = $(connectionElement); - if(connectionElement.length){ - // destroy dataTable (and remove table from DOM) - let logTable = connectionElement.find('.' + config.connectionInfoTableClass); - logTable.dataTable().api().destroy(true); - // remove belonging connectionElement - connectionElement.remove(); - } - }; - - /** - * get connections from ModuleElement - * -> validate with current map data - * @param moduleElement - * @param mapId - * @returns {{connectionsDataUpdate: Array, connectionsDataRemove: Array}} - */ - let getConnectionsDataFromModule = (moduleElement, mapId) => { - let activeMap = Util.getMapModule().getActiveMap(); - let mapData = activeMap.getMapDataFromClient(['hasId']); - let connectionsData = { - connectionsDataUpdate: [], - connectionsDataRemove: [], - }; - - if(mapData !== false){ - getConnectionElements(moduleElement).each((i, connectionElement) => { - let removeConnectionPanel = true; - let connectionData = {id: $(connectionElement).data('connectionId') }; - - let connection = $().getConnectionById(mapId, connectionData.id); - if(connection){ - let connectionDataTemp = MapUtil.getDataByConnection(connection); - if(connectionDataTemp.id > 0){ - // connection still on map - OK - removeConnectionPanel = false; - connectionData = connectionDataTemp; - } - } - - if(removeConnectionPanel){ - connectionsData.connectionsDataRemove.push(connectionData); - }else{ - connectionsData.connectionsDataUpdate.push(connectionData); - } - }); - } - - return connectionsData; - }; - - /** - * update/init multiple connection panels at once - * @param moduleElement - * @param mapId - * @param connectionsDataUpdate - * @param connectionsDataRemove - */ - let updateConnectionPanels = (moduleElement, mapId, connectionsDataUpdate, connectionsDataRemove) => { - for(let connectionData of connectionsDataRemove){ - let connectionElement = moduleElement.find('#' + getConnectionElementId(connectionData.id)); - removeConnectionPanel(connectionElement); - } - - for(let connectionData of connectionsDataUpdate){ - updateConnectionPanel(moduleElement, mapId, connectionData); - } - - // request connectionsLogData for each updated connection - if(connectionsDataUpdate.length){ - getConnectionsLogData(moduleElement, mapId, connectionsDataUpdate); - } - - // remove module if no connection panel left - // --> all connection deselected on map - let connectionElements = getConnectionElements(moduleElement); - if(connectionElements.length === 0){ - MapUtil.getTabContentElementByMapElement(moduleElement).trigger('pf:removeConnectionModules'); - } - - // hide "control" panel when multiple connection - moduleElement.find('#' + getConnectionElementId(0)).toggle(connectionElements.length < 2); - }; - - /** - * set module observer - * @param moduleElement - * @param mapId - */ - let setModuleObserver = (moduleElement, mapId) => { - $(document).off('pf:updateConnectionInfoModule').on('pf:updateConnectionInfoModule', function(e, data){ - updateConnectionPanels( - moduleElement, - data.mapId, - MapUtil.getDataByConnections(data.connectionsUpdate), - MapUtil.getDataByConnections(data.connectionsRemove) - ); - }); - - $(document).off('pf:activeShip').on('pf:activeShip', function(e){ - moduleElement.find('.' + config.connectionInfoPanelClass).each((i, connectionElement) => { - $(connectionElement).find('.' + config.moduleTableClass).each((i, tableElement) => { - $(tableElement).trigger('pf:calcInfoTable'); - }); - }); - }); - - // init toggle active ship ---------------------------------------------------------------- - moduleElement.find('.' + config.moduleHeadlineIconCurrentMassClass).on('click', function(e){ - let currentMassIcon = $(this).toggleClass('active'); - moduleElement.find('.' + config.connectionInfoPanelClass).each((i, connectionElement) => { - $(connectionElement).find('.' + config.moduleTableClass).each((i, tableElement) => { - $(tableElement).data('showShip', currentMassIcon.hasClass('active')).trigger('pf:calcInfoTable'); - }); - }); - }); - - // init refresh connections --------------------------------------------------------------- - moduleElement.find('.' + config.moduleHeadlineIconRefreshClass).on('click', function(e){ - refreshConnectionPanels(moduleElement, mapId); - }); - }; - - /** - * refresh all connection panels in a module - * @param moduleElement - * @param mapId - */ - let refreshConnectionPanels = (moduleElement, mapId) => { - let connectionsData = getConnectionsDataFromModule(moduleElement, mapId); - updateConnectionPanels(moduleElement, mapId, connectionsData.connectionsDataUpdate, connectionsData.connectionsDataRemove); - }; - - /** - * before module destroy callback - * @param moduleElement - */ - let beforeDestroy = (moduleElement) => { - getConnectionElements(moduleElement).each((i, connectionElement) => { - removeConnectionPanel(connectionElement); - }); - }; - - /** - * init callback - * @param moduleElement - * @param mapId - * @param connectionData - */ - let initModule = (moduleElement, mapId, connectionData) => { - setModuleObserver(moduleElement, mapId); - }; - - /** - * get module element - * @param parentElement - * @param mapId - * @param connections - * @returns {*|jQuery|HTMLElement} - */ - let getModule = (parentElement, mapId, connections) => { - let moduleElement = $('
    ').append( - $('
    ', { - class: config.moduleHeadClass - }).append( - $('
    ', { - class: config.moduleHandlerClass - }), - $('
    ', { - text: 'Connection' - }), - getHeadlineToolbar() - ) - ); - - let rowElement = $('
    ', { - class: 'row' - }); - - moduleElement.append(rowElement); - - rowElement.append(getInfoPanelControl(mapId)); - - updateConnectionPanels(moduleElement, mapId, MapUtil.getDataByConnections(connections), []); - - return moduleElement; - }; - - return { - config: config, - getModule: getModule, - initModule: initModule, - beforeDestroy: beforeDestroy - }; + return ConnectionInfoModule; }); \ No newline at end of file diff --git a/js/app/ui/module/demo.js b/js/app/ui/module/demo.js new file mode 100644 index 00000000..5bf82148 --- /dev/null +++ b/js/app/ui/module/demo.js @@ -0,0 +1,311 @@ +define([ // dependencies for this module + 'module/base', // abstract `parent` module class definition [required] + 'app/render' // ... for demo purpose, we load a Render helper object +], (BaseModule, Render) => { + 'use strict'; + + /** + * DemoModule class + * -> skeleton for custom module plugins + * @type {DemoModule} + */ + let DemoModule = class DemoModule extends BaseModule { + constructor(config = {}) { + super(Object.assign({}, new.target.defaultConfig, config)); + } + + /** + * module header + * @param text + * @returns {HTMLDivElement} + */ + newHeaderElement(text){ + let headEl = super.newHeaderElement(text); + let toolbarEl = this.newHeadlineToolbarElement(); + let iconPlayEl = this.newIconElement([ + 'fa-play', 'fa-fw', + 'txt-color', 'txt-color-success', + this._config.moduleHeadlineIconClass + ]); + iconPlayEl.setAttribute('title', 'pause update()'); + iconPlayEl.onclick = e => this.toggleUpdates(e.target); + + toolbarEl.append(iconPlayEl); + headEl.append(toolbarEl); + return headEl; + } + + /** + * extends logHandler() from BaseModule + * -> updates moduleBody (demo) + * @param handler + * @param increment + */ + logHandler(handler, increment = 1){ + super.logHandler(handler, increment); + + /** + * @param handler + * @returns {[HTMLSpanElement, HTMLSpanElement]} + */ + let newLiContent = handler => { + let count = this._config.logHandler[handler] || 0; + let label = count ? 'success' : false; + let icon = 'fa-circle'; + let handlerQueueLength; + if(this[`_${handler}Queue`]){ + handlerQueueLength = this[`_${handler}Queue`].filterQueue(item => item.data === 'upd').length; + label = handlerQueueLength ? 'warning' : label; + icon = handlerQueueLength ? 'fa-sync fa-spin' : icon; + } + + let iconLiEl = Object.assign(document.createElement('span'), { + className: 'fa-li' + }); + iconLiEl.append(this.newIconElement([icon, 'fa-fw', 'txt-color', label ? `txt-color-${label}` : ``])); + + let textLiEl = Object.assign(document.createElement('span'), { + textContent: `${handler} [${count}]${Number.isInteger(handlerQueueLength) ? `[${handlerQueueLength}]`: ``}`, + className: label ? `pf-animation-pulse-${label}` : `` + }); + return [iconLiEl, textLiEl]; + }; + + let ulEl = this.queryGridItem('info').querySelector(`.fa-ul`); + if(!ulEl){ + ulEl = Object.assign(document.createElement('ul'), { + className: 'fa-ul' + }); + + let liEls = BaseModule.handler.map(handler => { + let liEl = document.createElement('li'); + liEl.dataset.handler = handler; + liEl.prepend(...newLiContent(handler)); + return liEl; + }); + + ulEl.append(...liEls); + this.queryGridItem('info').querySelector(`code`).insertAdjacentElement('beforebegin', ulEl); + }else{ + ulEl.querySelector(`[data-handler="${handler}"]`).innerHTML = newLiContent(handler).map(el => el.outerHTML).join(''); + } + } + + /** + * initial module render method + * -> implementation is enforced by BaseModule + * -> must return a single node element + * @param mapId + * @param systemData + * @returns {HTMLElement} + */ + render(mapId, systemData){ + this._systemData = systemData; + + // ... append your custom module body + let bodyEl = Object.assign(document.createElement('div'), { + className: [this._config.bodyClassName, 'grid'].join(' ') + }); + + let gridItems = []; + for(let [area, conf] of Object.entries(this._config.gridItems)){ + gridItems.push(this.newGridItemEl(area, conf.label)); + } + bodyEl.append(...gridItems); + this.moduleElement.append(bodyEl); + + this.renderJson('_config', this._config, 'info'); + this.renderJson('render()', {mapId, systemData}); + + let {config, data} = BaseModule.Util.getCurrentMapData(this._systemData.mapId); + this.renderJson('currentMapData', {config, data}, 'mapData'); + return this.moduleElement; + } + + /** + * update module + * @param systemData + * @returns {Promise} + */ + update(systemData){ + return super.update(systemData).then(systemData => new Promise(resolve => { + this.renderJson('update()', {systemData}); + + // ... custom (async) code e.g. request external API and update module + // -> resolve() Promise when module is updated. + resolve({ + action: 'update', + data: { + module: this + } + }); + })); + } + + /** + * init module + */ + init(){ + super.init(); + this.renderJson('init()', null); + this.renderJson('currentUserData', BaseModule.Util.getCurrentUserData(), 'userData'); + } + + beforeHide(){ + super.beforeHide(); + this.renderJson('beforeHide()', null); + } + + beforeDestroy(){ + super.beforeDestroy(); + this.renderJson('beforeDestroy()', null); + } + + /** + * @param name + * @param e + */ + onSortableEvent(name, e){ + super.onSortableEvent(name, e); + this.renderJson(`${name}()`, e, 'sortableJs'); + } + + /** + * @param label + * @param data + * @param area + */ + renderJson(label, data, area = 'trigger'){ + let now = new Date(); + let codeEl = this.queryGridItem(area).querySelector(`code`); + codeEl.prepend(Object.assign(document.createElement('section'), { + className: this._config.highlightClassName, + innerHTML: `${++this._config.counter}. ${now.toLocaleTimeString('en-GB')}.${String(now.getMilliseconds()).padStart(3, '0')} ${label} \n` + + `${Render.highlightJson(data, this._config.gridItems[area].jsonConf)}` + })); + // limit code blocks + if(codeEl.childElementCount > this._config.maxCodeSections){ + codeEl.removeChild(codeEl.lastChild); + } + } + + /** + * @param iconEl + */ + toggleUpdates(iconEl){ + iconEl.classList.toggle('fa-pause'); + iconEl.classList.toggle('txt-color-danger'); + iconEl.classList.toggle('fa-play'); + iconEl.classList.toggle('txt-color-success'); + + if(this._pauseUpdatesPromise){ + this._pauseUpdatesPromise.resolve(); + }else{ + this._pauseUpdatesPromise = BaseModule.newDeferredPromise(); + this._updateQueue.enqueue(() => this._pauseUpdatesPromise.then(() => { + this._pauseUpdatesPromise = null; + }), 'start'); + } + } + + /** + * new gridItem element + * @param area + * @param label + * @returns {HTMLPreElement} + */ + newGridItemEl(area, label){ + if(!this._gridItemEl){ + // create blank gridItem element for later cloning + this._gridItemEl = Object.assign(document.createElement('pre'), { + className: this._config.gridItemClassName, + innerHTML: '' + }); + } + + let iconClearEl = this.newIconElement([ + 'fa-trash', 'fa-fw', 'pull-right', + this._config.moduleHeadlineIconClass + ]); + iconClearEl.setAttribute('title', 'clear output'); + iconClearEl.onclick = e => e.target.closest(`.${this._config.gridItemClassName}`).querySelector('code').innerHTML = ''; + + let toolbarEl = this.newHeadlineToolbarElement(); + toolbarEl.append(iconClearEl); + + let gridItemEl = this._gridItemEl.cloneNode(true); + gridItemEl.dataset.area = area; + gridItemEl.prepend(toolbarEl, this.newHeadlineElement(label)); + return gridItemEl; + } + + /** + * get gridItem
     element from module body
    +         * @param {string} area
    +         * @returns {HTMLPreElement}
    +         */
    +        queryGridItem(area){
    +            return this.moduleElement.querySelector(`.${this._config.bodyClassName} .${this._config.gridItemClassName}[data-area="${area}"]`);
    +        }
    +    };
    +
    +    DemoModule.isPlugin = true;                            // module is defined as 'plugin'
    +    DemoModule.scope = 'system';                           // module scope controls how module gets updated and what type of data is injected
    +    DemoModule.sortArea = 'a';                             // default sortable area
    +    DemoModule.position = 10;                              // default sort/order position within sortable area
    +    DemoModule.label = 'Demo';                             // static module label (e.g. description)
    +    DemoModule.fullDataUpdate = true;                      // subscribe module for frequently updates see update() method
    +
    +    DemoModule.defaultConfig = {
    +        className: 'pf-system-demo-module',                 // class for module
    +        sortTargetAreas: ['a', 'b', 'c'],                   // sortable areas where module can be dragged into
    +        headline: 'Demo Module',
    +
    +        // ... custom config for DemoModule
    +        gridItemClassName: 'pf-dynamic-area',
    +        highlightClassName: 'pf-animation-pulse-success',
    +        counter: 0,
    +        maxCodeSections: 8,
    +        gridItems: {
    +            info: {
    +                label: `handler/config`,
    +                jsonConf: {
    +                    collapseDepth: 1,
    +                    maxDepth: 3
    +                }
    +            },
    +            trigger: {
    +                label: `trigger`,
    +                jsonConf: {
    +                    collapseDepth: 1,
    +                    maxDepth: 5
    +                }
    +            },
    +            userData: {
    +                label: `user/char data`,
    +                jsonConf: {
    +                    collapseDepth: 1,
    +                    maxDepth: 8
    +                }
    +            },
    +            mapData: {
    +                label: `map data`,
    +                jsonConf: {
    +                    collapseDepth: 2,
    +                    maxDepth: 8,
    +                    maxLinesFunctions: 2
    +                }
    +            },
    +            sortableJs: {
    +                label: `drag&drop events`,
    +                jsonConf: {
    +                    collapseDepth: 0,
    +                    maxDepth: 4,
    +                    maxLinesFunctions: 2
    +                }
    +            }
    +        }
    +    };
    +
    +    return DemoModule;
    +});
    \ No newline at end of file
    diff --git a/js/app/ui/module/empty.js b/js/app/ui/module/empty.js
    new file mode 100644
    index 00000000..c567f0eb
    --- /dev/null
    +++ b/js/app/ui/module/empty.js
    @@ -0,0 +1,71 @@
    +define([                // dependencies for this module
    +    'module/base',      // abstract `parent` module class definition [required]
    +    'app/render'        // ... for demo purpose, we load a Render helper object
    +], (BaseModule, Render) => {
    +    'use strict';
    +
    +    /**
    +     * EmptyModule class
    +     * -> skeleton for custom module plugins
    +     * @type {EmptyModule}
    +     */
    +    let EmptyModule = class EmptyModule extends BaseModule {
    +        constructor(config = {}) {
    +            super(Object.assign({}, new.target.defaultConfig, config));
    +        }
    +
    +        /**
    +         * initial module render method
    +         * -> implementation is enforced by BaseModule
    +         * -> must return a single node element
    +         * @param mapId
    +         * @param systemData
    +         * @returns {HTMLElement}
    +         */
    +        render(mapId, systemData){
    +            this._systemData = systemData;
    +
    +            // ... append your custom module body
    +            let bodyEl = Object.assign(document.createElement('div'), {
    +                className: this._config.bodyClassName
    +            });
    +
    +            this.moduleElement.append(bodyEl);
    +
    +            return this.moduleElement;
    +        }
    +
    +        /**
    +         * init module
    +         */
    +        init(){
    +            super.init();
    +        }
    +
    +        beforeHide(){
    +            super.beforeHide();
    +        }
    +
    +        beforeDestroy(){
    +            super.beforeDestroy();
    +        }
    +
    +        onSortableEvent(name, e){
    +            super.onSortableEvent(name, e);
    +        }
    +    };
    +
    +    EmptyModule.isPlugin = true;                            // module is defined as 'plugin'
    +    EmptyModule.scope = 'system';                           // module scope controls how module gets updated and what type of data is injected
    +    EmptyModule.sortArea = 'a';                             // default sortable area
    +    EmptyModule.position = 15;                              // default sort/order position within sortable area
    +    EmptyModule.label = 'Empty';                            // static module label (e.g. description)
    +
    +    EmptyModule.defaultConfig = {
    +        className: 'pf-system-empty-module',                // class for module
    +        sortTargetAreas: ['a', 'b', 'c'],                   // sortable areas where module can be dragged into
    +        headline: 'Empty Module',
    +    };
    +
    +    return EmptyModule;
    +});
    \ No newline at end of file
    diff --git a/js/app/ui/module/global_thera.js b/js/app/ui/module/global_thera.js
    new file mode 100644
    index 00000000..906aa8a2
    --- /dev/null
    +++ b/js/app/ui/module/global_thera.js
    @@ -0,0 +1,1028 @@
    +define([
    +    'jquery',
    +    'app/init',
    +    'app/util',
    +    'module/base',
    +    'app/map/map',
    +    'app/map/util',
    +    'app/ui/form_element'
    +], ($, Init, Util, BaseModule, Map, MapUtil, FormElement) => {
    +    'use strict';
    +
    +    /**
    +     * TheraModule class
    +     * @type {TheraModule}
    +     */
    +    let TheraModule = class TheraModule extends BaseModule {
    +        constructor(config = {}) {
    +            config.eveScoutUrl = new URL(Init.url.eveScout);
    +            super(Object.assign({}, new.target.defaultConfig, config));
    +        }
    +
    +        /**
    +         * get icon for undefined/missing cell value
    +         * @returns {string}
    +         */
    +        getIconForUndefinedCellValue(){
    +            return '';
    +        }
    +
    +        /**
    +         * get icon for "syncStatus" (connection is mapped) cell value
    +         * @param status
    +         * @returns {string}
    +         */
    +        getIconForStatusCellValue(status = ''){
    +            let title = '';
    +            switch(status){
    +                case 'warning':
    +                    title = `not in ${this._config.eveScoutUrl.hostname.replace('www.', '')} connections`;
    +                    break;
    +                case 'success':
    +                    title = `in ${this._config.eveScoutUrl.hostname.replace('www.', '')} connections`;
    +                    break;
    +                case 'hint':
    +                    title += `sync connections/signatures`;
    +                    break;
    +                default:
    +                    title = `not mapped`;
    +            }
    +
    +            return ``;
    +        }
    +
    +        /**
    +         * get dataTable id
    +         * @param {...string} parts  e.g. 'tableType', 'mapId', 'systemId'
    +         * @returns {string}
    +         */
    +        getTableId(...parts){
    +            return BaseModule.Util.getTableId(this._config.theraTableId, ...parts);
    +        }
    +
    +        /**
    +         * get dataTable row id
    +         * @param tableType
    +         * @param id
    +         * @returns {string}
    +         */
    +        getRowId(tableType, id){
    +            return BaseModule.Util.getTableRowId(this._config.theraTableRowIdPrefix, tableType, id);
    +        }
    +
    +        /**
    +         * get 
    DOM id by id + * @param tableApi + * @param id + * @returns {*} + */ + getRowById(tableApi, id){ + return tableApi.rows().ids().toArray().find(rowId => + rowId === this.getRowId(BaseModule.Util.getObjVal(this.getTableMetaData(tableApi), 'type'), id) + ); + } + + /** + * get custom "metaData" from dataTables API + * @param tableApi + * @returns {*} + */ + getTableMetaData(tableApi){ + return tableApi ? tableApi.init().pfMeta : null; + } + + /** + * initial module render method + * -> implementation is enforced by BaseModule + * -> must return a single node element + * @param mapId + * @returns {HTMLElement} + */ + render(mapId){ + this._mapId = mapId; + + // ... append your custom module body + this._bodyEl = Object.assign(document.createElement('div'), { + className: this._config.bodyClassName + }); + + this.moduleElement.append(this._bodyEl); + + this._bodyEl.append( + this.newControlElement( + 'Thera not found on map. Click here to add', + [this._config.moduleHeadlineIconClass, this._config.controlAreaTheraClass, 'hidden'], + ['fa-plus'] + ) + ); + + $(this.moduleElement).showLoadingAnimation(); + + this.initTheraTable(); + + this.setModuleObserver(); + + return this.moduleElement; + } + + /** + * init 'Thera connections' table (EveScout) + */ + initTheraTable(){ + let module = this; + + let tableEl = document.createElement('table'); + tableEl.id = module.getTableId('thera', module._mapId); + tableEl.classList.add('compact', 'stripe', 'order-column', 'row-border', 'pf-table-fixed', module._config.globalTheraTableClass); + this._bodyEl.append(tableEl); + + this._tableApi = $(tableEl).DataTable( { + pfMeta: { + type: 'theraConnection' + }, + paging: false, + ordering: true, + order: [[0, 'desc'], [8, 'desc']], + orderFixed: [[ 10, 'desc']], + info: false, + searching: false, + hover: false, + autoWidth: false, + rowId: rowData => module.getRowId('theraConnection', rowData.id), + select: { + style: 'os', + selector: 'td:not(.' + module._config.tableCellActionClass + ')' + }, + language: { + emptyTable: 'No Thera connections found' + }, + columnDefs: [ + { + targets: 0, + name: 'syncStatus', + title: '', + width: 2, + className: 'text-center', + data: 'syncStatus', + defaultContent: module.getIconForStatusCellValue(), + render: { + display: (cellData, type, rowData, meta) => { + return module.getIconForStatusCellValue(cellData); + }, + sort: syncStatus => ['warning', 'hint', 'success'].indexOf(syncStatus) + } + },{ + targets: 1, + name: 'trueSec', + title: 'sec', + width: 15, + className:'text-center', + data: 'target.trueSec', + defaultContent: module.getIconForUndefinedCellValue(), + render: { + display: (cellData, type, rowData, meta) => { + if(cellData !== undefined){ + let systemTrueSecClass = BaseModule.Util.getTrueSecClassForSystem(cellData); + return '' + cellData.toFixed(1) + ''; + } + } + } + },{ + targets: 2, + name: 'systemName', + title: 'system', + className: module._config.tableCellEllipsisClass, + data: 'target', + defaultContent: module.getIconForUndefinedCellValue(), + render: { + display: (cellData, type, rowData, meta) => { + let systemId = cellData.id || ''; + let cls = ( + cellData.name && ( + BaseModule.Util.getObjVal(rowData, 'relRowId') || // secondary table + BaseModule.Util.getObjVal(rowData, 'connectionId') // primary table + ) + ) ? module._config.linkClass : ''; + return `${cellData.name || ''}`; + }, + sort: 'name' + } + },{ + targets: 3, + name: 'region', + title: 'region', + className: module._config.tableCellEllipsisClass, + data: 'target', + defaultContent: module.getIconForUndefinedCellValue(), + render: { + _: 'region.name' + } + },{ + targets: 4, + name: 'outSig', + title: '', + width: 12, + className: ['text-center', module._config.fontUppercaseClass].join(' '), + data: 'sourceSignature', + defaultContent: module.getIconForUndefinedCellValue(), + render: { + _: 'name' + } + },{ + targets: 5, + name: 'fakeConnection', + title: 'con.', + orderable: false, + width: 30, + className: 'text-center', + data: 'fakeConnection', + defaultContent: '' + },{ + targets: 6, + name: 'inSig', + title: '', + width: 12, + className: ['text-center', module._config.fontUppercaseClass].join(' '), + data: 'targetSignature', + defaultContent: module.getIconForUndefinedCellValue(), + render: { + _: 'name' + } + },{ + targets: 7, + name: 'wormholeLabel', + title: 'type', + width: 50, + className: module._config.tableCellTypeClass, + data: 'wormholeLabel', + defaultContent: module.getIconForUndefinedCellValue(), + render: { + display: (cellData, type, rowData, meta) => { + if(cellData){ + let wormholeData = BaseModule.Util.getObjVal(Init, `wormholes.${cellData}`); + let security = BaseModule.Util.getObjVal(wormholeData, `security`); + let typeNodes = FormElement.formatSignatureTypeSelectionData({text: `${cellData} - ${security}`}, undefined, {showWhSizeLabel: false}); + return [...typeNodes].reduce((acc, node) => { + acc += node.outerHTML; + return acc; + }, ''); + } + } + } + },{ + targets: 8, + name: 'estimatedLife', + title: '', + width: 15, + className: 'text-right', + data: 'estimatedEol', + defaultContent: module.getIconForUndefinedCellValue(), + render: { + display: (cellData, type, rowData, meta) => { + try{ + let timeNow = (new Date()).getTime(); + let timeEol = Date.parse(cellData); + if(!isNaN(timeNow) && !isNaN(timeEol) ){ + let diff = (timeEol - timeNow) / 1000; + diff /= (60 * 60); + return `< ${Math.ceil(diff)}h`; + } + }catch(e){} + }, + sort: dateVal => Date.parse(dateVal) + } + },{ + targets: 9, + name: 'action', + title: '', + orderable: false, + width: 10, + className: ['text-center', module._config.tableCellActionClass, module._config.moduleHeadlineIconClass].join(' '), + data: null, + render: { + display: data => { + let icon = ''; + if(data.connectionId){ + icon = ''; + }else if(!data.syncStatus){ + icon = ''; + } + return icon; + } + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let tableApi = this.api(); + + cell.addEventListener('click', e => { + e.stopPropagation(); + + let rowClicked = tableApi.row(e.target.closest('tr')); + rowData = rowClicked.data(); + + if(rowData.connectionId){ + // delete row(s) ------------------------------------------------------------------ + let deleteData = { + systemIds: [], + connectionIds: [], + }; + + let value, label; + // check if multiple rows are selected + current row is one of them -> bulk edit + let rowsSelected = tableApi.rows({selected: true}); + if(rowsSelected.count() > 1 && tableApi.row(rowIndex, {selected: true}).count()){ + deleteData = rowsSelected.data().toArray() + .reduce((acc, rowData) => { + acc.systemIds.push(BaseModule.Util.getObjVal(rowData, 'target.realId')); + acc.connectionIds.push(BaseModule.Util.getObjVal(rowData, 'connectionId')); + return acc; + }, deleteData); + label = `delete ${deleteData.systemIds.length} systems`; + }else{ + // get current row data (important!) + // -> "rowData" param is not current state, values are "on createCell()" state + rowsSelected = tableApi.row( $(cell).parents('tr')); + rowData = rowsSelected.data(); + deleteData.systemIds.push(BaseModule.Util.getObjVal(rowData, 'target.realId') || 0); + deleteData.connectionIds.push(BaseModule.Util.getObjVal(rowData, 'connectionId') || 0); + label = `delete '${BaseModule.Util.getObjVal(rowData, 'target.name')}'`; + } + + let confirmationSettings = { + title: '---', + template: BaseModule.Util.getConfirmationTemplate(BaseModule.Util.getConfirmationContent([{ + name: 'deleteSystems', + value: 1, + label: label, + class: 'pf-editable-warn', + checked: false + }]), { + size: 'small', + noTitle: true + }), + trigger: 'manual', + onConfirm : function(e, target){ + // stop scroll to top + e.preventDefault(); + + // get form data (check if form tag is not hidden!) from confirmation popover + let tip = target.data('bs.confirmation').tip(); + let form = tip.find('form:not(.hidden)').first(); + let formData = form.getFormValues(); + let deleteSystems = BaseModule.Util.getObjVal(formData, 'deleteSystems'); + + if(deleteSystems){ + // delete systems -> connections get auto removed as well + let activeMap = BaseModule.Util.getMapModule().getActiveMap(); + let systems = deleteData.systemIds.map(systemId => + document.getElementById(MapUtil.getSystemId(module._mapId, systemId)) + ).filter(Boolean); + + $(module.moduleElement).showLoadingAnimation(); + activeMap.trigger('pf:deleteSystems', [{ + systems: systems, + callback: deletedSystems => { + // callback function after ajax "delete" success + // check if system was deleted + if(deletedSystems.length){ + // remove table row + rowsSelected.remove().draw(); + }else{ + // error + this.showNotify({title: 'Failed to delete system', type: 'error'}); + } + $(module.moduleElement).hideLoadingAnimation(); + } + }]); + }else{ + // just delete connections + let connections = deleteData.connectionIds.map(connectionId => + $().getConnectionById(module._mapId, connectionId) + ).filter(Boolean); + + $(module.moduleElement).showLoadingAnimation(); + MapUtil.deleteConnections(connections, () => { + // callback function after ajax "delete" success + // remove table row + rowsSelected.remove().draw(); + $(module.moduleElement).hideLoadingAnimation(); + }); + } + } + }; + + // init confirmation dialog + $(cell).confirmation('destroy').confirmation(confirmationSettings).confirmation('show'); + }else if(!rowData.syncStatus){ + // add row ------------------------------------------------------------------------ + + let systemDataThera = MapUtil.getSystemData(module._mapId, TheraModule.systemIdThera, 'systemId'); + let systemDataSource = MapUtil.getSystemData(module._mapId, BaseModule.Util.getObjVal(rowData, 'target.id'), 'systemId'); + + if(systemDataThera && systemDataSource){ + // source & target system are already on map -> just draw connection + let map = MapUtil.getMapInstance(module._mapId); + let connectionData = { + source: systemDataThera.id, + target: systemDataSource.id, + scope: rowData.scope, + type: rowData.type + }; + + $(module.moduleElement).showLoadingAnimation(); + + Map.drawConnection(map, connectionData) + .then(payload => Map.saveConnection(payload.data.connection, true)) + .catch(console.warn); + }else{ + let options = { + systemData: { + id: BaseModule.Util.getObjVal(rowData, 'target.id'), + name: BaseModule.Util.getObjVal(rowData, 'target.name') + } + }; + + if(systemDataThera){ + let systemThera = document.getElementById(MapUtil.getSystemId(systemDataThera.mapId, systemDataThera.id)); + if(systemThera){ + options.sourceSystem = $(systemThera); + options.connectionData = { + scope: rowData.scope, + type: rowData.type, + disableAutoScope: true + }; + } + } + + module.showNewSystemDialog(options); + } + } + }); + } + },{ + targets: 10, + name: 'rowGroupData', + className: 'never', // never show this column. see: https://datatables.net/extensions/responsive/classes + data: 'rowGroupData', + defaultContent: 0, + visible: false, + render: { + sort: 'id' + } + } + ], + drawCallback: function(settings){ + let animationRows = this.api().rows().nodes().to$().filter(function(){ + return ( + $(this).data('animationStatus') || + $(this).data('animationTimer') + ); + }); + + animationRows.initTooltips(); + + for(let i = 0; i < animationRows.length; i++){ + let animationRow = $(animationRows[i]); + animationRow.pulseBackgroundColor(animationRow.data('animationStatus')); + animationRow.removeData('animationStatus'); + } + }, + initComplete: function(settings, json){ + module.getTheraConnectionsData('callbackUpdateTableRows'); + + // hover effect ----------------------------------------------------------------------------------- + let tableApi = this.api(); + let relRowId = null; + tableApi.tables().nodes().to$().on('mouseenter', 'td', function(){ + relRowId = BaseModule.Util.getObjVal(tableApi.row(this.parentElement).data(), 'relRowId') || null; + if(relRowId){ + let colIndex = tableApi.cell(this).index().column; + if(colIndex <= 8){ + let cell = tableApi.cell(this); + let relCell = tableApi.cell( + `#${module.getRowById(tableApi, relRowId)}`, + colIndex + ); + cell.nodes().to$().addClass('cellHighlight'); + relCell.nodes().to$().addClass('cellHighlight'); + + if([4,5,6,7,8].includes(colIndex)){ + let cellNode = cell.node(); + let relCellNode = relCell.node(); // might not exist if relRow was recently removed + if( + cellNode && relCellNode && + cellNode.innerHTML !== relCellNode.innerHTML + ){ + cellNode.dataset.origValue = cellNode.innerHTML; + cellNode.innerHTML = relCellNode.innerHTML; + } + } + } + } + }).on('mouseleave', 'td', function(){ + if(relRowId){ + if(this.dataset.origValue){ + this.innerHTML = this.dataset.origValue; + delete this.dataset.origValue; + } + tableApi.cells().nodes().to$().removeClass('cellHighlight'); + relRowId = null; + } + }); + + // click on "fake connection" --------------------------------------------------------------------- + $(this).on('click', '.pf-fake-connection', function(){ + let rowData = tableApi.row(this.closest('tr')).data(); + if(rowData.connectionId){ + let connection = $().getConnectionById(module._mapId, rowData.connectionId); + if(connection){ + let map = connection._jsPlumb.instance; + MapUtil.showConnectionInfo(map, [connection]); + } + } + }); + + // click on "target system name" ------------------------------------------------------------------ + $(this).on('click', `.${module._config.linkClass}[data-systemid]:not([data-systemid=''])`, e => { + BaseModule.Util.triggerMenuAction( + BaseModule.Util.getMapModule().getActiveMap(), + 'SelectSystem', + {systemId: MapUtil.getSystemData(module._mapId, parseInt(e.target.dataset.systemid), 'systemId').id} + ); + }); + }, + data: [] // will be added dynamic + }); + + let buttons = new $.fn.dataTable.Buttons(this._tableApi, { + dom: { + container: { + tag: 'h5', + className: 'pull-right' + }, + button: { + tag: 'i', + className: ['fas', 'fa-fw', module._config.moduleHeadlineIconClass].join(' '), + }, + buttonLiner: { + tag: null + } + }, + name: 'tableTools', + buttons: [ + { + name: 'eveScout', + className: 'fa-external-link-alt', + titleAttr: module._config.eveScoutUrl.hostname.replace('www.', ''), + attr: { + 'data-toggle': 'tooltip', + 'data-html': true + }, + action: function(e, tableApi, node, config){ + e.stopPropagation(); + window.open(`//${module._config.eveScoutUrl.hostname}`, '_blank'); + } + }, { + name: 'refresh', + className: 'fa-sync', + titleAttr: 'refresh', + attr: { + 'data-toggle': 'tooltip', + 'data-html': true + }, + action: function(e, tableApi, node, config){ + $(module.moduleElement).showLoadingAnimation(); + module.getTheraConnectionsData('callbackUpdateTableRows'); + } + } + ] + }); + + // "RowGroup" Datatables Plugin + this._tableApi.buttons().container().appendTo(module.moduleElement.querySelector('.' + module._config.headClassName)); + + new $.fn.dataTable.RowGroup(this._tableApi, { + dataSrc: 'rowGroupData.name', + startRender: function(rows, group, level){ + return `
    ` + + `${group}` + + `${rows.count()}` + + `
    `; + } + }); + + // "Select" Datatables Plugin + this._tableApi.select(); + + this._tableApi.on('user-select', function(e, tableApi, type, cell, originalEvent){ + let rowData = tableApi.row(cell.index().row).data(); + if(!BaseModule.Util.getObjVal(rowData, 'connectionId')){ + e.preventDefault(); + } + }); + } + + /** + * @param options + * @param isThera + */ + showNewSystemDialog(options = {}, isThera = false){ + let activeMap = BaseModule.Util.getMapModule().getActiveMap(); + + // custom callback -> refresh Thera table + options.callback = (map, newSystemData, sourceSystem, connectionData) => { + $(this.moduleElement).showLoadingAnimation(); + + Map.saveSystemCallback(map, newSystemData, sourceSystem, connectionData); + }; + BaseModule.Util.triggerMenuAction(activeMap, 'AddSystem', options); + } + + /** + * get thera connections data + * @param callback + * @param system + */ + getTheraConnectionsData(callback, system = null){ + + this.getLocalStore().getItem('eveScout') + .then(cacheEntry => new Promise(resolve => { + + if( + cacheEntry && cacheEntry.tSet && + TheraModule.ttlEveScoutResponse > BaseModule.now() - cacheEntry.tSet + ){ + $(this.moduleElement).hideLoadingAnimation(); + resolve(cacheEntry.value); + }else{ + this.request('GET', 'SystemThera', [], {}, this, context => { + $(this.moduleElement).hideLoadingAnimation(); + }).then(payload => { + let cacheEntry = { + tSet: BaseModule.now(), + value: Array.isArray(payload.data) ? payload.data : [] + }; + this.getLocalStore().setItem('eveScout', cacheEntry) + .then(cacheEntry => resolve(cacheEntry.value)); + }).catch(payload => { + let reason = payload.data.status + ' ' + payload.data.error; + this.showNotify({ + title: payload.data.jqXHR.status + ': Thera connections data', + text: reason, + type: 'warning' + }); + resolve([]); + }); + } + })) + .then(connectionsData => this[callback](connectionsData, system)); + } + + /** + * update thera table with data + * @param connectionsData + * @param systemThera + */ + callbackUpdateTableRows(connectionsData = [], systemThera = null){ + if(!this._tableApi){ + return; + } + + connectionsData = Array.isArray(connectionsData) ? connectionsData : []; + + let getGroupedRowId = (groupData, rowId) => { + return `${groupData.id}-${rowId}`; + }; + + let touchedRows = []; + let hadData = this._tableApi.rows().any(); + let notificationCounter = { + added: 0, + changed: 0, + deleted: 0 + }; + + let map = MapUtil.getMapInstance(this._mapId); + let currentMapData = BaseModule.Util.getCurrentMapData(this._mapId); + if(map && currentMapData){ + let groupDataMap = { + id: this._mapId, + name: BaseModule.Util.getObjVal(currentMapData, 'config.name') + }; + + let groupDataEveScout = { + id: 0, + name: 'eve-scout.com' + }; + + // get data from all Thera connections from current map ----------------------------------------------- + let currentConnectionsData = {}; + let systemTheraFound = false; + if(systemThera){ + systemTheraFound = true; + let currentConnections = MapUtil.searchConnectionsBySystems(map, [systemThera], '*'); + currentConnectionsData = BaseModule.getConnectionsDataFromConnections(this._mapId, currentConnections); + }else{ + let systemDataThera = MapUtil.getSystemData(this._mapId, TheraModule.systemIdThera, 'systemId'); + if(systemDataThera){ + systemTheraFound = true; + let systemIdThera = MapUtil.getSystemId(this._mapId, systemDataThera.id); + let currentConnections = MapUtil.searchConnectionsBySystems(map, [systemIdThera], '*'); + currentConnectionsData = BaseModule.getConnectionsDataFromConnections(this._mapId, currentConnections); + } + } + + this._bodyEl.querySelector(`.${this._config.controlAreaTheraClass}`).classList.toggle('hidden', systemTheraFound); + + let dateNow = new Date(); + + let tableDataPrimary = []; + let tableDataSecondary = []; + + let formatSignatureData = data => ({ + id: data.ids, + name: data.names.length ? data.names.map(name => name.substring(0, 3)).join(', ') : null, + type: { + name: data.labels.length ? data.labels.join(', ') : null + } + }); + + let equalPropVal = (val, prop = 'id') => b => b[prop] === val; + + // add mapped Thera connections (primary) ------------------------------------------------------------- + for(let currentConnectionData of Object.values(currentConnectionsData)){ + let connectionId = BaseModule.Util.getObjVal(currentConnectionData, 'connection.id') || 0; + let updated = BaseModule.Util.getObjVal(currentConnectionData, 'connection.updated') || 0; + let source = currentConnectionData.source; + let target = currentConnectionData.target; + let connectionHash = BaseModule.getConnectionDataCacheKey(source.name, target.name); + + // mapped connection not exists in eveScout data + let currentConnectionDataFull = MapUtil.getConnectionDataFromMapData(currentMapData, connectionId); + let connection = $().getConnectionById(this._mapId, connectionId); + let signatureTypeNames = MapUtil.getConnectionDataFromSignatures(connection, currentConnectionDataFull); + + let sourceSignature = formatSignatureData(signatureTypeNames.source); + let targetSignature = formatSignatureData(signatureTypeNames.target); + + // swap source <-> target. 'Thera' should be the source system + // -> In order to match the eve-scout response format for connections + if(target.name.toLowerCase() === 'thera'){ + [source, target] = [target, source]; + [sourceSignature, targetSignature] = [targetSignature, sourceSignature]; + } + + let whLabel = null; + let whSigId = 0; + for(let data of Object.values(signatureTypeNames)){ + if(!data.labels){ + continue; + } + let i = data.labels.findIndex(label => label !== 'K162'); + if(i !== -1){ + whLabel = data.labels[i]; + whSigId = data.ids[i]; + break; + } + } + + // to calc the remaining lifetime of the wormhole, we need the 'created' date of linked sig. + // -> This is "hacky"! We re-search all signatures by whSigId === id... :( + let estimatedEol; + let maxStableTime = BaseModule.Util.getObjVal(Object.assign({}, Init.wormholes[whLabel]), 'maxStableTime'); + if(maxStableTime && whSigId){ + let whSignatureData = (BaseModule.Util.getObjVal(currentConnectionDataFull, 'signatures') || []) + .find(equalPropVal(whSigId)); + let whSignatureCreated = BaseModule.Util.getObjVal(whSignatureData, 'created.created') || 0; + if(whSignatureCreated){ + let createdDate = new Date( whSignatureCreated * 1000); + createdDate.setHours(createdDate.getHours() + maxStableTime); + //estimatedEol = Math.floor(createdDate.getTime() / 1000); + estimatedEol = createdDate.toISOString(); + } + } + + let rowData = { + id: getGroupedRowId(groupDataMap, connectionHash), + hash: connectionHash, + scope: BaseModule.Util.getObjVal(currentConnectionData, 'connection.scope'), + type: BaseModule.Util.getObjVal(currentConnectionData, 'connection.type'), + source: (({id:realId, systemId:id, name, trueSec, constellation, region}) => + ({ + realId, + id, + name, + trueSec, + constellation, + region + }))(MapUtil.getSystemDataFromMapData(currentMapData, source.id)), + target: (({id:realId, systemId:id, name, trueSec, constellation, region}) => + ({ + realId, + id, + name, + trueSec, + constellation, + region + }))(MapUtil.getSystemDataFromMapData(currentMapData, target.id)), + sourceSignature: sourceSignature, + targetSignature: targetSignature, + wormholeLabel: whLabel, + syncStatus: 'warning', + rowGroupData: groupDataMap, + connectionId: connectionId, + fakeConnection: BaseModule.getFakeConnectionElement(currentConnectionData), + estimatedEol: estimatedEol, + updated: updated, + updatedHash: [updated, signatureTypeNames.hash].join().hashCode() + }; + + tableDataPrimary.push(rowData); + } + + // add EveScout Thera connections (secondary) --------------------------------------------------------- + for(let rowData of connectionsData){ + let systemNameSource = BaseModule.Util.getObjVal(rowData, 'source.name'); + let systemNameTarget = BaseModule.Util.getObjVal(rowData, 'target.name'); + let connectionHash = BaseModule.getConnectionDataCacheKey(systemNameSource, systemNameTarget); + + let whLabel = BaseModule.Util.getObjVal(rowData, 'sourceSignature.type.name') || null; + if(!whLabel){ + whLabel = BaseModule.Util.getObjVal(rowData, 'targetSignature.type.name') || null; + } + + let massType = BaseModule.Util.getObjVal(Object.assign({}, Init.wormholes[whLabel]), 'size.type'); + let connectionType = [...rowData.type, massType]; + + // overwrite eveScout id with new id (hash) + rowData.id = getGroupedRowId(groupDataEveScout, connectionHash); + rowData.hash = connectionHash; + rowData.wormholeLabel = whLabel; + rowData.syncStatus = null; + rowData.rowGroupData = groupDataEveScout; + rowData.connectionId = null; + rowData.type = connectionType; + rowData.fakeConnection = BaseModule.getFakeConnectionElement(BaseModule.getFakeConnectionData( + {system: systemNameSource}, + {system: systemNameTarget}, + rowData.scope, + rowData.type + )); + rowData.updatedHash = String(rowData.updated).hashCode(); + tableDataSecondary.push(rowData); + } + + // + Merge Primary + Secondary table data ------------------------------------------------------------- + for(let primaryRowData of tableDataPrimary){ + let secondaryIndex = tableDataSecondary.findIndex(equalPropVal(primaryRowData.hash, 'hash')); + if(secondaryIndex !== -1){ + // get a new hash key from both 'updated' values (primary + secondary) tableData + // -> if a signature gets updated on map, table row should be updated, too + // -> so we can check it later on if either prim. or sec. data has changed... + let updatedHash = [ + primaryRowData.updatedHash, + tableDataSecondary[secondaryIndex].updatedHash + ].join().hashCode(); + + primaryRowData.syncStatus = 'success'; + primaryRowData.relRowId = tableDataSecondary[secondaryIndex].id; + primaryRowData.updatedHash = updatedHash; + + // remove from secondary table data -> no duplicated rows + //tableDataSecondary.splice(secondaryIndex, 1); + + tableDataSecondary[secondaryIndex].syncStatus = 'hint'; + tableDataSecondary[secondaryIndex].relRowId = primaryRowData.id; + tableDataSecondary[secondaryIndex].updatedHash = updatedHash; + } + } + + let tableData = [...tableDataPrimary, ...tableDataSecondary]; + + // update table data ---------------------------------------------------------------------------------- + for(let rowData of tableData){ + let rowId = this.getRowById(this._tableApi, rowData.id); + + if(rowId){ + // update row + let api = this._tableApi.row('#' + rowId); + let rowDataCurrent = api.data(); + + // check for update + if( + BaseModule.Util.getObjVal(rowDataCurrent, 'updatedHash') !== + BaseModule.Util.getObjVal(rowData, 'updatedHash') + ){ + // row data changed -> update + api.data(rowData); + api.nodes().to$().data('animationStatus', 'changed'); + notificationCounter.changed++; + } + + touchedRows.push(api.id()); + }else{ + // insert new row + let api = this._tableApi.row.add(rowData); + api.nodes().to$().data('animationStatus', 'added'); + notificationCounter.added++; + + touchedRows.push(api.id()); + } + } + + let api = this._tableApi.rows((idx, data, node) => !touchedRows.includes(node.id)); + notificationCounter.deleted += api.ids().count(); + api.remove(); + + if(Math.max(...Object.values(notificationCounter))){ + this._tableApi.draw(); + } + + // show notification ---------------------------------------------------------------------------------- + let notification = Object.keys(notificationCounter).reduce((acc, key) => { + return `${acc}${notificationCounter[key] ? `${notificationCounter[key]} ${key}
    ` : ''}`; + }, ''); + + if(hadData && notification.length){ + this.showNotify({title: 'Thera connections updated', text: notification, type: 'success', textTrusted: true}); + } + }else{ + console.warn('Table update failed for Thera connections. MapData is missing'); + } + } + + /** + * set module observer + */ + setModuleObserver(){ + + // add Thera system + this._bodyEl.querySelector(`.${this._config.controlAreaTheraClass}`).addEventListener('click', e => { + this.showNewSystemDialog({ + systemData: { + id: TheraModule.systemIdThera, + name: 'Thera' + } + }, true); + }, false); + + // signature column - "type" popover + MapUtil.initWormholeInfoTooltip( + $(this.moduleElement).find('.' + this._config.globalTheraTableClass), + `.${this._config.tableCellTypeClass} span[class^="pf-system-sec-"]` + ); + + // init tooltips + $(this.moduleElement).initTooltips(); + } + + /** + * update module + * compare data and update module + * @param mapId + * @returns {Promise} + */ + update(mapId){ + return super.update(mapId).then(mapId => new Promise(resolve => { + this.getTheraConnectionsData('callbackUpdateTableRows'); + + resolve({ + action: 'update', + data: { + module: this + } + }); + })); + } + }; + + TheraModule.isPlugin = false; // module is defined as 'plugin' + TheraModule.scope = 'global'; // module scope controls how module gets updated and what type of data is injected + TheraModule.sortArea = 'b'; // default sortable area + TheraModule.position = 3; // default sort/order position within sortable area + TheraModule.label = 'Thera'; // static module label (e.g. description) + TheraModule.systemIdThera = 31000005; + TheraModule.ttlEveScoutResponse = 120; + + TheraModule.defaultConfig = { + className: 'pf-global-thera-module', // class for module + sortTargetAreas: ['a', 'b', 'c'], // sortable areas where module can be dragged into + headline: 'Thera Connection', + + // Thera module + theraTableId: 'pf-thera-table-', // id prefix for all tables in module + theraTableRowIdPrefix: 'pf-thera-row-', // id prefix for table rows + globalTheraTableClass: 'pf-global-thera-table', // class for NPC owned stations table + controlAreaTheraClass: 'pf-global-thera-control', // class for "thera system exists" label + + // fonts + fontUppercaseClass: 'pf-font-uppercase', // class for "uppercase" font + linkClass: 'pf-link', + + // Thera connections table + tableCellTypeClass: 'pf-table-type-cell', // class for "type" cells + tableCellEllipsisClass: 'pf-table-cell-ellipses-auto', // class for table "ellipsis" cells + tableCellActionClass: 'pf-table-action-cell' + }; + + return TheraModule; +}); \ No newline at end of file diff --git a/js/app/ui/module/system_graph.js b/js/app/ui/module/system_graph.js index c92aa0da..990cb9d8 100644 --- a/js/app/ui/module/system_graph.js +++ b/js/app/ui/module/system_graph.js @@ -4,29 +4,362 @@ define([ 'jquery', - 'app/init', 'app/util', + 'module/base', 'morris' -], ($, Init, Util, Morris) => { +], ($, Util, BaseModule, Morris) => { 'use strict'; - let config = { - // module info - modulePosition: 3, - moduleName: 'systemGraph', - moduleHeadClass: 'pf-module-head', // class for module header - moduleHandlerClass: 'pf-module-handler-drag', // class for "drag" handler + let SystemGraphModule = class SystemGraphModule extends BaseModule { + constructor(config = {}) { + super(Object.assign({}, new.target.defaultConfig, config)); + } - // system graph module - moduleTypeClass: 'pf-system-graph-module', // class for this module - systemGraphClass: 'pf-system-graph', // class for each graph + newHeaderElement(){ + return ''; // no default header for this module + } - // system graph labels + newHeadlineToolbarElement(){ + let toolbarEl = super.newHeadlineToolbarElement(); + + let infoEl = document.createElement('small'); + infoEl.innerHTML = ''; + toolbarEl.append(infoEl); + + return toolbarEl; + } + + /** + * render module + * @param mapId + * @param systemData + * @returns {HTMLElement} + */ + render(mapId, systemData){ + this._systemData = systemData; + + // graph data is available for k-space systems + if(systemData.type.id === 2){ + + let rowEl = document.createElement('div'); + rowEl.classList.add(this._config.bodyClassName, 'grid'); + + for(let graphKey of Object.keys(this._config.systemGraphs)){ + let colEl = document.createElement('div'); + colEl.dataset.graph = graphKey; + + let headEl = this.newHeadElement(); + headEl.append( + this.newHandlerElement(), + this.newHeadlineElement(this.getInfoForGraph(graphKey, 'headline')), + this.newHeadlineToolbarElement() + ); + + let graphEl = document.createElement('div'); + graphEl.classList.add(this._config.systemGraphClass); + + colEl.append(headEl, graphEl); + rowEl.append(colEl); + } + this.moduleElement.append(rowEl); + + this.setModuleObserver(); + + // request graph data and store result promise + // -> module is not full rendered jet + this._dataPromise = this.getGraphsData(); + + return this.moduleElement; + } + } + + /** + * init module + */ + init(){ + super.init(); + + if(this._dataPromise instanceof Promise){ + this._dataPromise + .then(payload => this.addGraphData(payload.data)) + .catch(payload => { + let reason = payload.data.status + ' ' + payload.data.error; + this.showNotify({title: payload.data.jqXHR.status + ': System graph data', text: reason, type: 'warning'}); + }); + } + } + + /** + * get data for graphs + * @returns {Promise} + */ + getGraphsData(){ + $(this.moduleElement).find('.' + this._config.systemGraphClass).showLoadingAnimation(); + return this.request('GET', 'SystemGraph', this._systemData.id, { + systemIds: [this._systemData.systemId] + }); + } + + /** + * update graph elements with data + * @param graphData + */ + addGraphData(graphData){ + + // calculate time offset until system updated ------------------------------------------------------------- + let serverData = Util.getServerTime(); + let timestampNow = Math.floor(serverData.getTime() / 1000); + let timeSinceUpdate = timestampNow - this._systemData.updated.updated; + + let timeInHours = Math.floor(timeSinceUpdate / 3600); + let timeInMinutes = Math.floor((timeSinceUpdate % 3600) / 60); + let timeInMinutesPercent = parseFloat((timeInMinutes / 60).toFixed(2)); + + // graph is from right to left -> convert event line + let eventLine = Math.max(parseFloat((24 - timeInHours - timeInMinutesPercent).toFixed(2)), 0); + + // update graph data -------------------------------------------------------------------------------------- + for(let [systemId, graphsData] of Object.entries(graphData)){ + for(let [graphKey, graphData] of Object.entries(graphsData)){ + let graphColElement = $(this.moduleElement).find('[data-graph="' + graphKey + '"]'); + let graphElement = graphColElement.find('.' + this._config.systemGraphClass); + graphElement.hideLoadingAnimation(); + + graphColElement.data('infoData', this.initGraph(graphElement, graphKey, graphData, eventLine)); + } + } + } + + /** + * set module observer + */ + setModuleObserver(){ + $(this.moduleElement).hoverIntent({ + over: function(e){ + let element = $(this); + let tooltipData = element.parents('[data-graph]').data('infoData'); + if(tooltipData){ + SystemGraphModule.addSystemGraphTooltip(element, tooltipData.rows, { + trigger: 'manual', + title: tooltipData.title + }).popover('show'); + } + }, + out: function(e){ + $(this).destroyPopover(); + }, + selector: '.' + Util.config.popoverTriggerClass + }); + } + + /** + * get info for a given graph key + * @param graphKey + * @param option + * @returns {*|string} + */ + getInfoForGraph(graphKey, option){ + return Util.getObjVal(this._config.systemGraphs, graphKey + '.' + option) || ''; + } + + /** + * init Morris Graph + * @param graphElement + * @param graphKey + * @param graphData + * @param eventLine + * @returns {null|Object} + */ + initGraph(graphElement, graphKey, graphData, eventLine){ + let tooltipData = null; + + if( + graphData.logExists && + graphData.data && + graphData.data.length + ){ + let dataLength = graphData.data.length; + let xKey = 'x'; + let yKeys = this.getInfoForGraph(graphKey, 'ykeys'); + + // calc average (goal) ------------------------------------------------------------------------------------ + // ... init empty sum object ... + let sum = yKeys.reduce((result, key) => { + result[key] = 0; + return result; + }, {}); + + // ... sum all values ... + sum = graphData.data.reduce((sum, obj) => { + for(let [key, value] of Object.entries(obj)){ + if(sum.hasOwnProperty(key)){ + sum[key] += value; + } + } + return sum; + }, sum); + + // ... calc average + let goals = Object.values(sum).map(value => Math.floor(value / dataLength)); + + // init Morris chart -------------------------------------------------------------------------------------- + let graphConfig = { + element: graphElement, + data: graphData.data, + xkey: xKey, + ykeys: yKeys, + labels: this.getInfoForGraph(graphKey, 'labels'), + xLabelAngle: 0, + parseTime: false, + ymin: 0, + yLabelFormat: value => Math.round(value), + padding: 8, + hideHover: true, + pointSize: 2.5, + lineColors: this.getInfoForGraph(graphKey, 'lineColors'), + pointFillColors: this.getInfoForGraph(graphKey, 'pointFillColors'), + pointStrokeColors: ['#141519'], + lineWidth: 1.5, + grid: true, + gridTextColor: '#63676a', + gridTextSize: 10, + gridTextFamily: 'Arial, "Oxygen Bold"', + gridStrokeWidth: 0.3, + behaveLikeLine: true, + goals: goals, + goalStrokeWidth: 1, + goalLineColors: ['#c2760c'], + smooth: true, + fillOpacity: 0.5, + //belowArea: true, + areaColors: ['#c2760c', '#c2760c'], + belowArea: true, + //resize: true, + //redraw: true, + dataLabels: false, + eventStrokeWidth: 1, + eventLineColors: ['#63676a'], + nbYkeys2: this.getInfoForGraph(graphKey, 'nbYkeys2') + }; + + if(eventLine > 0){ + graphConfig.events = [eventLine]; + } + + this['_aChart_' + graphKey] = Morris.Line(graphConfig); + + // data for info "popover" -------------------------------------------------------------------------------- + tooltipData = {}; + let tooltipRows = []; + let infoLabels = this.getInfoForGraph(graphKey, 'infoLabels'); + goals.forEach((goal, i) => { + tooltipRows.push({ + label: infoLabels[i], + value: goal, + class: 'txt-color txt-color-orangeDark' + }); + }); + tooltipData.rows = tooltipRows; + + let serverDate = Util.getServerTime(); + let updatedDate = Util.convertTimestampToServerTime(graphData.updated); + let updatedDiff = Util.getTimeDiffParts(updatedDate, serverDate); + + tooltipData.title = '' + Util.formatTimeParts(updatedDiff) + ''; + }else{ + // make container a bit smaller -> no graph shown + graphElement.css('height', '22px').text('No data'); + } + + return tooltipData; + } + + beforeDestroy(){ + super.beforeDestroy(); + + for(let graphKey of Object.keys(this._config.systemGraphs)){ + if(typeof this['_aChart_' + graphKey] === 'object'){ + this['_aChart_' + graphKey].destroy(); + delete this['_aChart_' + graphKey]; + } + } + } + + /** + * detect changed drop area, -> should trigger graph redraw + * @param name + * @param e + */ + onSortableEvent(name, e){ + super.onSortableEvent(name, e); + if(e.type === 'add' && e.from !== e.to){ + for(let graphKey of Object.keys(this._config.systemGraphs)){ + if(typeof this['_aChart_' + graphKey] === 'object'){ + this['_aChart_' + graphKey].resizeHandler(); + } + } + } + } + + /** + * add info tooltip for graphs + * @param element + * @param tooltipData + * @param options + * @returns {jQuery} + */ + static addSystemGraphTooltip(element, tooltipData, options = {}){ + let table = '
    '; + for(let data of tooltipData){ + let css = data.class || ''; + + table += ''; + table += ''; + table += ''; + table += ''; + } + table += '
    '; + table += data.label; + table += ''; + table += data.value; + table += '
    '; + + let defaultOptions = { + placement: 'top', + html: true, + trigger: 'hover', + container: 'body', + title: 'Info', + content: table, + delay: { + show: 0, + hide: 0 + }, + }; + + options = Object.assign({}, defaultOptions, options); + + return $(element).popover(options); + } + }; + + SystemGraphModule.isPlugin = false; // module is defined as 'plugin' + SystemGraphModule.scope = 'system'; // module scope controls how module gets updated and what type of data is injected + SystemGraphModule.sortArea = 'a'; // default sortable area + SystemGraphModule.position = 3; // default sort/order position within sortable area + SystemGraphModule.label = 'Graphs'; // static module label (e.g. description) + + SystemGraphModule.defaultConfig = { + className: 'pf-system-graph-module', // class for module + sortTargetAreas: ['a', 'b', 'c'], // sortable areas where module can be dragged into + + systemGraphClass: 'pf-system-graph', // class for each graph systemGraphs: { jumps: { headline: 'Jumps', - units: 'jumps', + postUnits: 'jumps', ykeys: ['y'], + nbYkeys2: 0, labels: ['Jumps'], lineColors: ['#375959'], pointFillColors: ['#477372'], @@ -34,8 +367,9 @@ define([ }, shipKills: { headline: 'Ship/POD Kills', - units: 'kills', + postUnits: 'kills', ykeys: ['y', 'z'], + nbYkeys2: 1, labels: ['Ships', 'PODs'], lineColors: ['#375959', '#477372'], pointFillColors: ['#477372', '#568a89'], @@ -43,8 +377,9 @@ define([ }, factionKills: { headline: 'NPC Kills', - units: 'kills', + postUnits: 'kills', ykeys: ['y'], + nbYkeys2: 0, labels: ['NPCs'], lineColors: ['#375959'], pointFillColors: ['#477372'], @@ -53,353 +388,5 @@ define([ } }; - // temp storage for graphsData response Promise - // -> stored until module is fully rendered (attached to DOM) - // otherwise graph can not be rendered - let graphDataPromise = null; - - /** - * get info for a given graph key - * @param graphKey - * @param option - * @returns {string} - */ - let getInfoForGraph = (graphKey, option) => Util.getObjVal(config.systemGraphs, graphKey + '.' + option) || ''; - - /** - * init Morris Graph - * @param graphElement - * @param graphKey - * @param graphData - * @param eventLine - * @returns {Array|null} - */ - let initGraph = (graphElement, graphKey, graphData, eventLine) => { - let tooltipData = null; - - if( - graphData.logExists && - graphData.data && - graphData.data.length - ){ - let dataLength = graphData.data.length; - let xKey = 'x'; - let yKeys = getInfoForGraph(graphKey, 'ykeys'); - - // calc average (goal) ------------------------------------------------------------------------------------ - // ... init empty sum object ... - let sum = yKeys.reduce((result, key) => { - result[key] = 0; - return result; - }, {}); - - // ... sum all values ... - sum = graphData.data.reduce((sum, obj) => { - for(let [key, value] of Object.entries(obj)){ - if(sum.hasOwnProperty(key)){ - sum[key] += value; - } - } - return sum; - }, sum); - - // ... calc average - let goals = Object.values(sum).map(value => Math.floor(value / dataLength)); - - // init Morris chart -------------------------------------------------------------------------------------- - let graphConfig = { - element: graphElement, - data: graphData.data, - xkey: xKey, - ykeys: yKeys, - labels: getInfoForGraph(graphKey, 'labels'), - parseTime: false, - ymin: 0, - yLabelFormat: value => Math.round(value), - padding: 8, - hideHover: true, - pointSize: 2.5, - lineColors: getInfoForGraph(graphKey, 'lineColors'), - pointFillColors: getInfoForGraph(graphKey, 'pointFillColors'), - pointStrokeColors: ['#141519'], - lineWidth: 1.5, - grid: true, - gridStrokeWidth: 0.3, - gridTextSize: 9, - gridTextFamily: 'Oxygen Bold', - gridTextColor: '#63676a', - behaveLikeLine: false, - goals: goals, - goalStrokeWidth: 1, - goalLineColors: ['#c2760c'], - smooth: false, - fillOpacity: 0.2, - resize: true, - redraw: true, - eventStrokeWidth: 1, - eventLineColors: ['#63676a'] - }; - - if(eventLine > 0){ - graphConfig.events = [eventLine]; - } - - Morris.Area(graphConfig); - - // data for info "popover" -------------------------------------------------------------------------------- - tooltipData = {}; - let tooltipRows = []; - let infoLabels = getInfoForGraph(graphKey, 'infoLabels'); - goals.forEach((goal, i) => { - tooltipRows.push({ - label: infoLabels[i], - value: goal, - class: 'txt-color txt-color-orangeDark' - }); - }); - tooltipData.rows = tooltipRows; - - let serverDate = Util.getServerTime(); - let updatedDate = Util.convertTimestampToServerTime(graphData.updated); - let updatedDiff = Util.getTimeDiffParts(updatedDate, serverDate); - - tooltipData.title = '' + Util.formatTimeParts(updatedDiff) + ''; - }else{ - // make container a bit smaller -> no graph shown - graphElement.css('height', '22px').text('No data'); - } - - return tooltipData; - }; - - /** - * request graphs data - * @param requestData - * @param context - * @returns {Promise} - */ - let requestGraphData = (requestData, context) => { - - let requestGraphDataExecutor = (resolve, reject) => { - // show loading animation - context.moduleElement.find('.' + config.systemGraphClass).showLoadingAnimation(); - - $.ajax({ - type: 'GET', - url: Init.path.getSystemGraphData, - data: requestData, - dataType: 'json', - context: context - }).done(function(graphData){ - resolve({ - action: 'requestGraphData', - data: { - context: this, - graphData: graphData - } - }); - }).fail(function(jqXHR, status, error){ - let reason = status + ' ' + error; - Util.showNotify({title: jqXHR.status + ': System graph data', text: reason, type: 'warning'}); - $(document).setProgramStatus('problem'); - this.moduleElement.hide(); - - reject(); - }); - }; - - return new Promise(requestGraphDataExecutor); - }; - - /** - * update graph elements with data - * @param context - * @param graphData - */ - let addGraphData = (context, graphData) => { - - // calculate time offset until system updated ----------------------------------------------------------------- - let serverData = Util.getServerTime(); - let timestampNow = Math.floor(serverData.getTime() / 1000); - let timeSinceUpdate = timestampNow - context.systemData.updated.updated; - - let timeInHours = Math.floor(timeSinceUpdate / 3600); - let timeInMinutes = Math.floor((timeSinceUpdate % 3600) / 60); - let timeInMinutesPercent = parseFloat((timeInMinutes / 60).toFixed(2)); - - // graph is from right to left -> convert event line - let eventLine = Math.max(parseFloat((24 - timeInHours - timeInMinutesPercent).toFixed(2)), 0); - - // update graph data ------------------------------------------------------------------------------------------ - for(let [systemId, graphsData] of Object.entries(graphData)){ - for(let [graphKey, graphData] of Object.entries(graphsData)){ - let graphColElement = context.moduleElement.find('[data-graph="' + graphKey + '"]'); - let graphElement = graphColElement.find('.' + config.systemGraphClass); - graphElement.hideLoadingAnimation(); - - graphColElement.data('infoData', initGraph(graphElement, graphKey, graphData, eventLine)); - } - } - - setModuleObserver(context.moduleElement); - }; - - /** - * @param moduleElement - */ - let setModuleObserver = moduleElement => { - moduleElement.hoverIntent({ - over: function(e){ - let element = $(this); - let tooltipData = element.parents('[data-graph]').data('infoData'); - if(tooltipData){ - element.addSystemGraphTooltip(tooltipData.rows, { - trigger: 'manual', - title: tooltipData.title - }).popover('show'); - } - }, - out: function(e){ - $(this).destroyPopover(); - }, - selector: '.' + Util.config.popoverTriggerClass - }); - }; - - /** - * add info tooltip for graphs - * @param tooltipData - * @param options - * @returns {void|*|undefined} - */ - $.fn.addSystemGraphTooltip = function(tooltipData, options = {}){ - - let table = ''; - for(let data of tooltipData){ - let css = data.class || ''; - - table += ''; - table += ''; - table += ''; - table += ''; - } - table += '
    '; - table += data.label; - table += ''; - table += data.value; - table += '
    '; - - let defaultOptions = { - placement: 'top', - html: true, - trigger: 'hover', - container: 'body', - title: 'Info', - content: table, - delay: { - show: 0, - hide: 0 - }, - }; - - options = $.extend({}, defaultOptions, options); - - return this.each(function(){ - $(this).popover(options); - }); - }; - - /** - * @see requestGraphData - * @param moduleElement - * @param systemData - * @returns {Promise} - */ - let getGraphsData = (moduleElement, systemData) => { - let requestData = { - systemIds: [systemData.systemId] - }; - - let contextData = { - moduleElement: moduleElement, - systemData: systemData - }; - - return requestGraphData(requestData, contextData); - }; - - /** - * init callback - * @param moduleElement - * @param mapId - * @param systemData - */ - let initModule = (moduleElement, mapId, systemData) => { - if(graphDataPromise instanceof Promise){ - graphDataPromise - .then(payload => addGraphData(payload.data.context, payload.data.graphData)) - .catch(payload => {}); - } - }; - - /** - * get module element - * @param parentElement - * @param mapId - * @param systemData - * @returns {*} - */ - let getModule = (parentElement, mapId, systemData) => { - // graph data is available for k-space systems - let moduleElement = null; - if(systemData.type.id === 2){ - moduleElement = $('
    '); - let rowElement = $('
    ', { - class: 'row' - }); - - for(let graphKey of Object.keys(config.systemGraphs)){ - rowElement.append( - $('
    ', { - class: ['col-xs-12', 'col-sm-4'].join(' ') - }).attr('data-graph', graphKey).append( - $('
    ', { - class: config.moduleHeadClass - }).append( - $('
    ', { - class: config.moduleHandlerClass - }), - $('
    ', { - text: getInfoForGraph(graphKey, 'headline') - }), - $('
    ', { - class: 'pull-right' - }).append( - $('', { - html: '' - }) - ) - ), - $('
    ', { - class: config.systemGraphClass - }) - ) - ); - } - moduleElement.append(rowElement); - - // request graph data and store result promise globally - // -> moduleElement is not full rendered at this point - graphDataPromise = getGraphsData(moduleElement, systemData); - } - - return moduleElement; - }; - - return { - config: config, - getModule: getModule, - initModule: initModule - }; - + return SystemGraphModule; }); diff --git a/js/app/ui/module/system_info.js b/js/app/ui/module/system_info.js index f1fa9ec3..d2b76b0e 100644 --- a/js/app/ui/module/system_info.js +++ b/js/app/ui/module/system_info.js @@ -6,426 +6,448 @@ define([ 'jquery', 'app/init', 'app/util', - 'app/map/util' -], ($, Init, Util, MapUtil) => { + 'app/map/util', + 'module/base' +], ($, Init, Util, MapUtil, BaseModule) => { 'use strict'; - let config = { - // module info - modulePosition: 2, - moduleName: 'systemInfo', + let SystemInfoModule = class SystemInfoModule extends BaseModule { + constructor(config = {}) { + super(Object.assign({}, new.target.defaultConfig, config)); + } - // system info module - moduleTypeClass: 'pf-system-info-module', // class for this module + /** + * custom header for this module + * @returns {*} + */ + newHeaderElement(){ + let headEl = this.newHeadElement(); - // headline toolbar - moduleHeadlineIconClass: 'pf-module-icon-button', // class for toolbar icons in the head - textActionIconCopyClass: 'pf-module-icon-button-copy', // class for text action "copy" - - // breadcrumb - constellationLinkClass: 'pf-system-info-constellation', // class for "constellation" name - regionLinkClass: 'pf-system-info-region', // class for "region" name - typeLinkClass: 'pf-system-info-type', // class for "type" name - - // info col/table - systemInfoSectionClass: 'pf-system-info-section', // class for system info section - systemInfoTableClass: 'pf-module-table', // class for system info table - systemInfoNameClass: 'pf-system-info-name', // class for "name" information element - systemInfoEffectClass: 'pf-system-info-effect', // class for "effect" information element - systemInfoPlanetsClass: 'pf-system-info-planets', // class for "planets" information element - systemInfoStatusLabelClass: 'pf-system-info-status-label', // class for "status" information element - systemInfoStatusAttributeName: 'data-status', // attribute name for status label - systemInfoWormholeClass: 'pf-system-info-wormhole-', // class prefix for static wormhole element - - // description field - descriptionSectionClass: 'pf-system-description-section', // class for system description section - descriptionAreaClass: 'pf-system-info-description-area', // class for description area - addDescriptionButtonClass: 'pf-system-info-description-button', // class for "add description" button - descriptionTextareaElementClass: 'pf-system-info-description', // class for description textarea element (Summernote) - - // sovereignty col/table - systemSovSectionClass: 'pf-system-sov-section', // class for system sov. section - systemSovTableClass: 'pf-module-table', // class for system sov. table - systemSovFwContestedRowClass: 'pf-system-sov-fw-contested-row', // class for "contested" sov. table row - systemSovFwOccupationRowClass: 'pf-system-sov-fw-occupation-row', // class for "-occupation" sov. table row - systemSovFwContestedClass: 'pf-system-sov-fw-contested', - systemSovFwPercentageClass: 'pf-system-sov-fw-percentage', - systemSovFwOccupationClass: 'pf-system-sov-fw-occupation', - systemSovFwOccupationImageClass: 'pf-system-sov-fw-occupation-image', - systemSovFwStatusIconClass: 'pf-system-sov-fw-status-icon', - - // fonts - fontTriglivianClass: 'pf-triglivian', // class for "Triglivian" names (e.g. Abyssal systems) - - // Summernote - defaultBgColor: '#e2ce48' - }; - - // max character length for system description - let maxDescriptionLength = 9000; - - /** - * update trigger function for this module - * compare data and update module - * @param moduleElement - * @param systemData - */ - let updateModule = (moduleElement, systemData) => { - let systemId = moduleElement.data('id'); - let updated = moduleElement.data('updated'); - - if( - systemId === systemData.id && - updated !== systemData.updated.updated - ){ - let setUpdated = true; - - // created/updated tooltip -------------------------------------------------------------------------------- - let nameRowElement = moduleElement.find('.' + config.systemInfoNameClass); - - let tooltipData = { - created: systemData.created, - updated: systemData.updated - }; - - nameRowElement.addCharacterInfoTooltip( tooltipData ); - - // update system status ----------------------------------------------------------------------------------- - let systemStatusLabelElement = moduleElement.find('.' + config.systemInfoStatusLabelClass); - let systemStatusId = parseInt( systemStatusLabelElement.attr( config.systemInfoStatusAttributeName ) ); - - if(systemStatusId !== systemData.status.id){ - // status changed - let currentStatusClass = Util.getStatusInfoForSystem(systemStatusId, 'class'); - let newStatusClass = Util.getStatusInfoForSystem(systemData.status.id, 'class'); - let newStatusLabel = Util.getStatusInfoForSystem(systemData.status.id, 'label'); - systemStatusLabelElement.removeClass(currentStatusClass).addClass(newStatusClass).text(newStatusLabel); - - // set new status attribute - systemStatusLabelElement.attr( config.systemInfoStatusAttributeName, systemData.status.id); + let headAliasEl = this.newHeadlineElement(this._systemData.alias || this._systemData.name); + headAliasEl.setAttribute('title', 'alias'); + headAliasEl.classList.add('pull-right'); + if(this._systemData.security === 'A'){ + headAliasEl.classList.add(this._config.fontTriglivianClass); } - // update description textarea ---------------------------------------------------------------------------- - let descriptionTextareaElement = moduleElement.find('.' + config.descriptionTextareaElementClass); - if(descriptionTextareaElement.length){ - let description = descriptionTextareaElement.html(); - if(description !== systemData.description){ - // description has changed - if(typeof descriptionTextareaElement.data().summernote === 'object'){ - // "Summernote" editor is currently open - setUpdated = false; - }else{ - // not open - let newDescription = systemData.description; - if( !Util.isValidHtml(newDescription) ){ - // try to convert raw text into valid html - newDescription = newDescription.replace(/(\r\n|\n|\r)/g, '
    '); - newDescription = '

    ' + newDescription + '

    '; - } + let iconEl = this.newIconElement(['fa-fw', 'fa-angle-double-right']); - descriptionTextareaElement.html(newDescription); + let headSysTypeEl = this.newHeadlineElement(); + let sysTypeEl = document.createElement('span'); + sysTypeEl.setAttribute('title', 'type'); + sysTypeEl.classList.add(this._config.typeLinkClass); + sysTypeEl.textContent = MapUtil.getSystemTypeInfo(this._systemData.type.id, 'name'); + headSysTypeEl.append(sysTypeEl, iconEl); + + let headSysRegionEl = this.newHeadlineElement(); + let sysRegionEl = document.createElement('span'); + sysRegionEl.setAttribute('title', 'region'); + sysRegionEl.classList.add(this._config.regionLinkClass); + if(this._systemData.security === 'A'){ + sysRegionEl.classList.add(this._config.fontTriglivianClass); + } + sysRegionEl.textContent = this._systemData.region.name; + headSysRegionEl.append(sysRegionEl, iconEl.cloneNode()); + + let headSysConstellationEl = this.newHeadlineElement(); + let sysConstellationEl = document.createElement('span'); + sysConstellationEl.classList.add(this._config.constellationLinkClass, this._config.linkClass, Util.config.popoverTriggerClass); + if(this._systemData.security === 'A'){ + sysConstellationEl.classList.add(this._config.fontTriglivianClass); + } + sysConstellationEl.textContent = this._systemData.constellation.name; + sysConstellationEl.setAttribute('popup-ajax', Init.path.getConstellationData + '/' + this._systemData.constellation.id); + headSysConstellationEl.append(sysConstellationEl, iconEl.cloneNode()); + + let headSysNameEl = this.newHeadlineElement(); + let sysNameEl = document.createElement('span'); + sysNameEl.setAttribute('title', 'system'); + if(this._systemData.security === 'A'){ + sysNameEl.classList.add(this._config.fontTriglivianClass); + } + sysNameEl.textContent = this._systemData.name; + let iconCopyEl = this.newIconElement(['fa-fw', 'fa-copy', this._config.moduleHeadlineIconClass, this._config.textActionIconCopyClass]); + iconCopyEl.setAttribute('title', 'copy url'); + iconCopyEl.dataset.copy = MapUtil.getMapDeeplinkUrl(this._systemData.mapId, this._systemData.id); + headSysNameEl.append(sysNameEl, iconCopyEl); + if(this._systemData.locked){ + let iconLockedEl = this.newIconElement(['fa-fw', 'fa-lock', this._config.moduleHeadlineIconClass]); + iconLockedEl.setAttribute('title', 'locked'); + headSysNameEl.append(iconLockedEl); + } + for(let linkData of this.getThirdPartySystemLinks(['dotlan', 'eveeye', 'anoik'])){ + if(linkData.showInModuleHead){ + let headSysLinkEl = document.createElement('a'); + headSysLinkEl.classList.add('pf-bg-icon-inline'); + headSysLinkEl.style.setProperty('--bg-image', `url("${Util.imgRoot()}icons/logo_${linkData.page}.png")`); + headSysLinkEl.setAttribute('title', linkData.title); + headSysLinkEl.setAttribute('href', linkData.url); + headSysLinkEl.setAttribute('target', '_blank'); + headSysLinkEl.setAttribute('rel', 'noopener'); + headSysNameEl.append(headSysLinkEl); + } + } + + headEl.append( + this.newHandlerElement(), + headAliasEl, + headSysTypeEl, + headSysRegionEl, + headSysConstellationEl, + headSysNameEl + ); + return headEl; + } + + /** + * update module + * @param systemData + * @returns {Promise} + */ + update(systemData){ + return super.update(systemData).then(systemData => new Promise(resolve => { + if( + this._systemData.id === systemData.id && + this._updated !== systemData.updated.updated + ){ + let setUpdated = true; + + // created/updated tooltip ------------------------------------------------------------------------ + let nameRowElement = $(this.moduleElement).find('.' + this._config.systemInfoNameClass); + let tooltipData = { + created: systemData.created, + updated: systemData.updated + }; + nameRowElement.addCharacterInfoTooltip(tooltipData); + + // update system status --------------------------------------------------------------------------- + let systemStatusLabelElement = $(this.moduleElement).find('.' + this._config.systemInfoStatusLabelClass); + let systemStatusId = parseInt(systemStatusLabelElement.attr('data-status')); + + if(systemStatusId !== systemData.status.id){ + // status changed + let currentStatusClass = Util.getStatusInfoForSystem(systemStatusId, 'class'); + let newStatusClass = Util.getStatusInfoForSystem(systemData.status.id, 'class'); + let newStatusLabel = Util.getStatusInfoForSystem(systemData.status.id, 'label'); + systemStatusLabelElement.removeClass(currentStatusClass).addClass(newStatusClass).text(newStatusLabel); + + // set new status attribute + systemStatusLabelElement.attr('data-status', systemData.status.id); + } + + // update description textarea -------------------------------------------------------------------- + let descriptionTextareaElement = $(this.moduleElement).find('.' + this._config.descriptionTextareaElementClass); + if(descriptionTextareaElement.length){ + let description = descriptionTextareaElement.html(); + if(description !== systemData.description){ + // description has changed + if(typeof descriptionTextareaElement.data().summernote === 'object'){ + // "Summernote" editor is currently open + setUpdated = false; + }else{ + // not open + let newDescription = systemData.description; + if(!Util.isValidHtml(newDescription)){ + // try to convert raw text into valid html + newDescription = newDescription.replace(/(\r\n|\n|\r)/g, '
    '); + newDescription = '

    ' + newDescription + '

    '; + } + + descriptionTextareaElement.html(newDescription); + } + } + } + + if(setUpdated){ + this._updated = systemData.updated.updated; } } - } - // update faction warfare rows ---------------------------------------------------------------------------- - let fwContestedRow = moduleElement.find('.' + config.systemSovFwContestedRowClass); - let fwOccupationRow = moduleElement.find('.' + config.systemSovFwOccupationRowClass); - if(systemData.factionWar){ - let contested = String(Util.getObjVal(systemData.factionWar, 'contested') || ''); - let percentage = parseInt(Util.getObjVal(systemData.factionWar, 'victoryPercentage')) || 0; - let occupierFaction = Util.getObjVal(systemData.factionWar, 'occupierFaction'); + $(this.moduleElement).hideLoadingAnimation(); - let statusColor = 'red'; - if(occupierFaction){ - // system is "occupied" by hostile "occupierFaction" (stable) - // -> hide percent - statusColor = '#d9534f'; - percentage += '%'; - }else if('uncontested' === contested){ - // system is "uncontested" and owned by default ownerFaction (stable) - // -> hide percent - statusColor = '#4f9e4f'; - percentage = 'stable'; - }else if('contested' === contested){ - // system is "contested", 0%-99% percentage - statusColor = '#e28a0d'; - percentage += '%'; - }else if( - 'vulnerable' === contested || - 'captured' === contested - ){ - // system is "vulnerable", 100% percentage - // -> "captured" state is might be the same?! - statusColor = '#d747d6'; - percentage = '100%'; - } - - fwContestedRow.find('.' + config.systemSovFwStatusIconClass)[0].style.setProperty('--color', statusColor); - fwContestedRow.find('.' + config.systemSovFwContestedClass).text(contested); - fwContestedRow.find('.' + config.systemSovFwPercentageClass).text(percentage); - fwContestedRow.show(); - - let occupierFactionImage = Util.eveImageUrl('factions', (occupierFaction ? occupierFaction.id : 0), 64); - let occupierFactionName = occupierFaction ? occupierFaction.name : ''; - - fwOccupationRow.find('.' + config.systemSovFwOccupationImageClass)[0].style.setProperty('--bg-image', 'url(\'' + occupierFactionImage + '\')'); - fwOccupationRow.find('.' + config.systemSovFwOccupationClass).text(occupierFactionName); - if(occupierFaction){ - fwOccupationRow.show(); - } - }else{ - fwContestedRow.hide(); - fwOccupationRow.hide(); - } - - if(setUpdated){ - moduleElement.data('updated', systemData.updated.updated); - } + resolve({ + action: 'update', + data: { + module: this + } + }); + })); } - moduleElement.find('.' + config.descriptionAreaClass).hideLoadingAnimation(); - moduleElement.find('.' + config.systemSovSectionClass + ' .' + Util.config.dynamicAreaClass).hideLoadingAnimation(); - }; + /** + * render module + * @param mapId + * @param systemData + * @returns {HTMLElement} + */ + render(mapId, systemData){ + this._systemData = systemData; - /** - * @param pages - * @param systemData - */ - let getThirdPartySystemLinks = (pages, systemData) => { - let links = []; - let isWormhole = MapUtil.getSystemTypeInfo(Util.getObjVal(systemData, 'type.id'), 'name') === 'w-space'; - let systemName = Util.getObjVal(systemData, 'name') || ''; - let regionName = Util.getObjVal(systemData, 'region.name') || ''; + let rowEl = document.createElement('div'); + rowEl.classList.add(this._config.bodyClassName, 'grid'); - let setDestination = e => { - e.preventDefault(); - e.stopPropagation(); - Util.setDestination('set_destination', 'system', {id: systemData.systemId, name: systemData.name}); - }; + let colInfoEl, colSovEl, colDescEl; - for(let i = 0; i < pages.length; i++){ - let link = null; - let showInModuleHead = true; - let domain = Util.getObjVal(Init, 'url.' + pages[i]); - if(domain){ - // linkOut url - let url = false; - switch(pages[i]){ - case 'dotlan': - let systemNameTemp = systemName.replace(/ /g, '_'); - let regionNameTemp = regionName.replace(/ /g, '_'); - if(isWormhole){ - url = domain + '/system/' + systemNameTemp; - }else{ - url = domain + '/map/' + regionNameTemp + '/' + systemNameTemp; - } - break; - case 'eveeye': - if(!isWormhole){ - url = domain + '/?m=' + encodeURIComponent(regionName) + '&s=' + encodeURIComponent(systemName); - url += '&t=eswkc&o=thera,con_svc,node_sov,sub_sec,sector_fac,tag_mk'; - } - break; - case 'anoik': - if(isWormhole){ - url = domain + '/systems/' + systemName; - } - break; - } + colInfoEl = document.createElement('div'); + colInfoEl.classList.add(this._config.systemInfoSectionClass); + rowEl.append(colInfoEl); - if(url){ - let urlObj = new URL(url); - link = { - title: urlObj.hostname, - url: url - }; - } - }else{ - // custom callback - let action = false; - let title = false; - switch(pages[i]){ - case 'eve': - action = setDestination; - title = 'set destination'; - showInModuleHead = false; - break; - } + colSovEl = document.createElement('div'); + colSovEl.classList.add(this._config.systemSovSectionClass, 'pf-dynamic-area'); + rowEl.append(colSovEl); - if(action){ - link = { - title: title|| pages[i], - action: action - }; - } - } + colDescEl = document.createElement('div'); + colDescEl.classList.add(this._config.descriptionSectionClass); + rowEl.append(colDescEl); + this.moduleElement.append(rowEl); - if(link){ - links.push(Object.assign({}, link, { - page: pages[i], - showInModuleHead: showInModuleHead - })); - } + require(['text!templates/modules/system_info.html', 'mustache', 'summernote.loader'], (template, Mustache, Summernote) => { + SystemInfoModule.Mustache = Mustache; + SystemInfoModule.Summernote = Summernote; + + template = new DOMParser().parseFromString(template, 'text/html'); + SystemInfoModule.tplInfoSection = template.getElementById('tplInfoSection').innerHTML; + SystemInfoModule.tplSovSection = template.getElementById('tplSovSection').innerHTML; + SystemInfoModule.tplDescSection = template.getElementById('tplDescSection').innerHTML; + + // optional parse() for cache parsed templates + SystemInfoModule.Mustache.parse(SystemInfoModule.tplInfoSection); + SystemInfoModule.Mustache.parse(SystemInfoModule.tplSovSection); + SystemInfoModule.Mustache.parse(SystemInfoModule.tplDescSection); + + this.renderInfoSection(colInfoEl, SystemInfoModule.tplInfoSection); + this.renderSovSection(colSovEl, SystemInfoModule.tplSovSection); + this.renderDescSection(colDescEl, SystemInfoModule.tplDescSection); + + this.setModuleObserver(); + }); + + return this.moduleElement; } - return links; - }; - - /** - * get module element - * @param parentElement - * @param mapId - * @param systemData - */ - let getModule = (parentElement, mapId, systemData) => { - let moduleElement = $('
    '); - - // store systemId -> module can be updated with the correct data - moduleElement.data('id', systemData.id); - - // system "sovereignty" data - // "primary" data is eigther "alliance" -> 0.0 space - // or "faction" -> Empire Regions (LS, HS) - let sovereigntyDefault = { - row1Label: 'Sov.', - row1Val: '???', - row1Img: undefined, - row1ImgTitle: undefined, - row2Label: undefined, - row2Val: undefined, - row3Label: undefined, - row3Val: undefined - }; - - let sovereigntyPrimary; - let sovereigntySecondary; - - if(systemData.sovereignty){ - let sovDataFact = Util.getObjVal(systemData.sovereignty, 'faction'); - let sovDataAlly = Util.getObjVal(systemData.sovereignty, 'alliance'); - let sovDataCorp = Util.getObjVal(systemData.sovereignty, 'corporation'); - - if(sovDataFact){ - sovereigntyPrimary = { - row1Val: 'Faction', - row1Img: Util.eveImageUrl('factions', sovDataFact.id, 64), - row1ImgTitle: sovDataFact.name, - row2Val: sovDataFact.name + /** + * render 'sovereignty' section + * @param parentEl + * @param template + */ + renderInfoSection(parentEl, template){ + if(SystemInfoModule.Mustache && parentEl && template){ + let data = { + config: this._config, + system: this._systemData, + systemStatusClass: Util.getStatusInfoForSystem(this._systemData.status.id, 'class'), + systemStatusLabel: Util.getStatusInfoForSystem(this._systemData.status.id, 'label'), + systemNameClass: this._systemData.security === 'A' ? this._config.fontTriglivianClass : '', + systemSecurityClass: Util.getSecurityClassForSystem(this._systemData.security), + trueSec: this._systemData.trueSec.toFixed(1), + trueSecClass: Util.getTrueSecClassForSystem(this._systemData.trueSec), + systemEffectName: MapUtil.getEffectInfoForSystem(this._systemData.effect, 'name'), + systemEffectClass: MapUtil.getEffectInfoForSystem(this._systemData.effect, 'class'), + systemPlanetCount: this._systemData.planets ? this._systemData.planets.length : 0, + systemStaticData: (Util.getObjVal(this._systemData, 'statics') || []).reduce((acc, wormholeName) => { + acc.push(Object.assign({}, Init.wormholes[wormholeName])); + return acc; + }, []), + systemShatteredClass: Util.getSecurityClassForSystem('SH'), + popoverTriggerClass: Util.config.popoverTriggerClass }; - }else{ - if(sovDataAlly){ - sovereigntyPrimary = { - row1Val: 'Alliance', - row1Img: Util.eveImageUrl('alliances', sovDataAlly.id, 64), - row1ImgTitle: sovDataAlly.name, - row2Val: '<' + sovDataAlly.ticker + '>', - row3Label: 'Ally', - row3Val: sovDataAlly.name - }; - } - if(sovDataCorp){ - sovereigntySecondary = { - row1Label: 'Corp', - row1Val: sovDataCorp.name, - row1Img: Util.eveImageUrl('corporations', sovDataCorp.id, 64) - }; - } + parentEl.innerHTML = SystemInfoModule.Mustache.render(template, data); + + this.setInfoSectionObserver(parentEl); } } - // system "static" wh data - let staticsData = []; - if( - systemData.statics && - systemData.statics.length > 0 - ){ - for(let wormholeName of systemData.statics){ - let wormholeData = Object.assign({}, Init.wormholes[wormholeName]); - staticsData.push(wormholeData); - } - } - - let effectName = MapUtil.getEffectInfoForSystem(systemData.effect, 'name'); - let effectClass = MapUtil.getEffectInfoForSystem(systemData.effect, 'class'); - - let data = { - system: systemData, - sovereigntyPrimary: sovereigntyPrimary ? Object.assign({}, sovereigntyDefault, sovereigntyPrimary) : undefined, - sovereigntySecondary: sovereigntySecondary ? Object.assign({}, sovereigntyDefault, sovereigntySecondary) : undefined, - static: staticsData, - moduleHeadlineIconClass: config.moduleHeadlineIconClass, - textActionIconCopyClass: config.textActionIconCopyClass, - infoSectionClass: config.systemInfoSectionClass, - descriptionSectionClass: config.descriptionSectionClass, - sovSectionClass: config.systemSovSectionClass, - infoTableClass: config.systemInfoTableClass, - sovTableClass: config.systemSovTableClass, - nameInfoClass: config.systemInfoNameClass, - effectInfoClass: config.systemInfoEffectClass, - planetsInfoClass: config.systemInfoPlanetsClass, - wormholePrefixClass: config.systemInfoWormholeClass, - statusInfoClass: config.systemInfoStatusLabelClass, - popoverTriggerClass: Util.config.popoverTriggerClass, - - // sovereignty table - sovFwContestedRowClass: config.systemSovFwContestedRowClass, - sovFwOccupationRowClass: config.systemSovFwOccupationRowClass, - sovFwContestedInfoClass: config.systemSovFwContestedClass, - sovFwPercentageInfoClass: config.systemSovFwPercentageClass, - sovFwOccupationInfoClass: config.systemSovFwOccupationClass, - sovFwOccupationImageClass: config.systemSovFwOccupationImageClass, - sovFwStatusIconClass: config.systemSovFwStatusIconClass, - - systemUrl: MapUtil.getMapDeeplinkUrl(mapId, systemData.id), - systemTypeName: MapUtil.getSystemTypeInfo(systemData.type.id, 'name'), - systemStatusId: systemData.status.id, - systemStatusClass: Util.getStatusInfoForSystem(systemData.status.id, 'class'), - systemStatusLabel: Util.getStatusInfoForSystem(systemData.status.id, 'label'), - securityClass: Util.getSecurityClassForSystem(systemData.security), - trueSec: systemData.trueSec.toFixed(1), - trueSecClass: Util.getTrueSecClassForSystem( systemData.trueSec ), - effectName: effectName, - effectClass: effectClass, - descriptionAreaClass: config.descriptionAreaClass, - descriptionButtonClass: config.addDescriptionButtonClass, - descriptionTextareaClass: config.descriptionTextareaElementClass, - summernoteClass: Util.config.summernoteClass, - systemNameClass: () => { - return (val, render) => { - return render(val) === 'A' ? config.fontTriglivianClass : ''; + /** + * render 'sovereignty' section + * @param parentEl + * @param template + */ + renderSovSection(parentEl, template){ + if(SystemInfoModule.Mustache && parentEl && template){ + // system "sovereignty" data + // "primary" data is either "alliance" -> 0.0 space + // or "faction" -> Empire Regions (LS, HS) + let sovereigntyDefault = { + row1Label: 'Sov.', + row1Val: '???', + row1Img: undefined, + row1ImgTitle: undefined, + row2Label: undefined, + row2Val: undefined, + row3Label: undefined, + row3Val: undefined }; - }, - formatUrl: () => { - return (val, render) => render(val).replace(/ /g, '_'); - }, - planetCount: systemData.planets ? systemData.planets.length : 0, - shatteredClass: Util.getSecurityClassForSystem('SH'), + let sovereigntyPrimary; + let sovereigntySecondary; - ajaxConstellationInfoUrl: Init.path.getConstellationData, + if(this._systemData.sovereignty){ + let sovDataFact = Util.getObjVal(this._systemData.sovereignty, 'faction'); + let sovDataAlly = Util.getObjVal(this._systemData.sovereignty, 'alliance'); + let sovDataCorp = Util.getObjVal(this._systemData.sovereignty, 'corporation'); - systemConstellationLinkClass: config.constellationLinkClass, - systemRegionLinkClass: config.regionLinkClass, - systemTypeLinkClass: config.typeLinkClass, - systemUrlLinkClass: config.textActionIconCopyClass, - ccpImageServerUrl: Init.url.ccpImageServer, - thirdPartyLinks: getThirdPartySystemLinks(['dotlan', 'eveeye', 'anoik', 'eve'], systemData) - }; + if(sovDataFact){ + sovereigntyPrimary = { + row1Val: 'Faction', + row1Img: Util.eveImageUrl('factions', sovDataFact.id, 64), + row1ImgTitle: sovDataFact.name, + row2Val: sovDataFact.name + }; + }else{ + if(sovDataAlly){ + sovereigntyPrimary = { + row1Val: 'Alliance', + row1Img: Util.eveImageUrl('alliances', sovDataAlly.id, 64), + row1ImgTitle: sovDataAlly.name, + row2Val: '<' + sovDataAlly.ticker + '>', + row3Label: 'Ally', + row3Val: sovDataAlly.name + }; + } + if(sovDataCorp){ + sovereigntySecondary = { + row1Label: 'Corp', + row1Val: sovDataCorp.name, + row1Img: Util.eveImageUrl('corporations', sovDataCorp.id, 64) + }; + } + } + } - requirejs(['text!templates/modules/system_info.html', 'mustache', 'summernote.loader'], (template, Mustache, Summernote) => { - let content = Mustache.render(template, data); - moduleElement.append(content); + let data = { + config: this._config, + sovereigntyPrimary: sovereigntyPrimary ? Object.assign({}, sovereigntyDefault, sovereigntyPrimary) : undefined, + sovereigntySecondary: sovereigntySecondary ? Object.assign({}, sovereigntyDefault, sovereigntySecondary) : undefined, + }; - let sovSectionArea = moduleElement.find('.' + config.systemSovSectionClass + ' .' + Util.config.dynamicAreaClass); - let descriptionArea = moduleElement.find('.' + config.descriptionAreaClass); - let descriptionButton = moduleElement.find('.' + config.addDescriptionButtonClass); - let descriptionTextareaElement = moduleElement.find('.' + config.descriptionTextareaElementClass); + // show only if sov data exists + if(data.sovereigntyPrimary){ + parentEl.innerHTML = SystemInfoModule.Mustache.render(template, data); - // lock "description" field until first update + this.setSovSectionObserver(parentEl); + }else{ + parentEl.parentNode.classList.add(this._config.bodyClassName + '-small'); + parentEl.remove(); + } + } + } + + /** + * render 'description' section + * @param parentEl + * @param template + */ + renderDescSection(parentEl, template){ + if(SystemInfoModule.Mustache && parentEl && template){ + let data = { + config: this._config, + summernoteClass: Util.config.summernoteClass + }; + parentEl.innerHTML = SystemInfoModule.Mustache.render(template, data); + + this.setDescSectionObserver(parentEl); + } + } + + /** + * init module + */ + init(){ + super.init(); + } + + /** + * set module observer + */ + setModuleObserver(){ + // init copy system deeplink URL + $(this.moduleElement).find('.' + this._config.textActionIconCopyClass).on('click', function(){ + let mapUrl = $(this).attr('data-copy'); + Util.copyToClipboard(mapUrl).then(payload => { + if(payload.data){ + Util.showNotify({title: 'Copied to clipboard', text: mapUrl, type: 'success'}); + } + }); + }); + + // init constellation popover + $(this.moduleElement).find('[popup-ajax]').popover({ + html: true, + trigger: 'hover', + placement: 'top', + delay: 200, + container: 'body', + content: function(){ + //return details_in_popup(this); + let popoverElement = $(this); + let popover = popoverElement.data('bs.popover'); + + $.ajax({ + url: popoverElement.attr('popup-ajax'), + success: function(data){ + popover.options.content = Util.getSystemsInfoTable(data.systemsData); + // reopen popover (new content size) + popover.show(); + } + }); + return 'Loading...'; + } + }); + + // init tooltips + $(this.moduleElement).initTooltips({ + placement: 'top' + }); + } + + /** + * observer 'info' section + * @param parentEl + */ + setInfoSectionObserver(parentEl){ + // init system effect popover + $(parentEl).find('.' + this._config.systemInfoEffectClass).addSystemEffectTooltip( + this._systemData.security, + this._systemData.effect, { + placement: 'left' + }); + + // init planets popover + $(parentEl).find('.' + this._config.systemInfoPlanetsClass).addSystemPlanetsTooltip( + this._systemData.planets, { + placement: 'left' + }); + + // init static wormhole popover + MapUtil.initWormholeInfoTooltip($(parentEl), '[data-name]', { + placement: 'left' + }); + } + + /** + * observer 'sovereignty' section + * @param parentEl + */ + setSovSectionObserver(parentEl){ + // "lock" area until first update + $(parentEl).showLoadingAnimation(); + } + + /** + * observer 'description' section + * @param parentEl + */ + setDescSectionObserver(parentEl){ + let descriptionArea = $(parentEl).find('.' + this._config.descriptionAreaClass); + let descriptionButton = $(parentEl).find('.' + this._config.addDescriptionButtonClass); + let descriptionTextareaElement = $(parentEl).find('.' + this._config.descriptionTextareaElementClass); + let maxDescriptionLength = this._config.maxDescriptionLength; + let systemId = this._systemData.id; + let saveCallback = this.update.bind(this); + + // "lock" area until first update descriptionArea.showLoadingAnimation(); - sovSectionArea.showLoadingAnimation(); // WYSIWYG init on button click --------------------------------------------------------------------------- descriptionButton.on('click', function(e){ @@ -437,7 +459,7 @@ define([ // content has changed let descriptionChanged = false; - Summernote.initSummernote(descriptionTextareaElement, { + SystemInfoModule.Summernote.initSummernote(descriptionTextareaElement, { height: 75, // set editor height minHeight: 75, // set minimum height of editor maxHeight: 500, // set maximum height of editor @@ -473,12 +495,12 @@ define([ let validDescription = true; let description = ''; - if( context.$note.summernote('isEmpty') ){ + if(context.$note.summernote('isEmpty')){ // ... isEmpty -> clear empty default tags as well context.$note.summernote('code', ''); }else{ description = context.$note.summernote('code'); - if( !Util.isValidHtml(description) ){ + if(!Util.isValidHtml(description)){ // ... not valid HTML validDescription = false; context.layoutInfo.editable.addClass('has-error'); @@ -490,7 +512,7 @@ define([ // ... valid -> save() descriptionArea.showLoadingAnimation(); - Util.request('PATCH', 'system', systemData.id, { + Util.request('PATCH', 'System', systemId, { description: description }, { descriptionArea: descriptionArea @@ -500,7 +522,7 @@ define([ }).then( payload => { context.$note.summernote('destroy'); - updateModule(moduleElement, payload.data); + saveCallback(payload.data); }, Util.handleAjaxErrorResponse ); @@ -522,13 +544,14 @@ define([ // set default background color // -> could not figure out how to set by API as default color - context.toolbar.find('.note-current-color-button').attr('data-backcolor', config.defaultBgColor) - .find('.note-recent-color').css('background-color', config.defaultBgColor); + let defaultBgColor = '#e2ce48'; + context.toolbar.find('.note-current-color-button').attr('data-backcolor', defaultBgColor) + .find('.note-recent-color').css('background-color', defaultBgColor); }, onChange: function(contents){ descriptionChanged = true; }, - onPaste: function (e) { + onPaste: function(e){ let bufferText = ((e.originalEvent || e).clipboardData || window.clipboardData).getData('Text'); e.preventDefault(); @@ -543,94 +566,128 @@ define([ } }); }); + } - // init system effect popover ----------------------------------------------------------------------------- - moduleElement.find('.' + config.systemInfoEffectClass).addSystemEffectTooltip(systemData.security, systemData.effect); + /** + * get 3rd party system link configuration + * @param pages + * @returns {[]} + */ + getThirdPartySystemLinks(pages){ + let links = []; + let isWormhole = MapUtil.getSystemTypeInfo(Util.getObjVal(this._systemData, 'type.id'), 'name') === 'w-space'; + let systemName = Util.getObjVal(this._systemData, 'name') || ''; + let regionName = Util.getObjVal(this._systemData, 'region.name') || ''; - // init planets popover ----------------------------------------------------------------------------------- - moduleElement.find('.' + config.systemInfoPlanetsClass).addSystemPlanetsTooltip(systemData.planets); + for(let i = 0; i < pages.length; i++){ + let link = null; + let showInModuleHead = true; + let domain = Util.getObjVal(Init, 'url.' + pages[i]); + if(domain){ + // linkOut url + let url = false; + switch(pages[i]){ + case 'dotlan': + let systemNameTemp = systemName.replace(/ /g, '_'); + let regionNameTemp = regionName.replace(/ /g, '_'); + if(isWormhole){ + url = domain + '/system/' + systemNameTemp; + }else{ + url = domain + '/map/' + regionNameTemp + '/' + systemNameTemp; + } + break; + case 'eveeye': + if(!isWormhole){ + url = domain + '/?m=' + encodeURIComponent(regionName) + '&s=' + encodeURIComponent(systemName); + url += '&t=eswkc&o=thera,con_svc,node_sov,sub_sec,sector_fac,tag_mk'; + } + break; + case 'anoik': + if(isWormhole){ + url = domain + '/systems/' + systemName; + } + break; + } - // init static wormhole information ----------------------------------------------------------------------- - for(let staticData of staticsData){ - let staticRowElement = moduleElement.find('.' + config.systemInfoWormholeClass + staticData.name); - staticRowElement.addWormholeInfoTooltip(staticData); + if(url){ + let urlObj = new URL(url); + link = { + title: urlObj.hostname, + url: url + }; + } + } + + if(link){ + links.push(Object.assign({}, link, { + page: pages[i], + showInModuleHead: showInModuleHead + })); + } } - // copy system deeplink URL ------------------------------------------------------------------------------- - moduleElement.find('.' + config.textActionIconCopyClass).on('click', function(){ - let mapUrl = $(this).attr('data-url'); - Util.copyToClipboard(mapUrl).then(payload => { - if(payload.data){ - Util.showNotify({title: 'Copied to clipboard', text: mapUrl, type: 'success'}); - } - }); - }); + return links; + } - // constellation popover ---------------------------------------------------------------------------------- - moduleElement.find('a.popup-ajax').popover({ - html: true, - trigger: 'hover', - placement: 'top', - delay: 200, - container: 'body', - content: function(){ - return details_in_popup(this); - } - }); + beforeDestroy(){ + super.beforeDestroy(); - let details_in_popup = popoverElement => { - popoverElement = $(popoverElement); - let popover = popoverElement.data('bs.popover'); - - $.ajax({ - url: popoverElement.data('url'), - success: function(data){ - popover.options.content = Util.getSystemsInfoTable(data.systemsData); - // reopen popover (new content size) - popover.show(); - } - }); - return 'Loading...'; - }; - - // 3rd party click callbacks ------------------------------------------------------------------------------ - moduleElement.on('click', '[data-link]', e => { - for(let link of data.thirdPartyLinks){ - if( - e.target.dataset.link === link.page && - typeof link.action === 'function' - ){ - link.action(e); - break; - } - } - }); - - // init tooltips ------------------------------------------------------------------------------------------ - let tooltipElements = moduleElement.find('[data-toggle="tooltip"]'); - tooltipElements.tooltip({ - container: 'body', - placement: 'top' - }); - }); - - return moduleElement; + let descriptionTextareaEl = this.moduleElement.querySelector(`.${this._config.descriptionTextareaElementClass}`); + if(descriptionTextareaEl && $(descriptionTextareaEl).summernote){ + $(descriptionTextareaEl).summernote('destroy'); + } + } }; - /** - * efore module destroy callback - * @param moduleElement - */ - let beforeDestroy = moduleElement => { - moduleElement.find('.' + config.descriptionTextareaElementClass).summernote('destroy'); + SystemInfoModule.isPlugin = false; // module is defined as 'plugin' + SystemInfoModule.scope = 'system'; // module scope controls how module gets updated and what type of data is injected + SystemInfoModule.sortArea = 'a'; // default sortable area + SystemInfoModule.position = 2; // default sort/order position within sortable area + SystemInfoModule.label = 'Information'; // static module label (e.g. description) + SystemInfoModule.fullDataUpdate = true; // static module requires additional data (e.g. system description,...) - moduleElement.destroyPopover(true); + SystemInfoModule.defaultConfig = { + className: 'pf-system-info-module', // class for module + sortTargetAreas: ['a', 'b', 'c'], // sortable areas where module can be dragged into + + // headline toolbar + textActionIconCopyClass: 'pf-module-icon-button-copy', // class for text action "copy" + + // breadcrumb + constellationLinkClass: 'pf-system-info-constellation', // class for "constellation" name + regionLinkClass: 'pf-system-info-region', // class for "region" name + typeLinkClass: 'pf-system-info-type', // class for "type" name + + // info area + systemInfoSectionClass: 'pf-system-info-section', // class for system info section + systemInfoTableClass: 'pf-module-table', // class for system info table + systemInfoNameClass: 'pf-system-info-name', // class for "name" information element + systemInfoEffectClass: 'pf-system-info-effect', // class for "effect" information element + systemInfoPlanetsClass: 'pf-system-info-planets', // class for "planets" information element + systemInfoStatusLabelClass: 'pf-system-info-status-label', // class for "status" information element + + // sovereignty area + systemSovSectionClass: 'pf-system-sov-section', // class for system sov. section + systemSovTableClass: 'pf-module-table', // class for system sov. table + systemSovFwContestedRowClass: 'pf-system-sov-fw-contested-row', // class for "contested" sov. table row + systemSovFwOccupationRowClass: 'pf-system-sov-fw-occupation-row', // class for "-occupation" sov. table row + systemSovFwContestedClass: 'pf-system-sov-fw-contested', + systemSovFwPercentageClass: 'pf-system-sov-fw-percentage', + systemSovFwOccupationClass: 'pf-system-sov-fw-occupation', + systemSovFwOccupationImageClass: 'pf-system-sov-fw-occupation-image', + systemSovFwStatusIconClass: 'pf-system-sov-fw-status-icon', + + // description area + descriptionSectionClass: 'pf-system-description-section', // class for system description section + descriptionAreaClass: 'pf-system-info-description-area', // class for description area + addDescriptionButtonClass: 'pf-system-info-description-button', // class for "add description" button + descriptionTextareaElementClass: 'pf-system-info-description', // class for description textarea element (Summernote) + maxDescriptionLength: 9000, // max character length for system description + + // fonts + fontTriglivianClass: 'pf-triglivian', // class for "Triglivian" names (e.g. Abyssal systems) + linkClass: 'pf-link' }; - return { - config: config, - getModule: getModule, - updateModule: updateModule, - beforeDestroy: beforeDestroy - }; + return SystemInfoModule; }); diff --git a/js/app/ui/module/system_intel.js b/js/app/ui/module/system_intel.js index 985eb653..09bbba63 100644 --- a/js/app/ui/module/system_intel.js +++ b/js/app/ui/module/system_intel.js @@ -6,859 +6,403 @@ define([ 'jquery', 'app/init', 'app/util', + 'module/base', 'bootbox', - 'app/counter', - 'app/map/util', -], ($, Init, Util, bootbox, Counter, MapUtil) => { + 'app/counter' +], ($, Init, Util, BaseModule, bootbox, Counter) => { 'use strict'; - let config = { - // module info - modulePosition: 1, - moduleName: 'systemIntel', - moduleHeadClass: 'pf-module-head', // class for module header - moduleHandlerClass: 'pf-module-handler-drag', // class for "drag" handler - - // system intel module - moduleTypeClass: 'pf-system-intel-module', // class for this module - - // headline toolbar - moduleHeadlineIconClass: 'pf-module-icon-button', // class for toolbar icons in the head - - // system intel module - intelTableId: 'pf-intel-table-', // id prefix for all tables in module - intelTableRowIdPrefix: 'pf-intel-row-', // id prefix for table rows - systemStationsTableClass: 'pf-system-station-table', // class for NPC owned stations table - systemStructuresTableClass: 'pf-system-structure-table', // class for player owned structures table - - // structure dialog - structureDialogId: 'pf-structure-dialog', // id for "structure" dialog - nameInputId: 'pf-structure-dialog-name-input', // id for "name" input - statusSelectId: 'pf-structure-dialog-status-select', // id for "status" select - typeSelectId: 'pf-structure-dialog-type-select', // id for "type" select - corporationSelectId: 'pf-structure-dialog-corporation-select', // id for "corporation" select - descriptionTextareaId: 'pf-structure-dialog-description-textarea', // id for "description" textarea - descriptionTextareaCharCounter: 'pf-form-field-char-count', // class for "character counter" element for form field - - // dataTable - tableCellImageClass: 'pf-table-image-smaller-cell', // class for table "image" cells - tableCellCounterClass: 'pf-table-counter-cell', // class for table "counter" cells - tableCellEllipsisClass: 'pf-table-cell-ellipses-auto', // class for table "ellipsis" cells - tableCellActionClass: 'pf-table-action-cell', // class for "action" cells - tableCellActionIconClass: 'pf-table-action-icon-cell', // class for table "action" icon (icon is part of cell content) - tableCellServicesClass: 'pf-table-services-cell', // class for table station "services" cells - tableCellPopoverClass: 'pf-table-popover-cell' // class for table cells with a "popover" - }; - - let maxDescriptionLength = 512; - - /** - * get status icon for structure - * @param statusData - * @returns {string} - */ - let getIconForStatusData = statusData => { - return ''; - }; - - /** - * get icon that marks a table cell as clickable - * @returns {string} - */ - let getIconForInformationWindow = () => { - return ''; - }; - - /** - * get a dataTableApi instance from global cache - * @param mapId - * @param systemId - * @param tableType - * @returns {*} - */ - let getDataTableInstance = (mapId, systemId, tableType) => Util.getDataTableInstance(config.intelTableId, mapId, systemId, tableType); - - /** - * get dataTable id - * @param mapId - * @param systemId - * @param tableType - * @returns {string} - */ - let getTableId = (tableType, mapId, systemId) => Util.getTableId(config.intelTableId, tableType, mapId, systemId); - - /** - * get dataTable row id - * @param tableType - * @param id - * @returns {string} - */ - let getRowId = (tableType, id) => Util.getTableRowId(config.intelTableRowIdPrefix, tableType, id); - - /** - * get
    ' + - '' + - '' + group.name + '
    ', { - id: getTableId('structure', mapId, systemData.id), - class: ['compact', 'stripe', 'order-column', 'row-border', 'pf-table-fixed', config.systemStructuresTableClass].join(' ') - }); - moduleElement.append(structureTable); + /** + * init 'Structure' table + */ + initStructureTable(){ + let module = this; + let corporationId = Util.getCurrentUserInfo('corporationId'); - let structureDataTableOptions = { - pfMeta: { - type: 'structures' - }, - order: [[10, 'desc' ], [0, 'asc' ]], - rowId: rowData => getRowId('structures', rowData.id), - select: { - style: 'os', - selector: 'td:not(.' + config.tableCellActionClass + ')' - }, - language: { - emptyTable: 'No structures recorded', - info: '_START_ to _END_ of _MAX_', - infoEmpty: '' - }, - columnDefs: [ - { - targets: 0, - name: 'status', - title: '', - width: 2, - className: ['text-center', 'all'].join(' '), - data: 'status', - render: { - display: data => getIconForStatusData(data), - sort: data => data.id - }, - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - $(cell).find('i').tooltip(); - } - },{ - targets: 1, - name: 'structureImage', - title: '', - width: 24, - orderable: false, - className: [config.tableCellImageClass, 'text-center', 'all'].join(' '), - data: 'structure.id', - defaultContent: '', - render: { - _: function(data, type, row, meta){ - let value = data; - if(type === 'display' && value){ - value = ''; - } - return value; - } - } - },{ - targets: 2, - name: 'structureType', - title: 'type', - width: 30, - className: [config.tableCellEllipsisClass, 'all'].join(' '), - data: 'structure.name', - defaultContent: '', - },{ - targets: 3, - name: 'name', - title: 'name', - width: 60, - className: [config.tableCellEllipsisClass, 'all'].join(' '), - data: 'name' - },{ - targets: 4, - name: 'ownerImage', - title: '', - width: 24, - orderable: false, - className: [config.tableCellImageClass, 'text-center', 'all'].join(' '), - data: 'owner.id', - defaultContent: '', - render: { - _: function(data, type, row, meta){ - let value = data; - if(type === 'display' && value){ - value = ''; - value += ''; - value += ''; - } - return value; - } - } - },{ - targets: 5, - name: 'ownerName', - title: 'owner', - width: 50, - className: [config.tableCellEllipsisClass, 'all'].join(' '), - data: 'owner.name', - defaultContent: '', - },{ - targets: 6, - name: 'note', - title: 'note', - className: [config.tableCellEllipsisClass, 'all', Util.config.popoverTriggerClass, config.tableCellPopoverClass].join(' '), - data: 'description' - },{ - targets: 7, - name: 'updated', - title: 'updated', - width: 60, - className: ['text-right', config.tableCellCounterClass, 'not-screen-l'].join(' '), - data: 'updated.updated' - },{ - targets: 8, - name: 'edit', - title: '', - orderable: false, - width: 10, - className: ['text-center', config.tableCellActionClass, config.moduleHeadlineIconClass, 'all'].join(' '), - data: null, - render: { - display: data => { - let icon = ''; - if(data.rowGroupData.id !== corporationId){ - icon = ''; - } - return icon; - } - }, - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - let tableApi = this.api(); + let structureTableEl = document.createElement('table'); + structureTableEl.id = module.getTableId('structure', module._systemData.mapId, module._systemData.id); + structureTableEl.classList.add('compact', 'stripe', 'order-column', 'row-border', 'pf-table-fixed', module._config.systemStructuresTableClass); + this._bodyEl.append(structureTableEl); - if($(cell).is(':empty')){ - $(cell).removeClass(config.tableCellActionClass + ' ' + config.moduleHeadlineIconClass); - }else{ - $(cell).on('click', function(e){ - let rowData = null; - let bulkData = null; - // check if multiple rows are selected + current row is one of them -> bulk edit - let rowsSelected = tableApi.rows({selected: true}); - if(rowsSelected.count() && tableApi.row(rowIndex, {selected: true}).count()){ - bulkData = [...new Set(rowsSelected.data().toArray().map(rowData => ({id: rowData.id})))]; - }else{ - // get current row data (important!) - // -> "rowData" param is not current state, values are "on createCell()" state - rowData = tableApi.row( $(cell).parents('tr')).data(); - } - - showStructureDialog(moduleElement, tableApi, systemData.systemId, rowData, bulkData); - }); - } - } - },{ - targets: 9, - name: 'delete', - title: '', - orderable: false, - width: 10, - className: ['text-center', config.tableCellActionClass, 'all'].join(' '), - data: null, - render: { - display: data => { - let icon = ''; - if(data.rowGroupData.id !== corporationId){ - icon = ''; - } - return icon; - } - }, - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - let tableApi = this.api(); - - if($(cell).find('.fa-ban').length){ - $(cell).removeClass(config.tableCellActionClass + ' ' + config.moduleHeadlineIconClass); + let structureDataTableOptions = { + pfMeta: { + type: 'structures' + }, + order: [[10, 'desc' ], [0, 'asc' ]], + rowId: rowData => module.getRowId('structures', rowData.id), + select: { + style: 'os', + selector: 'td:not(.' + module._config.tableCellActionClass + ')' + }, + language: { + emptyTable: 'No structures recorded', + info: '_START_ to _END_ of _MAX_', + infoEmpty: '' + }, + columnDefs: [ + { + targets: 0, + name: 'status', + title: '', + width: 2, + className: ['text-center', 'all'].join(' '), + data: 'status', + render: { + display: data => module.getIconForStatusData(data), + sort: data => data.id + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ $(cell).find('i').tooltip(); - }else{ - let confirmationSettings = { - title: 'delete structure', - template: Util.getConfirmationTemplate(null, { - size: 'small', - noTitle: true - }), - onConfirm : function(e, target){ - // get current row data (important!) - // -> "rowData" param is not current state, values are "on createCell()" state - rowData = tableApi.row( $(cell).parents('tr')).data(); - - // let deleteRowElement = $(cell).parents('tr'); - // tableApi.rows(deleteRowElement).remove().draw(); - - moduleElement.showLoadingAnimation(); - Util.request('DELETE', 'structure', rowData.id, {}, - { - moduleElement: moduleElement, - tableApi: tableApi - }, - context => context.moduleElement.hideLoadingAnimation() - ).then( - payload => callbackDeleteStructures(payload.context, payload.data), - Util.handleAjaxErrorResponse - ); + } + },{ + targets: 1, + name: 'structureImage', + title: '', + width: 24, + orderable: false, + className: [module._config.tableCellImageClass, 'text-center', 'all'].join(' '), + data: 'structure.id', + defaultContent: '', + render: { + _: function(data, type, row, meta){ + let value = data; + if(type === 'display' && value){ + value = ''; } - }; + return value; + } + } + },{ + targets: 2, + name: 'structureType', + title: 'type', + width: 30, + className: [module._config.tableCellEllipsisClass, 'all'].join(' '), + data: 'structure.name', + defaultContent: '', + },{ + targets: 3, + name: 'name', + title: 'name', + width: 60, + className: [module._config.tableCellEllipsisClass, 'all'].join(' '), + data: 'name' + },{ + targets: 4, + name: 'ownerImage', + title: '', + width: 24, + orderable: false, + className: [module._config.tableCellImageClass, 'text-center', 'all'].join(' '), + data: 'owner.id', + defaultContent: '', + render: { + _: function(data, type, row, meta){ + let value = data; + if(type === 'display' && value){ + value = ''; + value += ''; + value += ''; + } + return value; + } + } + },{ + targets: 5, + name: 'ownerName', + title: 'owner', + width: 50, + className: [module._config.tableCellEllipsisClass, 'all'].join(' '), + data: 'owner.name', + defaultContent: '', + },{ + targets: 6, + name: 'note', + title: 'note', + className: [module._config.tableCellEllipsisClass, 'all', Util.config.popoverTriggerClass, module._config.tableCellPopoverClass].join(' '), + data: 'description' + },{ + targets: 7, + name: 'updated', + title: 'updated', + width: 60, + className: ['text-right', module._config.tableCellCounterClass, 'not-screen-l'].join(' '), + data: 'updated.updated' + },{ + targets: 8, + name: 'edit', + title: '', + orderable: false, + width: 10, + className: ['text-center', module._config.tableCellActionClass, module._config.moduleHeadlineIconClass, 'all'].join(' '), + data: null, + render: { + display: data => { + let icon = ''; + if(data.rowGroupData.id !== corporationId){ + icon = ''; + } + return icon; + } + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let tableApi = this.api(); - // init confirmation dialog - $(cell).confirmation(confirmationSettings); - } - } - },{ - targets: 10, - name: 'rowGroupData', - className: 'never', // never show this column. see: https://datatables.net/extensions/responsive/classes - data: 'rowGroupData', - visible: false, - render: { - sort: function(data){ - return data.name; + if($(cell).is(':empty')){ + $(cell).removeClass(module._config.tableCellActionClass + ' ' + module._config.moduleHeadlineIconClass); + }else{ + $(cell).on('click', function(e){ + let rowData = null; + let bulkData = null; + // check if multiple rows are selected + current row is one of them -> bulk edit + let rowsSelected = tableApi.rows({selected: true}); + if(rowsSelected.count() && tableApi.row(rowIndex, {selected: true}).count()){ + bulkData = [...new Set(rowsSelected.data().toArray().map(rowData => ({id: rowData.id})))]; + }else{ + // get current row data (important!) + // -> "rowData" param is not current state, values are "on createCell()" state + rowData = tableApi.row( $(cell).parents('tr')).data(); + } + + module.showStructureDialog(tableApi, rowData, bulkData); + }); + } + } + },{ + targets: 9, + name: 'delete', + title: '', + orderable: false, + width: 10, + className: ['text-center', module._config.tableCellActionClass, 'all'].join(' '), + data: null, + render: { + display: data => { + let icon = ''; + if(data.rowGroupData.id !== corporationId){ + icon = ''; + } + return icon; + } + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let tableApi = this.api(); + + if($(cell).find('.fa-ban').length){ + $(cell).removeClass(module._config.tableCellActionClass + ' ' + module._config.moduleHeadlineIconClass); + $(cell).find('i').tooltip(); + }else{ + let confirmationSettings = { + title: '---', + template: Util.getConfirmationTemplate(null, { + size: 'small', + noTitle: true + }), + onConfirm : function(e, target){ + // get current row data (important!) + // -> "rowData" param is not current state, values are "on createCell()" state + rowData = tableApi.row( $(cell).parents('tr')).data(); + + // let deleteRowElement = $(cell).parents('tr'); + // tableApi.rows(deleteRowElement).remove().draw(); + + $(module.moduleElement).showLoadingAnimation(); + Util.request('DELETE', 'Structure', rowData.id, {}, + { + tableApi: tableApi + }, + () => $(module.moduleElement).hideLoadingAnimation() + ).then( + payload => module.callbackDeleteStructures(payload.context, payload.data), + Util.handleAjaxErrorResponse + ); + } + }; + + // init confirmation dialog + $(cell).confirmation(confirmationSettings); + } + } + },{ + targets: 10, + name: 'rowGroupData', + className: 'never', // never show this column. see: https://datatables.net/extensions/responsive/classes + data: 'rowGroupData', + visible: false, + render: { + sort: function(data){ + return data.name; + } } } + ], + initComplete: function(settings){ + // table data is load in updateModule() method + // -> no need to trigger additional ajax call here for data + // -> in case table update failed -> each if this initComplete() function finished before table updated + // e.g. return now promise in getModule() function + + Counter.initTableCounter(this, ['updated:name'], 'd'); } - ], - initComplete: function(settings){ - // table data is load in updateModule() method - // -> no need to trigger additional ajax call here for data - // -> in case table update failed -> each if this initComplete() function finished before table updated - // e.g. return now promise in getModule() function + }; - Counter.initTableCounter(this, ['updated:name'], 'd'); - } - }; + this._tableApiStructure = $(structureTableEl).DataTable($.extend(true, {}, module.getDataTableDefaults(module), structureDataTableOptions)); - let tableApiStructure = structureTable.DataTable($.extend(true, {}, getDataTableDefaults(), structureDataTableOptions)); + // "Responsive" Datatables Plugin + new $.fn.dataTable.Responsive(this._tableApiStructure); - // "Responsive" Datatables Plugin - new $.fn.dataTable.Responsive(tableApiStructure); + this._tableApiStructure.on('responsive-resize', function(e, tableApi, columns){ + // rowGroup length changes as well -> trigger draw() updates rowGroup length (see drawCallback()) + tableApi.draw(); + }); - tableApiStructure.on('responsive-resize', function(e, tableApi, columns){ - // rowGroup length changes as well -> trigger draw() updates rowGroup length (see drawCallback()) - tableApi.draw(); - }); + // "Select" Datatables Plugin + this._tableApiStructure.select(); - // "Select" Datatables Plugin - tableApiStructure.select(); + this._tableApiStructure.on('user-select', function(e, tableApi, type, cell, originalEvent){ + let rowData = tableApi.row(cell.index().row).data(); + if(Util.getObjVal(rowData, 'rowGroupData.id') !== corporationId){ + e.preventDefault(); + } + }); - // "Buttons" Datatables Plugin - tableApiStructure.on('user-select', function(e, tableApi, type, cell, originalEvent){ - let rowData = tableApi.row(cell.index().row).data(); - if(Util.getObjVal(rowData, 'rowGroupData.id') !== corporationId){ - e.preventDefault(); - } - }); - - let buttons = new $.fn.dataTable.Buttons(tableApiStructure, { + // "Buttons" Datatables Plugin + let buttons = new $.fn.dataTable.Buttons(this._tableApiStructure, { dom: { container: { tag: 'h5', @@ -866,7 +410,7 @@ define([ }, button: { tag: 'i', - className: ['fas', 'fa-fw', config.moduleHeadlineIconClass].join(' '), + className: ['fas', 'fa-fw', module._config.moduleHeadlineIconClass].join(' '), }, buttonLiner: { tag: null @@ -874,6 +418,18 @@ define([ }, name: 'tableTools', buttons: [ + { + name: 'add', + className: 'fa-plus', + titleAttr: 'add', + attr: { + 'data-toggle': 'tooltip', + 'data-html': true + }, + action: function(e, tableApi, node, config){ + module.showStructureDialog(tableApi); + } + }, { name: 'selectToggle', className: ['fa-check-double'].join(' '), @@ -898,18 +454,6 @@ define([ } } }, - { - name: 'add', - className: 'fa-plus', - titleAttr: 'add', - attr: { - 'data-toggle': 'tooltip', - 'data-html': true - }, - action: function(e, tableApi, node, config){ - showStructureDialog(moduleElement, tableApi, systemData.systemId); - } - }, { name: 'dScan', className: 'fa-paste', @@ -918,64 +462,55 @@ define([ 'data-toggle': 'tooltip', 'data-html': true }, - action: function(e, tableApi, node, config ){ - showDscanReaderDialog(moduleElement, tableApi, systemData); + action: function(e, tableApi, node, config){ + module.showDscanReaderDialog(tableApi); } }, { name: 'refresh', className: 'fa-sync', - titleAttr: 'refresh all', + titleAttr: 'refresh', attr: { 'data-toggle': 'tooltip', 'data-html': true }, - action: function(e, tableApi, node, config ){ - moduleElement.showLoadingAnimation(); + action: function(e, tableApi, node, config){ + $(module.moduleElement).showLoadingAnimation(); - Util.request('GET', 'system', systemData.id, {mapId: mapId}, + Util.request('GET', 'System', module._systemData.id, {mapId: module._systemData.mapId}, { - moduleElement: moduleElement, tableApi: tableApi, removeMissing: true }, - context => context.moduleElement.hideLoadingAnimation() - ).then(payload => callbackUpdateTableRows(payload.context, Util.getObjVal(payload.data, 'structures'))); + context => $(module.moduleElement).hideLoadingAnimation() + ).then(payload => module.callbackUpdateTableRows(payload.context, Util.getObjVal(payload.data, 'structures'))); } } ] - }); - - tableApiStructure.buttons().container().appendTo(moduleElement.find('.' + config.moduleHeadClass)); - - if(showStationTable){ - // "Stations" table --------------------------------------------------------------------------------------- - - moduleElement.append( - $('
    ', { - class: config.moduleHeadClass - }).append( - $('
    ', { - class: config.moduleHandlerClass - }), - $('
    ', { - text: 'Stations' - }) - ) - ); - - let stationTable = $('
    ', { - id: getTableId('station', mapId, systemData.id), - class: ['compact', 'stripe', 'order-column', 'row-border', 'pf-table-fixed', config.systemStationsTableClass].join(' ') }); - moduleElement.append(stationTable); + + this._tableApiStructure.buttons().container().appendTo(module.moduleElement.querySelector('.' + module._config.headClassName)); + } + + /** + * init 'Station' table + */ + initStationTable(){ + let module = this; + + this._bodyEl.append(module.newHeaderElement(module._config.headlineSub)); + + let stationTableEl = document.createElement('table'); + stationTableEl.id = module.getTableId('station', module._systemData.mapId, module._systemData.id); + stationTableEl.classList.add('compact', 'stripe', 'order-column', 'row-border', 'pf-table-fixed', module._config.systemStationsTableClass); + this._bodyEl.append(stationTableEl); let stationDataTableOptions = { pfMeta: { type: 'stations' }, order: [[1, 'asc' ], [8, 'asc' ]], - rowId: rowData => getRowId('stations', rowData.id), + rowId: rowData => module.getRowId('stations', rowData.id), language: { emptyTable: 'No stations found', info: '_START_ to _END_ of _MAX_', @@ -988,7 +523,7 @@ define([ title: '', width: 24, orderable: false, - className: [config.tableCellImageClass, 'text-center', 'all'].join(' '), + className: [module._config.tableCellImageClass, 'text-center', 'all'].join(' '), data: 'type.id', defaultContent: '', render: { @@ -1020,7 +555,7 @@ define([ if(type === 'display'){ value = count || 0; }else{ - value = romanToInt(count) || ''; + value = module.romanToInt(count) || ''; } } @@ -1031,7 +566,7 @@ define([ targets: 2, name: 'name', title: 'station', - className: [config.tableCellEllipsisClass, 'all'].join(' '), + className: [module._config.tableCellEllipsisClass, 'all'].join(' '), data: 'name', render: { _: function(cellData, type, rowData, meta){ @@ -1043,7 +578,7 @@ define([ let systemName = Util.getObjVal(matches, '1'); let count = Util.getObjVal(matches, '2'); let moon = Util.getObjVal(matches, '4'); - if(systemName === (Util.getObjVal(systemData, 'name') || '')){ + if(systemName === (Util.getObjVal(module._systemData, 'name') || '')){ value = value.slice(systemName.length).trim(); if(count){ value = value.slice(count.length).trimLeftChars(' \-'); @@ -1062,7 +597,7 @@ define([ name: 'stationType', title: 'type', width: 100, - className: [config.tableCellEllipsisClass, 'not-screen-l'].join(' '), + className: [module._config.tableCellEllipsisClass, 'not-screen-l'].join(' '), data: 'type.name', defaultContent: '', render: { @@ -1083,7 +618,7 @@ define([ title: '', width: 24, orderable: false, - className: [config.tableCellImageClass, 'text-center', 'all'].join(' '), + className: [module._config.tableCellImageClass, 'text-center', 'all'].join(' '), data: 'corporation.id', defaultContent: '', render: { @@ -1102,14 +637,14 @@ define([ name: 'ownerName', title: 'owner', width: 80, - className: [config.tableCellActionClass, config.tableCellEllipsisClass, 'all'].join(' '), + className: [module._config.tableCellActionClass, module._config.tableCellEllipsisClass, 'all'].join(' '), data: 'corporation', defaultContent: '', render: { _: function(data, type, row, meta){ let value = data.name; if(type === 'display'){ - value += ' ' + getIconForInformationWindow(); + value += ' ' + module.getIconForInformationWindow(); } return value; } @@ -1127,7 +662,7 @@ define([ orderable: false, searchable: false, width: 10, - class: [config.tableCellActionClass, config.moduleHeadlineIconClass, 'text-center', 'all'].join(' '), + class: [module._config.tableCellActionClass, module._config.moduleHeadlineIconClass, 'text-center', 'all'].join(' '), data: 'id', render: { display: (cellData, type, rowData, meta) => { @@ -1147,7 +682,12 @@ define([ orderable: false, searchable: false, width: 10, - class: [config.tableCellActionClass, config.moduleHeadlineIconClass, config.tableCellServicesClass, Util.config.popoverTriggerClass, 'text-center', 'all'].join(' '), + class: [ + module._config.tableCellActionClass, + module._config.moduleHeadlineIconClass, + module._config.tableCellServicesClass, + Util.config.popoverTriggerClass, 'text-center', 'all' + ].join(' '), data: 'services', defaultContent: '', render: { @@ -1160,7 +700,7 @@ define([ createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ let cellElement = $(cell); if(cellElement.find('.fa-ban').length){ - cellElement.removeClass(config.tableCellActionClass + ' ' + config.moduleHeadlineIconClass); + cellElement.removeClass(module._config.tableCellActionClass + ' ' + module._config.moduleHeadlineIconClass); } } },{ @@ -1179,233 +719,650 @@ define([ initComplete: function(settings, json){ let tableApi = this.api(); - initStationServiceTooltip(this, tableApi); + module.initStationServiceTooltip(this, tableApi); } }; - let tableApiStation = stationTable.DataTable($.extend(true, {}, getDataTableDefaults(), stationDataTableOptions)); + this._tableApiStation = $(stationTableEl).DataTable($.extend(true, {}, module.getDataTableDefaults(module), stationDataTableOptions)); - new $.fn.dataTable.Responsive(tableApiStation); + new $.fn.dataTable.Responsive(this._tableApiStation); - tableApiStation.on('responsive-resize', function(e, tableApi, columns){ + this._tableApiStation.on('responsive-resize', function(e, tableApi, columns){ // rowGroup length changes as well -> trigger draw() updates rowGroup length (see drawCallback()) tableApi.draw(); }); } - // init tooltips for this module - let tooltipElements = moduleElement.find('[data-toggle="tooltip"]'); - tooltipElements.tooltip({ - container: 'body' - }); + /** + * + * @param module + * @returns {*} + */ + getDataTableDefaults(module){ + return { + paging: false, + lengthChange: false, + ordering: true, + info: false, + searching: false, + hover: false, + autoWidth: false, + drawCallback: function(settings){ + let tableApi = this.api(); + let columnCount = tableApi.columns(':visible').count(); + let rows = tableApi.rows({page: 'current'}).nodes(); + let last = null; - moduleElement.showLoadingAnimation(); + tableApi.column('rowGroupData:name', {page: 'current'}).data().each(function(group, i){ + if (!last || last.id !== group.id) { + // "stations" are grouped by "raceId" with its "factionId" + // "structures" are grouped by "corporationId" that ADDED it (not the ingame "owner" of it) + let imgType = 'stations' === group.groupedDataKey ? 'factions' : 'corporations'; - return moduleElement; - }; + $(rows).eq(i).before( + '' + + '' + + '' + + '' + + '' + ); + last = group; + } + }); - /** - * get universe typeIds for given categoryIds - * @param categoryIds - * @returns {Array} - */ - let getUniverseTypeIdsByCategoryIds = (categoryIds) => { - let typeIds = []; - let mapIds = type => type.id; - for(let categoryId of categoryIds){ - let categoryData = Util.getObjVal(Init, 'universeCategories.' + categoryId); - if(categoryData && categoryData.groups){ - for(let groupData of categoryData.groups){ - if(groupData && groupData.types){ - typeIds = typeIds.concat(groupData.types.map(mapIds)); + let animationRows = rows.to$().filter(function(){ + return ( + $(this).data('animationStatus') || + $(this).data('animationTimer') + ); + }); + + for(let i = 0; i < animationRows.length; i++){ + let animationRow = $(animationRows[i]); + animationRow.pulseBackgroundColor(animationRow.data('animationStatus')); + animationRow.removeData('animationStatus'); } } - } + }; } - return typeIds; - }; + /** + * show structure dialog + * @param tableApi + * @param structureData + * @param bulkData + */ + showStructureDialog(tableApi, structureData = null, bulkData = null){ + let structureStatusData = Util.getObjVal(Init, 'structureStatus'); - /** - * parse a copy&paste string from ingame dScan windows - * @param systemData - * @param clipboard - * @returns {Array} - */ - let parseDscanString = (systemData, clipboard) => { - let dScanData = []; - let structureTypeIds = getUniverseTypeIdsByCategoryIds([65]); + let statusData = Object.keys(structureStatusData).map((k) => { + let data = structureStatusData[k]; + data.selected = data.id === Util.getObjVal(structureData, 'status.id'); + return data; + }); - if(clipboard.length){ - let dScanRows = clipboard.split(/\r\n|\r|\n/g); + // if current user is currently docked at a structure (not station) + // -> add a modal button for pre-fill modal with it + // -> systemId must match systemId from current character log + let currentUserData = Util.getCurrentUserData(); + let characterStructureId = Util.getCurrentCharacterData('log.structure.id') || 0; + let characterStructureName = Util.getCurrentCharacterData('log.structure.name') || ''; + let characterStructureTypeId = Util.getCurrentCharacterData('log.structure.type.id') || 0; + let characterStructureTypeName = Util.getCurrentCharacterData('log.structure.type.name') || ''; + let isCurrentLocation = false; - for(let rowData of dScanRows){ - rowData = rowData.split(/\t/g); + if(this._systemData.id === Util.getCurrentCharacterData('log.system.id')){ + isCurrentLocation = true; + } - if(rowData.length === 4){ - rowData[0] = parseInt(rowData[0]); - // valid dScan result - if(structureTypeIds.indexOf( rowData[0] ) !== -1){ - dScanData.push({ - structureId: rowData[0], - name: rowData[1], - systemId: systemData.systemId - }); - } + let disableButtonAutoFill = true; + let buttonLabelAutoFill = ' '; + if(characterStructureId){ + buttonLabelAutoFill += characterStructureTypeName + ' "' + characterStructureName + '"'; + if(isCurrentLocation){ + disableButtonAutoFill = false; } + }else{ + buttonLabelAutoFill += 'unknown structure'; } - } - return dScanData; - }; + let data = { + id: this._config.structureDialogId, + structureData: structureData, + bulkData: bulkData, + structureStatus: statusData, + nameInputId: this._config.nameInputId, + statusSelectId: this._config.statusSelectId, + typeSelectId: this._config.typeSelectId, + corporationSelectId: this._config.corporationSelectId, + descriptionTextareaId: this._config.descriptionTextareaId, + descriptionTextareaCharCounter: this._config.descriptionTextareaCharCounter, + maxDescriptionLength: SystemIntelModule.maxDescriptionLength + }; - /** - * parse clipboard data for structures and update table - * @param systemData - * @param clipboard - * @param context - */ - let updateStructureTableByClipboard = (systemData, clipboard, context) => { + requirejs(['text!templates/dialog/structure.html', 'mustache'], (template, Mustache) => { + let content = Mustache.render(template, data); + let title = 'Structure'; + if(bulkData){ + title += '  (' + bulkData.length + ' rows) '; + } - let saveStructureData = (structureData, context) => { - context.moduleElement.showLoadingAnimation(); + let structureDialog = bootbox.dialog({ + title: title, + message: content, + show: false, + buttons: { + close: { + label: 'cancel', + className: 'btn-default pull-left' + }, + autoFill: { + label: buttonLabelAutoFill, + className: 'btn-primary' + + (disableButtonAutoFill ? ' pf-font-italic disabled' : '') + + (bulkData ? ' hidden' : ''), + callback: e => { + let form = $(e.delegateTarget).find('form'); + form.find('#' + this._config.nameInputId).val(characterStructureName); + form.find('#' + this._config.statusSelectId).val(2).trigger('change'); + form.find('#' + this._config.typeSelectId).val(characterStructureTypeId).trigger('change'); + return false; + } + }, + success: { + label: ' save', + className: 'btn-success', + callback: e => { + let form = $(e.delegateTarget).find('form'); - Util.request('POST', 'structure', [], structureData, context, context => context.moduleElement.hideLoadingAnimation()) - .then( - payload => callbackUpdateTableRows(payload.context, payload.data), - Util.handleAjaxErrorResponse - ); - }; + // validate form + form.validator('validate'); - let structureData = parseDscanString(systemData, clipboard); - if(structureData.length){ - // valid structure data parsed + // check whether the form is valid + let formValid = form.isValidForm(); - // check if structures will be added to a system where character is currently in - // if character is not in any system -> id === undefined -> no "confirmation required - let currentLocationData = Util.getCurrentLocationData(); - if( - currentLocationData.id && - currentLocationData.id !== systemData.systemId - ){ - let systemNameStr = (systemData.name === systemData.alias) ? '"' + systemData.name + '"' : '"' + systemData.alias + '" (' + systemData.name + ')'; - systemNameStr = '' + systemNameStr + ''; + if(formValid){ + // get form data + let formData = form.getFormValues(); + formData.id = Util.getObjVal(structureData, 'id') | 0; + formData.structureId = Util.getObjVal(formData, 'structureId') | 0; + formData.corporationId = Util.getObjVal(formData, 'corporationId') | 0; + formData.systemId = this._systemData.systemId | 0; - let msg = 'Update structures in ' + systemNameStr + ' ? This is not your current location, "' + currentLocationData.name + '" !'; - bootbox.confirm(msg, result => { - if(result){ - saveStructureData(structureData, context); + $(this.moduleElement).showLoadingAnimation(); + + let method = formData.id ? 'PATCH' : 'PUT'; + let ids = formData.id; + let data = formData; + + if(bulkData){ + // bulk update multiple rows + method = 'POST'; + ids = []; + data = bulkData.map(structureData => { + structureData.corporationId = formData.corporationId; + return structureData; + }); + } + + this.request(method, 'Structure', ids, data, + { + tableApi: tableApi + }, + () => $(this.moduleElement).hideLoadingAnimation() + ).then( + payload => this.callbackUpdateTableRows(payload.context, payload.data), + Util.handleAjaxErrorResponse + ); + }else{ + return false; + } + } + } } }); - }else{ - saveStructureData(structureData, context); + + structureDialog.on('show.bs.modal', e => { + let modalContent = $('#' + this._config.structureDialogId); + + // init type select live search + let selectElementType = modalContent.find('#' + this._config.typeSelectId); + selectElementType.initUniverseTypeSelect({ + categoryIds: [65], + maxSelectionLength: 1, + selected: [Util.getObjVal(structureData, 'structure.id')] + }); + + // init corporation select live search + let selectElementCorporation = modalContent.find('#' + this._config.corporationSelectId); + selectElementCorporation.initUniverseSearch({ + categoryNames: ['corporation'], + maxSelectionLength: 1 + }); + + // init status select2 + modalContent.find('#' + this._config.statusSelectId).initStatusSelect({ + data: statusData + }); + + // init char counter + let textarea = modalContent.find('#' + this._config.descriptionTextareaId); + let charCounter = modalContent.find('.' + this._config.descriptionTextareaCharCounter); + Util.updateCounter(textarea, charCounter, SystemIntelModule.maxDescriptionLength); + + textarea.on('keyup', function(){ + Util.updateCounter($(this), charCounter, SystemIntelModule.maxDescriptionLength); + }); + + // set form validator (after select2 init finish) + modalContent.find('form').initFormValidation(); + }); + + // show dialog + structureDialog.modal('show'); + }); + } + + /** + * show D-Scan reader dialog + * @param tableApi + */ + showDscanReaderDialog(tableApi){ + requirejs(['text!templates/dialog/dscan_reader.html', 'mustache'], (template, Mustache) => { + let structureDialog = bootbox.dialog({ + title: 'D-Scan reader', + message: Mustache.render(template, {}), + show: true, + buttons: { + close: { + label: 'cancel', + className: 'btn-default' + }, + success: { + label: ' update intel', + className: 'btn-success', + callback: e => { + let form = $(e.delegateTarget).find('form'); + let formData = form.getFormValues(); + + this.updateStructureTableByClipboard(formData.clipboard, { + tableApi: tableApi + }); + } + } + } + }); + + // dialog shown event + structureDialog.on('shown.bs.modal', function(e){ + // set focus on textarea + structureDialog.find('textarea').focus(); + }); + }); + } + + /** + * callback -> add table rows from grouped tableData + * @param context + * @param tableData + * @param groupedDataKey + */ + callbackUpdateTableRows(context, tableData, groupedDataKey = 'structures'){ + let touchedRows = []; + let hadData = context.tableApi.rows().any(); + let notificationCounter = { + added: 0, + changed: 0, + deleted: 0 + }; + + if(tableData){ + for(let [rowGroupId, rowGroupData] of Object.entries(tableData)){ + if(rowGroupData[groupedDataKey] && rowGroupData[groupedDataKey].length){ + for(let rowData of rowGroupData[groupedDataKey]){ + let rowId = this.getRowById(context.tableApi, rowData.id); + + // add rowGroupData as well to each rowData + rowData.rowGroupData = { + id: rowGroupData.id, + name: rowGroupData.name, + groupedDataKey: groupedDataKey + }; + + if(rowId){ + // update row + let api = context.tableApi.row('#' + rowId); + let rowDataCurrent = api.data(); + + // check for update + if(Util.getObjVal(rowDataCurrent, 'updated.updated') !== Util.getObjVal(rowData, 'updated.updated')){ + // row data changed -> update + api.data(rowData); + notificationCounter.changed++; + } + + touchedRows.push(api.id()); + }else{ + // insert new row + let api = context.tableApi.row.add(rowData); + api.nodes().to$().data('animationStatus', 'added'); + notificationCounter.added++; + + touchedRows.push(api.id()); + } + } + } + } } + + if(context.removeMissing){ + let api = context.tableApi.rows((idx, data, node) => !touchedRows.includes(node.id)); + notificationCounter.deleted += api.ids().count(); + api.remove(); + } + + if(Math.max(...Object.values(notificationCounter))){ + context.tableApi.draw(); + } + + // show notification -------------------------------------------------------------------------------------- + let notification = Object.keys(notificationCounter).reduce((acc, key) => { + return `${acc}${notificationCounter[key] ? `${notificationCounter[key]} ${key}
    ` : ''}`; + }, ''); + + if(hadData && notification.length){ + this.showNotify({title: 'Structures updated', text: notification, type: 'success', textTrusted: true}); + } + } + + + /** + * parse clipboard data for structures and update table + * @param clipboard + * @param context + */ + updateStructureTableByClipboard(clipboard, context){ + + let saveStructureData = (structureData, context) => { + $(this.moduleElement).showLoadingAnimation(); + + this.request('POST', 'Structure', [], structureData, context, () => $(this.moduleElement).hideLoadingAnimation()) + .then( + payload => this.callbackUpdateTableRows(payload.context, payload.data), + Util.handleAjaxErrorResponse + ); + }; + + let structureData = this.parseDscanString(this._systemData, clipboard); + if(structureData.length){ + // valid structure data parsed + + // check if structures will be added to a system where character is currently in + // if character is not in any system -> id === undefined -> no "confirmation required + let currentLocationData = Util.getCurrentLocationData(); + if( + currentLocationData.id && + currentLocationData.id !== this._systemData.systemId + ){ + let systemNameStr = (this._systemData.name === this._systemData.alias) ? + '"' + this._systemData.name + '"' : + '"' + this._systemData.alias + '" (' + this._systemData.name + ')'; + systemNameStr = '' + systemNameStr + ''; + + let msg = 'Update structures in ' + systemNameStr + ' ? This is not your current location, "' + currentLocationData.name + '" !'; + bootbox.confirm(msg, result => { + if(result){ + saveStructureData(structureData, context); + } + }); + }else{ + saveStructureData(structureData, context); + } + } + } + + /** + * get universe typeIds for given categoryIds + * @param categoryIds + * @returns {Array} + */ + getUniverseTypeIdsByCategoryIds(categoryIds){ + let typeIds = []; + let mapIds = type => type.id; + for(let categoryId of categoryIds){ + let categoryData = Util.getObjVal(Init, 'universeCategories.' + categoryId); + if(categoryData && categoryData.groups){ + for(let groupData of categoryData.groups){ + if(groupData && groupData.types){ + typeIds = typeIds.concat(groupData.types.map(mapIds)); + } + } + } + } + + return typeIds; + } + + /** + * parse a copy&paste string from ingame dScan windows + * @param systemData + * @param clipboard + * @returns {Array} + */ + parseDscanString(systemData, clipboard){ + let dScanData = []; + let structureTypeIds = this.getUniverseTypeIdsByCategoryIds([65]); + + if(clipboard.length){ + let dScanRows = clipboard.split(/\r\n|\r|\n/g); + + for(let rowData of dScanRows){ + rowData = rowData.split(/\t/g); + + if(rowData.length === 4){ + rowData[0] = parseInt(rowData[0]); + // valid dScan result + if(structureTypeIds.indexOf( rowData[0] ) !== -1){ + dScanData.push({ + structureId: rowData[0], + name: rowData[1], + systemId: systemData.systemId + }); + } + } + } + } + + return dScanData; + } + + /** + * callback -> delete structure rows + * @param context + * @param structureIds + */ + callbackDeleteStructures(context, structureIds){ + let deletedCounter = 0; + if(structureIds && structureIds.length){ + for(let structureId of structureIds){ + let rowId = this.getRowById(context.tableApi, structureId); + if(rowId){ + context.tableApi.row('#' + rowId).remove(); + deletedCounter++; + } + } + } + + if(deletedCounter){ + context.tableApi.draw(); + Util.showNotify({title: 'Structure deleted', text: deletedCounter + ' deleted', type: 'success'}); + } + } + + /** + * init station services tooltips + * @param element + * @param tableApi + */ + initStationServiceTooltip(element, tableApi){ + element.hoverIntent({ + over: function(e){ + let cellElement = $(this); + let rowData = tableApi.row(cellElement.parents('tr')).data(); + cellElement.addStationServiceTooltip(Util.getObjVal(rowData, 'services'), { + placement: 'left', + trigger: 'manual', + show: true + }); + }, + out: function(e){ + $(this).destroyPopover(); + }, + selector: 'td.' + this._config.tableCellServicesClass + }); + } + + /** + * set module observer + */ + setModuleObserver(){ + let module = this; + let structureTableElement = $(module.moduleElement).find('.' + module._config.systemStructuresTableClass); + let tableApi = structureTableElement.DataTable(); + + // init listener for global "past" dScan into this page + $(module.moduleElement).on('pf:updateIntelModuleByClipboard', (e, clipboard) => { + module.updateStructureTableByClipboard(clipboard, { + tableApi: tableApi + }); + }); + + // init popovers for some table cells + $(module.moduleElement).hoverIntent({ + over: function(e){ + let tableApi = module.getDataTableInstance(module._systemData.mapId, module._systemData.id, 'structure'); + + // simple
    ' + + '' + + '' + group.name + '
    for layout (CSS) + let cellData = tableApi.cell(this).data(); + if(cellData && cellData.length){ + let content = '
    ' + cellData.replace(/\r?\n/g, '
    ') + '
    '; + + let options = { + placement: 'top', + html: true, + trigger: 'manual', + container: 'body', + title: '', + content: content, + delay: { + show: 0, + hide: 0 + }, + }; + + $(this).popover(options).popover('show'); + } + }, + out: function(e){ + $(this).destroyPopover(); + }, + selector: '.' + module._config.tableCellPopoverClass + }); + + // init tooltips + $(this.moduleElement).initTooltips(); + } + + /** + * update module + * compare data and update module + * @param systemData + * @returns {Promise} + */ + update(systemData){ + return super.update(systemData).then(systemData => new Promise(resolve => { + // update structure table data ------------------------------------------------------------------------ + if(this._tableApiStructure){ + let structureContext = { + tableApi: this._tableApiStructure, + removeMissing: true + }; + + this.callbackUpdateTableRows(structureContext, Util.getObjVal(systemData, 'structures')); + }else{ + console.warn('DataTable "structures" not initialized. Can not update "intel" module'); + } + + // update station table data -------------------------------------------------------------------------- + if(this._tableApiStation){ + let stationContext = { + tableApi: this._tableApiStation, + removeMissing: false + }; + + this.callbackUpdateTableRows(stationContext, Util.getObjVal(systemData, 'stations'), 'stations'); + } + + $(this.moduleElement).hideLoadingAnimation(); + + resolve({ + action: 'update', + data: { + module: this + } + }); + })); + } + + /** + * init module + */ + init(){ + super.init(); } }; - /** - * update trigger function for this module - * compare data and update module - * @param moduleElement - * @param systemData - */ - let updateModule = (moduleElement, systemData) => { + SystemIntelModule.isPlugin = false; // module is defined as 'plugin' + SystemIntelModule.scope = 'system'; // module scope controls how module gets updated and what type of data is injected + SystemIntelModule.sortArea = 'b'; // default sortable area + SystemIntelModule.position = 2; // default sort/order position within sortable area + SystemIntelModule.label = 'Structures'; // static module label (e.g. description) + SystemIntelModule.fullDataUpdate = true; // static module requires additional data (e.g. system description,...) - // update structure table data -------------------------------------------------------------------------------- - let structureTable = moduleElement.find('.' + config.systemStructuresTableClass); - let tableApiStructure = structureTable.DataTable(); + SystemIntelModule.maxDescriptionLength = 512; - let structureContext = { - tableApi: tableApiStructure, - removeMissing: true - }; + SystemIntelModule.defaultConfig = { + className: 'pf-system-intel-module', // class for module + sortTargetAreas: ['a', 'b', 'c'], // sortable areas where module can be dragged into + headline: 'Structures', + headlineSub: 'Stations', - callbackUpdateTableRows(structureContext, Util.getObjVal(systemData, 'structures')); + // system intel module + intelTableId: 'pf-intel-table-', // id prefix for all tables in module + intelTableRowIdPrefix: 'pf-intel-row-', // id prefix for table rows + systemStationsTableClass: 'pf-system-station-table', // class for NPC owned stations table + systemStructuresTableClass: 'pf-system-structure-table', // class for player owned structures table - // update station table data ---------------------------------------------------------------------------------- - let stationTable = moduleElement.find('.' + config.systemStationsTableClass); - let tableApiStation = stationTable.DataTable(); + // structure dialog + structureDialogId: 'pf-structure-dialog', // id for "structure" dialog + nameInputId: 'pf-structure-dialog-name-input', // id for "name" input + statusSelectId: 'pf-structure-dialog-status-select', // id for "status" select + typeSelectId: 'pf-structure-dialog-type-select', // id for "type" select + corporationSelectId: 'pf-structure-dialog-corporation-select', // id for "corporation" select + descriptionTextareaId: 'pf-structure-dialog-description-textarea', // id for "description" textarea + descriptionTextareaCharCounter: 'pf-form-field-char-count', // class for "character counter" element for form field - let stationContext = { - tableApi: tableApiStation, - removeMissing: false - }; - - callbackUpdateTableRows(stationContext, Util.getObjVal(systemData, 'stations'), 'stations'); - - moduleElement.hideLoadingAnimation(); - }; - - /** - * init intel module - * @param moduleElement - * @param mapId - * @param systemData - */ - let initModule = (moduleElement, mapId, systemData) => { - let structureTableElement = moduleElement.find('.' + config.systemStructuresTableClass); - let tableApi = structureTableElement.DataTable(); - - // init listener for global "past" dScan into this page ------------------------------------------------------- - moduleElement.on('pf:updateIntelModuleByClipboard', function(e, clipboard){ - updateStructureTableByClipboard(systemData, clipboard, { - moduleElement: moduleElement, - tableApi: tableApi - }); - }); - - // init popovers for some table cells ------------------------------------------------------------------------- - moduleElement.hoverIntent({ - over: function(e){ - let tableApi = getDataTableInstance(mapId, systemData.id, 'structure'); - - // simple for layout (CSS) - let cellData = tableApi.cell(this).data(); - if(cellData && cellData.length){ - let content = '
    ' + cellData.replace(/\r?\n/g, '
    ') + '
    '; - - let options = { - placement: 'top', - html: true, - trigger: 'manual', - container: 'body', - title: '', - content: content, - delay: { - show: 0, - hide: 0 - }, - }; - - $(this).popover(options).popover('show'); - } - }, - out: function(e){ - $(this).destroyPopover(); - }, - selector: '.' + config.tableCellPopoverClass - }); - }; - - /** - * before module destroy callback - * @param moduleElement - */ - let beforeDestroy = moduleElement => { - let structureTable = moduleElement.find('.' + config.systemStructuresTableClass); - let stationTable = moduleElement.find('.' + config.systemStationsTableClass); - let tableApiStructure = structureTable.DataTable(); - let tableApiStation = stationTable.DataTable(); - tableApiStructure.destroy(true); - tableApiStation.destroy(true); - }; - - return { - config: config, - getModule: getModule, - initModule: initModule, - updateModule: updateModule, - beforeDestroy: beforeDestroy + // dataTable + tableCellImageClass: 'pf-table-image-smaller-cell', // class for table "image" cells + tableCellCounterClass: 'pf-table-counter-cell', // class for table "counter" cells + tableCellEllipsisClass: 'pf-table-cell-ellipses-auto', // class for table "ellipsis" cells + tableCellActionClass: 'pf-table-action-cell', // class for "action" cells + tableCellActionIconClass: 'pf-table-action-icon-cell', // class for table "action" icon (icon is part of cell content) + tableCellServicesClass: 'pf-table-services-cell', // class for table station "services" cells + tableCellPopoverClass: 'pf-table-popover-cell' // class for table cells with a "popover" }; + return SystemIntelModule; }); \ No newline at end of file diff --git a/js/app/ui/module/system_killboard.js b/js/app/ui/module/system_killboard.js index c707f00f..47ff2308 100644 --- a/js/app/ui/module/system_killboard.js +++ b/js/app/ui/module/system_killboard.js @@ -6,356 +6,820 @@ define([ 'jquery', 'app/init', 'app/util', - 'app/lib/cache' -], ($, Init, Util, Cache) => { + 'module/base', + 'app/map/util' +], ($, Init, Util, BaseModule, MapUtil) => { 'use strict'; - let config = { - // module info - modulePosition: 2, - moduleName: 'systemKillboard', - moduleHeadClass: 'pf-module-head', // class for module header - moduleHandlerClass: 'pf-module-handler-drag', // class for "drag" handler + let SystemKillboardModule = class SystemKillboardModule extends BaseModule { + constructor(config = {}) { + super(Object.assign({}, new.target.defaultConfig, config)); + } - // headline toolbar - moduleHeadlineIconClass: 'pf-module-icon-button', // class for toolbar icons in the head + /** + * module header + * @param text + * @returns {HTMLDivElement} + */ + newHeaderElement(text){ + let headEl = super.newHeaderElement(text); - // system killboard module - moduleTypeClass: 'pf-system-killboard-module', // class for this module + // WebSocket status + let wsStatusEl = Object.assign(document.createElement('h5'), { + className: this._config.wsStatusWrapperClass + }); + this._iconWsEl = this.newIconElement([ + 'fa-circle', 'fa-fw', 'txt-color', this._config.wsStatusClass + ]); + wsStatusEl.append(this._iconWsEl); - // system killboard list - systemKillboardListClass: 'pf-system-killboard-list', // class for a list with kill entries - systemKillboardListEntryClass: 'pf-system-killboard-list-entry', // class for a list entry - systemKillboardListImgShip: 'pf-system-killboard-img-ship', // class for all ship images - systemKillboardListImgChar: 'pf-system-killboard-img-char', // class for all character logos - systemKillboardListImgAlly: 'pf-system-killboard-img-ally', // class for all alliance logos - systemKillboardListImgCorp: 'pf-system-killboard-img-corp', // class for all corp logos + // toolbar + let toolbarEl = this.newHeadlineToolbarElement(); + this._iconFilterEl = this.newIconElement([ + 'fa-filter', 'fa-fw', + this._config.moduleHeadlineIconClass + ]); - labelRecentKillsClass: 'pf-system-killboard-label-recent', // class for "recent kills" label - controlAreaClass: 'pf-module-control-area', // class for "control" areas + let iconKbEl = this.newIconElement([ + 'fa-external-link-alt', 'fa-fw', + this._config.moduleHeadlineIconClass + ]); + iconKbEl.setAttribute('title', 'zkillboard.com'); + iconKbEl.onclick = e => this.openKillboardUrl(e); - minCountKills: 5, - chunkCountKills: 5, - maxCountKills: 43 - }; + toolbarEl.append(iconKbEl, this._iconFilterEl); + headEl.append(wsStatusEl, toolbarEl); - let cache = new Cache({ - name: 'killboardModule', - ttl: 60 * 60, - maxSize: 600, - debug: false - }); + return headEl; + } - /** - * - * @param text - * @param options - * @returns {jQuery} - */ - let getLabel = (text, options) => $('', { - class: ['label', options.type, options.align, options.class].join(' ') - }).text(text); + /** + * HTTP request + * @param url + * @returns {Promise} + */ + request(url){ + return new Promise((resolve, reject) => { + let handleResponse = response => { + return response.json() + .then((json) => { + if(!response.ok){ + return Promise.reject(Object.assign({}, json, { + status: response.status, + statusText: response.statusText, + })); + } + return json; + }); + }; - /** - * get killmail data from ESI - * @param requestData - * @param context - * @param callback - */ - let loadKillmailData = (requestData, context, callback) => { - let cacheKey = 'killmail_' + requestData.killId; - let responseData = cache.get(cacheKey); - if(responseData){ - // ... already cached -> return from cache - callback(context, responseData) - .then(payload => showKills(payload.data.killboardElement, payload.data.systemId, payload.data.chunkSize)); - }else{ - // ...not cached -> request data - let url = 'https://esi.evetech.net/latest/killmails/' + requestData.killId + '/' + requestData.hash + '/'; + fetch(url) + .then(handleResponse) + .then((result) => { + resolve(result); + }).catch((e) => { + console.error(url, e); - $.ajax({ - type: 'GET', - url: url, - dataType: 'json', - context: context - }).done(function(responseData){ - cache.set(cacheKey, responseData); + let title = e.status ? e.status : e; + let text = e.error ? e.error : url; + this.showNotify({title: title, text: text, type: 'error'}); - callback(this, responseData) - .then(payload => showKills(payload.data.killboardElement, payload.data.systemId, payload.data.chunkSize)); - }).fail(function(jqXHR, status, error){ - // request failed -> skip this and load next - showKills(this.killboardElement, this.systemId, this.chunkSize); + reject(e); + }).finally(() => { + $(this.moduleElement).hideLoadingAnimation(); + }); }); } - }; - - /** - * load a chunk of killmails and render them - * @param killboardElement - * @param systemId - * @param chunkSize - */ - let showKills = (killboardElement, systemId, chunkSize) => { - if(chunkSize){ - let cacheKey = 'zkb_' + systemId; - let data = cache.getOrDefault(cacheKey, []); - if( - killboardElement.children().length < config.maxCountKills && - data.length - ){ - // next killmail to load - let nextZkb = data.shift(); - - loadKillmailData({ - killId: parseInt(nextZkb.killmail_id) || 0, - hash: nextZkb.zkb.hash - }, { - chunkSize: --chunkSize, - zkb: nextZkb.zkb, - systemId: systemId, - killboardElement: killboardElement - }, renderKillmail); + /** + * get zKillboard data + * @returns {Promise} + */ + getSystemKillsData(){ + // check for cached responses "short term cache" + let cacheKey = SystemKillboardModule.getCacheKey('systemId', this._systemData.systemId); + let result = SystemKillboardModule.getCache('zkb').get(cacheKey); + if(result){ + // could also be an empty array! + return Promise.resolve(result); }else{ - // no more kills available OR max kills reached - killboardElement.closest('.' + config.moduleTypeClass).find('.' + config.controlAreaClass).hide(); + return new Promise(resolve => { + $(this.moduleElement).showLoadingAnimation(); + + // get kills within the last 24h + let timeFrameInSeconds = 60 * 60 * 24; + + // if system is w-space system -> add link modifier + let wSpaceLinkModifier = ''; + if(this._systemData.type.id === 1){ + wSpaceLinkModifier = 'w-space/'; + } + + let url = `${Init.url.zKillboard}/no-items/${wSpaceLinkModifier}no-attackers/npc/0/solarSystemID/${this._systemData.systemId}/pastSeconds/${timeFrameInSeconds}/`; + + this.request(url).then(result => { + if(result.error){ + // successful request with error response + this.showNotify({title: 'Data fetch() from zKillboard failed', text: result.error, type: 'error'}); + return Promise.reject(result); + }else{ + // zkb result needs to be cached and becomes reduced on "load more" + SystemKillboardModule.getCache('zkb').set(cacheKey, result); + return result; + } + }).then(result => resolve(result)).catch(e => { + console.error(e); + this.showNotify({title: 'Data fetch() from zKillboard failed', text: e, type: 'error'}); + }); + }); } - } - }; - /** - * render a single killmail - * @param context - * @param killmailData - * @returns {Promise} - */ - let renderKillmail = (context, killmailData) => { + /** + * render module + * @param mapId + * @param systemData + * @returns {HTMLElement} + */ + render(mapId, systemData){ + this._mapId = mapId; + this._systemData = systemData; - let renderKillmailExecutor = (resolve, reject) => { - // calculate time diff in hours - let serverDate= Util.getServerTime(); - let killDate = Util.convertDateToUTC(new Date(killmailData.killmail_time)); + // request graph data and store result promise + // -> module is not full rendered jet + this._dataPromise = this.getSystemKillsData(); - // get time diff - let timeDiffMin = Math.round((serverDate - killDate) / 1000 / 60); - let timeDiffHour = Math.floor(timeDiffMin / 60); + this._bodyEl = Object.assign(document.createElement('div'), { + className: this._config.bodyClassName + }); + this.moduleElement.append(this._bodyEl); - let data = { - zkb: context.zkb, - killmail: killmailData, - systemKillboardListEntryClass: config.systemKillboardListEntryClass, - systemKillboardListImgShip: config.systemKillboardListImgShip, - systemKillboardListImgChar: config.systemKillboardListImgChar, - systemKillboardListImgCorp: config.systemKillboardListImgCorp, - systemKillboardListImgAlly: config.systemKillboardListImgAlly, - zKillboardUrl: 'https://zkillboard.com', - ccpImageServerUrl: Init.url.ccpImageServer, - dateFormat: () => { - return (val, render) => { - let killDate = Util.convertDateToUTC(new Date(render(val))); - return Util.convertDateToString(killDate); - }; - }, - iskFormat: () => { - return (val, render) => { - return Util.formatPrice(render(val)); - }; - }, - }; + this.setModuleObserver(); - requirejs(['text!templates/modules/killmail.html', 'mustache'], (template, Mustache) => { - // show hint for recent kills ------------------------------------------------------------------------- - if(timeDiffHour === 0){ - context.killboardElement.siblings('.' + config.labelRecentKillsClass).css('display', 'block'); + // init webSocket connection + SystemKillboardModule.initWebSocket(); + + return this.moduleElement; + } + + /** + * init module + */ + init(){ + super.init(); + + // subscribe this module instance to the zKB WebSocket + SystemKillboardModule.subscribeToWS(this); + this.updateWsStatus(); + + // show "historic" killmails + if(this._dataPromise instanceof Promise){ + this._dataPromise + .then(result => { + this._killboardLabelEl = this.newLabelElement('recent kills within the last hour', [ + 'label-warning', this._config.labelRecentKillsClass, 'hidden' + ]); + + if(result.length){ + // kills found + this._killboardEl = document.createElement('ul'); + this._killboardEl.classList.add(this._config.systemKillboardListClass); + + this._bodyEl.append( + this._killboardLabelEl, + this._killboardEl, + this.newControlElement('load more', [this._config.moduleHeadlineIconClass]) + ); + + // set a "local" copy of all indexes from cached response + // -> this "local" array gets reduces when KM gets loaded + // -> manipulation does NOT affect cached data + this._tempZkbKillmailIndexes = Object.keys(result); + + this.showKills(this._config.chunkCountKills); + }else{ + // no kills found + this._bodyEl.append( + this.newLabelElement('No kills found within the last 24h', ['label-success']) + ); + } + }) + .catch(e => { + console.error(e); + }); + } + } + + beforeHide(){ + super.beforeHide(); + SystemKillboardModule.unsubscribeFromWS(this); + } + + /** + * load a chunk of killmails and render them + * @param chunkSize + */ + showKills(chunkSize){ + if(chunkSize){ + let cacheKey = SystemKillboardModule.getCacheKey('systemId', this._systemData.systemId); + let result = SystemKillboardModule.getCache('zkb').get(cacheKey); + + if( + this._killboardEl.children.length < this._config.maxCountKillHistoric && + (this._tempZkbKillmailIndexes || []).length && + (result || []).length + ){ + // next killmail to load -> reduce "local" index array + let nextZkb = result[this._tempZkbKillmailIndexes.shift()]; + if(nextZkb){ + this.loadKillmailData({ + killId: parseInt(nextZkb.killmail_id) || 0, + hash: nextZkb.zkb.hash + }, { + chunkSize: --chunkSize, + zkb: nextZkb.zkb + }, 'renderKillmail'); + }else{ + console.warn('Killmail not found in local zkb cache'); + } + }else{ + // no more kills available OR max kills reached + this.moduleElement.querySelector('.' + this._config.controlAreaClass).style.display = 'none'; + } + } + } + + /** + * get killmail data from ESI + * @param requestData + * @param context + * @param callback + */ + loadKillmailData(requestData, context, callback){ + let cacheKey = SystemKillboardModule.getCacheKey('killmail', requestData.killId); + let cacheItem = SystemKillboardModule.getCache('killmail').get(cacheKey); + if(cacheItem){ + // ... already cached -> show cache killmail + this[callback](cacheItem.zkb, cacheItem.killmailData, cacheItem.systemData, context.chunkSize) + .then(payload => this.showKills(payload.data.chunkSize)) + .catch(e => console.error(e)); + }else{ + // ...not cached -> request data + let url = 'https://esi.evetech.net/latest/killmails/' + requestData.killId + '/' + requestData.hash + '/'; + + this.request(url).then(killmailData => { + let systemData = SystemKillboardModule.getSystemDataForCache(this._systemData); + SystemKillboardModule.getCache('killmail').set(cacheKey, {zkb: context.zkb, killmailData: killmailData, systemData: systemData}); + + this[callback](context.zkb, killmailData, systemData, context.chunkSize) + .then(payload => this.showKills(payload.data.chunkSize)) + .catch(e => console.error(e)); + }).catch(e => { + // request failed -> skip this and load next + console.warn(e); + this.showKills(context.chunkSize); + }); + } + } + + /** + * @param zkb + * @param attackersCount + * @returns {{color: string, label: string}} + */ + getAttackerBadgeData(zkb, attackersCount){ + let color, label; + if(zkb.solo){ + color = '#5cb85c'; + label = 'solo'; + }else if(zkb.npc){ + color = '#d747d6'; + label = 'npc'; + }else if(attackersCount){ + color = '#adadad'; + label = attackersCount; + } + return {color, label}; + } + + /** + * render a single killmail + * @param zkbData + * @param killmailData + * @param systemData + * @param chunkSize + * @param position + * @returns {Promise} + */ + renderKillmail(zkbData, killmailData, systemData, chunkSize, position = 'bottom'){ + return new Promise((resolve, reject) => { + if(!this._killboardEl){ + // killboard element might not be rendered at this point (e.g. if new kills pushed to WS) + return reject(new ReferenceError('Could not render killmail. KB element not found.')); } - // render killmail entry ------------------------------------------------------------------------------ - let content = Mustache.render(template, data); - context.killboardElement.append(content); + // calculate time diff in hours + let serverDate = SystemKillboardModule.serverTime; + let serverHours = serverDate.setHours(0,0,0,0); - // animate kill li-element ---------------------------------------------------------------------------- - context.killboardElement.children().last().velocity('transition.expandIn', { - complete: function(){ - $(this).find('[title]').tooltip({ - container: 'body' - }); + let killDate = Util.convertDateToUTC(new Date(killmailData.killmail_time)); + + // get time diff + let timeDiffMin = Math.round((serverDate - killDate) / 1000 / 60); + let timeDiffHour = Math.floor(timeDiffMin / 60); + + let attackers = BaseModule.Util.getObjVal(killmailData, 'attackers') || []; + let attackersCount = attackers.length; + let attackerFinal = attackers.find(attacker => attacker.final_blow); + + + let data = { + zkb: zkbData, + killmail: killmailData, + system: systemData, + isPodKill: BaseModule.Util.getObjVal(killmailData, 'victim.ship_type_id') === 670, // POD shipId + attackersCount: attackersCount, + attackerFinal: attackerFinal, + attackerBadge: this.getAttackerBadgeData(zkbData, attackersCount), + config: this._config, + zKillboardUrl: 'https://zkillboard.com', + ccpImageServerUrl: Init.url.ccpImageServer, + imgUrlType: () => { + return (val, render) => this.getImageUrl('types', parseInt(render(val)) || 0, 64); + }, + imgUrlChar: () => { + return (val, render) => this.getImageUrl('characters', parseInt(render(val)) || 0); + }, + imgUrlCorp: () => { + return (val, render) => this.getImageUrl('corporations', parseInt(render(val)) || 0); + }, + imgUrlAlly: () => { + return (val, render) => this.getImageUrl('alliances', parseInt(render(val)) || 0); + }, + dateFormat: () => { + return (val, render) => { + let killDate = Util.convertDateToUTC(new Date(render(val))); + let value = Util.convertDateToString(killDate); + + // check whether log is new (today) -> + if(killDate.setHours(0,0,0,0) === serverHours){ + // replace dd/mm/YYYY + value = 'today' + value.substring(10); + } + + return value; + }; + }, + iskFormat: () => { + return (val, render) => { + return Util.formatPrice(render(val)); + }; + }, + }; + + requirejs(['text!templates/modules/killmail.html', 'mustache'], (template, Mustache) => { + // show hint for recent kills + this._killboardLabelEl.classList.toggle('hidden', !(timeDiffHour === 0 && this._killboardLabelEl)); + + // render killmail entry + let insertPos = ['append', 'beforeend']; + let animationPos = 'lastChild'; + if(position === 'top'){ + insertPos = ['prepend', 'afterbegin']; + animationPos = 'firstChild'; + } + + this._killboardEl.insertAdjacentHTML(insertPos[1], Mustache.render(template, data)); + + // animate kill li-element + $(this._killboardEl[animationPos]).velocity('transition.expandIn', { + display: 'flex', + complete: function(){ + $(this).initTooltips(); + } + }, { + display: 'flex' + }); + + resolve({ + action: 'renderKillmail', + data: { + chunkSize: chunkSize + } + }); + }); + }); + } + + /** + * remove last killmail list entry + */ + removeKillmail(){ + if(this._killboardEl){ + let lastEl = this._nextToRemove || (this._listStreamHeadline ? this._listStreamHeadline.previousElementSibling : null) || this._killboardEl.lastChild; + if(lastEl){ + this._nextToRemove = lastEl.previousElementSibling; + this._killboardEl.removeChild(lastEl); + } + } + } + + /** + * get image src URL + * @param resourceType + * @param resourceId + * @param size + * @returns {string} + */ + getImageUrl(resourceType, resourceId, size = 32){ + let url = '#'; + if(resourceId){ + url = BaseModule.Util.eveImageUrl(resourceType, resourceId, size); + } + return url; + } + + /** + * Li headline (devider) + * @param text + * @returns {HTMLLIElement} + */ + newListItemHeadElement(text){ + let listHeadEl = Object.assign(document.createElement('li'), { + className: ['flex-row', 'flex-between', 'media', this._config.systemKillboardListHeadClass].join(' ') + }); + + let iconDownEl = this.newIconElement(['fa-angle-double-down']); + let iconUpEl = this.newIconElement(['fa-angle-double-up']); + let headlineIconLeftEl = Object.assign(this.newHeadlineElement(), { + className: 'flex-col' + }); + let headlineIconRightEl = Object.assign(this.newHeadlineElement(), { + className: 'flex-col' + }); + headlineIconLeftEl.append(iconDownEl); + headlineIconRightEl.append(iconUpEl); + + let headlineLeftEl = this.newHeadlineElement(text); + headlineLeftEl.classList.add('flex-col', 'flex-grow', 'media-body'); + let headlineRightEl = this.newHeadlineElement('Killstream'); + headlineRightEl.classList.add('flex-col', 'flex-grow', 'media-body', 'text-right'); + + listHeadEl.append(headlineIconLeftEl, headlineLeftEl, headlineRightEl, headlineIconRightEl); + return listHeadEl; + } + + /** + * set module observer + */ + setModuleObserver(){ + this.setFilterIconObserver(); + + $(this.moduleElement).initTooltips({ + placement: 'top' + }); + + this.moduleElement.addEventListener('click', e => { + if(e.target.closest('.' + this._config.controlAreaClass)){ + e.stopPropagation(); + this.showKills(this._config.chunkCountKills); + } + }); + } + + /** + * init filter icon for WebSocket streams + */ + setFilterIconObserver(){ + let cacheKey = `map_${this._mapId}.streams`; + this.getLocalStore().getItem(cacheKey).then(streams => { + if(!streams){ + // not saved yet -> default streams + streams = ['system', 'map']; + this.getLocalStore().setItem(cacheKey, streams); + } + this._filterStreams = streams; + + let sourceOptions = [{ + value: 'system', + text: `System (${this._systemData.name})` + },{ + value: 'map', + text: `Map (${BaseModule.Util.getObjVal(BaseModule.Util.getCurrentMapData(this._mapId), 'config.name')})` + },{ + value: 'all', + text: `All (New Eden)` + }]; + + $(this._iconFilterEl).editable({ + // toggle: 'manual', + mode: 'popup', + type: 'checklist', + showbuttons: false, + onblur: 'submit', + highlight: false, + title: 'Streams', + placement: 'left', + pk: this._mapId, + value: this._filterStreams, + source: sourceOptions, + emptyclass: '', + emptytext: '', + display: function(value, sourceData){ + // update filter badge + if( + value && sourceData && + value.length < sourceData.length + ){ + this.dataset.badge = String(value.length); + }else{ + delete this.dataset.badge; + } + }, + viewport: { + selector: this.moduleElement, + padding: 5 } }); - resolve({ - action: 'renderKillmail', - data: context + $(this._iconFilterEl).on('save', (e, params) => { + this.getLocalStore().setItem(cacheKey, params.newValue).then(streams => this._filterStreams = streams); }); }); - }; - - return new Promise(renderKillmailExecutor); - }; - - /** - * updates the system info graph - * @param systemData - */ - $.fn.updateSystemInfoGraphs = function(systemData){ - let moduleElement = $(this); - - let labelOptions = { - align: 'center-block' - }; - let label = ''; - - // get kills within the last 24h - let timeFrameInSeconds = 60 * 60 * 24; - - // if system is w-space system -> add link modifier - let wSpaceLinkModifier = ''; - if(systemData.type.id === 1){ - wSpaceLinkModifier = 'w-space/'; } - let url = Init.url.zKillboard + '/'; - url += 'no-items/' + wSpaceLinkModifier + 'no-attackers/npc/0/solarSystemID/' + systemData.systemId + '/pastSeconds/' + timeFrameInSeconds + '/'; + /** + * open external zKillboard URL + * @param e + */ + openKillboardUrl(e){ + e.stopPropagation(); + window.open(`//zkillboard.com/system/${this._systemData.systemId}`, '_blank'); + } - moduleElement.showLoadingAnimation(); + /** + * check if killmailData matches any killStream + * @param killmailData + * @returns {boolean} + */ + filterKillmailByStreams(killmailData){ + let streams = this._filterStreams || []; + return !!(streams.includes('all') || + (streams.includes('system') && this._systemData.systemId === killmailData.solar_system_id) || + (streams.includes('map') && MapUtil.getSystemData(this._mapId, killmailData.solar_system_id, 'systemId'))); - $.ajax({ - url: url, - type: 'GET', - dataType: 'json' - }).done(function(result){ - // zkb result needs to be cached and becomes reduced on "load more" - let cacheKey = 'zkb_' + systemData.systemId; - cache.set(cacheKey, result); + } - if(result.length){ - // kills found -> insert hidden warning for recent kills - labelOptions.type = 'label-warning'; - labelOptions.class = config.labelRecentKillsClass; - let label = getLabel('recent kills within the last hour', labelOptions); - moduleElement.append(label); + /** + * callback for WebSocket responses + * @param zkbData + * @param killmailData + */ + onWsMessage(zkbData, killmailData){ + // check if killmail belongs to current filtered "streams" + if(this.filterKillmailByStreams(killmailData)){ + // check max limit for WS kill entries + this._countKillsWS = (this._countKillsWS || 0) + 1; + if(this._countKillsWS > this._config.maxCountKillsWS){ + // remove oldest KM + this.removeKillmail(); + } - let killboardElement = $('
      ', { - class: config.systemKillboardListClass - }); - moduleElement.append(killboardElement); - moduleElement.append(getControlElement()); + // add headline before first WS killmail gets added to top + if(this._killboardEl && this._countKillsWS === 1){ + this._listStreamHeadline = this.newListItemHeadElement(this._systemData.name); + this._killboardEl.prepend(this._listStreamHeadline); + } - showKills(killboardElement, systemData.systemId, config.chunkCountKills); - }else{ - // no kills found - labelOptions.type = 'label-success'; - label = getLabel('No kills found within the last 24h', labelOptions); - moduleElement.append(label); + // get systemData for killmailData + // -> systemData should exist if KM belongs to any system on any map + let systemData = MapUtil.getSystemData(this._mapId, killmailData.solar_system_id, 'systemId') || null; + + this.renderKillmail(zkbData, killmailData, systemData, 0, 'top') + .catch(e => console.warn(e)); } - }).fail(function(e){ - labelOptions.type = 'label-danger'; - label = getLabel('zKillboard is not responding', labelOptions); - moduleElement.find('.' + config.moduleHeadClass).after(label); + } - Util.showNotify({title: e.status + ': Get system kills', text: 'Loading failed', type: 'error'}); - }).always(function(){ - moduleElement.hideLoadingAnimation(); - }); + /** + * update module with current WebSocket status + */ + updateWsStatus(){ + let isSuccess = false; + let isWarning = false; + let isError = false; + let title = 'unknown'; + switch(SystemKillboardModule.wsStatus){ + case 1: // connecting + title = 'connecting…'; + isWarning = true; + break; + case 2: // connected + title = 'connected'; + isSuccess = true; + break; + case 3: // error + title = 'error'; + isError = true; + break; + case 4: // close + title = 'closed'; + isError = true; + break; + } - // init tooltips - let tooltipElements = moduleElement.find('[data-toggle="tooltip"]'); - tooltipElements.tooltip({ - container: 'body' - }); + + this._iconWsEl.classList.toggle('txt-color-green', isSuccess); + this._iconWsEl.classList.toggle('txt-color-orange', isWarning); + this._iconWsEl.classList.toggle('txt-color-red', isError); + this._iconWsEl.setAttribute('title', title); + + $(this._iconWsEl).destroyTooltips().initTooltips({ + placement: 'top' + }); + } + + /** + * reduce full systemData to minimal data that should be cached with a KM + * @param systemData + * @returns {*} + */ + static getSystemDataForCache(systemData){ + return systemData ? {id: systemData.systemId, name: systemData.name} : null; + } + + /** + * get all systems from all maps, that might be relevant for any cache stream + * -> KMs belonging to any of these systems are cached + * @returns {Object} + */ + static getWsRelevantSystemsFromMaps(){ + let cacheKey = SystemKillboardModule.getCacheKey('tempSystemsData', 1); + let systemsData = SystemKillboardModule.getCache('zkb').get(cacheKey); + + if(!systemsData){ + // KB cache ist for all maps (not just the current one) + let mapsData = BaseModule.Util.getCurrentMapData() || []; + systemsData = mapsData.reduce( + (accAll, mapData) => Object.assign( + accAll, + (BaseModule.Util.getObjVal(mapData, 'data.systems') || []).reduce( + (accMap, systemData) => Object.assign( + accMap, + {[systemData.systemId]: this.getSystemDataForCache(systemData)} + ), {}) + ), {}); + + SystemKillboardModule.getCache('zkb').set(cacheKey, systemsData); + } + return systemsData; + } + + /** + * cache WebSocket response if it is relevant for us + * @param response + * @returns {*[]} + */ + static cacheWsResponse(response){ + let zkbData = response.zkb; + delete response.zkb; + let killmailData = response; + let systemData = null; + + // check if killmailData is relevant (belongs to any system on any map + let systemsData = this.getWsRelevantSystemsFromMaps(); + if(Object.keys(systemsData).map(systemId => parseInt(systemId)).includes(killmailData.solar_system_id)){ + // system is on map! -> cache + systemData = BaseModule.Util.getObjVal(systemsData, String(killmailData.solar_system_id)); + let cacheKey = SystemKillboardModule.getCacheKey('killmail', killmailData.killmail_id); + SystemKillboardModule.getCache('killmail').set(cacheKey, { + zkb: zkbData, + killmailData: killmailData, + systemData: systemData + }); + } + + return [zkbData, killmailData]; + } + + /** + * subscribe instance of Killboard module to WebSocket + * @param module + */ + static unsubscribeFromWS(module){ + SystemKillboardModule.wsSubscribtions = SystemKillboardModule.wsSubscribtions.filter(subscriber => subscriber !== module); + } + + /** + * unsubscribe instance of Killboard module to WebSocket + * @param module + */ + static subscribeToWS(module){ + if( + !SystemKillboardModule.wsSubscribtions.includes(module) && + module instanceof SystemKillboardModule + ){ + SystemKillboardModule.wsSubscribtions.push(module); + } + } + + /** + * init/connect to WebSocket if not already done + */ + static initWebSocket(){ + if(!SystemKillboardModule.ws){ + SystemKillboardModule.ws = new WebSocket('wss://zkillboard.com:2096'); + SystemKillboardModule.wsStatus = 1; + } + + let sendMessage = req => { + SystemKillboardModule.ws.send(JSON.stringify(req)); + }; + + SystemKillboardModule.ws.onopen = e => { + SystemKillboardModule.wsStatus = 2; + SystemKillboardModule.wsSubscribtions.forEach(subscriber => subscriber.updateWsStatus()); + + sendMessage({action:'sub', channel:'killstream'}); + }; + + SystemKillboardModule.ws.onmessage = e => { + let response = JSON.parse(e.data); + + let [zkbData, killmailData] = this.cacheWsResponse(response); + SystemKillboardModule.wsSubscribtions.forEach(subscriber => subscriber.onWsMessage(zkbData, killmailData)); + }; + + SystemKillboardModule.ws.onerror = e => { + SystemKillboardModule.wsStatus = 3; + SystemKillboardModule.ws = null; + SystemKillboardModule.wsSubscribtions.forEach(subscriber => subscriber.updateWsStatus()); + }; + + SystemKillboardModule.ws.onclose = e => { + SystemKillboardModule.wsStatus = 4; + SystemKillboardModule.ws = null; + SystemKillboardModule.wsSubscribtions.forEach(subscriber => subscriber.updateWsStatus()); + }; + } + + /** + * get cache key + * @param type + * @param objId + * @returns {string} + */ + static getCacheKey(type, objId){ + if( + typeof type === 'string' && type.length && + parseInt(objId) + ){ + return `${type}_${objId}`; + } + throw new TypeError('Invalid cache key types'); + } }; - /** - * get module toolbar element - * @param systemData - * @returns {*|jQuery|HTMLElement|void} - */ - let getHeadlineToolbar = (systemData) => { - let headlineToolbar = $('
      ', { - class: 'pull-right' - }).append( - $('', { - class: ['fas', 'fa-fw', 'fa-external-link-alt ', config.moduleHeadlineIconClass].join(' '), - title: 'zkillboard.com' - }).on('click', function(e){ - window.open( - '//zkillboard.com/system/' + systemData.systemId, - '_blank' - ); - }).attr('data-toggle', 'tooltip') - ); - - headlineToolbar.find('[data-toggle="tooltip"]').tooltip({ - container: 'body' - }); - - return headlineToolbar; + SystemKillboardModule.isPlugin = false; // module is defined as 'plugin' + SystemKillboardModule.scope = 'system'; // module scope controls how module gets updated and what type of data is injected + SystemKillboardModule.sortArea = 'c'; // default sortable area + SystemKillboardModule.position = 1; // default sort/order position within sortable area + SystemKillboardModule.label = 'Killboard'; // static module label (e.g. description) + SystemKillboardModule.wsStatus = undefined; + SystemKillboardModule.serverTime = BaseModule.Util.getServerTime(); // static Date() with current EVE server time + SystemKillboardModule.wsSubscribtions = []; // static container for all KB module instances (from multiple maps) for WS responses + SystemKillboardModule.cacheConfig = { + zkb: { // cache for "zKillboard" responses -> short term cache + ttl: 60 * 3, + maxSize: 50 + }, + killmail: { // cache for "Killmail" data -> long term cache + ttl: 60 * 30, + maxSize: 500 + } }; - /** - * get info control element - * @returns {void|jQuery|*} - */ - let getControlElement = () => { - let controlElement = $('
      ', { - class: [Util.config.dynamicAreaClass, config.controlAreaClass, config.moduleHeadlineIconClass].join(' '), - html: '  load more' - }); - return controlElement; + SystemKillboardModule.defaultConfig = { + className: 'pf-system-killboard-module', // class for module + sortTargetAreas: ['a', 'b', 'c'], // sortable areas where module can be dragged into + headline: 'Killboard', + + // system killboard list + systemKillboardListClass: 'pf-system-killboard-list', // class for a list with kill entries + systemKillboardListHeadClass: 'pf-system-killboard-list-head', // class for a list entry headline + systemKillboardListImgL: 'pf-system-killboard-img-l', // class for all large centered img (ship images) + systemKillboardListImgM: 'pf-system-killboard-img-m', // class for all medium centered img (character logos) + systemKillboardListImgS: 'pf-system-killboard-img-s', // class for all small top/bottom img (alliance/corp logos) + + wsStatusWrapperClass: 'pf-system-killboard-wsStatusWrapper', // class for WebSocket "status" wrapper + wsStatusClass: 'pf-system-killboard-wsStatus', // class for WebSocket "status" headline + labelRecentKillsClass: 'pf-system-killboard-label-recent', // class for "recent kills" label + + minCountKills: 5, + chunkCountKills: 5, + maxCountKillHistoric: 43, + + maxCountKillsWS: 150 }; - /** - * @param moduleElement - * @param systemData - */ - let setModuleObserver = (moduleElement, systemData) => { - moduleElement.on('click', '.' + config.controlAreaClass, function(){ - let killboardElement = moduleElement.find('.' + config.systemKillboardListClass); - showKills(killboardElement, systemData.systemId, config.chunkCountKills); - }); - }; - - /** - * before module "show" callback - * @param moduleElement - * @param systemData - */ - let beforeShow = (moduleElement, systemData) => { - // update graph - moduleElement.updateSystemInfoGraphs(systemData); - }; - - /** - * get module element - * @param parentElement - * @param mapId - * @param systemData - * @returns {jQuery} - */ - let getModule = (parentElement, mapId, systemData) => { - let moduleElement = $('
      ').append( - $('
      ', { - class: config.moduleHeadClass - }).append( - $('
      ', { - class: config.moduleHandlerClass - }), - $('
      ', { - text: 'Killboard' - }), - getHeadlineToolbar(systemData) - ) - ); - - setModuleObserver(moduleElement, systemData); - - return moduleElement; - }; - - return { - config: config, - getModule: getModule, - beforeShow: beforeShow - }; + return SystemKillboardModule; }); \ No newline at end of file diff --git a/js/app/ui/module/system_route.js b/js/app/ui/module/system_route.js index 0e23b9bb..90604c8a 100644 --- a/js/app/ui/module/system_route.js +++ b/js/app/ui/module/system_route.js @@ -7,483 +7,980 @@ define([ 'app/init', 'app/util', 'bootbox', - 'app/map/util' -], ($, Init, Util, bootbox, MapUtil) => { + 'app/map/util', + 'module/base' +], ($, Init, Util, bootbox, MapUtil, BaseModule) => { 'use strict'; - let config = { - // module info - modulePosition: 1, - moduleName: 'systemRoute', - moduleHeadClass: 'pf-module-head', // class for module header - moduleHandlerClass: 'pf-module-handler-drag', // class for "drag" handler - - // system route module - moduleTypeClass: 'pf-system-route-module', // class for this module - - // headline toolbar - moduleHeadlineIconClass: 'pf-module-icon-button', // class for toolbar icons in the head - moduleHeadlineIconSearchClass: 'pf-module-icon-button-search', // class for "search" icon - moduleHeadlineIconSettingsClass: 'pf-module-icon-button-settings', // class for "settings" icon - moduleHeadlineIconRefreshClass: 'pf-module-icon-button-refresh', // class for "refresh" icon - - systemSecurityClassPrefix: 'pf-system-security-', // prefix class for system security level (color) - - // dialog - routeSettingsDialogId: 'pf-route-settings-dialog', // id for route "settings" dialog - routeDialogId: 'pf-route-dialog', // id for route "search" dialog - systemDialogSelectClass: 'pf-system-dialog-select', // class for system select Element - systemInfoRoutesTableClass: 'pf-system-route-table', // class for route tables - - routeDialogMapSelectId: 'pf-route-dialog-map-select', // id for "map" select - routeDialogSizeSelectId: 'pf-route-dialog-size-select', // id for "wh size" select - - dataTableActionCellClass: 'pf-table-action-cell', // class for "action" cells - dataTableRouteCellClass: 'pf-table-route-cell', // class for "route" cells - dataTableJumpCellClass: 'pf-table-jump-cell', // class for "route jump" cells - - rallyClass: 'pf-rally', // class for "rally point" style - - routeCacheTTL: 5 // route cache timer (client) in seconds - }; - - // cache for system routes - let cache = { - systemRoutes: {}, // jump information between solar systems - mapConnections: {} // connection data read from UI - }; - - /** - * set cache data - * @param cacheType - * @param cacheKey - * @param data - */ - let setCacheData = (cacheType, cacheKey, data) => { - cache[cacheType][cacheKey] = { - data: data, - updated: Util.getServerTime().getTime() / 1000 - }; - }; - - /** - * get cache data - * @param cacheType - * @param cacheKey - * @returns {*} - */ - let getCacheData = (cacheType, cacheKey) => { - let cachedData = null; - let currentTimestamp = Util.getServerTime().getTime(); - - if( - cache[cacheType].hasOwnProperty(cacheKey) && - Math.round( - ( currentTimestamp - (new Date( cache[cacheType][cacheKey].updated * 1000).getTime())) / 1000 - ) <= config.routeCacheTTL - ){ - cachedData = cache[cacheType][cacheKey].data; + let SystemRouteModule = class SystemRouteModule extends BaseModule { + constructor(config = {}) { + super(Object.assign({}, new.target.defaultConfig, config)); } - return cachedData; - }; - - /** - * @param mapIds - * @param sourceName - * @param targetName - * @returns {string} - */ - let getRouteDataCacheKey = (mapIds, sourceName, targetName) => { - return [mapIds.join('_'), sourceName.toLowerCase(), targetName.toLowerCase()].join('###'); - }; - - /** - * get a unique cache key name for "source"/"target"-name - * @param sourceName - * @param targetName - * @returns {*} - */ - let getConnectionDataCacheKey = (sourceName, targetName) => { - let key = false; - if(sourceName && targetName){ - // names can be "undefined" in case system is currently on drag/drop - key = [sourceName.toLowerCase(), targetName.toLowerCase()].sort().join('###'); - } - return key; - }; - - /** - * callback function, adds new row to a dataTable with jump information for a route - * @param context - * @param routesData - */ - let callbackAddRouteRows = (context, routesData) => { - if(routesData.length > 0){ - for(let routeData of routesData){ - // format routeData - let rowData = formatRouteData(routeData); - if(rowData.route){ - // update route cache - let cacheKey = getRouteDataCacheKey(rowData.mapIds, routeData.systemFromData.name, routeData.systemToData.name); - setCacheData('systemRoutes', cacheKey, rowData); - - addRow(context, rowData); + /** + * update module + * @param payload + * @returns {Promise} + */ + update(payload){ + return super.update(payload).then(payload => new Promise(resolve => { + switch(payload.task){ + case 'showFindRouteDialog': + this.showFindRouteDialog({ + mapId: this._systemData.mapId, + systemFromData: this._systemFromData, + systemToData: payload.systemToData + }); + break; + case 'findRoute': + this.drawRouteTable(this._systemData.mapId, this._systemFromData, [payload.systemToData]); + break; } - } - // redraw dataTable - context.dataTable.draw(); - } - }; - - /** - * add a new dataTable row to the routes table - * @param context - * @param rowData - * @returns {*} - */ - let addRow = (context, rowData) => { - let dataTable = context.dataTable; - let rowElement = null; - let row = null; - let animationStatus = 'changed'; - - // search for an existing row (e.g. on mass "table refresh" [all routes]) - // get rowIndex where column 1 (equals to "systemToData.name") matches rowData.systemToData.name - let indexes = dataTable.rows().eq(0).filter((rowIdx) => { - return (dataTable.cell(rowIdx, 1).data().name === rowData.systemToData.name); - }); - - if(indexes.length > 0){ - // update row with FIRST index - // -> systemFrom should be unique! - row = dataTable.row( parseInt(indexes[0]) ); - // update row data - row.data(rowData); - }else{ - // no existing route found -> add new row - row = dataTable.row.add( rowData ); - - animationStatus = 'added'; + resolve({ + action: 'update', + data: { + module: this + } + }); + })); } - if(row.length > 0){ - rowElement = row.nodes().to$(); - rowElement.data('animationStatus', animationStatus); + /** + * render module + * @param mapId + * @param systemData + * @returns {HTMLElement} + */ + render(mapId, systemData){ + this._systemData = systemData; - rowElement.initTooltips({ - container: 'body' + // save systemFromData to module (data never changes during module lifetime) + // -> we need this later in updateModule() + this._systemFromData = { + systemId: systemData.systemId, + name: systemData.name, + }; + + this._bodyEl = Object.assign(document.createElement('div'), { + className: this._config.bodyClassName + }); + this.moduleElement.append(this._bodyEl); + + this.initRouteTable(); + + this.setModuleObserver(); + + return this.moduleElement; + } + + /** + * set module observer + */ + setModuleObserver(){ + // init tooltips + $(this.moduleElement).initTooltips({ + placement: 'top' }); } - return rowElement; - }; + /** + * init new route dataTable + */ + initRouteTable(){ + let module = this; - /** - * requests route data from eveCentral API and execute callback - * @param requestData - * @param context - * @param callback - */ - let getRouteData = (requestData, context, callback) => { - context.moduleElement.showLoadingAnimation(); + let tableEl = document.createElement('table'); + tableEl.classList.add('compact', 'stripe', 'order-column', 'row-border', module._config.systemInfoRoutesTableClass); + this._bodyEl.append(tableEl); - $.ajax({ - url: Init.path.searchRoute, - type: 'POST', - dataType: 'json', - data: requestData, - context: context - }).done(function(routesData){ - this.moduleElement.hideLoadingAnimation(); + this._tableApi = $(tableEl).DataTable( { + paging: false, + ordering: true, + order: [[ 2, 'asc' ], [ 0, 'asc' ]], + info: false, + searching: false, + hover: false, + autoWidth: false, + rowId: 'systemTo', + language: { + emptyTable: 'No routes added' + }, + columnDefs: [ + { + targets: 0, + orderable: true, + title: '', + width: 2, + class: ['text-center'].join(' '), + data: 'status', + render: { + _: 'formatted', + sort: 'value' + } + },{ + targets: 1, + orderable: true, + title: 'system   ', + class: Util.config.popoverTriggerClass, + data: 'systemToData', + render: { + _: 'name', + sort: 'name' + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + // init context menu + module.initSystemPopover($(cell),{ + systemToData: rowData.systemToData + }); - // execute callback - callback(this, routesData.routesData); - }); - }; + $(cell).toggleClass(module._config.rallyClass, cellData.hasOwnProperty('rally')); + } + },{ + targets: 2, + orderable: true, + title: '  ', + width: 16, + class: 'text-right', + data: 'jumps', + render: { + _: 'formatted', + sort: 'value' + } + },{ + targets: 3, + orderable: true, + title: 'Ø  ', + width: 14, + class: 'text-right', + data: 'avgTrueSec', + render: { + _: 'formatted', + sort: 'value' + } + },{ + targets: 4, + orderable: false, + title: 'route', + class: [this._config.dataTableRouteCellClass].join(' '), + data: 'route', + render: { + _: 'value' + } + },{ + targets: 5, + title: '', + orderable: false, + searchable: false, + width: 10, + class: ['text-center', this._config.dataTableActionCellClass].join(' '), + data: 'connections', + render: { + _: 'button' + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let tableApi = this.api(); - /** - * update complete routes table (refresh all) - * @param moduleElement - * @param dataTable - */ - let updateRoutesTable = (moduleElement, dataTable) => { - let context = { - moduleElement: moduleElement, - dataTable: dataTable - }; - let routeData = []; + $(cell).on('click', function(e){ + let routeCellElement = tableApi.cell( rowIndex, 4 ).nodes().to$(); - dataTable.rows().every(function(){ - routeData.push(getRouteRequestDataFromRowData(this.data())); - }); + if(routeCellElement.hasClass(module._config.dataTableJumpCellClass)){ + routeCellElement.toggleClass(module._config.dataTableJumpCellClass, false); + $(this).find('i').toggleClass('txt-color-orange', false); + }else{ + routeCellElement.toggleClass(module._config.dataTableJumpCellClass, true); + $(this).find('i').toggleClass('txt-color-orange', true); + } + }); + } + },{ + targets: 6, + title: '', + orderable: false, + searchable: false, + width: 10, + class: ['text-center', this._config.dataTableActionCellClass].join(' '), + data: 'flag', + render: { + _: 'button' + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let tableApi = this.api(); - getRouteData({routeData: routeData}, context, callbackAddRouteRows); - }; + $(cell).on('click', function(e){ + // get current row data (important!) + // -> "rowData" param is not current state, values are "on createCell()" state + rowData = tableApi.row( $(cell).parents('tr')).data(); + let routeData = module.getRouteRequestDataFromRowData(rowData); - /** - * format rowData for route search/update request - * @param {Object} rowData - * @returns {Object} - */ - let getRouteRequestDataFromRowData = rowData => { - return { - mapIds: (rowData.hasOwnProperty('mapIds')) ? rowData.mapIds : [], - systemFromData: (rowData.hasOwnProperty('systemFromData')) ? rowData.systemFromData : {}, - systemToData: (rowData.hasOwnProperty('systemToData')) ? rowData.systemToData : {}, - skipSearch: (rowData.hasOwnProperty('skipSearch')) ? rowData.skipSearch | 0 : 0, - stargates: (rowData.hasOwnProperty('stargates')) ? rowData.stargates | 0 : 1, - jumpbridges: (rowData.hasOwnProperty('jumpbridges')) ? rowData.jumpbridges | 0 : 1, - wormholes: (rowData.hasOwnProperty('wormholes')) ? rowData.wormholes | 0 : 1, - wormholesReduced: (rowData.hasOwnProperty('wormholesReduced')) ? rowData.wormholesReduced | 0 : 1, - wormholesCritical: (rowData.hasOwnProperty('wormholesCritical')) ? rowData.wormholesCritical | 0 : 1, - wormholesEOL: (rowData.hasOwnProperty('wormholesEOL')) ? rowData.wormholesEOL | 0 : 1, - wormholesSizeMin: (rowData.hasOwnProperty('wormholesSizeMin')) ? rowData.wormholesSizeMin : '', - excludeTypes: (rowData.hasOwnProperty('excludeTypes')) ? rowData.excludeTypes : [], - endpointsBubble: (rowData.hasOwnProperty('endpointsBubble')) ? rowData.endpointsBubble | 0 : 1, - connections: (rowData.hasOwnProperty('connections')) ? rowData.connections.value | 0 : 0, - flag: (rowData.hasOwnProperty('flag')) ? rowData.flag.value : 'shortest' - }; - }; - - /** - * show route dialog. User can search for systems and jump-info for each system is added to a data table - * @param dialogData - */ - let showFindRouteDialog = dialogData => { - let mapSelectOptions = []; - let currentMapData = Util.getCurrentMapData(); - if(currentMapData !== false){ - for(let i = 0; i < currentMapData.length; i++){ - mapSelectOptions.push({ - id: currentMapData[i].config.id, - name: currentMapData[i].config.name, - selected: (dialogData.mapId === currentMapData[i].config.id) - }); - } - } - - let sizeOptions = MapUtil.allConnectionJumpMassTypes().map(type => { - return { - id: type, - name: type, - selected: false - }; - }); - - let data = { - id: config.routeDialogId, - select2Class: Util.config.select2Class, - selectClass: config.systemDialogSelectClass, - routeDialogMapSelectId: config.routeDialogMapSelectId, - routeDialogSizeSelectId: config.routeDialogSizeSelectId, - systemFromData: dialogData.systemFromData, - systemToData: dialogData.systemToData, - mapSelectOptions: mapSelectOptions, - sizeOptions: sizeOptions - }; - - requirejs(['text!templates/dialog/route.html', 'mustache'], (template, Mustache) => { - - let content = Mustache.render(template, data); - - let findRouteDialog = bootbox.dialog({ - title: 'Route finder', - message: content, - show: false, - buttons: { - close: { - label: 'cancel', - className: 'btn-default' - }, - success: { - label: ' search route', - className: 'btn-primary', - callback: function(){ - // add new route to route table - - // get form Values - let form = $('#' + config.routeDialogId).find('form'); - - let routeDialogData = $(form).getFormValues(); - - // validate form - form.validator('validate'); - - // check whether the form is valid - let formValid = form.isValidForm(); - - if(formValid === false){ - // don't close dialog - return false; - } - - // get all system data from select2 - // -> we could also get value from "routeDialogData" var, but we need systemName also - let systemSelectData = form.find('.' + config.systemDialogSelectClass).select2('data'); - - if( - systemSelectData && - systemSelectData.length === 1 - ){ - let context = { - moduleElement: dialogData.moduleElement, - dataTable: dialogData.dataTable - }; + // overwrite some params + routeData.skipSearch = 0; + routeData.flag = routeData.flag === 'shortest' ? 'secure' : 'shortest'; // toggle let requestData = { - routeData: [{ - mapIds: routeDialogData.mapIds, - systemFromData: dialogData.systemFromData, - systemToData: { - systemId: parseInt(systemSelectData[0].id), - name: systemSelectData[0].text - }, - stargates: routeDialogData.hasOwnProperty('stargates') ? parseInt(routeDialogData.stargates) : 0, - jumpbridges: routeDialogData.hasOwnProperty('jumpbridges') ? parseInt(routeDialogData.jumpbridges) : 0, - wormholes: routeDialogData.hasOwnProperty('wormholes') ? parseInt(routeDialogData.wormholes) : 0, - wormholesReduced: routeDialogData.hasOwnProperty('wormholesReduced') ? parseInt(routeDialogData.wormholesReduced) : 0, - wormholesCritical: routeDialogData.hasOwnProperty('wormholesCritical') ? parseInt(routeDialogData.wormholesCritical) : 0, - wormholesEOL: routeDialogData.hasOwnProperty('wormholesEOL') ? parseInt(routeDialogData.wormholesEOL) : 0, - wormholesSizeMin: routeDialogData.wormholesSizeMin || '', - excludeTypes: getLowerSizeConnectionTypes(routeDialogData.wormholesSizeMin), - endpointsBubble: routeDialogData.hasOwnProperty('endpointsBubble') ? parseInt(routeDialogData.endpointsBubble) : 0 - }] + routeData: [routeData] }; - getRouteData(requestData, context, callbackAddRouteRows); - } + module.getRouteData(requestData, 'callbackAddRouteRows'); + }); + } + },{ + targets: 7, + title: '', + orderable: false, + searchable: false, + width: 10, + class: ['text-center', this._config.dataTableActionCellClass].join(' '), + data: 'reload', + render: { + _: 'button' + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let tableApi = this.api(); + + $(cell).on('click', function(e){ + // get current row data (important!) + // -> "rowData" param is not current state, values are "on createCell()" state + rowData = tableApi.row( $(cell).parents('tr')).data(); + let routeData = module.getRouteRequestDataFromRowData(rowData); + + // overwrite some params + routeData.skipSearch = 0; + + let requestData = { + routeData: [routeData] + }; + + module.getRouteData(requestData, 'callbackAddRouteRows'); + }); + } + },{ + targets: 8, + title: '', + orderable: false, + searchable: false, + width: 10, + class: ['text-center', this._config.dataTableActionCellClass].join(' '), + data: 'clear', + render: { + _: 'button' + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let tempTableElement = this; + + let confirmationSettings = { + title: '---', + template: Util.getConfirmationTemplate(null, { + size: 'small', + noTitle: true + }), + onConfirm : function(e, target){ + let deleteRowElement = $(cell).parents('tr'); + tempTableElement.api().rows(deleteRowElement).remove().draw(); + } + }; + + // init confirmation dialog + $(cell).confirmation(confirmationSettings); } } + ], + drawCallback: function(settings){ + let animationRows = this.api().rows().nodes().to$().filter(function(){ + return ( + $(this).data('animationStatus') || + $(this).data('animationTimer') + ); + }); + + for(let i = 0; i < animationRows.length; i++){ + let animationRow = $(animationRows[i]); + animationRow.pulseBackgroundColor(animationRow.data('animationStatus')); + animationRow.removeData('animationStatus'); + } + }, + initComplete: function(settings, json){ + // fill routesTable with data --------------------------------------------------------------------- + Util.getLocalStore('map').getItem(module._systemData.mapId).then(dataStore => { + // selected systems (if already stored) + let systemsTo = [{ + systemId: 30000142, + name: 'Jita' + }]; + + if( + dataStore && + dataStore.routes + ){ + systemsTo = dataStore.routes; + } + + // add "Rally Point" systems to table + let systemsToData = module.getRallySystemsData(module._systemData.mapId); + systemsToData.push(...systemsTo); + + module.drawRouteTable(module._systemData.mapId, module._systemFromData, systemsToData); + }); + + // click on "fake connection" --------------------------------------------------------------------- + $(this).on('click', '.pf-fake-connection', function(){ + let fakeConnectionElement = $(this); + let mapId = fakeConnectionElement.attr('data-mapId'); + let connectionId = fakeConnectionElement.attr('data-connectionId'); + let connection = $().getConnectionById(mapId, connectionId); + + if(connection){ + let map = connection._jsPlumb.instance; + MapUtil.showConnectionInfo(map, [connection]); + } + }); + }, + data: [] // will be added dynamic + }); + + + let buttons = new $.fn.dataTable.Buttons(this._tableApi, { + dom: { + container: { + tag: 'h5', + className: 'pull-right' + }, + button: { + tag: 'i', + className: ['fas', 'fa-fw', module._config.moduleHeadlineIconClass].join(' '), + }, + buttonLiner: { + tag: null + } + }, + name: 'tableTools', + buttons: [ + { + name: 'settings', + className: ['fa-sliders-h'].join(' '), + titleAttr: 'settings', + attr: { + 'data-toggle': 'tooltip', + 'data-html': true + }, + action: function(e, tableApi, node, config){ + module.showSettingsDialog({ + mapId: module._systemData.mapId, + systemFromData: module._systemFromData + }); + } + }, + { + name: 'search', + className: 'fa-search', + titleAttr: 'find route', + attr: { + 'data-toggle': 'tooltip', + 'data-html': true + }, + action: function(e, tableApi, node, config){ + let maxRouteSearchLimit = Init.routeSearch.limit; + + if(tableApi.rows().count() >= maxRouteSearchLimit){ + // max routes limit reached -> show warning + module.showNotify({title: 'Route limit reached', text: 'Search is limited by ' + maxRouteSearchLimit, type: 'warning'}); + }else{ + module.showFindRouteDialog({ + mapId: module._systemData.mapId, + systemFromData: module._systemFromData + }); + } + } + }, + { + name: 'refresh', + className: 'fa-sync', + titleAttr: 'refresh', + attr: { + 'data-toggle': 'tooltip', + 'data-html': true + }, + action: function(e, tableApi, node, config){ + module.updateRoutesTable(); + } + } + ] + }); + + this._tableApi.buttons().container().appendTo(module.moduleElement.querySelector('.' + module._config.headClassName)); + } + + /** + * draw route table + * @param mapId + * @param systemFromData + * @param systemsToData + */ + drawRouteTable(mapId, systemFromData, systemsToData){ + let requestRouteData = []; + + // Skip some routes from search + // -> this should help to throttle requests (heavy CPU load for route calculation) + let defaultRoutesCount = Init.routeSearch.defaultCount; + let rowElements = []; + + for(let systemToData of systemsToData){ + if(systemFromData.name !== systemToData.name){ + // check for cached rowData + let cacheKey = this.getRouteDataCacheKey([mapId], systemFromData.name, systemToData.name); + let rowData = SystemRouteModule.getCache('routes').get(cacheKey); + if(rowData){ + // route data is cached (client side) + rowElements.push(this.addRow(rowData)); + }else{ + // get route data -> ajax + let searchData = { + mapIds: [mapId], + systemFromData: systemFromData, + systemToData: systemToData, + skipSearch: requestRouteData.length >= defaultRoutesCount + }; + + requestRouteData.push(this.getRouteRequestDataFromRowData(searchData)); + } } - }); + } - findRouteDialog.on('show.bs.modal', function(e){ - findRouteDialog.initTooltips(); + // rows added from cache -> redraw() table + if(rowElements.length){ + this._tableApi.draw(); + } - // init some dialog/form observer - setDialogObserver( $(this) ); + // check if routes data is not cached and is requested + if(requestRouteData.length > 0){ + //let contextData = { + // tableApi: tableApi + //}; - // init map select ------------------------------------------------------------------------------------ - let mapSelect = findRouteDialog.find('#' + config.routeDialogMapSelectId); - mapSelect.initMapSelect(); + let requestData = { + routeData: requestRouteData + }; - // init connection jump size select ------------------------------------------------------------------- - findRouteDialog.find('#' + config.routeDialogSizeSelectId).initConnectionSizeSelect(); - }); - - - findRouteDialog.on('shown.bs.modal', function(e){ - - // init system select live search -------------------------------------------------------------------- - // -> add some delay until modal transition has finished - let systemTargetSelect = $(this).find('.' + config.systemDialogSelectClass); - systemTargetSelect.delay(240).initSystemSelect({key: 'id'}); - }); - - // show dialog - findRouteDialog.modal('show'); - }); - }; - - /** - * draw route table - * @param mapId - * @param moduleElement - * @param systemFromData - * @param routesTable - * @param systemsToData - */ - let drawRouteTable = (mapId, moduleElement, systemFromData, routesTable, systemsToData) => { - let requestRouteData = []; - - // Skip some routes from search - // -> this should help to throttle requests (heavy CPU load for route calculation) - let defaultRoutesCount = Init.routeSearch.defaultCount; - let rowElements = []; - - for(let systemToData of systemsToData){ - if(systemFromData.name !== systemToData.name){ - // check for cached rowData - let cacheKey = getRouteDataCacheKey([mapId], systemFromData.name, systemToData.name); - let rowData = getCacheData('systemRoutes', cacheKey); - if(rowData){ - // route data is cached (client side) - let context = { - dataTable: routesTable - }; - - rowElements.push( addRow(context, rowData) ); - }else{ - // get route data -> ajax - let searchData = { - mapIds: [mapId], - systemFromData: systemFromData, - systemToData: systemToData, - skipSearch: requestRouteData.length >= defaultRoutesCount - }; - - requestRouteData.push(getRouteRequestDataFromRowData(searchData)); - } + this.getRouteData(requestData, 'callbackAddRouteRows'); } } - // rows added from cache -> redraw() table - if(rowElements.length){ - routesTable.draw(); + /** + * get cache key + * @param mapIds + * @param sourceName + * @param targetName + * @returns {string} + */ + getRouteDataCacheKey(mapIds, sourceName, targetName){ + return `route_` + `${mapIds.join('_')}${sourceName}${targetName}`.hashCode(); } - // check if routes data is not cached and is requested - if(requestRouteData.length > 0){ - let contextData = { - moduleElement: moduleElement, - dataTable: routesTable + /** + * format rowData for route search/update request + * @param {Object} rowData + * @returns {Object} + */ + getRouteRequestDataFromRowData(rowData){ + return { + mapIds: (rowData.hasOwnProperty('mapIds')) ? rowData.mapIds : [], + systemFromData: (rowData.hasOwnProperty('systemFromData')) ? rowData.systemFromData : {}, + systemToData: (rowData.hasOwnProperty('systemToData')) ? rowData.systemToData : {}, + skipSearch: (rowData.hasOwnProperty('skipSearch')) ? rowData.skipSearch | 0 : 0, + stargates: (rowData.hasOwnProperty('stargates')) ? rowData.stargates | 0 : 1, + jumpbridges: (rowData.hasOwnProperty('jumpbridges')) ? rowData.jumpbridges | 0 : 1, + wormholes: (rowData.hasOwnProperty('wormholes')) ? rowData.wormholes | 0 : 1, + wormholesReduced: (rowData.hasOwnProperty('wormholesReduced')) ? rowData.wormholesReduced | 0 : 1, + wormholesCritical: (rowData.hasOwnProperty('wormholesCritical')) ? rowData.wormholesCritical | 0 : 1, + wormholesEOL: (rowData.hasOwnProperty('wormholesEOL')) ? rowData.wormholesEOL | 0 : 1, + wormholesThera: (rowData.hasOwnProperty('wormholesThera')) ? rowData.wormholesThera | 0 : 1, + wormholesSizeMin: (rowData.hasOwnProperty('wormholesSizeMin')) ? rowData.wormholesSizeMin : '', + excludeTypes: (rowData.hasOwnProperty('excludeTypes')) ? rowData.excludeTypes : [], + endpointsBubble: (rowData.hasOwnProperty('endpointsBubble')) ? rowData.endpointsBubble | 0 : 1, + connections: (rowData.hasOwnProperty('connections')) ? rowData.connections.value | 0 : 0, + flag: (rowData.hasOwnProperty('flag')) ? rowData.flag.value : 'shortest' }; - - let requestData = { - routeData: requestRouteData - }; - - getRouteData(requestData, contextData, callbackAddRouteRows); } - }; - /** - * show route settings dialog - * @param dialogData - * @param moduleElement - * @param systemFromData - * @param routesTable - */ - let showSettingsDialog = (dialogData, moduleElement, systemFromData, routesTable) => { + /** + * requests route data from eveCentral API and execute callback + * @param requestData + * @param callback + */ + getRouteData(requestData, callback){ + $(this.moduleElement).showLoadingAnimation(); + + this.request('POST', 'Route', [], requestData, this, context => { + $(this.moduleElement).hideLoadingAnimation(); + }) + .then(payload => payload.context[callback](payload.data.routesData)) + .catch(payload => { + let reason = payload.data.status + ' ' + payload.data.error; + this.showNotify({ + title: payload.data.jqXHR.status + ': System route data', + text: reason, + type: 'warning' + }); + }); + } + + /** + * update complete routes table (refresh all) + */ + updateRoutesTable(){ + let module = this; + let routeData = []; + + this._tableApi.rows().every(function(){ + routeData.push(module.getRouteRequestDataFromRowData(this.data())); + }); + + this.getRouteData({routeData: routeData}, 'callbackAddRouteRows'); + } + + /** + * callback function, adds new row to a dataTable with jump information for a route + * @param routesData + */ + callbackAddRouteRows(routesData){ + if(routesData.length > 0){ + for(let routeData of routesData){ + // format routeData + let rowData = this.formatRouteData(routeData); + if(rowData.route){ + // update route cache + let cacheKey = this.getRouteDataCacheKey(rowData.mapIds, routeData.systemFromData.name, routeData.systemToData.name); + SystemRouteModule.getCache('routes').set(cacheKey, rowData); + + this.addRow(rowData); + } + } + + // redraw dataTable + this._tableApi.draw(); + } + } + + /** + * add a new dataTable row to the routes table + * @param rowData + * @returns {*} + */ + addRow(rowData){ + let rowElement = null; + let row; + let animationStatus = 'changed'; + + // search for an existing row (e.g. on mass "table refresh" [all routes]) + // get rowIndex where column 1 (equals to "systemToData.name") matches rowData.systemToData.name + let indexes = this._tableApi.rows().eq(0).filter((rowIdx) => { + return (this._tableApi.cell(rowIdx, 1).data().name === rowData.systemToData.name); + }); + + if(indexes.length > 0){ + // update row with FIRST index + // -> systemFrom should be unique! + row = this._tableApi.row(parseInt(indexes[0])); + // update row data + row.data(rowData); + }else{ + // no existing route found -> add new row + row = this._tableApi.row.add(rowData); + animationStatus = 'added'; + } + + if(row.length > 0){ + rowElement = row.nodes().to$(); + rowElement.data('animationStatus', animationStatus); + + rowElement.initTooltips(); + } + return rowElement; + } + + /** + * format route data from API request into dataTable row format + * @param routeData + * @returns {{}} + */ + formatRouteData(routeData){ + + /** + * get status icon for route + * @param status + * @returns {string} + */ + let getStatusIcon = status => { + let color = 'txt-color-danger'; + let title = 'route not found'; + switch(status){ + case 1: + color = 'txt-color-success'; + title = 'route exists'; + break; + case 2: + color = 'txt-color-warning'; + title = 'not search performed'; + break; + } + return ''; + }; + + /** + * check systemName if it "might" be a wormhole + * @param systemName + * @returns {boolean} + */ + let isWormholeSystemName = systemName => /^J\d+$/.test(systemName) || systemName === 'Thera'; + + // route status: + // 0: not found + // 1: round (OK) + // 2: not searched + let routeStatus = routeData.skipSearch ? 2 : 0; + + // button class for flag (e.g. "secure" routes) + let flagButtonClass = routeData.flag === 'secure' ? 'txt-color-success' : ''; + + let connectionButton = ''; + let flagButton = ''; + let reloadButton = ''; + let searchButton = ''; + let deleteButton = ''; + + // default row data (e.g. no route found) + let tableRowData = { + systemFromData: routeData.systemFromData, + systemToData: routeData.systemToData, + jumps: { + value: 9999, // for sorting + formatted: '' + }, + avgTrueSec: { + value: '', + formatted: '' + }, + route: { + value: routeStatus === 2 ? 'search now' : 'not found', + data: routeData.route + }, + stargates: routeData.stargates, + jumpbridges: routeData.jumpbridges, + wormholes: routeData.wormholes, + wormholesReduced: routeData.wormholesReduced, + wormholesCritical: routeData.wormholesCritical, + wormholesEOL: routeData.wormholesEOL, + wormholesThera: routeData.wormholesThera, + wormholesSizeMin: routeData.wormholesSizeMin, + excludeTypes: routeData.excludeTypes, + endpointsBubble: routeData.endpointsBubble, + connections: { + value: 0, + button: connectionButton + }, + flag: { + value: routeData.flag, + button: flagButton + }, + reload: { + button: routeData.skipSearch ? searchButton : reloadButton + }, + clear: { + button: deleteButton + }, + maps: routeData.maps, + mapIds: routeData.mapIds //map data (mapIds is "redundant") + }; - let promiseStore = MapUtil.getLocaleData('map', dialogData.mapId); - promiseStore.then(dataStore => { - // selected systems (if already stored) - let systemSelectOptions = []; if( - dataStore && - dataStore.routes + routeData.routePossible === true && + routeData.route.length > 0 ){ - systemSelectOptions = dataStore.routes; + // route data available + routeStatus = 1; + + // add route Data + let routeJumpElements = []; + let avgSecTemp = 0; + + let connectionsData = BaseModule.getConnectionsDataFromMaps(routeData.mapIds); + let prevRouteNodeData = null; + // loop all systems on this route + for(let i = 0; i < routeData.route.length; i++){ + let routeNodeData = routeData.route[i]; + let systemName = routeNodeData.system; + + // fake connection elements between systems ----------------------------------------------------------- + if(prevRouteNodeData){ + let connectionData = BaseModule.findConnectionsData(connectionsData, prevRouteNodeData.system, systemName); + if(!connectionData){ + connectionData = BaseModule.getFakeConnectionData(prevRouteNodeData, routeNodeData, isWormholeSystemName(systemName) ? 'wh' : 'stargate'); + } + let connectionElement = BaseModule.getFakeConnectionElement(connectionData); + + routeJumpElements.push(connectionElement); + } + + // system elements ------------------------------------------------------------------------------------ + let systemSec = Number(routeNodeData.security).toFixed(1).toString(); + let tempSystemSec = systemSec; + + if(tempSystemSec <= 0){ + tempSystemSec = '0-0'; + } + + let systemSecClass = this._config.systemSecurityClassPrefix + tempSystemSec.replace('.', '-'); + + // check for wormhole + let icon = 'fas fa-square-full'; + if(isWormholeSystemName(systemName)){ + icon = 'fas fa-dot-circle'; + } + + let system = ''; + routeJumpElements.push( system ); + + // "source" system is not relevant for average security + if(i > 0){ + avgSecTemp += Number(routeNodeData.security); + } + + prevRouteNodeData = routeNodeData; + } + + let avgSec = ( avgSecTemp / (routeData.route.length - 1)).toFixed(2); + let avgSecForClass = Number(avgSec).toFixed(1); + + if(avgSecForClass <= 0){ + avgSecForClass = '0.0'; + } + + let avgSecClass = this._config.systemSecurityClassPrefix + avgSecForClass.toString().replace('.', '-'); + + tableRowData.jumps = { + value: routeData.routeJumps, + formatted: routeData.routeJumps + }; + + tableRowData.avgTrueSec = { + value: avgSec, + formatted: '' + avgSec + '' + }; + + tableRowData.route.value = routeJumpElements.join(' '); } - // max count of "default" target systems - let maxSelectionLength = Init.routeSearch.maxDefaultCount; - - let data = { - id: config.routeSettingsDialogId, - selectClass: config.systemDialogSelectClass, - systemSelectOptions: systemSelectOptions, - maxSelectionLength: maxSelectionLength + // route status data ------------------------------------------------------------------------------------------ + tableRowData.status = { + value: routeStatus, + formatted: getStatusIcon(routeStatus) }; - requirejs(['text!templates/dialog/route_settings.html', 'mustache'], (template, Mustache) => { + return tableRowData; + } + + /** + * + * @param mapId + * @returns {[]} + */ + getRallySystemsData(mapId){ + let systemsRallyData = []; + let map = MapUtil.getMapInstance(mapId); + if(map){ + let mapContainer = $(map.getContainer()); + let systems = mapContainer.find('.pf-system-info-rally'); + + for(let system of systems){ + system = $(system); + systemsRallyData.push({ + systemId: system.data('systemId'), + name: system.data('name'), + rally: 1 + }); + } + } + return systemsRallyData; + } + + /** + * init system popover (e.g. for setWaypoints) + * @param elements + * @param options + */ + initSystemPopover(elements, options){ + let eventNamespace = 'hideSystemPopup'; + let systemToData = options.systemToData; + + requirejs(['text!templates/tooltip/system_popover.html', 'mustache'], (template, Mustache) => { + let data = { + systemToData: systemToData + }; + let content = Mustache.render(template, data); - let settingsDialog = bootbox.dialog({ - title: 'Route settings', + elements.each(function(){ + let element = $(this); + // destroy "popover" and remove "click" event for animation + element.popover('destroy').off(); + + // init popover and add specific class to it (for styling) + element.popover({ + html: true, + title: systemToData.name, + trigger: 'manual', + placement: 'top', + container: 'body', + content: content + }).data('bs.popover').tip().addClass(Util.config.popoverClass); + }); + + // set popup "close" observer + elements.initPopoverClose(eventNamespace); + + // set "open" trigger on "right click" + // -> this is not supported by the "trigger" param in .popover(); + // -> therefore we need to set it up manually + elements.on('contextmenu', function(e){ + e.preventDefault(); + $(this).popover('show'); + }); + + // set link observer "on shown" event + elements.on('shown.bs.popover', function(){ + let popoverRoot = $(this); + + popoverRoot.data('bs.popover').tip().find('a').on('click', function(){ + // hint: "data" attributes should be in lower case! + let systemData = { + id: $(this).data('systemid'), + name: $(this).data('name') + }; + Util.setDestination('set_destination', 'system', systemData); + + // close popover + popoverRoot.popover('hide'); + }); + }); + }); + } + + /** + * show route settings dialog + * @param dialogData + */ + showSettingsDialog(dialogData){ + Util.getLocalStore('map').getItem(dialogData.mapId).then(dataStore => { + // selected systems (if already stored) + let systemSelectOptions = []; + if( + dataStore && + dataStore.routes + ){ + systemSelectOptions = dataStore.routes; + } + + // max count of "default" target systems + let maxSelectionLength = Init.routeSearch.maxDefaultCount; + + let data = { + id: this._config.routeSettingsDialogId, + selectClass: this._config.systemDialogSelectClass, + systemSelectOptions: systemSelectOptions, + maxSelectionLength: maxSelectionLength + }; + + requirejs(['text!templates/dialog/route_settings.html', 'mustache'], (template, Mustache) => { + let content = Mustache.render(template, data); + + let settingsDialog = bootbox.dialog({ + title: 'Route settings', + message: content, + show: false, + buttons: { + close: { + label: 'cancel', + className: 'btn-default' + }, + success: { + label: ' save', + className: 'btn-success', + callback: e => { + let form = $(e.delegateTarget).find('form'); + // get all system data from select2 + let systemSelectData = form.find('.' + this._config.systemDialogSelectClass).select2('data'); + let systemsToData = []; + + if(systemSelectData.length > 0){ + systemsToData = SystemRouteModule.formSystemSelectData(systemSelectData); + Util.getLocalStore('map').setItem(`${dialogData.mapId}.routes`, systemsToData); + }else{ + Util.getLocalStore('map').removeItem(`${dialogData.mapId}.routes`); + } + + this.showNotify({title: 'Route settings stored', type: 'success'}); + + // (re) draw table + this.drawRouteTable(dialogData.mapId, dialogData.systemFromData, systemsToData); + } + } + } + }); + + settingsDialog.on('shown.bs.modal', e => { + + // init default system select --------------------------------------------------------------------- + // -> add some delay until modal transition has finished + let systemTargetSelect = $(e.target).find('.' + this._config.systemDialogSelectClass); + systemTargetSelect.delay(240).initSystemSelect({key: 'id', maxSelectionLength: maxSelectionLength}); + }); + + // show dialog + settingsDialog.modal('show'); + }); + }); + } + + /** + * show route dialog. User can search for systems and jump-info + * @param dialogData + */ + showFindRouteDialog(dialogData){ + let mapSelectOptions = []; + let currentMapData = Util.getCurrentMapData(); + if(currentMapData !== false){ + for(let i = 0; i < currentMapData.length; i++){ + mapSelectOptions.push({ + id: currentMapData[i].config.id, + name: currentMapData[i].config.name, + selected: (dialogData.mapId === currentMapData[i].config.id) + }); + } + } + + let data = { + id: this._config.routeDialogId, + select2Class: Util.config.select2Class, + selectClass: this._config.systemDialogSelectClass, + routeDialogMapSelectId: this._config.routeDialogMapSelectId, + routeDialogSizeSelectId: this._config.routeDialogSizeSelectId, + systemFromData: dialogData.systemFromData, + systemToData: dialogData.systemToData, + mapSelectOptions: mapSelectOptions, + sizeOptions: MapUtil.allConnectionJumpMassTypes().map(type => ({ + id: type, + name: type, + selected: false + })) + }; + + requirejs(['text!templates/dialog/route.html', 'mustache'], (template, Mustache) => { + let content = Mustache.render(template, data); + + let findRouteDialog = bootbox.dialog({ + title: 'Route finder', message: content, show: false, buttons: { @@ -492,930 +989,222 @@ define([ className: 'btn-default' }, success: { - label: ' save', - className: 'btn-success', - callback: function(){ - let form = this.find('form'); - // get all system data from select2 - let systemSelectData = form.find('.' + config.systemDialogSelectClass).select2('data'); - let systemsTo = []; + label: ' search route', + className: 'btn-primary', + callback: e => { + // add new route to route table + let form = $(e.delegateTarget).find('form'); + let routeDialogData = $(form).getFormValues(); - if( systemSelectData.length > 0 ){ - systemsTo = formSystemSelectData(systemSelectData); - MapUtil.storeLocalData('map', dialogData.mapId, 'routes', systemsTo); - }else{ - MapUtil.deleteLocalData('map', dialogData.mapId, 'routes'); + // validate form + form.validator('validate'); + + // check whether the form is valid + let formValid = form.isValidForm(); + + if(formValid === false){ + // don't close dialog + return false; } - Util.showNotify({title: 'Route settings stored', type: 'success'}); + // get all system data from select2 + // -> we could also get value from "routeDialogData" var, but we need systemName also + let systemSelectData = form.find('.' + this._config.systemDialogSelectClass).select2('data'); - // (re) draw table - drawRouteTable(dialogData.mapId, moduleElement, systemFromData, routesTable, systemsTo); + if( + systemSelectData && + systemSelectData.length === 1 + ){ + let requestData = { + routeData: [{ + mapIds: routeDialogData.mapIds, + systemFromData: dialogData.systemFromData, + systemToData: { + systemId: parseInt(systemSelectData[0].id), + name: systemSelectData[0].text + }, + stargates: routeDialogData.hasOwnProperty('stargates') ? parseInt(routeDialogData.stargates) : 0, + jumpbridges: routeDialogData.hasOwnProperty('jumpbridges') ? parseInt(routeDialogData.jumpbridges) : 0, + wormholes: routeDialogData.hasOwnProperty('wormholes') ? parseInt(routeDialogData.wormholes) : 0, + wormholesReduced: routeDialogData.hasOwnProperty('wormholesReduced') ? parseInt(routeDialogData.wormholesReduced) : 0, + wormholesCritical: routeDialogData.hasOwnProperty('wormholesCritical') ? parseInt(routeDialogData.wormholesCritical) : 0, + wormholesEOL: routeDialogData.hasOwnProperty('wormholesEOL') ? parseInt(routeDialogData.wormholesEOL) : 0, + wormholesThera: routeDialogData.hasOwnProperty('wormholesThera') ? parseInt(routeDialogData.wormholesThera) : 0, + wormholesSizeMin: routeDialogData.wormholesSizeMin || '', + excludeTypes: SystemRouteModule.getLowerSizeConnectionTypes(routeDialogData.wormholesSizeMin), + endpointsBubble: routeDialogData.hasOwnProperty('endpointsBubble') ? parseInt(routeDialogData.endpointsBubble) : 0, + flag: routeDialogData.hasOwnProperty('flag') ? routeDialogData.flag : 'shortest' + }] + }; + + this.getRouteData(requestData, 'callbackAddRouteRows'); + } } } } }); - settingsDialog.on('shown.bs.modal', function(e){ + findRouteDialog.on('show.bs.modal', e => { + $(e.target).initTooltips(); - // init default system select --------------------------------------------------------------------- + // init some dialog/form observer + this.setDialogObserver($(e.target)); + + // init map select ------------------------------------------------------------------------------------ + $(e.target).find('#' + this._config.routeDialogMapSelectId).initMapSelect(); + + // init connection jump size select ------------------------------------------------------------------- + $(e.target).find('#' + this._config.routeDialogSizeSelectId).initConnectionSizeSelect(); + }); + + + findRouteDialog.on('shown.bs.modal', e => { + // init system select live search -------------------------------------------------------------------- // -> add some delay until modal transition has finished - let systemTargetSelect = $(this).find('.' + config.systemDialogSelectClass); - systemTargetSelect.delay(240).initSystemSelect({key: 'id', maxSelectionLength: maxSelectionLength}); + let systemTargetSelect = $(e.target).find('.' + this._config.systemDialogSelectClass); + systemTargetSelect.delay(240).initSystemSelect({key: 'id'}); }); // show dialog - settingsDialog.modal('show'); - }); - }); - }; - - /** - * format select2 system data - * @param {Array} data - * @returns {Array} - */ - let formSystemSelectData = (data) => { - let formattedData = []; - for(let i = 0; i < data.length; i++){ - let tmpData = data[i]; - - formattedData.push({ - systemId: parseInt(tmpData.id), - name: tmpData.text + findRouteDialog.modal('show'); }); } - return formattedData; - }; - - /** - * set event observer for route finder dialog - * @param routeDialog - */ - let setDialogObserver = routeDialog => { - let wormholeCheckbox = routeDialog.find('input[type="checkbox"][name="wormholes"]'); - let wormholeReducedCheckbox = routeDialog.find('input[type="checkbox"][name="wormholesReduced"]'); - let wormholeCriticalCheckbox = routeDialog.find('input[type="checkbox"][name="wormholesCritical"]'); - let wormholeEolCheckbox = routeDialog.find('input[type="checkbox"][name="wormholesEOL"]'); - let wormholeSizeSelect = routeDialog.find('#' + config.routeDialogSizeSelectId); - - // store current "checked" state for each box --------------------------------------------- - let storeCheckboxStatus = function(){ - wormholeReducedCheckbox.data('selectState', wormholeReducedCheckbox.prop('checked')); - wormholeCriticalCheckbox.data('selectState', wormholeCriticalCheckbox.prop('checked')); - wormholeEolCheckbox.data('selectState', wormholeEolCheckbox.prop('checked')); - }; - - // on wormhole checkbox change ------------------------------------------------------------ - let onWormholeCheckboxChange = function(){ - - if( $(this).is(':checked') ){ - wormholeSizeSelect.prop('disabled', false); - - wormholeReducedCheckbox.prop('disabled', false); - wormholeCriticalCheckbox.prop('disabled', false); - wormholeEolCheckbox.prop('disabled', false); - - wormholeReducedCheckbox.prop('checked', wormholeReducedCheckbox.data('selectState')); - wormholeCriticalCheckbox.prop('checked', wormholeCriticalCheckbox.data('selectState')); - wormholeEolCheckbox.prop('checked', wormholeEolCheckbox.data('selectState')); - }else{ - wormholeSizeSelect.prop('disabled', true); - - storeCheckboxStatus(); - - wormholeReducedCheckbox.prop('checked', false); - wormholeReducedCheckbox.prop('disabled', true); - wormholeCriticalCheckbox.prop('checked', false); - wormholeCriticalCheckbox.prop('disabled', true); - wormholeEolCheckbox.prop('checked', false); - wormholeEolCheckbox.prop('disabled', true); - } - }.bind(wormholeCheckbox); - - wormholeCheckbox.on('change', onWormholeCheckboxChange); - - // initial checkbox check - storeCheckboxStatus(); - onWormholeCheckboxChange(); - }; - - /** - * get a connectionsData object that holds all connections for given mapIds (used as cache for route search) - * @param mapIds - * @returns {{}} - */ - let getConnectionsDataFromMaps = (mapIds) => { - let connectionsData = {}; - for(let mapId of mapIds){ - let map = MapUtil.getMapInstance(mapId); - if(map){ - let cacheKey = 'map_' + mapId; - let mapConnectionsData = getCacheData('mapConnections', cacheKey); - - if(!mapConnectionsData){ - mapConnectionsData = {}; - let connections = map.getAllConnections(); - if(connections.length){ - let connectionsData = MapUtil.getDataByConnections(connections); - for(let connectionData of connectionsData){ - let connectionDataCacheKey = getConnectionDataCacheKey(connectionData.sourceName, connectionData.targetName); - - // skip double connections between same systems - if( !mapConnectionsData.hasOwnProperty(connectionDataCacheKey) ){ - mapConnectionsData[connectionDataCacheKey] = { - map: { - id: mapId - }, - connection: { - id: connectionData.id, - type: connectionData.type, - scope: connectionData.scope - }, - source: { - id: connectionData.source, - name: connectionData.sourceName, - alias: connectionData.sourceAlias - }, - target: { - id: connectionData.target, - name: connectionData.targetName, - alias: connectionData.targetAlias - } - }; - } - } - } - - // update cache - setCacheData('mapConnections', cacheKey, mapConnectionsData); - } - - if(connectionsData !== null){ - connectionsData = Object.assign({}, mapConnectionsData, connectionsData); - } - } - } - - return connectionsData; - }; - - /** - * search for a specific connection by "source"/"target"-name inside connectionsData cache - * @param connectionsData - * @param sourceName - * @param targetName - * @returns {{}} - */ - let findConnectionsData = (connectionsData, sourceName, targetName) => { - let connectionDataCacheKey = getConnectionDataCacheKey(sourceName, targetName); - return connectionsData.hasOwnProperty(connectionDataCacheKey) ? - connectionsData[connectionDataCacheKey] : {}; - }; - - /** - * get stargate connection data (default connection type in case connection was not found on a map) - * @param sourceRouteNodeData - * @param targetRouteNodeData - * @returns {{connection: {id: number, type: string[], scope: string}, source: {id: number, name, alias}, target: {id: number, name, alias}}} - */ - let getStargateConnectionData = (sourceRouteNodeData, targetRouteNodeData) => { - return { - connection: { - id: 0, - type: ['stargate'], - scope: 'stargate' - }, - source: { - id: 0, - name: sourceRouteNodeData.system, - alias: sourceRouteNodeData.system - }, - target: { - id: 0, - name: targetRouteNodeData.system, - alias: targetRouteNodeData.system - } - }; - }; - - /** - * get fake connection Element - * @param connectionData - * @returns {string} - */ - let getFakeConnectionElement = (connectionData) => { - let mapId = Util.getObjVal(connectionData, 'map.id') | 0; - let connectionId = Util.getObjVal(connectionData, 'connection.id') | 0; - let scope = Util.getObjVal(connectionData, 'connection.scope'); - let classes = MapUtil.getConnectionFakeClassesByTypes(connectionData.connection.type); - let disabled = !mapId || !connectionId; - - let connectionElement = '
      '; - return connectionElement; - }; - - /** - * format route data from API request into dataTable row format - * @param routeData - * @returns {{}} - */ - let formatRouteData = (routeData) => { - /** - * get status icon for route - * @param status - * @returns {string} + * set event observer for route finder dialog + * @param routeDialog */ - let getStatusIcon= (status) => { - let color = 'txt-color-danger'; - let title = 'route not found'; - switch(status){ - case 1: - color = 'txt-color-success'; - title = 'route exists'; - break; - case 2: - color = 'txt-color-warning'; - title = 'not search performed'; - break; - } + setDialogObserver(routeDialog){ + let wormholeCheckbox = routeDialog.find('input[type="checkbox"][name="wormholes"]'); + let wormholeReducedCheckbox = routeDialog.find('input[type="checkbox"][name="wormholesReduced"]'); + let wormholeCriticalCheckbox = routeDialog.find('input[type="checkbox"][name="wormholesCritical"]'); + let wormholeEolCheckbox = routeDialog.find('input[type="checkbox"][name="wormholesEOL"]'); + let wormholeTheraCheckbox = routeDialog.find('input[type="checkbox"][name="wormholesThera"]'); + let wormholeSizeSelect = routeDialog.find('#' + this._config.routeDialogSizeSelectId); - return ''; - }; - - // route status: - // 0: not found - // 1: round (OK) - // 2: not searched - let routeStatus = routeData.skipSearch ? 2 : 0; - - // button class for flag (e.g. "secure" routes) - let flagButtonClass = routeData.flag === 'secure' ? 'txt-color-success' : ''; - - let connectionButton = ''; - let flagButton = ''; - let reloadButton = ''; - let searchButton = ''; - let deleteButton = ''; - - // default row data (e.g. no route found) - let tableRowData = { - systemFromData: routeData.systemFromData, - systemToData: routeData.systemToData, - jumps: { - value: 9999, // for sorting - formatted: '' - }, - avgTrueSec: { - value: '', - formatted: '' - }, - route: { - value: routeStatus === 2 ? 'search now' : 'not found', - data: routeData.route - }, - stargates: routeData.stargates, - jumpbridges: routeData.jumpbridges, - wormholes: routeData.wormholes, - wormholesReduced: routeData.wormholesReduced, - wormholesCritical: routeData.wormholesCritical, - wormholesEOL: routeData.wormholesEOL, - wormholesSizeMin: routeData.wormholesSizeMin, - excludeTypes: routeData.excludeTypes, - endpointsBubble: routeData.endpointsBubble, - connections: { - value: 0, - button: connectionButton - }, - flag: { - value: routeData.flag, - button: flagButton - }, - reload: { - button: routeData.skipSearch ? searchButton : reloadButton - }, - clear: { - button: deleteButton - }, - maps: routeData.maps, - mapIds: routeData.mapIds //map data (mapIds is "redundant") - }; - - if( - routeData.routePossible === true && - routeData.route.length > 0 - ){ - // route data available - routeStatus = 1; - - // add route Data - let routeJumpElements = []; - let avgSecTemp = 0; - - let connectionsData = getConnectionsDataFromMaps(routeData.mapIds); - let prevRouteNodeData = null; - // loop all systems on this route - for(let i = 0; i < routeData.route.length; i++){ - let routeNodeData = routeData.route[i]; - let systemName = routeNodeData.system; - - // fake connection elements between systems ----------------------------------------------------------- - if(prevRouteNodeData){ - let connectionData = findConnectionsData(connectionsData, prevRouteNodeData.system, systemName); - if(!connectionData.hasOwnProperty('connection')){ - connectionData = getStargateConnectionData(prevRouteNodeData, routeNodeData); - } - let connectionElement = getFakeConnectionElement(connectionData); - - routeJumpElements.push( connectionElement ); - } - - // system elements ------------------------------------------------------------------------------------ - let systemSec = Number(routeNodeData.security).toFixed(1).toString(); - let tempSystemSec = systemSec; - - if(tempSystemSec <= 0){ - tempSystemSec = '0-0'; - } - - let systemSecClass = config.systemSecurityClassPrefix + tempSystemSec.replace('.', '-'); - - // check for wormhole - let icon = 'fas fa-square'; - if( /^J\d+$/.test(systemName) ){ - icon = 'fas fa-dot-circle'; - } - - let system = ''; - routeJumpElements.push( system ); - - // "source" system is not relevant for average security - if(i > 0){ - avgSecTemp += Number(routeNodeData.security); - } - - prevRouteNodeData = routeNodeData; - } - - let avgSec = ( avgSecTemp / (routeData.route.length - 1)).toFixed(2); - let avgSecForClass = Number(avgSec).toFixed(1); - - if(avgSecForClass <= 0){ - avgSecForClass = '0.0'; - } - - let avgSecClass = config.systemSecurityClassPrefix + avgSecForClass.toString().replace('.', '-'); - - tableRowData.jumps = { - value: routeData.routeJumps, - formatted: routeData.routeJumps + // store current "checked" state for each box --------------------------------------------- + let storeCheckboxStatus = () => { + wormholeReducedCheckbox.data('selectState', wormholeReducedCheckbox.prop('checked')); + wormholeCriticalCheckbox.data('selectState', wormholeCriticalCheckbox.prop('checked')); + wormholeEolCheckbox.data('selectState', wormholeEolCheckbox.prop('checked')); + wormholeTheraCheckbox.data('selectState', wormholeTheraCheckbox.prop('checked')); }; - tableRowData.avgTrueSec = { - value: avgSec, - formatted: '' + avgSec + '' + // on wormhole checkbox change ------------------------------------------------------------ + let onWormholeCheckboxChange = e => { + if($(e.target).is(':checked')){ + wormholeSizeSelect.prop('disabled', false); + + wormholeReducedCheckbox.prop('disabled', false); + wormholeCriticalCheckbox.prop('disabled', false); + wormholeEolCheckbox.prop('disabled', false); + wormholeTheraCheckbox.prop('disabled', false); + + wormholeReducedCheckbox.prop('checked', wormholeReducedCheckbox.data('selectState')); + wormholeCriticalCheckbox.prop('checked', wormholeCriticalCheckbox.data('selectState')); + wormholeEolCheckbox.prop('checked', wormholeEolCheckbox.data('selectState')); + wormholeTheraCheckbox.prop('checked', wormholeTheraCheckbox.data('selectState')); + }else{ + wormholeSizeSelect.prop('disabled', true); + + storeCheckboxStatus(); + + wormholeReducedCheckbox.prop('checked', false); + wormholeReducedCheckbox.prop('disabled', true); + wormholeCriticalCheckbox.prop('checked', false); + wormholeCriticalCheckbox.prop('disabled', true); + wormholeEolCheckbox.prop('checked', false); + wormholeEolCheckbox.prop('disabled', true); + wormholeTheraCheckbox.prop('checked', false); + wormholeTheraCheckbox.prop('disabled', true); + } }; - tableRowData.route.value = routeJumpElements.join(' '); + wormholeCheckbox.on('change', onWormholeCheckboxChange); + + // initial checkbox check + storeCheckboxStatus(); + onWormholeCheckboxChange({target: wormholeCheckbox}); } - // route status data ------------------------------------------------------------------------------------------ - tableRowData.status = { - value: routeStatus, - formatted: getStatusIcon(routeStatus) - }; - - return tableRowData; - }; - - /** - * get module element - * @param parentElement - * @param mapId - * @param systemData - * @returns {jQuery} - */ - let getModule = (parentElement, mapId, systemData) => { - let moduleElement = $('
      ').append( - $('
      ', { - class: config.moduleHeadClass - }).append( - $('
      ', { - class: config.moduleHandlerClass - }), - $('
      ', { - class: 'pull-right' - }).append( - $('', { - class: ['fas', 'fa-fw', 'fa-sliders-h', config.moduleHeadlineIconClass, config.moduleHeadlineIconSettingsClass].join(' '), - title: 'settings' - }).attr('data-html', 'true').attr('data-toggle', 'tooltip'), - $('', { - class: ['fas', 'fa-fw', 'fa-search', config.moduleHeadlineIconClass, config.moduleHeadlineIconSearchClass].join(' '), - title: 'find route' - }).attr('data-html', 'true').attr('data-toggle', 'tooltip'), - $('', { - class: ['fas', 'fa-fw', 'fa-sync', config.moduleHeadlineIconClass, config.moduleHeadlineIconRefreshClass].join(' '), - title: 'refresh all' - }).attr('data-html', 'true').attr('data-toggle', 'tooltip') - ), - $('
      ', { - text: 'Routes' - }) - ) - ); - - // save systemFromData to module (data never changes during module lifetime) - // -> we need this later in updateModule() - let systemFromData = { - systemId: systemData.systemId, - name: systemData.name, - }; - - moduleElement.data('systemFromData', systemFromData); - - let table = $('', { - class: ['compact', 'stripe', 'order-column', 'row-border', config.systemInfoRoutesTableClass].join(' ') - }); - moduleElement.append(table); - - // init empty table - let routesTable = table.dataTable( { - paging: false, - ordering: true, - order: [[ 2, 'asc' ], [ 0, 'asc' ]], - info: false, - searching: false, - hover: false, - autoWidth: false, - rowId: 'systemTo', - language: { - emptyTable: 'No routes added' - }, - columnDefs: [ - { - targets: 0, - orderable: true, - title: '', - width: 2, - class: ['text-center'].join(' '), - data: 'status', - render: { - _: 'formatted', - sort: 'value' - } - },{ - targets: 1, - orderable: true, - title: 'system   ', - class: Util.config.popoverTriggerClass, - data: 'systemToData', - render: { - _: 'name', - sort: 'name' - }, - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - // init context menu - $(cell).initSystemPopover({ - systemToData: rowData.systemToData - }); - - $(cell).toggleClass(config.rallyClass, cellData.hasOwnProperty('rally')); - } - },{ - targets: 2, - orderable: true, - title: '  ', - width: 16, - class: 'text-right', - data: 'jumps', - render: { - _: 'formatted', - sort: 'value' - } - },{ - targets: 3, - orderable: true, - title: 'Ø  ', - width: 14, - class: 'text-right', - data: 'avgTrueSec', - render: { - _: 'formatted', - sort: 'value' - } - },{ - targets: 4, - orderable: false, - title: 'route', - class: [config.dataTableRouteCellClass].join(' '), - data: 'route', - render: { - _: 'value' - } - },{ - targets: 5, - title: '', - orderable: false, - searchable: false, - width: 10, - class: ['text-center', config.dataTableActionCellClass].join(' '), - data: 'connections', - render: { - _: 'button' - }, - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - let tempTableApi = this.api(); - - $(cell).on('click', function(e){ - let routeCellElement = tempTableApi.cell( rowIndex, 4 ).nodes().to$(); - - if(routeCellElement.hasClass(config.dataTableJumpCellClass)){ - routeCellElement.toggleClass(config.dataTableJumpCellClass, false); - $(this).find('i').toggleClass('txt-color-orange', false); - }else{ - routeCellElement.toggleClass(config.dataTableJumpCellClass, true); - $(this).find('i').toggleClass('txt-color-orange', true); - } - }); - } - },{ - targets: 6, - title: '', - orderable: false, - searchable: false, - width: 10, - class: ['text-center', config.dataTableActionCellClass].join(' '), - data: 'flag', - render: { - _: 'button' - }, - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - let tempTableApi = this.api(); - - $(cell).on('click', function(e){ - // get current row data (important!) - // -> "rowData" param is not current state, values are "on createCell()" state - rowData = tempTableApi.row( $(cell).parents('tr')).data(); - let routeData = getRouteRequestDataFromRowData( rowData ); - - // overwrite some params - routeData.skipSearch = 0; - routeData.flag = routeData.flag === 'shortest' ? 'secure' : 'shortest'; // toggle - - let context = { - moduleElement: moduleElement, - dataTable: tempTableApi - }; - - let requestData = { - routeData: [routeData] - }; - - getRouteData(requestData, context, callbackAddRouteRows); - }); - } - },{ - targets: 7, - title: '', - orderable: false, - searchable: false, - width: 10, - class: ['text-center', config.dataTableActionCellClass].join(' '), - data: 'reload', - render: { - _: 'button' - }, - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - let tempTableApi = this.api(); - - $(cell).on('click', function(e){ - // get current row data (important!) - // -> "rowData" param is not current state, values are "on createCell()" state - rowData = tempTableApi.row( $(cell).parents('tr')).data(); - let routeData = getRouteRequestDataFromRowData( rowData ); - - // overwrite some params - routeData.skipSearch = 0; - - let context = { - moduleElement: moduleElement, - dataTable: tempTableApi - }; - - let requestData = { - routeData: [routeData] - }; - - getRouteData(requestData, context, callbackAddRouteRows); - }); - } - },{ - targets: 8, - title: '', - orderable: false, - searchable: false, - width: 10, - class: ['text-center', config.dataTableActionCellClass].join(' '), - data: 'clear', - render: { - _: 'button' - }, - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - let tempTableElement = this; - - let confirmationSettings = { - title: 'delete route', - template: Util.getConfirmationTemplate(null, { - size: 'small', - noTitle: true - }), - onConfirm : function(e, target){ - let deleteRowElement = $(cell).parents('tr'); - tempTableElement.api().rows(deleteRowElement).remove().draw(); - } - }; - - // init confirmation dialog - $(cell).confirmation(confirmationSettings); - } - } - ], - drawCallback: function(settings){ - - let animationRows = this.api().rows().nodes().to$().filter(function(){ - return ( - $(this).data('animationStatus') || - $(this).data('animationTimer') - ); - }); - - for(let i = 0; i < animationRows.length; i++){ - let animationRow = $(animationRows[i]); - animationRow.pulseBackgroundColor(animationRow.data('animationStatus')); - animationRow.removeData('animationStatus'); - } - }, - initComplete: function(settings, json){ - // click on "fake connection" ------------------------------------------------------------------------- - $(this).on('click', '.pf-fake-connection', function(){ - let fakeConnectionElement = $(this); - let mapId = fakeConnectionElement.attr('data-mapId'); - let connectionId = fakeConnectionElement.attr('data-connectionId'); - let connection = $().getConnectionById(mapId, connectionId); - - if(connection){ - let map = connection._jsPlumb.instance; - MapUtil.showConnectionInfo(map, [connection]); - } - }); - }, - data: [] // will be added dynamic - }); - - // init tooltips for this module - let tooltipElements = moduleElement.find('[data-toggle="tooltip"]'); - tooltipElements.tooltip({ - container: 'body' - }); - - return moduleElement; - }; - - - /** - * init system popover (e.g. for setWaypoints) - * @param options - */ - $.fn.initSystemPopover = function(options){ - let elements = $(this); - let eventNamespace = 'hideSystemPopup'; - let systemToData = options.systemToData; - - requirejs(['text!templates/tooltip/system_popover.html', 'mustache'], function(template, Mustache){ - let data = { - systemToData: systemToData - }; - - let content = Mustache.render(template, data); - - elements.each(function(){ - let element = $(this); - // destroy "popover" and remove "click" event for animation - element.popover('destroy').off(); - - // init popover and add specific class to it (for styling) - element.popover({ - html: true, - title: systemToData.name, - trigger: 'manual', - placement: 'top', - container: 'body', - content: content - }).data('bs.popover').tip().addClass(Util.config.popoverClass); - }); - - // set popup "close" observer - elements.initPopoverClose(eventNamespace); - - // set "open" trigger on "right click" - // -> this is not supported by the "trigger" param in .popover(); - // -> therefore we need to set it up manually - elements.on('contextmenu', function(e){ - e.preventDefault(); - $(this).popover('show'); - }); - - // set link observer "on shown" event - elements.on('shown.bs.popover', function(){ - let popoverRoot = $(this); - - popoverRoot.data('bs.popover').tip().find('a').on('click', function(){ - // hint: "data" attributes should be in lower case! - let systemData = { - id: $(this).data('systemid'), - name: $(this).data('name') - }; - Util.setDestination('set_destination', 'system', systemData); - - // close popover - popoverRoot.popover('hide'); - }); - }); - }); - }; - - /** - * get data from all Rally Point systems - * @param mapId - * @returns {Array} - */ - let getRallySystemsData = (mapId) => { - let systemsRallyData = []; - let map = MapUtil.getMapInstance(mapId); - if(map){ - let mapContainer = $(map.getContainer()); - let systems = mapContainer.find('.pf-system-info-rally'); - - for(let system of systems){ - system = $(system); - systemsRallyData.push({ - systemId: system.data('systemId'), - name: system.data('name'), - rally: 1 - }); - } + /** + * init module + */ + init(){ + super.init(); } - return systemsRallyData; - }; + /** + * get all jump mass related connection types that have a lower "jumpMassMin" than connectionType + * @param connectionType + * @returns {Array} + */ + static getLowerSizeConnectionTypes(connectionType){ + let lowerSizeTypes = []; + let jumpMassMin = Util.getObjVal(Init.wormholeSizes, connectionType + '.jumpMassMin') || 0; - /** - * update trigger function for this module - * @param moduleElement - * @param data - */ - let updateModule = (moduleElement, data) => { - let routesTableElement = moduleElement.find('.' + config.systemInfoRoutesTableClass); - let routesTable = routesTableElement.DataTable(); + if(jumpMassMin){ + for(let [type, data] of Object.entries(Init.wormholeSizes)){ + if(data.jumpMassMin < jumpMassMin){ + lowerSizeTypes.push(type); + } + } + } + return lowerSizeTypes; + } - switch(data.task){ - case 'showFindRouteDialog': - let dialogData = { - moduleElement: moduleElement, - mapId: data.mapId, - systemFromData: moduleElement.data('systemFromData'), - systemToData: data.systemToData, - dataTable: routesTable - }; - - showFindRouteDialog(dialogData); - break; - case 'findRoute': - drawRouteTable(data.mapId, moduleElement, moduleElement.data('systemFromData'), routesTable, [data.systemToData]); - break; + /** + * format select2 system data + * @param {Array} data + * @returns {Array} + */ + static formSystemSelectData(data){ + let formattedData = []; + for(let i = 0; i < data.length; i++){ + let tmpData = data[i]; + formattedData.push({ + systemId: parseInt(tmpData.id), + name: tmpData.text + }); + } + return formattedData; } }; - /** - * init route module - * -> request route path fore "default" trade hub systems - * @param moduleElement - * @param mapId - * @param systemData - */ - let initModule = (moduleElement, mapId, systemData) => { - - let systemFromData = { - systemId: systemData.systemId, - name: systemData.name - }; - - let routesTableElement = moduleElement.find('.' + config.systemInfoRoutesTableClass); - let routesTable = routesTableElement.DataTable(); - - // init refresh routes ---------------------------------------------------------------------------------------- - moduleElement.find('.' + config.moduleHeadlineIconRefreshClass).on('click', function(e){ - updateRoutesTable(moduleElement, routesTable); - }); - - // init search routes dialog ---------------------------------------------------------------------------------- - moduleElement.find('.' + config.moduleHeadlineIconSearchClass).on('click', function(e){ - let maxRouteSearchLimit = this.Init.routeSearch.limit; - - if(routesTable.rows().count() >= maxRouteSearchLimit){ - // max routes limit reached -> show warning - Util.showNotify({title: 'Route limit reached', text: 'Search is limited by ' + maxRouteSearchLimit, type: 'warning'}); - }else{ - let dialogData = { - moduleElement: moduleElement, - mapId: mapId, - systemFromData: systemFromData, - dataTable: routesTable - }; - - showFindRouteDialog(dialogData); - } - }.bind({ - Init: Init - })); - - // init settings dialog --------------------------------------------------------------------------------------- - moduleElement.find('.' + config.moduleHeadlineIconSettingsClass).on('click', function(e){ - let dialogData = { - mapId: mapId - }; - - showSettingsDialog(dialogData, moduleElement, systemFromData, routesTable); - }); - - // fill routesTable with data -------------------------------------------------------------------------------- - let promiseStore = MapUtil.getLocaleData('map', mapId); - promiseStore.then(function(dataStore){ - // selected systems (if already stored) - let systemsTo = [{ - systemId: 30000142, - name: 'Jita' - }]; - - if( - dataStore && - dataStore.routes - ){ - systemsTo = dataStore.routes; - } - - // add "Rally Point" systems to table - let systemsToData = getRallySystemsData(mapId); - systemsToData.push(...systemsTo); - - drawRouteTable(mapId, moduleElement, systemFromData, routesTable, systemsToData); - }); - }; - - /** - * before module destroy callback - * @param moduleElement - */ - let beforeDestroy = moduleElement => { - let routeTableElement = moduleElement.find('.' + config.systemInfoRoutesTableClass); - let tableApi = routeTableElement.DataTable(); - tableApi.destroy(); - }; - - /** - * get all jump mass related connection types that have a lower "jumpMassMin" than connectionType - * @param connectionType - * @returns {Array} - */ - let getLowerSizeConnectionTypes = connectionType => { - let lowerSizeTypes = []; - let jumpMassMin = Util.getObjVal(Init.wormholeSizes, connectionType + '.jumpMassMin') || 0; - - if(jumpMassMin){ - for(let [type, data] of Object.entries(Init.wormholeSizes)){ - if(data.jumpMassMin < jumpMassMin){ - lowerSizeTypes.push(type); - } - } + SystemRouteModule.isPlugin = false; // module is defined as 'plugin' + SystemRouteModule.scope = 'system'; // module scope controls how module gets updated and what type of data is injected + SystemRouteModule.sortArea = 'b'; // default sortable area + SystemRouteModule.position = 1; // default sort/order position within sortable area + SystemRouteModule.label = 'Routes'; // static module label (e.g. description) + SystemRouteModule.cacheConfig = { + routes: { + ttl: 5, + maxSize: 100 } - - return lowerSizeTypes; }; - return { - config: config, - getModule: getModule, - initModule: initModule, - updateModule: updateModule, - beforeDestroy: beforeDestroy + SystemRouteModule.defaultConfig = { + className: 'pf-system-route-module', // class for module + sortTargetAreas: ['a', 'b', 'c'], // sortable areas where module can be dragged into + headline: 'Routes', + + // dialog + routeDialogId: 'pf-route-dialog', // id for route "search" dialog + routeSettingsDialogId: 'pf-route-settings-dialog', // id for route "settings" dialog + systemDialogSelectClass: 'pf-system-dialog-select', // class for system select Element + + routeDialogMapSelectId: 'pf-route-dialog-map-select', // id for "map" select + routeDialogSizeSelectId: 'pf-route-dialog-size-select', // id for "wh size" select + + // table + systemInfoRoutesTableClass: 'pf-system-route-table', // class for route tables + dataTableActionCellClass: 'pf-table-action-cell', // class for "action" cells + dataTableRouteCellClass: 'pf-table-route-cell', // class for "route" cells + dataTableJumpCellClass: 'pf-table-jump-cell', // class for "route jump" cells + + systemSecurityClassPrefix: 'pf-system-security-', // prefix class for system security level (color) + rallyClass: 'pf-rally', // class for "rally point" style }; + return SystemRouteModule; }); \ No newline at end of file diff --git a/js/app/ui/module/system_signature.js b/js/app/ui/module/system_signature.js index 9cd89c4e..4be5db80 100644 --- a/js/app/ui/module/system_signature.js +++ b/js/app/ui/module/system_signature.js @@ -6,27 +6,3185 @@ define([ 'jquery', 'app/init', 'app/util', + 'module/base', 'bootbox', 'app/counter', 'app/map/map', 'app/map/util', - 'app/lib/cache', 'app/ui/form_element' -], ($, Init, Util, bootbox, Counter, Map, MapUtil, Cache, FormElement) => { +], ($, Init, Util, BaseModule, bootbox, Counter, Map, MapUtil, FormElement) => { 'use strict'; - let config = { - // module info - modulePosition: 4, - moduleName: 'systemSignature', - moduleHeadClass: 'pf-module-head', // class for module header - moduleHandlerClass: 'pf-module-handler-drag', // class for "drag" handler + let SystemSignatureModule = class SystemSignatureModule extends BaseModule { + constructor(config = {}) { + super(Object.assign({}, new.target.defaultConfig, config)); + } - // system signature module - moduleTypeClass: 'pf-system-signature-module', // class for this module + /** + * get custom "metaData" from dataTables API + * @param tableApi + * @returns {*} + */ + getTableMetaData(tableApi){ + return tableApi ? tableApi.init().pfMeta : null; + } + + /** + * get dataTable id + * @param {...string} parts e.g. 'tableType', 'mapId', 'systemId' + * @returns {string} + */ + getTableId(...parts){ + return Util.getTableId(this._config.sigTableId, ...parts); + } + + /** + * get a dataTableApi instance from global cache + * @param mapId + * @param systemId + * @param tableType + * @returns {*} + */ + getDataTableInstance(mapId, systemId, tableType){ + return Util.getDataTableInstance(this._config.sigTableId, mapId, systemId, tableType); + } + + /** + * Update/set tooltip for an element + * @param element + * @param title + */ + updateTooltip(element, title){ + $(element).attr('title', title.toUpperCase()).tooltip('fixTitle').tooltip('setContent'); + } + + /** + * get progressbar + * @param progress + * @returns {HTMLDivElement} + */ + newProgressElement(progress = 0){ + let progressWrapperEl = document.createElement('div'); + progressWrapperEl.classList.add(this._config.moduleHeadlineProgressBarClass); + + let progressEl = document.createElement('div'); + progressEl.classList.add('progress', 'progress-micro'); + + let barEl = document.createElement('div'); + barEl.classList.add('progress-bar', 'progress-bar-success'); + barEl.setAttribute('role', 'progressbar'); + barEl.setAttribute('aria-valuenow', progress.toString()); + barEl.setAttribute('aria-valuemin', '0'); + barEl.setAttribute('aria-valuemax', '100'); + barEl.style.width = progress + 'px'; + barEl.style.willChange = 'width'; + progressEl.append(barEl); + progressWrapperEl.append(progressEl); + + return progressWrapperEl; + } + + /** + * module header + * @returns {HTMLDivElement} + */ + newHeaderElement(text){ + let headEl = super.newHeaderElement(text); + + let progressEl = this.newProgressElement(); + headEl.append(progressEl); + + let progressLabelEl = this.newHeadlineElement('0%'); + progressLabelEl.classList.add('progress-label-right'); + headEl.append(progressLabelEl); + + return headEl; + } + + /** + * render module + * @param mapId + * @param systemData + * @returns {HTMLElement} + */ + render(mapId, systemData){ + this._systemData = systemData; + + this._bodyEl = Object.assign(document.createElement('div'), { + className: this._config.bodyClassName + }); + this.moduleElement.append(this._bodyEl); + + $(this.moduleElement).showLoadingAnimation(); + + // draw "new signature" add table + this.drawSignatureTableNew(); + + // draw signature table + this.drawSignatureTable(); + + this.setModuleObserver(); + + return this.moduleElement; + } + + /** + * draw signature 'info' (preview) table in 'signatureReader' dialog + * @param dialogElement + * @returns {jQuery} + */ + drawSignatureTableInfo(dialogElement){ + let module = this; + + let infoElement = $(dialogElement).find('#' + module._config.sigInfoId); + + let infoTableEl = document.createElement('table'); + infoTableEl.id = module.getTableId('info', module._systemData.mapId, module._systemData.id); + infoTableEl.classList.add('display', 'compact', 'nowrap', module._config.sigTableClass, module._config.sigTableInfoClass); + infoElement.append(infoTableEl); + + + let dataTableOptions = { + tabIndex: -1, + dom: '<"flex-row flex-between"<"flex-col"l><"flex-col flex-grow ' + module._config.tableToolbarStatusClass + '"><"flex-col"fS>>' + + '<"flex-row"<"flex-col flex-grow"tr>>' + + '<"flex-row flex-between"<"flex-col"i><"flex-col"p>>', + initComplete: function(settings, json){ + let tableApi = this.api(); + + module.initCharacterInfoTooltip(this, tableApi); + + tableApi.columns(['action:name']).visible(false); + + Counter.initTableCounter(this, ['created:name', 'updated:name']); + } + }; + + let tableApi = $(infoTableEl).DataTable($.extend(true, dataTableOptions, module.getSignatureDataTableDefaults(module._systemData.mapId, module._systemData))); + + tableApi.on('draw.dt', function(e, settings){ + // xEditable cells should not be editable in this table + $(dialogElement).find('.' + module._config.sigTableInfoClass).find('td.editable').editable('disable'); + }); + + return tableApi; + } + + /** + * draw signature table toolbar (add signature button, scan progress bar + */ + drawSignatureTableNew(){ + let module = this; + + let secondaryTableWrapperEl = document.createElement('div'); + secondaryTableWrapperEl.classList.add(module._config.tableToolsActionClass); + + // create "empty table for new signature + let secondaryTableEl = document.createElement('table'); + secondaryTableEl.id = module.getTableId('secondary', module._systemData.mapId, module._systemData.id); + secondaryTableEl.classList.add('compact', 'stripe', 'row-border', 'nowrap', module._config.sigTableClass, module._config.sigTableSecondaryClass); + secondaryTableWrapperEl.append(secondaryTableEl); + this._bodyEl.append(secondaryTableWrapperEl); + + let dataTableOptions = { + paging: false, + info: false, + searching: false, + tabIndex: -1, + data: [$.extend(true, {}, SystemSignatureModule.emptySignatureData)], + initComplete: function(settings, json){ + let tableApi = this.api(); + + $(this).on('keyup', 'td', {tableApi: tableApi}, function(e){ + module.keyNavigation(tableApi, e); + }); + } + }; + + let tableApi = $(secondaryTableEl).DataTable($.extend(true, dataTableOptions, module.getSignatureDataTableDefaults(module._systemData.mapId, module._systemData))); + + // "Responsive" dataTables plugin did not load automatic (because table is invisible onInit) + // -> manually start "Responsive" extension -> see default dataTable setting for config e.g. breakpoints + new $.fn.dataTable.Responsive(tableApi); + } + + /** + * draw empty signature table + */ + drawSignatureTable(){ + let module = this; + + let primaryTableEl = document.createElement('table'); + primaryTableEl.id = module.getTableId('primary', module._systemData.mapId, module._systemData.id); + primaryTableEl.classList.add('display', 'compact', 'nowrap', module._config.sigTableClass, module._config.sigTablePrimaryClass); + this._bodyEl.append(primaryTableEl); + + let dataTableOptions = { + select: { + style: 'os', + selector: 'td:not(.' + module._config.tableCellActionClass + ')' + }, + tabIndex: -1, + dom: '<"flex-row flex-between"<"flex-col"l><"flex-col flex-grow"B><"flex-col"fS>>' + + '<"flex-row"<"flex-col flex-grow"tr>>' + + '<"flex-row flex-between"<"flex-col"i><"flex-col"p>>', + buttons: { + name: 'tableTools', + buttons: [ + { + name: 'filterGroup', + tag: 'a', + className: module._config.moduleHeadlineIconClass, + text: '', // set by js (xEditable) + init: function(tableApi, node, config){ + + Util.getLocalStore('character').getItem(Util.getCurrentCharacterId()).then(data => { + let prependOptions = [{value: 0, text: 'unknown'}]; + let sourceOptions = module._config.signatureGroupsLabels; + let selectedValues = []; + + if(data && data.filterSignatureGroups && data.filterSignatureGroups.length){ + // select local stored values + selectedValues = data.filterSignatureGroups; + }else{ + // no default group filter options -> show all + selectedValues = sourceOptions.map(option => option.value); + selectedValues.unshift(0); + } + + node.editable({ + mode: 'popup', + type: 'checklist', + showbuttons: false, + onblur: 'submit', + highlight: false, + title: 'filter groups', + value: selectedValues, + prepend: prependOptions, + source: sourceOptions, + inputclass: module._config.editableUnknownInputClass, + display: function(value, sourceData){ + // update filter button label + let html = 'filter'; + let allSelected = value.length >= sourceData.length; + if( !allSelected ){ + html += ' (' + value.length + ')'; + } + $(this).toggleClass('active', !allSelected).html(html); + }, + validate: function(value){ + // convert string to int -> important for further processing + return {newValue: value.map(num => parseInt(num)), msg: null}; + } + }); + + let allOptions = prependOptions.concat(sourceOptions); + + node.on('save', {tableApi: tableApi, sourceOptions: allOptions}, (e, params) => { + // store values local -> IndexDB + Util.getLocalStore('character').setItem(`${Util.getCurrentCharacterId()}.filterSignatureGroups`, params.newValue); + module.searchGroupColumn(e.data.tableApi, params.newValue, e.data.sourceOptions); + }); + + // set initial search string -> even if table ist currently empty + module.searchGroupColumn(tableApi, selectedValues, allOptions); + }); + } + }, + { + name: 'undo', + tag: 'a', + className: module._config.moduleHeadlineIconClass, + text: '', // set by js (xEditable) + init: function(tableApi, node, config){ + + let getIconByAction = action => { + switch(action){ + case 'add': return 'fa-plus txt-color-green'; + case 'delete': return 'fa-times txt-color-redDark'; + case 'edit': return 'fa-pen txt-color-orangeDark'; + case 'undo': return 'fa-undo txt-color-grayLight'; + case 'sync': return 'fa-exchange-alt txt-color-orangeDark'; + } + }; + + node.on('shown', (e, editable) => { + // check if history options loaded -> else forward to error function + if(!editable.input.$input.length){ + editable.options.error.call(editable, ['No record found']); + }else{ + // disable first option + editable.input.$input.first().prop('disabled', true); + // preselect second option + //editable.input.$input.eq(1).prop('checked', true); + + // "fake" radio button behaviour + editable.input.$input.attr('name', 'test').attr('type', 'radio'); + + // preselect second option + editable.input.$input.eq(1).prop('checked', true); + + let labels = editable.container.$form.find('label'); + labels.addClass('radio'); + + for(let span of labels.find('span')){ + span.style.display = 'inline-block'; + span.style.width = '100%'; + let parts = span.innerText.trim().split('%%'); + parts[0] = '' + parts[0] + ''; + parts[1] = ''; + parts[2] = '' + parts[2] + ''; + parts[3] = '' + parts[3] + ''; + span.innerHTML = parts.join(''); + } + + labels.initTooltips(); + } + }); + + let processLockPromise = null; + + node.editable({ + url: Init.path.api + '/SignatureHistory', + ajaxOptions: { + processData: false, + type: 'PUT', + dataType: 'json', //assuming json response + contentType: 'application/json', + beforeSend: function(xhr, settings){ + processLockPromise = tableApi.newProcess('lock'); + }, + }, + params: function(params){ + return JSON.stringify({ + systemId: params.pk, + stamp: params.value[0] + }); + }, + mode: 'popup', + type: 'checklist', + showbuttons: true, + highlight: false, + title: 'historical records', + name: 'history', + pk: module._systemData.id, + source: Init.path.api + '/SignatureHistory/' + module._systemData.id, + sourceOptions: { + type: 'GET', + data: { + mapId: module._systemData.mapId + } + }, + sourceCache: false, // always get new source options on open + display: function(value){ + $(this).html('undo'); + }, + success: (response, newValue) => { + // update signature table + tableApi.endProcess(processLockPromise); + + module.updateSignatureTable(tableApi, response, true); + }, + error: function(errors){ + let errorAll = []; + if(errors && errors.responseText){ //ajax error, errors = xhr object + if(errors.responseJSON && errors.responseJSON.error){ + for(let error of errors.responseJSON.error){ + errorAll.push(error.message); + } + }else{ + //fallback -> other ajax error + errorAll.push(errors.responseText); + } + }else if(errors.length){ + // manual called error + errorAll = errors; + + let form = this.container.$form.addClass('has-error'); + form.find('.editable-buttons').hide(); + form.find('.editable-input').hide(); + form.find('.editable-error-block').html(errorAll.join('
      ')).show(); + } + + return errorAll.join(' | '); + }, + validate: function(value){ + if(!Array.isArray(value) || value.length !== 1){ + return {newValue: value, msg: 'No record selected', field: this}; + } + } + }); + } + }, + { + name: 'selectAll', + tag: 'a', + className: module._config.moduleHeadlineIconClass, + text: 'select all', + action: function(e, tableApi, node, config){ + let rows = tableApi.rows(); + let rowCountAll = rows.count(); + let rowCountSelected = tableApi.rows({selected: true}).count(); + + if(rowCountSelected && (rowCountSelected >= rowCountAll)){ + rows.deselect(); + node.removeClass('active'); + }else{ + rows.select(); + node.addClass('active'); + } + } + }, + { + extend: 'selected', + name: 'delete', + tag: 'a', + className: [module._config.moduleHeadlineIconClass, module._config.sigTableClearButtonClass].join(' '), + text: 'delete (0)', + init: function(tableApi, node, config){ + // call `super` init() for "extend: 'selected'" button + $.fn.dataTable.ext.buttons.selected.init.call(this, tableApi, node, config); + + tableApi.on('select deselect', (e, tableApi, type, indexes) => { + let rowCountAll = tableApi.rows().count(); + let rowCountSelected = tableApi.rows({selected: true}).count(); + let countText = (rowCountSelected >= rowCountAll) ? 'all' : rowCountSelected; + node.find('i+span').text(countText); + }); + }, + action: function(e, tableApi, node, config){ + let selectedRows = tableApi.rows({selected: true}); + if(selectedRows.count()){ + bootbox.confirm('Delete ' + selectedRows.count() + ' signature?', result => { + if(result){ + // for some reason using 'tableApi' as first param in deleteSignature() + // does not work because my custom plugin fkt 'newProcess()' is missing here... + // -> using 'this' seems to work... + module.deleteSignatures(this, selectedRows); + } + }); + } + } + } + ] + }, + initComplete: function(settings, json){ + let tableApi = this.api(); + module.initCharacterInfoTooltip(this, tableApi); + + $(this).on('keyup', 'td', {tableApi: tableApi}, function(e){ + module.keyNavigation(tableApi, e); + }); + + + Counter.initTableCounter(this, ['created:name', 'updated:name']); + } + }; + + let tableApi = $(primaryTableEl).DataTable($.extend(true, dataTableOptions, module.getSignatureDataTableDefaults(module._systemData.mapId, module._systemData))); + + // "Responsive" dataTables plugin did not load automatic (because table is invisible onInit) + // -> manually start "Responsive" extension -> see default dataTable setting for config e.g. breakpoints + new $.fn.dataTable.Responsive(tableApi); + + // "Select" Datatables Plugin + tableApi.select(); + + let buttons = new $.fn.dataTable.Buttons(tableApi, { + dom: { + container: { + tag: 'h5', + className: 'pull-right' + }, + button: { + tag: 'i', + className: ['fas', 'fa-fw', module._config.moduleHeadlineIconClass].join(' '), + }, + buttonLiner: { + tag: null + } + }, + name: 'moduleTools', + buttons: [ + { + name: 'add', + className: ['fa-plus', module._config.moduleHeadlineIconAddClass].join(' '), + titleAttr: 'add', + attr: { + 'data-toggle': 'tooltip', + 'data-html': true + }, + action: function(e, tableApi, node, config){ + module.toggleAddSignature('auto'); + } + }, + { + name: 'reader', + className: ['fa-paste', module._config.moduleHeadlineIconReaderClass].join(' '), + titleAttr: 'signature reader', + attr: { + 'data-toggle': 'tooltip', + 'data-html': true + }, + action: function(e, tableApi, node, config){ + module.showSignatureReaderDialog(tableApi); + } + }, + { + name: 'lazy', + className: ['fa-exchange-alt', module._config.moduleHeadlineIconLazyClass].join(' '), + titleAttr: 'lazy \'delete\' signatures', + attr: { + 'data-toggle': 'tooltip', + 'data-html': true + }, + action: function(e, tableApi, node, config){ + $(node).toggleClass('active'); + } + } + ] + }); + + tableApi.buttons('moduleTools', null).container().appendTo(module.moduleElement.querySelector('.' + module._config.headClassName)); + + // lock table until module is fully rendered + $(module.moduleElement).data('lockPromise', tableApi.newProcess('lock')); + } + + /** + * get dataTables default options for signature tables + * @param mapId + * @param systemData + * @returns {{}} + */ + getSignatureDataTableDefaults(mapId, systemData){ + let module = this; + + /** + * add map/system specific data for each editable field in the sig-table + * @param params + * @returns {*} + */ + let modifyFieldParamsOnSend = params => { + params.systemId = systemData.id; + return params; + }; + + let dataTableDefaults = { + pfMeta: { + 'mapId': mapId, + 'systemId': systemData.id + }, + order: [1, 'asc'], + rowId: rowData => module._config.sigTableRowIdPrefix + rowData.id, + language: { + emptyTable: 'No signatures added', + info: 'Showing _START_ to _END_ of _TOTAL_ signatures', + infoEmpty: 'Showing 0 to 0 of 0 signatures', + infoFiltered: '( from _MAX_ total)', + lengthMenu: 'Show _MENU_', + zeroRecords: 'No signatures recorded' + }, + columnDefs: [ + { + targets: 0, + name: 'status', + orderable: true, + searchable: false, + title: '', + width: 2, + class: ['text-center'].join(' '), + data: 'updated', + type: 'html', + render: { + _: (cellData, type, rowData, meta) => { + let value = ''; + if(cellData && cellData.character){ + value = Util.getStatusInfoForCharacter(cellData.character, 'class'); + } + + if(type === 'display'){ + value = ''; + } + return value; + } + } + },{ + targets: 1, + name: 'id', + orderable: true, + searchable: true, + title: 'id', + type: 'string', + width: 12, + class: [module._config.tableCellFocusClass, module._config.sigTableEditSigNameInput, module._config.fontUppercaseClass].join(' '), + data: 'name', + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let tableApi = this.api(); + + module.updateTooltip(cell, cellData); + + module.editableOnSave(tableApi, cell, [], ['group:name', 'type:name', 'action:name']); + module.editableOnHidden(tableApi, cell); + + $(cell).editable($.extend({ + mode: 'popup', + type: 'text', + title: 'signature id', + name: 'name', + pk: rowData.id || null, + emptytext: '? ? ?', + value: cellData, + inputclass: module._config.fontUppercaseClass, + display: function(value){ + // change display value to first 3 chars -> unicode beware + $(this).text([...$.trim(value)].slice(0, 3).join('').toLowerCase()); + }, + validate: function(value){ + let msg = false; + //let mbLength = [...$.trim(value)].length; // unicode beware + if(! value.trimChars().match(/^[a-zA-Z]{3}-\d{3}$/)){ + msg = 'ID format invalid. E.g.: ABC-123'; + } + + if(msg){ + return {newValue: value, msg: msg, field: this}; + } + }, + params: modifyFieldParamsOnSend, + success: function(response, newValue){ + tableApi.cell(cell).data(newValue); + + $(this).pulseBackgroundColor('changed'); + module.updateTooltip(cell, newValue); + + if(response){ + let newRowData = response[0]; + module.updateSignatureCell(tableApi, rowIndex, 'status:name', newRowData.updated); + module.updateSignatureCell(tableApi, rowIndex, 'updated:name', newRowData.updated.updated); + } + tableApi.draw(); + } + }, SystemSignatureModule.editableDefaults)); + } + },{ + targets: 2, + name: 'group', + orderable: true, + searchable: true, + title: 'group', + type: 'string', // required for sort/filter because initial data type is numeric + width: 40, + class: [module._config.tableCellFocusClass].join(' '), + data: 'groupId', + render: { + sort: module.getGroupLabelById.bind(module), + filter: module.getGroupLabelById.bind(module) + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let tableApi = this.api(); + + module.editableOnSave(tableApi, cell, ['type:name'], ['type:name', 'action:name']); + module.editableOnHidden(tableApi, cell); + module.editableGroupOnShown(cell); + module.editableGroupOnSave(tableApi, cell); + + $(cell).editable($.extend({ + mode: 'popup', + type: 'select', + title: 'group', + name: 'groupId', + pk: rowData.id || null, + emptytext: 'unknown', + onblur: 'submit', + showbuttons: false, + value: cellData, + prepend: [{value: 0, text: ''}], + params: modifyFieldParamsOnSend, + source: module._config.signatureGroupsLabels, + display: function(value, sourceData){ + let selected = $.fn.editableutils.itemsByValue(value, sourceData); + if(selected.length && selected[0].value > 0){ + $(this).html(selected[0].text); + }else{ + $(this).empty(); + } + }, + validate: function(value){ + // convert string to int -> important for further processing + // -> on submit record (new signature) validate() is called and no error should be returned + // value should already be integer + if( !Number.isInteger(value) ){ + return {newValue: parseInt(value) || 0, msg: null}; + } + }, + success: function(response, newValue){ + tableApi.cell(cell).data(newValue); + + $(this).pulseBackgroundColor('changed'); + + if(response){ + let newRowData = response[0]; + module.updateSignatureCell(tableApi, rowIndex, 'status:name', newRowData.updated); + module.updateSignatureCell(tableApi, rowIndex, 'updated:name', newRowData.updated.updated); + } + tableApi.draw(); + + // find related "type" select (same row) and change options --------------------------- + let signatureTypeCell = module.getNeighboringCell(tableApi, cell, 'type:name'); + let signatureTypeField = signatureTypeCell.nodes().to$(); + module.editableSelectCheck(signatureTypeField); + + signatureTypeCell.data(0); + signatureTypeField.editable('setValue', 0); + + + // find "connection" select (same row) and change "enabled" flag ---------------------- + let signatureConnectionCell = module.getNeighboringCell(tableApi, cell, 'connection:name'); + let signatureConnectionField = signatureConnectionCell.nodes().to$(); + + if(newValue === 5){ + // wormhole + module.editableEnable(signatureConnectionField); + }else{ + module.checkConnectionConflicts(); + module.editableDisable(signatureConnectionField); + } + signatureConnectionCell.data(0); + signatureConnectionField.editable('setValue', 0); + } + }, SystemSignatureModule.editableDefaults)); + } + },{ + targets: 3, + name: 'type', + orderable: false, + searchable: false, + title: 'type', + type: 'string', // required for sort/filter because initial data type is numeric + width: 180, + class: [module._config.tableCellFocusClass, module._config.tableCellTypeClass].join(' '), + data: 'typeId', + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let tableApi = this.api(); + + module.editableOnSave(tableApi, cell, ['connection:name'], ['action:name']); + module.editableOnHidden(tableApi, cell); + module.editableTypeOnInit(cell); + module.editableTypeOnShown(cell); + + $(cell).editable($.extend({ + mode: 'popup', + type: 'select', + title: 'type', + name: 'typeId', + pk: rowData.id || null, + emptytext: 'unknown', + onblur: 'submit', + showbuttons: false, + disabled: rowData.groupId <= 0, // initial disabled if groupId not set + value: cellData, + prepend: [{value: 0, text: ''}], + params: modifyFieldParamsOnSend, + source: function(){ + // get current row data (important!) + // -> "rowData" param is not current state, values are "on createCell()" state + let rowData = tableApi.row($(cell).parents('tr')).data(); + + return SystemSignatureModule.getSignatureTypeOptions( + systemData.type.id, + Util.getAreaIdBySecurity(systemData.security), + rowData.groupId, + systemData + ); + }, + display: function(value, sourceData){ + let selected = $.fn.editableutils.itemsByValue(value, sourceData); + if(selected.length && selected[0].value > 0){ + $(this).html(FormElement.formatSignatureTypeSelectionData({text: selected[0].text}, undefined, {showWhSizeLabel: true})); + }else{ + $(this).empty(); + } + }, + validate: function(value){ + // convert string to int -> important for further processing + // -> on submit record (new signature) validate() is called and no error should be returned + // value should already be integer + if( !Number.isInteger(value) ){ + return {newValue: parseInt(value) || 0, msg: null}; + } + }, + success: function(response, newValue){ + tableApi.cell(cell).data(newValue); + + $(this).pulseBackgroundColor('changed'); + + if(response){ + let newRowData = response[0]; + module.updateSignatureCell(tableApi, rowIndex, 'status:name', newRowData.updated); + module.updateSignatureCell(tableApi, rowIndex, 'updated:name', newRowData.updated.updated); + } + tableApi.draw(); + } + }, SystemSignatureModule.editableDefaults)); + } + },{ + targets: 4, + name: 'description', + orderable: false, + searchable: true, + title: 'description', + class: [module._config.tableCellFocusClass, module._config.tableCellActionClass].join(' '), + type: 'html', + data: 'description', + defaultContent: '', + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let tableApi = this.api(); + + module.editableOnSave(tableApi, cell, [], ['action:name']); + module.editableOnHidden(tableApi, cell); + module.editableDescriptionOnShown(cell); + module.editableDescriptionOnHidden(cell); + + $(cell).editable($.extend({ + mode: 'inline', + type: 'textarea', + title: 'description', + name: 'description', + pk: rowData.id || null, + emptytext: '', + onblur: 'submit', + showbuttons: false, + inputclass: module._config.editableDescriptionInputClass, + emptyclass: module._config.moduleHeadlineIconClass, + params: modifyFieldParamsOnSend, + success: function(response, newValue){ + tableApi.cell(cell).data(newValue); + + $(this).pulseBackgroundColor('changed'); + + if(response){ + let newRowData = response[0]; + module.updateSignatureCell(tableApi, rowIndex, 'status:name', newRowData.updated); + module.updateSignatureCell(tableApi, rowIndex, 'updated:name', newRowData.updated.updated); + } + tableApi.draw(); + } + }, SystemSignatureModule.editableDefaults)); + } + },{ + targets: 5, + name: 'connection', + orderable: false, + searchable: false, + title: 'leads to', + type: 'string', // required for sort/filter because initial data type is numeric + className: [module._config.tableCellFocusClass, module._config.tableCellConnectionClass].join(' '), + width: 80, + data: 'connection.id', + defaultContent: 0, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let tableApi = this.api(); + + module.editableOnSave(tableApi, cell, [], ['action:name']); + module.editableOnHidden(tableApi, cell); + module.editableConnectionOnInit(cell); + module.editableConnectionOnShown(tableApi, cell); + module.editableConnectionOnSave(cell); + + $(cell).editable($.extend({ + mode: 'popup', + type: 'select', + title: 'system', + name: 'connectionId', + pk: rowData.id || null, + emptytext: 'unknown', + onblur: 'submit', + showbuttons: false, + disabled: rowData.groupId !== 5, // initial disabled if NON wh + value: cellData, + prepend: [{value: 0, text: ''}], + params: modifyFieldParamsOnSend, + source: function(){ + let activeMap = Util.getMapModule().getActiveMap(); + let mapId = activeMap.data('id'); + return SystemSignatureModule.getSignatureConnectionOptions(mapId, systemData); + }, + display: function(value, sourceData){ + let selected = $.fn.editableutils.itemsByValue(value, sourceData); + if(selected.length && selected[0].value > 0){ + let errorIcon = ' '; + $(this).html(FormElement.formatSignatureConnectionSelectionData({ + text: selected[0].text, + metaData: selected[0].metaData + })).prepend(errorIcon); + }else{ + $(this).empty(); + } + }, + validate: function(value){ + // convert string to int -> important for further processing + // -> on submit record (new signature) validate() is called and no error should be returned + // value should already be integer + if(!Number.isInteger(value)){ + return {newValue: parseInt(value) || 0, msg: null}; + } + }, + success: function(response, newValue){ + tableApi.cell(cell).data(newValue); + + $(this).pulseBackgroundColor('changed'); + + if(response){ + let newRowData = response[0]; + module.updateSignatureCell(tableApi, rowIndex, 'status:name', newRowData.updated); + module.updateSignatureCell(tableApi, rowIndex, 'updated:name', newRowData.updated.updated); + } + tableApi.draw(); + } + }, SystemSignatureModule.editableDefaults)); + } + },{ + targets: 6, + name: 'created', + title: 'created', + searchable: false, + width: 80, + className: ['text-right', module._config.tableCellCounterClass, 'min-screen-d'].join(' '), + data: 'created.created', + defaultContent: '', + },{ + targets: 7, + name: 'updated', + title: 'updated', + searchable: false, + width: 80, + className: ['text-right', module._config.tableCellCounterClass, 'min-screen-d'].join(' '), + data: 'updated.updated', + defaultContent: '' + },{ + targets: 8, + name: 'info', + title: '', + orderable: false, + searchable: false, + width: 10, + class: ['text-center', Util.config.helpClass , Util.config.popoverTriggerClass].join(' '), + data: 'created.created', + defaultContent: '', + render: { + display: (cellData, type, rowData, meta) => { + if(cellData){ + return ''; + } + } + } + },{ + targets: 9, + name: 'action', + title: '', + orderable: false, + searchable: false, + width: 10, + class: ['text-center', module._config.tableCellFocusClass, module._config.tableCellActionClass].join(' '), + data: null, + render: { + display: (cellData, type, rowData, meta) => { + let val = ''; + if(rowData.id){ + val = ''; + } + return val; + } + }, + createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ + let tableApi = this.api(); + + if(rowData.id){ + // delete signature ----------------------------------------------------------------------- + let confirmationSettings = { + title: '---', + template: Util.getConfirmationTemplate(Util.getConfirmationContent([{ + name: 'deleteConnection', + value: '1', + label: 'delete connection', + class: 'pf-editable-warn', + checked: true + }]), { + size: 'small', + noTitle: true + }), + onConfirm: function(e, target){ + // top scroll to top + e.preventDefault(); + + // get form data (check if form tag is not hidden!) from confirmation popover + let tip = target.data('bs.confirmation').tip(); + let form = tip.find('form:not(.hidden)').first(); + let formData = form.getFormValues(); + let deleteOptions = Util.getObjVal(formData, 'deleteConnection') ? formData : {}; + + // add "processing" state or connection that will be deleted as well + if(deleteOptions.deleteConnection){ + let connectionId = tableApi.cell(rowIndex, 'connection:name').data(); + if(connectionId){ + let metaData = module.getTableMetaData(tableApi); + let connection = $().getConnectionById(metaData.mapId, connectionId); + if(connection){ + connection.addType('state_process'); + } + } + } + + let deleteRowElement = $(target).parents('tr'); + let row = tableApi.rows(deleteRowElement); + module.deleteSignatures(tableApi, row, deleteOptions); + }, + onShow: function(e, target){ + // hide "deleteConnection" checkbox if no connectionId linked + let tip = target.data('bs.confirmation').tip(); + let form = tip.find('form').first(); + let connectionId = tableApi.cell(rowIndex, 'connection:name').data(); + form.toggleClass('hidden', !connectionId); + } + }; + + $(cell).confirmation(confirmationSettings); + }else{ + // add new signature ---------------------------------------------------------------------- + $(cell).on('click', {tableApi: tableApi, rowIndex: rowIndex}, function(e){ + e.stopPropagation(); + e.preventDefault(); + + let secondaryTableApi = e.data.tableApi; + let metaData = module.getTableMetaData(secondaryTableApi); + let primaryTableApi = module.getDataTableInstance(metaData.mapId, metaData.systemId, 'primary'); + + let formFields = secondaryTableApi.row(e.data.rowIndex).nodes().to$().find('.editable'); + + // the "hide" makes sure to take care about open editable fields (e.g. description) + // otherwise, changes would not be submitted in this field (not necessary) + formFields.editable('hide'); + + let processLockPromise = null; + let processRequestPromise = null; + + // submit all xEditable fields + formFields.editable('submit', { + url: Init.path.api + '/Signature', + ajaxOptions: { + processData: false, // we need to "process" data in beforeSend() + type: 'PUT', + dataType: 'json', //assuming json response + contentType: 'application/json', + beforeSend: function(xhr, settings){ + settings.data = JSON.stringify(settings.data); + + processLockPromise = primaryTableApi.newProcess('lock'); + processRequestPromise = primaryTableApi.newProcess('request'); + + }, + context: { + primaryTableApi: primaryTableApi, + secondaryTableApi: secondaryTableApi, + } + }, + data: { + systemId: metaData.systemId + }, + error: SystemSignatureModule.editableDefaults.error, // user default xEditable error function + success: function(response, editableConfig){ + let context = editableConfig.ajaxOptions.context; + let primaryTableApi = context.primaryTableApi; + let secondaryTableApi = context.secondaryTableApi; + + let signatureData = response[0]; + let row = module.addSignatureRow(primaryTableApi, signatureData); + if(row){ + primaryTableApi.draw(); + // highlight + row.nodes().to$().pulseBackgroundColor('added'); + + // prepare "add signature" table for new entry -> reset ------------------- + secondaryTableApi.clear().row.add($.extend(true, {}, SystemSignatureModule.emptySignatureData)).draw(); + + Util.showNotify({ + title: 'Signature added', + text: 'Name: ' + signatureData.name, + type: 'success' + }); + + // update signature bar + module.updateScannedSignaturesBar(primaryTableApi, {showNotice: true}); + } + + primaryTableApi.endProcess(processLockPromise); + primaryTableApi.endProcess(processRequestPromise); + } + }); + }); + } + } + } + ], + createdRow: function(row, data, dataIndex){ + // enable tabbing for interactive cells + let focusCells = $(row).find('.' + module._config.tableCellFocusClass + ':not(.editable-disabled)').attr('tabindex', 0); + // enable "return" key -> click() + focusCells.on('keydown', function(e){ + e.stopPropagation(); + if(e.which === 13){ + $(this).trigger('click'); + } + }); + }, + rowCallback: function(){ + let tableApi = this.api(); + let time = Math.floor((new Date()).getTime()); + + tableApi.cells(null, ['updated:name']).every(function(rowIndex, colIndex, tableLoopCount, cellLoopCount){ + let cell = this; + let node = cell.node(); + let cellData = cell.data(); + let diff = time - cellData * 1000; + + // highlight cell: age > 1 day + $(node).toggleClass('txt-color txt-color-warning', diff > 86400000); + }); + } + }; + + return dataTableDefaults; + } + + /** + * toggle primary table visibility + * @param show + */ + toggleAddSignature(show = 'auto'){ + let button = $(this.moduleElement).find('.' + this._config.moduleHeadlineIconAddClass); + let toolsElement = $(this.moduleElement).find('.' + this._config.tableToolsActionClass); + button.toggleClass('active', show === 'auto' ? undefined : show); + + if(toolsElement.is(':visible') && (!show || show === 'auto')){ + // hide container + toolsElement.velocity('stop').velocity({ + opacity: [0, 1], + height: [0, '70px'] + },{ + duration: 150, + display: 'none' + }); + }else if(!toolsElement.is(':visible') && (show || show === 'auto')){ + // show container + toolsElement.velocity('stop').velocity({ + opacity: [1, 0], + height: ['70px', 0] + },{ + duration: 150, + display: 'block', + complete: () => { + this.focusNewSignatureEditableField(); + } + }); + }else if(toolsElement.is(':visible') && show){ + // still visible -> no animation + this.focusNewSignatureEditableField(); + } + } + + /** + * filter table "group" column + * @param tableApi + * @param newValue + * @param sourceOptions + */ + searchGroupColumn(tableApi, newValue, sourceOptions){ + let column = tableApi.column('group:name'); + let pattern = ''; + + if(newValue.length <= sourceOptions.length){ + // all options selected + "prepend" option + let selected = $.fn.editableutils.itemsByValue(newValue, sourceOptions); + + pattern = selected.map(option => option.value !== 0 ? $.fn.dataTable.util.escapeRegex(option.text) : '^$').join('|'); + } + column.search(pattern, true, false).draw(); + } + + /** + * init character info tooltips + * -> e.g. table cell 'question mark' icon + * @param element + * @param tableApi + */ + initCharacterInfoTooltip(element, tableApi){ + element.hoverIntent({ + over: function(e){ + let cellElement = $(this); + let rowData = tableApi.row(cellElement.parents('tr')).data(); + cellElement.addCharacterInfoTooltip(rowData, { + trigger: 'manual', + placement: 'top', + show: true + }); + }, + out: function(e){ + $(this).destroyPopover(); + }, + selector: 'td.' + Util.config.helpClass + }); + } + + /** + * Parsed scan result data (from EVE client) should be enriched with some data + * -> fill up more columns in the 'preview' signature tab.e + * @param signatureData + * @returns {*} + */ + enrichParsedSignatureData(signatureData){ + let characterData = Util.getCurrentCharacter(); + let timestamp = Math.floor((new Date()).getTime() / 1000); + + for(let i = 0; i < signatureData.length; i++){ + signatureData[i].created = { + created: timestamp, + character: characterData + }; + signatureData[i].updated = { + updated: timestamp, + character: characterData + }; + } + + return signatureData; + } + + /** + * parses a copy&paste string from ingame scanning window + * @param clipboard + * @returns {Array} + */ + parseSignatureString(clipboard){ + let signatureData = []; + + if(clipboard.length){ + let signatureRows = clipboard.split(/\r\n|\r|\n/g); + let signatureGroupOptions = this._config.signatureGroupsNames; + let invalidSignatures = 0; + + for(let i = 0; i < signatureRows.length; i++){ + let rowData = signatureRows[i].split(/\t|\s{4}/g); + if(rowData.length === 6){ + // check if sig Type = anomaly or combat site + if(SystemSignatureModule.validSignatureNames.indexOf(rowData[1]) !== -1){ + + let sigGroup = $.trim(rowData[2]).toLowerCase(); + let sigDescription = $.trim(rowData[3]); + let sigGroupId = 0; + let typeId = 0; + + // get groupId by groupName + for(let groupOption of signatureGroupOptions){ + let reg = new RegExp(groupOption.text, 'i'); + if(reg.test(sigGroup)){ + sigGroupId = groupOption.value; + break; + } + } + + // wormhole type cant be extracted from signature string -> skip function call + if(sigGroupId !== 5){ + // try to get "typeId" from description string + let sigDescriptionLowerCase = sigDescription.toLowerCase(); + + let typeOptions = SystemSignatureModule.getSignatureTypeOptions( + this._systemData.type.id, + Util.getAreaIdBySecurity(this._systemData.security), + sigGroupId, + this._systemData + ); + + for(let [key, name] of Object.entries(Util.flattenXEditableSelectArray(typeOptions))){ + if(name.toLowerCase() === sigDescriptionLowerCase){ + typeId = parseInt(key); + break; + } + } + + // set signature name as "description" if signature matching failed + sigDescription = (typeId === 0) ? sigDescription : ''; + }else{ + sigDescription = ''; + } + + // map array values to signature Object + let signatureObj = { + systemId: this._systemData.id, + name: $.trim(rowData[0]).toLowerCase(), + groupId: sigGroupId, + typeId: typeId, + description: sigDescription + }; + + signatureData.push(signatureObj); + }else{ + invalidSignatures++; + } + } + } + + if(invalidSignatures > 0){ + let notification = invalidSignatures + ' / ' + signatureRows.length + ' signatures invalid'; + Util.showNotify({title: 'Invalid signature(s)', text: notification, type: 'warning'}); + } + } + + return signatureData; + } + + /** + * updates the signature table with all signatures pasted into the "signature reader" dialog + * -> Hint: copy&paste signature data (without any open dialog) will add signatures as well + * @param tableApi + * @param clipboard data stream + * @param options + */ + updateSignatureTableByClipboard(tableApi, clipboard, options){ + if(tableApi.hasProcesses('request')){ + console.info('Update signature table By clipboard locked.'); + return; + } + + let saveSignatureData = signatureData => { + // lock update function until request is finished + let processLockPromise = tableApi.newProcess('lock'); + let processRequestPromise = tableApi.newProcess('request'); + + Util.request( + 'POST', + 'Signature', + [], + { + signatures: signatureData, + deleteOld: options.deleteOld || 0, + deleteConnection: options.deleteConnection || 0, + systemId: parseInt(this._systemData.id) + }, + { + tableApi: tableApi, + processLockPromise: processLockPromise, + processRequestPromise: processRequestPromise + }, + context => { + context.tableApi.endProcess(context.processLockPromise); + context.tableApi.endProcess(context.processRequestPromise); + }).then( + payload => { + // updates table with new/updated signature information + this.updateSignatureTable(payload.context.tableApi, payload.data, !!options.deleteOld); + }, + Util.handleAjaxErrorResponse + ); + }; + + // parse input stream + let signatureData = this.parseSignatureString(clipboard); + if(signatureData.length > 0){ + // valid signature data parsed + + // check if signatures will be added to a system where character is currently in + // if character is not in any system -> id === undefined -> no "confirmation required + let currentLocationData = Util.getCurrentLocationData(); + if( + currentLocationData.id && + currentLocationData.id !== this._systemData.systemId + ){ + let systemNameStr = (this._systemData.name === this._systemData.alias) ? + '"' + this._systemData.name + '"' : + '"' + this._systemData.alias + '" (' + this._systemData.name + ')'; + systemNameStr = '' + systemNameStr + ''; + + let msg = 'Update signatures in ' + systemNameStr + ' ? This is not your current location, "' + currentLocationData.name + '" !'; + bootbox.confirm(msg, result => { + if(result){ + saveSignatureData(signatureData); + } + }); + }else{ + // current system selected -> no "confirmation" required + saveSignatureData(signatureData); + } + } + } + + /** + * deletes signature rows from signature table + * @param tableApi + * @param rows + * @param deleteOptions + */ + deleteSignatures(tableApi, rows, deleteOptions = {}){ + let module = this; + // get unique id array from rows -> in case there are 2 rows with same id -> you never know + let signatureIds = [...new Set(rows.data().toArray().map(rowData => rowData.id))]; + let metaData = module.getTableMetaData(tableApi); + let data = Object.assign(deleteOptions, { + systemId: metaData.systemId + }); + + let processRequestPromise = tableApi.newProcess('request'); + + Util.request('DELETE', 'Signature', signatureIds, data, { + tableApi: tableApi, + processRequestPromise: processRequestPromise + }, + context => { + context.tableApi.endProcess(context.processRequestPromise); + }).then( + payload => { + let tableApi = payload.context.tableApi; + + // promises for all delete rows + let promisesToggleRow = []; + // get deleted rows -> match with response data + let rows = tableApi.rows((idx, rowData, node) => payload.data.includes(rowData.id)); + // toggle hide animation for rows one by one... + rows.every(function (rowIdx, tableLoop, rowLoop) { + let row = this; + let rowElement = row.nodes().to$(); + + rowElement.pulseBackgroundColor('deleted'); + + promisesToggleRow.push(module.toggleTableRow(rowElement)); + }); + + // ... all hide animations done ... + Promise.all(promisesToggleRow).then(payloads => { + // ... get deleted (hide animation done) and delete them + tableApi.rows(payloads.map(payload => payload.row)).remove().draw(); + + // update signature bar + module.updateScannedSignaturesBar(tableApi, {showNotice: false}); + + // update connection conflicts + module.checkConnectionConflicts(); + + let notificationOptions = { + type: 'success' + }; + if (payloads.length === 1) { + notificationOptions.title = 'Signature deleted'; + } else { + notificationOptions.title = payloads.length + ' Signatures deleted '; + } + module.showNotify(notificationOptions); + }); + }, + Util.handleAjaxErrorResponse + ); + } + + /** + * updates a single cell with new data (e.g. "updated" cell) + * @param tableApi + * @param rowIndex + * @param columnSelector + * @param data + */ + updateSignatureCell(tableApi, rowIndex, columnSelector, data){ + tableApi.cell(rowIndex, columnSelector).data(data); + } + + /** + * check connectionIds for conflicts (multiple signatures -> same connection) + * -> show "conflict" icon next to select + */ + checkConnectionConflicts(){ + setTimeout(() => { + let connectionSelectsSelector = [this._config.sigTablePrimaryClass, this._config.sigTableSecondaryClass].map( + tableClass => '.' + tableClass + ' .' + this._config.tableCellConnectionClass + '.editable' + ).join(', '); + + let connectionSelects = $(connectionSelectsSelector); + let connectionIds = []; + let duplicateConnectionIds = []; + let groupedSelects = []; + + connectionSelects.each(function(){ + let select = $(this); + let value = parseInt(select.editable('getValue', true) )|| 0; + + if( + connectionIds.indexOf(value) > -1 && + duplicateConnectionIds.indexOf(value) === -1 + ){ + // duplicate found + duplicateConnectionIds.push(value); + } + + if(groupedSelects[value] !== undefined){ + groupedSelects[value].push(select[0]); + }else{ + groupedSelects[value] = [select[0]]; + } + + connectionIds.push(value); + }); + + // update "conflict" icon next to select label for connectionIds + connectionSelects.each(function(){ + let select = $(this); + let value = parseInt(select.editable('getValue', true) )|| 0; + let conflictIcon = select.find('.fa-exclamation-triangle'); + if( + duplicateConnectionIds.indexOf(value) > -1 && + groupedSelects[value].indexOf(select[0]) > -1 + ){ + conflictIcon.removeClass('hide'); + }else{ + conflictIcon.addClass('hide'); + } + }); + }, 200); + } + + /** + * get group label by groupId + * @param groupId + * @returns {string} + */ + getGroupLabelById(groupId){ + let options = this._config.signatureGroupsLabels.filter(option => option.value === groupId); + return options.length ? options[0].text : ''; + } + + /** + * helper function - get cell by columnSelector from same row as cell + * @param tableApi + * @param cell + * @param columnSelector + * @returns {*} + */ + getNeighboringCell(tableApi, cell, columnSelector){ + return tableApi.cell(tableApi.cell(cell).index().row, columnSelector); + } + + /** + * get next cell by columnSelector + * @param tableApi + * @param cell + * @param columnSelectors + * @returns {*} + */ + searchNextCell(tableApi, cell, columnSelectors){ + if(columnSelectors.length){ + // copy selectors -> .shift() modifies the orig array, important! + columnSelectors = columnSelectors.slice(0); + let nextCell = this.getNeighboringCell(tableApi, cell, columnSelectors.shift()); + let nextCellElement = nextCell.nodes().to$(); + if( nextCellElement.data('editable') ){ + // cell is xEditable field -> skip "disabled" OR check value + let nextCellValue = nextCellElement.editable('getValue', true); + if( + [0, null].includes(nextCellValue) && + !nextCellElement.data('editable').options.disabled + ){ + // xEditable value is empty + return nextCell; + }else{ + // search next cell + return this.searchNextCell(tableApi, cell, columnSelectors); + } + }else if( nextCell.index().column === tableApi.column(-1).index() ){ + // NO xEditable cell BUT last column (=> action cell) -> OK + return nextCell; + }else{ + console.error('No cell found for activation!'); + } + }else{ + // return origin cell + return tableApi.cell(cell); + } + } + + /** + * make cell active -> focus() + show xEditable + * @param cell + */ + activateCell(cell){ + let cellElement = cell.nodes().to$(); + // check if cell is visible and not e.g. immediately filtered out by a search filter + // -> https://github.com/exodus4d/pathfinder/issues/865 + if(cellElement.is(':visible')){ + // NO xEditable + cellElement.focus(); + + if(cellElement.data('editable')){ + // cell is xEditable field -> show xEditable form + cellElement.editable('show'); + } + } + } + + /** + * search neighboring cell (same row) and set "active" -> show editable + * @param tableApi + * @param cell + * @param columnSelectors + */ + activateNextCell(tableApi, cell, columnSelectors){ + let nextCell = this.searchNextCell(tableApi, cell, columnSelectors); + this.activateCell(nextCell); + } + + /** + * helper function - set 'save' observer for xEditable cell + * -> show "neighboring" xEditable field + * @param tableApi + * @param cell + * @param columnSelectorsAjax - used for Ajax save (edit signature) + * @param columnSelectorsDry - used for dry save (new signature) + */ + editableOnSave(tableApi, cell, columnSelectorsAjax = [], columnSelectorsDry = []){ + $(cell).on('save', (e, params) => { + if(params.response){ + // send by Ajax + this.activateNextCell(tableApi, cell, columnSelectorsAjax); + }else{ + // dry save - no request + this.activateNextCell(tableApi, cell, columnSelectorsDry); + } + }); + } + + /** + * helper function - set 'hidden' observer for xEditable cell + * -> set focus() on xEditable field + * @param tableApi + * @param cell + */ + editableOnHidden(tableApi, cell){ + $(cell).on('hidden', function(e, reason){ + // re-focus element on close (keyboard navigation) + // 'save' event handles default focus (e.g. open new xEditable) + // 'hide' handles all the rest (experimental) + if(reason !== 'save'){ + this.focus(); + } + }); + } + + /** + * helper function - set 'shown' observer for xEditable type cell + * -> enable Select2 for xEditable form + * @param cell + */ + editableGroupOnShown(cell){ + $(cell).on('shown', (e, editable) => { + let inputField = editable.input.$input; + inputField.addClass('pf-select2').initSignatureGroupSelect(); + }); + } + + /** + * helper function - set 'save' observer for xEditable group cell + * -> update scanned signature bar + * @param tableApi + * @param cell + */ + editableGroupOnSave(tableApi, cell){ + $(cell).on('save', (e, params) => { + if(params.response){ + // send by Ajax + this.updateScannedSignaturesBar(tableApi, {showNotice: true}); + } + }); + } + + /** + * helper function - set 'init' observer for xEditable type cell + * -> disable xEditable field if no options available + * @param cell + */ + editableTypeOnInit(cell){ + $(cell).on('init', (e, editable) => { + if(!editable.options.source().length){ + this.editableDisable($(e.target)); + } + }); + } + + /** + * helper function - set 'shown' observer for xEditable type cell + * -> enable Select2 for xEditable form + * @param cell + */ + editableTypeOnShown(cell){ + $(cell).on('shown', (e, editable) => { + // destroy possible open popovers (e.g. wormhole types) + $(e.target).destroyPopover(true); + + let inputField = editable.input.$input; + let hasOptGroups = inputField.has('optgroup').length > 0; + inputField.addClass('pf-select2').initSignatureTypeSelect({}, hasOptGroups); + }); + } + + /** + * helper function - set 'shown' observer for xEditable description cell + * -> change height for "new signature" table wrapper + * @param cell + */ + editableDescriptionOnShown(cell){ + $(cell).on('shown', (e, editable) => { + $(e.target).parents('.' + this._config.tableToolsActionClass).css('height', '+=35px'); + }); + } + + /** + * helper function - set 'hidden' observer for xEditable description cell + * -> change height for "new signature" table wrapper + * @param cell + */ + editableDescriptionOnHidden(cell){ + $(cell).on('hidden', (e, editable) => { + $(cell).parents('.' + this._config.tableToolsActionClass).css('height', '-=35px'); + }); + } + + /** + * helper function - set 'init' observer for xEditable connection cell + * -> set focus() on xEditable field + * @param cell + */ + editableConnectionOnInit(cell){ + $(cell).on('init', (e, editable) => { + if(editable.value > 0){ + // empty connection selects ON INIT don´t make a difference for conflicts + this.checkConnectionConflicts(); + } + }); + } + + /** + * helper function - set 'shown' observer for xEditable connection cell + * -> enable Select2 for xEditable form + * @param tableApi + * @param cell + */ + editableConnectionOnShown(tableApi, cell){ + $(cell).on('shown', (e, editable) => { + let inputField = editable.input.$input; + + if(!$(tableApi.table().node()).hasClass(this._config.sigTablePrimaryClass)){ + // we need the primary table API to get selected connections + let metaData = this.getTableMetaData(tableApi); + tableApi = this.getDataTableInstance(metaData.mapId, metaData.systemId, 'primary'); + } + + // Select2 init would work without passing select options as "data", Select2 would grap data from DOM + // -> We want to pass "meta" data for each option into Select2 for formatting + let selectOptions = Util.convertXEditableOptionsToSelect2(editable); + + // for better UX, systems that are already linked to a wh signatures should be "disabled" + // -> and grouped into a new + let linkedConnectionIds = tableApi.column('connection:name').data().toArray(); + linkedConnectionIds = linkedConnectionIds.filter(id => id > 0); + + if(linkedConnectionIds.length){ + let groupedSelectOptions = []; + let newSelectOptionGroupDisabled = []; + for(let selectOptionGroup of selectOptions){ + if(Array.isArray(selectOptionGroup.children)){ + let newSelectOptionGroup = []; + for(let option of selectOptionGroup.children){ + if(!option.selected && linkedConnectionIds.includes(option.id)){ + // connection already linked -> move to "disabled" group + option.disabled = true; + newSelectOptionGroupDisabled.push(option); + }else{ + // connection is available for link + newSelectOptionGroup.push(option); + } + } + + if(newSelectOptionGroup.length){ + groupedSelectOptions.push({ + text: selectOptionGroup.text, + children: newSelectOptionGroup + }); + } + }else{ + // option has no children -> is prepend (id = 0) option + groupedSelectOptions.push(selectOptionGroup); + } + } + + if(newSelectOptionGroupDisabled.length){ + groupedSelectOptions.push({ + text: 'linked', + children: newSelectOptionGroupDisabled + }); + } + + selectOptions = groupedSelectOptions; + } + + let options = { + data: selectOptions + }; + + inputField.addClass('pf-select2').initSignatureConnectionSelect(options); + }); + } + + /** + * helper function - set 'save' observer for xEditable connection cell + * -> check connection conflicts + * @param cell + */ + editableConnectionOnSave(cell){ + $(cell).on('save', (e, params) => { + this.checkConnectionConflicts(); + }); + } + + /** + * enable xEditable element + * @param element + */ + editableEnable(element){ + element.editable('enable'); + // (re)-enable focus on element by tabbing, xEditable removes "tabindex" on 'disable' + element.attr('tabindex', 0); + } + + /** + * disable xEditable element + * @param element + */ + editableDisable(element){ + element.editable('disable'); + // xEditable sets 'tabindex = -1' + } + + /** + * en/disables xEditable element (select) + * -> disables if there are no source options found + * @param element + */ + editableSelectCheck(element){ + if(element.data('editable')){ + let options = element.data('editable').options.source(); + if(options.length > 0){ + this.editableEnable(element); + }else{ + this.editableDisable(element); + } + } + } + + /** + * open xEditable input field in "new Signature" table + */ + focusNewSignatureEditableField(){ + $(this.moduleElement).find('.' + this._config.sigTableSecondaryClass) + .find('td.' + this._config.sigTableEditSigNameInput).editable('show'); + } + + /** + * set module observer + */ + setModuleObserver(){ + // add signature toggle + $(this.moduleElement).on('pf:showSystemSignatureModuleAddNew', e => { + this.toggleAddSignature(true); + }); + + // event listener for global "paste" signatures into the page + $(this.moduleElement).on('pf:updateSystemSignatureModuleByClipboard', (e, clipboard) => { + let signatureOptions = { + deleteOld: this.getLazyUpdateToggleStatus(), + deleteConnection: 0 + }; + + // "disable" lazy update icon -> prevents accidental removal for next paste #724 + $(this.getLazyUpdateToggleElement()).toggleClass('active', false); + + this.updateSignatureTableByClipboard( + this.getDataTableInstance(this._systemData.mapId, this._systemData.id, 'primary'), + clipboard, + signatureOptions + ); + }); + + // signature column - "type" popover + MapUtil.initWormholeInfoTooltip( + $(this.moduleElement).find('.' + this._config.sigTableClass), + '.editable-click:not(.editable-open) span[class^="pf-system-sec-"]' + ); + + // init tooltips + $(this.moduleElement).initTooltips(); + } + + /** + * key (arrow) navigation inside a table -> set cell focus() + * @param tableApi + * @param e + */ + keyNavigation(tableApi, e){ + let offset; + if(e.keyCode === 37){ + offset = [-1, 0]; + }else if(e.keyCode === 38){ + offset = [0, -1]; + }else if(e.keyCode === 39){ + offset = [1, 0]; + }else if(e.keyCode === 40){ + offset = [0, 1]; + } + + if(Array.isArray(offset)){ + /** + * check if cellIndex is out of table range + * @param tableApi + * @param cellIndex + * @returns {*} + */ + let checkIndex = (tableApi, cellIndex) => { + if(cellIndex[0] < 0){ + cellIndex[0] = tableApi.column(':last').nodes().to$().index(); // last column + } + if(cellIndex[0] > tableApi.column(':last').nodes().to$().index()){ + cellIndex[0] = 0; // first column + } + if(cellIndex[1] < 0){ + cellIndex[1] = tableApi.row(':last', {search: 'applied'}).nodes().to$().index(); // last row + } + if(cellIndex[1] > tableApi.row(':last', {search: 'applied'}).nodes().to$().index()){ + cellIndex[1] = 0; // first row + } + return cellIndex; + }; + + /** + * recursive search next cell + * @param tableApi + * @param cellOrigin + * @param offset + * @returns {*} + */ + let searchCell = (tableApi, cellOrigin, offset) => { + // we need to get the current cell indexes from DOM (not internal DataTables indexes) + let nodeOrig = cellOrigin.nodes(); + let colIndex = nodeOrig.to$().index(); + let rowIndex = nodeOrig.to$().closest('tr').index(); + let currentCellIndex = [colIndex, rowIndex]; + let newCellIndex = currentCellIndex.map((index, i) => index + offset[i]); + // check if cell index is inside table dimensions + newCellIndex = checkIndex(tableApi, newCellIndex); + + let cell = tableApi.cell(':eq(' + newCellIndex[1] + ')', ':eq(' + newCellIndex[0] + ')', {search: 'applied'}); + let node = cell.node(); + + if( + !node.hasAttribute('tabindex') || + parseInt(node.getAttribute('tabindex')) < 0 + ){ + // cell can not be focused -> search next + cell = searchCell(tableApi, cell, offset); + } + return cell; + }; + + let cell = searchCell(tableApi, tableApi.cell(e.target), offset); + cell.node().focus(); + } + } + + /** + * show/hides a table rowElement + * @param rowElement + */ + toggleTableRow(rowElement){ + + let toggleTableRowExecutor = (resolve, reject) => { + let cellElements = rowElement.children('td'); + let duration = 350; + // wrap each rowElement - * @param rowElement - */ - let toggleTableRow = rowElement => { - - let toggleTableRowExecutor = (resolve, reject) => { - let cellElements = rowElement.children('td'); - let duration = 350; - // wrap each ").appendTo(C)),I.nTBody=n[0],0===(n=C.children("tfoot")).length&&t.length>0&&(""!==I.oScroll.sX||""!==I.oScroll.sY)&&(n=e("").appendTo(C)),0===n.length||0===n.children().length?C.addClass(k.sNoFooter):n.length>0&&(I.nTFoot=n[0],B(I.aoFooter,I.nTFoot)),m.aaData)for(g=0;g/g,Qe=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,Ze=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)","g"),Ke=/[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi,Je=function(e){return!e||!0===e||"-"===e},et=function(e){var t=parseInt(e,10);return!isNaN(t)&&isFinite(e)?t:null},tt=function(e,t){return Xe[t]||(Xe[t]=RegExp(ft(t),"g")),"string"==typeof e&&"."!==t?e.replace(/\./g,"").replace(Xe[t],"."):e},nt=function(e,t,n){var r="string"==typeof e;return!!Je(e)||(t&&r&&(e=tt(e,t)),n&&r&&(e=e.replace(Ke,"")),!isNaN(parseFloat(e))&&isFinite(e))},rt=function(e,t,n){return!!Je(e)||((Je(e)||"string"==typeof e)&&!!nt(e.replace(Ge,""),t,n)||null)},ot=function(e,t,n){var o=[],a=0,i=e.length;if(n!==r)for(;ae.length))for(var n=(t=e.slice().sort())[0],r=1,o=t.length;r")[0],ht=pt.textContent!==r,mt=/<.*?>/g,gt=Ve.util.throttle,vt=[],yt=Array.prototype;Ue=function(t,n){if(!(this instanceof Ue))return new Ue(t,n);var r=[],o=function(t){(t=function(t){var n,r,o=Ve.settings,a=e.map(o,function(e){return e.nTable});return t?t.nTable&&t.oApi?[t]:t.nodeName&&"table"===t.nodeName.toLowerCase()?-1!==(n=e.inArray(t,a))?[o[n]]:null:t&&"function"==typeof t.settings?t.settings().toArray():("string"==typeof t?r=e(t):t instanceof e&&(r=t),r?r.map(function(){return-1!==(n=e.inArray(this,a))?o[n]:null}).toArray():void 0):[]}(t))&&(r=r.concat(t))};if(e.isArray(t))for(var a=0,i=t.length;ae?new Ue(t[e],this[e]):null},filter:function(e){var t=[];if(yt.filter)t=yt.filter.call(this,e,this);else for(var n=0,r=this.length;n").addClass(n),e("td",r).addClass(n).html(t)[0].colSpan=g(a),i.push(r[0]))};s(t,n),o._details&&o._details.detach(),o._details=e(i),o._detailsShow&&o._details.insertAfter(o.nTr)}return this}),ze(["row().child.show()","row().child().show()"],function(){return Tt(this,!0),this}),ze(["row().child.hide()","row().child().hide()"],function(){return Tt(this,!1),this}),ze(["row().child.remove()","row().child().remove()"],function(){return _t(this),this}),ze("row().child.isShown()",function(){var e=this.context;return e.length&&this.length&&e[0].aoData[this[0]]._detailsShow||!1});var Dt=/^([^:]+):(name|visIdx|visible)$/,It=function(e,t,n,r,o){n=[],r=0;for(var a=o.length;r=0?n:i.length+n];if("function"==typeof t){var o=St(r,a);return e.map(i,function(e,n){return t(n,It(r,n,0,0,o),l[n])?n:null})}var c="string"==typeof t?t.match(Dt):"";if(c)switch(c[2]){case"visIdx":case"visible":if((n=parseInt(c[1],10))<0){var u=e.map(i,function(e,t){return e.bVisible?t:null});return[u[u.length+n]]}return[h(r,n)];case"name":return e.map(s,function(e,t){return e===c[1]?t:null});default:return[]}return t.nodeName&&t._DT_CellIndex?[t._DT_CellIndex.column]:(n=e(l).filter(t).map(function(){return e.inArray(this,l)}).toArray()).length||!t.nodeName?n:(n=e(t).closest("*[data-dt-column]")).length?[n.data("dt-column")]:[]},r,a)},1);return o.selector.cols=t,o.selector.opts=n,o}),We("columns().header()","column().header()",function(){return this.iterator("column",function(e,t){return e.aoColumns[t].nTh},1)}),We("columns().footer()","column().footer()",function(){return this.iterator("column",function(e,t){return e.aoColumns[t].nTf},1)}),We("columns().data()","column().data()",function(){return this.iterator("column-rows",It,1)}),We("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(e,t){return e.aoColumns[t].mData},1)}),We("columns().cache()","column().cache()",function(e){return this.iterator("column-rows",function(t,n,r,o,a){return at(t.aoData,a,"search"===e?"_aFilterData":"_aSortData",n)},1)}),We("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(e,t,n,r,o){return at(e.aoData,o,"anCells",t)},1)}),We("columns().visible()","column().visible()",function(t,n){var o=this.iterator("column",function(n,o){if(t===r)return n.aoColumns[o].bVisible;var a,i,s,l=n.aoColumns,c=l[o],u=n.aoData;if(t!==r&&c.bVisible!==t){if(t){var d=e.inArray(!0,ot(l,"bVisible"),o+1);for(a=0,i=u.length;an;return!0},Ve.isDataTable=Ve.fnIsDataTable=function(t){var n=e(t).get(0),r=!1;return t instanceof Ve.Api||(e.each(Ve.settings,function(t,o){var a=o.nScrollHead?e("table",o.nScrollHead)[0]:null,i=o.nScrollFoot?e("table",o.nScrollFoot)[0]:null;o.nTable!==n&&a!==n&&i!==n||(r=!0)}),r)},Ve.tables=Ve.fnTables=function(t){var n=!1;e.isPlainObject(t)&&(n=t.api,t=t.visible);var r=e.map(Ve.settings,function(n){if(!t||t&&e(n.nTable).is(":visible"))return n.nTable});return n?new Ue(r):r},Ve.camelToHungarian=a,ze("$()",function(t,n){var r=this.rows(n).nodes();r=e(r);return e([].concat(r.filter(t).toArray(),r.find(t).toArray()))}),e.each(["on","one","off"],function(t,n){ze(n+"()",function(){var t=Array.prototype.slice.call(arguments);t[0]=e.map(t[0].split(/\s/),function(e){return e.match(/\.dt\b/)?e:e+".dt"}).join(" ");var r=e(this.tables().nodes());return r[n].apply(r,t),this})}),ze("clear()",function(){return this.iterator("table",function(e){k(e)})}),ze("settings()",function(){return new Ue(this.context,this.context)}),ze("init()",function(){var e=this.context;return e.length?e[0].oInit:null}),ze("data()",function(){return this.iterator("table",function(e){return ot(e.aoData,"_aData")}).flatten()}),ze("destroy()",function(n){return n=n||!1,this.iterator("table",function(r){var o,a=r.nTableWrapper.parentNode,i=r.oClasses,s=r.nTable,l=r.nTBody,c=r.nTHead,u=r.nTFoot,d=e(s),f=(l=e(l),e(r.nTableWrapper)),p=e.map(r.aoData,function(e){return e.nTr});r.bDestroying=!0,Re(r,"aoDestroyCallback","destroy",[r]),n||new Ue(r).columns().visible(!0),f.off(".DT").find(":not(tbody *)").off(".DT"),e(t).off(".DT-"+r.sInstance),s!=c.parentNode&&(d.children("thead").detach(),d.append(c)),u&&s!=u.parentNode&&(d.children("tfoot").detach(),d.append(u)),r.aaSorting=[],r.aaSortingFixed=[],Te(r),e(p).removeClass(r.asStripeClasses.join(" ")),e("th, td",c).removeClass(i.sSortable+" "+i.sSortableAsc+" "+i.sSortableDesc+" "+i.sSortableNone),l.children().detach(),l.append(p),d[c=n?"remove":"detach"](),f[c](),!n&&a&&(a.insertBefore(s,r.nTableReinsertBefore),d.css("width",r.sDestroyWidth).removeClass(i.sTable),(o=r.asDestroyStripes.length)&&l.children().each(function(t){e(this).addClass(r.asDestroyStripes[t%o])})),-1!==(a=e.inArray(r,Ve.settings))&&Ve.settings.splice(a,1)})}),e.each(["column","row","cell"],function(e,t){ze(t+"s().every()",function(e){var n=this.selector.opts,o=this;return this.iterator(t,function(a,i,s,l,c){e.call(o[t](i,"cell"===t?s:n,"cell"===t?n:r),i,s,l,c)})})}),ze("i18n()",function(t,n,o){var a=this.context[0];return(t=T(t)(a.oLanguage))===r&&(t=n),o!==r&&e.isPlainObject(t)&&(t=t[o]!==r?t[o]:t._),t.replace("%d",o)}),Ve.version="1.10.18",Ve.settings=[],Ve.models={},Ve.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0},Ve.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1},Ve.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null},Ve.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(e){return e.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(e){try{return JSON.parse((-1===e.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+e.sInstance+"_"+location.pathname))}catch(e){}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(e,t){try{(-1===e.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+e.sInstance+"_"+location.pathname,JSON.stringify(t))}catch(e){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:e.extend({},Ve.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"},o(Ve.defaults),Ve.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null},o(Ve.defaults.column),Ve.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:r,oAjaxData:r,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==$e(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==$e(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var e=this._iDisplayLength,t=this._iDisplayStart,n=t+e,r=this.aiDisplay.length,o=this.oFeatures,a=o.bPaginate;return o.bServerSide?!1===a||-1===e?t+r:Math.min(t+e,this._iRecordsDisplay):!a||n>r||-1===e?r:n},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null},Ve.ext=qe={buttons:{},classes:{},builder:"-source-",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:Ve.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:Ve.version},e.extend(qe,{afnFiltering:qe.search,aTypes:qe.type.detect,ofnSearch:qe.type.search,oSort:qe.type.order,afnSortData:qe.order,aoFeatures:qe.feature,oApi:qe.internal,oStdClasses:qe.classes,oPagination:qe.pager}),e.extend(Ve.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var kt=Ve.ext.pager;e.extend(kt,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},numbers:function(e,t){return[Be(e,t)]},simple_numbers:function(e,t){return["previous",Be(e,t),"next"]},full_numbers:function(e,t){return["first","previous",Be(e,t),"next","last"]},first_last_numbers:function(e,t){return["first",Be(e,t),"last"]},_numbers:Be,numbers_length:7}),e.extend(!0,Ve.ext.renderer,{pageButton:{_:function(t,o,a,i,s,l){var c,u,d,f=t.oClasses,p=t.oLanguage.oPaginate,h=t.oLanguage.oAria.paginate||{},m=0,g=function(n,r){var o,i,d,v,y=function(e){ce(t,e.data.action,!0)};for(o=0,i=r.length;o").appendTo(n),g(d,v);else{switch(c=null,u="",v){case"ellipsis":n.append('');break;case"first":c=p.sFirst,u=v+(s>0?"":" "+f.sPageButtonDisabled);break;case"previous":c=p.sPrevious,u=v+(s>0?"":" "+f.sPageButtonDisabled);break;case"next":c=p.sNext,u=v+(s",{class:f.sPageButton+" "+u,"aria-controls":t.sTableId,"aria-label":h[v],"data-dt-idx":m,tabindex:t.iTabIndex,id:0===a&&"string"==typeof v?t.sTableId+"_"+v:null}).html(c).appendTo(n),{action:v},y),m++)}};try{d=e(o).find(n.activeElement).data("dt-idx")}catch(e){}g(e(o).empty(),i),d!==r&&e(o).find("[data-dt-idx="+d+"]").focus()}}}),e.extend(Ve.ext.type.detect,[function(e,t){var n=t.oLanguage.sDecimal;return nt(e,n)?"num"+n:null},function(e){if(e&&!(e instanceof Date)&&!Qe.test(e))return null;var t=Date.parse(e);return null!==t&&!isNaN(t)||Je(e)?"date":null},function(e,t){var n=t.oLanguage.sDecimal;return nt(e,n,!0)?"num-fmt"+n:null},function(e,t){var n=t.oLanguage.sDecimal;return rt(e,n)?"html-num"+n:null},function(e,t){var n=t.oLanguage.sDecimal;return rt(e,n,!0)?"html-num-fmt"+n:null},function(e){return Je(e)||"string"==typeof e&&-1!==e.indexOf("<")?"html":null}]),e.extend(Ve.ext.type.search,{html:function(e){return Je(e)?e:"string"==typeof e?e.replace(Ye," ").replace(Ge,""):""},string:function(e){return Je(e)?e:"string"==typeof e?e.replace(Ye," "):e}});var At=function(e,t,n,r){return 0===e||e&&"-"!==e?(t&&(e=tt(e,t)),e.replace&&(n&&(e=e.replace(n,"")),r&&(e=e.replace(r,""))),1*e):-1/0};e.extend(qe.type.order,{"date-pre":function(e){return e=Date.parse(e),isNaN(e)?-1/0:e},"html-pre":function(e){return Je(e)?"":e.replace?e.replace(/<.*?>/g,"").toLowerCase():e+""},"string-pre":function(e){return Je(e)?"":"string"==typeof e?e.toLowerCase():e.toString?e.toString():""},"string-asc":function(e,t){return et?1:0},"string-desc":function(e,t){return et?-1:0}}),Me(""),e.extend(!0,Ve.ext.renderer,{header:{_:function(t,n,r,o){e(t.nTable).on("order.dt.DT",function(e,a,i,s){t===a&&(e=r.idx,n.removeClass(r.sSortingClass+" "+o.sSortAsc+" "+o.sSortDesc).addClass("asc"==s[e]?o.sSortAsc:"desc"==s[e]?o.sSortDesc:r.sSortingClass))})},jqueryui:function(t,n,r,o){e("
      ").addClass(o.sSortJUIWrapper).append(n.contents()).append(e("").addClass(o.sSortIcon+" "+r.sSortingClassJUI)).appendTo(n),e(t.nTable).on("order.dt.DT",function(e,a,i,s){t===a&&(e=r.idx,n.removeClass(o.sSortAsc+" "+o.sSortDesc).addClass("asc"==s[e]?o.sSortAsc:"desc"==s[e]?o.sSortDesc:r.sSortingClass),n.find("span."+o.sSortIcon).removeClass(o.sSortJUIAsc+" "+o.sSortJUIDesc+" "+o.sSortJUI+" "+o.sSortJUIAscAllowed+" "+o.sSortJUIDescAllowed).addClass("asc"==s[e]?o.sSortJUIAsc:"desc"==s[e]?o.sSortJUIDesc:r.sSortingClassJUI))})}}});var Et=function(e){return"string"==typeof e?e.replace(//g,">").replace(/"/g,"""):e};return Ve.render={number:function(e,t,n,r,o){return{display:function(a){if("number"!=typeof a&&"string"!=typeof a)return a;var i=0>a?"-":"",s=parseFloat(a);return isNaN(s)?Et(a):(s=s.toFixed(n),a=Math.abs(s),s=parseInt(a,10),a=n?t+(a-s).toFixed(n).substring(2):"",i+(r||"")+s.toString().replace(/\B(?=(\d{3})+(?!\d))/g,e)+a+(o||""))}}},text:function(){return{display:Et}}},e.extend(Ve.ext.internal,{_fnExternApiFunc:He,_fnBuildAjax:H,_fnAjaxUpdate:q,_fnAjaxParameters:U,_fnAjaxUpdateDraw:z,_fnAjaxDataSrc:W,_fnAddColumn:d,_fnColumnOptions:f,_fnAdjustColumnSizing:p,_fnVisibleToColumnIndex:h,_fnColumnIndexToVisible:m,_fnVisbleColumns:g,_fnGetColumns:v,_fnColumnTypes:y,_fnApplyColumnDefs:b,_fnHungarianMap:o,_fnCamelToHungarian:a,_fnLanguageCompat:i,_fnBrowserDetect:c,_fnAddData:w,_fnAddTr:x,_fnNodeToDataIndex:function(e,t){return t._DT_RowIndex!==r?t._DT_RowIndex:null},_fnNodeToColumnIndex:function(t,n,r){return e.inArray(r,t.aoData[n].anCells)},_fnGetCellData:C,_fnSetCellData:S,_fnSplitObjNotation:_,_fnGetObjectDataFn:T,_fnSetObjectDataFn:D,_fnGetDataMaster:I,_fnClearTable:k,_fnDeleteIndex:A,_fnInvalidate:E,_fnGetRowElements:O,_fnCreateTr:F,_fnBuildHead:j,_fnDrawHead:R,_fnDraw:L,_fnReDraw:N,_fnAddOptionsHtml:$,_fnDetectHeader:B,_fnGetUniqueThs:M,_fnFeatureHtmlFilter:V,_fnFilterComplete:X,_fnFilterCustom:Y,_fnFilterColumn:G,_fnFilter:Q,_fnFilterCreateSearch:Z,_fnEscapeRegex:ft,_fnFilterData:K,_fnFeatureHtmlInfo:te,_fnUpdateInfo:ne,_fnInfoMacros:re,_fnInitialise:oe,_fnInitComplete:ae,_fnLengthChange:ie,_fnFeatureHtmlLength:se,_fnFeatureHtmlPaginate:le,_fnPageChange:ce,_fnFeatureHtmlProcessing:ue,_fnProcessingDisplay:de,_fnFeatureHtmlTable:fe,_fnScrollDraw:pe,_fnApplyToChildren:he,_fnCalculateColumnWidths:me,_fnThrottle:gt,_fnConvertToWidth:ge,_fnGetWidestNode:ve,_fnGetMaxLenString:ye,_fnStringToCss:be,_fnSortFlatten:we,_fnSort:xe,_fnSortAria:Ce,_fnSortListener:Se,_fnSortAttachListener:_e,_fnSortingClasses:Te,_fnSortData:De,_fnSaveState:Ie,_fnLoadState:ke,_fnSettingsFromNode:Ae,_fnLog:Ee,_fnMap:Oe,_fnBindAction:Pe,_fnCallbackReg:je,_fnCallbackFire:Re,_fnLengthOverflow:Le,_fnRenderer:Ne,_fnDataSource:$e,_fnRowAttributes:P,_fnExtend:Fe,_fnCalculateEnd:function(){}}),e.fn.dataTable=Ve,Ve.$=e,e.fn.dataTableSettings=Ve.settings,e.fn.dataTableExt=Ve.ext,e.fn.DataTable=function(t){return e(this).dataTable(t).api()},e.each(Ve,function(t,n){e.fn.DataTable[t]=n}),e.fn.dataTable});var $jscomp=$jscomp||{};$jscomp.scope={},$jscomp.findInternal=function(e,t,n){e instanceof String&&(e=String(e));for(var r=e.length,o=0;o").addClass(this.c.dom.container.className)},this._constructor()};e.extend(u.prototype,{action:function(e,t){return e=this._nodeToButton(e),t===r?e.conf.action:(e.conf.action=t,this)},active:function(t,n){var o=this._nodeToButton(t);return t=this.c.dom.button.active,o=e(o.node),n===r?o.hasClass(t):(o.toggleClass(t,n===r||n),this)},add:function(e,t){var n=this.s.buttons;if("string"==typeof t){t=t.split("-"),n=this.s;for(var r=0,o=t.length-1;r").addClass(d.className).attr("role","menu"),u.conf._collection=u.collection,this._expandButton(u.buttons,u.conf.buttons,!0,a)}c.init&&c.init.call(i.button(u.node),i,e(u.node),c),0}}}},_buildButton:function(t,n){var o=this.c.dom.button,a=this.c.dom.buttonLiner,i=this.c.dom.collection,s=this.s.dt,c=function(e){return"function"==typeof e?e(s,f,t):e};if(n&&i.button&&(o=i.button),n&&i.buttonLiner&&(a=i.buttonLiner),t.available&&!t.available(s,t))return!1;var u=function(t,n,r,o){o.action.call(n.button(r),t,n,r,o),e(n.table().node()).triggerHandler("buttons-action.dt",[n.button(r),n,r,o])};i=t.tag||o.tag;var d=t.clickBlurs===r||t.clickBlurs,f=e("<"+i+"/>").addClass(o.className).attr("tabindex",this.s.dt.settings()[0].iTabIndex).attr("aria-controls",this.s.dt.table().node().id).on("click.dtb",function(e){e.preventDefault(),!f.hasClass(o.disabled)&&t.action&&u(e,s,f,t),d&&f.blur()}).on("keyup.dtb",function(e){13===e.keyCode&&!f.hasClass(o.disabled)&&t.action&&u(e,s,f,t)});return"a"===i.toLowerCase()&&f.attr("href","#"),"button"===i.toLowerCase()&&f.attr("type","button"),a.tag?(i=e("<"+a.tag+"/>").html(c(t.text)).addClass(a.className),"a"===a.tag.toLowerCase()&&i.attr("href","#"),f.append(i)):f.html(c(t.text)),!1===t.enabled&&f.addClass(o.disabled),t.className&&f.addClass(t.className),t.titleAttr&&f.attr("title",c(t.titleAttr)),t.attr&&f.attr(t.attr),t.namespace||(t.namespace=".dt-button-"+l++),a=(a=this.c.dom.buttonContainer)&&a.tag?e("<"+a.tag+"/>").addClass(a.className).append(f):f,this._addKey(t),this.c.buttonCreated&&(a=this.c.buttonCreated(t,a)),{conf:t,node:f.get(0),inserter:a,buttons:[],inCollection:n,collection:null}},_nodeToButton:function(e,t){t||(t=this.s.buttons);for(var n=0,r=t.length;n").addClass(o).css("display","none").insertAfter(i).stop().fadeIn(a):e("div."+o).stop().fadeOut(a,function(){e(this).removeClass(o).remove()})},u.instanceSelector=function(t,n){if(!t)return e.map(n,function(e){return e.inst});var r=[],o=e.map(n,function(e){return e.name}),a=function(t){if(e.isArray(t))for(var i=0,s=t.length;i'+i.collectionTitle+"
      "),i._collection.addClass(i.collectionLayout).css("display","none").insertAfter(f).stop().fadeIn(i.fade),l=i._collection.css("position"),d&&"absolute"===l)i._collection.css({top:d.top,left:d.left});else if("absolute"===l){i._collection.css({top:r.top+a.outerHeight(),left:r.left}),d=c.offset().top+c.height(),d=r.top+a.outerHeight()+i._collection.outerHeight()-d,l=r.top-i._collection.outerHeight(),(d>c.offset().top-l||i.dropup)&&i._collection.css("top",r.top-i._collection.outerHeight()-5),i._collection.hasClass(i.rightAlignClassName)&&i._collection.css("left",r.left+a.outerWidth()-i._collection.outerWidth()),(d=r.left+i._collection.outerWidth())>(c=c.offset().left+c.width())&&i._collection.css("left",r.left-(d-c)),(a=a.offset().left+i._collection.outerWidth())>e(t).width()&&i._collection.css("left",r.left-(a-e(t).width()))}else(a=i._collection.height()/2)>e(t).height()/2&&(a=e(t).height()/2),i._collection.css("marginTop",-1*a);i.background&&u.background(!0,i.backgroundClassName,i.fade,f),setTimeout(function(){e("div.dt-button-background").on("click.dtb-collection",function(){}),e("body").on("click.dtb-collection",function(t){var n=e.fn.addBack?"addBack":"andSelf";e(t.target).parents()[n]().filter(i._collection).length||s()}).on("keyup.dtb-collection",function(e){27===e.keyCode&&s()}),i.autoClose&&o.on("buttons-action.b-internal",function(){s()})},10)}},background:!0,collectionLayout:"",collectionTitle:"",backgroundClassName:"dt-button-background",rightAlignClassName:"dt-button-right",autoClose:!1,fade:400,attr:{"aria-haspopup":!0}},copy:function(e,t){return c.copyHtml5?"copyHtml5":c.copyFlash&&c.copyFlash.available(e,t)?"copyFlash":void 0},csv:function(e,t){return c.csvHtml5&&c.csvHtml5.available(e,t)?"csvHtml5":c.csvFlash&&c.csvFlash.available(e,t)?"csvFlash":void 0},excel:function(e,t){return c.excelHtml5&&c.excelHtml5.available(e,t)?"excelHtml5":c.excelFlash&&c.excelFlash.available(e,t)?"excelFlash":void 0},pdf:function(e,t){return c.pdfHtml5&&c.pdfHtml5.available(e,t)?"pdfHtml5":c.pdfFlash&&c.pdfFlash.available(e,t)?"pdfFlash":void 0},pageLength:function(t){t=t.settings()[0].aLengthMenu;var n=e.isArray(t[0])?t[0]:t,r=e.isArray(t[0])?t[1]:t;return{extend:"collection",text:function(e){return e.i18n("buttons.pageLength",{"-1":"Show all rows",_:"Show %d rows"},e.page.len())},className:"buttons-page-length",autoClose:!0,buttons:e.map(n,function(e,t){return{text:r[t],className:"button-page-length",action:function(t,n){n.page.len(e).draw()},init:function(t,n,r){var o=this;n=function(){o.active(t.page.len()===e)},t.on("length.dt"+r.namespace,n),n()},destroy:function(e,t,n){e.off("length.dt"+n.namespace)}}}),init:function(e,t,n){var r=this;e.on("length.dt"+n.namespace,function(){r.text(n.text)})},destroy:function(e,t,n){e.off("length.dt"+n.namespace)}}}}),i.Api.register("buttons()",function(e,t){t===r&&(t=e,e=r),this.selector.buttonGroup=e;var n=this.iterator(!0,"table",function(n){if(n._buttons)return u.buttonSelector(u.instanceSelector(e,n._buttons),t)},!0);return n._groupSelector=e,n}),i.Api.register("button()",function(e,t){return 1<(e=this.buttons(e,t)).length&&e.splice(1,e.length),e}),i.Api.registerPlural("buttons().active()","button().active()",function(e){return e===r?this.map(function(e){return e.inst.active(e.node)}):this.each(function(t){t.inst.active(t.node,e)})}),i.Api.registerPlural("buttons().action()","button().action()",function(e){return e===r?this.map(function(e){return e.inst.action(e.node)}):this.each(function(t){t.inst.action(t.node,e)})}),i.Api.register(["buttons().enable()","button().enable()"],function(e){return this.each(function(t){t.inst.enable(t.node,e)})}),i.Api.register(["buttons().disable()","button().disable()"],function(){return this.each(function(e){e.inst.disable(e.node)})}),i.Api.registerPlural("buttons().nodes()","button().node()",function(){var t=e();return e(this.each(function(e){t=t.add(e.inst.node(e.node))})),t}),i.Api.registerPlural("buttons().processing()","button().processing()",function(e){return e===r?this.map(function(e){return e.inst.processing(e.node)}):this.each(function(t){t.inst.processing(t.node,e)})}),i.Api.registerPlural("buttons().text()","button().text()",function(e){return e===r?this.map(function(e){return e.inst.text(e.node)}):this.each(function(t){t.inst.text(t.node,e)})}),i.Api.registerPlural("buttons().trigger()","button().trigger()",function(){return this.each(function(e){e.inst.node(e.node).trigger("click")})}),i.Api.registerPlural("buttons().containers()","buttons().container()",function(){var t=e(),n=this._groupSelector;return this.iterator(!0,"table",function(e){if(e._buttons)for(var r=0,o=(e=u.instanceSelector(n,e._buttons)).length;r"+t+"":"",e('
      ').html(t).append(e("
      ")["string"==typeof n?"html":"append"](n)).css("display","none").appendTo("body").fadeIn(),o!==r&&0!==o&&(a=setTimeout(function(){i.buttons.info(!1)},o)),this)}),i.Api.register("buttons.exportData()",function(e){if(this.context.length)return h(new i.Api(this.context[0]),e)}),i.Api.register("buttons.exportInfo()",function(t){t||(t={});var n=t,o="*"===n.filename&&"*"!==n.title&&n.title!==r&&null!==n.title&&""!==n.title?n.title:n.filename;return"function"==typeof o&&(o=o()),o===r||null===o?o=null:(-1!==o.indexOf("*")&&(o=e.trim(o.replace("*",e("head > title").text()))),o=o.replace(/[^a-zA-Z0-9_\u00A1-\uFFFF\.,\-_ !\(\)]/g,""),(n=d(n.extension))||(n=""),o+=n),{filename:o,title:n=null===(n=d(t.title))?null:-1!==n.indexOf("*")?n.replace("*",e("head > title").text()||"Exported data"):n,messageTop:f(this,t.message||t.messageTop,"top"),messageBottom:f(this,t.messageBottom,"bottom")}});var d=function(e){return null===e||e===r?null:"function"==typeof e?e():e},f=function(t,n,r){return null===(n=d(n))?null:(t=e("caption",t.table().container()).eq(0),"*"===n?t.css("caption-side")!==r?null:t.length?t.text():"":n)},p=e("",h.noCloneChecked=!!ye.cloneNode(!0).lastChild.defaultValue;var Ce=/^key/,Se=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,_e=/^([^.]*)(?:\.(.+)|)/;function Te(){return!0}function De(){return!1}function Ie(e,t){return e===function(){try{return r.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,o,a){var i,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],a);return e}if(null==r&&null==o?(o=n,r=n=void 0):null==o&&("string"==typeof n?(o=r,r=void 0):(o=r,r=n,n=void 0)),!1===o)o=De;else if(!o)return e;return 1===a&&(i=o,(o=function(e){return x().off(e),i.apply(this,arguments)}).guid=i.guid||(i.guid=x.guid++)),e.each(function(){x.event.add(this,t,o,r,n)})}function Ae(e,t,n){n?(Q.set(e,t,!1),x.event.add(e,t,{namespace:!1,handler:function(e){var r,o,i=Q.get(this,t);if(1&e.isTrigger&&this[t]){if(i.length)(x.event.special[t]||{}).delegateType&&e.stopPropagation();else if(i=a.call(arguments),Q.set(this,t,i),r=n(this,t),this[t](),i!==(o=Q.get(this,t))||r?Q.set(this,t,!1):o={},i!==o)return e.stopImmediatePropagation(),e.preventDefault(),o.value}else i.length&&(Q.set(this,t,{value:x.event.trigger(x.extend(i[0],x.Event.prototype),i.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,t)&&x.event.add(e,t,Te)}x.event={global:{},add:function(e,t,n,r,o){var a,i,s,l,c,u,d,f,p,h,m,g=Q.get(e);if(g)for(n.handler&&(n=(a=n).handler,o=a.selector),o&&x.find.matchesSelector(oe,o),n.guid||(n.guid=x.guid++),(l=g.events)||(l=g.events={}),(i=g.handle)||(i=g.handle=function(t){return void 0!==x&&x.event.triggered!==t.type?x.event.dispatch.apply(e,arguments):void 0}),c=(t=(t||"").match(L)||[""]).length;c--;)p=m=(s=_e.exec(t[c])||[])[1],h=(s[2]||"").split(".").sort(),p&&(d=x.event.special[p]||{},p=(o?d.delegateType:d.bindType)||p,d=x.event.special[p]||{},u=x.extend({type:p,origType:m,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:h.join(".")},a),(f=l[p])||((f=l[p]=[]).delegateCount=0,d.setup&&!1!==d.setup.call(e,r,h,i)||e.addEventListener&&e.addEventListener(p,i)),d.add&&(d.add.call(e,u),u.handler.guid||(u.handler.guid=n.guid)),o?f.splice(f.delegateCount++,0,u):f.push(u),x.event.global[p]=!0)},remove:function(e,t,n,r,o){var a,i,s,l,c,u,d,f,p,h,m,g=Q.hasData(e)&&Q.get(e);if(g&&(l=g.events)){for(c=(t=(t||"").match(L)||[""]).length;c--;)if(p=m=(s=_e.exec(t[c])||[])[1],h=(s[2]||"").split(".").sort(),p){for(d=x.event.special[p]||{},f=l[p=(r?d.delegateType:d.bindType)||p]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=a=f.length;a--;)u=f[a],!o&&m!==u.origType||n&&n.guid!==u.guid||s&&!s.test(u.namespace)||r&&r!==u.selector&&("**"!==r||!u.selector)||(f.splice(a,1),u.selector&&f.delegateCount--,d.remove&&d.remove.call(e,u));i&&!f.length&&(d.teardown&&!1!==d.teardown.call(e,h,g.handle)||x.removeEvent(e,p,g.handle),delete l[p])}else for(p in l)x.event.remove(e,p+t[c],n,r,!0);x.isEmptyObject(l)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,o,a,i,s=x.event.fix(e),l=new Array(arguments.length),c=(Q.get(this,"events")||{})[s.type]||[],u=x.event.special[s.type]||{};for(l[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,Oe=/\s*$/g;function je(e,t){return k(e,"table")&&k(11!==t.nodeType?t:t.firstChild,"tr")&&x(e).children("tbody")[0]||e}function Re(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Le(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function $e(e,t){var n,r,o,a,i,s,l,c;if(1===t.nodeType){if(Q.hasData(e)&&(a=Q.access(e),i=Q.set(t,a),c=a.events))for(o in delete i.handle,i.events={},c)for(n=0,r=c[o].length;n")},clone:function(e,t,n){var r,o,a,i,s,l,c,u=e.cloneNode(!0),d=ae(e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(i=ge(u),r=0,o=(a=ge(e)).length;r").attr(e.scriptAttrs||{}).prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&a("error"===e.type?404:200,e.type)}),r.head.appendChild(t[0])},abort:function(){n&&n()}}});var Xt,Yt=[],Gt=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Yt.pop()||x.expando+"_"+Tt++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(t,n,r){var o,a,i,s=!1!==t.jsonp&&(Gt.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Gt.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return o=t.jsonpCallback=m(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(Gt,"$1"+o):!1!==t.jsonp&&(t.url+=(Dt.test(t.url)?"&":"?")+t.jsonp+"="+o),t.converters["script json"]=function(){return i||x.error(o+" was not called"),i[0]},t.dataTypes[0]="json",a=e[o],e[o]=function(){i=arguments},r.always(function(){void 0===a?x(e).removeProp(o):e[o]=a,t[o]&&(t.jsonpCallback=n.jsonpCallback,Yt.push(o)),i&&m(a)&&a(i[0]),i=a=void 0}),"script"}),h.createHTMLDocument=((Xt=r.implementation.createHTMLDocument("").body).innerHTML="
      ",2===Xt.childNodes.length),x.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(h.createHTMLDocument?((o=(t=r.implementation.createHTMLDocument("")).createElement("base")).href=r.location.href,t.head.appendChild(o)):t=r),i=!n&&[],(a=A.exec(e))?[t.createElement(a[1])]:(a=xe([e],t,i),i&&i.length&&x(i).remove(),x.merge([],a.childNodes)));var o,a,i},x.fn.load=function(e,t,n){var r,o,a,i=this,s=e.indexOf(" ");return-1").append(x.parseHTML(e)).find(r):e)}).always(n&&function(e,t){i.each(function(){n.apply(this,a||[e.responseText,t,e])})}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.expr.pseudos.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length},x.offset={setOffset:function(e,t,n){var r,o,a,i,s,l,c=x.css(e,"position"),u=x(e),d={};"static"===c&&(e.style.position="relative"),s=u.offset(),a=x.css(e,"top"),l=x.css(e,"left"),("absolute"===c||"fixed"===c)&&-1<(a+l).indexOf("auto")?(i=(r=u.position()).top,o=r.left):(i=parseFloat(a)||0,o=parseFloat(l)||0),m(t)&&(t=t.call(e,n,x.extend({},s))),null!=t.top&&(d.top=t.top-s.top+i),null!=t.left&&(d.left=t.left-s.left+o),"using"in t?t.using.call(e,d):u.css(d)}},x.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){x.offset.setOffset(this,e,t)});var t,n,r=this[0];return r?r.getClientRects().length?(t=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],o={top:0,left:0};if("fixed"===x.css(r,"position"))t=r.getBoundingClientRect();else{for(t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===x.css(e,"position");)e=e.parentNode;e&&e!==r&&1===e.nodeType&&((o=x(e).offset()).top+=x.css(e,"borderTopWidth",!0),o.left+=x.css(e,"borderLeftWidth",!0))}return{top:t.top-o.top-x.css(r,"marginTop",!0),left:t.left-o.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===x.css(e,"position");)e=e.offsetParent;return e||oe})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;x.fn[e]=function(r){return U(this,function(e,r,o){var a;if(g(e)?a=e:9===e.nodeType&&(a=e.defaultView),void 0===o)return a?a[t]:e[r];a?a.scrollTo(n?a.pageXOffset:o,n?o:a.pageYOffset):e[r]=o},e,r,arguments.length)}}),x.each(["top","left"],function(e,t){x.cssHooks[t]=ze(h.pixelPosition,function(e,n){if(n)return n=Ue(e,t),Me.test(n)?x(e).position()[t]+"px":n})}),x.each({Height:"height",Width:"width"},function(e,t){x.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){x.fn[r]=function(o,a){var i=arguments.length&&(n||"boolean"!=typeof o),s=n||(!0===o||!0===a?"margin":"border");return U(this,function(t,n,o){var a;return g(t)?0===r.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(a=t.documentElement,Math.max(t.body["scroll"+e],a["scroll"+e],t.body["offset"+e],a["offset"+e],a["client"+e])):void 0===o?x.css(t,n,s):x.style(t,n,o,s)},t,i?o:void 0,i)}})}),x.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return 0{"use strict";let e={1:"E004 - C1",2:"L005 - C2",3:"Z006 - C3",4:"M001 - C4",5:"C008 - C5",6:"G008 - C6",7:"Q003 - 0.0",8:"A009 - C13"};return{path:{img:"/public/img/",api:"/api/rest",getCaptcha:"/api/user/getCaptcha",getServerStatus:"/api/user/getEveServerStatus",getCookieCharacterData:"/api/user/getCookieCharacter",logIn:"/api/user/logIn",logout:"/api/user/logout",openIngameWindow:"/api/user/openIngameWindow",saveUserConfig:"/api/user/saveAccount",deleteAccount:"/api/user/deleteAccount",searchAccess:"/api/access/search",initData:"/api/map/initData",getAccessData:"/api/map/getAccessData",updateMapData:"/api/map/updateData",updateUserData:"/api/map/updateUserData",updateUnloadData:"/api/map/updateUnloadData",saveMap:"/api/map/save",deleteMap:"/api/map/delete",importMap:"/api/map/import",getMapConnectionData:"/api/map/getConnectionData",getMapLogData:"/api/map/getLogData",getSystemGraphData:"/api/system/graphData",setDestination:"/api/system/setDestination",pokeRally:"/api/system/pokeRally",searchRoute:"/api/route/search",getStatisticsData:"/api/statistic/getData",searchUniverseData:"/api/universe/search",searchUniverseSystemData:"/api/universe/systems",getConstellationData:"/api/universe/constellationData",gitHubReleases:"/api/github/releases"},breakpoints:[{name:"screen-xl",width:1/0},{name:"screen-l",width:1600},{name:"screen-m",width:1200},{name:"screen-d",width:1e3},{name:"screen-s",width:780},{name:"screen-xs",width:480}],animationSpeed:{splashOverlay:300,headerLink:100,mapOverlay:200,mapOverlayLocal:180,mapMoveSystem:180,mapDeleteSystem:200,mapModule:200,dialogEvents:180},syncStatus:{type:"ajax",webSocket:{status:"closed",class:"txt-color-danger",timestamp:void 0},sharedWorker:{status:"offline",class:"txt-color-danger",timestamp:void 0},ajax:{status:"enabled",class:"txt-color-success",timestamp:void 0}},performanceLogging:{keyServerMapData:"UPDATE_SERVER_MAP",keyClientMapData:"UPDATE_CLIENT_MAP",keyServerUserData:"UPDATE_SERVER_USER_DATA",keyClientUserData:"UPDATE_CLIENT_USER_DATA"},mapIcons:[{class:"fa-desktop",label:"desktop",unicode:""},{class:"fa-space-shuttle",label:"space shuttle",unicode:""},{class:"fa-anchor",label:"anchor",unicode:""},{class:"fa-satellite",label:"satellite",unicode:""},{class:"fa-skull-crossbones",label:"skull crossbones",unicode:""},{class:"fa-fire",label:"fire",unicode:""},{class:"fa-bookmark",label:"bookmark",unicode:""},{class:"fa-cube",label:"cube",unicode:""},{class:"fa-star",label:"star",unicode:""},{class:"fa-hat-wizard",label:"hat wizard",unicode:""},{class:"fa-plane",label:"plane",unicode:""},{class:"fa-globe",label:"globe",unicode:""},{class:"fa-rocket",label:"rocket",unicode:""},{class:"fa-life-ring",label:"life ring",unicode:""},{class:"fa-heart",label:"heart",unicode:""},{class:"fa-poop",label:"poop",unicode:""}],classes:{logTypes:{info:{class:"pf-log-info",label:"info"},warning:{class:"pf-log-warning",label:"warning"},error:{class:"pf-log-error",label:"error"}},systemEffects:{effect:{class:"pf-system-effect",name:"no effect"},magnetar:{class:"pf-system-effect-magnetar",name:"magnetar"},redGiant:{class:"pf-system-effect-redgiant",name:"red giant"},pulsar:{class:"pf-system-effect-pulsar",name:"pulsar"},wolfRayet:{class:"pf-system-effect-wolfrayet",name:"wolf rayet"},cataclysmic:{class:"pf-system-effect-cataclysmic",name:"cataclysmic"},blackHole:{class:"pf-system-effect-blackhole",name:"black hole"}},systemSecurity:{security:{class:"pf-system-sec"},A:{class:"pf-system-sec-abyssal"},SH:{class:"pf-system-sec-unknown"},H:{class:"pf-system-sec-highSec"},L:{class:"pf-system-sec-lowSec"},"0.0":{class:"pf-system-sec-nullSec"},C1:{class:"pf-system-sec-low"},C2:{class:"pf-system-sec-low"},C3:{class:"pf-system-sec-mid"},C4:{class:"pf-system-sec-mid"},C5:{class:"pf-system-sec-high"},C6:{class:"pf-system-sec-high"},C12:{class:"pf-system-sec-special"},C14:{class:"pf-system-sec-drifter"},C15:{class:"pf-system-sec-drifter"},C16:{class:"pf-system-sec-drifter"},C17:{class:"pf-system-sec-drifter"},C18:{class:"pf-system-sec-drifter"}},trueSec:{"0.0":{class:"pf-system-security-0-0"},.1:{class:"pf-system-security-0-1"},.2:{class:"pf-system-security-0-2"},.3:{class:"pf-system-security-0-3"},.4:{class:"pf-system-security-0-4"},.5:{class:"pf-system-security-0-5"},.6:{class:"pf-system-security-0-6"},.7:{class:"pf-system-security-0-7"},.8:{class:"pf-system-security-0-8"},.9:{class:"pf-system-security-0-9"},"1.0":{class:"pf-system-security-1-0"}},systemInfo:{rally:{class:"pf-system-info-rally",label:"rally point"}},planets:{barren:{class:"pf-planet-barren"},gas:{class:"pf-planet-gas"},ice:{class:"pf-planet-ice"},lava:{class:"pf-planet-lava"},oceanic:{class:"pf-planet-oceanic"},plasma:{class:"pf-planet-plasma"},shattered:{class:"pf-planet-shattered"},storm:{class:"pf-planet-storm"},temperate:{class:"pf-planet-temperate"}},pieChart:{class:"pf-pie-chart",pieChartMapCounterClass:"pf-pie-chart-map-timer"}},defaultMapScope:"wh",endpointTypes:{bubble:{cssClass:"pf-map-endpoint-bubble"}},connectionTypes:{abyssal:{cssClass:"pf-map-connection-abyssal",paintStyle:{dashstyle:"0.5 2"}},jumpbridge:{cssClass:"pf-map-connection-jumpbridge",paintStyle:{dashstyle:"4 2 1 2"}},stargate:{cssClass:"pf-map-connection-stargate",paintStyle:{dashstyle:"0"}},wh_eol:{cssClass:"pf-map-connection-wh-eol"},wh_fresh:{cssClass:"pf-map-connection-wh-fresh"},wh_reduced:{cssClass:"pf-map-connection-wh-reduced"},wh_critical:{cssClass:"pf-map-connection-wh-critical"},wh_jump_mass_s:{cssClass:"pf-map-connection-wh-size-s",paintStyle:{dashstyle:"0.5 1",strokeWidth:3},overlays:[["Label",{label:'',cssClass:["pf-map-component-overlay","small","text-center"].join(" "),location:.65,id:"pf-map-connection-jump-mass-overlay"}]]},wh_jump_mass_m:{cssClass:"pf-map-connection-wh-size-m",paintStyle:{dashstyle:"3 1"},overlays:[["Label",{label:'',cssClass:["pf-map-component-overlay","small","text-center"].join(" "),location:.65,id:"pf-map-connection-jump-mass-overlay"}]]},wh_jump_mass_l:{cssClass:"pf-map-connection-wh-size-l",overlays:[["Label",{label:'',cssClass:["pf-map-component-overlay","small","text-center"].join(" "),location:.65,id:"pf-map-connection-jump-mass-overlay"}]]},wh_jump_mass_xl:{cssClass:"pf-map-connection-wh-size-xl",paintStyle:{strokeWidth:6},overlays:[["Label",{label:'',cssClass:["pf-map-component-overlay","small","text-center"].join(" "),location:.65,id:"pf-map-connection-jump-mass-overlay"}]]},preserve_mass:{cssClass:"pf-map-connection-preserve-mass",overlays:[["Label",{label:' save mass',cssClass:["pf-map-component-overlay","mass"].join(" "),location:.35}]]},info_signature:{overlays:[["Arrow",{id:"pf-map-connection-arrow-overlay",cssClass:"pf-map-connection-arrow-overlay",width:12,length:15,direction:1,foldback:.8,location:.5}]]},state_active:{cssClass:"pf-map-connection-active"},state_process:{cssClass:"pf-map-connection-process",overlays:[["Label",{label:'',cssClass:["pf-map-connection-state-overlay"].join(" "),location:.5}]]}},wormholeSizes:{wh_jump_mass_xl:{jumpMassMin:1e9,type:"wh_jump_mass_xl",class:"pf-jump-mass-xl",label:"XL",text:"capital ships"},wh_jump_mass_l:{jumpMassMin:3e8,type:"wh_jump_mass_l",class:"pf-jump-mass-l",label:"L",text:"larger ships"},wh_jump_mass_m:{jumpMassMin:2e7,type:"wh_jump_mass_m",class:"pf-jump-mass-m",label:"M",text:"medium ships"},wh_jump_mass_s:{jumpMassMin:1e3,type:"wh_jump_mass_s",class:"pf-jump-mass-s",label:"S",text:"smallest ships"}},signatureGroups:{1:{name:"(combat site|kampfgebiet|site de combat|Боевой район|战斗地点)",label:"Combat"},2:{name:"(relic site|reliktgebiet|site de reliques|Археологический район|遗迹地点)",label:"Relic"},3:{name:"(data site|datengebiet|site de données|Информационный район|数据地点)",label:"Data"},4:{name:"(gas site|gasgebiet|site de collecte de gaz|Газовый район|气云地点)",label:"Gas"},5:{name:"(wormhole|wurmloch|trou de ver|Червоточина|虫洞)",label:"Wormhole"},6:{name:"(ore site|mineraliengebiet|site de minerai|Астероидный район|矿石地点)",label:"Ore"},7:{name:"(ghost|Призрачный)",label:"Ghost"}},frigateWormholes:{1:e,2:e,3:e,4:e,5:e,6:e,13:e,30:e,31:e,32:e},drifterWormholes:{1:"S877 - C14 Sentinel",2:"B735 - C15 Barbican",3:"V928 - C16 Vidette",4:"C414 - C17 Conflux",5:"R259 - C18 Redoubt"},incomingWormholes:{1:"K162 - C1/2/3 (unknown)",2:"K162 - C4/5 (dangerous)",3:"K162 - C6 (deadly)",4:"K162 - H",5:"K162 - L",6:"K162 - 0.0",7:"K162 - C12 Thera"}}}),define("app/lib/prototypes",[],()=>{"use strict";return Array.prototype.diff=function(e){return this.filter(t=>!e.includes(t))},Array.prototype.intersect=function(e){return this.filter(t=>e.includes(t))},Array.prototype.equalValues=function(e){return 0===this.diff(e).concat(e.diff(this)).length},Array.prototype.concatFilter=function(e){return[...new Set([...this,...e])]},Array.prototype.sortBy=function(e){return this.slice(0).sort((t,n)=>t[e]>n[e]?1:t[e]{"use strict";window.console=(e=>{let t=e.log,n=e.info,r=e.warn,o=e.error,a={indentDefault:{"padding-left":"3px"},global:{"font-weight":500,"font-size":"11px","line-height":"19px","font-family":'"Fira Code", "Lucida Console"'},debug:{color:"#d747d6"},ok:{color:"#5cb85c"},log:{color:"#adadad"},info:{color:"#428bca"},warn:{color:"#ffdd9e"},error:{color:"#ff8080"},pf:{color:"#568a89"},brand:{color:"#375959","line-height":"35px","font-size":"25px"}},i={"%s":{style:["color: #e93f3b; font-style: italic","color: inherit"]},"%i":{style:["color: #9980ff","color: inherit"]},"%d":{style:["color: #9980ff","color: inherit"]},"%f":{style:["color: #9980ff","color: inherit"]},"%o":{style:["",""]},"%O":{style:["",""]}},s=(e,t=!1)=>{let n="";return i.hasOwnProperty(e)&&(n=i[e].style[t?1:0]),n},l=(e,t=[])=>{let n="";return a.hasOwnProperty(e)&&(n=Object.keys(a[e]).filter(e=>!t.length||t.includes(e)).reduce((t,n,r,o)=>t+=n+":"+a[e][n]+";","")),n},c=(e,t)=>{if(t.length){let n=l("global")+l(e);n+=["debug","ok","log","info","pf"].includes(e)?l("indentDefault"):"";let r=["debug","ok","log","info","pf"].includes(e)?"●":"";"string"==typeof t[0]?t[0]="%c"+r+" "+t[0]:t.splice(0,0,"%c"+r+" "+e+":"),t.splice(1,0,n)}},u=(e,t)=>{if("string"==typeof t[0]){let n=(e=>{let t=new RegExp(Object.keys(i).join("|"),"g"),n=e.match(t);return n||[]})(t[0]),r=n.length;t[0]=(e=>{let t=new RegExp(Object.keys(i).join("|"),"g");return e.replace(t,function(e){return"%c"+e+"%c"})})(t[0]);let o=0,a=1,c=a+r,u=0;for(let r=a;r{u("debug",t),c("debug",t),n.apply(e,t)}),e.ok=((...t)=>{u("ok",t),c("ok",t),n.apply(e,t)}),e.info=((...t)=>{u("info",t),c("info",t),n.apply(e,t)}),e.log=((...n)=>{u("log",n),c("log",n),t.apply(e,n)}),e.warn=((...t)=>{u("warn",t),c("warn",t),r.apply(e,t)}),e.error=((...t)=>{u("error",t),c("error",t),o.apply(e,t)}),e.pf=((...t)=>{u("pf",t),c("pf",t),n.apply(e,t)}),e.brand=((...t)=>{u("brand",t),c("brand",t),n.apply(e,t)}),e})(window.console);return{showVersionInfo:e=>{console.ok("%c PATHFINDER","color: #477372; font-size: 25px; margin-left: 10px; line-height: 50px; text-shadow: 1px 1px 0 #212C30; background: url(https://i.imgur.com/bhSr6LI.png) no-repeat;"),console.pf("Release: %s",e)}}}),define("conf/system_effect",[],()=>{"use strict";let e=e=>{let t=0;switch(e){case 1:case 2:case 3:case 4:case 5:case 6:t=e;break;case 13:t=6;break;case 14:case 15:case 16:case 17:case 18:t=2}return t},t={1:[{effect:"Damage",value:"+30%"},{effect:"Missile exp. radius",value:"+15%"},{effect:"Drone tracking",value:"-15%"},{effect:"Targeting range",value:"-15%"},{effect:"Tracking speed",value:"-15%"},{effect:"Target Painter strength",value:"-15%"}],2:[{effect:"Damage",value:"+44%"},{effect:"Missile exp. radius",value:"+22%"},{effect:"Drone tracking",value:"-22%"},{effect:"Targeting range",value:"-22%"},{effect:"Tracking speed",value:"-22%"},{effect:"Target Painter strength",value:"-22%"}],3:[{effect:"Damage",value:"+58%"},{effect:"Missile exp. radius",value:"+29%"},{effect:"Drone tracking",value:"-29%"},{effect:"Targeting range",value:"-29%"},{effect:"Tracking speed",value:"-29%"},{effect:"Target Painter strength",value:"-29%"}],4:[{effect:"Damage",value:"+72%"},{effect:"Missile exp. radius",value:"+36%"},{effect:"Drone tracking",value:"-36%"},{effect:"Targeting range",value:"-36%"},{effect:"Tracking speed",value:"-36%"},{effect:"Target Painter strength",value:"-36%"}],5:[{effect:"Damage",value:"+86%"},{effect:"Missile exp. radius",value:"+43%"},{effect:"Drone tracking",value:"-43%"},{effect:"Targeting range",value:"-43%"},{effect:"Tracking speed",value:"-43%"},{effect:"Target Painter strength",value:"-43%"}],6:[{effect:"Damage",value:"+100%"},{effect:"Missile exp. radius",value:"+50%"},{effect:"Drone tracking",value:"-50%"},{effect:"Targeting range",value:"-50%"},{effect:"Tracking speed",value:"-50%"},{effect:"Target Painter strength",value:"-50%"}]},n={1:[{effect:"Heat damage",value:"+15%"},{effect:"Overload bonus",value:"+30%"},{effect:"Smart Bomb range",value:"+30%"},{effect:"Smart Bomb damage",value:"+30%"},{effect:"Bomb damage",value:"+30%"}],2:[{effect:"Heat damage",value:"+22%"},{effect:"Overload bonus",value:"+44%"},{effect:"Smart Bomb range",value:"+44%"},{effect:"Smart Bomb damage",value:"+44%"},{effect:"Bomb damage",value:"+44%"}],3:[{effect:"Heat damage",value:"+29%"},{effect:"Overload bonus",value:"+58%"},{effect:"Smart Bomb range",value:"+58%"},{effect:"Smart Bomb damage",value:"+58%"},{effect:"Bomb damage",value:"+58%"}],4:[{effect:"Heat damage",value:"+36%"},{effect:"Overload bonus",value:"+72%"},{effect:"Smart Bomb range",value:"+72%"},{effect:"Smart Bomb damage",value:"+72%"},{effect:"Bomb damage",value:"+72%"}],5:[{effect:"Heat damage",value:"+43%"},{effect:"Overload bonus",value:"+86%"},{effect:"Smart Bomb range",value:"+86%"},{effect:"Smart Bomb damage",value:"+86%"},{effect:"Bomb damage",value:"+86%"}],6:[{effect:"Heat damage",value:"+50%"},{effect:"Overload bonus",value:"+100%"},{effect:"Smart Bomb range",value:"+100%"},{effect:"Smart Bomb damage",value:"+100%"},{effect:"Bomb damage",value:"+100%"}]},r={1:[{effect:"Shield HP",value:"+30%"},{effect:"Armor resist",value:"-15%"},{effect:"Capacitor recharge",value:"-15%"},{effect:"Signature",value:"+30%"},{effect:"NOS/Neut drain",value:"+30%"}],2:[{effect:"Shield HP",value:"+44%"},{effect:"Armor resist",value:"-22%"},{effect:"Capacitor recharge",value:"-22%"},{effect:"Signature",value:"+44%"},{effect:"NOS/Neut drain",value:"+44%"}],3:[{effect:"Shield HP",value:"+58%"},{effect:"Armor resist",value:"-29%"},{effect:"Capacitor recharge",value:"-29%"},{effect:"Signature",value:"+58%"},{effect:"NOS/Neut drain",value:"+58%"}],4:[{effect:"Shield HP",value:"+72%"},{effect:"Armor resist",value:"-36%"},{effect:"Capacitor recharge",value:"-36%"},{effect:"Signature",value:"+72%"},{effect:"NOS/Neut drain",value:"+72%"}],5:[{effect:"Shield HP",value:"+86%"},{effect:"Armor resist",value:"-43%"},{effect:"Capacitor recharge",value:"-43%"},{effect:"Signature",value:"+86%"},{effect:"NOS/Neut drain",value:"+86%"}],6:[{effect:"Shield HP",value:"+100%"},{effect:"Armor resist",value:"-50%"},{effect:"Capacitor recharge",value:"-50%"},{effect:"Signature",value:"+100%"},{effect:"NOS/Neut drain",value:"+100%"}]},o={1:[{effect:"Armor HP",value:"+30%"},{effect:"Shield resist",value:"-15%"},{effect:"Small Weapon damage",value:"+60%"},{effect:"Signature size",value:"-15%"}],2:[{effect:"Armor HP",value:"+44%"},{effect:"Shield resist",value:"-22%"},{effect:"Small Weapon damage",value:"+88%"},{effect:"Signature size",value:"-22%"}],3:[{effect:"Armor HP",value:"+58%"},{effect:"Shield resist",value:"-29%"},{effect:"Small Weapon damage",value:"+116%"},{effect:"Signature size",value:"-29%"}],4:[{effect:"Armor HP",value:"+72%"},{effect:"Shield resist",value:"-36%"},{effect:"Small Weapon damage",value:"+144%"},{effect:"Signature size",value:"-36%"}],5:[{effect:"Armor HP",value:"+86%"},{effect:"Shield resist",value:"-43%"},{effect:"Small Weapon damage",value:"+172%"},{effect:"Signature size",value:"-43%"}],6:[{effect:"Armor HP",value:"+100%"},{effect:"Shield resist",value:"-50%"},{effect:"Small Weapon damage",value:"+200%"},{effect:"Signature size",value:"-50%"}]},a={1:[{effect:"Local armor repair amount",value:"-15%"},{effect:"Local shield boost amount",value:"-15%"},{effect:"Shield transfer amount",value:"+30%"},{effect:"Remote repair amount",value:"+30%"},{effect:"Capacitor capacity",value:"+30%"},{effect:"Capacitor recharge time",value:"+15%"},{effect:"Remote Capacitor Transmitter amount",value:"-15%"}],2:[{effect:"Local armor repair amount",value:"-22%"},{effect:"Local shield boost amount",value:"-22%"},{effect:"Shield transfer amount",value:"+44%"},{effect:"Remote repair amount",value:"+44%"},{effect:"Capacitor capacity",value:"+44%"},{effect:"Capacitor recharge time",value:"+22%"},{effect:"Remote Capacitor Transmitter amount",value:"-22%"}],3:[{effect:"Local armor repair amount",value:"-29%"},{effect:"Local shield boost amount",value:"-29%"},{effect:"Shield transfer amount",value:"+58%"},{effect:"Remote repair amount",value:"+58%"},{effect:"Capacitor capacity",value:"+58%"},{effect:"Capacitor recharge time",value:"+29%"},{effect:"Remote Capacitor Transmitter amount",value:"-29%"}],4:[{effect:"Local armor repair amount",value:"-36%"},{effect:"Local shield boost amount",value:"-36%"},{effect:"Shield transfer amount",value:"+72%"},{effect:"Remote repair amount",value:"+72%"},{effect:"Capacitor capacity",value:"+72%"},{effect:"Capacitor recharge time",value:"+36%"},{effect:"Remote Capacitor Transmitter amount",value:"-36%"}],5:[{effect:"Local armor repair amount",value:"-43%"},{effect:"Local shield boost amount",value:"-43%"},{effect:"Shield transfer amount",value:"+86%"},{effect:"Remote repair amount",value:"+86%"},{effect:"Capacitor capacity",value:"+86%"},{effect:"Capacitor recharge time",value:"+43%"},{effect:"Remote Capacitor Transmitter amount",value:"-43%"}],6:[{effect:"Local armor repair amount",value:"-50%"},{effect:"Local shield boost amount",value:"-50%"},{effect:"Shield transfer amount",value:"+100%"},{effect:"Remote repair amount",value:"+100%"},{effect:"Capacitor capacity",value:"+100%"},{effect:"Capacitor recharge time",value:"+50%"},{effect:"Remote Capacitor Transmitter amount",value:"-50%"}]},i={1:[{effect:"Missile velocity",value:"+15%"},{effect:"Missile exp. velocity",value:"+30%"},{effect:"Ship velocity",value:"+30%"},{effect:"Stasis Webifier strength",value:"-15%"},{effect:"Inertia",value:"+15%"},{effect:"Targeting range",value:"+30%"}],2:[{effect:"Missile velocity",value:"+22%"},{effect:"Missile exp. velocity",value:"+44%"},{effect:"Ship velocity",value:"+44%"},{effect:"Stasis Webifier strength",value:"-22%"},{effect:"Inertia",value:"+22%"},{effect:"Targeting range",value:"+44%"}],3:[{effect:"Missile velocity",value:"+29%"},{effect:"Missile exp. velocity",value:"+58%"},{effect:"Ship velocity",value:"+58%"},{effect:"Stasis Webifier strength",value:"-29%"},{effect:"Inertia",value:"+29%"},{effect:"Targeting range",value:"+58%"}],4:[{effect:"Missile velocity",value:"+36%"},{effect:"Missile exp. velocity",value:"+72%"},{effect:"Ship velocity",value:"+72%"},{effect:"Stasis Webifier strength",value:"-36%"},{effect:"Inertia",value:"+36%"},{effect:"Targeting range",value:"+72%"}],5:[{effect:"Missile velocity",value:"+43%"},{effect:"Missile exp. velocity",value:"+86%"},{effect:"Ship velocity",value:"+86%"},{effect:"Stasis Webifier strength",value:"-43%"},{effect:"Inertia",value:"+43%"},{effect:"Targeting range",value:"+86%"}],6:[{effect:"Missile velocity",value:"+50%"},{effect:"Missile exp. velocity",value:"+100%"},{effect:"Ship velocity",value:"+100%"},{effect:"Stasis Webifier strength",value:"-50%"},{effect:"Inertia",value:"+50%"},{effect:"Targeting range",value:"+100%"}]};return{getMultiplierByAreaId:e,wh:{magnetar:{1:t[e(1)],2:t[e(2)],3:t[e(3)],4:t[e(4)],5:t[e(5)],6:t[e(6)],16:t[e(16)]},redGiant:{1:n[e(1)],2:n[e(2)],3:n[e(3)],4:n[e(4)],5:n[e(5)],6:n[e(6)],14:n[e(14)]},pulsar:{1:r[e(1)],2:r[e(2)],3:r[e(3)],4:r[e(4)],5:r[e(5)],6:r[e(6)],17:r[e(17)]},wolfRayet:{1:o[e(1)],2:o[e(2)],3:o[e(3)],4:o[e(4)],5:o[e(5)],6:o[e(6)],13:o[e(13)],18:o[e(18)]},cataclysmic:{1:a[e(1)],2:a[e(2)],3:a[e(3)],4:a[e(4)],5:a[e(5)],6:a[e(6)],15:a[e(15)]},blackHole:{1:i[e(1)],2:i[e(2)],3:i[e(3)],4:i[e(4)],5:i[e(5)],6:i[e(6)]}}}}),define("conf/signature_type",[],()=>{"use strict";let e={10:"Ruined Angel Crystal Quarry",11:"Ruined Angel Monument Site",12:"Ruined Angel Science Outpost",13:"Ruined Angel Temple Site",14:"Ruined Blood Raider Crystal Quarry",15:"Ruined Blood Raider Monument Site",16:"Ruined Blood Raider Science Outpost",17:"Ruined Blood Raider Temple Site",18:"Ruined Guristas Crystal Quarry",19:"Ruined Guristas Monument Site",20:"Ruined Guristas Science Outpost",21:"Ruined Guristas Temple Site",22:"Ruined Sansha Crystal Quarry",23:"Ruined Sansha Monument Site",24:"Ruined Sansha Science Outpost",25:"Ruined Sansha Temple Site",26:"Ruined Serpentis Crystal Quarry",27:"Ruined Serpentis Monument Site",28:"Ruined Serpentis Science Outpost",29:"Ruined Serpentis Temple Site"},t=Object.assign({},e,{1:"Forgotten Perimeter Coronation Platform",2:"Forgotten Perimeter Power Array"}),n=Object.assign({},e,{1:"Forgotten Perimeter Gateway",2:"Forgotten Perimeter Habitation Coils"}),r=Object.assign({},e,{1:"Forgotten Frontier Quarantine Outpost",2:"Forgotten Frontier Recursive Depot"}),o={10:"Abandoned Research Complex DA005",11:"Abandoned Research Complex DA015",12:"Abandoned Research Complex DC007",13:"Abandoned Research Complex DC021",14:"Abandoned Research Complex DC035",15:"Abandoned Research Complex DG003",16:"Central Angel Command Center",17:"Central Angel Data Mining Site",18:"Central Angel Sparking Transmitter",19:"Central Angel Survey Site",20:"Central Blood Raider Command Center",21:"Central Blood Raider Data Mining Site",22:"Central Blood Raider Sparking Transmitter",23:"Central Blood Raider Survey Site",24:"Central Guristas Command Center",25:"Central Guristas Data Mining Center",26:"Central Guristas Sparking Transmitter",27:"Central Guristas Survey Site",28:"Central Sansha Command Center",29:"Central Sansha Data Mining Site",30:"Central Sansha Sparking Transmitter",31:"Central Sansha Survey Site",32:"Central Serpentis Command Center",33:"Central Serpentis Data Mining Site",34:"Central Serpentis Sparking Transmitter",35:"Central Serpentis Survey Site"};return{1:{1:{1:{1:"Perimeter Ambush Point",2:"Perimeter Camp",3:"Phase Catalyst Node",4:"The Line"},2:t,3:Object.assign({},o,{1:"Unsecured Perimeter Amplifier",2:"Unsecured Perimeter Information Center"}),4:{1:"Barren Perimeter Reservoir",2:"Token Perimeter Reservoir",3:"Minor Perimeter Reservoir",4:"Sizeable Perimeter Reservoir",5:"Ordinary Perimeter Reservoir"},5:{1:"H121 - C1",2:"C125 - C2",3:"O883 - C3",4:"M609 - C4",5:"L614 - C5",6:"S804 - C6",7:"F353 - C12 Thera"},6:{1:"Ordinary Perimeter Deposit",2:"Common Perimeter Deposit",3:"Unexceptional Frontier Deposit",4:"Average Frontier Deposit",5:"Isolated Core Deposit",6:"Uncommon Core Deposit"},7:{}},2:{1:{1:"Perimeter Checkpoint",2:"Perimeter Hangar",3:"The Ruins of Enclave Cohort 27",4:"Sleeper Data Sanctuary"},2:n,3:Object.assign({},o,{1:"Unsecured Perimeter Comms Relay",2:"Unsecured Perimeter Transponder Farm"}),4:{1:"Barren Perimeter Reservoir",2:"Token Perimeter Reservoir",3:"Minor Perimeter Reservoir",4:"Sizeable Perimeter Reservoir",5:"Ordinary Perimeter Reservoir"},5:{1:"Z647 - C1",2:"D382 - C2",3:"O477 - C3",4:"Y683 - C4",5:"N062 - C5",6:"R474 - C6",7:"F135 - C12 Thera"},6:{1:"Ordinary Perimeter Deposit",2:"Common Perimeter Deposit",3:"Unexceptional Frontier Deposit",4:"Average Frontier Deposit",5:"Isolated Core Deposit",6:"Uncommon Core Deposit"},7:{}},3:{1:{1:"Fortification Frontier Stronghold",2:"Outpost Frontier Stronghold",3:"Solar Cell",4:"The Oruze Construct"},2:r,3:Object.assign({},o,{1:"Unsecured Frontier Database",2:"Unsecured Frontier Receiver"}),4:{1:"Barren Perimeter Reservoir",2:"Token Perimeter Reservoir",3:"Minor Perimeter Reservoir",4:"Sizeable Perimeter Reservoir",5:"Ordinary Perimeter Reservoir",6:"Bountiful Frontier Reservoir",7:"Vast Frontier Reservoir"},5:{1:"V301 - C1",2:"I182 - C2",3:"N968 - C3",4:"T405 - C4",5:"N770 - C5",6:"A982 - C6",7:"F135 - C12 Thera"},6:{1:"Ordinary Perimeter Deposit",2:"Common Perimeter Deposit",3:"Unexceptional Frontier Deposit",4:"Average Frontier Deposit",5:"Infrequent Core Deposit",6:"Unusual Core Deposit"},7:{}},4:{1:{1:"Frontier Barracks",2:"Frontier Command Post",3:"Integrated Terminus",4:"Sleeper Information Sanctum"},2:{1:"Forgotten Frontier Conversion Module",2:"Forgotten Frontier Evacuation Center"},3:{1:"Unsecured Frontier Digital Nexus",2:"Unsecured Frontier Trinary Hub"},4:{1:"Barren Perimeter Reservoir",2:"Token Perimeter Reservoir",3:"Minor Perimeter Reservoir",4:"Sizeable Perimeter Reservoir",5:"Ordinary Perimeter Reservoir",6:"Vast Frontier Reservoir",7:"Bountiful Frontier Reservoir"},5:{1:"S047 - H",2:"N290 - L",3:"K329 - 0.0"},6:{1:"Ordinary Perimeter Deposit",2:"Common Perimeter Deposit",3:"Unexceptional Frontier Deposit",4:"Average Frontier Deposit",5:"Unusual Core Deposit",6:"Infrequent Core Deposit"},7:{}},5:{1:{1:"Core Garrison",2:"Core Stronghold",3:"Oruze Osobnyk",4:"Quarantine Area"},2:{1:"Forgotten Core Data Field",2:"Forgotten Core Information Pen"},3:{1:"Unsecured Frontier Enclave Relay",2:"Unsecured Frontier Server Bank"},4:{1:"Barren Perimeter Reservoir",2:"Minor Perimeter Reservoir",3:"Ordinary Perimeter Reservoir",4:"Sizeable Perimeter Reservoir",5:"Token Perimeter Reservoir",6:"Bountiful Frontier Reservoir",7:"Vast Frontier Reservoir",8:"Instrumental Core Reservoir",9:"Vital Core Reservoir"},5:{1:"D792 - H",2:"C140 - L",3:"Z142 - 0.0"},6:{1:"Average Frontier Deposit",2:"Unexceptional Frontier Deposit",3:"Uncommon Core Deposit",4:"Ordinary Perimeter Deposit",5:"Common Perimeter Deposit",6:"Exceptional Core Deposit",7:"Infrequent Core Deposit",8:"Unusual Core Deposit",9:"Rarified Core Deposit",10:"Isolated Core Deposit"},7:{}},6:{1:{1:"Core Citadel",2:"Core Bastion",3:"Strange Energy Readings",4:"The Mirror"},2:{1:"Forgotten Core Assembly Hall",2:"Forgotten Core Circuitry Disassembler"},3:{1:"Unsecured Core Backup Array",2:"Unsecured Core Emergence"},4:{1:"Barren Perimeter Reservoir",2:"Minor Perimeter Reservoir",3:"Ordinary Perimeter Reservoir",4:"Sizeable Perimeter Reservoir",5:"Token Perimeter Reservoir",6:"Bountiful Frontier Reservoir",7:"Vast Frontier Reservoir",8:"Instrumental Core Reservoir",9:"Vital Core Reservoir"},5:{1:"B520 - H",2:"D792 - H",3:"C140 - L",4:"C391 - L",5:"C248 - 0.0",6:"Z142 - 0.0"},6:{1:"Ordinary Perimeter Deposit",2:"Common Perimeter Deposit",3:"Unexceptional Frontier Deposit",4:"Average Frontier Deposit",5:"Rarified Core Deposit"},7:{1:"Superior Blood Raider Covert Research Facility"}},12:{1:{1:"Epicenter",2:"Expedition Command Outpost Wreck",3:"Planetary Colonization Office Wreck",4:"Testing Facilities"}},13:{5:{1:"P060 - C1",2:"Z647 - C1",3:"D382 - C2",4:"L005 - C2",5:"N766 - C2",6:"C247 - C3",7:"M267 - C3",8:"O477 - C3",9:"X877 - C4",10:"Y683 - C4",11:"H296 - C5",12:"H900 - C5",13:"H296 - C5",14:"N062 - C5",15:"V911 - C5",16:"U574 - C6",17:"V753 - C6",18:"W237 - C6",19:"B274 - H",20:"D792 - H",21:"D845 - H",22:"N110 - H",23:"A239 - L",24:"C391 - L",25:"J244 - L",26:"U201 - L",27:"U210 - L",28:"C248 - 0.0",29:"E545 - 0.0",30:"K346 - 0.0",31:"Z060 - 0.0"},6:{1:"Shattered Debris Field",2:"Shattered Ice Field"}},14:{1:{1:"Monolith",2:"Wormhole in Rock Circle",3:"Opposing Spatial Rifts",4:"Sleeper Enclave Debris",5:"Crystal Resource"}},15:{1:{1:"Wrecked Ships",2:"Unstable Wormhole",3:"Spatial Rift",4:"Heavily Guarded Spatial Rift",5:"Crystals"}},16:{1:{1:"Ship Graveyard",2:"Sleeper Engineering Station",3:"Spatial Rift",4:"Sleeper Enclave in Coral Rock",5:"Crystals and Stone Circle"}},17:{1:{1:"Monolith",2:"Caged Wormhole",3:"Rock Formation and Wormhole",4:"Particle Acceleration Array",5:"Guarded Asteroid Station"}},18:{1:{1:"Ship Graveyard",2:"Caged Wormhole",3:"Spatial Rift Generator",4:"Sleeper Enclave",5:"Hollow Asteroid"}}},2:{30:{5:{1:"Z971 - C1",2:"R943 - C2",3:"X702 - C3",4:"O128 - C4",5:"M555 - C5",6:"B041 - C6",7:"A641 - H",8:"R051 - L",9:"V283 - 0.0",10:"T458 - C12 Thera"}},31:{5:{1:"Z971 - C1",2:"R943 - C2",3:"X702 - C3",4:"O128 - C4",5:"N432 - C5",6:"U319 - C6",7:"B449 - H",8:"N944 - L",9:"S199 - 0.0",10:"M164 - C12 Thera"}},32:{5:{1:"Z971 - C1",2:"R943 - C2",3:"X702 - C3",4:"O128 - C4",5:"N432 - C5",6:"U319 - C6",7:"B449 - H",8:"N944 - L",9:"S199 - 0.0",10:"L031 - C12 Thera"}}}}}),"undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");!function(e){"use strict";var t=e.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1==t[0]&&9==t[1]&&t[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),function(e){"use strict";e.fn.emulateTransitionEnd=function(t){var n=!1,r=this;e(this).one("bsTransitionEnd",function(){n=!0});return setTimeout(function(){n||e(r).trigger(e.support.transition.end)},t),this},e(function(){e.support.transition=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var n in t)if(void 0!==e.style[n])return{end:t[n]};return!1}(),e.support.transition&&(e.event.special.bsTransitionEnd={bindType:e.support.transition.end,delegateType:e.support.transition.end,handle:function(t){return e(t.target).is(this)?t.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.VERSION="3.3.5",n.TRANSITION_DURATION=150,n.prototype.close=function(t){function r(){i.detach().trigger("closed.bs.alert").remove()}var o=e(this),a=o.attr("data-target");a||(a=(a=o.attr("href"))&&a.replace(/.*(?=#[^\s]*$)/,""));var i=e(a);t&&t.preventDefault(),i.length||(i=o.closest(".alert")),i.trigger(t=e.Event("close.bs.alert")),t.isDefaultPrevented()||(i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.one("bsTransitionEnd",r).emulateTransitionEnd(n.TRANSITION_DURATION):r())};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),o=r.data("bs.alert");o||r.data("bs.alert",o=new n(this)),"string"==typeof t&&o[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.bs.alert.data-api",t,n.prototype.close)}(jQuery),function(e){"use strict";function t(t){return this.each(function(){var r=e(this),o=r.data("bs.button"),a="object"==typeof t&&t;o||r.data("bs.button",o=new n(this,a)),"toggle"==t?o.toggle():t&&o.setState(t)})}var n=function(t,r){this.$element=e(t),this.options=e.extend({},n.DEFAULTS,r),this.isLoading=!1};n.VERSION="3.3.5",n.DEFAULTS={loadingText:"loading..."},n.prototype.setState=function(t){var n="disabled",r=this.$element,o=r.is("input")?"val":"html",a=r.data();t+="Text",null==a.resetText&&r.data("resetText",r[o]()),setTimeout(e.proxy(function(){r[o](null==a[t]?this.options[t]:a[t]),"loadingText"==t?(this.isLoading=!0,r.addClass(n).attr(n,n)):this.isLoading&&(this.isLoading=!1,r.removeClass(n).removeAttr(n))},this),0)},n.prototype.toggle=function(){var e=!0,t=this.$element.closest('[data-toggle="buttons"]');if(t.length){var n=this.$element.find("input");"radio"==n.prop("type")?(n.prop("checked")&&(e=!1),t.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==n.prop("type")&&(n.prop("checked")!==this.$element.hasClass("active")&&(e=!1),this.$element.toggleClass("active")),n.prop("checked",this.$element.hasClass("active")),e&&n.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var r=e.fn.button;e.fn.button=t,e.fn.button.Constructor=n,e.fn.button.noConflict=function(){return e.fn.button=r,this},e(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(n){var r=e(n.target);r.hasClass("btn")||(r=r.closest(".btn")),t.call(r,"toggle"),e(n.target).is('input[type="radio"]')||e(n.target).is('input[type="checkbox"]')||n.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(t){e(t.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(t.type))})}(jQuery),function(e){"use strict";function t(t){return this.each(function(){var r=e(this),o=r.data("bs.carousel"),a=e.extend({},n.DEFAULTS,r.data(),"object"==typeof t&&t),i="string"==typeof t?t:a.slide;o||r.data("bs.carousel",o=new n(this,a)),"number"==typeof t?o.to(t):i?o[i]():a.interval&&o.pause().cycle()})}var n=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",e.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",e.proxy(this.pause,this)).on("mouseleave.bs.carousel",e.proxy(this.cycle,this))};n.VERSION="3.3.5",n.TRANSITION_DURATION=600,n.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},n.prototype.keydown=function(e){if(!/input|textarea/i.test(e.target.tagName)){switch(e.which){case 37:this.prev();break;case 39:this.next();break;default:return}e.preventDefault()}},n.prototype.cycle=function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},n.prototype.getItemIndex=function(e){return this.$items=e.parent().children(".item"),this.$items.index(e||this.$active)},n.prototype.getItemForDirection=function(e,t){var n=this.getItemIndex(t);if(("prev"==e&&0===n||"next"==e&&n==this.$items.length-1)&&!this.options.wrap)return t;var r=(n+("prev"==e?-1:1))%this.$items.length;return this.$items.eq(r)},n.prototype.to=function(e){var t=this,n=this.getItemIndex(this.$active=this.$element.find(".item.active"));return e>this.$items.length-1||0>e?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){t.to(e)}):n==e?this.pause().cycle():this.slide(e>n?"next":"prev",this.$items.eq(e))},n.prototype.pause=function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},n.prototype.next=function(){return this.sliding?void 0:this.slide("next")},n.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},n.prototype.slide=function(t,r){var o=this.$element.find(".item.active"),a=r||this.getItemForDirection(t,o),i=this.interval,s="next"==t?"left":"right",l=this;if(a.hasClass("active"))return this.sliding=!1;var c=a[0],u=e.Event("slide.bs.carousel",{relatedTarget:c,direction:s});if(this.$element.trigger(u),!u.isDefaultPrevented()){if(this.sliding=!0,i&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var d=e(this.$indicators.children()[this.getItemIndex(a)]);d&&d.addClass("active")}var f=e.Event("slid.bs.carousel",{relatedTarget:c,direction:s});return e.support.transition&&this.$element.hasClass("slide")?(a.addClass(t),a[0].offsetWidth,o.addClass(s),a.addClass(s),o.one("bsTransitionEnd",function(){a.removeClass([t,s].join(" ")).addClass("active"),o.removeClass(["active",s].join(" ")),l.sliding=!1,setTimeout(function(){l.$element.trigger(f)},0)}).emulateTransitionEnd(n.TRANSITION_DURATION)):(o.removeClass("active"),a.addClass("active"),this.sliding=!1,this.$element.trigger(f)),i&&this.cycle(),this}};var r=e.fn.carousel;e.fn.carousel=t,e.fn.carousel.Constructor=n,e.fn.carousel.noConflict=function(){return e.fn.carousel=r,this};var o=function(n){var r,o=e(this),a=e(o.attr("data-target")||(r=o.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""));if(a.hasClass("carousel")){var i=e.extend({},a.data(),o.data()),s=o.attr("data-slide-to");s&&(i.interval=!1),t.call(a,i),s&&a.data("bs.carousel").to(s),n.preventDefault()}};e(document).on("click.bs.carousel.data-api","[data-slide]",o).on("click.bs.carousel.data-api","[data-slide-to]",o),e(window).on("load",function(){e('[data-ride="carousel"]').each(function(){var n=e(this);t.call(n,n.data())})})}(jQuery),function(e){"use strict";function t(t){var n,r=t.attr("data-target")||(n=t.attr("href"))&&n.replace(/.*(?=#[^\s]+$)/,"");return e(r)}function n(t){return this.each(function(){var n=e(this),o=n.data("bs.collapse"),a=e.extend({},r.DEFAULTS,n.data(),"object"==typeof t&&t);!o&&a.toggle&&/show|hide/.test(t)&&(a.toggle=!1),o||n.data("bs.collapse",o=new r(this,a)),"string"==typeof t&&o[t]()})}var r=function(t,n){this.$element=e(t),this.options=e.extend({},r.DEFAULTS,n),this.$trigger=e('[data-toggle="collapse"][href="#'+t.id+'"],[data-toggle="collapse"][data-target="#'+t.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};r.VERSION="3.3.5",r.TRANSITION_DURATION=350,r.DEFAULTS={toggle:!0},r.prototype.dimension=function(){return this.$element.hasClass("width")?"width":"height"},r.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var t,o=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(o&&o.length&&(t=o.data("bs.collapse"),t&&t.transitioning))){var a=e.Event("show.bs.collapse");if(this.$element.trigger(a),!a.isDefaultPrevented()){o&&o.length&&(n.call(o,"hide"),t||o.data("bs.collapse",null));var i=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[i](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var s=function(){this.$element.removeClass("collapsing").addClass("collapse in")[i](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!e.support.transition)return s.call(this);var l=e.camelCase(["scroll",i].join("-"));this.$element.one("bsTransitionEnd",e.proxy(s,this)).emulateTransitionEnd(r.TRANSITION_DURATION)[i](this.$element[0][l])}}}},r.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var t=e.Event("hide.bs.collapse");if(this.$element.trigger(t),!t.isDefaultPrevented()){var n=this.dimension();this.$element[n](this.$element[n]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var o=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return e.support.transition?void this.$element[n](0).one("bsTransitionEnd",e.proxy(o,this)).emulateTransitionEnd(r.TRANSITION_DURATION):o.call(this)}}},r.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},r.prototype.getParent=function(){return e(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(e.proxy(function(n,r){var o=e(r);this.addAriaAndCollapsedClass(t(o),o)},this)).end()},r.prototype.addAriaAndCollapsedClass=function(e,t){var n=e.hasClass("in");e.attr("aria-expanded",n),t.toggleClass("collapsed",!n).attr("aria-expanded",n)};var o=e.fn.collapse;e.fn.collapse=n,e.fn.collapse.Constructor=r,e.fn.collapse.noConflict=function(){return e.fn.collapse=o,this},e(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(r){var o=e(this);o.attr("data-target")||r.preventDefault();var a=t(o),i=a.data("bs.collapse")?"toggle":o.data();n.call(a,i)})}(jQuery),function(e){"use strict";function t(t){var n=t.attr("data-target");n||(n=(n=t.attr("href"))&&/#[A-Za-z]/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,""));var r=n&&e(n);return r&&r.length?r:t.parent()}function n(n){n&&3===n.which||(e(r).remove(),e(o).each(function(){var r=e(this),o=t(r),a={relatedTarget:this};o.hasClass("open")&&(n&&"click"==n.type&&/input|textarea/i.test(n.target.tagName)&&e.contains(o[0],n.target)||(o.trigger(n=e.Event("hide.bs.dropdown",a)),n.isDefaultPrevented()||(r.attr("aria-expanded","false"),o.removeClass("open").trigger("hidden.bs.dropdown",a))))}))}var r=".dropdown-backdrop",o='[data-toggle="dropdown"]',a=function(t){e(t).on("click.bs.dropdown",this.toggle)};a.VERSION="3.3.5",a.prototype.toggle=function(r){var o=e(this);if(!o.is(".disabled, :disabled")){var a=t(o),i=a.hasClass("open");if(n(),!i){"ontouchstart"in document.documentElement&&!a.closest(".navbar-nav").length&&e(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(e(this)).on("click",n);var s={relatedTarget:this};if(a.trigger(r=e.Event("show.bs.dropdown",s)),r.isDefaultPrevented())return;o.trigger("focus").attr("aria-expanded","true"),a.toggleClass("open").trigger("shown.bs.dropdown",s)}return!1}},a.prototype.keydown=function(n){if(/(38|40|27|32)/.test(n.which)&&!/input|textarea/i.test(n.target.tagName)){var r=e(this);if(n.preventDefault(),n.stopPropagation(),!r.is(".disabled, :disabled")){var a=t(r),i=a.hasClass("open");if(!i&&27!=n.which||i&&27==n.which)return 27==n.which&&a.find(o).trigger("focus"),r.trigger("click");var s=a.find(".dropdown-menu li:not(.disabled):visible a");if(s.length){var l=s.index(n.target);38==n.which&&l>0&&l--,40==n.which&&ldocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&e?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!e?this.scrollbarWidth:""})},n.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},n.prototype.checkScrollbar=function(){var e=window.innerWidth;if(!e){var t=document.documentElement.getBoundingClientRect();e=t.right-Math.abs(t.left)}this.bodyIsOverflowing=document.body.clientWidth
      ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},t.prototype.init=function(t,n,r){if(this.enabled=!0,this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.$viewport=this.options.viewport&&e(e.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var o=this.options.trigger.split(" "),a=o.length;a--;){var i=o[a];if("click"==i)this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this));else if("manual"!=i){var s="hover"==i?"mouseenter":"focusin",l="hover"==i?"mouseleave":"focusout";this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(l+"."+this.type,this.options.selector,e.proxy(this.leave,this))}}this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},t.prototype.getDefaults=function(){return t.DEFAULTS},t.prototype.getOptions=function(t){return(t=e.extend({},this.getDefaults(),this.$element.data(),t)).delay&&"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),t},t.prototype.getDelegateOptions=function(){var t={},n=this.getDefaults();return this._options&&e.each(this._options,function(e,r){n[e]!=r&&(t[e]=r)}),t},t.prototype.enter=function(t){var n=t instanceof this.constructor?t:e(t.currentTarget).data("bs."+this.type);return n||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n)),t instanceof e.Event&&(n.inState["focusin"==t.type?"focus":"hover"]=!0),n.tip().hasClass("in")||"in"==n.hoverState?void(n.hoverState="in"):(clearTimeout(n.timeout),n.hoverState="in",n.options.delay&&n.options.delay.show?void(n.timeout=setTimeout(function(){"in"==n.hoverState&&n.show()},n.options.delay.show)):n.show())},t.prototype.isInStateTrue=function(){for(var e in this.inState)if(this.inState[e])return!0;return!1},t.prototype.leave=function(t){var n=t instanceof this.constructor?t:e(t.currentTarget).data("bs."+this.type);return n||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n)),t instanceof e.Event&&(n.inState["focusout"==t.type?"focus":"hover"]=!1),n.isInStateTrue()?void 0:(clearTimeout(n.timeout),n.hoverState="out",n.options.delay&&n.options.delay.hide?void(n.timeout=setTimeout(function(){"out"==n.hoverState&&n.hide()},n.options.delay.hide)):n.hide())},t.prototype.show=function(){var n=e.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(n);var r=e.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(n.isDefaultPrevented()||!r)return;var o=this,a=this.tip(),i=this.getUID(this.type);this.setContent(),a.attr("id",i),this.$element.attr("aria-describedby",i),this.options.animation&&a.addClass("fade");var s="function"==typeof this.options.placement?this.options.placement.call(this,a[0],this.$element[0]):this.options.placement,l=/\s?auto?\s?/i,c=l.test(s);c&&(s=s.replace(l,"")||"top"),a.detach().css({top:0,left:0,display:"block"}).addClass(s).data("bs."+this.type,this),this.options.container?a.appendTo(this.options.container):a.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var u=this.getPosition(),d=a[0].offsetWidth,f=a[0].offsetHeight;if(c){var p=s,h=this.getPosition(this.$viewport);s="bottom"==s&&u.bottom+f>h.bottom?"top":"top"==s&&u.top-fh.width?"left":"left"==s&&u.left-di.top+i.height&&(o.top=i.top+i.height-l)}else{var c=t.left-a,u=t.left+a+n;ci.right&&(o.left=i.left+i.width-u)}return o},t.prototype.getTitle=function(){var e=this.$element,t=this.options;return e.attr("data-original-title")||("function"==typeof t.title?t.title.call(e[0]):t.title)},t.prototype.getUID=function(e){do{e+=~~(1e6*Math.random())}while(document.getElementById(e));return e},t.prototype.tip=function(){if(!this.$tip&&(this.$tip=e(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},t.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},t.prototype.enable=function(){this.enabled=!0},t.prototype.disable=function(){this.enabled=!1},t.prototype.toggleEnabled=function(){this.enabled=!this.enabled},t.prototype.toggle=function(t){var n=this;t&&((n=e(t.currentTarget).data("bs."+this.type))||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n))),t?(n.inState.click=!n.inState.click,n.isInStateTrue()?n.enter(n):n.leave(n)):n.tip().hasClass("in")?n.leave(n):n.enter(n)},t.prototype.destroy=function(){var e=this;clearTimeout(this.timeout),this.hide(function(){e.$element.off("."+e.type).removeData("bs."+e.type),e.$tip&&e.$tip.detach(),e.$tip=null,e.$arrow=null,e.$viewport=null})};var n=e.fn.tooltip;e.fn.tooltip=function(n){return this.each(function(){var r=e(this),o=r.data("bs.tooltip"),a="object"==typeof n&&n;(o||!/destroy|hide/.test(n))&&(o||r.data("bs.tooltip",o=new t(this,a)),"string"==typeof n&&o[n]())})},e.fn.tooltip.Constructor=t,e.fn.tooltip.noConflict=function(){return e.fn.tooltip=n,this}}(jQuery),function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};if(!e.fn.tooltip)throw new Error("Popover requires tooltip.js");t.VERSION="3.3.5",t.DEFAULTS=e.extend({},e.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype),t.prototype.constructor=t,t.prototype.getDefaults=function(){return t.DEFAULTS},t.prototype.setContent=function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof n?"html":"append":"text"](n),e.removeClass("fade top bottom left right in"),e.find(".popover-title").html()||e.find(".popover-title").hide()},t.prototype.hasContent=function(){return this.getTitle()||this.getContent()},t.prototype.getContent=function(){var e=this.$element,t=this.options;return e.attr("data-content")||("function"==typeof t.content?t.content.call(e[0]):t.content)},t.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var n=e.fn.popover;e.fn.popover=function(n){return this.each(function(){var r=e(this),o=r.data("bs.popover"),a="object"==typeof n&&n;(o||!/destroy|hide/.test(n))&&(o||r.data("bs.popover",o=new t(this,a)),"string"==typeof n&&o[n]())})},e.fn.popover.Constructor=t,e.fn.popover.noConflict=function(){return e.fn.popover=n,this}}(jQuery),function(e){"use strict";function t(n,r){this.$body=e(document.body),this.$scrollElement=e(e(n).is(document.body)?window:n),this.options=e.extend({},t.DEFAULTS,r),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e.proxy(this.process,this)),this.refresh(),this.process()}function n(n){return this.each(function(){var r=e(this),o=r.data("bs.scrollspy"),a="object"==typeof n&&n;o||r.data("bs.scrollspy",o=new t(this,a)),"string"==typeof n&&o[n]()})}t.VERSION="3.3.5",t.DEFAULTS={offset:10},t.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},t.prototype.refresh=function(){var t=this,n="offset",r=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),e.isWindow(this.$scrollElement[0])||(n="position",r=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var t=e(this),o=t.data("target")||t.attr("href"),a=/^#./.test(o)&&e(o);return a&&a.length&&a.is(":visible")&&[[a[n]().top+r,o]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},t.prototype.process=function(){var e,t=this.$scrollElement.scrollTop()+this.options.offset,n=this.getScrollHeight(),r=this.options.offset+n-this.$scrollElement.height(),o=this.offsets,a=this.targets,i=this.activeTarget;if(this.scrollHeight!=n&&this.refresh(),t>=r)return i!=(e=a[a.length-1])&&this.activate(e);if(i&&t=o[e]&&(void 0===o[e+1]||t .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),t.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu").length&&t.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),o&&o()}var i=r.find("> .active"),s=o&&e.support.transition&&(i.length&&i.hasClass("fade")||!!r.find("> .fade").length);i.length&&s?i.one("bsTransitionEnd",a).emulateTransitionEnd(n.TRANSITION_DURATION):a(),i.removeClass("in")};var r=e.fn.tab;e.fn.tab=t,e.fn.tab.Constructor=n,e.fn.tab.noConflict=function(){return e.fn.tab=r,this};var o=function(n){n.preventDefault(),t.call(e(this),"show")};e(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',o).on("click.bs.tab.data-api",'[data-toggle="pill"]',o)}(jQuery),function(e){"use strict";function t(t){return this.each(function(){var r=e(this),o=r.data("bs.affix"),a="object"==typeof t&&t;o||r.data("bs.affix",o=new n(this,a)),"string"==typeof t&&o[t]()})}var n=function(t,r){this.options=e.extend({},n.DEFAULTS,r),this.$target=e(this.options.target).on("scroll.bs.affix.data-api",e.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",e.proxy(this.checkPositionWithEventLoop,this)),this.$element=e(t),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};n.VERSION="3.3.5",n.RESET="affix affix-top affix-bottom",n.DEFAULTS={offset:0,target:window},n.prototype.getState=function(e,t,n,r){var o=this.$target.scrollTop(),a=this.$element.offset(),i=this.$target.height();if(null!=n&&"top"==this.affixed)return n>o&&"top";if("bottom"==this.affixed)return null!=n?!(o+this.unpin<=a.top)&&"bottom":!(e-r>=o+i)&&"bottom";var s=null==this.affixed,l=s?o:a.top;return null!=n&&n>=o?"top":null!=r&&l+(s?i:t)>=e-r&&"bottom"},n.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(n.RESET).addClass("affix");var e=this.$target.scrollTop(),t=this.$element.offset();return this.pinnedOffset=t.top-e},n.prototype.checkPositionWithEventLoop=function(){setTimeout(e.proxy(this.checkPosition,this),1)},n.prototype.checkPosition=function(){if(this.$element.is(":visible")){var t=this.$element.height(),r=this.options.offset,o=r.top,a=r.bottom,i=Math.max(e(document).height(),e(document.body).height());"object"!=typeof r&&(a=o=r),"function"==typeof o&&(o=r.top(this.$element)),"function"==typeof a&&(a=r.bottom(this.$element));var s=this.getState(i,t,o,a);if(this.affixed!=s){null!=this.unpin&&this.$element.css("top","");var l="affix"+(s?"-"+s:""),c=e.Event(l+".bs.affix");if(this.$element.trigger(c),c.isDefaultPrevented())return;this.affixed=s,this.unpin="bottom"==s?this.getPinnedOffset():null,this.$element.removeClass(n.RESET).addClass(l).trigger(l.replace("affix","affixed")+".bs.affix")}"bottom"==s&&this.$element.offset({top:i-t-a})}};var r=e.fn.affix;e.fn.affix=t,e.fn.affix.Constructor=n,e.fn.affix.noConflict=function(){return e.fn.affix=r,this},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var n=e(this),r=n.data();r.offset=r.offset||{},null!=r.offsetBottom&&(r.offset.bottom=r.offsetBottom),null!=r.offsetTop&&(r.offset.top=r.offsetTop),t.call(n,r)})})}(jQuery),define("bootstrap",["jquery"],function(){}),function(e,t){"use strict";"function"==typeof define&&define.amd?define("bootbox",["jquery"],t):"object"==typeof exports?module.exports=t(require("jquery")):e.bootbox=t(e.jQuery)}(this,function e(t,n){"use strict";var r,o,a,i;Object.keys||(Object.keys=(r=Object.prototype.hasOwnProperty,o=!{toString:null}.propertyIsEnumerable("toString"),i=(a=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"]).length,function(e){if("function"!=typeof e&&("object"!=typeof e||null===e))throw new TypeError("Object.keys called on non-object");var t,n,s=[];for(t in e)r.call(e,t)&&s.push(t);if(o)for(n=0;n
      ',header:'',footer:'',closeButton:'',form:'
      ',button:'',option:"",promptMessage:'
      ',inputs:{text:'',textarea:'',email:'',select:'',checkbox:'
      ',radio:'
      ',date:'',time:'',number:'',password:'',range:''}},u={locale:"en",backdrop:"static",animate:!0,className:null,closeButton:!0,show:!0,container:"body",value:"",inputType:"text",swapButtonOrder:!1,centerVertical:!1,multiple:!1,scrollable:!1};function d(e,r,o,a){var i,s,c,d;return a&&a[0]&&(i=a[0].locale||u.locale,(a[0].swapButtonOrder||u.swapButtonOrder)&&(r=r.reverse())),s=function(e,n,r){return t.extend(!0,{},e,function(e,t){var n=e.length,r={};if(n<1||2").attr("label",r.group)),o=f[r.group]);var i=t(c.option);i.attr("value",r.value).text(r.text),o.append(i)}),p(f,function(e,t){a.append(t)}),a.val(e.value);break;case"checkbox":var h=t.isArray(e.value)?e.value:[e.value];if(!(l=e.inputOptions||[]).length)throw new Error('prompt with "inputType" set to "checkbox" requires at least one option');a=t('
      '),p(l,function(r,o){if(o.value===n||o.text===n)throw new Error('each option needs a "value" property and a "text" property');var i=t(c.inputs[e.inputType]);i.find("input").attr("value",o.value),i.find("label").append("\n"+o.text),p(h,function(e,t){t===o.value&&i.find("input").prop("checked",!0)}),a.append(i)});break;case"radio":if(e.value!==n&&t.isArray(e.value))throw new Error('prompt with "inputType" set to "radio" requires a single, non-array value for "value"');if(!(l=e.inputOptions||[]).length)throw new Error('prompt with "inputType" set to "radio" requires at least one option');a=t('
      ');var v=!0;p(l,function(r,o){if(o.value===n||o.text===n)throw new Error('each option needs a "value" property and a "text" property');var i=t(c.inputs[e.inputType]);i.find("input").attr("value",o.value),i.find("label").append("\n"+o.text),e.value!==n&&o.value===e.value&&(i.find("input").prop("checked",!0),v=!1),a.append(i)}),v&&a.find('input[type="radio"]').first().prop("checked",!0)}if(o.append(a),o.on("submit",function(e){e.preventDefault(),e.stopPropagation(),r.find(".bootbox-accept").trigger("click")}),""!==t.trim(e.message)){var y=t(c.promptMessage).html(e.message);o.prepend(y),e.message=o}else e.message=o;return(r=s.dialog(e)).off("shown.bs.modal"),r.on("shown.bs.modal",function(){a.focus()}),!0===i&&r.modal("show"),r},s.addLocale("en",{OK:"OK",CANCEL:"Cancel",CONFIRM:"OK"}),s}),function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define("localForage",[],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).localforage=e()}}(function(){return function e(t,n,r){function o(i,s){if(!n[i]){if(!t[i]){var l="function"==typeof require&&require;if(!s&&l)return l(i,!0);if(a)return a(i,!0);var c=new Error("Cannot find module '"+i+"'");throw c.code="MODULE_NOT_FOUND",c}var u=n[i]={exports:{}};t[i][0].call(u.exports,function(e){return o(t[i][1][e]||e)},u,u.exports,e,t,n,r)}return n[i].exports}for(var a="function"==typeof require&&require,i=0;i=43)}}).catch(function(){return!1})}(e).then(function(e){return F=e})}function c(e){var t=P[e.name],n={};n.promise=new E(function(e,t){n.resolve=e,n.reject=t}),t.deferredOperations.push(n),t.dbReady?t.dbReady=t.dbReady.then(function(){return n.promise}):t.dbReady=n.promise}function u(e){var t=P[e.name].deferredOperations.pop();if(t)return t.resolve(),t.promise}function d(e,t){var n=P[e.name].deferredOperations.pop();if(n)return n.reject(t),n.promise}function f(e,t){return new E(function(n,r){if(P[e.name]=P[e.name]||{forages:[],db:null,dbReady:null,deferredOperations:[]},e.db){if(!t)return n(e.db);c(e),e.db.close()}var o=[e.name];t&&o.push(e.version);var a=A.open.apply(A,o);t&&(a.onupgradeneeded=function(t){var n=a.result;try{n.createObjectStore(e.storeName),t.oldVersion<=1&&n.createObjectStore(O)}catch(n){if("ConstraintError"!==n.name)throw n;console.warn('The database "'+e.name+'" has been upgraded from version '+t.oldVersion+" to version "+t.newVersion+', but the storage "'+e.storeName+'" already exists.')}}),a.onerror=function(e){e.preventDefault(),r(a.error)},a.onsuccess=function(){n(a.result),u(e)}})}function p(e){return f(e,!1)}function h(e){return f(e,!0)}function m(e,t){if(!e.db)return!0;var n=!e.db.objectStoreNames.contains(e.storeName),r=e.versione.db.version;if(r&&(e.version!==t&&console.warn('The database "'+e.name+"\" can't be downgraded from version "+e.db.version+" to version "+e.version+"."),e.version=e.db.version),o||n){if(n){var a=e.db.version+1;a>e.version&&(e.version=a)}return!0}return!1}function g(e){return r([function(e){for(var t=e.length,n=new ArrayBuffer(t),r=new Uint8Array(n),o=0;o0&&(!e.db||"InvalidStateError"===o.name||"NotFoundError"===o.name))return E.resolve().then(function(){if(!e.db||"NotFoundError"===o.name&&!e.db.objectStoreNames.contains(e.storeName)&&e.version<=e.db.version)return e.db&&(e.version=e.db.version+1),h(e)}).then(function(){return function(e){c(e);for(var t=P[e.name],n=t.forages,r=0;r>4,u[l++]=(15&r)<<4|o>>2,u[l++]=(3&o)<<6|63&a;return c}function x(e){var t,n=new Uint8Array(e),r="";for(t=0;t>2],r+=N[(3&n[t])<<4|n[t+1]>>4],r+=N[(15&n[t+1])<<2|n[t+2]>>6],r+=N[63&n[t+2]];return n.length%3==2?r=r.substring(0,r.length-1)+"=":n.length%3==1&&(r=r.substring(0,r.length-2)+"=="),r}function C(e,t,n,r){e.executeSql("CREATE TABLE IF NOT EXISTS "+t.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],n,r)}function S(e,t,n,r,o,a){e.executeSql(n,r,o,function(e,i){i.code===i.SYNTAX_ERR?e.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[t.storeName],function(e,s){s.rows.length?a(e,i):C(e,t,function(){e.executeSql(n,r,o,a)},a)},a):a(e,i)},a)}function _(e,t){var n=e.name+"/";return e.storeName!==t.storeName&&(n+=e.storeName+"/"),n}function T(){return!function(){var e="_localforage_support_test";try{return localStorage.setItem(e,!0),localStorage.removeItem(e),!1}catch(e){return!0}}()||localStorage.length>0}function D(e,t){e[t]=function(){var n=arguments;return e.ready().then(function(){return e[t].apply(e,n)})}}function I(){for(var e=1;e0)return void o(e.apply(s,[t,l,r,a-1]));i(n)}})})}).catch(i)});return o(l,r),l}.apply(this,[e,t,n,1])},removeItem:function(e,t){var n=this;e=i(e);var r=new E(function(t,r){n.ready().then(function(){var o=n._dbInfo;o.db.transaction(function(n){S(n,o,"DELETE FROM "+o.storeName+" WHERE key = ?",[e],function(){t()},function(e,t){r(t)})})}).catch(r)});return o(r,t),r},clear:function(e){var t=this,n=new E(function(e,n){t.ready().then(function(){var r=t._dbInfo;r.db.transaction(function(t){S(t,r,"DELETE FROM "+r.storeName,[],function(){e()},function(e,t){n(t)})})}).catch(n)});return o(n,e),n},length:function(e){var t=this,n=new E(function(e,n){t.ready().then(function(){var r=t._dbInfo;r.db.transaction(function(t){S(t,r,"SELECT COUNT(key) as c FROM "+r.storeName,[],function(t,n){var r=n.rows.item(0).c;e(r)},function(e,t){n(t)})})}).catch(n)});return o(n,e),n},key:function(e,t){var n=this,r=new E(function(t,r){n.ready().then(function(){var o=n._dbInfo;o.db.transaction(function(n){S(n,o,"SELECT key FROM "+o.storeName+" WHERE id = ? LIMIT 1",[e+1],function(e,n){var r=n.rows.length?n.rows.item(0).key:null;t(r)},function(e,t){r(t)})})}).catch(r)});return o(r,t),r},keys:function(e){var t=this,n=new E(function(e,n){t.ready().then(function(){var r=t._dbInfo;r.db.transaction(function(t){S(t,r,"SELECT key FROM "+r.storeName,[],function(t,n){for(var r=[],o=0;o '__WebKitDatabaseInfoTable__'",[],function(n,r){for(var o=[],a=0;a=0;n--){var r=localStorage.key(n);0===r.indexOf(e)&&localStorage.removeItem(r)}});return o(n,e),n},length:function(e){var t=this.keys().then(function(e){return e.length});return o(t,e),t},key:function(e,t){var n=this,r=n.ready().then(function(){var t,r=n._dbInfo;try{t=localStorage.key(e)}catch(e){t=null}return t&&(t=t.substring(r.keyPrefix.length)),t});return o(r,t),r},keys:function(e){var t=this,n=t.ready().then(function(){for(var e=t._dbInfo,n=localStorage.length,r=[],o=0;o=0;t--){var n=localStorage.key(t);0===n.indexOf(e)&&localStorage.removeItem(n)}}):E.reject("Invalid arguments"),t),r}},ae=function(e,t){return e===t||"number"==typeof e&&"number"==typeof t&&isNaN(e)&&isNaN(t)},ie=function(e,t){for(var n=e.length,r=0;rc.failure_limit)return!1}else n.trigger("appear"),t=0})}var s,l=this,c={threshold:0,failure_limit:0,event:"scroll",effect:"show",container:t,data_attribute:"original",skip_invisible:!1,appear:null,load:null,placeholder:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC"};return a&&(r!==a.failurelimit&&(a.failure_limit=a.failurelimit,delete a.failurelimit),r!==a.effectspeed&&(a.effect_speed=a.effectspeed,delete a.effectspeed),e.extend(c,a)),s=c.container===r||c.container===t?o:e(c.container),0===c.event.indexOf("scroll")&&s.bind(c.event,function(){return i()}),this.each(function(){var t=this,n=e(t);t.loaded=!1,(n.attr("src")===r||!1===n.attr("src"))&&n.is("img")&&n.attr("src",c.placeholder),n.one("appear",function(){if(!this.loaded){if(c.appear){var r=l.length;c.appear.call(t,r,c)}e("").bind("load",function(){var r=n.attr("data-"+c.data_attribute);n.hide(),n.is("img")?n.attr("src",r):n.css("background-image","url('"+r+"')"),n[c.effect](c.effect_speed),t.loaded=!0;var o=e.grep(l,function(e){return!e.loaded});if(l=e(o),c.load){var a=l.length;c.load.call(t,a,c)}}).attr("src",n.attr("data-"+c.data_attribute))}}),0!==c.event.indexOf("scroll")&&n.bind(c.event,function(){t.loaded||n.trigger("appear")})}),o.bind("resize",function(){i()}),/(?:iphone|ipod|ipad).*os 5/gi.test(navigator.appVersion)&&o.bind("pageshow",function(t){t.originalEvent&&t.originalEvent.persisted&&l.each(function(){e(this).trigger("appear")})}),e(n).ready(function(){i()}),this},e.belowthefold=function(n,a){return(a.container===r||a.container===t?(t.innerHeight?t.innerHeight:o.height())+o.scrollTop():e(a.container).offset().top+e(a.container).height())<=e(n).offset().top-a.threshold},e.rightoffold=function(n,a){return(a.container===r||a.container===t?o.width()+o.scrollLeft():e(a.container).offset().left+e(a.container).width())<=e(n).offset().left-a.threshold},e.abovethetop=function(n,a){return(a.container===r||a.container===t?o.scrollTop():e(a.container).offset().top)>=e(n).offset().top+a.threshold+e(n).height()},e.leftofbegin=function(n,a){return(a.container===r||a.container===t?o.scrollLeft():e(a.container).offset().left)>=e(n).offset().left+a.threshold+e(n).width()},e.inviewport=function(t,n){return!(e.rightoffold(t,n)||e.leftofbegin(t,n)||e.belowthefold(t,n)||e.abovethetop(t,n))},e.extend(e.expr[":"],{"below-the-fold":function(t){return e.belowthefold(t,{threshold:0})},"above-the-top":function(t){return!e.belowthefold(t,{threshold:0})},"right-of-screen":function(t){return e.rightoffold(t,{threshold:0})},"left-of-screen":function(t){return!e.rightoffold(t,{threshold:0})},"in-viewport":function(t){return e.inviewport(t,{threshold:0})},"above-the-fold":function(t){return!e.belowthefold(t,{threshold:0})},"right-of-fold":function(t){return e.rightoffold(t,{threshold:0})},"left-of-fold":function(t){return!e.rightoffold(t,{threshold:0})}})}(jQuery,window,document),define("lazyload",["jquery"],function(){}),function(e){"use strict";function t(e){var t=e.length,r=n.type(e);return"function"!==r&&!n.isWindow(e)&&(!(1!==e.nodeType||!t)||"array"===r||0===t||"number"==typeof t&&t>0&&t-1 in e)}if(!e.jQuery){var n=function(e,t){return new n.fn.init(e,t)};n.isWindow=function(e){return e&&e===e.window},n.type=function(e){return e?"object"==typeof e||"function"==typeof e?o[i.call(e)]||"object":typeof e:e+""},n.isArray=Array.isArray||function(e){return"array"===n.type(e)},n.isPlainObject=function(e){var t;if(!e||"object"!==n.type(e)||e.nodeType||n.isWindow(e))return!1;try{if(e.constructor&&!a.call(e,"constructor")&&!a.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(e){return!1}for(t in e);return void 0===t||a.call(e,t)},n.each=function(e,n,r){var o=0,a=e.length,i=t(e);if(r){if(i)for(;o0?o=i:n=i}while(Math.abs(a)>m&&++s=h?u(t,i):0===s?i:d(t,n,n+y)}(t),n,o)};S.getControlPoints=function(){return[{x:e,y:n},{x:r,y:o}]};var _="generateBezier("+[e,n,r,o]+")";return S.toString=function(){return _},S}function c(e,t){var n=e;return y.isString(e)?C.Easings[e]||(n=!1):n=y.isArray(e)&&1===e.length?function(e){return function(t){return Math.round(t*e)*(1/e)}}.apply(null,e):y.isArray(e)&&2===e.length?S.apply(null,e.concat([t])):!(!y.isArray(e)||4!==e.length)&&l.apply(null,e),!1===n&&(n=C.Easings[C.defaults.easing]?C.defaults.easing:x),n}function u(e){if(e){var t=C.timestamp&&!0!==e?e:m.now(),n=C.State.calls.length;n>1e4&&(C.State.calls=function(e){for(var t=-1,n=e?e.length:0,r=[];++t4;e--){var t=n.createElement("div");if(t.innerHTML="\x3c!--[if IE "+e+"]>=0?t:Math.max(0,r+t),s=(n<0?r+n:Math.min(n,r))-i;if(s>0)if(a=new Array(s),this.charAt)for(o=0;o=0}:function(e,t){for(var n=0;n1e-4&&Math.abs(s.v)>1e-4;);return a?function(e){return c[e*(c.length-1)|0]}:u}}();C.Easings={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},spring:function(e){return 1-Math.cos(4.5*e*Math.PI)*Math.exp(6*-e)}},f.each([["ease",[.25,.1,.25,1]],["ease-in",[.42,0,1,1]],["ease-out",[0,0,.58,1]],["ease-in-out",[.42,0,.58,1]],["easeInSine",[.47,0,.745,.715]],["easeOutSine",[.39,.575,.565,1]],["easeInOutSine",[.445,.05,.55,.95]],["easeInQuad",[.55,.085,.68,.53]],["easeOutQuad",[.25,.46,.45,.94]],["easeInOutQuad",[.455,.03,.515,.955]],["easeInCubic",[.55,.055,.675,.19]],["easeOutCubic",[.215,.61,.355,1]],["easeInOutCubic",[.645,.045,.355,1]],["easeInQuart",[.895,.03,.685,.22]],["easeOutQuart",[.165,.84,.44,1]],["easeInOutQuart",[.77,0,.175,1]],["easeInQuint",[.755,.05,.855,.06]],["easeOutQuint",[.23,1,.32,1]],["easeInOutQuint",[.86,0,.07,1]],["easeInExpo",[.95,.05,.795,.035]],["easeOutExpo",[.19,1,.22,1]],["easeInOutExpo",[1,0,0,1]],["easeInCirc",[.6,.04,.98,.335]],["easeOutCirc",[.075,.82,.165,1]],["easeInOutCirc",[.785,.135,.15,.86]]],function(e,t){C.Easings[t[0]]=l.apply(null,t[1])});var _=C.CSS={RegEx:{isHex:/^#([A-f\d]{3}){1,2}$/i,valueUnwrap:/^[A-z]+\((.*)\)$/i,wrappedValueAlreadyExtracted:/[0-9.]+ [0-9.]+ [0-9.]+( [0-9.]+)?/,valueSplit:/([A-z]+\(.+\))|(([A-z0-9#-.]+?)(?=\s|$))/gi},Lists:{colors:["fill","stroke","stopColor","color","backgroundColor","borderColor","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","outlineColor"],transformsBase:["translateX","translateY","scale","scaleX","scaleY","skewX","skewY","rotateZ"],transforms3D:["transformPerspective","translateZ","scaleZ","rotateX","rotateY"],units:["%","em","ex","ch","rem","vw","vh","vmin","vmax","cm","mm","Q","in","pc","pt","px","deg","grad","rad","turn","s","ms"],colorNames:{aliceblue:"240,248,255",antiquewhite:"250,235,215",aquamarine:"127,255,212",aqua:"0,255,255",azure:"240,255,255",beige:"245,245,220",bisque:"255,228,196",black:"0,0,0",blanchedalmond:"255,235,205",blueviolet:"138,43,226",blue:"0,0,255",brown:"165,42,42",burlywood:"222,184,135",cadetblue:"95,158,160",chartreuse:"127,255,0",chocolate:"210,105,30",coral:"255,127,80",cornflowerblue:"100,149,237",cornsilk:"255,248,220",crimson:"220,20,60",cyan:"0,255,255",darkblue:"0,0,139",darkcyan:"0,139,139",darkgoldenrod:"184,134,11",darkgray:"169,169,169",darkgrey:"169,169,169",darkgreen:"0,100,0",darkkhaki:"189,183,107",darkmagenta:"139,0,139",darkolivegreen:"85,107,47",darkorange:"255,140,0",darkorchid:"153,50,204",darkred:"139,0,0",darksalmon:"233,150,122",darkseagreen:"143,188,143",darkslateblue:"72,61,139",darkslategray:"47,79,79",darkturquoise:"0,206,209",darkviolet:"148,0,211",deeppink:"255,20,147",deepskyblue:"0,191,255",dimgray:"105,105,105",dimgrey:"105,105,105",dodgerblue:"30,144,255",firebrick:"178,34,34",floralwhite:"255,250,240",forestgreen:"34,139,34",fuchsia:"255,0,255",gainsboro:"220,220,220",ghostwhite:"248,248,255",gold:"255,215,0",goldenrod:"218,165,32",gray:"128,128,128",grey:"128,128,128",greenyellow:"173,255,47",green:"0,128,0",honeydew:"240,255,240",hotpink:"255,105,180",indianred:"205,92,92",indigo:"75,0,130",ivory:"255,255,240",khaki:"240,230,140",lavenderblush:"255,240,245",lavender:"230,230,250",lawngreen:"124,252,0",lemonchiffon:"255,250,205",lightblue:"173,216,230",lightcoral:"240,128,128",lightcyan:"224,255,255",lightgoldenrodyellow:"250,250,210",lightgray:"211,211,211",lightgrey:"211,211,211",lightgreen:"144,238,144",lightpink:"255,182,193",lightsalmon:"255,160,122",lightseagreen:"32,178,170",lightskyblue:"135,206,250",lightslategray:"119,136,153",lightsteelblue:"176,196,222",lightyellow:"255,255,224",limegreen:"50,205,50",lime:"0,255,0",linen:"250,240,230",magenta:"255,0,255",maroon:"128,0,0",mediumaquamarine:"102,205,170",mediumblue:"0,0,205",mediumorchid:"186,85,211",mediumpurple:"147,112,219",mediumseagreen:"60,179,113",mediumslateblue:"123,104,238",mediumspringgreen:"0,250,154",mediumturquoise:"72,209,204",mediumvioletred:"199,21,133",midnightblue:"25,25,112",mintcream:"245,255,250",mistyrose:"255,228,225",moccasin:"255,228,181",navajowhite:"255,222,173",navy:"0,0,128",oldlace:"253,245,230",olivedrab:"107,142,35",olive:"128,128,0",orangered:"255,69,0",orange:"255,165,0",orchid:"218,112,214",palegoldenrod:"238,232,170",palegreen:"152,251,152",paleturquoise:"175,238,238",palevioletred:"219,112,147",papayawhip:"255,239,213",peachpuff:"255,218,185",peru:"205,133,63",pink:"255,192,203",plum:"221,160,221",powderblue:"176,224,230",purple:"128,0,128",red:"255,0,0",rosybrown:"188,143,143",royalblue:"65,105,225",saddlebrown:"139,69,19",salmon:"250,128,114",sandybrown:"244,164,96",seagreen:"46,139,87",seashell:"255,245,238",sienna:"160,82,45",silver:"192,192,192",skyblue:"135,206,235",slateblue:"106,90,205",slategray:"112,128,144",snow:"255,250,250",springgreen:"0,255,127",steelblue:"70,130,180",tan:"210,180,140",teal:"0,128,128",thistle:"216,191,216",tomato:"255,99,71",turquoise:"64,224,208",violet:"238,130,238",wheat:"245,222,179",whitesmoke:"245,245,245",white:"255,255,255",yellowgreen:"154,205,50",yellow:"255,255,0"}},Hooks:{templates:{textShadow:["Color X Y Blur","black 0px 0px 0px"],boxShadow:["Color X Y Blur Spread","black 0px 0px 0px 0px"],clip:["Top Right Bottom Left","0px 0px 0px 0px"],backgroundPosition:["X Y","0% 0%"],transformOrigin:["X Y Z","50% 50% 0px"],perspectiveOrigin:["X Y","50% 50%"]},registered:{},register:function(){for(var e=0;e<_.Lists.colors.length;e++){var t="color"===_.Lists.colors[e]?"0 0 0 1":"255 255 255 1";_.Hooks.templates[_.Lists.colors[e]]=["Red Green Blue Alpha",t]}var n,r,o;if(p)for(n in _.Hooks.templates)if(_.Hooks.templates.hasOwnProperty(n)){o=(r=_.Hooks.templates[n])[0].split(" ");var a=r[1].match(_.RegEx.valueSplit);"Color"===o[0]&&(o.push(o.shift()),a.push(a.shift()),_.Hooks.templates[n]=[o.join(" "),a.join(" ")])}for(n in _.Hooks.templates)if(_.Hooks.templates.hasOwnProperty(n))for(var i in o=(r=_.Hooks.templates[n])[0].split(" "))if(o.hasOwnProperty(i)){var s=n+o[i],l=i;_.Hooks.registered[s]=[n,l]}},getRoot:function(e){var t=_.Hooks.registered[e];return t?t[0]:e},getUnit:function(e,t){var n=(e.substr(t||0,5).match(/^[a-z%]+/)||[])[0]||"";return n&&v(_.Lists.units,n)?n:""},fixColors:function(e){return e.replace(/(rgba?\(\s*)?(\b[a-z]+\b)/g,function(e,t,n){return _.Lists.colorNames.hasOwnProperty(n)?(t||"rgba(")+_.Lists.colorNames[n]+(t?"":",1)"):t+n})},cleanRootPropertyValue:function(e,t){return _.RegEx.valueUnwrap.test(t)&&(t=t.match(_.RegEx.valueUnwrap)[1]),_.Values.isCSSNullValue(t)&&(t=_.Hooks.templates[e][1]),t},extractValue:function(e,t){var n=_.Hooks.registered[e];if(n){var r=n[0],o=n[1];return(t=_.Hooks.cleanRootPropertyValue(r,t)).toString().match(_.RegEx.valueSplit)[o]}return t},injectValue:function(e,t,n){var r=_.Hooks.registered[e];if(r){var o,a=r[0],i=r[1];return(o=(n=_.Hooks.cleanRootPropertyValue(a,n)).toString().match(_.RegEx.valueSplit))[i]=t,o.join(" ")}return n}},Normalizations:{registered:{clip:function(e,t,n){switch(e){case"name":return"clip";case"extract":var r;return _.RegEx.wrappedValueAlreadyExtracted.test(n)?r=n:r=(r=n.toString().match(_.RegEx.valueUnwrap))?r[1].replace(/,(\s+)?/g," "):n,r;case"inject":return"rect("+n+")"}},blur:function(e,t,n){switch(e){case"name":return C.State.isFirefox?"filter":"-webkit-filter";case"extract":var r=parseFloat(n);if(!r&&0!==r){var o=n.toString().match(/blur\(([0-9]+[A-z]+)\)/i);r=o?o[1]:0}return r;case"inject":return parseFloat(n)?"blur("+n+")":"none"}},opacity:function(e,t,n){if(p<=8)switch(e){case"name":return"filter";case"extract":var r=n.toString().match(/alpha\(opacity=(.*)\)/i);return r?r[1]/100:1;case"inject":return t.style.zoom=1,parseFloat(n)>=1?"":"alpha(opacity="+parseInt(100*parseFloat(n),10)+")"}else switch(e){case"name":return"opacity";case"extract":case"inject":return n}}},register:function(){function e(e,t,n){if("border-box"===_.getPropertyValue(t,"boxSizing").toString().toLowerCase()===(n||!1)){var r,o,a=0,i="width"===e?["Left","Right"]:["Top","Bottom"],s=["padding"+i[0],"padding"+i[1],"border"+i[0]+"Width","border"+i[1]+"Width"];for(r=0;r9)||C.State.isGingerbread||(_.Lists.transformsBase=_.Lists.transformsBase.concat(_.Lists.transforms3D));for(var n=0;n<_.Lists.transformsBase.length;n++)!function(){var e=_.Lists.transformsBase[n];_.Normalizations.registered[e]=function(t,n,o){switch(t){case"name":return"transform";case"extract":return a(n)===r||a(n).transformCache[e]===r?/^scale/i.test(e)?1:0:a(n).transformCache[e].replace(/[()]/g,"");case"inject":var i=!1;switch(e.substr(0,e.length-1)){case"translate":i=!/(%|px|em|rem|vw|vh|\d)$/i.test(o);break;case"scal":case"scale":C.State.isAndroid&&a(n).transformCache[e]===r&&o<1&&(o=1),i=!/(\d)$/i.test(o);break;case"skew":case"rotate":i=!/(deg|\d)$/i.test(o)}return i||(a(n).transformCache[e]="("+o+")"),a(n).transformCache[e]}}}();for(var o=0;o<_.Lists.colors.length;o++)!function(){var e=_.Lists.colors[o];_.Normalizations.registered[e]=function(t,n,o){switch(t){case"name":return e;case"extract":var a;if(_.RegEx.wrappedValueAlreadyExtracted.test(o))a=o;else{var i,s={black:"rgb(0, 0, 0)",blue:"rgb(0, 0, 255)",gray:"rgb(128, 128, 128)",green:"rgb(0, 128, 0)",red:"rgb(255, 0, 0)",white:"rgb(255, 255, 255)"};/^[A-z]+$/i.test(o)?i=s[o]!==r?s[o]:s.black:_.RegEx.isHex.test(o)?i="rgb("+_.Values.hexToRgb(o).join(" ")+")":/^rgba?\(/i.test(o)||(i=s.black),a=(i||o).toString().match(_.RegEx.valueUnwrap)[1].replace(/,(\s+)?/g," ")}return(!p||p>8)&&3===a.split(" ").length&&(a+=" 1"),a;case"inject":return/^rgb/.test(o)?o:(p<=8?4===o.split(" ").length&&(o=o.split(/\s+/).slice(0,3).join(" ")):3===o.split(" ").length&&(o+=" 1"),(p<=8?"rgb":"rgba")+"("+o.replace(/\s+/g,",").replace(/\.(\d)+(?=,)/g,"")+")")}}}();_.Normalizations.registered.innerWidth=t("width",!0),_.Normalizations.registered.innerHeight=t("height",!0),_.Normalizations.registered.outerWidth=t("width"),_.Normalizations.registered.outerHeight=t("height")}},Names:{camelCase:function(e){return e.replace(/-(\w)/g,function(e,t){return t.toUpperCase()})},SVGAttribute:function(e){var t="width|height|x|y|cx|cy|r|rx|ry|x1|x2|y1|y2";return(p||C.State.isAndroid&&!C.State.isChrome)&&(t+="|transform"),new RegExp("^("+t+")$","i").test(e)},prefixCheck:function(e){if(C.State.prefixMatches[e])return[C.State.prefixMatches[e],!0];for(var t=["","Webkit","Moz","ms","O"],n=0,r=t.length;n=2&&console.log("Get "+n+": "+l),l},setPropertyValue:function(e,n,r,o,i){var s=n;if("scroll"===n)i.container?i.container["scroll"+i.direction]=r:"Left"===i.direction?t.scrollTo(r,i.alternateValue):t.scrollTo(i.alternateValue,r);else if(_.Normalizations.registered[n]&&"transform"===_.Normalizations.registered[n]("name",e))_.Normalizations.registered[n]("inject",e,r),s="transform",r=a(e).transformCache[n];else{if(_.Hooks.registered[n]){var l=n,c=_.Hooks.getRoot(n);o=o||_.getPropertyValue(e,c),r=_.Hooks.injectValue(l,r,o),n=c}if(_.Normalizations.registered[n]&&(r=_.Normalizations.registered[n]("inject",e,r),n=_.Normalizations.registered[n]("name",e)),s=_.Names.prefixCheck(n)[0],p<=8)try{e.style[s]=r}catch(e){C.debug&&console.log("Browser does not support ["+r+"] for ["+s+"]")}else{var u=a(e);u&&u.isSVG&&_.Names.SVGAttribute(n)?e.setAttribute(n,r):e.style[s]=r}C.debug>=2&&console.log("Set "+n+" ("+s+"): "+r)}return[s,r]},flushTransformCache:function(e){var t="",n=a(e);if((p||C.State.isAndroid&&!C.State.isChrome)&&n&&n.isSVG){var r=function(t){return parseFloat(_.getPropertyValue(e,t))},o={translate:[r("translateX"),r("translateY")],skewX:[r("skewX")],skewY:[r("skewY")],scale:1!==r("scale")?[r("scale"),r("scale")]:[r("scaleX"),r("scaleY")],rotate:[r("rotateZ"),0,0]};f.each(a(e).transformCache,function(e){/^translate/i.test(e)?e="translate":/^scale/i.test(e)?e="scale":/^rotate/i.test(e)&&(e="rotate"),o[e]&&(t+=e+"("+o[e].join(" ")+") ",delete o[e])})}else{var i,s;f.each(a(e).transformCache,function(n){if(i=a(e).transformCache[n],"transformPerspective"===n)return s=i,!0;9===p&&"rotateZ"===n&&(n="rotate"),t+=n+i+" "}),s&&(t="perspective"+s+" "+t)}_.setPropertyValue(e,"transform",t)}};_.Hooks.register(),_.Normalizations.register(),C.hook=function(e,t,n){var i;return e=o(e),f.each(e,function(e,o){if(a(o)===r&&C.init(o),n===r)i===r&&(i=_.getPropertyValue(o,t));else{var s=_.setPropertyValue(o,t,n);"transform"===s[0]&&C.CSS.flushTransformCache(o),i=s}}),i};var T=function(){function e(){return h?I.promise||null:m}function l(e,o){function i(i){var p,h;if(l.begin&&0===E)try{l.begin.call(b,b)}catch(e){setTimeout(function(){throw e},1)}if("scroll"===k){var m,g,w,T=/^x$/i.test(l.axis)?"Left":"Top",D=parseFloat(l.offset)||0;l.container?y.isWrapped(l.container)||y.isNode(l.container)?(l.container=l.container[0]||l.container,w=(m=l.container["scroll"+T])+f(e).position()[T.toLowerCase()]+D):l.container=null:(m=C.State.scrollAnchor[C.State["scrollProperty"+T]],g=C.State.scrollAnchor[C.State["scrollProperty"+("Left"===T?"Top":"Left")]],w=f(e).offset()[T.toLowerCase()]+D),d={scroll:{rootPropertyValue:!1,startValue:m,currentValue:m,endValue:w,unitType:"",easing:l.easing,scrollData:{container:l.container,direction:T,alternateValue:g}},element:e},C.debug&&console.log("tweensContainer (scroll): ",d.scroll,e)}else if("reverse"===k){if(!(p=a(e)))return;if(!p.tweensContainer)return void f.dequeue(e,l.queue);for(var O in"none"===p.opts.display&&(p.opts.display="auto"),"hidden"===p.opts.visibility&&(p.opts.visibility="visible"),p.opts.loop=!1,p.opts.begin=null,p.opts.complete=null,S.easing||delete l.easing,S.duration||delete l.duration,l=f.extend({},p.opts,l),h=f.extend(!0,{},p?p.tweensContainer:null))if(h.hasOwnProperty(O)&&"element"!==O){var F=h[O].startValue;h[O].startValue=h[O].currentValue=h[O].endValue,h[O].endValue=F,y.isEmptyObject(S)||(h[O].easing=l.easing),C.debug&&console.log("reverse tweensContainer ("+O+"): "+JSON.stringify(h[O]),e)}d=h}else if("start"===k){(p=a(e))&&p.tweensContainer&&!0===p.isAnimating&&(h=p.tweensContainer);var P=function(o,a){var i,c=_.Hooks.getRoot(o),u=!1,m=a[0],g=a[1],v=a[2];if(p&&p.isSVG||"tween"===c||!1!==_.Names.prefixCheck(c)[1]||_.Normalizations.registered[c]!==r){(l.display!==r&&null!==l.display&&"none"!==l.display||l.visibility!==r&&"hidden"!==l.visibility)&&/opacity|filter/.test(o)&&!v&&0!==m&&(v=0),l._cacheValues&&h&&h[o]?(v===r&&(v=h[o].endValue+h[o].unitType),u=p.rootPropertyValueCache[c]):_.Hooks.registered[o]?v===r?(u=_.getPropertyValue(e,c),v=_.getPropertyValue(e,o,u)):u=_.Hooks.templates[c][1]:v===r&&(v=_.getPropertyValue(e,o));var b,w,x,S=!1,T=function(e,t){var n,r;return r=(t||"0").toString().toLowerCase().replace(/[%A-z]+$/,function(e){return n=e,""}),n||(n=_.Values.getUnitType(e)),[r,n]};if(v!==m&&y.isString(v)&&y.isString(m)){i="";var D=0,I=0,k=[],A=[],E=0,O=0,F=0;for(v=_.Hooks.fixColors(v),m=_.Hooks.fixColors(m);D=4&&"("===P?E++:(E&&E<5||E>=4&&")"===P&&--E<5)&&(E=0),0===O&&"r"===P||1===O&&"g"===P||2===O&&"b"===P||3===O&&"a"===P||O>=3&&"("===P?(3===O&&"a"===P&&(F=1),O++):F&&","===P?++F>3&&(O=F=0):(F&&O<(F?5:4)||O>=(F?4:3)&&")"===P&&--O<(F?5:4))&&(O=F=0)}}D===v.length&&I===m.length||(C.debug&&console.error('Trying to pattern match mis-matched strings ["'+m+'", "'+v+'"]'),i=r),i&&(k.length?(C.debug&&console.log('Pattern found "'+i+'" -> ',k,A,"["+v+","+m+"]"),v=k,m=A,w=x=""):i=r)}if(i||(v=(b=T(o,v))[0],x=b[1],m=(b=T(o,m))[0].replace(/^([+-\/*])=/,function(e,t){return S=t,""}),w=b[1],v=parseFloat(v)||0,m=parseFloat(m)||0,"%"===w&&(/^(fontSize|lineHeight)$/.test(o)?(m/=100,w="em"):/^scale/.test(o)?(m/=100,w=""):/(Red|Green|Blue)$/i.test(o)&&(m=m/100*255,w=""))),/[\/*]/.test(S))w=x;else if(x!==w&&0!==v)if(0===m)w=x;else{s=s||function(){var r={myParent:e.parentNode||n.body,position:_.getPropertyValue(e,"position"),fontSize:_.getPropertyValue(e,"fontSize")},o=r.position===$.lastPosition&&r.myParent===$.lastParent,a=r.fontSize===$.lastFontSize;$.lastParent=r.myParent,$.lastPosition=r.position,$.lastFontSize=r.fontSize;var i={};if(a&&o)i.emToPx=$.lastEmToPx,i.percentToPxWidth=$.lastPercentToPxWidth,i.percentToPxHeight=$.lastPercentToPxHeight;else{var s=p&&p.isSVG?n.createElementNS("http://www.w3.org/2000/svg","rect"):n.createElement("div");C.init(s),r.myParent.appendChild(s),f.each(["overflow","overflowX","overflowY"],function(e,t){C.CSS.setPropertyValue(s,t,"hidden")}),C.CSS.setPropertyValue(s,"position",r.position),C.CSS.setPropertyValue(s,"fontSize",r.fontSize),C.CSS.setPropertyValue(s,"boxSizing","content-box"),f.each(["minWidth","maxWidth","width","minHeight","maxHeight","height"],function(e,t){C.CSS.setPropertyValue(s,t,"100%")}),C.CSS.setPropertyValue(s,"paddingLeft","100em"),i.percentToPxWidth=$.lastPercentToPxWidth=(parseFloat(_.getPropertyValue(s,"width",null,!0))||1)/100,i.percentToPxHeight=$.lastPercentToPxHeight=(parseFloat(_.getPropertyValue(s,"height",null,!0))||1)/100,i.emToPx=$.lastEmToPx=(parseFloat(_.getPropertyValue(s,"paddingLeft"))||1)/100,r.myParent.removeChild(s)}return null===$.remToPx&&($.remToPx=parseFloat(_.getPropertyValue(n.body,"fontSize"))||16),null===$.vwToPx&&($.vwToPx=parseFloat(t.innerWidth)/100,$.vhToPx=parseFloat(t.innerHeight)/100),i.remToPx=$.remToPx,i.vwToPx=$.vwToPx,i.vhToPx=$.vhToPx,C.debug>=1&&console.log("Unit ratios: "+JSON.stringify(i),e),i}();var z=/margin|padding|left|right|width|text|word|letter/i.test(o)||/X$/.test(o)||"x"===o?"x":"y";switch(x){case"%":v*="x"===z?s.percentToPxWidth:s.percentToPxHeight;break;case"px":break;default:v*=s[x+"ToPx"]}switch(w){case"%":v*=1/("x"===z?s.percentToPxWidth:s.percentToPxHeight);break;case"px":break;default:v*=1/s[w+"ToPx"]}}switch(S){case"+":m=v+m;break;case"-":m=v-m;break;case"*":m*=v;break;case"/":m=v/m}d[o]={rootPropertyValue:u,startValue:v,currentValue:v,endValue:m,unitType:w,easing:g},i&&(d[o].pattern=i),C.debug&&console.log("tweensContainer ("+o+"): "+JSON.stringify(d[o]),e)}else C.debug&&console.log("Skipping ["+c+"] due to a lack of browser support.")};for(var j in x)if(x.hasOwnProperty(j)){var R=_.Names.camelCase(j),L=function(t,n){var r,a,i;return y.isFunction(t)&&(t=t.call(e,o,A)),y.isArray(t)?(r=t[0],!y.isArray(t[1])&&/^[\d-]/.test(t[1])||y.isFunction(t[1])||_.RegEx.isHex.test(t[1])?i=t[1]:y.isString(t[1])&&!_.RegEx.isHex.test(t[1])&&C.Easings[t[1]]||y.isArray(t[1])?(a=c(t[1],l.duration),i=t[2]):i=t[1]||t[2]):r=t,a=a||l.easing,y.isFunction(r)&&(r=r.call(e,o,A)),y.isFunction(i)&&(i=i.call(e,o,A)),[r||0,a,i]}(x[j]);if(v(_.Lists.colors,R)){var B=L[0],M=L[1],H=L[2];if(_.RegEx.isHex.test(B)){for(var q=["Red","Green","Blue"],U=_.Values.hexToRgb(B),z=H?_.Values.hexToRgb(H):r,W=0;WparseFloat(n[1]))}({major:1,minor:1,patch:0},o.version)){var i="Velocity UI Pack: You need to update Velocity (velocity.js) to a newer version. Visit http://github.com/julianshapiro/velocity.";throw alert(i),new Error(i)}for(var s in o.RegisterEffect=o.RegisterUI=function(e,t){function n(e,t,n,r){var i,s=0;a.each(e.nodeType?[e]:e,function(e,t){r&&(n+=e*r),i=t.parentNode;var l=["height","paddingTop","paddingBottom","marginTop","marginBottom"];"border-box"===o.CSS.getPropertyValue(t,"boxSizing").toString().toLowerCase()&&(l=["height"]),a.each(l,function(e,n){s+=parseFloat(o.CSS.getPropertyValue(t,n))})}),o.animate(i,{height:("In"===t?"+":"-")+"="+s},{queue:!1,easing:"ease-in-out",duration:n*("In"===t?.6:1)})}return o.Redirects[e]=function(r,i,s,l,c,u,d){var f=s===l-1,p=0;d=d||t.loop,"function"==typeof t.defaultDuration?t.defaultDuration=t.defaultDuration.call(c,c):t.defaultDuration=parseFloat(t.defaultDuration);for(var h=0;h=1?0:t.calls.length?(1-p)/t.calls.length:1;for(h=0;h1&&(a.each(t.reverse(),function(e,n){var r=t[e+1];if(r){var i=n.o||n.options,s=r.o||r.options,l=i&&!1===i.sequenceQueue?"begin":"complete",c=s&&s[l],u={};u[l]=function(){var e=r.e||r.elements,t=e.nodeType?[e]:e;c&&c.call(t,t),o(n)},r.o?r.o=a.extend({},s,u):r.options=a.extend({},s,u)}}),t.reverse()),o(t[0])}}else t.console&&console.log("Velocity UI Pack: Velocity must be loaded first. Aborting.")}(window.jQuery||window.Zepto||window,window,window&&window.document)}),function(e){"function"==typeof define&&define.amd?define("mousewheel",["jquery"],e):"object"==typeof exports?module.exports=e:e(jQuery)}(function(e){function t(t){var i=t||window.event,s=l.call(arguments,1),c=0,d=0,f=0,p=0,h=0,m=0;if((t=e.event.fix(i)).type="mousewheel","detail"in i&&(f=-1*i.detail),"wheelDelta"in i&&(f=i.wheelDelta),"wheelDeltaY"in i&&(f=i.wheelDeltaY),"wheelDeltaX"in i&&(d=-1*i.wheelDeltaX),"axis"in i&&i.axis===i.HORIZONTAL_AXIS&&(d=-1*f,f=0),c=0===f?d:f,"deltaY"in i&&(c=f=-1*i.deltaY),"deltaX"in i&&(d=i.deltaX,0===f&&(c=-1*d)),0!==f||0!==d){if(1===i.deltaMode){var g=e.data(this,"mousewheel-line-height");c*=g,f*=g,d*=g}else if(2===i.deltaMode){var v=e.data(this,"mousewheel-page-height");c*=v,f*=v,d*=v}if(p=Math.max(Math.abs(f),Math.abs(d)),(!a||a>p)&&(a=p,r(i,p)&&(a/=40)),r(i,p)&&(c/=40,d/=40,f/=40),c=Math[c>=1?"floor":"ceil"](c/a),d=Math[d>=1?"floor":"ceil"](d/a),f=Math[f>=1?"floor":"ceil"](f/a),u.settings.normalizeOffset&&this.getBoundingClientRect){var y=this.getBoundingClientRect();h=t.clientX-y.left,m=t.clientY-y.top}return t.deltaX=d,t.deltaY=f,t.deltaFactor=a,t.offsetX=h,t.offsetY=m,t.deltaMode=0,s.unshift(t,c,d,f),o&&clearTimeout(o),o=setTimeout(n,200),(e.event.dispatch||e.event.handle).apply(this,s)}}function n(){a=null}function r(e,t){return u.settings.adjustOldDeltas&&"mousewheel"===e.type&&t%120==0}var o,a,i=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],s="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],l=Array.prototype.slice;if(e.event.fixHooks)for(var c=i.length;c;)e.event.fixHooks[i[--c]]=e.event.mouseHooks;var u=e.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var n=s.length;n;)this.addEventListener(s[--n],t,!1);else this.onmousewheel=t;e.data(this,"mousewheel-line-height",u.getLineHeight(this)),e.data(this,"mousewheel-page-height",u.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var n=s.length;n;)this.removeEventListener(s[--n],t,!1);else this.onmousewheel=null;e.removeData(this,"mousewheel-line-height"),e.removeData(this,"mousewheel-page-height")},getLineHeight:function(t){var n=e(t),r=n["offsetParent"in e.fn?"offsetParent":"parent"]();return r.length||(r=e("body")),parseInt(r.css("fontSize"),10)||parseInt(n.css("fontSize"),10)||16},getPageHeight:function(t){return e(t).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};e.fn.extend({mousewheel:function(e){return e?this.bind("mousewheel",e):this.trigger("mousewheel")},unmousewheel:function(e){return this.unbind("mousewheel",e)}})}),function(e){"function"==typeof define&&define.amd?define("customScrollbar",["jquery"],e):"undefined"!=typeof module&&module.exports?module.exports=e:e(jQuery,window,document)}(function(e){var t,n,r;t="function"==typeof define&&define.amd,n="undefined"!=typeof module&&module.exports,r="https:"==document.location.protocol?"https:":"http:",t||(n?require("jquery-mousewheel")(e):e.event.special.mousewheel||e("head").append(decodeURI("%3Cscript src="+r+"//cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.1.13/jquery.mousewheel.min.js%3E%3C/script%3E"))),function(){var t,n="mCustomScrollbar",r="mCS",o=".mCustomScrollbar",a={setTop:0,setLeft:0,axis:"y",scrollbarPosition:"inside",scrollInertia:950,autoDraggerLength:!0,alwaysShowScrollbar:0,snapOffset:0,mouseWheel:{enable:!0,scrollAmount:"auto",axis:"y",deltaFactor:"auto",disableOver:["select","option","keygen","datalist","textarea"]},scrollButtons:{scrollType:"stepless",scrollAmount:"auto"},keyboard:{enable:!0,scrollType:"stepless",scrollAmount:"auto"},contentTouchScroll:25,documentTouchScroll:!0,advanced:{autoScrollOnFocus:"input,textarea,select,button,datalist,keygen,a[tabindex],area,object,[contenteditable='true']",updateOnContentResize:!0,updateOnImageLoad:"auto",autoUpdateTimeout:60},theme:"light",callbacks:{onTotalScrollOffset:0,onTotalScrollBackOffset:0,alwaysTriggerOffsets:!0}},i=0,s={},l=window.attachEvent&&!window.addEventListener?1:0,c=!1,u=["mCSB_dragger_onDrag","mCSB_scrollTools_onDrag","mCS_img_loaded","mCS_disabled","mCS_destroyed","mCS_no_scrollbar","mCS-autoHide","mCS-dir-rtl","mCS_no_scrollbar_y","mCS_no_scrollbar_x","mCS_y_hidden","mCS_x_hidden","mCSB_draggerContainer","mCSB_buttonUp","mCSB_buttonDown","mCSB_buttonLeft","mCSB_buttonRight"],d={init:function(t){var t=e.extend(!0,{},a,t),n=f.call(this);if(t.live){var l=t.liveSelector||this.selector||o,c=e(l);if("off"===t.live)return void h(l);s[l]=setTimeout(function(){c.mCustomScrollbar(t),"once"===t.live&&c.length&&h(l)},500)}else h(l);return t.setWidth=t.set_width?t.set_width:t.setWidth,t.setHeight=t.set_height?t.set_height:t.setHeight,t.axis=t.horizontalScroll?"x":m(t.axis),t.scrollInertia=t.scrollInertia>0&&t.scrollInertia<17?17:t.scrollInertia,"object"!=typeof t.mouseWheel&&1==t.mouseWheel&&(t.mouseWheel={enable:!0,scrollAmount:"auto",axis:"y",preventDefault:!1,deltaFactor:"auto",normalizeDelta:!1,invert:!1}),t.mouseWheel.scrollAmount=t.mouseWheelPixels?t.mouseWheelPixels:t.mouseWheel.scrollAmount,t.mouseWheel.normalizeDelta=t.advanced.normalizeMouseWheelDelta?t.advanced.normalizeMouseWheelDelta:t.mouseWheel.normalizeDelta,t.scrollButtons.scrollType=g(t.scrollButtons.scrollType),p(t),e(n).each(function(){var n=e(this);if(!n.data(r)){n.data(r,{idx:++i,opt:t,scrollRatio:{y:null,x:null},overflowed:null,contentReset:{y:null,x:null},bindEvents:!1,tweenRunning:!1,sequential:{},langDir:n.css("direction"),cbOffsets:null,trigger:null,poll:{size:{o:0,n:0},img:{o:0,n:0},change:{o:0,n:0}}});var o=n.data(r),a=o.opt,s=n.data("mcs-axis"),l=n.data("mcs-scrollbar-position"),c=n.data("mcs-theme");s&&(a.axis=s),l&&(a.scrollbarPosition=l),c&&(a.theme=c,p(a)),v.call(this),o&&a.callbacks.onCreate&&"function"==typeof a.callbacks.onCreate&&a.callbacks.onCreate.call(this),e("#mCSB_"+o.idx+"_container img:not(."+u[2]+")").addClass(u[2]),d.update.call(null,n)}})},update:function(t,n){var o=t||f.call(this);return e(o).each(function(){var t=e(this);if(t.data(r)){var o=t.data(r),a=o.opt,i=e("#mCSB_"+o.idx+"_container"),s=e("#mCSB_"+o.idx),l=[e("#mCSB_"+o.idx+"_dragger_vertical"),e("#mCSB_"+o.idx+"_dragger_horizontal")];if(!i.length)return;o.tweenRunning&&X(t),n&&o&&a.callbacks.onBeforeUpdate&&"function"==typeof a.callbacks.onBeforeUpdate&&a.callbacks.onBeforeUpdate.call(this),t.hasClass(u[3])&&t.removeClass(u[3]),t.hasClass(u[4])&&t.removeClass(u[4]),s.css("max-height","none"),s.height()!==t.height()&&s.css("max-height",t.height()),b.call(this),"y"===a.axis||a.advanced.autoExpandHorizontalScroll||i.css("width",y(i)),o.overflowed=_.call(this),k.call(this),a.autoDraggerLength&&x.call(this),C.call(this),D.call(this);var c=[Math.abs(i[0].offsetTop),Math.abs(i[0].offsetLeft)];"x"!==a.axis&&(o.overflowed[0]?l[0].height()>l[0].parent().height()?T.call(this):(Y(t,c[0].toString(),{dir:"y",dur:0,overwrite:"none"}),o.contentReset.y=null):(T.call(this),"y"===a.axis?I.call(this):"yx"===a.axis&&o.overflowed[1]&&Y(t,c[1].toString(),{dir:"x",dur:0,overwrite:"none"}))),"y"!==a.axis&&(o.overflowed[1]?l[1].width()>l[1].parent().width()?T.call(this):(Y(t,c[1].toString(),{dir:"x",dur:0,overwrite:"none"}),o.contentReset.x=null):(T.call(this),"x"===a.axis?I.call(this):"yx"===a.axis&&o.overflowed[0]&&Y(t,c[0].toString(),{dir:"y",dur:0,overwrite:"none"}))),n&&o&&(2===n&&a.callbacks.onImageLoad&&"function"==typeof a.callbacks.onImageLoad?a.callbacks.onImageLoad.call(this):3===n&&a.callbacks.onSelectorChange&&"function"==typeof a.callbacks.onSelectorChange?a.callbacks.onSelectorChange.call(this):a.callbacks.onUpdate&&"function"==typeof a.callbacks.onUpdate&&a.callbacks.onUpdate.call(this)),V.call(this)}})},scrollTo:function(t,n){if(void 0!==t&&null!=t){var o=f.call(this);return e(o).each(function(){var o=e(this);if(o.data(r)){var a=o.data(r),i=a.opt,s={trigger:"external",scrollInertia:i.scrollInertia,scrollEasing:"mcsEaseInOut",moveDragger:!1,timeout:60,callbacks:!0,onStart:!0,onUpdate:!0,onComplete:!0},l=e.extend(!0,{},s,n),c=z.call(this,t),u=l.scrollInertia>0&&l.scrollInertia<17?17:l.scrollInertia;c[0]=W.call(this,c[0],"y"),c[1]=W.call(this,c[1],"x"),l.moveDragger&&(c[0]*=a.scrollRatio.y,c[1]*=a.scrollRatio.x),l.dur=re()?0:u,setTimeout(function(){null!==c[0]&&void 0!==c[0]&&"x"!==i.axis&&a.overflowed[0]&&(l.dir="y",l.overwrite="all",Y(o,c[0].toString(),l)),null!==c[1]&&void 0!==c[1]&&"y"!==i.axis&&a.overflowed[1]&&(l.dir="x",l.overwrite="none",Y(o,c[1].toString(),l))},l.timeout)}})}},stop:function(){var t=f.call(this);return e(t).each(function(){var t=e(this);t.data(r)&&X(t)})},disable:function(t){var n=f.call(this);return e(n).each(function(){var n=e(this);n.data(r)&&(n.data(r),V.call(this,"remove"),I.call(this),t&&T.call(this),k.call(this,!0),n.addClass(u[3]))})},destroy:function(){var t=f.call(this);return e(t).each(function(){var o=e(this);if(o.data(r)){var a=o.data(r),i=a.opt,s=e("#mCSB_"+a.idx),l=e("#mCSB_"+a.idx+"_container"),c=e(".mCSB_"+a.idx+"_scrollbar");i.live&&h(i.liveSelector||e(t).selector),V.call(this,"remove"),I.call(this),T.call(this),o.removeData(r),K(this,"mcs"),c.remove(),l.find("img."+u[2]).removeClass(u[2]),s.replaceWith(l.contents()),o.removeClass(n+" _"+r+"_"+a.idx+" "+u[6]+" "+u[7]+" "+u[5]+" "+u[3]).addClass(u[4])}})}},f=function(){return"object"!=typeof e(this)||e(this).length<1?o:this},p=function(t){t.autoDraggerLength=!(e.inArray(t.theme,["rounded","rounded-dark","rounded-dots","rounded-dots-dark"])>-1)&&t.autoDraggerLength,t.autoExpandScrollbar=!(e.inArray(t.theme,["rounded-dots","rounded-dots-dark","3d","3d-dark","3d-thick","3d-thick-dark","inset","inset-dark","inset-2","inset-2-dark","inset-3","inset-3-dark"])>-1)&&t.autoExpandScrollbar,t.scrollButtons.enable=!(e.inArray(t.theme,["minimal","minimal-dark"])>-1)&&t.scrollButtons.enable,t.autoHideScrollbar=e.inArray(t.theme,["minimal","minimal-dark"])>-1||t.autoHideScrollbar,t.scrollbarPosition=e.inArray(t.theme,["minimal","minimal-dark"])>-1?"outside":t.scrollbarPosition},h=function(e){s[e]&&(clearTimeout(s[e]),K(s,e))},m=function(e){return"yx"===e||"xy"===e||"auto"===e?"yx":"x"===e||"horizontal"===e?"x":"y"},g=function(e){return"stepped"===e||"pixels"===e||"step"===e||"click"===e?"stepped":"stepless"},v=function(){var t=e(this),o=t.data(r),a=o.opt,i=a.autoExpandScrollbar?" "+u[1]+"_expand":"",s=["
      ","
      "],l="yx"===a.axis?"mCSB_vertical_horizontal":"x"===a.axis?"mCSB_horizontal":"mCSB_vertical",c="yx"===a.axis?s[0]+s[1]:"x"===a.axis?s[1]:s[0],d="yx"===a.axis?"
      ":"",f=a.autoHideScrollbar?" "+u[6]:"",p="x"!==a.axis&&"rtl"===o.langDir?" "+u[7]:"";a.setWidth&&t.css("width",a.setWidth),a.setHeight&&t.css("height",a.setHeight),a.setLeft="y"!==a.axis&&"rtl"===o.langDir?"989999px":a.setLeft,t.addClass(n+" _"+r+"_"+o.idx+f+p).wrapInner("
      ");var h=e("#mCSB_"+o.idx),m=e("#mCSB_"+o.idx+"_container");"y"===a.axis||a.advanced.autoExpandHorizontalScroll||m.css("width",y(m)),"outside"===a.scrollbarPosition?("static"===t.css("position")&&t.css("position","relative"),t.css("overflow","visible"),h.addClass("mCSB_outside").after(c)):(h.addClass("mCSB_inside").append(c),m.wrap(d)),w.call(this);var g=[e("#mCSB_"+o.idx+"_dragger_vertical"),e("#mCSB_"+o.idx+"_dragger_horizontal")];g[0].css("min-height",g[0].height()),g[1].css("min-width",g[1].width())},y=function(t){var n=[t[0].scrollWidth,Math.max.apply(Math,t.children().map(function(){return e(this).outerWidth(!0)}).get())],r=t.parent().width();return n[0]>r?n[0]:n[1]>r?n[1]:"100%"},b=function(){var t=e(this),n=t.data(r),o=n.opt,a=e("#mCSB_"+n.idx+"_container");if(o.advanced.autoExpandHorizontalScroll&&"y"!==o.axis){a.css({width:"auto","min-width":0,"overflow-x":"scroll"});var i=Math.ceil(a[0].scrollWidth);3===o.advanced.autoExpandHorizontalScroll||2!==o.advanced.autoExpandHorizontalScroll&&i>a.parent().width()?a.css({width:i,"min-width":"100%","overflow-x":"inherit"}):a.css({"overflow-x":"inherit",position:"absolute"}).wrap("
      ").css({width:Math.ceil(a[0].getBoundingClientRect().right+.4)-Math.floor(a[0].getBoundingClientRect().left),"min-width":"100%",position:"relative"}).unwrap()}},w=function(){var t=e(this),n=t.data(r),o=n.opt,a=e(".mCSB_"+n.idx+"_scrollbar:first"),i=te(o.scrollButtons.tabindex)?"tabindex='"+o.scrollButtons.tabindex+"'":"",s=["","","",""],l=["x"===o.axis?s[2]:s[0],"x"===o.axis?s[3]:s[1],s[2],s[3]];o.scrollButtons.enable&&a.prepend(l[0]).append(l[1]).next(".mCSB_scrollTools").prepend(l[2]).append(l[3])},x=function(){var t=e(this),n=t.data(r),o=e("#mCSB_"+n.idx),a=e("#mCSB_"+n.idx+"_container"),i=[e("#mCSB_"+n.idx+"_dragger_vertical"),e("#mCSB_"+n.idx+"_dragger_horizontal")],s=[o.height()/a.outerHeight(!1),o.width()/a.outerWidth(!1)],c=[parseInt(i[0].css("min-height")),Math.round(s[0]*i[0].parent().height()),parseInt(i[1].css("min-width")),Math.round(s[1]*i[1].parent().width())],u=l&&c[1]i&&(i=l),c>s&&(s=c),[i>o.height(),s>o.width()]},T=function(){var t=e(this),n=t.data(r),o=n.opt,a=e("#mCSB_"+n.idx),i=e("#mCSB_"+n.idx+"_container"),s=[e("#mCSB_"+n.idx+"_dragger_vertical"),e("#mCSB_"+n.idx+"_dragger_horizontal")];if(X(t),("x"!==o.axis&&!n.overflowed[0]||"y"===o.axis&&n.overflowed[0])&&(s[0].add(i).css("top",0),Y(t,"_resetY")),"y"!==o.axis&&!n.overflowed[1]||"x"===o.axis&&n.overflowed[1]){var l=dx=0;"rtl"===n.langDir&&(l=a.width()-i.outerWidth(!1),dx=Math.abs(l/n.scrollRatio.x)),i.css("left",l),s[1].css("left",dx),Y(t,"_resetX")}},D=function(){var t,n=e(this),o=n.data(r),a=o.opt;o.bindEvents||(E.call(this),a.contentTouchScroll&&O.call(this),F.call(this),a.mouseWheel.enable&&function r(){t=setTimeout(function(){e.event.special.mousewheel?(clearTimeout(t),P.call(n[0])):r()},100)}(),N.call(this),M.call(this),a.advanced.autoScrollOnFocus&&B.call(this),a.scrollButtons.enable&&H.call(this),a.keyboard.enable&&q.call(this),o.bindEvents=!0)},I=function(){var t=e(this),n=t.data(r),o=n.opt,a=r+"_"+n.idx,i=".mCSB_"+n.idx+"_scrollbar",s=e("#mCSB_"+n.idx+",#mCSB_"+n.idx+"_container,#mCSB_"+n.idx+"_container_wrapper,"+i+" ."+u[12]+",#mCSB_"+n.idx+"_dragger_vertical,#mCSB_"+n.idx+"_dragger_horizontal,"+i+">a"),l=e("#mCSB_"+n.idx+"_container");o.advanced.releaseDraggableSelectors&&s.add(e(o.advanced.releaseDraggableSelectors)),o.advanced.extraDraggableSelectors&&s.add(e(o.advanced.extraDraggableSelectors)),n.bindEvents&&(e(document).add(e(!R()||top.document)).unbind("."+a),s.each(function(){e(this).unbind("."+a)}),clearTimeout(t[0]._focusTimeout),K(t[0],"_focusTimeout"),clearTimeout(n.sequential.step),K(n.sequential,"step"),clearTimeout(l[0].onCompleteTimeout),K(l[0],"onCompleteTimeout"),n.bindEvents=!1)},k=function(t){var n=e(this),o=n.data(r),a=o.opt,i=e("#mCSB_"+o.idx+"_container_wrapper"),s=i.length?i:e("#mCSB_"+o.idx+"_container"),l=[e("#mCSB_"+o.idx+"_scrollbar_vertical"),e("#mCSB_"+o.idx+"_scrollbar_horizontal")],c=[l[0].find(".mCSB_dragger"),l[1].find(".mCSB_dragger")];"x"!==a.axis&&(o.overflowed[0]&&!t?(l[0].add(c[0]).add(l[0].children("a")).css("display","block"),s.removeClass(u[8]+" "+u[10])):(a.alwaysShowScrollbar?(2!==a.alwaysShowScrollbar&&c[0].css("display","none"),s.removeClass(u[10])):(l[0].css("display","none"),s.addClass(u[10])),s.addClass(u[8]))),"y"!==a.axis&&(o.overflowed[1]&&!t?(l[1].add(c[1]).add(l[1].children("a")).css("display","block"),s.removeClass(u[9]+" "+u[11])):(a.alwaysShowScrollbar?(2!==a.alwaysShowScrollbar&&c[1].css("display","none"),s.removeClass(u[11])):(l[1].css("display","none"),s.addClass(u[11])),s.addClass(u[9]))),o.overflowed[0]||o.overflowed[1]?n.removeClass(u[5]):n.addClass(u[5])},A=function(t){var n=t.type,r=t.target.ownerDocument!==document&&null!==frameElement?[e(frameElement).offset().top,e(frameElement).offset().left]:null,o=R()&&t.target.ownerDocument!==top.document&&null!==frameElement?[e(t.view.frameElement).offset().top,e(t.view.frameElement).offset().left]:[0,0];switch(n){case"pointerdown":case"MSPointerDown":case"pointermove":case"MSPointerMove":case"pointerup":case"MSPointerUp":return r?[t.originalEvent.pageY-r[0]+o[0],t.originalEvent.pageX-r[1]+o[1],!1]:[t.originalEvent.pageY,t.originalEvent.pageX,!1];case"touchstart":case"touchmove":case"touchend":var a=t.originalEvent.touches[0]||t.originalEvent.changedTouches[0],i=t.originalEvent.touches.length||t.originalEvent.changedTouches.length;return t.target.ownerDocument!==document?[a.screenY,a.screenX,i>1]:[a.pageY,a.pageX,i>1];default:return r?[t.pageY-r[0]+o[0],t.pageX-r[1]+o[1],!1]:[t.pageY,t.pageX,!1]}},E=function(){function t(e,t,r,o){if(p[0].idleTimer=u.scrollInertia<233?250:0,n.attr("id")===f[1])var a="x",l=(n[0].offsetLeft-t+o)*s.scrollRatio.x;else var a="y",l=(n[0].offsetTop-e+r)*s.scrollRatio.y;Y(i,l.toString(),{dir:a,drag:!0})}var n,o,a,i=e(this),s=i.data(r),u=s.opt,d=r+"_"+s.idx,f=["mCSB_"+s.idx+"_dragger_vertical","mCSB_"+s.idx+"_dragger_horizontal"],p=e("#mCSB_"+s.idx+"_container"),h=e("#"+f[0]+",#"+f[1]),m=u.advanced.releaseDraggableSelectors?h.add(e(u.advanced.releaseDraggableSelectors)):h,g=u.advanced.extraDraggableSelectors?e(!R()||top.document).add(e(u.advanced.extraDraggableSelectors)):e(!R()||top.document);h.bind("contextmenu."+d,function(e){e.preventDefault()}).bind("mousedown."+d+" touchstart."+d+" pointerdown."+d+" MSPointerDown."+d,function(t){if(t.stopImmediatePropagation(),t.preventDefault(),J(t)){c=!0,l&&(document.onselectstart=function(){return!1}),L.call(p,!1),X(i);var r=(n=e(this)).offset(),s=A(t)[0]-r.top,d=A(t)[1]-r.left,f=n.height()+r.top,h=n.width()+r.left;f>s&&s>0&&h>d&&d>0&&(o=s,a=d),S(n,"active",u.autoExpandScrollbar)}}).bind("touchmove."+d,function(e){e.stopImmediatePropagation(),e.preventDefault();var r=n.offset(),i=A(e)[0]-r.top,s=A(e)[1]-r.left;t(o,a,i,s)}),e(document).add(g).bind("mousemove."+d+" pointermove."+d+" MSPointerMove."+d,function(e){if(n){var r=n.offset(),i=A(e)[0]-r.top,s=A(e)[1]-r.left;if(o===i&&a===s)return;t(o,a,i,s)}}).add(m).bind("mouseup."+d+" touchend."+d+" pointerup."+d+" MSPointerUp."+d,function(){n&&(S(n,"active",u.autoExpandScrollbar),n=null),c=!1,l&&(document.onselectstart=null),L.call(p,!0)})},O=function(){function n(e){if(!ee(e)||c||A(e)[2])t=0;else{t=1,C=0,S=0,u=1,_.removeClass("mCS_touch_action");var n=E.offset();d=A(e)[0]-n.top,f=A(e)[1]-n.left,$=[A(e)[0],A(e)[1]]}}function o(e){if(ee(e)&&!c&&!A(e)[2]&&(D.documentTouchScroll||e.preventDefault(),e.stopImmediatePropagation(),(!S||C)&&u)){g=Q();var t=k.offset(),n=A(e)[0]-t.top,r=A(e)[1]-t.left,o="mcsLinearOut";if(F.push(n),P.push(r),$[2]=Math.abs(A(e)[0]-$[0]),$[3]=Math.abs(A(e)[1]-$[1]),T.overflowed[0])var a=O[0].parent().height()-O[0].height(),i=d-n>0&&n-d>-a*T.scrollRatio.y&&(2*$[3]<$[2]||"yx"===D.axis);if(T.overflowed[1])var s=O[1].parent().width()-O[1].width(),p=f-r>0&&r-f>-s*T.scrollRatio.x&&(2*$[2]<$[3]||"yx"===D.axis);i||p?(M||e.preventDefault(),C=1):(S=1,_.addClass("mCS_touch_action")),M&&e.preventDefault(),w="yx"===D.axis?[d-n,f-r]:"x"===D.axis?[null,f-r]:[d-n,null],E[0].idleTimer=250,T.overflowed[0]&&l(w[0],j,o,"y","all",!0),T.overflowed[1]&&l(w[1],j,o,"x",L,!0)}}function a(e){if(!ee(e)||c||A(e)[2])t=0;else{t=1,e.stopImmediatePropagation(),X(_),m=Q();var n=k.offset();p=A(e)[0]-n.top,h=A(e)[1]-n.left,F=[],P=[]}}function i(e){if(ee(e)&&!c&&!A(e)[2]){u=0,e.stopImmediatePropagation(),C=0,S=0,v=Q();var t=k.offset(),n=A(e)[0]-t.top,r=A(e)[1]-t.left;if(!(v-g>30)){var o="mcsEaseOut",a=2.5>(b=1e3/(v-m)),i=a?[F[F.length-2],P[P.length-2]]:[0,0];y=a?[n-i[0],r-i[1]]:[n-p,r-h];var d=[Math.abs(y[0]),Math.abs(y[1])];b=a?[Math.abs(y[0]/4),Math.abs(y[1]/4)]:[b,b];var f=[Math.abs(E[0].offsetTop)-y[0]*s(d[0]/b[0],b[0]),Math.abs(E[0].offsetLeft)-y[1]*s(d[1]/b[1],b[1])];w="yx"===D.axis?[f[0],f[1]]:"x"===D.axis?[null,f[1]]:[f[0],null],x=[4*d[0]+D.scrollInertia,4*d[1]+D.scrollInertia];var _=parseInt(D.contentTouchScroll)||0;w[0]=d[0]>_?w[0]:0,w[1]=d[1]>_?w[1]:0,T.overflowed[0]&&l(w[0],x[0],o,"y",L,!1),T.overflowed[1]&&l(w[1],x[1],o,"x",L,!1)}}}function s(e,t){var n=[1.5*t,2*t,t/1.5,t/2];return e>90?t>4?n[0]:n[3]:e>60?t>3?n[3]:n[2]:e>30?t>8?n[1]:t>6?n[0]:t>4?t:n[2]:t>8?t:n[3]}function l(e,t,n,r,o,a){e&&Y(_,e.toString(),{dur:t,scrollEasing:n,dir:r,overwrite:o,drag:a})}var u,d,f,p,h,m,g,v,y,b,w,x,C,S,_=e(this),T=_.data(r),D=T.opt,I=r+"_"+T.idx,k=e("#mCSB_"+T.idx),E=e("#mCSB_"+T.idx+"_container"),O=[e("#mCSB_"+T.idx+"_dragger_vertical"),e("#mCSB_"+T.idx+"_dragger_horizontal")],F=[],P=[],j=0,L="yx"===D.axis?"none":"all",$=[],N=E.find("iframe"),B=["touchstart."+I+" pointerdown."+I+" MSPointerDown."+I,"touchmove."+I+" pointermove."+I+" MSPointerMove."+I,"touchend."+I+" pointerup."+I+" MSPointerUp."+I],M=void 0!==document.body.style.touchAction&&""!==document.body.style.touchAction;E.bind(B[0],function(e){n(e)}).bind(B[1],function(e){o(e)}),k.bind(B[0],function(e){a(e)}).bind(B[2],function(e){i(e)}),N.length&&N.each(function(){e(this).bind("load",function(){R(this)&&e(this.contentDocument||this.contentWindow.document).bind(B[0],function(e){n(e),a(e)}).bind(B[1],function(e){o(e)}).bind(B[2],function(e){i(e)})})})},F=function(){function n(e,t,n){l.type=n&&o?"stepped":"stepless",l.scrollAmount=10,U(a,e,t,"mcsLinearOut",n?60:null)}var o,a=e(this),i=a.data(r),s=i.opt,l=i.sequential,u=r+"_"+i.idx,d=e("#mCSB_"+i.idx+"_container"),f=d.parent();d.bind("mousedown."+u,function(){t||o||(o=1,c=!0)}).add(document).bind("mousemove."+u,function(e){if(!t&&o&&(window.getSelection?window.getSelection().toString():document.selection&&"Control"!=document.selection.type&&document.selection.createRange().text)){var r=d.offset(),a=A(e)[0]-r.top+d[0].offsetTop,c=A(e)[1]-r.left+d[0].offsetLeft;a>0&&a0&&ca?n("on",38):a>f.height()&&n("on",40)),"y"!==s.axis&&i.overflowed[1]&&(0>c?n("on",37):c>f.width()&&n("on",39)))}}).bind("mouseup."+u+" dragend."+u,function(){t||(o&&(o=0,n("off",null)),c=!1)})},P=function(){function t(t,r){if(X(n),!$(n,t.target)){var i="auto"!==a.mouseWheel.deltaFactor?parseInt(a.mouseWheel.deltaFactor):l&&t.deltaFactor<100?100:t.deltaFactor||100,u=a.scrollInertia;if("x"===a.axis||"x"===a.mouseWheel.axis)var d="x",f=[Math.round(i*o.scrollRatio.x),parseInt(a.mouseWheel.scrollAmount)],p="auto"!==a.mouseWheel.scrollAmount?f[1]:f[0]>=s.width()?.9*s.width():f[0],h=Math.abs(e("#mCSB_"+o.idx+"_container")[0].offsetLeft),m=c[1][0].offsetLeft,g=c[1].parent().width()-c[1].width(),v="y"===a.mouseWheel.axis?t.deltaY||r:t.deltaX;else var d="y",f=[Math.round(i*o.scrollRatio.y),parseInt(a.mouseWheel.scrollAmount)],p="auto"!==a.mouseWheel.scrollAmount?f[1]:f[0]>=s.height()?.9*s.height():f[0],h=Math.abs(e("#mCSB_"+o.idx+"_container")[0].offsetTop),m=c[0][0].offsetTop,g=c[0].parent().height()-c[0].height(),v=t.deltaY||r;"y"===d&&!o.overflowed[0]||"x"===d&&!o.overflowed[1]||((a.mouseWheel.invert||t.webkitDirectionInvertedFromDevice)&&(v=-v),a.mouseWheel.normalizeDelta&&(v=0>v?-1:1),(v>0&&0!==m||0>v&&m!==g||a.mouseWheel.preventDefault)&&(t.stopImmediatePropagation(),t.preventDefault()),t.deltaFactor<5&&!a.mouseWheel.normalizeDelta&&(p=t.deltaFactor,u=17),Y(n,(h-v*p).toString(),{dir:d,dur:u}))}}if(e(this).data(r)){var n=e(this),o=n.data(r),a=o.opt,i=r+"_"+o.idx,s=e("#mCSB_"+o.idx),c=[e("#mCSB_"+o.idx+"_dragger_vertical"),e("#mCSB_"+o.idx+"_dragger_horizontal")],u=e("#mCSB_"+o.idx+"_container").find("iframe");u.length&&u.each(function(){e(this).bind("load",function(){R(this)&&e(this.contentDocument||this.contentWindow.document).bind("mousewheel."+i,function(e,n){t(e,n)})})}),s.bind("mousewheel."+i,function(e,n){t(e,n)})}},j=new Object,R=function(t){var n=!1,r=!1,o=null;if(void 0===t?r="#empty":void 0!==e(t).attr("id")&&(r=e(t).attr("id")),!1!==r&&void 0!==j[r])return j[r];if(t){try{var a=t.contentDocument||t.contentWindow.document;o=a.body.innerHTML}catch(e){}n=null!==o}else{try{var a=top.document;o=a.body.innerHTML}catch(e){}n=null!==o}return!1!==r&&(j[r]=n),n},L=function(e){var t=this.find("iframe");if(t.length){var n=e?"auto":"none";t.css("pointer-events",n)}},$=function(t,n){var o=n.nodeName.toLowerCase(),a=t.data(r).opt.mouseWheel.disableOver;return e.inArray(o,a)>-1&&!(e.inArray(o,["select","textarea"])>-1&&!e(n).is(":focus"))},N=function(){var t,n=e(this),o=n.data(r),a=r+"_"+o.idx,i=e("#mCSB_"+o.idx+"_container"),s=i.parent(),l=e(".mCSB_"+o.idx+"_scrollbar ."+u[12]);l.bind("mousedown."+a+" touchstart."+a+" pointerdown."+a+" MSPointerDown."+a,function(n){c=!0,e(n.target).hasClass("mCSB_dragger")||(t=1)}).bind("touchend."+a+" pointerup."+a+" MSPointerUp."+a,function(){c=!1}).bind("click."+a,function(r){if(t&&(t=0,e(r.target).hasClass(u[12])||e(r.target).hasClass("mCSB_draggerRail"))){X(n);var a=e(this),l=a.find(".mCSB_dragger");if(a.parent(".mCSB_scrollTools_horizontal").length>0){if(!o.overflowed[1])return;var c="x",d=r.pageX>l.offset().left?-1:1,f=Math.abs(i[0].offsetLeft)-d*(.9*s.width())}else{if(!o.overflowed[0])return;var c="y",d=r.pageY>l.offset().top?-1:1,f=Math.abs(i[0].offsetTop)-d*(.9*s.height())}Y(n,f.toString(),{dir:c,scrollEasing:"mcsEaseInOut"})}})},B=function(){var t=e(this),n=t.data(r),o=n.opt,a=r+"_"+n.idx,i=e("#mCSB_"+n.idx+"_container"),s=i.parent();i.bind("focusin."+a,function(){var n=e(document.activeElement),r=i.find(".mCustomScrollBox").length;n.is(o.advanced.autoScrollOnFocus)&&(X(t),clearTimeout(t[0]._focusTimeout),t[0]._focusTimer=r?17*r:0,t[0]._focusTimeout=setTimeout(function(){var e=[ne(n)[0],ne(n)[1]],r=[i[0].offsetTop,i[0].offsetLeft],a=[r[0]+e[0]>=0&&r[0]+e[0]=0&&r[0]+e[1]a");l.bind("contextmenu."+i,function(e){e.preventDefault()}).bind("mousedown."+i+" touchstart."+i+" pointerdown."+i+" MSPointerDown."+i+" mouseup."+i+" touchend."+i+" pointerup."+i+" MSPointerUp."+i+" mouseout."+i+" pointerout."+i+" MSPointerOut."+i+" click."+i,function(r){function i(e,n){a.scrollAmount=o.scrollButtons.scrollAmount,U(t,e,n)}if(r.preventDefault(),J(r)){var s=e(this).attr("class");switch(a.type=o.scrollButtons.scrollType,r.type){case"mousedown":case"touchstart":case"pointerdown":case"MSPointerDown":if("stepped"===a.type)return;c=!0,n.tweenRunning=!1,i("on",s);break;case"mouseup":case"touchend":case"pointerup":case"MSPointerUp":case"mouseout":case"pointerout":case"MSPointerOut":if("stepped"===a.type)return;c=!1,a.dir&&i("off",s);break;case"click":if("stepped"!==a.type||n.tweenRunning)return;i("on",s)}}})},q=function(){function t(t){function r(e,t){i.type=a.keyboard.scrollType,i.scrollAmount=a.keyboard.scrollAmount,"stepped"===i.type&&o.tweenRunning||U(n,e,t)}switch(t.type){case"blur":o.tweenRunning&&i.dir&&r("off",null);break;case"keydown":case"keyup":var s=t.keyCode?t.keyCode:t.which,l="on";if("x"!==a.axis&&(38===s||40===s)||"y"!==a.axis&&(37===s||39===s)){if((38===s||40===s)&&!o.overflowed[0]||(37===s||39===s)&&!o.overflowed[1])return;"keyup"===t.type&&(l="off"),e(document.activeElement).is(d)||(t.preventDefault(),t.stopImmediatePropagation(),r(l,s))}else if(33===s||34===s){if((o.overflowed[0]||o.overflowed[1])&&(t.preventDefault(),t.stopImmediatePropagation()),"keyup"===t.type){X(n);var f=34===s?-1:1;if("x"===a.axis||"yx"===a.axis&&o.overflowed[1]&&!o.overflowed[0])var p="x",h=Math.abs(c[0].offsetLeft)-f*(.9*u.width());else var p="y",h=Math.abs(c[0].offsetTop)-f*(.9*u.height());Y(n,h.toString(),{dir:p,scrollEasing:"mcsEaseInOut"})}}else if((35===s||36===s)&&!e(document.activeElement).is(d)&&((o.overflowed[0]||o.overflowed[1])&&(t.preventDefault(),t.stopImmediatePropagation()),"keyup"===t.type)){if("x"===a.axis||"yx"===a.axis&&o.overflowed[1]&&!o.overflowed[0])var p="x",h=35===s?Math.abs(u.width()-c.outerWidth(!1)):0;else var p="y",h=35===s?Math.abs(u.height()-c.outerHeight(!1)):0;Y(n,h.toString(),{dir:p,scrollEasing:"mcsEaseInOut"})}}}var n=e(this),o=n.data(r),a=o.opt,i=o.sequential,s=r+"_"+o.idx,l=e("#mCSB_"+o.idx),c=e("#mCSB_"+o.idx+"_container"),u=c.parent(),d="input,textarea,select,datalist,keygen,[contenteditable='true']",f=c.find("iframe"),p=["blur."+s+" keydown."+s+" keyup."+s];f.length&&f.each(function(){e(this).bind("load",function(){R(this)&&e(this.contentDocument||this.contentWindow.document).bind(p[0],function(e){t(e)})})}),l.attr("tabindex","0").bind(p[0],function(e){t(e)})},U=function(t,n,o,a,i){function s(e){c.snapAmount&&(d.scrollAmount=c.snapAmount instanceof Array?"x"===d.dir[0]?c.snapAmount[1]:c.snapAmount[0]:c.snapAmount);var n="stepped"!==d.type,r=i||(e?n?h/1.5:m:1e3/60),o=e?n?7.5:40:2.5,u=[Math.abs(f[0].offsetTop),Math.abs(f[0].offsetLeft)],p=[l.scrollRatio.y>10?10:l.scrollRatio.y,l.scrollRatio.x>10?10:l.scrollRatio.x],g="x"===d.dir[0]?u[1]+d.dir[1]*(p[1]*o):u[0]+d.dir[1]*(p[0]*o),v="x"===d.dir[0]?u[1]+d.dir[1]*parseInt(d.scrollAmount):u[0]+d.dir[1]*parseInt(d.scrollAmount),y="auto"!==d.scrollAmount?v:g,b=a||(e?n?"mcsLinearOut":"mcsEaseInOut":"mcsLinear"),w=!!e;return e&&17>r&&(y="x"===d.dir[0]?u[1]:u[0]),Y(t,y.toString(),{dir:d.dir[0],scrollEasing:b,dur:r,onComplete:w}),e?void(d.dir=!1):(clearTimeout(d.step),void(d.step=setTimeout(function(){s()},r)))}var l=t.data(r),c=l.opt,d=l.sequential,f=e("#mCSB_"+l.idx+"_container"),p="stepped"===d.type,h=c.scrollInertia<26?26:c.scrollInertia,m=c.scrollInertia<1?17:c.scrollInertia;switch(n){case"on":if(d.dir=[o===u[16]||o===u[15]||39===o||37===o?"x":"y",o===u[13]||o===u[15]||38===o||37===o?-1:1],X(t),te(o)&&"stepped"===d.type)return;s(p);break;case"off":clearTimeout(d.step),K(d,"step"),X(t),(p||l.tweenRunning&&d.dir)&&s(!0)}},z=function(t){var n=e(this).data(r).opt,o=[];return"function"==typeof t&&(t=t()),t instanceof Array?o=t.length>1?[t[0],t[1]]:"x"===n.axis?[null,t[0]]:[t[0],null]:(o[0]=t.y?t.y:t.x||"x"===n.axis?null:t,o[1]=t.x?t.x:t.y||"y"===n.axis?null:t),"function"==typeof o[0]&&(o[0]=o[0]()),"function"==typeof o[1]&&(o[1]=o[1]()),o},W=function(t,n){if(null!=t&&void 0!==t){var o=e(this),a=o.data(r),i=a.opt,s=e("#mCSB_"+a.idx+"_container"),l=s.parent(),c=typeof t;n||(n="x"===i.axis?"x":"y");var u="x"===n?s.outerWidth(!1)-l.width():s.outerHeight(!1)-l.height(),f="x"===n?s[0].offsetLeft:s[0].offsetTop,p="x"===n?"left":"top";switch(c){case"function":return t();case"object":var h=t.jquery?t:e(t);if(!h.length)return;return"x"===n?ne(h)[1]:ne(h)[0];case"string":case"number":if(te(t))return Math.abs(t);if(-1!==t.indexOf("%"))return Math.abs(u*parseInt(t)/100);if(-1!==t.indexOf("-="))return Math.abs(f-parseInt(t.split("-=")[1]));if(-1!==t.indexOf("+=")){var m=f+parseInt(t.split("+=")[1]);return m>=0?0:Math.abs(m)}if(-1!==t.indexOf("px")&&te(t.split("px")[0]))return Math.abs(t.split("px")[0]);if("top"===t||"left"===t)return 0;if("bottom"===t)return Math.abs(l.height()-s.outerHeight(!1));if("right"===t)return Math.abs(l.width()-s.outerWidth(!1));if("first"===t||"last"===t){var h=s.find(":"+t);return"x"===n?ne(h)[1]:ne(h)[0]}return e(t).length?"x"===n?ne(e(t))[1]:ne(e(t))[0]:(s.css(p,t),void d.update.call(null,o[0]))}}},V=function(t){function n(e){clearTimeout(s[0].autoUpdate),d.update.call(null,o[0],e)}var o=e(this),a=o.data(r),i=a.opt,s=e("#mCSB_"+a.idx+"_container");return t?(clearTimeout(s[0].autoUpdate),void K(s[0],"autoUpdate")):void function t(){return clearTimeout(s[0].autoUpdate),0===o.parents("html").length?void(o=null):void(s[0].autoUpdate=setTimeout(function(){return i.advanced.updateOnSelectorChange&&(a.poll.change.n=function(){!0===i.advanced.updateOnSelectorChange&&(i.advanced.updateOnSelectorChange="*");var e=0,t=s.find(i.advanced.updateOnSelectorChange);return i.advanced.updateOnSelectorChange&&t.length>0&&t.each(function(){e+=this.offsetHeight+this.offsetWidth}),e}(),a.poll.change.n!==a.poll.change.o)?(a.poll.change.o=a.poll.change.n,void n(3)):i.advanced.updateOnContentResize&&(a.poll.size.n=o[0].scrollHeight+o[0].scrollWidth+s[0].offsetHeight+o[0].offsetHeight+o[0].offsetWidth,a.poll.size.n!==a.poll.size.o)?(a.poll.size.o=a.poll.size.n,void n(1)):!i.advanced.updateOnImageLoad||"auto"===i.advanced.updateOnImageLoad&&"y"===i.axis||(a.poll.img.n=s.find("img").length,a.poll.img.n===a.poll.img.o)?void((i.advanced.updateOnSelectorChange||i.advanced.updateOnContentResize||i.advanced.updateOnImageLoad)&&t()):(a.poll.img.o=a.poll.img.n,void s.find("img").each(function(){!function(t){if(e(t).hasClass(u[2]))n();else{var r=new Image;r.onload=function(e,t){return function(){return t.apply(e,arguments)}}(r,function(){this.onload=null,e(t).addClass(u[2]),n(2)}),r.src=t.src}}(this)}))},i.advanced.autoUpdateTimeout))}()},X=function(t){var n=t.data(r),o=e("#mCSB_"+n.idx+"_container,#mCSB_"+n.idx+"_container_wrapper,#mCSB_"+n.idx+"_dragger_vertical,#mCSB_"+n.idx+"_dragger_horizontal");o.each(function(){Z.call(this)})},Y=function(t,n,o){function a(e){return s&&l.callbacks[e]&&"function"==typeof l.callbacks[e]}function i(){var e=[f[0].offsetTop,f[0].offsetLeft],n=[v[0].offsetTop,v[0].offsetLeft],r=[f.outerHeight(!1),f.outerWidth(!1)],a=[d.height(),d.width()];t[0].mcs={content:f,top:e[0],left:e[1],draggerTop:n[0],draggerLeft:n[1],topPct:Math.round(100*Math.abs(e[0])/(Math.abs(r[0])-a[0])),leftPct:Math.round(100*Math.abs(e[1])/(Math.abs(r[1])-a[1])),direction:o.dir}}var s=t.data(r),l=s.opt,c={trigger:"internal",dir:"y",scrollEasing:"mcsEaseOut",drag:!1,dur:l.scrollInertia,overwrite:"all",callbacks:!0,onStart:!0,onUpdate:!0,onComplete:!0},o=e.extend(c,o),u=[o.dur,o.drag?0:o.dur],d=e("#mCSB_"+s.idx),f=e("#mCSB_"+s.idx+"_container"),p=f.parent(),h=l.callbacks.onTotalScrollOffset?z.call(t,l.callbacks.onTotalScrollOffset):[0,0],m=l.callbacks.onTotalScrollBackOffset?z.call(t,l.callbacks.onTotalScrollBackOffset):[0,0];if(s.trigger=o.trigger,0===p.scrollTop()&&0===p.scrollLeft()||(e(".mCSB_"+s.idx+"_scrollbar").css("visibility","visible"),p.scrollTop(0).scrollLeft(0)),"_resetY"!==n||s.contentReset.y||(a("onOverflowYNone")&&l.callbacks.onOverflowYNone.call(t[0]),s.contentReset.y=1),"_resetX"!==n||s.contentReset.x||(a("onOverflowXNone")&&l.callbacks.onOverflowXNone.call(t[0]),s.contentReset.x=1),"_resetY"!==n&&"_resetX"!==n){if(!s.contentReset.y&&t[0].mcs||!s.overflowed[0]||(a("onOverflowY")&&l.callbacks.onOverflowY.call(t[0]),s.contentReset.x=null),!s.contentReset.x&&t[0].mcs||!s.overflowed[1]||(a("onOverflowX")&&l.callbacks.onOverflowX.call(t[0]),s.contentReset.x=null),l.snapAmount){var g=l.snapAmount instanceof Array?"x"===o.dir?l.snapAmount[1]:l.snapAmount[0]:l.snapAmount;n=function(e,t,n){return Math.round(e/t)*t-n}(n,g,l.snapOffset)}switch(o.dir){case"x":var v=e("#mCSB_"+s.idx+"_dragger_horizontal"),y="left",b=f[0].offsetLeft,w=[d.width()-f.outerWidth(!1),v.parent().width()-v.width()],x=[n,0===n?0:n/s.scrollRatio.x],C=h[1],_=m[1],T=C>0?C/s.scrollRatio.x:0,D=_>0?_/s.scrollRatio.x:0;break;case"y":var v=e("#mCSB_"+s.idx+"_dragger_vertical"),y="top",b=f[0].offsetTop,w=[d.height()-f.outerHeight(!1),v.parent().height()-v.height()],x=[n,0===n?0:n/s.scrollRatio.y],C=h[0],_=m[0],T=C>0?C/s.scrollRatio.y:0,D=_>0?_/s.scrollRatio.y:0}x[1]<0||0===x[0]&&0===x[1]?x=[0,0]:x[1]>=w[1]?x=[w[0],w[1]]:x[0]=-x[0],t[0].mcs||(i(),a("onInit")&&l.callbacks.onInit.call(t[0])),clearTimeout(f[0].onCompleteTimeout),G(v[0],y,Math.round(x[1]),u[1],o.scrollEasing),!s.tweenRunning&&(0===b&&x[0]>=0||b===w[0]&&x[0]<=w[0])||G(f[0],y,Math.round(x[0]),u[0],o.scrollEasing,o.overwrite,{onStart:function(){o.callbacks&&o.onStart&&!s.tweenRunning&&(a("onScrollStart")&&(i(),l.callbacks.onScrollStart.call(t[0])),s.tweenRunning=!0,S(v),s.cbOffsets=[l.callbacks.alwaysTriggerOffsets||b>=w[0]+C,l.callbacks.alwaysTriggerOffsets||-_>=b])},onUpdate:function(){o.callbacks&&o.onUpdate&&a("whileScrolling")&&(i(),l.callbacks.whileScrolling.call(t[0]))},onComplete:function(){if(o.callbacks&&o.onComplete){"yx"===l.axis&&clearTimeout(f[0].onCompleteTimeout);var e=f[0].idleTimer||0;f[0].onCompleteTimeout=setTimeout(function(){a("onScroll")&&(i(),l.callbacks.onScroll.call(t[0])),a("onTotalScroll")&&x[1]>=w[1]-T&&s.cbOffsets[0]&&(i(),l.callbacks.onTotalScroll.call(t[0])),a("onTotalScrollBack")&&x[1]<=D&&s.cbOffsets[1]&&(i(),l.callbacks.onTotalScrollBack.call(t[0])),s.tweenRunning=!1,f[0].idleTimer=0,S(v,"hide")},e)}}})}},G=function(e,t,n,r,o,a,i){function s(){y.stop||(m||d.call(),m=Q()-h,l(),m>=y.time&&(y.time=m>y.time?m+c-(m-y.time):m+c-1,y.time0?(y.currVal=function(e,t,n,r,o){switch(o){case"linear":case"mcsLinear":return n*e/r+t;case"mcsLinearOut":return e/=r,e--,n*Math.sqrt(1-e*e)+t;case"easeInOutSmooth":return 1>(e/=r/2)?n/2*e*e+t:-n/2*(--e*(e-2)-1)+t;case"easeInOutStrong":return 1>(e/=r/2)?n/2*Math.pow(2,10*(e-1))+t:(e--,n/2*(2-Math.pow(2,-10*e))+t);case"easeInOut":case"mcsEaseInOut":return 1>(e/=r/2)?n/2*e*e*e+t:n/2*((e-=2)*e*e+2)+t;case"easeOutSmooth":return e/=r,-n*(--e*e*e*e-1)+t;case"easeOutStrong":return n*(1-Math.pow(2,-10*e/r))+t;case"easeOut":case"mcsEaseOut":default:var a=(e/=r)*e,i=a*e;return t+n*(.499999999999997*i*a+-2.5*a*a+5.5*i+-6.5*a+4*e)}}(y.time,g,b,r,o),v[t]=Math.round(y.currVal)+"px"):v[t]=n+"px",f.call()}e._mTween||(e._mTween={top:{},left:{}});var c,u,i=i||{},d=i.onStart||function(){},f=i.onUpdate||function(){},p=i.onComplete||function(){},h=Q(),m=0,g=e.offsetTop,v=e.style,y=e._mTween[t];"left"===t&&(g=e.offsetLeft);var b=n-g;y.stop=0,"none"!==a&&null!=y.id&&(window.requestAnimationFrame?window.cancelAnimationFrame(y.id):clearTimeout(y.id),y.id=null),c=1e3/60,y.time=m+c,u=window.requestAnimationFrame?window.requestAnimationFrame:function(e){return l(),setTimeout(e,.01)},y.id=u(s)},Q=function(){return window.performance&&window.performance.now?window.performance.now():window.performance&&window.performance.webkitNow?window.performance.webkitNow():Date.now?Date.now():(new Date).getTime()},Z=function(){var e=this;e._mTween||(e._mTween={top:{},left:{}});for(var t=["top","left"],n=0;n=0&&r[0]+ne(o)[0]=0&&r[1]+ne(o)[1]=0&&i[1]-a[1]*s[1][0]<0&&i[1]+o[1]-a[1]*s[1][1]>=0},mcsOverflow:e.expr[":"].mcsOverflow||function(t){var n=e(t).data(r);if(n)return n.overflowed[0]||n.overflowed[1]}})})}()}),function(e){"use strict";function t(t){return t.is('[type="checkbox"]')?t.prop("checked"):t.is('[type="radio"]')?!!e('[name="'+t.attr("name")+'"]:checked').length:t.is("select[multiple]")?(t.val()||[]).length:t.val()}function n(t){return this.each(function(){var n=e(this),o=e.extend({},r.DEFAULTS,n.data(),"object"==typeof t&&t),a=n.data("bs.validator");(a||"destroy"!=t)&&(a||n.data("bs.validator",a=new r(this,o)),"string"==typeof t&&a[t]())})}var r=function(n,o){this.options=o,this.validators=e.extend({},r.VALIDATORS,o.custom),this.$element=e(n),this.$btn=e('button[type="submit"], input[type="submit"]').filter('[form="'+this.$element.attr("id")+'"]').add(this.$element.find('input[type="submit"], button[type="submit"]')),this.update(),this.$element.on("input.bs.validator change.bs.validator focusout.bs.validator",e.proxy(this.onInput,this)),this.$element.on("submit.bs.validator",e.proxy(this.onSubmit,this)),this.$element.on("reset.bs.validator",e.proxy(this.reset,this)),this.$element.find("[data-match]").each(function(){var n=e(this),r=n.attr("data-match");e(r).on("input.bs.validator",function(){t(n)&&n.trigger("input.bs.validator")})}),this.$inputs.filter(function(){return t(e(this))&&!e(this).closest(".has-error").length}).trigger("focusout"),this.$element.attr("novalidate",!0)};r.VERSION="0.11.9",r.INPUT_SELECTOR=':input:not([type="hidden"], [type="submit"], [type="reset"], button)',r.FOCUS_OFFSET=20,r.DEFAULTS={delay:500,html:!1,disable:!0,focus:!0,custom:{},errors:{match:"Does not match",minlength:"Not long enough"},feedback:{success:"glyphicon-ok",error:"glyphicon-remove"}},r.VALIDATORS={native:function(e){var t=e[0];return t.checkValidity?!t.checkValidity()&&!t.validity.valid&&(t.validationMessage||"error!"):void 0},match:function(t){var n=t.attr("data-match");return t.val()!==e(n).val()&&r.DEFAULTS.errors.match},minlength:function(e){var t=e.attr("data-minlength");return e.val().length").addClass("list-unstyled").append(e.map(r,function(t){return e("
    • ")[n](t)})),void 0===a.data("bs.validator.originalContent")&&a.data("bs.validator.originalContent",a.html()),a.empty().append(r),o.addClass("has-error has-danger"),o.hasClass("has-feedback")&&i.removeClass(this.options.feedback.success)&&i.addClass(this.options.feedback.error)&&o.removeClass("has-success"))},r.prototype.clearErrors=function(e){var n=e.closest(".form-group"),r=n.find(".help-block.with-errors"),o=n.find(".form-control-feedback");r.html(r.data("bs.validator.originalContent")),n.removeClass("has-error has-danger has-success"),n.hasClass("has-feedback")&&o.removeClass(this.options.feedback.error)&&o.removeClass(this.options.feedback.success)&&t(e)&&o.addClass(this.options.feedback.success)&&n.addClass("has-success")},r.prototype.hasErrors=function(){return!!this.$inputs.filter(function(){return!!(e(this).data("bs.validator.errors")||[]).length}).length},r.prototype.isIncomplete=function(){return!!this.$inputs.filter("[required]").filter(function(){var n=t(e(this));return!("string"==typeof n?e.trim(n):n)}).length},r.prototype.onSubmit=function(e){this.validate(),(this.isIncomplete()||this.hasErrors())&&e.preventDefault()},r.prototype.toggleSubmit=function(){this.options.disable&&this.$btn.toggleClass("disabled",this.isIncomplete()||this.hasErrors())},r.prototype.defer=function(t,n){return n=e.proxy(n,this,t),this.options.delay?(window.clearTimeout(t.data("bs.validator.timeout")),void t.data("bs.validator.timeout",window.setTimeout(n,this.options.delay))):n()},r.prototype.reset=function(){return this.$element.find(".form-control-feedback").removeClass(this.options.feedback.error).removeClass(this.options.feedback.success),this.$inputs.removeData(["bs.validator.errors","bs.validator.deferred"]).each(function(){var t=e(this),n=t.data("bs.validator.timeout");window.clearTimeout(n)&&t.removeData("bs.validator.timeout")}),this.$element.find(".help-block.with-errors").each(function(){var t=e(this),n=t.data("bs.validator.originalContent");t.removeData("bs.validator.originalContent").html(n)}),this.$btn.removeClass("disabled"),this.$element.find(".has-error, .has-danger, .has-success").removeClass("has-error has-danger has-success"),this},r.prototype.destroy=function(){return this.reset(),this.$element.removeAttr("novalidate").removeData("bs.validator").off(".bs.validator"),this.$inputs.off(".bs.validator"),this.options=null,this.validators=null,this.$element=null,this.$btn=null,this.$inputs=null,this};var o=e.fn.validator;e.fn.validator=n,e.fn.validator.Constructor=r,e.fn.validator.noConflict=function(){return e.fn.validator=o,this},e(window).on("load",function(){e('form[data-toggle="validator"]').each(function(){var t=e(this);n.call(t,t.data())})})}(jQuery),define("validator",["jquery","bootstrap"],function(){}),function(e,t){"object"==typeof exports?module.exports=t(require("jquery")):"function"==typeof define&&define.amd?define("easyPieChart",["jquery"],t):t(e.jQuery)}(this,function(e){var t=function(e,t){var n,r=document.createElement("canvas");e.appendChild(r),"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(r);var o=r.getContext("2d");r.width=r.height=t.size;var a=1;window.devicePixelRatio>1&&(a=window.devicePixelRatio,r.style.width=r.style.height=[t.size,"px"].join(""),r.width=r.height=t.size*a,o.scale(a,a)),o.translate(t.size/2,t.size/2),o.rotate((t.rotate/180-.5)*Math.PI);var i=(t.size-t.lineWidth)/2;t.scaleColor&&t.scaleLength&&(i-=t.scaleLength+2),Date.now=Date.now||function(){return+new Date};var s=function(e,t,n){var r=0>=(n=Math.min(Math.max(-1,n||0),1));o.beginPath(),o.arc(0,0,i,0,2*Math.PI*n,r),o.strokeStyle=e,o.lineWidth=t,o.stroke()},l=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(e){window.setTimeout(e,1e3/60)},c=function(){t.scaleColor&&function(){var e,n;o.lineWidth=1,o.fillStyle=t.scaleColor,o.save();for(var r=24;r>0;--r)r%6==0?(n=t.scaleLength,e=0):(n=.6*t.scaleLength,e=t.scaleLength-n),o.fillRect(-t.size/2+e,0,n,1),o.rotate(Math.PI/12);o.restore()}(),t.trackColor&&s(t.trackColor,t.trackWidth||t.lineWidth,1)};this.getCanvas=function(){return r},this.getCtx=function(){return o},this.clear=function(){o.clearRect(t.size/-2,t.size/-2,t.size,t.size)},this.draw=function(e){var r;t.scaleColor||t.trackColor?o.getImageData&&o.putImageData?n?o.putImageData(n,0,0):(c(),n=o.getImageData(0,0,t.size*a,t.size*a)):(this.clear(),c()):this.clear(),o.lineCap=t.lineCap,r="function"==typeof t.barColor?t.barColor(e):t.barColor,s(r,t.lineWidth,e/100)}.bind(this),this.animate=function(e,n){var r=Date.now();t.onStart(e,n);var o=function(){var a=Math.min(Date.now()-r,t.animate.duration),i=t.easing(this,a,e,n-e,t.animate.duration);this.draw(i),t.onStep(e,n,i),a>=t.animate.duration?t.onStop(e,n):l(o)}.bind(this);l(o)}.bind(this)},n=function(e,n){var r={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,trackWidth:void 0,size:110,rotate:0,animate:{duration:1e3,enabled:!0},easing:function(e,t,n,r,o){return 1>(t/=o/2)?r/2*t*t+n:-r/2*(--t*(t-2)-1)+n},onStart:function(){},onStep:function(){},onStop:function(){}};if(void 0!==t)r.renderer=t;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");r.renderer=SVGRenderer}var o={},a=0,i=function(){for(var t in this.el=e,this.options=o,r)r.hasOwnProperty(t)&&(o[t]=n&&void 0!==n[t]?n[t]:r[t],"function"==typeof o[t]&&(o[t]=o[t].bind(this)));o.easing="string"==typeof o.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[o.easing])?jQuery.easing[o.easing]:r.easing,"number"==typeof o.animate&&(o.animate={duration:o.animate,enabled:!0}),"boolean"!=typeof o.animate||o.animate||(o.animate={duration:1e3,enabled:o.animate}),this.renderer=new o.renderer(e,o),this.renderer.draw(a),e.dataset&&e.dataset.percent?this.update(parseFloat(e.dataset.percent)):e.getAttribute&&e.getAttribute("data-percent")&&this.update(parseFloat(e.getAttribute("data-percent")))}.bind(this);this.update=function(e){return e=parseFloat(e),o.animate.enabled?this.renderer.animate(a,e):this.renderer.draw(e),a=e,this}.bind(this),this.disableAnimation=function(){return o.animate.enabled=!1,this},this.enableAnimation=function(){return o.animate.enabled=!0,this},i()};e.fn.easyPieChart=function(t){return this.each(function(){var r;e.data(this,"easyPieChart")||(r=e.extend({},t,e(this).data()),e.data(this,"easyPieChart",new n(this,r)))})}}),function(e){"use strict";"function"==typeof define&&define.amd?define("hoverIntent",["jquery"],e):"object"==typeof module&&module.exports?module.exports=e(require("jquery")):jQuery&&!jQuery.fn.hoverIntent&&e(jQuery)}(function(e){"use strict";var t,n,r={interval:100,sensitivity:6,timeout:0},o=0,a=function(e){t=e.pageX,n=e.pageY},i=function(e,r,o,s){if(Math.sqrt((o.pX-t)*(o.pX-t)+(o.pY-n)*(o.pY-n))

    • '}),Confirmation.prototype=$.extend({},$.fn.popover.Constructor.prototype),Confirmation.prototype.constructor=Confirmation,Confirmation.prototype.getDefaults=function(){return Confirmation.DEFAULTS},Confirmation.prototype.setContent=function(){var e=this,t=this.tip(),n=this.getTitle(),r=t.find('[data-apply="confirmation"]'),o=t.find('[data-dismiss="confirmation"]');this.options,r.addClass(this.getBtnOkClass()).html(this.getBtnOkLabel()).prepend($("").addClass(this.getBtnOkIcon())," ").attr("href",this.getHref()).attr("target",this.getTarget()).off("click").on("click",function(t){if(e.runCallback(e.options.onConfirm,t,e.$element),"submit"==e.$element.attr("type")){var n=e.$element.closest("form");(void 0!==n.attr("novalidate")||n[0].checkValidity())&&n.submit()}e.hide(),e.inState.click=!1,e.$element.trigger($.Event("confirm.bs.confirmation"))}),o.addClass(this.getBtnCancelClass()).html(this.getBtnCancelLabel()).prepend($("").addClass(this.getBtnCancelIcon())," ").off("click").on("click",function(t){e.runCallback(e.options.onCancel,t,e.$element),e.hide(),e.inState.click=!1,e.$element.trigger($.Event("cancel.bs.confirmation"))}),t.find(".popover-title")[this.options.html?"html":"text"](n),t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},Confirmation.prototype.getBtnOkClass=function(){return this.$element.data("btnOkClass")||("function"==typeof this.options.btnOkClass?this.options.btnOkClass.call(this,this.$element):this.options.btnOkClass)},Confirmation.prototype.getBtnOkLabel=function(){return this.$element.data("btnOkLabel")||("function"==typeof this.options.btnOkLabel?this.options.btnOkLabel.call(this,this.$element):this.options.btnOkLabel)},Confirmation.prototype.getBtnOkIcon=function(){return this.$element.data("btnOkIcon")||("function"==typeof this.options.btnOkIcon?this.options.btnOkIcon.call(this,this.$element):this.options.btnOkIcon)},Confirmation.prototype.getBtnCancelClass=function(){return this.$element.data("btnCancelClass")||("function"==typeof this.options.btnCancelClass?this.options.btnCancelClass.call(this,this.$element):this.options.btnCancelClass)},Confirmation.prototype.getBtnCancelLabel=function(){return this.$element.data("btnCancelLabel")||("function"==typeof this.options.btnCancelLabel?this.options.btnCancelLabel.call(this,this.$element):this.options.btnCancelLabel)},Confirmation.prototype.getBtnCancelIcon=function(){return this.$element.data("btnCancelIcon")||("function"==typeof this.options.btnCancelIcon?this.options.btnCancelIcon.call(this,this.$element):this.options.btnCancelIcon)},Confirmation.prototype.getTitle=function(){return this.$element.data("confirmation-title")||this.$element.data("title")||this.$element.attr("title")||("function"==typeof this.options.title?this.options.title.call(this,this.$element):this.options.title)},Confirmation.prototype.getHref=function(){return this.$element.data("href")||this.$element.attr("href")||("function"==typeof this.options.href?this.options.href.call(this,this.$element):this.options.href)},Confirmation.prototype.getTarget=function(){return this.$element.data("target")||this.$element.attr("target")||("function"==typeof this.options.target?this.options.target.call(this,this.$element):this.options.target)},Confirmation.prototype.isPopout=function(){var e=this.$element.data("popout")||("function"==typeof this.options.popout?this.options.popout.call(this,this.$element):this.options.popout);return"false"==e&&(e=!1),e},Confirmation.prototype.runCallback=function(callback,event,element){"function"==typeof callback?callback.call(this,event,element):"string"==typeof callback&&eval(callback)};var old=$.fn.confirmation;$.fn.confirmation=function(e){var t=this;return this.each(function(){var n=$(this),r=n.data("bs.confirmation"),o="object"==typeof e&&e;(o=o||{}).all_selector=t.selector,(r||"destroy"!=e)&&(r||n.data("bs.confirmation",r=new Confirmation(this,o)),"string"==typeof e&&r[e]())})},$.fn.confirmation.Constructor=Confirmation,$.fn.confirmation.noConflict=function(){return $.fn.confirmation=old,this}}(jQuery),define("bootstrapConfirmation",["bootstrap"],function(){}),function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},this.defaults(),n),this.render()};t.VERSION="2.2.0",t.DEFAULTS={on:"On",off:"Off",onstyle:"primary",offstyle:"default",size:"normal",style:"",width:null,height:null},t.prototype.defaults=function(){return{on:this.$element.attr("data-on")||t.DEFAULTS.on,off:this.$element.attr("data-off")||t.DEFAULTS.off,onstyle:this.$element.attr("data-onstyle")||t.DEFAULTS.onstyle,offstyle:this.$element.attr("data-offstyle")||t.DEFAULTS.offstyle,size:this.$element.attr("data-size")||t.DEFAULTS.size,style:this.$element.attr("data-style")||t.DEFAULTS.style,width:this.$element.attr("data-width")||t.DEFAULTS.width,height:this.$element.attr("data-height")||t.DEFAULTS.height}},t.prototype.render=function(){this._onstyle="btn-"+this.options.onstyle,this._offstyle="btn-"+this.options.offstyle;var t="large"===this.options.size?"btn-lg":"small"===this.options.size?"btn-sm":"mini"===this.options.size?"btn-xs":"",n=e('
      into a container (for better animation performance) + // slideUp new wrapper divs + if(rowElement.is(':visible')){ + // hide row + + // stop sig counter by adding a stopClass to each , remove padding + cellElements.addClass(Counter.config.counterStopClass) + .velocity({ + paddingTop: [0, '4px'], + paddingBottom: [0, '4px'], + opacity: [0, 1] + },{ + duration: duration, + easing: 'linear' + }).wrapInner('
      ') + .children() + .css({ + 'willChange': 'height' + }).velocity('slideUp', { + duration: duration, + easing: 'linear', + complete: function(animationElements){ + // remove wrapper + $(animationElements).children().unwrap(); + + resolve({ + action: 'rowHidden', + row: rowElement + }); + } + }); + }else{ + // show row + + // remove padding on "hidden" cells for smother animation + cellElements.css({ + 'padding-top': 0, + 'padding-bottom': 0, + 'willChange': 'padding-top, padding-top, height' + }); + + // add hidden wrapper for ea + cellElements.wrapInner($('
      ').hide()); + + // show row for padding animation + rowElement.show(); + + cellElements.velocity({ + paddingTop: ['4px', 0], + paddingBottom: ['4px', 0] + },{ + duration: duration, + queue: false, + complete: function(){ + // animate
      wrapper + cellElements.children() + .css({ + 'willChange': 'height' + }).velocity('slideDown', { + duration: duration, + complete: function(animationElements){ + // remove wrapper + for(let i = 0; i < animationElements.length; i++){ + let currentWrapper = $(animationElements[i]); + if(currentWrapper.children().length > 0){ + currentWrapper.children().unwrap(); + }else{ + currentWrapper.parent().html( currentWrapper.html() ); + } + } + + resolve({ + action: 'rowShown', + row: rowElement + }); + } + }); + } + }); + } + }; + + return new Promise(toggleTableRowExecutor); + } + + /** + * update scanned signatures progress bar + * @param tableApi + * @param options + */ + updateScannedSignaturesBar(tableApi, options){ + let tableElement = tableApi.table().node(); + let parentElement = $(tableElement).parents('.' + this._config.className + ', .' + this._config.sigReaderDialogClass); + let progressBar = parentElement.find('.progress-bar'); + let progressBarLabel = parentElement.find('.progress-label-right'); + + let percent = 0; + let progressBarType = ''; + let columnGroupData = tableApi.column('group:name').data(); + let sigCount = columnGroupData.length; + let sigIncompleteCount = columnGroupData.filter((value, index) => !value).length; + + if(sigCount){ + percent = 100 - Math.round( 100 / sigCount * sigIncompleteCount ); + } + + if(percent < 30){ + progressBarType = 'progress-bar-danger'; + }else if(percent < 100){ + progressBarType = 'progress-bar-warning'; + }else{ + progressBarType = 'progress-bar-success'; + } + + progressBarLabel.text(percent + '%'); + progressBar.removeClass().addClass('progress-bar').addClass(progressBarType); + progressBar.attr('aria-valuenow', percent); + progressBar.css({width: percent + '%'}); + + // show notifications + if(options.showNotice !== false){ + let notification = (sigCount - sigIncompleteCount) + ' / ' + sigCount + ' (' + percent + '%) signatures scanned'; + + if(percent < 100){ + this.showNotify({title: 'Unscanned signatures', text: notification, type: 'info'}); + }else{ + this.showNotify({title: 'System is scanned', text: notification, type: 'success'}); + } + } + } + + /** + * load existing (current) signature data into info table (preview) + * @param infoTableApi + * @param draw + */ + initTableDataWithCurrentSignatureData(infoTableApi, draw = false){ + // reset/clear infoTable + infoTableApi.clear(); + + let primaryTableApi = this.getDataTableInstance(this._systemData.mapId, this._systemData.id, 'primary'); + if(primaryTableApi){ + infoTableApi.rows.add(primaryTableApi.data().toArray()); + if(draw){ + infoTableApi.draw(); + } + }else{ + console.warn('Signature table not found. mapId: %d; systemId: %d',this._systemData.mapId, this._systemData.id); + } + } + + /** + * set "signature reader" dialog observer + * @param dialogElement + */ + setSignatureReaderDialogObserver(dialogElement){ + dialogElement = $(dialogElement); + let form = dialogElement.find('form').first(); + let textarea = form.find('#' + this._config.sigInfoTextareaId); + let deleteOutdatedCheckbox = form.find('#' + this._config.sigReaderLazyUpdateId); + let deleteConnectionsCheckbox = form.find('#' + this._config.sigReaderConnectionDeleteId); + let errorClipboardValidation = 'No signatures found in scan result'; + let tableStatusElement = dialogElement.find('.' + this._config.tableToolbarStatusClass); + + form.initFormValidation({ + delay: 0, + feedback: { + success: 'fa-check', + error: 'fa-times' + }, + custom: { + clipboard: textarea => { + let signatureData = this.parseSignatureString(textarea.val()); + tableStatusElement.text(signatureData.length + ' signatures parsed'); + if(signatureData.length === 0){ + return errorClipboardValidation; + } + } + } + }); + + let updatePreviewSection = (formData) => { + let infoTableApi = this.getDataTableInstance(this._systemData.mapId, this._systemData.id, 'info'); + if(infoTableApi){ + // init 'infoTable' with existing signature rows + // infoTableApi.draw() not necessary at this point! + this.initTableDataWithCurrentSignatureData(infoTableApi); + + let signatureData = this.parseSignatureString(formData.clipboard); + if(signatureData.length > 0){ + // valid signature data parsed + // -> add some default data (e.g. currentCharacter data) to parsed signatureData + // -> not required, just for filling up some more columns + signatureData = this.enrichParsedSignatureData(signatureData); + + this.updateSignatureInfoTable(infoTableApi, signatureData, Boolean(formData.deleteOld), Boolean(formData.deleteConnection)); + }else{ + // no signatures pasted -> draw current signature rows + infoTableApi.draw(); + // reset counter elements + this.updateSignatureReaderCounters(SystemSignatureModule.emptySignatureReaderCounterData); + + this.updateScannedSignaturesBar(infoTableApi, {showNotice: false}); + + console.info(errorClipboardValidation); + } + }else{ + console.warn('Signature "preview" table not found. mapId: %d; systemId: %d', this._systemData.mapId, this._systemData.id); + } + }; + + // changes in 'scan result' textarea -> update preview table -------------------------------------------------- + let oldValue = ''; + textarea.on('change keyup paste', () => { + let formData = form.getFormValues(); + let currentValue = formData.clipboard; + if(currentValue === oldValue){ + return; //check to prevent multiple simultaneous triggers + } + oldValue = currentValue; + + updatePreviewSection(formData); + }); + + textarea.on('focus', function(e){ + this.select(); + }); + + // en/disable 'lazy update' toggles dependent checkbox -------------------------------------------------------- + let onDeleteOutdatedCheckboxChange = function(){ + deleteConnectionsCheckbox.prop('disabled', !this.checked); + deleteConnectionsCheckbox.prop('checked', false); + }.bind(deleteOutdatedCheckbox[0]); + + deleteOutdatedCheckbox.on('change', onDeleteOutdatedCheckboxChange); + onDeleteOutdatedCheckboxChange(); + + // en/disable checkboxes -> update preview table -------------------------------------------------------------- + deleteOutdatedCheckbox.add(deleteConnectionsCheckbox).on('change', () => { + let formData = form.getFormValues(); + if(formData.clipboard.length){ + updatePreviewSection(form.getFormValues()); + } + }); + + // listen 'primary' sig table updates -> update 'preview' sig table in the dialog ----------------------------- + dialogElement.on('pf:updateSignatureReaderDialog', () => { + updatePreviewSection(form.getFormValues()); + }); + } + + /** + * open "signature reader" dialog for signature table + * @param tableApi + */ + showSignatureReaderDialog(tableApi){ + requirejs([ + 'text!templates/dialog/signature_reader.html', + 'mustache' + ], (TplDialog, Mustache) => { + let data = { + sigInfoId: this._config.sigInfoId, + sigReaderLazyUpdateId: this._config.sigReaderLazyUpdateId, + sigReaderConnectionDeleteId: this._config.sigReaderConnectionDeleteId, + sigInfoTextareaId: this._config.sigInfoTextareaId, + sigInfoLazyUpdateStatus: this.getLazyUpdateToggleStatus(), + sigInfoCountSigNewId: this._config.sigInfoCountSigNewId, + sigInfoCountSigChangeId: this._config.sigInfoCountSigChangeId, + sigInfoCountSigDeleteId: this._config.sigInfoCountSigDeleteId, + sigInfoCountConDeleteId: this._config.sigInfoCountConDeleteId, + sigInfoProgressElement: this.newProgressElement().outerHTML + }; + + let signatureReaderDialog = bootbox.dialog({ + className: this._config.sigReaderDialogClass, + title: 'Signature reader', + size: 'large', + message: Mustache.render(TplDialog, data), + show: false, + buttons: { + close: { + label: 'cancel', + className: 'btn-default' + }, + success: { + label: ' update signatures', + className: 'btn-success', + callback: e => { + let form = $(e.delegateTarget).find('form'); + + // validate form + form.validator('validate'); + + // check whether the form is valid + if(form.isValidForm()){ + // get form data + let formData = form.getFormValues(); + + let signatureOptions = { + deleteOld: (formData.deleteOld) ? 1 : 0, + deleteConnection: (formData.deleteConnection) ? 1 : 0 + }; + + this.updateSignatureTableByClipboard(tableApi, formData.clipboard, signatureOptions); + }else{ + return false; + } + } + } + } + }); + + signatureReaderDialog.on('show.bs.modal', e => { + let infoTableApi = this.drawSignatureTableInfo(e.target); + // init 'infoTable' with existing signature rows + this.initTableDataWithCurrentSignatureData(infoTableApi, true); + + this.updateScannedSignaturesBar(infoTableApi, {showNotice: false}); + + this.setSignatureReaderDialogObserver(e.target); + }); + + // dialog shown event + signatureReaderDialog.on('shown.bs.modal', e => { + signatureReaderDialog.initTooltips(); + + // set focus on sig-input textarea + signatureReaderDialog.find('textarea').focus(); + }); + + // show dialog + signatureReaderDialog.modal('show'); + }); + } + + /** + * get "lazy delete" toggle element + * @returns {*} + */ + getLazyUpdateToggleElement(){ + return this.moduleElement.querySelector('.' + this._config.moduleHeadlineIconLazyClass); + } + + /** + * get status for "lazy delete" toggle + * @returns {number} + */ + getLazyUpdateToggleStatus(){ + return this.getLazyUpdateToggleElement().classList.contains('active') ? 1 : 0; + } + + /** + * update 'counter' UI elements in 'signature reader' dialog + * @param data + */ + updateSignatureReaderCounters(data){ + let counterElement = $('#' + this._config.sigInfoCountSigNewId).text(data.added || 0); + counterElement.toggleClass(counterElement.attr('data-class'), Boolean(data.added)); + + counterElement = $('#' + this._config.sigInfoCountSigChangeId).text(data.changed || 0); + counterElement.toggleClass(counterElement.attr('data-class'), Boolean(data.changed)); + + counterElement = $('#' + this._config.sigInfoCountSigDeleteId).text(data.deleted || 0); + counterElement.toggleClass(counterElement.attr('data-class'), Boolean(data.deleted)); + + counterElement = $('#' + this._config.sigInfoCountConDeleteId).text(data.deleteCon || 0); + counterElement.toggleClass(counterElement.attr('data-class'), Boolean(data.deleteCon)); + } + + /** + * add new row to signature table + * @param tableApi + * @param signatureData + * @returns {*} + */ + addSignatureRow(tableApi, signatureData){ + return tableApi ? tableApi.row.add(signatureData) : null; + } + + /** + * @param action + * @param rowId + * @returns {Promise} + */ + getPromiseForRow(action, rowId){ + return new Promise(resolve => { + resolve({action: action, rowId: rowId}); + }); + } + + /** + * callback for a changed row + * @param rowIndex + * @param colIndex + * @param tableLoopCount + * @param cellLoopCount + * @param options CUSTOM parameter (not DataTables specific)! + */ + rowUpdate(rowIndex, colIndex, tableLoopCount, cellLoopCount, options){ + let cell = Util.getObjVal(options, 'cell'); + let node = cell.nodes().to$(); + if(node.data('editable')){ + // xEditable is active -> should always be active! + // set new value even if no change -> e.g. render selected Ids as text labels + let oldValue = node.editable('getValue', true); + + // ... some editable cells depend on each other (e.g. group->type, group->connection) + switch(node.data('editable').options.name){ + case 'typeId': + // ... disable if no type options found + this.editableSelectCheck(node); + break; + case 'connectionId': + // disables if no wormhole group set + let groupId = cell.cell(rowIndex, 'group:name').data(); + if(groupId === 5){ + // wormhole + this.editableEnable(node); + }else{ + this.editableDisable(node); + } + break; + } + + // values should be set AFTER en/disabling of a field + node.editable('setValue', cell.data()); + + if(oldValue !== cell.data()){ + // highlight cell on data change + node.pulseBackgroundColor('changed', Util.getObjVal(options, 'keepVisible') || false); + } + }else if(node.hasClass(this._config.tableCellCounterClass)){ + // "updated" timestamp always changed + node.pulseBackgroundColor('changed', Util.getObjVal(options, 'keepVisible') || false); + } + } + + /** + * update 'info' (preview) signature table (inside 'signature reader' dialog) + * @param tableApi + * @param signaturesDataOrig + * @param deleteOutdatedSignatures + * @param deleteConnections + */ + updateSignatureInfoTable(tableApi, signaturesDataOrig, deleteOutdatedSignatures = false, deleteConnections = false){ + let module = this; + + // clone signature array because of further manipulation + let signaturesData = $.extend([], signaturesDataOrig); + + let rowIdsExist = []; + + let promisesAdded = []; + let promisesChanged = []; + let promisesDeleted = []; + + let allRows = tableApi.rows(); + + let rowUpdateCallback = function(){ + module.rowUpdate(...arguments, {cell: this, keepVisible: true}); + }; + + // update rows ------------------------------------------------------------------------------------------------ + allRows.every(function(rowIdx, tableLoop, rowLoop){ + let row = this; + let rowData = row.data(); + + for(let i = 0; i < signaturesData.length; i++){ + if(signaturesData[i].name === rowData.name){ + let rowId = row.id(true); + + // check if row was updated + if(signaturesData[i].updated.updated > rowData.updated.updated){ + // set new row data -> draw() is executed after all changes made + let newRowData = signaturesData[i]; + // keep "description" must not be replaced + newRowData.description = rowData.description; + // existing "groupId" must not be removed + if(!newRowData.groupId){ + newRowData.groupId = rowData.groupId; + newRowData.typeId = rowData.typeId; + }else if(newRowData.groupId === rowData.groupId){ + if(!newRowData.typeId){ + newRowData.typeId = rowData.typeId; + } + } + + // "created" timestamp will not change -> use existing + newRowData.created = rowData.created; + row.data(newRowData); + + // bind new signature dataTable data() -> to xEditable inputs + row.cells(row.id(true), ['id:name', 'group:name', 'type:name', 'description:name', 'connection:name', 'updated:name']) + .every(rowUpdateCallback); + + promisesChanged.push(module.getPromiseForRow('changed', rowId)); + } + + rowIdsExist.push(rowIdx); + + // remove signature data -> all left signatures will be added + signaturesData.splice(i, 1); + i--; + } + } + }); + + // delete rows ------------------------------------------------------------------------------------------------ + if(deleteOutdatedSignatures){ + let rows = tableApi.rows((rowIdx, rowData, node) => !rowIdsExist.includes(rowIdx)); + rows.every(function(rowIdx, tableLoop, rowLoop){ + let row = this; + let rowId = row.id(true); + let rowElement = row.nodes().to$(); + let rowData = row.data(); + + rowElement.pulseBackgroundColor('deleted', true); + + promisesChanged.push(module.getPromiseForRow('deleted', rowId)); + + // check if there is a connectionId. + if(deleteConnections && Util.getObjVal(rowData, 'connection.id')){ + promisesChanged.push(module.getPromiseForRow('deleteCon', rowId)); + } + }); + } + + // add rows --------------------------------------------------------------------------------------------------- + for(let signatureData of signaturesData){ + let row = module.addSignatureRow(tableApi, signatureData); + let rowElement = row.nodes().to$(); + rowElement.pulseBackgroundColor('added', true); + + promisesAdded.push(module.getPromiseForRow('added', row.index())); + } + + // done ------------------------------------------------------------------------------------------------------- + Promise.all(promisesAdded.concat(promisesChanged, promisesDeleted)).then(payloads => { + if(payloads.length){ + // table data changed -> draw() table changes + tableApi.draw(); + + // no notifications if table was empty just progressbar notification is needed + // sum payloads by "action" + let notificationCounter = payloads.reduce((acc, payload) => { + acc[payload.action]++; + return acc; + }, Object.assign({}, SystemSignatureModule.emptySignatureReaderCounterData)); + + module.updateSignatureReaderCounters(notificationCounter); + + module.updateScannedSignaturesBar(tableApi, {showNotice: false}); + } + }); + } + + /** + * update signature table with new signatures + * -> add/update/delete rows + * @param tableApi + * @param signaturesDataOrig + * @param deleteOutdatedSignatures + */ + updateSignatureTable(tableApi, signaturesDataOrig, deleteOutdatedSignatures = false){ + let module = this; + + if(tableApi.hasProcesses('lock')){ + console.info('Signature table locked. Skip table update'); + return; + } + + // disable tableApi until update finished; + let processLockPromise = tableApi.newProcess('lock'); + + // clone signature array because of further manipulation + let signaturesData = $.extend([], signaturesDataOrig); + + let rowIdsExist = []; + + let promisesAdded = []; + let promisesChanged = []; + let promisesDeleted = []; + + let allRows = tableApi.rows(); + let updateEmptyTable = !allRows.any(); + + let rowUpdateCallback = function(){ + module.rowUpdate(...arguments, {cell: this}); + }; + + // update signatures ------------------------------------------------------------------------------------------ + allRows.every(function(rowIdx, tableLoop, rowLoop){ + let row = this; + let rowData = row.data(); + + for(let i = 0; i < signaturesData.length; i++){ + if(signaturesData[i].id === rowData.id){ + let rowId = row.id(true); + + // check if row was updated + if(signaturesData[i].updated.updated > rowData.updated.updated){ + // set new row data -> draw() is executed after all changes made + row.data(signaturesData[i]); + + // bind new signature dataTable data() -> to xEditable inputs + row.cells(row.id(true), ['id:name', 'group:name', 'type:name', 'description:name', 'connection:name', 'updated:name']) + .every(rowUpdateCallback); + + promisesChanged.push(module.getPromiseForRow('changed', rowId)); + } + + rowIdsExist.push(rowId); + + // remove signature data -> all left signatures will be added + signaturesData.splice(i, 1); + i--; + } + } + }); + + // delete signatures ------------------------------------------------------------------------------------------ + if(deleteOutdatedSignatures){ + let rows = tableApi.rows((rowIdx, rowData, node) => !rowIdsExist.includes('#' + module._config.sigTableRowIdPrefix + rowData.id)); + rows.every(function(rowIdx, tableLoop, rowLoop){ + let row = this; + let rowId = row.id(true); + let rowElement = row.nodes().to$(); + + // hide open editable fields on the row before removing them + rowElement.find('.editable').editable('destroy'); + + // destroy possible open popovers (e.g. wormhole types, update popover) + rowElement.destroyPopover(true); + + rowElement.pulseBackgroundColor('deleted'); + + promisesDeleted.push(new Promise((resolve, reject) => { + module.toggleTableRow(rowElement).then(payload => resolve({action: 'deleted', rowIdx: rowId})); + })); + }).remove(); + } + + // add new signatures ----------------------------------------------------------------------------------------- + for(let signatureData of signaturesData){ + let row = module.addSignatureRow(tableApi, signatureData); + let rowId = row.id(true); + let rowElement = row.nodes().to$(); + rowElement.pulseBackgroundColor('added'); + + promisesAdded.push(module.getPromiseForRow('added', rowId)); + } + + // done ------------------------------------------------------------------------------------------------------- + Promise.all(promisesAdded.concat(promisesChanged, promisesDeleted)).then(payloads => { + if(payloads.length){ + // table data changed -> draw() table changes + tableApi.draw(); + + // check for "leads to" conflicts -> important if there are just "update" (no add/delete) changes + module.checkConnectionConflicts(); + + if(!updateEmptyTable){ + // no notifications if table was empty just progressbar notification is needed + // sum payloads by "action" + let notificationCounter = payloads.reduce((acc, payload) => { + if(!acc[payload.action]){ + acc[payload.action] = 0; + } + acc[payload.action]++; + return acc; + }, Object.assign({}, SystemSignatureModule.emptySignatureReaderCounterData)); + + let notification = Object.keys(notificationCounter).reduce((acc, key) => { + return `${acc}${notificationCounter[key] ? `${notificationCounter[key]} ${key}
      ` : ''}`; + }, ''); + + if(notification.length){ + Util.showNotify({title: 'Signatures updated', text: notification, type: 'success', textTrusted: true}); + } + } + + module.updateScannedSignaturesBar(tableApi, {showNotice: true}); + + // at this point the 'primary' signature table update is done + // we need to check if there is an open 'signature reader' dialog, + // that needs to update its 'preview' signature table + // -> to use DataTables "drawCallback" option or "draw.dt" event is not the *best* option: + // Both are called to frequently (e.g. after filter/sort actions) + $('.' + module._config.sigReaderDialogClass + '.in').trigger('pf:updateSignatureReaderDialog'); + } + + // unlock table + tableApi.endProcess(processLockPromise); + }); + } + + /** + * update signature "history" popover + * @param tableApi + * @param historyData + */ + updateSignatureHistory(tableApi, historyData){ + let tableElement = tableApi.table().node(); + $(tableElement).data('history', historyData); + } + + /** + * update module + * compare data and update module + * @param systemData + * @returns {Promise} + */ + update(systemData){ + return super.update(systemData).then(systemData => new Promise(resolve => { + if( + Util.getObjVal(systemData, 'id') === this._systemData.id && + Util.getObjVal(systemData, 'mapId') === this._systemData.mapId && + Util.getObjVal(systemData, 'signatures') && + Util.getObjVal(systemData, 'sigHistory') + ){ + let tableApi = this.getDataTableInstance(systemData.mapId, systemData.id, 'primary'); + this.updateSignatureTable(tableApi, systemData.signatures, true); + this.updateSignatureHistory(tableApi, systemData.sigHistory); + } + + $(this.moduleElement).hideLoadingAnimation(); + + resolve({ + action: 'update', + data: { + module: this + } + }); + })); + } + + /** + * init module + */ + init(){ + super.init(); + + let tableApi = this.getDataTableInstance(this._systemData.mapId, this._systemData.id, 'primary'); + tableApi.endProcess($(this.moduleElement).data('lockPromise')); + } + + /** + * before module hide callback + */ + beforeHide(){ + super.beforeHide(); + // disable update + this.getDataTableInstance(this._systemData.mapId, this._systemData.id, 'primary').newProcess('lock'); + } + + /** + * get all signature types that can exist for a system (jQuery obj) + * @param systemElement + * @param groupId + * @returns {*[]|*} + */ + static getSignatureTypeOptionsBySystem(systemElement, groupId){ + let systemTypeId = systemElement.data('typeId'); + let areaId = Util.getAreaIdBySecurity(systemElement.data('security')); + let systemData = {statics: systemElement.data('statics')}; + return SystemSignatureModule.getSignatureTypeOptions(systemTypeId, areaId, groupId, systemData); + } + + /** + * get all connection select options + * @param mapId + * @param systemData + * @returns {[]} + */ + static getSignatureConnectionOptions(mapId, systemData){ + let map = Map.getMapInstance(mapId); + let systemId = MapUtil.getSystemId(mapId, systemData.id); + let systemConnections = MapUtil.searchConnectionsBySystems(map, [systemId], 'wh'); + let newSelectOptions = []; + let connectionOptions = []; + + /** + * get option data for a single connection + * @param type + * @param connectionData + * @param systemData + * @returns {{value: *, text: string, metaData: {type: *}}} + */ + let getOption = (type, connectionData, systemData) => { + let text = 'UNKNOWN'; + if(type === 'source'){ + text = connectionData.sourceAlias + ' - ' + systemData.security; + }else if(type === 'target'){ + text = connectionData.targetAlias + ' - ' + systemData.security; + } + + return { + value: connectionData.id, + text: text, + metaData: { + type: connectionData.type + } + }; + }; + + for(let systemConnection of systemConnections){ + let connectionData = MapUtil.getDataByConnection(systemConnection); + + // connectionId is required (must be stored) + if(connectionData.id){ + // check whether "source" or "target" system is relevant for this connection + // -> hint "source" === 'target' --> loop + if(systemData.id !== connectionData.target){ + let targetSystemData = MapUtil.getSystemData(mapId, connectionData.target); + if(targetSystemData){ + // take target... + connectionOptions.push(getOption('target', connectionData, targetSystemData)); + } + }else if(systemData.id !== connectionData.source){ + let sourceSystemData = MapUtil.getSystemData(mapId, connectionData.source); + if(sourceSystemData){ + // take source... + connectionOptions.push(getOption('source', connectionData, sourceSystemData)); + } + } + } + } + + if(connectionOptions.length > 0){ + newSelectOptions.push({text: 'System', children: connectionOptions}); + } + + return newSelectOptions; + } + + /** + * get all signature types that can exist for a given system + * -> result is partially cached + * @param systemTypeId + * @param areaId + * @param groupId + * @param statics + * @param shattered + * @returns {[]|*} + */ + static getSignatureTypeOptions(systemTypeId, areaId, groupId, {statics = null, shattered = false} = {}){ + systemTypeId = parseInt(systemTypeId || 0); + areaId = parseInt(areaId || 0); + groupId = parseInt(groupId || 0); + let newSelectOptionsCount = 0; + + if(!systemTypeId || !areaId || !groupId){ + return []; + } + + // check if sig types require more than one 'areaId' to be checked + let areaIds = SystemSignatureModule.getAreaIdsForSignatureTypeOptions(systemTypeId, areaId, groupId, shattered); + + let cacheKey = [systemTypeId, ...areaIds, groupId].join('_'); + + let newSelectOptions = SystemSignatureModule.getCache('sigTypeOptions').get(cacheKey); + + // check for cached signature names + if(Array.isArray(newSelectOptions)){ + // hint: Cached signatures do not include static WHs! + // -> ".slice(0)" creates copy + newSelectOptions = newSelectOptions.slice(0); + newSelectOptionsCount = SystemSignatureModule.getOptionsCount('children', newSelectOptions); + }else{ + newSelectOptions = []; + // get new Options ---------- + // get all possible "static" signature names by the selected groupId + // -> for groupId == 5 (wormholes) this give you "wandering" whs + let tempSelectOptions = Util.getSignatureTypeNames(systemTypeId, areaIds, groupId); + + // format options into array with objects advantages: keep order, add more options (whs), use optgroup + if(tempSelectOptions){ + let fixSelectOptions = []; + for(let key in tempSelectOptions){ + if( + key > 0 && + tempSelectOptions.hasOwnProperty(key) + ){ + newSelectOptionsCount++; + fixSelectOptions.push({value: newSelectOptionsCount, text: tempSelectOptions[key]}); + } + } + + if(newSelectOptionsCount > 0){ + if(groupId === 5){ + // "wormhole" selected => multiple available + newSelectOptions.push({text: 'Wandering', children: fixSelectOptions}); + }else{ + newSelectOptions = fixSelectOptions; + } + } + } + + // wormhole (cached signatures) + if( groupId === 5 ){ + + // add possible frigate holes + let frigateHoles = SystemSignatureModule.getFrigateHolesBySystem(areaId); + let frigateWHData = []; + for(let frigKey in frigateHoles){ + if( + frigKey > 0 && + frigateHoles.hasOwnProperty(frigKey) + ){ + newSelectOptionsCount++; + frigateWHData.push({value: newSelectOptionsCount, text: frigateHoles[frigKey]}); + } + } + + if(frigateWHData.length > 0){ + newSelectOptions.push({text: 'Frigate', children: frigateWHData}); + } + + // add potential drifter holes (k-space only) + if([30, 31, 32].includes(areaId)){ + let drifterWHData = []; + for(let drifterKey in Init.drifterWormholes){ + if( + drifterKey > 0 && + Init.drifterWormholes.hasOwnProperty(drifterKey) + ){ + newSelectOptionsCount++; + drifterWHData.push({value: newSelectOptionsCount, text: Init.drifterWormholes[drifterKey]}); + } + } + + if(drifterWHData.length > 0){ + newSelectOptions.push({text: 'Drifter', children: drifterWHData}); + } + } + + // add potential incoming holes + let incomingWHData = []; + for(let incomingKey in Init.incomingWormholes){ + if( + incomingKey > 0 && + Init.incomingWormholes.hasOwnProperty(incomingKey) + ){ + newSelectOptionsCount++; + incomingWHData.push({value: newSelectOptionsCount, text: Init.incomingWormholes[incomingKey]}); + } + } + + if(incomingWHData.length > 0){ + newSelectOptions.push({text: 'Incoming', children: incomingWHData}); + } + }else{ + // groups without "children" (optgroup) should be sorted by "value" + // this is completely optional and not necessary! + newSelectOptions = newSelectOptions.sortBy('text'); + } + + // update cache (clone array) -> further manipulation to this array, should not be cached + SystemSignatureModule.getCache('sigTypeOptions').set(cacheKey, newSelectOptions.slice(0)); + } + + // static wormholes (DO NOT CACHE) (not all C2 WHs have the same statics..) + if(groupId === 5){ + // add static WH(s) for this system + if(statics){ + let staticWHData = []; + let filterOptionCallback = text => option => option.text !== text; + + for(let wormholeName of statics){ + let wormholeData = Object.assign({}, Init.wormholes[wormholeName]); + let staticWHName = wormholeData.name + ' - ' + wormholeData.security; + + // filter staticWHName from existing options -> prevent duplicates in + SystemSignatureModule.filterGroupedOptions(newSelectOptions, filterOptionCallback(staticWHName)); + + newSelectOptionsCount++; + staticWHData.push({value: newSelectOptionsCount, text: staticWHName}); + } + + if(staticWHData.length > 0){ + newSelectOptions.unshift({text: 'Static', children: staticWHData}); + } + } + } + + return newSelectOptions; + } + + /** + * filter out some options from nested select options + * @param obj + * @param callback + * @param key + */ + static filterGroupedOptions(obj, callback = () => true, key = 'children'){ + for(let [i, val] of Object.entries(obj)){ + // pre-check if filter callback will some, prevents unnecessary cloning + if( + typeof val === 'object' && + val.hasOwnProperty(key) && + val[key].not(callback).length + ){ + // clone object, apply filter to key prop + obj[i] = Object.assign({}, obj[i], {[key]: val[key].filter(callback)}); + } + } + } + + /** + * get possible frig holes that could spawn in a system + * filtered by "systemTypeId" + * @param systemTypeId + * @returns {{}} + */ + static getFrigateHolesBySystem(systemTypeId){ + let signatureNames = {}; + if(Init.frigateWormholes[systemTypeId]){ + signatureNames = Init.frigateWormholes[systemTypeId]; + } + return signatureNames; + } + + /** + * sum up all options in nested (or not nested) object of objects + * -> e.g. + * { + * first: { + * count = [4, 2, 1] + * test = { ... } + * }, + * second: { + * count = [12, 13] + * test = { ... } + * } + * } + * -> getOptionsCount('count', obj) => 5; + * @param key + * @param obj + * @returns {number} + */ + static getOptionsCount(key, obj){ + let sum = 0; + for(let entry of obj){ + if(entry.hasOwnProperty(key)){ + sum += entry[key].length; + }else{ + sum++; + } + } + return sum; + } + + /** + * Some signatures types can spawn in more than one 'areaId' for a 'groupId' + * -> e.g. a 'shattered' C3 WHs have Combat/Relic/.. sites from C2, C3, c4! + * https://github.com/exodus4d/pathfinder/issues/875 + * @param systemTypeId + * @param areaId + * @param groupId + * @param shattered + * @returns {[*]} + */ + static getAreaIdsForSignatureTypeOptions(systemTypeId, areaId, groupId, shattered = false){ + let areaIds = [areaId]; + + if( + systemTypeId === 1 && shattered && + [1, 2, 3, 4, 5, 6].includes(areaId) && + [1, 2, 3].includes(groupId) // Combat, Relic, Data + ){ + areaIds = [areaId - 1, areaId, areaId + 1].filter(areaId => areaId >= 1 && areaId <= 6); + }else if( + systemTypeId === 1 && shattered && + [1, 2, 3, 4, 5, 6].includes(areaId) && + [4, 6].includes(groupId) // Gas, Ore + ){ + areaIds = [1, 2, 3, 4, 5, 6, 13]; + } + + return areaIds; + } + }; + + SystemSignatureModule.isPlugin = false; // module is defined as 'plugin' + SystemSignatureModule.scope = 'system'; // module scope controls how module gets updated and what type of data is injected + SystemSignatureModule.sortArea = 'a'; // default sortable area + SystemSignatureModule.position = 4; // default sort/order position within sortable area + SystemSignatureModule.label = 'Signatures'; // static module label (e.g. description) + SystemSignatureModule.fullDataUpdate = true; // static module requires additional data (e.g. system description,...) + SystemSignatureModule.cacheConfig = { + sigTypeOptions: { // cache signature names + ttl: 60 * 5, + maxSize: 100 + } + }; + + SystemSignatureModule.validSignatureNames = [ // allowed signature type/names + 'Cosmic Anomaly', + 'Cosmic Signature', + 'Kosmische Anomalie', // de: "Cosmic Anomaly" + 'Kosmische Signatur', // de: "Cosmic Signature" + 'Космическая аномалия', // ru: "Cosmic Anomaly" + 'Скрытый сигнал', // ru: "Cosmic Signature" + 'Anomalie cosmique', // fr: "Cosmic Anomaly" + 'Signature cosmique', // fr: "Cosmic Signature" + '宇宙の特異点', // ja: "Cosmic Anomaly" + '宇宙のシグネチャ', // ja: "Cosmic Signature" + '异常空间', // zh: "Cosmic Anomaly" + '空间信号' // zh: "Cosmic Signature" + ]; + + SystemSignatureModule.emptySignatureData = { + id: 0, + name: '', + groupId: 0, + typeId: 0 + }; + + SystemSignatureModule.emptySignatureReaderCounterData = { + added: 0, + changed: 0, + deleted: 0, + deleteCon: 0 + }; + + SystemSignatureModule.editableDefaults = { // xEditable default options for signature fields + url: function(params){ + let saveExecutor = (resolve, reject) => { + // only submit params if id (pk) is set + if(params.pk){ + let requestData = {}; + requestData[params.name] = params.value; + + Util.request('PATCH', 'Signature', params.pk, requestData) + .then(payload => resolve(payload.data)) + .catch(payload => reject(payload.data.jqXHR)); + }else{ + resolve(); + } + }; + + return new Promise(saveExecutor); + }, + dataType: 'json', + highlight: false, // i use a custom implementation. xEditable uses inline styles for bg color animation -> does not work properly on datatables "sort" cols + error: function(jqXHR, newValue){ + let reason = ''; + let status = 'Error'; + if(jqXHR.statusText){ + reason = jqXHR.statusText; + }else if(jqXHR.name){ + // validation error new sig (new row data save function) + reason = jqXHR.name.msg; + // re-open "name" fields (its a collection of fields but we need "id" field) + jqXHR.name.field.$element.editable('show'); + }else{ + reason = jqXHR.responseJSON.text; + status = jqXHR.status; + } + + Util.showNotify({title: status + ': save signature', text: reason, type: 'error'}); + $(document).setProgramStatus('problem'); + return reason; + } + }; + + SystemSignatureModule.defaultConfig = { + className: 'pf-system-signature-module', // class for module + sortTargetAreas: ['a'], // sortable areas where module can be dragged into + headline: 'Signatures', // headline toolbar - moduleHeadlineIconClass: 'pf-module-icon-button', // class for toolbar icons in the head moduleHeadlineIconAddClass: 'pf-module-icon-button-add', // class for "add signature" icon moduleHeadlineIconReaderClass: 'pf-module-icon-button-reader', // class for "signature reader" icon moduleHeadlineIconLazyClass: 'pf-module-icon-button-lazy', // class for "lazy delete" toggle icon @@ -78,3282 +3236,5 @@ define([ sigInfoCountConDeleteId: 'pf-sig-info-count-con-delete' // id for "connection delete" counter }; - let sigTypeOptionsCache = new Cache({ // cache signature names - name: 'sigTypeOptions', - ttl: 60 * 5, - maxSize: 100, - debug: false - }); - - let validSignatureNames = [ // allowed signature type/names - 'Cosmic Anomaly', - 'Cosmic Signature', - 'Kosmische Anomalie', // de: "Cosmic Anomaly" - 'Kosmische Signatur', // de: "Cosmic Signature" - 'Космическая аномалия', // ru: "Cosmic Anomaly" - 'Скрытый сигнал', // ru: "Cosmic Signature" - 'Anomalie cosmique', // fr: "Cosmic Anomaly" - 'Signature cosmique', // fr: "Cosmic Signature" - '宇宙の特異点', // ja: "Cosmic Anomaly" - '宇宙のシグネチャ', // ja: "Cosmic Signature" - '异常空间', // zh: "Cosmic Anomaly" - '空间信号' // zh: "Cosmic Signature" - ]; - - let emptySignatureData = { - id: 0, - name: '', - groupId: 0, - typeId: 0 - }; - - let emptySignatureReaderCounterData = { - added: 0, - changed: 0, - deleted: 0, - deleteCon: 0 - }; - - let editableDefaults = { // xEditable default options for signature fields - url: function(params){ - let saveExecutor = (resolve, reject) => { - // only submit params if id (pk) is set - if(params.pk){ - let requestData = {}; - requestData[params.name] = params.value; - - Util.request('PATCH', 'signature', params.pk, requestData) - .then(payload => resolve(payload.data)) - .catch(payload => reject(payload.data.jqXHR)); - }else{ - resolve(); - } - }; - - return new Promise(saveExecutor); - }, - dataType: 'json', - container: 'body', - highlight: false, // i use a custom implementation. xEditable uses inline styles for bg color animation -> does not work properly on datatables "sort" cols - error: function(jqXHR, newValue){ - let reason = ''; - let status = 'Error'; - if(jqXHR.statusText){ - reason = jqXHR.statusText; - }else if(jqXHR.name){ - // validation error new sig (new row data save function) - reason = jqXHR.name.msg; - // re-open "name" fields (its a collection of fields but we need "id" field) - jqXHR.name.field.$element.editable('show'); - }else{ - reason = jqXHR.responseJSON.text; - status = jqXHR.status; - } - - Util.showNotify({title: status + ': save signature', text: reason, type: 'error'}); - $(document).setProgramStatus('problem'); - return reason; - } - }; - - /** - * get custom "metaData" from dataTables API - * @param tableApi - * @returns {*} - */ - let getTableMetaData = tableApi => { - let data = null; - if(tableApi){ - data = tableApi.init().pfMeta; - } - return data; - }; - - /** - * get dataTable id - * @param mapId - * @param systemId - * @param tableType - * @returns {string} - */ - let getTableId = (tableType, mapId, systemId) => Util.getTableId(config.sigTableId, tableType, mapId, systemId); - - /** - * get a dataTableApi instance from global cache - * @param mapId - * @param systemId - * @param tableType - * @returns {*} - */ - let getDataTableInstance = (mapId, systemId, tableType) => Util.getDataTableInstance(config.sigTableId, mapId, systemId, tableType); - - /** - * Update/set tooltip for an element - * @param element - * @param title - */ - let updateTooltip = (element, title) => { - $(element).attr('data-container', 'body') - .attr('title', title.toUpperCase()) - .tooltip('fixTitle').tooltip('setContent'); - }; - - /** - * sum up all options in nested (or not nested) object of objects - * -> e.g. - * { - * first: { - * count = [4, 2, 1] - * test = { ... } - * }, - * second: { - * count = [12, 13] - * test = { ... } - * } - * } - * -> getOptionsCount('count', obj) => 5; - * @param key - * @param obj - * @returns {number} - */ - let getOptionsCount = (key, obj) => { - let sum = 0; - for(let entry of obj){ - if(entry.hasOwnProperty(key)){ - sum += entry[key].length; - }else{ - sum++; - } - } - return sum; - }; - - /** - * Some signatures types can spawn in more than one 'areaId' for a 'groupId' - * -> e.g. a 'shattered' C3 WHs have Combat/Relic/.. sites from C2, C3, c4! - * https://github.com/exodus4d/pathfinder/issues/875 - * @param systemTypeId - * @param areaId - * @param groupId - * @param shattered - * @returns {[*]} - */ - let getAreaIdsForSignatureTypeOptions = (systemTypeId, areaId, groupId, shattered = false) => { - let areaIds = [areaId]; - - if( - systemTypeId === 1 && shattered && - [1, 2, 3, 4, 5, 6].includes(areaId) && - [1, 2, 3].includes(groupId) // Combat, Relic, Data - ){ - areaIds = [areaId - 1, areaId, areaId + 1].filter(areaId => areaId >= 1 && areaId <= 6); - }else if( - systemTypeId === 1 && shattered && - [1, 2, 3, 4, 5, 6].includes(areaId) && - [4, 6].includes(groupId) // Gas, Ore - ){ - areaIds = [1, 2, 3, 4, 5, 6, 13]; - } - - return areaIds; - }; - - /** - * get possible frig holes that could spawn in a system - * filtered by "systemTypeId" - * @param systemTypeId - * @returns {{}} - */ - let getFrigateHolesBySystem = systemTypeId => { - let signatureNames = {}; - if(Init.frigateWormholes[systemTypeId]){ - signatureNames = Init.frigateWormholes[systemTypeId]; - } - return signatureNames; - }; - - /** - * get all signature types that can exist for a given system - * -> result is partially cached - * @param systemTypeId - * @param areaId - * @param groupId - * @param statics - * @param shattered - * @returns {[]|*} - */ - let getSignatureTypeOptions = (systemTypeId, areaId, groupId, {statics = null, shattered = false} = {}) => { - systemTypeId = parseInt(systemTypeId || 0); - areaId = parseInt(areaId || 0); - groupId = parseInt(groupId || 0); - let newSelectOptions = []; - let newSelectOptionsCount = 0; - - if(!systemTypeId || !areaId || !groupId){ - return newSelectOptions; - } - - // check if sig types require more than one 'areaId' to be checked - let areaIds = getAreaIdsForSignatureTypeOptions(systemTypeId, areaId, groupId, shattered); - - let cacheKey = [systemTypeId, ...areaIds, groupId].join('_'); - - newSelectOptions = sigTypeOptionsCache.getOrDefault(cacheKey, []); - - // check for cached signature names - if(newSelectOptions.length){ - // cached signatures do not include static WHs! - // -> ".slice(0)" creates copy - newSelectOptions = newSelectOptions.slice(0); - newSelectOptionsCount = getOptionsCount('children', newSelectOptions); - }else{ - // get new Options ---------- - // get all possible "static" signature names by the selected groupId - let tempSelectOptions = Util.getSignatureTypeNames(systemTypeId, areaIds, groupId); - - // format options into array with objects advantages: keep order, add more options (whs), use optgroup - if(tempSelectOptions){ - let fixSelectOptions = []; - for(let key in tempSelectOptions){ - if( - key > 0 && - tempSelectOptions.hasOwnProperty(key) - ){ - newSelectOptionsCount++; - fixSelectOptions.push({value: newSelectOptionsCount, text: tempSelectOptions[key]}); - } - } - - if(newSelectOptionsCount > 0){ - if(groupId === 5){ - // "wormhole" selected => multiple available - newSelectOptions.push({ text: 'Wandering', children: fixSelectOptions}); - }else{ - newSelectOptions = fixSelectOptions; - } - } - } - - // wormhole (cached signatures) - if( groupId === 5 ){ - - // add possible frigate holes - let frigateHoles = getFrigateHolesBySystem(areaId); - let frigateWHData = []; - for(let frigKey in frigateHoles){ - if( - frigKey > 0 && - frigateHoles.hasOwnProperty(frigKey) - ){ - newSelectOptionsCount++; - frigateWHData.push({value: newSelectOptionsCount, text: frigateHoles[frigKey]}); - } - } - - if(frigateWHData.length > 0){ - newSelectOptions.push({ text: 'Frigate', children: frigateWHData}); - } - - // add potential drifter holes (k-space only) - if([30, 31, 32].includes(areaId)){ - let drifterWHData = []; - for(let drifterKey in Init.drifterWormholes){ - if( - drifterKey > 0 && - Init.drifterWormholes.hasOwnProperty(drifterKey) - ){ - newSelectOptionsCount++; - drifterWHData.push({value: newSelectOptionsCount, text: Init.drifterWormholes[drifterKey]}); - } - } - - if(drifterWHData.length > 0){ - newSelectOptions.push({ text: 'Drifter', children: drifterWHData}); - } - } - - // add potential incoming holes - let incomingWHData = []; - for(let incomingKey in Init.incomingWormholes){ - if( - incomingKey > 0 && - Init.incomingWormholes.hasOwnProperty(incomingKey) - ){ - newSelectOptionsCount++; - incomingWHData.push({value: newSelectOptionsCount, text: Init.incomingWormholes[incomingKey]}); - } - } - - if(incomingWHData.length > 0){ - newSelectOptions.push({text: 'Incoming', children: incomingWHData}); - } - }else{ - // groups without "children" (optgroup) should be sorted by "value" - // this is completely optional and not necessary! - newSelectOptions = newSelectOptions.sortBy('text'); - } - - // update cache (clone array) -> further manipulation to this array, should not be cached - sigTypeOptionsCache.set(cacheKey, newSelectOptions.slice(0)); - } - - // static wormholes (DO NOT CACHE) (not all C2 WHs have the same statics..) - if(groupId === 5){ - // add static WH(s) for this system - if(statics){ - let staticWHData = []; - for(let wormholeName of statics){ - let wormholeData = Object.assign({}, Init.wormholes[wormholeName]); - let staticWHName = wormholeData.name + ' - ' + wormholeData.security; - - newSelectOptionsCount++; - staticWHData.push({value: newSelectOptionsCount, text: staticWHName}); - } - - if(staticWHData.length > 0){ - newSelectOptions.unshift({ text: 'Static', children: staticWHData}); - } - } - } - - return newSelectOptions; - }; - - /** - * get all signature types that can exist for a system (jQuery obj) - * @param systemElement - * @param groupId - * @returns {Array} - */ - let getSignatureTypeOptionsBySystem = (systemElement, groupId) => { - let systemTypeId = systemElement.data('typeId'); - let areaId = Util.getAreaIdBySecurity(systemElement.data('security')); - let systemData = {statics: systemElement.data('statics')}; - return getSignatureTypeOptions(systemTypeId, areaId, groupId, systemData); - }; - - /** - * get all connection select options - * @param mapId - * @param systemData - * @returns {Array} - */ - let getSignatureConnectionOptions = (mapId, systemData) => { - let map = Map.getMapInstance( mapId ); - let systemId = MapUtil.getSystemId(mapId, systemData.id); - let systemConnections = MapUtil.searchConnectionsBySystems(map, [systemId], 'wh'); - let newSelectOptions = []; - let connectionOptions = []; - - /** - * get option data for a single connection - * @param type - * @param connectionData - * @param systemData - * @returns {{value: *, text: string, metaData: {type: *}}} - */ - let getOption = (type, connectionData, systemData) => { - let text = 'UNKNOWN'; - if(type === 'source'){ - text = connectionData.sourceAlias + ' - ' + systemData.security; - }else if(type === 'target'){ - text = connectionData.targetAlias + ' - ' + systemData.security; - } - - let option = { - value: connectionData.id, - text: text, - metaData: { - type: connectionData.type - } - }; - - return option; - }; - - for(let systemConnection of systemConnections){ - let connectionData = MapUtil.getDataByConnection(systemConnection); - - // connectionId is required (must be stored) - if(connectionData.id){ - // check whether "source" or "target" system is relevant for this connection - // -> hint "source" === 'target' --> loop - if(systemData.id !== connectionData.target){ - let targetSystemData = MapUtil.getSystemData(mapId, connectionData.target); - if(targetSystemData){ - // take target... - connectionOptions.push(getOption('target', connectionData, targetSystemData)); - } - }else if(systemData.id !== connectionData.source){ - let sourceSystemData = MapUtil.getSystemData(mapId, connectionData.source); - if(sourceSystemData){ - // take source... - connectionOptions.push(getOption('source', connectionData, sourceSystemData)); - } - } - } - } - - if(connectionOptions.length > 0){ - newSelectOptions.push({ text: 'System', children: connectionOptions}); - } - - return newSelectOptions; - }; - - /** - * show/hides a table
      into a container (for better animation performance) - // slideUp new wrapper divs - if(rowElement.is(':visible')){ - // hide row - - // stop sig counter by adding a stopClass to each , remove padding - cellElements.addClass(Counter.config.counterStopClass) - .velocity({ - paddingTop: [0, '4px'], - paddingBottom: [0, '4px'], - opacity: [0, 1] - },{ - duration: duration, - easing: 'linear' - }).wrapInner('
      ') - .children() - .css({ - 'willChange': 'height' - }).velocity('slideUp', { - duration: duration, - easing: 'linear', - complete: function(animationElements){ - // remove wrapper - $(animationElements).children().unwrap(); - - resolve({ - action: 'rowHidden', - row: rowElement - }); - } - }); - }else{ - // show row - - // remove padding on "hidden" cells for smother animation - cellElements.css({ - 'padding-top': 0, - 'padding-bottom': 0, - 'willChange': 'padding-top, padding-top, height' - }); - - // add hidden wrapper for ea - cellElements.wrapInner($('
      ').hide()); - - // show row for padding animation - rowElement.show(); - - cellElements.velocity({ - paddingTop: ['4px', 0], - paddingBottom: ['4px', 0] - },{ - duration: duration, - queue: false, - complete: function(){ - // animate
      wrapper - cellElements.children() - .css({ - 'willChange': 'height' - }).velocity('slideDown', { - duration: duration, - complete: function(animationElements){ - // remove wrapper - for(let i = 0; i < animationElements.length; i++){ - let currentWrapper = $(animationElements[i]); - if(currentWrapper.children().length > 0){ - currentWrapper.children().unwrap(); - }else{ - currentWrapper.parent().html( currentWrapper.html() ); - } - } - - resolve({ - action: 'rowShown', - row: rowElement - }); - } - }); - } - }); - } - }; - - return new Promise(toggleTableRowExecutor); - }; - - /** - * update scanned signatures progress bar - * @param tableApi - * @param options - */ - let updateScannedSignaturesBar = (tableApi, options) => { - let tableElement = tableApi.table().node(); - let parentElement = $(tableElement).parents('.' + config.moduleTypeClass + ', .' + config.sigReaderDialogClass); - let progressBar = parentElement.find('.progress-bar'); - let progressBarLabel = parentElement.find('.progress-label-right'); - - let percent = 0; - let progressBarType = ''; - let columnGroupData = tableApi.column('group:name').data(); - let sigCount = columnGroupData.length; - let sigIncompleteCount = columnGroupData.filter((value, index) => !value).length; - - if(sigCount){ - percent = 100 - Math.round( 100 / sigCount * sigIncompleteCount ); - } - - if(percent < 30){ - progressBarType = 'progress-bar-danger'; - }else if(percent < 100){ - progressBarType = 'progress-bar-warning'; - }else{ - progressBarType = 'progress-bar-success'; - } - - progressBarLabel.text(percent + '%'); - progressBar.removeClass().addClass('progress-bar').addClass(progressBarType); - progressBar.attr('aria-valuenow', percent); - progressBar.css({width: percent + '%'}); - - // show notifications - if(options.showNotice !== false){ - let notification = (sigCount - sigIncompleteCount) + ' / ' + sigCount + ' (' + percent + '%) signatures scanned'; - - if(percent < 100){ - Util.showNotify({title: 'Unscanned signatures', text: notification, type: 'info'}); - }else{ - Util.showNotify({title: 'System is scanned', text: notification, type: 'success'}); - } - } - }; - - /** - * load existing (current) signature data into info table (preview) - * @param infoTableApi - * @param mapId - * @param systemId - * @param draw - */ - let initTableDataWithCurrentSignatureData = (infoTableApi, mapId, systemId, draw = false) => { - // reset/clear infoTable - infoTableApi.clear(); - - let primaryTableApi = getDataTableInstance(mapId, systemId, 'primary'); - if(primaryTableApi){ - infoTableApi.rows.add(primaryTableApi.data().toArray()); - if(draw){ - infoTableApi.draw(); - } - }else{ - console.warn('Signature table not found. mapId: %d; systemId: %d', mapId, systemId); - } - }; - - /** - * set "signature reader" dialog observer - * @param dialogElement - * @param mapId - * @param systemData - */ - let setSignatureReaderDialogObserver = (dialogElement, mapId, systemData) => { - let systemId = systemData.id; - let form = dialogElement.find('form').first(); - let textarea = form.find('#' + config.sigInfoTextareaId); - let deleteOutdatedCheckbox = form.find('#' + config.sigReaderLazyUpdateId); - let deleteConnectionsCheckbox = form.find('#' + config.sigReaderConnectionDeleteId); - let errorClipboardValidation = 'No signatures found in scan result'; - let tableStatusElement = dialogElement.find('.' + config.tableToolbarStatusClass); - - form.initFormValidation({ - delay: 0, - feedback: { - success: 'fa-check', - error: 'fa-times' - }, - custom: { - clipboard: function(textarea){ - let signatureData = parseSignatureString(systemData, textarea.val()); - tableStatusElement.text(signatureData.length + ' signatures parsed'); - if(signatureData.length === 0){ - return errorClipboardValidation; - } - } - } - }); - - let updatePreviewSection = (mapId, systemId, formData) => { - let infoTableApi = getDataTableInstance(mapId, systemId, 'info'); - if(infoTableApi){ - // init 'infoTable' with existing signature rows - // infoTableApi.draw() not necessary at this point! - initTableDataWithCurrentSignatureData(infoTableApi, mapId, systemId); - - let signatureData = parseSignatureString(systemData, formData.clipboard); - if(signatureData.length > 0){ - // valid signature data parsed - // -> add some default data (e.g. currentCharacter data) to parsed signatureData - // -> not required, just for filling up some more columns - signatureData = enrichParsedSignatureData(signatureData); - - updateSignatureInfoTable(infoTableApi, signatureData, Boolean(formData.deleteOld), Boolean(formData.deleteConnection)); - }else{ - // no signatures pasted -> draw current signature rows - infoTableApi.draw(); - // reset counter elements - updateSignatureReaderCounters(emptySignatureReaderCounterData); - - updateScannedSignaturesBar(infoTableApi, {showNotice: false}); - - console.info(errorClipboardValidation); - } - }else{ - console.warn('Signature "preview" table not found. mapId: %d; systemId: %d', mapId, systemId); - } - }; - - // changes in 'scan result' textarea -> update preview table -------------------------------------------------- - let oldValue = ''; - textarea.on('change keyup paste', function(){ - let formData = form.getFormValues(); - let currentValue = formData.clipboard; - if(currentValue === oldValue){ - return; //check to prevent multiple simultaneous triggers - } - oldValue = currentValue; - - updatePreviewSection(mapId, systemId, formData); - }); - - textarea.on('focus', function(e){ - this.select(); - }); - - // en/disable 'lazy update' toggles dependent checkbox -------------------------------------------------------- - let onDeleteOutdatedCheckboxChange = function(){ - deleteConnectionsCheckbox.prop('disabled', !this.checked); - deleteConnectionsCheckbox.prop('checked', false); - }.bind(deleteOutdatedCheckbox[0]); - - deleteOutdatedCheckbox.on('change', onDeleteOutdatedCheckboxChange); - onDeleteOutdatedCheckboxChange(); - - // en/disable checkboxes -> update preview table -------------------------------------------------------------- - deleteOutdatedCheckbox.add(deleteConnectionsCheckbox).on('change', function(){ - let formData = form.getFormValues(); - if(formData.clipboard.length){ - updatePreviewSection(mapId, systemId, form.getFormValues()); - } - }); - - // listen 'primary' sig table updates -> update 'preview' sig table in the dialog ----------------------------- - dialogElement.on('pf:updateSignatureReaderDialog', function(e){ - updatePreviewSection(mapId, systemId, form.getFormValues()); - }); - }; - - /** - * open "signature reader" dialog for signature table - * @param systemData - */ - $.fn.showSignatureReaderDialog = function(systemData){ - let moduleElement = $(this); - let mapId = moduleElement.data('mapId'); - let systemId = moduleElement.data('systemId'); - - requirejs([ - 'text!templates/dialog/signature_reader.html', - 'text!templates/form/progress.html', - 'mustache' - ], (TplDialog, TplProgress, Mustache) => { - let data = { - sigInfoId: config.sigInfoId, - sigReaderLazyUpdateId: config.sigReaderLazyUpdateId, - sigReaderConnectionDeleteId: config.sigReaderConnectionDeleteId, - sigInfoTextareaId: config.sigInfoTextareaId, - sigInfoLazyUpdateStatus: getLazyUpdateToggleStatus(moduleElement), - sigInfoCountSigNewId: config.sigInfoCountSigNewId, - sigInfoCountSigChangeId: config.sigInfoCountSigChangeId, - sigInfoCountSigDeleteId: config.sigInfoCountSigDeleteId, - sigInfoCountConDeleteId: config.sigInfoCountConDeleteId, - sigInfoProgressElement : Mustache.render(TplProgress, { - label: true, - wrapperClass: config.moduleHeadlineProgressBarClass, - class: ['progress-bar-success'].join(' '), - percent: 0 - }) - }; - - let signatureReaderDialog = bootbox.dialog({ - className: config.sigReaderDialogClass, - title: 'Signature reader', - size: 'large', - message: Mustache.render(TplDialog, data), - show: false, - buttons: { - close: { - label: 'cancel', - className: 'btn-default' - }, - success: { - label: ' update signatures', - className: 'btn-success', - callback: function(){ - let form = this.find('form'); - - // validate form - form.validator('validate'); - - // check whether the form is valid - if(form.isValidForm()){ - // get form data - let formData = form.getFormValues(); - - let signatureOptions = { - deleteOld: (formData.deleteOld) ? 1 : 0, - deleteConnection: (formData.deleteConnection) ? 1 : 0 - }; - - let tableApi = getDataTableInstance(mapId, systemId, 'primary'); - - updateSignatureTableByClipboard(tableApi, systemData, formData.clipboard, signatureOptions); - }else{ - return false; - } - } - } - } - }); - - signatureReaderDialog.on('show.bs.modal', function(e) { - let dialogElement = $(this); - let infoTableApi = drawSignatureTableInfo(this, mapId, systemData); - // init 'infoTable' with existing signature rows - initTableDataWithCurrentSignatureData(infoTableApi, mapId, systemId, true); - - updateScannedSignaturesBar(infoTableApi, {showNotice: false}); - - setSignatureReaderDialogObserver(dialogElement, mapId, systemData); - }); - - // dialog shown event - signatureReaderDialog.on('shown.bs.modal', function(e){ - signatureReaderDialog.initTooltips(); - - // set focus on sig-input textarea - signatureReaderDialog.find('textarea').focus(); - }); - - // show dialog - signatureReaderDialog.modal('show'); - }); - }; - - /** - * Parsed scan result data (from EVE client) should be enriched with some data - * -> fill up more columns in the 'preview' signature tab.e - * @param signatureData - * @returns {*} - */ - let enrichParsedSignatureData = signatureData => { - let characterData = Util.getObjVal(Util.getCurrentUserData(), 'character'); - let timestamp = Math.floor((new Date()).getTime() / 1000); - - for(let i = 0; i < signatureData.length; i++){ - signatureData[i].created = { - created: timestamp, - character: characterData - }; - signatureData[i].updated = { - updated: timestamp, - character: characterData - }; - } - - return signatureData; - }; - - /** - * parses a copy&paste string from ingame scanning window - * @param systemData - * @param clipboard - * @returns {Array} - */ - let parseSignatureString = (systemData, clipboard) => { - let signatureData = []; - - if(clipboard.length){ - let signatureRows = clipboard.split(/\r\n|\r|\n/g); - let signatureGroupOptions = config.signatureGroupsNames; - let invalidSignatures = 0; - - for(let i = 0; i < signatureRows.length; i++){ - let rowData = signatureRows[i].split(/\t|\s{4}/g); - if(rowData.length === 6){ - // check if sig Type = anomaly or combat site - if(validSignatureNames.indexOf( rowData[1] ) !== -1){ - - let sigGroup = $.trim(rowData[2]).toLowerCase(); - let sigDescription = $.trim(rowData[3]); - let sigGroupId = 0; - let typeId = 0; - - // get groupId by groupName - for(let groupOption of signatureGroupOptions){ - let reg = new RegExp(groupOption.text, 'i'); - if(reg.test(sigGroup)){ - sigGroupId = groupOption.value; - break; - } - } - - // wormhole type cant be extracted from signature string -> skip function call - if(sigGroupId !== 5){ - // try to get "typeId" from description string - let sigDescriptionLowerCase = sigDescription.toLowerCase(); - - let typeOptions = getSignatureTypeOptions( - systemData.type.id, - Util.getAreaIdBySecurity(systemData.security), - sigGroupId, - systemData - ); - - for(let [key, name] of Object.entries(Util.flattenXEditableSelectArray(typeOptions))){ - if(name.toLowerCase() === sigDescriptionLowerCase){ - typeId = parseInt(key); - break; - } - } - - // set signature name as "description" if signature matching failed - sigDescription = (typeId === 0) ? sigDescription : ''; - }else{ - sigDescription = ''; - } - - // map array values to signature Object - let signatureObj = { - systemId: systemData.id, - name: $.trim(rowData[0]).toLowerCase(), - groupId: sigGroupId, - typeId: typeId, - description: sigDescription - }; - - signatureData.push(signatureObj); - }else{ - invalidSignatures++; - } - } - } - - if(invalidSignatures > 0){ - let notification = invalidSignatures + ' / ' + signatureRows.length + ' signatures invalid'; - Util.showNotify({title: 'Invalid signature(s)', text: notification, type: 'warning'}); - } - } - - return signatureData; - }; - - /** - * updates the signature table with all signatures pasted into the "signature reader" dialog - * -> Hint: copy&paste signature data (without any open dialog) will add signatures as well - * @param tableApi - * @param systemData - * @param clipboard data stream - * @param options - */ - let updateSignatureTableByClipboard = (tableApi, systemData, clipboard, options) => { - if(tableApi.hasProcesses('request')){ - console.info('Update signature table By clipboard locked.'); - return; - } - - let saveSignatureData = signatureData => { - // lock update function until request is finished - let processLockPromise = tableApi.newProcess('lock'); - let processRequestPromise = tableApi.newProcess('request'); - - Util.request( - 'POST', - 'signature', - [], - { - signatures: signatureData, - deleteOld: options.deleteOld || 0, - deleteConnection: options.deleteConnection || 0, - systemId: parseInt(systemData.id) - }, - { - tableApi: tableApi, - processLockPromise: processLockPromise, - processRequestPromise: processRequestPromise - }, - context => { - context.tableApi.endProcess(context.processLockPromise); - context.tableApi.endProcess(context.processRequestPromise); - }).then( - payload => { - // updates table with new/updated signature information - updateSignatureTable(payload.context.tableApi, payload.data, !!options.deleteOld); - }, - Util.handleAjaxErrorResponse - ); - }; - - // parse input stream - let signatureData = parseSignatureString(systemData, clipboard); - if(signatureData.length > 0){ - // valid signature data parsed - - // check if signatures will be added to a system where character is currently in - // if character is not in any system -> id === undefined -> no "confirmation required - let currentLocationData = Util.getCurrentLocationData(); - if( - currentLocationData.id && - currentLocationData.id !== systemData.systemId - ){ - let systemNameStr = (systemData.name === systemData.alias) ? '"' + systemData.name + '"' : '"' + systemData.alias + '" (' + systemData.name + ')'; - systemNameStr = '' + systemNameStr + ''; - - let msg = 'Update signatures in ' + systemNameStr + ' ? This is not your current location, "' + currentLocationData.name + '" !'; - bootbox.confirm(msg, function(result){ - if(result){ - saveSignatureData(signatureData); - } - }); - }else{ - // current system selected -> no "confirmation" required - saveSignatureData(signatureData); - } - } - }; - - /** - * deletes signature rows from signature table - * @param tableApi - * @param rows - * @param deleteOptions - */ - let deleteSignatures = (tableApi, rows, deleteOptions = {}) => { - // get unique id array from rows -> in case there are 2 rows with same id -> you never know - let signatureIds = [...new Set(rows.data().toArray().map(rowData => rowData.id))]; - let metaData = getTableMetaData(tableApi); - let data = Object.assign(deleteOptions, { - systemId: metaData.systemId - }); - - let processRequestPromise = tableApi.newProcess('request'); - - Util.request('DELETE', 'signature', signatureIds, data, { - tableApi: tableApi, - processRequestPromise: processRequestPromise - }, - context => { - context.tableApi.endProcess(context.processRequestPromise); - }).then( - payload => { - let tableApi = payload.context.tableApi; - - // promises for all delete rows - let promisesToggleRow = []; - // get deleted rows -> match with response data - let rows = tableApi.rows((idx, rowData, node) => payload.data.includes(rowData.id)); - // toggle hide animation for rows one by one... - rows.every(function (rowIdx, tableLoop, rowLoop) { - let row = this; - let rowElement = row.nodes().to$(); - - rowElement.pulseBackgroundColor('deleted'); - - promisesToggleRow.push(toggleTableRow(rowElement)); - }); - - // ... all hide animations done ... - Promise.all(promisesToggleRow).then(payloads => { - // ... get deleted (hide animation done) and delete them - tableApi.rows(payloads.map(payload => payload.row)).remove().draw(); - - // update signature bar - updateScannedSignaturesBar(tableApi, {showNotice: false}); - - // update connection conflicts - checkConnectionConflicts(); - - let notificationOptions = { - type: 'success' - }; - if (payloads.length === 1) { - notificationOptions.title = 'Signature deleted'; - } else { - notificationOptions.title = payloads.length + ' Signatures deleted '; - } - Util.showNotify(notificationOptions); - }); - }, - Util.handleAjaxErrorResponse - ); - }; - - /** - * updates a single cell with new data (e.g. "updated" cell) - * @param tableApi - * @param rowIndex - * @param columnSelector - * @param data - */ - let updateSignatureCell = (tableApi, rowIndex, columnSelector, data) => { - tableApi.cell(rowIndex, columnSelector).data(data); - }; - - /** - * check connectionIds for conflicts (multiple signatures -> same connection) - * -> show "conflict" icon next to select - */ - let checkConnectionConflicts = () => { - setTimeout(() => { - let connectionSelectsSelector = [config.sigTablePrimaryClass, config.sigTableSecondaryClass].map( - tableClass => '.' + tableClass + ' .' + config.tableCellConnectionClass + '.editable' - ).join(', '); - - let connectionSelects = $(connectionSelectsSelector); - let connectionIds = []; - let duplicateConnectionIds = []; - let groupedSelects = []; - - connectionSelects.each(function(){ - let select = $(this); - let value = parseInt(select.editable('getValue', true) )|| 0; - - if( - connectionIds.indexOf(value) > -1 && - duplicateConnectionIds.indexOf(value) === -1 - ){ - // duplicate found - duplicateConnectionIds.push(value); - } - - if(groupedSelects[value] !== undefined){ - groupedSelects[value].push(select[0]); - }else{ - groupedSelects[value] = [select[0]]; - } - - connectionIds.push(value); - }); - - // update "conflict" icon next to select label for connectionIds - connectionSelects.each(function(){ - let select = $(this); - let value = parseInt(select.editable('getValue', true) )|| 0; - let conflictIcon = select.find('.fa-exclamation-triangle'); - if( - duplicateConnectionIds.indexOf(value) > -1 && - groupedSelects[value].indexOf(select[0]) > -1 - ){ - conflictIcon.removeClass('hide'); - }else{ - conflictIcon.addClass('hide'); - } - }); - }, 200); - }; - - /** - * get group label by groupId - * @param groupId - * @returns {string} - */ - let getGroupLabelById = (groupId) => { - let options = config.signatureGroupsLabels.filter(option => option.value === groupId); - return options.length ? options[0].text : ''; - }; - - /** - * helper function - get cell by columnSelector from same row as cell - * @param tableApi - * @param cell - * @param columnSelector - * @returns {*} - */ - let getNeighboringCell = (tableApi, cell, columnSelector) => { - return tableApi.cell(tableApi.cell(cell).index().row, columnSelector); - }; - - /** - * get next cell by columnSelector - * @param tableApi - * @param cell - * @param columnSelectors - * @returns {*} - */ - let searchNextCell = (tableApi, cell, columnSelectors) => { - if(columnSelectors.length){ - // copy selectors -> .shift() modifies the orig array, important! - columnSelectors = columnSelectors.slice(0); - let nextCell = getNeighboringCell(tableApi, cell, columnSelectors.shift()); - let nextCellElement = nextCell.nodes().to$(); - if( nextCellElement.data('editable') ){ - // cell is xEditable field -> skip "disabled" OR check value - let nextCellValue = nextCellElement.editable('getValue', true); - if( - [0, null].includes(nextCellValue) && - !nextCellElement.data('editable').options.disabled - ){ - // xEditable value is empty - return nextCell; - }else{ - // search next cell - return searchNextCell(tableApi, cell, columnSelectors); - } - }else if( nextCell.index().column === tableApi.column(-1).index() ){ - // NO xEditable cell BUT last column (=> action cell) -> OK - return nextCell; - }else{ - console.error('No cell found for activation!'); - } - }else{ - // return origin cell - return tableApi.cell(cell); - } - }; - - /** - * make cell active -> focus() + show xEditable - * @param cell - */ - let activateCell = (cell) => { - let cellElement = cell.nodes().to$(); - // check if cell is visible and not e.g. immediately filtered out by a search filter - // -> https://github.com/exodus4d/pathfinder/issues/865 - if(cellElement.is(':visible')){ - // NO xEditable - cellElement.focus(); - - if( cellElement.data('editable') ){ - // cell is xEditable field -> show xEditable form - cellElement.editable('show'); - } - } - }; - - /** - * search neighboring cell (same row) and set "active" -> show editable - * @param tableApi - * @param cell - * @param columnSelectors - */ - let activateNextCell = (tableApi, cell, columnSelectors) => { - let nextCell = searchNextCell(tableApi, cell, columnSelectors); - activateCell(nextCell); - }; - - /** - * helper function - set 'save' observer for xEditable cell - * -> show "neighboring" xEditable field - * @param tableApi - * @param cell - * @param columnSelectorsAjax - used for Ajax save (edit signature) - * @param columnSelectorsDry - used for dry save (new signature) - */ - let editableOnSave = (tableApi, cell, columnSelectorsAjax = [], columnSelectorsDry = []) => { - $(cell).on('save', function(e, params){ - if(params.response){ - // send by Ajax - activateNextCell(tableApi, cell, columnSelectorsAjax); - }else{ - // dry save - no request - activateNextCell(tableApi, cell, columnSelectorsDry); - } - }); - }; - - /** - * helper function - set 'hidden' observer for xEditable cell - * -> set focus() on xEditable field - * @param tableApi - * @param cell - */ - let editableOnHidden = (tableApi, cell) => { - $(cell).on('hidden', function(e, reason){ - // re-focus element on close (keyboard navigation) - // 'save' event handles default focus (e.g. open new xEditable) - // 'hide' handles all the rest (experimental) - if(reason !== 'save'){ - this.focus(); - } - }); - }; - - /** - * helper function - set 'shown' observer for xEditable type cell - * -> enable Select2 for xEditable form - * @param cell - */ - let editableGroupOnShown = cell => { - $(cell).on('shown', function(e, editable){ - let inputField = editable.input.$input; - inputField.addClass('pf-select2').initSignatureGroupSelect(); - }); - }; - - /** - * helper function - set 'save' observer for xEditable group cell - * -> update scanned signature bar - * @param tableApi - * @param cell - */ - let editableGroupOnSave = (tableApi, cell) => { - $(cell).on('save', function(e, params){ - if(params.response){ - // send by Ajax - updateScannedSignaturesBar(tableApi, {showNotice: true}); - } - }); - }; - - /** - * helper function - set 'init' observer for xEditable type cell - * -> disable xEditable field if no options available - * @param cell - */ - let editableTypeOnInit = cell => { - $(cell).on('init', function(e, editable){ - if(!editable.options.source().length){ - editableDisable($(this)); - } - }); - }; - - /** - * helper function - set 'shown' observer for xEditable type cell - * -> enable Select2 for xEditable form - * @param cell - */ - let editableTypeOnShown = cell => { - $(cell).on('shown', function(e, editable){ - // destroy possible open popovers (e.g. wormhole types) - $(this).destroyPopover(true); - - let inputField = editable.input.$input; - let hasOptGroups = inputField.has('optgroup').length > 0; - inputField.addClass('pf-select2').initSignatureTypeSelect({}, hasOptGroups); - }); - }; - - /** - * helper function - set 'shown' observer for xEditable description cell - * -> change height for "new signature" table wrapper - * @param cell - */ - let editableDescriptionOnShown = cell => { - $(cell).on('shown', function(e, editable){ - $(this).parents('.' + config.tableToolsActionClass).css('height', '+=35px'); - }); - }; - - /** - * helper function - set 'hidden' observer for xEditable description cell - * -> change height for "new signature" table wrapper - * @param cell - */ - let editableDescriptionOnHidden = cell => { - $(cell).on('hidden', function(e, editable){ - $(this).parents('.' + config.tableToolsActionClass).css('height', '-=35px'); - }); - }; - - /** - * helper function - set 'init' observer for xEditable connection cell - * -> set focus() on xEditable field - * @param cell - */ - let editableConnectionOnInit = cell => { - $(cell).on('init', function(e, editable){ - if(editable.value > 0){ - // empty connection selects ON INIT don´t make a difference for conflicts - checkConnectionConflicts(); - } - }); - }; - - /** - * helper function - set 'shown' observer for xEditable connection cell - * -> enable Select2 for xEditable form - * @param tableApi - * @param cell - */ - let editableConnectionOnShown = (tableApi, cell) => { - $(cell).on('shown', function(e, editable){ - let inputField = editable.input.$input; - - if(!$(tableApi.table().node()).hasClass(config.sigTablePrimaryClass)){ - // we need the primary table API to get selected connections - let metaData = getTableMetaData(tableApi); - tableApi = getDataTableInstance(metaData.mapId, metaData.systemId, 'primary'); - } - - // Select2 init would work without passing select options as "data", Select2 would grap data from DOM - // -> We want to pass "meta" data for each option into Select2 for formatting - let selectOptions = Util.convertXEditableOptionsToSelect2(editable); - - // for better UX, systems that are already linked to a wh signatures should be "disabled" - // -> and grouped into a new - let linkedConnectionIds = tableApi.column('connection:name').data().toArray(); - linkedConnectionIds = linkedConnectionIds.filter(id => id > 0); - - if(linkedConnectionIds.length){ - let groupedSelectOptions = []; - let newSelectOptionGroupDisabled = []; - for(let selectOptionGroup of selectOptions){ - if(Array.isArray(selectOptionGroup.children)){ - let newSelectOptionGroup = []; - for(let option of selectOptionGroup.children){ - if(!option.selected && linkedConnectionIds.includes(option.id)){ - // connection already linked -> move to "disabled" group - option.disabled = true; - newSelectOptionGroupDisabled.push(option); - }else{ - // connection is available for link - newSelectOptionGroup.push(option); - } - } - - if(newSelectOptionGroup.length){ - groupedSelectOptions.push({ - text: selectOptionGroup.text, - children: newSelectOptionGroup - }); - } - }else{ - // option has no children -> is prepend (id = 0) option - groupedSelectOptions.push(selectOptionGroup); - } - } - - if(newSelectOptionGroupDisabled.length){ - groupedSelectOptions.push({ - text: 'linked', - children: newSelectOptionGroupDisabled - }); - } - - selectOptions = groupedSelectOptions; - } - - let options = { - data: selectOptions - }; - - inputField.addClass('pf-select2').initSignatureConnectionSelect(options); - }); - }; - - /** - * helper function - set 'save' observer for xEditable connection cell - * -> check connection conflicts - * @param cell - */ - let editableConnectionOnSave = cell => { - $(cell).on('save', function(e, params){ - checkConnectionConflicts(); - }); - }; - - /** - * enable xEditable element - * @param element - */ - let editableEnable = element => { - element.editable('enable'); - // (re)-enable focus on element by tabbing, xEditable removes "tabindex" on 'disable' - element.attr('tabindex', 0); - }; - - /** - * disable xEditable element - * @param element - */ - let editableDisable = element => { - element.editable('disable'); - // xEditable sets 'tabindex = -1' - }; - - /** - * en/disables xEditable element (select) - * -> disables if there are no source options found - * @param element - */ - let editableSelectCheck = element => { - if(element.data('editable')){ - let options = element.data('editable').options.source(); - if(options.length > 0){ - editableEnable(element); - }else{ - editableDisable(element); - } - } - }; - - /** - * get HTML for "delete connection" confirmation popover - * @returns {string} - */ - let getConfirmationContent = () => { - let checkOptions = [{ - name: 'deleteConnection', - value: '1', - label: 'delete connection', - class: 'pf-editable-warn', - checked: true - }]; - - let getChecklist = checkOptions => { - let html = '
      '; - html += '
      '; - html += '
      '; - html += '
      '; - - for(let option of checkOptions){ - html += '
      '; - } - - html += '
      '; - html += '
      '; - html += '
      '; - html += '
      '; - - return html; - }; - - let html = ''; - html += getChecklist(checkOptions); - - return html; - }; - - /** - * get dataTables default options for signature tables - * @param mapId - * @param systemData - * @returns {{}} - */ - let getSignatureDataTableDefaults = (mapId, systemData) => { - - /** - * add map/system specific data for each editable field in the sig-table - * @param params - * @returns {*} - */ - let modifyFieldParamsOnSend = params => { - params.systemId = systemData.id; - return params; - }; - - let dataTableDefaults = { - pfMeta: { - 'mapId': mapId, - 'systemId': systemData.id - }, - order: [1, 'asc'], - rowId: rowData => config.sigTableRowIdPrefix + rowData.id, - language: { - emptyTable: 'No signatures added', - info: 'Showing _START_ to _END_ of _TOTAL_ signatures', - infoEmpty: 'Showing 0 to 0 of 0 signatures', - infoFiltered: '( from _MAX_ total)', - lengthMenu: 'Show _MENU_', - zeroRecords: 'No signatures recorded' - }, - columnDefs: [ - { - targets: 0, - name: 'status', - orderable: true, - searchable: false, - title: '', - width: 2, - class: ['text-center'].join(' '), - data: 'updated', - type: 'html', - render: { - _: (cellData, type, rowData, meta) => { - let value = ''; - if(cellData && cellData.character){ - value = Util.getStatusInfoForCharacter(cellData.character, 'class'); - } - - if(type === 'display'){ - value = ''; - } - return value; - } - } - },{ - targets: 1, - name: 'id', - orderable: true, - searchable: true, - title: 'id', - type: 'string', - width: 12, - class: [config.tableCellFocusClass, config.sigTableEditSigNameInput, config.fontUppercaseClass].join(' '), - data: 'name', - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - let tableApi = this.api(); - - updateTooltip(cell, cellData); - - editableOnSave(tableApi, cell, [], ['group:name', 'type:name', 'action:name']); - editableOnHidden(tableApi, cell); - - $(cell).editable($.extend({ - mode: 'popup', - type: 'text', - title: 'signature id', - name: 'name', - pk: rowData.id || null, - emptytext: '? ? ?', - value: cellData, - inputclass: config.fontUppercaseClass, - display: function(value){ - // change display value to first 3 chars -> unicode beware - $(this).text([...$.trim(value)].slice(0, 3).join('').toLowerCase()); - }, - validate: function(value){ - let msg = false; - //let mbLength = [...$.trim(value)].length; // unicode beware - if(! value.trimChars().match(/^[a-zA-Z]{3}-\d{3}$/)){ - msg = 'ID format invalid. E.g.: ABC-123'; - } - - if(msg){ - return {newValue: value, msg: msg, field: this}; - } - }, - params: modifyFieldParamsOnSend, - success: function(response, newValue){ - tableApi.cell(cell).data(newValue); - - $(this).pulseBackgroundColor('changed'); - updateTooltip(cell, newValue); - - if(response){ - let newRowData = response[0]; - updateSignatureCell(tableApi, rowIndex, 'status:name', newRowData.updated); - updateSignatureCell(tableApi, rowIndex, 'updated:name', newRowData.updated.updated); - } - tableApi.draw(); - } - }, editableDefaults)); - } - },{ - targets: 2, - name: 'group', - orderable: true, - searchable: true, - title: 'group', - type: 'string', // required for sort/filter because initial data type is numeric - width: 40, - class: [config.tableCellFocusClass].join(' '), - data: 'groupId', - render: { - sort: getGroupLabelById, - filter: getGroupLabelById - }, - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - let tableApi = this.api(); - - editableOnSave(tableApi, cell, ['type:name'], ['type:name', 'action:name']); - editableOnHidden(tableApi, cell); - editableGroupOnShown(cell); - editableGroupOnSave(tableApi, cell); - - $(cell).editable($.extend({ - mode: 'popup', - type: 'select', - title: 'group', - name: 'groupId', - pk: rowData.id || null, - emptytext: 'unknown', - onblur: 'submit', - showbuttons: false, - value: cellData, - prepend: [{value: 0, text: ''}], - params: modifyFieldParamsOnSend, - source: config.signatureGroupsLabels, - display: function(value, sourceData){ - let selected = $.fn.editableutils.itemsByValue(value, sourceData); - if(selected.length && selected[0].value > 0){ - $(this).html(selected[0].text); - }else{ - $(this).empty(); - } - }, - validate: function(value){ - // convert string to int -> important for further processing - // -> on submit record (new signature) validate() is called and no error should be returned - // value should already be integer - if( !Number.isInteger(value) ){ - return {newValue: parseInt(value) || 0, msg: null}; - } - }, - success: function(response, newValue){ - tableApi.cell(cell).data(newValue); - - $(this).pulseBackgroundColor('changed'); - - if(response){ - let newRowData = response[0]; - updateSignatureCell(tableApi, rowIndex, 'status:name', newRowData.updated); - updateSignatureCell(tableApi, rowIndex, 'updated:name', newRowData.updated.updated); - } - tableApi.draw(); - - // find related "type" select (same row) and change options --------------------------- - let signatureTypeCell = getNeighboringCell(tableApi, cell, 'type:name'); - let signatureTypeField = signatureTypeCell.nodes().to$(); - editableSelectCheck(signatureTypeField); - - signatureTypeCell.data(0); - signatureTypeField.editable('setValue', 0); - - - // find "connection" select (same row) and change "enabled" flag ---------------------- - let signatureConnectionCell = getNeighboringCell(tableApi, cell, 'connection:name'); - let signatureConnectionField = signatureConnectionCell.nodes().to$(); - - if(newValue === 5){ - // wormhole - editableEnable(signatureConnectionField); - }else{ - checkConnectionConflicts(); - editableDisable(signatureConnectionField); - } - signatureConnectionCell.data(0); - signatureConnectionField.editable('setValue', 0); - } - }, editableDefaults)); - } - },{ - targets: 3, - name: 'type', - orderable: false, - searchable: false, - title: 'type', - type: 'string', // required for sort/filter because initial data type is numeric - width: 180, - class: [config.tableCellFocusClass, config.tableCellTypeClass].join(' '), - data: 'typeId', - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - let tableApi = this.api(); - - editableOnSave(tableApi, cell, ['connection:name'], ['action:name']); - editableOnHidden(tableApi, cell); - editableTypeOnInit(cell); - editableTypeOnShown(cell); - - $(cell).editable($.extend({ - mode: 'popup', - type: 'select', - title: 'type', - name: 'typeId', - pk: rowData.id || null, - emptytext: 'unknown', - onblur: 'submit', - showbuttons: false, - disabled: rowData.groupId <= 0, // initial disabled if groupId not set - value: cellData, - prepend: [{value: 0, text: ''}], - params: modifyFieldParamsOnSend, - source: function(){ - // get current row data (important!) - // -> "rowData" param is not current state, values are "on createCell()" state - let rowData = tableApi.row($(cell).parents('tr')).data(); - - let typeOptions = getSignatureTypeOptions( - systemData.type.id, - Util.getAreaIdBySecurity(systemData.security), - rowData.groupId, - systemData - ); - return typeOptions; - }, - display: function(value, sourceData){ - let selected = $.fn.editableutils.itemsByValue(value, sourceData); - if(selected.length && selected[0].value > 0){ - $(this).html(FormElement.formatSignatureTypeSelectionData({text: selected[0].text}, undefined, {showWhSizeLabel: true})); - }else{ - $(this).empty(); - } - }, - validate: function(value){ - // convert string to int -> important for further processing - // -> on submit record (new signature) validate() is called and no error should be returned - // value should already be integer - if( !Number.isInteger(value) ){ - return {newValue: parseInt(value) || 0, msg: null}; - } - }, - success: function(response, newValue){ - tableApi.cell(cell).data(newValue); - - $(this).pulseBackgroundColor('changed'); - - if(response){ - let newRowData = response[0]; - updateSignatureCell(tableApi, rowIndex, 'status:name', newRowData.updated); - updateSignatureCell(tableApi, rowIndex, 'updated:name', newRowData.updated.updated); - } - tableApi.draw(); - } - }, editableDefaults)); - } - },{ - targets: 4, - name: 'description', - orderable: false, - searchable: true, - title: 'description', - class: [config.tableCellFocusClass, config.tableCellActionClass].join(' '), - type: 'html', - data: 'description', - defaultContent: '', - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - let tableApi = this.api(); - - editableOnSave(tableApi, cell, [], ['action:name']); - editableOnHidden(tableApi, cell); - editableDescriptionOnShown(cell); - editableDescriptionOnHidden(cell); - - $(cell).editable($.extend({ - mode: 'inline', - type: 'textarea', - title: 'description', - name: 'description', - pk: rowData.id || null, - emptytext: '', - onblur: 'submit', - showbuttons: false, - inputclass: config.editableDescriptionInputClass, - emptyclass: config.moduleHeadlineIconClass, - params: modifyFieldParamsOnSend, - success: function(response, newValue){ - tableApi.cell(cell).data(newValue); - - $(this).pulseBackgroundColor('changed'); - - if(response){ - let newRowData = response[0]; - updateSignatureCell(tableApi, rowIndex, 'status:name', newRowData.updated); - updateSignatureCell(tableApi, rowIndex, 'updated:name', newRowData.updated.updated); - } - tableApi.draw(); - } - }, editableDefaults)); - } - },{ - targets: 5, - name: 'connection', - orderable: false, - searchable: false, - title: 'leads to', - type: 'string', // required for sort/filter because initial data type is numeric - className: [config.tableCellFocusClass, config.tableCellConnectionClass].join(' '), - width: 80, - data: 'connection.id', - defaultContent: 0, - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - let tableApi = this.api(); - - editableOnSave(tableApi, cell, [], ['action:name']); - editableOnHidden(tableApi, cell); - editableConnectionOnInit(cell); - editableConnectionOnShown(tableApi, cell); - editableConnectionOnSave(cell); - - $(cell).editable($.extend({ - mode: 'popup', - type: 'select', - title: 'system', - name: 'connectionId', - pk: rowData.id || null, - emptytext: 'unknown', - onblur: 'submit', - showbuttons: false, - disabled: rowData.groupId !== 5, // initial disabled if NON wh - value: cellData, - prepend: [{value: 0, text: ''}], - params: modifyFieldParamsOnSend, - source: function(){ - let activeMap = Util.getMapModule().getActiveMap(); - let mapId = activeMap.data('id'); - let connectionOptions = getSignatureConnectionOptions(mapId, systemData); - return connectionOptions; - }, - display: function(value, sourceData){ - let selected = $.fn.editableutils.itemsByValue(value, sourceData); - if(selected.length && selected[0].value > 0){ - let errorIcon = ' '; - $(this).html(FormElement.formatSignatureConnectionSelectionData({ - text: selected[0].text, - metaData: selected[0].metaData - })).prepend(errorIcon); - }else{ - $(this).empty(); - } - }, - validate: function(value, b, c){ - // convert string to int -> important for further processing - // -> on submit record (new signature) validate() is called and no error should be returned - // value should already be integer - if( !Number.isInteger(value) ){ - return {newValue: parseInt(value) || 0, msg: null}; - } - }, - success: function(response, newValue){ - tableApi.cell(cell).data(newValue); - - $(this).pulseBackgroundColor('changed'); - - if(response){ - let newRowData = response[0]; - updateSignatureCell(tableApi, rowIndex, 'status:name', newRowData.updated); - updateSignatureCell(tableApi, rowIndex, 'updated:name', newRowData.updated.updated); - } - tableApi.draw(); - } - }, editableDefaults)); - } - },{ - targets: 6, - name: 'created', - title: 'created', - searchable: false, - width: 80, - className: ['text-right', config.tableCellCounterClass, 'min-screen-d'].join(' '), - data: 'created.created', - defaultContent: '' - },{ - targets: 7, - name: 'updated', - title: 'updated', - searchable: false, - width: 80, - className: ['text-right', config.tableCellCounterClass, 'min-screen-d'].join(' '), - data: 'updated.updated', - defaultContent: '' - },{ - targets: 8, - name: 'info', - title: '', - orderable: false, - searchable: false, - width: 10, - class: ['text-center', Util.config.helpClass , Util.config.popoverTriggerClass].join(' '), - data: 'created.created', - defaultContent: '', - render: { - display: (cellData, type, rowData, meta) => { - if(cellData){ - return ''; - } - } - } - },{ - targets: 9, - name: 'action', - title: '', - orderable: false, - searchable: false, - width: 10, - class: ['text-center', config.tableCellFocusClass, config.tableCellActionClass].join(' '), - data: null, - render: { - display: (cellData, type, rowData, meta) => { - let val = ''; - if(rowData.id){ - val = ''; - } - return val; - } - }, - createdCell: function(cell, cellData, rowData, rowIndex, colIndex){ - let tableApi = this.api(); - - if(rowData.id){ - // delete signature ----------------------------------------------------------------------- - let confirmationSettings = { - title: 'Delete signature', - template: Util.getConfirmationTemplate(getConfirmationContent(), { - size: 'small', - noTitle: true - }), - onConfirm: function(e, target){ - // top scroll to top - e.preventDefault(); - - // get form data (check if form tag is not hidden!) from confirmation popover - let tip = target.data('bs.confirmation').tip(); - let form = tip.find('form:not(.hidden)').first(); - let formData = form.getFormValues(); - let deleteOptions = Util.getObjVal(formData, 'deleteConnection') ? formData : {}; - - // add "processing" state or connection that will be deleted as well - if(deleteOptions.deleteConnection){ - let connectionId = tableApi.cell(rowIndex, 'connection:name').data(); - if(connectionId){ - let metaData = getTableMetaData(tableApi); - let connection = $().getConnectionById(metaData.mapId, connectionId); - if(connection){ - connection.addType('state_process'); - } - } - } - - let deleteRowElement = $(target).parents('tr'); - let row = tableApi.rows(deleteRowElement); - deleteSignatures(tableApi, row, deleteOptions); - }, - onShow: function(e, target){ - // hide "deleteConnection" checkbox if no connectionId linked - let tip = target.data('bs.confirmation').tip(); - let form = tip.find('form').first(); - let connectionId = tableApi.cell(rowIndex, 'connection:name').data(); - form.toggleClass('hidden', !connectionId); - } - }; - - $(cell).confirmation(confirmationSettings); - }else{ - // add new signature ---------------------------------------------------------------------- - $(cell).on('click', {tableApi: tableApi, rowIndex: rowIndex}, function(e){ - e.stopPropagation(); - e.preventDefault(); - - let secondaryTableApi = e.data.tableApi; - let metaData = getTableMetaData(secondaryTableApi); - let primaryTableApi = getDataTableInstance(metaData.mapId, metaData.systemId, 'primary'); - - let formFields = secondaryTableApi.row(e.data.rowIndex).nodes().to$().find('.editable'); - - // the "hide" makes sure to take care about open editable fields (e.g. description) - // otherwise, changes would not be submitted in this field (not necessary) - formFields.editable('hide'); - - let processLockPromise = null; - let processRequestPromise = null; - - // submit all xEditable fields - formFields.editable('submit', { - url: Init.path.api + '/signature', - ajaxOptions: { - processData: false, // we need to "process" data in beforeSend() - type: 'PUT', - dataType: 'json', //assuming json response - contentType: 'application/json', - beforeSend: function(xhr, settings){ - settings.data = JSON.stringify(settings.data); - - processLockPromise = primaryTableApi.newProcess('lock'); - processRequestPromise = primaryTableApi.newProcess('request'); - - }, - context: { - primaryTableApi: primaryTableApi, - secondaryTableApi: secondaryTableApi, - } - }, - data: { - systemId: metaData.systemId - }, - error: editableDefaults.error, // user default xEditable error function - success: function(response, editableConfig){ - let context = editableConfig.ajaxOptions.context; - let primaryTableApi = context.primaryTableApi; - let secondaryTableApi = context.secondaryTableApi; - - let signatureData = response[0]; - let row = addSignatureRow(primaryTableApi, signatureData); - if(row){ - primaryTableApi.draw(); - // highlight - row.nodes().to$().pulseBackgroundColor('added'); - - // prepare "add signature" table for new entry -> reset ------------------- - secondaryTableApi.clear().row.add($.extend(true, {}, emptySignatureData)).draw(); - - Util.showNotify({ - title: 'Signature added', - text: 'Name: ' + signatureData.name, - type: 'success' - }); - - // update signature bar - updateScannedSignaturesBar(primaryTableApi, {showNotice: true}); - } - - primaryTableApi.endProcess(processLockPromise); - primaryTableApi.endProcess(processRequestPromise); - } - }); - }); - } - } - } - ], - createdRow: function(row, data, dataIndex){ - // enable tabbing for interactive cells - let focusCells = $(row).find('.' + config.tableCellFocusClass + ':not(.editable-disabled)').attr('tabindex', 0); - // enable "return" key -> click() - focusCells.on('keydown', function(e){ - e.stopPropagation(); - if(e.which === 13){ - $(this).trigger('click'); - } - }); - }, - rowCallback: function(){ - let tableApi = this.api(); - let time = Math.floor((new Date()).getTime()); - - tableApi.cells(null, ['updated:name']).every(function(rowIndex, colIndex, tableLoopCount, cellLoopCount){ - let cell = this; - let node = cell.node(); - let cellData = cell.data(); - let diff = time - cellData * 1000; - - // highlight cell: age > 1 day - $(node).toggleClass('txt-color txt-color-warning', diff > 86400000); - }); - } - }; - - return dataTableDefaults; - }; - - /** - * key (arrow) navigation inside a table -> set cell focus() - * @param tableApi - * @param e - */ - let keyNavigation = (tableApi, e) => { - let offset = [0, 0]; - if(e.keyCode === 37){ - offset = [-1, 0]; - }else if(e.keyCode === 38){ - offset = [0, -1]; - }else if(e.keyCode === 39){ - offset = [1, 0]; - }else if(e.keyCode === 40){ - offset = [0, 1]; - } - - if(offset !== [0, 0]){ - /** - * check if cellIndex is out of table range - * @param tableApi - * @param cellIndex - * @returns {*} - */ - let checkIndex = (tableApi, cellIndex) => { - if(cellIndex[0] < 0){ - cellIndex[0] = tableApi.column(':last').nodes().to$().index(); // last column - } - if(cellIndex[0] > tableApi.column(':last').nodes().to$().index()){ - cellIndex[0] = 0; // first column - } - if(cellIndex[1] < 0){ - cellIndex[1] = tableApi.row(':last', {search: 'applied'}).nodes().to$().index(); // last row - } - if(cellIndex[1] > tableApi.row(':last', {search: 'applied'}).nodes().to$().index()){ - cellIndex[1] = 0; // first row - } - return cellIndex; - }; - - /** - * recursive search next cell - * @param tableApi - * @param cellOrigin - * @param offset - * @returns {*} - */ - let searchCell = (tableApi, cellOrigin, offset) => { - // we need to get the current cell indexes from DOM (not internal DataTables indexes) - let nodeOrig = cellOrigin.nodes(); - let colIndex = nodeOrig.to$().index(); - let rowIndex = nodeOrig.to$().closest('tr').index(); - let currentCellIndex = [colIndex, rowIndex]; - let newCellIndex = currentCellIndex.map((index, i) => index + offset[i]); - // check if cell index is inside table dimensions - newCellIndex = checkIndex(tableApi, newCellIndex); - - let cell = tableApi.cell(':eq(' + newCellIndex[1] + ')', ':eq(' + newCellIndex[0] + ')', {search: 'applied'}); - let node = cell.node(); - - if( - !node.hasAttribute('tabindex') || - parseInt(node.getAttribute('tabindex')) < 0 - ){ - // cell can not be focused -> search next - cell = searchCell(tableApi, cell, offset); - } - return cell; - }; - - let cell = searchCell(tableApi, tableApi.cell(e.target), offset); - cell.node().focus(); - } - }; - - /** - * draw signature 'info' (preview) table in 'signatureReader' dialog - * @param dialogElement - * @param mapId - * @param systemData - * @returns {jQuery} - */ - let drawSignatureTableInfo = (dialogElement, mapId, systemData) => { - let infoElement = $(dialogElement).find('#' + config.sigInfoId); - - let table = $('', { - id: getTableId('info', mapId, systemData.id), - class: ['display', 'compact', 'nowrap', config.sigTableClass, config.sigTableInfoClass].join(' ') - }); - - infoElement.append(table); - - let dataTableOptions = { - tabIndex: -1, - dom: '<"row"<"col-xs-3"l><"col-xs-5 ' + config.tableToolbarStatusClass + '"><"col-xs-4"f>>' + - '<"row"<"col-xs-12"tr>>' + - '<"row"<"col-xs-5"i><"col-xs-7"p>>', - initComplete: function(settings, json){ - let tableApi = this.api(); - - initCharacterInfoTooltip(this, tableApi); - - tableApi.columns(['action:name']).visible(false); - - Counter.initTableCounter(this, ['created:name', 'updated:name']); - } - }; - - $.extend(true, dataTableOptions, getSignatureDataTableDefaults(mapId, systemData)); - - let tableApi = table.DataTable(dataTableOptions); - - tableApi.on('draw.dt', function(e, settings){ - // xEditable cells should not be editable in this table - $(dialogElement).find('.' + config.sigTableInfoClass).find('td.editable').editable('disable'); - }); - - return tableApi; - }; - - /** - * draw signature table toolbar (add signature button, scan progress bar - * @param moduleElement - * @param mapId - * @param systemData - */ - let drawSignatureTableNew = (moduleElement, mapId, systemData) => { - let secondaryTableContainer = $('
      ', { - class: config.tableToolsActionClass - }); - - // create "empty table for new signature - let table = $('
      ', { - id: getTableId('secondary', mapId, systemData.id), - class: ['stripe', 'row-border', 'compact', 'nowrap', config.sigTableClass, config.sigTableSecondaryClass].join(' ') - }); - - secondaryTableContainer.append(table); - - moduleElement.find('.' + config.moduleHeadClass).after(secondaryTableContainer); - - let dataTableOptions = { - paging: false, - info: false, - searching: false, - tabIndex: -1, - data: [$.extend(true, {}, emptySignatureData)], - initComplete: function(settings, json){ - let tableApi = this.api(); - - $(this).on('keyup', 'td', {tableApi: tableApi}, function(e){ - keyNavigation(tableApi, e); - }); - } - }; - - $.extend(true, dataTableOptions, getSignatureDataTableDefaults(mapId, systemData)); - - let tableApi = table.DataTable(dataTableOptions); - - // "Responsive" dataTables plugin did not load automatic (because table is invisible onInit) - // -> manually start "Responsive" extension -> see default dataTable setting for config e.g. breakpoints - new $.fn.dataTable.Responsive(tableApi); - }; - - /** - * filter table "group" column - * @param tableApi - * @param newValue - * @param sourceOptions - */ - let searchGroupColumn = (tableApi, newValue, sourceOptions) => { - let column = tableApi.column('group:name'); - let pattern = ''; - - if(newValue.length <= sourceOptions.length){ - // all options selected + "prepend" option - let selected = $.fn.editableutils.itemsByValue(newValue, sourceOptions); - - pattern = selected.map(option => option.value !== 0 ? $.fn.dataTable.util.escapeRegex(option.text) : '^$').join('|'); - } - column.search(pattern, true, false).draw(); - }; - - /** - * init table filter button "group" column - * @param tableApi - */ - let initGroupFilterButton = tableApi => { - let promiseStore = MapUtil.getLocaleData('character', Util.getCurrentCharacterId()); - promiseStore.then(data => { - let filterButton = tableApi.button('tableTools', 'filterGroup:name').node(); - let prependOptions = [{value: 0, text: 'unknown'}]; - let sourceOptions = config.signatureGroupsLabels; - let selectedValues = []; - - if(data && data.filterSignatureGroups && data.filterSignatureGroups.length){ - // select local stored values - selectedValues = data.filterSignatureGroups; - }else{ - // no default group filter options -> show all - selectedValues = sourceOptions.map(option => option.value); - selectedValues.unshift(0); - } - - filterButton.editable({ - mode: 'popup', - container: 'body', - type: 'checklist', - showbuttons: false, - onblur: 'submit', - highlight: false, - title: 'filter groups', - value: selectedValues, - prepend: prependOptions, - source: sourceOptions, - inputclass: config.editableUnknownInputClass, - display: function(value, sourceData){ - // update filter button label - let html = 'filter'; - let allSelected = value.length >= sourceData.length; - if( !allSelected ){ - html += ' (' + value.length + ')'; - } - $(this).toggleClass('active', !allSelected).html(html); - }, - validate: function(value){ - // convert string to int -> important for further processing - return {newValue: value.map(num => parseInt(num)), msg: null}; - } - }); - - let allOptions = prependOptions.concat(sourceOptions); - - filterButton.on('save', {tableApi: tableApi, sourceOptions: allOptions}, function(e, params){ - // store values local -> IndexDB - MapUtil.storeLocaleCharacterData('filterSignatureGroups', params.newValue); - - searchGroupColumn(e.data.tableApi, params.newValue, e.data.sourceOptions); - }); - - // set initial search string -> even if table ist currently empty - searchGroupColumn(tableApi, selectedValues, allOptions); - }); - }; - - /** - * init table undo button - * @param tableApi - */ - let initUndoButton = tableApi => { - let undoButton = tableApi.button('tableTools', 'undo:name').node(); - let metaData = getTableMetaData(tableApi); - - let getIconByAction = action => { - switch(action){ - case 'add': return 'fa-plus txt-color-green'; - case 'delete': return 'fa-times txt-color-redDark'; - case 'edit': return 'fa-pen txt-color-orangeDark'; - case 'undo': return 'fa-undo txt-color-grayLight'; - case 'sync': return 'fa-exchange-alt txt-color-orangeDark'; - } - }; - - undoButton.on('shown', function(e, editable){ - // check if history options loaded -> else forward to error function - if(!editable.input.$input.length){ - editable.options.error.call(editable, ['No record found']); - }else{ - // disable first option - editable.input.$input.first().prop('disabled', true); - // preselect second option - //editable.input.$input.eq(1).prop('checked', true); - - // "fake" radio button behaviour - editable.input.$input.attr('name', 'test').attr('type', 'radio'); - - // preselect second option - editable.input.$input.eq(1).prop('checked', true); - - let labels = editable.container.$form.find('label'); - labels.addClass('radio'); - - for(let span of labels.find('span')){ - span.style.display = 'inline-block'; - span.style.width = '100%'; - let parts = span.innerText.trim().split('%%'); - parts[0] = '' + parts[0] + ''; - parts[1] = ''; - parts[2] = '' + parts[2] + ''; - parts[3] = '' + parts[3] + ''; - span.innerHTML = parts.join(''); - } - - labels.initTooltips(); - } - }); - - let processLockPromise = null; - - undoButton.editable({ - url: Init.path.api + '/signaturehistory', - ajaxOptions: { - processData: false, - type: 'PUT', - dataType: 'json', //assuming json response - contentType: 'application/json', - beforeSend: function(xhr, settings){ - processLockPromise = tableApi.newProcess('lock'); - }, - }, - params: function(params){ - return JSON.stringify({ - systemId: params.pk, - stamp: params.value[0] - }); - }, - mode: 'popup', - container: 'body', - type: 'checklist', - showbuttons: true, - highlight: false, - title: 'historical records', - name: 'history', - pk: metaData.systemId, - source: Init.path.api + '/signaturehistory/' + metaData.systemId, - sourceOptions: { - type: 'GET', - data: { - mapId: metaData.mapId - } - }, - sourceCache: false, // always get new source options on open - display: function(value){ - $(this).html('undo'); - }, - success: function(response, newValue){ - // update signature table - tableApi.endProcess(processLockPromise); - - updateSignatureTable(tableApi, response, true); - }, - error: function(errors){ - let errorAll = []; - if(errors && errors.responseText){ //ajax error, errors = xhr object - if(errors.responseJSON && errors.responseJSON.error){ - for(let error of errors.responseJSON.error){ - errorAll.push(error.message); - } - }else{ - //fallback -> other ajax error - errorAll.push(errors.responseText); - } - }else if(errors.length){ - // manual called error - errorAll = errors; - - let form = this.container.$form.addClass('has-error'); - form.find('.editable-buttons').hide(); - form.find('.editable-input').hide(); - form.find('.editable-error-block').html(errorAll.join('
      ')).show(); - } - - return errorAll.join(' | '); - }, - validate: function(value){ - if(!Array.isArray(value) || value.length !== 1){ - return {newValue: value, msg: 'No record selected', field: this}; - } - } - }); - }; - - /** - * init table selectAll button - * @param tableApi - */ - let initSelectAllButton = tableApi => { - let selectButton = tableApi.button('tableTools', 'selectAll:name').node(); - - selectButton.on('click', function(){ - let allRows = tableApi.rows(); - let selectedRows = getSelectedRows(tableApi); - let allRowElements = allRows.nodes().to$(); - - if(allRows.data().length === selectedRows.data().length){ - allRowElements.removeClass('selected'); - }else{ - allRowElements.addClass('selected'); - } - - // check delete button - checkDeleteSignaturesButton(tableApi); - }); - }; - - /** - * init table delete button - * @param tableApi - */ - let initDeleteButton = tableApi => { - let deleteButton = tableApi.button('tableTools', 'delete:name').node(); - - deleteButton.on('click', function(){ - let selectedRows = getSelectedRows(tableApi); - bootbox.confirm('Delete ' + selectedRows.data().length + ' signature?', function(result){ - if(result){ - deleteSignatures(tableApi, selectedRows); - } - }); - }); - }; - - /** - * init character info tooltips - * -> e.g. table cell 'question mark' icon - * @param element - * @param tableApi - */ - let initCharacterInfoTooltip = (element, tableApi) => { - element.hoverIntent({ - over: function(e){ - let cellElement = $(this); - let rowData = tableApi.row(cellElement.parents('tr')).data(); - cellElement.addCharacterInfoTooltip(rowData, { - trigger: 'manual', - placement: 'top', - show: true - }); - }, - out: function(e){ - $(this).destroyPopover(); - }, - selector: 'td.' + Util.config.helpClass - }); - }; - - /** - * draw empty signature table - * @param moduleElement - * @param mapId - * @param systemData - */ - let drawSignatureTable = (moduleElement, mapId, systemData) => { - let table = $('
      ', { - id: getTableId('primary', mapId, systemData.id), - class: ['display', 'compact', 'nowrap', config.sigTableClass, config.sigTablePrimaryClass].join(' ') - }); - - moduleElement.append(table); - - let dataTableOptions = { - tabIndex: -1, - dom: '<"row"<"col-xs-3"l><"col-xs-5"B><"col-xs-4"fS>>' + - '<"row"<"col-xs-12"tr>>' + - '<"row"<"col-xs-5"i><"col-xs-7"p>>', - buttons: { - name: 'tableTools', - buttons: [ - { - name: 'filterGroup', - tag: 'a', - className: config.moduleHeadlineIconClass, - text: '' // set by js (xEditable) - }, - { - name: 'undo', - tag: 'a', - className: config.moduleHeadlineIconClass, - text: '' // set by js (xEditable) - }, - { - name: 'selectAll', - tag: 'a', - className: config.moduleHeadlineIconClass, - text: 'select all' - }, - { - name: 'delete', - tag: 'a', - className: [config.moduleHeadlineIconClass, config.sigTableClearButtonClass].join(' '), - text: 'delete (0)' - } - ] - }, - initComplete: function(settings, json){ - let tableApi = this.api(); - - initCharacterInfoTooltip(this, tableApi); - initGroupFilterButton(tableApi); - initUndoButton(tableApi); - initSelectAllButton(tableApi); - initDeleteButton(tableApi); - - $(this).on('keyup', 'td', {tableApi: tableApi}, function(e){ - keyNavigation(tableApi, e); - }); - - - Counter.initTableCounter(this, ['created:name', 'updated:name']); - } - }; - - $.extend(true, dataTableOptions, getSignatureDataTableDefaults(mapId, systemData)); - - let tableApi = table.DataTable(dataTableOptions); - - // "Responsive" dataTables plugin did not load automatic (because table is invisible onInit) - // -> manually start "Responsive" extension -> see default dataTable setting for config e.g. breakpoints - new $.fn.dataTable.Responsive(tableApi); - - // lock table until module is fully rendered - moduleElement.data('lockPromise', tableApi.newProcess('lock')); - }; - - /** - * open xEditable input field in "new Signature" table - * @param moduleElement - */ - let focusNewSignatureEditableField = moduleElement => { - moduleElement.find('.' + config.sigTableSecondaryClass) - .find('td.' + config.sigTableEditSigNameInput).editable('show'); - }; - - /** - * get all selected rows of a table - * @param tableApi - * @returns {*} - */ - let getSelectedRows = tableApi => { - return tableApi.rows('.selected'); - }; - - /** - * check the "delete signature" button. show/hide the button if a signature is selected - * @param tableApi - */ - let checkDeleteSignaturesButton = tableApi => { - let selectedRows = getSelectedRows(tableApi); - let selectedRowCount = selectedRows.data().length; - let clearButton = tableApi.button('tableTools', 'delete:name').node(); - - if(selectedRowCount > 0){ - let allRows = tableApi.rows(); - let rowCount = allRows.data().length; - - let countText = selectedRowCount; - if(selectedRowCount >= rowCount){ - countText = 'all'; - } - clearButton.find('i+span').text(countText); - - // update clear signatures button text - clearButton.velocity('stop'); - - if( clearButton.is(':hidden') ){ - // show button - clearButton.velocity('transition.expandIn', { - duration: 100 - }); - }else{ - // highlight button - clearButton.velocity('callout.pulse', { - duration: 200 - }); - } - }else{ - // hide button - clearButton.velocity('transition.expandOut', { - duration: 100 - }); - } - }; - - /** - * set module observer and look for relevant signature data to update - * @param moduleElement - * @param mapId - * @param systemData - */ - let setModuleObserver = (moduleElement, mapId, systemData) => { - let primaryTable = moduleElement.find('.' + config.sigTablePrimaryClass); - let primaryTableApi = getDataTableInstance(mapId, systemData.id, 'primary'); - - // add signature toggle --------------------------------------------------------------------------------------- - let toggleAddSignature = (show = 'auto') => { - let button = moduleElement.find('.' + config.moduleHeadlineIconAddClass); - let toolsElement = moduleElement.find('.' + config.tableToolsActionClass); - button.toggleClass('active', show === 'auto' ? undefined : show); - - if(toolsElement.is(':visible') && (!show || show === 'auto')){ - // hide container - toolsElement.velocity('stop').velocity({ - opacity: [0, 1], - height: [0, '70px'] - },{ - duration: 150, - display: 'none' - }); - }else if(!toolsElement.is(':visible') && (show || show === 'auto')){ - // show container - toolsElement.velocity('stop').velocity({ - opacity: [1, 0], - height: ['70px', 0] - },{ - duration: 150, - display: 'block', - complete: function(){ - focusNewSignatureEditableField(moduleElement); - } - }); - }else if(toolsElement.is(':visible') && show){ - // still visible -> no animation - focusNewSignatureEditableField(moduleElement); - } - }; - - moduleElement.find('.' + config.moduleHeadlineIconAddClass).on('click', function(e){ - toggleAddSignature('auto'); - }); - - moduleElement.on('pf:showSystemSignatureModuleAddNew', function(e){ - toggleAddSignature(true); - }); - - // signature reader dialog ------------------------------------------------------------------------------------ - moduleElement.find('.' + config.moduleHeadlineIconReaderClass).on('click', function(e){ - moduleElement.showSignatureReaderDialog(systemData); - }); - - // "lazy update" toggle --------------------------------------------------------------------------------------- - moduleElement.find('.' + config.moduleHeadlineIconLazyClass).on('click', function(e){ - $(this).toggleClass('active'); - }); - - // set multi row select --------------------------------------------------------------------------------------- - primaryTable.on('mousedown', 'td', {tableApi: primaryTableApi}, function(e){ - if(e.ctrlKey){ - e.preventDefault(); - e.stopPropagation(); - // xEditable field should not open -> on 'click' - // -> therefore disable "pointer-events" on "td" for some ms -> 'click' event is not triggered - $(this).css('pointer-events', 'none'); - $(e.target).closest('tr').toggleClass('selected'); - - // check delete button - checkDeleteSignaturesButton(e.data.tableApi); - - setTimeout(() => { - $(this).css('pointer-events', 'auto'); - }, 250); - } - }); - - // draw event for signature table ----------------------------------------------------------------------------- - primaryTableApi.on('draw.dt', function(e, settings){ - // check delete button - let tableApi = $(this).dataTable().api(); - checkDeleteSignaturesButton(tableApi); - }); - - // event listener for global "paste" signatures into the page ------------------------------------------------- - moduleElement.on('pf:updateSystemSignatureModuleByClipboard', {tableApi: primaryTableApi}, function(e, clipboard){ - let signatureOptions = { - deleteOld: getLazyUpdateToggleStatus(moduleElement), - deleteConnection: 0 - }; - - // "disable" lazy update icon -> prevents accidental removal for next paste #724 - getLazyUpdateToggleElement(moduleElement).toggleClass('active', false); - - updateSignatureTableByClipboard(e.data.tableApi, systemData, clipboard, signatureOptions); - }); - - // signature column - "type" popover -------------------------------------------------------------------------- - MapUtil.initWormholeInfoTooltip( - moduleElement.find('.' + config.sigTableClass), - '.editable-click:not(.editable-open) span[class^="pf-system-sec-"]' - ); - }; - - /** - * get "lazy delete" toggle element - * @param moduleElement - * @returns {*} - */ - let getLazyUpdateToggleElement = moduleElement => moduleElement.find('.' + config.moduleHeadlineIconLazyClass); - - /** - * get status for "lazy delete" toggle - * @param moduleElement - * @returns {number} - */ - let getLazyUpdateToggleStatus = moduleElement => getLazyUpdateToggleElement(moduleElement).hasClass('active') ? 1 : 0; - - /** - * update 'counter' UI elements in 'signature reader' dialog - * @param data - */ - let updateSignatureReaderCounters = data => { - let counterElement = $('#' + config.sigInfoCountSigNewId).text(data.added || 0); - counterElement.toggleClass(counterElement.attr('data-class'), Boolean(data.added)); - - counterElement = $('#' + config.sigInfoCountSigChangeId).text(data.changed || 0); - counterElement.toggleClass(counterElement.attr('data-class'), Boolean(data.changed)); - - counterElement = $('#' + config.sigInfoCountSigDeleteId).text(data.deleted || 0); - counterElement.toggleClass(counterElement.attr('data-class'), Boolean(data.deleted)); - - counterElement = $('#' + config.sigInfoCountConDeleteId).text(data.deleteCon || 0); - counterElement.toggleClass(counterElement.attr('data-class'), Boolean(data.deleteCon)); - }; - - /** - * add new row to signature table - * @param tableApi - * @param signatureData - * @returns {*} - */ - let addSignatureRow = (tableApi, signatureData) => { - let row = null; - if(tableApi){ - row = tableApi.row.add(signatureData); - } - return row; - }; - - /** - * @param action - * @param rowId - * @returns {Promise} - */ - let getPromiseForRow = (action, rowId) => { - return new Promise((resolve, reject) => { - resolve({action: action, rowId: rowId}); - }); - }; - - /** - * callback for a changed row - * @param rowIndex - * @param colIndex - * @param tableLoopCount - * @param cellLoopCount - * @param options CUSTOM parameter (not DataTables specific)! - */ - let rowUpdate = function(rowIndex, colIndex, tableLoopCount, cellLoopCount, options){ - let cell = this; - let node = cell.nodes().to$(); - if(node.data('editable')){ - // xEditable is active -> should always be active! - // set new value even if no change -> e.g. render selected Ids as text labels - let oldValue = node.editable('getValue', true); - - // ... some editable cells depend on each other (e.g. group->type, group->connection) - switch(node.data('editable').options.name){ - case 'typeId': - // ... disable if no type options found - editableSelectCheck(node); - break; - case 'connectionId': - // disables if no wormhole group set - let groupId = cell.cell(rowIndex, 'group:name').data(); - if(groupId === 5){ - // wormhole - editableEnable(node); - }else{ - editableDisable(node); - } - break; - } - - // values should be set AFTER en/disabling of a field - node.editable('setValue', cell.data()); - - if(oldValue !== cell.data()){ - // highlight cell on data change - node.pulseBackgroundColor('changed', Util.getObjVal(options, 'keepVisible') || false); - } - }else if(node.hasClass(config.tableCellCounterClass)){ - // "updated" timestamp always changed - node.pulseBackgroundColor('changed', Util.getObjVal(options, 'keepVisible') || false); - } - }; - - /** - * update 'info' (preview) signature table (inside 'signature reader' dialog) - * @param tableApi - * @param signaturesDataOrig - * @param deleteOutdatedSignatures - * @param deleteConnections - */ - let updateSignatureInfoTable = (tableApi, signaturesDataOrig, deleteOutdatedSignatures = false, deleteConnections = false) => { - // clone signature array because of further manipulation - let signaturesData = $.extend([], signaturesDataOrig); - - let rowIdsExist = []; - - let promisesAdded = []; - let promisesChanged = []; - let promisesDeleted = []; - - let allRows = tableApi.rows(); - - let rowUpdateCallback = function(){ - rowUpdate.apply(this, [...arguments, {keepVisible: true}]); - }; - - // update rows ------------------------------------------------------------------------------------------------ - allRows.every(function(rowIdx, tableLoop, rowLoop){ - let row = this; - let rowData = row.data(); - - for(let i = 0; i < signaturesData.length; i++){ - if(signaturesData[i].name === rowData.name){ - let rowId = row.id(true); - - // check if row was updated - if(signaturesData[i].updated.updated > rowData.updated.updated){ - // set new row data -> draw() is executed after all changes made - let newRowData = signaturesData[i]; - // keep "description" must not be replaced - newRowData.description = rowData.description; - // existing "groupId" must not be removed - if(!newRowData.groupId){ - newRowData.groupId = rowData.groupId; - newRowData.typeId = rowData.typeId; - }else if(newRowData.groupId === rowData.groupId){ - if(!newRowData.typeId){ - newRowData.typeId = rowData.typeId; - } - } - - // "created" timestamp will not change -> use existing - newRowData.created = rowData.created; - row.data(newRowData); - - // bind new signature dataTable data() -> to xEditable inputs - row.cells(row.id(true), ['id:name', 'group:name', 'type:name', 'description:name', 'connection:name', 'updated:name']) - .every(rowUpdateCallback); - - promisesChanged.push(getPromiseForRow('changed', rowId)); - } - - rowIdsExist.push(rowIdx); - - // remove signature data -> all left signatures will be added - signaturesData.splice(i, 1); - i--; - } - } - }); - - // delete rows ------------------------------------------------------------------------------------------------ - if(deleteOutdatedSignatures){ - let rows = tableApi.rows((rowIdx, rowData, node) => !rowIdsExist.includes(rowIdx)); - rows.every(function(rowIdx, tableLoop, rowLoop){ - let row = this; - let rowId = row.id(true); - let rowElement = row.nodes().to$(); - let rowData = row.data(); - - rowElement.pulseBackgroundColor('deleted', true); - - promisesChanged.push(getPromiseForRow('deleted', rowId)); - - // check if there is a connectionId. - if(deleteConnections && Util.getObjVal(rowData, 'connection.id')){ - promisesChanged.push(getPromiseForRow('deleteCon', rowId)); - } - }); - } - - // add rows --------------------------------------------------------------------------------------------------- - for(let signatureData of signaturesData){ - let row = addSignatureRow(tableApi, signatureData); - let rowElement = row.nodes().to$(); - rowElement.pulseBackgroundColor('added', true); - - promisesAdded.push(getPromiseForRow('added', row.index())); - } - - // done ------------------------------------------------------------------------------------------------------- - Promise.all(promisesAdded.concat(promisesChanged, promisesDeleted)).then(payloads => { - if(payloads.length){ - // table data changed -> draw() table changes - tableApi.draw(); - - // no notifications if table was empty just progressbar notification is needed - // sum payloads by "action" - let notificationCounter = payloads.reduce((acc, payload) => { - acc[payload.action]++; - return acc; - }, Object.assign({}, emptySignatureReaderCounterData)); - - updateSignatureReaderCounters(notificationCounter); - - updateScannedSignaturesBar(tableApi, {showNotice: false}); - } - }); - }; - - /** - * update signature table with new signatures - * -> add/update/delete rows - * @param tableApi - * @param signaturesDataOrig - * @param deleteOutdatedSignatures - */ - let updateSignatureTable = (tableApi, signaturesDataOrig, deleteOutdatedSignatures = false) => { - if(tableApi.hasProcesses('lock')){ - console.info('Signature table locked. Skip table update'); - return; - } - - // disable tableApi until update finished; - let processLockPromise = tableApi.newProcess('lock'); - - // clone signature array because of further manipulation - let signaturesData = $.extend([], signaturesDataOrig); - - let rowIdsExist = []; - - let promisesAdded = []; - let promisesChanged = []; - let promisesDeleted = []; - - let allRows = tableApi.rows(); - let updateEmptyTable = !allRows.any(); - - // update signatures ------------------------------------------------------------------------------------------ - allRows.every(function(rowIdx, tableLoop, rowLoop){ - let row = this; - let rowData = row.data(); - - for(let i = 0; i < signaturesData.length; i++){ - if(signaturesData[i].id === rowData.id){ - let rowId = row.id(true); - - // check if row was updated - if(signaturesData[i].updated.updated > rowData.updated.updated){ - // set new row data -> draw() is executed after all changes made - row.data(signaturesData[i]); - - // bind new signature dataTable data() -> to xEditable inputs - row.cells(row.id(true), ['id:name', 'group:name', 'type:name', 'description:name', 'connection:name', 'updated:name']) - .every(rowUpdate); - - promisesChanged.push(getPromiseForRow('changed', rowId)); - } - - rowIdsExist.push(rowId); - - // remove signature data -> all left signatures will be added - signaturesData.splice(i, 1); - i--; - } - } - }); - - // delete signatures ------------------------------------------------------------------------------------------ - if(deleteOutdatedSignatures){ - let rows = tableApi.rows((rowIdx, rowData, node) => !rowIdsExist.includes('#' + config.sigTableRowIdPrefix + rowData.id)); - rows.every(function(rowIdx, tableLoop, rowLoop){ - let row = this; - let rowId = row.id(true); - let rowElement = row.nodes().to$(); - - // hide open editable fields on the row before removing them - rowElement.find('.editable').editable('destroy'); - - // destroy possible open popovers (e.g. wormhole types, update popover) - rowElement.destroyPopover(true); - - rowElement.pulseBackgroundColor('deleted'); - - promisesDeleted.push(new Promise((resolve, reject) => { - toggleTableRow(rowElement).then(payload => resolve({action: 'deleted', rowIdx: rowId})); - })); - }).remove(); - } - - // add new signatures ----------------------------------------------------------------------------------------- - for(let signatureData of signaturesData){ - let row = addSignatureRow(tableApi, signatureData); - let rowId = row.id(true); - let rowElement = row.nodes().to$(); - rowElement.pulseBackgroundColor('added'); - - promisesAdded.push(getPromiseForRow('added', rowId)); - } - - // done ------------------------------------------------------------------------------------------------------- - Promise.all(promisesAdded.concat(promisesChanged, promisesDeleted)).then(payloads => { - if(payloads.length){ - // table data changed -> draw() table changes - tableApi.draw(); - - // check for "leads to" conflicts -> important if there are just "update" (no add/delete) changes - checkConnectionConflicts(); - - if(!updateEmptyTable){ - // no notifications if table was empty just progressbar notification is needed - // sum payloads by "action" - let notificationCounter = payloads.reduce((acc, payload) => { - if(!acc[payload.action]){ - acc[payload.action] = 0; - } - acc[payload.action]++; - return acc; - }, Object.assign({}, emptySignatureReaderCounterData)); - - let notification = ''; - if(notificationCounter.added > 0){ - notification += notificationCounter.added + ' added
      '; - } - if(notificationCounter.changed > 0){ - notification += notificationCounter.changed + ' updated
      '; - } - if(notificationCounter.deleted > 0){ - notification += notificationCounter.deleted + ' deleted
      '; - } - if(notification.length){ - Util.showNotify({title: 'Signatures updated', text: notification, type: 'success'}); - } - } - - updateScannedSignaturesBar(tableApi, {showNotice: true}); - - // at this point the 'primary' signature table update is done - // we need to check if there is an open 'signature reader' dialog, - // that needs to update its 'preview' signature table - // -> to use DataTables "drawCallback" option or "draw.dt" event is not the *best* option: - // Both are called to frequently (e.g. after filter/sort actions) - $('.' + config.sigReaderDialogClass + '.in').trigger('pf:updateSignatureReaderDialog'); - } - - // unlock table - tableApi.endProcess(processLockPromise); - }); - }; - - /** - * update signature "history" popover - * @param tableApi - * @param historyData - */ - let updateSignatureHistory = (tableApi, historyData) => { - let tableElement = tableApi.table().node(); - $(tableElement).data('history', historyData); - }; - - /** - * update trigger function for this module - * compare data and update module - * @param moduleElement - * @param systemData - */ - let updateModule = (moduleElement, systemData) => { - - if( - systemData.signatures && - systemData.sigHistory - ){ - let mapId = moduleElement.data('mapId'); - let systemId = moduleElement.data('systemId'); - let tableApi = getDataTableInstance(mapId, systemId, 'primary'); - updateSignatureTable(tableApi, systemData.signatures, true); - updateSignatureHistory(tableApi, systemData.sigHistory); - } - - moduleElement.hideLoadingAnimation(); - }; - - /** - * init callback - * @param moduleElement - * @param mapId - * @param systemData - */ - let initModule = (moduleElement, mapId, systemData) => { - let tableApi = getDataTableInstance(mapId, systemData.id, 'primary'); - tableApi.endProcess(moduleElement.data('lockPromise')); - }; - - /** - * get module toolbar element - * @returns {jQuery} - */ - let getHeadlineToolbar = () => { - let headlineToolbar = $('
      ', { - class: 'pull-right' - }).append( - $('', { - class: 'progress-label-right', - text: '0%' - }), - $('', { - class: ['fas', 'fa-fw', 'fa-plus', config.moduleHeadlineIconClass, config.moduleHeadlineIconAddClass].join(' '), - title: 'add' - }).attr('data-toggle', 'tooltip'), - $('', { - class: ['fas', 'fa-fw', 'fa-paste', config.moduleHeadlineIconClass, config.moduleHeadlineIconReaderClass].join(' '), - title: 'signature reader' - }).attr('data-toggle', 'tooltip'), - $('', { - class: ['fas', 'fa-fw', 'fa-exchange-alt', config.moduleHeadlineIconClass, config.moduleHeadlineIconLazyClass].join(' '), - title: 'lazy \'delete\' signatures' - }).attr('data-toggle', 'tooltip') - ); - - headlineToolbar.find('[data-toggle="tooltip"]').tooltip({ - container: 'body' - }); - - return headlineToolbar; - }; - - /** - * get module element - * @param parentElement - * @param mapId - * @param systemData - * @returns {jQuery} - */ - let getModule = (parentElement, mapId, systemData) => { - let moduleElement = $('
      ').append( - $('
      ', { - class: config.moduleHeadClass - }).append( - $('
      ', { - class: config.moduleHandlerClass - }), - $('
      ', { - text: 'Signatures' - }), - getHeadlineToolbar() - ) - ); - - // scanned signatures progress bar ---------------------------------------------------------------------------- - requirejs(['text!templates/form/progress.html', 'mustache'], (template, Mustache) => { - let data = { - label: true, - wrapperClass: config.moduleHeadlineProgressBarClass, - class: ['progress-bar-success'].join(' '), - percent: 0 - }; - moduleElement.find('.' + config.moduleHeadClass).append(Mustache.render(template, data)); - }); - - moduleElement.data('mapId', mapId); - moduleElement.data('systemId', systemData.id); - - moduleElement.showLoadingAnimation(); - - // draw "new signature" add table - drawSignatureTableNew(moduleElement, mapId, systemData); - - // draw signature table - drawSignatureTable(moduleElement, mapId, systemData); - - // set module observer - setModuleObserver(moduleElement, mapId, systemData); - - return moduleElement; - }; - - /** - * before module hide callback - * @param moduleElement - */ - let beforeHide = moduleElement => { - // disable update - let mapId = moduleElement.data('mapId'); - let systemId = moduleElement.data('systemId'); - let tableApi = getDataTableInstance(mapId, systemId, 'primary'); - tableApi.newProcess('lock'); - }; - - /** - * before module destroy callback - * @param moduleElement - */ - let beforeDestroy = moduleElement => { - // Destroying the data tables throws - // -> safety remove all dataTables - let mapId = moduleElement.data('mapId'); - let systemId = moduleElement.data('systemId'); - let primaryTableApi = getDataTableInstance(mapId, systemId, 'primary'); - let secondaryTableApi = getDataTableInstance(mapId, systemId, 'secondary'); - primaryTableApi.destroy(); - secondaryTableApi.destroy(); - }; - - return { - config: config, - getModule: getModule, - initModule: initModule, - updateModule: updateModule, - beforeHide: beforeHide, - beforeDestroy: beforeDestroy, - getSignatureTypeOptionsBySystem: getSignatureTypeOptionsBySystem - }; + return SystemSignatureModule; }); \ No newline at end of file diff --git a/js/app/util.js b/js/app/util.js index c7c7c0b6..b8b03300 100644 --- a/js/app/util.js +++ b/js/app/util.js @@ -6,11 +6,13 @@ define([ 'app/init', 'app/lib/prototypes', 'app/lib/console', + 'app/lib/cache', + 'app/lib/localStore', + 'app/lib/resize', 'conf/system_effect', 'conf/signature_type', - 'bootbox', - 'localForage', 'lazyload', + 'bootbox', 'velocity', 'velocityUI', 'customScrollbar', @@ -20,7 +22,19 @@ define([ 'bootstrapConfirmation', 'bootstrapToggle', 'select2' -], ($, Init, Proto, Con, SystemEffect, SignatureType, bootbox, localforage) => { +], ( + $, + Init, + Proto, + Con, + Cache, + LocalStoreManager, + ResizeManager, + SystemEffect, + SignatureType, + LazyLoad, + bootbox +) => { 'use strict'; @@ -63,8 +77,11 @@ define([ // map module mapModuleId: 'pf-map-module', // id for main map module - mapTabBarId: 'pf-map-tabs', // id for map tab bar - mapWrapperClass: 'pf-map-wrapper', // wrapper div (scrollable) + mapTabBarIdPrefix: 'pf-map-tab-bar-', // id prefix map tab bar lists
      ";return a+='",a+="",a+="",a+='",a+='",a+=""},r=0;t+="
      ").attr("colspan",this._colspan()).append(b))).addClass(this.c.className).addClass(g).addClass("dtrg-level-"+c)}});h.defaults={className:"dtrg-group",dataSrc:0,emptyDataGroup:"No group",enable:!0,endClassName:"dtrg-end",endRender:null,startClassName:"dtrg-start",startRender:function(b,a){return a}};h.version="1.1.1";a.fn.dataTable.RowGroup=h;a.fn.DataTable.RowGroup= + h;f.Api.register("rowGroup()",function(){return this});f.Api.register("rowGroup().disable()",function(){return this.iterator("table",function(a){a.rowGroup&&a.rowGroup.enable(!1)})});f.Api.register("rowGroup().enable()",function(a){return this.iterator("table",function(b){b.rowGroup&&b.rowGroup.enable(a===e?!0:a)})});f.Api.register("rowGroup().dataSrc()",function(a){return a===e?this.context[0].rowGroup.dataSrc():this.iterator("table",function(b){b.rowGroup&&b.rowGroup.dataSrc(a)})});a(c).on("preInit.dt.dtrg", + function(b,c,d){"dt"===b.namespace&&(b=c.oInit.rowGroup,d=f.defaults.rowGroup,b||d)&&(d=a.extend({},d,b),!1!==b&&new h(c,d))});return h}); diff --git a/js/lib/jquery.lazylinepainter-1.5.1.min.js b/js/lib/jquery.lazylinepainter-1.5.1.min.js deleted file mode 100644 index 01f35440..00000000 --- a/js/lib/jquery.lazylinepainter-1.5.1.min.js +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Lazy Line Painter - * SVG Stroke animation. - * - * https://github.com/camoconnell/lazy-line-painter - * http://www.camoconnell.com - * - * Licensed under the MIT license. - * - */ -(function(e){var g={init:function(a){return this.each(function(){var b=e(this),c=b.data("lazyLinePainter");b.addClass("lazy-line");if(!c){var c=e.extend({width:null,height:null,strokeWidth:2,strokeColor:"#000",strokeOverColor:null,strokeCap:"round",strokeJoin:"round",strokeOpacity:1,arrowEnd:"none",onComplete:null,onStart:null,delay:null,overrideKey:null,drawSequential:!0,speedMultiplier:1,reverse:!1,responsive:!1},a),d=c.overrideKey?c.overrideKey:b.attr("id").replace("#",""),f=c.svgData[d].dimensions.width, -l=c.svgData[d].dimensions.height;c.svgData=c.svgData[d].strokepath;null===c.width&&(c.width=f);null===c.height&&(c.height=l);c.responsive||b.css({width:c.width,height:c.height});d="0 0 "+f+" "+l;f=document.createElementNS("http://www.w3.org/2000/svg","svg");f.setAttributeNS(null,"viewBox",d);f.setAttribute("xmlns","http://www.w3.org/2000/svg");c.svg=e(f);b.append(c.svg);b.data("lazyLinePainter",c)}})},paint:function(){return this.each(function(){var a=e(this).data("lazyLinePainter"),b=function(){a.paths= -[];a.longestDuration=0;for(var b=a.playhead=0,d=0,f=0,d=0;da.longestDuration&&(a.longestDuration=b);var g;g=a.reverse?f-=b:a.playhead;a.paths.push({duration:b,drawStartTime:g,path:e,length:h});a.playhead+=b}a.totalDuration= -a.drawSequential?a.playhead:a.longestDuration;a.rAF=requestAnimationFrame(function(b){k(b,a)});if(null!==a.onStart)a.onStart()};null===a.delay?b():setTimeout(b,a.delay)})},pauseResume:function(){return this.each(function(){var a=e(this).data("lazyLinePainter");a.paused?(a.paused=!1,requestAnimationFrame(function(b){n(b,a)})):(a.paused=!0,cancelAnimationFrame(a.rAF))})},erase:function(){return this.each(function(){var a=e(this).data("lazyLinePainter");a.startTime=null;a.elapsedTime=null;cancelAnimationFrame(a.rAF); -a.svg.empty()})},destroy:function(){return this.each(function(){var a=e(this);a.removeData("lazyLinePainter");a.remove()})}},n=function(a,b){b.startTime=a-b.elapsedTime;requestAnimationFrame(function(a){k(a,b)})},k=function(a,b){b.startTime||(b.startTime=a);b.elapsedTime=a-b.startTime;for(var c=0;cd&&(d=0)):d=b.elapsedTime;db.paths[c].duration&&(b.paths[c].path.style.strokeDashoffset=0)}if(b.elapsedTimej.failure_limit)return!1}else c.trigger("appear"),b=0})}var h,i=this,j={threshold:0,failure_limit:0,event:"scroll",effect:"show",container:b,data_attribute:"original",skip_invisible:!1,appear:null,load:null,placeholder:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC"};return f&&(d!==f.failurelimit&&(f.failure_limit=f.failurelimit,delete f.failurelimit),d!==f.effectspeed&&(f.effect_speed=f.effectspeed,delete f.effectspeed),a.extend(j,f)),h=j.container===d||j.container===b?e:a(j.container),0===j.event.indexOf("scroll")&&h.bind(j.event,function(){return g()}),this.each(function(){var b=this,c=a(b);b.loaded=!1,(c.attr("src")===d||c.attr("src")===!1)&&c.is("img")&&c.attr("src",j.placeholder),c.one("appear",function(){if(!this.loaded){if(j.appear){var d=i.length;j.appear.call(b,d,j)}a("").bind("load",function(){var d=c.attr("data-"+j.data_attribute);c.hide(),c.is("img")?c.attr("src",d):c.css("background-image","url('"+d+"')"),c[j.effect](j.effect_speed),b.loaded=!0;var e=a.grep(i,function(a){return!a.loaded});if(i=a(e),j.load){var f=i.length;j.load.call(b,f,j)}}).attr("src",c.attr("data-"+j.data_attribute))}}),0!==j.event.indexOf("scroll")&&c.bind(j.event,function(){b.loaded||c.trigger("appear")})}),e.bind("resize",function(){g()}),/(?:iphone|ipod|ipad).*os 5/gi.test(navigator.appVersion)&&e.bind("pageshow",function(b){b.originalEvent&&b.originalEvent.persisted&&i.each(function(){a(this).trigger("appear")})}),a(c).ready(function(){g()}),this},a.belowthefold=function(c,f){var g;return g=f.container===d||f.container===b?(b.innerHeight?b.innerHeight:e.height())+e.scrollTop():a(f.container).offset().top+a(f.container).height(),g<=a(c).offset().top-f.threshold},a.rightoffold=function(c,f){var g;return g=f.container===d||f.container===b?e.width()+e.scrollLeft():a(f.container).offset().left+a(f.container).width(),g<=a(c).offset().left-f.threshold},a.abovethetop=function(c,f){var g;return g=f.container===d||f.container===b?e.scrollTop():a(f.container).offset().top,g>=a(c).offset().top+f.threshold+a(c).height()},a.leftofbegin=function(c,f){var g;return g=f.container===d||f.container===b?e.scrollLeft():a(f.container).offset().left,g>=a(c).offset().left+f.threshold+a(c).width()},a.inviewport=function(b,c){return!(a.rightoffold(b,c)||a.leftofbegin(b,c)||a.belowthefold(b,c)||a.abovethetop(b,c))},a.extend(a.expr[":"],{"below-the-fold":function(b){return a.belowthefold(b,{threshold:0})},"above-the-top":function(b){return!a.belowthefold(b,{threshold:0})},"right-of-screen":function(b){return a.rightoffold(b,{threshold:0})},"left-of-screen":function(b){return!a.rightoffold(b,{threshold:0})},"in-viewport":function(b){return a.inviewport(b,{threshold:0})},"above-the-fold":function(b){return!a.belowthefold(b,{threshold:0})},"right-of-fold":function(b){return a.rightoffold(b,{threshold:0})},"left-of-fold":function(b){return!a.rightoffold(b,{threshold:0})}})}(jQuery,window,document); \ No newline at end of file diff --git a/js/lib/lazyload.min.js b/js/lib/lazyload.min.js new file mode 100644 index 00000000..aa2888d1 --- /dev/null +++ b/js/lib/lazyload.min.js @@ -0,0 +1 @@ +!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(t=t||self).LazyLoad=n()}(this,(function(){"use strict";function t(){return(t=Object.assign||function(t){for(var n=1;n-1})(t)&&(C(t,n,e),p(t,n.class_loading)),b(t,n,e),function(t,n){n&&(n.toLoadCount-=1,L(t,n))}(n,e)},O=function(t,n,e){z(t,n,e),u(t,"loading"),y(n.callback_loading,t,e),y(n.callback_reveal,t,e),function(t,n){if(n){var e=n._observer;e&&n._settings.auto_unobserve&&e.unobserve(t)}}(t,e)},N=function(t){var n=f(t);n&&(clearTimeout(n),d(t,null))},x=function(t,n,e){var o=e._settings;y(o.callback_enter,t,n,e),o.load_delay?function(t,n,e){var o=n.load_delay,a=f(t);a||(a=setTimeout((function(){O(t,n,e),N(t)}),o),d(t,a))}(t,o,e):O(t,o,e)},M=["IMG","IFRAME"],R=function(t){return t.use_native&&"loading"in HTMLImageElement.prototype},T=function(t,n,e){t.forEach((function(t){-1!==M.indexOf(t.tagName)&&(t.setAttribute("loading","lazy"),function(t,n,e){z(t,n,e),u(t,"native")}(t,n,e))})),e.toLoadCount=0},j=function(t,n){!function(t){t.disconnect()}(t),function(t,n){n.forEach((function(n){t.observe(n),u(n,"observed")}))}(t,n)},F=function(t){var n;o&&!R(t._settings)&&(t._observer=new IntersectionObserver((function(n){n.forEach((function(n){return function(t){return t.isIntersecting||t.intersectionRatio>0}(n)?x(n.target,n,t):function(t,n,e){var o=e._settings;y(o.callback_exit,t,n,e),o.load_delay&&N(t)}(n.target,n,t)}))}),{root:(n=t._settings).container===document?null:n.container,rootMargin:n.thresholds||n.threshold+"px"}))},G=function(t){return Array.prototype.slice.call(t)},D=function(t){return t.container.querySelectorAll(t.elements_selector)},P=function(t){return!function(t){return null!==c(t,"ll-status")}(t)||function(t){return"observed"===c(t,"ll-status")}(t)},S=function(t){return function(t){return"error"===c(t,"ll-status")}(t)},U=function(t,n){return function(t){return G(t).filter(P)}(t||D(n))},V=function(t){var n,e=t._settings;(n=D(e),G(n).filter(S)).forEach((function(t){m(t,e.class_error),function(t){l(t,"ll-status",null)}(t)})),t.update()},$=function(t,e){var o;this._settings=i(t),this.loadingCount=0,F(this),o=this,n&&window.addEventListener("online",(function(t){V(o)})),this.update(e)};return $.prototype={update:function(t){var n=this._settings,a=U(t,n);this.toLoadCount=a.length,!e&&o?R(n)?T(a,n,this):j(this._observer,a):this.loadAll(a)},destroy:function(){this._observer&&this._observer.disconnect(),delete this._observer,delete this._settings,delete this.loadingCount,delete this.toLoadCount},loadAll:function(t){var n=this,e=this._settings;U(t,e).forEach((function(t){O(t,e,n)}))},load:function(t){O(t,this._settings,this)}},$.load=function(t,n){var e=i(n);O(t,e)},n&&function(t,n){if(n)if(n.length)for(var e,o=0;e=n[o];o+=1)s(t,e);else s(t,n)}($,window.lazyLoadOptions),$})); diff --git a/js/lib/morris.min.js b/js/lib/morris.min.js index 08ed7241..b982afc0 100644 --- a/js/lib/morris.min.js +++ b/js/lib/morris.min.js @@ -1,7 +1,9 @@ /* @license -morris.js v0.5.0 -Copyright 2014 Olly Smith All rights reserved. +morris.js06 v0.6.4 +https://pierresh.github.io/morris.js/ +Copyright 2019 Olly Smith All rights reserved. Licensed under the BSD-2-Clause License. */ -(function(){var a,b,c,d,e=[].slice,f=function(a,b){return function(){return a.apply(b,arguments)}},g={}.hasOwnProperty,h=function(a,b){function c(){this.constructor=a}for(var d in b)g.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},i=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};b=window.Morris={},a=jQuery,b.EventEmitter=function(){function a(){}return a.prototype.on=function(a,b){return null==this.handlers&&(this.handlers={}),null==this.handlers[a]&&(this.handlers[a]=[]),this.handlers[a].push(b),this},a.prototype.fire=function(){var a,b,c,d,f,g,h;if(c=arguments[0],a=2<=arguments.length?e.call(arguments,1):[],null!=this.handlers&&null!=this.handlers[c]){for(g=this.handlers[c],h=[],d=0,f=g.length;f>d;d++)b=g[d],h.push(b.apply(null,a));return h}},a}(),b.commas=function(a){var b,c,d,e;return null!=a?(d=0>a?"-":"",b=Math.abs(a),c=Math.floor(b).toFixed(0),d+=c.replace(/(?=(?:\d{3})+$)(?!^)/g,","),e=b.toString(),e.length>c.length&&(d+=e.slice(c.length)),d):"-"},b.pad2=function(a){return(10>a?"0":"")+a},b.Grid=function(c){function d(b){this.resizeHandler=f(this.resizeHandler,this);var c=this;if(this.el="string"==typeof b.element?a(document.getElementById(b.element)):a(b.element),null==this.el||0===this.el.length)throw new Error("Graph container element not found");"static"===this.el.css("position")&&this.el.css("position","relative"),this.options=a.extend({},this.gridDefaults,this.defaults||{},b),"string"==typeof this.options.units&&(this.options.postUnits=b.units),this.raphael=new Raphael(this.el[0]),this.elementWidth=null,this.elementHeight=null,this.dirty=!1,this.selectFrom=null,this.init&&this.init(),this.setData(this.options.data),this.el.bind("mousemove",function(a){var b,d,e,f,g;return d=c.el.offset(),g=a.pageX-d.left,c.selectFrom?(b=c.data[c.hitTest(Math.min(g,c.selectFrom))]._x,e=c.data[c.hitTest(Math.max(g,c.selectFrom))]._x,f=e-b,c.selectionRect.attr({x:b,width:f})):c.fire("hovermove",g,a.pageY-d.top)}),this.el.bind("mouseleave",function(){return c.selectFrom&&(c.selectionRect.hide(),c.selectFrom=null),c.fire("hoverout")}),this.el.bind("touchstart touchmove touchend",function(a){var b,d;return d=a.originalEvent.touches[0]||a.originalEvent.changedTouches[0],b=c.el.offset(),c.fire("hovermove",d.pageX-b.left,d.pageY-b.top)}),this.el.bind("click",function(a){var b;return b=c.el.offset(),c.fire("gridclick",a.pageX-b.left,a.pageY-b.top)}),this.options.rangeSelect&&(this.selectionRect=this.raphael.rect(0,0,0,this.el.innerHeight()).attr({fill:this.options.rangeSelectColor,stroke:!1}).toBack().hide(),this.el.bind("mousedown",function(a){var b;return b=c.el.offset(),c.startRange(a.pageX-b.left)}),this.el.bind("mouseup",function(a){var b;return b=c.el.offset(),c.endRange(a.pageX-b.left),c.fire("hovermove",a.pageX-b.left,a.pageY-b.top)})),this.options.resize&&a(window).bind("resize",function(){return null!=c.timeoutId&&window.clearTimeout(c.timeoutId),c.timeoutId=window.setTimeout(c.resizeHandler,100)}),this.el.css("-webkit-tap-highlight-color","rgba(0,0,0,0)"),this.postInit&&this.postInit()}return h(d,c),d.prototype.gridDefaults={dateFormat:null,axes:!0,grid:!0,gridLineColor:"#aaa",gridStrokeWidth:.5,gridTextColor:"#888",gridTextSize:12,gridTextFamily:"sans-serif",gridTextWeight:"normal",hideHover:!1,yLabelFormat:null,xLabelAngle:0,numLines:5,padding:25,parseTime:!0,postUnits:"",preUnits:"",ymax:"auto",ymin:"auto 0",goals:[],goalStrokeWidth:1,goalLineColors:["#666633","#999966","#cc6666","#663333"],events:[],eventStrokeWidth:1,eventLineColors:["#005a04","#ccffbb","#3a5f0b","#005502"],rangeSelect:null,rangeSelectColor:"#eef",resize:!1},d.prototype.setData=function(a,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;return null==c&&(c=!0),this.options.data=a,null==a||0===a.length?(this.data=[],this.raphael.clear(),null!=this.hover&&this.hover.hide(),void 0):(o=this.cumulative?0:null,p=this.cumulative?0:null,this.options.goals.length>0&&(h=Math.min.apply(Math,this.options.goals),g=Math.max.apply(Math,this.options.goals),p=null!=p?Math.min(p,h):h,o=null!=o?Math.max(o,g):g),this.data=function(){var c,d,g;for(g=[],f=c=0,d=a.length;d>c;f=++c)j=a[f],i={src:j},i.label=j[this.options.xkey],this.options.parseTime?(i.x=b.parseDate(i.label),this.options.dateFormat?i.label=this.options.dateFormat(i.x):"number"==typeof i.label&&(i.label=new Date(i.label).toString())):(i.x=f,this.options.xLabelFormat&&(i.label=this.options.xLabelFormat(i))),l=0,i.y=function(){var a,b,c,d;for(c=this.options.ykeys,d=[],e=a=0,b=c.length;b>a;e=++a)n=c[e],q=j[n],"string"==typeof q&&(q=parseFloat(q)),null!=q&&"number"!=typeof q&&(q=null),null!=q&&(this.cumulative?l+=q:null!=o?(o=Math.max(q,o),p=Math.min(q,p)):o=p=q),this.cumulative&&null!=l&&(o=Math.max(l,o),p=Math.min(l,p)),d.push(q);return d}.call(this),g.push(i);return g}.call(this),this.options.parseTime&&(this.data=this.data.sort(function(a,b){return(a.x>b.x)-(b.x>a.x)})),this.xmin=this.data[0].x,this.xmax=this.data[this.data.length-1].x,this.events=[],this.options.events.length>0&&(this.events=this.options.parseTime?function(){var a,c,e,f;for(e=this.options.events,f=[],a=0,c=e.length;c>a;a++)d=e[a],f.push(b.parseDate(d));return f}.call(this):this.options.events,this.xmax=Math.max(this.xmax,Math.max.apply(Math,this.events)),this.xmin=Math.min(this.xmin,Math.min.apply(Math,this.events))),this.xmin===this.xmax&&(this.xmin-=1,this.xmax+=1),this.ymin=this.yboundary("min",p),this.ymax=this.yboundary("max",o),this.ymin===this.ymax&&(p&&(this.ymin-=1),this.ymax+=1),((r=this.options.axes)===!0||"both"===r||"y"===r||this.options.grid===!0)&&(this.options.ymax===this.gridDefaults.ymax&&this.options.ymin===this.gridDefaults.ymin?(this.grid=this.autoGridLines(this.ymin,this.ymax,this.options.numLines),this.ymin=Math.min(this.ymin,this.grid[0]),this.ymax=Math.max(this.ymax,this.grid[this.grid.length-1])):(k=(this.ymax-this.ymin)/(this.options.numLines-1),this.grid=function(){var a,b,c,d;for(d=[],m=a=b=this.ymin,c=this.ymax;k>0?c>=a:a>=c;m=a+=k)d.push(m);return d}.call(this))),this.dirty=!0,c?this.redraw():void 0)},d.prototype.yboundary=function(a,b){var c,d;return c=this.options["y"+a],"string"==typeof c?"auto"===c.slice(0,4)?c.length>5?(d=parseInt(c.slice(5),10),null==b?d:Math[a](b,d)):null!=b?b:0:parseInt(c,10):c},d.prototype.autoGridLines=function(a,b,c){var d,e,f,g,h,i,j,k,l;return h=b-a,l=Math.floor(Math.log(h)/Math.log(10)),j=Math.pow(10,l),e=Math.floor(a/j)*j,d=Math.ceil(b/j)*j,i=(d-e)/(c-1),1===j&&i>1&&Math.ceil(i)!==i&&(i=Math.ceil(i),d=e+i*(c-1)),0>e&&d>0&&(e=Math.floor(a/i)*i,d=Math.ceil(b/i)*i),1>i?(g=Math.floor(Math.log(i)/Math.log(10)),f=function(){var a,b;for(b=[],k=a=e;i>0?d>=a:a>=d;k=a+=i)b.push(parseFloat(k.toFixed(1-g)));return b}()):f=function(){var a,b;for(b=[],k=a=e;i>0?d>=a:a>=d;k=a+=i)b.push(k);return b}(),f},d.prototype._calc=function(){var a,b,c,d,e,f,g,h;return e=this.el.width(),c=this.el.height(),(this.elementWidth!==e||this.elementHeight!==c||this.dirty)&&(this.elementWidth=e,this.elementHeight=c,this.dirty=!1,this.left=this.options.padding,this.right=this.elementWidth-this.options.padding,this.top=this.options.padding,this.bottom=this.elementHeight-this.options.padding,((g=this.options.axes)===!0||"both"===g||"y"===g)&&(f=function(){var a,c,d,e;for(d=this.grid,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(this.measureText(this.yAxisFormat(b)).width);return e}.call(this),this.left+=Math.max.apply(Math,f)),((h=this.options.axes)===!0||"both"===h||"x"===h)&&(a=function(){var a,b,c;for(c=[],d=a=0,b=this.data.length;b>=0?b>a:a>b;d=b>=0?++a:--a)c.push(this.measureText(this.data[d].text,-this.options.xLabelAngle).height);return c}.call(this),this.bottom-=Math.max.apply(Math,a)),this.width=Math.max(1,this.right-this.left),this.height=Math.max(1,this.bottom-this.top),this.dx=this.width/(this.xmax-this.xmin),this.dy=this.height/(this.ymax-this.ymin),this.calc)?this.calc():void 0},d.prototype.transY=function(a){return this.bottom-(a-this.ymin)*this.dy},d.prototype.transX=function(a){return 1===this.data.length?(this.left+this.right)/2:this.left+(a-this.xmin)*this.dx},d.prototype.redraw=function(){return this.raphael.clear(),this._calc(),this.drawGrid(),this.drawGoals(),this.drawEvents(),this.draw?this.draw():void 0},d.prototype.measureText=function(a,b){var c,d;return null==b&&(b=0),d=this.raphael.text(100,100,a).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).rotate(b),c=d.getBBox(),d.remove(),c},d.prototype.yAxisFormat=function(a){return this.yLabelFormat(a)},d.prototype.yLabelFormat=function(a){return"function"==typeof this.options.yLabelFormat?this.options.yLabelFormat(a):""+this.options.preUnits+b.commas(a)+this.options.postUnits},d.prototype.drawGrid=function(){var a,b,c,d,e,f,g,h;if(this.options.grid!==!1||(e=this.options.axes)===!0||"both"===e||"y"===e){for(f=this.grid,h=[],c=0,d=f.length;d>c;c++)a=f[c],b=this.transY(a),((g=this.options.axes)===!0||"both"===g||"y"===g)&&this.drawYAxisLabel(this.left-this.options.padding/2,b,this.yAxisFormat(a)),this.options.grid?h.push(this.drawGridLine("M"+this.left+","+b+"H"+(this.left+this.width))):h.push(void 0);return h}},d.prototype.drawGoals=function(){var a,b,c,d,e,f,g;for(f=this.options.goals,g=[],c=d=0,e=f.length;e>d;c=++d)b=f[c],a=this.options.goalLineColors[c%this.options.goalLineColors.length],g.push(this.drawGoal(b,a));return g},d.prototype.drawEvents=function(){var a,b,c,d,e,f,g;for(f=this.events,g=[],c=d=0,e=f.length;e>d;c=++d)b=f[c],a=this.options.eventLineColors[c%this.options.eventLineColors.length],g.push(this.drawEvent(b,a));return g},d.prototype.drawGoal=function(a,b){return this.raphael.path("M"+this.left+","+this.transY(a)+"H"+this.right).attr("stroke",b).attr("stroke-width",this.options.goalStrokeWidth)},d.prototype.drawEvent=function(a,b){return this.raphael.path("M"+this.transX(a)+","+this.bottom+"V"+this.top).attr("stroke",b).attr("stroke-width",this.options.eventStrokeWidth)},d.prototype.drawYAxisLabel=function(a,b,c){return this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor).attr("text-anchor","end")},d.prototype.drawGridLine=function(a){return this.raphael.path(a).attr("stroke",this.options.gridLineColor).attr("stroke-width",this.options.gridStrokeWidth)},d.prototype.startRange=function(a){return this.hover.hide(),this.selectFrom=a,this.selectionRect.attr({x:a,width:0}).show()},d.prototype.endRange=function(a){var b,c;return this.selectFrom?(c=Math.min(this.selectFrom,a),b=Math.max(this.selectFrom,a),this.options.rangeSelect.call(this.el,{start:this.data[this.hitTest(c)].x,end:this.data[this.hitTest(b)].x}),this.selectFrom=null):void 0},d.prototype.resizeHandler=function(){return this.timeoutId=null,this.raphael.setSize(this.el.width(),this.el.height()),this.redraw()},d}(b.EventEmitter),b.parseDate=function(a){var b,c,d,e,f,g,h,i,j,k,l;return"number"==typeof a?a:(c=a.match(/^(\d+) Q(\d)$/),e=a.match(/^(\d+)-(\d+)$/),f=a.match(/^(\d+)-(\d+)-(\d+)$/),h=a.match(/^(\d+) W(\d+)$/),i=a.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+)(Z|([+-])(\d\d):?(\d\d))?$/),j=a.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+):(\d+(\.\d+)?)(Z|([+-])(\d\d):?(\d\d))?$/),c?new Date(parseInt(c[1],10),3*parseInt(c[2],10)-1,1).getTime():e?new Date(parseInt(e[1],10),parseInt(e[2],10)-1,1).getTime():f?new Date(parseInt(f[1],10),parseInt(f[2],10)-1,parseInt(f[3],10)).getTime():h?(k=new Date(parseInt(h[1],10),0,1),4!==k.getDay()&&k.setMonth(0,1+(4-k.getDay()+7)%7),k.getTime()+6048e5*parseInt(h[2],10)):i?i[6]?(g=0,"Z"!==i[6]&&(g=60*parseInt(i[8],10)+parseInt(i[9],10),"+"===i[7]&&(g=0-g)),Date.UTC(parseInt(i[1],10),parseInt(i[2],10)-1,parseInt(i[3],10),parseInt(i[4],10),parseInt(i[5],10)+g)):new Date(parseInt(i[1],10),parseInt(i[2],10)-1,parseInt(i[3],10),parseInt(i[4],10),parseInt(i[5],10)).getTime():j?(l=parseFloat(j[6]),b=Math.floor(l),d=Math.round(1e3*(l-b)),j[8]?(g=0,"Z"!==j[8]&&(g=60*parseInt(j[10],10)+parseInt(j[11],10),"+"===j[9]&&(g=0-g)),Date.UTC(parseInt(j[1],10),parseInt(j[2],10)-1,parseInt(j[3],10),parseInt(j[4],10),parseInt(j[5],10)+g,b,d)):new Date(parseInt(j[1],10),parseInt(j[2],10)-1,parseInt(j[3],10),parseInt(j[4],10),parseInt(j[5],10),b,d).getTime()):new Date(parseInt(a,10),0,1).getTime())},b.Hover=function(){function c(c){null==c&&(c={}),this.options=a.extend({},b.Hover.defaults,c),this.el=a("
      "),this.el.hide(),this.options.parent.append(this.el)}return c.defaults={"class":"morris-hover morris-default-style"},c.prototype.update=function(a,b,c){return a?(this.html(a),this.show(),this.moveTo(b,c)):this.hide()},c.prototype.html=function(a){return this.el.html(a)},c.prototype.moveTo=function(a,b){var c,d,e,f,g,h;return g=this.options.parent.innerWidth(),f=this.options.parent.innerHeight(),d=this.el.outerWidth(),c=this.el.outerHeight(),e=Math.min(Math.max(0,a-d/2),g-d),null!=b?(h=b-c-10,0>h&&(h=b+10,h+c>f&&(h=f/2-c/2))):h=f/2-c/2,this.el.css({left:e+"px",top:parseInt(h)+"px"})},c.prototype.show=function(){return this.el.show()},c.prototype.hide=function(){return this.el.hide()},c}(),b.Line=function(a){function c(a){return this.hilight=f(this.hilight,this),this.onHoverOut=f(this.onHoverOut,this),this.onHoverMove=f(this.onHoverMove,this),this.onGridClick=f(this.onGridClick,this),this instanceof b.Line?(c.__super__.constructor.call(this,a),void 0):new b.Line(a)}return h(c,a),c.prototype.init=function(){return"always"!==this.options.hideHover?(this.hover=new b.Hover({parent:this.el}),this.on("hovermove",this.onHoverMove),this.on("hoverout",this.onHoverOut),this.on("gridclick",this.onGridClick)):void 0},c.prototype.defaults={lineWidth:3,pointSize:4,lineColors:["#0b62a4","#7A92A3","#4da74d","#afd8f8","#edc240","#cb4b4b","#9440ed"],pointStrokeWidths:[1],pointStrokeColors:["#ffffff"],pointFillColors:[],smooth:!0,xLabels:"auto",xLabelFormat:null,xLabelMargin:24,hideHover:!1},c.prototype.calc=function(){return this.calcPoints(),this.generatePaths()},c.prototype.calcPoints=function(){var a,b,c,d,e,f;for(e=this.data,f=[],c=0,d=e.length;d>c;c++)a=e[c],a._x=this.transX(a.x),a._y=function(){var c,d,e,f;for(e=a.y,f=[],c=0,d=e.length;d>c;c++)b=e[c],null!=b?f.push(this.transY(b)):f.push(b);return f}.call(this),f.push(a._ymax=Math.min.apply(Math,[this.bottom].concat(function(){var c,d,e,f;for(e=a._y,f=[],c=0,d=e.length;d>c;c++)b=e[c],null!=b&&f.push(b);return f}())));return f},c.prototype.hitTest=function(a){var b,c,d,e,f;if(0===this.data.length)return null;for(f=this.data.slice(1),b=d=0,e=f.length;e>d&&(c=f[b],!(a<(c._x+this.data[b]._x)/2));b=++d);return b},c.prototype.onGridClick=function(a,b){var c;return c=this.hitTest(a),this.fire("click",c,this.data[c].src,a,b)},c.prototype.onHoverMove=function(a){var b;return b=this.hitTest(a),this.displayHoverForRow(b)},c.prototype.onHoverOut=function(){return this.options.hideHover!==!1?this.displayHoverForRow(null):void 0},c.prototype.displayHoverForRow=function(a){var b;return null!=a?((b=this.hover).update.apply(b,this.hoverContentForRow(a)),this.hilight(a)):(this.hover.hide(),this.hilight())},c.prototype.hoverContentForRow=function(a){var b,c,d,e,f,g,h;for(d=this.data[a],b="
      "+d.label+"
      ",h=d.y,c=f=0,g=h.length;g>f;c=++f)e=h[c],b+="
      \n "+this.options.labels[c]+":\n "+this.yLabelFormat(e)+"\n
      ";return"function"==typeof this.options.hoverCallback&&(b=this.options.hoverCallback(a,this.options,b,d.src)),[b,d._x,d._ymax]},c.prototype.generatePaths=function(){var a,c,d,e;return this.paths=function(){var f,g,h,j;for(j=[],c=f=0,g=this.options.ykeys.length;g>=0?g>f:f>g;c=g>=0?++f:--f)e="boolean"==typeof this.options.smooth?this.options.smooth:(h=this.options.ykeys[c],i.call(this.options.smooth,h)>=0),a=function(){var a,b,e,f;for(e=this.data,f=[],a=0,b=e.length;b>a;a++)d=e[a],void 0!==d._y[c]&&f.push({x:d._x,y:d._y[c]});return f}.call(this),a.length>1?j.push(b.Line.createPath(a,e,this.bottom)):j.push(null);return j}.call(this)},c.prototype.draw=function(){var a;return((a=this.options.axes)===!0||"both"===a||"x"===a)&&this.drawXAxis(),this.drawSeries(),this.options.hideHover===!1?this.displayHoverForRow(this.data.length-1):void 0},c.prototype.drawXAxis=function(){var a,c,d,e,f,g,h,i,j,k,l=this;for(h=this.bottom+this.options.padding/2,f=null,e=null,a=function(a,b){var c,d,g,i,j;return c=l.drawXAxisLabel(l.transX(b),h,a),j=c.getBBox(),c.transform("r"+-l.options.xLabelAngle),d=c.getBBox(),c.transform("t0,"+d.height/2+"..."),0!==l.options.xLabelAngle&&(i=-.5*j.width*Math.cos(l.options.xLabelAngle*Math.PI/180),c.transform("t"+i+",0...")),d=c.getBBox(),(null==f||f>=d.x+d.width||null!=e&&e>=d.x)&&d.x>=0&&d.x+d.widtha;a++)g=c[a],d.push([g.label,g.x]);return d}.call(this),d.reverse(),k=[],i=0,j=d.length;j>i;i++)c=d[i],k.push(a(c[0],c[1]));return k},c.prototype.drawSeries=function(){var a,b,c,d,e,f;for(this.seriesPoints=[],a=b=d=this.options.ykeys.length-1;0>=d?0>=b:b>=0;a=0>=d?++b:--b)this._drawLineFor(a);for(f=[],a=c=e=this.options.ykeys.length-1;0>=e?0>=c:c>=0;a=0>=e?++c:--c)f.push(this._drawPointFor(a));return f},c.prototype._drawPointFor=function(a){var b,c,d,e,f,g;for(this.seriesPoints[a]=[],f=this.data,g=[],d=0,e=f.length;e>d;d++)c=f[d],b=null,null!=c._y[a]&&(b=this.drawLinePoint(c._x,c._y[a],this.colorFor(c,a,"point"),a)),g.push(this.seriesPoints[a].push(b));return g},c.prototype._drawLineFor=function(a){var b;return b=this.paths[a],null!==b?this.drawLinePath(b,this.colorFor(null,a,"line"),a):void 0},c.createPath=function(a,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r;for(k="",c&&(g=b.Line.gradients(a)),l={y:null},h=q=0,r=a.length;r>q;h=++q)e=a[h],null!=e.y&&(null!=l.y?c?(f=g[h],j=g[h-1],i=(e.x-l.x)/4,m=l.x+i,o=Math.min(d,l.y+i*j),n=e.x-i,p=Math.min(d,e.y-i*f),k+="C"+m+","+o+","+n+","+p+","+e.x+","+e.y):k+="L"+e.x+","+e.y:c&&null==g[h]||(k+="M"+e.x+","+e.y)),l=e;return k},c.gradients=function(a){var b,c,d,e,f,g,h,i;for(c=function(a,b){return(a.y-b.y)/(a.x-b.x)},i=[],d=g=0,h=a.length;h>g;d=++g)b=a[d],null!=b.y?(e=a[d+1]||{y:null},f=a[d-1]||{y:null},null!=f.y&&null!=e.y?i.push(c(f,e)):null!=f.y?i.push(c(f,b)):null!=e.y?i.push(c(b,e)):i.push(null)):i.push(null);return i},c.prototype.hilight=function(a){var b,c,d,e,f;if(null!==this.prevHilight&&this.prevHilight!==a)for(b=c=0,e=this.seriesPoints.length-1;e>=0?e>=c:c>=e;b=e>=0?++c:--c)this.seriesPoints[b][this.prevHilight]&&this.seriesPoints[b][this.prevHilight].animate(this.pointShrinkSeries(b));if(null!==a&&this.prevHilight!==a)for(b=d=0,f=this.seriesPoints.length-1;f>=0?f>=d:d>=f;b=f>=0?++d:--d)this.seriesPoints[b][a]&&this.seriesPoints[b][a].animate(this.pointGrowSeries(b));return this.prevHilight=a},c.prototype.colorFor=function(a,b,c){return"function"==typeof this.options.lineColors?this.options.lineColors.call(this,a,b,c):"point"===c?this.options.pointFillColors[b%this.options.pointFillColors.length]||this.options.lineColors[b%this.options.lineColors.length]:this.options.lineColors[b%this.options.lineColors.length]},c.prototype.drawXAxisLabel=function(a,b,c){return this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor)},c.prototype.drawLinePath=function(a,b,c){return this.raphael.path(a).attr("stroke",b).attr("stroke-width",this.lineWidthForSeries(c))},c.prototype.drawLinePoint=function(a,b,c,d){return this.raphael.circle(a,b,this.pointSizeForSeries(d)).attr("fill",c).attr("stroke-width",this.pointStrokeWidthForSeries(d)).attr("stroke",this.pointStrokeColorForSeries(d))},c.prototype.pointStrokeWidthForSeries=function(a){return this.options.pointStrokeWidths[a%this.options.pointStrokeWidths.length]},c.prototype.pointStrokeColorForSeries=function(a){return this.options.pointStrokeColors[a%this.options.pointStrokeColors.length]},c.prototype.lineWidthForSeries=function(a){return this.options.lineWidth instanceof Array?this.options.lineWidth[a%this.options.lineWidth.length]:this.options.lineWidth},c.prototype.pointSizeForSeries=function(a){return this.options.pointSize instanceof Array?this.options.pointSize[a%this.options.pointSize.length]:this.options.pointSize},c.prototype.pointGrowSeries=function(a){return Raphael.animation({r:this.pointSizeForSeries(a)+3},25,"linear")},c.prototype.pointShrinkSeries=function(a){return Raphael.animation({r:this.pointSizeForSeries(a)},25,"linear")},c}(b.Grid),b.labelSeries=function(c,d,e,f,g){var h,i,j,k,l,m,n,o,p,q,r;if(j=200*(d-c)/e,i=new Date(c),n=b.LABEL_SPECS[f],void 0===n)for(r=b.AUTO_LABEL_ORDER,p=0,q=r.length;q>p;p++)if(k=r[p],m=b.LABEL_SPECS[k],j>=m.span){n=m;break}for(void 0===n&&(n=b.LABEL_SPECS.second),g&&(n=a.extend({},n,{fmt:g})),h=n.start(i),l=[];(o=h.getTime())<=d;)o>=c&&l.push([n.fmt(h),o]),n.incr(h);return l},c=function(a){return{span:60*a*1e3,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate(),a.getHours())},fmt:function(a){return""+b.pad2(a.getHours())+":"+b.pad2(a.getMinutes())},incr:function(b){return b.setUTCMinutes(b.getUTCMinutes()+a)}}},d=function(a){return{span:1e3*a,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate(),a.getHours(),a.getMinutes())},fmt:function(a){return""+b.pad2(a.getHours())+":"+b.pad2(a.getMinutes())+":"+b.pad2(a.getSeconds())},incr:function(b){return b.setUTCSeconds(b.getUTCSeconds()+a)}}},b.LABEL_SPECS={decade:{span:1728e8,start:function(a){return new Date(a.getFullYear()-a.getFullYear()%10,0,1)},fmt:function(a){return""+a.getFullYear()},incr:function(a){return a.setFullYear(a.getFullYear()+10)}},year:{span:1728e7,start:function(a){return new Date(a.getFullYear(),0,1)},fmt:function(a){return""+a.getFullYear()},incr:function(a){return a.setFullYear(a.getFullYear()+1)}},month:{span:24192e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),1)},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)},incr:function(a){return a.setMonth(a.getMonth()+1)}},week:{span:6048e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate())},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)+"-"+b.pad2(a.getDate())},incr:function(a){return a.setDate(a.getDate()+7)}},day:{span:864e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate())},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)+"-"+b.pad2(a.getDate())},incr:function(a){return a.setDate(a.getDate()+1)}},hour:c(60),"30min":c(30),"15min":c(15),"10min":c(10),"5min":c(5),minute:c(1),"30sec":d(30),"15sec":d(15),"10sec":d(10),"5sec":d(5),second:d(1)},b.AUTO_LABEL_ORDER=["decade","year","month","week","day","hour","30min","15min","10min","5min","minute","30sec","15sec","10sec","5sec","second"],b.Area=function(c){function d(c){var f;return this instanceof b.Area?(f=a.extend({},e,c),this.cumulative=!f.behaveLikeLine,"auto"===f.fillOpacity&&(f.fillOpacity=f.behaveLikeLine?.8:1),d.__super__.constructor.call(this,f),void 0):new b.Area(c)}var e;return h(d,c),e={fillOpacity:"auto",behaveLikeLine:!1},d.prototype.calcPoints=function(){var a,b,c,d,e,f,g;for(f=this.data,g=[],d=0,e=f.length;e>d;d++)a=f[d],a._x=this.transX(a.x),b=0,a._y=function(){var d,e,f,g;for(f=a.y,g=[],d=0,e=f.length;e>d;d++)c=f[d],this.options.behaveLikeLine?g.push(this.transY(c)):(b+=c||0,g.push(this.transY(b)));return g}.call(this),g.push(a._ymax=Math.max.apply(Math,a._y));return g},d.prototype.drawSeries=function(){var a,b,c,d,e,f,g,h;for(this.seriesPoints=[],b=this.options.behaveLikeLine?function(){f=[];for(var a=0,b=this.options.ykeys.length-1;b>=0?b>=a:a>=b;b>=0?a++:a--)f.push(a);return f}.apply(this):function(){g=[];for(var a=e=this.options.ykeys.length-1;0>=e?0>=a:a>=0;0>=e?a++:a--)g.push(a);return g}.apply(this),h=[],c=0,d=b.length;d>c;c++)a=b[c],this._drawFillFor(a),this._drawLineFor(a),h.push(this._drawPointFor(a));return h},d.prototype._drawFillFor=function(a){var b;return b=this.paths[a],null!==b?(b+="L"+this.transX(this.xmax)+","+this.bottom+"L"+this.transX(this.xmin)+","+this.bottom+"Z",this.drawFilledPath(b,this.fillForSeries(a))):void 0},d.prototype.fillForSeries=function(a){var b;return b=Raphael.rgb2hsl(this.colorFor(this.data[a],a,"line")),Raphael.hsl(b.h,this.options.behaveLikeLine?.9*b.s:.75*b.s,Math.min(.98,this.options.behaveLikeLine?1.2*b.l:1.25*b.l))},d.prototype.drawFilledPath=function(a,b){return this.raphael.path(a).attr("fill",b).attr("fill-opacity",this.options.fillOpacity).attr("stroke","none")},d}(b.Line),b.Bar=function(c){function d(c){return this.onHoverOut=f(this.onHoverOut,this),this.onHoverMove=f(this.onHoverMove,this),this.onGridClick=f(this.onGridClick,this),this instanceof b.Bar?(d.__super__.constructor.call(this,a.extend({},c,{parseTime:!1})),void 0):new b.Bar(c)}return h(d,c),d.prototype.init=function(){return this.cumulative=this.options.stacked,"always"!==this.options.hideHover?(this.hover=new b.Hover({parent:this.el}),this.on("hovermove",this.onHoverMove),this.on("hoverout",this.onHoverOut),this.on("gridclick",this.onGridClick)):void 0},d.prototype.defaults={barSizeRatio:.75,barGap:3,barColors:["#0b62a4","#7a92a3","#4da74d","#afd8f8","#edc240","#cb4b4b","#9440ed"],barOpacity:1,barRadius:[0,0,0,0],xLabelMargin:50},d.prototype.calc=function(){var a;return this.calcBars(),this.options.hideHover===!1?(a=this.hover).update.apply(a,this.hoverContentForRow(this.data.length-1)):void 0},d.prototype.calcBars=function(){var a,b,c,d,e,f,g;for(f=this.data,g=[],a=d=0,e=f.length;e>d;a=++d)b=f[a],b._x=this.left+this.width*(a+.5)/this.data.length,g.push(b._y=function(){var a,d,e,f;for(e=b.y,f=[],a=0,d=e.length;d>a;a++)c=e[a],null!=c?f.push(this.transY(c)):f.push(null);return f}.call(this));return g},d.prototype.draw=function(){var a;return((a=this.options.axes)===!0||"both"===a||"x"===a)&&this.drawXAxis(),this.drawSeries()},d.prototype.drawXAxis=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m;for(j=this.bottom+(this.options.xAxisLabelTopPadding||this.options.padding/2),g=null,f=null,m=[],a=k=0,l=this.data.length;l>=0?l>k:k>l;a=l>=0?++k:--k)h=this.data[this.data.length-1-a],b=this.drawXAxisLabel(h._x,j,h.label),i=b.getBBox(),b.transform("r"+-this.options.xLabelAngle),c=b.getBBox(),b.transform("t0,"+c.height/2+"..."),0!==this.options.xLabelAngle&&(e=-.5*i.width*Math.cos(this.options.xLabelAngle*Math.PI/180),b.transform("t"+e+",0...")),(null==g||g>=c.x+c.width||null!=f&&f>=c.x)&&c.x>=0&&c.x+c.width=0?this.transY(0):null,this.bars=function(){var h,l,p,q;for(p=this.data,q=[],d=h=0,l=p.length;l>h;d=++h)i=p[d],e=0,q.push(function(){var h,l,p,q;for(p=i._y,q=[],j=h=0,l=p.length;l>h;j=++h)n=p[j],null!==n?(o?(m=Math.min(n,o),b=Math.max(n,o)):(m=n,b=this.bottom),f=this.left+d*c+g,this.options.stacked||(f+=j*(a+this.options.barGap)),k=b-m,this.options.verticalGridCondition&&this.options.verticalGridCondition(i.x)&&this.drawBar(this.left+d*c,this.top,c,Math.abs(this.top-this.bottom),this.options.verticalGridColor,this.options.verticalGridOpacity,this.options.barRadius),this.options.stacked&&(m-=e),this.drawBar(f,m,a,k,this.colorFor(i,j,"bar"),this.options.barOpacity,this.options.barRadius),q.push(e+=k)):q.push(null);return q}.call(this));return q}.call(this)},d.prototype.colorFor=function(a,b,c){var d,e;return"function"==typeof this.options.barColors?(d={x:a.x,y:a.y[b],label:a.label},e={index:b,key:this.options.ykeys[b],label:this.options.labels[b]},this.options.barColors.call(this,d,e,c)):this.options.barColors[b%this.options.barColors.length]},d.prototype.hitTest=function(a){return 0===this.data.length?null:(a=Math.max(Math.min(a,this.right),this.left),Math.min(this.data.length-1,Math.floor((a-this.left)/(this.width/this.data.length))))},d.prototype.onGridClick=function(a,b){var c;return c=this.hitTest(a),this.fire("click",c,this.data[c].src,a,b)},d.prototype.onHoverMove=function(a){var b,c;return b=this.hitTest(a),(c=this.hover).update.apply(c,this.hoverContentForRow(b))},d.prototype.onHoverOut=function(){return this.options.hideHover!==!1?this.hover.hide():void 0},d.prototype.hoverContentForRow=function(a){var b,c,d,e,f,g,h,i;for(d=this.data[a],b="
      "+d.label+"
      ",i=d.y,c=g=0,h=i.length;h>g;c=++g)f=i[c],b+="
      \n "+this.options.labels[c]+":\n "+this.yLabelFormat(f)+"\n
      ";return"function"==typeof this.options.hoverCallback&&(b=this.options.hoverCallback(a,this.options,b,d.src)),e=this.left+(a+.5)*this.width/this.data.length,[b,e]},d.prototype.drawXAxisLabel=function(a,b,c){var d;return d=this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor)},d.prototype.drawBar=function(a,b,c,d,e,f,g){var h,i;return h=Math.max.apply(Math,g),i=0===h||h>d?this.raphael.rect(a,b,c,d):this.raphael.path(this.roundedRect(a,b,c,d,g)),i.attr("fill",e).attr("fill-opacity",f).attr("stroke","none")},d.prototype.roundedRect=function(a,b,c,d,e){return null==e&&(e=[0,0,0,0]),["M",a,e[0]+b,"Q",a,b,a+e[0],b,"L",a+c-e[1],b,"Q",a+c,b,a+c,b+e[1],"L",a+c,b+d-e[2],"Q",a+c,b+d,a+c-e[2],b+d,"L",a+e[3],b+d,"Q",a,b+d,a,b+d-e[3],"Z"]},d}(b.Grid),b.Donut=function(c){function d(c){this.resizeHandler=f(this.resizeHandler,this),this.select=f(this.select,this),this.click=f(this.click,this);var d=this;if(!(this instanceof b.Donut))return new b.Donut(c);if(this.options=a.extend({},this.defaults,c),this.el="string"==typeof c.element?a(document.getElementById(c.element)):a(c.element),null===this.el||0===this.el.length)throw new Error("Graph placeholder not found.");void 0!==c.data&&0!==c.data.length&&(this.raphael=new Raphael(this.el[0]),this.options.resize&&a(window).bind("resize",function(){return null!=d.timeoutId&&window.clearTimeout(d.timeoutId),d.timeoutId=window.setTimeout(d.resizeHandler,100)}),this.setData(c.data))}return h(d,c),d.prototype.defaults={colors:["#0B62A4","#3980B5","#679DC6","#95BBD7","#B0CCE1","#095791","#095085","#083E67","#052C48","#042135"],backgroundColor:"#FFFFFF",labelColor:"#000000",formatter:b.commas,resize:!1},d.prototype.redraw=function(){var a,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x;for(this.raphael.clear(),c=this.el.width()/2,d=this.el.height()/2,n=(Math.min(c,d)-10)/3,l=0,u=this.values,o=0,r=u.length;r>o;o++)m=u[o],l+=m;for(i=5/(2*n),a=1.9999*Math.PI-i*this.data.length,g=0,f=0,this.segments=[],v=this.values,e=p=0,s=v.length;s>p;e=++p)m=v[e],j=g+i+a*(m/l),k=new b.DonutSegment(c,d,2*n,n,g,j,this.data[e].color||this.options.colors[f%this.options.colors.length],this.options.backgroundColor,f,this.raphael),k.render(),this.segments.push(k),k.on("hover",this.select),k.on("click",this.click),g=j,f+=1;for(this.text1=this.drawEmptyDonutLabel(c,d-10,this.options.labelColor,15,800),this.text2=this.drawEmptyDonutLabel(c,d+10,this.options.labelColor,14),h=Math.max.apply(Math,this.values),f=0,w=this.values,x=[],q=0,t=w.length;t>q;q++){if(m=w[q],m===h){this.select(f); - break}x.push(f+=1)}return x},d.prototype.setData=function(a){var b;return this.data=a,this.values=function(){var a,c,d,e;for(d=this.data,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(parseFloat(b.value));return e}.call(this),this.redraw()},d.prototype.click=function(a){return this.fire("click",a,this.data[a])},d.prototype.select=function(a){var b,c,d,e,f,g;for(g=this.segments,e=0,f=g.length;f>e;e++)c=g[e],c.deselect();return d=this.segments[a],d.select(),b=this.data[a],this.setLabels(b.label,this.options.formatter(b.value,b))},d.prototype.setLabels=function(a,b){var c,d,e,f,g,h,i,j;return c=2*(Math.min(this.el.width()/2,this.el.height()/2)-10)/3,f=1.8*c,e=c/2,d=c/3,this.text1.attr({text:a,transform:""}),g=this.text1.getBBox(),h=Math.min(f/g.width,e/g.height),this.text1.attr({transform:"S"+h+","+h+","+(g.x+g.width/2)+","+(g.y+g.height)}),this.text2.attr({text:b,transform:""}),i=this.text2.getBBox(),j=Math.min(f/i.width,d/i.height),this.text2.attr({transform:"S"+j+","+j+","+(i.x+i.width/2)+","+i.y})},d.prototype.drawEmptyDonutLabel=function(a,b,c,d,e){var f;return f=this.raphael.text(a,b,"").attr("font-size",d).attr("fill",c),null!=e&&f.attr("font-weight",e),f},d.prototype.resizeHandler=function(){return this.timeoutId=null,this.raphael.setSize(this.el.width(),this.el.height()),this.redraw()},d}(b.EventEmitter),b.DonutSegment=function(a){function b(a,b,c,d,e,g,h,i,j,k){this.cx=a,this.cy=b,this.inner=c,this.outer=d,this.color=h,this.backgroundColor=i,this.index=j,this.raphael=k,this.deselect=f(this.deselect,this),this.select=f(this.select,this),this.sin_p0=Math.sin(e),this.cos_p0=Math.cos(e),this.sin_p1=Math.sin(g),this.cos_p1=Math.cos(g),this.is_long=g-e>Math.PI?1:0,this.path=this.calcSegment(this.inner+3,this.inner+this.outer-5),this.selectedPath=this.calcSegment(this.inner+3,this.inner+this.outer),this.hilight=this.calcArc(this.inner)}return h(b,a),b.prototype.calcArcPoints=function(a){return[this.cx+a*this.sin_p0,this.cy+a*this.cos_p0,this.cx+a*this.sin_p1,this.cy+a*this.cos_p1]},b.prototype.calcSegment=function(a,b){var c,d,e,f,g,h,i,j,k,l;return k=this.calcArcPoints(a),c=k[0],e=k[1],d=k[2],f=k[3],l=this.calcArcPoints(b),g=l[0],i=l[1],h=l[2],j=l[3],"M"+c+","+e+("A"+a+","+a+",0,"+this.is_long+",0,"+d+","+f)+("L"+h+","+j)+("A"+b+","+b+",0,"+this.is_long+",1,"+g+","+i)+"Z"},b.prototype.calcArc=function(a){var b,c,d,e,f;return f=this.calcArcPoints(a),b=f[0],d=f[1],c=f[2],e=f[3],"M"+b+","+d+("A"+a+","+a+",0,"+this.is_long+",0,"+c+","+e)},b.prototype.render=function(){var a=this;return this.arc=this.drawDonutArc(this.hilight,this.color),this.seg=this.drawDonutSegment(this.path,this.color,this.backgroundColor,function(){return a.fire("hover",a.index)},function(){return a.fire("click",a.index)})},b.prototype.drawDonutArc=function(a,b){return this.raphael.path(a).attr({stroke:b,"stroke-width":2,opacity:0})},b.prototype.drawDonutSegment=function(a,b,c,d,e){return this.raphael.path(a).attr({fill:b,stroke:c,"stroke-width":3}).hover(d).click(e)},b.prototype.select=function(){return this.selected?void 0:(this.seg.animate({path:this.selectedPath},150,"<>"),this.arc.animate({opacity:1},150,"<>"),this.selected=!0)},b.prototype.deselect=function(){return this.selected?(this.seg.animate({path:this.path},150,"<>"),this.arc.animate({opacity:0},150,"<>"),this.selected=!1):void 0},b}(b.EventEmitter)}).call(this); \ No newline at end of file +(function(){var a,b,c,d,e=[].slice,f=function(a,b){return function(){return a.apply(b,arguments)}},g={}.hasOwnProperty,h=function(a,b){function c(){this.constructor=a}for(var d in b)g.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},i=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};a=window.Morris={},b=function(a){return getComputedStyle?getComputedStyle(a,null):a.currentStyle?a.currentStyle:a.style},a.EventEmitter=function(){function a(){}return a.prototype.on=function(a,b){return null==this.handlers&&(this.handlers={}),null==this.handlers[a]&&(this.handlers[a]=[]),this.handlers[a].push(b),this},a.prototype.fire=function(){var a,b,c,d,f,g,h;if(c=arguments[0],a=2<=arguments.length?e.call(arguments,1):[],null!=this.handlers&&null!=this.handlers[c]){for(g=this.handlers[c],h=[],d=0,f=g.length;f>d;d++)b=g[d],h.push(b.apply(null,a));return h}},a}(),a.commas=function(a){var b,c,d,e;return null!=a?(d=0>a?"-":"",b=Math.abs(a),c=Math.floor(b).toFixed(0),d+=c.replace(/(?=(?:\d{3})+$)(?!^)/g,","),e=b.toString(),e.length>c.length&&(d+=e.slice(c.length)),d):"-"},a.pad2=function(a){return(10>a?"0":"")+a},a.extend=function(){var a,b,c,d,f,g,h;for(b=arguments[0],c=2<=arguments.length?e.call(arguments,1):[],null==b&&(b={}),g=0,h=c.length;h>g;g++)if(d=c[g],null!=d)for(a in d)f=d[a],d.hasOwnProperty(a)&&(b[a]=f);return b},a.offset=function(a){var b;return b=a.getBoundingClientRect(),{top:b.top+document.body.scrollTop,left:b.left+document.body.scrollLeft}},a.css=function(a,c){return b(a)[c]},a.on=function(a,b,c){return a.addEventListener?a.addEventListener(b,c):a.attachEvent("on"+b,c)},a.off=function(a,b,c){return a.removeEventListener?a.removeEventListener(b,c):a.detachEvent("on"+b,c)},a.dimensions=function(a){var c;return c=b(a),{width:parseInt(c.width),height:parseInt(c.height)}},a.innerDimensions=function(a){var c;return c=b(a),{width:parseInt(c.width)+parseInt(c.paddingLeft)+parseInt(c.paddingRight),height:parseInt(c.height)+parseInt(c.paddingTop)+parseInt(c.paddingBottom)}},a.Grid=function(b){function c(b){if(this.setLabels=f(this.setLabels,this),this.hasToShow=f(this.hasToShow,this),this.debouncedResizeHandler=f(this.debouncedResizeHandler,this),this.resizeHandler=f(this.resizeHandler,this),this.mouseupHandler=f(this.mouseupHandler,this),this.mousedownHandler=f(this.mousedownHandler,this),this.clickHandler=f(this.clickHandler,this),this.touchHandler=f(this.touchHandler,this),this.mouseleaveHandler=f(this.mouseleaveHandler,this),this.mousemoveHandler=f(this.mousemoveHandler,this),"string"==typeof b.element?this.el=document.getElementById(b.element):this.el=b.element[0]||b.element,null==this.el)throw new Error("Graph container element not found");"static"===a.css(this.el,"position")&&(this.el.style.position="relative"),this.options=a.extend({},this.gridDefaults,this.defaults||{},b),"string"==typeof this.options.units&&(this.options.postUnits=b.units),this.raphael=new Raphael(this.el),this.elementWidth=null,this.elementHeight=null,this.dirty=!1,this.selectFrom=null,this.init&&this.init(),this.setData(this.options.data),a.on(this.el,"mousemove",this.mousemoveHandler),a.on(this.el,"mouseleave",this.mouseleaveHandler),a.on(this.el,"touchstart touchmove touchend",this.touchHandler),a.on(this.el,"click",this.clickHandler),this.options.rangeSelect&&(this.selectionRect=this.raphael.rect(0,0,0,a.innerDimensions(this.el).height).attr({fill:this.options.rangeSelectColor,stroke:!1}).toBack().hide(),a.on(this.el,"mousedown",this.mousedownHandler),a.on(this.el,"mouseup",this.mouseupHandler)),this.options.resize&&a.on(window,"resize",this.resizeHandler),this.el.style.webkitTapHighlightColor="rgba(0,0,0,0)",this.postInit&&this.postInit()}return h(c,b),c.prototype.gridDefaults={dateFormat:null,axes:!0,freePosition:!1,grid:!0,gridLineColor:"#aaa",gridStrokeWidth:.5,gridTextColor:"#888",gridTextSize:12,gridTextFamily:"sans-serif",gridTextWeight:"normal",hideHover:"auto",yLabelFormat:null,yLabelAlign:"right",yLabelAlign2:"left",xLabelAngle:0,numLines:5,padding:25,parseTime:!0,postUnits:"",postUnits2:"",preUnits:"",preUnits2:"",ymax:"auto",ymin:"auto 0",ymax2:"auto",ymin2:"auto 0",regions:[],regionsColors:["#fde4e4"],goals:[],goals2:[],goalStrokeWidth:1,goalStrokeWidth2:1,goalLineColors:["red"],goalLineColors2:["red"],events:[],eventStrokeWidth:1,eventLineColors:["#005a04"],rangeSelect:null,rangeSelectColor:"#eef",resize:!0,dataLabels:!0,dataLabelsPosition:"outside",dataLabelsFamily:"sans-serif",dataLabelsSize:12,dataLabelsWeight:"normal",dataLabelsColor:"auto",animate:!0,nbYkeys2:0,smooth:!0},c.prototype.destroy=function(){return a.off(this.el,"mousemove",this.mousemoveHandler),a.off(this.el,"mouseleave",this.mouseleaveHandler),a.off(this.el,"touchstart touchmove touchend",this.touchHandler),a.off(this.el,"click",this.clickHandler),this.options.rangeSelect&&(a.off(this.el,"mousedown",this.mousedownHandler),a.off(this.el,"mouseup",this.mouseupHandler)),this.options.resize?(window.clearTimeout(this.timeoutId),a.off(window,"resize",this.resizeHandler)):void 0},c.prototype.setData=function(b,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A;if(null==c&&(c=!0),this.options.data=b,null==b||0===b.length)return this.data=[],this.raphael.clear(),void(null!=this.hover&&this.hover.hide());if(s=this.cumulative?0:null,u=this.cumulative?0:null,t=this.cumulative?0:null,v=this.cumulative?0:null,this.options.goals.length>0&&(j=Math.min.apply(Math,this.options.goals),i=Math.max.apply(Math,this.options.goals),u=null!=u?Math.min(u,j):j,s=null!=s?Math.max(s,i):i),this.options.goals2.length>0&&(j=Math.min.apply(Math,this.options.goals2),i=Math.max.apply(Math,this.options.goals2),v=null!=v?Math.min(v,j):j,t=null!=t?Math.max(t,i):i),this.options.nbYkeys2>this.options.ykeys.length&&(this.options.nbYkeys2=this.options.ykeys.length),this.data=function(){var c,d,e;for(e=[],h=c=0,d=b.length;d>c;h=++c)l=b[h],k={src:l},k.label=l[this.options.xkey],this.options.parseTime?(k.x=a.parseDate(k.label),this.options.dateFormat?k.label=this.options.dateFormat(k.x):"number"==typeof k.label&&(k.label=new Date(k.label).toString())):this.options.freePosition?(k.x=parseFloat(l[this.options.xkey]),this.options.xLabelFormat&&(k.label=this.options.xLabelFormat(k))):(k.x=h,this.options.xLabelFormat&&(k.label=this.options.xLabelFormat(k))),p=0,k.y=function(){var a,b,c,d;for(c=this.options.ykeys,d=[],g=a=0,b=c.length;b>a;g=++a)r=c[g],w=l[r],"string"==typeof w&&(w=parseFloat(w)),null!=w&&"number"!=typeof w&&(w=null),gb.x)-(b.x>a.x)})),this.xmin=this.data[0].x,this.xmax=this.data[this.data.length-1].x,this.events=[],this.options.events.length>0){if(this.options.parseTime)for(z=this.options.events,x=0,y=z.length;y>x;x++)d=z[x],d instanceof Array?(f=d[0],o=d[1],this.events.push([a.parseDate(f),a.parseDate(o)])):this.events.push(a.parseDate(d));else this.events=this.options.events;e=this.events.map(function(a){return a}),this.xmax=Math.max(this.xmax,Math.max.apply(Math,e)),this.xmin=Math.min(this.xmin,Math.min.apply(Math,e))}return this.xmin===this.xmax&&(this.xmin-=1,this.xmax+=1),this.ymin=this.yboundary("min",u),this.ymax=this.yboundary("max",s),this.ymin2=this.yboundary("min2",v),this.ymax2=this.yboundary("max2",t),this.ymin===this.ymax&&(u&&(this.ymin-=1),this.ymax+=1),this.ymin2===this.ymax2&&(v&&(this.ymin2-=1),this.ymax2+=1),((A=this.options.axes)===!0||"both"===A||"y"===A||this.options.grid===!0)&&(this.options.ymax===this.gridDefaults.ymax&&this.options.ymin===this.gridDefaults.ymin?(this.grid=this.autoGridLines(this.ymin,this.ymax,this.options.numLines),this.ymin=Math.min(this.ymin,this.grid[0]),this.ymax=Math.max(this.ymax,this.grid[this.grid.length-1])):(m=(this.ymax-this.ymin)/(this.options.numLines-1),this.grid=function(){var a,b,c,d;for(d=[],q=a=b=this.ymin,c=this.ymax;m>0?c>=a:a>=c;q=a+=m)d.push(parseFloat(q.toFixed(2)));return d}.call(this)),this.options.ymax2===this.gridDefaults.ymax2&&this.options.ymin2===this.gridDefaults.ymin2&&this.options.nbYkeys2>0?(this.grid2=this.autoGridLines(this.ymin2,this.ymax2,this.options.numLines),this.ymin2=Math.min(this.ymin2,this.grid2[0]),this.ymax2=Math.max(this.ymax2,this.grid2[this.grid2.length-1])):(n=(this.ymax2-this.ymin2)/(this.options.numLines-1),this.grid2=function(){var a,b,c,d;for(d=[],q=a=b=this.ymin2,c=this.ymax2;n>0?c>=a:a>=c;q=a+=n)d.push(parseFloat(q.toFixed(2)));return d}.call(this))),this.dirty=!0,c?this.redraw():void 0},c.prototype.yboundary=function(a,b){var c,d;return c=this.options["y"+a],"string"==typeof c?"auto"===c.slice(0,4)?c.length>5?(d=parseInt(c.slice(5),10),null==b?d:Math[a.substring(0,3)](b,d)):null!=b?b:0:parseInt(c,10):c},c.prototype.autoGridLines=function(a,b,c){var d,e,f,g,h,i,j,k,l;return h=b-a,l=Math.floor(Math.log(h)/Math.log(10)),j=Math.pow(10,l),e=Math.floor(a/j)*j,d=Math.ceil(b/j)*j,i=(d-e)/(c-1),1===j&&i>1&&Math.ceil(i)!==i&&(i=Math.ceil(i),d=e+i*(c-1)),0>e&&d>0&&(e=Math.floor(a/i)*i,d=Math.ceil(b/i)*i),1>i?(g=Math.floor(Math.log(i)/Math.log(10)),f=function(){var a,b;for(b=[],k=a=e;i>0?d>=a:a>=d;k=a+=i)b.push(parseFloat(k.toFixed(1-g)));return b}()):f=function(){var a,b;for(b=[],k=a=e;i>0?d>=a:a>=d;k=a+=i)b.push(k);return b}(),f},c.prototype._calc=function(){var b,c,d,e,f,g,h,i,j,k,l;return j=a.dimensions(this.el),g=j.width,e=j.height,(this.elementWidth!==g||this.elementHeight!==e||this.dirty)&&(this.elementWidth=g,this.elementHeight=e,this.dirty=!1,this.left=this.options.padding,this.right=this.elementWidth-this.options.padding,this.top=this.options.padding,this.bottom=this.elementHeight-this.options.padding,((k=this.options.axes)===!0||"both"===k||"y"===k)&&(null!=this.grid&&(h=function(){var a,b,c,e;for(c=this.grid,e=[],a=0,b=c.length;b>a;a++)d=c[a],e.push(this.measureText(this.yAxisFormat(d)).width);return e}.call(this)),this.options.nbYkeys2>0&&(i=function(){var a,b,c,e;for(c=this.grid2,e=[],a=0,b=c.length;b>a;a++)d=c[a],e.push(this.measureText(this.yAxisFormat2(d)).width);return e}.call(this)),this.options.horizontal?this.bottom-=this.options.padding/2:(this.left+=Math.max.apply(Math,h),this.options.nbYkeys2>0&&(this.right-=Math.max.apply(Math,i)))),((l=this.options.axes)===!0||"both"===l||"x"===l)&&(b=this.options.horizontal?-90:-this.options.xLabelAngle,c=function(){var a,c,d;for(d=[],f=a=0,c=this.data.length;c>=0?c>a:a>c;f=c>=0?++a:--a)d.push(this.measureText(this.data[f].label,b).height);return d}.call(this),this.options.horizontal?this.left+=Math.max.apply(Math,c):this.bottom-=Math.max.apply(Math,c)),this.width=Math.max(1,this.right-this.left),this.height=Math.max(1,this.bottom-this.top),this.options.horizontal?(this.dx=this.height/(this.xmax-this.xmin),this.dy=this.width/(this.ymax-this.ymin),this.dy2=this.width/(this.ymax2-this.ymin2),this.yStart=this.left,this.yEnd=this.right,this.xStart=this.top,this.xEnd=this.bottom,this.xSize=this.height,this.ySize=this.width):(this.dx=this.width/(this.xmax-this.xmin),this.dy=this.height/(this.ymax-this.ymin),this.dy2=this.height/(this.ymax2-this.ymin2),this.yStart=this.bottom,this.yEnd=this.top,this.xStart=this.left,this.xEnd=this.right,this.xSize=this.width,this.ySize=this.height),this.calc)?this.calc():void 0},c.prototype.transY=function(a){return this.options.horizontal?this.left+(a-this.ymin)*this.dy:this.bottom-(a-this.ymin)*this.dy},c.prototype.transY2=function(a){return this.options.horizontal?this.left+(a-this.ymin2)*this.dy2:this.bottom-(a-this.ymin2)*this.dy2},c.prototype.transX=function(a){return 1===this.data.length?(this.xStart+this.xEnd)/2:this.xStart+(a-this.xmin)*this.dx},c.prototype.redraw=function(){return this.raphael.clear(),this._calc(),this.drawGrid(),this.drawRegions(),this.drawEvents(),this.draw&&this.draw(),this.drawGoals(),this.setLabels()},c.prototype.measureText=function(a,b){var c,d;return null==b&&(b=0),d=this.raphael.text(100,100,a).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).rotate(b),c=d.getBBox(),d.remove(),c},c.prototype.yAxisFormat=function(a){return this.yLabelFormat(a,0)},c.prototype.yAxisFormat2=function(a){return this.yLabelFormat(a,1e3)},c.prototype.yLabelFormat=function(b,c){return"function"==typeof this.options.yLabelFormat?this.options.yLabelFormat(b,c):0===this.options.nbYkeys2||c<=this.options.ykeys.length-this.options.nbYkeys2-1?""+this.options.preUnits+a.commas(b)+this.options.postUnits:""+this.options.preUnits2+a.commas(b)+this.options.postUnits2},c.prototype.yLabelFormat_noUnit=function(b,c){return"function"==typeof this.options.yLabelFormat?this.options.yLabelFormat(b,c):""+a.commas(b)},c.prototype.getYAxisLabelX=function(){return"right"===this.options.yLabelAlign?this.left-this.options.padding/2:this.options.padding/2},c.prototype.drawGrid=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n;if(this.options.grid!==!1||(i=this.options.axes)===!0||"both"===i||"y"===i){if(this.options.horizontal?(a=this.getXAxisLabelY(),b=this.top-(this.options.xAxisLabelTopPadding||this.options.padding/2)):(a=this.getYAxisLabelX(),b=this.right+this.options.padding/2),null!=this.grid)for(j=this.grid,e=0,g=j.length;g>e;e++)c=j[e],d=this.transY(c),((k=this.options.axes)===!0||"both"===k||"y"===k)&&(this.options.horizontal?this.drawXAxisLabel(d,a,this.yAxisFormat(c)):this.drawYAxisLabel(a,d,this.yAxisFormat(c),1)),this.options.grid&&(d=Math.floor(d)+.5,this.options.horizontal?this.drawGridLine("M"+d+","+this.xStart+"V"+this.xEnd):(isNaN(this.xEnd)&&(this.xEnd=20),this.drawGridLine("M"+this.xStart+","+d+"H"+this.xEnd)));if(this.options.nbYkeys2>0){for(l=this.grid2,n=[],f=0,h=l.length;h>f;f++)c=l[f],d=this.transY2(c),(m=this.options.axes)===!0||"both"===m||"y"===m?this.options.horizontal?n.push(this.drawXAxisLabel(d,b,this.yAxisFormat2(c))):n.push(this.drawYAxisLabel(b,d,this.yAxisFormat2(c),2)):n.push(void 0);return n}}},c.prototype.drawRegions=function(){var a,b,c,d,e,f,g;for(f=this.options.regions,g=[],b=d=0,e=f.length;e>d;b=++d)c=f[b],a=this.options.regionsColors[b%this.options.regionsColors.length],g.push(this.drawRegion(c,a));return g},c.prototype.drawGoals=function(){var a,b,c,d,e,f,g,h,i,j;for(h=this.options.goals,c=d=0,f=h.length;f>d;c=++d)b=h[c],a=this.options.goalLineColors[c%this.options.goalLineColors.length],this.drawGoal(b,a);for(i=this.options.goals2,j=[],c=e=0,g=i.length;g>e;c=++e)b=i[c],a=this.options.goalLineColors2[c%this.options.goalLineColors2.length],j.push(this.drawGoal2(b,a));return j},c.prototype.drawEvents=function(){var a,b,c,d,e,f,g;if(null!=this.events){for(f=this.events,g=[],c=d=0,e=f.length;e>d;c=++d)b=f[c],a=this.options.eventLineColors[c%this.options.eventLineColors.length],g.push(this.drawEvent(b,a));return g}},c.prototype.drawGoal=function(a,b){var c,d;return d=Math.floor(this.transY(a))+.5,c=this.options.horizontal?"M"+d+","+this.xStart+"V"+this.xEnd:"M"+this.xStart+","+d+"H"+this.xEnd,this.raphael.path(c).attr("stroke",b).attr("stroke-width",this.options.goalStrokeWidth)},c.prototype.drawGoal2=function(a,b){var c,d;return d=Math.floor(this.transY2(a))+.5,c=this.options.horizontal?"M"+d+","+this.xStart+"V"+this.xEnd:"M"+this.xStart+","+d+"H"+this.xEnd,this.raphael.path(c).attr("stroke",b).attr("stroke-width",this.options.goalStrokeWidth2)},c.prototype.drawRegion=function(a,b){var c,d,e,f;return a instanceof Array?(c=Math.min(Math.max.apply(Math,a),this.ymax),e=Math.max(Math.min.apply(Math,a),this.ymin),this.options.horizontal?(e=Math.floor(this.transY(e)),c=Math.floor(this.transY(c))-e,this.raphael.rect(e,this.xStart,c,this.xEnd-this.xStart).attr({fill:b,stroke:!1}).toBack()):(c=Math.floor(this.transY(c)),e=Math.floor(this.transY(e))-c,this.raphael.rect(this.xStart,c,this.xEnd-this.xStart,e).attr({fill:b,stroke:!1}).toBack())):this.options.horizontal?(f=Math.floor(this.transY(area))+1,d="M"+f+","+this.xStart+"V"+this.xEnd,this.raphael.path(d).attr("stroke",b).attr("stroke-width",2)):(f=Math.floor(this.transY(area))+1,d="M"+this.xStart+","+f+"H"+this.xEnd,this.raphael.path(d).attr("stroke",b).attr("stroke-width",2))},c.prototype.drawEvent=function(a,b){var c,d,e,f;return a instanceof Array?(c=a[0],e=a[1],c=Math.floor(this.transX(c))+.5,e=Math.floor(this.transX(e))+.5,this.options.horizontal?this.raphael.rect(this.yStart,c,this.yEnd-this.yStart,e-c).attr({fill:b,stroke:!1}).toBack():this.raphael.rect(c,this.yEnd,e-c,this.yStart-this.yEnd).attr({fill:b,stroke:!1}).toBack()):(f=Math.floor(this.transX(a))+.5,d=this.options.horizontal?"M"+this.yStart+","+f+"H"+this.yEnd:"M"+f+","+this.yStart+"V"+this.yEnd,this.raphael.path(d).attr("stroke",b).attr("stroke-width",this.options.eventStrokeWidth))},c.prototype.drawYAxisLabel=function(a,b,c,d){var e;return e=this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor),1===d?"right"===this.options.yLabelAlign?e.attr("text-anchor","end"):e.attr("text-anchor","start"):"left"===this.options.yLabelAlign2?e.attr("text-anchor","start"):e.attr("text-anchor","end")},c.prototype.drawXAxisLabel=function(a,b,c){return this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor)},c.prototype.drawGridLine=function(a){return this.raphael.path(a).attr("stroke",this.options.gridLineColor).attr("stroke-width",this.options.gridStrokeWidth)},c.prototype.startRange=function(a){return this.hover.hide(),this.selectFrom=a,this.selectionRect.attr({x:a,width:0}).show()},c.prototype.endRange=function(a){var b,c;return this.selectFrom?(c=Math.min(this.selectFrom,a),b=Math.max(this.selectFrom,a),this.options.rangeSelect.call(this.el,{start:this.data[this.hitTest(c)].x,end:this.data[this.hitTest(b)].x}),this.selectFrom=null):void 0},c.prototype.mousemoveHandler=function(b){var c,d,e,f,g;return d=a.offset(this.el),g=b.pageX-d.left,this.selectFrom?(c=this.data[this.hitTest(Math.min(g,this.selectFrom))]._x,e=this.data[this.hitTest(Math.max(g,this.selectFrom))]._x,f=e-c,this.selectionRect.attr({x:c,width:f})):this.fire("hovermove",g,b.pageY-d.top)},c.prototype.mouseleaveHandler=function(a){return this.selectFrom&&(this.selectionRect.hide(),this.selectFrom=null),this.fire("hoverout")},c.prototype.touchHandler=function(b){var c,d;return d=b.originalEvent.touches[0]||b.originalEvent.changedTouches[0],c=a.offset(this.el),this.fire("hovermove",d.pageX-c.left,d.pageY-c.top)},c.prototype.clickHandler=function(b){var c;return c=a.offset(this.el),this.fire("gridclick",b.pageX-c.left,b.pageY-c.top)},c.prototype.mousedownHandler=function(b){var c;return c=a.offset(this.el),this.startRange(b.pageX-c.left)},c.prototype.mouseupHandler=function(b){var c;return c=a.offset(this.el),this.endRange(b.pageX-c.left),this.fire("hovermove",b.pageX-c.left,b.pageY-c.top)},c.prototype.resizeHandler=function(){return null!=this.timeoutId&&window.clearTimeout(this.timeoutId),this.timeoutId=window.setTimeout(this.debouncedResizeHandler,100)},c.prototype.debouncedResizeHandler=function(){var b,c,d;return this.timeoutId=null,d=a.dimensions(this.el),c=d.width,b=d.height,this.raphael.setSize(c,b),this.options.animate=!1,this.redraw()},c.prototype.hasToShow=function(a){return this.options.shown===!0||this.options.shown[a]===!0},c.prototype.isColorDark=function(a){var b,c,d,e,f;return null!=a?(a=a.substring(1),f=parseInt(a,16),e=f>>16&255,c=f>>8&255,b=f>>0&255,d=.2126*e+.7152*c+.0722*b,d>=128?!1:!0):!1},c.prototype.drawDataLabel=function(a,b,c,d){var e;return e=this.raphael.text(a,b,c).attr("text-anchor","middle").attr("font-size",this.options.dataLabelsSize).attr("font-family",this.options.dataLabelsFamily).attr("font-weight",this.options.dataLabelsWeight).attr("fill",d)},c.prototype.drawDataLabelExt=function(a,b,c,d,e){var f;return f=this.raphael.text(a,b,c).attr("text-anchor",d).attr("font-size",this.options.dataLabelsSize).attr("font-family",this.options.dataLabelsFamily).attr("font-weight",this.options.dataLabelsWeight).attr("fill",e)},c.prototype.setLabels=function(){var a,b,c,d,e,f,g,h;if(this.options.dataLabels){for(g=this.data,h=[],e=0,f=g.length;f>e;e++)c=g[e],h.push(function(){var e,f,g,h;for(g=this.options.ykeys,h=[],b=e=0,f=g.length;f>e;b=++e)d=g[b],a="auto"!==this.options.dataLabelsColor?this.options.dataLabelsColor:this.options.stacked===!0&&this.isColorDark(this.options.barColors[b%this.options.barColors.length])===!0?"#fff":"#000",null!=this.options.lineColors&&null!=this.options.lineType?(null!=c.label_y[b]&&this.drawDataLabel(c._x,c.label_y[b],this.yLabelFormat_noUnit(c.y[b],0),a),null!=c._y2&&null!=c._y2[b]?h.push(this.drawDataLabel(c._x,c._y2[b]-10,this.yLabelFormat_noUnit(c.y[b],1e3),a)):h.push(void 0)):null!=c.label_y[b]?this.options.horizontal===!1?h.push(this.drawDataLabel(c.label_x[b],c.label_y[b],this.yLabelFormat_noUnit(c.y[b],b),a)):h.push(this.drawDataLabelExt(c.label_x[b],c.label_y[b],this.yLabelFormat_noUnit(c.y[b]),"start",a)):null!=c._y2[b]?this.options.horizontal===!1?h.push(this.drawDataLabel(c._x,c._y2[b]-10,this.yLabelFormat_noUnit(c.y[b],b),a)):h.push(this.drawDataLabelExt(c._y2[b],c._x-10,this.yLabelFormat_noUnit(c.y[b]),"middle",a)):h.push(void 0);return h}.call(this));return h}},c}(a.EventEmitter),a.parseDate=function(a){var b,c,d,e,f,g,h,i,j,k,l;return"number"==typeof a?a:(c=a.match(/^(\d+) Q(\d)$/),e=a.match(/^(\d+)-(\d+)$/),f=a.match(/^(\d+)-(\d+)-(\d+)$/),h=a.match(/^(\d+) W(\d+)$/),i=a.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+)(Z|([+-])(\d\d):?(\d\d))?$/),j=a.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+):(\d+(\.\d+)?)(Z|([+-])(\d\d):?(\d\d))?$/),c?new Date(parseInt(c[1],10),3*parseInt(c[2],10)-1,1).getTime():e?new Date(parseInt(e[1],10),parseInt(e[2],10)-1,1).getTime():f?new Date(parseInt(f[1],10),parseInt(f[2],10)-1,parseInt(f[3],10)).getTime():h?(k=new Date(parseInt(h[1],10),0,1),4!==k.getDay()&&k.setMonth(0,1+(4-k.getDay()+7)%7),k.getTime()+6048e5*parseInt(h[2],10)):i?i[6]?(g=0,"Z"!==i[6]&&(g=60*parseInt(i[8],10)+parseInt(i[9],10),"+"===i[7]&&(g=0-g)),Date.UTC(parseInt(i[1],10),parseInt(i[2],10)-1,parseInt(i[3],10),parseInt(i[4],10),parseInt(i[5],10)+g)):new Date(parseInt(i[1],10),parseInt(i[2],10)-1,parseInt(i[3],10),parseInt(i[4],10),parseInt(i[5],10)).getTime():j?(l=parseFloat(j[6]),b=Math.floor(l),d=Math.round(1e3*(l-b)),j[8]?(g=0,"Z"!==j[8]&&(g=60*parseInt(j[10],10)+parseInt(j[11],10),"+"===j[9]&&(g=0-g)),Date.UTC(parseInt(j[1],10),parseInt(j[2],10)-1,parseInt(j[3],10),parseInt(j[4],10),parseInt(j[5],10)+g,b,d)):new Date(parseInt(j[1],10),parseInt(j[2],10)-1,parseInt(j[3],10),parseInt(j[4],10),parseInt(j[5],10),b,d).getTime()):new Date(parseInt(a,10),0,1).getTime())},a.Hover=function(){function b(b){null==b&&(b={}),this.options=a.extend({},a.Hover.defaults,b),this.el=document.createElement("div"),this.el.className=this.options["class"],this.el.style.display="none",(this.options.parent=this.options.parent[0]||this.options.parent).appendChild(this.el)}return b.defaults={"class":"morris-hover morris-default-style"},b.prototype.update=function(a,b,c,d){return a?(this.html(a),this.show(),this.moveTo(b,c,d)):this.hide()},b.prototype.html=function(a){return this.el.innerHTML=a},b.prototype.moveTo=function(b,c,d){var e,f,g,h,i,j,k;return k=a.innerDimensions(this.options.parent),i=k.width,h=k.height,f=this.el.offsetWidth,e=this.el.offsetHeight,g=Math.min(Math.max(0,b-f/2),i-f),null!=c?d===!0?(j=c-e/2,0>j&&(j=0)):(j=c-e-10,0>j&&(j=c+10,j+e>h&&(j=h/2-e/2))):j=h/2-e/2,this.el.style.left=parseInt(g)+"px",this.el.style.top=parseInt(j)+"px"},b.prototype.show=function(){return this.el.style.display=""},b.prototype.hide=function(){return this.el.style.display="none"},b}(),a.Line=function(b){function c(b){return this.hilight=f(this.hilight,this),this.onHoverOut=f(this.onHoverOut,this),this.onHoverMove=f(this.onHoverMove,this),this.onGridClick=f(this.onGridClick,this),this instanceof a.Line?void c.__super__.constructor.call(this,b):new a.Line(b)}return h(c,b),c.prototype.init=function(){return"always"!==this.options.hideHover?(this.hover=new a.Hover({parent:this.el}),this.on("hovermove",this.onHoverMove),this.on("hoverout",this.onHoverOut),this.on("gridclick",this.onGridClick)):void 0},c.prototype.defaults={lineWidth:3,pointSize:4,pointSizeGrow:3,lineColors:["#2f7df6","#53a351","#f6c244","#cb444a","#4aa0b5","#222529"],extraClassLine:"",extraClassCircle:"",pointStrokeWidths:[1],pointStrokeColors:["#ffffff"],pointFillColors:[],pointSuperimposed:!0,hoverOrdered:!1,hoverReversed:!1,smooth:!0,lineType:{},shown:!0,xLabels:"auto",xLabelFormat:null,xLabelMargin:0,verticalGrid:!1,verticalGridHeight:"full",verticalGridStartOffset:0,verticalGridType:"",trendLine:!1,trendLineType:"linear",trendLineWidth:2,trendLineWeight:!1,trendLineColors:["#689bc3","#a2b3bf","#64b764"]},c.prototype.calc=function(){return this.calcPoints(),this.generatePaths()},c.prototype.calcPoints=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;for(q=this.data,j=0,n=q.length;n>j;j++)g=q[j],g._x=this.transX(g.x),g._y=function(){var a,b,c,e;for(c=g.y,e=[],d=a=0,b=c.length;b>a;d=++a)i=c[d],da;d=++a)i=c[d],d>=this.options.ykeys.length-this.options.nbYkeys2?null!=i?e.push(this.transY2(i)):e.push(i):e.push(void 0);return e}.call(this),g._ymax=Math.min.apply(Math,[this.bottom].concat(function(){var a,c,d,e;for(d=g._y,e=[],b=a=0,c=d.length;c>a;b=++a)i=d[b],null!=i&&this.hasToShow(b)&&e.push(i);return e}.call(this))),g._ymax2=Math.min.apply(Math,[this.bottom].concat(function(){var a,c,d,e;for(d=g._y2,e=[],b=a=0,c=d.length;c>a;b=++a)i=d[b],null!=i&&this.hasToShow(b)&&e.push(i);return e}.call(this)));for(r=this.data,c=k=0,o=r.length;o>k;c=++k)for(g=r[c],this.data[c].label_x=[],this.data[c].label_y=[],e=l=s=this.options.ykeys.length-1;0>=s?0>=l:l>=0;e=0>=s?++l:--l)null!=g._y[e]&&(this.data[c].label_x[e]=g._x,this.data[c].label_y[e]=g._y[e]-10),null!=g._y2&&null!=g._y2[e]&&(this.data[c].label_x[e]=g._x,this.data[c].label_y[e]=g._y2[e]-10);if(this.options.pointSuperimposed===!1){for(t=this.data,u=[],m=0,p=t.length;p>m;m++)g=t[m],u.push(function(){var d,e,i,j,k,l,m;for(k=g._y,m=[],c=i=0,d=k.length;d>i;c=++i){for(f=k[c],a=0,l=g._y,b=j=0,e=l.length;e>j;b=++j)h=l[b],f===h&&"number"==typeof f&&a++;a>1?(g._y[c]=g._y[c]+a*this.lineWidthForSeries(c),this.lineWidthForSeries(c)>1?m.push(g._y[c]=g._y[c]-1):m.push(void 0)):m.push(void 0)}return m}.call(this));return u}},c.prototype.hitTest=function(a){var b,c,d,e,f;if(0===this.data.length)return null;for(f=this.data.slice(1),b=d=0,e=f.length;e>d&&(c=f[b],!(a<(c._x+this.data[b]._x)/2));b=++d);return b},c.prototype.onGridClick=function(a,b){var c;return c=this.hitTest(a),this.fire("click",c,this.data[c].src,a,b)},c.prototype.onHoverMove=function(a,b){var c;return c=this.hitTest(a),this.displayHoverForRow(c)},c.prototype.onHoverOut=function(){return this.options.hideHover!==!1?this.displayHoverForRow(null):void 0},c.prototype.displayHoverForRow=function(a){var b;return null!=a?((b=this.hover).update.apply(b,this.hoverContentForRow(a)),this.hilight(a)):(this.hover.hide(),this.hilight())},c.prototype.hoverContentForRow=function(a){var b,c,d,e,f,g,h,j,k,l,m,n,o,p,q,r,s,t,u;if(j=this.data[a],c="",h=[],this.options.hoverOrdered===!0)for(s=j.y,e=m=0,q=s.length;q>m;e=++m){for(l=s[e],f=null,g=-1,t=j.y,d=n=0,r=t.length;r>n;d=++n)k=t[d],i.call(h,d)<0&&(k>=f||null===f)&&(f=k,g=d);h.push(g)}else for(u=j.y,e=o=u.length-1;o>=0;e=o+=-1)l=u[e],h.push(e);for(this.options.hoverReversed===!0&&(h=h.reverse()),b=-1,p=h.length-1;p>=0;p+=-1)d=h[p],this.options.labels[d]!==!1&&(void 0!==j.y[d]&&-1===b&&(b=d),c="
      \n "+this.options.labels[d]+":\n "+this.yLabelFormat(j.y[d],d)+"\n
      "+c);return c="
      "+j.label+"
      "+c,"function"==typeof this.options.hoverCallback&&(c=this.options.hoverCallback(a,this.options,c,j.src)),b>this.options.nbYkeys2?[c,j._x,j._ymax2]:[c,j._x,j._ymax]},c.prototype.generatePaths=function(){var b,c,d,e,f,g;return this.paths=function(){var h,j,k,l;for(l=[],c=h=0,j=this.options.ykeys.length;j>=0?j>h:h>j;c=j>=0?++h:--h)g="boolean"==typeof this.options.smooth?this.options.smooth:(k=this.options.ykeys[c],i.call(this.options.smooth,k)>=0),d=g?"smooth":"jagged","string"==typeof this.options.lineType&&(d=this.options.lineType),void 0!==this.options.lineType[this.options.ykeys[c]]&&(d=this.options.lineType[this.options.ykeys[c]]),e=this.options.ykeys.length-this.options.nbYkeys2,b=e>c?function(){var a,b,d,e;for(d=this.data,e=[],a=0,b=d.length;b>a;a++)f=d[a],void 0!==f._y[c]&&e.push({x:f._x,y:f._y[c]});return e}.call(this):function(){var a,b,d,e;for(d=this.data,e=[],a=0,b=d.length;b>a;a++)f=d[a],void 0!==f._y2[c]&&e.push({x:f._x,y:f._y2[c]});return e}.call(this),b.length>1?l.push(a.Line.createPath(b,d,this.bottom)):l.push(null);return l}.call(this)},c.prototype.draw=function(){var a;return((a=this.options.axes)===!0||"both"===a||"x"===a)&&this.drawXAxis(),this.drawSeries(),this.options.hideHover===!1?this.displayHoverForRow(this.data.length-1):void 0},c.prototype.drawXAxis=function(){var b,c,d,e,f,g,h,i,j,k,l,m,n,o=this;for(i=this.bottom+this.options.padding/2,g=null,f=null,b=function(b,c){var d,e,h,j,k;return d=o.drawXAxisLabel(o.transX(c),i,b),k=d.getBBox(),d.transform("r"+-o.options.xLabelAngle),e=d.getBBox(),d.transform("t0,"+e.height/2+"..."),0!==o.options.xLabelAngle&&(j=-.5*k.width*Math.cos(o.options.xLabelAngle*Math.PI/180),d.transform("t"+j+",0...")),e=d.getBBox(),(null==g||g>=e.x+e.width||null!=f&&f>=e.x)&&e.x>=0&&e.x+e.widtha;a++)h=c[a],d.push([h.label,h.x]);return d}.call(this):function(){var a,b,c,d;for(c=this.data,d=[],a=0,b=c.length;b>a;a++)h=c[a],d.push([h.label,h.x]);return d}.call(this),d.reverse(),j=0,l=d.length;l>j;j++)c=d[j],b(c[0],c[1]);if("string"==typeof this.options.verticalGrid){for(e=a.labelSeries(this.xmin,this.xmax,this.width,this.options.verticalGrid),n=[],k=0,m=e.length;m>k;k++)c=e[k],n.push(this.drawVerticalGridLine(c[1]));return n}},c.prototype.drawVerticalGridLine=function(a){var b,c;return a=Math.floor(this.transX(a))+.5,c=this.yStart+this.options.verticalGridStartOffset,b="full"===this.options.verticalGridHeight?this.yEnd:this.yStart-this.options.verticalGridHeight,this.drawGridLineVert("M"+a+","+c+"V"+b)},c.prototype.drawGridLineVert=function(a){return this.raphael.path(a).attr("stroke",this.options.gridLineColor).attr("stroke-width",this.options.gridStrokeWidth).attr("stroke-dasharray",this.options.verticalGridType)},c.prototype.drawSeries=function(){var a,b,c,d,e,f;for(this.seriesPoints=[],a=b=d=this.options.ykeys.length-1;0>=d?0>=b:b>=0;a=0>=d?++b:--b)this.hasToShow(a)&&((this.options.trendLine!==!1&&this.options.trendLine===!0||this.options.trendLine[a]===!0)&&this._drawTrendLine(a), + this._drawLineFor(a));for(f=[],a=c=e=this.options.ykeys.length-1;0>=e?0>=c:c>=0;a=0>=e?++c:--c)this.hasToShow(a)?f.push(this._drawPointFor(a)):f.push(void 0);return f},c.prototype._drawPointFor=function(a){var b,c,d,e,f,g,h;for(this.seriesPoints[a]=[],g=this.data,h=[],c=e=0,f=g.length;f>e;c=++e)d=g[c],b=null,null!=d._y[a]&&(b=this.drawLinePoint(d._x,d._y[a],this.colorFor(d,a,"point"),a)),null!=d._y2&&null!=d._y2[a]&&(b=this.drawLinePoint(d._x,d._y2[a],this.colorFor(d,a,"point"),a)),h.push(this.seriesPoints[a].push(b));return h},c.prototype._drawLineFor=function(a){var b;return b=this.paths[a],null!==b?this.drawLinePath(b,this.colorFor(null,a,"line"),a):void 0},c.prototype._drawTrendLine=function(b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A;for(k=0,n=0,l=0,m=0,f=0,i=[],A=this.data,g=v=0,z=A.length;z>v;g=++v)r=A[g],t=r.x,u=r.y[b],null!=u&&(i.push([t,u]),s=this.options.trendLineWeight===!1?1:this.options.data[g][this.options.trendLineWeight],f+=s,k+=t*s,n+=u*s,l+=t*t*s,m+=t*u*s);if(c=(f*m-k*n)/(f*l-k*k),d=n/f-c*k/f,e=[{},{}],e[0].x=this.transX(this.data[0].x),e[0].y=this.transY(this.data[0].x*c+d),e[1].x=this.transX(this.data[this.data.length-1].x),e[1].y=this.transY(this.data[this.data.length-1].x*c+d),"linear"!==this.options.trendLineType)if("function"==typeof regression){if(o=(this.xmax-this.xmin)/30,e=[],"polynomial"===this.options.trendLineType)for(j=regression("polynomial",i,2),g=w=0;30>=w;g=++w)p=this.xmin+g*o,q=j.equation[2]*p*p+j.equation[1]*p+j.equation[0],e.push({x:this.transX(p),y:this.transY(q)});else if("logarithmic"===this.options.trendLineType)for(j=regression("logarithmic",i),g=x=0;30>=x;g=++x)p=this.xmin+g*o,q=j.equation[0]+j.equation[1]*Math.log(p),e.push({x:this.transX(p),y:this.transY(q)});else if("exponential"===this.options.trendLineType)for(j=regression("exponential",i),g=y=0;30>=y;g=++y)p=this.xmin+g*o,q=j.equation[0]+Math.exp(j.equation[1]*p),e.push({x:this.transX(p),y:this.transY(q)});console.log("Regression formula is: "+j.string+", r2:"+j.r2)}else console.log("Warning: regression() is undefined, please ensure that regression.js is loaded");return isNaN(c)?void 0:(h=a.Line.createPath(e,"jagged",this.bottom),h=this.raphael.path(h).attr("stroke",this.colorFor(null,b,"trendLine")).attr("stroke-width",this.options.trendLineWidth))},c.createPath=function(b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r;for(k="","smooth"===c&&(g=a.Line.gradients(b)),l={y:null},h=q=0,r=b.length;r>q;h=++q)e=b[h],null!=e.y&&(null!=l.y?"smooth"===c?(f=g[h],j=g[h-1],i=(e.x-l.x)/4,m=l.x+i,o=Math.min(d,l.y+i*j),n=e.x-i,p=Math.min(d,e.y-i*f),k+="C"+m+","+o+","+n+","+p+","+e.x+","+e.y):"jagged"===c?k+="L"+e.x+","+e.y:"step"===c?(k+="L"+e.x+","+l.y,k+="L"+e.x+","+e.y):"stepNoRiser"===c&&(k+="L"+e.x+","+l.y,k+="M"+e.x+","+e.y):("smooth"!==c||null!=g[h])&&(k+="M"+e.x+","+e.y)),l=e;return k},c.gradients=function(a){var b,c,d,e,f,g,h,i;for(c=function(a,b){return(a.y-b.y)/(a.x-b.x)},i=[],d=g=0,h=a.length;h>g;d=++g)b=a[d],null!=b.y?(e=a[d+1]||{y:null},f=a[d-1]||{y:null},null!=f.y&&null!=e.y?i.push(c(f,e)):null!=f.y?i.push(c(f,b)):null!=e.y?i.push(c(b,e)):i.push(null)):i.push(null);return i},c.prototype.hilight=function(a){var b,c,d,e,f;if(null!==this.prevHilight&&this.prevHilight!==a)for(b=c=0,e=this.seriesPoints.length-1;e>=0?e>=c:c>=e;b=e>=0?++c:--c)this.hasToShow(b)&&this.seriesPoints[b][this.prevHilight]&&this.seriesPoints[b][this.prevHilight].animate(this.pointShrinkSeries(b));if(null!==a&&this.prevHilight!==a)for(b=d=0,f=this.seriesPoints.length-1;f>=0?f>=d:d>=f;b=f>=0?++d:--d)this.hasToShow(b)&&this.seriesPoints[b][a]&&this.seriesPoints[b][a].animate(this.pointGrowSeries(b));return this.prevHilight=a},c.prototype.colorFor=function(a,b,c){return"function"==typeof this.options.lineColors?this.options.lineColors.call(this,a,b,c):"point"===c?this.options.pointFillColors[b%this.options.pointFillColors.length]||this.options.lineColors[b%this.options.lineColors.length]:"trendLine"===c?this.options.trendLineColors[b%this.options.trendLineColors.length]:this.options.lineColors[b%this.options.lineColors.length]},c.prototype.drawLinePath=function(a,b,c){var d,e,f,g,h,i,j;if(this.options.animate){for(g="",j=this.data,d=h=0,i=j.length;i>h;d=++h)f=j[d],""===g?c>=this.options.ykeys.length-this.options.nbYkeys2?null!=f._y2[c]&&(g="M"+f._x+","+this.transY2(this.ymin2)):null!=f._y[c]&&(g="M"+f._x+","+this.transY(this.ymin)):c>=this.options.ykeys.length-this.options.nbYkeys2?null!=f._y2[c]&&(g+=","+f._x+","+this.transY2(this.ymin2),"step"===this.options.lineType&&(g+=","+f._x+","+this.transY2(this.ymin2))):null!=f._y[c]&&(g+=","+f._x+","+this.transY(this.ymin),"step"===this.options.lineType&&(g+=","+f._x+","+this.transY(this.ymin)));return e=this.raphael.path(g).attr("stroke",b).attr("stroke-width",this.lineWidthForSeries(c)).attr("class",this.options.extraClassLine).attr("class","line_"+c),this.options.cumulative?function(a,b){return a.animate({path:b},600,"<>")}(e,a):function(a,b){return a.animate({path:b},500,"<>")}(e,a)}return this.raphael.path(a).attr("stroke",b).attr("stroke-width",this.lineWidthForSeries(c)).attr("class",this.options.extraClassLine).attr("class","line_"+c)},c.prototype.drawLinePoint=function(a,b,c,d){return this.raphael.circle(a,b,this.pointSizeForSeries(d)).attr("fill",c).attr("stroke-width",this.pointStrokeWidthForSeries(d)).attr("stroke",this.pointStrokeColorForSeries(d)).attr("class",this.options.extraClassCircle).attr("class","circle_line_"+d)},c.prototype.pointStrokeWidthForSeries=function(a){return this.options.pointStrokeWidths[a%this.options.pointStrokeWidths.length]},c.prototype.pointStrokeColorForSeries=function(a){return this.options.pointStrokeColors[a%this.options.pointStrokeColors.length]},c.prototype.lineWidthForSeries=function(a){return this.options.lineWidth instanceof Array?this.options.lineWidth[a%this.options.lineWidth.length]:this.options.lineWidth},c.prototype.pointSizeForSeries=function(a){return this.options.pointSize instanceof Array?this.options.pointSize[a%this.options.pointSize.length]:this.options.pointSize},c.prototype.pointGrowSeries=function(a){return 0!==this.pointSizeForSeries(a)?Raphael.animation({r:this.pointSizeForSeries(a)+this.options.pointSizeGrow},25,"linear"):void 0},c.prototype.pointShrinkSeries=function(a){return Raphael.animation({r:this.pointSizeForSeries(a)},25,"linear")},c}(a.Grid),a.labelSeries=function(b,c,d,e,f){var g,h,i,j,k,l,m,n,o,p,q;if(i=200*(c-b)/d,h=new Date(b),m=a.LABEL_SPECS[e],void 0===m)for(q=a.AUTO_LABEL_ORDER,o=0,p=q.length;p>o;o++)if(j=q[o],l=a.LABEL_SPECS[j],i>=l.span){m=l;break}for(void 0===m&&(m=a.LABEL_SPECS.second),f&&(m=a.extend({},m,{fmt:f})),g=m.start(h),k=[];(n=g.getTime())<=c;)n>=b&&k.push([m.fmt(g),n]),m.incr(g);return k},c=function(b){return{span:60*b*1e3,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate(),a.getHours())},fmt:function(b){return""+a.pad2(b.getHours())+":"+a.pad2(b.getMinutes())},incr:function(a){return a.setUTCMinutes(a.getUTCMinutes()+b)}}},d=function(b){return{span:1e3*b,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate(),a.getHours(),a.getMinutes())},fmt:function(b){return""+a.pad2(b.getHours())+":"+a.pad2(b.getMinutes())+":"+a.pad2(b.getSeconds())},incr:function(a){return a.setUTCSeconds(a.getUTCSeconds()+b)}}},a.LABEL_SPECS={decade:{span:1728e8,start:function(a){return new Date(a.getFullYear()-a.getFullYear()%10,0,1)},fmt:function(a){return""+a.getFullYear()},incr:function(a){return a.setFullYear(a.getFullYear()+10)}},year:{span:1728e7,start:function(a){return new Date(a.getFullYear(),0,1)},fmt:function(a){return""+a.getFullYear()},incr:function(a){return a.setFullYear(a.getFullYear()+1)}},month:{span:24192e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),1)},fmt:function(b){return""+b.getFullYear()+"-"+a.pad2(b.getMonth()+1)},incr:function(a){return a.setMonth(a.getMonth()+1)}},week:{span:6048e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate())},fmt:function(b){return""+b.getFullYear()+"-"+a.pad2(b.getMonth()+1)+"-"+a.pad2(b.getDate())},incr:function(a){return a.setDate(a.getDate()+7)}},day:{span:864e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate())},fmt:function(b){return""+b.getFullYear()+"-"+a.pad2(b.getMonth()+1)+"-"+a.pad2(b.getDate())},incr:function(a){return a.setDate(a.getDate()+1)}},hour:c(60),"30min":c(30),"15min":c(15),"10min":c(10),"5min":c(5),minute:c(1),"30sec":d(30),"15sec":d(15),"10sec":d(10),"5sec":d(5),second:d(1)},a.AUTO_LABEL_ORDER=["decade","year","month","week","day","hour","30min","15min","10min","5min","minute","30sec","15sec","10sec","5sec","second"],a.Area=function(b){function c(b){var e;return this instanceof a.Area?(e=a.extend({},d,b),this.cumulative=!e.behaveLikeLine,"auto"===e.fillOpacity&&(e.fillOpacity=e.behaveLikeLine?.8:1),void c.__super__.constructor.call(this,e)):new a.Area(b)}var d;return h(c,b),d={fillOpacity:"auto",behaveLikeLine:!1,belowArea:!0,areaColors:[]},c.prototype.calcPoints=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m;for(k=this.data,g=0,i=k.length;i>g;g++)d=k[g],d._x=this.transX(d.x),e=0,d._y=function(){var a,b,c,g;for(c=d.y,g=[],a=0,b=c.length;b>a;a++)f=c[a],this.options.behaveLikeLine?null!=f?g.push(this.transY(f)):g.push(f):null!=f?(e+=f||0,g.push(this.transY(e))):g.push(void 0);return g}.call(this),d._ymax=Math.max.apply(Math,[].concat(function(){var b,c,e,g;for(e=d._y,g=[],a=b=0,c=e.length;c>b;a=++b)f=e[a],null!=f&&g.push(f);return g}()));for(l=this.data,m=[],b=h=0,j=l.length;j>h;b=++h)d=l[b],this.data[b].label_x=[],this.data[b].label_y=[],m.push(function(){var a,e,f;for(f=[],c=a=e=this.options.ykeys.length-1;0>=e?0>=a:a>=0;c=0>=e?++a:--a)null!=d._y[c]&&(this.data[b].label_x[c]=d._x,this.data[b].label_y[c]=d._y[c]-10),null!=d._y2&&null!=d._y2[c]?(this.data[b].label_x[c]=d._x,f.push(this.data[b].label_y[c]=d._y2[c]-10)):f.push(void 0);return f}.call(this));return m},c.prototype.drawSeries=function(){var a,b,c,d,e,f,g,h,i,j;for(this.seriesPoints=[],b=this.options.behaveLikeLine?function(){h=[];for(var a=0,b=this.options.ykeys.length-1;b>=0?b>=a:a>=b;b>=0?a++:a--)h.push(a);return h}.apply(this):function(){i=[];for(var a=g=this.options.ykeys.length-1;0>=g?0>=a:a>=0;0>=g?a++:a--)i.push(a);return i}.apply(this),c=0,e=b.length;e>c;c++)a=b[c],this._drawFillFor(a);for(j=[],d=0,f=b.length;f>d;d++)a=b[d],this._drawLineFor(a),j.push(this._drawPointFor(a));return j},c.prototype._drawFillFor=function(b){var c,d,e,f;return d=this.paths[b],null!==d?this.options.belowArea===!0?(d+="L"+this.transX(this.xmax)+","+this.bottom+"L"+this.transX(this.xmin)+","+this.bottom+"Z",this.drawFilledPath(d,this.fillForSeries(b),b)):(c=function(){var a,b,c;for(b=this.data,c=[],a=b.length-1;a>=0;a+=-1)f=b[a],void 0!==f._y[0]&&c.push({x:f._x,y:f._y[0]});return c}.call(this),e=a.Line.createPath(c,"smooth",this.bottom),d=d+"L"+e.slice(1),this.drawFilledPath(d,this.fillForSeries(b),b)):void 0},c.prototype.fillForSeries=function(a){var b;return 0===this.options.areaColors.length&&(this.options.areaColors=this.options.lineColors),b=Raphael.rgb2hsl(this.options.areaColors[a%this.options.areaColors.length]),Raphael.hsl(b.h,this.options.behaveLikeLine?.9*b.s:.75*b.s,Math.min(.98,this.options.behaveLikeLine?1.2*b.l:1.25*b.l))},c.prototype.drawFilledPath=function(b,c,d){var e,f,g,h,i;return this.options.animate?(e=function(){var a,b,c,e;for(c=this.data,e=[],a=0,b=c.length;b>a;a++)g=c[a],void 0!==g._y[d]&&e.push({x:g._x,y:this.transY(0)});return e}.call(this),i=a.Line.createPath(e,"smooth",this.bottom),this.options.belowArea===!0?i+="L"+this.transX(this.xmax)+","+this.bottom+"L"+this.transX(this.xmin)+","+this.bottom+"Z":(e=function(){var a,b,c;for(b=this.data,c=[],a=b.length-1;a>=0;a+=-1)g=b[a],void 0!==g._y[d]&&c.push({x:g._x,y:this.transY(0)});return c}.call(this),f=a.Line.createPath(e,"smooth",this.bottom),i=i+"L"+f.slice(1)),i+="Z",h=this.raphael.path(i).attr("fill",c).attr("fill-opacity",this.options.fillOpacity).attr("stroke","none"),function(a,b){return a.animate({path:b},500,"<>")}(h,b)):this.raphael.path(b).attr("fill",c).attr("fill-opacity",this.options.fillOpacity).attr("stroke","none")},c}(a.Line),a.Bar=function(b){function c(b){return this.onHoverOut=f(this.onHoverOut,this),this.onHoverMove=f(this.onHoverMove,this),this.onGridClick=f(this.onGridClick,this),this instanceof a.Bar?void c.__super__.constructor.call(this,a.extend({},b,{parseTime:!1})):new a.Bar(b)}return h(c,b),c.prototype.init=function(){return this.cumulative=this.options.stacked,"always"!==this.options.hideHover?(this.hover=new a.Hover({parent:this.el}),this.on("hovermove",this.onHoverMove),this.on("hoverout",this.onHoverOut),this.on("gridclick",this.onGridClick)):void 0},c.prototype.defaults={barSizeRatio:.75,barGap:3,barColors:["#2f7df6","#53a351","#f6c244","#cb444a","#4aa0b5","#222529"],barOpacity:1,barHighlightOpacity:1,highlightSpeed:150,barRadius:[0,0,0,0],xLabelMargin:0,horizontal:!1,stacked:!1,shown:!0,showZero:!0,inBarValue:!1,inBarValueTextColor:"white",inBarValueMinTopMargin:1,inBarValueRightMargin:4,rightAxisBar:!1},c.prototype.calc=function(){var a;return this.calcBars(),this.options.hideHover===!1?(a=this.hover).update.apply(a,this.hoverContentForRow(this.data.length-1)):void 0},c.prototype.calcBars=function(){var a,b,c,d,e,f,g,h;for(g=this.data,h=[],a=e=0,f=g.length;f>e;a=++e)c=g[a],c._x=this.xStart+this.xSize*(a+.5)/this.data.length,c._y=function(){var a,e,f,g;for(f=c.y,g=[],b=a=0,e=f.length;e>a;b=++a)d=f[b],ba;b=++a)d=f[b],b>=this.options.ykeys.length-this.options.nbYkeys2?null!=d?g.push(this.transY2(d)):g.push(null):g.push(void 0);return g}.call(this));return h},c.prototype.draw=function(){var a;return((a=this.options.axes)===!0||"both"===a||"x"===a)&&this.drawXAxis(),this.drawSeries(),this.options.rightAxisBar===!1?(this.drawBarLine(),this.drawBarPoints()):void 0},c.prototype.drawBarLine=function(){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;for(k=this.options.ykeys.length-this.options.nbYkeys2,y=this.options.ykeys.slice(k,this.options.ykeys.length),z=[],h=u=0,w=y.length;w>u;h=u+=1){for(d=y[h],l="",p="",c=this.options.horizontal===!1?function(){var a,b,c,d;for(c=this.data,d=[],a=0,b=c.length;b>a;a++)n=c[a],void 0!==n._y2[k+h]&&d.push({x:n._x,y:n._y2[k+h]});return d}.call(this):function(){var a,b,c,d;for(c=this.data,d=[],a=0,b=c.length;b>a;a++)n=c[a],void 0!==n._y2[k+h]&&d.push({x:n._y2[k+h],y:n._x});return d}.call(this),this.options.smooth&&(f=a.Line.gradients(c)),m={y:null},g=v=0,x=c.length;x>v;g=++v)b=c[g],null!=b.y&&(null!=m.y?(this.options.smooth&&this.options.horizontal===!1?(e=f[g],j=f[g-1],i=(b.x-m.x)/4,q=m.x+i,s=Math.min(this.bottom,m.y+i*j),r=b.x-i,t=Math.min(this.bottom,b.y-i*e),l+="C"+q+","+s+","+r+","+t+","+b.x+","+b.y):l+="L"+b.x+","+b.y,p+=this.options.horizontal===!0?"L"+this.transY(0)+","+b.y:"L"+b.x+","+this.transY(0)):this.options.smooth&&null==f[g]||(l+="M"+b.x+","+b.y,p+=this.options.horizontal===!0?"M"+this.transY(0)+","+b.y:"M"+b.x+","+this.transY(0))),m=b;""!==l?this.options.animate?(o=this.raphael.path(p).attr("stroke",this.options.barColors[k+h]).attr("stroke-width",3),z.push(function(a,b){return a.animate({path:b},500,"<>")}(o,l))):z.push(o=this.raphael.path(l).attr("stroke",this.options.barColors[k+h]).attr("stroke-width",3)):z.push(void 0)}return z},c.prototype.drawBarPoints=function(){var a,b,c,d,e,f,g,h,i,j;for(e=this.options.ykeys.length-this.options.nbYkeys2,this.seriesPoints=[],i=this.options.ykeys.slice(e,this.options.ykeys.length),j=[],d=g=0,h=i.length;h>g;d=g+=1)b=i[d],this.seriesPoints[d]=[],j.push(function(){var b,g,h,i;for(h=this.data,i=[],c=b=0,g=h.length;g>b;c=++b)f=h[c],a=null,null!=f._y2[e+d]?this.options.horizontal===!1?(a=this.raphael.circle(f._x,f._y2[e+d],4).attr("fill",this.options.barColors[e+d]).attr("stroke-width",1).attr("stroke","#ffffff"),i.push(this.seriesPoints[d].push(a))):(a=this.raphael.circle(f._y2[e+d],f._x,4).attr("fill",this.options.barColors[e+d]).attr("stroke-width",1).attr("stroke","#ffffff"),i.push(this.seriesPoints[d].push(a))):i.push(void 0);return i}.call(this));return j},c.prototype.drawXAxis=function(){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;for(c=this.options.horizontal?this.getYAxisLabelX():this.getXAxisLabelY(),l=null,k=null,u=[],e=r=0,s=this.data.length;s>=0?s>r:r>s;e=s>=0?++r:--r)m=this.data[this.data.length-1-e],f=this.options.horizontal?this.drawYAxisLabel(c,m._x-.5*this.options.gridTextSize,m.label,1):this.drawXAxisLabel(m._x,c,m.label),b=this.options.horizontal?0:this.options.xLabelAngle,p=f.getBBox(),f.transform("r"+-b),g=f.getBBox(),f.transform("t0,"+g.height/2+"..."),0!==b&&(j=-.5*p.width*Math.cos(b*Math.PI/180),f.transform("t"+j+",0...")),t=a.dimensions(this.el),q=t.width,d=t.height,this.options.horizontal?(o=g.y,n=g.height,i=d):(o=g.x,n=g.width,i=q),(null==l||l>=o+n||null!=k&&k>=o)&&o>=0&&i>o+n?(0!==b&&(h=1.25*this.options.gridTextSize/Math.sin(b*Math.PI/180),k=o-h),this.options.horizontal?u.push(l=o):u.push(l=o-this.options.xLabelMargin)):u.push(f.remove());return u},c.prototype.getXAxisLabelY=function(){return this.bottom+(this.options.xAxisLabelTopPadding||this.options.padding/2)},c.prototype.drawSeries=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;if(this.seriesBars=[],e=this.xSize/this.options.data.length,this.options.stacked)l=1;else for(l=0,f=t=0,u=this.options.ykeys.length-1;u>=0?u>=t:t>=u;f=u>=0?++t:--t)this.hasToShow(f)&&(l+=1);return this.options.stacked===!1&&this.options.rightAxisBar===!1&&(l-=this.options.nbYkeys2),b=(e*this.options.barSizeRatio-this.options.barGap*(l-1))/l,this.options.barSize&&(b=Math.min(b,this.options.barSize)),p=e-b*l-this.options.barGap*(l-1),j=p/2,s=this.ymin<=0&&this.ymax>=0?this.transY(0):null,this.bars=function(){var f,l,p,t;for(p=this.data,t=[],g=f=0,l=p.length;l>f;g=++f)m=p[g],this.data[g].label_x=[],this.data[g].label_y=[],this.seriesBars[g]=[],h=0,k=this.options.rightAxisBar===!0?m._y.length:m._y.length-this.options.nbYkeys2,t.push(function(){var f,l,p,t;for(p=m._y.slice(0,k),t=[],n=f=0,l=p.length;l>f;n=++f)r=p[n],null!=m._y[n]?r=m._y[n]:null!=m._y2[n]&&(r=m._y2[n]),this.hasToShow(n)&&(null!==r?(s?(q=Math.min(r,s),c=Math.max(r,s)):(q=r,c=this.bottom),i=this.xStart+g*e+j,this.options.stacked||(i+=n*(b+this.options.barGap)),o=c-q,this.options.verticalGridCondition&&this.options.verticalGridCondition(m.x)&&(this.options.horizontal?this.drawBar(this.yStart,this.xStart+g*e,this.ySize,e,this.options.verticalGridColor,this.options.verticalGridOpacity,this.options.barRadius):this.drawBar(this.xStart+g*e,this.yEnd,e,this.ySize,this.options.verticalGridColor,this.options.verticalGridOpacity,this.options.barRadius)),this.options.stacked&&(q-=h),this.options.horizontal?(h-=o,0===o&&(o=1),this.seriesBars[g][n]=this.drawBar(q,i,o,b,this.colorFor(m,n,"bar"),this.options.barOpacity,this.options.barRadius),this.options.dataLabels&&(this.options.stacked||"inside"===this.options.dataLabelsPosition?(this.data[g].label_x[n]=q+o/2,this.data[g].label_y[n]=i+b/2):(this.data[g].label_x[n]=q+o+5,this.data[g].label_y[n]=i+b/2)),this.options.inBarValue&&b>this.options.gridTextSize+2*this.options.inBarValueMinTopMargin?(a=i+.5*b,t.push(this.raphael.text(c-this.options.inBarValueRightMargin,a,this.yLabelFormat(m.y[n],n)).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.inBarValueTextColor).attr("text-anchor","end"))):t.push(void 0)):(h+=o,0===o&&this.options.showZero&&(o=1),this.seriesBars[g][n]=this.drawBar(i,q,b,o,this.colorFor(m,n,"bar"),this.options.barOpacity,this.options.barRadius),this.options.dataLabels?(d="inside"===this.options.dataLabelsPosition||this.options.stacked&&"force_outside"!==this.options.dataLabelsPosition?o/2:-7,o>this.options.dataLabelsSize||!this.options.stacked||"force_outside"===this.options.dataLabelsPosition?(this.data[g].label_x[n]=i+b/2,t.push(this.data[g].label_y[n]=q+d)):t.push(void 0)):t.push(void 0))):t.push(null));return t}.call(this));return t}.call(this)},c.prototype.hilight=function(a){var b,c,d,e,f,g,h,i;if(this.seriesBars&&this.seriesBars[this.prevHilight]&&null!==this.prevHilight&&this.prevHilight!==a)for(h=this.seriesBars[this.prevHilight],b=d=0,f=h.length;f>d;b=++d)c=h[b],c&&c.animate({"fill-opacity":this.options.barOpacity},this.options.highlightSpeed);if(this.seriesBars&&this.seriesBars[a]&&null!==a&&this.prevHilight!==a)for(i=this.seriesBars[a],b=e=0,g=i.length;g>e;b=++e)c=i[b],c&&c.animate({"fill-opacity":this.options.barHighlightOpacity},this.options.highlightSpeed);return this.prevHilight=a},c.prototype.colorFor=function(a,b,c){var d,e;return"function"==typeof this.options.barColors?(d={x:a.x,y:a.y[b],label:a.label,src:a.src},e={index:b,key:this.options.ykeys[b],label:this.options.labels[b]},this.options.barColors.call(this,d,e,c)):this.options.barColors[b%this.options.barColors.length]},c.prototype.hitTest=function(a,b){var c,d;return 0===this.data.length?null:(this.options.horizontal?(c=document.body.getBoundingClientRect(),d=b+c.top):d=a,d=Math.max(Math.min(d,this.xEnd),this.xStart),Math.min(this.data.length-1,Math.floor((d-this.xStart)/(this.xSize/this.data.length))))},c.prototype.onGridClick=function(a,b){var c;return c=this.hitTest(a,b),this.fire("click",c,this.data[c].src,a,b)},c.prototype.onHoverMove=function(a,b){var c,d;return c=this.hitTest(a,b),this.hilight(c),null!=c?(d=this.hover).update.apply(d,this.hoverContentForRow(c)):this.hover.hide()},c.prototype.onHoverOut=function(){return this.hilight(-1),this.options.hideHover!==!1?this.hover.hide():void 0},c.prototype.hoverContentForRow=function(a){var b,c,d,e,f,g,h,i,j,k,l,m;for(f=this.data[a],b="
      "+f.label+"
      ",c=[],m=f.y,e=i=0,k=m.length;k>i;e=++i)h=m[e],c.unshift(h);for(e=j=0,l=c.length;l>j;e=++j)h=c[e],d=f.y.length-1-e,this.options.labels[d]!==!1&&(b+="
      \n "+this.options.labels[d]+":\n "+this.yLabelFormat(h,d)+"\n
      ");return"function"==typeof this.options.hoverCallback&&(b=this.options.hoverCallback(a,this.options,b,f.src)),this.options.horizontal?(g=this.left+.5*this.width,h=this.top+(a+.5)*this.height/this.data.length,[b,g,h,!0]):(g=this.left+(a+.5)*this.width/this.data.length,[b,g])},c.prototype.drawBar=function(a,b,c,d,e,f,g){var h,i;return h=Math.max.apply(Math,g),i=this.options.animate?this.options.horizontal?0===h||h>d?this.raphael.rect(this.transY(0),b,0,d).animate({x:a,width:c},500):this.raphael.path(this.roundedRect(this.transY(0),b+d,c,0,g).animate({y:b,height:d},500)):0===h||h>d?this.raphael.rect(a,this.transY(0),c,0).animate({y:b,height:d},500):this.raphael.path(this.roundedRect(a,this.transY(0),c,0,g).animate({y:b,height:d},500)):0===h||h>d?this.raphael.rect(a,b,c,d):this.raphael.path(this.roundedRect(a,b,c,d,g)),i.attr("fill",e).attr("fill-opacity",f).attr("stroke","none")},c.prototype.roundedRect=function(a,b,c,d,e){return null==e&&(e=[0,0,0,0]),["M",a,e[0]+b,"Q",a,b,a+e[0],b,"L",a+c-e[1],b,"Q",a+c,b,a+c,b+e[1],"L",a+c,b+d-e[2],"Q",a+c,b+d,a+c-e[2],b+d,"L",a+e[3],b+d,"Q",a,b+d,a,b+d-e[3],"Z"]},c}(a.Grid),a.Donut=function(b){function c(b){this.debouncedResizeHandler=f(this.debouncedResizeHandler,this),this.resizeHandler=f(this.resizeHandler,this),this.deselect=f(this.deselect,this),this.select=f(this.select,this),this.click=f(this.click,this);var c,d,e,g,h;if(!(this instanceof a.Donut))return new a.Donut(b);if(this.options=a.extend({},this.defaults,b),"string"==typeof b.element?this.el=document.getElementById(b.element):this.el=b.element[0]||b.element,null===this.el)throw new Error("Graph placeholder not found.");return this.raphael=new Raphael(this.el),void 0===b.data||0===b.data.length?(h=a.dimensions(this.el),g=h.width,e=h.height,c=g/2,d=e/2,void this.raphael.text(c,d,this.options.noDataLabel).attr("text-anchor","middle").attr("font-size",this.options.noDataLabelSize).attr("font-family",this.options.dataLabelsFamily).attr("font-weight",this.options.noDataLabelWeight).attr("fill",this.options.dataLabelsColor)):(this.options.resize&&a.on(window,"resize",this.resizeHandler),void this.setData(b.data))}return h(c,b),c.prototype.defaults={colors:["#2f7df6","#53a351","#f6c244","#cb444a","#4aa0b5","#222529","#44a1f8","#81d453","#f0bb40","#eb3f25","#b45184","#5f5f5f"],backgroundColor:"#FFFFFF",labelColor:"#000000",padding:0,formatter:a.commas,resize:!0,dataLabels:!1,dataLabelsPosition:"inside",dataLabelsFamily:"sans-serif",dataLabelsSize:12,dataLabelsWeight:"normal",dataLabelsColor:"auto",noDataLabel:"No data for this chart",noDataLabelSize:21,noDataLabelWeight:"bold",donutType:"donut",animate:!0,showPercentage:!1,postUnits:"",preUnits:""},c.prototype.destroy=function(){return this.options.resize?(window.clearTimeout(this.timeoutId),a.off(window,"resize",this.resizeHandler)):void 0},c.prototype.redraw=function(){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H;for(this.raphael.clear(),D=a.dimensions(this.el),w=D.width,h=D.height,d=w/2,e=h/2,v=(Math.min(d,e)-10)/3-this.options.padding,t=0,E=this.values,x=0,A=E.length;A>x;x++)u=E[x],t+=u;for(o=5/(2*v),b=1.9999*Math.PI-o*this.data.length,m=0,j=0,this.segments=[],0===t&&(t=1),F=this.values,i=y=0,B=F.length;B>y;i=++y)u=F[i],p=m+o+b*(u/t),s=new a.DonutSegment(d,e,2*v,v,m,p,this.data[i].color||this.options.colors[j%this.options.colors.length],this.options.backgroundColor,j,this.raphael,this.options),s.render(),this.segments.push(s),s.on("hover",this.select),s.on("click",this.click),s.on("mouseout",this.deselect),f=parseFloat(s.raphael.height)>parseFloat(h)?2*h-7*this.options.padding:s.raphael.height-7*this.options.padding,this.options.dataLabels&&this.values.length>1&&(r=Math.sin((m+p)/2),q=Math.cos((m+p)/2),"inside"===this.options.dataLabelsPosition?"pie"===this.options.donutType?(k=parseFloat(d)+parseFloat(.3*f*r),l=parseFloat(e)+parseFloat(.3*f*q)):(k=parseFloat(d)+parseFloat(.39*f*r),l=parseFloat(e)+parseFloat(.39*f*q)):(k=parseFloat(d)+parseFloat(.5*(f-9)*r),l=parseFloat(e)+parseFloat(.5*(f-9)*q)),c="auto"!==this.options.dataLabelsColor?this.options.dataLabelsColor:"inside"===this.options.dataLabelsPosition&&this.isColorDark(this.options.colors[i])===!0?"#fff":"#000",this.options.showPercentage?(g=Math.round(parseFloat(u)/parseFloat(t)*100)+"%",this.drawDataLabelExt(k,l,g,c)):this.drawDataLabelExt(k,l,this.options.preUnits+u+this.options.postUnits,c)),m=p,j+=1;if(this.text1=this.drawEmptyDonutLabel(d,e-10,this.options.labelColor,15,800),this.text2=this.drawEmptyDonutLabel(d,e+10,this.options.labelColor,14),n=Math.max.apply(Math,this.values),j=0,"donut"===this.options.donutType){for(G=this.values,H=[],z=0,C=G.length;C>z;z++){if(u=G[z],u===n){this.select(j);break}H.push(j+=1)}return H}},c.prototype.setData=function(a){var b;return this.data=a,this.values=function(){var a,c,d,e;for(d=this.data,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(parseFloat(b.value));return e}.call(this),this.redraw()},c.prototype.drawDataLabel=function(a,b,c,d){var e;return e=this.raphael.text(a,b,c).attr("text-anchor","middle").attr("font-size",this.options.dataLabelsSize).attr("font-family",this.options.dataLabelsFamily).attr("font-weight",this.options.dataLabelsWeight).attr("fill",this.options.dataLabelsColor)},c.prototype.drawDataLabelExt=function(a,b,c,d){var e,f;return f="inside"===this.options.dataLabelsPosition?"middle":a>this.raphael.width/2?"start":a>.55*this.raphael.width&&a<.45*this.raphael.width?"middle":"end",e=this.raphael.text(a,b,c,d).attr("text-anchor",f).attr("font-size",this.options.dataLabelsSize).attr("font-family",this.options.dataLabelsFamily).attr("font-weight",this.options.dataLabelsWeight).attr("fill",d)},c.prototype.click=function(a){return this.fire("click",a,this.data[a])},c.prototype.select=function(a){var b,c,d,e,f,g;for(g=this.segments,e=0,f=g.length;f>e;e++)c=g[e],c.deselect();return d=this.segments[a],d.select(),b=this.data[a],"donut"===this.options.donutType?this.setLabels(b.label,this.options.formatter(b.value,b)):void 0},c.prototype.deselect=function(a){var b,c,d,e,f;for(e=this.segments,f=[],c=0,d=e.length;d>c;c++)b=e[c],f.push(b.deselect());return f},c.prototype.isColorDark=function(a){var b,c,d,e,f;return null!=a?(a=a.substring(1),f=parseInt(a,16),e=f>>16&255,c=f>>8&255,b=f>>0&255,d=.2126*e+.7152*c+.0722*b,d>=128?!1:!0):!1},c.prototype.setLabels=function(b,c){var d,e,f,g,h,i,j,k,l,m,n;return n=a.dimensions(this.el),m=n.width,d=n.height,e=2*(Math.min(m/2,d/2)-10)/3,h=1.8*e,g=e/2,f=e/3,this.text1.attr({text:b,transform:""}),i=this.text1.getBBox(),j=Math.min(h/i.width,g/i.height),this.text1.attr({transform:"S"+j+","+j+","+(i.x+i.width/2)+","+(i.y+i.height)}),this.text2.attr({text:c,transform:""}),k=this.text2.getBBox(),l=Math.min(h/k.width,f/k.height),this.text2.attr({transform:"S"+l+","+l+","+(k.x+k.width/2)+","+k.y})},c.prototype.drawEmptyDonutLabel=function(a,b,c,d,e){var f;return f=this.raphael.text(a,b,"").attr("font-size",d).attr("fill",c),null!=e&&f.attr("font-weight",e),f},c.prototype.resizeHandler=function(){return null!=this.timeoutId&&window.clearTimeout(this.timeoutId),this.timeoutId=window.setTimeout(this.debouncedResizeHandler,100)},c.prototype.debouncedResizeHandler=function(){var b,c,d;return this.timeoutId=null,d=a.dimensions(this.el),c=d.width,b=d.height,this.raphael.setSize(c,b),this.options.animate=!1,this.redraw()},c}(a.EventEmitter),a.DonutSegment=function(a){function b(a,b,c,d,e,g,h,i,j,k,l){this.cx=a,this.cy=b,this.inner=c,this.outer=d,this.color=h,this.backgroundColor=i,this.index=j,this.raphael=k,this.options=l,this.deselect=f(this.deselect,this),this.select=f(this.select,this),this.sin_p0=Math.sin(e),this.cos_p0=Math.cos(e),this.sin_p1=Math.sin(g),this.cos_p1=Math.cos(g),this.is_long=g-e>Math.PI?1:0,this.path=this.calcSegment(this.inner+3,this.inner+this.outer-5),this.selectedPath=this.calcSegment(this.inner+3,this.inner+this.outer),this.hilight=this.calcArc(this.inner)}return h(b,a),b.prototype.calcArcPoints=function(a){return[this.cx+a*this.sin_p0,this.cy+a*this.cos_p0,this.cx+a*this.sin_p1,this.cy+a*this.cos_p1]},b.prototype.calcSegment=function(a,b){var c,d,e,f,g,h,i,j,k,l;return k=this.calcArcPoints(a),c=k[0],e=k[1],d=k[2],f=k[3],l=this.calcArcPoints(b),g=l[0],i=l[1],h=l[2],j=l[3],"pie"===this.options.donutType?"M"+g+","+i+("A"+b+","+b+",0,"+this.is_long+",0,"+h+","+j)+("L"+this.cx+","+this.cy)+"Z":"M"+c+","+e+("A"+a+","+a+",0,"+this.is_long+",0,"+d+","+f)+("L"+h+","+j)+("A"+b+","+b+",0,"+this.is_long+",1,"+g+","+i)+"Z"},b.prototype.calcArc=function(a){var b,c,d,e,f;return f=this.calcArcPoints(a),b=f[0],d=f[1],c=f[2],e=f[3],"M"+b+","+d+("A"+a+","+a+",0,"+this.is_long+",0,"+c+","+e)},b.prototype.render=function(){var a=this;return/NaN/.test(this.hilight)||(this.arc=this.drawDonutArc(this.hilight,this.color)),/NaN/.test(this.path)?void 0:this.seg=this.drawDonutSegment(this.path,this.color,this.backgroundColor,function(){return a.fire("hover",a.index)},function(){return a.fire("click",a.index)},function(){return a.fire("mouseout",a.index)})},b.prototype.drawDonutArc=function(a,b){var c;return this.options.animate?(c=this.raphael.path("M"+this.cx+","+this.cy+"Z").attr({stroke:b,"stroke-width":2,opacity:0}),function(a,b){return a.animate({path:b},500,"<>")}(c,a)):this.raphael.path(a).attr({stroke:b,"stroke-width":2,opacity:0})},b.prototype.drawDonutSegment=function(a,b,c,d,e,f){var g,h,i;return this.options.animate&&"pie"===this.options.donutType?(i=a,i=a.replace("A",","),i=i.replace("M",""),i=i.replace("C",","),i=i.replace("Z",""),h=i.split(","),i="pie"===this.options.donutType?"M"+h[0]+","+h[1]+","+h[h.length-2]+","+h[h.length-1]+","+h[h.length-2]+","+h[h.length-1]+"Z":"M"+h[0]+","+h[1]+","+h[h.length-2]+","+h[h.length-1]+"Z",g=this.raphael.path(i).attr({fill:b,stroke:c,"stroke-width":3}).hover(d).click(e).mouseout(f), + function(a,b){return a.animate({path:b},500,"<>")}(g,a)):"pie"===this.options.donutType?this.raphael.path(a).attr({fill:b,stroke:c,"stroke-width":3}).hover(d).click(e).mouseout(f):this.raphael.path(a).attr({fill:b,stroke:c,"stroke-width":3}).hover(d).click(e)},b.prototype.select=function(){return this.selected||null==this.seg?void 0:(this.seg.animate({path:this.selectedPath},150,"<>"),this.arc.animate({opacity:1},150,"<>"),this.selected=!0)},b.prototype.deselect=function(){return this.selected?(this.seg.animate({path:this.path},150,"<>"),this.arc.animate({opacity:0},150,"<>"),this.selected=!1):void 0},b}(a.EventEmitter)}).call(this); \ No newline at end of file diff --git a/js/lib/pnotify/NonBlock.js b/js/lib/pnotify/NonBlock.js new file mode 100644 index 00000000..055960d9 --- /dev/null +++ b/js/lib/pnotify/NonBlock.js @@ -0,0 +1,493 @@ +/** + * NonBlock.js + * + * Copyright (c) 2017-2018 Hunter Perrin + * + * @author Hunter Perrin + */ +'use strict'; + +((NonBlock) => { + window.NonBlockJs = { + NonBlock + }; + if (document.body) { + window.NonBlockJs.nonBlock = new NonBlock(document.body); + } else { + document.addEventListener('DOMContentLoaded', () => { + window.NonBlockJs.nonBlock = new NonBlock(document.body); + }); + } +})((() => { + class NonBlock { + constructor(root, mode) { + this.root = root; + + // Detect if we can use "pointer-events". + // Can't use document.documentElement.style because IE9/IE10 report true, + // but only support it on SVG elements, not HTML elements. + const windowStyle = window.getComputedStyle(document.body); + this.pointerEventsSupport = (windowStyle.pointerEvents && windowStyle.pointerEvents === 'auto'); + + // Some useful regexes. + this.regexOn = /^on/; + this.regexMouseEvents = /^(dbl)?click$|^mouse(move|down|up|over|out|enter|leave)$|^contextmenu$/; + this.regexUiEvents = /^(focus|blur|select|change|reset)$|^key(press|down|up)$/; + this.regexHtmlEvents = /^(scroll|resize|(un)?load|abort|error)$/; + // Whether to use event constructors. + this.useEventConstructors = true; + try { + const e = new MouseEvent('click'); + } catch (e) { + this.useEventConstructors = false; + } + + // If mode is not provided, use PointerEvents, if it's supported. + if (typeof mode === 'undefined') { + this.mode = this.pointerEventsSupport ? 'PointerEvents' : 'EventForwarding'; + } else { + this.mode = mode; + } + + // Init the current mode. + if (this['init'+this.mode]) { + this['init'+this.mode](); + } + } + + initPointerEvents() { + // Using pointer-events, we can just detect whether an element is being + // hovered over. No event forwarding necessary. + + this.addCSS(`.nonblock{transition:opacity .1s ease; pointer-events: none;}.nonblock:hover,.nonblock-hover{opacity:.1 !important;}`); + + this.onmousemove = (ev) => { + const nonblocks = document.querySelectorAll('.nonblock'); + + for (let nonblock of nonblocks) { + const rect = nonblock.getBoundingClientRect(); + if (ev.clientX >= rect.left && ev.clientX <= rect.right && ev.clientY >= rect.top && ev.clientY <= rect.bottom) { + if (!nonblock.classList.contains('nonblock-hover')) { + nonblock.classList.add('nonblock-hover'); + if (this.isSimulateMouse(nonblock) && ev.isTrusted) { + this.domEvent(nonblock, 'onmouseenter', ev, false); + this.domEvent(nonblock, 'onmouseover', ev, true); + } + } else if (this.isSimulateMouse(nonblock) && ev.isTrusted) { + this.domEvent(nonblock, 'onmousemove', ev, true); + } + } else { + if (nonblock.classList.contains('nonblock-hover')) { + if (this.isSimulateMouse(nonblock) && ev.isTrusted) { + this.domEvent(nonblock, 'onmouseout', ev, true); + this.domEvent(nonblock, 'onmouseleave', ev, false); + } + nonblock.classList.remove('nonblock-hover'); + } + } + } + }; + + this.root.addEventListener('mousemove', this.onmousemove); + } + + initEventForwarding() { + // No pointer-events means we have to fall back to using event forwarding. + + this.addCSS(`.nonblock{transition:opacity .1s ease;} +.nonblock:hover{opacity:.1 !important;} +.nonblock-hide{position:absolute !important;left:-10000000px !important;right:10000000px !important;} +.nonblock-cursor-auto{cursor:auto !important;} +.nonblock-cursor-default{cursor:default !important;} +.nonblock-cursor-none{cursor:none !important;} +.nonblock-cursor-context-menu{cursor:context-menu !important;} +.nonblock-cursor-help{cursor:help !important;} +.nonblock-cursor-pointer{cursor:pointer !important;} +.nonblock-cursor-progress{cursor:progress !important;} +.nonblock-cursor-wait{cursor:wait !important;} +.nonblock-cursor-cell{cursor:cell !important;} +.nonblock-cursor-crosshair{cursor:crosshair !important;} +.nonblock-cursor-text{cursor:text !important;} +.nonblock-cursor-vertical-text{cursor:vertical-text !important;} +.nonblock-cursor-alias{cursor:alias !important;} +.nonblock-cursor-copy{cursor:copy !important;} +.nonblock-cursor-move{cursor:move !important;} +.nonblock-cursor-no-drop{cursor:no-drop !important;} +.nonblock-cursor-not-allowed{cursor:not-allowed !important;} +.nonblock-cursor-all-scroll{cursor:all-scroll !important;} +.nonblock-cursor-col-resize{cursor:col-resize !important;} +.nonblock-cursor-row-resize{cursor:row-resize !important;} +.nonblock-cursor-n-resize{cursor:n-resize !important;} +.nonblock-cursor-e-resize{cursor:e-resize !important;} +.nonblock-cursor-s-resize{cursor:s-resize !important;} +.nonblock-cursor-w-resize{cursor:w-resize !important;} +.nonblock-cursor-ne-resize{cursor:ne-resize !important;} +.nonblock-cursor-nw-resize{cursor:nw-resize !important;} +.nonblock-cursor-se-resize{cursor:se-resize !important;} +.nonblock-cursor-sw-resize{cursor:sw-resize !important;} +.nonblock-cursor-ew-resize{cursor:ew-resize !important;} +.nonblock-cursor-ns-resize{cursor:ns-resize !important;} +.nonblock-cursor-nesw-resize{cursor:nesw-resize !important;} +.nonblock-cursor-nwse-resize{cursor:nwse-resize !important;} +.nonblock-cursor-zoom-in{cursor:zoom-in !important;} +.nonblock-cursor-zoom-out{cursor:zoom-out !important;} +.nonblock-cursor-grab{cursor:grab !important;} +.nonblock-cursor-grabbing{cursor:grabbing !important;}`); + + // This keeps track of the last element the mouse was over, so + // mouseleave, mouseenter, etc can be called. + this.nonBlockLastElem = null; + // These are used for selecting text under a nonblock element. + this.isOverTextNode = false; + this.selectingText = false; + + this.onmouseenter = (ev) => { + let nonblock; + if (ev.isTrusted && (nonblock = this.getNonBlocking(ev.target))) { + this.nonBlockLastElem = false; + if (!this.isPropagating(nonblock)) { + ev.stopPropagation(); + } + } + }; + this.onmouseleave = (ev) => { + let nonblock; + if (ev.isTrusted && (nonblock = this.getNonBlocking(ev.target))) { + this.remCursor(nonblock); + this.nonBlockLastElem = null; + this.selectingText = false; + if (!this.isPropagating(nonblock)) { + ev.stopPropagation(); + } + } + }; + this.onmouseover = (ev) => { + let nonblock; + if (ev.isTrusted && (nonblock = this.getNonBlocking(ev.target)) && !this.isPropagating(nonblock)) { + ev.stopPropagation(); + } + }; + this.onmouseout = (ev) => { + let nonblock; + if (ev.isTrusted && (nonblock = this.getNonBlocking(ev.target)) && !this.isPropagating(nonblock)) { + ev.stopPropagation(); + } + }; + this.onmousemove = (ev) => { + let nonblock; + if (ev.isTrusted && (nonblock = this.getNonBlocking(ev.target))) { + this.nonblockPass(nonblock, ev, 'onmousemove'); + // If the user just clicks somewhere, we don't want to select text, so this + // detects that the user moved their mouse. + if (this.selectingText === null) { + window.getSelection().removeAllRanges(); + this.selectingText = true; + } else if (this.selectingText) { + // Stop the default action, which would be selecting text. + ev.preventDefault(); + } + if (!this.isPropagating(nonblock)) { + ev.stopPropagation(); + } + } + }; + this.onmousedown = (ev) => { + let nonblock; + if (ev.isTrusted && (nonblock = this.getNonBlocking(ev.target))) { + this.nonblockPass(nonblock, ev, 'onmousedown'); + this.selectingText = null; + if (!this.isFocusable(nonblock)) { + // Stop the default action, which would focus the element. + ev.preventDefault(); + } + if (!this.isPropagating(nonblock) || !this.isActionPropagating(nonblock)) { + ev.stopPropagation(); + } + } + }; + this.onmouseup = (ev) => { + let nonblock; + if (ev.isTrusted && (nonblock = this.getNonBlocking(ev.target))) { + this.nonblockPass(nonblock, ev, 'onmouseup'); + if (this.selectingText === null) { + window.getSelection().removeAllRanges(); + } + this.selectingText = false; + if (!this.isPropagating(nonblock) || !this.isActionPropagating(nonblock)) { + ev.stopPropagation(); + } + } + }; + this.onclick = (ev) => { + let nonblock; + if (ev.isTrusted && (nonblock = this.getNonBlocking(ev.target))) { + this.nonblockPass(nonblock, ev, 'onclick'); + if (!this.isPropagating(nonblock) || !this.isActionPropagating(nonblock)) { + ev.stopPropagation(); + } + } + }; + this.ondblclick = (ev) => { + let nonblock; + if (ev.isTrusted && (nonblock = this.getNonBlocking(ev.target))) { + this.nonblockPass(nonblock, ev, 'ondblclick'); + if (!this.isPropagating(nonblock) || !this.isActionPropagating(nonblock)) { + ev.stopPropagation(); + } + } + }; + + this.root.addEventListener('mouseenter', this.onmouseenter, true); + this.root.addEventListener('mouseleave', this.onmouseleave, true); + this.root.addEventListener('mouseover', this.onmouseover, true); + this.root.addEventListener('mouseout', this.onmouseout, true); + this.root.addEventListener('mousemove', this.onmousemove, true); + this.root.addEventListener('mousedown', this.onmousedown, true); + this.root.addEventListener('mouseup', this.onmouseup, true); + this.root.addEventListener('click', this.onclick, true); + this.root.addEventListener('dblclick', this.ondblclick, true); + } + + destroy() { + for (let event of ['mouseenter', 'mouseleave', 'mouseover', 'mouseout', 'mousemove', 'mousedown', 'mouseup', 'click', 'dblclick']) { + if (this['on'+event]) { + this.root.removeEventListener(event, this['on'+event], true); + delete this['on'+event]; + } + } + this.styling.parentNode.removeChild(this.styling); + delete this.styling; + } + + addCSS(css) { + this.styling = document.createElement('style'); + this.styling.setAttribute('type', 'text/css'); + if (this.styling.styleSheet) { + this.styling.styleSheet.cssText = css; // IE + } else { + this.styling.appendChild(document.createTextNode(css)); + } + document.getElementsByTagName('head')[0].appendChild(this.styling); + } + + // Fire a DOM event. + domEvent(elem, event, origEvent, bubbles) { + let eventObject; + event = event.toLowerCase(); + if (this.useEventConstructors) { + // New browsers + event = event.replace(this.regexOn, ''); + if (event.match(this.regexMouseEvents)) { + eventObject = new MouseEvent(event, { + screenX: origEvent.screenX, + screenY: origEvent.screenY, + clientX: origEvent.clientX, + clientY: origEvent.clientY, + ctrlKey: origEvent.ctrlKey, + shiftKey: origEvent.shiftKey, + altKey: origEvent.altKey, + metaKey: origEvent.metaKey, + button: origEvent.button, + buttons: origEvent.buttons, + relatedTarget: origEvent.relatedTarget, + region: origEvent.region, + + detail: origEvent.detail, + view: origEvent.view, + + bubbles: bubbles === undefined ? origEvent.bubbles : bubbles, + cancelable: origEvent.cancelable, + composed: origEvent.composed + }); + } else if (event.match(this.regexUiEvents)) { + eventObject = new UIEvent(event, { + detail: origEvent.detail, + view: origEvent.view, + + bubbles: bubbles === undefined ? origEvent.bubbles : bubbles, + cancelable: origEvent.cancelable, + composed: origEvent.composed + }); + } else if (event.match(this.regexHtmlEvents)) { + eventObject = new Event(event, { + bubbles: bubbles === undefined ? origEvent.bubbles : bubbles, + cancelable: origEvent.cancelable, + composed: origEvent.composed + }); + } + if (!eventObject) { + return; + } + elem.dispatchEvent(eventObject); + } else if (document.createEvent && elem.dispatchEvent) { + // Old method for FireFox, Opera, Safari, Chrome + event = event.replace(this.regexOn, ''); + if (event.match(this.regexMouseEvents)) { + // This allows the click event to fire on the notice. There is + // probably a much better way to do it. + elem.getBoundingClientRect(); + eventObject = document.createEvent("MouseEvents"); + eventObject.initMouseEvent(event, bubbles === undefined ? origEvent.bubbles : bubbles, origEvent.cancelable, origEvent.view, origEvent.detail, origEvent.screenX, origEvent.screenY, origEvent.clientX, origEvent.clientY, origEvent.ctrlKey, origEvent.altKey, origEvent.shiftKey, origEvent.metaKey, origEvent.button, origEvent.relatedTarget); + } else if (event.match(this.regexUiEvents)) { + eventObject = document.createEvent("UIEvents"); + eventObject.initUIEvent(event, bubbles === undefined ? origEvent.bubbles : bubbles, origEvent.cancelable, origEvent.view, origEvent.detail); + } else if (event.match(this.regexHtmlEvents)) { + eventObject = document.createEvent("HTMLEvents"); + eventObject.initEvent(event, bubbles === undefined ? origEvent.bubbles : bubbles, origEvent.cancelable); + } + if (!eventObject) { + return; + } + elem.dispatchEvent(eventObject); + } else { + // Internet Explorer + if (!event.match(this.regexOn)) { + event = "on"+event + }; + eventObject = document.createEventObject(origEvent); + elem.fireEvent(event, eventObject); + } + } + + // This is used to pass events through the el if it is nonblocking. + nonblockPass(elem, event, eventName) { + elem.classList.add('nonblock-hide'); + const elBelow = document.elementFromPoint(event.clientX, event.clientY); + if (this.nonBlockLastElem === false) { + this.nonBlockLastElem = elBelow; + } + let range, textNode, whitespaceBefore, text, offset; + if (document.caretPositionFromPoint) { + range = document.caretPositionFromPoint(event.clientX, event.clientY); + textNode = range ? range.offsetNode : null; + offset = range ? range.offset : null; + } else if (document.caretRangeFromPoint) { + range = document.caretRangeFromPoint(event.clientX, event.clientY); + textNode = range ? range.endContainer : null; + offset = range ? range.endOffset : null; + } + if (range) { + whitespaceBefore = range.startContainer.textContent.match(/^[\s\n]*/)[0]; + text = range.startContainer.textContent.replace(/[\s\n]+$/g, ''); + } + + elem.classList.remove('nonblock-hide'); + let cursorStyle = this.getCursor(elBelow); + this.isOverTextNode = false; + if (cursorStyle === 'auto' && elBelow.tagName === 'A') { + cursorStyle = 'pointer'; + } else if (range && (!whitespaceBefore.length || offset > whitespaceBefore.length) && offset < text.length) { + if (cursorStyle === 'auto') { + cursorStyle = 'text'; + } + this.isOverTextNode = true; + } + + if (range && this.selectingText && offset > 0) { + const selection = window.getSelection(); + let selectionRange; + if (selection.rangeCount === 0) { + this.selectingText = { + originContainer: range.startContainer ? range.startContainer : textNode, + originOffset: offset - 1 + }; + selectionRange = document.createRange(); + selection.addRange(selectionRange); + } else { + selectionRange = selection.getRangeAt(0); + } + + if ( + (textNode === this.selectingText.originContainer && offset < this.selectingText.originOffset) + || (textNode.compareDocumentPosition(this.selectingText.originContainer) & Node.DOCUMENT_POSITION_FOLLOWING) + ) { + selectionRange.setEnd(this.selectingText.originContainer, this.selectingText.originOffset); + selectionRange.setStart(textNode, offset); + } else { + selectionRange.setStart(this.selectingText.originContainer, this.selectingText.originOffset); + selectionRange.setEnd(textNode, offset); + } + } + + this.setCursor(elem, cursorStyle !== 'auto' ? cursorStyle : 'default'); + // If the element changed, call mouseenter, mouseleave, etc. + if (!this.nonBlockLastElem || this.nonBlockLastElem !== elBelow) { + if (this.nonBlockLastElem) { + const lastElem = this.nonBlockLastElem; + if (!lastElem.contains(elBelow)) { + this.domEvent(lastElem, 'mouseleave', event, false); + } + this.domEvent(lastElem, 'mouseout', event, true); + if (!elBelow.contains(lastElem)) { + this.domEvent(elBelow, 'mouseenter', event, false); + } + } else if (!elBelow.contains(elem)) { + this.domEvent(elBelow, 'mouseenter', event, false); + } + this.domEvent(elBelow, 'mouseover', event, true); + } + + // If the event is mousedown, then we need to focus the element. + if (eventName === 'onmousedown') { + document.activeElement && document.activeElement.blur(); + elBelow.focus({preventScroll: true}); + } + + // Forward the event. + this.domEvent(elBelow, eventName, event); + // Remember the latest element the mouse was over. + this.nonBlockLastElem = elBelow; + } + + getNonBlocking(el) { + let nonblock = el; + while (nonblock) { + if (nonblock.classList && nonblock.classList.contains('nonblock')) { + return nonblock; + } + nonblock = nonblock.parentNode; + } + return false; + } + + isPropagating(el) { + return !el.classList.contains('nonblock-stop-propagation'); + } + + isActionPropagating(el) { + return el.classList.contains('nonblock-allow-action-propagation'); + } + + isFocusable(el) { + return el.classList.contains('nonblock-allow-focus'); + } + + isSimulateMouse(el) { + return !el.classList.contains('nonblock-stop-mouse-simulation'); + } + + getCursor(el) { + const style = window.getComputedStyle(el); + return style.getPropertyValue('cursor'); + } + + setCursor(el, value) { + if (el.classList.contains('nonblock-cursor-' + value)) { + return; + } + this.remCursor(el); + el.classList.add('nonblock-cursor-' + value); + } + + remCursor(el) { + const values = Object.keys(el.classList).map(e => el.classList[e]); + [...values].forEach((className) => { + if (className.indexOf('nonblock-cursor-') === 0) { + el.classList.remove(className); + } + }); + } + } + + return NonBlock; +})()); \ No newline at end of file diff --git a/js/lib/pnotify/PNotify.js b/js/lib/pnotify/PNotify.js new file mode 100644 index 00000000..d5db1ca1 --- /dev/null +++ b/js/lib/pnotify/PNotify.js @@ -0,0 +1,2039 @@ +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +/* src/PNotify.html generated by Svelte v2.16.1 */ +(function (global, factory) { + (typeof exports === "undefined" ? "undefined" : _typeof(exports)) === "object" && typeof module !== "undefined" ? module.exports = factory() : typeof define === "function" && define.amd ? define('PNotify', factory) : global.PNotify = factory(); +})(this, function () { + "use strict"; + + var PNotify = void 0; + + var posTimer = void 0; // Position all timer. + + // These actions need to be done once the DOM is ready. + var onDocumentLoaded = function onDocumentLoaded() { + PNotify.defaultStack.context = document.body; + // Reposition the notices when the window resizes. + window.addEventListener('resize', function () { + if (posTimer) { + clearTimeout(posTimer); + } + posTimer = setTimeout(function () { + PNotify.positionAll(); + }, 10); + }); + }; + + // Creates the background overlay for modal stacks. + var createStackOverlay = function createStackOverlay(stack) { + var overlay = document.createElement('div'); + overlay.classList.add('ui-pnotify-modal-overlay'); + if (stack.context !== document.body) { + overlay.style.height = stack.context.scrollHeight + 'px'; + overlay.style.width = stack.context.scrollWidth + 'px'; + } + // Close the notices on overlay click. + overlay.addEventListener('click', function () { + if (stack.overlayClose) { + PNotify.closeStack(stack); + } + }); + stack.overlay = overlay; + }; + + var insertStackOverlay = function insertStackOverlay(stack) { + if (stack.overlay.parentNode !== stack.context) { + stack.overlay = stack.context.insertBefore(stack.overlay, stack.context.firstChild); + } + }; + + var removeStackOverlay = function removeStackOverlay(stack) { + if (stack.overlay.parentNode) { + stack.overlay.parentNode.removeChild(stack.overlay); + } + }; + + // Default arguments for the new notice helper functions. + var getDefaultArgs = function getDefaultArgs(options, type) { + if ((typeof options === "undefined" ? "undefined" : _typeof(options)) !== 'object') { + options = { 'text': options }; + } + + // Only assign the type if it was requested, so we don't overwrite + // options.type if it has something assigned. + if (type) { + options.type = type; + } + + return { target: document.body, data: options }; + }; + + function _styles(_ref) { + var styling = _ref.styling; + + return (typeof styling === "undefined" ? "undefined" : _typeof(styling)) === 'object' ? styling : PNotify.styling[styling]; + } + + function _icons(_ref2) { + var icons = _ref2.icons; + + return (typeof icons === "undefined" ? "undefined" : _typeof(icons)) === 'object' ? icons : PNotify.icons[icons]; + } + + function _widthStyle(_ref3) { + var width = _ref3.width; + + return typeof width === 'string' ? 'width: ' + width + ';' : ''; + } + + function _minHeightStyle(_ref4) { + var minHeight = _ref4.minHeight; + + return typeof minHeight === 'string' ? 'min-height: ' + minHeight + ';' : ''; + } + + function data() { + var data = _extends({ + '_state': 'initializing', // The state can be 'initializing', 'opening', 'open', 'closing', and 'closed'. + '_timer': null, // Auto close timer. + '_animTimer': null, // Animation timer. + '_animating': false, // Stores what is currently being animated (in or out). + '_animatingClass': '', // Stores the class that adds entry/exit animation effects. + '_moveClass': '', // Stores the class that adds movement animation effects. + '_timerHide': false, // Stores whether the notice was hidden by a timer. + '_moduleClasses': [], // Modules can add classes here to be added to the notice element. (They should play nice and not remove classes that aren't theirs.) + '_moduleIsNoticeOpen': false, // Modules that change how the notice displays (causing the notice element to not appear) can set this to true to make PNotify assume the notice has opened. + '_modules': {}, // Stores the instances of the modules. + '_modulesPrependContainer': PNotify.modulesPrependContainer, + '_modulesAppendContainer': PNotify.modulesAppendContainer + }, PNotify.defaults); + data.modules = _extends({}, PNotify.defaults.modules); + return data; + }; + + var methods = { + // This runs an event on all the modules. + runModules: function runModules(event) { + if (event === 'init') { + // Initializing a module should only be done if it has an init + // function, which means it's not rendered in the template. + for (var key in PNotify.modules) { + if (!PNotify.modules.hasOwnProperty(key)) { + continue; + } + if (typeof PNotify.modules[key].init === 'function') { + var _module = PNotify.modules[key].init(this); + this.initModule(_module); + } + } + } else { + var _get = this.get(), + _modules = _get._modules; + + for (var _module2 in _modules) { + if (!_modules.hasOwnProperty(_module2)) { + continue; + } + var moduleOptions = _extends({ + '_notice': this, + '_options': this.get() + }, this.get().modules[_module2]); + _modules[_module2].set(moduleOptions); + if (typeof _modules[_module2][event] === 'function') { + _modules[_module2][event](); + } + } + } + }, + + + // This passes module options to a module. + initModule: function initModule(module) { + var _get2 = this.get(), + modules = _get2.modules; + + if (!modules.hasOwnProperty(module.constructor.key)) { + modules[module.constructor.key] = {}; + } + var moduleOptions = _extends({ + '_notice': this, + '_options': this.get() + }, modules[module.constructor.key]); + module.initModule(moduleOptions); + + // Now save the module instance. + + var _get3 = this.get(), + _modules = _get3._modules; + + _modules[module.constructor.key] = module; + }, + update: function update(options) { + // Save old options. + var oldHide = this.get().hide; + var oldIcon = this.get().icon; + + this.set(options); + + // Run the modules. + this.runModules('update'); + + // Update the timed hiding. + if (!this.get().hide) { + this.cancelClose(); + } else if (!oldHide) { + this.queueClose(); + } + this.queuePosition(); + + // Font Awesome 5 replaces our lovely element with a gross SVG. In order + // to make it play nice with Svelte, we have to clear the element and + // make it again. + + var _get4 = this.get(), + icon = _get4.icon; + + if (icon !== oldIcon && (icon === true && this.get().icons === 'fontawesome5' || typeof icon === 'string' && icon.match(/(^| )fa[srlb]($| )/))) { + this.set({ 'icon': false }); + this.set({ 'icon': icon }); + } + + return this; + }, + + + // Display the notice. + open: function open() { + var _this = this; + + var _get5 = this.get(), + _state = _get5._state, + hide = _get5.hide; + + if (_state === 'opening') { + return; + } + if (_state === 'open') { + if (hide) { + this.queueClose(); + } + return; + } + this.set({ + '_state': 'opening', + // This makes the notice visibity: hidden; so its dimensions can be + // determined. + '_animatingClass': 'ui-pnotify-initial-hidden' + }); + // Run the modules. + this.runModules('beforeOpen'); + + var _get6 = this.get(), + stack = _get6.stack; + // If the notice is not in the DOM, or in the wrong context, append it. + + + if (!this.refs.elem.parentNode || stack && stack.context && stack.context !== this.refs.elem.parentNode) { + if (stack && stack.context) { + stack.context.appendChild(this.refs.elem); + } else if (document.body) { + document.body.appendChild(this.refs.elem); + } else { + throw new Error('No context to open this notice in.'); + } + } + + // Wait until the DOM is updated. + setTimeout(function () { + if (stack) { + // Mark the stack so it won't animate the new notice. + stack.animation = false; + // Now position all the notices. + PNotify.positionAll(); + // Reset animation. + stack.animation = true; + } + + _this.animateIn(function () { + // Now set it to hide. + if (_this.get().hide) { + _this.queueClose(); + } + + _this.set({ '_state': 'open' }); + + // Run the modules. + _this.runModules('afterOpen'); + }); + }, 0); + + return this; + }, + remove: function remove(timerHide) { + return this.close(timerHide); + }, + + + // Remove the notice. + close: function close(timerHide) { + var _this2 = this; + + var _get7 = this.get(), + _state = _get7._state; + + if (_state === 'closing' || _state === 'closed') { + return; + } + this.set({ '_state': 'closing', '_timerHide': !!timerHide }); // Make sure it's a boolean. + // Run the modules. + this.runModules('beforeClose'); + + var _get8 = this.get(), + _timer = _get8._timer; + + if (_timer && clearTimeout) { + clearTimeout(_timer); + this.set({ '_timer': null }); + } + this.animateOut(function () { + _this2.set({ '_state': 'closed' }); + // Run the modules. + _this2.runModules('afterClose'); + _this2.queuePosition(); + // If we're supposed to remove the notice from the DOM, do it. + if (_this2.get().remove) { + _this2.refs.elem.parentNode.removeChild(_this2.refs.elem); + } + // Run the modules. + _this2.runModules('beforeDestroy'); + // Remove object from PNotify.notices to prevent memory leak (issue #49) + // unless destroy is off + if (_this2.get().destroy) { + if (PNotify.notices !== null) { + var idx = PNotify.notices.indexOf(_this2); + if (idx !== -1) { + PNotify.notices.splice(idx, 1); + } + } + } + // Run the modules. + _this2.runModules('afterDestroy'); + }); + + return this; + }, + + + // Animate the notice in. + animateIn: function animateIn(callback) { + var _this3 = this; + + // Declare that the notice is animating in. + this.set({ '_animating': 'in' }); + var finished = function finished() { + _this3.refs.elem.removeEventListener('transitionend', finished); + + var _get9 = _this3.get(), + _animTimer = _get9._animTimer, + _animating = _get9._animating, + _moduleIsNoticeOpen = _get9._moduleIsNoticeOpen; + + if (_animTimer) { + clearTimeout(_animTimer); + } + if (_animating !== 'in') { + return; + } + var visible = _moduleIsNoticeOpen; + if (!visible) { + var domRect = _this3.refs.elem.getBoundingClientRect(); + for (var prop in domRect) { + if (domRect[prop] > 0) { + visible = true; + break; + } + } + } + if (visible) { + if (callback) { + callback.call(); + } + // Declare that the notice has completed animating. + _this3.set({ '_animating': false }); + } else { + _this3.set({ '_animTimer': setTimeout(finished, 40) }); + } + }; + + if (this.get().animation === 'fade') { + this.refs.elem.addEventListener('transitionend', finished); + this.set({ '_animatingClass': 'ui-pnotify-in' }); + // eslint-disable-next-line no-unused-expressions + this.refs.elem.style.opacity; // This line is necessary for some reason. Some notices don't fade without it. + this.set({ '_animatingClass': 'ui-pnotify-in ui-pnotify-fade-in' }); + // Just in case the event doesn't fire, call it after 650 ms. + this.set({ '_animTimer': setTimeout(finished, 650) }); + } else { + this.set({ '_animatingClass': 'ui-pnotify-in' }); + finished(); + } + }, + + + // Animate the notice out. + animateOut: function animateOut(callback) { + var _this4 = this; + + // Declare that the notice is animating out. + this.set({ '_animating': 'out' }); + var finished = function finished() { + _this4.refs.elem.removeEventListener('transitionend', finished); + + var _get10 = _this4.get(), + _animTimer = _get10._animTimer, + _animating = _get10._animating, + _moduleIsNoticeOpen = _get10._moduleIsNoticeOpen; + + if (_animTimer) { + clearTimeout(_animTimer); + } + if (_animating !== 'out') { + return; + } + var visible = _moduleIsNoticeOpen; + if (!visible) { + var domRect = _this4.refs.elem.getBoundingClientRect(); + for (var prop in domRect) { + if (domRect[prop] > 0) { + visible = true; + break; + } + } + } + if (!_this4.refs.elem.style.opacity || _this4.refs.elem.style.opacity === '0' || !visible) { + _this4.set({ '_animatingClass': '' }); + + var _get11 = _this4.get(), + stack = _get11.stack; + + if (stack && stack.overlay) { + // Go through the modal stack to see if any are left open. + // TODO: Rewrite this cause it sucks. + var stillOpen = false; + for (var i = 0; i < PNotify.notices.length; i++) { + var notice = PNotify.notices[i]; + if (notice !== _this4 && notice.get().stack === stack && notice.get()._state !== 'closed') { + stillOpen = true; + break; + } + } + if (!stillOpen) { + removeStackOverlay(stack); + } + } + if (callback) { + callback.call(); + } + // Declare that the notice has completed animating. + _this4.set({ '_animating': false }); + } else { + // In case this was called before the notice finished animating. + _this4.set({ '_animTimer': setTimeout(finished, 40) }); + } + }; + + if (this.get().animation === 'fade') { + this.refs.elem.addEventListener('transitionend', finished); + this.set({ '_animatingClass': 'ui-pnotify-in' }); + // Just in case the event doesn't fire, call it after 650 ms. + this.set({ '_animTimer': setTimeout(finished, 650) }); + } else { + this.set({ '_animatingClass': '' }); + finished(); + } + }, + + + // Position the notice. + position: function position() { + // Get the notice's stack. + var _get12 = this.get(), + stack = _get12.stack; + + var elem = this.refs.elem; + if (!stack) { + return; + } + if (!stack.context) { + stack.context = document.body; + } + if (typeof stack.nextpos1 !== 'number') { + stack.nextpos1 = stack.firstpos1; + } + if (typeof stack.nextpos2 !== 'number') { + stack.nextpos2 = stack.firstpos2; + } + if (typeof stack.addpos2 !== 'number') { + stack.addpos2 = 0; + } + + // Skip this notice if it's not shown. + if (!elem.classList.contains('ui-pnotify-in') && !elem.classList.contains('ui-pnotify-initial-hidden')) { + return this; + } + + if (stack.modal) { + if (!stack.overlay) { + createStackOverlay(stack); + } + insertStackOverlay(stack); + } + + // Read from the DOM to cause refresh. + elem.getBoundingClientRect(); + + if (stack.animation) { + // Add animate class. + this.set({ '_moveClass': 'ui-pnotify-move' }); + } + + var spaceY = stack.context === document.body ? window.innerHeight : stack.context.scrollHeight; + var spaceX = stack.context === document.body ? window.innerWidth : stack.context.scrollWidth; + + var csspos1 = void 0; + + if (stack.dir1) { + csspos1 = { + 'down': 'top', + 'up': 'bottom', + 'left': 'right', + 'right': 'left' + }[stack.dir1]; + + // Calculate the current pos1 value. + var curpos1 = void 0; + switch (stack.dir1) { + case 'down': + curpos1 = elem.offsetTop; + break; + case 'up': + curpos1 = spaceY - elem.scrollHeight - elem.offsetTop; + break; + case 'left': + curpos1 = spaceX - elem.scrollWidth - elem.offsetLeft; + break; + case 'right': + curpos1 = elem.offsetLeft; + break; + } + // Remember the first pos1, so the first notice goes there. + if (typeof stack.firstpos1 === 'undefined') { + stack.firstpos1 = curpos1; + stack.nextpos1 = stack.firstpos1; + } + } + + if (stack.dir1 && stack.dir2) { + var csspos2 = { + 'down': 'top', + 'up': 'bottom', + 'left': 'right', + 'right': 'left' + }[stack.dir2]; + + // Calculate the current pos2 value. + var curpos2 = void 0; + switch (stack.dir2) { + case 'down': + curpos2 = elem.offsetTop; + break; + case 'up': + curpos2 = spaceY - elem.scrollHeight - elem.offsetTop; + break; + case 'left': + curpos2 = spaceX - elem.scrollWidth - elem.offsetLeft; + break; + case 'right': + curpos2 = elem.offsetLeft; + break; + } + // Remember the first pos2, so the first notice goes there. + if (typeof stack.firstpos2 === 'undefined') { + stack.firstpos2 = curpos2; + stack.nextpos2 = stack.firstpos2; + } + + // Check that it's not beyond the viewport edge. + var endY = stack.nextpos1 + elem.offsetHeight + (typeof stack.spacing1 === 'undefined' ? 25 : stack.spacing1); + var endX = stack.nextpos1 + elem.offsetWidth + (typeof stack.spacing1 === 'undefined' ? 25 : stack.spacing1); + if ((stack.dir1 === 'down' || stack.dir1 === 'up') && endY > spaceY || (stack.dir1 === 'left' || stack.dir1 === 'right') && endX > spaceX) { + // If it is, it needs to go back to the first pos1, and over on pos2. + stack.nextpos1 = stack.firstpos1; + stack.nextpos2 += stack.addpos2 + (typeof stack.spacing2 === 'undefined' ? 25 : stack.spacing2); + stack.addpos2 = 0; + } + + // Move the notice on dir2. + if (typeof stack.nextpos2 === 'number') { + elem.style[csspos2] = stack.nextpos2 + 'px'; + if (!stack.animation) { + // eslint-disable-next-line no-unused-expressions + elem.style[csspos2]; // Read from the DOM for update. + } + } + + // Keep track of the widest/tallest notice in the column/row, so we can push the next column/row. + switch (stack.dir2) { + case 'down': + case 'up': + if (elem.offsetHeight + (parseFloat(elem.style.marginTop, 10) || 0) + (parseFloat(elem.style.marginBottom, 10) || 0) > stack.addpos2) { + stack.addpos2 = elem.offsetHeight; + } + break; + case 'left': + case 'right': + if (elem.offsetWidth + (parseFloat(elem.style.marginLeft, 10) || 0) + (parseFloat(elem.style.marginRight, 10) || 0) > stack.addpos2) { + stack.addpos2 = elem.offsetWidth; + } + break; + } + } else if (stack.dir1) { + // Center the notice along dir1 axis, because the stack has no dir2. + var cssMiddle = void 0, + cssposCross = void 0; + switch (stack.dir1) { + case 'down': + case 'up': + cssposCross = ['left', 'right']; + cssMiddle = stack.context.scrollWidth / 2 - elem.offsetWidth / 2; + break; + case 'left': + case 'right': + cssposCross = ['top', 'bottom']; + cssMiddle = spaceY / 2 - elem.offsetHeight / 2; + break; + } + elem.style[cssposCross[0]] = cssMiddle + 'px'; + elem.style[cssposCross[1]] = 'auto'; + if (!stack.animation) { + // eslint-disable-next-line no-unused-expressions + elem.style[cssposCross[0]]; // Read from the DOM for update. + } + } + + if (stack.dir1) { + // Move the notice on dir1. + if (typeof stack.nextpos1 === 'number') { + elem.style[csspos1] = stack.nextpos1 + 'px'; + if (!stack.animation) { + // eslint-disable-next-line no-unused-expressions + elem.style[csspos1]; // Read from the DOM for update. + } + } + + // Calculate the next dir1 position. + switch (stack.dir1) { + case 'down': + case 'up': + stack.nextpos1 += elem.offsetHeight + (typeof stack.spacing1 === 'undefined' ? 25 : stack.spacing1); + break; + case 'left': + case 'right': + stack.nextpos1 += elem.offsetWidth + (typeof stack.spacing1 === 'undefined' ? 25 : stack.spacing1); + break; + } + } else { + // Center the notice on the screen, because the stack has no dir1. + var cssMiddleLeft = spaceX / 2 - elem.offsetWidth / 2; + var cssMiddleTop = spaceY / 2 - elem.offsetHeight / 2; + elem.style.left = cssMiddleLeft + 'px'; + elem.style.top = cssMiddleTop + 'px'; + if (!stack.animation) { + // eslint-disable-next-line no-unused-expressions + elem.style.left; // Read from the DOM for update. + } + } + + return this; + }, + + + // Queue the position all function so it doesn't run repeatedly and + // use up resources. + queuePosition: function queuePosition(milliseconds) { + if (posTimer) { + clearTimeout(posTimer); + } + if (!milliseconds) { + milliseconds = 10; + } + posTimer = setTimeout(function () { + PNotify.positionAll(); + }, milliseconds); + return this; + }, + cancelRemove: function cancelRemove() { + return this.cancelClose(); + }, + + + // Cancel any pending removal timer. + cancelClose: function cancelClose() { + var _get13 = this.get(), + _timer = _get13._timer, + _animTimer = _get13._animTimer, + _state = _get13._state, + animation = _get13.animation; + + if (_timer) { + clearTimeout(_timer); + } + if (_animTimer) { + clearTimeout(_animTimer); + } + if (_state === 'closing') { + // If it's animating out, stop it. + this.set({ + '_state': 'open', + '_animating': false, + '_animatingClass': animation === 'fade' ? 'ui-pnotify-in ui-pnotify-fade-in' : 'ui-pnotify-in' + }); + } + return this; + }, + queueRemove: function queueRemove() { + return this.queueClose(); + }, + + + // Queue a close timer. + queueClose: function queueClose() { + var _this5 = this; + + // Cancel any current close timer. + this.cancelClose(); + this.set({ + '_timer': setTimeout(function () { + return _this5.close(true); + }, isNaN(this.get().delay) ? 0 : this.get().delay) + }); + return this; + }, + addModuleClass: function addModuleClass() { + var _get14 = this.get(), + _moduleClasses = _get14._moduleClasses; + + for (var _len = arguments.length, classNames = Array(_len), _key = 0; _key < _len; _key++) { + classNames[_key] = arguments[_key]; + } + + for (var i = 0; i < classNames.length; i++) { + var className = classNames[i]; + if (_moduleClasses.indexOf(className) === -1) { + _moduleClasses.push(className); + } + } + this.set({ _moduleClasses: _moduleClasses }); + }, + removeModuleClass: function removeModuleClass() { + var _get15 = this.get(), + _moduleClasses = _get15._moduleClasses; + + for (var _len2 = arguments.length, classNames = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + classNames[_key2] = arguments[_key2]; + } + + for (var i = 0; i < classNames.length; i++) { + var className = classNames[i]; + var idx = _moduleClasses.indexOf(className); + if (idx !== -1) { + _moduleClasses.splice(idx, 1); + } + } + this.set({ _moduleClasses: _moduleClasses }); + }, + hasModuleClass: function hasModuleClass() { + var _get16 = this.get(), + _moduleClasses = _get16._moduleClasses; + + for (var _len3 = arguments.length, classNames = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + classNames[_key3] = arguments[_key3]; + } + + for (var i = 0; i < classNames.length; i++) { + var className = classNames[i]; + if (_moduleClasses.indexOf(className) === -1) { + return false; + } + } + return true; + } + }; + + function oncreate() { + var _this6 = this; + + this.on('mouseenter', function (e) { + // Stop animation, reset the removal timer when the user mouses over. + if (_this6.get().mouseReset && _this6.get()._animating === 'out') { + if (!_this6.get()._timerHide) { + return; + } + _this6.cancelClose(); + } + // Stop the close timer. + if (_this6.get().hide && _this6.get().mouseReset) { + _this6.cancelClose(); + } + }); + + this.on('mouseleave', function (e) { + // Start the close timer. + if (_this6.get().hide && _this6.get().mouseReset && _this6.get()._animating !== 'out') { + _this6.queueClose(); + } + PNotify.positionAll(); + }); + + var _get17 = this.get(), + stack = _get17.stack; + + // Add the notice to the notice array. + + + if (stack && stack.push === 'top') { + PNotify.notices.splice(0, 0, this); + } else { + PNotify.notices.push(this); + } + + // Run the modules. + this.runModules('init'); + + // We're now initialized, but haven't been opened yet. + this.set({ '_state': 'closed' }); + + // Display the notice. + if (this.get().autoDisplay) { + this.open(); + } + }; + + function setup(Component) { + // Add static properties to the PNotify object. + PNotify = Component; + + PNotify.VERSION = '4.0.0'; + + PNotify.defaultStack = { + dir1: 'down', + dir2: 'left', + firstpos1: 25, + firstpos2: 25, + spacing1: 36, + spacing2: 36, + push: 'bottom', + context: window && document.body + }; + + PNotify.defaults = { + // The notice's title. + title: false, + // Whether to trust the title or escape its contents. (Not allow HTML.) + titleTrusted: false, + // The notice's text. + text: false, + // Whether to trust the text or escape its contents. (Not allow HTML.) + textTrusted: false, + // What styling classes to use. (Can be 'brighttheme', 'bootstrap3', 'bootstrap4', or a styling object.) + styling: 'brighttheme', + // What icons to use (Can be 'brighttheme', 'bootstrap3', 'fontawesome4', 'fontawesome5', or an icon object.) + icons: 'brighttheme', + // Additional classes to be added to the notice. (For custom styling.) + addClass: '', + // Class to be added to the notice for corner styling. + cornerClass: '', + // Display the notice when it is created. + autoDisplay: true, + // Width of the notice. + width: '360px', + // Minimum height of the notice. It will expand to fit content. + minHeight: '16px', + // Type of the notice. 'notice', 'info', 'success', or 'error'. + type: 'notice', + // Set icon to true to use the default icon for the selected + // style/type, false for no icon, or a string for your own icon class. + icon: true, + // The animation to use when displaying and hiding the notice. 'none' + // and 'fade' are supported through CSS. Others are supported + // through the Animate module and Animate.css. + animation: 'fade', + // Speed at which the notice animates in and out. 'slow', 'normal', + // or 'fast'. Respectively, 400ms, 250ms, 100ms. + animateSpeed: 'normal', + // Display a drop shadow. + shadow: true, + // After a delay, remove the notice. + hide: true, + // Delay in milliseconds before the notice is removed. + delay: 8000, + // Reset the hide timer if the mouse moves over the notice. + mouseReset: true, + // Remove the notice's elements from the DOM after it is removed. + remove: true, + // Whether to remove the notice from the global array when it is closed. + destroy: true, + // The stack on which the notices will be placed. Also controls the + // direction the notices stack. + stack: PNotify.defaultStack, + // This is where options for modules should be defined. + modules: {} + }; + + // An array of all active notices. + PNotify.notices = []; + + // This object holds all the PNotify modules. They are used to provide + // additional functionality. + PNotify.modules = {}; + + // Modules can add themselves to these to be rendered in the template. + PNotify.modulesPrependContainer = []; + PNotify.modulesAppendContainer = []; + + // Helper function to create a new notice. + PNotify.alert = function (options) { + return new PNotify(getDefaultArgs(options)); + }; + // Helper function to create a new notice (notice type). + PNotify.notice = function (options) { + return new PNotify(getDefaultArgs(options, 'notice')); + }; + // Helper function to create a new notice (info type). + PNotify.info = function (options) { + return new PNotify(getDefaultArgs(options, 'info')); + }; + // Helper function to create a new notice (success type). + PNotify.success = function (options) { + return new PNotify(getDefaultArgs(options, 'success')); + }; + // Helper function to create a new notice (error type). + PNotify.error = function (options) { + return new PNotify(getDefaultArgs(options, 'error')); + }; + + PNotify.removeAll = function () { + PNotify.closeAll(); + }; + + // Close all notices. + PNotify.closeAll = function () { + for (var i = 0; i < PNotify.notices.length; i++) { + if (PNotify.notices[i].close) { + PNotify.notices[i].close(false); + } + } + }; + + PNotify.removeStack = function (stack) { + PNotify.closeStack(stack); + }; + + // Close all notices in a single stack. + PNotify.closeStack = function (stack) { + if (stack === false) { + return; + } + for (var i = 0; i < PNotify.notices.length; i++) { + if (PNotify.notices[i].close && PNotify.notices[i].get().stack === stack) { + PNotify.notices[i].close(false); + } + } + }; + + // Position all notices. + PNotify.positionAll = function () { + // This timer is used for queueing this function so it doesn't run + // repeatedly. + if (posTimer) { + clearTimeout(posTimer); + } + posTimer = null; + // Reset the next position data. + if (PNotify.notices.length > 0) { + for (var i = 0; i < PNotify.notices.length; i++) { + var notice = PNotify.notices[i]; + + var _notice$get = notice.get(), + stack = _notice$get.stack; + + if (!stack) { + continue; + } + if (stack.overlay) { + removeStackOverlay(stack); + } + stack.nextpos1 = stack.firstpos1; + stack.nextpos2 = stack.firstpos2; + stack.addpos2 = 0; + } + for (var _i = 0; _i < PNotify.notices.length; _i++) { + PNotify.notices[_i].position(); + } + } else { + delete PNotify.defaultStack.nextpos1; + delete PNotify.defaultStack.nextpos2; + } + }; + + PNotify.styling = { + brighttheme: { + // Bright Theme doesn't require any UI libraries. + container: 'brighttheme', + notice: 'brighttheme-notice', + info: 'brighttheme-info', + success: 'brighttheme-success', + error: 'brighttheme-error' + }, + bootstrap3: { + container: 'alert', + notice: 'alert-warning', + info: 'alert-info', + success: 'alert-success', + error: 'alert-danger', + icon: 'ui-pnotify-icon-bs3' + }, + bootstrap4: { + container: 'alert', + notice: 'alert-warning', + info: 'alert-info', + success: 'alert-success', + error: 'alert-danger', + icon: 'ui-pnotify-icon-bs4', + title: 'ui-pnotify-title-bs4' + } + }; + + // icons are separate from the style, since bs4 doesn't come with any + PNotify.icons = { + brighttheme: { + notice: 'brighttheme-icon-notice', + info: 'brighttheme-icon-info', + success: 'brighttheme-icon-success', + error: 'brighttheme-icon-error' + }, + bootstrap3: { + notice: 'glyphicon glyphicon-exclamation-sign', + info: 'glyphicon glyphicon-info-sign', + success: 'glyphicon glyphicon-ok-sign', + error: 'glyphicon glyphicon-warning-sign' + }, + // User must have Font Awesome v4.0+ + fontawesome4: { + notice: 'fa fa-exclamation-circle', + info: 'fa fa-info-circle', + success: 'fa fa-check-circle', + error: 'fa fa-exclamation-triangle' + }, + // User must have Font Awesome v5.0+ + fontawesome5: { + notice: 'fas fa-exclamation-circle', + info: 'fas fa-info-circle', + success: 'fas fa-check-circle', + error: 'fas fa-exclamation-triangle' + } + }; + + // Run the deferred actions once the DOM is ready. + if (window && document.body) { + onDocumentLoaded(); + } else { + document.addEventListener('DOMContentLoaded', onDocumentLoaded); + } + } + + function add_css() { + var style = createElement("style"); + style.id = 'svelte-1eldsjg-style'; + style.textContent = "body > .ui-pnotify{position:fixed;z-index:100040}body > .ui-pnotify.ui-pnotify-modal{z-index:100042}.ui-pnotify{position:absolute;height:auto;z-index:1;display:none}.ui-pnotify.ui-pnotify-modal{z-index:3}.ui-pnotify.ui-pnotify-in{display:block}.ui-pnotify.ui-pnotify-initial-hidden{display:block;visibility:hidden}.ui-pnotify.ui-pnotify-move{transition:left .5s ease, top .5s ease, right .5s ease, bottom .5s ease}.ui-pnotify.ui-pnotify-fade-slow{transition:opacity .4s linear;opacity:0}.ui-pnotify.ui-pnotify-fade-slow.ui-pnotify.ui-pnotify-move{transition:opacity .4s linear, left .5s ease, top .5s ease, right .5s ease, bottom .5s ease}.ui-pnotify.ui-pnotify-fade-normal{transition:opacity .25s linear;opacity:0}.ui-pnotify.ui-pnotify-fade-normal.ui-pnotify.ui-pnotify-move{transition:opacity .25s linear, left .5s ease, top .5s ease, right .5s ease, bottom .5s ease}.ui-pnotify.ui-pnotify-fade-fast{transition:opacity .1s linear;opacity:0}.ui-pnotify.ui-pnotify-fade-fast.ui-pnotify.ui-pnotify-move{transition:opacity .1s linear, left .5s ease, top .5s ease, right .5s ease, bottom .5s ease}.ui-pnotify.ui-pnotify-fade-in{opacity:1}.ui-pnotify .ui-pnotify-shadow{-webkit-box-shadow:0px 6px 28px 0px rgba(0,0,0,0.1);-moz-box-shadow:0px 6px 28px 0px rgba(0,0,0,0.1);box-shadow:0px 6px 28px 0px rgba(0,0,0,0.1)}.ui-pnotify-container{background-position:0 0;padding:.8em;height:100%;margin:0}.ui-pnotify-container:after{content:\" \";visibility:hidden;display:block;height:0;clear:both}.ui-pnotify-container.ui-pnotify-sharp{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.ui-pnotify-title{display:block;white-space:pre-line;margin-bottom:.4em;margin-top:0}.ui-pnotify.ui-pnotify-with-icon .ui-pnotify-title,.ui-pnotify.ui-pnotify-with-icon .ui-pnotify-text{margin-left:24px}[dir=rtl] .ui-pnotify.ui-pnotify-with-icon .ui-pnotify-title,[dir=rtl] .ui-pnotify.ui-pnotify-with-icon .ui-pnotify-text{margin-right:24px;margin-left:0}.ui-pnotify-title-bs4{font-size:1.2rem}.ui-pnotify-text{display:block;white-space:pre-line}.ui-pnotify-icon,.ui-pnotify-icon span{display:block;float:left}[dir=rtl] .ui-pnotify-icon,[dir=rtl] .ui-pnotify-icon span{float:right}.ui-pnotify-icon-bs3 > span{position:relative;top:2px}.ui-pnotify-icon-bs4 > span{position:relative;top:4px}.ui-pnotify-modal-overlay{background-color:rgba(0, 0, 0, .4);top:0;left:0;position:absolute;height:100%;width:100%;z-index:2}body > .ui-pnotify-modal-overlay{position:fixed;z-index:100041}"; + append(document.head, style); + } + + function get_each1_context(ctx, list, i) { + var child_ctx = Object.create(ctx); + child_ctx.module = list[i]; + return child_ctx; + } + + function get_each0_context(ctx, list, i) { + var child_ctx = Object.create(ctx); + child_ctx.module = list[i]; + return child_ctx; + } + + function create_main_fragment(component, ctx) { + var div1, + div0, + each0_blocks_1 = [], + each0_lookup = blankObject(), + text0, + text1, + text2, + text3, + each1_blocks_1 = [], + each1_lookup = blankObject(), + div0_class_value, + div0_style_value, + div1_class_value; + + var each0_value = ctx._modulesPrependContainer; + + var get_key = function get_key(ctx) { + return ctx.module.key; + }; + + for (var i = 0; i < each0_value.length; i += 1) { + var child_ctx = get_each0_context(ctx, each0_value, i); + var key = get_key(child_ctx); + each0_blocks_1[i] = each0_lookup[key] = create_each_block_1(component, key, child_ctx); + } + + var if_block0 = ctx.icon !== false && create_if_block_4(component, ctx); + + var if_block1 = ctx.title !== false && create_if_block_2(component, ctx); + + var if_block2 = ctx.text !== false && create_if_block(component, ctx); + + var each1_value = ctx._modulesAppendContainer; + + var get_key_1 = function get_key_1(ctx) { + return ctx.module.key; + }; + + for (var i = 0; i < each1_value.length; i += 1) { + var _child_ctx = get_each1_context(ctx, each1_value, i); + var _key4 = get_key_1(_child_ctx); + each1_blocks_1[i] = each1_lookup[_key4] = create_each_block(component, _key4, _child_ctx); + } + + function mouseover_handler(event) { + component.fire("mouseover", event); + } + + function mouseout_handler(event) { + component.fire("mouseout", event); + } + + function mouseenter_handler(event) { + component.fire("mouseenter", event); + } + + function mouseleave_handler(event) { + component.fire("mouseleave", event); + } + + function mousemove_handler(event) { + component.fire("mousemove", event); + } + + function mousedown_handler(event) { + component.fire("mousedown", event); + } + + function mouseup_handler(event) { + component.fire("mouseup", event); + } + + function click_handler(event) { + component.fire("click", event); + } + + function dblclick_handler(event) { + component.fire("dblclick", event); + } + + function focus_handler(event) { + component.fire("focus", event); + } + + function blur_handler(event) { + component.fire("blur", event); + } + + function touchstart_handler(event) { + component.fire("touchstart", event); + } + + function touchmove_handler(event) { + component.fire("touchmove", event); + } + + function touchend_handler(event) { + component.fire("touchend", event); + } + + function touchcancel_handler(event) { + component.fire("touchcancel", event); + } + + return { + c: function c() { + div1 = createElement("div"); + div0 = createElement("div"); + + for (i = 0; i < each0_blocks_1.length; i += 1) { + each0_blocks_1[i].c(); + }text0 = createText("\n "); + if (if_block0) if_block0.c(); + text1 = createText("\n "); + if (if_block1) if_block1.c(); + text2 = createText("\n "); + if (if_block2) if_block2.c(); + text3 = createText("\n "); + + for (i = 0; i < each1_blocks_1.length; i += 1) { + each1_blocks_1[i].c(); + }div0.className = div0_class_value = "\n ui-pnotify-container\n " + (ctx._styles.container ? ctx._styles.container : '') + "\n " + (ctx._styles[ctx.type] ? ctx._styles[ctx.type] : '') + "\n " + ctx.cornerClass + "\n " + (ctx.shadow ? 'ui-pnotify-shadow' : '') + "\n "; + div0.style.cssText = div0_style_value = "" + ctx._widthStyle + " " + ctx._minHeightStyle; + setAttribute(div0, "role", "alert"); + addListener(div1, "mouseover", mouseover_handler); + addListener(div1, "mouseout", mouseout_handler); + addListener(div1, "mouseenter", mouseenter_handler); + addListener(div1, "mouseleave", mouseleave_handler); + addListener(div1, "mousemove", mousemove_handler); + addListener(div1, "mousedown", mousedown_handler); + addListener(div1, "mouseup", mouseup_handler); + addListener(div1, "click", click_handler); + addListener(div1, "dblclick", dblclick_handler); + addListener(div1, "focus", focus_handler); + addListener(div1, "blur", blur_handler); + addListener(div1, "touchstart", touchstart_handler); + addListener(div1, "touchmove", touchmove_handler); + addListener(div1, "touchend", touchend_handler); + addListener(div1, "touchcancel", touchcancel_handler); + div1.className = div1_class_value = "\n ui-pnotify\n " + (ctx.icon !== false ? 'ui-pnotify-with-icon' : '') + "\n " + (ctx._styles.element ? ctx._styles.element : '') + "\n " + ctx.addClass + "\n " + ctx._animatingClass + "\n " + ctx._moveClass + "\n " + (ctx.animation === 'fade' ? 'ui-pnotify-fade-' + ctx.animateSpeed : '') + "\n " + (ctx.stack && ctx.stack.modal ? 'ui-pnotify-modal' : '') + "\n " + ctx._moduleClasses.join(' ') + "\n "; + setAttribute(div1, "aria-live", "assertive"); + setAttribute(div1, "role", "alertdialog"); + setAttribute(div1, "ui-pnotify", true); + }, + m: function m(target, anchor) { + insert(target, div1, anchor); + append(div1, div0); + + for (i = 0; i < each0_blocks_1.length; i += 1) { + each0_blocks_1[i].m(div0, null); + }append(div0, text0); + if (if_block0) if_block0.m(div0, null); + append(div0, text1); + if (if_block1) if_block1.m(div0, null); + append(div0, text2); + if (if_block2) if_block2.m(div0, null); + append(div0, text3); + + for (i = 0; i < each1_blocks_1.length; i += 1) { + each1_blocks_1[i].m(div0, null); + }component.refs.container = div0; + component.refs.elem = div1; + }, + p: function p(changed, ctx) { + var each0_value = ctx._modulesPrependContainer; + each0_blocks_1 = updateKeyedEach(each0_blocks_1, component, changed, get_key, 1, ctx, each0_value, each0_lookup, div0, destroyBlock, create_each_block_1, "m", text0, get_each0_context); + + if (ctx.icon !== false) { + if (if_block0) { + if_block0.p(changed, ctx); + } else { + if_block0 = create_if_block_4(component, ctx); + if_block0.c(); + if_block0.m(div0, text1); + } + } else if (if_block0) { + if_block0.d(1); + if_block0 = null; + } + + if (ctx.title !== false) { + if (if_block1) { + if_block1.p(changed, ctx); + } else { + if_block1 = create_if_block_2(component, ctx); + if_block1.c(); + if_block1.m(div0, text2); + } + } else if (if_block1) { + if_block1.d(1); + if_block1 = null; + } + + if (ctx.text !== false) { + if (if_block2) { + if_block2.p(changed, ctx); + } else { + if_block2 = create_if_block(component, ctx); + if_block2.c(); + if_block2.m(div0, text3); + } + } else if (if_block2) { + if_block2.d(1); + if_block2 = null; + } + + var each1_value = ctx._modulesAppendContainer; + each1_blocks_1 = updateKeyedEach(each1_blocks_1, component, changed, get_key_1, 1, ctx, each1_value, each1_lookup, div0, destroyBlock, create_each_block, "m", null, get_each1_context); + + if ((changed._styles || changed.type || changed.cornerClass || changed.shadow) && div0_class_value !== (div0_class_value = "\n ui-pnotify-container\n " + (ctx._styles.container ? ctx._styles.container : '') + "\n " + (ctx._styles[ctx.type] ? ctx._styles[ctx.type] : '') + "\n " + ctx.cornerClass + "\n " + (ctx.shadow ? 'ui-pnotify-shadow' : '') + "\n ")) { + div0.className = div0_class_value; + } + + if ((changed._widthStyle || changed._minHeightStyle) && div0_style_value !== (div0_style_value = "" + ctx._widthStyle + " " + ctx._minHeightStyle)) { + div0.style.cssText = div0_style_value; + } + + if ((changed.icon || changed._styles || changed.addClass || changed._animatingClass || changed._moveClass || changed.animation || changed.animateSpeed || changed.stack || changed._moduleClasses) && div1_class_value !== (div1_class_value = "\n ui-pnotify\n " + (ctx.icon !== false ? 'ui-pnotify-with-icon' : '') + "\n " + (ctx._styles.element ? ctx._styles.element : '') + "\n " + ctx.addClass + "\n " + ctx._animatingClass + "\n " + ctx._moveClass + "\n " + (ctx.animation === 'fade' ? 'ui-pnotify-fade-' + ctx.animateSpeed : '') + "\n " + (ctx.stack && ctx.stack.modal ? 'ui-pnotify-modal' : '') + "\n " + ctx._moduleClasses.join(' ') + "\n ")) { + div1.className = div1_class_value; + } + }, + d: function d(detach) { + if (detach) { + detachNode(div1); + } + + for (i = 0; i < each0_blocks_1.length; i += 1) { + each0_blocks_1[i].d(); + }if (if_block0) if_block0.d(); + if (if_block1) if_block1.d(); + if (if_block2) if_block2.d(); + + for (i = 0; i < each1_blocks_1.length; i += 1) { + each1_blocks_1[i].d(); + }if (component.refs.container === div0) component.refs.container = null; + removeListener(div1, "mouseover", mouseover_handler); + removeListener(div1, "mouseout", mouseout_handler); + removeListener(div1, "mouseenter", mouseenter_handler); + removeListener(div1, "mouseleave", mouseleave_handler); + removeListener(div1, "mousemove", mousemove_handler); + removeListener(div1, "mousedown", mousedown_handler); + removeListener(div1, "mouseup", mouseup_handler); + removeListener(div1, "click", click_handler); + removeListener(div1, "dblclick", dblclick_handler); + removeListener(div1, "focus", focus_handler); + removeListener(div1, "blur", blur_handler); + removeListener(div1, "touchstart", touchstart_handler); + removeListener(div1, "touchmove", touchmove_handler); + removeListener(div1, "touchend", touchend_handler); + removeListener(div1, "touchcancel", touchcancel_handler); + if (component.refs.elem === div1) component.refs.elem = null; + } + }; + } + + // (53:4) {#each _modulesPrependContainer as module (module.key)} + function create_each_block_1(component, key_1, ctx) { + var first, switch_instance_anchor; + + var switch_value = ctx.module; + + function switch_props(ctx) { + return { + root: component.root, + store: component.store + }; + } + + if (switch_value) { + var switch_instance = new switch_value(switch_props(ctx)); + } + + function switch_instance_init(event) { + component.initModule(event.module); + } + + if (switch_instance) switch_instance.on("init", switch_instance_init); + + return { + key: key_1, + + first: null, + + c: function c() { + first = createComment(); + if (switch_instance) switch_instance._fragment.c(); + switch_instance_anchor = createComment(); + this.first = first; + }, + m: function m(target, anchor) { + insert(target, first, anchor); + + if (switch_instance) { + switch_instance._mount(target, anchor); + } + + insert(target, switch_instance_anchor, anchor); + }, + p: function p(changed, ctx) { + if (switch_value !== (switch_value = ctx.module)) { + if (switch_instance) { + switch_instance.destroy(); + } + + if (switch_value) { + switch_instance = new switch_value(switch_props(ctx)); + switch_instance._fragment.c(); + switch_instance._mount(switch_instance_anchor.parentNode, switch_instance_anchor); + + switch_instance.on("init", switch_instance_init); + } else { + switch_instance = null; + } + } + }, + d: function d(detach) { + if (detach) { + detachNode(first); + detachNode(switch_instance_anchor); + } + + if (switch_instance) switch_instance.destroy(detach); + } + }; + } + + // (56:4) {#if icon !== false} + function create_if_block_4(component, ctx) { + var div, span, span_class_value, div_class_value; + + return { + c: function c() { + div = createElement("div"); + span = createElement("span"); + span.className = span_class_value = ctx.icon === true ? ctx._icons[ctx.type] ? ctx._icons[ctx.type] : '' : ctx.icon; + div.className = div_class_value = "ui-pnotify-icon " + (ctx._styles.icon ? ctx._styles.icon : ''); + }, + m: function m(target, anchor) { + insert(target, div, anchor); + append(div, span); + component.refs.iconContainer = div; + }, + p: function p(changed, ctx) { + if ((changed.icon || changed._icons || changed.type) && span_class_value !== (span_class_value = ctx.icon === true ? ctx._icons[ctx.type] ? ctx._icons[ctx.type] : '' : ctx.icon)) { + span.className = span_class_value; + } + + if (changed._styles && div_class_value !== (div_class_value = "ui-pnotify-icon " + (ctx._styles.icon ? ctx._styles.icon : ''))) { + div.className = div_class_value; + } + }, + d: function d(detach) { + if (detach) { + detachNode(div); + } + + if (component.refs.iconContainer === div) component.refs.iconContainer = null; + } + }; + } + + // (61:4) {#if title !== false} + function create_if_block_2(component, ctx) { + var h4, h4_class_value; + + function select_block_type(ctx) { + if (ctx.titleTrusted) return create_if_block_3; + return create_else_block_1; + } + + var current_block_type = select_block_type(ctx); + var if_block = current_block_type(component, ctx); + + return { + c: function c() { + h4 = createElement("h4"); + if_block.c(); + h4.className = h4_class_value = "ui-pnotify-title " + (ctx._styles.title ? ctx._styles.title : ''); + }, + m: function m(target, anchor) { + insert(target, h4, anchor); + if_block.m(h4, null); + component.refs.titleContainer = h4; + }, + p: function p(changed, ctx) { + if (current_block_type === (current_block_type = select_block_type(ctx)) && if_block) { + if_block.p(changed, ctx); + } else { + if_block.d(1); + if_block = current_block_type(component, ctx); + if_block.c(); + if_block.m(h4, null); + } + + if (changed._styles && h4_class_value !== (h4_class_value = "ui-pnotify-title " + (ctx._styles.title ? ctx._styles.title : ''))) { + h4.className = h4_class_value; + } + }, + d: function d(detach) { + if (detach) { + detachNode(h4); + } + + if_block.d(); + if (component.refs.titleContainer === h4) component.refs.titleContainer = null; + } + }; + } + + // (65:8) {:else} + function create_else_block_1(component, ctx) { + var text; + + return { + c: function c() { + text = createText(ctx.title); + }, + m: function m(target, anchor) { + insert(target, text, anchor); + }, + p: function p(changed, ctx) { + if (changed.title) { + setData(text, ctx.title); + } + }, + d: function d(detach) { + if (detach) { + detachNode(text); + } + } + }; + } + + // (63:8) {#if titleTrusted} + function create_if_block_3(component, ctx) { + var raw_before, raw_after; + + return { + c: function c() { + raw_before = createElement('noscript'); + raw_after = createElement('noscript'); + }, + m: function m(target, anchor) { + insert(target, raw_before, anchor); + raw_before.insertAdjacentHTML("afterend", ctx.title); + insert(target, raw_after, anchor); + }, + p: function p(changed, ctx) { + if (changed.title) { + detachBetween(raw_before, raw_after); + raw_before.insertAdjacentHTML("afterend", ctx.title); + } + }, + d: function d(detach) { + if (detach) { + detachBetween(raw_before, raw_after); + detachNode(raw_before); + detachNode(raw_after); + } + } + }; + } + + // (70:4) {#if text !== false} + function create_if_block(component, ctx) { + var div, div_class_value; + + function select_block_type_1(ctx) { + if (ctx.textTrusted) return create_if_block_1; + return create_else_block; + } + + var current_block_type = select_block_type_1(ctx); + var if_block = current_block_type(component, ctx); + + return { + c: function c() { + div = createElement("div"); + if_block.c(); + div.className = div_class_value = "ui-pnotify-text " + (ctx._styles.text ? ctx._styles.text : ''); + setAttribute(div, "role", "alert"); + }, + m: function m(target, anchor) { + insert(target, div, anchor); + if_block.m(div, null); + component.refs.textContainer = div; + }, + p: function p(changed, ctx) { + if (current_block_type === (current_block_type = select_block_type_1(ctx)) && if_block) { + if_block.p(changed, ctx); + } else { + if_block.d(1); + if_block = current_block_type(component, ctx); + if_block.c(); + if_block.m(div, null); + } + + if (changed._styles && div_class_value !== (div_class_value = "ui-pnotify-text " + (ctx._styles.text ? ctx._styles.text : ''))) { + div.className = div_class_value; + } + }, + d: function d(detach) { + if (detach) { + detachNode(div); + } + + if_block.d(); + if (component.refs.textContainer === div) component.refs.textContainer = null; + } + }; + } + + // (74:8) {:else} + function create_else_block(component, ctx) { + var text; + + return { + c: function c() { + text = createText(ctx.text); + }, + m: function m(target, anchor) { + insert(target, text, anchor); + }, + p: function p(changed, ctx) { + if (changed.text) { + setData(text, ctx.text); + } + }, + d: function d(detach) { + if (detach) { + detachNode(text); + } + } + }; + } + + // (72:8) {#if textTrusted} + function create_if_block_1(component, ctx) { + var raw_before, raw_after; + + return { + c: function c() { + raw_before = createElement('noscript'); + raw_after = createElement('noscript'); + }, + m: function m(target, anchor) { + insert(target, raw_before, anchor); + raw_before.insertAdjacentHTML("afterend", ctx.text); + insert(target, raw_after, anchor); + }, + p: function p(changed, ctx) { + if (changed.text) { + detachBetween(raw_before, raw_after); + raw_before.insertAdjacentHTML("afterend", ctx.text); + } + }, + d: function d(detach) { + if (detach) { + detachBetween(raw_before, raw_after); + detachNode(raw_before); + detachNode(raw_after); + } + } + }; + } + + // (79:4) {#each _modulesAppendContainer as module (module.key)} + function create_each_block(component, key_1, ctx) { + var first, switch_instance_anchor; + + var switch_value = ctx.module; + + function switch_props(ctx) { + return { + root: component.root, + store: component.store + }; + } + + if (switch_value) { + var switch_instance = new switch_value(switch_props(ctx)); + } + + function switch_instance_init(event) { + component.initModule(event.module); + } + + if (switch_instance) switch_instance.on("init", switch_instance_init); + + return { + key: key_1, + + first: null, + + c: function c() { + first = createComment(); + if (switch_instance) switch_instance._fragment.c(); + switch_instance_anchor = createComment(); + this.first = first; + }, + m: function m(target, anchor) { + insert(target, first, anchor); + + if (switch_instance) { + switch_instance._mount(target, anchor); + } + + insert(target, switch_instance_anchor, anchor); + }, + p: function p(changed, ctx) { + if (switch_value !== (switch_value = ctx.module)) { + if (switch_instance) { + switch_instance.destroy(); + } + + if (switch_value) { + switch_instance = new switch_value(switch_props(ctx)); + switch_instance._fragment.c(); + switch_instance._mount(switch_instance_anchor.parentNode, switch_instance_anchor); + + switch_instance.on("init", switch_instance_init); + } else { + switch_instance = null; + } + } + }, + d: function d(detach) { + if (detach) { + detachNode(first); + detachNode(switch_instance_anchor); + } + + if (switch_instance) switch_instance.destroy(detach); + } + }; + } + + function PNotify_1(options) { + var _this7 = this; + + init(this, options); + this.refs = {}; + this._state = assign(data(), options.data); + + this._recompute({ styling: 1, icons: 1, width: 1, minHeight: 1 }, this._state); + this._intro = true; + + if (!document.getElementById("svelte-1eldsjg-style")) add_css(); + + this._fragment = create_main_fragment(this, this._state); + + this.root._oncreate.push(function () { + oncreate.call(_this7); + _this7.fire("update", { changed: assignTrue({}, _this7._state), current: _this7._state }); + }); + + if (options.target) { + this._fragment.c(); + this._mount(options.target, options.anchor); + + flush(this); + } + } + + assign(PNotify_1.prototype, { + destroy: destroy, + get: get, + fire: fire, + on: on, + set: set, + _set: _set, + _stage: _stage, + _mount: _mount, + _differs: _differs + }); + assign(PNotify_1.prototype, methods); + + PNotify_1.prototype._recompute = function _recompute(changed, state) { + if (changed.styling) { + if (this._differs(state._styles, state._styles = _styles(state))) changed._styles = true; + } + + if (changed.icons) { + if (this._differs(state._icons, state._icons = _icons(state))) changed._icons = true; + } + + if (changed.width) { + if (this._differs(state._widthStyle, state._widthStyle = _widthStyle(state))) changed._widthStyle = true; + } + + if (changed.minHeight) { + if (this._differs(state._minHeightStyle, state._minHeightStyle = _minHeightStyle(state))) changed._minHeightStyle = true; + } + }; + + setup(PNotify_1); + + function createElement(name) { + return document.createElement(name); + } + + function append(target, node) { + target.appendChild(node); + } + + function blankObject() { + return Object.create(null); + } + + function createText(data) { + return document.createTextNode(data); + } + + function setAttribute(node, attribute, value) { + if (value == null) node.removeAttribute(attribute);else node.setAttribute(attribute, value); + } + + function addListener(node, event, handler, options) { + node.addEventListener(event, handler, options); + } + + function insert(target, node, anchor) { + target.insertBefore(node, anchor); + } + + function updateKeyedEach(old_blocks, component, changed, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, intro_method, next, get_context) { + var o = old_blocks.length; + var n = list.length; + + var i = o; + var old_indexes = {}; + while (i--) { + old_indexes[old_blocks[i].key] = i; + }var new_blocks = []; + var new_lookup = {}; + var deltas = {}; + + var i = n; + while (i--) { + var child_ctx = get_context(ctx, list, i); + var key = get_key(child_ctx); + var block = lookup[key]; + + if (!block) { + block = create_each_block(component, key, child_ctx); + block.c(); + } else if (dynamic) { + block.p(changed, child_ctx); + } + + new_blocks[i] = new_lookup[key] = block; + + if (key in old_indexes) deltas[key] = Math.abs(i - old_indexes[key]); + } + + var will_move = {}; + var did_move = {}; + + function insert(block) { + block[intro_method](node, next); + lookup[block.key] = block; + next = block.first; + n--; + } + + while (o && n) { + var new_block = new_blocks[n - 1]; + var old_block = old_blocks[o - 1]; + var new_key = new_block.key; + var old_key = old_block.key; + + if (new_block === old_block) { + // do nothing + next = new_block.first; + o--; + n--; + } else if (!new_lookup[old_key]) { + // remove old block + destroy(old_block, lookup); + o--; + } else if (!lookup[new_key] || will_move[new_key]) { + insert(new_block); + } else if (did_move[old_key]) { + o--; + } else if (deltas[new_key] > deltas[old_key]) { + did_move[new_key] = true; + insert(new_block); + } else { + will_move[old_key] = true; + o--; + } + } + + while (o--) { + var old_block = old_blocks[o]; + if (!new_lookup[old_block.key]) destroy(old_block, lookup); + } + + while (n) { + insert(new_blocks[n - 1]); + }return new_blocks; + } + + function destroyBlock(block, lookup) { + block.d(1); + lookup[block.key] = null; + } + + function detachNode(node) { + node.parentNode.removeChild(node); + } + + function removeListener(node, event, handler, options) { + node.removeEventListener(event, handler, options); + } + + function createComment() { + return document.createComment(''); + } + + function setData(text, data) { + text.data = '' + data; + } + + function detachBetween(before, after) { + while (before.nextSibling && before.nextSibling !== after) { + before.parentNode.removeChild(before.nextSibling); + } + } + + function init(component, options) { + component._handlers = blankObject(); + component._slots = blankObject(); + component._bind = options._bind; + component._staged = {}; + + component.options = options; + component.root = options.root || component; + component.store = options.store || component.root.store; + + if (!options.root) { + component._beforecreate = []; + component._oncreate = []; + component._aftercreate = []; + } + } + + function assign(tar, src) { + for (var k in src) { + tar[k] = src[k]; + }return tar; + } + + function assignTrue(tar, src) { + for (var k in src) { + tar[k] = 1; + }return tar; + } + + function flush(component) { + component._lock = true; + callAll(component._beforecreate); + callAll(component._oncreate); + callAll(component._aftercreate); + component._lock = false; + } + + function destroy(detach) { + this.destroy = noop; + this.fire('destroy'); + this.set = noop; + + this._fragment.d(detach !== false); + this._fragment = null; + this._state = {}; + } + + function get() { + return this._state; + } + + function fire(eventName, data) { + var handlers = eventName in this._handlers && this._handlers[eventName].slice(); + if (!handlers) return; + + for (var i = 0; i < handlers.length; i += 1) { + var handler = handlers[i]; + + if (!handler.__calling) { + try { + handler.__calling = true; + handler.call(this, data); + } finally { + handler.__calling = false; + } + } + } + } + + function on(eventName, handler) { + var handlers = this._handlers[eventName] || (this._handlers[eventName] = []); + handlers.push(handler); + + return { + cancel: function cancel() { + var index = handlers.indexOf(handler); + if (~index) handlers.splice(index, 1); + } + }; + } + + function set(newState) { + this._set(assign({}, newState)); + if (this.root._lock) return; + flush(this.root); + } + + function _set(newState) { + var oldState = this._state, + changed = {}, + dirty = false; + + newState = assign(this._staged, newState); + this._staged = {}; + + for (var key in newState) { + if (this._differs(newState[key], oldState[key])) changed[key] = dirty = true; + } + if (!dirty) return; + + this._state = assign(assign({}, oldState), newState); + this._recompute(changed, this._state); + if (this._bind) this._bind(changed, this._state); + + if (this._fragment) { + this.fire("state", { changed: changed, current: this._state, previous: oldState }); + this._fragment.p(changed, this._state); + this.fire("update", { changed: changed, current: this._state, previous: oldState }); + } + } + + function _stage(newState) { + assign(this._staged, newState); + } + + function _mount(target, anchor) { + this._fragment[this._fragment.i ? 'i' : 'm'](target, anchor || null); + } + + function _differs(a, b) { + return a != a ? b == b : a !== b || a && (typeof a === "undefined" ? "undefined" : _typeof(a)) === 'object' || typeof a === 'function'; + } + + function callAll(fns) { + while (fns && fns.length) { + fns.shift()(); + } + } + + function noop() {} + + return PNotify_1; +}); \ No newline at end of file diff --git a/js/lib/pnotify/PNotifyButtons.js b/js/lib/pnotify/PNotifyButtons.js new file mode 100644 index 00000000..dae828a1 --- /dev/null +++ b/js/lib/pnotify/PNotifyButtons.js @@ -0,0 +1,560 @@ +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +/* src/PNotifyButtons.html generated by Svelte v2.16.1 */ +(function (global, factory) { + (typeof exports === "undefined" ? "undefined" : _typeof(exports)) === "object" && typeof module !== "undefined" ? module.exports = factory(require('./PNotify')) : typeof define === "function" && define.amd ? define('PNotifyButtons', ["./PNotify"], factory) : global.PNotifyButtons = factory(PNotify); +})(this, function (PNotify) { + "use strict"; + + PNotify = PNotify && PNotify.__esModule ? PNotify["default"] : PNotify; + + function _showSticker(_ref) { + var sticker = _ref.sticker, + _notice = _ref._notice; + + return sticker && !(_notice && _notice.refs.elem.classList.contains('nonblock')); + } + + function _showCloser(_ref2) { + var closer = _ref2.closer, + _notice = _ref2._notice; + + return closer && !(_notice && _notice.refs.elem.classList.contains('nonblock')); + } + + function _pinUpClass(_ref3) { + var classes = _ref3.classes, + _notice = _ref3._notice; + + return _notice ? classes.pinUp === null ? _notice.get()._icons.pinUp : classes.pinUp : ''; + } + + function _pinDownClass(_ref4) { + var classes = _ref4.classes, + _notice = _ref4._notice; + + return _notice ? classes.pinDown === null ? _notice.get()._icons.pinDown : classes.pinDown : ''; + } + + function _closerClass(_ref5) { + var classes = _ref5.classes, + _notice = _ref5._notice; + + return _notice ? classes.closer === null ? _notice.get()._icons.closer : classes.closer : ''; + } + + function data() { + return _extends({ + '_notice': null, // The PNotify notice. + '_options': {}, // The options for the notice. + '_mouseIsIn': false + }, PNotify.modules.Buttons.defaults); + }; + + var methods = { + initModule: function initModule(options) { + var _this = this; + + this.set(options); + + var _get = this.get(), + _notice = _get._notice; + + _notice.on('mouseenter', function () { + return _this.set({ '_mouseIsIn': true }); + }); + _notice.on('mouseleave', function () { + return _this.set({ '_mouseIsIn': false }); + }); + _notice.on('state', function (_ref6) { + var changed = _ref6.changed, + current = _ref6.current; + + if (!changed.hide) { + return; + } + + var _get2 = _this.get(), + sticker = _get2.sticker; + + if (!sticker) { + return; + } + + // Font Awesome 5 replaces our lovely element with a gross SVG. In + // order to make it play nice with Svelte, we have to clear the + // element and make it again. + var icon = current.hide ? _this.get().classes.pinUp : _this.get().classes.pinDown; + if (_this.get()._notice.get().icons === 'fontawesome5' || typeof icon === 'string' && icon.match(/(^| )fa[srlb]($| )/)) { + _this.set({ 'sticker': false }); + _this.set({ 'sticker': true }); + } + }); + }, + handleStickerClick: function handleStickerClick() { + var _get3 = this.get(), + _notice = _get3._notice; + + _notice.update({ hide: !_notice.get().hide }); + }, + handleCloserClick: function handleCloserClick() { + this.get()._notice.close(false); + this.set({ '_mouseIsIn': false }); + } + }; + + function oncreate() { + this.fire('init', { module: this }); + }; + + function setup(Component) { + Component.key = 'Buttons'; + + Component.defaults = { + // Provide a button for the user to manually close the notice. + closer: true, + // Only show the closer button on hover. + closerHover: true, + // Provide a button for the user to manually stick the notice. + sticker: true, + // Only show the sticker button on hover. + stickerHover: true, + // The various displayed text, helps facilitating internationalization. + labels: { + close: 'Close', + stick: 'Stick', + unstick: 'Unstick' + }, + // The classes to use for button icons. Leave them null to use the classes from the styling you're using. + classes: { + closer: null, + pinUp: null, + pinDown: null + } + }; + + // Register the module with PNotify. + PNotify.modules.Buttons = Component; + // Prepend this module to the container. + PNotify.modulesPrependContainer.push(Component); + + // Add button icons to icons objects. + _extends(PNotify.icons.brighttheme, { + closer: 'brighttheme-icon-closer', + pinUp: 'brighttheme-icon-sticker', + pinDown: 'brighttheme-icon-sticker brighttheme-icon-stuck' + }); + _extends(PNotify.icons.bootstrap3, { + closer: 'glyphicon glyphicon-remove', + pinUp: 'glyphicon glyphicon-pause', + pinDown: 'glyphicon glyphicon-play' + }); + _extends(PNotify.icons.fontawesome4, { + closer: 'fa fa-times', + pinUp: 'fa fa-pause', + pinDown: 'fa fa-play' + }); + _extends(PNotify.icons.fontawesome5, { + closer: 'fas fa-times', + pinUp: 'fas fa-pause', + pinDown: 'fas fa-play' + }); + }; + + function add_css() { + var style = createElement("style"); + style.id = 'svelte-1yjle82-style'; + style.textContent = ".ui-pnotify-closer.svelte-1yjle82,.ui-pnotify-sticker.svelte-1yjle82{float:right;margin-left:.5em;cursor:pointer}[dir=rtl] .ui-pnotify-closer.svelte-1yjle82,[dir=rtl] .ui-pnotify-sticker.svelte-1yjle82{float:left;margin-right:.5em;margin-left:0}.ui-pnotify-buttons-hidden.svelte-1yjle82{visibility:hidden}"; + append(document.head, style); + } + + function create_main_fragment(component, ctx) { + var text, if_block1_anchor; + + var if_block0 = ctx._showCloser && create_if_block_1(component, ctx); + + var if_block1 = ctx._showSticker && create_if_block(component, ctx); + + return { + c: function c() { + if (if_block0) if_block0.c(); + text = createText("\n"); + if (if_block1) if_block1.c(); + if_block1_anchor = createComment(); + }, + m: function m(target, anchor) { + if (if_block0) if_block0.m(target, anchor); + insert(target, text, anchor); + if (if_block1) if_block1.m(target, anchor); + insert(target, if_block1_anchor, anchor); + }, + p: function p(changed, ctx) { + if (ctx._showCloser) { + if (if_block0) { + if_block0.p(changed, ctx); + } else { + if_block0 = create_if_block_1(component, ctx); + if_block0.c(); + if_block0.m(text.parentNode, text); + } + } else if (if_block0) { + if_block0.d(1); + if_block0 = null; + } + + if (ctx._showSticker) { + if (if_block1) { + if_block1.p(changed, ctx); + } else { + if_block1 = create_if_block(component, ctx); + if_block1.c(); + if_block1.m(if_block1_anchor.parentNode, if_block1_anchor); + } + } else if (if_block1) { + if_block1.d(1); + if_block1 = null; + } + }, + d: function d(detach) { + if (if_block0) if_block0.d(detach); + if (detach) { + detachNode(text); + } + + if (if_block1) if_block1.d(detach); + if (detach) { + detachNode(if_block1_anchor); + } + } + }; + } + + // (1:0) {#if _showCloser} + function create_if_block_1(component, ctx) { + var div, span, div_class_value, div_title_value; + + function click_handler(event) { + component.handleCloserClick(); + } + + return { + c: function c() { + div = createElement("div"); + span = createElement("span"); + span.className = "" + ctx._closerClass + " svelte-1yjle82"; + addListener(div, "click", click_handler); + div.className = div_class_value = "ui-pnotify-closer " + (!ctx.closerHover || ctx._mouseIsIn ? '' : 'ui-pnotify-buttons-hidden') + " svelte-1yjle82"; + setAttribute(div, "role", "button"); + div.tabIndex = "0"; + div.title = div_title_value = ctx.labels.close; + }, + m: function m(target, anchor) { + insert(target, div, anchor); + append(div, span); + }, + p: function p(changed, ctx) { + if (changed._closerClass) { + span.className = "" + ctx._closerClass + " svelte-1yjle82"; + } + + if ((changed.closerHover || changed._mouseIsIn) && div_class_value !== (div_class_value = "ui-pnotify-closer " + (!ctx.closerHover || ctx._mouseIsIn ? '' : 'ui-pnotify-buttons-hidden') + " svelte-1yjle82")) { + div.className = div_class_value; + } + + if (changed.labels && div_title_value !== (div_title_value = ctx.labels.close)) { + div.title = div_title_value; + } + }, + d: function d(detach) { + if (detach) { + detachNode(div); + } + + removeListener(div, "click", click_handler); + } + }; + } + + // (11:0) {#if _showSticker} + function create_if_block(component, ctx) { + var div, span, span_class_value, div_class_value, div_aria_pressed_value, div_title_value; + + function click_handler(event) { + component.handleStickerClick(); + } + + return { + c: function c() { + div = createElement("div"); + span = createElement("span"); + span.className = span_class_value = "" + (ctx._options.hide ? ctx._pinUpClass : ctx._pinDownClass) + " svelte-1yjle82"; + addListener(div, "click", click_handler); + div.className = div_class_value = "ui-pnotify-sticker " + (!ctx.stickerHover || ctx._mouseIsIn ? '' : 'ui-pnotify-buttons-hidden') + " svelte-1yjle82"; + setAttribute(div, "role", "button"); + setAttribute(div, "aria-pressed", div_aria_pressed_value = ctx._options.hide); + div.tabIndex = "0"; + div.title = div_title_value = ctx._options.hide ? ctx.labels.stick : ctx.labels.unstick; + }, + m: function m(target, anchor) { + insert(target, div, anchor); + append(div, span); + }, + p: function p(changed, ctx) { + if ((changed._options || changed._pinUpClass || changed._pinDownClass) && span_class_value !== (span_class_value = "" + (ctx._options.hide ? ctx._pinUpClass : ctx._pinDownClass) + " svelte-1yjle82")) { + span.className = span_class_value; + } + + if ((changed.stickerHover || changed._mouseIsIn) && div_class_value !== (div_class_value = "ui-pnotify-sticker " + (!ctx.stickerHover || ctx._mouseIsIn ? '' : 'ui-pnotify-buttons-hidden') + " svelte-1yjle82")) { + div.className = div_class_value; + } + + if (changed._options && div_aria_pressed_value !== (div_aria_pressed_value = ctx._options.hide)) { + setAttribute(div, "aria-pressed", div_aria_pressed_value); + } + + if ((changed._options || changed.labels) && div_title_value !== (div_title_value = ctx._options.hide ? ctx.labels.stick : ctx.labels.unstick)) { + div.title = div_title_value; + } + }, + d: function d(detach) { + if (detach) { + detachNode(div); + } + + removeListener(div, "click", click_handler); + } + }; + } + + function PNotifyButtons(options) { + var _this2 = this; + + init(this, options); + this._state = assign(data(), options.data); + + this._recompute({ sticker: 1, _notice: 1, closer: 1, classes: 1 }, this._state); + this._intro = true; + + if (!document.getElementById("svelte-1yjle82-style")) add_css(); + + this._fragment = create_main_fragment(this, this._state); + + this.root._oncreate.push(function () { + oncreate.call(_this2); + _this2.fire("update", { changed: assignTrue({}, _this2._state), current: _this2._state }); + }); + + if (options.target) { + this._fragment.c(); + this._mount(options.target, options.anchor); + + flush(this); + } + } + + assign(PNotifyButtons.prototype, { + destroy: destroy, + get: get, + fire: fire, + on: on, + set: set, + _set: _set, + _stage: _stage, + _mount: _mount, + _differs: _differs + }); + assign(PNotifyButtons.prototype, methods); + + PNotifyButtons.prototype._recompute = function _recompute(changed, state) { + if (changed.sticker || changed._notice) { + if (this._differs(state._showSticker, state._showSticker = _showSticker(state))) changed._showSticker = true; + } + + if (changed.closer || changed._notice) { + if (this._differs(state._showCloser, state._showCloser = _showCloser(state))) changed._showCloser = true; + } + + if (changed.classes || changed._notice) { + if (this._differs(state._pinUpClass, state._pinUpClass = _pinUpClass(state))) changed._pinUpClass = true; + if (this._differs(state._pinDownClass, state._pinDownClass = _pinDownClass(state))) changed._pinDownClass = true; + if (this._differs(state._closerClass, state._closerClass = _closerClass(state))) changed._closerClass = true; + } + }; + + setup(PNotifyButtons); + + function createElement(name) { + return document.createElement(name); + } + + function append(target, node) { + target.appendChild(node); + } + + function createText(data) { + return document.createTextNode(data); + } + + function createComment() { + return document.createComment(''); + } + + function insert(target, node, anchor) { + target.insertBefore(node, anchor); + } + + function detachNode(node) { + node.parentNode.removeChild(node); + } + + function addListener(node, event, handler, options) { + node.addEventListener(event, handler, options); + } + + function setAttribute(node, attribute, value) { + if (value == null) node.removeAttribute(attribute);else node.setAttribute(attribute, value); + } + + function removeListener(node, event, handler, options) { + node.removeEventListener(event, handler, options); + } + + function init(component, options) { + component._handlers = blankObject(); + component._slots = blankObject(); + component._bind = options._bind; + component._staged = {}; + + component.options = options; + component.root = options.root || component; + component.store = options.store || component.root.store; + + if (!options.root) { + component._beforecreate = []; + component._oncreate = []; + component._aftercreate = []; + } + } + + function assign(tar, src) { + for (var k in src) { + tar[k] = src[k]; + }return tar; + } + + function assignTrue(tar, src) { + for (var k in src) { + tar[k] = 1; + }return tar; + } + + function flush(component) { + component._lock = true; + callAll(component._beforecreate); + callAll(component._oncreate); + callAll(component._aftercreate); + component._lock = false; + } + + function destroy(detach) { + this.destroy = noop; + this.fire('destroy'); + this.set = noop; + + this._fragment.d(detach !== false); + this._fragment = null; + this._state = {}; + } + + function get() { + return this._state; + } + + function fire(eventName, data) { + var handlers = eventName in this._handlers && this._handlers[eventName].slice(); + if (!handlers) return; + + for (var i = 0; i < handlers.length; i += 1) { + var handler = handlers[i]; + + if (!handler.__calling) { + try { + handler.__calling = true; + handler.call(this, data); + } finally { + handler.__calling = false; + } + } + } + } + + function on(eventName, handler) { + var handlers = this._handlers[eventName] || (this._handlers[eventName] = []); + handlers.push(handler); + + return { + cancel: function cancel() { + var index = handlers.indexOf(handler); + if (~index) handlers.splice(index, 1); + } + }; + } + + function set(newState) { + this._set(assign({}, newState)); + if (this.root._lock) return; + flush(this.root); + } + + function _set(newState) { + var oldState = this._state, + changed = {}, + dirty = false; + + newState = assign(this._staged, newState); + this._staged = {}; + + for (var key in newState) { + if (this._differs(newState[key], oldState[key])) changed[key] = dirty = true; + } + if (!dirty) return; + + this._state = assign(assign({}, oldState), newState); + this._recompute(changed, this._state); + if (this._bind) this._bind(changed, this._state); + + if (this._fragment) { + this.fire("state", { changed: changed, current: this._state, previous: oldState }); + this._fragment.p(changed, this._state); + this.fire("update", { changed: changed, current: this._state, previous: oldState }); + } + } + + function _stage(newState) { + assign(this._staged, newState); + } + + function _mount(target, anchor) { + this._fragment[this._fragment.i ? 'i' : 'm'](target, anchor || null); + } + + function _differs(a, b) { + return a != a ? b == b : a !== b || a && (typeof a === "undefined" ? "undefined" : _typeof(a)) === 'object' || typeof a === 'function'; + } + + function blankObject() { + return Object.create(null); + } + + function callAll(fns) { + while (fns && fns.length) { + fns.shift()(); + } + } + + function noop() {} + + return PNotifyButtons; +}); \ No newline at end of file diff --git a/js/lib/pnotify/PNotifyCallbacks.js b/js/lib/pnotify/PNotifyCallbacks.js new file mode 100644 index 00000000..38651c88 --- /dev/null +++ b/js/lib/pnotify/PNotifyCallbacks.js @@ -0,0 +1,256 @@ +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +/* src/PNotifyCallbacks.html generated by Svelte v2.16.1 */ +(function (global, factory) { + (typeof exports === "undefined" ? "undefined" : _typeof(exports)) === "object" && typeof module !== "undefined" ? module.exports = factory(require('./PNotify')) : typeof define === "function" && define.amd ? define('PNotifyCallbacks', ["./PNotify"], factory) : global.PNotifyCallbacks = factory(PNotify); +})(this, function (PNotify) { + "use strict"; + + PNotify = PNotify && PNotify.__esModule ? PNotify["default"] : PNotify; + + var _open = PNotify.prototype.open; + var _close = PNotify.prototype.close; + + var callbacks = function callbacks(notice, options, name) { + var modules = notice ? notice.get().modules : options.modules; + var cbs = modules && modules.Callbacks ? modules.Callbacks : {}; + return cbs[name] ? cbs[name] : function () { + return true; + }; + }; + + PNotify.prototype.open = function () { + var ret = callbacks(this, null, 'beforeOpen')(this); + if (ret !== false) { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _open.apply(this, args); + callbacks(this, null, 'afterOpen')(this); + } + }; + + PNotify.prototype.close = function (timerHide) { + var ret = callbacks(this, null, 'beforeClose')(this, timerHide); + if (ret !== false) { + for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; + } + + _close.apply(this, [timerHide].concat(args)); + callbacks(this, null, 'afterClose')(this, timerHide); + } + }; + + function setup(Component) { + Component.key = 'Callbacks'; + + Component.getCallbacks = callbacks; + + var _alert = PNotify.alert; + var _notice = PNotify.notice; + var _info = PNotify.info; + var _success = PNotify.success; + var _error = PNotify.error; + + var init = function init(original, options) { + callbacks(null, options, 'beforeInit')(options); + var notice = original(options); + callbacks(notice, null, 'afterInit')(notice); + return notice; + }; + + PNotify.alert = function (options) { + return init(_alert, options); + }; + PNotify.notice = function (options) { + return init(_notice, options); + }; + PNotify.info = function (options) { + return init(_info, options); + }; + PNotify.success = function (options) { + return init(_success, options); + }; + PNotify.error = function (options) { + return init(_error, options); + }; + + // Register the module with PNotify. + PNotify.modules.Callbacks = Component; + }; + + function create_main_fragment(component, ctx) { + + return { + c: noop, + + m: noop, + + p: noop, + + d: noop + }; + } + + function PNotifyCallbacks(options) { + init(this, options); + this._state = assign({}, options.data); + this._intro = true; + + this._fragment = create_main_fragment(this, this._state); + + if (options.target) { + this._fragment.c(); + this._mount(options.target, options.anchor); + } + } + + assign(PNotifyCallbacks.prototype, { + destroy: destroy, + get: get, + fire: fire, + on: on, + set: set, + _set: _set, + _stage: _stage, + _mount: _mount, + _differs: _differs + }); + + PNotifyCallbacks.prototype._recompute = noop; + + setup(PNotifyCallbacks); + + function noop() {} + + function init(component, options) { + component._handlers = blankObject(); + component._slots = blankObject(); + component._bind = options._bind; + component._staged = {}; + + component.options = options; + component.root = options.root || component; + component.store = options.store || component.root.store; + + if (!options.root) { + component._beforecreate = []; + component._oncreate = []; + component._aftercreate = []; + } + } + + function assign(tar, src) { + for (var k in src) { + tar[k] = src[k]; + }return tar; + } + + function destroy(detach) { + this.destroy = noop; + this.fire('destroy'); + this.set = noop; + + this._fragment.d(detach !== false); + this._fragment = null; + this._state = {}; + } + + function get() { + return this._state; + } + + function fire(eventName, data) { + var handlers = eventName in this._handlers && this._handlers[eventName].slice(); + if (!handlers) return; + + for (var i = 0; i < handlers.length; i += 1) { + var handler = handlers[i]; + + if (!handler.__calling) { + try { + handler.__calling = true; + handler.call(this, data); + } finally { + handler.__calling = false; + } + } + } + } + + function on(eventName, handler) { + var handlers = this._handlers[eventName] || (this._handlers[eventName] = []); + handlers.push(handler); + + return { + cancel: function cancel() { + var index = handlers.indexOf(handler); + if (~index) handlers.splice(index, 1); + } + }; + } + + function set(newState) { + this._set(assign({}, newState)); + if (this.root._lock) return; + flush(this.root); + } + + function _set(newState) { + var oldState = this._state, + changed = {}, + dirty = false; + + newState = assign(this._staged, newState); + this._staged = {}; + + for (var key in newState) { + if (this._differs(newState[key], oldState[key])) changed[key] = dirty = true; + } + if (!dirty) return; + + this._state = assign(assign({}, oldState), newState); + this._recompute(changed, this._state); + if (this._bind) this._bind(changed, this._state); + + if (this._fragment) { + this.fire("state", { changed: changed, current: this._state, previous: oldState }); + this._fragment.p(changed, this._state); + this.fire("update", { changed: changed, current: this._state, previous: oldState }); + } + } + + function _stage(newState) { + assign(this._staged, newState); + } + + function _mount(target, anchor) { + this._fragment[this._fragment.i ? 'i' : 'm'](target, anchor || null); + } + + function _differs(a, b) { + return a != a ? b == b : a !== b || a && (typeof a === "undefined" ? "undefined" : _typeof(a)) === 'object' || typeof a === 'function'; + } + + function blankObject() { + return Object.create(null); + } + + function flush(component) { + component._lock = true; + callAll(component._beforecreate); + callAll(component._oncreate); + callAll(component._aftercreate); + component._lock = false; + } + + function callAll(fns) { + while (fns && fns.length) { + fns.shift()(); + } + } + + return PNotifyCallbacks; +}); \ No newline at end of file diff --git a/js/lib/pnotify/PNotifyDesktop.js b/js/lib/pnotify/PNotifyDesktop.js new file mode 100644 index 00000000..baf91d65 --- /dev/null +++ b/js/lib/pnotify/PNotifyDesktop.js @@ -0,0 +1,463 @@ +var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +/* src/PNotifyDesktop.html generated by Svelte v2.16.1 */ +(function (global, factory) { + (typeof exports === "undefined" ? "undefined" : _typeof(exports)) === "object" && typeof module !== "undefined" ? module.exports = factory(require('./PNotify')) : typeof define === "function" && define.amd ? define('PNotifyDesktop', ["./PNotify"], factory) : global.PNotifyDesktop = factory(PNotify); +})(this, function (PNotify) { + "use strict"; + + PNotify = PNotify && PNotify.__esModule ? PNotify["default"] : PNotify; + + var permission = void 0; + var Notification = window.Notification; + + var _notify = function notify(title, options, onclick, onclose) { + // Memoize based on feature detection. + if ('Notification' in window) { + _notify = function notify(title, options, onclick, onclose) { + var notice = new Notification(title, options); + if ('NotificationEvent' in window) { + notice.addEventListener('notificationclick', onclick); + notice.addEventListener('close', onclose); + } else if ('addEventListener' in notice) { + notice.addEventListener('click', onclick); + notice.addEventListener('close', onclose); + } else { + notice.onclick = onclick; + notice.onclose = onclose; + } + return notice; + }; + } else if ('mozNotification' in navigator) { + _notify = function notify(title, options, onclick, onclose) { + // Gecko < 22 + var notice = navigator.mozNotification.createNotification(title, options.body, options.icon).show(); + notice.onclick = onclick; + notice.onclose = onclose; + return notice; + }; + } else if ('webkitNotifications' in window) { + _notify = function notify(title, options, onclick, onclose) { + var notice = window.webkitNotifications.createNotification(options.icon, title, options.body); + notice.onclick = onclick; + notice.onclose = onclose; + return notice; + }; + } else { + _notify = function notify(title, options, onclick, onclose) { + return null; + }; + } + return _notify(title, options, onclick, onclose); + }; + + function data() { + return _extends({ + '_notice': null, // The PNotify notice. + '_options': {} // The options for the notice. + }, PNotify.modules.Desktop.defaults); + }; + + var methods = { + initModule: function initModule(options) { + var _this = this; + + this.set(options); + + var _get = this.get(), + _notice = _get._notice; + + // Animation should always be 'none' for desktop notices, but remember + // the old animation so it can be recovered. + + + this.set({ '_oldAnimation': _notice.get().animation }); + _notice.on('state', function (_ref) { + var changed = _ref.changed, + current = _ref.current, + previous = _ref.previous; + + if (changed.animation) { + if (previous.animation === undefined || current.animation !== 'none' || previous.animation === 'none' && current.animation !== _this.get()._oldAnimation) { + _this.set({ '_oldAnimation': current.animation }); + } + } + + // This is necessary so desktop notices don't cause spacing problems + // when positioning. + if (changed._animatingClass) { + if (!(current._animatingClass === '' || permission !== 0 && _this.get().fallback || !_this.get().desktop)) { + _notice.set({ '_animatingClass': '' }); + } + } + }); + + if (!this.get().desktop) { + return; + } + + permission = PNotify.modules.Desktop.checkPermission(); + if (permission !== 0) { + // Keep the notice from opening if fallback is false. + if (!this.get().fallback) { + _notice.set({ 'autoDisplay': false }); + } + return; + } + + _notice.set({ 'animation': 'none' }); + _notice.addModuleClass('ui-pnotify-desktop-hide'); + + this.genNotice(); + }, + update: function update() { + var _get2 = this.get(), + _notice = _get2._notice; + + if (permission !== 0 && this.get().fallback || !this.get().desktop) { + _notice.set({ 'animation': this.get()._oldAnimation }); + _notice.removeModuleClass('ui-pnotify-desktop-hide'); + return; + } else { + _notice.set({ 'animation': 'none' }); + _notice.addModuleClass('ui-pnotify-desktop-hide'); + } + this.genNotice(); + }, + beforeOpen: function beforeOpen() { + if (this.get().desktop && permission !== 0) { + PNotify.modules.Desktop.permission(); + } + if (permission !== 0 && this.get().fallback || !this.get().desktop) { + return; + } + + var _get3 = this.get(), + _desktop = _get3._desktop; + + if (_desktop && 'show' in _desktop) { + this.get()._notice.set({ '_moduleIsNoticeOpen': true }); + _desktop.show(); + } + }, + beforeClose: function beforeClose() { + if (permission !== 0 && this.get().fallback || !this.get().desktop) { + return; + } + + var _get4 = this.get(), + _desktop = _get4._desktop; + + if (_desktop && 'close' in _desktop) { + _desktop.close(); + this.get()._notice.set({ '_moduleIsNoticeOpen': false }); + } + }, + genNotice: function genNotice() { + var _get5 = this.get(), + _notice = _get5._notice, + icon = _get5.icon; + + if (icon === null) { + switch (_notice.get().type) { + case 'error': + this.set({ '_icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gQJATQg7e6HvQAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAABr0lEQVRYw8WXu0oDQRSGv7hRSFYrLTTWKihaqUgUJO+gphBLL1jYpPSCVcAggpWthYhC7Ows9An0IbSPkMRCw8ZmFuI6yczs9cAPuzNz5v92brtrESxGARtokkCcAg2hk7jNl4G2R/m4zFPAiwTgWdRFHnmJuaulOAAaPQDqUZvv9DB3tR0lwIcGwHtU5uca5q4qYZvngJbHpAZ8CtU8dS1gLEyAisegBGTFKWiL65KnzVlY5uOSId6VtNuTtMupOu/TAHiQlNmSskHNXCOAGWBeUp7VhFoApoMAXAOWJoCszBJ9+ALY6vL0JiPgjsKmKUAaOOoBZwIAcNxlJLsCrAOTIQJMAWu62y4LOIqT7lGS96TIcYCMDkBZ46h1gB+PHI28ssq8X/G6DaqG8Piz2DrjVjGXbtSBy46F5QAHwJAizwZugKKscs7gSaqS/KpB/qxsFxwafhf6Odb/eblJi8BGwJdW26BtURxQpMU83hmaDQsNiPtvYMSwj3tgAqDgYzU7wJdHjo9+CgBvEW47lV5Tgj5DMtG0xIfESkIAF+522gdWxTzGEX3i9+6KpOMXF5UBt0NKJCAAAAAASUVORK5CYII=' }); + break; + case 'success': + this.set({ '_icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gQJATQPRj+65AAAAdBJREFUWMPtlzsvRFEQx3+7HmEjoiYKolVJJDRqnS8ggvVIVEQhCIUsEYJGCEH2E4h4FPREaLTbEo1IEJXHrmY2GTf33nPuY7ud5OTenTMz//89Z86ZWShLWf5LB3AOfACFiOMF2AkC3qOc88BXxFEAxlX8ftGdaNCEen8H6oFHYBR4FocwkpTngzzHgF01fwL0aYcp9fVtMW/rsMcWXWijK1Hexgye9smRT6CxaHgjytMYwccNSXqoja9FeVbiZS+OVaeDiUBLAPAJA/i2m5MXgRSQk7llC/DBMOBeBGqAe0eAjQhfvurH3EmgQk6EW6CVEHt+ZFo6J4EU8OoTcF35jhnAl2wSx20LFgyB1yyOWtY2c72ScMAAkPeZy6g4zUBdGAIAcyEq4Z7y7xbdTFgCACMBwPVJqVDHeNqvaplkH5i0sNuUwmaNkQxww20ZSOy7gFvX7SAk0i76jPQQlJoAwAEwq35ngfmwVatSdUMArZZ+K9JQ1Bp6iGqgSt7f/AIOqSzujLEn6AV+JG6zm4HuCZ+AJuAbWAQu5aIJu7JDck0ngDugC/j1c2qPqR13jpxuvWyS8liY/kQcean/lX6ACQ99DdAQYe+Lf0zylMUgf7qDKgzv284QAAAAAElFTkSuQmCC' }); + break; + case 'info': + this.set({ '_icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gQJATQ09zRTwAAAAdxJREFUWMPtl88rRFEUxz8zBolRCgsrpOym8TMSO2WplLKwUrKi/B0W7JSFmhVLNlhSlLKx8CtRGpEsJpofpZk3Nkc9b968e++8mdlw6vTeu/edc773nl/3wl+ngOH/zUAf0AN0AmEgB7wCD8AtcFMJoM3ADpAHLHk62RIwL8B0uQwHgXVRnDfkS2DSj/EW4K0Ew05eLMV4O/CuUJwEUvJUgdgwMd4IpBUKl13kVG6aL+ZjJ20DDQqQXy5jKYVMDBhVrb5f069LLrKfGnInqh040HRTvsTAHgei9oGQ7X0YaNNUNCdFKChgQvKtQ1vAkNvEahlSToez9oXad2BCA30ceHZxRxMQMShuvZLmv+hOA32/h+KUwS7MugVhqwb6Go+5nEEwht0ABDUEzyXdFsrQYwqMJjTbdxio9Qkg6QbgvkpnkLw0uQIAZ1UCYNkXawdw4qPCmVBcuADAMZCpAoCVYr3AKtYyHZSWauakjMx50TWwrzJw6lFARjQOt3se8jM6W9TloSCqIb9bRHbN5Fg+KkEZcow/Ak+KFBsD6h3jR8CUabAMlqn7xfxEbAdwWKLhhO3sGPCbOsNSvSyF0Z/5TaCuEleziLhmAOiWG1NWrmZXwIVU1A/+SZO+AcgLC4wt0zD3AAAAAElFTkSuQmCC' }); + break; + case 'notice': + default: + this.set({ '_icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3gQJATM4scOJLAAAAcxJREFUWMPtljtLA0EQx3+J0QRfnYqCiCA+MERBrIwgFtoFbMTOR61i5QcQBdEihZWNoEWwsNAvkMJeBLHRQtHC0iIP4utOmw2cx97d7l2SRgcGbufmv/Pf2dmdhb8uIR+YJqAPaBff30AeeAHuxLgqMgRkgS/AAEybGuLfEdBcycCTwKVYmY5mgO6gwdd8BLaqAST9Bs8EDG7VTd3gex4TbgEjwKjQOHDugZlRDb7sMZEJpCS4bYVMJOygsG1cB+wqHN0Gib1RYXFpLwL74nx7Sb3EFlXATQNjTgRagA3FbZIRiCliT5wITGgUaRACA0CPjMC4xtUcDUAgDAzLCCQ0MhALQCAE9MoIdGkQCJIBgE4ZgWiNMvDL10qgUMMMFGQEnjQmkLXbVg38s8y4qtFcTCAnHiJ5oKiJnSoHjVgIXAmHkGIl5yy+YcWruIy9dvqpupIDCfZWEXvh1gsWFVfxIbG9a3RbRwJnYiuqJYfAqxsBgBWFiQyJzfTAlIB1uzEicbwBFoBTl8lSwINoSuXKjrv4F4FBh61zlKUKvgn7/e5ZEngMEDgLdFSieHaAT42LpgTMVbqC24B54Bi4twV9E6cnDcw6PFj+RSo/l6rlSlldhx4AAAAASUVORK5CYII=' }); + break; + } + } else if (icon === false) { + this.set({ '_icon': null }); + } else { + this.set({ '_icon': icon }); + } + + var _get6 = this.get(), + tag = _get6.tag; + + if (!this.get()._tag || tag !== null) { + this.set({ + '_tag': tag === null ? 'PNotify-' + Math.round(Math.random() * 1000000) : tag + }); + } + + var options = { + body: this.get().text || _notice.get().text, + tag: this.get()._tag + }; + if (!_notice.get().hide) { + options.requireInteraction = true; + } + if (this.get()._icon !== null) { + options.icon = this.get()._icon; + } + Object.apply(options, this.get().options); + + var _desktop = _notify(this.get().title || _notice.get().title, options, function () { + _notice.fire('click', { target: _desktop }); + }, function () { + _notice.close(); + }); + + _notice.set({ '_moduleIsNoticeOpen': true }); + this.set({ _desktop: _desktop }); + + if (!('close' in _desktop) && 'cancel' in _desktop) { + _desktop.close = function () { + _desktop.cancel(); + }; + } + } + }; + + function setup(Component) { + Component.key = 'Desktop'; + + Component.defaults = { + // Display the notification as a desktop notification. + desktop: false, + // If desktop notifications are not supported or allowed, fall back to a regular notice. + fallback: true, + // The URL of the icon to display. If false, no icon will show. If null, a default icon will show. + icon: null, + // Using a tag lets you update an existing notice, or keep from duplicating notices between tabs. + // If you leave tag null, one will be generated, facilitating the 'update' function. + // see: http://www.w3.org/TR/notifications/#tags-example + tag: null, + // Optionally display a different title for the desktop. + title: null, + // Optionally display different text for the desktop. + text: null, + // Any additional options to be passed to the Notification constructor. + options: {} + }; + + Component.init = function (notice) { + return new Component({ target: document.body }); + }; + + Component.permission = function () { + if (typeof Notification !== 'undefined' && 'requestPermission' in Notification) { + Notification.requestPermission(); + } else if ('webkitNotifications' in window) { + window.webkitNotifications.requestPermission(); + } + }; + + Component.checkPermission = function () { + if (typeof Notification !== 'undefined' && 'permission' in Notification) { + return Notification.permission === 'granted' ? 0 : 1; + } else if ('webkitNotifications' in window) { + return window.webkitNotifications.checkPermission() == 0 ? 0 : 1; // eslint-disable-line eqeqeq + } else { + return 1; + } + }; + + permission = Component.checkPermission(); + + // Register the module with PNotify. + PNotify.modules.Desktop = Component; + }; + + function add_css() { + var style = createElement("style"); + style.id = 'svelte-xbgnx4-style'; + style.textContent = "[ui-pnotify].ui-pnotify-desktop-hide.ui-pnotify{left:-10000px !important;display:none !important}"; + append(document.head, style); + } + + function create_main_fragment(component, ctx) { + + return { + c: noop, + + m: noop, + + p: noop, + + d: noop + }; + } + + function PNotifyDesktop(options) { + init(this, options); + this._state = assign(data(), options.data); + this._intro = true; + + if (!document.getElementById("svelte-xbgnx4-style")) add_css(); + + this._fragment = create_main_fragment(this, this._state); + + if (options.target) { + this._fragment.c(); + this._mount(options.target, options.anchor); + } + } + + assign(PNotifyDesktop.prototype, { + destroy: destroy, + get: get, + fire: fire, + on: on, + set: set, + _set: _set, + _stage: _stage, + _mount: _mount, + _differs: _differs + }); + assign(PNotifyDesktop.prototype, methods); + + PNotifyDesktop.prototype._recompute = noop; + + setup(PNotifyDesktop); + + function createElement(name) { + return document.createElement(name); + } + + function append(target, node) { + target.appendChild(node); + } + + function noop() {} + + function init(component, options) { + component._handlers = blankObject(); + component._slots = blankObject(); + component._bind = options._bind; + component._staged = {}; + + component.options = options; + component.root = options.root || component; + component.store = options.store || component.root.store; + + if (!options.root) { + component._beforecreate = []; + component._oncreate = []; + component._aftercreate = []; + } + } + + function assign(tar, src) { + for (var k in src) { + tar[k] = src[k]; + }return tar; + } + + function destroy(detach) { + this.destroy = noop; + this.fire('destroy'); + this.set = noop; + + this._fragment.d(detach !== false); + this._fragment = null; + this._state = {}; + } + + function get() { + return this._state; + } + + function fire(eventName, data) { + var handlers = eventName in this._handlers && this._handlers[eventName].slice(); + if (!handlers) return; + + for (var i = 0; i < handlers.length; i += 1) { + var handler = handlers[i]; + + if (!handler.__calling) { + try { + handler.__calling = true; + handler.call(this, data); + } finally { + handler.__calling = false; + } + } + } + } + + function on(eventName, handler) { + var handlers = this._handlers[eventName] || (this._handlers[eventName] = []); + handlers.push(handler); + + return { + cancel: function cancel() { + var index = handlers.indexOf(handler); + if (~index) handlers.splice(index, 1); + } + }; + } + + function set(newState) { + this._set(assign({}, newState)); + if (this.root._lock) return; + flush(this.root); + } + + function _set(newState) { + var oldState = this._state, + changed = {}, + dirty = false; + + newState = assign(this._staged, newState); + this._staged = {}; + + for (var key in newState) { + if (this._differs(newState[key], oldState[key])) changed[key] = dirty = true; + } + if (!dirty) return; + + this._state = assign(assign({}, oldState), newState); + this._recompute(changed, this._state); + if (this._bind) this._bind(changed, this._state); + + if (this._fragment) { + this.fire("state", { changed: changed, current: this._state, previous: oldState }); + this._fragment.p(changed, this._state); + this.fire("update", { changed: changed, current: this._state, previous: oldState }); + } + } + + function _stage(newState) { + assign(this._staged, newState); + } + + function _mount(target, anchor) { + this._fragment[this._fragment.i ? 'i' : 'm'](target, anchor || null); + } + + function _differs(a, b) { + return a != a ? b == b : a !== b || a && (typeof a === "undefined" ? "undefined" : _typeof(a)) === 'object' || typeof a === 'function'; + } + + function blankObject() { + return Object.create(null); + } + + function flush(component) { + component._lock = true; + callAll(component._beforecreate); + callAll(component._oncreate); + callAll(component._aftercreate); + component._lock = false; + } + + function callAll(fns) { + while (fns && fns.length) { + fns.shift()(); + } + } + + return PNotifyDesktop; +}); \ No newline at end of file diff --git a/js/lib/pnotify/pnotify.buttons.js b/js/lib/pnotify/pnotify.buttons.js deleted file mode 100644 index 893fa868..00000000 --- a/js/lib/pnotify/pnotify.buttons.js +++ /dev/null @@ -1,164 +0,0 @@ -// Buttons -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as a module. - define('pnotify.buttons', ['jquery', 'pnotify'], factory); - } else if (typeof exports === 'object' && typeof module !== 'undefined') { - // CommonJS - module.exports = factory(require('jquery'), require('./pnotify')); - } else { - // Browser globals - factory(root.jQuery, root.PNotify); - } -}(typeof window !== "undefined" ? window : this, function($, PNotify){ - PNotify.prototype.options.buttons = { - // Provide a button for the user to manually close the notice. - closer: true, - // Only show the closer button on hover. - closer_hover: true, - // Provide a button for the user to manually stick the notice. - sticker: true, - // Only show the sticker button on hover. - sticker_hover: true, - // Show the buttons even when the nonblock module is in use. - show_on_nonblock: false, - // The various displayed text, helps facilitating internationalization. - labels: { - close: "Close", - stick: "Stick", - unstick: "Unstick" - }, - // The classes to use for button icons. Leave them null to use the classes from the styling you're using. - classes: { - closer: null, - pin_up: null, - pin_down: null - } - }; - PNotify.prototype.modules.buttons = { - init: function(notice, options){ - var that = this; - notice.elem.on({ - "mouseenter": function(e){ - // Show the buttons. - if (that.options.sticker && (!(notice.options.nonblock && notice.options.nonblock.nonblock) || that.options.show_on_nonblock)) { - that.sticker.trigger("pnotify:buttons:toggleStick").css("visibility", "visible"); - } - if (that.options.closer && (!(notice.options.nonblock && notice.options.nonblock.nonblock) || that.options.show_on_nonblock)) { - that.closer.css("visibility", "visible"); - } - }, - "mouseleave": function(e){ - // Hide the buttons. - if (that.options.sticker_hover) { - that.sticker.css("visibility", "hidden"); - } - if (that.options.closer_hover) { - that.closer.css("visibility", "hidden"); - } - } - }); - - // Provide a button to stick the notice. - this.sticker = $("
      ", { - "class": "ui-pnotify-sticker", - "aria-role": "button", - "aria-pressed": notice.options.hide ? "false" : "true", - "tabindex": "0", - "title": notice.options.hide ? options.labels.stick : options.labels.unstick, - "css": { - "cursor": "pointer", - "visibility": options.sticker_hover ? "hidden" : "visible" - }, - "click": function(){ - notice.options.hide = !notice.options.hide; - if (notice.options.hide) { - notice.queueRemove(); - } else { - notice.cancelRemove(); - } - $(this).trigger("pnotify:buttons:toggleStick"); - } - }) - .bind("pnotify:buttons:toggleStick", function(){ - var pin_up = that.options.classes.pin_up === null ? notice.styles.pin_up : that.options.classes.pin_up; - var pin_down = that.options.classes.pin_down === null ? notice.styles.pin_down : that.options.classes.pin_down; - $(this) - .attr("title", notice.options.hide ? that.options.labels.stick : that.options.labels.unstick) - .children() - .attr("class", "") - .addClass(notice.options.hide ? pin_up : pin_down) - .attr("aria-pressed", notice.options.hide ? "false" : "true"); - }) - .append("") - .trigger("pnotify:buttons:toggleStick") - .prependTo(notice.container); - if (!options.sticker || (notice.options.nonblock && notice.options.nonblock.nonblock && !options.show_on_nonblock)) { - this.sticker.css("display", "none"); - } - - // Provide a button to close the notice. - this.closer = $("
      ", { - "class": "ui-pnotify-closer", - "aria-role": "button", - "tabindex": "0", - "title": options.labels.close, - "css": {"cursor": "pointer", "visibility": options.closer_hover ? "hidden" : "visible"}, - "click": function(){ - notice.remove(false); - that.sticker.css("visibility", "hidden"); - that.closer.css("visibility", "hidden"); - } - }) - .append($("", {"class": options.classes.closer === null ? notice.styles.closer : options.classes.closer})) - .prependTo(notice.container); - if (!options.closer || (notice.options.nonblock && notice.options.nonblock.nonblock && !options.show_on_nonblock)) { - this.closer.css("display", "none"); - } - }, - update: function(notice, options){ - // Update the sticker and closer buttons. - if (!options.closer || (notice.options.nonblock && notice.options.nonblock.nonblock && !options.show_on_nonblock)) { - this.closer.css("display", "none"); - } else if (options.closer) { - this.closer.css("display", "block"); - } - if (!options.sticker || (notice.options.nonblock && notice.options.nonblock.nonblock && !options.show_on_nonblock)) { - this.sticker.css("display", "none"); - } else if (options.sticker) { - this.sticker.css("display", "block"); - } - // Update the sticker icon. - this.sticker.trigger("pnotify:buttons:toggleStick"); - // Update the close icon. - this.closer.find("span").attr("class", "").addClass(options.classes.closer === null ? notice.styles.closer : options.classes.closer); - // Update the hover status of the buttons. - if (options.sticker_hover) { - this.sticker.css("visibility", "hidden"); - } else if (!(notice.options.nonblock && notice.options.nonblock.nonblock && !options.show_on_nonblock)) { - this.sticker.css("visibility", "visible"); - } - if (options.closer_hover) { - this.closer.css("visibility", "hidden"); - } else if (!(notice.options.nonblock && notice.options.nonblock.nonblock && !options.show_on_nonblock)) { - this.closer.css("visibility", "visible"); - } - } - }; - $.extend(PNotify.styling.brighttheme, { - closer: "brighttheme-icon-closer", - pin_up: "brighttheme-icon-sticker", - pin_down: "brighttheme-icon-sticker brighttheme-icon-stuck" - }); - $.extend(PNotify.styling.bootstrap3, { - closer: "glyphicon glyphicon-remove", - pin_up: "glyphicon glyphicon-pause", - pin_down: "glyphicon glyphicon-play" - }); - $.extend(PNotify.styling.fontawesome, { - closer: "fa fa-times", - pin_up: "fa fa-pause", - pin_down: "fa fa-play" - }); - return PNotify; -})); diff --git a/js/lib/pnotify/pnotify.callbacks.js b/js/lib/pnotify/pnotify.callbacks.js deleted file mode 100644 index 65175928..00000000 --- a/js/lib/pnotify/pnotify.callbacks.js +++ /dev/null @@ -1,51 +0,0 @@ -// Callbacks -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as a module. - define('pnotify.callbacks', ['jquery', 'pnotify'], factory); - } else if (typeof exports === 'object' && typeof module !== 'undefined') { - // CommonJS - module.exports = factory(require('jquery'), require('./pnotify')); - } else { - // Browser globals - factory(root.jQuery, root.PNotify); - } -}(typeof window !== "undefined" ? window : this, function($, PNotify){ - var _init = PNotify.prototype.init, - _open = PNotify.prototype.open, - _remove = PNotify.prototype.remove; - PNotify.prototype.init = function(){ - if (this.options.before_init) { - this.options.before_init(this.options); - } - _init.apply(this, arguments); - if (this.options.after_init) { - this.options.after_init(this); - } - }; - PNotify.prototype.open = function(){ - var ret; - if (this.options.before_open) { - ret = this.options.before_open(this); - } - if (ret !== false) { - _open.apply(this, arguments); - if (this.options.after_open) { - this.options.after_open(this); - } - } - }; - PNotify.prototype.remove = function(timer_hide){ - var ret; - if (this.options.before_close) { - ret = this.options.before_close(this, timer_hide); - } - if (ret !== false) { - _remove.apply(this, arguments); - if (this.options.after_close) { - this.options.after_close(this, timer_hide); - } - } - }; - return PNotify; -})); diff --git a/js/lib/pnotify/pnotify.desktop.js b/js/lib/pnotify/pnotify.desktop.js deleted file mode 100644 index 38558bb7..00000000 --- a/js/lib/pnotify/pnotify.desktop.js +++ /dev/null @@ -1,157 +0,0 @@ -// Desktop -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as a module. - define('pnotify.desktop', ['jquery', 'pnotify'], factory); - } else if (typeof exports === 'object' && typeof module !== 'undefined') { - // CommonJS - module.exports = factory(require('jquery'), require('./pnotify')); - } else { - // Browser globals - factory(root.jQuery, root.PNotify); - } -}(typeof window !== "undefined" ? window : this, function($, PNotify){ - var permission; - var notify = function(title, options){ - // Memoize based on feature detection. - if ("Notification" in window) { - notify = function (title, options) { - return new Notification(title, options); - }; - } else if ("mozNotification" in navigator) { - notify = function (title, options) { - // Gecko < 22 - return navigator.mozNotification - .createNotification(title, options.body, options.icon) - .show(); - }; - } else if ("webkitNotifications" in window) { - notify = function (title, options) { - return window.webkitNotifications.createNotification( - options.icon, - title, - options.body - ); - }; - } else { - notify = function (title, options) { - return null; - }; - } - return notify(title, options); - }; - - - PNotify.prototype.options.desktop = { - // Display the notification as a desktop notification. - desktop: false, - // If desktop notifications are not supported or allowed, fall back to a regular notice. - fallback: true, - // The URL of the icon to display. If false, no icon will show. If null, a default icon will show. - icon: null, - // Using a tag lets you update an existing notice, or keep from duplicating notices between tabs. - // If you leave tag null, one will be generated, facilitating the "update" function. - // see: http://www.w3.org/TR/notifications/#tags-example - tag: null, - // Optionally display a different title for the desktop. - title: null, - // Optionally display different text for the desktop. - text: null - }; - PNotify.prototype.modules.desktop = { - genNotice: function(notice, options){ - if (options.icon === null) { - this.icon = "http://sciactive.com/pnotify/includes/desktop/"+notice.options.type+".png"; - } else if (options.icon === false) { - this.icon = null; - } else { - this.icon = options.icon; - } - if (this.tag === null || options.tag !== null) { - this.tag = options.tag === null ? "PNotify-"+Math.round(Math.random() * 1000000) : options.tag; - } - notice.desktop = notify(options.title || notice.options.title, { - icon: this.icon, - body: options.text || notice.options.text, - tag: this.tag - }); - if (!("close" in notice.desktop) && ("cancel" in notice.desktop)) { - notice.desktop.close = function(){ - notice.desktop.cancel(); - }; - } - notice.desktop.onclick = function(){ - notice.elem.trigger("click"); - }; - notice.desktop.onclose = function(){ - if (notice.state !== "closing" && notice.state !== "closed") { - notice.remove(); - } - }; - }, - init: function(notice, options){ - if (!options.desktop) - return; - permission = PNotify.desktop.checkPermission(); - if (permission !== 0) { - // Keep the notice from opening if fallback is false. - if (!options.fallback) { - notice.options.auto_display = false; - } - return; - } - this.genNotice(notice, options); - }, - update: function(notice, options, oldOpts){ - if ((permission !== 0 && options.fallback) || !options.desktop) - return; - this.genNotice(notice, options); - }, - beforeOpen: function(notice, options){ - if ((permission !== 0 && options.fallback) || !options.desktop) - return; - notice.elem.css({'left': '-10000px'}).removeClass('ui-pnotify-in'); - }, - afterOpen: function(notice, options){ - if ((permission !== 0 && options.fallback) || !options.desktop) - return; - notice.elem.css({'left': '-10000px'}).removeClass('ui-pnotify-in'); - if ("show" in notice.desktop) { - notice.desktop.show(); - } - }, - beforeClose: function(notice, options){ - if ((permission !== 0 && options.fallback) || !options.desktop) - return; - notice.elem.css({'left': '-10000px'}).removeClass('ui-pnotify-in'); - }, - afterClose: function(notice, options){ - if ((permission !== 0 && options.fallback) || !options.desktop) - return; - notice.elem.css({'left': '-10000px'}).removeClass('ui-pnotify-in'); - if ("close" in notice.desktop) { - notice.desktop.close(); - } - } - }; - PNotify.desktop = { - permission: function(){ - if (typeof Notification !== "undefined" && "requestPermission" in Notification) { - Notification.requestPermission(); - } else if ("webkitNotifications" in window) { - window.webkitNotifications.requestPermission(); - } - }, - checkPermission: function(){ - if (typeof Notification !== "undefined" && "permission" in Notification) { - return (Notification.permission === "granted" ? 0 : 1); - } else if ("webkitNotifications" in window) { - return window.webkitNotifications.checkPermission() == 0 ? 0 : 1; - } else { - return 1; - } - } - }; - permission = PNotify.desktop.checkPermission(); - return PNotify; -})); diff --git a/js/lib/pnotify/pnotify.js b/js/lib/pnotify/pnotify.js deleted file mode 100644 index 13e3dbef..00000000 --- a/js/lib/pnotify/pnotify.js +++ /dev/null @@ -1,875 +0,0 @@ -/* -PNotify 3.2.0 sciactive.com/pnotify/ -(C) 2015 Hunter Perrin; Google, Inc. -license Apache-2.0 -*/ -/* - * ====== PNotify ====== - * - * http://sciactive.com/pnotify/ - * - * Copyright 2009-2015 Hunter Perrin - * Copyright 2015 Google, Inc. - * - * Licensed under Apache License, Version 2.0. - * http://www.apache.org/licenses/LICENSE-2.0 - */ - -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as a module. - define('pnotify', ['jquery'], function($){ - return factory($, root); - }); - } else if (typeof exports === 'object' && typeof module !== 'undefined') { - // CommonJS - module.exports = factory(require('jquery'), global || root); - } else { - // Browser globals - root.PNotify = factory(root.jQuery, root); - } -}(typeof window !== "undefined" ? window : this, function($, root){ -var init = function(root){ - var default_stack = { - dir1: "down", - dir2: "left", - push: "bottom", - spacing1: 36, - spacing2: 36, - context: $("body"), - modal: false - }; - var posTimer, // Position all timer. - body, - jwindow = $(root); - // Set global variables. - var do_when_ready = function(){ - body = $("body"); - PNotify.prototype.options.stack.context = body; - jwindow = $(root); - // Reposition the notices when the window resizes. - jwindow.bind('resize', function(){ - if (posTimer) { - clearTimeout(posTimer); - } - posTimer = setTimeout(function(){ - PNotify.positionAll(true); - }, 10); - }); - }; - var createStackOverlay = function(stack) { - var overlay = $("
      ", {"class": "ui-pnotify-modal-overlay"}); - overlay.prependTo(stack.context); - if (stack.overlay_close) { - // Close the notices on overlay click. - overlay.click(function(){ - PNotify.removeStack(stack); - }); - } - return overlay; - }; - var PNotify = function(options){ - // === Class Variables === - this.state = "initializing"; // The state can be "initializing", "opening", "open", "closing", and "closed". - this.timer = null; // Auto close timer. - this.animTimer = null; // Animation timer. - this.styles = null; - this.elem = null; - this.container = null; - this.title_container = null; - this.text_container = null; - this.animating = false; // Stores what is currently being animated (in or out). - this.timerHide = false; // Stores whether the notice was hidden by a timer. - - this.parseOptions(options); - this.init(); - }; - $.extend(PNotify.prototype, { - // The current version of PNotify. - version: "3.2.0", - - // === Options === - - // Options defaults. - options: { - // The notice's title. - title: false, - // Whether to escape the content of the title. (Not allow HTML.) - title_escape: false, - // The notice's text. - text: false, - // Whether to escape the content of the text. (Not allow HTML.) - text_escape: false, - // What styling classes to use. (Can be either "brighttheme", "bootstrap3", or "fontawesome".) - styling: "brighttheme", - // Additional classes to be added to the notice. (For custom styling.) - addclass: "", - // Class to be added to the notice for corner styling. - cornerclass: "", - // Display the notice when it is created. - auto_display: true, - // Width of the notice. - width: "300px", - // Minimum height of the notice. It will expand to fit content. - min_height: "16px", - // Type of the notice. "notice", "info", "success", or "error". - type: "notice", - // Set icon to true to use the default icon for the selected - // style/type, false for no icon, or a string for your own icon class. - icon: true, - // The animation to use when displaying and hiding the notice. "none" - // and "fade" are supported through CSS. Others are supported - // through the Animate module and Animate.css. - animation: "fade", - // Speed at which the notice animates in and out. "slow", "normal", - // or "fast". Respectively, 400ms, 250ms, 100ms. - animate_speed: "normal", - // Display a drop shadow. - shadow: true, - // After a delay, remove the notice. - hide: true, - // Delay in milliseconds before the notice is removed. - delay: 8000, - // Reset the hide timer if the mouse moves over the notice. - mouse_reset: true, - // Remove the notice's elements from the DOM after it is removed. - remove: true, - // Change new lines to br tags. - insert_brs: true, - // Whether to remove the notice from the global array when it is closed. - destroy: true, - // The stack on which the notices will be placed. Also controls the - // direction the notices stack. - stack: default_stack - }, - - // === Modules === - - // This object holds all the PNotify modules. They are used to provide - // additional functionality. - modules: {}, - // This runs an event on all the modules. - runModules: function(event, arg){ - var curArg; - for (var module in this.modules) { - curArg = ((typeof arg === "object" && module in arg) ? arg[module] : arg); - if (typeof this.modules[module][event] === 'function') { - this.modules[module].notice = this; - this.modules[module].options = typeof this.options[module] === 'object' ? this.options[module] : {}; - this.modules[module][event](this, typeof this.options[module] === 'object' ? this.options[module] : {}, curArg); - } - } - }, - - // === Events === - - init: function(){ - var that = this; - - // First and foremost, we don't want our module objects all referencing the prototype. - this.modules = {}; - $.extend(true, this.modules, PNotify.prototype.modules); - - // Get our styling object. - if (typeof this.options.styling === "object") { - this.styles = this.options.styling; - } else { - this.styles = PNotify.styling[this.options.styling]; - } - - // Create our widget. - // Stop animation, reset the removal timer when the user mouses over. - this.elem = $("
      ", { - "class": "ui-pnotify "+this.options.addclass, - "css": {"display": "none"}, - "aria-live": "assertive", - "aria-role": "alertdialog", - "mouseenter": function(e){ - if (that.options.mouse_reset && that.animating === "out") { - if (!that.timerHide) { - return; - } - that.cancelRemove(); - } - // Stop the close timer. - if (that.options.hide && that.options.mouse_reset) { - that.cancelRemove(); - } - }, - "mouseleave": function(e){ - // Start the close timer. - if (that.options.hide && that.options.mouse_reset && that.animating !== "out") { - that.queueRemove(); - } - PNotify.positionAll(); - } - }); - // Maybe we need to fade in/out. - if (this.options.animation === "fade") { - this.elem.addClass("ui-pnotify-fade-"+this.options.animate_speed); - } - // Create a container for the notice contents. - this.container = $("
      ", { - "class": this.styles.container+" ui-pnotify-container "+(this.options.type === "error" ? this.styles.error : (this.options.type === "info" ? this.styles.info : (this.options.type === "success" ? this.styles.success : this.styles.notice))), - "role": "alert" - }).appendTo(this.elem); - if (this.options.cornerclass !== "") { - this.container.removeClass("ui-corner-all").addClass(this.options.cornerclass); - } - // Create a drop shadow. - if (this.options.shadow) { - this.container.addClass("ui-pnotify-shadow"); - } - - - // Add the appropriate icon. - if (this.options.icon !== false) { - $("
      ", {"class": "ui-pnotify-icon"}) - .append($("", {"class": this.options.icon === true ? (this.options.type === "error" ? this.styles.error_icon : (this.options.type === "info" ? this.styles.info_icon : (this.options.type === "success" ? this.styles.success_icon : this.styles.notice_icon))) : this.options.icon})) - .prependTo(this.container); - } - - // Add a title. - this.title_container = $("

      ", { - "class": "ui-pnotify-title" - }) - .appendTo(this.container); - if (this.options.title === false) { - this.title_container.hide(); - } else if (this.options.title_escape) { - this.title_container.text(this.options.title); - } else { - this.title_container.html(this.options.title); - } - - // Add text. - this.text_container = $("
      ", { - "class": "ui-pnotify-text", - "aria-role": "alert" - }) - .appendTo(this.container); - if (this.options.text === false) { - this.text_container.hide(); - } else if (this.options.text_escape) { - this.text_container.text(this.options.text); - } else { - this.text_container.html(this.options.insert_brs ? String(this.options.text).replace(/\n/g, "
      ") : this.options.text); - } - - // Set width and min height. - if (typeof this.options.width === "string") { - this.elem.css("width", this.options.width); - } - if (typeof this.options.min_height === "string") { - this.container.css("min-height", this.options.min_height); - } - - - // Add the notice to the notice array. - if (this.options.stack.push === "top") { - PNotify.notices = $.merge([this], PNotify.notices); - } else { - PNotify.notices = $.merge(PNotify.notices, [this]); - } - // Now position all the notices if they are to push to the top. - if (this.options.stack.push === "top") { - this.queuePosition(false, 1); - } - - - // Mark the stack so it won't animate the new notice. - this.options.stack.animation = false; - - // Run the modules. - this.runModules('init'); - - // We're now initialized, but haven't been opened yet. - this.state = "closed"; - - // Display the notice. - if (this.options.auto_display) { - this.open(); - } - return this; - }, - - // This function is for updating the notice. - update: function(options){ - // Save old options. - var oldOpts = this.options; - // Then update to the new options. - this.parseOptions(oldOpts, options); - // Maybe we need to fade in/out. - this.elem.removeClass("ui-pnotify-fade-slow ui-pnotify-fade-normal ui-pnotify-fade-fast"); - if (this.options.animation === "fade") { - this.elem.addClass("ui-pnotify-fade-"+this.options.animate_speed); - } - // Update the corner class. - if (this.options.cornerclass !== oldOpts.cornerclass) { - this.container.removeClass("ui-corner-all "+oldOpts.cornerclass).addClass(this.options.cornerclass); - } - // Update the shadow. - if (this.options.shadow !== oldOpts.shadow) { - if (this.options.shadow) { - this.container.addClass("ui-pnotify-shadow"); - } else { - this.container.removeClass("ui-pnotify-shadow"); - } - } - // Update the additional classes. - if (this.options.addclass === false) { - this.elem.removeClass(oldOpts.addclass); - } else if (this.options.addclass !== oldOpts.addclass) { - this.elem.removeClass(oldOpts.addclass).addClass(this.options.addclass); - } - // Update the title. - if (this.options.title === false) { - this.title_container.slideUp("fast"); - } else if (this.options.title !== oldOpts.title) { - if (this.options.title_escape) { - this.title_container.text(this.options.title); - } else { - this.title_container.html(this.options.title); - } - if (oldOpts.title === false) { - this.title_container.slideDown(200); - } - } - // Update the text. - if (this.options.text === false) { - this.text_container.slideUp("fast"); - } else if (this.options.text !== oldOpts.text) { - if (this.options.text_escape) { - this.text_container.text(this.options.text); - } else { - this.text_container.html(this.options.insert_brs ? String(this.options.text).replace(/\n/g, "
      ") : this.options.text); - } - if (oldOpts.text === false) { - this.text_container.slideDown(200); - } - } - // Change the notice type. - if (this.options.type !== oldOpts.type) { - this.container.removeClass( - this.styles.error+" "+this.styles.notice+" "+this.styles.success+" "+this.styles.info - ).addClass(this.options.type === "error" ? - this.styles.error : - (this.options.type === "info" ? - this.styles.info : - (this.options.type === "success" ? - this.styles.success : - this.styles.notice - ) - ) - ); - } - if (this.options.icon !== oldOpts.icon || (this.options.icon === true && this.options.type !== oldOpts.type)) { - // Remove any old icon. - this.container.find("div.ui-pnotify-icon").remove(); - if (this.options.icon !== false) { - // Build the new icon. - $("
      ", {"class": "ui-pnotify-icon"}) - .append($("", {"class": this.options.icon === true ? (this.options.type === "error" ? this.styles.error_icon : (this.options.type === "info" ? this.styles.info_icon : (this.options.type === "success" ? this.styles.success_icon : this.styles.notice_icon))) : this.options.icon})) - .prependTo(this.container); - } - } - // Update the width. - if (this.options.width !== oldOpts.width) { - this.elem.animate({width: this.options.width}); - } - // Update the minimum height. - if (this.options.min_height !== oldOpts.min_height) { - this.container.animate({minHeight: this.options.min_height}); - } - // Update the timed hiding. - if (!this.options.hide) { - this.cancelRemove(); - } else if (!oldOpts.hide) { - this.queueRemove(); - } - this.queuePosition(true); - - // Run the modules. - this.runModules('update', oldOpts); - return this; - }, - - // Display the notice. - open: function(){ - this.state = "opening"; - // Run the modules. - this.runModules('beforeOpen'); - - var that = this; - // If the notice is not in the DOM, append it. - if (!this.elem.parent().length) { - this.elem.appendTo(this.options.stack.context ? this.options.stack.context : body); - } - // Try to put it in the right position. - if (this.options.stack.push !== "top") { - this.position(true); - } - this.animateIn(function(){ - that.queuePosition(true); - - // Now set it to hide. - if (that.options.hide) { - that.queueRemove(); - } - - that.state = "open"; - - // Run the modules. - that.runModules('afterOpen'); - }); - - return this; - }, - - // Remove the notice. - remove: function(timer_hide) { - this.state = "closing"; - this.timerHide = !!timer_hide; // Make sure it's a boolean. - // Run the modules. - this.runModules('beforeClose'); - - var that = this; - if (this.timer) { - root.clearTimeout(this.timer); - this.timer = null; - } - this.animateOut(function(){ - that.state = "closed"; - // Run the modules. - that.runModules('afterClose'); - that.queuePosition(true); - // If we're supposed to remove the notice from the DOM, do it. - if (that.options.remove) { - that.elem.detach(); - } - // Run the modules. - that.runModules('beforeDestroy'); - // Remove object from PNotify.notices to prevent memory leak (issue #49) - // unless destroy is off - if (that.options.destroy) { - if (PNotify.notices !== null) { - var idx = $.inArray(that, PNotify.notices); - if (idx !== -1) { - PNotify.notices.splice(idx,1); - } - } - } - // Run the modules. - that.runModules('afterDestroy'); - }); - - return this; - }, - - // === Class Methods === - - // Get the DOM element. - get: function(){ - return this.elem; - }, - - // Put all the options in the right places. - parseOptions: function(options, moreOptions){ - this.options = $.extend(true, {}, PNotify.prototype.options); - // This is the only thing that *should* be copied by reference. - this.options.stack = PNotify.prototype.options.stack; - var optArray = [options, moreOptions], curOpts; - for (var curIndex=0; curIndex < optArray.length; curIndex++) { - curOpts = optArray[curIndex]; - if (typeof curOpts === "undefined") { - break; - } - if (typeof curOpts !== 'object') { - this.options.text = curOpts; - } else { - for (var option in curOpts) { - if (this.modules[option]) { - // Avoid overwriting module defaults. - $.extend(true, this.options[option], curOpts[option]); - } else { - this.options[option] = curOpts[option]; - } - } - } - } - }, - - // Animate the notice in. - animateIn: function(callback){ - // Declare that the notice is animating in. - this.animating = "in"; - var that = this; - var finished = function(){ - if (that.animTimer) { - clearTimeout(that.animTimer); - } - if (that.animating !== "in") { - return; - } - if (that.elem.is(":visible")) { - if (callback) { - callback.call(); - } - // Declare that the notice has completed animating. - that.animating = false; - } else { - that.animTimer = setTimeout(finished, 40); - } - }; - - if (this.options.animation === "fade") { - this.elem.one('webkitTransitionEnd mozTransitionEnd MSTransitionEnd oTransitionEnd transitionend', finished).addClass("ui-pnotify-in"); - this.elem.css("opacity"); // This line is necessary for some reason. Some notices don't fade without it. - this.elem.addClass("ui-pnotify-fade-in"); - // Just in case the event doesn't fire, call it after 650 ms. - this.animTimer = setTimeout(finished, 650); - } else { - this.elem.addClass("ui-pnotify-in"); - finished(); - } - }, - - // Animate the notice out. - animateOut: function(callback){ - // Declare that the notice is animating out. - this.animating = "out"; - var that = this; - var finished = function(){ - if (that.animTimer) { - clearTimeout(that.animTimer); - } - if (that.animating !== "out") { - return; - } - if (that.elem.css("opacity") == "0" || !that.elem.is(":visible")) { - that.elem.removeClass("ui-pnotify-in"); - if (that.options.stack.overlay) { - // Go through the modal stack to see if any are left open. - // TODO: Rewrite this cause it sucks. - var stillOpen = false; - $.each(PNotify.notices, function(i, notice){ - if (notice != that && notice.options.stack === that.options.stack && notice.state != "closed") { - stillOpen = true; - } - }); - if (!stillOpen) { - that.options.stack.overlay.hide(); - } - } - if (callback) { - callback.call(); - } - // Declare that the notice has completed animating. - that.animating = false; - } else { - // In case this was called before the notice finished animating. - that.animTimer = setTimeout(finished, 40); - } - }; - - if (this.options.animation === "fade") { - this.elem.one('webkitTransitionEnd mozTransitionEnd MSTransitionEnd oTransitionEnd transitionend', finished).removeClass("ui-pnotify-fade-in"); - // Just in case the event doesn't fire, call it after 650 ms. - this.animTimer = setTimeout(finished, 650); - } else { - this.elem.removeClass("ui-pnotify-in"); - finished(); - } - }, - - // Position the notice. dont_skip_hidden causes the notice to - // position even if it's not visible. - position: function(dontSkipHidden){ - // Get the notice's stack. - var stack = this.options.stack, - elem = this.elem; - if (typeof stack.context === "undefined") { - stack.context = body; - } - if (!stack) { - return; - } - if (typeof stack.nextpos1 !== "number") { - stack.nextpos1 = stack.firstpos1; - } - if (typeof stack.nextpos2 !== "number") { - stack.nextpos2 = stack.firstpos2; - } - if (typeof stack.addpos2 !== "number") { - stack.addpos2 = 0; - } - var hidden = !elem.hasClass("ui-pnotify-in"); - // Skip this notice if it's not shown. - if (!hidden || dontSkipHidden) { - if (stack.modal) { - if (stack.overlay) { - stack.overlay.show(); - } else { - stack.overlay = createStackOverlay(stack); - } - } - // Add animate class by default. - elem.addClass("ui-pnotify-move"); - var curpos1, curpos2; - // Calculate the current pos1 value. - var csspos1; - switch (stack.dir1) { - case "down": - csspos1 = "top"; - break; - case "up": - csspos1 = "bottom"; - break; - case "left": - csspos1 = "right"; - break; - case "right": - csspos1 = "left"; - break; - } - curpos1 = parseInt(elem.css(csspos1).replace(/(?:\..*|[^0-9.])/g, '')); - if (isNaN(curpos1)) { - curpos1 = 0; - } - // Remember the first pos1, so the first visible notice goes there. - if (typeof stack.firstpos1 === "undefined" && !hidden) { - stack.firstpos1 = curpos1; - stack.nextpos1 = stack.firstpos1; - } - // Calculate the current pos2 value. - var csspos2; - switch (stack.dir2) { - case "down": - csspos2 = "top"; - break; - case "up": - csspos2 = "bottom"; - break; - case "left": - csspos2 = "right"; - break; - case "right": - csspos2 = "left"; - break; - } - curpos2 = parseInt(elem.css(csspos2).replace(/(?:\..*|[^0-9.])/g, '')); - if (isNaN(curpos2)) { - curpos2 = 0; - } - // Remember the first pos2, so the first visible notice goes there. - if (typeof stack.firstpos2 === "undefined" && !hidden) { - stack.firstpos2 = curpos2; - stack.nextpos2 = stack.firstpos2; - } - // Check that it's not beyond the viewport edge. - if ( - (stack.dir1 === "down" && stack.nextpos1 + elem.height() > (stack.context.is(body) ? jwindow.height() : stack.context.prop('scrollHeight')) ) || - (stack.dir1 === "up" && stack.nextpos1 + elem.height() > (stack.context.is(body) ? jwindow.height() : stack.context.prop('scrollHeight')) ) || - (stack.dir1 === "left" && stack.nextpos1 + elem.width() > (stack.context.is(body) ? jwindow.width() : stack.context.prop('scrollWidth')) ) || - (stack.dir1 === "right" && stack.nextpos1 + elem.width() > (stack.context.is(body) ? jwindow.width() : stack.context.prop('scrollWidth')) ) - ) { - // If it is, it needs to go back to the first pos1, and over on pos2. - stack.nextpos1 = stack.firstpos1; - stack.nextpos2 += stack.addpos2 + (typeof stack.spacing2 === "undefined" ? 25 : stack.spacing2); - stack.addpos2 = 0; - } - if (typeof stack.nextpos2 === "number") { - if (!stack.animation) { - elem.removeClass("ui-pnotify-move"); - elem.css(csspos2, stack.nextpos2+"px"); - elem.css(csspos2); - elem.addClass("ui-pnotify-move"); - } else { - elem.css(csspos2, stack.nextpos2+"px"); - } - } - // Keep track of the widest/tallest notice in the column/row, so we can push the next column/row. - switch (stack.dir2) { - case "down": - case "up": - if (elem.outerHeight(true) > stack.addpos2) { - stack.addpos2 = elem.height(); - } - break; - case "left": - case "right": - if (elem.outerWidth(true) > stack.addpos2) { - stack.addpos2 = elem.width(); - } - break; - } - // Move the notice on dir1. - if (typeof stack.nextpos1 === "number") { - if (!stack.animation) { - elem.removeClass("ui-pnotify-move"); - elem.css(csspos1, stack.nextpos1+"px"); - elem.css(csspos1); - elem.addClass("ui-pnotify-move"); - } else { - elem.css(csspos1, stack.nextpos1+"px"); - } - } - // Calculate the next dir1 position. - switch (stack.dir1) { - case "down": - case "up": - stack.nextpos1 += elem.height() + (typeof stack.spacing1 === "undefined" ? 25 : stack.spacing1); - break; - case "left": - case "right": - stack.nextpos1 += elem.width() + (typeof stack.spacing1 === "undefined" ? 25 : stack.spacing1); - break; - } - } - return this; - }, - // Queue the position all function so it doesn't run repeatedly and - // use up resources. - queuePosition: function(animate, milliseconds){ - if (posTimer) { - clearTimeout(posTimer); - } - if (!milliseconds) { - milliseconds = 10; - } - posTimer = setTimeout(function(){ - PNotify.positionAll(animate); - }, milliseconds); - return this; - }, - - - // Cancel any pending removal timer. - cancelRemove: function(){ - if (this.timer) { - root.clearTimeout(this.timer); - } - if (this.animTimer) { - root.clearTimeout(this.animTimer); - } - if (this.state === "closing") { - // If it's animating out, stop it. - this.state = "open"; - this.animating = false; - this.elem.addClass("ui-pnotify-in"); - if (this.options.animation === "fade") { - this.elem.addClass("ui-pnotify-fade-in"); - } - } - return this; - }, - // Queue a removal timer. - queueRemove: function(){ - var that = this; - // Cancel any current removal timer. - this.cancelRemove(); - this.timer = root.setTimeout(function(){ - that.remove(true); - }, (isNaN(this.options.delay) ? 0 : this.options.delay)); - return this; - } - }); - // These functions affect all notices. - $.extend(PNotify, { - // This holds all the notices. - notices: [], - reload: init, - removeAll: function(){ - $.each(PNotify.notices, function(i, notice){ - if (notice.remove) { - notice.remove(false); - } - }); - }, - removeStack: function(stack){ - $.each(PNotify.notices, function(i, notice){ - if (notice.remove && notice.options.stack === stack) { - notice.remove(false); - } - }); - }, - positionAll: function(animate){ - // This timer is used for queueing this function so it doesn't run - // repeatedly. - if (posTimer) { - clearTimeout(posTimer); - } - posTimer = null; - // Reset the next position data. - if (PNotify.notices && PNotify.notices.length) { - $.each(PNotify.notices, function(i, notice){ - var s = notice.options.stack; - if (!s) { - return; - } - if (s.overlay) { - s.overlay.hide(); - } - s.nextpos1 = s.firstpos1; - s.nextpos2 = s.firstpos2; - s.addpos2 = 0; - s.animation = animate; - }); - $.each(PNotify.notices, function(i, notice){ - notice.position(); - }); - } else { - var s = PNotify.prototype.options.stack; - if (s) { - delete s.nextpos1; - delete s.nextpos2; - } - } - }, - styling: { - brighttheme: { - // Bright Theme doesn't require any UI libraries. - container: "brighttheme", - notice: "brighttheme-notice", - notice_icon: "brighttheme-icon-notice", - info: "brighttheme-info", - info_icon: "brighttheme-icon-info", - success: "brighttheme-success", - success_icon: "brighttheme-icon-success", - error: "brighttheme-error", - error_icon: "brighttheme-icon-error" - }, - bootstrap3: { - container: "alert", - notice: "alert-warning", - notice_icon: "glyphicon glyphicon-exclamation-sign", - info: "alert-info", - info_icon: "glyphicon glyphicon-info-sign", - success: "alert-success", - success_icon: "glyphicon glyphicon-ok-sign", - error: "alert-danger", - error_icon: "glyphicon glyphicon-warning-sign" - } - } - }); - /* - * uses icons from http://fontawesome.io/ - * version 4.0.3 - */ - PNotify.styling.fontawesome = $.extend({}, PNotify.styling.bootstrap3); - $.extend(PNotify.styling.fontawesome, { - notice_icon: "fa fa-exclamation-circle", - info_icon: "fa fa-info", - success_icon: "fa fa-check", - error_icon: "fa fa-warning" - }); - - if (root.document.body) { - do_when_ready(); - } else { - $(do_when_ready); - } - return PNotify; -}; -return init(root); -})); diff --git a/js/lib/pnotify/pnotify.nonblock.js b/js/lib/pnotify/pnotify.nonblock.js deleted file mode 100644 index 9c5f07f7..00000000 --- a/js/lib/pnotify/pnotify.nonblock.js +++ /dev/null @@ -1,157 +0,0 @@ -// Nonblock -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as a module. - define('pnotify.nonblock', ['jquery', 'pnotify'], factory); - } else if (typeof exports === 'object' && typeof module !== 'undefined') { - // CommonJS - module.exports = factory(require('jquery'), require('./pnotify')); - } else { - // Browser globals - factory(root.jQuery, root.PNotify); - } -}(typeof window !== "undefined" ? window : this, function($, PNotify){ - // Some useful regexes. - var re_on = /^on/, - re_mouse_events = /^(dbl)?click$|^mouse(move|down|up|over|out|enter|leave)$|^contextmenu$/, - re_ui_events = /^(focus|blur|select|change|reset)$|^key(press|down|up)$/, - re_html_events = /^(scroll|resize|(un)?load|abort|error)$/; - // Fire a DOM event. - var dom_event = function(e, orig_e){ - var event_object; - e = e.toLowerCase(); - if (document.createEvent && this.dispatchEvent) { - // FireFox, Opera, Safari, Chrome - e = e.replace(re_on, ''); - if (e.match(re_mouse_events)) { - // This allows the click event to fire on the notice. There is - // probably a much better way to do it. - $(this).offset(); - event_object = document.createEvent("MouseEvents"); - event_object.initMouseEvent( - e, orig_e.bubbles, orig_e.cancelable, orig_e.view, orig_e.detail, - orig_e.screenX, orig_e.screenY, orig_e.clientX, orig_e.clientY, - orig_e.ctrlKey, orig_e.altKey, orig_e.shiftKey, orig_e.metaKey, orig_e.button, orig_e.relatedTarget - ); - } else if (e.match(re_ui_events)) { - event_object = document.createEvent("UIEvents"); - event_object.initUIEvent(e, orig_e.bubbles, orig_e.cancelable, orig_e.view, orig_e.detail); - } else if (e.match(re_html_events)) { - event_object = document.createEvent("HTMLEvents"); - event_object.initEvent(e, orig_e.bubbles, orig_e.cancelable); - } - if (!event_object) return; - this.dispatchEvent(event_object); - } else { - // Internet Explorer - if (!e.match(re_on)) e = "on"+e; - event_object = document.createEventObject(orig_e); - this.fireEvent(e, event_object); - } - }; - - - // This keeps track of the last element the mouse was over, so - // mouseleave, mouseenter, etc can be called. - var nonblock_last_elem; - // This is used to pass events through the notice if it is non-blocking. - var nonblock_pass = function(notice, e, e_name){ - notice.elem.addClass("ui-pnotify-nonblock-hide"); - var element_below = document.elementFromPoint(e.clientX, e.clientY); - notice.elem.removeClass("ui-pnotify-nonblock-hide"); - var jelement_below = $(element_below); - var cursor_style = jelement_below.css("cursor"); - if (cursor_style === "auto" && element_below.tagName === "A") { - cursor_style = "pointer"; - } - notice.elem.css("cursor", cursor_style !== "auto" ? cursor_style : "default"); - // If the element changed, call mouseenter, mouseleave, etc. - if (!nonblock_last_elem || nonblock_last_elem.get(0) != element_below) { - if (nonblock_last_elem) { - dom_event.call(nonblock_last_elem.get(0), "mouseleave", e.originalEvent); - dom_event.call(nonblock_last_elem.get(0), "mouseout", e.originalEvent); - } - dom_event.call(element_below, "mouseenter", e.originalEvent); - dom_event.call(element_below, "mouseover", e.originalEvent); - } - dom_event.call(element_below, e_name, e.originalEvent); - // Remember the latest element the mouse was over. - nonblock_last_elem = jelement_below; - }; - - - PNotify.prototype.options.nonblock = { - // Create a non-blocking notice. It lets the user click elements underneath it. - nonblock: false - }; - PNotify.prototype.modules.nonblock = { - init: function(notice, options){ - var that = this; - notice.elem.on({ - "mouseenter": function(e){ - if (that.options.nonblock) { - e.stopPropagation(); - } - if (that.options.nonblock) { - // If it's non-blocking, animate to the other opacity. - notice.elem.addClass("ui-pnotify-nonblock-fade"); - } - }, - "mouseleave": function(e){ - if (that.options.nonblock) { - e.stopPropagation(); - } - nonblock_last_elem = null; - notice.elem.css("cursor", "auto"); - // Animate back to the normal opacity. - if (that.options.nonblock && notice.animating !== "out") { - notice.elem.removeClass("ui-pnotify-nonblock-fade"); - } - }, - "mouseover": function(e){ - if (that.options.nonblock) { - e.stopPropagation(); - } - }, - "mouseout": function(e){ - if (that.options.nonblock) { - e.stopPropagation(); - } - }, - "mousemove": function(e){ - if (that.options.nonblock) { - e.stopPropagation(); - nonblock_pass(notice, e, "onmousemove"); - } - }, - "mousedown": function(e){ - if (that.options.nonblock) { - e.stopPropagation(); - e.preventDefault(); - nonblock_pass(notice, e, "onmousedown"); - } - }, - "mouseup": function(e){ - if (that.options.nonblock) { - e.stopPropagation(); - e.preventDefault(); - nonblock_pass(notice, e, "onmouseup"); - } - }, - "click": function(e){ - if (that.options.nonblock) { - e.stopPropagation(); - nonblock_pass(notice, e, "onclick"); - } - }, - "dblclick": function(e){ - if (that.options.nonblock) { - e.stopPropagation(); - nonblock_pass(notice, e, "ondblclick"); - } - } - }); - } - }; - return PNotify; -})); diff --git a/js/lib/raphael.min.js b/js/lib/raphael.min.js index 6ae5cabf..be15ce60 100644 --- a/js/lib/raphael.min.js +++ b/js/lib/raphael.min.js @@ -1 +1 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Raphael=e():t.Raphael=e()}(window,function(){return function(t){var e={};function r(i){if(e[i])return e[i].exports;var n=e[i]={i:i,l:!1,exports:{}};return t[i].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=t,r.c=e,r.d=function(t,e,i){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(r.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var n in t)r.d(i,n,function(e){return t[e]}.bind(null,n));return i},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=1)}([function(t,e,r){var i,n;i=[r(2)],void 0===(n=function(t){function e(i){if(e.is(i,"function"))return r?i():t.on("raphael.DOMload",i);if(e.is(i,A))return e._engine.create[c](e,i.splice(0,3+e.is(i[0],T))).add(i);var n=Array.prototype.slice.call(arguments,0);if(e.is(n[n.length-1],"function")){var a=n.pop();return r?a.call(e._engine.create[c](e,n)):t.on("raphael.DOMload",function(){a.call(e._engine.create[c](e,n))})}return e._engine.create[c](e,arguments)}e.version="2.2.0",e.eve=t;var r,i,n=/[, ]+/,a={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},s=/\{(\d+)\}/g,o="hasOwnProperty",l={doc:document,win:window},h={was:Object.prototype[o].call(l.win,"Raphael"),is:l.win.Raphael},u=function(){this.ca=this.customAttributes={}},c="apply",f="concat",p="ontouchstart"in window||window.TouchEvent||window.DocumentTouch&&document instanceof DocumentTouch,d="",g=" ",x=String,v="split",y="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[v](g),m={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},b=x.prototype.toLowerCase,_=Math,w=_.max,k=_.min,B=_.abs,C=_.pow,S=_.PI,T="number",A="array",M=Object.prototype.toString,E=(e._ISURL=/^url\(['"]?(.+?)['"]?\)$/i,/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i),N={NaN:1,Infinity:1,"-Infinity":1},L=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,P=_.round,z=parseFloat,F=parseInt,R=x.prototype.toUpperCase,j=e._availableAttrs={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/","letter-spacing":0,opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0,class:""},I=e._availableAnimAttrs={blur:T,"clip-rect":"csv",cx:T,cy:T,fill:"colour","fill-opacity":T,"font-size":T,height:T,opacity:T,path:"path",r:T,rx:T,ry:T,stroke:"colour","stroke-opacity":T,"stroke-width":T,transform:"transform",width:T,x:T,y:T},D=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/,q={hs:1,rg:1},O=/,?([achlmqrstvxz]),?/gi,V=/([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,W=/([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,Y=/(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/gi,G=(e._radial_gradient=/^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/,{}),H=function(t,e){return z(t)-z(e)},X=function(t){return t},U=e._rectPath=function(t,e,r,i,n){return n?[["M",t+n,e],["l",r-2*n,0],["a",n,n,0,0,1,n,n],["l",0,i-2*n],["a",n,n,0,0,1,-n,n],["l",2*n-r,0],["a",n,n,0,0,1,-n,-n],["l",0,2*n-i],["a",n,n,0,0,1,n,-n],["z"]]:[["M",t,e],["l",r,0],["l",0,i],["l",-r,0],["z"]]},$=function(t,e,r,i){return null==i&&(i=r),[["M",t,e],["m",0,-i],["a",r,i,0,1,1,0,2*i],["a",r,i,0,1,1,0,-2*i],["z"]]},Z=e._getPath={path:function(t){return t.attr("path")},circle:function(t){var e=t.attrs;return $(e.cx,e.cy,e.r)},ellipse:function(t){var e=t.attrs;return $(e.cx,e.cy,e.rx,e.ry)},rect:function(t){var e=t.attrs;return U(e.x,e.y,e.width,e.height,e.r)},image:function(t){var e=t.attrs;return U(e.x,e.y,e.width,e.height)},text:function(t){var e=t._getBBox();return U(e.x,e.y,e.width,e.height)},set:function(t){var e=t._getBBox();return U(e.x,e.y,e.width,e.height)}},Q=e.mapPath=function(t,e){if(!e)return t;var r,i,n,a,s,o,l;for(n=0,s=(t=Tt(t)).length;n',(J=K.firstChild).style.behavior="url(#default#VML)",!J||"object"!=typeof J.adj)return e.type=d;K=null}function tt(t){if("function"==typeof t||Object(t)!==t)return t;var e=new t.constructor;for(var r in t)t[o](r)&&(e[r]=tt(t[r]));return e}e.svg=!(e.vml="VML"==e.type),e._Paper=u,e.fn=i=u.prototype=e.prototype,e._id=0,e.is=function(t,e){return"finite"==(e=b.call(e))?!N[o](+t):"array"==e?t instanceof Array:"null"==e&&null===t||e==typeof t&&null!==t||"object"==e&&t===Object(t)||"array"==e&&Array.isArray&&Array.isArray(t)||M.call(t).slice(8,-1).toLowerCase()==e},e.angle=function(t,r,i,n,a,s){if(null==a){var o=t-i,l=r-n;return o||l?(180+180*_.atan2(-l,-o)/S+360)%360:0}return e.angle(t,r,a,s)-e.angle(i,n,a,s)},e.rad=function(t){return t%360*S/180},e.deg=function(t){return Math.round(180*t/S%360*1e3)/1e3},e.snapTo=function(t,r,i){if(i=e.is(i,"finite")?i:10,e.is(t,A)){for(var n=t.length;n--;)if(B(t[n]-r)<=i)return t[n]}else{var a=r%(t=+t);if(at-i)return r-a+t}return r};var et,rt;e.createUUID=(et=/[xy]/g,rt=function(t){var e=16*_.random()|0;return("x"==t?e:3&e|8).toString(16)},function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(et,rt).toUpperCase()});e.setWindow=function(r){t("raphael.setWindow",e,l.win,r),l.win=r,l.doc=l.win.document,e._engine.initWin&&e._engine.initWin(l.win)};var it=function(t){if(e.vml){var r,i=/^\s+|\s+$/g;try{var n=new ActiveXObject("htmlfile");n.write(""),n.close(),r=n.body}catch(t){r=createPopup().document.body}var a=r.createTextRange();it=ht(function(t){try{r.style.color=x(t).replace(i,d);var e=a.queryCommandValue("ForeColor");return"#"+("000000"+(e=(255&e)<<16|65280&e|(16711680&e)>>>16).toString(16)).slice(-6)}catch(t){return"none"}})}else{var s=l.doc.createElement("i");s.title="Raphaël Colour Picker",s.style.display="none",l.doc.body.appendChild(s),it=ht(function(t){return s.style.color=t,l.doc.defaultView.getComputedStyle(s,d).getPropertyValue("color")})}return it(t)},nt=function(){return"hsb("+[this.h,this.s,this.b]+")"},at=function(){return"hsl("+[this.h,this.s,this.l]+")"},st=function(){return this.hex},ot=function(t,r,i){if(null==r&&e.is(t,"object")&&"r"in t&&"g"in t&&"b"in t&&(i=t.b,r=t.g,t=t.r),null==r&&e.is(t,"string")){var n=e.getRGB(t);t=n.r,r=n.g,i=n.b}return(t>1||r>1||i>1)&&(t/=255,r/=255,i/=255),[t,r,i]},lt=function(t,r,i,n){var a={r:t*=255,g:r*=255,b:i*=255,hex:e.rgb(t,r,i),toString:st};return e.is(n,"finite")&&(a.opacity=n),a};function ht(t,e,r){return function i(){var n=Array.prototype.slice.call(arguments,0),a=n.join("␀"),s=i.cache=i.cache||{},l=i.count=i.count||[];return s[o](a)?(function(t,e){for(var r=0,i=t.length;r=1e3&&delete s[l.shift()],l.push(a),s[a]=t[c](e,n),r?r(s[a]):s[a])}}e.color=function(t){var r;return e.is(t,"object")&&"h"in t&&"s"in t&&"b"in t?(r=e.hsb2rgb(t),t.r=r.r,t.g=r.g,t.b=r.b,t.hex=r.hex):e.is(t,"object")&&"h"in t&&"s"in t&&"l"in t?(r=e.hsl2rgb(t),t.r=r.r,t.g=r.g,t.b=r.b,t.hex=r.hex):(e.is(t,"string")&&(t=e.getRGB(t)),e.is(t,"object")&&"r"in t&&"g"in t&&"b"in t?(r=e.rgb2hsl(t),t.h=r.h,t.s=r.s,t.l=r.l,r=e.rgb2hsb(t),t.v=r.b):(t={hex:"none"}).r=t.g=t.b=t.h=t.s=t.v=t.l=-1),t.toString=st,t},e.hsb2rgb=function(t,e,r,i){var n,a,s,o,l;return this.is(t,"object")&&"h"in t&&"s"in t&&"b"in t&&(r=t.b,e=t.s,i=t.o,t=t.h),o=(l=r*e)*(1-B((t=(t*=360)%360/60)%2-1)),n=a=s=r-l,lt(n+=[l,o,0,0,o,l][t=~~t],a+=[o,l,l,o,0,0][t],s+=[0,0,o,l,l,o][t],i)},e.hsl2rgb=function(t,e,r,i){var n,a,s,o,l;return this.is(t,"object")&&"h"in t&&"s"in t&&"l"in t&&(r=t.l,e=t.s,t=t.h),(t>1||e>1||r>1)&&(t/=360,e/=100,r/=100),o=(l=2*e*(r<.5?r:1-r))*(1-B((t=(t*=360)%360/60)%2-1)),n=a=s=r-l/2,lt(n+=[l,o,0,0,o,l][t=~~t],a+=[o,l,l,o,0,0][t],s+=[0,0,o,l,l,o][t],i)},e.rgb2hsb=function(t,e,r){var i,n;return t=(r=ot(t,e,r))[0],e=r[1],r=r[2],{h:((0==(n=(i=w(t,e,r))-k(t,e,r))?null:i==t?(e-r)/n:i==e?(r-t)/n+2:(t-e)/n+4)+360)%6*60/360,s:0==n?0:n/i,b:i,toString:nt}},e.rgb2hsl=function(t,e,r){var i,n,a,s;return t=(r=ot(t,e,r))[0],e=r[1],r=r[2],i=((n=w(t,e,r))+(a=k(t,e,r)))/2,{h:((0==(s=n-a)?null:n==t?(e-r)/s:n==e?(r-t)/s+2:(t-e)/s+4)+360)%6*60/360,s:0==s?0:i<.5?s/(2*i):s/(2-2*i),l:i,toString:at}},e._path2string=function(){return this.join(",").replace(O,"$1")};e._preload=function(t,e){var r=l.doc.createElement("img");r.style.cssText="position:absolute;left:-9999em;top:-9999em",r.onload=function(){e.call(this),this.onload=null,l.doc.body.removeChild(this)},r.onerror=function(){l.doc.body.removeChild(this)},l.doc.body.appendChild(r),r.src=t};function ut(){return this.hex}function ct(t,e){for(var r=[],i=0,n=t.length;n-2*!e>i;i+=2){var a=[{x:+t[i-2],y:+t[i-1]},{x:+t[i],y:+t[i+1]},{x:+t[i+2],y:+t[i+3]},{x:+t[i+4],y:+t[i+5]}];e?i?n-4==i?a[3]={x:+t[0],y:+t[1]}:n-2==i&&(a[2]={x:+t[0],y:+t[1]},a[3]={x:+t[2],y:+t[3]}):a[0]={x:+t[n-2],y:+t[n-1]}:n-4==i?a[3]=a[2]:i||(a[0]={x:+t[i],y:+t[i+1]}),r.push(["C",(-a[0].x+6*a[1].x+a[2].x)/6,(-a[0].y+6*a[1].y+a[2].y)/6,(a[1].x+6*a[2].x-a[3].x)/6,(a[1].y+6*a[2].y-a[3].y)/6,a[2].x,a[2].y])}return r}e.getRGB=ht(function(t){if(!t||(t=x(t)).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:ut};if("none"==t)return{r:-1,g:-1,b:-1,hex:"none",toString:ut};!q[o](t.toLowerCase().substring(0,2))&&"#"!=t.charAt()&&(t=it(t));var r,i,n,a,s,l,h=t.match(E);return h?(h[2]&&(n=F(h[2].substring(5),16),i=F(h[2].substring(3,5),16),r=F(h[2].substring(1,3),16)),h[3]&&(n=F((s=h[3].charAt(3))+s,16),i=F((s=h[3].charAt(2))+s,16),r=F((s=h[3].charAt(1))+s,16)),h[4]&&(l=h[4][v](D),r=z(l[0]),"%"==l[0].slice(-1)&&(r*=2.55),i=z(l[1]),"%"==l[1].slice(-1)&&(i*=2.55),n=z(l[2]),"%"==l[2].slice(-1)&&(n*=2.55),"rgba"==h[1].toLowerCase().slice(0,4)&&(a=z(l[3])),l[3]&&"%"==l[3].slice(-1)&&(a/=100)),h[5]?(l=h[5][v](D),r=z(l[0]),"%"==l[0].slice(-1)&&(r*=2.55),i=z(l[1]),"%"==l[1].slice(-1)&&(i*=2.55),n=z(l[2]),"%"==l[2].slice(-1)&&(n*=2.55),("deg"==l[0].slice(-3)||"°"==l[0].slice(-1))&&(r/=360),"hsba"==h[1].toLowerCase().slice(0,4)&&(a=z(l[3])),l[3]&&"%"==l[3].slice(-1)&&(a/=100),e.hsb2rgb(r,i,n,a)):h[6]?(l=h[6][v](D),r=z(l[0]),"%"==l[0].slice(-1)&&(r*=2.55),i=z(l[1]),"%"==l[1].slice(-1)&&(i*=2.55),n=z(l[2]),"%"==l[2].slice(-1)&&(n*=2.55),("deg"==l[0].slice(-3)||"°"==l[0].slice(-1))&&(r/=360),"hsla"==h[1].toLowerCase().slice(0,4)&&(a=z(l[3])),l[3]&&"%"==l[3].slice(-1)&&(a/=100),e.hsl2rgb(r,i,n,a)):((h={r:r,g:i,b:n,toString:ut}).hex="#"+(16777216|n|i<<8|r<<16).toString(16).slice(1),e.is(a,"finite")&&(h.opacity=a),h)):{r:-1,g:-1,b:-1,hex:"none",error:1,toString:ut}},e),e.hsb=ht(function(t,r,i){return e.hsb2rgb(t,r,i).hex}),e.hsl=ht(function(t,r,i){return e.hsl2rgb(t,r,i).hex}),e.rgb=ht(function(t,e,r){function i(t){return t+.5|0}return"#"+(16777216|i(r)|i(e)<<8|i(t)<<16).toString(16).slice(1)}),e.getColor=function(t){var e=this.getColor.start=this.getColor.start||{h:0,s:1,b:t||.75},r=this.hsb2rgb(e.h,e.s,e.b);return e.h+=.075,e.h>1&&(e.h=0,e.s-=.2,e.s<=0&&(this.getColor.start={h:0,s:1,b:e.b})),r.hex},e.getColor.reset=function(){delete this.start},e.parsePathString=function(t){if(!t)return null;var r=ft(t);if(r.arr)return mt(r.arr);var i={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},n=[];return e.is(t,A)&&e.is(t[0],A)&&(n=mt(t)),n.length||x(t).replace(V,function(t,e,r){var a=[],s=e.toLowerCase();if(r.replace(Y,function(t,e){e&&a.push(+e)}),"m"==s&&a.length>2&&(n.push([e][f](a.splice(0,2))),s="l",e="m"==e?"l":"L"),"r"==s)n.push([e][f](a));else for(;a.length>=i[s]&&(n.push([e][f](a.splice(0,i[s]))),i[s]););}),n.toString=e._path2string,r.arr=mt(n),n},e.parseTransformString=ht(function(t){if(!t)return null;var r=[];return e.is(t,A)&&e.is(t[0],A)&&(r=mt(t)),r.length||x(t).replace(W,function(t,e,i){var n=[];b.call(e);i.replace(Y,function(t,e){e&&n.push(+e)}),r.push([e][f](n))}),r.toString=e._path2string,r},this,function(t){if(!t)return t;for(var e=[],r=0;r1?1:l<0?0:l)/2,u=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],c=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],f=0,p=0;p<12;p++){var d=h*u[p]+h,g=pt(d,t,r,n,s),x=pt(d,e,i,a,o),v=g*g+x*x;f+=c[p]*_.sqrt(v)}return h*f}function gt(t,e,r,i,n,a,s,o){if(!(w(t,r)w(n,s)||w(e,i)w(a,o))){var l=(t-r)*(a-o)-(e-i)*(n-s);if(l){var h=((t*i-e*r)*(n-s)-(t-r)*(n*o-a*s))/l,u=((t*i-e*r)*(a-o)-(e-i)*(n*o-a*s))/l,c=+h.toFixed(2),f=+u.toFixed(2);if(!(c<+k(t,r).toFixed(2)||c>+w(t,r).toFixed(2)||c<+k(n,s).toFixed(2)||c>+w(n,s).toFixed(2)||f<+k(e,i).toFixed(2)||f>+w(e,i).toFixed(2)||f<+k(a,o).toFixed(2)||f>+w(a,o).toFixed(2)))return{x:h,y:u}}}}function xt(t,r,i){var n=e.bezierBBox(t),a=e.bezierBBox(r);if(!e.isBBoxIntersect(n,a))return i?0:[];for(var s=dt.apply(0,t),o=dt.apply(0,r),l=w(~~(s/5),1),h=w(~~(o/5),1),u=[],c=[],f={},p=i?0:[],d=0;d=0&&T<=1.001&&A>=0&&A<=1.001&&(i?p++:p.push({x:S.x,y:S.y,t1:k(T,1),t2:k(A,1)}))}}return p}function vt(t,r,i){t=e._path2curve(t),r=e._path2curve(r);for(var n,a,s,o,l,h,u,c,f,p,d=i?0:[],g=0,x=t.length;gy||v=t.x&&e<=t.x2&&r>=t.y&&r<=t.y2},e.isBBoxIntersect=function(t,r){var i=e.isPointInsideBBox;return i(r,t.x,t.y)||i(r,t.x2,t.y)||i(r,t.x,t.y2)||i(r,t.x2,t.y2)||i(t,r.x,r.y)||i(t,r.x2,r.y)||i(t,r.x,r.y2)||i(t,r.x2,r.y2)||(t.xr.x||r.xt.x)&&(t.yr.y||r.yt.y)},e.pathIntersection=function(t,e){return vt(t,e)},e.pathIntersectionNumber=function(t,e){return vt(t,e,1)},e.isPointInsidePath=function(t,r,i){var n=e.pathBBox(t);return e.isPointInsideBBox(n,r,i)&&vt(t,[["M",r,i],["H",n.x2+10]],1)%2==1},e._removedFactory=function(e){return function(){t("raphael.log",null,"Raphaël: you are calling to method “"+e+"” of removed object",e)}};var yt=e.pathBBox=function(t){var e=ft(t);if(e.bbox)return tt(e.bbox);if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0};for(var r,i=0,n=0,a=[],s=[],o=0,l=(t=Tt(t)).length;o1&&(r*=m=_.sqrt(m),i*=m);var b=r*r,w=i*i,k=(a==s?-1:1)*_.sqrt(B((b*w-b*y*y-w*x*x)/(b*y*y+w*x*x))),C=k*r*y/i+(t+o)/2,T=k*-i*x/r+(e+l)/2,A=_.asin(((e-T)/i).toFixed(9)),M=_.asin(((l-T)/i).toFixed(9));(A=tM&&(A-=2*S),!s&&M>A&&(M-=2*S)}var E=M-A;if(B(E)>c){var N=M,L=o,P=l;M=A+c*(s&&M>A?1:-1),o=C+r*_.cos(M),l=T+i*_.sin(M),d=Bt(o,l,r,i,n,0,s,L,P,[M,N,C,T])}E=M-A;var z=_.cos(A),F=_.sin(A),R=_.cos(M),j=_.sin(M),I=_.tan(E/4),D=4/3*r*I,q=4/3*i*I,O=[t,e],V=[t+D*F,e-q*z],W=[o+D*j,l-q*R],Y=[o,l];if(V[0]=2*O[0]-V[0],V[1]=2*O[1]-V[1],h)return[V,W,Y][f](d);for(var G=[],H=0,X=(d=[V,W,Y][f](d).join()[v](",")).length;H"1e12"&&(p=.5),B(d)>"1e12"&&(d=.5),p>0&&p<1&&(l=Ct(t,e,r,i,n,a,s,o,p),x.push(l.x),g.push(l.y)),d>0&&d<1&&(l=Ct(t,e,r,i,n,a,s,o,d),x.push(l.x),g.push(l.y)),h=a-2*i+e-(o-2*a+i),f=e-i,p=(-(u=2*(i-e)-2*(a-i))+_.sqrt(u*u-4*h*f))/2/h,d=(-u-_.sqrt(u*u-4*h*f))/2/h,B(p)>"1e12"&&(p=.5),B(d)>"1e12"&&(d=.5),p>0&&p<1&&(l=Ct(t,e,r,i,n,a,s,o,p),x.push(l.x),g.push(l.y)),d>0&&d<1&&(l=Ct(t,e,r,i,n,a,s,o,d),x.push(l.x),g.push(l.y)),{min:{x:k[c](0,x),y:k[c](0,g)},max:{x:w[c](0,x),y:w[c](0,g)}}}),Tt=e._path2curve=ht(function(t,e){var r=!e&&ft(t);if(!e&&r.curve)return mt(r.curve);for(var i=_t(t),n=e&&_t(e),a={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},s={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},o=function(t,e,r){var i,n;if(!t)return["C",e.x,e.y,e.x,e.y,e.x,e.y];switch(!(t[0]in{T:1,Q:1})&&(e.qx=e.qy=null),t[0]){case"M":e.X=t[1],e.Y=t[2];break;case"A":t=["C"][f](Bt[c](0,[e.x,e.y][f](t.slice(1))));break;case"S":"C"==r||"S"==r?(i=2*e.x-e.bx,n=2*e.y-e.by):(i=e.x,n=e.y),t=["C",i,n][f](t.slice(1));break;case"T":"Q"==r||"T"==r?(e.qx=2*e.x-e.qx,e.qy=2*e.y-e.qy):(e.qx=e.x,e.qy=e.y),t=["C"][f](kt(e.x,e.y,e.qx,e.qy,t[1],t[2]));break;case"Q":e.qx=t[1],e.qy=t[2],t=["C"][f](kt(e.x,e.y,t[1],t[2],t[3],t[4]));break;case"L":t=["C"][f](wt(e.x,e.y,t[1],t[2]));break;case"H":t=["C"][f](wt(e.x,e.y,t[1],e.y));break;case"V":t=["C"][f](wt(e.x,e.y,e.x,t[1]));break;case"Z":t=["C"][f](wt(e.x,e.y,e.X,e.Y))}return t},l=function(t,e){if(t[e].length>7){t[e].shift();for(var r=t[e];r.length;)u[e]="A",n&&(p[e]="A"),t.splice(e++,0,["C"][f](r.splice(0,6)));t.splice(e,1),v=w(i.length,n&&n.length||0)}},h=function(t,e,r,a,s){t&&e&&"M"==t[s][0]&&"M"!=e[s][0]&&(e.splice(s,0,["M",a.x,a.y]),r.bx=0,r.by=0,r.x=t[s][1],r.y=t[s][2],v=w(i.length,n&&n.length||0))},u=[],p=[],d="",g="",x=0,v=w(i.length,n&&n.length||0);x.01;)h=dt(t,e,r,i,n,a,s,o,c+=(hn){if(r&&!f.start){if(c+=["C"+(u=Xt(s,o,l[1],l[2],l[3],l[4],l[5],l[6],n-p)).start.x,u.start.y,u.m.x,u.m.y,u.x,u.y],a)return c;f.start=c,c=["M"+u.x,u.y+"C"+u.n.x,u.n.y,u.end.x,u.end.y,l[5],l[6]].join(),p+=h,s=+l[5],o=+l[6];continue}if(!t&&!r)return{x:(u=Xt(s,o,l[1],l[2],l[3],l[4],l[5],l[6],n-p)).x,y:u.y,alpha:u.alpha}}p+=h,s=+l[5],o=+l[6]}c+=l.shift()+l}return f.end=c,(u=t?p:r?f:e.findDotsAtSegment(s,o,l[0],l[1],l[2],l[3],l[4],l[5],1)).alpha&&(u={x:u.x,y:u.y,alpha:u.alpha}),u}},$t=Ut(1),Zt=Ut(),Qt=Ut(0,1);e.getTotalLength=$t,e.getPointAtLength=Zt,e.getSubpath=function(t,e,r){if(this.getTotalLength(t)-r<1e-6)return Qt(t,e).end;var i=Qt(t,r,1);return e?Qt(i,e).end:i},Wt.getTotalLength=function(){var t=this.getPath();if(t)return this.node.getTotalLength?this.node.getTotalLength():$t(t)},Wt.getPointAtLength=function(t){var e=this.getPath();if(e)return Zt(e,t)},Wt.getPath=function(){var t,r=e._getPath[this.type];if("text"!=this.type&&"set"!=this.type)return r&&(t=r(this)),t},Wt.getSubpath=function(t,r){var i=this.getPath();if(i)return e.getSubpath(i,t,r)};var Jt=e.easing_formulas={linear:function(t){return t},"<":function(t){return C(t,1.7)},">":function(t){return C(t,.48)},"<>":function(t){var e=.48-t/1.04,r=_.sqrt(.1734+e*e),i=r-e,n=-r-e,a=C(B(i),1/3)*(i<0?-1:1)+C(B(n),1/3)*(n<0?-1:1)+.5;return 3*(1-a)*a*a+a*a*a},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},elastic:function(t){return t==!!t?t:C(2,-10*t)*_.sin(2*S*(t-.075)/.3)+1},bounce:function(t){var e=7.5625,r=2.75;return t<1/r?e*t*t:t<2/r?e*(t-=1.5/r)*t+.75:t<2.5/r?e*(t-=2.25/r)*t+.9375:e*(t-=2.625/r)*t+.984375}};Jt.easeIn=Jt["ease-in"]=Jt["<"],Jt.easeOut=Jt["ease-out"]=Jt[">"],Jt.easeInOut=Jt["ease-in-out"]=Jt["<>"],Jt["back-in"]=Jt.backIn,Jt["back-out"]=Jt.backOut;var Kt=[],te=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){setTimeout(t,16)},ee=function(){for(var r=+new Date,i=0;i1&&!n.next){for(s in d)d[o](s)&&(y[s]=n.totalOrigin[s]);n.el.attr(y),ae(n.anim,n.el,n.anim.percents[0],null,n.totalOrigin,n.repeat-1)}n.next&&!n.stop&&ae(n.anim,n.el,n.next,null,n.totalOrigin,n.repeat)}}}Kt.length&&te(ee)},re=function(t){return t>255?255:t<0?0:t};function ie(t,e,r,i,n,a){var s=3*e,o=3*(i-e)-s,l=1-s-o,h=3*r,u=3*(n-r)-h,c=1-h-u;function f(t){return((l*t+o)*t+s)*t}return function(t,e){var r=function(t,e){var r,i,n,a,h,u;for(n=t,u=0;u<8;u++){if(a=f(n)-t,B(a)i)return i;for(;ra?r=n:i=n,n=(i-r)/2+r}return n}(t,e);return((c*r+u)*r+h)*r}(t,1/(200*a))}function ne(t,e){var r=[],i={};if(this.ms=e,this.times=1,t){for(var n in t)t[o](n)&&(i[z(n)]=t[n],r.push(z(n)));r.sort(H)}this.anim=i,this.top=r[r.length-1],this.percents=r}function ae(r,i,a,s,l,h){a=z(a);var u,c,p,d,g,y,m=r.ms,b={},_={},w={};if(s)for(B=0,C=Kt.length;Bs*r.top){a=r.percents[B],g=r.percents[B-1]||0,m=m/r.top*(a-g),d=r.percents[B+1],u=r.anim[a];break}s&&i.attr(r.anim[r.percents[B]])}if(u){if(c)c.initstatus=s,c.start=new Date-c.ms*s;else{for(var S in u)if(u[o](S)&&(I[o](S)||i.paper.customAttributes[o](S)))switch(b[S]=i.attr(S),null==b[S]&&(b[S]=j[S]),_[S]=u[S],I[S]){case T:w[S]=(_[S]-b[S])/m;break;case"colour":b[S]=e.getRGB(b[S]);var A=e.getRGB(_[S]);w[S]={r:(A.r-b[S].r)/m,g:(A.g-b[S].g)/m,b:(A.b-b[S].b)/m};break;case"path":var M=Tt(b[S],_[S]),E=M[1];for(b[S]=M[0],w[S]=[],B=0,C=b[S].length;Bh&&(h=c)}!t[h+="%"].callback&&(t[h].callback=n)}return new ne(t,r)},Wt.animate=function(t,r,i,n){if(this.removed)return n&&n.call(this),this;var a=t instanceof ne?t:e.animation(t,r,i,n);return ae(a,this,a.percents[0],null,this.attr()),this},Wt.setTime=function(t,e){return t&&null!=e&&this.status(t,k(e,t.ms)/t.ms),this},Wt.status=function(t,e){var r,i,n=[],a=0;if(null!=e)return ae(t,this,-1,k(e,1)),this;for(r=Kt.length;a1)for(var i=0,n=r.length;i.5)-1;l(f-.5,2)+l(p-.5,2)>.25&&(p=a.sqrt(.25-l(f-.5,2))*n+.5)&&.5!=p&&(p=p.toFixed(5)-1e-5*n)}return c})).split(/\s*\-\s*/),"linear"==h){var b=n.shift();if(b=-i(b),isNaN(b))return null;var _=[0,0,a.cos(t.rad(b)),a.sin(t.rad(b))],w=1/(s(o(_[2]),o(_[3]))||1);_[2]*=w,_[3]*=w,_[2]<0&&(_[0]=-_[2],_[2]=0),_[3]<0&&(_[1]=-_[3],_[3]=0)}var k=t._parseDots(n);if(!k)return null;if(u=u.replace(/[\(\)\s,\xb0#]/g,"_"),e.gradient&&u!=e.gradient.id&&(g.defs.removeChild(e.gradient),delete e.gradient),!e.gradient){m=x(h+"Gradient",{id:u}),e.gradient=m,x(m,"radial"==h?{fx:f,fy:p}:{x1:_[0],y1:_[1],x2:_[2],y2:_[3],gradientTransform:e.matrix.invert()}),g.defs.appendChild(m);for(var B=0,C=k.length;B1?P.opacity/100:P.opacity});case"stroke":P=t.getRGB(g),l.setAttribute(d,P.hex),"stroke"==d&&P[e]("opacity")&&x(l,{"stroke-opacity":P.opacity>1?P.opacity/100:P.opacity}),"stroke"==d&&i._.arrows&&("startString"in i._.arrows&&b(i,i._.arrows.startString),"endString"in i._.arrows&&b(i,i._.arrows.endString,1));break;case"gradient":("circle"==i.type||"ellipse"==i.type||"r"!=r(g).charAt())&&v(i,g);break;case"opacity":u.gradient&&!u[e]("stroke-opacity")&&x(l,{"stroke-opacity":g>1?g/100:g});case"fill-opacity":if(u.gradient){(z=t._g.doc.getElementById(l.getAttribute("fill").replace(/^url\(#|\)$/g,c)))&&(F=z.getElementsByTagName("stop"),x(F[F.length-1],{"stop-opacity":g}));break}default:"font-size"==d&&(g=n(g,10)+"px");var R=d.replace(/(\-.)/g,function(t){return t.substring(1).toUpperCase()});l.style[R]=g,i._.dirty=1,l.setAttribute(d,g)}}B(i,a),l.style.visibility=f},B=function(i,a){if("text"==i.type&&(a[e]("text")||a[e]("font")||a[e]("font-size")||a[e]("x")||a[e]("y"))){var s=i.attrs,o=i.node,l=o.firstChild?n(t._g.doc.defaultView.getComputedStyle(o.firstChild,c).getPropertyValue("font-size"),10):10;if(a[e]("text")){for(s.text=a.text;o.firstChild;)o.removeChild(o.firstChild);for(var h,u=r(a.text).split("\n"),f=[],p=0,d=u.length;p"));var U=H.getBoundingClientRect();T.W=g.w=(U.right-U.left)/100,T.H=g.h=(U.bottom-U.top)/100,T.X=g.x,T.Y=g.y+T.H/2,("x"in l||"y"in l)&&(T.path.v=t.format("m{0},{1}l{2},{1}",a(g.x*y),a(g.y*y),a(g.x*y)+1));for(var $=["x","y","text","font","font-family","font-weight","font-style","font-size"],Z=0,Q=$.length;Z.25&&(r=n.sqrt(.25-o(e-.5,2))*(2*(r>.5)-1)+.5),h=e+c+r),f})).split(/\s*\-\s*/),"linear"==l){var u=a.shift();if(u=-i(u),isNaN(u))return null}var p=t._parseDots(a);if(!p)return null;if(e=e.shape||e.node,p.length){e.removeChild(s),s.on=!0,s.method="none",s.color=p[0].color,s.color2=p[p.length-1].color;for(var d=[],g=0,x=p.length;g')}}catch(t){k=function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},t._engine.initWin(t._g.win),t._engine.create=function(){var e=t._getContainer.apply(0,arguments),r=e.container,i=e.height,n=e.width,a=e.x,s=e.y;if(!r)throw new Error("VML container not found.");var o=new t._Paper,l=o.canvas=t._g.doc.createElement("div"),h=l.style;return a=a||0,s=s||0,n=n||512,i=i||342,o.width=n,o.height=i,n==+n&&(n+="px"),i==+i&&(i+="px"),o.coordsize=216e5+c+216e5,o.coordorigin="0 0",o.span=t._g.doc.createElement("span"),o.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",l.appendChild(o.span),h.cssText=t.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",n,i),1==r?(t._g.doc.body.appendChild(l),h.left=a+"px",h.top=s+"px",h.position="absolute"):r.firstChild?r.insertBefore(l,r.firstChild):r.appendChild(l),o.renderfix=function(){},o},t.prototype.clear=function(){t.eve("raphael.clear",this),this.canvas.innerHTML=f,this.span=t._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},t.prototype.remove=function(){for(var e in t.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas),this)this[e]="function"==typeof this[e]?t._removedFactory(e):null;return!0};var M=t.st;for(var E in A)A[e](E)&&!M[e](E)&&(M[E]=function(t){return function(){var e=arguments;return this.forEach(function(r){r[t].apply(r,e)})}}(E))}}.apply(e,i))||(t.exports=n)}])}); \ No newline at end of file +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.Raphael=e():t.Raphael=e()}(window,function(){return function(t){var e={};function r(i){if(e[i])return e[i].exports;var n=e[i]={i:i,l:!1,exports:{}};return t[i].call(n.exports,n,n.exports,r),n.l=!0,n.exports}return r.m=t,r.c=e,r.d=function(t,e,i){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(t,e){if(1&e&&(t=r(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(r.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var n in t)r.d(i,n,function(e){return t[e]}.bind(null,n));return i},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=1)}([function(t,e,r){var i,n;i=[r(2)],void 0===(n=function(t){function e(i){if(e.is(i,"function"))return r?i():t.on("raphael.DOMload",i);if(e.is(i,A))return e._engine.create[c](e,i.splice(0,3+e.is(i[0],T))).add(i);var n=Array.prototype.slice.call(arguments,0);if(e.is(n[n.length-1],"function")){var a=n.pop();return r?a.call(e._engine.create[c](e,n)):t.on("raphael.DOMload",function(){a.call(e._engine.create[c](e,n))})}return e._engine.create[c](e,arguments)}e.version="2.3.0",e.eve=t;var r,i,n=/[, ]+/,a={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},s=/\{(\d+)\}/g,o="hasOwnProperty",l={doc:document,win:window},h={was:Object.prototype[o].call(l.win,"Raphael"),is:l.win.Raphael},u=function(){this.ca=this.customAttributes={}},c="apply",f="concat",p="ontouchstart"in window||window.TouchEvent||window.DocumentTouch&&document instanceof DocumentTouch,d="",g=" ",x=String,v="split",y="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[v](g),m={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},b=x.prototype.toLowerCase,_=Math,w=_.max,k=_.min,B=_.abs,C=_.pow,S=_.PI,T="number",A="array",M=Object.prototype.toString,E=(e._ISURL=/^url\(['"]?(.+?)['"]?\)$/i,/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i),N={NaN:1,Infinity:1,"-Infinity":1},L=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,P=_.round,z=parseFloat,F=parseInt,R=x.prototype.toUpperCase,j=e._availableAttrs={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/","letter-spacing":0,opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0,class:""},I=e._availableAnimAttrs={blur:T,"clip-rect":"csv",cx:T,cy:T,fill:"colour","fill-opacity":T,"font-size":T,height:T,opacity:T,path:"path",r:T,rx:T,ry:T,stroke:"colour","stroke-opacity":T,"stroke-width":T,transform:"transform",width:T,x:T,y:T},D=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/,q={hs:1,rg:1},O=/,?([achlmqrstvxz]),?/gi,V=/([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,W=/([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/gi,Y=/(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/gi,G=(e._radial_gradient=/^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/,{}),H=function(t,e){return z(t)-z(e)},X=function(t){return t},U=e._rectPath=function(t,e,r,i,n){return n?[["M",t+n,e],["l",r-2*n,0],["a",n,n,0,0,1,n,n],["l",0,i-2*n],["a",n,n,0,0,1,-n,n],["l",2*n-r,0],["a",n,n,0,0,1,-n,-n],["l",0,2*n-i],["a",n,n,0,0,1,n,-n],["z"]]:[["M",t,e],["l",r,0],["l",0,i],["l",-r,0],["z"]]},$=function(t,e,r,i){return null==i&&(i=r),[["M",t,e],["m",0,-i],["a",r,i,0,1,1,0,2*i],["a",r,i,0,1,1,0,-2*i],["z"]]},Z=e._getPath={path:function(t){return t.attr("path")},circle:function(t){var e=t.attrs;return $(e.cx,e.cy,e.r)},ellipse:function(t){var e=t.attrs;return $(e.cx,e.cy,e.rx,e.ry)},rect:function(t){var e=t.attrs;return U(e.x,e.y,e.width,e.height,e.r)},image:function(t){var e=t.attrs;return U(e.x,e.y,e.width,e.height)},text:function(t){var e=t._getBBox();return U(e.x,e.y,e.width,e.height)},set:function(t){var e=t._getBBox();return U(e.x,e.y,e.width,e.height)}},Q=e.mapPath=function(t,e){if(!e)return t;var r,i,n,a,s,o,l;for(n=0,s=(t=Tt(t)).length;n',(J=K.firstChild).style.behavior="url(#default#VML)",!J||"object"!=typeof J.adj)return e.type=d;K=null}function tt(t){if("function"==typeof t||Object(t)!==t)return t;var e=new t.constructor;for(var r in t)t[o](r)&&(e[r]=tt(t[r]));return e}e.svg=!(e.vml="VML"==e.type),e._Paper=u,e.fn=i=u.prototype=e.prototype,e._id=0,e.is=function(t,e){return"finite"==(e=b.call(e))?!N[o](+t):"array"==e?t instanceof Array:"null"==e&&null===t||e==typeof t&&null!==t||"object"==e&&t===Object(t)||"array"==e&&Array.isArray&&Array.isArray(t)||M.call(t).slice(8,-1).toLowerCase()==e},e.angle=function(t,r,i,n,a,s){if(null==a){var o=t-i,l=r-n;return o||l?(180+180*_.atan2(-l,-o)/S+360)%360:0}return e.angle(t,r,a,s)-e.angle(i,n,a,s)},e.rad=function(t){return t%360*S/180},e.deg=function(t){return Math.round(180*t/S%360*1e3)/1e3},e.snapTo=function(t,r,i){if(i=e.is(i,"finite")?i:10,e.is(t,A)){for(var n=t.length;n--;)if(B(t[n]-r)<=i)return t[n]}else{var a=r%(t=+t);if(at-i)return r-a+t}return r};var et,rt;e.createUUID=(et=/[xy]/g,rt=function(t){var e=16*_.random()|0;return("x"==t?e:3&e|8).toString(16)},function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(et,rt).toUpperCase()});e.setWindow=function(r){t("raphael.setWindow",e,l.win,r),l.win=r,l.doc=l.win.document,e._engine.initWin&&e._engine.initWin(l.win)};var it=function(t){if(e.vml){var r,i=/^\s+|\s+$/g;try{var n=new ActiveXObject("htmlfile");n.write(""),n.close(),r=n.body}catch(t){r=createPopup().document.body}var a=r.createTextRange();it=ht(function(t){try{r.style.color=x(t).replace(i,d);var e=a.queryCommandValue("ForeColor");return"#"+("000000"+(e=(255&e)<<16|65280&e|(16711680&e)>>>16).toString(16)).slice(-6)}catch(t){return"none"}})}else{var s=l.doc.createElement("i");s.title="Raphaël Colour Picker",s.style.display="none",l.doc.body.appendChild(s),it=ht(function(t){return s.style.color=t,l.doc.defaultView.getComputedStyle(s,d).getPropertyValue("color")})}return it(t)},nt=function(){return"hsb("+[this.h,this.s,this.b]+")"},at=function(){return"hsl("+[this.h,this.s,this.l]+")"},st=function(){return this.hex},ot=function(t,r,i){if(null==r&&e.is(t,"object")&&"r"in t&&"g"in t&&"b"in t&&(i=t.b,r=t.g,t=t.r),null==r&&e.is(t,"string")){var n=e.getRGB(t);t=n.r,r=n.g,i=n.b}return(t>1||r>1||i>1)&&(t/=255,r/=255,i/=255),[t,r,i]},lt=function(t,r,i,n){var a={r:t*=255,g:r*=255,b:i*=255,hex:e.rgb(t,r,i),toString:st};return e.is(n,"finite")&&(a.opacity=n),a};function ht(t,e,r){return function i(){var n=Array.prototype.slice.call(arguments,0),a=n.join("␀"),s=i.cache=i.cache||{},l=i.count=i.count||[];return s[o](a)?(function(t,e){for(var r=0,i=t.length;r=1e3&&delete s[l.shift()],l.push(a),s[a]=t[c](e,n),r?r(s[a]):s[a])}}e.color=function(t){var r;return e.is(t,"object")&&"h"in t&&"s"in t&&"b"in t?(r=e.hsb2rgb(t),t.r=r.r,t.g=r.g,t.b=r.b,t.hex=r.hex):e.is(t,"object")&&"h"in t&&"s"in t&&"l"in t?(r=e.hsl2rgb(t),t.r=r.r,t.g=r.g,t.b=r.b,t.hex=r.hex):(e.is(t,"string")&&(t=e.getRGB(t)),e.is(t,"object")&&"r"in t&&"g"in t&&"b"in t?(r=e.rgb2hsl(t),t.h=r.h,t.s=r.s,t.l=r.l,r=e.rgb2hsb(t),t.v=r.b):(t={hex:"none"}).r=t.g=t.b=t.h=t.s=t.v=t.l=-1),t.toString=st,t},e.hsb2rgb=function(t,e,r,i){var n,a,s,o,l;return this.is(t,"object")&&"h"in t&&"s"in t&&"b"in t&&(r=t.b,e=t.s,i=t.o,t=t.h),o=(l=r*e)*(1-B((t=(t*=360)%360/60)%2-1)),n=a=s=r-l,lt(n+=[l,o,0,0,o,l][t=~~t],a+=[o,l,l,o,0,0][t],s+=[0,0,o,l,l,o][t],i)},e.hsl2rgb=function(t,e,r,i){var n,a,s,o,l;return this.is(t,"object")&&"h"in t&&"s"in t&&"l"in t&&(r=t.l,e=t.s,t=t.h),(t>1||e>1||r>1)&&(t/=360,e/=100,r/=100),o=(l=2*e*(r<.5?r:1-r))*(1-B((t=(t*=360)%360/60)%2-1)),n=a=s=r-l/2,lt(n+=[l,o,0,0,o,l][t=~~t],a+=[o,l,l,o,0,0][t],s+=[0,0,o,l,l,o][t],i)},e.rgb2hsb=function(t,e,r){var i,n;return t=(r=ot(t,e,r))[0],e=r[1],r=r[2],{h:((0==(n=(i=w(t,e,r))-k(t,e,r))?null:i==t?(e-r)/n:i==e?(r-t)/n+2:(t-e)/n+4)+360)%6*60/360,s:0==n?0:n/i,b:i,toString:nt}},e.rgb2hsl=function(t,e,r){var i,n,a,s;return t=(r=ot(t,e,r))[0],e=r[1],r=r[2],i=((n=w(t,e,r))+(a=k(t,e,r)))/2,{h:((0==(s=n-a)?null:n==t?(e-r)/s:n==e?(r-t)/s+2:(t-e)/s+4)+360)%6*60/360,s:0==s?0:i<.5?s/(2*i):s/(2-2*i),l:i,toString:at}},e._path2string=function(){return this.join(",").replace(O,"$1")};e._preload=function(t,e){var r=l.doc.createElement("img");r.style.cssText="position:absolute;left:-9999em;top:-9999em",r.onload=function(){e.call(this),this.onload=null,l.doc.body.removeChild(this)},r.onerror=function(){l.doc.body.removeChild(this)},l.doc.body.appendChild(r),r.src=t};function ut(){return this.hex}function ct(t,e){for(var r=[],i=0,n=t.length;n-2*!e>i;i+=2){var a=[{x:+t[i-2],y:+t[i-1]},{x:+t[i],y:+t[i+1]},{x:+t[i+2],y:+t[i+3]},{x:+t[i+4],y:+t[i+5]}];e?i?n-4==i?a[3]={x:+t[0],y:+t[1]}:n-2==i&&(a[2]={x:+t[0],y:+t[1]},a[3]={x:+t[2],y:+t[3]}):a[0]={x:+t[n-2],y:+t[n-1]}:n-4==i?a[3]=a[2]:i||(a[0]={x:+t[i],y:+t[i+1]}),r.push(["C",(-a[0].x+6*a[1].x+a[2].x)/6,(-a[0].y+6*a[1].y+a[2].y)/6,(a[1].x+6*a[2].x-a[3].x)/6,(a[1].y+6*a[2].y-a[3].y)/6,a[2].x,a[2].y])}return r}e.getRGB=ht(function(t){if(!t||(t=x(t)).indexOf("-")+1)return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:ut};if("none"==t)return{r:-1,g:-1,b:-1,hex:"none",toString:ut};!q[o](t.toLowerCase().substring(0,2))&&"#"!=t.charAt()&&(t=it(t));var r,i,n,a,s,l,h=t.match(E);return h?(h[2]&&(n=F(h[2].substring(5),16),i=F(h[2].substring(3,5),16),r=F(h[2].substring(1,3),16)),h[3]&&(n=F((s=h[3].charAt(3))+s,16),i=F((s=h[3].charAt(2))+s,16),r=F((s=h[3].charAt(1))+s,16)),h[4]&&(l=h[4][v](D),r=z(l[0]),"%"==l[0].slice(-1)&&(r*=2.55),i=z(l[1]),"%"==l[1].slice(-1)&&(i*=2.55),n=z(l[2]),"%"==l[2].slice(-1)&&(n*=2.55),"rgba"==h[1].toLowerCase().slice(0,4)&&(a=z(l[3])),l[3]&&"%"==l[3].slice(-1)&&(a/=100)),h[5]?(l=h[5][v](D),r=z(l[0]),"%"==l[0].slice(-1)&&(r*=2.55),i=z(l[1]),"%"==l[1].slice(-1)&&(i*=2.55),n=z(l[2]),"%"==l[2].slice(-1)&&(n*=2.55),("deg"==l[0].slice(-3)||"°"==l[0].slice(-1))&&(r/=360),"hsba"==h[1].toLowerCase().slice(0,4)&&(a=z(l[3])),l[3]&&"%"==l[3].slice(-1)&&(a/=100),e.hsb2rgb(r,i,n,a)):h[6]?(l=h[6][v](D),r=z(l[0]),"%"==l[0].slice(-1)&&(r*=2.55),i=z(l[1]),"%"==l[1].slice(-1)&&(i*=2.55),n=z(l[2]),"%"==l[2].slice(-1)&&(n*=2.55),("deg"==l[0].slice(-3)||"°"==l[0].slice(-1))&&(r/=360),"hsla"==h[1].toLowerCase().slice(0,4)&&(a=z(l[3])),l[3]&&"%"==l[3].slice(-1)&&(a/=100),e.hsl2rgb(r,i,n,a)):((h={r:r,g:i,b:n,toString:ut}).hex="#"+(16777216|n|i<<8|r<<16).toString(16).slice(1),e.is(a,"finite")&&(h.opacity=a),h)):{r:-1,g:-1,b:-1,hex:"none",error:1,toString:ut}},e),e.hsb=ht(function(t,r,i){return e.hsb2rgb(t,r,i).hex}),e.hsl=ht(function(t,r,i){return e.hsl2rgb(t,r,i).hex}),e.rgb=ht(function(t,e,r){function i(t){return t+.5|0}return"#"+(16777216|i(r)|i(e)<<8|i(t)<<16).toString(16).slice(1)}),e.getColor=function(t){var e=this.getColor.start=this.getColor.start||{h:0,s:1,b:t||.75},r=this.hsb2rgb(e.h,e.s,e.b);return e.h+=.075,e.h>1&&(e.h=0,e.s-=.2,e.s<=0&&(this.getColor.start={h:0,s:1,b:e.b})),r.hex},e.getColor.reset=function(){delete this.start},e.parsePathString=function(t){if(!t)return null;var r=ft(t);if(r.arr)return mt(r.arr);var i={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},n=[];return e.is(t,A)&&e.is(t[0],A)&&(n=mt(t)),n.length||x(t).replace(V,function(t,e,r){var a=[],s=e.toLowerCase();if(r.replace(Y,function(t,e){e&&a.push(+e)}),"m"==s&&a.length>2&&(n.push([e][f](a.splice(0,2))),s="l",e="m"==e?"l":"L"),"r"==s)n.push([e][f](a));else for(;a.length>=i[s]&&(n.push([e][f](a.splice(0,i[s]))),i[s]););}),n.toString=e._path2string,r.arr=mt(n),n},e.parseTransformString=ht(function(t){if(!t)return null;var r=[];return e.is(t,A)&&e.is(t[0],A)&&(r=mt(t)),r.length||x(t).replace(W,function(t,e,i){var n=[];b.call(e);i.replace(Y,function(t,e){e&&n.push(+e)}),r.push([e][f](n))}),r.toString=e._path2string,r},this,function(t){if(!t)return t;for(var e=[],r=0;r1?1:l<0?0:l)/2,u=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],c=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],f=0,p=0;p<12;p++){var d=h*u[p]+h,g=pt(d,t,r,n,s),x=pt(d,e,i,a,o),v=g*g+x*x;f+=c[p]*_.sqrt(v)}return h*f}function gt(t,e,r,i,n,a,s,o){if(!(w(t,r)w(n,s)||w(e,i)w(a,o))){var l=(t-r)*(a-o)-(e-i)*(n-s);if(l){var h=((t*i-e*r)*(n-s)-(t-r)*(n*o-a*s))/l,u=((t*i-e*r)*(a-o)-(e-i)*(n*o-a*s))/l,c=+h.toFixed(2),f=+u.toFixed(2);if(!(c<+k(t,r).toFixed(2)||c>+w(t,r).toFixed(2)||c<+k(n,s).toFixed(2)||c>+w(n,s).toFixed(2)||f<+k(e,i).toFixed(2)||f>+w(e,i).toFixed(2)||f<+k(a,o).toFixed(2)||f>+w(a,o).toFixed(2)))return{x:h,y:u}}}}function xt(t,r,i){var n=e.bezierBBox(t),a=e.bezierBBox(r);if(!e.isBBoxIntersect(n,a))return i?0:[];for(var s=dt.apply(0,t),o=dt.apply(0,r),l=w(~~(s/5),1),h=w(~~(o/5),1),u=[],c=[],f={},p=i?0:[],d=0;d=0&&T<=1.001&&A>=0&&A<=1.001&&(i?p++:p.push({x:S.x,y:S.y,t1:k(T,1),t2:k(A,1)}))}}return p}function vt(t,r,i){t=e._path2curve(t),r=e._path2curve(r);for(var n,a,s,o,l,h,u,c,f,p,d=i?0:[],g=0,x=t.length;gy||v=t.x&&e<=t.x2&&r>=t.y&&r<=t.y2},e.isBBoxIntersect=function(t,r){var i=e.isPointInsideBBox;return i(r,t.x,t.y)||i(r,t.x2,t.y)||i(r,t.x,t.y2)||i(r,t.x2,t.y2)||i(t,r.x,r.y)||i(t,r.x2,r.y)||i(t,r.x,r.y2)||i(t,r.x2,r.y2)||(t.xr.x||r.xt.x)&&(t.yr.y||r.yt.y)},e.pathIntersection=function(t,e){return vt(t,e)},e.pathIntersectionNumber=function(t,e){return vt(t,e,1)},e.isPointInsidePath=function(t,r,i){var n=e.pathBBox(t);return e.isPointInsideBBox(n,r,i)&&vt(t,[["M",r,i],["H",n.x2+10]],1)%2==1},e._removedFactory=function(e){return function(){t("raphael.log",null,"Raphaël: you are calling to method “"+e+"” of removed object",e)}};var yt=e.pathBBox=function(t){var e=ft(t);if(e.bbox)return tt(e.bbox);if(!t)return{x:0,y:0,width:0,height:0,x2:0,y2:0};for(var r,i=0,n=0,a=[],s=[],o=0,l=(t=Tt(t)).length;o1&&(r*=m=_.sqrt(m),i*=m);var b=r*r,w=i*i,k=(a==s?-1:1)*_.sqrt(B((b*w-b*y*y-w*x*x)/(b*y*y+w*x*x))),C=k*r*y/i+(t+o)/2,T=k*-i*x/r+(e+l)/2,A=_.asin(((e-T)/i).toFixed(9)),M=_.asin(((l-T)/i).toFixed(9));(A=tM&&(A-=2*S),!s&&M>A&&(M-=2*S)}var E=M-A;if(B(E)>c){var N=M,L=o,P=l;M=A+c*(s&&M>A?1:-1),o=C+r*_.cos(M),l=T+i*_.sin(M),d=Bt(o,l,r,i,n,0,s,L,P,[M,N,C,T])}E=M-A;var z=_.cos(A),F=_.sin(A),R=_.cos(M),j=_.sin(M),I=_.tan(E/4),D=4/3*r*I,q=4/3*i*I,O=[t,e],V=[t+D*F,e-q*z],W=[o+D*j,l-q*R],Y=[o,l];if(V[0]=2*O[0]-V[0],V[1]=2*O[1]-V[1],h)return[V,W,Y][f](d);for(var G=[],H=0,X=(d=[V,W,Y][f](d).join()[v](",")).length;H"1e12"&&(p=.5),B(d)>"1e12"&&(d=.5),p>0&&p<1&&(l=Ct(t,e,r,i,n,a,s,o,p),x.push(l.x),g.push(l.y)),d>0&&d<1&&(l=Ct(t,e,r,i,n,a,s,o,d),x.push(l.x),g.push(l.y)),h=a-2*i+e-(o-2*a+i),f=e-i,p=(-(u=2*(i-e)-2*(a-i))+_.sqrt(u*u-4*h*f))/2/h,d=(-u-_.sqrt(u*u-4*h*f))/2/h,B(p)>"1e12"&&(p=.5),B(d)>"1e12"&&(d=.5),p>0&&p<1&&(l=Ct(t,e,r,i,n,a,s,o,p),x.push(l.x),g.push(l.y)),d>0&&d<1&&(l=Ct(t,e,r,i,n,a,s,o,d),x.push(l.x),g.push(l.y)),{min:{x:k[c](0,x),y:k[c](0,g)},max:{x:w[c](0,x),y:w[c](0,g)}}}),Tt=e._path2curve=ht(function(t,e){var r=!e&&ft(t);if(!e&&r.curve)return mt(r.curve);for(var i=_t(t),n=e&&_t(e),a={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},s={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},o=function(t,e,r){var i,n;if(!t)return["C",e.x,e.y,e.x,e.y,e.x,e.y];switch(!(t[0]in{T:1,Q:1})&&(e.qx=e.qy=null),t[0]){case"M":e.X=t[1],e.Y=t[2];break;case"A":t=["C"][f](Bt[c](0,[e.x,e.y][f](t.slice(1))));break;case"S":"C"==r||"S"==r?(i=2*e.x-e.bx,n=2*e.y-e.by):(i=e.x,n=e.y),t=["C",i,n][f](t.slice(1));break;case"T":"Q"==r||"T"==r?(e.qx=2*e.x-e.qx,e.qy=2*e.y-e.qy):(e.qx=e.x,e.qy=e.y),t=["C"][f](kt(e.x,e.y,e.qx,e.qy,t[1],t[2]));break;case"Q":e.qx=t[1],e.qy=t[2],t=["C"][f](kt(e.x,e.y,t[1],t[2],t[3],t[4]));break;case"L":t=["C"][f](wt(e.x,e.y,t[1],t[2]));break;case"H":t=["C"][f](wt(e.x,e.y,t[1],e.y));break;case"V":t=["C"][f](wt(e.x,e.y,e.x,t[1]));break;case"Z":t=["C"][f](wt(e.x,e.y,e.X,e.Y))}return t},l=function(t,e){if(t[e].length>7){t[e].shift();for(var r=t[e];r.length;)u[e]="A",n&&(p[e]="A"),t.splice(e++,0,["C"][f](r.splice(0,6)));t.splice(e,1),v=w(i.length,n&&n.length||0)}},h=function(t,e,r,a,s){t&&e&&"M"==t[s][0]&&"M"!=e[s][0]&&(e.splice(s,0,["M",a.x,a.y]),r.bx=0,r.by=0,r.x=t[s][1],r.y=t[s][2],v=w(i.length,n&&n.length||0))},u=[],p=[],d="",g="",x=0,v=w(i.length,n&&n.length||0);x.01;)h=dt(t,e,r,i,n,a,s,o,c+=(hn){if(r&&!f.start){if(c+=["C"+(u=Xt(s,o,l[1],l[2],l[3],l[4],l[5],l[6],n-p)).start.x,u.start.y,u.m.x,u.m.y,u.x,u.y],a)return c;f.start=c,c=["M"+u.x,u.y+"C"+u.n.x,u.n.y,u.end.x,u.end.y,l[5],l[6]].join(),p+=h,s=+l[5],o=+l[6];continue}if(!t&&!r)return{x:(u=Xt(s,o,l[1],l[2],l[3],l[4],l[5],l[6],n-p)).x,y:u.y,alpha:u.alpha}}p+=h,s=+l[5],o=+l[6]}c+=l.shift()+l}return f.end=c,(u=t?p:r?f:e.findDotsAtSegment(s,o,l[0],l[1],l[2],l[3],l[4],l[5],1)).alpha&&(u={x:u.x,y:u.y,alpha:u.alpha}),u}},$t=Ut(1),Zt=Ut(),Qt=Ut(0,1);e.getTotalLength=$t,e.getPointAtLength=Zt,e.getSubpath=function(t,e,r){if(this.getTotalLength(t)-r<1e-6)return Qt(t,e).end;var i=Qt(t,r,1);return e?Qt(i,e).end:i},Wt.getTotalLength=function(){var t=this.getPath();if(t)return this.node.getTotalLength?this.node.getTotalLength():$t(t)},Wt.getPointAtLength=function(t){var e=this.getPath();if(e)return Zt(e,t)},Wt.getPath=function(){var t,r=e._getPath[this.type];if("text"!=this.type&&"set"!=this.type)return r&&(t=r(this)),t},Wt.getSubpath=function(t,r){var i=this.getPath();if(i)return e.getSubpath(i,t,r)};var Jt=e.easing_formulas={linear:function(t){return t},"<":function(t){return C(t,1.7)},">":function(t){return C(t,.48)},"<>":function(t){var e=.48-t/1.04,r=_.sqrt(.1734+e*e),i=r-e,n=-r-e,a=C(B(i),1/3)*(i<0?-1:1)+C(B(n),1/3)*(n<0?-1:1)+.5;return 3*(1-a)*a*a+a*a*a},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},elastic:function(t){return t==!!t?t:C(2,-10*t)*_.sin(2*S*(t-.075)/.3)+1},bounce:function(t){var e=7.5625,r=2.75;return t<1/r?e*t*t:t<2/r?e*(t-=1.5/r)*t+.75:t<2.5/r?e*(t-=2.25/r)*t+.9375:e*(t-=2.625/r)*t+.984375}};Jt.easeIn=Jt["ease-in"]=Jt["<"],Jt.easeOut=Jt["ease-out"]=Jt[">"],Jt.easeInOut=Jt["ease-in-out"]=Jt["<>"],Jt["back-in"]=Jt.backIn,Jt["back-out"]=Jt.backOut;var Kt=[],te=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){setTimeout(t,16)},ee=function(){for(var r=+new Date,i=0;i1&&!n.next){for(s in d)d[o](s)&&(y[s]=n.totalOrigin[s]);n.el.attr(y),ae(n.anim,n.el,n.anim.percents[0],null,n.totalOrigin,n.repeat-1)}n.next&&!n.stop&&ae(n.anim,n.el,n.next,null,n.totalOrigin,n.repeat)}}}Kt.length&&te(ee)},re=function(t){return t>255?255:t<0?0:t};function ie(t,e,r,i,n,a){var s=3*e,o=3*(i-e)-s,l=1-s-o,h=3*r,u=3*(n-r)-h,c=1-h-u;function f(t){return((l*t+o)*t+s)*t}return function(t,e){var r=function(t,e){var r,i,n,a,h,u;for(n=t,u=0;u<8;u++){if(a=f(n)-t,B(a)i)return i;for(;ra?r=n:i=n,n=(i-r)/2+r}return n}(t,e);return((c*r+u)*r+h)*r}(t,1/(200*a))}function ne(t,e){var r=[],i={};if(this.ms=e,this.times=1,t){for(var n in t)t[o](n)&&(i[z(n)]=t[n],r.push(z(n)));r.sort(H)}this.anim=i,this.top=r[r.length-1],this.percents=r}function ae(r,i,a,s,l,h){a=z(a);var u,c,p,d,g,y,m=r.ms,b={},_={},w={};if(s)for(B=0,C=Kt.length;Bs*r.top){a=r.percents[B],g=r.percents[B-1]||0,m=m/r.top*(a-g),d=r.percents[B+1],u=r.anim[a];break}s&&i.attr(r.anim[r.percents[B]])}if(u){if(c)c.initstatus=s,c.start=new Date-c.ms*s;else{for(var S in u)if(u[o](S)&&(I[o](S)||i.paper.customAttributes[o](S)))switch(b[S]=i.attr(S),null==b[S]&&(b[S]=j[S]),_[S]=u[S],I[S]){case T:w[S]=(_[S]-b[S])/m;break;case"colour":b[S]=e.getRGB(b[S]);var A=e.getRGB(_[S]);w[S]={r:(A.r-b[S].r)/m,g:(A.g-b[S].g)/m,b:(A.b-b[S].b)/m};break;case"path":var M=Tt(b[S],_[S]),E=M[1];for(b[S]=M[0],w[S]=[],B=0,C=b[S].length;Bh&&(h=c)}!t[h+="%"].callback&&(t[h].callback=n)}return new ne(t,r)},Wt.animate=function(t,r,i,n){if(this.removed)return n&&n.call(this),this;var a=t instanceof ne?t:e.animation(t,r,i,n);return ae(a,this,a.percents[0],null,this.attr()),this},Wt.setTime=function(t,e){return t&&null!=e&&this.status(t,k(e,t.ms)/t.ms),this},Wt.status=function(t,e){var r,i,n=[],a=0;if(null!=e)return ae(t,this,-1,k(e,1)),this;for(r=Kt.length;a1)for(var i=0,n=r.length;i.5)-1;l(f-.5,2)+l(p-.5,2)>.25&&(p=a.sqrt(.25-l(f-.5,2))*n+.5)&&.5!=p&&(p=p.toFixed(5)-1e-5*n)}return c})).split(/\s*\-\s*/),"linear"==h){var b=n.shift();if(b=-i(b),isNaN(b))return null;var _=[0,0,a.cos(t.rad(b)),a.sin(t.rad(b))],w=1/(s(o(_[2]),o(_[3]))||1);_[2]*=w,_[3]*=w,_[2]<0&&(_[0]=-_[2],_[2]=0),_[3]<0&&(_[1]=-_[3],_[3]=0)}var k=t._parseDots(n);if(!k)return null;if(u=u.replace(/[\(\)\s,\xb0#]/g,"_"),e.gradient&&u!=e.gradient.id&&(g.defs.removeChild(e.gradient),delete e.gradient),!e.gradient){m=x(h+"Gradient",{id:u}),e.gradient=m,x(m,"radial"==h?{fx:f,fy:p}:{x1:_[0],y1:_[1],x2:_[2],y2:_[3],gradientTransform:e.matrix.invert()}),g.defs.appendChild(m);for(var B=0,C=k.length;B1?P.opacity/100:P.opacity});case"stroke":P=t.getRGB(g),l.setAttribute(d,P.hex),"stroke"==d&&P[e]("opacity")&&x(l,{"stroke-opacity":P.opacity>1?P.opacity/100:P.opacity}),"stroke"==d&&i._.arrows&&("startString"in i._.arrows&&b(i,i._.arrows.startString),"endString"in i._.arrows&&b(i,i._.arrows.endString,1));break;case"gradient":("circle"==i.type||"ellipse"==i.type||"r"!=r(g).charAt())&&v(i,g);break;case"opacity":u.gradient&&!u[e]("stroke-opacity")&&x(l,{"stroke-opacity":g>1?g/100:g});case"fill-opacity":if(u.gradient){(z=t._g.doc.getElementById(l.getAttribute("fill").replace(/^url\(#|\)$/g,c)))&&(F=z.getElementsByTagName("stop"),x(F[F.length-1],{"stop-opacity":g}));break}default:"font-size"==d&&(g=n(g,10)+"px");var R=d.replace(/(\-.)/g,function(t){return t.substring(1).toUpperCase()});l.style[R]=g,i._.dirty=1,l.setAttribute(d,g)}}B(i,a),l.style.visibility=f},B=function(i,a){if("text"==i.type&&(a[e]("text")||a[e]("font")||a[e]("font-size")||a[e]("x")||a[e]("y"))){var s=i.attrs,o=i.node,l=o.firstChild?n(t._g.doc.defaultView.getComputedStyle(o.firstChild,c).getPropertyValue("font-size"),10):10;if(a[e]("text")){for(s.text=a.text;o.firstChild;)o.removeChild(o.firstChild);for(var h,u=r(a.text).split("\n"),f=[],p=0,d=u.length;p"));var U=H.getBoundingClientRect();T.W=g.w=(U.right-U.left)/100,T.H=g.h=(U.bottom-U.top)/100,T.X=g.x,T.Y=g.y+T.H/2,("x"in l||"y"in l)&&(T.path.v=t.format("m{0},{1}l{2},{1}",a(g.x*y),a(g.y*y),a(g.x*y)+1));for(var $=["x","y","text","font","font-family","font-weight","font-style","font-size"],Z=0,Q=$.length;Z.25&&(r=n.sqrt(.25-o(e-.5,2))*(2*(r>.5)-1)+.5),h=e+c+r),f})).split(/\s*\-\s*/),"linear"==l){var u=a.shift();if(u=-i(u),isNaN(u))return null}var p=t._parseDots(a);if(!p)return null;if(e=e.shape||e.node,p.length){e.removeChild(s),s.on=!0,s.method="none",s.color=p[0].color,s.color2=p[p.length-1].color;for(var d=[],g=0,x=p.length;g')}}catch(t){k=function(t){return e.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},t._engine.initWin(t._g.win),t._engine.create=function(){var e=t._getContainer.apply(0,arguments),r=e.container,i=e.height,n=e.width,a=e.x,s=e.y;if(!r)throw new Error("VML container not found.");var o=new t._Paper,l=o.canvas=t._g.doc.createElement("div"),h=l.style;return a=a||0,s=s||0,n=n||512,i=i||342,o.width=n,o.height=i,n==+n&&(n+="px"),i==+i&&(i+="px"),o.coordsize=216e5+c+216e5,o.coordorigin="0 0",o.span=t._g.doc.createElement("span"),o.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",l.appendChild(o.span),h.cssText=t.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",n,i),1==r?(t._g.doc.body.appendChild(l),h.left=a+"px",h.top=s+"px",h.position="absolute"):r.firstChild?r.insertBefore(l,r.firstChild):r.appendChild(l),o.renderfix=function(){},o},t.prototype.clear=function(){t.eve("raphael.clear",this),this.canvas.innerHTML=f,this.span=t._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},t.prototype.remove=function(){for(var e in t.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas),this)this[e]="function"==typeof this[e]?t._removedFactory(e):null;return!0};var M=t.st;for(var E in A)A[e](E)&&!M[e](E)&&(M[E]=function(t){return function(){var e=arguments;return this.forEach(function(r){r[t].apply(r,e)})}}(E))}}.apply(e,i))||(t.exports=n)}])}); \ No newline at end of file diff --git a/js/lib/select2.min.js b/js/lib/select2.min.js index e5052902..e4214264 100644 --- a/js/lib/select2.min.js +++ b/js/lib/select2.min.js @@ -1 +1,2 @@ -/*! Select2 4.0.6-rc.1 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=function(b,c){return void 0===c&&(c="undefined"!=typeof window?require("jquery"):require("jquery")(b)),a(c),c}:a(jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return v.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o=b&&b.split("/"),p=t.map,q=p&&p["*"]||{};if(a){for(a=a.split("/"),g=a.length-1,t.nodeIdCompat&&x.test(a[g])&&(a[g]=a[g].replace(x,"")),"."===a[0].charAt(0)&&o&&(n=o.slice(0,o.length-1),a=n.concat(a)),k=0;k0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}if((o||q)&&p){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),o)for(l=o.length;l>0;l-=1)if((e=p[o.slice(0,l).join("/")])&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&q&&q[d]&&(i=q[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){var d=w.call(arguments,0);return"string"!=typeof d[0]&&1===d.length&&d.push(null),o.apply(b,d.concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){r[a]=b}}function j(a){if(e(s,a)){var c=s[a];delete s[a],u[a]=!0,n.apply(b,c)}if(!e(r,a)&&!e(u,a))throw new Error("No "+a);return r[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return a?k(a):[]}function m(a){return function(){return t&&t.config&&t.config[a]||{}}}var n,o,p,q,r={},s={},t={},u={},v=Object.prototype.hasOwnProperty,w=[].slice,x=/\.js$/;p=function(a,b){var c,d=k(a),e=d[0],g=b[1];return a=d[1],e&&(e=f(e,g),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(g)):f(a,g):(a=f(a,g),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},q={require:function(a){return g(a)},exports:function(a){var b=r[a];return void 0!==b?b:r[a]={}},module:function(a){return{id:a,uri:"",exports:r[a],config:m(a)}}},n=function(a,c,d,f){var h,k,m,n,o,t,v,w=[],x=typeof d;if(f=f||a,t=l(f),"undefined"===x||"function"===x){for(c=!c.length&&d.length?["require","exports","module"]:c,o=0;o0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;h":">",'"':""","'":"'","/":"/"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c.__cache={};var e=0;return c.GetUniqueElementId=function(a){var b=a.getAttribute("data-select2-id");return null==b&&(a.id?(b=a.id,a.setAttribute("data-select2-id",b)):(a.setAttribute("data-select2-id",++e),b=e.toString())),b},c.StoreData=function(a,b,d){var e=c.GetUniqueElementId(a);c.__cache[e]||(c.__cache[e]={}),c.__cache[e][b]=d},c.GetData=function(b,d){var e=c.GetUniqueElementId(b);return d?c.__cache[e]&&null!=c.__cache[e][d]?c.__cache[e][d]:a(b).data(d):c.__cache[e]},c.RemoveData=function(a){var b=c.GetUniqueElementId(a);null!=c.__cache[b]&&delete c.__cache[b]},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('
        ');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a('
      • '),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),d[0].className+=" select2-results__message",this.$results.append(d)},c.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c0?b.first().trigger("mouseenter"):a.first().trigger("mouseenter"),this.ensureHighlightVisible()},c.prototype.setClasses=function(){var c=this;this.data.current(function(d){var e=a.map(d,function(a){return a.id.toString()});c.$results.find(".select2-results__option[aria-selected]").each(function(){var c=a(this),d=b.GetData(this,"data"),f=""+d.id;null!=d.element&&d.element.selected||null==d.element&&a.inArray(f,e)>-1?c.attr("aria-selected","true"):c.attr("aria-selected","false")})})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(c){var d=document.createElement("li");d.className="select2-results__option";var e={role:"treeitem","aria-selected":"false"};c.disabled&&(delete e["aria-selected"],e["aria-disabled"]="true"),null==c.id&&delete e["aria-selected"],null!=c._resultId&&(d.id=c._resultId),c.title&&(d.title=c.title),c.children&&(e.role="group",e["aria-label"]=c.text,delete e["aria-selected"]);for(var f in e){var g=e[f];d.setAttribute(f,g)}if(c.children){var h=a(d),i=document.createElement("strong");i.className="select2-results__group";a(i);this.template(c,i);for(var j=[],k=0;k",{class:"select2-results__options select2-results__options--nested"});n.append(j),h.append(i),h.append(n)}else this.template(c,d);return b.StoreData(d,"data",c),d},c.prototype.bind=function(c,d){var e=this,f=c.id+"-results";this.$results.attr("id",f),c.on("results:all",function(a){e.clear(),e.append(a.data),c.isOpen()&&(e.setClasses(),e.highlightFirstItem())}),c.on("results:append",function(a){e.append(a.data),c.isOpen()&&e.setClasses()}),c.on("query",function(a){e.hideMessages(),e.showLoading(a)}),c.on("select",function(){c.isOpen()&&(e.setClasses(),e.highlightFirstItem())}),c.on("unselect",function(){c.isOpen()&&(e.setClasses(),e.highlightFirstItem())}),c.on("open",function(){e.$results.attr("aria-expanded","true"),e.$results.attr("aria-hidden","false"),e.setClasses(),e.ensureHighlightVisible()}),c.on("close",function(){e.$results.attr("aria-expanded","false"),e.$results.attr("aria-hidden","true"),e.$results.removeAttr("aria-activedescendant")}),c.on("results:toggle",function(){var a=e.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),c.on("results:select",function(){var a=e.getHighlightedResults();if(0!==a.length){var c=b.GetData(a[0],"data");"true"==a.attr("aria-selected")?e.trigger("close",{}):e.trigger("select",{data:c})}}),c.on("results:previous",function(){var a=e.getHighlightedResults(),b=e.$results.find("[aria-selected]"),c=b.index(a);if(!(c<=0)){var d=c-1;0===a.length&&(d=0);var f=b.eq(d);f.trigger("mouseenter");var g=e.$results.offset().top,h=f.offset().top,i=e.$results.scrollTop()+(h-g);0===d?e.$results.scrollTop(0):h-g<0&&e.$results.scrollTop(i)}}),c.on("results:next",function(){var a=e.getHighlightedResults(),b=e.$results.find("[aria-selected]"),c=b.index(a),d=c+1;if(!(d>=b.length)){var f=b.eq(d);f.trigger("mouseenter");var g=e.$results.offset().top+e.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=e.$results.scrollTop()+h-g;0===d?e.$results.scrollTop(0):h>g&&e.$results.scrollTop(i)}}),c.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),c.on("results:message",function(a){e.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=e.$results.scrollTop(),c=e.$results.get(0).scrollHeight-b+a.deltaY,d=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&c<=e.$results.height();d?(e.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(e.$results.scrollTop(e.$results.get(0).scrollHeight-e.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(c){var d=a(this),f=b.GetData(this,"data");if("true"===d.attr("aria-selected"))return void(e.options.get("multiple")?e.trigger("unselect",{originalEvent:c,data:f}):e.trigger("close",{}));e.trigger("select",{originalEvent:c,data:f})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(c){var d=b.GetData(this,"data");e.getHighlightedResults().removeClass("select2-results__option--highlighted"),e.trigger("results:focus",{data:d,element:a(this)})})},c.prototype.getHighlightedResults=function(){return this.$results.find(".select2-results__option--highlighted")},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),c<=2?this.$results.scrollTop(0):(g>this.$results.outerHeight()||g<0)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b,c);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var c=a('');return this._tabindex=0,null!=b.GetData(this.$element[0],"old-tabindex")?this._tabindex=b.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),c.attr("title",this.$element.attr("title")),c.attr("tabindex",this._tabindex),this.$selection=c,c},d.prototype.bind=function(a,b){var d=this,e=(a.id,a.id+"-results");this.container=a,this.$selection.on("focus",function(a){d.trigger("focus",a)}),this.$selection.on("blur",function(a){d._handleBlur(a)}),this.$selection.on("keydown",function(a){d.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){d.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){d.update(a.data)}),a.on("open",function(){d.$selection.attr("aria-expanded","true"),d.$selection.attr("aria-owns",e),d._attachCloseHandler(a)}),a.on("close",function(){d.$selection.attr("aria-expanded","false"),d.$selection.removeAttr("aria-activedescendant"),d.$selection.removeAttr("aria-owns"),d.$selection.focus(),window.setTimeout(function(){d.$selection.focus()},0),d._detachCloseHandler(a)}),a.on("enable",function(){d.$selection.attr("tabindex",d._tabindex)}),a.on("disable",function(){d.$selection.attr("tabindex","-1")})},d.prototype._handleBlur=function(b){var c=this;window.setTimeout(function(){document.activeElement==c.$selection[0]||a.contains(c.$selection[0],document.activeElement)||c.trigger("blur",b)},1)},d.prototype._attachCloseHandler=function(c){a(document.body).on("mousedown.select2."+c.id,function(c){var d=a(c.target),e=d.closest(".select2");a(".select2.select2-container--open").each(function(){a(this),this!=e[0]&&b.GetData(this,"element").select2("close")})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){b.find(".selection").append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(a){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c,d){function e(){e.__super__.constructor.apply(this,arguments)}return c.Extend(e,b),e.prototype.render=function(){var a=e.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html(''),a},e.prototype.bind=function(a,b){var c=this;e.__super__.bind.apply(this,arguments);var d=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",d).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",d),this.$selection.on("mousedown",function(a){1===a.which&&c.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(a){}),this.$selection.on("blur",function(a){}),a.on("focus",function(b){a.isOpen()||c.$selection.focus()})},e.prototype.clear=function(){var a=this.$selection.find(".select2-selection__rendered");a.empty(),a.removeAttr("title")},e.prototype.display=function(a,b){var c=this.options.get("templateSelection");return this.options.get("escapeMarkup")(c(a,b))},e.prototype.selectionContainer=function(){return a("")},e.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.$selection.find(".select2-selection__rendered"),d=this.display(b,c);c.empty().append(d),c.attr("title",b.title||b.text)},e}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(a,b){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('
          '),a},d.prototype.bind=function(b,e){var f=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){f.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(b){if(!f.options.get("disabled")){var d=a(this),e=d.parent(),g=c.GetData(e[0],"data");f.trigger("unselect",{originalEvent:b,data:g})}})},d.prototype.clear=function(){var a=this.$selection.find(".select2-selection__rendered");a.empty(),a.removeAttr("title")},d.prototype.display=function(a,b){var c=this.options.get("templateSelection");return this.options.get("escapeMarkup")(c(a,b))},d.prototype.selectionContainer=function(){return a('
        • ×
        • ')},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d1||c)return a.call(this,b);this.clear();var d=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(d)},b}),b.define("select2/selection/allowClear",["jquery","../keys","../utils"],function(a,b,c){function d(){}return d.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},d.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var d=this.$selection.find(".select2-selection__clear");if(0!==d.length){b.stopPropagation();var e=c.GetData(d[0],"data"),f=this.$element.val();this.$element.val(this.placeholder.id);var g={data:e};if(this.trigger("clear",g),g.prevented)return void this.$element.val(f);for(var h=0;h0||0===d.length)){var e=a('×');c.StoreData(e[0],"data",d),this.$selection.find(".select2-selection__rendered").prepend(e)}},d}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,d,e){var f=this;a.call(this,d,e),d.on("open",function(){f.$search.trigger("focus")}),d.on("close",function(){f.$search.val(""),f.$search.removeAttr("aria-activedescendant"),f.$search.trigger("focus")}),d.on("enable",function(){f.$search.prop("disabled",!1),f._transferTabIndex()}),d.on("disable",function(){f.$search.prop("disabled",!0)}),d.on("focus",function(a){f.$search.trigger("focus")}),d.on("results:focus",function(a){f.$search.attr("aria-activedescendant",a.id)}),this.$selection.on("focusin",".select2-search--inline",function(a){f.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){f._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){if(a.stopPropagation(),f.trigger("keypress",a),f._keyUpPrevented=a.isDefaultPrevented(),a.which===c.BACKSPACE&&""===f.$search.val()){var d=f.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var e=b.GetData(d[0],"data");f.searchRemoveChoice(e),a.preventDefault()}}});var g=document.documentMode,h=g&&g<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){if(h)return void f.$selection.off("input.search input.searchcheck");f.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(h&&"input"===a.type)return void f.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&f.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;if(this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c){this.$element.find("[data-select2-tag]").length?this.$element.focus():this.$search.focus()}},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{a=.75*(this.$search.val().length+1)+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting","clear","clearing"],g=["opening","closing","selecting","unselecting","clearing"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"}}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),null!=c.id?d+="-"+c.id.toString():d+="-"+a.generateChars(4),d},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},j,l),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){"status"in d&&(0===d.status||"0"===d.status)||e.trigger("results:message",{message:"errorLoading"})});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&null!=a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");void 0!==f&&(this.createTag=f);var g=d.get("insertTag");if(void 0!==g&&(this.insertTag=g),b.call(this,c,d),a.isArray(e))for(var h=0;h0&&b.term.length>this.maximumInputLength)return void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}});a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;if(d.maximumSelectionLength>0&&f>=d.maximumSelectionLength)return void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}});a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val(""),e.$search.blur()}),c.on("focus",function(){c.isOpen()||e.$search.focus()}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){e.showSearch(a)?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){e.$results.offset().top+e.$results.outerHeight(!1)+50>=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1)&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('
        • '),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a(""),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){b.StoreData(this,"select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(c){var d=b.GetData(this,"select2-scroll-position");a(this).scrollTop(d.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id;this.$container.parents().filter(b.hasScroll).off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=this.$container.offset();f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.topf.bottom+h.height,l={left:f.left,top:g.bottom},m=this.$dropdownParent;"static"===m.css("position")&&(m=m.offsetParent());var n=m.offset();l.top-=n.top,l.left-=n.left,c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-n.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.position="relative",a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),null==l.tokenSeparators&&null==l.tokenizer||(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){null==c(d,e.children[g])&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var h=b(e.text).toUpperCase(),i=b(d.term).toUpperCase();return h.indexOf(i)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(!0,this.defaults,f)},new D}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),d.GetData(a[0],"select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),d.StoreData(a[0],"data",d.GetData(a[0],"select2Tags")),d.StoreData(a[0],"tags",!0)),d.GetData(a[0],"ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",d.GetData(a[0],"ajaxUrl")),d.StoreData(a[0],"ajax-Url",d.GetData(a[0],"ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,d.GetData(a[0])):d.GetData(a[0]);var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,d){null!=c.GetData(a[0],"select2")&&c.GetData(a[0],"select2").destroy(),this.$element=a,this.id=this._generateId(a),d=d||{},this.options=new b(d,a),e.__super__.constructor.call(this);var f=a.attr("tabindex")||0;c.StoreData(a[0],"old-tabindex",f),a.attr("tabindex","-1");var g=this.options.get("dataAdapter");this.dataAdapter=new g(a,this.options);var h=this.render();this._placeContainer(h);var i=this.options.get("selectionAdapter");this.selection=new i(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,h);var j=this.options.get("dropdownAdapter");this.dropdown=new j(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,h);var k=this.options.get("resultsAdapter");this.results=new k(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var l=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){l.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),c.StoreData(a[0],"select2",this),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b=b.replace(/(:|\.|\[|\]|,)/g,""),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return e<=0?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;h=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this.$element.on("focus.select2",function(a){b.trigger("focus",a)}),this._syncA=c.bind(this._syncAttributes,this),this._syncS=c.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._syncA),a.each(c,b._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",b._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",b._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",b._syncS,!1))},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open",{}),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ESC||c===d.TAB||c===d.UP&&b.altKey?(a.close(),b.preventDefault()):c===d.ENTER?(a.trigger("results:select",{}),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle",{}),b.preventDefault()):c===d.UP?(a.trigger("results:previous",{}),b.preventDefault()):c===d.DOWN&&(a.trigger("results:next",{}),b.preventDefault()):(c===d.ENTER||c===d.SPACE||c===d.DOWN&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype._syncSubtree=function(a,b){var c=!1,d=this;if(!a||!a.target||"OPTION"===a.target.nodeName||"OPTGROUP"===a.target.nodeName){if(b)if(b.addedNodes&&b.addedNodes.length>0)for(var e=0;e0&&(c=!0);else c=!0;c&&this.dataAdapter.current(function(a){d.trigger("selection:update",{data:a})})}},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting",clear:"clearing"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),null!=a&&0!==a.length||(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",c.GetData(this.$element[0],"old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),c.RemoveData(this.$element[0]),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},e.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),c.StoreData(b[0],"element",this.$element),b},e}),b.define("jquery-mousewheel",["jquery"],function(a){return a}),b.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(a,b,c,d,e){if(null==a.fn.select2){var f=["open","close","destroy"];a.fn.select2=function(b){if("object"==typeof(b=b||{}))return this.each(function(){var d=a.extend(!0,{},b);new c(a(this),d)}),this;if("string"==typeof b){var d,g=Array.prototype.slice.call(arguments,1);return this.each(function(){var a=e.GetData(this,"select2");null==a&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2."),d=a[b].apply(a,g)}),a.inArray(b,f)>-1?this:d}throw new Error("Invalid arguments for Select2: "+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,c}); \ No newline at end of file +/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ +!function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t),t}:n(jQuery)}(function(u){var e=function(){if(u&&u.fn&&u.fn.select2&&u.fn.select2.amd)var e=u.fn.select2.amd;var t,n,r,h,o,s,f,g,m,v,y,_,i,a,b;function w(e,t){return i.call(e,t)}function l(e,t){var n,r,i,o,s,a,l,c,u,d,p,h=t&&t.split("/"),f=y.map,g=f&&f["*"]||{};if(e){for(s=(e=e.split("/")).length-1,y.nodeIdCompat&&b.test(e[s])&&(e[s]=e[s].replace(b,"")),"."===e[0].charAt(0)&&h&&(e=h.slice(0,h.length-1).concat(e)),u=0;u":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},i.appendMany=function(e,t){if("1.7"===o.fn.jquery.substr(0,3)){var n=o();o.map(t,function(e){n=n.add(e)}),t=n}e.append(t)},i.__cache={};var n=0;return i.GetUniqueElementId=function(e){var t=e.getAttribute("data-select2-id");return null==t&&(e.id?(t=e.id,e.setAttribute("data-select2-id",t)):(e.setAttribute("data-select2-id",++n),t=n.toString())),t},i.StoreData=function(e,t,n){var r=i.GetUniqueElementId(e);i.__cache[r]||(i.__cache[r]={}),i.__cache[r][t]=n},i.GetData=function(e,t){var n=i.GetUniqueElementId(e);return t?i.__cache[n]&&null!=i.__cache[n][t]?i.__cache[n][t]:o(e).data(t):i.__cache[n]},i.RemoveData=function(e){var t=i.GetUniqueElementId(e);null!=i.__cache[t]&&delete i.__cache[t],e.removeAttribute("data-select2-id")},i}),e.define("select2/results",["jquery","./utils"],function(h,f){function r(e,t,n){this.$element=e,this.data=n,this.options=t,r.__super__.constructor.call(this)}return f.Extend(r,f.Observable),r.prototype.render=function(){var e=h('
            ');return this.options.get("multiple")&&e.attr("aria-multiselectable","true"),this.$results=e},r.prototype.clear=function(){this.$results.empty()},r.prototype.displayMessage=function(e){var t=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=h(''),r=this.options.get("translations").get(e.message);n.append(t(r(e.args))),n[0].className+=" select2-results__message",this.$results.append(n)},r.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},r.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n",{class:"select2-results__options select2-results__options--nested"});p.append(l),s.append(a),s.append(p)}else this.template(e,t);return f.StoreData(t,"data",e),t},r.prototype.bind=function(t,e){var l=this,n=t.id+"-results";this.$results.attr("id",n),t.on("results:all",function(e){l.clear(),l.append(e.data),t.isOpen()&&(l.setClasses(),l.highlightFirstItem())}),t.on("results:append",function(e){l.append(e.data),t.isOpen()&&l.setClasses()}),t.on("query",function(e){l.hideMessages(),l.showLoading(e)}),t.on("select",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("unselect",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("open",function(){l.$results.attr("aria-expanded","true"),l.$results.attr("aria-hidden","false"),l.setClasses(),l.ensureHighlightVisible()}),t.on("close",function(){l.$results.attr("aria-expanded","false"),l.$results.attr("aria-hidden","true"),l.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=l.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e=l.getHighlightedResults();if(0!==e.length){var t=f.GetData(e[0],"data");"true"==e.attr("aria-selected")?l.trigger("close",{}):l.trigger("select",{data:t})}}),t.on("results:previous",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e);if(!(n<=0)){var r=n-1;0===e.length&&(r=0);var i=t.eq(r);i.trigger("mouseenter");var o=l.$results.offset().top,s=i.offset().top,a=l.$results.scrollTop()+(s-o);0===r?l.$results.scrollTop(0):s-o<0&&l.$results.scrollTop(a)}}),t.on("results:next",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e)+1;if(!(n>=t.length)){var r=t.eq(n);r.trigger("mouseenter");var i=l.$results.offset().top+l.$results.outerHeight(!1),o=r.offset().top+r.outerHeight(!1),s=l.$results.scrollTop()+o-i;0===n?l.$results.scrollTop(0):ithis.$results.outerHeight()||o<0)&&this.$results.scrollTop(i)}},r.prototype.template=function(e,t){var n=this.options.get("templateResult"),r=this.options.get("escapeMarkup"),i=n(e,t);null==i?t.style.display="none":"string"==typeof i?t.innerHTML=r(i):h(t).append(i)},r}),e.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),e.define("select2/selection/base",["jquery","../utils","../keys"],function(n,r,i){function o(e,t){this.$element=e,this.options=t,o.__super__.constructor.call(this)}return r.Extend(o,r.Observable),o.prototype.render=function(){var e=n('');return this._tabindex=0,null!=r.GetData(this.$element[0],"old-tabindex")?this._tabindex=r.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),e.attr("title",this.$element.attr("title")),e.attr("tabindex",this._tabindex),e.attr("aria-disabled","false"),this.$selection=e},o.prototype.bind=function(e,t){var n=this,r=e.id+"-results";this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===i.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",r),n._attachCloseHandler(e)}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.trigger("focus"),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex),n.$selection.attr("aria-disabled","false")}),e.on("disable",function(){n.$selection.attr("tabindex","-1"),n.$selection.attr("aria-disabled","true")})},o.prototype._handleBlur=function(e){var t=this;window.setTimeout(function(){document.activeElement==t.$selection[0]||n.contains(t.$selection[0],document.activeElement)||t.trigger("blur",e)},1)},o.prototype._attachCloseHandler=function(e){n(document.body).on("mousedown.select2."+e.id,function(e){var t=n(e.target).closest(".select2");n(".select2.select2-container--open").each(function(){this!=t[0]&&r.GetData(this,"element").select2("close")})})},o.prototype._detachCloseHandler=function(e){n(document.body).off("mousedown.select2."+e.id)},o.prototype.position=function(e,t){t.find(".selection").append(e)},o.prototype.destroy=function(){this._detachCloseHandler(this.container)},o.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},o.prototype.isEnabled=function(){return!this.isDisabled()},o.prototype.isDisabled=function(){return this.options.get("disabled")},o}),e.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,n,r){function i(){i.__super__.constructor.apply(this,arguments)}return n.Extend(i,t),i.prototype.render=function(){var e=i.__super__.render.call(this);return e.addClass("select2-selection--single"),e.html(''),e},i.prototype.bind=function(t,e){var n=this;i.__super__.bind.apply(this,arguments);var r=t.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",r).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",r),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),t.on("focus",function(e){t.isOpen()||n.$selection.trigger("focus")})},i.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},i.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},i.prototype.selectionContainer=function(){return e("")},i.prototype.update=function(e){if(0!==e.length){var t=e[0],n=this.$selection.find(".select2-selection__rendered"),r=this.display(t,n);n.empty().append(r);var i=t.title||t.text;i?n.attr("title",i):n.removeAttr("title")}else this.clear()},i}),e.define("select2/selection/multiple",["jquery","./base","../utils"],function(i,e,l){function n(e,t){n.__super__.constructor.apply(this,arguments)}return l.Extend(n,e),n.prototype.render=function(){var e=n.__super__.render.call(this);return e.addClass("select2-selection--multiple"),e.html('
              '),e},n.prototype.bind=function(e,t){var r=this;n.__super__.bind.apply(this,arguments),this.$selection.on("click",function(e){r.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(e){if(!r.isDisabled()){var t=i(this).parent(),n=l.GetData(t[0],"data");r.trigger("unselect",{originalEvent:e,data:n})}})},n.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},n.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},n.prototype.selectionContainer=function(){return i('
            • ×
            • ')},n.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=0;n×
              ');a.StoreData(r[0],"data",t),this.$selection.find(".select2-selection__rendered").prepend(r)}},e}),e.define("select2/selection/search",["jquery","../utils","../keys"],function(r,a,l){function e(e,t,n){e.call(this,t,n)}return e.prototype.render=function(e){var t=r('');this.$searchContainer=t,this.$search=t.find("input");var n=e.call(this);return this._transferTabIndex(),n},e.prototype.bind=function(e,t,n){var r=this,i=t.id+"-results";e.call(this,t,n),t.on("open",function(){r.$search.attr("aria-controls",i),r.$search.trigger("focus")}),t.on("close",function(){r.$search.val(""),r.$search.removeAttr("aria-controls"),r.$search.removeAttr("aria-activedescendant"),r.$search.trigger("focus")}),t.on("enable",function(){r.$search.prop("disabled",!1),r._transferTabIndex()}),t.on("disable",function(){r.$search.prop("disabled",!0)}),t.on("focus",function(e){r.$search.trigger("focus")}),t.on("results:focus",function(e){e.data._resultId?r.$search.attr("aria-activedescendant",e.data._resultId):r.$search.removeAttr("aria-activedescendant")}),this.$selection.on("focusin",".select2-search--inline",function(e){r.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){r._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){if(e.stopPropagation(),r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented(),e.which===l.BACKSPACE&&""===r.$search.val()){var t=r.$searchContainer.prev(".select2-selection__choice");if(0this.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),e.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("select",function(){r._checkIfMaximumSelected()})},e.prototype.query=function(e,t,n){var r=this;this._checkIfMaximumSelected(function(){e.call(r,t,n)})},e.prototype._checkIfMaximumSelected=function(e,n){var r=this;this.current(function(e){var t=null!=e?e.length:0;0=r.maximumSelectionLength?r.trigger("results:message",{message:"maximumSelected",args:{maximum:r.maximumSelectionLength}}):n&&n()})},e}),e.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),e.define("select2/dropdown/search",["jquery","../utils"],function(o,e){function t(){}return t.prototype.render=function(e){var t=e.call(this),n=o('');return this.$searchContainer=n,this.$search=n.find("input"),t.prepend(n),t},t.prototype.bind=function(e,t,n){var r=this,i=t.id+"-results";e.call(this,t,n),this.$search.on("keydown",function(e){r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){o(this).off("keyup")}),this.$search.on("keyup input",function(e){r.handleSearch(e)}),t.on("open",function(){r.$search.attr("tabindex",0),r.$search.attr("aria-controls",i),r.$search.trigger("focus"),window.setTimeout(function(){r.$search.trigger("focus")},0)}),t.on("close",function(){r.$search.attr("tabindex",-1),r.$search.removeAttr("aria-controls"),r.$search.removeAttr("aria-activedescendant"),r.$search.val(""),r.$search.trigger("blur")}),t.on("focus",function(){t.isOpen()||r.$search.trigger("focus")}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(r.showSearch(e)?r.$searchContainer.removeClass("select2-search--hide"):r.$searchContainer.addClass("select2-search--hide"))}),t.on("results:focus",function(e){e.data._resultId?r.$search.attr("aria-activedescendant",e.data._resultId):r.$search.removeAttr("aria-activedescendant")})},t.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},t.prototype.showSearch=function(e,t){return!0},t}),e.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,r){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,r)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),r=t.length-1;0<=r;r--){var i=t[r];this.placeholder.id===i.id&&n.splice(r,1)}return n},e}),e.define("select2/dropdown/infiniteScroll",["jquery"],function(n){function e(e,t,n,r){this.lastParams={},e.call(this,t,n,r),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&(this.$results.append(this.$loadingMore),this.loadMoreIfNeeded())},e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("query",function(e){r.lastParams=e,r.loading=!0}),t.on("query:append",function(e){r.lastParams=e,r.loading=!0}),this.$results.on("scroll",this.loadMoreIfNeeded.bind(this))},e.prototype.loadMoreIfNeeded=function(){var e=n.contains(document.documentElement,this.$loadingMore[0]);if(!this.loading&&e){var t=this.$results.offset().top+this.$results.outerHeight(!1);this.$loadingMore.offset().top+this.$loadingMore.outerHeight(!1)<=t+50&&this.loadMore()}},e.prototype.loadMore=function(){this.loading=!0;var e=n.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=n('
            • '),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),e.define("select2/dropdown/attachBody",["jquery","../utils"],function(f,a){function e(e,t,n){this.$dropdownParent=f(n.get("dropdownParent")||document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("open",function(){r._showDropdown(),r._attachPositioningHandler(t),r._bindContainerResultHandlers(t)}),t.on("close",function(){r._hideDropdown(),r._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=f(""),n=e.call(this);return t.append(n),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._bindContainerResultHandlers=function(e,t){if(!this._containerResultsHandlersBound){var n=this;t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:message",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("select",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("unselect",function(){n._positionDropdown(),n._resizeDropdown()}),this._containerResultsHandlersBound=!0}},e.prototype._attachPositioningHandler=function(e,t){var n=this,r="scroll.select2."+t.id,i="resize.select2."+t.id,o="orientationchange.select2."+t.id,s=this.$container.parents().filter(a.hasScroll);s.each(function(){a.StoreData(this,"select2-scroll-position",{x:f(this).scrollLeft(),y:f(this).scrollTop()})}),s.on(r,function(e){var t=a.GetData(this,"select2-scroll-position");f(this).scrollTop(t.y)}),f(window).on(r+" "+i+" "+o,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,r="resize.select2."+t.id,i="orientationchange.select2."+t.id;this.$container.parents().filter(a.hasScroll).off(n),f(window).off(n+" "+r+" "+i)},e.prototype._positionDropdown=function(){var e=f(window),t=this.$dropdown.hasClass("select2-dropdown--above"),n=this.$dropdown.hasClass("select2-dropdown--below"),r=null,i=this.$container.offset();i.bottom=i.top+this.$container.outerHeight(!1);var o={height:this.$container.outerHeight(!1)};o.top=i.top,o.bottom=i.top+o.height;var s=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=ai.bottom+s,d={left:i.left,top:o.bottom},p=this.$dropdownParent;"static"===p.css("position")&&(p=p.offsetParent());var h={top:0,left:0};(f.contains(document.body,p[0])||p[0].isConnected)&&(h=p.offset()),d.top-=h.top,d.left-=h.left,t||n||(r="below"),u||!c||t?!c&&u&&t&&(r="below"):r="above",("above"==r||t&&"below"!==r)&&(d.top=o.top-h.top-s),null!=r&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+r),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+r)),this.$dropdownContainer.css(d)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),e.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,r){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,r)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,r=0;r');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container.addClass("select2-container--"+this.options.get("theme")),u.StoreData(e[0],"element",this.$element),e},d}),e.define("jquery-mousewheel",["jquery"],function(e){return e}),e.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(i,e,o,t,s){if(null==i.fn.select2){var a=["open","close","destroy"];i.fn.select2=function(t){if("object"==typeof(t=t||{}))return this.each(function(){var e=i.extend(!0,{},t);new o(i(this),e)}),this;if("string"!=typeof t)throw new Error("Invalid arguments for Select2: "+t);var n,r=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=s.GetData(this,"select2");null==e&&window.console&&console.error&&console.error("The select2('"+t+"') method was called on an element that is not using Select2."),n=e[t].apply(e,r)}),-1*",ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,setData:function(a,b){a.setData("Text",b.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0}};for(var d in c)!(d in b)&&(b[d]=c[d]);ga(b);for(var e in this)"_"===e.charAt(0)&&"function"==typeof this[e]&&(this[e]=this[e].bind(this));this.nativeDraggable=!b.forceFallback&&$,f(a,"mousedown",this._onTapStart),f(a,"touchstart",this._onTapStart),f(a,"pointerdown",this._onTapStart),this.nativeDraggable&&(f(a,"dragover",this),f(a,"dragenter",this)),ea.push(this._onDragOver),b.store&&this.sort(b.store.get(this))}function b(a,b){"clone"!==a.lastPullMode&&(b=!0),z&&z.state!==b&&(i(z,"display",b?"none":""),b||z.state&&(a.options.group.revertClone?(A.insertBefore(z,B),a._animate(w,z)):A.insertBefore(z,w)),z.state=b)}function c(a,b,c){if(a){c=c||V;do if(">*"===b&&a.parentNode===c||r(a,b))return a;while(a=d(a))}return null}function d(a){var b=a.host;return b&&b.nodeType?b:a.parentNode}function e(a){a.dataTransfer&&(a.dataTransfer.dropEffect="move"),a.preventDefault()}function f(a,b,c){a.addEventListener(b,c,Z)}function g(a,b,c){a.removeEventListener(b,c,Z)}function h(a,b,c){if(a)if(a.classList)a.classList[c?"add":"remove"](b);else{var d=(" "+a.className+" ").replace(R," ").replace(" "+b+" "," ");a.className=(d+(c?" "+b:"")).replace(R," ")}}function i(a,b,c){var d=a&&a.style;if(d){if(void 0===c)return V.defaultView&&V.defaultView.getComputedStyle?c=V.defaultView.getComputedStyle(a,""):a.currentStyle&&(c=a.currentStyle),void 0===b?c:c[b];b in d||(b="-webkit-"+b),d[b]=c+("string"==typeof c?"":"px")}}function j(a,b,c){if(a){var d=a.getElementsByTagName(b),e=0,f=d.length;if(c)for(;e5||b.clientX-(d.left+d.width)>5}function p(a){for(var b=a.tagName+a.className+a.src+a.href+a.textContent,c=b.length,d=0;c--;)d+=b.charCodeAt(c);return d.toString(36)}function q(a,b){var c=0;if(!a||!a.parentNode)return-1;for(;a&&(a=a.previousElementSibling);)"TEMPLATE"===a.nodeName.toUpperCase()||">*"!==b&&!r(a,b)||c++;return c}function r(a,b){if(a){b=b.split(".");var c=b.shift().toUpperCase(),d=new RegExp("\\s("+b.join("|")+")(?=\\s)","g");return!(""!==c&&a.nodeName.toUpperCase()!=c||b.length&&((" "+a.className+" ").match(d)||[]).length!=b.length)}return!1}function s(a,b){var c,d;return function(){void 0===c&&(c=arguments,d=this,setTimeout(function(){1===c.length?a.call(d,c[0]):a.apply(d,c),c=void 0},b))}}function t(a,b){if(a&&b)for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return a}function u(a){return X?X(a).clone(!0)[0]:Y&&Y.dom?Y.dom(a).cloneNode(!0):a.cloneNode(!0)}function v(a){for(var b=a.getElementsByTagName("input"),c=b.length;c--;){var d=b[c];d.checked&&da.push(d)}}if("undefined"==typeof window||!window.document)return function(){throw new Error("Sortable.js requires a window with a document")};var w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q={},R=/\s+/g,S=/left|right|inline/,T="Sortable"+(new Date).getTime(),U=window,V=U.document,W=U.parseInt,X=U.jQuery||U.Zepto,Y=U.Polymer,Z=!1,$=!!("draggable"in V.createElement("div")),_=function(a){return!navigator.userAgent.match(/Trident.*rv[ :]?11\./)&&(a=V.createElement("x"),a.style.cssText="pointer-events:auto","auto"===a.style.pointerEvents)}(),aa=!1,ba=Math.abs,ca=Math.min,da=[],ea=[],fa=s(function(a,b,c){if(c&&b.scroll){var d,e,f,g,h,i,j=c[T],k=b.scrollSensitivity,l=b.scrollSpeed,m=a.clientX,n=a.clientY,o=window.innerWidth,p=window.innerHeight;if(E!==c&&(D=b.scroll,E=c,F=b.scrollFn,D===!0)){D=c;do if(D.offsetWidth-1:e==a)}}var c={},d=a.group;d&&"object"==typeof d||(d={name:d}),c.name=d.name,c.checkPull=b(d.pull,!0),c.checkPut=b(d.put),c.revertClone=d.revertClone,a.group=c};a.prototype={constructor:a,_onTapStart:function(a){var b,d=this,e=this.el,f=this.options,g=f.preventOnFilter,h=a.type,i=a.touches&&a.touches[0],j=(i||a).target,l=a.target.shadowRoot&&a.path[0]||j,m=f.filter;if(v(e),!w&&!("mousedown"===h&&0!==a.button||f.disabled)&&(j=c(j,f.draggable,e),j&&C!==j)){if(b=q(j,f.draggable),"function"==typeof m){if(m.call(this,a,j,this))return k(d,l,"filter",j,e,b),void(g&&a.preventDefault())}else if(m&&(m=m.split(",").some(function(a){if(a=c(l,a.trim(),e))return k(d,a,"filter",j,e,b),!0})))return void(g&&a.preventDefault());f.handle&&!c(l,f.handle,e)||this._prepareDragStart(a,i,j,b)}},_prepareDragStart:function(a,b,c,d){var e,g=this,i=g.el,l=g.options,n=i.ownerDocument;c&&!w&&c.parentNode===i&&(N=a,A=i,w=c,x=w.parentNode,B=w.nextSibling,C=c,L=l.group,J=d,this._lastX=(b||a).clientX,this._lastY=(b||a).clientY,w.style["will-change"]="transform",e=function(){g._disableDelayedDrag(),w.draggable=g.nativeDraggable,h(w,l.chosenClass,!0),g._triggerDragStart(a,b),k(g,A,"choose",w,A,J)},l.ignore.split(",").forEach(function(a){j(w,a.trim(),m)}),f(n,"mouseup",g._onDrop),f(n,"touchend",g._onDrop),f(n,"touchcancel",g._onDrop),f(n,"pointercancel",g._onDrop),f(n,"selectstart",g),l.delay?(f(n,"mouseup",g._disableDelayedDrag),f(n,"touchend",g._disableDelayedDrag),f(n,"touchcancel",g._disableDelayedDrag),f(n,"mousemove",g._disableDelayedDrag),f(n,"touchmove",g._disableDelayedDrag),f(n,"pointermove",g._disableDelayedDrag),g._dragStartTimer=setTimeout(e,l.delay)):e())},_disableDelayedDrag:function(){var a=this.el.ownerDocument;clearTimeout(this._dragStartTimer),g(a,"mouseup",this._disableDelayedDrag),g(a,"touchend",this._disableDelayedDrag),g(a,"touchcancel",this._disableDelayedDrag),g(a,"mousemove",this._disableDelayedDrag),g(a,"touchmove",this._disableDelayedDrag),g(a,"pointermove",this._disableDelayedDrag)},_triggerDragStart:function(a,b){b=b||("touch"==a.pointerType?a:null),b?(N={target:w,clientX:b.clientX,clientY:b.clientY},this._onDragStart(N,"touch")):this.nativeDraggable?(f(w,"dragend",this),f(A,"dragstart",this._onDragStart)):this._onDragStart(N,!0);try{V.selection?setTimeout(function(){V.selection.empty()}):window.getSelection().removeAllRanges()}catch(a){}},_dragStarted:function(){if(A&&w){var b=this.options;h(w,b.ghostClass,!0),h(w,b.dragClass,!1),a.active=this,k(this,A,"start",w,A,J)}else this._nulling()},_emulateDragOver:function(){if(O){if(this._lastX===O.clientX&&this._lastY===O.clientY)return;this._lastX=O.clientX,this._lastY=O.clientY,_||i(y,"display","none");var a=V.elementFromPoint(O.clientX,O.clientY),b=a,c=ea.length;if(b)do{if(b[T]){for(;c--;)ea[c]({clientX:O.clientX,clientY:O.clientY,target:a,rootEl:b});break}a=b}while(b=b.parentNode);_||i(y,"display","")}},_onTouchMove:function(b){if(N){var c=this.options,d=c.fallbackTolerance,e=c.fallbackOffset,f=b.touches?b.touches[0]:b,g=f.clientX-N.clientX+e.x,h=f.clientY-N.clientY+e.y,j=b.touches?"translate3d("+g+"px,"+h+"px,0)":"translate("+g+"px,"+h+"px)";if(!a.active){if(d&&ca(ba(f.clientX-this._lastX),ba(f.clientY-this._lastY))w.offsetWidth,D=e.offsetHeight>w.offsetHeight,E=(v?(d.clientX-g.left)/t:(d.clientY-g.top)/u)>.5,F=e.nextElementSibling,J=!1;if(v){var K=w.offsetTop,N=e.offsetTop;J=K===N?e.previousElementSibling===w&&!C||E&&C:e.previousElementSibling===w||w.previousElementSibling===e?(d.clientY-g.top)/u>.5:N>K}else r||(J=F!==w&&!D||E&&D);var O=l(A,j,w,f,e,g,d,J);O!==!1&&(1!==O&&O!==-1||(J=1===O),aa=!0,setTimeout(n,30),b(p,q),w.contains(j)||(J&&!F?j.appendChild(w):e.parentNode.insertBefore(w,J?F:e)),x=w.parentNode,this._animate(f,w),this._animate(g,e))}}},_animate:function(a,b){var c=this.options.animation;if(c){var d=b.getBoundingClientRect();1===a.nodeType&&(a=a.getBoundingClientRect()),i(b,"transition","none"),i(b,"transform","translate3d("+(a.left-d.left)+"px,"+(a.top-d.top)+"px,0)"),b.offsetWidth,i(b,"transition","all "+c+"ms"),i(b,"transform","translate3d(0,0,0)"),clearTimeout(b.animated),b.animated=setTimeout(function(){i(b,"transition",""),i(b,"transform",""),b.animated=!1},c)}},_offUpEvents:function(){var a=this.el.ownerDocument;g(V,"touchmove",this._onTouchMove),g(V,"pointermove",this._onTouchMove),g(a,"mouseup",this._onDrop),g(a,"touchend",this._onDrop),g(a,"pointerup",this._onDrop),g(a,"touchcancel",this._onDrop),g(a,"pointercancel",this._onDrop),g(a,"selectstart",this)},_onDrop:function(b){var c=this.el,d=this.options;clearInterval(this._loopId),clearInterval(Q.pid),clearTimeout(this._dragStartTimer),g(V,"mousemove",this._onTouchMove),this.nativeDraggable&&(g(V,"drop",this),g(c,"dragstart",this._onDragStart)),this._offUpEvents(),b&&(P&&(b.preventDefault(),!d.dropBubble&&b.stopPropagation()),y&&y.parentNode&&y.parentNode.removeChild(y),A!==x&&"clone"===a.active.lastPullMode||z&&z.parentNode&&z.parentNode.removeChild(z),w&&(this.nativeDraggable&&g(w,"dragend",this),m(w),w.style["will-change"]="",h(w,this.options.ghostClass,!1),h(w,this.options.chosenClass,!1),k(this,A,"unchoose",w,A,J),A!==x?(K=q(w,d.draggable),K>=0&&(k(null,x,"add",w,A,J,K),k(this,A,"remove",w,A,J,K),k(null,x,"sort",w,A,J,K),k(this,A,"sort",w,A,J,K))):w.nextSibling!==B&&(K=q(w,d.draggable),K>=0&&(k(this,A,"update",w,A,J,K),k(this,A,"sort",w,A,J,K))),a.active&&(null!=K&&K!==-1||(K=J),k(this,A,"end",w,A,J,K),this.save()))),this._nulling()},_nulling:function(){A=w=x=y=B=z=C=D=E=N=O=P=K=G=H=M=L=a.active=null,da.forEach(function(a){a.checked=!0}),da.length=0},handleEvent:function(a){switch(a.type){case"drop":case"dragend":this._onDrop(a);break;case"dragover":case"dragenter":w&&(this._onDragOver(a),e(a));break;case"selectstart":a.preventDefault()}},toArray:function(){for(var a,b=[],d=this.el.children,e=0,f=d.length,g=this.options;e"===e[0]&&(e=e.substring(1)),t)try{if(t.matches)return t.matches(e);if(t.msMatchesSelector)return t.msMatchesSelector(e);if(t.webkitMatchesSelector)return t.webkitMatchesSelector(e)}catch(t){return!1}return!1}}function P(t,e,n,o){if(t){n=n||document;do{if(null!=e&&(">"===e[0]?t.parentNode===n&&h(t,e):h(t,e))||o&&t===n)return t;if(t===n)break}while(t=(i=t).host&&i!==document&&i.host.nodeType?i.host:i.parentNode)}var i;return null}var f,p=/\s+/g;function k(t,e,n){if(t&&e)if(t.classList)t.classList[n?"add":"remove"](e);else{var o=(" "+t.className+" ").replace(p," ").replace(" "+e+" "," ");t.className=(o+(n?" "+e:"")).replace(p," ")}}function R(t,e,n){var o=t&&t.style;if(o){if(void 0===n)return document.defaultView&&document.defaultView.getComputedStyle?n=document.defaultView.getComputedStyle(t,""):t.currentStyle&&(n=t.currentStyle),void 0===e?n:n[e];e in o||-1!==e.indexOf("webkit")||(e="-webkit-"+e),o[e]=n+("string"==typeof n?"":"px")}}function v(t,e){var n="";if("string"==typeof t)n=t;else do{var o=R(t,"transform");o&&"none"!==o&&(n=o+" "+n)}while(!e&&(t=t.parentNode));var i=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix;return i&&new i(n)}function g(t,e,n){if(t){var o=t.getElementsByTagName(e),i=0,r=o.length;if(n)for(;i=e.left-n&&r<=e.right+n,i=a>=e.top-n&&a<=e.bottom+n;return n&&o&&i?l=t:void 0}}),l}((t=t.touches?t.touches[0]:t).clientX,t.clientY);if(e){var n={};for(var o in t)t.hasOwnProperty(o)&&(n[o]=t[o]);n.target=n.rootEl=e,n.preventDefault=void 0,n.stopPropagation=void 0,e[j]._onDragOver(n)}}}function kt(t){z&&z.parentNode[j]._isOutsideThisEl(t.target)}function Rt(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw"Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(t));this.el=t,this.options=e=a({},e),t[j]=this;var n={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(t.nodeName)?">li":">*",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return Ot(t,this.options)},ghostClass:"sortable-ghost",chosenClass:"sortable-chosen",dragClass:"sortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:"sortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==Rt.supportPointer&&"PointerEvent"in window,emptyInsertThreshold:5};for(var o in O.initializePlugins(this,t,n),n)o in e||(e[o]=n[o]);for(var i in At(e),this)"_"===i.charAt(0)&&"function"==typeof this[i]&&(this[i]=this[i].bind(this));this.nativeDraggable=!e.forceFallback&&xt,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?u(t,"pointerdown",this._onTapStart):(u(t,"mousedown",this._onTapStart),u(t,"touchstart",this._onTapStart)),this.nativeDraggable&&(u(t,"dragover",this),u(t,"dragenter",this)),bt.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[]),a(this,T())}function Xt(t,e,n,o,i,r,a,l){var s,c,u=t[j],d=u.options.onMove;return!window.CustomEvent||w||E?(s=document.createEvent("Event")).initEvent("move",!0,!0):s=new CustomEvent("move",{bubbles:!0,cancelable:!0}),s.to=e,s.from=t,s.dragged=n,s.draggedRect=o,s.related=i||e,s.relatedRect=r||X(e),s.willInsertAfter=l,s.originalEvent=a,t.dispatchEvent(s),d&&(c=d.call(u,s,a)),c}function Yt(t){t.draggable=!1}function Bt(){Dt=!1}function Ft(t){for(var e=t.tagName+t.className+t.src+t.href+t.textContent,n=e.length,o=0;n--;)o+=e.charCodeAt(n);return o.toString(36)}function Ht(t){return setTimeout(t,0)}function Lt(t){return clearTimeout(t)}Rt.prototype={constructor:Rt,_isOutsideThisEl:function(t){this.el.contains(t)||t===this.el||(ht=null)},_getDirection:function(t,e){return"function"==typeof this.options.direction?this.options.direction.call(this,t,e,z):this.options.direction},_onTapStart:function(e){if(e.cancelable){var n=this,o=this.el,t=this.options,i=t.preventOnFilter,r=e.type,a=e.touches&&e.touches[0]||e.pointerType&&"touch"===e.pointerType&&e,l=(a||e).target,s=e.target.shadowRoot&&(e.path&&e.path[0]||e.composedPath&&e.composedPath()[0])||l,c=t.filter;if(function(t){_t.length=0;var e=t.getElementsByTagName("input"),n=e.length;for(;n--;){var o=e[n];o.checked&&_t.push(o)}}(o),!z&&!(/mousedown|pointerdown/.test(r)&&0!==e.button||t.disabled||s.isContentEditable||(l=P(l,t.draggable,o,!1))&&l.animated||Z===l)){if(J=F(l),et=F(l,t.draggable),"function"==typeof c){if(c.call(this,e,l,this))return W({sortable:n,rootEl:s,name:"filter",targetEl:l,toEl:o,fromEl:o}),K("filter",n,{evt:e}),void(i&&e.cancelable&&e.preventDefault())}else if(c&&(c=c.split(",").some(function(t){if(t=P(s,t.trim(),o,!1))return W({sortable:n,rootEl:t,name:"filter",targetEl:l,fromEl:o,toEl:o}),K("filter",n,{evt:e}),!0})))return void(i&&e.cancelable&&e.preventDefault());t.handle&&!P(s,t.handle,o,!1)||this._prepareDragStart(e,a,l)}}},_prepareDragStart:function(t,e,n){var o,i=this,r=i.el,a=i.options,l=r.ownerDocument;if(n&&!z&&n.parentNode===r){var s=X(n);if(q=r,G=(z=n).parentNode,V=z.nextSibling,Z=n,ot=a.group,rt={target:Rt.dragged=z,clientX:(e||t).clientX,clientY:(e||t).clientY},ct=rt.clientX-s.left,ut=rt.clientY-s.top,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,z.style["will-change"]="all",o=function(){K("delayEnded",i,{evt:t}),Rt.eventCanceled?i._onDrop():(i._disableDelayedDragEvents(),!c&&i.nativeDraggable&&(z.draggable=!0),i._triggerDragStart(t,e),W({sortable:i,name:"choose",originalEvent:t}),k(z,a.chosenClass,!0))},a.ignore.split(",").forEach(function(t){g(z,t.trim(),Yt)}),u(l,"dragover",Pt),u(l,"mousemove",Pt),u(l,"touchmove",Pt),u(l,"mouseup",i._onDrop),u(l,"touchend",i._onDrop),u(l,"touchcancel",i._onDrop),c&&this.nativeDraggable&&(this.options.touchStartThreshold=4,z.draggable=!0),K("delayStart",this,{evt:t}),!a.delay||a.delayOnTouchOnly&&!e||this.nativeDraggable&&(E||w))o();else{if(Rt.eventCanceled)return void this._onDrop();u(l,"mouseup",i._disableDelayedDrag),u(l,"touchend",i._disableDelayedDrag),u(l,"touchcancel",i._disableDelayedDrag),u(l,"mousemove",i._delayedDragTouchMoveHandler),u(l,"touchmove",i._delayedDragTouchMoveHandler),a.supportPointer&&u(l,"pointermove",i._delayedDragTouchMoveHandler),i._dragStartTimer=setTimeout(o,a.delay)}}},_delayedDragTouchMoveHandler:function(t){var e=t.touches?t.touches[0]:t;Math.max(Math.abs(e.clientX-this._lastX),Math.abs(e.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){z&&Yt(z),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;d(t,"mouseup",this._disableDelayedDrag),d(t,"touchend",this._disableDelayedDrag),d(t,"touchcancel",this._disableDelayedDrag),d(t,"mousemove",this._delayedDragTouchMoveHandler),d(t,"touchmove",this._delayedDragTouchMoveHandler),d(t,"pointermove",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||"touch"==t.pointerType&&t,!this.nativeDraggable||e?this.options.supportPointer?u(document,"pointermove",this._onTouchMove):u(document,e?"touchmove":"mousemove",this._onTouchMove):(u(z,"dragend",this),u(q,"dragstart",this._onDragStart));try{document.selection?Ht(function(){document.selection.empty()}):window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(t,e){if(vt=!1,q&&z){K("dragStarted",this,{evt:e}),this.nativeDraggable&&u(document,"dragover",kt);var n=this.options;t||k(z,n.dragClass,!1),k(z,n.ghostClass,!0),Rt.active=this,t&&this._appendGhost(),W({sortable:this,name:"start",originalEvent:e})}else this._nulling()},_emulateDragOver:function(){if(at){this._lastX=at.clientX,this._lastY=at.clientY,Nt();for(var t=document.elementFromPoint(at.clientX,at.clientY),e=t;t&&t.shadowRoot&&(t=t.shadowRoot.elementFromPoint(at.clientX,at.clientY))!==e;)e=t;if(z.parentNode[j]._isOutsideThisEl(t),e)do{if(e[j]){if(e[j]._onDragOver({clientX:at.clientX,clientY:at.clientY,target:t,rootEl:e})&&!this.options.dragoverBubble)break}t=e}while(e=e.parentNode);It()}},_onTouchMove:function(t){if(rt){var e=this.options,n=e.fallbackTolerance,o=e.fallbackOffset,i=t.touches?t.touches[0]:t,r=U&&v(U),a=U&&r&&r.a,l=U&&r&&r.d,s=Ct&>&&b(gt),c=(i.clientX-rt.clientX+o.x)/(a||1)+(s?s[0]-Et[0]:0)/(a||1),u=(i.clientY-rt.clientY+o.y)/(l||1)+(s?s[1]-Et[1]:0)/(l||1);if(!Rt.active&&!vt){if(n&&Math.max(Math.abs(i.clientX-this._lastX),Math.abs(i.clientY-this._lastY))o.right+10||t.clientX<=o.right&&t.clientY>o.bottom&&t.clientX>=o.left:t.clientX>o.right&&t.clientY>o.top||t.clientX<=o.right&&t.clientY>o.bottom+10}(n,a,this)&&!g.animated){if(g===z)return A(!1);if(g&&l===n.target&&(s=g),s&&(i=X(s)),!1!==Xt(q,l,z,o,s,i,n,!!s))return O(),l.appendChild(z),G=l,N(),A(!0)}else if(s.parentNode===l){i=X(s);var v,m,b,y=z.parentNode!==l,w=!function(t,e,n){var o=n?t.left:t.top,i=n?t.right:t.bottom,r=n?t.width:t.height,a=n?e.left:e.top,l=n?e.right:e.bottom,s=n?e.width:e.height;return o===a||i===l||o+r/2===a+s/2}(z.animated&&z.toRect||o,s.animated&&s.toRect||i,a),E=a?"top":"left",D=Y(s,"top","top")||Y(z,"top","top"),_=D?D.scrollTop:void 0;if(ht!==s&&(m=i[E],yt=!1,wt=!w&&e.invertSwap||y),0!==(v=function(t,e,n,o,i,r,a,l){var s=o?t.clientY:t.clientX,c=o?n.height:n.width,u=o?n.top:n.left,d=o?n.bottom:n.right,h=!1;if(!a)if(l&&pt 0.5%" + ], "keywords": [ "pathfinder", "exodus 4d", diff --git a/public/css/v1.5.5/pathfinder.css b/public/css/v1.5.5/pathfinder.css deleted file mode 100644 index 8c78619f..00000000 --- a/public/css/v1.5.5/pathfinder.css +++ /dev/null @@ -1,63 +0,0 @@ -/*! - * Pathfinder - Mapping Tool - * https://www.pathfinder-w.space - * - * CSS - Cascading Style Sheets - * Generated with Compass http://compass-style.org - * - * Copyright 2015 - 2018, Exodus 4D - Mark Friedrich - * - */html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,.editable-input .editable-checklist>div>label>span,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}html{line-height:1}ol,ul{list-style:none}table{border-collapse:collapse;border-spacing:0}caption,th,td{text-align:left;font-weight:normal;vertical-align:middle}q,blockquote{quotes:none}q:before,q:after,blockquote:before,blockquote:after{content:"";content:none}a img{border:none}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}@font-face{font-family:'Oxygen';font-weight:400;font-style:normal;font-display:swap;src:url("../../fonts/oxygen-regular-webfont.eot");src:url("../../fonts/oxygen-regular-webfont.eot") format("embedded-opentype"),url("../../fonts/oxygen-regular-webfont.woff2") format("woff2"),url("../../fonts/oxygen-regular-webfont.woff") format("woff"),url("../../fonts/oxygen-regular-webfont.ttf") format("truetype")}@font-face{font-family:'Oxygen Bold';font-weight:700;font-style:normal;font-display:swap;src:url("../../fonts/oxygen-bold-webfont.eot");src:url("../../fonts/oxygen-bold-webfont.eot") format("embedded-opentype"),url("../../fonts/oxygen-bold-webfont.woff2") format("woff2"),url("../../fonts/oxygen-bold-webfont.woff") format("woff"),url("../../fonts/oxygen-bold-webfont.ttf") format("truetype")}/*! - * Bootstrap SASS - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:transparent}body{font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;font-size:12px;line-height:1.5;color:#63676a;background-color:#1d1d1d}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#375959;text-decoration:none}a:hover,a:focus{color:#1a2a2a;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;outline-color:#568a89;text-decoration:none}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.5;background-color:#1d1d1d;border:1px solid #ddd;border-radius:0px;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:18px;margin-bottom:18px;border:0;border-top:1px solid #adadad}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;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:normal;line-height:1;color:#63676a}h1,.h1,h2,.h2,h3,.h3{margin-top:18px;margin-bottom:9px}h1 small,h1 .small,.h1 small,.h1 .small,h2 small,h2 .small,.h2 small,.h2 .small,h3 small,h3 .small,.h3 small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:9px;margin-bottom:9px}h4 small,h4 .small,.h4 small,.h4 .small,h5 small,h5 .small,.h5 small,.h5 .small,h6 small,h6 .small,.h6 small,.h6 .small{font-size:75%}h1,.h1{font-size:22px}h2,.h2{font-size:20px}h3,.h3{font-size:17px}h4,.h4{font-size:12px}h5,.h5{font-size:14px}h6,.h6{font-size:13px}p{margin:0 0 9px}.lead{margin-bottom:18px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width: 780px){.lead{font-size:16px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#63676a}.text-primary{color:#375959}a.text-primary:hover{color:#243939}.text-success{color:#2b2b2b}a.text-success:hover{color:#121212}.text-info{color:#2b2b2b}a.text-info:hover{color:#121212}.text-warning{color:#2b2b2b}a.text-warning:hover{color:#121212}.text-danger{color:#2b2b2b}a.text-danger:hover{color:#121212}.bg-primary{color:#fff}.bg-primary{background-color:#375959}a.bg-primary:hover{background-color:#243939}.bg-success{background-color:#d1e8d1}a.bg-success:hover{background-color:#afd7af}.bg-info{background-color:#abc9e2}a.bg-info:hover{background-color:#85b0d5}.bg-warning{background-color:#fdedd8}a.bg-warning:hover{background-color:#fad8a8}.bg-danger{background-color:#f6d1d0}a.bg-danger:hover{background-color:#eda7a5}.page-header{padding-bottom:8px;margin:36px 0 18px;border-bottom:1px solid #adadad}ul,ol{margin-top:0;margin-bottom:9px}ul ul,ul ol,ol ul,ol ol{margin-bottom:0}.list-unstyled,.list-inline{padding-left:0;list-style:none}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:10px}dt,dd{line-height:18px}dt{font-weight:bold}dd{margin-left:0}@media (min-width: 480px){.dl-horizontal dt{float:left;width:105px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:120px}.dl-horizontal dd:before,.dl-horizontal dd:after{content:" ";display:table}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #63676a}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:9px 18px;margin:0 0 18px;font-size:15px;border-left:5px solid #5cb85c}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.5;color:#63676a}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #5cb85c;border-left:0;text-align:right}.blockquote-reverse footer:before,.blockquote-reverse small:before,.blockquote-reverse .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,.blockquote-reverse small:after,.blockquote-reverse .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:18px;font-style:normal;line-height:1.5}code,kbd,pre,samp{font-family:Consolas,monospace,Menlo,Monaco,"Courier New"}code{padding:2px 4px;font-size:90%;color:#1d1d1d;background-color:#63676a;white-space:nowrap;border-radius:3px}kbd{padding:2px 4px;font-size:90%;color:#adadad;background-color:#2b2b2b;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}pre{display:block;padding:8.5px;margin:0 0 9px;font-size:11px;line-height:1.5;word-break:break-all;word-wrap:break-word;color:#1d1d1d;background-color:#63676a;border-radius:3px}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{margin-right:auto;margin-left:auto;padding-left:10px;padding-right:10px}.container:before,.container:after{content:" ";display:table}.container:after{clear:both}@media (min-width: 780px){.container{width:740px}}@media (min-width: 1200px){.container{width:1080px}}@media (min-width: 1600px){.container{width:1260px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:10px;padding-right:10px}.container-fluid:before,.container-fluid:after{content:" ";display:table}.container-fluid:after{clear:both}.row{margin-left:-10px;margin-right:-10px}.row:before,.row:after{content:" ";display:table}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:10px;padding-right:10px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-1{width:8.33333%}.col-xs-2{width:16.66667%}.col-xs-3{width:25%}.col-xs-4{width:33.33333%}.col-xs-5{width:41.66667%}.col-xs-6{width:50%}.col-xs-7{width:58.33333%}.col-xs-8{width:66.66667%}.col-xs-9{width:75%}.col-xs-10{width:83.33333%}.col-xs-11{width:91.66667%}.col-xs-12{width:100%}.col-xs-pull-0{right:0%}.col-xs-pull-1{right:8.33333%}.col-xs-pull-2{right:16.66667%}.col-xs-pull-3{right:25%}.col-xs-pull-4{right:33.33333%}.col-xs-pull-5{right:41.66667%}.col-xs-pull-6{right:50%}.col-xs-pull-7{right:58.33333%}.col-xs-pull-8{right:66.66667%}.col-xs-pull-9{right:75%}.col-xs-pull-10{right:83.33333%}.col-xs-pull-11{right:91.66667%}.col-xs-pull-12{right:100%}.col-xs-push-0{left:0%}.col-xs-push-1{left:8.33333%}.col-xs-push-2{left:16.66667%}.col-xs-push-3{left:25%}.col-xs-push-4{left:33.33333%}.col-xs-push-5{left:41.66667%}.col-xs-push-6{left:50%}.col-xs-push-7{left:58.33333%}.col-xs-push-8{left:66.66667%}.col-xs-push-9{left:75%}.col-xs-push-10{left:83.33333%}.col-xs-push-11{left:91.66667%}.col-xs-push-12{left:100%}.col-xs-offset-0{margin-left:0%}.col-xs-offset-1{margin-left:8.33333%}.col-xs-offset-2{margin-left:16.66667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.33333%}.col-xs-offset-5{margin-left:41.66667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.33333%}.col-xs-offset-8{margin-left:66.66667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.33333%}.col-xs-offset-11{margin-left:91.66667%}.col-xs-offset-12{margin-left:100%}@media (min-width: 780px){.col-sm-1,.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-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-1{width:8.33333%}.col-sm-2{width:16.66667%}.col-sm-3{width:25%}.col-sm-4{width:33.33333%}.col-sm-5{width:41.66667%}.col-sm-6{width:50%}.col-sm-7{width:58.33333%}.col-sm-8{width:66.66667%}.col-sm-9{width:75%}.col-sm-10{width:83.33333%}.col-sm-11{width:91.66667%}.col-sm-12{width:100%}.col-sm-pull-0{right:0%}.col-sm-pull-1{right:8.33333%}.col-sm-pull-2{right:16.66667%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333%}.col-sm-pull-5{right:41.66667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.33333%}.col-sm-pull-8{right:66.66667%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333%}.col-sm-pull-11{right:91.66667%}.col-sm-pull-12{right:100%}.col-sm-push-0{left:0%}.col-sm-push-1{left:8.33333%}.col-sm-push-2{left:16.66667%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333%}.col-sm-push-5{left:41.66667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.33333%}.col-sm-push-8{left:66.66667%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333%}.col-sm-push-11{left:91.66667%}.col-sm-push-12{left:100%}.col-sm-offset-0{margin-left:0%}.col-sm-offset-1{margin-left:8.33333%}.col-sm-offset-2{margin-left:16.66667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333%}.col-sm-offset-5{margin-left:41.66667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.33333%}.col-sm-offset-8{margin-left:66.66667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333%}.col-sm-offset-11{margin-left:91.66667%}.col-sm-offset-12{margin-left:100%}}@media (min-width: 1200px){.col-md-1,.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-md-10,.col-md-11,.col-md-12{float:left}.col-md-1{width:8.33333%}.col-md-2{width:16.66667%}.col-md-3{width:25%}.col-md-4{width:33.33333%}.col-md-5{width:41.66667%}.col-md-6{width:50%}.col-md-7{width:58.33333%}.col-md-8{width:66.66667%}.col-md-9{width:75%}.col-md-10{width:83.33333%}.col-md-11{width:91.66667%}.col-md-12{width:100%}.col-md-pull-0{right:0%}.col-md-pull-1{right:8.33333%}.col-md-pull-2{right:16.66667%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333%}.col-md-pull-5{right:41.66667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.33333%}.col-md-pull-8{right:66.66667%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333%}.col-md-pull-11{right:91.66667%}.col-md-pull-12{right:100%}.col-md-push-0{left:0%}.col-md-push-1{left:8.33333%}.col-md-push-2{left:16.66667%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333%}.col-md-push-5{left:41.66667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.33333%}.col-md-push-8{left:66.66667%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333%}.col-md-push-11{left:91.66667%}.col-md-push-12{left:100%}.col-md-offset-0{margin-left:0%}.col-md-offset-1{margin-left:8.33333%}.col-md-offset-2{margin-left:16.66667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333%}.col-md-offset-5{margin-left:41.66667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.33333%}.col-md-offset-8{margin-left:66.66667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333%}.col-md-offset-11{margin-left:91.66667%}.col-md-offset-12{margin-left:100%}}@media (min-width: 1600px){.col-lg-1,.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-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-1{width:8.33333%}.col-lg-2{width:16.66667%}.col-lg-3{width:25%}.col-lg-4{width:33.33333%}.col-lg-5{width:41.66667%}.col-lg-6{width:50%}.col-lg-7{width:58.33333%}.col-lg-8{width:66.66667%}.col-lg-9{width:75%}.col-lg-10{width:83.33333%}.col-lg-11{width:91.66667%}.col-lg-12{width:100%}.col-lg-pull-0{right:0%}.col-lg-pull-1{right:8.33333%}.col-lg-pull-2{right:16.66667%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333%}.col-lg-pull-5{right:41.66667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.33333%}.col-lg-pull-8{right:66.66667%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333%}.col-lg-pull-11{right:91.66667%}.col-lg-pull-12{right:100%}.col-lg-push-0{left:0%}.col-lg-push-1{left:8.33333%}.col-lg-push-2{left:16.66667%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333%}.col-lg-push-5{left:41.66667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.33333%}.col-lg-push-8{left:66.66667%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333%}.col-lg-push-11{left:91.66667%}.col-lg-push-12{left:100%}.col-lg-offset-0{margin-left:0%}.col-lg-offset-1{margin-left:8.33333%}.col-lg-offset-2{margin-left:16.66667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333%}.col-lg-offset-5{margin-left:41.66667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.33333%}.col-lg-offset-8{margin-left:66.66667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333%}.col-lg-offset-11{margin-left:91.66667%}.col-lg-offset-12{margin-left:100%}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:0;border-spacing:0}.table>thead>tr>th,.table>thead>tr>td,.table>tbody>tr>th,.table>tbody>tr>td,.table>tfoot>tr>th,.table>tfoot>tr>td{padding:8px;line-height:1.5;vertical-align:top;border-top:1px solid #313335}.table>thead>tr>th{vertical-align:bottom;border-bottom:0px solid #313335}.table>caption+thead>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>th,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #313335}.table .table{background-color:#1d1d1d}.table-condensed>thead>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>tfoot>tr>td{padding:2px}.table-bordered{border:1px solid #313335}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>tfoot>tr>td{border:1px solid #313335}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#ecf3f8}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>thead>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th{background-color:#ecf3f8}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th{background-color:#d9e7f1}.table>thead>tr>td.success,.table>thead>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th{background-color:#d1e8d1}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#c0e0c0}.table>thead>tr>td.info,.table>thead>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th{background-color:#abc9e2}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{background-color:#98bcdc}.table>thead>tr>td.warning,.table>thead>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th{background-color:#fdedd8}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#fbe3c0}.table>thead>tr>td.danger,.table>thead>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th{background-color:#f6d1d0}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#f1bcba}@media (max-width: 779px){.table-responsive{width:100%;margin-bottom:13.5px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #313335;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:18px;font-size:18px;line-height:inherit;color:#313335;border:0;border-bottom:1px solid #e5e5e5}label,.editable-input .editable-checklist>div>label>span{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{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="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;outline-color:#568a89}output{display:block;padding-top:7px;font-size:12px;line-height:1.5;color:#adadad}.form-control{display:block;width:100%;height:32px;padding:6px 12px;font-size:12px;line-height:1.5;color:#adadad;background-color:#313335;background-image:none;border:1px solid #63676a;border-radius:0px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-out 0.15s,box-shadow ease-out 0.15s;transition:border-color ease-out 0.15s,box-shadow ease-out 0.15s}.form-control:focus{border-color:#568a89;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(86,138,137,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(86,138,137,0.6)}.form-control::-moz-placeholder{color:#63676a;opacity:1}.form-control:-ms-input-placeholder{color:#63676a}.form-control::-webkit-input-placeholder{color:#63676a}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#3c3f41;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}input[type="date"]{line-height:32px}.form-group{margin-bottom:15px}.radio,.checkbox,.editable-input .editable-checklist>div>label{display:block;min-height:18px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.radio .editable-input .editable-checklist>div>label>span,.editable-input .radio .editable-checklist>div>label>span,.checkbox label,.editable-input .editable-checklist>div>label label,.editable-input .editable-checklist>div>label>span{display:inline;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.editable-input .editable-checklist>div>label input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px}.radio+.radio,.checkbox+.checkbox,.editable-input .editable-checklist>div>label+.checkbox,.editable-input .editable-checklist>div>.checkbox+label,.editable-input .editable-checklist>div>label+label{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],fieldset[disabled] input[type="radio"],input[type="checkbox"][disabled],fieldset[disabled] input[type="checkbox"],.radio[disabled],fieldset[disabled] .radio,.radio-inline[disabled],fieldset[disabled] .radio-inline,.checkbox[disabled],.editable-input .editable-checklist>div>label[disabled],fieldset[disabled] .checkbox,fieldset[disabled] .editable-input .editable-checklist>div>label,.editable-input fieldset[disabled] .editable-checklist>div>label,.checkbox-inline[disabled],fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:28px;padding:5px 10px;font-size:11px;line-height:1.5;border-radius:3px}select.input-sm,.input-group-sm>select.form-control,.input-group-sm>select.input-group-addon,.input-group-sm>.input-group-btn>select.btn{height:28px;line-height:28px}textarea.input-sm,.input-group-sm>textarea.form-control,.input-group-sm>textarea.input-group-addon,.input-group-sm>.input-group-btn>textarea.btn,select[multiple].input-sm,.input-group-sm>select[multiple].form-control,.input-group-sm>select[multiple].input-group-addon,.input-group-sm>.input-group-btn>select[multiple].btn{height:auto}.input-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:42px;padding:10px 16px;font-size:15px;line-height:1.33;border-radius:6px}select.input-lg,.input-group-lg>select.form-control,.input-group-lg>select.input-group-addon,.input-group-lg>.input-group-btn>select.btn{height:42px;line-height:42px}textarea.input-lg,.input-group-lg>textarea.form-control,.input-group-lg>textarea.input-group-addon,.input-group-lg>.input-group-btn>textarea.btn,select[multiple].input-lg,.input-group-lg>select[multiple].form-control,.input-group-lg>select[multiple].input-group-addon,.input-group-lg>.input-group-btn>select[multiple].btn{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.has-feedback .form-control-feedback{position:absolute;top:23px;right:0;display:block;width:32px;height:32px;line-height:32px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .editable-input .editable-checklist>div>label,.editable-input .has-success .editable-checklist>div>label,.has-success .radio-inline,.has-success .checkbox-inline{color:#5cb85c}.has-success .form-control{border-color:#5cb85c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #a3d7a3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #a3d7a3}.has-success .select2-selection{border:1px solid !important;border-color:#5cb85c !important;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .input-group-addon{color:#5cb85c;border-color:#5cb85c;background-color:#d1e8d1}.has-success .form-control-feedback{color:#5cb85c}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .editable-input .editable-checklist>div>label,.editable-input .has-warning .editable-checklist>div>label,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#2b2b2b}.has-warning .form-control{border-color:#2b2b2b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #5e5e5e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #5e5e5e}.has-warning .select2-selection{border:1px solid !important;border-color:#2b2b2b !important;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .input-group-addon{color:#2b2b2b;border-color:#2b2b2b;background-color:#fdedd8}.has-warning .form-control-feedback{color:#2b2b2b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .editable-input .editable-checklist>div>label,.editable-input .has-error .editable-checklist>div>label,.has-error .radio-inline,.has-error .checkbox-inline{color:#d9534f}.has-error .form-control{border-color:#d9534f;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #eba5a3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #eba5a3}.has-error .select2-selection{border:1px solid !important;border-color:#d9534f !important;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .input-group-addon{color:#d9534f;border-color:#d9534f;background-color:#f6d1d0}.has-error .form-control-feedback{color:#d9534f}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#7c8184}@media (min-width: 780px){.form-inline .form-group,.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control,.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group>.form-control,.navbar-form .input-group>.form-control{width:100%}.form-inline .control-label,.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.navbar-form .radio,.form-inline .checkbox,.navbar-form .checkbox,.form-inline .editable-input .editable-checklist>div>label,.editable-input .form-inline .editable-checklist>div>label,.navbar-form .editable-input .editable-checklist>div>label,.editable-input .navbar-form .editable-checklist>div>label{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type="radio"],.navbar-form .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"],.navbar-form .checkbox input[type="checkbox"],.form-inline .editable-input .editable-checklist>div>label input[type="checkbox"],.editable-input .form-inline .editable-checklist>div>label input[type="checkbox"],.navbar-form .editable-input .editable-checklist>div>label input[type="checkbox"],.editable-input .navbar-form .editable-checklist>div>label input[type="checkbox"]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback,.navbar-form .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .editable-input .editable-checklist>div>label,.editable-input .form-horizontal .editable-checklist>div>label,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .editable-input .editable-checklist>div>label,.editable-input .form-horizontal .editable-checklist>div>label{min-height:25px}.form-horizontal .form-group{margin-left:-10px;margin-right:-10px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{content:" ";display:table}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:7px}@media (min-width: 780px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:10px}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:12px;line-height:1.5;border-radius:0px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;outline-color:#568a89}.btn:hover,.btn:focus{color:#eaeaea;text-decoration:none;-webkit-box-shadow:none;box-shadow:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15);box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#eaeaea;background-color:#63676a;border-color:#575a5d}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active:not(.toggle-on):not(.toggle-off){color:#eaeaea;background-color:#72767a;border-color:#6f7477}.open .btn-default.dropdown-toggle{color:#eaeaea;background-color:#72767a;border-color:#6f7477}.btn-default:active,.btn-default.active{background-image:none}.open .btn-default.dropdown-toggle{background-image:none}.btn-default.disabled,.btn-default.disabled:hover,.btn-default.disabled:focus,.btn-default.disabled:active,.btn-default.disabled.active,.btn-default[disabled],.btn-default[disabled]:hover,.btn-default[disabled]:focus,.btn-default[disabled]:active,.btn-default[disabled].active,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default:hover,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default.active{background-color:#63676a;border-color:#575a5d}.btn-default .badge{color:#63676a;background-color:#eaeaea}.btn-primary{color:#eaeaea;background-color:#375959;border-color:#335353}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active:not(.toggle-on):not(.toggle-off){color:#eaeaea;background-color:#436c6c;border-color:#477272}.open .btn-primary.dropdown-toggle{color:#eaeaea;background-color:#436c6c;border-color:#477272}.btn-primary:active,.btn-primary.active{background-image:none}.open .btn-primary.dropdown-toggle{background-image:none}.btn-primary.disabled,.btn-primary.disabled:hover,.btn-primary.disabled:focus,.btn-primary.disabled:active,.btn-primary.disabled.active,.btn-primary[disabled],.btn-primary[disabled]:hover,.btn-primary[disabled]:focus,.btn-primary[disabled]:active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary:hover,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary.active{background-color:#375959;border-color:#335353}.btn-primary .badge{color:#375959;background-color:#eaeaea}.btn-success,.modal-content .pf-wizard-navigation li.active a:not(.btn-danger){color:#eaeaea;background-color:#4f9e4f;border-color:#478d47}.btn-success:hover,.modal-content .pf-wizard-navigation li.active a:hover:not(.btn-danger),.btn-success:focus,.modal-content .pf-wizard-navigation li.active a:focus:not(.btn-danger),.btn-success:active,.modal-content .pf-wizard-navigation li.active a:active:not(.btn-danger),.btn-success.active:not(.toggle-on):not(.toggle-off),.modal-content .pf-wizard-navigation li.active a.active:not(.toggle-on):not(.toggle-off):not(.btn-danger){color:#eaeaea;background-color:#5dae5d;border-color:#5aad5a}.open .btn-success.dropdown-toggle,.open .modal-content .pf-wizard-navigation li.active a.dropdown-toggle:not(.btn-danger),.modal-content .pf-wizard-navigation li.active .open a.dropdown-toggle:not(.btn-danger){color:#eaeaea;background-color:#5dae5d;border-color:#5aad5a}.btn-success:active,.modal-content .pf-wizard-navigation li.active a:active:not(.btn-danger),.btn-success.active,.modal-content .pf-wizard-navigation li.active a.active:not(.btn-danger){background-image:none}.open .btn-success.dropdown-toggle,.open .modal-content .pf-wizard-navigation li.active a.dropdown-toggle:not(.btn-danger),.modal-content .pf-wizard-navigation li.active .open a.dropdown-toggle:not(.btn-danger){background-image:none}.btn-success.disabled,.modal-content .pf-wizard-navigation li.active a.disabled:not(.btn-danger),.btn-success.disabled:hover,.modal-content .pf-wizard-navigation li.active a.disabled:hover:not(.btn-danger),.btn-success.disabled:focus,.modal-content .pf-wizard-navigation li.active a.disabled:focus:not(.btn-danger),.btn-success.disabled:active,.modal-content .pf-wizard-navigation li.active a.disabled:active:not(.btn-danger),.btn-success.disabled.active,.modal-content .pf-wizard-navigation li.active a.disabled.active:not(.btn-danger),.btn-success[disabled],.modal-content .pf-wizard-navigation li.active a[disabled]:not(.btn-danger),.btn-success[disabled]:hover,.modal-content .pf-wizard-navigation li.active a[disabled]:hover:not(.btn-danger),.btn-success[disabled]:focus,.modal-content .pf-wizard-navigation li.active a[disabled]:focus:not(.btn-danger),.btn-success[disabled]:active,.modal-content .pf-wizard-navigation li.active a[disabled]:active:not(.btn-danger),.btn-success[disabled].active,.modal-content .pf-wizard-navigation li.active a[disabled].active:not(.btn-danger),fieldset[disabled] .btn-success,fieldset[disabled] .modal-content .pf-wizard-navigation li.active a:not(.btn-danger),.modal-content .pf-wizard-navigation li.active fieldset[disabled] a:not(.btn-danger),fieldset[disabled] .btn-success:hover,fieldset[disabled] .modal-content .pf-wizard-navigation li.active a:hover:not(.btn-danger),.modal-content .pf-wizard-navigation li.active fieldset[disabled] a:hover:not(.btn-danger),fieldset[disabled] .btn-success:focus,fieldset[disabled] .modal-content .pf-wizard-navigation li.active a:focus:not(.btn-danger),.modal-content .pf-wizard-navigation li.active fieldset[disabled] a:focus:not(.btn-danger),fieldset[disabled] .btn-success:active,fieldset[disabled] .modal-content .pf-wizard-navigation li.active a:active:not(.btn-danger),.modal-content .pf-wizard-navigation li.active fieldset[disabled] a:active:not(.btn-danger),fieldset[disabled] .btn-success.active,fieldset[disabled] .modal-content .pf-wizard-navigation li.active a.active:not(.btn-danger),.modal-content .pf-wizard-navigation li.active fieldset[disabled] a.active:not(.btn-danger){background-color:#4f9e4f;border-color:#478d47}.btn-success .badge,.modal-content .pf-wizard-navigation li.active a:not(.btn-danger) .badge{color:#4f9e4f;background-color:#eaeaea}.btn-info{color:#eaeaea;background-color:#316490;border-color:#2b577d}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active:not(.toggle-on):not(.toggle-off){color:#eaeaea;background-color:#3974a7;border-color:#3771a3}.open .btn-info.dropdown-toggle{color:#eaeaea;background-color:#3974a7;border-color:#3771a3}.btn-info:active,.btn-info.active{background-image:none}.open .btn-info.dropdown-toggle{background-image:none}.btn-info.disabled,.btn-info.disabled:hover,.btn-info.disabled:focus,.btn-info.disabled:active,.btn-info.disabled.active,.btn-info[disabled],.btn-info[disabled]:hover,.btn-info[disabled]:focus,.btn-info[disabled]:active,.btn-info[disabled].active,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info:hover,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info.active{background-color:#316490;border-color:#2b577d}.btn-info .badge{color:#316490;background-color:#eaeaea}.btn-warning{color:#eaeaea;background-color:#c2760c;border-color:#aa670b}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active:not(.toggle-on):not(.toggle-off){color:#eaeaea;background-color:#df880e;border-color:#da850d}.open .btn-warning.dropdown-toggle{color:#eaeaea;background-color:#df880e;border-color:#da850d}.btn-warning:active,.btn-warning.active{background-image:none}.open .btn-warning.dropdown-toggle{background-image:none}.btn-warning.disabled,.btn-warning.disabled:hover,.btn-warning.disabled:focus,.btn-warning.disabled:active,.btn-warning.disabled.active,.btn-warning[disabled],.btn-warning[disabled]:hover,.btn-warning[disabled]:focus,.btn-warning[disabled]:active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning:hover,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning.active{background-color:#c2760c;border-color:#aa670b}.btn-warning .badge{color:#c2760c;background-color:#eaeaea}.btn-danger{color:#eaeaea;background-color:#a52521;border-color:#90201d}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active:not(.toggle-on):not(.toggle-off){color:#eaeaea;background-color:#bf2b26;border-color:#ba2a25}.open .btn-danger.dropdown-toggle{color:#eaeaea;background-color:#bf2b26;border-color:#ba2a25}.btn-danger:active,.btn-danger.active{background-image:none}.open .btn-danger.dropdown-toggle{background-image:none}.btn-danger.disabled,.btn-danger.disabled:hover,.btn-danger.disabled:focus,.btn-danger.disabled:active,.btn-danger.disabled.active,.btn-danger[disabled],.btn-danger[disabled]:hover,.btn-danger[disabled]:focus,.btn-danger[disabled]:active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger:hover,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger.active{background-color:#a52521;border-color:#90201d}.btn-danger .badge{color:#a52521;background-color:#eaeaea}.btn-link{color:#375959;font-weight:normal;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#1a2a2a;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:hover,fieldset[disabled] .btn-link:focus{color:#63676a;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:15px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:11px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:11px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;will-change:height;-webkit-transition:height 0.35s ease;transition:height 0.35s ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{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;list-style:none;font-size:12px;background-color:#adadad;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:5px 0;overflow:hidden;background-color:#63676a}.dropdown-menu>li>a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:1.5;color:#313335;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#1d1d1d;background-color:#63676a}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#adadad;text-decoration:none;outline:0;background-color:#375959}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#63676a}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:11px;line-height:1.5;color:#63676a}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width: 480px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:none}.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:before,.btn-toolbar:after{content:" ";display:table}.btn-toolbar:after{clear:both}.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-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-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>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle,.btn-group-lg.btn-group>.btn+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,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,.btn-group-lg>.btn .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret,.dropup .btn-group-lg>.btn .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:before,.btn-group-vertical>.btn-group:after{content:" ";display:table}.btn-group-vertical>.btn-group:after{clear:both}.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:0px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:0px;border-top-right-radius:0;border-top-left-radius:0}.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-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control: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:12px;font-weight:normal;line-height:1;color:#63676a;text-align:center;background-color:#2b2b2b;border:1px solid #63676a;border-radius:0px}.input-group-addon.input-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:5px 10px;font-size:11px;border-radius:3px}.input-group-addon.input-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:10px 16px;font-size:15px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{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:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-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:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-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:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{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{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav:before,.nav:after{content:" ";display:table}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:5px 6px 5px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#3c3f41}.nav>li.disabled>a{color:#63676a}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#63676a;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#3c3f41;border-color:#375959}.nav .nav-divider{height:1px;margin:5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #adadad}.nav-tabs>li{float:left;margin-bottom:-1px;margin-right:2px}.nav-tabs>li>a{line-height:1.5;border:1px solid transparent}.nav-tabs>li>a:hover{border-color:#adadad #adadad #adadad}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#313335;border:1px solid #adadad;border-bottom-color:transparent;cursor:default}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:0px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#375959}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified,.nav-tabs.nav-justified{width:100%}.nav-justified>li,.nav-tabs.nav-justified>li{float:none}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width: 780px){.nav-justified>li,.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified,.nav-tabs.nav-justified{border-bottom:0}.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:0px}.nav-tabs-justified>.active>a,.nav-tabs.nav-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width: 780px){.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:0px 0px 0 0}.nav-tabs-justified>.active>a,.nav-tabs.nav-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#1d1d1d}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:30px;margin-bottom:18px}.navbar:before,.navbar:after{content:" ";display:table}.navbar:after{clear:both}@media (min-width: 480px){.navbar{border-radius:0px}}.navbar-header:before,.navbar-header:after{content:" ";display:table}.navbar-header:after{clear:both}@media (min-width: 480px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:10px;padding-left:10px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{content:" ";display:table}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media (min-width: 480px){.navbar-collapse{width:auto;border-top:0;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-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.container>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-header,.container-fluid>.navbar-collapse{margin-right:-10px;margin-left:-10px}@media (min-width: 480px){.container>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-header,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width: 480px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width: 480px){.navbar-fixed-top,.navbar-fixed-bottom{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;padding:6px 10px;font-size:1.2em;line-height:18px;height:30px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width: 480px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-10px}}.navbar-toggle{position:relative;float:right;margin-right:10px;margin-left:10px;padding:6px 12px;margin-top:-2px;margin-bottom:-2px;background-color:#313335;background-image:none;border:1px solid #a0a0a0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}.navbar-toggle:focus{outline:none}.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: 480px){.navbar-toggle{display:none}}.navbar-nav{margin:3px -10px;float:left;margin:0}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:18px}@media (max-width: 479px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:18px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}.navbar-nav>li{float:left;margin-right:2px}.navbar-nav>li>a{padding-top:6px;padding-bottom:6px}.navbar-nav.navbar-right:last-child{margin-right:-10px}@media (min-width: 480px){.navbar-left{float:left !important}.navbar-right{float:right !important}}.navbar-form{margin-left:-10px;margin-right:-10px;padding:10px 10px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:-1px;margin-bottom:-1px}@media (max-width: 479px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width: 480px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-10px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:-1px;margin-bottom:-1px}.navbar-btn.btn-sm,.btn-group-sm>.navbar-btn.btn{margin-top:1px;margin-bottom:1px}.navbar-btn.btn-xs,.btn-group-xs>.navbar-btn.btn{margin-top:4px;margin-bottom:4px}.navbar-text{margin-top:6px;margin-bottom:6px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;float:left;margin-left:10px;margin-right:10px}.navbar-text.navbar-right:last-child{margin-right:0}.navbar-default{background:rgba(43,43,43,0.9);border-color:none}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#568a89;background-color:transparent}.navbar-default .navbar-text{color:#63676a}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#6caead;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus{color:#568a89;background-color:transparent}.navbar-default .navbar-nav>.active>a:hover{color:#6caead}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#3c3f41;background-color:transparent}.navbar-default .navbar-toggle{border-color:#477372;color:#2b2b2b;cursor:pointer}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{border-color:#518382;background-color:#3d4042}.navbar-default .navbar-toggle:hover .icon-bar,.navbar-default .navbar-toggle:focus .icon-bar{background-color:#568a89}.navbar-default .navbar-toggle .icon-bar{background-color:#477372}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:none}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:transparent;color:#568a89}@media (max-width: 479px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#6caead;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#568a89;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#3c3f41;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#6caead}.navbar-inverse{background-color:#222;border-color:#090909}.navbar-inverse .navbar-brand{color:#63676a}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#63676a}.navbar-inverse .navbar-nav>li>a{color:#63676a}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#090909}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{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:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#090909;color:#fff}@media (max-width: 479px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#090909}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#090909}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#63676a}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#090909}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#63676a}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:0px 0px;margin-bottom:18px;list-style:none;background-color:none;border-radius:0px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/ ";padding:0 5px;color:#63676a}.breadcrumb>.active{color:#5cb85c}.pagination{display:inline-block;padding-left:0;margin:18px 0;border-radius:0px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.5;text-decoration:none;color:#375959;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:0px;border-top-left-radius:0px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:0px;border-top-right-radius:0px}.pagination>li>a:hover,.pagination>li>a:focus,.pagination>li>span:hover,.pagination>li>span:focus{color:#1a2a2a;background-color:#adadad;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:hover,.pagination>.active>a:focus,.pagination>.active>span,.pagination>.active>span:hover,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#375959;border-color:#375959;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#63676a;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:15px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:11px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:18px 0;list-style:none;text-align:center}.pager:before,.pager:after{content:" ";display:table}.pager:after{clear:both}.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:hover,.pager li>a:focus{text-decoration:none;background-color:#adadad}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#63676a;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:2px 5px;font-size:75%;font-weight:bold;line-height:1;color:#000;text-align:center;white-space:nowrap;vertical-align:baseline;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#63676a}.label-default[href]:hover,.label-default[href]:focus{background-color:#4a4d50}.label-primary{background-color:#375959}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#243939}.label-success{background-color:#4f9e4f}.label-success[href]:hover,.label-success[href]:focus{background-color:#3e7c3e}.label-info{background-color:#316490}.label-info[href]:hover,.label-info[href]:focus{background-color:#244a6a}.label-warning{background-color:#e28a0d}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#b26d0a}.label-danger{background-color:#a52521}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#7b1b19}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:11px;font-weight:bold;color:#eaeaea;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#63676a;text-indent:initial;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#375959;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.badge-warning{background-color:#e28a0d}.badge-danger{background-color:#a52521}.thumbnail{display:block;padding:4px;margin-bottom:18px;line-height:1.5;background-color:#1d1d1d;border:1px solid #ddd;border-radius:0px;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}.thumbnail .caption{padding:9px;color:#63676a}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#375959}.alert{padding:15px;margin-bottom:18px;border:1px solid transparent;border-radius:0px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#d1e8d1;border-color:#4f9e4f;color:#2b2b2b}.alert-success hr{border-top-color:#478d47}.alert-success .alert-link{color:#121212}.alert-info{background-color:#abc9e2;border-color:#316490;color:#2b2b2b}.alert-info hr{border-top-color:#2b577d}.alert-info .alert-link{color:#121212}.alert-warning{background-color:#fdedd8;border-color:#e28a0d;color:#2b2b2b}.alert-warning hr{border-top-color:#ca7b0c}.alert-warning .alert-link{color:#121212}.alert-danger{background-color:#f6d1d0;border-color:#a52521;color:#2b2b2b}.alert-danger hr{border-top-color:#90201d}.alert-danger .alert-link{color:#121212}@-webkit-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{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f5f5f5;border-radius:0px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:11px;line-height:18px;color:#fff;text-align:center;background-color:#375959;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#4f9e4f}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-info{background-color:#316490}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-warning{background-color:#e28a0d}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-danger{background-color:#a52521}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:6px 8px;background-color:#adadad;border-bottom:1px solid #63676a;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.list-group-item:first-child{border-top-right-radius:0px;border-top-left-radius:0px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0px;border-bottom-left-radius:0px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#63676a;color:#1d1d1d}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#eaeaea;background-color:#375959;border-color:#375959}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#9bc1c1}.list-group-item-success{color:#2b2b2b;background-color:#d1e8d1}a.list-group-item-success{color:#2b2b2b}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#2b2b2b;background-color:#c0e0c0}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#2b2b2b;border-color:#2b2b2b}.list-group-item-info{color:#2b2b2b;background-color:#abc9e2}a.list-group-item-info{color:#2b2b2b}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#2b2b2b;background-color:#98bcdc}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#2b2b2b;border-color:#2b2b2b}.list-group-item-warning{color:#2b2b2b;background-color:#fdedd8}a.list-group-item-warning{color:#2b2b2b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#2b2b2b;background-color:#fbe3c0}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#2b2b2b;border-color:#2b2b2b}.list-group-item-danger{color:#2b2b2b;background-color:#f6d1d0}a.list-group-item-danger{color:#2b2b2b}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#2b2b2b;background-color:#f1bcba}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#2b2b2b;border-color:#2b2b2b}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:18px;background-color:#3c3f41;border:1px solid transparent;border-radius:5px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{content:" ";display:table}.panel-body:after{clear:both}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:4px;border-top-left-radius:4px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:13px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#353739;border-top:1px solid #313335;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:4px;border-top-left-radius:4px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.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,.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-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-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{border-top-left-radius:4px}.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,.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-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-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{border-top-right-radius:4px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.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,.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{border-bottom-left-radius:4px}.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,.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{border-bottom-right-radius:4px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #313335}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.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,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>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{border:0;margin-bottom:0}.panel-group{margin-bottom:18px}.panel-group .panel{margin-bottom:0;border-radius:5px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #313335}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #313335}.panel-default{border-color:#1d1d1d}.panel-default>.panel-heading{color:#63676a;background-color:#353739;border-color:#1d1d1d}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#1d1d1d}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#1d1d1d}.panel-primary{border-color:#1d1d1d}.panel-primary>.panel-heading{color:#1d1d1d;background-color:#375959;border-color:#1d1d1d}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#1d1d1d}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#1d1d1d}.panel-success{border-color:#1d1d1d}.panel-success>.panel-heading{color:#2b2b2b;background-color:#d1e8d1;border-color:#1d1d1d}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#1d1d1d}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#1d1d1d}.panel-info{border-color:#1d1d1d}.panel-info>.panel-heading{color:#2b2b2b;background-color:#abc9e2;border-color:#1d1d1d}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#1d1d1d}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#1d1d1d}.panel-warning{border-color:#1d1d1d}.panel-warning>.panel-heading{color:#1d1d1d;background-color:#e28a0d;border-color:#1d1d1d}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#1d1d1d}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#1d1d1d}.panel-danger{border-color:#1d1d1d}.panel-danger>.panel-heading{color:#2b2b2b;background-color:#f6d1d0;border-color:#1d1d1d}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#1d1d1d}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#1d1d1d}.well{min-height:20px;padding:10px;margin-bottom:20px;background-color:#63676a;border:1px solid #313335;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;color:#2b2b2b;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well a{color:#6caead}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:7px;border-radius:3px}.close{float:right;font-size:18px;font-weight:bold;line-height:1;color:#a52521}.close:hover,.close:focus{color:#a52521;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:auto;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275);-moz-transition:-moz-transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275);-o-transition:-o-transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275);transition:transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275)}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0)}.modal-dialog{position:relative;width:auto;margin:10px;z-index:1050}.modal-content{position:relative;background-color:#3c3f41;border:none;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:none}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.3;filter:alpha(opacity=30)}.modal-header{padding:14px;border-bottom:1px solid #303234;min-height:15.5px;background-color:#353739}.modal-header .bootbox-close-button,.modal-body .bootbox-close-button{padding:0 5px;font-size:22px;margin-top:-2px}.modal-title{margin:0;line-height:1.5}.modal-body{position:relative;padding:14px;color:#adadad;border:none}.modal-footer{padding:13px 14px 14px;text-align:right;border-top:1px solid #303234;background-color:#353739}.modal-footer:before,.modal-footer:after{content:" ";display:table}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media (min-width: 780px){.modal-dialog{width:700px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width: 1200px){.modal-lg{width:1100px}}.tooltip{position:absolute;z-index:1010;display:block;visibility:visible;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:0px}.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{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right: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;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1030;display:none;max-width:276px;padding:0;text-align:left;background-color:#3c3f41;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);white-space:normal}.popover.top{margin-top:-7px}.popover.right{margin-left:7px}.popover.bottom{margin-top:7px}.popover.left{margin-left:-7px}.popover-title{margin:0;padding:8px 14px;font-size:12px;font-weight:normal;line-height:18px;background-color:#353739;border-bottom:1px solid #303234;border-top-right-radius:5px;border-top-left-radius:5px;color:#63676a}.popover-content{padding:7px 10px}.popover-content pre{margin-bottom:5px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:8px}.popover>.arrow:after{border-width:7px;content:""}.popover.top>.arrow{left:50%;margin-left:-8px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-8px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-7px;border-bottom-width:0;border-top-color:#63676a}.popover.right>.arrow{top:50%;left:-8px;margin-top:-8px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-7px;border-left-width:0;border-right-color:#63676a}.popover.bottom>.arrow{left:50%;margin-left:-8px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-8px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-7px;border-top-width:0;border-bottom-color:#63676a}.popover.left>.arrow{top:50%;right:-8px;margin-top:-8px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#63676a;bottom:-7px}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.center-block{display:block;margin-left:auto;margin-right: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;visibility:hidden !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}@media (max-width: 779px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (min-width: 780px) and (max-width: 1199px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width: 1200px) and (max-width: 1599px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width: 1600px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (max-width: 779px){.hidden-xs{display:none !important}}@media (min-width: 780px) and (max-width: 1199px){.hidden-sm{display:none !important}}@media (min-width: 1200px) and (max-width: 1599px){.hidden-md{display:none !important}}@media (min-width: 1600px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}@media print{.hidden-print{display:none !important}}/*! - * Font Awesome Free 5.9.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */.fa,.fas,.pf-landing .pf-landing-list li>i,.far,.fal,.fab{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg,.fa-tree-child{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw,.fa-tree-child,.pf-landing .pf-landing-list li>i,.modal-content h2[data-toggle="collapse"]:after,.modal-content h4[data-toggle="collapse"]:after,.panel-body h2[data-toggle="collapse"]:after,.panel-body h4[data-toggle="collapse"]:after{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li,.pf-landing .pf-landing-list li>i{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:solid 0.08em #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fas.fa-pull-left,.pf-landing .pf-landing-list li>i.fa-pull-left,.far.fa-pull-left,.fal.fa-pull-left,.fab.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fas.fa-pull-right,.pf-landing .pf-landing-list li>i.fa-pull-right,.far.fa-pull-right,.fal.fa-pull-right,.fab.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.fa-rotate-90,.fa-tree-child{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180,#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper.pf-character-active:after{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";transform:scale(1, -1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";transform:scale(-1, -1)}:root .fa-rotate-90,:root .fa-tree-child,:root .fa-rotate-180,:root #pf-landing-login .pf-dynamic-area .pf-character-image-wrapper.pf-character-active:after,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-flip-both{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before,.pf-landing .pf-landing-list li>i:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before,.fa-tree-child:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0, 0, 0, 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}/*! - * Font Awesome Free 5.9.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */@font-face{font-family:'Font Awesome 5 Free';font-style:normal;font-weight:400;font-display:auto;src:url("../../fonts/fa-regular-400.eot");src:url("../../fonts/fa-regular-400.eot?#iefix") format("embedded-opentype"),url("../../fonts/fa-regular-400.woff2") format("woff2"),url("../../fonts/fa-regular-400.woff") format("woff"),url("../../fonts/fa-regular-400.ttf") format("truetype"),url("../../fonts/fa-regular-400.svg#fontawesome") format("svg")}.far{font-family:'Font Awesome 5 Free';font-weight:400}/*! - * Font Awesome Free 5.9.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */@font-face{font-family:'Font Awesome 5 Free';font-style:normal;font-weight:900;font-display:auto;src:url("../../fonts/fa-solid-900.eot");src:url("../../fonts/fa-solid-900.eot?#iefix") format("embedded-opentype"),url("../../fonts/fa-solid-900.woff2") format("woff2"),url("../../fonts/fa-solid-900.woff") format("woff"),url("../../fonts/fa-solid-900.ttf") format("truetype"),url("../../fonts/fa-solid-900.svg#fontawesome") format("svg")}.fa,.fas,.pf-landing .pf-landing-list li>i{font-family:'Font Awesome 5 Free';font-weight:900}/*! - * Font Awesome Free 5.9.0 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - */@font-face{font-family:'Font Awesome 5 Brands';font-style:normal;font-weight:normal;font-display:auto;src:url("../../fonts/fa-brands-400.eot");src:url("../../fonts/fa-brands-400.eot?#iefix") format("embedded-opentype"),url("../../fonts/fa-brands-400.woff2") format("woff2"),url("../../fonts/fa-brands-400.woff") format("woff"),url("../../fonts/fa-brands-400.ttf") format("truetype"),url("../../fonts/fa-brands-400.svg#fontawesome") format("svg")}.fab{font-family:'Font Awesome 5 Brands'}.mCustomScrollbar{-ms-touch-action:pinch-zoom;touch-action:pinch-zoom}.mCustomScrollbar.mCS_no_scrollbar,.mCustomScrollbar.mCS_touch_action{-ms-touch-action:auto;touch-action:auto}.mCustomScrollBox{position:relative;overflow:hidden;height:100%;max-width:100%;outline:none;direction:ltr}.mCSB_container{overflow:hidden;width:auto;height:auto}.mCSB_inside>.mCSB_container{margin-right:20px}.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container{margin-right:0;margin-left:20px}.mCS-dir-rtl>.mCSB_inside>.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-left:0}.mCSB_scrollTools{position:absolute;width:16px;height:auto;left:auto;top:0;right:0;bottom:0}.mCSB_outside+.mCSB_scrollTools{right:-26px}.mCS-dir-rtl>.mCSB_inside>.mCSB_scrollTools,.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{right:auto;left:0}.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{left:-26px}.mCSB_scrollTools .mCSB_draggerContainer{position:absolute;top:0;left:0;bottom:0;right:0;height:auto}.mCSB_scrollTools a+.mCSB_draggerContainer{margin:20px 0}.mCSB_scrollTools .mCSB_draggerRail{width:2px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCSB_scrollTools .mCSB_dragger{cursor:pointer;width:100%;height:30px;z-index:1}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{position:relative;width:4px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px;text-align:center}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:12px}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:8px}.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_buttonDown{display:block;position:absolute;height:20px;width:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools .mCSB_buttonDown{bottom:0}.mCSB_horizontal.mCSB_inside>.mCSB_container{margin-right:0;margin-bottom:20px}.mCSB_horizontal.mCSB_outside>.mCSB_container{min-height:100%}.mCSB_horizontal>.mCSB_container.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal{width:auto;height:16px;top:auto;right:0;bottom:0;left:0}.mCustomScrollBox+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:-26px}.mCSB_scrollTools.mCSB_scrollTools_horizontal a+.mCSB_draggerContainer{margin:0 20px}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:2px;margin:7px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger{width:30px;height:100%;left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:4px;margin:6px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:12px;margin:2px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:8px;margin:4px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft,.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{display:block;position:absolute;width:20px;height:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft{left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{right:0}.mCSB_container_wrapper{position:absolute;height:auto;width:auto;overflow:hidden;top:0;left:0;right:0;bottom:0;margin-right:20px;margin-bottom:20px}.mCSB_container_wrapper>.mCSB_container{padding-right:20px;padding-bottom:20px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:20px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:20px}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden+.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:0}.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools ~ .mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:20px}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools ~ .mCSB_scrollTools.mCSB_scrollTools_horizontal{left:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container_wrapper{margin-right:0;margin-left:20px}.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden>.mCSB_container{padding-right:0}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden>.mCSB_container{padding-bottom:0}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0;margin-left:0}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools,.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight{-webkit-transition:opacity .2s ease-in-out, background-color .2s ease-in-out;-moz-transition:opacity .2s ease-in-out, background-color .2s ease-in-out;-o-transition:opacity .2s ease-in-out, background-color .2s ease-in-out;transition:opacity .2s ease-in-out, background-color .2s ease-in-out}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail{-webkit-transition:width .2s ease-out .2s, height .2s ease-out .2s, margin-left .2s ease-out .2s, margin-right .2s ease-out .2s, margin-top .2s ease-out .2s, margin-bottom .2s ease-out .2s, opacity .2s ease-in-out, background-color .2s ease-in-out;-moz-transition:width .2s ease-out .2s, height .2s ease-out .2s, margin-left .2s ease-out .2s, margin-right .2s ease-out .2s, margin-top .2s ease-out .2s, margin-bottom .2s ease-out .2s, opacity .2s ease-in-out, background-color .2s ease-in-out;-o-transition:width .2s ease-out .2s, height .2s ease-out .2s, margin-left .2s ease-out .2s, margin-right .2s ease-out .2s, margin-top .2s ease-out .2s, margin-bottom .2s ease-out .2s, opacity .2s ease-in-out, background-color .2s ease-in-out;transition:width .2s ease-out .2s, height .2s ease-out .2s, margin-left .2s ease-out .2s, margin-right .2s ease-out .2s, margin-top .2s ease-out .2s, margin-bottom .2s ease-out .2s, opacity .2s ease-in-out, background-color .2s ease-in-out}.mCSB_scrollTools{opacity:0.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCS-autoHide>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide>.mCustomScrollBox ~ .mCSB_scrollTools{opacity:0;filter:"alpha(opacity=0)";-ms-filter:"alpha(opacity=0)"}.mCustomScrollbar>.mCustomScrollBox>.mCSB_scrollTools.mCSB_scrollTools_onDrag,.mCustomScrollbar>.mCustomScrollBox ~ .mCSB_scrollTools.mCSB_scrollTools_onDrag,.mCustomScrollBox:hover>.mCSB_scrollTools,.mCustomScrollBox:hover ~ .mCSB_scrollTools,.mCS-autoHide:hover>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide:hover>.mCustomScrollBox ~ .mCSB_scrollTools{opacity:1;filter:"alpha(opacity=100)";-ms-filter:"alpha(opacity=100)"}.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,0.4);filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#adadad;background-color:rgba(173,173,173,0.75);filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#e28a0d;background-color:rgba(226,138,13,0.85);filter:"alpha(opacity=85)";-ms-filter:"alpha(opacity=85)"}.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{background-color:#e28a0d;background-color:rgba(226,138,13,0.9);filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight{background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACQCAYAAACPtWCAAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxMURDMzE5NzIzQkNFMTExOTY0QkYwNzFDNzkwNTlDNCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDOTMwRUZENEMxMUUxMUUzOUYxQkJGN0E1MDMzNTg1MCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDOTMwRUZEM0MxMUUxMUUzOUYxQkJGN0E1MDMzNTg1MCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MGJlMjMyZC1hNzgzLTI1NGQtOTI4Yy02NDI0YmQxNTg0YWEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MTFEQzMxOTcyM0JDRTExMTk2NEJGMDcxQzc5MDU5QzQiLz4gPC9yZGY6RGVzY3Jp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');background-repeat:no-repeat;opacity:0.4;filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_buttonUp{background-position:0 0}.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -20px}.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -40px}.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -56px}.mCSB_scrollTools .mCSB_buttonUp:hover,.mCSB_scrollTools .mCSB_buttonDown:hover,.mCSB_scrollTools .mCSB_buttonLeft:hover,.mCSB_scrollTools .mCSB_buttonRight:hover{opacity:0.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_buttonUp:active,.mCSB_scrollTools .mCSB_buttonDown:active,.mCSB_scrollTools .mCSB_buttonLeft:active,.mCSB_scrollTools .mCSB_buttonRight:active{opacity:0.9;filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCS-light-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail{width:6px;background-color:#000;background-color:rgba(0,0,0,0.2)}.mCS-light-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px}.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:6px;margin:5px 0}.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:12px}.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:12px;margin:2px 0}.mCS-light-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #3c3f41}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #3c3f41}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;*cursor:hand;background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("../img/data-tables/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("../img/data-tables/sort_asc.png")}table.dataTable thead .sorting_desc{background-image:url("../img/data-tables/sort_desc.png")}table.dataTable thead .sorting_asc_disabled{background-image:url("../img/data-tables/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("../img/data-tables/sort_desc_disabled.png")}table.dataTable tbody tr{background-color:#212121}table.dataTable tbody tr.selected{background-color:#1b2326}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #3c3f41}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#2b2b2b}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#1b2326}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{outline:1px solid #c2760c;outline-offset:-1px}table.dataTable.hover tbody tr:hover td,table.dataTable.display tbody tr:hover td{background-color:rgba(194,118,12,0.08)}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#925909}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#2b2b2b}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#212C30}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#1b2326}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:#101517}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#171e20}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#212C30}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#1b2326}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#101517}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#171e20}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:rgba(2,1,0,0.2)}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:rgba(0,0,0,0.2)}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:rgba(0,0,0,0.2)}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#885308}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #3c3f41}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 4px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.9em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.5em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.3em 0.8em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#6f7477 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#adadad !important;border:1px solid transparent;background-color:#313335;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #313335), color-stop(100%, #2b2b2b));background:-webkit-linear-gradient(top, #313335 0%, #2b2b2b 100%);background:-moz-linear-gradient(top, #313335 0%, #2b2b2b 100%);background:-ms-linear-gradient(top, #313335 0%, #2b2b2b 100%);background:-o-linear-gradient(top, #313335 0%, #2b2b2b 100%);background:linear-gradient(to bottom, #313335 0%,#2b2b2b 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#4f5355 !important;border:1px solid transparent;background:transparent;box-shadow:none;pointer-events:all;cursor:not-allowed}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:#313335 !important;border:1px solid transparent;background-color:#c2760c;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #c2760c), color-stop(100%, #c2760c));background:-webkit-linear-gradient(top, #c2760c 0%, #c2760c 100%);background:-moz-linear-gradient(top, #c2760c 0%, #c2760c 100%);background:-ms-linear-gradient(top, #c2760c 0%, #c2760c 100%);background:-o-linear-gradient(top, #c2760c 0%, #c2760c 100%);background:linear-gradient(to bottom, #c2760c 0%,#c2760c 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#c2760c;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #c2760c), color-stop(100%, #c2760c));background:-webkit-linear-gradient(top, #c2760c 0%, #c2760c 100%);background:-moz-linear-gradient(top, #c2760c 0%, #c2760c 100%);background:-ms-linear-gradient(top, #c2760c 0%, #c2760c 100%);background:-o-linear-gradient(top, #c2760c 0%, #c2760c 100%);background:linear-gradient(to bottom, #c2760c 0%,#c2760c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%,rgba(255,255,255,0.9) 25%,rgba(255,255,255,0.9) 75%,rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#63676a}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}}@keyframes dtb-spinner{100%{transform:rotate(360deg)}}@-o-keyframes dtb-spinner{100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes dtb-spinner{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dtb-spinner{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes dtb-spinner{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}div.dt-button-collection-title{text-align:center;padding:0.3em 0 0.5em;font-size:0.9em}div.dt-button-collection-title:empty{display:none}button.dt-button,div.dt-button,a.dt-button{position:relative;display:inline-block;box-sizing:border-box;margin-right:0.333em;margin-bottom:0.333em;padding:0.5em 1em;cursor:pointer;font-size:0.88em;line-height:1.6em;white-space:nowrap;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none}.dt-button embed{outline:none}div.dt-buttons{position:relative;float:left}div.dt-buttons.buttons-right{float:right}div.dt-button-collection{position:absolute;top:0;left:0;width:150px;margin-top:3px;padding:8px 8px 4px 8px;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.4);background-color:white;overflow:hidden;z-index:2002;border-radius:5px;box-shadow:3px 3px 5px rgba(0,0,0,0.3);-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection button.dt-button,div.dt-button-collection div.dt-button,div.dt-button-collection a.dt-button{position:relative;left:0;right:0;width:100%;display:block;float:none;margin-bottom:4px;margin-right:0}div.dt-button-collection button.dt-button:active:not(.disabled),div.dt-button-collection button.dt-button.active:not(.disabled),div.dt-button-collection div.dt-button:active:not(.disabled),div.dt-button-collection div.dt-button.active:not(.disabled),div.dt-button-collection a.dt-button:active:not(.disabled),div.dt-button-collection a.dt-button.active:not(.disabled){background-color:#dadada;background-image:-webkit-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-moz-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-ms-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-o-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:linear-gradient(to bottom, #f0f0f0 0%,#dadada 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f0f0f0', EndColorStr='#dadada');box-shadow:inset 1px 1px 3px #666}div.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}div.dt-button-collection.fixed.two-column{margin-left:-150px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-collection .dt-button{border-radius:0}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.3)), color-stop(1, rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%,rgba(0,0,0,0.7) 100%);z-index:2001}@media screen and (max-width: 640px){div.dt-buttons{float:none !important;text-align:center}}button.dt-button.processing,div.dt-button.processing,a.dt-button.processing{color:rgba(0,0,0,0.2)}button.dt-button.processing:after,div.dt-button.processing:after,a.dt-button.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px 0 0 -8px;box-sizing:border-box;display:block;content:' ';border:2px solid #282828;border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner 1500ms infinite linear;-o-animation:dtb-spinner 1500ms infinite linear;-ms-animation:dtb-spinner 1500ms infinite linear;-webkit-animation:dtb-spinner 1500ms infinite linear;-moz-animation:dtb-spinner 1500ms infinite linear}table.dataTable.dtr-inline.collapsed>tbody>tr>td.child,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty{cursor:default !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty:before{display:none !important}table.dataTable.dtr-inline.collapsed>tbody>tr[role="row"]>td:first-child,table.dataTable.dtr-inline.collapsed>tbody>tr[role="row"]>th:first-child{position:relative;padding-left:30px;cursor:pointer}table.dataTable.dtr-inline.collapsed>tbody>tr[role="row"]>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr[role="row"]>th:first-child:before{top:9px;left:4px;height:14px;width:14px;display:block;position:absolute;color:#fff;border:2px solid white;border-radius:14px;box-shadow:0 0 3px #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:'Courier New', Courier, monospace;line-height:14px;content:'+';background-color:#31b131}table.dataTable.dtr-inline.collapsed>tbody>tr.parent>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr.parent>th:first-child:before{content:'-';background-color:#d33333}table.dataTable.dtr-inline.collapsed.compact>tbody>tr>td:first-child,table.dataTable.dtr-inline.collapsed.compact>tbody>tr>th:first-child{padding-left:27px}table.dataTable.dtr-inline.collapsed.compact>tbody>tr>td:first-child:before,table.dataTable.dtr-inline.collapsed.compact>tbody>tr>th:first-child:before{top:5px;left:4px;height:14px;width:14px;border-radius:14px;line-height:14px;text-indent:3px}table.dataTable.dtr-column>tbody>tr>td.control,table.dataTable.dtr-column>tbody>tr>th.control{position:relative;cursor:pointer}table.dataTable.dtr-column>tbody>tr>td.control:before,table.dataTable.dtr-column>tbody>tr>th.control:before{top:50%;left:50%;height:16px;width:16px;margin-top:-10px;margin-left:-10px;display:block;position:absolute;color:#fff;border:2px solid white;border-radius:14px;box-shadow:0 0 3px #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:'Courier New', Courier, monospace;line-height:14px;content:'+';background-color:#31b131}table.dataTable.dtr-column>tbody>tr.parent td.control:before,table.dataTable.dtr-column>tbody>tr.parent th.control:before{content:'-';background-color:#d33333}table.dataTable>tbody>tr.child{padding:0.5em 1em}table.dataTable>tbody>tr.child:hover{background:transparent !important}table.dataTable>tbody>tr.child ul.dtr-details{display:inline-block;list-style-type:none;margin:0;padding:0}table.dataTable>tbody>tr.child ul.dtr-details>li{border-bottom:1px solid #efefef;padding:0.5em 0}table.dataTable>tbody>tr.child ul.dtr-details>li:first-child{padding-top:0}table.dataTable>tbody>tr.child ul.dtr-details>li:last-child{border-bottom:none}table.dataTable>tbody>tr.child span.dtr-title{display:inline-block;min-width:75px;font-weight:bold}div.dtr-modal{position:fixed;box-sizing:border-box;top:0;left:0;height:100%;width:100%;z-index:100;padding:10em 1em}div.dtr-modal div.dtr-modal-display{position:absolute;top:0;left:0;bottom:0;right:0;width:50%;height:50%;overflow:auto;margin:auto;z-index:102;overflow:auto;background-color:#f5f5f7;border:1px solid black;border-radius:0.5em;box-shadow:0 12px 30px rgba(0,0,0,0.6)}div.dtr-modal div.dtr-modal-content{position:relative;padding:1em}div.dtr-modal div.dtr-modal-close{position:absolute;top:6px;right:6px;width:22px;height:22px;border:1px solid #eaeaea;background-color:#f9f9f9;text-align:center;border-radius:3px;cursor:pointer;z-index:12}div.dtr-modal div.dtr-modal-close:hover{background-color:#eaeaea}div.dtr-modal div.dtr-modal-background{position:fixed;top:0;left:0;right:0;bottom:0;z-index:101;background:rgba(0,0,0,0.6)}@media screen and (max-width: 767px){div.dtr-modal div.dtr-modal-display{width:95%}}table.dataTable tbody>tr.selected,table.dataTable tbody>tr>.selected{background-color:#1b2326}table.dataTable.stripe tbody>tr.odd.selected,table.dataTable.stripe tbody>tr.odd>.selected,table.dataTable.display tbody>tr.odd.selected,table.dataTable.display tbody>tr.odd>.selected{background-color:#182022}table.dataTable.hover tbody>tr.selected:hover,table.dataTable.hover tbody>tr>.selected:hover,table.dataTable.display tbody>tr.selected:hover,table.dataTable.display tbody>tr>.selected:hover{background-color:#1a2225}table.dataTable.order-column tbody>tr.selected>.sorting_1,table.dataTable.order-column tbody>tr.selected>.sorting_2,table.dataTable.order-column tbody>tr.selected>.sorting_3,table.dataTable.order-column tbody>tr>.selected,table.dataTable.display tbody>tr.selected>.sorting_1,table.dataTable.display tbody>tr.selected>.sorting_2,table.dataTable.display tbody>tr.selected>.sorting_3,table.dataTable.display tbody>tr>.selected{background-color:#1a2225}table.dataTable.display tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_1{background-color:#1a2124}table.dataTable.display tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_2{background-color:#1a2124}table.dataTable.display tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_3{background-color:#1a2225}table.dataTable.display tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_1{background-color:#171e20}table.dataTable.display tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_2{background-color:#1b2326}table.dataTable.display tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_3{background-color:#1b2326}table.dataTable.display tbody>tr.odd>.selected,table.dataTable.order-column.stripe tbody>tr.odd>.selected{background-color:#1a2124}table.dataTable.display tbody>tr.even>.selected,table.dataTable.order-column.stripe tbody>tr.even>.selected{background-color:#1a2225}table.dataTable.display tbody>tr.selected:hover>.sorting_1,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_1{background-color:#192023}table.dataTable.display tbody>tr.selected:hover>.sorting_2,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_2{background-color:#192023}table.dataTable.display tbody>tr.selected:hover>.sorting_3,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_3{background-color:#192124}table.dataTable.display tbody>tr:hover>.selected,table.dataTable.display tbody>tr>.selected:hover,table.dataTable.order-column.hover tbody>tr:hover>.selected,table.dataTable.order-column.hover tbody>tr>.selected:hover{background-color:#192023}table.dataTable tbody td.select-checkbox,table.dataTable tbody th.select-checkbox{position:relative}table.dataTable tbody td.select-checkbox:before,table.dataTable tbody td.select-checkbox:after,table.dataTable tbody th.select-checkbox:before,table.dataTable tbody th.select-checkbox:after{display:block;position:absolute;top:1.2em;left:50%;width:12px;height:12px;box-sizing:border-box}table.dataTable tbody td.select-checkbox:before,table.dataTable tbody th.select-checkbox:before{content:' ';margin-top:-6px;margin-left:-6px;border:1px solid black;border-radius:3px}table.dataTable tr.selected td.select-checkbox:after,table.dataTable tr.selected th.select-checkbox:after{content:'\2714';margin-top:-11px;margin-left:-4px;text-align:center;text-shadow:1px 1px #B0BED9, -1px -1px #B0BED9, 1px -1px #B0BED9, -1px 1px #B0BED9}div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:0.5em}@media screen and (max-width: 640px){div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:0;display:block}}/*! - * DataTables + Font Awesome integration - * License: MIT - http://datatables.net/license - */table.dataTable thead th{position:relative;background-image:none !important}table.dataTable thead th.sorting:after,table.dataTable thead th.sorting_asc:after,table.dataTable thead th.sorting_desc:after{position:absolute;top:12px;right:5px;display:block;font-family:'Font Awesome 5 Free';margin-top:-8px}table.dataTable thead th.sorting:after{content:"\f0dc";font-size:0.8em;margin-top:-8px}table.dataTable thead th.sorting_asc:after{content:"\f0de";color:#5cb85c}table.dataTable thead th.sorting_desc:after{content:"\f0dd";color:#5cb85c}div.dataTables_scrollBody table.dataTable thead th.sorting:after,div.dataTables_scrollBody table.dataTable thead th.sorting_asc:after,div.dataTables_scrollBody table.dataTable thead th.sorting_desc:after{content:""}div.dataTables_paginate a.paginate_button.first,div.dataTables_paginate a.paginate_button.previous{position:relative;padding-left:24px}div.dataTables_paginate a.paginate_button.next,div.dataTables_paginate a.paginate_button.last{position:relative;padding-right:24px}div.dataTables_paginate a.first:before,div.dataTables_paginate a.previous:before{position:absolute;top:4px;left:10px;display:block;font-weight:bold;font-family:'Font Awesome 5 Free'}div.dataTables_paginate a.next:after,div.dataTables_paginate a.last:after{position:absolute;top:4px;right:10px;display:block;font-weight:bold;font-family:'Font Awesome 5 Free'}div.dataTables_paginate a.first:before{content:"\f100"}div.dataTables_paginate a.previous:before{content:"\f104"}div.dataTables_paginate a.next:after{content:"\f105"}div.dataTables_paginate a.last:after{content:"\f101"}/*! X-editable - v1.5.0 -* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery -* http://github.com/vitalets/x-editable -* Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */.editableform{margin-bottom:0}.editableform .form-group{margin-left:0 !important}.editableform .control-group{margin-bottom:0;white-space:nowrap;line-height:20px}.editable-buttons{display:inline-block;vertical-align:top;margin-left:10px;zoom:1;*display:inline}.editable-buttons.editable-buttons-bottom{display:block;margin-top:5px;margin-left:0}.editable-input{vertical-align:top;display:inline-block;width:auto;white-space:normal;zoom:1;*display:inline}.editable-buttons button.ui-button-icon-only{height:24px;width:30px}.editableform-loading{height:25px;width:auto;min-width:25px;display:flex;flex-direction:column;justify-content:center;align-items:center}.editable-inline .editableform-loading{background-position:left 5px}.editable-error-block{max-width:300px;margin:5px 0 0 0;width:auto;white-space:normal}.editable-error-block.ui-state-error{padding:3px}.editable-error{color:red}.editableform .editable-date{padding:0;margin:0;float:left}.editable-inline .add-on .icon-th{margin-top:3px;margin-left:1px}.editable-checklist label input[type="checkbox"],.editable-input .editable-checklist>div>label>span input[type="checkbox"],.editable-checklist label input[type="radio"],.editable-input .editable-checklist>div>label>span input[type="radio"],.editable-checklist label span,.editable-input .editable-checklist>div>label>span span{vertical-align:middle;margin:0}.editable-checklist label,.editable-input .editable-checklist>div>label>span{white-space:nowrap}.editable-wysihtml5{width:566px;height:250px}.editable-clear{clear:both;font-size:0.9em;text-decoration:none;text-align:right}.editable-clear-x{display:block;width:13px;height:13px;position:absolute;opacity:0.6;z-index:100;top:50%;right:6px;margin-top:-6px}.editable-clear-x:hover{opacity:1}.editable-pre-wrapped{white-space:pre-wrap}.editable-container.editable-popup{max-width:none !important}.editable-container.popover{width:auto}.editable-container.editable-inline{display:inline-block;vertical-align:middle;width:auto;zoom:1;*display:inline}.editable-container.ui-widget{font-size:inherit;z-index:9990}.editable-click,a.editable-click,a.editable-click:hover{text-decoration:none}.editable-click.editable-disabled,a.editable-click.editable-disabled,a.editable-click.editable-disabled:hover{color:#585858;cursor:default;border-bottom:none}.editable-empty,.editable-empty:hover,.editable-empty:focus{font-style:italic;color:#d9534f;text-decoration:none}.editable-unsaved{font-weight:bold}.editable-bg-transition{-webkit-transition:background-color 1400ms ease-out;-moz-transition:background-color 1400ms ease-out;-o-transition:background-color 1400ms ease-out;-ms-transition:background-color 1400ms ease-out;transition:background-color 1400ms ease-out}.form-horizontal .editable{padding-top:5px;display:inline-block}/*! - * Datepicker for Bootstrap - * - * Copyright 2012 Stefan Petre - * Improvements by Andrew Rowls - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - */.datepicker{padding:4px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;direction:ltr}.datepicker-inline{width:220px}.datepicker.datepicker-rtl{direction:rtl}.datepicker.datepicker-rtl table tr td span{float:right}.datepicker-dropdown{top:0;left:0}.datepicker-dropdown:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute;top:-7px;left:6px}.datepicker-dropdown:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:7px}.datepicker>div{display:none}.datepicker.days div.datepicker-days{display:block}.datepicker.months div.datepicker-months{display:block}.datepicker.years div.datepicker-years{display:block}.datepicker table{margin:0}.datepicker td,.datepicker th{text-align:center;width:20px;height:20px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:none}.table-striped .datepicker table tr td,.table-striped .datepicker table tr th{background-color:transparent}.datepicker table tr td.day:hover{background:#eeeeee;cursor:pointer}.datepicker table tr td.old,.datepicker table tr td.new{color:#999999}.datepicker table tr td.disabled,.datepicker table tr td.disabled:hover{background:none;color:#999999;cursor:default}.datepicker table tr td.today,.datepicker table tr td.today:hover,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled:hover{background-color:#fde19a;background-image:-moz-linear-gradient(top, #fdd49a, #fdf59a);background-image:-ms-linear-gradient(top, #fdd49a, #fdf59a);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));background-image:-webkit-linear-gradient(top, #fdd49a, #fdf59a);background-image:-o-linear-gradient(top, #fdd49a, #fdf59a);background-image:linear-gradient(to bottom, #fdd49a,#fdf59a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);border-color:#fdf59a #fdf59a #fbed50;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#000}.datepicker table tr td.today:hover,.datepicker table tr td.today:hover:hover,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover:hover,.datepicker table tr td.today:active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled,.datepicker table tr td.today:hover.disabled,.datepicker table tr td.today.disabled.disabled,.datepicker table tr td.today.disabled:hover.disabled,.datepicker table tr td.today[disabled],.datepicker table tr td.today:hover[disabled],.datepicker table tr td.today.disabled[disabled],.datepicker table tr td.today.disabled:hover[disabled]{background-color:#fdf59a}.datepicker table tr td.today:active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:hover.active{background-color:#fbf069 \9}.datepicker table tr td.today:hover:hover{color:#000}.datepicker table tr td.today.active:hover{color:#fff}.datepicker table tr td.range,.datepicker table tr td.range:hover,.datepicker table tr td.range.disabled,.datepicker table tr td.range.disabled:hover{background:#eeeeee;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.datepicker table tr td.range.today,.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled:hover{background-color:#f3d17a;background-image:-moz-linear-gradient(top, #f3c17a, #f3e97a);background-image:-ms-linear-gradient(top, #f3c17a, #f3e97a);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a));background-image:-webkit-linear-gradient(top, #f3c17a, #f3e97a);background-image:-o-linear-gradient(top, #f3c17a, #f3e97a);background-image:linear-gradient(to bottom, #f3c17a,#f3e97a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);border-color:#f3e97a #f3e97a #edde34;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today:hover:hover,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover:hover,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today:hover.disabled,.datepicker table tr td.range.today.disabled.disabled,.datepicker table tr td.range.today.disabled:hover.disabled,.datepicker table tr td.range.today[disabled],.datepicker table tr td.range.today:hover[disabled],.datepicker table tr td.range.today.disabled[disabled],.datepicker table tr td.range.today.disabled:hover[disabled]{background-color:#f3e97a}.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:hover.active{background-color:#efe24b \9}.datepicker table tr td.selected,.datepicker table tr td.selected:hover,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled:hover{background-color:#9e9e9e;background-image:-moz-linear-gradient(top, #b3b3b3, gray);background-image:-ms-linear-gradient(top, #b3b3b3, gray);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(gray));background-image:-webkit-linear-gradient(top, #b3b3b3, gray);background-image:-o-linear-gradient(top, #b3b3b3, gray);background-image:linear-gradient(to bottom, #b3b3b3,#808080);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);border-color:#808080 #808080 #595959;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datepicker table tr td.selected:hover,.datepicker table tr td.selected:hover:hover,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover:hover,.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected:hover.disabled,.datepicker table tr td.selected.disabled.disabled,.datepicker table tr td.selected.disabled:hover.disabled,.datepicker table tr td.selected[disabled],.datepicker table tr td.selected:hover[disabled],.datepicker table tr td.selected.disabled[disabled],.datepicker table tr td.selected.disabled:hover[disabled]{background-color:#808080}.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:hover.active{background-color:#666666 \9}.datepicker table tr td.active,.datepicker table tr td.active:hover,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled:hover{background-color:#006dcc;background-image:-moz-linear-gradient(top, #08c, #04c);background-image:-ms-linear-gradient(top, #08c, #04c);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#04c));background-image:-webkit-linear-gradient(top, #08c, #04c);background-image:-o-linear-gradient(top, #08c, #04c);background-image:linear-gradient(to bottom, #0088cc,#0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datepicker table tr td.active:hover,.datepicker table tr td.active:hover:hover,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover:hover,.datepicker table tr td.active:active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active:hover.disabled,.datepicker table tr td.active.disabled.disabled,.datepicker table tr td.active.disabled:hover.disabled,.datepicker table tr td.active[disabled],.datepicker table tr td.active:hover[disabled],.datepicker table tr td.active.disabled[disabled],.datepicker table tr td.active.disabled:hover[disabled]{background-color:#0044cc}.datepicker table tr td.active:active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:hover.active{background-color:#003399 \9}.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.datepicker table tr td span:hover{background:#eeeeee}.datepicker table tr td span.disabled,.datepicker table tr td span.disabled:hover{background:none;color:#999999;cursor:default}.datepicker table tr td span.active,.datepicker table tr td span.active:hover,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled:hover{background-color:#006dcc;background-image:-moz-linear-gradient(top, #08c, #04c);background-image:-ms-linear-gradient(top, #08c, #04c);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#04c));background-image:-webkit-linear-gradient(top, #08c, #04c);background-image:-o-linear-gradient(top, #08c, #04c);background-image:linear-gradient(to bottom, #0088cc,#0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datepicker table tr td span.active:hover,.datepicker table tr td span.active:hover:hover,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover:hover,.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active:hover.disabled,.datepicker table tr td span.active.disabled.disabled,.datepicker table tr td span.active.disabled:hover.disabled,.datepicker table tr td span.active[disabled],.datepicker table tr td span.active:hover[disabled],.datepicker table tr td span.active.disabled[disabled],.datepicker table tr td span.active.disabled:hover[disabled]{background-color:#0044cc}.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:hover.active{background-color:#003399 \9}.datepicker table tr td span.old,.datepicker table tr td span.new{color:#999999}.datepicker th.datepicker-switch{width:145px}.datepicker thead tr:first-child th,.datepicker tfoot tr th{cursor:pointer}.datepicker thead tr:first-child th:hover,.datepicker tfoot tr th:hover{background:#eeeeee}.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}.datepicker thead tr:first-child th.cw{cursor:default;background-color:transparent}.input-append.date .add-on i,.input-prepend.date .add-on i{display:block;cursor:pointer;width:16px;height:16px}.input-daterange input{text-align:center}.input-daterange input:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-daterange input:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-daterange .add-on{display:inline-block;width:auto;min-width:16px;height:18px;padding:4px 5px;font-weight:normal;line-height:18px;text-align:center;text-shadow:0 1px 0 #ffffff;vertical-align:middle;background-color:#eeeeee;border:1px solid #ccc;margin-left:-5px;margin-right:-5px}/*! -Author : Hunter Perrin -Version : 3.2.0 -Link : http://sciactive.com/pnotify/ -*/.ui-pnotify{top:36px;right:36px;position:absolute;height:auto;z-index:2}body>.ui-pnotify{position:fixed;z-index:100040}.ui-pnotify-modal-overlay{background-color:rgba(0,0,0,0.4);top:0;left:0;position:absolute;height:100%;width:100%;z-index:1}body>.ui-pnotify-modal-overlay{position:fixed;z-index:100039}.ui-pnotify.ui-pnotify-in{display:block !important}.ui-pnotify.ui-pnotify-move{transition:left .5s ease, top .5s ease, right .5s ease, bottom .5s ease}.ui-pnotify.ui-pnotify-fade-slow{transition:opacity .4s linear;opacity:0}.ui-pnotify.ui-pnotify-fade-slow.ui-pnotify.ui-pnotify-move{transition:opacity .4s linear, left .5s ease, top .5s ease, right .5s ease, bottom .5s ease}.ui-pnotify.ui-pnotify-fade-normal{transition:opacity .25s linear;opacity:0}.ui-pnotify.ui-pnotify-fade-normal.ui-pnotify.ui-pnotify-move{transition:opacity .25s linear, left .5s ease, top .5s ease, right .5s ease, bottom .5s ease}.ui-pnotify.ui-pnotify-fade-fast{transition:opacity .1s linear;opacity:0}.ui-pnotify.ui-pnotify-fade-fast.ui-pnotify.ui-pnotify-move{transition:opacity .1s linear, left .5s ease, top .5s ease, right .5s ease, bottom .5s ease}.ui-pnotify.ui-pnotify-fade-in{opacity:1}.ui-pnotify .ui-pnotify-shadow{-webkit-box-shadow:0px 6px 28px 0px rgba(0,0,0,0.1);-moz-box-shadow:0px 6px 28px 0px rgba(0,0,0,0.1);box-shadow:0px 6px 28px 0px rgba(0,0,0,0.1)}.ui-pnotify-container{background-position:0 0;padding:.8em;height:100%;margin:0}.ui-pnotify-container:after{content:" ";visibility:hidden;display:block;height:0;clear:both}.ui-pnotify-container.ui-pnotify-sharp{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.ui-pnotify-title{display:block;margin-bottom:.4em;margin-top:0}.ui-pnotify-text{display:block}.ui-pnotify-icon,.ui-pnotify-icon span{display:block;float:left;margin-right:.2em}.ui-pnotify.stack-topleft,.ui-pnotify.stack-bottomleft{left:25px;right:auto}.ui-pnotify.stack-bottomright,.ui-pnotify.stack-bottomleft{bottom:25px;top:auto}.ui-pnotify.stack-modal{left:50%;right:auto;margin-left:-150px}.ui-pnotify.ui-pnotify-nonblock-fade{opacity:.2}.ui-pnotify.ui-pnotify-nonblock-hide{display:none !important}.ui-pnotify.stack-bar-bottom{margin-left:15%;margin-bottom:25px;right:auto;bottom:0;top:auto;left:auto}/*! - * Slidebars - A jQuery Framework for Off-Canvas Menus and Sidebars - * Version: 2.0.2 - * Url: http://www.adchsm.com/slidebars/ - * Author: Adam Charles Smith - * Author url: http://www.adchsm.com/ - * License: MIT - * License url: http://www.adchsm.com/slidebars/license/ - */html,body,[canvas=container],[off-canvas]{margin:0;padding:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html,body{width:100%;height:100%}[canvas]{z-index:1}[canvas=container]{width:100%;min-height:100%;overflow-y:auto;position:relative;background-color:white;-webkit-overflow-scrolling:touch}[canvas=container]:before,[canvas=container]:after{clear:both;content:'';display:table}[off-canvas]{display:none;position:fixed;overflow:hidden;overflow-y:auto;background-color:black;color:white;-webkit-overflow-scrolling:touch}[off-canvas*=top]{width:100%;height:255px;top:0}[off-canvas*=right]{width:255px;height:100%;top:0;right:0}[off-canvas*=bottom]{width:100%;height:255px;bottom:0}[off-canvas*=left]{width:255px;height:100%;top:0;left:0}[off-canvas*=reveal]{z-index:0}[off-canvas*=push]{z-index:1}[off-canvas*=overlay]{z-index:9999}[off-canvas*=shift]{z-index:0}[canvas],[off-canvas]{-webkit-transform:translate(0px, 0px);-ms-transform:translate(0px, 0px);transform:translate(0px, 0px);-webkit-transition:-webkit-transform 300ms;transition:transform 300ms ease-in-out;-webkit-backface-visibility:hidden}[off-canvas*=shift][off-canvas*=top]{-webkit-transform:translate(0px, 50%);transform:translate(0px, 50%)}[off-canvas*=shift][off-canvas*=right]{-webkit-transform:translate(-50%, 0px);transform:translate(-50%, 0px)}[off-canvas*=shift][off-canvas*=bottom]{-webkit-transform:translate(0px, -50%);transform:translate(0px, -50%)}[off-canvas*=shift][off-canvas*=left]{-webkit-transform:translate(50%, 0px);transform:translate(50%, 0px)}@media print{[canvas]{-webkit-transform:translate(0px, 0px) !important;-ms-transform:translate(0px, 0px) !important;transform:translate(0px, 0px) !important}[off-canvas]{display:none !important}}.pf-pie-chart{position:relative !important;display:table-cell;text-align:center;vertical-align:middle}.pf-pie-chart span{display:inline-block}.pf-pie-chart canvas{position:absolute;top:0;left:0}.pf-pie-chart-map-timer{width:36px;height:36px;margin:3px}.pf-pie-chart-map-timer canvas{top:3px;left:3px}.pf-pie-chart-map-timer span{font-size:10px}.pf-pie-chart-map-timer span:after{content:'s';margin-left:1px}.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1080}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;color:#adadad;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;pointer-events:none}.select2-container--pathfinder .select2-selection--single{background-color:#313335;border:1px solid #63676a;border-radius:0px;outline:0;height:32px;padding:6px 16px}.select2-container--pathfinder .select2-selection--single:focus{border:1px solid #568a89}.select2-container--pathfinder .select2-selection--single .select2-selection__rendered{font-family:'Oxygen Bold';color:#adadad;line-height:1.5;padding:0 10px 0 0}.select2-container--pathfinder .select2-selection--single .select2-selection__rendered div[class^='col-']:first-child{padding-left:0}.select2-container--pathfinder .select2-selection--single .select2-selection__clear{color:#a52521;cursor:pointer;float:right;font-weight:bold;margin-right:3px;margin-left:10px}.select2-container--pathfinder .select2-selection--single .select2-selection__clear:hover{color:#58100d}.select2-container--pathfinder .select2-selection--single .select2-selection__placeholder{color:#63676a}.select2-container--pathfinder .select2-selection--single .select2-selection__arrow{background-color:#313335;border:none;border-left:none;border-top-right-radius:0px;border-bottom-right-radius:0px;height:30px;position:absolute;top:1px;right:1px;width:20px}.select2-container--pathfinder .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--pathfinder[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--pathfinder[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #63676a;border-radius:0;border-top-left-radius:0px;border-bottom-left-radius:0px;left:1px;right:auto}.select2-container--pathfinder.select2-container--open .select2-selection--single{border:1px solid #568a89}.select2-container--pathfinder.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--pathfinder.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--pathfinder.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--pathfinder.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--pathfinder .select2-selection--multiple{background-color:#313335;color:#313335;border:1px solid #63676a;border-radius:0px;cursor:text;outline:0}.select2-container--pathfinder .select2-selection--multiple:focus{border:1px solid #568a89}.select2-container--pathfinder .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--pathfinder .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--pathfinder .select2-selection--multiple .select2-selection__choice{background-color:#adadad;border:1px solid #63676a;border-radius:2px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--pathfinder .select2-selection--multiple .select2-selection__choice__remove{color:#a52521;cursor:pointer;display:inline-block;font-weight:bold;margin-right:4px}.select2-container--pathfinder .select2-selection--multiple .select2-selection__choice__remove:hover{color:#58100d}.select2-container--pathfinder .select2-selection--multiple .select2-selection__placeholder{color:#63676a}.select2-container--pathfinder[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--pathfinder[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--pathfinder[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--pathfinder.select2-container--open .select2-selection--multiple{border:1px solid #568a89}.select2-container--pathfinder.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--pathfinder.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--pathfinder .select2-search--dropdown .select2-search__field{border:1px solid #63676a;outline:0}.select2-container--pathfinder .select2-search--inline .select2-search__field{outline:0}.select2-container--pathfinder .select2-search--inline .select2-search__field::-moz-placeholder{color:#63676a;opacity:1}.select2-container--pathfinder .select2-search--inline .select2-search__field:-ms-input-placeholder{color:#63676a}.select2-container--pathfinder .select2-search--inline .select2-search__field::-webkit-input-placeholder{color:#63676a}.select2-container--pathfinder .select2-dropdown{background-color:#313335;border:1px solid transparent;overflow:hidden;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.3);box-shadow:0 6px 12px rgba(0,0,0,0.3)}.select2-container--pathfinder .select2-dropdown img{image-rendering:-webkit-optimize-contrast;width:21px}.select2-container--pathfinder .select2-dropdown--above{border-bottom:none}.select2-container--pathfinder .select2-dropdown--below{border-top:none}.select2-container--pathfinder .select2-results{max-height:200px;overflow-y:auto}.select2-container--pathfinder .select2-results__option{padding:3px 6px;min-height:24px}.select2-container--pathfinder .select2-results__option[role=group]{padding:0}.select2-container--pathfinder .select2-results__option[aria-disabled=true],.select2-container--pathfinder .select2-results__option[aria-selected=true]{color:#63676a;background-color:#3c3f41}.select2-container--pathfinder .select2-results__option[aria-disabled=true] .pf-select-item-anchor,.select2-container--pathfinder .select2-results__option[aria-selected=true] .pf-select-item-anchor{padding-left:15px}.select2-container--pathfinder .select2-results__option[aria-disabled=true] .pf-select-item-anchor:before,.select2-container--pathfinder .select2-results__option[aria-selected=true] .pf-select-item-anchor:before{content:"\f05e";font-family:"Font Awesome 5 Free";font-weight:bold;font-size:9px;position:absolute;left:2px;top:0;color:#63676a}.select2-container--pathfinder .select2-results__option--highlighted[aria-selected]{background-color:#adadad;color:#313335}.select2-container--pathfinder .select2-results__group{cursor:default;display:block;padding:3px 6px;background-color:#3c3f41;text-transform:capitalize}.select2-container--pathfinder.select2-container--open .select2-dropdown{border-color:#568a89}.select2-container--pathfinder.select2-container--disabled .select2-selection{background-color:#3c3f41;cursor:not-allowed;border:1px solid #63676a}.select2-container--pathfinder.select2-container--disabled .select2-selection .select2-selection__arrow{background-color:#3c3f41}.select2-container--pathfinder.select2-container--disabled .select2-selection .select2-selection__clear{display:none}select.select2-hidden-accessible{-moz-appearance:none;-webkit-appearance:none}select[readonly].select2-hidden-accessible+.select2-container{pointer-events:none;touch-action:none}select[readonly].select2-hidden-accessible+.select2-container .select2-selection{background-color:#3c3f41}select[readonly].select2-hidden-accessible+.select2-container .select2-selection .select2-selection__arrow{background-color:#3c3f41}select[readonly].select2-hidden-accessible+.select2-container .select2-selection .select2-selection__clear{display:none}.blueimp-gallery,.blueimp-gallery>.slides>.slide>.slide-content{position:absolute;top:0;right:0;bottom:0;left:0;-moz-backface-visibility:hidden}.blueimp-gallery>.slides>.slide>.slide-content{margin:auto;width:auto;height:auto;max-width:100%;max-height:100%;opacity:1}.blueimp-gallery{position:fixed;z-index:999999;overflow:hidden;background:#000;background:rgba(0,0,0,0.3);opacity:0;display:none;direction:ltr;-ms-touch-action:none;touch-action:none}.blueimp-gallery-carousel{position:relative;z-index:auto;margin:1em auto;padding-bottom:56.25%;-webkit-box-shadow:0 4px 10px rgba(0,0,0,0.4);box-shadow:0 4px 10px rgba(0,0,0,0.4);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-ms-touch-action:pan-y;touch-action:pan-y}.blueimp-gallery-display{display:block;opacity:1}.blueimp-gallery>.slides{position:relative;height:100%;overflow:hidden}.blueimp-gallery-carousel>.slides{position:absolute}.blueimp-gallery>.slides>.slide{position:relative;float:left;height:100%;text-align:center;will-change:all;-webkit-transition-timing-function:cubic-bezier(0.645, 0.045, 0.355, 1);-moz-transition-timing-function:cubic-bezier(0.645, 0.045, 0.355, 1);-ms-transition-timing-function:cubic-bezier(0.645, 0.045, 0.355, 1);-o-transition-timing-function:cubic-bezier(0.645, 0.045, 0.355, 1);transition-timing-function:cubic-bezier(0.645, 0.045, 0.355, 1)}.blueimp-gallery,.blueimp-gallery>.slides>.slide>.slide-content{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.blueimp-gallery>.slides>.slide-loading{background-size:64px 64px}.blueimp-gallery>.slides>.slide-loading>.slide-content{opacity:0}.blueimp-gallery>.slides>.slide-error>.slide-content{display:none}.blueimp-gallery>.prev,.blueimp-gallery>.next{position:absolute;top:50%;left:15px;width:35px;height:35px;margin-top:-17px;font-size:22px;line-height:35px;color:#63676a;text-decoration:none;text-align:center;background:rgba(0,0,0,0.2);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-transition:color 0.09s linear;transition:color 0.09s linear;will-change:color;opacity:1;cursor:pointer;display:none}.blueimp-gallery>.next{left:auto;right:15px}.blueimp-gallery>.close,.blueimp-gallery>.title{position:absolute;bottom:15px;left:15px;margin:0 40px 0 0;font-size:14px;line-height:14px;font-font:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;color:#63676a;text-shadow:0 1px 3px #1d1d1d;opacity:1;display:none}.blueimp-gallery>.title{margin-left:20px}.blueimp-gallery>.title:before{content:'\f101';font-family:'Font Awesome 5 Free';font-weight:bold;position:absolute;top:-1px;left:-20px;height:14px;width:14px}.blueimp-gallery>.close{padding:15px;right:15px;left:auto;margin:-15px;font-size:30px;text-decoration:none;cursor:pointer}.blueimp-gallery>.play-pause{position:absolute;right:15px;bottom:15px;width:35px;height:35px;font-size:22px;line-height:35px;text-align:center;background:rgba(0,0,0,0.2);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-transition:color 0.09s linear;transition:color 0.09s linear;will-change:color;color:#e28a0d;cursor:pointer;opacity:1;display:none}.blueimp-gallery-playing>.play-pause{color:#2b2b2b}.blueimp-gallery>.prev:hover,.blueimp-gallery>.next:hover,.blueimp-gallery>.close:hover,.blueimp-gallery>.play-pause:hover{color:#e28a0d}.blueimp-gallery-controls>.prev,.blueimp-gallery-controls>.next,.blueimp-gallery-controls>.close,.blueimp-gallery-controls>.title,.blueimp-gallery-controls>.play-pause{display:block;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0)}.blueimp-gallery-single>.prev,.blueimp-gallery-left>.prev,.blueimp-gallery-single>.next,.blueimp-gallery-right>.next,.blueimp-gallery-single>.play-pause{display:none}.blueimp-gallery>.slides>.slide>.slide-content,.blueimp-gallery>.prev,.blueimp-gallery>.next,.blueimp-gallery>.close,.blueimp-gallery>.play-pause{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body:last-child .blueimp-gallery-playing>.play-pause{background-position:-20px 0}*+html .blueimp-gallery>.slides>.slide{min-height:300px}*+html .blueimp-gallery>.slides>.slide>.slide-content{position:relative}.blueimp-gallery>.slides>.slide>.text-content{overflow:auto;margin:0 auto;overflow:hidden;text-align:left}.blueimp-gallery .modal-body{position:relative;text-align:center;padding:0 0 56.25% 0;overflow:hidden;cursor:pointer}.blueimp-gallery .modal-footer{margin:0}.blueimp-gallery .modal-body img,.blueimp-gallery .modal-body .video-content video,.blueimp-gallery .modal-body .video-content iframe,.blueimp-gallery .modal-body .video-content a{max-width:100%;max-height:100%;margin:auto;position:absolute;top:0;right:0;bottom:0;left:0}.blueimp-gallery .modal-body .video-content video{display:none}.blueimp-gallery .modal-body .video-playing video{display:block}.blueimp-gallery .modal-body .video-content iframe{width:100%;height:100%;border:none;left:100%}.blueimp-gallery .modal-body .video-playing iframe{left:0}.blueimp-gallery .modal-body .video-playing img,.blueimp-gallery .modal-body .video-playing a{display:none}.blueimp-gallery .modal-body .video-content a{cursor:pointer}.blueimp-gallery .modal-body .video-content a:after{font-family:"Glyphicons Halflings";-webkit-font-smoothing:antialiased;content:"\e029";font-size:64px;line-height:64px;width:64px;height:64px;position:absolute;top:50%;margin:-32px 0 0 -32px}.blueimp-gallery .modal-body .video-loading a{background:url(../img/loading.gif) center no-repeat;background-size:64px 64px}.blueimp-gallery .modal-body .video-loading a:after{content:none}@media screen and (min-width: 768px){.blueimp-gallery .modal-dialog{right:auto;left:auto;width:auto;max-width:1200px;padding-left:5%;padding-right:5%}}/*! ======================================================================== - * Bootstrap Toggle: bootstrap-toggle.css v2.2.0 - * http://www.bootstraptoggle.com - * ======================================================================== - * Copyright 2014 Min Hur, The New York Times Company - * Licensed under MIT - * ======================================================================== */.checkbox label .toggle,.editable-input .editable-checklist>div>label label .toggle,.editable-input .editable-checklist>div>label>span .toggle,.checkbox-inline .toggle{margin-left:-20px;margin-right:5px}.toggle{position:relative;overflow:hidden}.toggle input[type="checkbox"]{display:none}.toggle-group{position:absolute;width:200%;top:0;bottom:0;left:0;transition:left 0.18s ease-in-out;-webkit-transition:left 0.18s ease-in-out;-moz-user-select:none;-webkit-user-select:none}.toggle.off .toggle-group{left:-100%}.toggle-on{position:absolute;top:0;bottom:0;left:0;right:50%;margin:0;border:0;border-radius:0}.toggle-off{position:absolute;top:0;bottom:0;left:50%;right:0;margin:0;border:0;border-radius:0}.toggle-handle{position:relative;margin:0 auto;padding-top:0;padding-bottom:0;height:100%;width:0;border-width:0 1px;background:#54585a}.toggle.btn{min-width:59px;min-height:34px}.toggle-on.btn{padding-right:24px}.toggle-off.btn{padding-left:24px}.toggle.btn-lg,.btn-group-lg>.toggle.btn{min-width:79px;min-height:45px}.toggle-on.btn-lg,.btn-group-lg>.toggle-on.btn{padding-right:31px}.toggle-off.btn-lg,.btn-group-lg>.toggle-off.btn{padding-left:31px}.toggle-handle.btn-lg,.btn-group-lg>.toggle-handle.btn{width:40px}.toggle.btn-sm,.btn-group-sm>.toggle.btn{min-width:50px;min-height:28px}.toggle-on.btn-sm,.btn-group-sm>.toggle-on.btn{padding-right:10px;padding-left:0}.toggle-off.btn-sm,.btn-group-sm>.toggle-off.btn{padding-left:10px;padding-right:0}.toggle.btn-xs,.btn-group-xs>.toggle.btn{min-width:35px;min-height:22px}.toggle-on.btn-xs,.btn-group-xs>.toggle-on.btn{padding-right:5px}.toggle-off.btn-xs,.btn-group-xs>.toggle-off.btn{padding-left:5px}.checkbox,.editable-input .editable-checklist>div>label{padding-left:20px}.checkbox label,.editable-input .editable-checklist>div>label label,.editable-input .editable-checklist>div>label>span{display:inline-block;vertical-align:middle;position:relative;padding-left:5px}.checkbox label::before,.editable-input .editable-checklist>div>label label::before,.editable-input .editable-checklist>div>label>span::before{content:"";display:inline-block;position:absolute;width:17px;height:17px;left:0;margin-left:-20px;border:1px solid #63676a;border-radius:3px;background-color:#313335;-webkit-transition:border 0.18s ease,color 0.18s ease,background-color 0.18s ease;transition:border 0.18s ease,color 0.18s ease,background-color 0.18s ease}.checkbox label::after,.editable-input .editable-checklist>div>label label::after,.editable-input .editable-checklist>div>label>span::after{font-family:"Font Awesome 5 Free";content:"\f00c";font-weight:bold;display:inline-block;position:absolute;width:16px;height:16px;left:0;top:0;opacity:0;transform:scale(2) rotateZ(-20deg);transition:all .18s ease-out;will-change:transform, opacity;margin-left:-20px;padding-left:3px;padding-top:1px;font-size:calc(100% - 1px);color:#adadad}.checkbox input[type="checkbox"],.editable-input .editable-checklist>div>label input[type="checkbox"],.checkbox input[type="radio"],.editable-input .editable-checklist>div>label input[type="radio"]{opacity:0;z-index:1;cursor:pointer}.checkbox input[type="checkbox"]:checked+label::after,.editable-input .editable-checklist>div>label input[type="checkbox"]:checked+label::after,.editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.checkbox input[type="radio"]:checked+label::after,.editable-input .editable-checklist>div>label input[type="radio"]:checked+label::after,.editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after{font-family:"Font Awesome 5 Free";content:"\f00c"}.checkbox input[type="checkbox"]:checked+label::after,.editable-input .editable-checklist>div>label input[type="checkbox"]:checked+label::after,.editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.checkbox input[type="radio"]:checked+label::after,.editable-input .editable-checklist>div>label input[type="radio"]:checked+label::after,.editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after{transform:scale(1) rotateZ(0deg);opacity:1}.checkbox input[type="checkbox"]:indeterminate+label::after,.editable-input .editable-checklist>div>label input[type="checkbox"]:indeterminate+label::after,.editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.checkbox input[type="radio"]:indeterminate+label::after,.editable-input .editable-checklist>div>label input[type="radio"]:indeterminate+label::after,.editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after{display:block;content:"";width:10px;height:3px;background-color:#555555;border-radius:2px;margin-left:-16.5px;margin-top:7px}.checkbox input[type="checkbox"]:disabled+label,.editable-input .editable-checklist>div>label input[type="checkbox"]:disabled+label,.editable-input .editable-checklist>div>label>input[type="checkbox"]:disabled+span,.checkbox input[type="radio"]:disabled+label,.editable-input .editable-checklist>div>label input[type="radio"]:disabled+label,.editable-input .editable-checklist>div>label>input[type="radio"]:disabled+span{opacity:0.65}.checkbox input[type="checkbox"]:disabled+label::before,.editable-input .editable-checklist>div>label input[type="checkbox"]:disabled+label::before,.editable-input .editable-checklist>div>label>input[type="checkbox"]:disabled+span::before,.checkbox input[type="radio"]:disabled+label::before,.editable-input .editable-checklist>div>label input[type="radio"]:disabled+label::before,.editable-input .editable-checklist>div>label>input[type="radio"]:disabled+span::before{background-color:#3c3f41;cursor:not-allowed}.checkbox.checkbox-circle label::before,.editable-input .editable-checklist>div>label.checkbox-circle label::before,.checkbox.checkbox-circle .editable-input .editable-checklist>div>label>span::before,.editable-input .checkbox.checkbox-circle .editable-checklist>div>label>span::before,.editable-input .editable-checklist>div>label.checkbox-circle .editable-checklist>div>label>span::before{border-radius:50%}.checkbox.checkbox-inline,.editable-input .editable-checklist>div>label.checkbox-inline{margin-top:0}.checkbox-primary input[type="checkbox"]:checked+label::before,.checkbox-primary .editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::before,.editable-input .checkbox-primary .editable-checklist>div>label>input[type="checkbox"]:checked+span::before,.checkbox-primary input[type="radio"]:checked+label::before,.checkbox-primary .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::before,.editable-input .checkbox-primary .editable-checklist>div>label>input[type="radio"]:checked+span::before{background-color:#375959;border-color:#375959}.checkbox-primary input[type="checkbox"]:checked+label::after,.checkbox-primary .editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.editable-input .checkbox-primary .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.checkbox-primary input[type="radio"]:checked+label::after,.checkbox-primary .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .checkbox-primary .editable-checklist>div>label>input[type="radio"]:checked+span::after{color:#fff}.checkbox-danger input[type="checkbox"]:checked+label::before,.checkbox-danger .editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::before,.editable-input .checkbox-danger .editable-checklist>div>label>input[type="checkbox"]:checked+span::before,.checkbox-danger input[type="radio"]:checked+label::before,.checkbox-danger .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::before,.editable-input .checkbox-danger .editable-checklist>div>label>input[type="radio"]:checked+span::before{background-color:#a52521;border-color:#a52521}.checkbox-danger input[type="checkbox"]:checked+label::after,.checkbox-danger .editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.editable-input .checkbox-danger .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.checkbox-danger input[type="radio"]:checked+label::after,.checkbox-danger .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .checkbox-danger .editable-checklist>div>label>input[type="radio"]:checked+span::after{color:#fff}.checkbox-info input[type="checkbox"]:checked+label::before,.checkbox-info .editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::before,.editable-input .checkbox-info .editable-checklist>div>label>input[type="checkbox"]:checked+span::before,.checkbox-info input[type="radio"]:checked+label::before,.checkbox-info .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::before,.editable-input .checkbox-info .editable-checklist>div>label>input[type="radio"]:checked+span::before{background-color:#316490;border-color:#316490}.checkbox-info input[type="checkbox"]:checked+label::after,.checkbox-info .editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.editable-input .checkbox-info .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.checkbox-info input[type="radio"]:checked+label::after,.checkbox-info .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .checkbox-info .editable-checklist>div>label>input[type="radio"]:checked+span::after{color:#fff}.checkbox-warning input[type="checkbox"]:checked+label::before,.checkbox-warning .editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::before,.editable-input .checkbox-warning .editable-checklist>div>label>input[type="checkbox"]:checked+span::before,.checkbox-warning input[type="radio"]:checked+label::before,.checkbox-warning .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::before,.editable-input .checkbox-warning .editable-checklist>div>label>input[type="radio"]:checked+span::before{background-color:#e28a0d;border-color:#e28a0d}.checkbox-warning input[type="checkbox"]:checked+label::after,.checkbox-warning .editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.editable-input .checkbox-warning .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.checkbox-warning input[type="radio"]:checked+label::after,.checkbox-warning .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .checkbox-warning .editable-checklist>div>label>input[type="radio"]:checked+span::after{color:#fff}.checkbox-success input[type="checkbox"]:checked+label::before,.checkbox-success .editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::before,.editable-input .checkbox-success .editable-checklist>div>label>input[type="checkbox"]:checked+span::before,.checkbox-success input[type="radio"]:checked+label::before,.checkbox-success .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::before,.editable-input .checkbox-success .editable-checklist>div>label>input[type="radio"]:checked+span::before{background-color:#4f9e4f;border-color:#4f9e4f}.checkbox-success input[type="checkbox"]:checked+label::after,.checkbox-success .editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.editable-input .checkbox-success .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.checkbox-success input[type="radio"]:checked+label::after,.checkbox-success .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .checkbox-success .editable-checklist>div>label>input[type="radio"]:checked+span::after{color:#fff}.checkbox-primary input[type="checkbox"]:indeterminate+label::before,.checkbox-primary .editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::before,.editable-input .checkbox-primary .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::before,.checkbox-primary input[type="radio"]:indeterminate+label::before,.checkbox-primary .editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::before,.editable-input .checkbox-primary .editable-checklist>div>label>input[type="radio"]:indeterminate+span::before{background-color:#375959;border-color:#375959}.checkbox-primary input[type="checkbox"]:indeterminate+label::after,.checkbox-primary .editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.editable-input .checkbox-primary .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.checkbox-primary input[type="radio"]:indeterminate+label::after,.checkbox-primary .editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after,.editable-input .checkbox-primary .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after{background-color:#fff}.checkbox-danger input[type="checkbox"]:indeterminate+label::before,.checkbox-danger .editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::before,.editable-input .checkbox-danger .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::before,.checkbox-danger input[type="radio"]:indeterminate+label::before,.checkbox-danger .editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::before,.editable-input .checkbox-danger .editable-checklist>div>label>input[type="radio"]:indeterminate+span::before{background-color:#a52521;border-color:#a52521}.checkbox-danger input[type="checkbox"]:indeterminate+label::after,.checkbox-danger .editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.editable-input .checkbox-danger .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.checkbox-danger input[type="radio"]:indeterminate+label::after,.checkbox-danger .editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after,.editable-input .checkbox-danger .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after{background-color:#fff}.checkbox-info input[type="checkbox"]:indeterminate+label::before,.checkbox-info .editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::before,.editable-input .checkbox-info .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::before,.checkbox-info input[type="radio"]:indeterminate+label::before,.checkbox-info .editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::before,.editable-input .checkbox-info .editable-checklist>div>label>input[type="radio"]:indeterminate+span::before{background-color:#316490;border-color:#316490}.checkbox-info input[type="checkbox"]:indeterminate+label::after,.checkbox-info .editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.editable-input .checkbox-info .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.checkbox-info input[type="radio"]:indeterminate+label::after,.checkbox-info .editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after,.editable-input .checkbox-info .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after{background-color:#fff}.checkbox-warning input[type="checkbox"]:indeterminate+label::before,.checkbox-warning .editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::before,.editable-input .checkbox-warning .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::before,.checkbox-warning input[type="radio"]:indeterminate+label::before,.checkbox-warning .editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::before,.editable-input .checkbox-warning .editable-checklist>div>label>input[type="radio"]:indeterminate+span::before{background-color:#e28a0d;border-color:#e28a0d}.checkbox-warning input[type="checkbox"]:indeterminate+label::after,.checkbox-warning .editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.editable-input .checkbox-warning .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.checkbox-warning input[type="radio"]:indeterminate+label::after,.checkbox-warning .editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after,.editable-input .checkbox-warning .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after{background-color:#fff}.checkbox-success input[type="checkbox"]:indeterminate+label::before,.checkbox-success .editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::before,.editable-input .checkbox-success .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::before,.checkbox-success input[type="radio"]:indeterminate+label::before,.checkbox-success .editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::before,.editable-input .checkbox-success .editable-checklist>div>label>input[type="radio"]:indeterminate+span::before{background-color:#4f9e4f;border-color:#4f9e4f}.checkbox-success input[type="checkbox"]:indeterminate+label::after,.checkbox-success .editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.editable-input .checkbox-success .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.checkbox-success input[type="radio"]:indeterminate+label::after,.checkbox-success .editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after,.editable-input .checkbox-success .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after{background-color:#fff}.radio{padding-left:20px}.radio label,.radio .editable-input .editable-checklist>div>label>span,.editable-input .radio .editable-checklist>div>label>span{display:inline-block;vertical-align:middle;position:relative;padding-left:5px}.radio label::before,.radio .editable-input .editable-checklist>div>label>span::before,.editable-input .radio .editable-checklist>div>label>span::before{content:"";display:inline-block;position:absolute;width:17px;height:17px;left:0;margin-left:-20px;border:1px solid #63676a;border-radius:50%;background-color:#313335;-webkit-transition:border 0.18s ease,color 0.18s ease;transition:border 0.18s ease,color 0.18s ease}.radio label::after,.radio .editable-input .editable-checklist>div>label>span::after,.editable-input .radio .editable-checklist>div>label>span::after{display:inline-block;position:absolute;content:" ";width:11px;height:11px;left:3px;top:3px;opacity:0;transform:scale(2) rotateZ(-20deg);transition:all .18s ease;will-change:transform, opacity;margin-left:-20px;border-radius:50%;background-color:#adadad;-webkit-transform:scale(0,0);-ms-transform:scale(0,0);transform:scale(0,0);-webkit-transition:-webkit-transform 0.18s cubic-bezier(0.8, -0.33, 0.2, 1.33);-moz-transition:-moz-transform 0.18s cubic-bezier(0.8, -0.33, 0.2, 1.33);-o-transition:-o-transform 0.18s cubic-bezier(0.8, -0.33, 0.2, 1.33);transition:transform 0.18s cubic-bezier(0.8, -0.33, 0.2, 1.33)}.radio input[type="radio"]{opacity:0;z-index:1;cursor:pointer}.radio input[type="radio"]:checked+label::after,.radio .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .radio .editable-checklist>div>label>input[type="radio"]:checked+span::after{-webkit-transform:scale(1,1);-ms-transform:scale(1,1);transform:scale(1,1);opacity:1}.radio input[type="radio"]:disabled+label,.radio .editable-input .editable-checklist>div>label>input[type="radio"]:disabled+span,.editable-input .radio .editable-checklist>div>label>input[type="radio"]:disabled+span{opacity:0.65}.radio input[type="radio"]:disabled+label::before,.radio .editable-input .editable-checklist>div>label>input[type="radio"]:disabled+span::before,.editable-input .radio .editable-checklist>div>label>input[type="radio"]:disabled+span::before{cursor:not-allowed}.radio.radio-inline{margin-top:0}.radio-primary input[type="radio"]+label::after,.radio-primary .editable-input .editable-checklist>div>label>input[type="radio"]+span::after,.editable-input .radio-primary .editable-checklist>div>label>input[type="radio"]+span::after{background-color:#375959}.radio-primary input[type="radio"]:checked+label::before,.radio-primary .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::before,.editable-input .radio-primary .editable-checklist>div>label>input[type="radio"]:checked+span::before{border-color:#375959}.radio-primary input[type="radio"]:checked+label::after,.radio-primary .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .radio-primary .editable-checklist>div>label>input[type="radio"]:checked+span::after{background-color:#375959}.radio-danger input[type="radio"]+label::after,.radio-danger .editable-input .editable-checklist>div>label>input[type="radio"]+span::after,.editable-input .radio-danger .editable-checklist>div>label>input[type="radio"]+span::after{background-color:#a52521}.radio-danger input[type="radio"]:checked+label::before,.radio-danger .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::before,.editable-input .radio-danger .editable-checklist>div>label>input[type="radio"]:checked+span::before{border-color:#a52521}.radio-danger input[type="radio"]:checked+label::after,.radio-danger .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .radio-danger .editable-checklist>div>label>input[type="radio"]:checked+span::after{background-color:#a52521}.radio-info input[type="radio"]+label::after,.radio-info .editable-input .editable-checklist>div>label>input[type="radio"]+span::after,.editable-input .radio-info .editable-checklist>div>label>input[type="radio"]+span::after{background-color:#316490}.radio-info input[type="radio"]:checked+label::before,.radio-info .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::before,.editable-input .radio-info .editable-checklist>div>label>input[type="radio"]:checked+span::before{border-color:#316490}.radio-info input[type="radio"]:checked+label::after,.radio-info .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .radio-info .editable-checklist>div>label>input[type="radio"]:checked+span::after{background-color:#316490}.radio-warning input[type="radio"]+label::after,.radio-warning .editable-input .editable-checklist>div>label>input[type="radio"]+span::after,.editable-input .radio-warning .editable-checklist>div>label>input[type="radio"]+span::after{background-color:#e28a0d}.radio-warning input[type="radio"]:checked+label::before,.radio-warning .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::before,.editable-input .radio-warning .editable-checklist>div>label>input[type="radio"]:checked+span::before{border-color:#e28a0d}.radio-warning input[type="radio"]:checked+label::after,.radio-warning .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .radio-warning .editable-checklist>div>label>input[type="radio"]:checked+span::after{background-color:#e28a0d}.radio-success input[type="radio"]+label::after,.radio-success .editable-input .editable-checklist>div>label>input[type="radio"]+span::after,.editable-input .radio-success .editable-checklist>div>label>input[type="radio"]+span::after{background-color:#4f9e4f}.radio-success input[type="radio"]:checked+label::before,.radio-success .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::before,.editable-input .radio-success .editable-checklist>div>label>input[type="radio"]:checked+span::before{border-color:#4f9e4f}.radio-success input[type="radio"]:checked+label::after,.radio-success .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .radio-success .editable-checklist>div>label>input[type="radio"]:checked+span::after{background-color:#4f9e4f}input[type="checkbox"].styled:checked+label:after,.editable-input .editable-checklist>div>label>input[type="checkbox"].styled:checked+span:after,input[type="radio"].styled:checked+label:after,.editable-input .editable-checklist>div>label>input[type="radio"].styled:checked+span:after{font-family:"Font Awesome 5 Free";content:"\f00c"}input[type="checkbox"] .styled:checked+label::before,input[type="checkbox"] .editable-input .editable-checklist>div>label>.styled:checked+span::before,.editable-input input[type="checkbox"] .editable-checklist>div>label>.styled:checked+span::before,input[type="radio"] .styled:checked+label::before,input[type="radio"] .editable-input .editable-checklist>div>label>.styled:checked+span::before,.editable-input input[type="radio"] .editable-checklist>div>label>.styled:checked+span::before{color:#fff}input[type="checkbox"] .styled:checked+label::after,input[type="checkbox"] .editable-input .editable-checklist>div>label>.styled:checked+span::after,.editable-input input[type="checkbox"] .editable-checklist>div>label>.styled:checked+span::after,input[type="radio"] .styled:checked+label::after,input[type="radio"] .editable-input .editable-checklist>div>label>.styled:checked+span::after,.editable-input input[type="radio"] .editable-checklist>div>label>.styled:checked+span::after{color:#fff}@font-face{font-family:"summernote";font-style:normal;font-weight:normal;src:url("../../fonts/summernote.eot?dbafe969167589eda84514394d126413");src:url("../../fonts/summernote.eot?#iefix") format("embedded-opentype"),url("../../fonts/summernote.woff?dbafe969167589eda84514394d126413") format("woff"),url("../../fonts/summernote.ttf?dbafe969167589eda84514394d126413") format("truetype")}[class^="note-icon-"]:before,[class*=" note-icon-"]:before{display:inline-block;font:normal normal normal 14px summernote;font-size:inherit;-webkit-font-smoothing:antialiased;text-decoration:inherit;text-rendering:auto;text-transform:none;vertical-align:middle;speak:none;-moz-osx-font-smoothing:grayscale}.note-icon-align-center:before,.note-icon-align-indent:before,.note-icon-align-justify:before,.note-icon-align-left:before,.note-icon-align-outdent:before,.note-icon-align-right:before,.note-icon-align:before,.note-icon-arrow-circle-down:before,.note-icon-arrow-circle-left:before,.note-icon-arrow-circle-right:before,.note-icon-arrow-circle-up:before,.note-icon-arrows-alt:before,.note-icon-arrows-h:before,.note-icon-arrows-v:before,.note-icon-bold:before,.note-icon-caret:before,.note-icon-chain-broken:before,.note-icon-circle:before,.note-icon-close:before,.note-icon-code:before,.note-icon-col-after:before,.note-icon-col-before:before,.note-icon-col-remove:before,.note-icon-eraser:before,.note-icon-font:before,.note-icon-frame:before,.note-icon-italic:before,.note-icon-link:before,.note-icon-magic:before,.note-icon-menu-check:before,.note-icon-minus:before,.note-icon-orderedlist:before,.note-icon-pencil:before,.note-icon-picture:before,.note-icon-question:before,.note-icon-redo:before,.note-icon-row-above:before,.note-icon-row-below:before,.note-icon-row-remove:before,.note-icon-special-character:before,.note-icon-square:before,.note-icon-strikethrough:before,.note-icon-subscript:before,.note-icon-summernote:before,.note-icon-superscript:before,.note-icon-table:before,.note-icon-text-height:before,.note-icon-trash:before,.note-icon-underline:before,.note-icon-undo:before,.note-icon-unorderedlist:before,.note-icon-video:before{display:inline-block;font-family:"summernote";font-style:normal;font-weight:normal;text-decoration:inherit}.note-icon-align-center:before{content:""}.note-icon-align-indent:before{content:""}.note-icon-align-justify:before{content:""}.note-icon-align-left:before{content:""}.note-icon-align-outdent:before{content:""}.note-icon-align-right:before{content:""}.note-icon-align:before{content:""}.note-icon-arrow-circle-down:before{content:""}.note-icon-arrow-circle-left:before{content:""}.note-icon-arrow-circle-right:before{content:""}.note-icon-arrow-circle-up:before{content:""}.note-icon-arrows-alt:before{content:""}.note-icon-arrows-h:before{content:""}.note-icon-arrows-v:before{content:""}.note-icon-bold:before{content:""}.note-icon-caret:before{content:""}.note-icon-chain-broken:before{content:""}.note-icon-circle:before{content:""}.note-icon-close:before{content:""}.note-icon-code:before{content:""}.note-icon-col-after:before{content:""}.note-icon-col-before:before{content:""}.note-icon-col-remove:before{content:""}.note-icon-eraser:before{content:""}.note-icon-font:before{content:""}.note-icon-frame:before{content:""}.note-icon-italic:before{content:""}.note-icon-link:before{content:""}.note-icon-magic:before{content:""}.note-icon-menu-check:before{content:""}.note-icon-minus:before{content:""}.note-icon-orderedlist:before{content:""}.note-icon-pencil:before{content:""}.note-icon-picture:before{content:""}.note-icon-question:before{content:""}.note-icon-redo:before{content:""}.note-icon-row-above:before{content:""}.note-icon-row-below:before{content:""}.note-icon-row-remove:before{content:""}.note-icon-special-character:before{content:""}.note-icon-square:before{content:""}.note-icon-strikethrough:before{content:""}.note-icon-subscript:before{content:""}.note-icon-summernote:before{content:""}.note-icon-superscript:before{content:""}.note-icon-table:before{content:""}.note-icon-text-height:before{content:""}.note-icon-trash:before{content:""}.note-icon-underline:before{content:""}.note-icon-undo:before{content:""}.note-icon-unorderedlist:before{content:""}.note-icon-video:before{content:""}.note-editor{position:relative}.note-editor .note-dropzone{position:absolute;z-index:100;display:none;color:#87cefa;background-color:#fff;opacity:0.95}.note-editor .note-dropzone .note-dropzone-message{display:table-cell;font-size:28px;font-weight:700;text-align:center;vertical-align:middle}.note-editor .note-dropzone.hover{color:#098ddf}.note-editor.dragover .note-dropzone{display:table}.note-editor .note-editing-area{position:relative}.note-editor .note-editing-area .note-editable{outline:0}.note-editor .note-editing-area .note-editable sup{vertical-align:super}.note-editor .note-editing-area .note-editable sub{vertical-align:sub}.note-editor .note-editing-area img.note-float-left{margin-right:10px}.note-editor .note-editing-area img.note-float-right{margin-left:10px}.note-editor.note-frame{border:1px solid #a9a9a9}.note-editor.note-frame.codeview .note-editing-area .note-editable{display:none}.note-editor.note-frame.codeview .note-editing-area .note-codable{display:block}.note-editor.note-frame .note-editing-area{overflow:hidden}.note-editor.note-frame .note-editing-area .note-editable{padding:10px;overflow:auto;color:#000;word-wrap:break-word;background-color:#fff}.note-editor.note-frame .note-editing-area .note-editable[contenteditable="false"]{background-color:#e5e5e5}.note-editor.note-frame .note-editing-area .note-codable{display:none;width:100%;padding:10px;margin-bottom:0;font-family:Menlo, Monaco, monospace, sans-serif;font-size:14px;color:#ccc;background-color:#222;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;box-shadow:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;resize:none}.note-editor.note-frame.fullscreen{position:fixed;top:0;left:0;z-index:1050;width:100% !important}.note-editor.note-frame.fullscreen .note-editable{background-color:#fff}.note-editor.note-frame.fullscreen .note-resizebar{display:none}.note-editor.note-frame .note-status-output{display:block;width:100%;height:20px;margin-bottom:0;font-size:14px;line-height:1.42857143;color:#000;border:0;border-top:1px solid #e2e2e2}.note-editor.note-frame .note-status-output:empty{height:0;border-top:0 solid transparent;padding-top:0}.note-editor.note-frame .note-statusbar{background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.note-editor.note-frame .note-statusbar .note-resizebar{width:100%;height:9px;padding-top:1px;cursor:ns-resize}.note-editor.note-frame .note-statusbar .note-resizebar .note-icon-bar{width:20px;margin:1px auto;border-top:1px solid #a9a9a9}.note-editor.note-frame .note-statusbar.locked .note-resizebar{cursor:default}.note-editor.note-frame .note-statusbar.locked .note-resizebar .note-icon-bar{display:none}.note-editor.note-frame .note-placeholder{padding:10px}.note-popover.popover{max-width:none}.note-popover.popover .popover-content a{display:inline-block;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle;margin-top:5px}.note-popover.popover .arrow{left:20px !important}.note-toolbar{position:relative;z-index:500}.note-popover .popover-content,.panel-heading.note-toolbar{padding:0 0 5px 5px;margin:0}.note-popover .popover-content>.btn-group,.panel-heading.note-toolbar>.btn-group{margin-top:5px;margin-right:5px;margin-left:0}.note-popover .popover-content .btn-group .note-table,.panel-heading.note-toolbar .btn-group .note-table{min-width:0;padding:5px}.note-popover .popover-content .btn-group .note-table .note-dimension-picker,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker{font-size:18px}.note-popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher{position:absolute !important;z-index:3;width:10em;height:10em;cursor:pointer}.note-popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted{position:relative !important;z-index:1;width:5em;height:5em;opacity:0.75;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat}.note-popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted{position:absolute !important;z-index:2;width:1em;height:1em;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat}.note-popover .popover-content .note-style .dropdown-style blockquote,.panel-heading.note-toolbar .note-style .dropdown-style blockquote,.note-popover .popover-content .note-style .dropdown-style pre,.panel-heading.note-toolbar .note-style .dropdown-style pre{padding:5px 10px;margin:0}.note-popover .popover-content .note-style .dropdown-style h1,.panel-heading.note-toolbar .note-style .dropdown-style h1,.note-popover .popover-content .note-style .dropdown-style h2,.panel-heading.note-toolbar .note-style .dropdown-style h2,.note-popover .popover-content .note-style .dropdown-style h3,.panel-heading.note-toolbar .note-style .dropdown-style h3,.note-popover .popover-content .note-style .dropdown-style h4,.panel-heading.note-toolbar .note-style .dropdown-style h4,.note-popover .popover-content .note-style .dropdown-style h5,.panel-heading.note-toolbar .note-style .dropdown-style h5,.note-popover .popover-content .note-style .dropdown-style h6,.panel-heading.note-toolbar .note-style .dropdown-style h6,.note-popover .popover-content .note-style .dropdown-style p,.panel-heading.note-toolbar .note-style .dropdown-style p{padding:0;margin:0}.note-popover .popover-content .note-color .dropdown-toggle,.panel-heading.note-toolbar .note-color .dropdown-toggle{width:20px;padding-left:5px}.note-popover .popover-content .note-color .dropdown-menu,.panel-heading.note-toolbar .note-color .dropdown-menu{min-width:337px}.note-popover .popover-content .note-color .dropdown-menu .note-palette,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette{display:inline-block;width:160px;margin:0}.note-popover .popover-content .note-color .dropdown-menu .note-palette:first-child,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette:first-child{margin:0 5px}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-palette-title,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette .note-palette-title{margin:2px 7px;font-size:12px;text-align:center;border-bottom:1px solid #63676a}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-color-reset,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette .note-color-reset{width:100%;padding:0 3px;margin:3px;font-size:11px;cursor:pointer;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-color-row,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette .note-color-row{height:20px}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-color-reset:hover,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette .note-color-reset:hover{background:#eee}.note-popover .popover-content .note-para .dropdown-menu,.panel-heading.note-toolbar .note-para .dropdown-menu{min-width:216px;padding:5px}.note-popover .popover-content .note-para .dropdown-menu>div:first-child,.panel-heading.note-toolbar .note-para .dropdown-menu>div:first-child{margin-right:5px}.note-popover .popover-content .dropdown-menu,.panel-heading.note-toolbar .dropdown-menu{min-width:90px}.note-popover .popover-content .dropdown-menu:not(.dropdown-style),.panel-heading.note-toolbar .dropdown-menu:not(.dropdown-style){color:#adadad;background-color:#3c3f41}.note-popover .popover-content .dropdown-menu.right,.panel-heading.note-toolbar .dropdown-menu.right{right:0;left:auto}.note-popover .popover-content .dropdown-menu.right::before,.panel-heading.note-toolbar .dropdown-menu.right::before{right:9px;left:auto !important}.note-popover .popover-content .dropdown-menu.right::after,.panel-heading.note-toolbar .dropdown-menu.right::after{right:10px;left:auto !important}.note-popover .popover-content .dropdown-menu.note-check li a i,.panel-heading.note-toolbar .dropdown-menu.note-check li a i{color:deepskyblue;visibility:hidden}.note-popover .popover-content .dropdown-menu.note-check li a.checked i,.panel-heading.note-toolbar .dropdown-menu.note-check li a.checked i{visibility:visible}.note-popover .popover-content .note-fontsize-10,.panel-heading.note-toolbar .note-fontsize-10{font-size:10px}.note-popover .popover-content .note-color-palette,.panel-heading.note-toolbar .note-color-palette{line-height:1}.note-popover .popover-content .note-color-palette div .note-color-btn,.panel-heading.note-toolbar .note-color-palette div .note-color-btn{width:20px;height:20px;padding:0;margin:0;border:1px solid #63676a;cursor:pointer}.note-popover .popover-content .note-color-palette div .note-color-btn:hover,.panel-heading.note-toolbar .note-color-palette div .note-color-btn:hover{border:1px solid #3c3f41}.note-dialog>div{display:none}.note-dialog .form-group{margin-right:0;margin-left:0}.note-dialog .note-modal-form{margin:0}.note-dialog .note-image-dialog .note-dropzone{min-height:100px;margin-bottom:10px;font-size:30px;line-height:4;color:lightgray;text-align:center;border:4px dashed #d3d3d3}@-moz-document url-prefix(){.note-image-input{height:auto}}.note-placeholder{position:absolute;display:none;color:gray}.note-handle .note-control-selection{position:absolute;display:none;border:1px solid #000}.note-handle .note-control-selection>div{position:absolute}.note-handle .note-control-selection .note-control-selection-bg{width:100%;height:100%;background-color:#000;-webkit-opacity:.3;-khtml-opacity:.3;-moz-opacity:.3;opacity:.3;-ms-filter:alpha(opacity=30);filter:alpha(opacity=30)}.note-handle .note-control-selection .note-control-handle{width:7px;height:7px;border:1px solid #000}.note-handle .note-control-selection .note-control-holder{width:7px;height:7px;border:1px solid #000}.note-handle .note-control-selection .note-control-sizing{width:7px;height:7px;background-color:#fff;border:1px solid #000}.note-handle .note-control-selection .note-control-nw{top:-5px;left:-5px;border-right:0;border-bottom:0}.note-handle .note-control-selection .note-control-ne{top:-5px;right:-5px;border-bottom:0;border-left:none}.note-handle .note-control-selection .note-control-sw{bottom:-5px;left:-5px;border-top:0;border-right:0}.note-handle .note-control-selection .note-control-se{right:-5px;bottom:-5px;cursor:se-resize}.note-handle .note-control-selection .note-control-se.note-control-holder{cursor:default;border-top:0;border-left:none}.note-handle .note-control-selection .note-control-selection-info{right:0;bottom:0;padding:5px;margin:5px;font-size:12px;color:#fff;background-color:#000;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-opacity:.7;-khtml-opacity:.7;-moz-opacity:.7;opacity:.7;-ms-filter:alpha(opacity=70);filter:alpha(opacity=70)}.note-hint-popover{min-width:100px;padding:2px}.note-hint-popover .popover-content{max-height:150px;padding:3px;overflow:auto}.note-hint-popover .popover-content .note-hint-group .note-hint-item{display:block !important;padding:3px}.note-hint-popover .popover-content .note-hint-group .note-hint-item.active,.note-hint-popover .popover-content .note-hint-group .note-hint-item:hover{display:block;clear:both;font-weight:400;line-height:1.4;color:#fff;text-decoration:none;white-space:nowrap;cursor:pointer;background-color:#428bca;outline:0}html{margin:0;padding:0;height:100%;position:relative}body{margin:0;padding:0;min-height:100%;direction:ltr}body.mobile-view-activated.hidden-menu{overflow-x:hidden}body.modal-open{overflow:hidden !important}a:hover,a:active,a:focus,button,button:active,button:focus,object,embed,input::-moz-focus-inner{outline:0}h1,h3,h4{margin:0;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.page-title{margin:12px 0 28px}.page-title span{font-size:15px;color:#313335;display:inline-block;vertical-align:1px}label,.editable-input .editable-checklist>div>label>span{font-weight:normal}*:not(td):focus{outline:0 !important}a,input,button{-ms-touch-action:none !important}textarea:focus,select:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{outline:0;outline:thin dotted \9;box-shadow:inset -1px 1px 5px 0 rgba(0,0,0,0.8) !important}.input-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn,.input-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn,.input-xs,.form-control{border-radius:0px !important;-webkit-border-radius:0px !important;-moz-border-radius:0px !important}.input-xs{height:24px;padding:2px 10px;font-size:11px;line-height:1.5}.btn-xs,.btn-group-xs>.btn{padding:0px 2px;font-size:10px;line-height:1.3}.btn-sm,.btn-group-sm>.btn{padding:5px 8px 4px}.btn-lg,.btn-group-lg>.btn{padding:10px 16px}.no-space{margin:0}.no-space>[class*="col-"]{margin:0 !important;padding-right:0;padding-left:0}h1{letter-spacing:-1px;font-size:22px;margin:10px 0}h1 small{font-size:12px;font-weight:300;letter-spacing:-1px}h2{font-size:20px;margin:20px 0;line-height:normal}h3{display:block;font-size:17px;font-weight:400;margin:20px 0;line-height:normal}h4{line-height:normal;margin:20px 0 10px 0}h5{font-size:14px;font-weight:300;margin-top:0;margin-bottom:10px;line-height:normal}h6{font-size:13px;margin:10px 0;font-weight:bold;line-height:normal}.row-seperator-header{margin:15px 14px 20px;border-bottom:none;display:block;color:#303133;font-size:20px;font-weight:400}.center-canvas,.center-child-canvas>canvas{display:block !important;margin:0 auto !important}.form-control{box-shadow:none !important;-webkit-box-shadow:none !important;-moz-box-shadow:none !important}.form hr{margin-left:-13px;margin-right:-13px;border-color:rgba(0,0,0,0.1);margin-top:20px;margin-bottom:20px}.form fieldset{display:block;border:none;background:rgba(255,255,255,0.9);position:relative}fieldset{position:relative}.popover-content .form-actions{margin:0 -14px -9px;border-radius:0 0 3px 3px;padding:9px 14px}.no-padding .form .form-actions{margin:0;display:block;padding:13px 14px 15px;border-top:1px solid rgba(0,0,0,0.1);background:rgba(248,248,248,0.9);text-align:right;margin-top:25px}.form header,legend{display:block;padding:8px 0;border-bottom:1px dashed rgba(0,0,0,0.2);background:#fff;font-size:16px;font-weight:300;color:#2b2b2b;margin:25px 0px 20px}.no-padding .form header{margin:25px 14px 0}.form header:first-child{margin-top:10px}legend{font-weight:400;margin-top:0px;background:none}.input-group-addon{padding:6px 10px;will-change:background-color, border-color;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;-webkit-transition:all ease-out 0.15s;transition:all ease-out 0.15s}.input-group-addon .fa{font-size:14px}.input-group-addon .fa-lg,.input-group-addon .fa-tree-child,.input-group-addon .fa-2x{font-size:2em}.input-group-addon .fa-3x,.input-group-addon .fa-4x,.input-group-addon .fa-5x{font-size:30px}input[type="text"]:focus+.input-group-addon,input[type="password"]:focus+.input-group-addon,input[type="email"]:focus+.input-group-addon{border-color:#568a89;color:#568a89}.has-warning input[type="text"],.has-warning input[type="text"]+.input-group-addon{border-color:#e28a0d}.has-warning input[type="text"]+.input-group-addon{background-color:#fbe3c0;color:#2b2b2b}.has-warning input[type="text"]:focus,.has-warning input[type="text"]:focus+.input-group-addon{border-color:#e28a0d}.has-warning input[type="text"]:focus+.input-group-addon{background-color:#e28a0d;color:#fff}.has-error .input-group-addon{border-color:#d9534f !important;background:#d9534f !important;color:#2b2b2b !important}.has-success .input-group-addon{border-color:#4f9e4f !important;background-color:#2b2b2b !important;color:#4f9e4f !important}.form fieldset .form-group:last-child,.form fieldset .form-group:last-child .note,.form .form-group:last-child,.form .form-group:last-child .note{margin-bottom:0}.note{margin-top:6px;padding:0 1px;font-size:11px;line-height:15px;color:#7c8184}.input-icon-right{position:relative}.input-icon-right>i,.input-icon-left>i{position:absolute;right:10px;top:10px;font-size:12px;color:#63676a}.input-icon-left>i{right:auto;left:24px}.input-icon-right .form-control{padding-right:27px}.input-icon-left .form-control{padding-left:29px}input[type="text"].ui-autocomplete-loading,input[type="password"].ui-autocomplete-loading,input[type="datetime"].ui-autocomplete-loading,input[type="datetime-local"].ui-autocomplete-loading,input[type="date"].ui-autocomplete-loading,input[type="month"].ui-autocomplete-loading,input[type="time"].ui-autocomplete-loading,input[type="week"].ui-autocomplete-loading,input[type="number"].ui-autocomplete-loading,input[type="email"].ui-autocomplete-loading,input[type="url"].ui-autocomplete-loading,input[type="search"].ui-autocomplete-loading,input[type="tel"].ui-autocomplete-loading,input[type="color"].ui-autocomplete-loading{background-image:url("../../img/select2-spinner.gif") !important;background-repeat:no-repeat;background-position:99% 50%;padding-right:27px}.input-group-addon .checkbox,.input-group-addon .editable-input .editable-checklist>div>label,.editable-input .input-group-addon .editable-checklist>div>label,.input-group-addon .radio{min-height:0px;margin-right:0px !important;padding-top:0}.input-group-addon label input[type="checkbox"].checkbox+span,.input-group-addon .editable-input .editable-checklist>div>label>span input[type="checkbox"].checkbox+span,.editable-input .input-group-addon .editable-checklist>div>label>span input[type="checkbox"].checkbox+span,.input-group-addon label input[type="radio"].radiobox+span,.input-group-addon .editable-input .editable-checklist>div>label>span input[type="radio"].radiobox+span,.editable-input .input-group-addon .editable-checklist>div>label>span input[type="radio"].radiobox+span,.input-group-addon label input[type="radio"].radiobox+span:before,.input-group-addon .editable-input .editable-checklist>div>label>span input[type="radio"].radiobox+span:before,.editable-input .input-group-addon .editable-checklist>div>label>span input[type="radio"].radiobox+span:before,.input-group-addon label input[type="checkbox"].checkbox+span:before,.input-group-addon .editable-input .editable-checklist>div>label>span input[type="checkbox"].checkbox+span:before,.editable-input .input-group-addon .editable-checklist>div>label>span input[type="checkbox"].checkbox+span:before{margin-right:0px}.alert{margin-bottom:10px;margin-top:0px;padding:5px 15px 5px 34px;color:#675100;border-width:0px;border-left-width:3px;padding:10px}.alert .ui-pnotify-title{line-height:12px}.alert .ui-pnotify-text{font-size:10px}.alert .close{top:0px;right:-5px;line-height:18px}.alert-heading{font-weight:600}.alert-danger{border-color:#a52521;color:#2b2b2b;background:#f6d1d0;text-shadow:none}.alert-danger .ui-pnotify-icon{color:#a52521}.alert-warning{border-color:#e28a0d;color:#2b2b2b;background:#fdedd8}.alert-warning .ui-pnotify-icon{color:#e28a0d}.alert-success{border-color:#4f9e4f;color:#2b2b2b;background:#d1e8d1}.alert-success .ui-pnotify-icon{color:#4f9e4f}.alert-info{border-color:#316490;color:#2b2b2b;background:#abc9e2}.alert-info .ui-pnotify-icon{color:#316490}.progress-micro{height:2px !important;line-height:2px !important}.progress-xs{height:7px !important;line-height:7px !important}.progress-sm{height:14px !important;line-height:14px !important}.progress-lg{height:30px !important;line-height:30px !important}.progress .progress-bar{position:absolute;overflow:hidden;line-height:18px}.progress .progressbar-back-text{position:absolute;width:100%;height:100%;font-size:12px;line-height:20px;text-align:center}.progress .progressbar-front-text{display:block;width:100%;font-size:12px;line-height:20px;text-align:center}.progress.right .progress-bar{right:0}.progress.right .progressbar-front-text{position:absolute;right:0}.progress.vertical{width:25px;height:100%;min-height:150px;margin-right:20px;display:inline-block;margin-bottom:0px}.progress.wide-bar{width:40px}.progress.vertical.bottom{position:relative}.progress.vertical.bottom .progressbar-front-text{position:absolute;bottom:0}.progress.vertical .progress-bar{width:100%;height:0;-webkit-transition:height 0.6s ease;transition:height 0.6s ease}.progress.vertical.bottom .progress-bar{position:absolute;bottom:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{position:relative;margin-bottom:20px;overflow:hidden;height:18px;background:#63676a;-webkit-box-shadow:0 1px 0 transparent,0 0 0 1px #63676a inset;box-shadow:0 1px 0 transparent,0 0 0 1px #63676a inset;-moz-border-radius:0px;-webkit-border-radius:0px;border-radius:0px}.progress-bar{float:left;width:0;height:100%;font-size:11px;color:#fff;text-align:center;background-color:#428bca;font-weight:bold;-webkit-transition:width 1s ease-in-out,background-color 1s ease-in-out;transition:width 1s ease-in-out,background-color 1s ease-in-out}.progress-striped .progress-bar{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-danger{background-color:#a52521}.progress-striped .progress-bar-danger{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-success{background-color:#4f9e4f}.progress-striped .progress-bar-success{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-warning{background-color:#e28a0d}.progress-striped .progress-bar-warning{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-bar-info{background-color:#316490}.progress-striped .progress-bar-info{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0))}.progress-info .bar,.progress .bar-info{background:#316490}.vertical-bars{padding:0;margin:0}.vertical-bars:after{content:"";display:block;height:0;clear:both}.vertical-bars li{padding:14px 0;width:25%;display:block;float:left;text-align:center}.vertical-bars li:first-child{border-left:none}.vertical-bars>li>.progress.vertical:first-child{margin-left:auto}.vertical-bars>li>.progress.vertical{margin:0 auto;float:none}.nav-tabs{border-bottom:none}.nav-tabs>li>a .badge{font-size:11px;padding:3px 5px 3px 5px;opacity:.5;margin-left:5px;min-width:17px;font-weight:normal}.tabs-left .nav-tabs>li>a .badge{margin-right:5px;margin-left:0px}.nav-tabs>li>a .label{display:inline-block;font-size:11px;margin-left:5px;opacity:.5}.nav-tabs>li>a{color:#63676a;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.nav-tabs>li>a:hover{color:#adadad;border-color:transparent transparent #63676a transparent;margin-top:1px;border-top-width:0}.nav-tabs>li.active>a{background-color:#adadad;color:#1d1d1d;border-top-width:0px !important;margin-top:1px !important;font-weight:bold}.tabs-left .nav-tabs>li.active>a{-webkit-box-shadow:-2px 0 0 #428bca;-moz-box-shadow:-2px 0 0 #428bca;box-shadow:-2px 0 0 #428bca;border-top-width:1px !important;border-left:none !important;margin-left:1px !important}.tabs-left .nav-pills>li.active>a{border:none !important;box-shadow:none !important;-webkit-box-shadow:none !important;-moz-box-shadow:none !important}.tabs-right .nav-tabs>li.active>a{-webkit-box-shadow:2px 0 0 #428bca;-moz-box-shadow:2px 0 0 #428bca;box-shadow:2px 0 0 #428bca;border-top-width:1px !important;border-right:none !important;margin-right:1px !important}.tabs-below .nav-tabs>li.active>a{-webkit-box-shadow:0 2px 0 #428bca;-moz-box-shadow:0 2px 0 #428bca;box-shadow:0 2px 0 #428bca;border-bottom-width:0px !important;border-top:none !important;margin-top:0px !important}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #9b9b9b}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li,.tabs-left>.nav-pills>li,.tabs-right>.nav-pills>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a,.tabs-left>.nav-pills>li>a,.tabs-right>.nav-pills>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs,.tabs-left>.nav-pills{float:left;margin-right:19px;border-right:1px solid #9b9b9b}.tabs-left>.nav-pills{border-right:none}.tabs-left>.nav-tabs>li>a{margin-right:-1px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#adadad #949494 #adadad #adadad}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#949494 transparent #949494 #9b9b9b;*border-right-color:#fff}.tabs-left>.tab-content{margin-left:109px}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #9b9b9b}.tabs-right>.nav-tabs>li>a{margin-left:-1px}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#adadad #adadad #adadad #9b9b9b}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#9b9b9b #9b9b9b #9b9b9b transparent;*border-left-color:#fff}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #9b9b9b}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#9b9b9b;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #9b9b9b #9b9b9b #9b9b9b}.nav-tabs.bordered{background:#fff;border:1px solid #9b9b9b}.nav-tabs.bordered>:first-child a{border-left-width:0px !important}.nav-tabs.bordered+.tab-content{border:1px solid #9b9b9b;border-top:none}.tabs-pull-right.nav-tabs>li,.tabs-pull-right.nav-pills>li{float:right}.tabs-pull-right.nav-tabs>li:first-child>a,.tabs-pull-right.nav-pills>li:first-child>a{margin-right:1px}.tabs-pull-right.bordered.nav-tabs>li:first-child>a,.tabs-pull-right.bordered.nav-pills>li:first-child>a{border-left-width:1px !important;margin-right:0px;border-right-width:0px}.dropdown-menu-xs{min-width:37px}.dropdown-menu-xs>li>a{padding:3px 10px}.dropdown-menu-xs>li>a:hover i{color:#fff !important}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropdown-submenu:hover>a{background-color:#63676a;color:#1d1d1d}.dropdown-submenu:hover a:after{border-left-color:#5cb85c}.dropdown-submenu>a:after{content:" ";display:block;position:absolute;right:5px;top:7px;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#2b2b2b}.dropdown-submenu>a:hover:after{border-left-color:#adadad}.dropdown-submenu.disabled>a:after{border-left-color:#63676a}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px}.pagination>li>a,.pagination>li>span{box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05);-moz-box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05);-webkit-box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05)}.btn-default.disabled{color:#adadad}.btn{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;will-change:background-color, border-color;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-webkit-transition:color 0.18s ease-in-out,background-color 0.18s ease-in-out,border-color 0.18s ease-in-out,box-shadow 0.18s ease-in-out;transition:color 0.18s ease-in-out,background-color 0.18s ease-in-out,border-color 0.18s ease-in-out,box-shadow 0.18s ease-in-out}.btn.btn-ribbon{background-color:#707070;background-image:-moz-linear-gradient(top, #777, #666);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#777), to(#666));background-image:-webkit-linear-gradient(top, #777, #666);background-image:-o-linear-gradient(top, #777, #666);background-image:linear-gradient(to bottom, #777777,#666666);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff777777', endColorstr='#ff666666', GradientType=0);color:white;padding:0 5px;line-height:20px;vertical-align:middle;height:20px;display:block;border:none;float:left;margin:0 8px 0 0;cursor:pointer}.btn.btn-ribbon>i{font-size:111%}.ribbon-button-alignment{padding-top:10px;display:inline-block}.ribbon-button-alignment.pull-right>.btn.btn-ribbon{margin:0 0 0 8px}.panel-purple{border-color:#6e587a}.panel-purple>.panel-heading{color:#fff;background-color:#6e587a;border-color:#6e587a}.panel-greenLight{border-color:#71843f}.panel-greenLight>.panel-heading{color:#fff;background-color:#71843f;border-color:#71843f}.panel-greenDark{border-color:#496949}.panel-greenDark>.panel-heading{color:#fff;background-color:#496949;border-color:#496949}.panel-darken{border-color:#313335}.panel-darken>.panel-heading{color:#fff;background-color:#404040;border-color:#404040}.panel-green{border-color:#5cb85c}.panel-green>.panel-heading{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.panel-red{border-color:#d9534f}.panel-red>.panel-heading{color:#fff;background-color:#d9534f;border-color:#d9534f}.panel-teal{border-color:#568a89}.panel-teal>.panel-heading{color:#fff;background-color:#568a89;border-color:#568a89}.panel-orange{border-color:#e28a0d}.panel-orange>.panel-heading{color:#fff;background-color:#e28a0d;border-color:#e28a0d}.panel-blueDark{border-color:#4c4f53}.panel-blueDark>.panel-heading{color:#fff;background-color:#4c4f53;border-color:#4c4f53}.panel-magenta{border-color:#6e3671}.panel-magenta>.panel-heading{color:#fff;background-color:#6e3671;border-color:#6e3671}.panel-blue{border-color:#428bca}.panel-blue>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-footer>.btn-block{border-radius:0px;-moz-border-radius:0px;-webkit-border-radius:0px;border-bottom:none;border-left:none;border-right:none}.btn-circle{width:30px;height:30px;text-align:center;padding:6px 0;font-size:12px;line-height:18px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%;-webkit-box-shadow:0 1px 6px 0 rgba(0,0,0,0.12),0 1px 6px 0 rgba(0,0,0,0.12);box-shadow:0 1px 6px 0 rgba(0,0,0,0.12),0 1px 6px 0 rgba(0,0,0,0.12)}.btn-circle.btn-sm,.btn-group-sm>.btn-circle.btn{width:22px;height:22px;padding:4px 0;font-size:12px;line-height:14px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%}.btn-circle.btn-lg,.btn-group-lg>.btn-circle.btn{width:50px;height:50px;padding:10px 15px;font-size:18px;line-height:30px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%}.btn-circle.btn-xl{width:70px;height:70px;padding:10px 15px;font-size:24px;line-height:50px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%}.btn-label{position:relative;left:-8px;display:inline-block;padding:5px 8px;background:rgba(0,0,0,0.15);border-radius:2px 0 0 2px}.btn-labeled{padding-top:0;padding-bottom:0;padding-left:8px}.btn-link{box-shadow:none;-webkit-box-shadow:none;font-size:13px}.morris-hover.morris-default-style{border-radius:5px;padding:5px;color:#666;background:rgba(29,29,29,0.85);font-family:'Oxygen Bold';font-size:10px;text-align:left;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold}.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap}.morris-hover{position:absolute;z-index:903}.fixed-page-footer .morris-hover{z-index:900}.txt-color.txt-color-blue,.txt-color-blue.pf-help-light,.pf-help-light:hover,.txt-color-blue.pf-help,.pf-help:hover,.txt-color.pf-help-default:hover,.dataTable td.pf-help-default.pf-table-link-cell:hover,.dataTable td.pf-table-link-cell.pf-help-light:hover,.dataTable td.pf-table-link-cell.pf-help:hover,.dataTable td.pf-table-action-cell>.pf-help-default.pf-table-action-icon-cell:hover,.dataTable td.pf-table-action-cell>.pf-table-action-icon-cell.pf-help-light:hover,.dataTable td.pf-table-action-cell>.pf-table-action-icon-cell.pf-help:hover,.pf-landing .pf-landing-list li>i.pf-help-default:hover,.pf-landing .pf-landing-list li>i.pf-help-light:hover,.pf-landing .pf-landing-list li>i.pf-help:hover,.dataTable td.txt-color-blue.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-blue.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-blue{color:#428bca !important}.txt-color.txt-color-blueLight,.txt-color-blueLight.pf-help-light,.txt-color-blueLight.pf-help,.dataTable td.txt-color-blueLight.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-blueLight.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-blueLight{color:#92a2a8 !important}.txt-color.txt-color-blueDark,.txt-color-blueDark.pf-help-light,.txt-color-blueDark.pf-help,.dataTable td.txt-color-blueDark.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-blueDark.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-blueDark{color:#4c4f53 !important}.txt-color.txt-color-grayLightest,.txt-color-grayLightest.pf-help-light,.txt-color-grayLightest.pf-help,.dataTable td.txt-color-grayLightest.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-grayLightest.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-grayLightest{color:#eaeaea !important}.txt-color.txt-color-grayLighter,.txt-color-grayLighter.pf-help-light,.txt-color-grayLighter.pf-help,.dataTable td.txt-color-grayLighter.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-grayLighter.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-grayLighter{color:#adadad !important}.txt-color.txt-color-grayLight,.pf-help-light,.txt-color-grayLight.pf-help,.dataTable td.txt-color-grayLight.pf-table-link-cell,.dataTable td.pf-table-link-cell.pf-help-light,.dataTable td.pf-table-action-cell>.txt-color-grayLight.pf-table-action-icon-cell,.dataTable td.pf-table-action-cell>.pf-table-action-icon-cell.pf-help-light,.pf-landing .pf-landing-list li>i.txt-color-grayLight,.pf-landing .pf-landing-list li>i.pf-help-light{color:#63676a !important}.txt-color.txt-color-gray,.txt-color-gray.pf-help-light,.pf-help,.dataTable td.txt-color-gray.pf-table-link-cell,.dataTable td.pf-table-link-cell.pf-help,.dataTable td.pf-table-action-cell>.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-gray,.pf-landing .pf-landing-list li>i.pf-help{color:#3c3f41 !important}.txt-color.txt-color-grayDark,.txt-color-grayDark.pf-help-light,.txt-color-grayDark.pf-help,.dataTable td.txt-color-grayDark.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-grayDark.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-grayDark{color:#313335 !important}.txt-color.txt-color-greenLight,.txt-color-greenLight.pf-help-light,.txt-color-greenLight.pf-help,.dataTable td.txt-color-greenLight.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-greenLight.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-greenLight{color:#66c84f !important}.txt-color.txt-color-green,.txt-color-green.pf-help-light,.pf-help-light.pf-log-info,.txt-color-green.pf-help,.pf-help.pf-log-info,.dataTable td.txt-color-green.pf-table-link-cell,.dataTable td.pf-table-link-cell.pf-log-info,.dataTable td.pf-table-action-cell>.txt-color-green.pf-table-action-icon-cell,.dataTable td.pf-table-action-cell>.pf-table-action-icon-cell.pf-log-info,.txt-color.pf-log-info,.pf-landing .pf-landing-list li>i.pf-log-info,.pf-landing .pf-landing-list li>i.txt-color-green{color:#5cb85c !important}.txt-color.txt-color-greenDark,.txt-color-greenDark.pf-help-light,.txt-color-greenDark.pf-help,.dataTable td.txt-color-greenDark.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-greenDark.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-greenDark{color:#4f9e4f !important}.txt-color.txt-color-redLight,.txt-color-redLight.pf-help-light,.txt-color-redLight.pf-help,.dataTable td.txt-color-redLight.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-redLight.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-redLight{color:#a65858 !important}.txt-color.txt-color-red,.txt-color-red.pf-help-light,.pf-help-light.pf-log-error,.txt-color-red.pf-help,.pf-help.pf-log-error,.dataTable td.txt-color-red.pf-table-link-cell,.dataTable td.pf-table-link-cell.pf-log-error,.dataTable td.pf-table-action-cell>.txt-color-red.pf-table-action-icon-cell,.dataTable td.pf-table-action-cell>.pf-table-action-icon-cell.pf-log-error,.txt-color.pf-log-error,.pf-landing .pf-landing-list li>i.pf-log-error,.pf-landing .pf-landing-list li>i.txt-color-red{color:#d9534f !important}.txt-color.txt-color-redDark,.txt-color-redDark.pf-help-light,.txt-color-redDark.pf-help,.dataTable td.txt-color-redDark.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-redDark.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-redDark{color:#a52521 !important}.txt-color.txt-color-redDarker,.txt-color-redDarker.pf-help-light,.txt-color-redDarker.pf-help,.dataTable td.txt-color-redDarker.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-redDarker.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-redDarker{color:#58100d !important}.txt-color.txt-color-yellow,.txt-color-yellow.pf-help-light,.txt-color-yellow.pf-help,.dataTable td.txt-color-yellow.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-yellow.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-yellow{color:#e2ce48 !important}.txt-color.txt-color-yellowDark,.txt-color-yellowDark.pf-help-light,.txt-color-yellowDark.pf-help,.dataTable td.txt-color-yellowDark.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-yellowDark.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-yellowDark{color:#c8b847 !important}.txt-color.txt-color-orangeLight,.txt-color-orangeLight.pf-help-light,.txt-color-orangeLight.pf-help,.dataTable td.txt-color-orangeLight.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-orangeLight.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-orangeLight{color:#f0ad4e !important}.txt-color.txt-color-orange,.txt-color-orange.pf-help-light,.txt-color-orange.pf-help,.dataTable td.txt-color-orange.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-orange.pf-table-action-icon-cell,.dataTable td.pf-table-action-cell:hover>.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-orange{color:#e28a0d !important}.txt-color.txt-color-orangeDark,.txt-color-orangeDark.pf-help-light,.txt-color-orangeDark.pf-help,.dataTable td.txt-color-orangeDark.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-orangeDark.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-orangeDark{color:#c2760c !important}.txt-color.txt-color-pink,.txt-color-pink.pf-help-light,.txt-color-pink.pf-help,.dataTable td.txt-color-pink.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-pink.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-pink{color:#e06fdf !important}.txt-color.txt-color-pinkDark,.txt-color-pinkDark.pf-help-light,.txt-color-pinkDark.pf-help,.dataTable td.txt-color-pinkDark.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-pinkDark.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-pinkDark{color:#a8829f !important}.txt-color.txt-color-purple,.txt-color-purple.pf-help-light,.txt-color-purple.pf-help,.dataTable td.txt-color-purple.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-purple.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-purple{color:#6e587a !important}.txt-color.txt-color-darken,.txt-color-darken.pf-help-light,.txt-color-darken.pf-help,.dataTable td.txt-color-darken.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-darken.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-darken{color:#404040 !important}.txt-color.txt-color-lighten,.txt-color-lighten.pf-help-light,.txt-color-lighten.pf-help,.dataTable td.txt-color-lighten.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-lighten.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-lighten{color:#d5e7ec !important}.txt-color.txt-color-white,.txt-color-white.pf-help-light,.txt-color-white.pf-help,.dataTable td.txt-color-white.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-white.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-white{color:#fff !important}.txt-color.txt-color-magenta,.txt-color-magenta.pf-help-light,.txt-color-magenta.pf-help,.dataTable td.txt-color-magenta.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-magenta.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-magenta{color:#6e3671 !important}.txt-color.txt-color-tealLightest,.txt-color-tealLightest.pf-help-light,.txt-color-tealLightest.pf-help,.dataTable td.txt-color-tealLightest.pf-table-link-cell,.dataTable td.pf-table-link-cell:hover,.dataTable td.pf-table-action-cell>.txt-color-tealLightest.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-tealLightest{color:#6caead !important}.txt-color.txt-color-tealLighter,.txt-color-tealLighter.pf-help-light,.txt-color-tealLighter.pf-help,.dataTable td.txt-color-tealLighter.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-tealLighter.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i{color:#568a89 !important}.txt-color.txt-color-teal,.txt-color-teal.pf-help-light,.txt-color-teal.pf-help,.dataTable td.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-teal.pf-table-action-icon-cell,.dataTable td.pf-table-action-cell>td.pf-table-action-icon-cell.pf-table-link-cell,.pf-landing .pf-landing-list li>i.txt-color-teal{color:#477372 !important}.txt-color.txt-color-indigoDark,.txt-color-indigoDark.pf-help-light,.txt-color-indigoDark.pf-help,.dataTable td.txt-color-indigoDark.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-indigoDark.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-indigoDark{color:#5c6bc0 !important}.txt-color.txt-color-indigoDarkest,.txt-color-indigoDarkest.pf-help-light,.txt-color-indigoDarkest.pf-help,.dataTable td.txt-color-indigoDarkest.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-indigoDarkest.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-indigoDarkest{color:#313966 !important}.txt-color.txt-color-gold,.txt-color-gold.pf-help-light,.txt-color-gold.pf-help,.dataTable td.txt-color-gold.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-gold.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-gold{color:#cfb53b !important}.txt-color.txt-color-silver,.txt-color-silver.pf-help-light,.txt-color-silver.pf-help,.dataTable td.txt-color-silver.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-silver.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-silver{color:silver !important}.txt-color.txt-color-bronze,.txt-color-bronze.pf-help-light,.txt-color-bronze.pf-help,.dataTable td.txt-color-bronze.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-bronze.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-bronze{color:#8c7853 !important}.txt-color.txt-color-primary,.txt-color-primary.pf-help-light,.txt-color-primary.pf-help,.dataTable td.txt-color-primary.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-primary.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-primary{color:#375959 !important}.txt-color.txt-color-success,.txt-color-success.pf-help-light,.txt-color-success.pf-help,.dataTable td.txt-color-success.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-success.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-success{color:#4f9e4f !important}.txt-color.txt-color-information,.txt-color-information.pf-help-light,.txt-color-information.pf-help,.dataTable td.txt-color-information.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-information.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-information{color:#316490 !important}.txt-color.txt-color-info,.txt-color-info.pf-help-light,.txt-color-info.pf-help,.dataTable td.txt-color-info.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-info.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-info{color:#316490 !important}.txt-color.txt-color-warning,.txt-color-warning.pf-help-light,.pf-help-light.pf-log-warning,.txt-color-warning.pf-help,.pf-help.pf-log-warning,.dataTable td.txt-color-warning.pf-table-link-cell,.dataTable td.pf-table-link-cell.pf-log-warning,.dataTable td.pf-table-action-cell>.txt-color-warning.pf-table-action-icon-cell,.dataTable td.pf-table-action-cell>.pf-table-action-icon-cell.pf-log-warning,.txt-color.pf-log-warning,.pf-landing .pf-landing-list li>i.pf-log-warning,.pf-landing .pf-landing-list li>i.txt-color-warning{color:#e28a0d !important}.txt-color.txt-color-danger,.txt-color-danger.pf-help-light,.txt-color-danger.pf-help,.dataTable td.txt-color-danger.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-danger.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-danger{color:#a52521 !important}.txt-color.txt-color-hint,.txt-color-hint.pf-help-light,.txt-color-hint.pf-help,.dataTable td.txt-color-hint.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-hint.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-hint{color:#c8b847 !important}.bg-color.bg-color-blue{background-color:#428bca !important}.bg-color.bg-color-blueLight{background-color:#92a2a8 !important}.bg-color.bg-color-blueDark{background-color:#4c4f53 !important}.bg-color.bg-color-green{background-color:#5cb85c !important}.bg-color.bg-color-greenLight{background-color:#71843f !important}.bg-color.bg-color-greenDark{background-color:#496949 !important}.bg-color.bg-color-red{background-color:#d9534f !important}.bg-color.bg-color-yellow{background-color:#e2ce48 !important}.bg-color.bg-color-orange{background-color:#e28a0d !important}.bg-color.bg-color-orangeDark{background-color:#c2760c !important}.bg-color.bg-color-pink{background-color:#e06fdf !important}.bg-color.bg-color-pinkDark{background-color:#a8829f !important}.bg-color.bg-color-purple{background-color:#6e587a !important}.bg-color.bg-color-darken{background-color:#404040 !important}.bg-color.bg-color-lighten{background-color:#d5e7ec !important}.bg-color.bg-color-white{background-color:#fff !important}.bg-color.bg-color-gray{background-color:#3c3f41 !important}.bg-color.bg-color-grayDark{background-color:#313335 !important}.bg-color.bg-color-grayDarker{background-color:#2b2b2b !important}.bg-color.bg-color-magenta{background-color:#6e3671 !important}.bg-color.bg-color-tealLighter{background-color:#568a89 !important}.bg-color.bg-color-tealDark{background-color:#375959 !important}.bg-color.bg-color-tealDarker{background-color:#212C30 !important}.bg-color.bg-color-tealDarkest{background-color:#1b2326 !important}.bg-color.bg-color-redLight{background-color:#a65858 !important}.pf-animation-slide-in{-moz-animation-duration:1.2s;-webkit-animation-duration:1.2s;-moz-animation-name:pfSlideIn;-webkit-animation-name:pfSlideIn;position:relative}@-webkit-keyframes pfSlideIn{from{opacity:0;top:-20px}to{opacity:1;top:0px}}@-moz-keyframes pfSlideIn{from{opacity:0;top:-20px}to{opacity:1;top:0px}}@-ms-keyframes pfSlideIn{from{opacity:0;top:-20px}to{opacity:1;top:0px}}@keyframes pfSlideIn{from{opacity:0;top:-20px}to{opacity:1;top:0px}}.pf-animation-path-draw{stroke-dasharray:500;stroke-dashoffset:500;animation:pfPathDraw 3s linear alternate infinite}@-webkit-keyframes pfPathDraw{from{stroke-dashoffset:500}to{stroke-dashoffset:0}}@-moz-keyframes pfPathDraw{from{stroke-dashoffset:500}to{stroke-dashoffset:0}}@-ms-keyframes pfPathDraw{from{stroke-dashoffset:500}to{stroke-dashoffset:0}}@keyframes pfPathDraw{from{stroke-dashoffset:500}to{stroke-dashoffset:0}}@-webkit-keyframes pfBubbleWobble{from{transform:scale(1, 1)}6.5%{transform:scale(1, 1.4)}13%{transform:scale(1.4, 1)}20%{transform:scale(1, 1)}to{transform:scale(1, 1)}}@-moz-keyframes pfBubbleWobble{from{transform:scale(1, 1)}6.5%{transform:scale(1, 1.4)}13%{transform:scale(1.4, 1)}20%{transform:scale(1, 1)}to{transform:scale(1, 1)}}@-ms-keyframes pfBubbleWobble{from{transform:scale(1, 1)}6.5%{transform:scale(1, 1.4)}13%{transform:scale(1.4, 1)}20%{transform:scale(1, 1)}to{transform:scale(1, 1)}}@keyframes pfBubbleWobble{from{transform:scale(1, 1)}6.5%{transform:scale(1, 1.4)}13%{transform:scale(1.4, 1)}20%{transform:scale(1, 1)}to{transform:scale(1, 1)}}@-webkit-keyframes pfBubblePop{from{opacity:1;transform:translateZ(0) scale(1, 1)}to{opacity:0;transform:translateZ(0) scale(1.75, 1.75)}}@-moz-keyframes pfBubblePop{from{opacity:1;transform:translateZ(0) scale(1, 1)}to{opacity:0;transform:translateZ(0) scale(1.75, 1.75)}}@-ms-keyframes pfBubblePop{from{opacity:1;transform:translateZ(0) scale(1, 1)}to{opacity:0;transform:translateZ(0) scale(1.75, 1.75)}}@keyframes pfBubblePop{from{opacity:1;transform:translateZ(0) scale(1, 1)}to{opacity:0;transform:translateZ(0) scale(1.75, 1.75)}}@-webkit-keyframes pfPulseDanger{0%{fill:#d9534f}50%{fill:#58100d}100%{fill:#d9534f}}@-moz-keyframes pfPulseDanger{0%{fill:#d9534f}50%{fill:#58100d}100%{fill:#d9534f}}@-ms-keyframes pfPulseDanger{0%{fill:#d9534f}50%{fill:#58100d}100%{fill:#d9534f}}@keyframes pfPulseDanger{0%{fill:#d9534f}50%{fill:#58100d}100%{fill:#d9534f}}@-webkit-keyframes pulseBackgroundSuccess{10%{background-color:#4f9e4f;color:#313335}}@-moz-keyframes pulseBackgroundSuccess{10%{background-color:#4f9e4f;color:#313335}}@-ms-keyframes pulseBackgroundSuccess{10%{background-color:#4f9e4f;color:#313335}}@keyframes pulseBackgroundSuccess{10%{background-color:#4f9e4f;color:#313335}}@-webkit-keyframes pulseBackgroundSuccessActive{10%{background-color:#478d47;color:#313335}}@-moz-keyframes pulseBackgroundSuccessActive{10%{background-color:#478d47;color:#313335}}@-ms-keyframes pulseBackgroundSuccessActive{10%{background-color:#478d47;color:#313335}}@keyframes pulseBackgroundSuccessActive{10%{background-color:#478d47;color:#313335}}.pf-animation-pulse-success{-webkit-animation:pulseBackgroundSuccess 1s 1;animation:pulseBackgroundSuccess 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}.pf-animation-pulse-success .sorting_1{-webkit-animation:pulseBackgroundSuccessActive 1s 1;animation:pulseBackgroundSuccessActive 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}@-webkit-keyframes pulseBackgroundSuccessKeep{0%{color:inherit}10%{background-color:#4f9e4f;color:#313335}100%{background-color:rgba(79,158,79,0.3)}}@-moz-keyframes pulseBackgroundSuccessKeep{0%{color:inherit}10%{background-color:#4f9e4f;color:#313335}100%{background-color:rgba(79,158,79,0.3)}}@-ms-keyframes pulseBackgroundSuccessKeep{0%{color:inherit}10%{background-color:#4f9e4f;color:#313335}100%{background-color:rgba(79,158,79,0.3)}}@keyframes pulseBackgroundSuccessKeep{0%{color:inherit}10%{background-color:#4f9e4f;color:#313335}100%{background-color:rgba(79,158,79,0.3)}}@-webkit-keyframes pulseBackgroundSuccessActiveKeep{0%{color:inherit}10%{background-color:#478d47;color:#313335}100%{background-color:rgba(71,141,71,0.3)}}@-moz-keyframes pulseBackgroundSuccessActiveKeep{0%{color:inherit}10%{background-color:#478d47;color:#313335}100%{background-color:rgba(71,141,71,0.3)}}@-ms-keyframes pulseBackgroundSuccessActiveKeep{0%{color:inherit}10%{background-color:#478d47;color:#313335}100%{background-color:rgba(71,141,71,0.3)}}@keyframes pulseBackgroundSuccessActiveKeep{0%{color:inherit}10%{background-color:#478d47;color:#313335}100%{background-color:rgba(71,141,71,0.3)}}.pf-animation-pulse-success-keep{-webkit-animation:pulseBackgroundSuccessKeep 1s 1;animation:pulseBackgroundSuccessKeep 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}.pf-animation-pulse-success-keep .sorting_1{-webkit-animation:pulseBackgroundSuccessActiveKeep 1s 1;animation:pulseBackgroundSuccessActiveKeep 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}@-webkit-keyframes pulseBackgroundWarning{10%{background-color:#e28a0d;color:#2b2b2b}}@-moz-keyframes pulseBackgroundWarning{10%{background-color:#e28a0d;color:#2b2b2b}}@-ms-keyframes pulseBackgroundWarning{10%{background-color:#e28a0d;color:#2b2b2b}}@keyframes pulseBackgroundWarning{10%{background-color:#e28a0d;color:#2b2b2b}}@-webkit-keyframes pulseBackgroundWarningActive{10%{background-color:#ca7b0c;color:#2b2b2b}}@-moz-keyframes pulseBackgroundWarningActive{10%{background-color:#ca7b0c;color:#2b2b2b}}@-ms-keyframes pulseBackgroundWarningActive{10%{background-color:#ca7b0c;color:#2b2b2b}}@keyframes pulseBackgroundWarningActive{10%{background-color:#ca7b0c;color:#2b2b2b}}.pf-animation-pulse-warning{-webkit-animation:pulseBackgroundWarning 1s 1;animation:pulseBackgroundWarning 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}.pf-animation-pulse-warning .sorting_1{-webkit-animation:pulseBackgroundWarningActive 1s 1;animation:pulseBackgroundWarningActive 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}@-webkit-keyframes pulseBackgroundWarningKeep{0%{color:inherit}10%{background-color:#e28a0d;color:#2b2b2b}100%{background-color:rgba(226,138,13,0.3)}}@-moz-keyframes pulseBackgroundWarningKeep{0%{color:inherit}10%{background-color:#e28a0d;color:#2b2b2b}100%{background-color:rgba(226,138,13,0.3)}}@-ms-keyframes pulseBackgroundWarningKeep{0%{color:inherit}10%{background-color:#e28a0d;color:#2b2b2b}100%{background-color:rgba(226,138,13,0.3)}}@keyframes pulseBackgroundWarningKeep{0%{color:inherit}10%{background-color:#e28a0d;color:#2b2b2b}100%{background-color:rgba(226,138,13,0.3)}}@-webkit-keyframes pulseBackgroundWarningActiveKeep{0%{color:inherit}10%{background-color:#ca7b0c;color:#2b2b2b}100%{background-color:rgba(202,123,12,0.3)}}@-moz-keyframes pulseBackgroundWarningActiveKeep{0%{color:inherit}10%{background-color:#ca7b0c;color:#2b2b2b}100%{background-color:rgba(202,123,12,0.3)}}@-ms-keyframes pulseBackgroundWarningActiveKeep{0%{color:inherit}10%{background-color:#ca7b0c;color:#2b2b2b}100%{background-color:rgba(202,123,12,0.3)}}@keyframes pulseBackgroundWarningActiveKeep{0%{color:inherit}10%{background-color:#ca7b0c;color:#2b2b2b}100%{background-color:rgba(202,123,12,0.3)}}.pf-animation-pulse-warning-keep{-webkit-animation:pulseBackgroundWarningKeep 1s 1;animation:pulseBackgroundWarningKeep 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}.pf-animation-pulse-warning-keep .sorting_1{-webkit-animation:pulseBackgroundWarningActiveKeep 1s 1;animation:pulseBackgroundWarningActiveKeep 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}@-webkit-keyframes pulseBackgroundDanger{10%{background-color:#d9534f;color:#2b2b2b}}@-moz-keyframes pulseBackgroundDanger{10%{background-color:#d9534f;color:#2b2b2b}}@-ms-keyframes pulseBackgroundDanger{10%{background-color:#d9534f;color:#2b2b2b}}@keyframes pulseBackgroundDanger{10%{background-color:#d9534f;color:#2b2b2b}}@-webkit-keyframes pulseBackgroundDangerActive{10%{background-color:#d43f3a;color:#2b2b2b}}@-moz-keyframes pulseBackgroundDangerActive{10%{background-color:#d43f3a;color:#2b2b2b}}@-ms-keyframes pulseBackgroundDangerActive{10%{background-color:#d43f3a;color:#2b2b2b}}@keyframes pulseBackgroundDangerActive{10%{background-color:#d43f3a;color:#2b2b2b}}.pf-animation-pulse-danger{-webkit-animation:pulseBackgroundDanger 1s 1;animation:pulseBackgroundDanger 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}.pf-animation-pulse-danger .sorting_1{-webkit-animation:pulseBackgroundDangerActive 1s 1;animation:pulseBackgroundDangerActive 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}@-webkit-keyframes pulseBackgroundDangerKeep{0%{color:inherit}10%{background-color:#d9534f;color:#2b2b2b}100%{background-color:rgba(217,83,79,0.3)}}@-moz-keyframes pulseBackgroundDangerKeep{0%{color:inherit}10%{background-color:#d9534f;color:#2b2b2b}100%{background-color:rgba(217,83,79,0.3)}}@-ms-keyframes pulseBackgroundDangerKeep{0%{color:inherit}10%{background-color:#d9534f;color:#2b2b2b}100%{background-color:rgba(217,83,79,0.3)}}@keyframes pulseBackgroundDangerKeep{0%{color:inherit}10%{background-color:#d9534f;color:#2b2b2b}100%{background-color:rgba(217,83,79,0.3)}}@-webkit-keyframes pulseBackgroundDangerActiveKeep{0%{color:inherit}10%{background-color:#d43f3a;color:#2b2b2b}100%{background-color:rgba(212,63,58,0.3)}}@-moz-keyframes pulseBackgroundDangerActiveKeep{0%{color:inherit}10%{background-color:#d43f3a;color:#2b2b2b}100%{background-color:rgba(212,63,58,0.3)}}@-ms-keyframes pulseBackgroundDangerActiveKeep{0%{color:inherit}10%{background-color:#d43f3a;color:#2b2b2b}100%{background-color:rgba(212,63,58,0.3)}}@keyframes pulseBackgroundDangerActiveKeep{0%{color:inherit}10%{background-color:#d43f3a;color:#2b2b2b}100%{background-color:rgba(212,63,58,0.3)}}.pf-animation-pulse-danger-keep{-webkit-animation:pulseBackgroundDangerKeep 1s 1;animation:pulseBackgroundDangerKeep 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}.pf-animation-pulse-danger-keep .sorting_1{-webkit-animation:pulseBackgroundDangerActiveKeep 1s 1;animation:pulseBackgroundDangerActiveKeep 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}.pf-animate-rotate,.modal-content h2[data-toggle="collapse"]:after,.modal-content h4[data-toggle="collapse"]:after,.panel-body h2[data-toggle="collapse"]:after,.panel-body h4[data-toggle="collapse"]:after{-webkit-transition:all 0.08s linear;transition:all 0.08s linear}.pf-animate-rotate.right,.modal-content h2.right[data-toggle="collapse"]:after,.modal-content h4.right[data-toggle="collapse"]:after,.panel-body h2.right[data-toggle="collapse"]:after,.panel-body h4.right[data-toggle="collapse"]:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.pf-animate-rotate.left,.modal-content h2.left[data-toggle="collapse"]:after,.modal-content h4.left[data-toggle="collapse"]:after,.panel-body h2.left[data-toggle="collapse"]:after,.panel-body h4.left[data-toggle="collapse"]:after{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}@keyframes rotateRainbow{0%{background-position-x:0}100%{background-position-x:100vw}}@font-face{font-family:'Triglavian';font-style:normal;font-weight:900;src:url("../../fonts/triglavian-regular.eot");src:url("../../fonts/triglavian-regular.eot?#iefix") format("embedded-opentype"),url("../../fonts/triglavian-regular.woff2") format("woff2"),url("../../fonts/triglavian-regular.woff") format("woff"),url("../../fonts/triglavian-regular.ttf") format("truetype");font-display:swap}.pf-triglivian{font-family:'Triglavian';font-weight:900}:fullscreen{overflow-y:scroll}body{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}a,.pf-link{color:#477372;will-change:color;text-decoration:none;cursor:pointer;-webkit-transition:color 0.08s ease-out,background-color 0.08s ease-out;transition:color 0.08s ease-out,background-color 0.08s ease-out}a:hover,.pf-link:hover{color:#6caead;text-decoration:none}a:focus,.pf-link:focus{color:#477372}a.disabled,.pf-link.disabled{color:#777;pointer-events:none;cursor:default}em,.pf-font-italic{font-style:italic}em.pf-brand,.pf-font-italic.pf-brand{text-transform:uppercase}.pf-font-uppercase{text-transform:uppercase}.pf-font-capitalize{text-transform:capitalize}.pf-font-line-through{text-decoration:line-through}.fa-char:before{font-family:Arial, sans-serif;font-weight:bold;content:attr(data-char-content)}.fa-tree-child{color:#63676a;padding-right:5px}.no-scroll{overflow:hidden}.no-padding{padding:0 !important}.no-margin{margin:0}.pf-hidden-by-attr[data-attr='']{display:none}.pf-hidden-by-attr:not([data-attr='']){display:initial}.pf-hidden-by-attr:before{content:attr(data-attr) " " attr(data-attr-label)}.pf-shown-by-attr[data-attr='']{display:initial}.pf-shown-by-attr:not([data-attr='']){display:none}.pf-shown-by-attr:before{content:attr(data-attr) " " attr(data-attr-label)}::-webkit-scrollbar{display:none;width:16px;height:16px}::-webkit-scrollbar-track{background-color:#2b2b2b;border-left:1px solid #313335;border-radius:2px;-webkit-transition:background-color 0.5s;transition:background-color 0.5s}::-webkit-scrollbar-thumb{height:6px;border:5px solid transparent;background-clip:padding-box;-webkit-border-radius:8px;background-color:#868c90}::-webkit-scrollbar-thumb:hover{background-color:#a1a5a8}::-webkit-scrollbar-button{width:0;height:0;display:none}::-webkit-scrollbar-corner{background-color:transparent}::selection{background:#adadad;color:#1d1d1d}::-moz-selection{background:#adadad;color:#1d1d1d}.row--reverse{display:flex;flex-direction:column-reverse}.pf-container-flex-end{display:flex;justify-content:flex-end}.well.well-text-number{font-family:Oxygen, Arial, sans-serif;font-weight:bold;letter-spacing:.02em;line-height:16px;text-rendering:geometricPrecision;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.collapse{will-change:height}.pf-help-default,.pf-help-light,.pf-help{cursor:help;pointer-events:auto;-webkit-transition:color 0.08s ease-out;transition:color 0.08s ease-out}.pf-dialog-icon-button,.pf-system-signature-module .pf-sig-table .fa-plus,.pf-system-route-module .pf-system-route-table td .fa-sync,.pf-system-route-module .pf-system-route-table td .fa-search,.pf-connection-info-module .pf-connection-info-table td .fa-plus{cursor:pointer;margin-top:2px;-webkit-transition:color 0.15s ease-out;transition:color 0.15s ease-out}.pf-dialog-icon-button:not(.collapsed),.pf-system-signature-module .pf-sig-table .fa-plus:not(.collapsed),.pf-system-route-module .pf-system-route-table td .fa-sync:not(.collapsed),.pf-system-route-module .pf-system-route-table td .fa-search:not(.collapsed),.pf-connection-info-module .pf-connection-info-table td .fa-plus:not(.collapsed),.pf-dialog-icon-button:hover,.pf-system-signature-module .pf-sig-table .fa-plus:hover,.pf-system-route-module .pf-system-route-table td .fa-sync:hover,.pf-system-route-module .pf-system-route-table td .fa-search:hover,.pf-connection-info-module .pf-connection-info-table td .fa-plus:hover{color:#e28a0d}.pf-module-icon-button{cursor:pointer;color:#63676a;-webkit-transition:color 0.15s ease-out;transition:color 0.15s ease-out}.pf-module-icon-button:hover,.pf-module-icon-button.active{color:#e28a0d !important}.pf-module-icon-button.editable{border-bottom:none !important}.pf-module-icon-button-copy{cursor:copy;-moz-user-select:text;user-select:text}.pf-bg-icon-inline,table td.pf-table-cell-bg-image .pf-table-cell-bg-image-wrapper,table th.pf-table-cell-bg-image .pf-table-cell-bg-image-wrapper{background-size:contain;background-origin:content-box;background-repeat:no-repeat;background-image:var(--bg-image);background-position:bottom 0 right 0;image-rendering:-webkit-optimize-contrast}.pf-bg-icon-inline{display:inline-block;width:20px;height:20px;margin:-5px 5px;outline:1px solid;outline-color:transparent;outline-offset:2px;-webkit-transition:outline-color 0.15s ease-out;transition:outline-color 0.15s ease-out}.pf-bg-icon-inline:hover{outline-color:#477372}.alert{will-change:opacity, transform}.editable-input optgroup[label]{background-color:#3c3f41;color:#63676a}.editable-input optgroup[label] option{background-color:#313335;color:#adadad;font-family:Consolas,monospace,Menlo,Monaco,"Courier New"}.editable-input .editable-checklist>div>label{display:block !important;padding-left:20px !important;color:#adadad}.editable-input .editable-checklist>div>label>span:after{top:-2px}.editable-input .editable-checklist .pf-editable-unknown[value='0']+span{color:#d9534f}.editable-input .editable-checklist .pf-editable-warn+span{color:#e28a0d}select:active,select:hover{outline:none}select:active,select:hover{outline-color:red}.select2-results .select2-results__options--nested .select2-results__option{padding-left:10px}.select2-results [class*="col-"]{padding-left:3px;padding-right:3px}.select2-results [class*="col-"]:first-child{padding-left:0}.select2-results [class*="col-"]:last-child{padding-right:0}.select2-results .clearfix.pf-result-image [class*="col-"]{line-height:22px}.select2 ::-webkit-search-cancel-button{-webkit-appearance:none !important}.select2 .select2-selection__choice__remove{float:left}.select2 .select2-selection--multiple input{box-shadow:none !important}.dataTables_wrapper .dataTables_length select{margin:0 3px;padding:1px}.dataTables_wrapper .pf-table-toolbar-status{text-align:center;line-height:22px;color:#63676a}.dataTables_wrapper .dt-buttons,.dataTables_wrapper .dt-stats{display:inline-block}.dataTables_wrapper .dt-buttons .dt-button,.dataTables_wrapper .dt-stats .dt-button{padding:0 5px;line-height:22px;margin-bottom:0}.dataTables_wrapper .dt-buttons .dt-button:not(:last-child),.dataTables_wrapper .dt-stats .dt-button:not(:last-child){margin-right:5px}.dataTables_wrapper .dt-buttons .dt-button .fas,.dataTables_wrapper .dt-buttons .dt-button .pf-landing .pf-landing-list li>i,.pf-landing .pf-landing-list .dataTables_wrapper .dt-buttons .dt-button li>i,.dataTables_wrapper .dt-buttons .dt-stat .fas,.dataTables_wrapper .dt-buttons .dt-stat .pf-landing .pf-landing-list li>i,.pf-landing .pf-landing-list .dataTables_wrapper .dt-buttons .dt-stat li>i,.dataTables_wrapper .dt-stats .dt-button .fas,.dataTables_wrapper .dt-stats .dt-button .pf-landing .pf-landing-list li>i,.pf-landing .pf-landing-list .dataTables_wrapper .dt-stats .dt-button li>i,.dataTables_wrapper .dt-stats .dt-stat .fas,.dataTables_wrapper .dt-stats .dt-stat .pf-landing .pf-landing-list li>i,.pf-landing .pf-landing-list .dataTables_wrapper .dt-stats .dt-stat li>i{margin-right:5px}.dataTables_wrapper .dt-buttons .dt-button.disabled,.dataTables_wrapper .dt-buttons .dt-stat.disabled,.dataTables_wrapper .dt-stats .dt-button.disabled,.dataTables_wrapper .dt-stats .dt-stat.disabled{color:#4f5355}.pf-dataTable-condensed-toolbar{padding-top:3px}.pf-dataTable-condensed-toolbar .dataTables_info{padding-top:0;text-align:left}.pf-dataTable-condensed-toolbar>div{padding-left:5px;padding-right:5px}.pf-dataTable-condensed-toolbar .dataTables_paginate{padding-top:0;margin-top:0}.pf-dataTable-condensed-toolbar .dataTables_paginate .paginate_button{padding:0;height:13px;border:0 !important}.pf-dataTable-condensed-toolbar .dataTables_paginate .paginate_button:before,.pf-dataTable-condensed-toolbar .dataTables_paginate .paginate_button:after{top:0}.pf-dataTable-condensed-toolbar .dataTables_paginate .paginate_button:hover{background:transparent !important;color:#e28a0d !important}.pf-dataTable-condensed-toolbar .dt-buttons{text-align:right;margin-bottom:0}.pf-dataTable-condensed-toolbar .dt-buttons .dt-button{line-height:18px}.pf-dataTable-condensed-toolbar .dt-buttons .dt-button .fa{margin-right:0}.dataTable th.pf-table-image-cell,.dataTable th.pf-table-image-small-cell,.dataTable th.pf-table-image-smaller-cell{padding-left:0 !important;padding-right:0 !important;image-rendering:-webkit-optimize-contrast}.dataTable th.sorting,.dataTable th.sorting_asc,.dataTable th.sorting_desc{padding-right:18px !important}.dataTable tr.group{background-color:rgba(43,43,43,0.4)}.dataTable td.editable-disabled:focus{outline:none;background-color:transparent}.dataTable td.editable-click:not(.editable-disabled){cursor:pointer}.dataTable td:focus,.dataTable td.editable-open{outline:1px solid #c2760c;outline-offset:-1px;background-color:rgba(194,118,12,0.08)}.dataTable td>.fa-circle{font-size:9px !important}.dataTable td>.label{font-size:80%}.dataTable td.pf-table-link-cell{cursor:pointer;-webkit-transition:color 0.08s ease-out;transition:color 0.08s ease-out}.dataTable td.pf-table-action-cell{cursor:pointer}.dataTable td.pf-table-action-cell>.pf-table-action-icon-cell{-webkit-transition:color 0.08s ease-out;transition:color 0.08s ease-out}.dataTable td.pf-table-type-cell>span:first-child{display:inline-block;width:28px}.dataTable td.pf-table-type-cell>span:nth-child(2){display:inline-block;width:22px}.dataTable td.pf-table-type-cell>span:nth-child(2) kbd:empty{display:none}.dataTable td.pf-table-image-cell{padding:0 !important;image-rendering:-webkit-optimize-contrast}.dataTable td.pf-table-image-cell img{width:26px;box-sizing:content-box;border-left:1px solid #3c3f41;border-right:1px solid #3c3f41}.dataTable td.pf-table-image-small-cell img{width:24px;border-left:1px solid transparent;border-right:1px solid transparent}.dataTable td.pf-table-image-smaller-cell{padding:0 !important;border-right:1px solid transparent}.dataTable td.pf-table-image-smaller-cell img{width:23px}.dataTable td.pf-table-button-sm-cell{padding:0 5px}.dataTable td.pf-table-counter-cell{color:#63676a}.dataTable td.pf-table-counter-cell .pf-digit-counter-small{width:20px;display:inline-block;font-size:10px}.dataTable td.pf-table-counter-cell .pf-digit-counter-large{width:26px;display:inline-block;font-size:10px}.dataTable td .pf-table-unknown-cell{color:#d9534f;font-style:italic}.dataTable td .pf-table-cell-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dataTable td .pf-table-cell-80{width:90px}.dataTable td .pf-table-cell-90{width:100px}.dataTable td .pf-table-cell-100{width:110px}.dataTable td .pf-endpoint-bubble{width:15px;height:15px}.dataTable td .pf-endpoint-bubble:after{width:15px;height:15px}.dataTable td.separator-right,.dataTable th.separator-right{border-right:1px solid #3c3f41}.dataTable td svg.peity,.dataTable th svg.peity{display:block}.dataTable thead th.colHighlight{border-bottom:1px solid #c2760c}.dataTable tbody td.colHighlight{border-left:1px solid #c2760c;border-right:1px solid #c2760c;background-color:rgba(194,118,12,0.08)}.dataTable tbody tr:first-child td.colHighlight{border-top:1px solid #c2760c}.dataTable tbody tr:last-child td.colHighlight{border-bottom:1px solid #c2760c}table.pf-table-fixed{width:100%;table-layout:fixed}table.collapsing{-webkit-transition:height 0.01s ease;transition:height 0.01s ease}table.collapse.in{display:table}table tr.collapsing{-webkit-transition:height 0.01s ease;transition:height 0.01s ease}table tr.collapse.in{display:table-row !important}table td.separator-right,table th.separator-right{border-right:1px solid #313335}table td.pf-table-cell-10,table th.pf-table-cell-10{width:10px}table td.pf-table-cell-20,table th.pf-table-cell-20{width:20px}table td.pf-table-cell-50,table th.pf-table-cell-50{width:50px}table td.pf-table-cell-100,table th.pf-table-cell-100{max-width:100px}table td.pf-table-cell-ellipses-auto,table th.pf-table-cell-ellipses-auto{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}table td.pf-table-cell-bg-image,table th.pf-table-cell-bg-image{padding:0 0 0 5px !important;vertical-align:middle !important;border-top-color:transparent !important}table td.pf-table-cell-bg-image .pf-table-cell-bg-image-wrapper,table th.pf-table-cell-bg-image .pf-table-cell-bg-image-wrapper{display:block;width:auto;height:40px;padding:2px 0}table td.pf-table-cell-bg-image .pf-table-cell-bg-image-wrapper.smaller,table th.pf-table-cell-bg-image .pf-table-cell-bg-image-wrapper.smaller{height:30px}table td.pf-table-cell-chart,table th.pf-table-cell-chart{position:relative}table td.pf-table-cell-chart svg.peity,table th.pf-table-cell-chart svg.peity{display:block;position:absolute;margin-top:-2px}table td.pf-table-cell-progress,table th.pf-table-cell-progress{position:relative}table td.pf-table-cell-progress:before,table th.pf-table-cell-progress:before{content:'';position:absolute;bottom:0;left:0;width:0;width:calc(var(--width) * 1%);height:1px;border-top:1px solid #428bca}table td.pf-table-cell-progress:after,table th.pf-table-cell-progress:after{content:'';position:absolute;bottom:0;left:0;width:100%;height:1px;border-width:0 2px;border-style:solid;border-color:#adadad}.pf-table-tools{height:45px}.pf-table-tools>.btn-labeled:not(:last-child){margin-right:10px}.pf-table-tools-action{will-change:height, opacity;opacity:0;display:none;height:0;overflow:hidden}.pf-loading-overlay{position:absolute;width:100%;height:100%;top:0;left:0;opacity:0;background:#2b2b2b;z-index:1060;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.pf-loading-overlay .pf-loading-overlay-wrapper{width:25px;height:25px;margin:auto;text-align:center;position:absolute;top:0;left:0;bottom:0;right:0}.pf-loading-overlay .pf-loading-overlay-wrapper i{padding:3px}.navbar-header-block{width:100%}.navbar-header-block .navbar-nav{width:100%}.modal .navbar-nav li:not(.disabled){position:relative}.modal .navbar-nav li:not(.disabled):before{content:'';position:absolute;top:0;background-color:#5cb85c;opacity:0;-webkit-transition:top 0.15s ease-out,opacity 0.15s ease-out;transition:top 0.15s ease-out,opacity 0.15s ease-out;will-change:opacity,top;width:100%;height:2px}.modal .navbar-nav li:not(.disabled):hover:before,.modal .navbar-nav li:not(.disabled).active:before{top:-4px;opacity:1}.navbar-fixed-top .navbar-nav li:not(.disabled){position:relative}.navbar-fixed-top .navbar-nav li:not(.disabled):before{content:'';position:absolute;bottom:0;background-color:#5cb85c;opacity:0;-webkit-transition:bottom 0.15s ease-out,opacity 0.15s ease-out;transition:bottom 0.15s ease-out,opacity 0.15s ease-out;will-change:opacity,bottom;width:100%;height:2px}.navbar-fixed-top .navbar-nav li:not(.disabled):hover:before,.navbar-fixed-top .navbar-nav li:not(.disabled).active:before{bottom:-4px;opacity:1}.pf-navbar-version-info{cursor:pointer}.pf-site{background-color:#05050a;background-repeat:no-repeat}.pf-menu{color:#63676a;background-color:#313335;width:150px;transition-duration:180ms;will-change:transform}.pf-menu-left .list-group-item{cursor:pointer;-webkit-box-shadow:inset -10px 0px 5px -5px rgba(0,0,0,0.4);box-shadow:inset -10px 0px 5px -5px rgba(0,0,0,0.4)}.pf-menu-right .list-group-item{cursor:pointer;-webkit-box-shadow:inset 10px 0px 5px -5px rgba(0,0,0,0.4);box-shadow:inset 10px 0px 5px -5px rgba(0,0,0,0.4)}.list-group-item.disabled:after{content:'\f023';font-family:'Font Awesome 5 Free';font-weight:bold;color:#2b2b2b;position:absolute;right:8px}.list-group-item.loading{pointer-events:none;color:#777}.list-group-item.loading:after{content:'\f021';font-family:'Font Awesome 5 Free';font-weight:bold;position:absolute;right:8px;animation:fa-spin 2s infinite linear}.mCSB_container,.mCSB_dragger{will-change:top, left, height, width;transition:height .18s linear, width .18s linear}.mCSB_container{overflow-x:visible !important;overflow-y:visible !important}.pf-timestamp-counter{visibility:hidden}.pf-map-type-private{color:#7986cb}.pf-map-type-corporation{color:#5cb85c}.pf-map-type-alliance{color:#428bca}.pf-map-type-global{color:#568a89}#pf-map-module{margin:15px 10px 0 10px}#pf-map-module #pf-map-tabs a[role="tab"]:hover .pf-map-tab-handler:before{color:#e28a0d}#pf-map-module #pf-map-tabs .pf-map-tab-handler:before{content:'\22EE\22EE\00A0';display:inline-block;cursor:-moz-grab !important;cursor:-webkit-grab !important;cursor:grab !important;color:#63676a;width:12px;transition:color 0.15s ease-out, background-color 0.15s ease-out;pointer-events:all}#pf-map-module #pf-map-tabs .pf-map-type-tab-default{border-top:2px solid transparent}#pf-map-module #pf-map-tabs .pf-map-type-tab-private{border-top:2px solid #7986cb}#pf-map-module #pf-map-tabs .pf-map-type-tab-corporation{border-top:2px solid #5cb85c}#pf-map-module #pf-map-tabs .pf-map-type-tab-alliance{border-top:2px solid #428bca}#pf-map-module #pf-map-tabs .pf-map-type-tab-global{border-top:2px solid #568a89}#pf-map-module #pf-map-tabs .pf-map-tab-icon{margin-right:3px}#pf-map-module #pf-map-tabs .pf-map-tab-shared-icon{margin-left:3px}.pf-map-content-row{margin-top:10px;padding-bottom:40px}@media (min-width: 1200px){.pf-map-content-row>.pf-map-content-col:first-child{padding-right:0}}.pf-map-content-row .pf-module{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;background:rgba(60,63,65,0.27);padding:10px;width:100%;margin-bottom:10px;will-change:height, transform, opacity;overflow:hidden;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border-top-left-radius:0}.pf-map-content-row .pf-module:before{content:'';position:absolute;top:0;left:0;border-style:solid;border-width:0 0 9px 9px;border-color:transparent transparent transparent #3c3f41;cursor:ns-resize}.pf-map-content-row .pf-module .label{margin-bottom:10px}.pf-map-content-row .pf-module .pf-dynamic-area{background:rgba(43,43,43,0.4)}.pf-map-content-row .pf-module .pf-module-head{margin-bottom:10px}.pf-map-content-row .pf-module .pf-module-head .pf-module-handler-drag{display:inline-block;cursor:-moz-grab !important;cursor:-webkit-grab !important;cursor:grab !important;transition:color 0.15s ease-out}.pf-map-content-row .pf-module .pf-module-head .pf-module-handler-drag:before{content:'\22EE\22EE\00A0'}.pf-map-content-row .pf-module .pf-module-head .pf-module-handler-drag:hover{color:#f0ad4e}.pf-map-content-row .pf-module .pf-module-head h5{display:inline-block;line-height:16px;margin-bottom:0}.pf-map-content-row .pf-module .pf-module-head h5 .pf-module-icon-button{margin-left:3px}.pf-map-content-row .pf-module .pf-module-table{font-size:11px;white-space:nowrap}.pf-map-content-row .pf-module-spacer{margin-bottom:10px}.pf-map-content-row .pf-module-control-area{display:flex;justify-content:center;align-items:center;margin-bottom:10px;min-height:inherit}.pf-map-content-row .pf-module-control-area:hover .fa-sync{-moz-transform:rotateZ(720deg);-ms-transform:rotateZ(720deg);-webkit-transform:rotateZ(720deg);transform:rotateZ(720deg)}.pf-map-content-row .pf-module-control-area .fa-sync{-webkit-transition:transform 1.6s ease-out;transition:transform 1.6s ease-out}.pf-user-status{color:#a52521}.pf-user-status-corp{color:#5cb85c}.pf-user-status-ally{color:#428bca}.pf-user-status-own{color:#7986cb}.pf-endpoint-bubble{display:inline-block;position:relative;width:18px;height:18px}.pf-endpoint-bubble:after{content:url("../../img/bubble.svg");display:inline-block;pointer-events:none;width:18px;height:18px;vertical-align:top}.pf-system-effect{display:none;color:#adadad;cursor:help}.pf-system-effect-magnetar{color:#e06fdf;display:inline-block}.pf-system-effect-redgiant{color:#d9534f;display:inline-block}.pf-system-effect-pulsar{color:#428bca;display:inline-block}.pf-system-effect-wolfrayet{color:#e28a0d;display:inline-block}.pf-system-effect-cataclysmic{color:#ffb;display:inline-block}.pf-system-effect-blackhole{color:#000;display:inline-block}.pf-rally,.pf-system-info-rally .pf-system-head{text-shadow:1px 1px 2px #1d1d1d;background-color:#782d77;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjEuMCIgeTE9IjEuMCIgeDI9IjAuMCIgeTI9IjAuMCI+PHN0b3Agb2Zmc2V0PSIyNSUiIHN0b3AtY29sb3I9IiMzZTI2NGUiLz48c3RvcCBvZmZzZXQ9IjI1JSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjAiLz48c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iIzAwMDAwMCIgc3RvcC1vcGFjaXR5PSIwLjAiLz48c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iIzNlMjY0ZSIvPjxzdG9wIG9mZnNldD0iNzUlIiBzdG9wLWNvbG9yPSIjM2UyNjRlIi8+PHN0b3Agb2Zmc2V0PSI3NSUiIHN0b3AtY29sb3I9IiMwMDAwMDAiIHN0b3Atb3BhY2l0eT0iMC4wIi8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjMDAwMDAwIiBzdG9wLW9wYWNpdHk9IjAuMCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-moz-linear-gradient(135deg, #3e264e 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,#3e264e 50%,#3e264e 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:-webkit-linear-gradient(135deg, #3e264e 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,#3e264e 50%,#3e264e 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-image:linear-gradient(-45deg, #3e264e 25%,rgba(0,0,0,0) 25%,rgba(0,0,0,0) 50%,#3e264e 50%,#3e264e 75%,rgba(0,0,0,0) 75%,rgba(0,0,0,0));background-size:25px 25px;-webkit-animation:move 2.5s linear infinite;-moz-animation:move 2.5s linear infinite;-ms-animation:move 2.5s linear infinite;animation:move 2.5s linear infinite}.pf-system-security-0-0{color:#be0000}.pf-system-security-0-1{color:#ab2600}.pf-system-security-0-2{color:#be3900}.pf-system-security-0-3{color:#c24e02}.pf-system-security-0-4{color:#ab5f00}.pf-system-security-0-5{color:#bebe00}.pf-system-security-0-6{color:#73bf26}.pf-system-security-0-7{color:#00bf00}.pf-system-security-0-8{color:#00bf39}.pf-system-security-0-9{color:#39bf99}.pf-system-security-1-0{color:#28c0bf}.pf-system-sec{margin-right:5px;cursor:-moz-grab;cursor:-webkit-grab;cursor:grab}.pf-system-sec-highSec{color:#5cb85c}.pf-system-sec-lowSec{color:#e28a0d}.pf-system-sec-nullSec{color:#d9534f}.pf-system-sec-high{color:#d9534f}.pf-system-sec-mid{color:#e28a0d}.pf-system-sec-low{color:#428bca}.pf-system-sec-unknown{color:#7986cb}.pf-system-sec-abyssal{color:#e06fdf}.pf-system-sec-special{color:#c8b847}.pf-system-sec-drifter{color:#44aa82}.pf-system-status-friendly{border-color:#428bca !important;color:#428bca}.pf-system-status-occupied{border-color:#e28a0d !important;color:#e28a0d}.pf-system-status-hostile{border-color:#d9534f !important;color:#d9534f}.pf-system-status-empty{border-color:#5cb85c !important;color:#5cb85c}.pf-system-status-unscanned{border-color:#568a89 !important;color:#568a89}.pf-system-info-status-label{background-color:#63676a;color:#000;will-change:background-color;-webkit-transition:background-color 0.3s ease-out;transition:background-color 0.3s ease-out}.pf-system-info-status-label.pf-system-status-friendly{background-color:#428bca}.pf-system-info-status-label.pf-system-status-occupied{background-color:#e28a0d}.pf-system-info-status-label.pf-system-status-hostile{background-color:#d9534f}.pf-system-info-status-label.pf-system-status-empty{background-color:#5cb85c}.pf-system-info-status-label.pf-system-status-unscanned{background-color:#568a89}.pf-system-hidden{opacity:0.15 !important;pointer-events:none}.pf-system-effect-dialog .clearfix+.col-md-6{margin-top:10px}.pf-system-effect-dialog .clearfix+.col-md-6+.col-md-6{margin-top:10px}.pf-planet-barren{color:#755e48}.pf-planet-gas{color:#a4b2b2}.pf-planet-ice{color:#aacada}.pf-planet-lava{color:#891c08}.pf-planet-oceanic{color:#4d7999}.pf-planet-plasma{color:#28576e}.pf-planet-shattered{color:#7986cb}.pf-planet-storm{color:#38556a}.pf-planet-temperate{color:#4c593c}.pf-fake-connection{box-sizing:content-box;display:inline-block;width:70px;height:4px;border-top:2px solid #63676a;border-bottom:2px solid #63676a;background-color:#3c3f41;position:relative;font-size:10px;font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif}.pf-fake-connection.pf-map-connection-stargate{background-color:#313966;border-color:#63676a}.pf-fake-connection.pf-map-connection-jumpbridge{background-color:#6caead;border-color:#3c3f41;background:repeating-linear-gradient(to right, #6caead, #6caead 10px, #3c3f41 10px, #3c3f41 20px)}.pf-fake-connection.pf-map-connection-abyssal{background-color:#5a225a;border-color:#3c3f41;background:repeating-linear-gradient(to right, #5a225a, #5a225a 5px, #3c3f41 5px, #3c3f41 10px)}.pf-fake-connection.pf-map-connection-wh-eol{border-color:#d747d6}.pf-fake-connection.pf-map-connection-wh-reduced{background-color:#e28a0d}.pf-fake-connection.pf-map-connection-wh-critical{background-color:#a52521}.pf-fake-connection.pf-map-connection-wh-size-s:after,.pf-fake-connection.pf-map-connection-wh-size-m:after,.pf-fake-connection.pf-map-connection-wh-size-l:after,.pf-fake-connection.pf-map-connection-wh-size-xl:after,.pf-fake-connection.pf-map-connection-preserve-mass:after{content:'?';background-color:#3c3f41;color:#adadad;padding:1px 2px;position:absolute;left:calc(50% - 7px);top:-5px;font-family:Arial, sans-serif;font-size:11px;line-height:12px;min-width:14px;text-align:center;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 3px 6px rgba(0,0,0,0.3);box-shadow:0 3px 6px rgba(0,0,0,0.3)}.pf-fake-connection.pf-map-connection-wh-size-s{border-style:dotted}.pf-fake-connection.pf-map-connection-wh-size-s:after{content:'S'}.pf-fake-connection.pf-map-connection-wh-size-m{border-style:dashed}.pf-fake-connection.pf-map-connection-wh-size-m:after{content:'M'}.pf-fake-connection.pf-map-connection-wh-size-l:after{content:'L'}.pf-fake-connection.pf-map-connection-wh-size-xl:after{content:'XL'}.pf-fake-connection.pf-map-connection-preserve-mass:after{content:'save mass';background-color:#a52521;color:#eaeaea;left:calc(50% - 28px)}.pf-fake-connection-text{padding:0 2px;border-style:solid;border-color:#575a5d;border-width:2px;border-left:none;border-right:none}.pf-fake-connection-text.pf-wh-eol{border-color:#d747d6}.pf-fake-connection-text.pf-wh-reduced{background-color:#e28a0d;color:#000}.pf-fake-connection-text.pf-wh-critical{background-color:#a52521;color:#000}.pf-fake-connection-text.pf-wh-frig{border-top-style:dotted;border-bottom-style:dotted}.pf-structure-status-unknown{color:#568a89}.pf-structure-status-online{color:#5cb85c}.pf-structure-status-offline{color:#a52521}.tooltip-inner{color:#adadad;background-color:#3c3f41;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;padding:5px 5px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}.modal .tooltip{z-index:1060}.modal .tooltip .tooltip-inner{color:#313335;background-color:#adadad}.tooltip.top .tooltip-arrow{border-top-color:#63676a}.tooltip.right .tooltip-arrow{border-right-color:#63676a}.tooltip.bottom .tooltip-arrow{border-bottom-color:#63676a}.tooltip.left .tooltip-arrow{border-left-color:#63676a}td.pf-popover-trigger:hover{color:#477372}.pf-notransition{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;transition:none !important}.pf-dynamic-area{padding:10px;min-height:100px;position:relative;background-color:#313335;overflow:hidden;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.pf-dynamic-area .dl-horizontal{margin-bottom:0}.pf-dynamic-area .dl-horizontal dd{min-width:100px}.pf-dynamic-area .dl-horizontal dd.txt-color,.pf-dynamic-area .dl-horizontal dd.pf-help-light,.pf-dynamic-area .dl-horizontal dd.pf-help,.pf-dynamic-area .dl-horizontal .dataTable td.pf-table-action-cell>dd.pf-table-action-icon-cell,.dataTable .pf-dynamic-area .dl-horizontal td.pf-table-action-cell>dd.pf-table-action-icon-cell{font-weight:bold}.pf-dynamic-area>[class~='alert']:last-of-type{margin-bottom:0}.pf-dynamic-area[data-resizebar]{padding-bottom:15px}.pf-dynamic-area[data-resizebar]:hover .pf-resizearea{-webkit-transition-delay:.15s;transition-delay:.15s;height:40px;opacity:1}.pf-dynamic-area[data-resizebar]:hover .pf-resizebar-bar{border-top:1px solid #e28a0d !important}.pf-dynamic-area:not([data-resizebar]) .pf-dynamic-area-resizebar{display:none}.pf-dynamic-area .pf-resizearea{height:0;opacity:0;-webkit-transition:height 0.12s ease-out,opacity 0.12s ease-out;transition:height 0.12s ease-out,opacity 0.12s ease-out;will-change:height, opacity}.pf-dynamic-area .pf-dynamic-area-statusbar{position:absolute;left:0;bottom:0;width:100%;background-color:#313335;padding:1px 0}.pf-dynamic-area .pf-dynamic-area-statusbar .pf-dynamic-area-resizebar{width:100%;height:9px;padding-top:1px;cursor:ns-resize}.pf-dynamic-area .pf-dynamic-area-statusbar .pf-dynamic-area-resizebar:hover .pf-resizebar-bar{border-top:1px solid #e28a0d}.pf-dynamic-area .pf-dynamic-area-statusbar .pf-dynamic-area-resizebar .pf-resizebar-bar{border-top:1px solid #63676a;transition:border-top 0.15s ease-out;width:20px;margin:1px auto}.pf-code-ObjectBrace{color:#782d77;font-weight:bold}.pf-code-ArrayBrace{color:#3e264e;font-weight:bold}.pf-code-PropertyName{color:#1d1d1d;font-weight:bold}.pf-code-String{color:#e28a0d}.pf-code-Number{color:#4f9e4f}.pf-code-Boolean{color:#313966;font-weight:bold}.pf-code-Function{color:#782d77}.pf-code-Null{color:#2b2b2b;font-weight:bold}.pf-code-Comma{color:#1d1d1d;font-weight:bold}code .fas,code .pf-landing .pf-landing-list li>i,.pf-landing .pf-landing-list code li>i,code .far,code .fab{color:#3c3f41;cursor:pointer}.pf-logo-wrapper{display:block}#pf-head{margin-bottom:0px}#pf-head a{-webkit-transition:color 0.15s ease-out;transition:color 0.15s ease-out;will-change:color}#pf-head a:focus{color:#477372}#pf-head a:focus img{border-color:#3c3f41}#pf-head a:hover{text-decoration:none}#pf-head a:hover .badge{color:#6caead}#pf-head a:hover img{border-color:#568a89}#pf-head i{margin-right:2px}#pf-head .pf-brand-desc{margin:6px 10px 0 90px;width:180px}#pf-head .pf-head-menu{padding:3px 10px;line-height:24px}#pf-head .pf-head-menu .pf-head-menu-logo{width:24px;height:24px;display:inline-block;float:left}#pf-head .pf-head-user-character{opacity:0;visibility:hidden}#pf-head .pf-head-active-users{cursor:pointer}#pf-head .pf-head-active-users{display:none}#pf-head .pf-head-active-users .badge{-webkit-transition:color 0.3s ease-out;transition:color 0.3s ease-out}#pf-head .pf-head-image{display:inline-block;margin-top:-6px;margin-bottom:-6px;width:27px;border:1px solid #3c3f41;image-rendering:-webkit-optimize-contrast;-webkit-transition:border-color 0.15s ease-out;transition:border-color 0.15s ease-out;will-change:border-color}#pf-head .pf-head-image.--left{margin-right:3px}#pf-head .pf-head-image.--right{margin-left:8px}#pf-head .pf-head-program-status{cursor:pointer}#pf-head .pf-head-map-tracking{margin-bottom:4px;margin-top:4px}#pf-head .tooltip .tooltip-inner{color:#adadad}.pf-head{-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}.pf-head .badge{background-color:#3c3f41;color:#adadad}.pf-head .badge:empty{display:none}.pf-head small{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}#pf-footer{display:flex;position:absolute;bottom:0;left:0;width:100%;margin:0;background:rgba(60,63,65,0.3);padding:1px 0}#pf-footer a{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;color:#375959}#pf-footer a:hover{color:#477372;text-decoration:none}#pf-footer .pf-footer-left{display:flex;flex:none;justify-content:flex-start}#pf-footer .pf-footer-center{display:flex;flex:1;padding:0 20px}#pf-footer .pf-footer-right{display:flex;flex:none;justify-content:flex-end}.navbar-fixed-bottom{padding:2px 0}.navbar-fixed-bottom .container-fluid{padding-left:0;padding-right:0}#pf-global-info{width:100%;margin-bottom:0;border:none;padding:9px 10px}#pf-global-info .ui-pnotify-title{margin-bottom:0}.panel-reverse-order{display:table;width:100%}.panel-reverse-order .reverse-order-header{display:table-header-group}.panel-reverse-order .reverse-order-footer{display:table-footer-group}.pf-sortable-ghost{will-change:opacity;transition:opacity 0.2s ease-out;opacity:0.7 !important}.pf-sortable-ghost .pf-module-handler-drag{color:#f0ad4e;cursor:-moz-grabbing;cursor:-webkit-grabbing;cursor:grabbing}@-webkit-keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}@-moz-keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}@-ms-keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}@keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}.pf-animate{visibility:hidden;opacity:0}.pf-color-line{position:fixed;top:0;left:0;width:100%;height:3px;background:repeating-linear-gradient(-45deg, #66c84f 0%, #568a89 12.5%, #6caead 25%, #5cb85c 37.5%, #66c84f 50%);background-size:100vw 100vw;-webkit-animation:rotateRainbow 3s infinite linear forwards;animation:rotateRainbow 3s infinite linear forwards}.pf-color-line.warning{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuMCIgeTE9IjAuNSIgeDI9IjEuMCIgeTI9IjAuNSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2UyOGEwZCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2UyOGEwZCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 0% 50%, 100% 50%, color-stop(0%, #e28a0d),color-stop(100%, #e28a0d));background-image:-moz-linear-gradient(left, #e28a0d,#e28a0d 100%);background-image:-webkit-linear-gradient(left, #e28a0d,#e28a0d 100%);background-image:linear-gradient(to right, #e28a0d,#e28a0d 100%)}.pf-color-line.danger{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuMCIgeTE9IjAuNSIgeDI9IjEuMCIgeTI9IjAuNSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2E1MjUyMSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2E1MjUyMSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 0% 50%, 100% 50%, color-stop(0%, #a52521),color-stop(100%, #a52521));background-image:-moz-linear-gradient(left, #a52521,#a52521 100%);background-image:-webkit-linear-gradient(left, #a52521,#a52521 100%);background-image:linear-gradient(to right, #a52521,#a52521 100%)}.pf-splash{position:fixed;z-index:2000;background-color:#1d1d1d;color:#63676a;top:0;bottom:0;left:0;right:0;will-change:opacity}.pf-splash:not(.pf-splash-warning):not(.pf-splash-error){cursor:wait}.pf-splash .pf-splash-title{position:fixed;left:50%;top:30%;text-align:center;max-width:500px;padding:20px;-moz-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%)}.pf-splash .pf-splash-debug{position:absolute;bottom:0;width:100%}.pf-splash .pf-splash-debug .pf-splash-debug-headline{padding:0 10px}.pf-splash .pf-splash-debug .pf-splash-pre{margin-bottom:0}@media (max-width: 1200px){.pf-landing #pf-logo-container{margin:5px auto}.pf-landing .pf-brand-desc{display:none}.pf-landing .navbar .navbar-brand{margin-left:10px}}.pf-landing section:not(:last-of-type){border-bottom:1px solid #2b2b2b}.pf-landing section{min-height:200px;padding:20px 0 40px 0}.pf-landing section h4:not(.pf-dynamic-area){font-size:18px;font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif;margin:5px 0 10px 0;border-bottom:1px solid #2b2b2b;line-height:34px}.pf-landing .container>.row{margin-bottom:30px}.pf-landing .alert{box-shadow:0 4px 10px rgba(0,0,0,0.4)}.pf-landing a[data-gallery]{position:relative;display:inline-block;overflow:hidden;margin:5px 0 15px 0;box-shadow:0 4px 10px rgba(0,0,0,0.4)}.pf-landing a[data-gallery]:before{content:'\f06e';font-family:'Font Awesome 5 Free';font-size:20px;color:#e28a0d;position:absolute;height:100%;width:100%;z-index:10;-webkit-transition:transform 0.1s ease-out,opacity 0.1s ease-out;transition:transform 0.1s ease-out,opacity 0.1s ease-out;will-change:transform, opacity;transform:scale(1.3, 1.3);opacity:0;display:flex;flex-direction:column;justify-content:center;align-items:center}.pf-landing a[data-gallery]:hover img{border-color:#6caead;-webkit-filter:brightness(50%);filter:brightness(50%)}.pf-landing a[data-gallery]:hover:before{-webkit-transition-delay:.05s;transition-delay:.05s;transform:scale(1, 1);opacity:1}.pf-landing a[data-gallery] .pf-landing-image-preview{border-width:1px;border-style:solid;border-color:#1d1d1d;display:inline-block;will-change:all;-webkit-filter:brightness(100%);filter:brightness(100%);-webkit-transition:all 0.2s ease-out;transition:all 0.2s ease-out}.pf-landing a[data-gallery] .pf-landing-image-preview.pf-landing-image-preview-small{height:160px}.pf-landing a[data-gallery] .pf-landing-image-preview.pf-landing-image-preview-medium{height:256px}#pf-landing-top{height:355px;border-bottom:1px solid #313335;position:relative}#pf-landing-top:before{content:'';width:100%;height:100%;position:absolute;background:url("../../img/pf-bg.jpg") #05050a;background-repeat:no-repeat;background-position:0 0;-webkit-filter:brightness(.9);filter:brightness(.9)}#pf-landing-top #pf-logo-container{-moz-transform:scale3d(0.8, 0.8, 1);-ms-transform:scale3d(0.8, 0.8, 1);-webkit-transform:scale3d(0.8, 0.8, 1);transform:scale3d(0.8, 0.8, 1)}#pf-landing-top #pf-header-container{position:absolute;width:100%;background-position:center center}#pf-landing-top #pf-header-container #pf-header-canvas{position:absolute;visibility:hidden;top:0;left:0}#pf-landing-top #pf-header-container #pf-logo-container{z-index:110}#pf-landing-top #pf-header-container #pf-header-preview-container{position:absolute;left:400px;width:590px;height:350px;top:37px}#pf-landing-top #pf-header-container #pf-header-preview-container .pf-header-preview-element{position:relative;margin-left:12px;margin-top:12px;height:155px;width:180px;padding:7px;opacity:0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background-color:rgba(43,43,43,0.5)}#pf-landing-top #pf-header-container #pf-header-preview-container .pf-header-preview-element:nth-child(n+4){box-shadow:0 4px 10px rgba(0,0,0,0.4)}#pf-landing-top #pf-header-container #pf-header-preview-container .pf-header-preview-element:after{content:'';position:absolute;width:calc(100% - 14px);height:calc(100% - 14px);-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background-repeat:no-repeat;background-position:50% 50%;background-color:rgba(29,29,29,0.75)}#pf-landing-top .container{position:relative;margin-top:10px}#pf-header-preview-intel:after{background-image:url("../../img/landing/intel.png")}#pf-header-preview-map:after{background-image:url("../../img/landing/map.png")}#pf-header-preview-scope:after{background-image:url("../../img/landing/scope.png")}#pf-header-preview-signature:after{background-image:url("../../img/landing/signature.png")}#pf-header-preview-data:after{background-image:url("../../img/landing/data.png")}#pf-header-preview-gameplay:after{background-image:url("../../img/landing/gameplay.png")}#pf-landing-login{padding-top:40px;padding-bottom:30px}@media (max-width: 1199px){#pf-landing-login{padding-top:10px}}#pf-landing-login .row{margin-bottom:0}#pf-landing-login .pf-character-selection>div:not(.pf-character-row-animate){-webkit-transition:width 0.2s ease,margin 0.2s ease;transition:width 0.2s ease,margin 0.2s ease}#pf-landing-login .pf-dynamic-area{display:inline-block;margin:10px 5px 20px 5px;padding:10px 10px 5px 10px;min-width:155px;min-height:184px;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;-webkit-box-shadow:0 4px 10px rgba(0,0,0,0.4);box-shadow:0 4px 10px rgba(0,0,0,0.4)}#pf-landing-login .pf-dynamic-area .ribbon-wrapper{z-index:5}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper{opacity:0;width:128px;border:2px solid #63676a;-moz-border-radius:8px;-webkit-border-radius:8px;border-radius:8px;-webkit-transition:border-color 0.2s ease-out,box-shadow 0.2s ease-out;transition:border-color 0.2s ease-out,box-shadow 0.2s ease-out;-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);will-change:border-color, transition;overflow:hidden;cursor:pointer;display:inline-block;background-color:#2b2b2b;box-sizing:content-box}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper:hover{border-color:#4f9e4f}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper:hover .pf-character-name{color:#4f9e4f}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper:hover .pf-character-image{-webkit-filter:grayscale(50%);filter:grayscale(50%)}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper.pf-character-active:after{font-family:"Font Awesome 5 Free";content:"\f111";font-weight:bold;position:absolute;top:5px;left:5px;height:14px;width:14px;color:#5cb85c;font-size:10px}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-select-image{overflow:hidden;width:128px;height:128px;position:relative}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-select-image .pf-character-info{position:absolute;top:0;left:0;width:0;height:100%;color:#adadad;background:rgba(60,63,65,0.8);overflow:hidden;will-change:width, transition;padding:5px 0}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-select-image .pf-character-info .pf-character-info-img{width:36px}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-select-image .pf-character-info .pf-character-info-text{line-height:25px}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-name{font-size:13px;line-height:30px;border-top:1px solid #313335;color:#adadad;-webkit-transition:color 0.2s ease-out;transition:color 0.2s ease-out}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-image{border-top-left-radius:8px;border-top-right-radius:8px;-webkit-transition:all 0.3s ease-out;transition:all 0.3s ease-out;-webkit-filter:grayscale(0%);filter:grayscale(0%)}#pf-landing-login .pf-sso-login-button{position:relative;display:inline-block;width:270px;height:45px;border:none;margin-bottom:10px;background-color:transparent;background-image:url("../../img/landing/eve_sso_login_buttons_large_black_hover.png");cursor:pointer;box-shadow:0 2px 5px rgba(0,0,0,0.2)}#pf-landing-login .pf-sso-login-button:before{content:' ';position:absolute;top:0;right:0;bottom:0;left:0;box-shadow:0 4px 5px rgba(0,0,0,0.2);opacity:0;-webkit-transition:opacity 0.12s ease-in-out;transition:opacity 0.12s ease-in-out;will-change:opacity}#pf-landing-login .pf-sso-login-button:after{content:' ';position:absolute;width:270px;height:45px;left:0;top:0;background-image:url("../../img/landing/eve_sso_login_buttons_large_black.png");-webkit-transition:opacity 0.12s ease-in-out;transition:opacity 0.12s ease-in-out;will-change:opacity}#pf-landing-login .pf-sso-login-button:hover:before{opacity:1}#pf-landing-login .pf-sso-login-button:hover:after{opacity:0}#pf-landing-login .pf-sso-login-button.disabled{pointer-events:auto}#pf-landing-login #pf-notification-panel{display:none}#pf-header-map{position:relative;margin:0 auto;height:380px;width:600px;pointer-events:none}#pf-header-map .pf-header-svg-layer{position:absolute;top:0;left:0;right:0;bottom:0}#pf-header-map #pf-header-systems{z-index:100}#pf-header-map #pf-header-connectors{z-index:90}#pf-header-map #pf-header-connections{z-index:80}#pf-header-map #pf-header-background{z-index:70}#pf-header-map #pf-header-background .pf-header-system{display:none}#pf-header-map-bg{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none}#pf-header-map-bg img{pointer-events:none}#pf-header-map-bg #pf-map-bg-image{opacity:0;position:absolute;bottom:0;right:0;width:100%;height:100%}#pf-header-map-bg #pf-map-neocom{opacity:0;height:665px;width:21px}#pf-header-map-bg #pf-map-browser{opacity:0;position:absolute;top:110px;left:21px;height:560px;width:515px}#pf-landing-gallery-carousel{background-image:url("../../img/pf-header-bg.jpg")}#pf-landing-gallery-carousel .slide-content{border-radius:5px;pointer-events:none}#pf-landing-gallery-carousel h3{width:100%;text-align:left}.pf-landing-pricing-panel{margin-top:20px}.pricing-big{position:relative;-webkit-box-shadow:0 4px 10px rgba(0,0,0,0.4);box-shadow:0 4px 10px rgba(0,0,0,0.4)}.pricing-big .panel-heading{border-color:#3c3f41}.pricing-big .the-price{padding:1px 0;background:#2d3031;text-align:center}.pricing-big .the-price .subscript{font-size:12px;color:#63676a}.pricing-big .price-features{background:#3c3f41;color:#adadad;padding:20px 15px;line-height:22px}.pricing-big .price-features:not(.price-features-fluid){min-height:205px}.pricing-big .price-features .list-unstyled.text-left li,.pricing-big .price-features .text-left.list-inline li{text-indent:-1em;padding-left:1.5em}.pricing-big .price-features .list-unstyled.text-left li .fa,.pricing-big .price-features .text-left.list-inline li .fa{text-indent:0}.pricing-big .badge{color:#adadad;background-color:#2b2b2b}.pricing-big table tr td{line-height:1}.pricing-big table tr td .btn-group .btn{border-radius:0;padding-top:4px;padding-bottom:4px}#pf-landing-admin .pf-landing-admin-login{margin-bottom:0}#pf-landing-about .pf-landing-about-me{width:256px;height:256px;border:none;-webkit-box-shadow:0 4px 10px rgba(0,0,0,0.4);box-shadow:0 4px 10px rgba(0,0,0,0.4)}.pf-landing-footer{padding:30px 0;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;background-color:#171717}.pf-landing-footer .row{margin-bottom:0 !important}.pf-landing-footer .pf-social-networks>li{display:inline-block;line-height:1}.pf-landing-footer .pf-social-networks>li a{display:inline-block;background:rgba(99,103,106,0.5);line-height:24px;text-align:center;font-size:14px;margin-right:3px;padding:6px 6px 2px 6px;width:36px}.pf-body[data-script='admin'] .navbar-brand:hover{color:#777}.pf-body[data-script='admin'] .panel{text-align:initial}.pf-body[data-script='admin'] .panel h3 img{position:absolute;right:0;top:0;margin:4px 14px 0 0;border-radius:30%}.pf-body[data-script='admin'] .form-horizontal .panel{color:#adadad}.pf-body[data-script='setup']{user-select:text}.pf-body[data-script='setup'] .navbar-brand:hover{color:#777}.pf-body[data-script='setup'] section{min-height:auto;padding-top:10px;padding-bottom:0;border-bottom:0}.pf-body[data-script='setup'] section:first-of-type{padding-top:60px}.pf-body[data-script='setup'] section:last-of-type{padding-bottom:60px}@media (min-width: 780px){.pf-body[data-script='setup'] section .container{width:760px}}@media (min-width: 1200px){.pf-body[data-script='setup'] section .container{width:1160px}}@media (min-width: 1600px){.pf-body[data-script='setup'] section .container{width:1360px}}.pf-body[data-script='setup'] section .container>.row{margin-bottom:0}.pf-body[data-script='setup'] .pf-landing-pricing-panel{margin-top:10px}.pf-body[data-script='setup'] .panel-heading{padding-right:8px}.pf-body[data-script='setup'] .pf-setup-body-cronjob .panel-footer{display:flex;justify-content:space-around}.pf-body[data-script='setup'] .pf-cron-row-active td:not(:last-child){background-color:#212C30}.pf-body[data-script='setup'] .pf-cron-row-active td:first-child{background-color:#1b2326}.pf-head-breadcrumb{display:inline-block;margin:0}.pf-head-breadcrumb li{display:inline-block;position:relative;cursor:pointer}.pf-head-breadcrumb li:before{content:"";position:absolute;right:-9px;top:-1px;z-index:20;border-left:10px solid #272728;border-top:15px solid transparent;border-bottom:15px solid transparent;transition:0.3s ease}.pf-head-breadcrumb li:after{content:"";position:absolute;right:-10px;top:-1px;z-index:10;border-left:10px solid #63676a;border-top:15px solid transparent;border-bottom:15px solid transparent}.pf-head-breadcrumb li:hover .pf-head-breadcrumb-item{color:#568a89}.pf-head-breadcrumb li:hover .pf-head-breadcrumb-item>img{border-color:#568a89 !important}.pf-head-breadcrumb li:hover:not(:last-of-type) .pf-head-breadcrumb-item{max-width:135px}.pf-head-breadcrumb li:first-of-type .pf-head-breadcrumb-item{padding-left:10px}.pf-head-breadcrumb li:last-of-type .pf-head-breadcrumb-item{padding-right:10px}.pf-head-breadcrumb li:last-of-type:before{display:none}.pf-head-breadcrumb li:last-of-type:after{display:none}.pf-head-breadcrumb li:not(:last-of-type) .pf-head-breadcrumb-item{max-width:60px}.pf-head-breadcrumb li.--empty{pointer-events:none}.pf-head-breadcrumb .pf-head-breadcrumb-item{display:inline-block;vertical-align:middle;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding:0 5px 0 15px;line-height:30px;width:auto;-webkit-transition:color 0.15s ease-out,max-width 0.15s ease-in-out;transition:color 0.15s ease-out,max-width 0.15s ease-in-out;will-change:color, max-width}.pf-head-breadcrumb .pf-head-breadcrumb-item [class^="pf-system-sec-"]{margin-right:5px}.pf-head-breadcrumb .pf-head-breadcrumb-item>.fas:last-of-type,.pf-head-breadcrumb .pf-landing .pf-landing-list li.pf-head-breadcrumb-item>i:last-of-type,.pf-landing .pf-landing-list .pf-head-breadcrumb li.pf-head-breadcrumb-item>i:last-of-type{margin-right:5px !important}#pf-static-logo-svg{opacity:0;position:absolute;z-index:105;overflow:visible}#pf-static-logo-svg path{will-change:fill, opacity, transform, translateZ, translateX, translateY;pointer-events:all;-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.logo-ploygon-top-right{fill:#477372;fill-rule:evenodd;stroke:#477372;stroke-width:0px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1}.logo-ploygon-bottom-left{fill:#5cb85c;fill-rule:evenodd;stroke:#5cb85c;stroke-width:0px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1}.logo-ploygon-bottom-right{fill:#375959;fill-rule:evenodd;stroke:#375959;stroke-width:0px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1}.logo-ploygon-top-left{fill:#63676a;fill-opacity:1;fill-rule:evenodd;stroke:#63676a;stroke-width:0px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1}@-webkit-keyframes bounce{0%, 20%, 50%, 80%, 100%{transform:translateY(0)}40%{transform:translateY(-8px)}60%{transform:translateY(-4px)}}@-moz-keyframes bounce{0%, 20%, 50%, 80%, 100%{transform:translateY(0)}40%{transform:translateY(-8px)}60%{transform:translateY(-4px)}}@-ms-keyframes bounce{0%, 20%, 50%, 80%, 100%{transform:translateY(0)}40%{transform:translateY(-8px)}60%{transform:translateY(-4px)}}@keyframes bounce{0%, 20%, 50%, 80%, 100%{transform:translateY(0)}40%{transform:translateY(-8px)}60%{transform:translateY(-4px)}}#pf-map-tab-element{max-width:2535px;margin:0 auto}.pf-map-move{cursor:move !important}.pf-map-tab-content .pf-map-wrapper{position:relative;resize:vertical;width:100%;height:555px;max-width:2535px;max-height:1000px;min-height:300px;overflow:hidden;padding:5px;background:rgba(43,43,43,0.93);box-shadow:inset -3px 3px 10px 0 rgba(0,0,0,0.3);will-change:width, height;border-bottom-right-radius:5px;border-bottom-left-radius:5px;border-width:1px;border-style:solid;border-color:#313335}.pf-map-tab-content .pf-map-wrapper:before{content:'';position:absolute;bottom:0;right:0;border-style:solid;border-width:14px 14px 0 0;border-color:transparent #313335 transparent transparent;cursor:nwse-resize}.pf-map-tab-content .pf-map-wrapper:focus,.pf-map-tab-content .pf-map-wrapper:hover{border:1px solid #3c3f41}.pf-map-tab-content .pf-map-wrapper:focus:before,.pf-map-tab-content .pf-map-wrapper:hover:before{border-color:transparent #3c3f41 transparent transparent}.pf-map-overlay{position:absolute;display:none;z-index:10000;background:rgba(0,0,0,0.25);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.pf-map-overlay.pf-map-overlay-timer{right:25px;bottom:25px;width:36px;height:38px}.pf-map-overlay.pf-map-overlay-zoom{bottom:25px;left:5px;width:26px;height:52px;padding:2px 4px;display:block}.pf-map-overlay.pf-map-overlay-zoom .pf-zoom-overlay-up,.pf-map-overlay.pf-map-overlay-zoom .pf-zoom-overlay-down{display:block;text-align:center;font-size:16px;cursor:pointer;-webkit-transition:color 0.18s ease-in-out;transition:color 0.18s ease-in-out;will-change:color}.pf-map-overlay.pf-map-overlay-zoom .pf-zoom-overlay-up:hover,.pf-map-overlay.pf-map-overlay-zoom .pf-zoom-overlay-down:hover{color:#c2760c}.pf-map-overlay.pf-map-overlay-zoom .pf-zoom-overlay-up.disabled,.pf-map-overlay.pf-map-overlay-zoom .pf-zoom-overlay-down.disabled{cursor:not-allowed;color:#2b2b2b}.pf-map-overlay.pf-map-overlay-zoom .pf-zoom-overlay-value{display:block;margin-top:2px;text-align:center;font-size:11px;line-height:13px;-webkit-transition:color 0.18s ease-in-out;transition:color 0.18s ease-in-out;will-change:color}.pf-map-overlay.pf-map-overlay-zoom .active{color:#c2760c}.pf-map-overlay.pf-map-overlay-info{top:8px;right:25px;height:36px;min-height:36px;min-width:36px;padding:3px 3px 3px 8px;line-height:26px}.pf-map-overlay.pf-map-overlay-info i{margin:0;margin-top:5px;width:0;height:26px;opacity:0;color:#63676a;transform:scale(0);transform-origin:50% 50% 0px;-webkit-transition:color 0.18s ease-in-out;transition:color 0.18s ease-in-out;cursor:help;will-change:all}.pf-map-overlay.pf-map-overlay-info i.fas,.pf-map-overlay.pf-map-overlay-info .pf-landing .pf-landing-list li>i,.pf-landing .pf-landing-list .pf-map-overlay.pf-map-overlay-info li>i,.pf-map-overlay.pf-map-overlay-info i.far{font-size:20px}.pf-map-overlay.pf-map-overlay-info i.glyphicon{margin-top:1px;font-size:22px;padding-left:3px}.pf-map-overlay.pf-map-overlay-info i.active,.pf-map-overlay.pf-map-overlay-info i:hover{color:#c2760c}.pf-map-overlay.pf-map-overlay-local{top:54px;right:25px;min-height:80px;width:32px;display:block;will-change:width}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content{margin-right:36px;padding:5px 0 5px 5px;overflow:hidden}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content .pf-map-overlay-headline{font-size:12px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;white-space:nowrap}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content .pf-map-overlay-headline .badge{margin-left:5px}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content .pf-map-overlay-headline .pf-system-sec{cursor:default}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content .pf-local-table{font-size:10px}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content .pf-local-table.no-footer{border-bottom:1px solid transparent}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content .pf-local-table td{white-space:nowrap}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content .dataTables_paginate,.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content .dataTables_empty{white-space:nowrap;padding-top:3px}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content .pf-map-overlay-toolbar .pf-map-overlay-toolbar-icon{vertical-align:0;margin-top:14px}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content .pf-map-overlay-toolbar .pf-map-overlay-toolbar-checkbox{display:inline-block;margin-bottom:0}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-main{position:absolute;top:0;right:0;height:100%;padding:3px;width:32px;cursor:pointer;text-align:center;border-left:1px solid #2b2b2b}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-main .pf-map-overlay-local-trigger{margin-bottom:10px}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-main .pf-map-overlay-local-trigger:hover,.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-main .pf-map-overlay-local-trigger.right{color:#c2760c}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-main i{font-size:12px}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-jumps{position:absolute;bottom:5px;width:calc(100% - 6px)}.pf-map-overlay.pf-map-overlay-local .badge{font-family:Arial, sans-serif;background-color:#2b2b2b}.pf-grid-small:before{content:' ';display:block;position:absolute;left:0;top:0;width:100%;height:100%;opacity:0.6;background:url('data:image/png;base64,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') !important}.jtk-drag-select .pf-map{cursor:grab !important}.jtk-drag-select .pf-map .pf-system{cursor:grab !important}.jtk-drag-select .pf-map .pf-system .pf-system-head{cursor:grab !important}.pf-map{width:2500px;height:1500px;position:relative;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;will-change:transform}.pf-map .jtk-hover:not(.jtk-overlay){animation-duration:1s;animation-delay:0.5s;animation-fill-mode:both;animation-timing-function:linear;animation-iteration-count:infinite;animation-name:bounce}.pf-map .jtk-source-hover,.pf-map .jtk-target-hover{animation-duration:1s;animation-delay:0.5s;animation-fill-mode:both;animation-timing-function:linear;animation-iteration-count:infinite;animation-name:bounce;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.3);box-shadow:0 6px 12px rgba(0,0,0,0.3)}.pf-map .pf-system{position:absolute;min-width:60px;height:auto;overflow:hidden;background-color:#313335;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;z-index:100;will-change:top, left, opacity, transform;border-width:2px;border-style:solid;border-color:#63676a;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-webkit-transition:border-color 0.2s ease-out,box-shadow 0.12s ease-out,opacity 0.12s ease-out;transition:border-color 0.2s ease-out,box-shadow 0.12s ease-out,opacity 0.12s ease-out;-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.pf-map .pf-system:hover{-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.3);box-shadow:0 6px 12px rgba(0,0,0,0.3);-moz-transform:translate3d(0, -1px, 0) !important;-ms-transform:translate3d(0, -1px, 0) !important;-webkit-transform:translate3d(0, -1px, 0) !important;transform:translate3d(0, -1px, 0) !important}.pf-map .pf-system .pf-system-head{padding:0 3px 0 3px;cursor:pointer;font-family:Arial, sans-serif;font-weight:bold;white-space:nowrap}.pf-map .pf-system .pf-system-head .pf-system-head-name{border:none;display:inline-block;min-width:50px;color:#adadad;margin-right:2px}.pf-map .pf-system .pf-system-head .pf-system-head-counter{display:inline-block;text-align:right;min-width:8px;margin-right:1px;color:#5cb85c;cursor:help}.pf-map .pf-system .pf-system-head .pf-system-head-counter:empty{display:none}.pf-map .pf-system .pf-system-head .pf-system-effect{font-size:11px}.pf-map .pf-system .pf-system-head .fa-lock{font-size:11px;display:none}.pf-map .pf-system .pf-system-head .pf-system-head-expand{margin-left:2px;color:#63676a;width:10px;display:none}.pf-map .pf-system .pf-system-head .editable-empty{font-style:normal}.pf-map .pf-system .pf-system-head-info{display:flex;color:#7c8184;font-size:10px;line-height:10px;padding-right:1px;margin-bottom:2px}.pf-map .pf-system .pf-system-head-info [class^="pf-system-sec-"]{cursor:help}.pf-map .pf-system .pf-system-head-info-left{flex:1}.pf-map .pf-system .pf-system-head-info-right{flex:1;text-align:right}.pf-map .pf-system .pf-system-body{height:0px;width:100%;overflow:hidden;cursor:-moz-grab;cursor:-webkit-grab;cursor:grab;padding:0 4px;white-space:nowrap;display:none;will-change:width;border-top-width:1px;border-top-style:dashed;border-top-color:#63676a}.pf-map .pf-system .pf-system-body .pf-system-body-item{position:relative;color:#7c8184;font-size:10px;line-height:16px;height:16px}.pf-map .pf-system .pf-system-body .pf-system-body-item .pf-system-body-right{float:right;color:#f0ad4e;width:50px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;display:none}.pf-map .pf-system .pf-system-body .pf-system-body-item .pf-user-status{font-size:6px;width:10px;vertical-align:middle}.pf-map .pf-system .pf-system-body .pf-system-body-item .pf-system-body-item-name{position:absolute;display:inline-block;width:calc(100% - 10px);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.pf-map .pf-system .tooltip.in{opacity:1}.pf-map .pf-system .tooltip .tooltip-inner{color:#313335;background-color:#adadad;padding:3px 3px}.pf-map .pf-system-active:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target){-webkit-box-shadow:#ffb 0px 0px 8px 0px;box-shadow:#ffb 0px 0px 8px 0px}.pf-map .pf-system-selected:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target),.pf-map .jtk-drag:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target){-webkit-box-shadow:#58100d 0px 0px 8px 0px;box-shadow:#58100d 0px 0px 8px 0px;background-color:#58100d}.pf-map .pf-system-selected:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target) .pf-system-head,.pf-map .jtk-drag:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target) .pf-system-head,.pf-map .pf-system-selected:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target) .pf-system-body,.pf-map .jtk-drag:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target) .pf-system-body{background-color:#58100d}.pf-map .pf-system-locked .pf-system-sec{cursor:default !important}.pf-map .pf-system-locked .pf-system-body{cursor:default !important}.pf-map .pf-system-locked .fa-lock{color:#63676a !important;display:inline-block !important}.pf-map .pf-system-debug{position:absolute;color:#fff;font-size:10px;line-height:22px;text-align:center;pointer-events:none;font-family:Oxygen, Arial, sans-serif;z-index:500}.pf-map .pf-system-debug:before{content:attr(data-depth);font-family:Oxygen, Arial, sans-serif;position:absolute;line-height:10px;top:1px;left:2px;color:#000}.pf-map .jtk-endpoint{z-index:90}.pf-map .jtk-endpoint svg circle{-webkit-transition:stroke 0.18s ease-out,fill 0.18s ease-out;transition:stroke 0.18s ease-out,fill 0.18s ease-out}.pf-map .jtk-endpoint svg *{stroke:#63676a;cursor:pointer}.pf-map .jtk-endpoint:hover circle{stroke:#e28a0d !important}.pf-map .jtk-endpoint.jtk-hover{z-index:95}.pf-map .jtk-endpoint.jtk-hover.pf-map-endpoint-bubble:after{filter:drop-shadow(-3px 3px 4px rgba(0,0,0,0.3));animation-iteration-count:infinite;animation-delay:0.5s}.pf-map .jtk-endpoint:after{content:url("../../img/bubble.svg");position:absolute;display:block;pointer-events:none;top:-8px;left:-8px;width:30px;height:30px;z-index:-1;will-change:opacity, transform;animation-name:pfBubblePop;animation-duration:0.09s;animation-timing-function:cubic-bezier(0.16, 0.87, 0.48, 0.99);animation-fill-mode:forwards;animation-iteration-count:1}.pf-map .pf-map-endpoint-bubble:after{display:block;animation-name:pfBubbleWobble;animation-duration:1s;animation-timing-function:linear;animation-iteration-count:1;animation-fill-mode:both}.pf-map .jtk-endpoint-drop-allowed circle{stroke:#5cb85c !important;fill:#5cb85c !important}.pf-map .jtk-endpoint-drop-forbidden circle{stroke:#a52521 !important;fill:#a52521 !important}.pf-map .jtk-connector{z-index:40;cursor:pointer;overflow:unset;-webkit-transition:stroke 0.18s ease-out,opacity 0.18s ease-out;transition:stroke 0.18s ease-out,opacity 0.18s ease-out;will-change:all}.pf-map .jtk-connector path{-webkit-transition:stroke 0.18s ease-out;transition:stroke 0.18s ease-out}.pf-map .jtk-connector.jtk-hover{z-index:80;filter:drop-shadow(-3px 3px 4px rgba(0,0,0,0.3))}.pf-map .jtk-connector.jtk-hover path:first-child{stroke:#eaeaea}.pf-map .jtk-connector.jtk-dragging{z-index:80;opacity:0.4}.pf-map .pf-map-connection-abyssal{z-index:40}.pf-map .pf-map-connection-abyssal path:first-child{stroke:rgba(255,255,255,0)}.pf-map .pf-map-connection-abyssal path:nth-child(2){stroke:#5a225a}.pf-map .pf-map-connection-abyssal.jtk-hover path:first-child{stroke:rgba(255,255,255,0)}.pf-map .pf-map-connection-abyssal.jtk-hover path:nth-child(2){stroke:#eaeaea}.pf-map .pf-map-connection-jumpbridge{z-index:50}.pf-map .pf-map-connection-jumpbridge path:first-child{stroke:rgba(255,255,255,0)}.pf-map .pf-map-connection-jumpbridge path:nth-child(2){stroke:#568a89}.pf-map .pf-map-connection-jumpbridge.jtk-hover path:first-child{stroke:rgba(255,255,255,0)}.pf-map .pf-map-connection-jumpbridge.jtk-hover path:nth-child(2){stroke:#eaeaea}.pf-map .pf-map-connection-stargate{z-index:60}.pf-map .pf-map-connection-stargate path:first-child{stroke:#63676a}.pf-map .pf-map-connection-stargate path:nth-child(2){stroke:#313966}.pf-map .pf-map-connection-wh-fresh,.pf-map .pf-map-connection-wh-reduced,.pf-map .pf-map-connection-wh-critical,.pf-map .pf-map-connection-wh-eol{z-index:70}.pf-map .pf-map-connection-wh-eol path:first-child{stroke:#d747d6}.pf-map .pf-map-connection-wh-reduced path:nth-child(2){stroke:#e28a0d}.pf-map .pf-map-connection-wh-critical path:nth-child(2){stroke:#a52521}.pf-map .pf-map-connection-wh-size-s path:nth-child(2),.pf-map .pf-map-connection-wh-size-m path:nth-child(2){stroke-linecap:square !important}.pf-map .pf-map-connection-active{filter:drop-shadow(0px 0px 3px #ffb) !important}.pf-map .pf-map-connection-process{opacity:0.4 !important}.pf-map .pf-map-connection-process path{pointer-events:none}.pf-map .jtk-overlay{opacity:1;pointer-events:none;will-change:opacity;-webkit-transition:opacity 0.18s ease-out;transition:opacity 0.18s ease-out}.pf-map .jtk-overlay.jtk-hover:not(.debug){opacity:0 !important}.pf-map .pf-map-component-overlay,.pf-map .pf-map-connection-state-overlay{font-size:11px;z-index:1020;background-color:#3c3f41;color:#adadad}.pf-map .pf-map-component-overlay{line-height:14px;padding:1px 4px;-moz-border-radius:6px;-webkit-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 6px rgba(0,0,0,0.3);box-shadow:0 3px 6px rgba(0,0,0,0.3)}.pf-map .pf-map-component-overlay.small{-webkit-font-smoothing:antialiased;font-family:Arial, sans-serif;padding:1px 2px;line-height:12px;min-width:14px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.pf-map .pf-map-component-overlay.icon{font-size:12px;line-height:12px;padding:0;width:12px;height:12px;overflow:hidden;text-align:center;-moz-border-radius:50%;-webkit-border-radius:50%;border-radius:50%}.pf-map .pf-map-component-overlay.debug{background-color:#3e264e;opacity:0.8}.pf-map .pf-map-connection-state-overlay{background-color:transparent;font-size:12px;width:15px;height:15px;opacity:0.4 !important;z-index:1030}.pf-map .frig{background-color:#f0ad4e;color:#1d1d1d}.pf-map .mass{background-color:#a52521;color:#eaeaea}.pf-map .eol{background-color:#3c3f41;color:#d747d6}.pf-map .pf-map-connection-arrow-overlay-success .pf-map-connection-arrow-overlay{stroke:#313335;fill:#5cb85c}.pf-map .pf-map-connection-arrow-overlay-danger .pf-map-connection-arrow-overlay{stroke:#313335;fill:#d9534f;animation-name:pfPulseDanger;animation-duration:4s;animation-iteration-count:infinite}.pf-map-drag-to-select{background:#375959 !important;display:block;visibility:hidden;opacity:0;z-index:9000;border:1px dashed #adadad;pointer-events:none;will-change:left, top, width, height, opacity;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-webkit-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.pf-map-drag-to-select.active{visibility:visible;opacity:0.3}.ui-dialog-content label,.ui-dialog-content .editable-input .editable-checklist>div>label>span,.editable-input .ui-dialog-content .editable-checklist>div>label>span{min-width:60px}.dropdown-menu{min-width:150px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;z-index:1050;will-change:opacity, top, left, transform}.dropdown-menu a{cursor:pointer}.dropdown-menu i{width:20px;pointer-events:none}.dropdown-menu i.fa-char:before{font-weight:bolder}.dropdown-menu:not(.dropdown-submenu-left) .dropdown-menu{border-top-left-radius:0;border-bottom-left-radius:0;clip-path:inset(-12px -12px -12px 0px)}.dropdown-menu[role]>li:not(.disabled){position:relative}.dropdown-menu[role]>li:not(.disabled):before{content:'';position:absolute;left:0;background-color:#5cb85c;opacity:0;-webkit-transition:left 0.15s ease-out,opacity 0.15s ease-out;transition:left 0.15s ease-out,opacity 0.15s ease-out;will-change:opacity,left;width:2px;height:100%}.dropdown-menu[role]>li:not(.disabled):hover:before,.dropdown-menu[role]>li:not(.disabled).active:before{left:-4px;opacity:1}.dropdown-menu>li.disabled{cursor:not-allowed;pointer-events:none}.dropdown-menu>li>a{padding:3px 8px}.dropdown-menu.dropdown-submenu-left>.dropdown-submenu>.dropdown-menu{left:-100%;border-top-right-radius:0;border-bottom-right-radius:0;clip-path:inset(-12px 0 -12px -12px)}.pf-system-tooltip-inner{color:#adadad;padding:2px 4px;min-width:25px;-webkit-transition:color 0.2s ease-out;transition:color 0.2s ease-out}.pf-system-info-module h5{text-transform:capitalize}.pf-system-info-module>.row>div:not(:first-child){padding-left:0}.pf-system-info-module .pf-system-sov-section .pf-dynamic-area{min-height:123px}@media (max-width: 779px){.pf-system-info-module .pf-system-description-section{padding-left:10px !important;margin-top:10px}}.pf-system-info-module .pf-system-info-name-cell{user-select:all}.pf-system-info-module .pf-system-info-svg{position:absolute;margin:2px 0}.pf-system-info-module .pf-system-sov-fw-percentage{border-top-color:transparent}.pf-system-info-module .pf-system-sov-fw-status-icon{margin-left:20px;color:var(--color)}.pf-system-info-module .pf-system-sov-fw-contested-row,.pf-system-info-module .pf-system-sov-fw-occupation-row{display:none}.pf-system-info-module .pf-system-info-description-area{min-height:123px;padding:0}.pf-system-info-module .pf-system-info-description-area .pf-system-info-description-button{position:absolute;right:10px;top:13px}.pf-system-info-module .pf-system-info-description-area .pf-system-info-description{padding:10px;user-select:text}.pf-system-info-module .pf-system-info-description-area .note-toolbar kbd{padding:3px 4px}.pf-system-info-module .pf-system-info-description-area .note-toolbar .note-customBtn{float:right}.pf-system-info-module .pf-system-info-description-area .note-toolbar:before,.pf-system-info-module .pf-system-info-description-area .note-toolbar:after{content:" ";display:table}.pf-system-info-module .pf-system-info-description-area .note-toolbar:after{clear:both}.pf-system-info-module .pf-system-info-description>h2:first-child,.pf-system-info-module .pf-system-info-description>h3:first-child,.pf-system-info-module .note-editable>h2:first-child,.pf-system-info-module .note-editable>h3:first-child{margin-top:0 !important}.pf-system-info-module .pf-system-info-description h2:before,.pf-system-info-module .pf-system-info-description h3:before,.pf-system-info-module .note-editable h2:before,.pf-system-info-module .note-editable h3:before{font-family:"Font Awesome 5 Free";content:"\f105";font-weight:bold;display:inline-block;margin-right:3px}.pf-system-info-module .pf-system-info-description h2,.pf-system-info-module .note-editable h2{font-size:16px;margin:15px 0}.pf-system-info-module .pf-system-info-description h3,.pf-system-info-module .note-editable h3{font-size:14px;margin:10px 0}.pf-system-info-module .pf-system-info-description a:after,.pf-system-info-module .note-editable a:after{font-family:"Font Awesome 5 Free";content:"\f35d";font-size:70%;vertical-align:top;font-weight:bold;display:inline-block;margin-left:2px}.pf-system-info-module .pf-system-info-description hr,.pf-system-info-module .note-editable hr{border-top:1px solid #313335}.pf-system-info-module .pf-system-info-description blockquote,.pf-system-info-module .note-editable blockquote{padding:5px 10px;margin:0 0 10px;font-size:13px;border-left:3px solid #477372}.pf-system-info-module .pf-system-info-description ol,.pf-system-info-module .pf-system-info-description ul,.pf-system-info-module .note-editable ol,.pf-system-info-module .note-editable ul{padding-left:20px}.pf-system-info-module .pf-system-info-description ul,.pf-system-info-module .note-editable ul{list-style:disc}.pf-system-info-module .pf-system-info-description ol,.pf-system-info-module .note-editable ol{list-style:decimal}.modal.link-dialog .checkbox,.modal.link-dialog .editable-input .editable-checklist>div>label,.editable-input .modal.link-dialog .editable-checklist>div>label{display:none}.pf-system-signature-module .progress-label-right{margin-right:20px;vertical-align:middle;font-size:11px}.pf-system-signature-module .pf-system-progress-scanned{display:inline-block;margin-left:20px;width:calc(100% - 225px)}.pf-system-signature-module .pf-system-progress-scanned .progress{margin-bottom:3px}.pf-system-signature-module .pf-sig-table-clear-button{will-change:opacity, transform;display:none;color:#a52521}.pf-system-signature-module .pf-sig-table{font-size:10px}.pf-system-signature-module .pf-sig-table .editable-container.editable-inline{display:inline}.pf-system-signature-module .pf-sig-table .editable-container.editable-inline .control-group{display:inline}.pf-system-signature-module .pf-sig-table .editable-container.editable-inline .control-group .editable-input{display:inline}.pf-system-signature-module .pf-sig-table .pf-editable-description{width:100%;background-color:#2b2b2b;max-height:50px;font-size:11px;line-height:14px;padding:3px 6px}.pf-system-signature-module .pf-sig-table-secondary th{pointer-events:none}.pf-system-signature-module .pf-sig-table-secondary th:after{display:none !important}.pf-system-signature-module .pf-sig-table-secondary th.pf-table-counter-cell{color:transparent}.pf-system-graph-module .pf-module-head h5.pull-right{margin-right:5px}.pf-system-graph-module .pf-system-graph{position:relative;width:100%;height:100px;display:flex;justify-content:center;align-items:center;-webkit-transition:height 0.18s ease-out;transition:height 0.18s ease-out}.pf-system-route-module .pf-system-route-table{width:100%;font-size:10px}.pf-system-route-module .pf-system-route-table td{text-transform:capitalize}.pf-system-route-module .pf-system-route-table td .pf-fake-connection{display:none;width:12px;height:3px;cursor:pointer}.pf-system-route-module .pf-system-route-table td .pf-fake-connection[data-disabled]{cursor:initial}.pf-system-route-module .pf-system-route-table td .pf-fake-connection[class*=' pf-map-connection-wh-size-']{width:25px}.pf-system-route-module .pf-system-route-table td .pf-fake-connection:after{font-size:10px}.pf-system-route-module .pf-system-route-table td .pf-fake-connection.pf-map-connection-preserve-mass:after{content:"\f071";font-family:"Font Awesome 5 Free";font-style:normal;font-weight:bold;left:calc(50% - 7px)}.pf-system-route-module .pf-system-route-table td.pf-table-jump-cell .pf-fake-connection{display:inline-block}.pf-system-intel-module .pf-system-station-table,.pf-system-intel-module .pf-system-structure-table{font-size:10px}.pf-system-intel-module .pf-module-head:not(:first-child){margin-top:15px}.pf-system-killboard-module .pf-system-killboard-label-recent{display:none}.pf-system-killboard-module .pf-system-killboard-list{padding-bottom:5px}.pf-system-killboard-module .pf-system-killboard-list>li{padding-left:0;overflow:visible;min-height:50px;will-change:transform, opacity, margin-left;-webkit-transition:padding-left 0.12s cubic-bezier(0.3, 0.8, 0.8, 1.7);transition:padding-left 0.12s cubic-bezier(0.3, 0.8, 0.8, 1.7)}.pf-system-killboard-module .pf-system-killboard-list>li h5{white-space:nowrap}.pf-system-killboard-module .pf-system-killboard-list>li h3{width:120px;display:inline-block}.pf-system-killboard-module .pf-system-killboard-list>li .pf-system-killboard-img-char{display:inline;width:32px;margin-top:9px;margin-right:10px;border:1px solid #2b2b2b;will-change:border-color;-moz-border-radius:50%;-webkit-border-radius:50%;border-radius:50%;-webkit-transition:border-color 0.12s ease-out;transition:border-color 0.12s ease-out}.pf-system-killboard-module .pf-system-killboard-list>li .pf-system-killboard-img-char:hover{border-color:#568a89}.pf-system-killboard-module .pf-system-killboard-list>li .pf-system-killboard-img-corp,.pf-system-killboard-module .pf-system-killboard-list>li .pf-system-killboard-img-ally{display:inline;width:20px;margin-right:10px;border:1px solid #2b2b2b;will-change:border-color;-moz-border-radius:50%;-webkit-border-radius:50%;border-radius:50%;-webkit-transition:border-color 0.12s ease-out;transition:border-color 0.12s ease-out}.pf-system-killboard-module .pf-system-killboard-list>li .pf-system-killboard-img-corp:hover,.pf-system-killboard-module .pf-system-killboard-list>li .pf-system-killboard-img-ally:hover{border-color:#568a89}.pf-system-killboard-module .pf-system-killboard-list>li .pf-system-killboard-img-ship{width:50px;margin-right:10px;border:1px solid #2b2b2b;will-change:border-color;-moz-border-radius:50%;-webkit-border-radius:50%;border-radius:50%;-webkit-transition:border-color 0.12s ease-out;transition:border-color 0.12s ease-out}.pf-system-killboard-module .pf-system-killboard-list>li .pf-system-killboard-img-ship:hover{border-color:#568a89}.pf-system-killboard-module .pf-system-killboard-list>li:before{content:"\f054";font-family:"Font Awesome 5 Free";font-weight:bold;position:absolute;z-index:10;left:-18px;top:16px;color:#477372;opacity:0;will-change:opacity, left;-webkit-transition:all 0.12s ease-out;transition:all 0.12s ease-out}.pf-system-killboard-module .pf-system-killboard-list>li:hover{padding-left:10px}.pf-system-killboard-module .pf-system-killboard-list>li:hover:before{opacity:1;left:-3px}.pf-system-killboard-module .pf-module-control-area{margin-bottom:0}.pf-connection-info-module>.row{display:flex;align-items:stretch;flex-wrap:wrap}.pf-connection-info-module .pf-connection-info-table{width:100%;font-size:10px}input,select{background-color:#313335;color:#adadad;border:1px solid #63676a;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}input:focus,select:focus{border-color:#568a89}input:-webkit-autofill,select:-webkit-autofill{background-color:#313335 !important;-webkit-box-shadow:0 0 0 50px #313335 inset !important;box-shadow:0 0 0 50px #313335 inset !important;-webkit-text-fill-color:#adadad}input:-webkit-autofill:focus,select:-webkit-autofill:focus{-webkit-box-shadow:0 0 0 50px #313335 inset !important;box-shadow:0 0 0 50px #313335 inset !important;-webkit-text-fill-color:#adadad}input[disabled]::-moz-placeholder,select[disabled]::-moz-placeholder{color:transparent;opacity:1}input[disabled]:-ms-input-placeholder,select[disabled]:-ms-input-placeholder{color:transparent}input[disabled]::-webkit-input-placeholder,select[disabled]::-webkit-input-placeholder{color:transparent}input.pf-select2,select.pf-select2{height:32px;padding:6px 12px}input[type='number']::-webkit-inner-spin-button,input[type='number']::-webkit-outer-spin-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;margin:0;display:none}input[type='file']::-webkit-file-upload-button{background-color:transparent;border:none;color:#63676a;outline:none}textarea{min-height:32px;max-height:400px;resize:vertical}fieldset[disabled] .form-control{color:#63676a}fieldset[disabled] .form-control::-moz-placeholder{color:transparent;opacity:1}fieldset[disabled] .form-control:-ms-input-placeholder{color:transparent}fieldset[disabled] .form-control::-webkit-input-placeholder{color:transparent}fieldset[disabled] .input-icon-left .fa-stack i:last-child,fieldset[disabled] .input-icon-right .fa-stack i:last-child{color:#3c3f41}#select2-pf-map-dialog-edit-icon-select-container,#select2-pf-map-dialog-new-icon-select-container,#select2-pf-map-dialog-new-icon-select-results,#select2-pf-map-dialog-edit-icon-select-results,.pf-form-icon-field{font-family:"Font Awesome 5 Free";font-weight:bold}#select2-pf-map-dialog-edit-icon-select-container option,#select2-pf-map-dialog-new-icon-select-container option,#select2-pf-map-dialog-new-icon-select-results option,#select2-pf-map-dialog-edit-icon-select-results option,.pf-form-icon-field option{font-family:inherit;font-weight:inherit}.input-icon-left:not(.input-icon-right) .fa-stack:first-child{left:14px}.input-icon-right:not(.input-icon-left) .fa-stack:first-child{right:14px}.input-icon-left.input-icon-right .fa-stack:first-child{left:14px}.input-icon-left.input-icon-right .fa-stack:nth-child(2){right:14px}.input-icon-left .fa-stack,.input-icon-right .fa-stack{position:absolute;top:4px}.input-icon-left .fa-stack i:first-child,.input-icon-right .fa-stack i:first-child{color:#63676a}.input-icon-left .fa-stack i:last-child,.input-icon-right .fa-stack i:last-child{color:#313335}.btn .btn-progress{position:absolute;display:block;height:100%;background-color:rgba(92,184,92,0.2);max-width:100%;width:0;top:0;left:0;overflow:hidden;line-height:30px;color:#f0ad4e;font-size:10px;text-align:left;-webkit-transition:width 0.1s linear;transition:width 0.1s linear}.pf-form-dropzone{border:2px dashed #2b2b2b;height:100px;background-color:#353739;text-align:center;font-size:20px;line-height:100px;margin:15px 0;color:#2b2b2b;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;-webkit-transition:color 0.18s ease-out,border-color 0.18s ease-out;transition:color 0.18s ease-out,border-color 0.18s ease-out}.pf-form-dropzone:hover{color:#568a89;border-color:#568a89;cursor:-moz-grabbing;cursor:-webkit-grabbing;cursor:grabbing}.toggle.btn:active{box-shadow:none}.pf-form-field-char-count{display:block;margin-top:10px}.modal-content h2,.panel-body h2{font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif;letter-spacing:0;font-size:14px;margin:20px 0 10px 0;line-height:normal}.modal-content h2.pf-dynamic-area,.modal-content h4.pf-dynamic-area,.panel-body h2.pf-dynamic-area,.panel-body h4.pf-dynamic-area{min-height:0;margin:0 0 10px 0}.modal-content h2.pf-dynamic-area>img,.modal-content h4.pf-dynamic-area>img,.panel-body h2.pf-dynamic-area>img,.panel-body h4.pf-dynamic-area>img{margin:-10px 5px -10px -10px;width:35px}.modal-content h2[data-toggle="collapse"],.modal-content h4[data-toggle="collapse"],.panel-body h2[data-toggle="collapse"],.panel-body h4[data-toggle="collapse"]{cursor:pointer}.modal-content h2[data-toggle="collapse"]:hover:after,.modal-content h4[data-toggle="collapse"]:hover:after,.panel-body h2[data-toggle="collapse"]:hover:after,.panel-body h4[data-toggle="collapse"]:hover:after{color:#e28a0d !important}.modal-content h2[data-toggle="collapse"]:after,.modal-content h4[data-toggle="collapse"]:after,.panel-body h2[data-toggle="collapse"]:after,.panel-body h4[data-toggle="collapse"]:after{content:"\f078";font-family:"Font Awesome 5 Free";font-style:normal;font-weight:bold;font-size:13px;padding-right:10px;position:absolute;color:#e28a0d;top:10px;right:6px;will-change:transform, color}.modal-content h2[data-toggle="collapse"].collapsed:after,.modal-content h4[data-toggle="collapse"].collapsed:after,.panel-body h2[data-toggle="collapse"].collapsed:after,.panel-body h4[data-toggle="collapse"].collapsed:after{top:13px;right:5px;color:#63676a;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.modal-content .dataTables_wrapper+.alert{margin-top:10px}.modal-content .dataTable,.modal-content .table{font-size:10px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.modal-content hr{margin:5px 0 15px 0;border-color:#63676a}.modal-content .well{margin-bottom:0}.modal-content .well .list-inline{margin-bottom:0}.modal-content .pf-wizard-navigation{margin:0}.modal-content .pf-wizard-navigation li:not(:last-child):before{border-top:1px solid #63676a;content:"";display:block;font-size:0;overflow:hidden;position:relative;top:12px;left:71px;right:1px;width:100%}.modal-content .pf-wizard-navigation li.finished:before{-moz-border-image:-moz-linear-gradient(left, #375959,#375959) 1 1%;-moz-border-image:linear-gradient(to right, #375959,#375959) 1 1%;-o-border-image:linear-gradient(to right, #375959,#375959) 1 1%;-webkit-border-image:-webkit-linear-gradient(left, #375959,#375959) 1 1%;-webkit-border-image:linear-gradient(to right, #375959,#375959) 1 1%;border-image:-moz-linear-gradient(left, #375959,#375959) 1 1%;border-image:-webkit-linear-gradient(left, #375959,#375959) 1 1%;border-image:linear-gradient(to right, #375959,#375959) 1 1%;border-bottom:0}.modal-content .pf-wizard-navigation li.active:before{-moz-border-image:-moz-linear-gradient(left, #4f9e4f,#63676a) 1 1%;-moz-border-image:linear-gradient(to right, #4f9e4f,#63676a) 1 1%;-o-border-image:linear-gradient(to right, #4f9e4f,#63676a) 1 1%;-webkit-border-image:-webkit-linear-gradient(left, #4f9e4f,#63676a) 1 1%;-webkit-border-image:linear-gradient(to right, #4f9e4f,#63676a) 1 1%;border-image:-moz-linear-gradient(left, #4f9e4f,#63676a) 1 1%;border-image:-webkit-linear-gradient(left, #4f9e4f,#63676a) 1 1%;border-image:linear-gradient(to right, #4f9e4f,#63676a) 1 1%;border-bottom:0}.modal-content .pf-wizard-navigation li>h6{color:#63676a;font-size:11px;margin:5px}.modal-content .pf-wizard-navigation li a:hover+h6{color:#adadad}.modal-content .pf-wizard-navigation li.active a:not(.btn-danger)+h6{color:#adadad}#pf-settings-dialog .form-group .btn-sm,#pf-settings-dialog .form-group .btn-group-sm>.btn{padding:4px 7px 3px}#pf-settings-dialog #pf-dialog-captcha-wrapper{margin:0;padding:3px 0}#pf-map-dialog #pf-map-dialog-character-select,#pf-map-dialog #pf-map-dialog-corporation-select,#pf-map-dialog #pf-map-dialog-alliance-select{width:535px}#pf-route-dialog #pf-route-dialog-map-select{width:300px !important}#pf-shortcuts-dialog td kbd+i{width:16px}#pf-shortcuts-dialog td kbd:last-of-type+i{display:none}#pf-manual-scrollspy{position:relative;height:700px;overflow:auto}#pf-manual-scrollspy .list-unstyled.well,#pf-manual-scrollspy .well.list-inline{display:inline-block}#pf-system-dialog .form-control-static.pf-dynamic-area{padding:7px;min-height:32px}.pf-system-dialog-select{width:300px !important}#pf-task-dialog .pf-task-dialog-status{min-height:inherit}#pf-task-dialog h4>small.pull-right{font-family:Arial, sans-serif;font-weight:bold;margin-top:-5px}#pf-map-info-logs{margin-bottom:10px}#pf-stats-dialog .pf-dynamic-area{margin-bottom:10px}#pf-structure-dialog #pf-structure-dialog-corporation-select,#pf-structure-dialog #pf-structure-dialog-type-select{width:267px !important}#pf-connection-info-dialog #pf-connection-info-dialog-type-select,#pf-connection-info-dialog #pf-connection-info-dialog-character-select{width:310px !important}.pf-sig-reader-dialog h4{margin-top:8px}.pf-sig-reader-dialog h4 .pf-system-progress-scanned{display:inline-block;margin-left:20px;width:calc(100% - 255px)}.pf-sig-reader-dialog h4 .pf-system-progress-scanned .progress{margin-bottom:2px}.pf-sig-reader-dialog h4 .progress-label-right{margin-left:8px;vertical-align:middle;font-size:11px;opacity:0.65}.pf-sig-reader-dialog .fa-tree-child+.checkbox,.pf-sig-reader-dialog .editable-input .editable-checklist>div>.fa-tree-child+label,.editable-input .pf-sig-reader-dialog .editable-checklist>div>.fa-tree-child+label{margin-left:5px;display:inline-block}.pf-sig-reader-dialog #pf-sig-info{margin-bottom:10px}.pf-sig-reader-dialog .pf-sig-table-info tbody{pointer-events:none}.pf-sig-reader-dialog .pf-sig-table-info .editable-click.editable-disabled{color:inherit}.pf-jump-info-dialog blockquote{margin-top:15px;margin-bottom:5px}.pf-changelog-dialog .pf-dynamic-message-container{margin-bottom:20px}.pf-system-effect-dialog .dataTable{border-collapse:collapse}.pf-credits-dialog .pf-credits-logo-background{overflow:visible;background:url("../../img/logo_bg.png");background-size:cover;padding:20px;margin-bottom:20px}.pf-credits-dialog #pf-logo-container{width:355px;height:366px;margin:0 auto}.pf-credits-dialog .pf-dynamic-area{min-height:50px}.pf-credits-dialog .dl-horizontal{display:inline-block;width:48%}.pf-credits-dialog .btn{padding:0}.pf-credits-dialog blockquote{font-size:14px}.pf-log-graph{height:100px;width:100%}.timeline{list-style:none;position:relative}.timeline:before{top:0;bottom:0;position:absolute;content:" ";width:1px;left:50%;margin-top:20px;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzRmOWU0ZiIvPjxzdG9wIG9mZnNldD0iMjUlIiBzdG9wLWNvbG9yPSIjNjM2NzZhIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0idXJsKCNncmFkKSIgLz48L3N2Zz4g');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4f9e4f),color-stop(25%, #63676a));background-image:-moz-linear-gradient(top, #4f9e4f,#63676a 25%);background-image:-webkit-linear-gradient(top, #4f9e4f,#63676a 25%);background-image:linear-gradient(to bottom, #4f9e4f,#63676a 25%)}.timeline>li{margin-bottom:20px;position:relative}.timeline>li.timeline-first .timeline-title{color:#4f9e4f}.timeline>li.timeline-first .timeline-badge{background-color:#4f9e4f}.timeline>li:before,.timeline>li:after{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li:before,.timeline>li:after{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li>.timeline-panel{width:47%;float:left;border:1px solid #313335;padding:8px;position:relative;background-color:#313335;font-size:11px;-webkit-box-shadow:0 4px 10px rgba(0,0,0,0.4);box-shadow:0 4px 10px rgba(0,0,0,0.4);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.timeline>li>.timeline-panel:before{content:" ";position:absolute;top:10px;right:-8px;display:inline-block;border-top:7px solid transparent;border-left:7px solid #63676a;border-right:0 solid #63676a;border-bottom:7px solid transparent}.timeline>li>.timeline-panel:after{content:" ";position:absolute;top:10px;right:-8px;display:inline-block;border-top:7px solid transparent;border-left:7px solid #63676a;border-right:0 solid #63676a;border-bottom:7px solid transparent}.timeline>li>.timeline-badge{color:#2b2b2b;width:23px;height:23px;line-height:23px;text-align:center;position:absolute;top:6px;left:50%;margin-left:-11px;background-color:#63676a;z-index:100;-moz-border-radius:50%;-webkit-border-radius:50%;border-radius:50%}.timeline>li>.timeline-badge>i{vertical-align:middle}.timeline>li.timeline-inverted>.timeline-panel{float:right}.timeline>li.timeline-inverted>.timeline-panel:before{border-left-width:0;border-right-width:7px;left:-8px;right:auto}.timeline>li.timeline-inverted>.timeline-panel:after{border-left-width:0;border-right-width:8px;left:-9px;right:auto}.timeline-title{margin-top:0;color:inherit}.timeline-body>hr{display:none}.timeline-body>hr ~ *{display:none}.timeline-body>p,.timeline-body>ul{margin-bottom:0;list-style-type:disc;margin-left:15px}.timeline-body>p+p{margin-top:5px}.timeline-footer>.timeline-title{margin-top:10px;margin-bottom:0}@media (max-width: 1200px){ul.timeline:before{left:40px}ul.timeline>li>.timeline-panel{width:calc(100% - 62px)}ul.timeline>li>.timeline-badge{left:29px;margin-left:0;top:6px}ul.timeline>li>.timeline-panel{float:right}ul.timeline>li>.timeline-panel:before{border-left-width:0;border-right-width:7px;left:-8px;right:auto}ul.timeline>li>.timeline-panel:after{border-left-width:0;border-right-width:7px;left:-8px;right:auto}}.popover{z-index:1060;max-width:600px}.popover .arrow{pointer-events:none}.popover .popover-title{text-transform:capitalize;font-family:"Arial","Oxygen Bold","Helvetica Neue",Helvetica,sans-serif;font-weight:bold}.popover .popover-title kbd{line-height:90%;vertical-align:middle;box-shadow:none}.popover .popover-content{font-family:"Arial","Oxygen Bold","Helvetica Neue",Helvetica,sans-serif}.popover .popover-content>.hidden+.popover-footer,.popover .popover-content>.popover-footer:first-child{border-top-right-radius:5px;border-top-left-radius:5px}.popover .popover-footer{margin:0;padding:8px 14px;background-color:#353739;border-top:1px solid #303234;border-bottom-right-radius:5px;border-bottom-left-radius:5px}.popover img{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.popover h4{color:#adadad}.popover table{color:#adadad;line-height:16px;font-size:11px}.popover table td{padding:0 4px;vertical-align:middle !important}.popover .select2-container{margin-top:-1px;margin-left:-1px}.popover-small .popover-title{padding:4px 6px}.popover-small .popover-content{padding:4px 2px 4px}.popover-small .popover-content-inner{padding:7px 6px 0}.popover-small .popover-footer{padding:6px 6px}.pf-popover{display:initial}.pf-popover .popover-content{padding:0}.pf-popover h6{white-space:nowrap;margin-right:50px}.pf-popover h6:before,.pf-popover h6:after{content:" ";display:table}.pf-popover h6:after{clear:both}.pf-popover .well{margin-top:7px;margin-bottom:10px}.pf-popover .list-group{margin:0}.pf-popover .list-group .list-group-item{color:#313335}.pf-popover .list-group .list-group-item:hover{color:#1d1d1d}.pf-popover .list-group .list-group-item.disabled{background-color:#3c3f41;color:#63676a;cursor:not-allowed}.pf-popover .list-group .list-group-item img{width:30px;margin:-8px 10px -6px -8px;border-radius:0}.pf-popover .list-group .list-group-item i{margin-right:20px}.pf-popover .pf-popover-list-icon{width:28px;margin:5px 0}.pf-popover .pf-popover-list-icon:first-child{margin-left:8px}.pf-popover .pf-popover-list-icon:last-child{margin-right:8px}.pf-popover-character .table>tbody>tr>td{border:none;white-space:nowrap}.pf-popover-character .table>tbody>tr>td:first-child+td{padding:0 5px}.pf-popover-character .well{margin-bottom:0;line-height:13px}.ribbon-wrapper{width:72px;height:88px;overflow:hidden;position:absolute;top:-3px;right:-3px;pointer-events:none}.ribbon{font:bold 12px "Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;color:#2b2b2b;text-align:center;text-shadow:rgba(255,255,255,0.2) 0px 1px 0px;position:relative;padding:3px 0;left:-4px;top:16px;width:99px;-webkit-box-shadow:2px 3px 3px rgba(0,0,0,0.2);box-shadow:2px 3px 3px rgba(0,0,0,0.2);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-webkit-transform:rotate(45deg);transform:rotate(45deg)}.ribbon:before,.ribbon:after{content:"";border-left:3px solid transparent;border-right:3px solid transparent;position:absolute;bottom:-3px}.ribbon.ribbon-default{color:#adadad;background-color:#353739;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzJkMzAzMSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzJhMmIyZCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #2d3031),color-stop(100%, #2a2b2d));background-image:-moz-linear-gradient(top, #2d3031,#2a2b2d);background-image:-webkit-linear-gradient(top, #2d3031,#2a2b2d);background-image:linear-gradient(to bottom, #2d3031,#2a2b2d)}.ribbon.ribbon-default:before,.ribbon.ribbon-default:after{border-top:3px solid #000}.ribbon.ribbon-green{background-color:#5cb85c;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzUxYjM1MSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzRhOTQ0YSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #51b351),color-stop(100%, #4a944a));background-image:-moz-linear-gradient(top, #51b351,#4a944a);background-image:-webkit-linear-gradient(top, #51b351,#4a944a);background-image:linear-gradient(to bottom, #51b351,#4a944a)}.ribbon.ribbon-green:before,.ribbon.ribbon-green:after{border-top:3px solid #285028}.ribbon.ribbon-orange{background-color:#e28a0d;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Q0ODEwYyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2I0NmQwYiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #d4810c),color-stop(100%, #b46d0b));background-image:-moz-linear-gradient(top, #d4810c,#b46d0b);background-image:-webkit-linear-gradient(top, #d4810c,#b46d0b);background-image:linear-gradient(to bottom, #d4810c,#b46d0b)}.ribbon.ribbon-orange:before,.ribbon.ribbon-orange:after{border-top:3px solid #6c4107}.ribbon.ribbon-red{background-color:#d9534f;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2M5MzAyYyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2E4MjgyNCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c9302c),color-stop(100%, #a82824));background-image:-moz-linear-gradient(top, #c9302c,#a82824);background-image:-webkit-linear-gradient(top, #c9302c,#a82824);background-image:linear-gradient(to bottom, #c9302c,#a82824)}.ribbon.ribbon-red:before,.ribbon.ribbon-red:after{border-top:3px solid #541412}.ribbon.ribbon-blue{background-color:#428bca;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzM3ODRjNSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzJkNWM4NSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #3784c5),color-stop(100%, #2d5c85));background-image:-moz-linear-gradient(top, #3784c5,#2d5c85);background-image:-webkit-linear-gradient(top, #3784c5,#2d5c85);background-image:linear-gradient(to bottom, #3784c5,#2d5c85)}.ribbon.ribbon-blue:before,.ribbon.ribbon-blue:after{border-top:3px solid #1a344c}.ribbon:before{left:0}.ribbon:after{right:0}.pf-loading-bars-container{position:relative;z-index:4;margin:0 auto;left:5px;right:19px;width:70px;height:50px;list-style:none}.pf-loading-bars-container .pf-loading-bars-loader{position:absolute;z-index:3;margin:0 auto;left:0;right:0;top:50%;margin-top:-19px;width:56px;height:37px;list-style:none}.pf-loading-bars-container .pf-loading-bars-loader li{background-color:#5cb85c;width:6px;height:6px;float:right;margin-right:3px !important;-webkit-box-shadow:0px 12px 6px rgba(0,0,0,0.2);box-shadow:0px 12px 6px rgba(0,0,0,0.2)}.pf-loading-bars-container .pf-loading-bars-loader li:first-child{-webkit-animation:cssload-loadbars 1.75s cubic-bezier(0.645, 0.045, 0.355, 1) infinite 0s;animation:cssload-loadbars 1.75s cubic-bezier(0.645, 0.045, 0.355, 1) infinite 0s}.pf-loading-bars-container .pf-loading-bars-loader li:nth-child(2){-webkit-animation:cssload-loadbars 1.75s ease-in-out infinite -0.35s;animation:cssload-loadbars 1.75s ease-in-out infinite -0.35s}.pf-loading-bars-container .pf-loading-bars-loader li:nth-child(3){-webkit-animation:cssload-loadbars 1.75s ease-in-out infinite -0.7s;animation:cssload-loadbars 1.75s ease-in-out infinite -0.7s}.pf-loading-bars-container .pf-loading-bars-loader li:nth-child(4){-webkit-animation:cssload-loadbars 1.75s ease-in-out infinite -1.05s;animation:cssload-loadbars 1.75s ease-in-out infinite -1.05s}.pf-loading-bars-container .pf-loading-bars-loader li:nth-child(5){-webkit-animation:cssload-loadbars 1.75s ease-in-out infinite -1.4s;animation:cssload-loadbars 1.75s ease-in-out infinite -1.4s}.pf-loading-bars-container .pf-loading-bars-loader li:nth-child(6){-webkit-animation:cssload-loadbars 1.75s ease-in-out infinite -1.75s;animation:cssload-loadbars 1.75s ease-in-out infinite -1.75s}@-webkit-keyframes cssload-loadbars{0%{height:6px;margin-top:16px}33%{height:6px;margin-top:16px}66%{height:31px;margin-top:0px}100%{height:6px;margin-top:16px}}@-moz-keyframes cssload-loadbars{0%{height:6px;margin-top:16px}33%{height:6px;margin-top:16px}66%{height:31px;margin-top:0px}100%{height:6px;margin-top:16px}}@-ms-keyframes cssload-loadbars{0%{height:6px;margin-top:16px}33%{height:6px;margin-top:16px}66%{height:31px;margin-top:0px}100%{height:6px;margin-top:16px}}@keyframes cssload-loadbars{0%{height:6px;margin-top:16px}33%{height:6px;margin-top:16px}66%{height:31px;margin-top:0px}100%{height:6px;margin-top:16px}}.pf-landing-sticky-panel{position:fixed;min-width:65px;border-radius:5px;padding:8px 10px;box-shadow:0 4px 10px rgba(0,0,0,0.4);text-shadow:#000000b8 0 1px 1px;z-index:100;background-color:rgba(43,43,43,0.75)}.pf-landing-sticky-panel h4{margin:5px 0 10px 0}.pf-landing-sticky-panel ul{margin-bottom:0;margin-left:25px}.pf-landing-sticky-panel ul+h4{margin-top:10px}.pf-landing-sticky-panel--top{top:50px}.pf-landing-sticky-panel--bottom{bottom:10px}.pf-landing-sticky-panel--left{left:10px}.pf-landing-sticky-panel--right{right:10px}.panel-heading.note-toolbar{background-color:#313335}.panel-heading.note-toolbar .dropdown-toggle>i+span{margin-left:3px}.panel-heading.note-toolbar .dropdown-menu>.note-btn-group:first-child{margin-bottom:3px}.note-editor.note-frame{border:none;background-color:transparent;margin-bottom:0}.note-editor.note-frame .note-editing-area .note-editable{color:#63676a;background-color:transparent;will-change:height;border:1px solid transparent}.note-editor.note-frame .note-editing-area .note-editable.has-error{border-color:#d9534f}.note-editor.note-frame .note-statusbar{background-color:#313335;padding:1px 0;border-top:0}.note-editor.note-frame .note-statusbar .note-resizebar:hover .note-icon-bar{border-top:1px solid #e28a0d}.note-editor.note-frame .note-statusbar .note-resizebar .note-icon-bar{border-top:1px solid #63676a;-webkit-transition:border-top 0.15s ease-out;transition:border-top 0.15s ease-out}.youtube{background-position:center;background-repeat:no-repeat;position:relative;display:inline-block;overflow:hidden;transition:all 200ms ease-out;cursor:pointer}.youtube .play{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAERklEQVR4nOWbTWhcVRTHb1IJVoxGtNCNdal2JYJReC6GWuO83PM/59yUS3FRFARdFlwYP1CfiojQWt36sRCUurRIdVFXIn41lAoVdRGrG1M01YpKrWjiYmaSl8ybZJL3cd+YA//NLObd3++eO8x79z5jSq5Gw+8kov0AP8vMR5l1BtBZQM4B8ks75wCdZdYZZj5qLZ4hov2Nht9Z9vhKKSIaB/gI4M4w62KeAO6Mte4lYOq20FxrlqqOibhHmeWbvNC9ZfDX1mLae391aN6limO/gwgvAPJbWeAZuSDingdwXTBw7/0IsyaA/Fkh+KqOkD+YNfHej1QKD+y7iVlOhgLvFqFfNJvNGyuBJ+KDAF8MDd0tgS8y64OlgSdJMsysL4cG7SOHkyQZLhTee7+d2R2rAVy/S+Jd7/32ouBHAP4gNNRGQyTHc/84NhqNywZp5rvjjnnvt21aABFeCQ+RLwAf2hQ8s7sv9OCLk6AHNgQvIrvbfzKCD76g/O6cu7lf/iER/aQGgy448pExZmhdegAPhR9sObFWH1gT3lp7DaA/5bkIgJhZPgsNmz02novj+KqeApj1ubwXWe4kdyeznAgNvTpE/HQmvKqOMeuFogTUVQSRno+iaLRLAJF7uIgL9O4ubgL8aWgB7S44mNX+35YpICUiAvS9sBLkq1WzT+NFffl6AuoiApi6NT37h6sWkBIRZGkQ8YtLgyji6e1mBYTqCEBPG2Naz+0BWQgtoGoRgCzEsd9hAN1X5BfnFZASUfrSAFQNsyZ1FJASUVpHiLinDJG8U2cBZYogkrcNs5waBAGdstbeU9zdqpw0gPwwSAI6VUxHyFlDpOcHUUBBIuYNs14aZAE5RVwyzPr3/0EAEY0TyfGNjBWQvwZ +CTSbehfAH29mrID8bET0+0EUkAd8WYDOmqJ3ecsG30yr9wqRfm6Y+a1BEFDEjHfHvWmY9ck6CygHvBVr8Xhtb4ZE5HZA3y8DvBNA1TjnrmXWf+sioMwZX5V/VHXMGGMMoKdDCxCRvRWBdzKzdHEO+EisilbPyopHYqp6S9UCAsz4iojI7hUDAtyXVQgIDd6KnOoaWNkbI6FaPSuZGyMArsi7MZoloB4zviI/Nhr3X95jltwTRQmoIfgisy5ai+me67OI7fE4nrqjrqfK1t0eby0FPRB6oGVlchL3rgnfrq19RKbVBdhV9IOSwJmfmJi4vi/4ThERitwyCxVAFqydshuCX5awhQ9KtmuIWd8IDZED/nXT77rvVVv6sHRKwjYi91poqP7Dr+Y6JJ1VSZIMA3wkPNy6bX+o8Bcm0sXMdwM8Fxo0A3xORPaWBp6uPXsmbxCRD0NDL0dOANhVCXy6iAjMcjbcrMt3RITKwdMVRdFo+y5yvkL4eWZ+zHt/ZVD4dEVRNGotpst+dZZZH8k86lqn2pIvT/eqrNfn2xuyqYPZ8mv7s8pfn/8Pybm4TIjanscAAAAASUVORK5CYII=") no-repeat center center;background-size:64px 64px;position:absolute;height:100%;width:100%;opacity:.8;filter:alpha(opacity=80);transition:all 0.2s ease-out}.youtube .play:hover{opacity:1;filter:alpha(opacity=100)} -/*# sourceMappingURL=pathfinder.css.map */ diff --git a/public/css/v1.5.5/pathfinder.css.br b/public/css/v1.5.5/pathfinder.css.br deleted file mode 100644 index d9d1e369..00000000 Binary files a/public/css/v1.5.5/pathfinder.css.br and /dev/null differ diff --git a/public/css/v1.5.5/pathfinder.css.map b/public/css/v1.5.5/pathfinder.css.map deleted file mode 100644 index 3d58739e..00000000 --- a/public/css/v1.5.5/pathfinder.css.map +++ /dev/null @@ -1,7 +0,0 @@ -{ -"version": 3, -"mappings": "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", -"sources": ["../../../sass/pathfinder.scss","file:///C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/compass-core-1.0.3/stylesheets/compass/reset/_utilities.scss","../../../sass/_variables.scss","../../../sass/_bootstrap.scss","../../../sass/bootstrap/_scaffolding.scss","../../../sass/bootstrap/_mixins.scss","../../../sass/bootstrap/_type.scss","../../../sass/bootstrap/_code.scss","../../../sass/bootstrap/_grid.scss","../../../sass/bootstrap/_tables.scss","../../../sass/bootstrap/_forms.scss","../../../sass/_colors.scss","../../../sass/bootstrap/_buttons.scss","../../../sass/bootstrap/_component-animations.scss","../../../sass/bootstrap/_dropdowns.scss","file:///C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/compass-core-1.0.3/stylesheets/compass/_support.scss","file:///C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/compass-core-1.0.3/stylesheets/compass/css3/_border-radius.scss","../../../sass/bootstrap/_button-groups.scss","../../../sass/bootstrap/_input-groups.scss","../../../sass/bootstrap/_navs.scss","../../../sass/bootstrap/_navbar.scss","../../../sass/bootstrap/_breadcrumbs.scss","../../../sass/bootstrap/_pagination.scss","../../../sass/bootstrap/_pager.scss","../../../sass/bootstrap/_labels.scss","../../../sass/bootstrap/_badges.scss","../../../sass/bootstrap/_thumbnails.scss","../../../sass/bootstrap/_alerts.scss","../../../sass/bootstrap/_progress-bars.scss","../../../sass/bootstrap/_media.scss","../../../sass/bootstrap/_list-group.scss","../../../sass/bootstrap/_panels.scss","../../../sass/bootstrap/_wells.scss","../../../sass/bootstrap/_close.scss","../../../sass/bootstrap/_modals.scss","../../../sass/bootstrap/_tooltip.scss","../../../sass/bootstrap/_popovers.scss","../../../sass/bootstrap/_utilities.scss","../../../sass/bootstrap/_responsive-utilities.scss","../../../sass/library/fontawesome/_fontawesome.scss","../../../sass/library/fontawesome/_core.scss","../../../sass/library/fontawesome/_larger.scss","../../../sass/library/fontawesome/_fixed-width.scss","../../../sass/library/fontawesome/_variables.scss","../../../sass/library/fontawesome/_list.scss","../../../sass/library/fontawesome/_bordered-pulled.scss","../../../sass/library/fontawesome/_animated.scss","../../../sass/library/fontawesome/_rotated-flipped.scss","../../../sass/library/fontawesome/_mixins.scss","../../../sass/library/fontawesome/_stacked.scss","../../../sass/library/fontawesome/_icons.scss","../../../sass/library/fontawesome/_screen-reader.scss","../../../sass/library/fontawesome/_regular.scss","../../../sass/library/fontawesome/_solid.scss","../../../sass/library/fontawesome/_brands.scss","../../../sass/library/custom-scrollbar/_mCustomScrollbar.scss","../../../sass/library/data-tables/DataTables-1.10.18/_jquery.dataTables.scss","../../../sass/library/data-tables/Buttons-1.5.6/_mixins.scss","../../../sass/library/data-tables/Buttons-1.5.6/_common.scss","../../../sass/library/data-tables/Buttons-1.5.6/_buttons.dataTables.scss","../../../sass/library/data-tables/Responsive-2.2.2/_responsive.dataTables.scss","../../../sass/library/data-tables/Select-1.3.0/_select.dataTables.scss","../../../sass/library/data-tables/_dataTables-fontAwesome.scss","../../../sass/library/x-editable/_bootstrap-editable.scss","../../../sass/library/pnotify/_pnotify.scss","../../../sass/library/pnotify/_pnotify.nonblock.scss","../../../sass/library/pnotify/_pnotify.custom.scss","../../../sass/library/slidebars/_slidebars.scss","../../../sass/library/easy-pie-chart/_easyPieChart.scss","../../../sass/library/select2/_core.scss","../../../sass/library/select2/_single.scss","../../../sass/library/select2/_multiple.scss","../../../sass/library/select2/_dropdown.scss","../../../sass/library/select2/theme/pathfinder/_single.scss","../../../sass/library/select2/theme/pathfinder/_defaults.scss","../../../sass/library/select2/theme/pathfinder/_multiple.scss","../../../sass/library/select2/theme/pathfinder/_layout.scss","file:///C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/compass-core-1.0.3/stylesheets/compass/css3/_appearance.scss","../../../sass/library/blue-imp-gallery/_blueimp-gallery.scss","../../../sass/library/blue-imp-gallery/_bootstrap-image-gallery.scss","../../../sass/library/bootstrap-toggle/_bootstrap-toggle.scss","../../../sass/library/bootstrap-checkbox/_awesome-bootstrap-checkbox.scss","../../../sass/library/summernote/_summernote.scss","../../../sass/_main.scss","../../../sass/_main-colorpallet.scss","../../../sass/layout/_animation.scss","../../../sass/layout/_fonts.scss","../../../sass/layout/_main.scss","file:///C:/Ruby25-x64/lib/ruby/gems/2.5.0/gems/compass-core-1.0.3/stylesheets/compass/css3/_images.scss","../../../sass/layout/_landing.scss","../../../sass/layout/_breadcrumb.scss","../../../sass/layout/_logo.scss","../../../sass/layout/_map.scss","../../../sass/layout/_system-info.scss","../../../sass/layout/_forms.scss","../../../sass/layout/_dialogs.scss","../../../sass/layout/_log.scss","../../../sass/layout/_timeline.scss","../../../sass/layout/_popover.scss","../../../sass/layout/_ribbon.scss","../../../sass/layout/_loading-bar.scss","../../../sass/layout/_sticky-panel.scss","../../../sass/layout/_summernote.scss","../../../sass/layout/_youtube.scss"], -"names": [], -"file": "pathfinder.css" -} \ No newline at end of file diff --git a/public/css/v2.0.0/pathfinder.css b/public/css/v2.0.0/pathfinder.css new file mode 100644 index 00000000..fcbce945 --- /dev/null +++ b/public/css/v2.0.0/pathfinder.css @@ -0,0 +1,60 @@ +/*! + * Pathfinder - Mapping Tool + * https://www.pathfinder-w.space + * + * CSS - Cascading Style Sheets + * Generated with Compass http://compass-style.org + * + * Copyright 2015 - 2020, Exodus 4D - Mark Friedrinch + * + */@-ms-viewport{width:device-width}html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,.editable-input .editable-checklist>div>label>span,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video,main{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section,main,summary{display:block}*,*::before,*::after{box-sizing:inherit}html{box-sizing:border-box;touch-action:manipulation;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{line-height:1;font-family:sans-serif;text-align:left}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote::before,blockquote::after,q::before,q::after{content:'';content:none}table{border-collapse:collapse;border-spacing:0}caption{caption-side:bottom}th{text-align:inherit}hr{box-sizing:content-box;height:0;overflow:visible}pre,code,kbd,samp{font-family:monospace, monospace}pre{overflow:auto;-ms-overflow-style:scrollbar}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}svg:not(:root){overflow:hidden}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}input,button,select,optgroup,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,[type="reset"],[type="submit"],[type="button"]{-webkit-appearance:button}input[type="date"],input[type="time"],input[type="datetime-local"],input[type="month"]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}input[type="radio"],input[type="checkbox"]{box-sizing:border-box;padding:0}[tabindex="-1"]:focus{outline:0 !important}fieldset{min-width:0}legend{max-width:100%;white-space:normal;color:inherit;display:block}progress{vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}output{display:inline-block}template{display:none}[hidden]{display:none}@font-face{font-family:'Oxygen';font-weight:400;font-style:normal;font-display:swap;src:url("../../fonts/oxygen-regular-webfont.eot");src:url("../../fonts/oxygen-regular-webfont.eot") format("embedded-opentype"),url("../../fonts/oxygen-regular-webfont.woff2") format("woff2"),url("../../fonts/oxygen-regular-webfont.woff") format("woff"),url("../../fonts/oxygen-regular-webfont.ttf") format("truetype")}@font-face{font-family:'Oxygen Bold';font-weight:700;font-style:normal;font-display:swap;src:url("../../fonts/oxygen-bold-webfont.eot");src:url("../../fonts/oxygen-bold-webfont.eot") format("embedded-opentype"),url("../../fonts/oxygen-bold-webfont.woff2") format("woff2"),url("../../fonts/oxygen-bold-webfont.woff") format("woff"),url("../../fonts/oxygen-bold-webfont.ttf") format("truetype")}/*! + * Bootstrap SASS + * + * Copyright 2013 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world by @mdo and @fat. + */*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;font-size:12px;line-height:1.5;color:#63676a;background-color:#1d1d1d}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#375959;text-decoration:none}a:hover,a:focus{color:#1a2a2a;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;outline-color:#568a89;text-decoration:none}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.5;background-color:#1d1d1d;border:1px solid #ddd;border-radius:0px;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:18px;margin-bottom:18px;border:0;border-top:1px solid #adadad}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:700;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:normal;line-height:1;color:#63676a}h1,.h1,h2,.h2,h3,.h3{margin-top:18px;margin-bottom:9px}h1 small,h1 .small,.h1 small,.h1 .small,h2 small,h2 .small,.h2 small,.h2 .small,h3 small,h3 .small,.h3 small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:9px;margin-bottom:9px}h4 small,h4 .small,.h4 small,.h4 .small,h5 small,h5 .small,.h5 small,.h5 .small,h6 small,h6 .small,.h6 small,.h6 .small{font-size:75%}h1,.h1{font-size:22px}h2,.h2{font-size:20px}h3,.h3{font-size:17px}h4,.h4{font-size:12px}h5,.h5{font-size:14px}h6,.h6{font-size:13px}p{margin:0 0 9px}.lead{margin-bottom:18px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width: 780px){.lead{font-size:16px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#63676a}.text-primary{color:#375959}a.text-primary:hover{color:#243939}.text-success{color:#2b2b2b}a.text-success:hover{color:#121212}.text-info{color:#2b2b2b}a.text-info:hover{color:#121212}.text-warning{color:#2b2b2b}a.text-warning:hover{color:#121212}.text-danger{color:#2b2b2b}a.text-danger:hover{color:#121212}.bg-primary{color:#fff}.bg-primary{background-color:#375959}a.bg-primary:hover{background-color:#243939}.bg-success{background-color:#d1e8d1}a.bg-success:hover{background-color:#afd7af}.bg-info{background-color:#abc9e2}a.bg-info:hover{background-color:#85b0d5}.bg-warning{background-color:#fdedd8}a.bg-warning:hover{background-color:#fad8a8}.bg-danger{background-color:#f6d1d0}a.bg-danger:hover{background-color:#eda7a5}.page-header{padding-bottom:8px;margin:36px 0 18px;border-bottom:1px solid #adadad}ul,ol{margin-top:0;margin-bottom:9px}ul ul,ul ol,ol ul,ol ol{margin-bottom:0}.list-unstyled,.list-inline{padding-left:0;list-style:none}.list-inline{margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:10px}dt,dd{line-height:18px}dt{font-weight:bold}dd{margin-left:0}@media (min-width: 480px){.dl-horizontal dt{float:left;width:105px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:120px}.dl-horizontal dd:before,.dl-horizontal dd:after{content:" ";display:table}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #63676a}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:6px 12px;margin:0 0 12px;font-size:14.4px;border-left:3px solid #316490}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.5;color:#63676a}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:12px;padding-left:0;border-right:3px solid #316490;border-left:0;text-align:right}.blockquote-reverse footer:before,.blockquote-reverse small:before,.blockquote-reverse .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,.blockquote-reverse small:after,.blockquote-reverse .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:18px;font-style:normal;line-height:1.5}code,kbd,pre,samp{font-family:Consolas,monospace,Menlo,Monaco,"Courier New"}code{padding:2px 4px;font-size:90%;color:#1d1d1d;background-color:#63676a;white-space:nowrap;border-radius:3px}kbd{padding:2px 4px;font-size:90%;color:#adadad;background-color:#2b2b2b;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}pre{display:block;padding:8.5px;margin:0 0 9px;font-size:11px;line-height:1.5;word-break:break-all;word-wrap:break-word;color:#63676a;background-color:#313335;border-radius:3px}pre code{display:grid;grid-gap:5px;padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0;overflow-x:scroll;white-space:pre}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:10px;padding-right:10px}.container:before,.container:after{content:" ";display:table}.container:after{clear:both}@media (min-width: 780px){.container{width:740px}}@media (min-width: 1200px){.container{width:1080px}}@media (min-width: 1600px){.container{width:1260px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:10px;padding-right:10px}.container-fluid:before,.container-fluid:after{content:" ";display:table}.container-fluid:after{clear:both}.row{margin-left:-10px;margin-right:-10px}.row:before,.row:after{content:" ";display:table}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:10px;padding-right:10px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-1{width:8.33333%}.col-xs-2{width:16.66667%}.col-xs-3{width:25%}.col-xs-4{width:33.33333%}.col-xs-5{width:41.66667%}.col-xs-6{width:50%}.col-xs-7{width:58.33333%}.col-xs-8{width:66.66667%}.col-xs-9{width:75%}.col-xs-10{width:83.33333%}.col-xs-11{width:91.66667%}.col-xs-12{width:100%}.col-xs-pull-0{right:0%}.col-xs-pull-1{right:8.33333%}.col-xs-pull-2{right:16.66667%}.col-xs-pull-3{right:25%}.col-xs-pull-4{right:33.33333%}.col-xs-pull-5{right:41.66667%}.col-xs-pull-6{right:50%}.col-xs-pull-7{right:58.33333%}.col-xs-pull-8{right:66.66667%}.col-xs-pull-9{right:75%}.col-xs-pull-10{right:83.33333%}.col-xs-pull-11{right:91.66667%}.col-xs-pull-12{right:100%}.col-xs-push-0{left:0%}.col-xs-push-1{left:8.33333%}.col-xs-push-2{left:16.66667%}.col-xs-push-3{left:25%}.col-xs-push-4{left:33.33333%}.col-xs-push-5{left:41.66667%}.col-xs-push-6{left:50%}.col-xs-push-7{left:58.33333%}.col-xs-push-8{left:66.66667%}.col-xs-push-9{left:75%}.col-xs-push-10{left:83.33333%}.col-xs-push-11{left:91.66667%}.col-xs-push-12{left:100%}.col-xs-offset-0{margin-left:0%}.col-xs-offset-1{margin-left:8.33333%}.col-xs-offset-2{margin-left:16.66667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.33333%}.col-xs-offset-5{margin-left:41.66667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.33333%}.col-xs-offset-8{margin-left:66.66667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.33333%}.col-xs-offset-11{margin-left:91.66667%}.col-xs-offset-12{margin-left:100%}@media (min-width: 780px){.col-sm-1,.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-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-1{width:8.33333%}.col-sm-2{width:16.66667%}.col-sm-3{width:25%}.col-sm-4{width:33.33333%}.col-sm-5{width:41.66667%}.col-sm-6{width:50%}.col-sm-7{width:58.33333%}.col-sm-8{width:66.66667%}.col-sm-9{width:75%}.col-sm-10{width:83.33333%}.col-sm-11{width:91.66667%}.col-sm-12{width:100%}.col-sm-pull-0{right:0%}.col-sm-pull-1{right:8.33333%}.col-sm-pull-2{right:16.66667%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333%}.col-sm-pull-5{right:41.66667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.33333%}.col-sm-pull-8{right:66.66667%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333%}.col-sm-pull-11{right:91.66667%}.col-sm-pull-12{right:100%}.col-sm-push-0{left:0%}.col-sm-push-1{left:8.33333%}.col-sm-push-2{left:16.66667%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333%}.col-sm-push-5{left:41.66667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.33333%}.col-sm-push-8{left:66.66667%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333%}.col-sm-push-11{left:91.66667%}.col-sm-push-12{left:100%}.col-sm-offset-0{margin-left:0%}.col-sm-offset-1{margin-left:8.33333%}.col-sm-offset-2{margin-left:16.66667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333%}.col-sm-offset-5{margin-left:41.66667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.33333%}.col-sm-offset-8{margin-left:66.66667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333%}.col-sm-offset-11{margin-left:91.66667%}.col-sm-offset-12{margin-left:100%}}@media (min-width: 1200px){.col-md-1,.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-md-10,.col-md-11,.col-md-12{float:left}.col-md-1{width:8.33333%}.col-md-2{width:16.66667%}.col-md-3{width:25%}.col-md-4{width:33.33333%}.col-md-5{width:41.66667%}.col-md-6{width:50%}.col-md-7{width:58.33333%}.col-md-8{width:66.66667%}.col-md-9{width:75%}.col-md-10{width:83.33333%}.col-md-11{width:91.66667%}.col-md-12{width:100%}.col-md-pull-0{right:0%}.col-md-pull-1{right:8.33333%}.col-md-pull-2{right:16.66667%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333%}.col-md-pull-5{right:41.66667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.33333%}.col-md-pull-8{right:66.66667%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333%}.col-md-pull-11{right:91.66667%}.col-md-pull-12{right:100%}.col-md-push-0{left:0%}.col-md-push-1{left:8.33333%}.col-md-push-2{left:16.66667%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333%}.col-md-push-5{left:41.66667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.33333%}.col-md-push-8{left:66.66667%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333%}.col-md-push-11{left:91.66667%}.col-md-push-12{left:100%}.col-md-offset-0{margin-left:0%}.col-md-offset-1{margin-left:8.33333%}.col-md-offset-2{margin-left:16.66667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333%}.col-md-offset-5{margin-left:41.66667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.33333%}.col-md-offset-8{margin-left:66.66667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333%}.col-md-offset-11{margin-left:91.66667%}.col-md-offset-12{margin-left:100%}}@media (min-width: 1600px){.col-lg-1,.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-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-1{width:8.33333%}.col-lg-2{width:16.66667%}.col-lg-3{width:25%}.col-lg-4{width:33.33333%}.col-lg-5{width:41.66667%}.col-lg-6{width:50%}.col-lg-7{width:58.33333%}.col-lg-8{width:66.66667%}.col-lg-9{width:75%}.col-lg-10{width:83.33333%}.col-lg-11{width:91.66667%}.col-lg-12{width:100%}.col-lg-pull-0{right:0%}.col-lg-pull-1{right:8.33333%}.col-lg-pull-2{right:16.66667%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333%}.col-lg-pull-5{right:41.66667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.33333%}.col-lg-pull-8{right:66.66667%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333%}.col-lg-pull-11{right:91.66667%}.col-lg-pull-12{right:100%}.col-lg-push-0{left:0%}.col-lg-push-1{left:8.33333%}.col-lg-push-2{left:16.66667%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333%}.col-lg-push-5{left:41.66667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.33333%}.col-lg-push-8{left:66.66667%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333%}.col-lg-push-11{left:91.66667%}.col-lg-push-12{left:100%}.col-lg-offset-0{margin-left:0%}.col-lg-offset-1{margin-left:8.33333%}.col-lg-offset-2{margin-left:16.66667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333%}.col-lg-offset-5{margin-left:41.66667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.33333%}.col-lg-offset-8{margin-left:66.66667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333%}.col-lg-offset-11{margin-left:91.66667%}.col-lg-offset-12{margin-left:100%}}table{max-width:100%;background-color:rgba(0,0,0,0)}th{text-align:left}.table{width:100%;margin-bottom:0;border-spacing:0}.table>thead>tr>th,.table>thead>tr>td,.table>tbody>tr>th,.table>tbody>tr>td,.table>tfoot>tr>th,.table>tfoot>tr>td{padding:8px;line-height:1.5;vertical-align:top;border-top:1px solid #313335}.table>thead>tr>th{vertical-align:bottom;border-bottom:0px solid #313335}.table>caption+thead>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>th,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #313335}.table .table{background-color:#1d1d1d}.table-condensed>thead>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>tfoot>tr>td{padding:2px}.table-bordered{border:1px solid #313335}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>tfoot>tr>td{border:1px solid #313335}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#ecf3f8}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>thead>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th{background-color:#ecf3f8}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th{background-color:#d9e7f1}.table>thead>tr>td.success,.table>thead>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th{background-color:#d1e8d1}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#c0e0c0}.table>thead>tr>td.info,.table>thead>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th{background-color:#abc9e2}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{background-color:#98bcdc}.table>thead>tr>td.warning,.table>thead>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th{background-color:#fdedd8}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#fbe3c0}.table>thead>tr>td.danger,.table>thead>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th{background-color:#f6d1d0}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#f1bcba}@media (max-width: 779px){.table-responsive{width:100%;margin-bottom:13.5px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #313335;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:18px;font-size:18px;line-height:inherit;color:#313335;border:0;border-bottom:1px solid #e5e5e5}label,.editable-input .editable-checklist>div>label>span{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{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="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;outline-color:#568a89}output{display:block;padding-top:7px;font-size:12px;line-height:1.5;color:#adadad}.form-control{display:block;width:100%;height:32px;padding:6px 12px;font-size:12px;line-height:1.5;color:#adadad;background-color:#313335;background-image:none;border:1px solid #63676a;border-radius:0px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-out 0.15s,box-shadow ease-out 0.15s;transition:border-color ease-out 0.15s,box-shadow ease-out 0.15s}.form-control:focus{border-color:#568a89;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(86,138,137,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(86,138,137,0.6)}.form-control::-moz-placeholder{color:#63676a;opacity:1}.form-control:-ms-input-placeholder{color:#63676a}.form-control::-webkit-input-placeholder{color:#63676a}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#3c3f41;opacity:1}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}input[type="date"]{line-height:32px}.form-group{margin-bottom:15px}.radio,.checkbox,.editable-input .editable-checklist>div>label{display:block;min-height:18px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.radio .editable-input .editable-checklist>div>label>span,.editable-input .radio .editable-checklist>div>label>span,.checkbox label,.editable-input .editable-checklist>div>label label,.editable-input .checkbox .editable-checklist>div>label>span,.editable-input .editable-checklist>div>label>span{display:inline;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.editable-input .editable-checklist>div>label input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px}.radio+.radio,.checkbox+.checkbox,.editable-input .editable-checklist>div>label+.checkbox,.editable-input .editable-checklist>div>.checkbox+label,.editable-input .editable-checklist>div>label+label{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],fieldset[disabled] input[type="radio"],input[type="checkbox"][disabled],fieldset[disabled] input[type="checkbox"],.radio[disabled],fieldset[disabled] .radio,.radio-inline[disabled],fieldset[disabled] .radio-inline,.checkbox[disabled],.editable-input .editable-checklist>div>label[disabled],fieldset[disabled] .checkbox,fieldset[disabled] .editable-input .editable-checklist>div>label,.editable-input fieldset[disabled] .editable-checklist>div>label,.checkbox-inline[disabled],fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:28px;padding:5px 10px;font-size:11px;line-height:1.5;border-radius:3px}select.input-sm,.input-group-sm>select.form-control,.input-group-sm>select.input-group-addon,.input-group-sm>.input-group-btn>select.btn{height:28px;line-height:28px}textarea.input-sm,.input-group-sm>textarea.form-control,.input-group-sm>textarea.input-group-addon,.input-group-sm>.input-group-btn>textarea.btn,select[multiple].input-sm,.input-group-sm>select.form-control[multiple],.input-group-sm>select.input-group-addon[multiple],.input-group-sm>.input-group-btn>select.btn[multiple]{height:auto}.input-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:42px;padding:10px 16px;font-size:15px;line-height:1.33;border-radius:6px}select.input-lg,.input-group-lg>select.form-control,.input-group-lg>select.input-group-addon,.input-group-lg>.input-group-btn>select.btn{height:42px;line-height:42px}textarea.input-lg,.input-group-lg>textarea.form-control,.input-group-lg>textarea.input-group-addon,.input-group-lg>.input-group-btn>textarea.btn,select[multiple].input-lg,.input-group-lg>select.form-control[multiple],.input-group-lg>select.input-group-addon[multiple],.input-group-lg>.input-group-btn>select.btn[multiple]{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.has-feedback .form-control-feedback{position:absolute;top:23px;right:0;display:block;width:32px;height:32px;line-height:32px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .editable-input .editable-checklist>div>label,.editable-input .has-success .editable-checklist>div>label,.has-success .radio-inline,.has-success .checkbox-inline{color:#5cb85c}.has-success .form-control{border-color:#5cb85c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #a3d7a3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #a3d7a3}.has-success .select2-selection{border:1px solid !important;border-color:#5cb85c !important;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .input-group-addon{color:#5cb85c;border-color:#5cb85c;background-color:#d1e8d1}.has-success .form-control-feedback{color:#5cb85c}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .editable-input .editable-checklist>div>label,.editable-input .has-warning .editable-checklist>div>label,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#2b2b2b}.has-warning .form-control{border-color:#2b2b2b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #5e5e5e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #5e5e5e}.has-warning .select2-selection{border:1px solid !important;border-color:#2b2b2b !important;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .input-group-addon{color:#2b2b2b;border-color:#2b2b2b;background-color:#fdedd8}.has-warning .form-control-feedback{color:#2b2b2b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .editable-input .editable-checklist>div>label,.editable-input .has-error .editable-checklist>div>label,.has-error .radio-inline,.has-error .checkbox-inline{color:#d9534f}.has-error .form-control{border-color:#d9534f;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #eba5a3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #eba5a3}.has-error .select2-selection{border:1px solid !important;border-color:#d9534f !important;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .input-group-addon{color:#d9534f;border-color:#d9534f;background-color:#f6d1d0}.has-error .form-control-feedback{color:#d9534f}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#7c8184}@media (min-width: 780px){.form-inline .form-group,.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control,.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group>.form-control,.navbar-form .input-group>.form-control{width:100%}.form-inline .control-label,.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.navbar-form .radio,.form-inline .checkbox,.navbar-form .checkbox,.form-inline .editable-input .editable-checklist>div>label,.editable-input .form-inline .editable-checklist>div>label,.navbar-form .editable-input .editable-checklist>div>label,.editable-input .navbar-form .editable-checklist>div>label{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type="radio"],.navbar-form .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"],.navbar-form .checkbox input[type="checkbox"],.form-inline .editable-input .editable-checklist>div>label input[type="checkbox"],.editable-input .form-inline .editable-checklist>div>label input[type="checkbox"],.navbar-form .editable-input .editable-checklist>div>label input[type="checkbox"],.editable-input .navbar-form .editable-checklist>div>label input[type="checkbox"]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback,.navbar-form .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .editable-input .editable-checklist>div>label,.editable-input .form-horizontal .editable-checklist>div>label,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .editable-input .editable-checklist>div>label,.editable-input .form-horizontal .editable-checklist>div>label{min-height:25px}.form-horizontal .form-group{margin-left:-10px;margin-right:-10px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{content:" ";display:table}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:7px}@media (min-width: 780px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:10px}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:12px;line-height:1.5;border-radius:0px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;outline-color:#568a89}.btn:hover,.btn:focus{color:#eaeaea;text-decoration:none;-webkit-box-shadow:none;box-shadow:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15);box-shadow:0 5px 11px 0 rgba(0,0,0,0.18),0 4px 15px 0 rgba(0,0,0,0.15)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#eaeaea;background-color:#63676a;border-color:#575a5d}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active:not(.toggle-on):not(.toggle-off){color:#eaeaea;background-color:#72767a;border-color:#6f7477}.open .btn-default.dropdown-toggle{color:#eaeaea;background-color:#72767a;border-color:#6f7477}.btn-default:active,.btn-default.active{background-image:none}.open .btn-default.dropdown-toggle{background-image:none}.btn-default.disabled,.btn-default.disabled:hover,.btn-default.disabled:focus,.btn-default.disabled:active,.btn-default.disabled.active,.btn-default[disabled],.btn-default[disabled]:hover,.btn-default[disabled]:focus,.btn-default[disabled]:active,.btn-default[disabled].active,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default:hover,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default.active{background-color:#63676a;border-color:#575a5d}.btn-default .badge{color:#63676a;background-color:#eaeaea}.btn-primary{color:#eaeaea;background-color:#375959;border-color:#335353}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active:not(.toggle-on):not(.toggle-off){color:#eaeaea;background-color:#436c6c;border-color:#477272}.open .btn-primary.dropdown-toggle{color:#eaeaea;background-color:#436c6c;border-color:#477272}.btn-primary:active,.btn-primary.active{background-image:none}.open .btn-primary.dropdown-toggle{background-image:none}.btn-primary.disabled,.btn-primary.disabled:hover,.btn-primary.disabled:focus,.btn-primary.disabled:active,.btn-primary.disabled.active,.btn-primary[disabled],.btn-primary[disabled]:hover,.btn-primary[disabled]:focus,.btn-primary[disabled]:active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary:hover,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary.active{background-color:#375959;border-color:#335353}.btn-primary .badge{color:#375959;background-color:#eaeaea}.btn-success,.modal-content .pf-wizard-navigation li.active a:not(.btn-danger){color:#eaeaea;background-color:#4f9e4f;border-color:#478d47}.btn-success:hover,.modal-content .pf-wizard-navigation li.active a:hover:not(.btn-danger),.btn-success:focus,.modal-content .pf-wizard-navigation li.active a:focus:not(.btn-danger),.btn-success:active,.modal-content .pf-wizard-navigation li.active a:active:not(.btn-danger),.btn-success.active:not(.toggle-on):not(.toggle-off),.modal-content .pf-wizard-navigation li.active a.active:not(.toggle-on):not(.toggle-off):not(.btn-danger){color:#eaeaea;background-color:#5dae5d;border-color:#5aad5a}.open .btn-success.dropdown-toggle,.open .modal-content .pf-wizard-navigation li.active a.dropdown-toggle:not(.btn-danger),.modal-content .pf-wizard-navigation li.active .open a.dropdown-toggle:not(.btn-danger){color:#eaeaea;background-color:#5dae5d;border-color:#5aad5a}.btn-success:active,.modal-content .pf-wizard-navigation li.active a:active:not(.btn-danger),.btn-success.active,.modal-content .pf-wizard-navigation li.active a.active:not(.btn-danger){background-image:none}.open .btn-success.dropdown-toggle,.open .modal-content .pf-wizard-navigation li.active a.dropdown-toggle:not(.btn-danger),.modal-content .pf-wizard-navigation li.active .open a.dropdown-toggle:not(.btn-danger){background-image:none}.btn-success.disabled,.modal-content .pf-wizard-navigation li.active a.disabled:not(.btn-danger),.btn-success.disabled:hover,.modal-content .pf-wizard-navigation li.active a.disabled:hover:not(.btn-danger),.btn-success.disabled:focus,.modal-content .pf-wizard-navigation li.active a.disabled:focus:not(.btn-danger),.btn-success.disabled:active,.modal-content .pf-wizard-navigation li.active a.disabled:active:not(.btn-danger),.btn-success.disabled.active,.modal-content .pf-wizard-navigation li.active a.disabled.active:not(.btn-danger),.btn-success[disabled],.modal-content .pf-wizard-navigation li.active a[disabled]:not(.btn-danger),.btn-success[disabled]:hover,.modal-content .pf-wizard-navigation li.active a[disabled]:hover:not(.btn-danger),.btn-success[disabled]:focus,.modal-content .pf-wizard-navigation li.active a[disabled]:focus:not(.btn-danger),.btn-success[disabled]:active,.modal-content .pf-wizard-navigation li.active a[disabled]:active:not(.btn-danger),.btn-success[disabled].active,.modal-content .pf-wizard-navigation li.active a[disabled].active:not(.btn-danger),fieldset[disabled] .btn-success,fieldset[disabled] .modal-content .pf-wizard-navigation li.active a:not(.btn-danger),.modal-content .pf-wizard-navigation li.active fieldset[disabled] a:not(.btn-danger),fieldset[disabled] .btn-success:hover,fieldset[disabled] .modal-content .pf-wizard-navigation li.active a:hover:not(.btn-danger),.modal-content .pf-wizard-navigation li.active fieldset[disabled] a:hover:not(.btn-danger),fieldset[disabled] .btn-success:focus,fieldset[disabled] .modal-content .pf-wizard-navigation li.active a:focus:not(.btn-danger),.modal-content .pf-wizard-navigation li.active fieldset[disabled] a:focus:not(.btn-danger),fieldset[disabled] .btn-success:active,fieldset[disabled] .modal-content .pf-wizard-navigation li.active a:active:not(.btn-danger),.modal-content .pf-wizard-navigation li.active fieldset[disabled] a:active:not(.btn-danger),fieldset[disabled] .btn-success.active,fieldset[disabled] .modal-content .pf-wizard-navigation li.active a.active:not(.btn-danger),.modal-content .pf-wizard-navigation li.active fieldset[disabled] a.active:not(.btn-danger){background-color:#4f9e4f;border-color:#478d47}.btn-success .badge,.modal-content .pf-wizard-navigation li.active a:not(.btn-danger) .badge{color:#4f9e4f;background-color:#eaeaea}.btn-info{color:#eaeaea;background-color:#316490;border-color:#2b577d}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active:not(.toggle-on):not(.toggle-off){color:#eaeaea;background-color:#3974a7;border-color:#3771a3}.open .btn-info.dropdown-toggle{color:#eaeaea;background-color:#3974a7;border-color:#3771a3}.btn-info:active,.btn-info.active{background-image:none}.open .btn-info.dropdown-toggle{background-image:none}.btn-info.disabled,.btn-info.disabled:hover,.btn-info.disabled:focus,.btn-info.disabled:active,.btn-info.disabled.active,.btn-info[disabled],.btn-info[disabled]:hover,.btn-info[disabled]:focus,.btn-info[disabled]:active,.btn-info[disabled].active,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info:hover,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info.active{background-color:#316490;border-color:#2b577d}.btn-info .badge{color:#316490;background-color:#eaeaea}.btn-warning{color:#eaeaea;background-color:#c2760c;border-color:#aa670b}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active:not(.toggle-on):not(.toggle-off){color:#eaeaea;background-color:#df880e;border-color:#da850d}.open .btn-warning.dropdown-toggle{color:#eaeaea;background-color:#df880e;border-color:#da850d}.btn-warning:active,.btn-warning.active{background-image:none}.open .btn-warning.dropdown-toggle{background-image:none}.btn-warning.disabled,.btn-warning.disabled:hover,.btn-warning.disabled:focus,.btn-warning.disabled:active,.btn-warning.disabled.active,.btn-warning[disabled],.btn-warning[disabled]:hover,.btn-warning[disabled]:focus,.btn-warning[disabled]:active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning:hover,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning.active{background-color:#c2760c;border-color:#aa670b}.btn-warning .badge{color:#c2760c;background-color:#eaeaea}.btn-danger{color:#eaeaea;background-color:#a52521;border-color:#90201d}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active:not(.toggle-on):not(.toggle-off){color:#eaeaea;background-color:#bf2b26;border-color:#ba2a25}.open .btn-danger.dropdown-toggle{color:#eaeaea;background-color:#bf2b26;border-color:#ba2a25}.btn-danger:active,.btn-danger.active{background-image:none}.open .btn-danger.dropdown-toggle{background-image:none}.btn-danger.disabled,.btn-danger.disabled:hover,.btn-danger.disabled:focus,.btn-danger.disabled:active,.btn-danger.disabled.active,.btn-danger[disabled],.btn-danger[disabled]:hover,.btn-danger[disabled]:focus,.btn-danger[disabled]:active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger:hover,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger.active{background-color:#a52521;border-color:#90201d}.btn-danger .badge{color:#a52521;background-color:#eaeaea}.btn-link{color:#375959;font-weight:normal;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#1a2a2a;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:hover,fieldset[disabled] .btn-link:focus{color:#63676a;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:15px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:11px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:11px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;will-change:height;-webkit-transition:height 0.35s ease;transition:height 0.35s ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{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;list-style:none;font-size:12px;background-color:#adadad;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:5px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:5px 0;overflow:hidden;background-color:#63676a}.dropdown-menu>li>a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:1.5;color:#313335;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#1d1d1d;background-color:#63676a}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#adadad;text-decoration:none;outline:0;background-color:#375959}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#63676a}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:11px;line-height:1.5;color:#63676a}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width: 480px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:none}.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:before,.btn-toolbar:after{content:" ";display:table}.btn-toolbar:after{clear:both}.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>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-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-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle,.btn-group-lg.btn-group>.btn+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,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,.btn-group-lg>.btn .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret,.dropup .btn-group-lg>.btn .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:before,.btn-group-vertical>.btn-group:after{content:" ";display:table}.btn-group-vertical>.btn-group:after{clear:both}.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:0px;border-bottom-left-radius:0px;border-bottom-right-radius:0px}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:0px;border-top-left-radius:0;border-top-right-radius:0}.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-left-radius:0;border-bottom-right-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{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control: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:12px;font-weight:normal;line-height:1;color:#63676a;text-align:center;background-color:#2b2b2b;border:1px solid #63676a;border-radius:0px}.input-group-addon.input-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:5px 10px;font-size:11px;border-radius:3px}.input-group-addon.input-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:10px 16px;font-size:15px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{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:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{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:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{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:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{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{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav:before,.nav:after{content:" ";display:table}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:5px 6px 5px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#3c3f41}.nav>li.disabled>a{color:#63676a}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#63676a;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#3c3f41;border-color:#375959}.nav .nav-divider{height:1px;margin:5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #adadad}.nav-tabs>li{float:left;margin-bottom:-1px;margin-right:2px}.nav-tabs>li>a{line-height:1.5;border:1px solid transparent}.nav-tabs>li>a:hover{border-color:#adadad #adadad #adadad}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#313335;border:1px solid #adadad;border-bottom-color:transparent;cursor:default}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:0px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#375959}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified,.nav-tabs.nav-justified{width:100%}.nav-justified>li,.nav-tabs.nav-justified>li{float:none}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width: 780px){.nav-justified>li,.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified,.nav-tabs.nav-justified{border-bottom:0}.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:0px}.nav-tabs-justified>.active>a,.nav-tabs.nav-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width: 780px){.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:0px 0px 0 0}.nav-tabs-justified>.active>a,.nav-tabs.nav-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#1d1d1d}}.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:30px;margin-bottom:18px}.navbar:before,.navbar:after{content:" ";display:table}.navbar:after{clear:both}@media (min-width: 480px){.navbar{border-radius:0px}}.navbar-header:before,.navbar-header:after{content:" ";display:table}.navbar-header:after{clear:both}@media (min-width: 480px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:10px;padding-left:10px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{content:" ";display:table}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media (min-width: 480px){.navbar-collapse{width:auto;border-top:0;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-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.container>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-header,.container-fluid>.navbar-collapse{margin-right:-10px;margin-left:-10px}@media (min-width: 480px){.container>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-header,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width: 480px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width: 480px){.navbar-fixed-top,.navbar-fixed-bottom{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;padding:6px 10px;font-size:1.2em;line-height:18px;height:30px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width: 480px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-10px}}.navbar-toggle{position:relative;float:right;margin-right:10px;margin-left:10px;padding:6px 12px;margin-top:-2px;margin-bottom:-2px;background-color:#313335;background-image:none;border:1px solid #a0a0a0;border-radius:2px}.navbar-toggle:focus{outline:none}.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: 480px){.navbar-toggle{display:none}}.navbar-nav{margin:3px -10px;float:left;margin:0}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:18px}@media (max-width: 479px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:18px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}.navbar-nav>li{float:left;margin-right:2px}.navbar-nav>li>a{padding-top:6px;padding-bottom:6px}.navbar-nav.navbar-right:last-child{margin-right:-10px}@media (min-width: 480px){.navbar-left{float:left !important}.navbar-right{float:right !important}}.navbar-form{margin-left:-10px;margin-right:-10px;padding:10px 10px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:-1px;margin-bottom:-1px}@media (max-width: 479px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width: 480px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-10px}}.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{border-bottom-left-radius:0;border-bottom-right-radius:0}.navbar-btn{margin-top:-1px;margin-bottom:-1px}.navbar-btn.btn-sm,.btn-group-sm>.navbar-btn.btn{margin-top:1px;margin-bottom:1px}.navbar-btn.btn-xs,.btn-group-xs>.navbar-btn.btn{margin-top:4px;margin-bottom:4px}.navbar-text{margin-top:6px;margin-bottom:6px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;float:left;margin-left:10px;margin-right:10px}.navbar-text.navbar-right:last-child{margin-right:0}.navbar-default{background:rgba(43,43,43,0.9);border-color:none}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#568a89;background-color:rgba(0,0,0,0)}.navbar-default .navbar-text{color:#63676a}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#6caead;background-color:rgba(0,0,0,0)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus{color:#568a89;background-color:rgba(0,0,0,0)}.navbar-default .navbar-nav>.active>a:hover{color:#6caead}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#3c3f41;background-color:rgba(0,0,0,0)}.navbar-default .navbar-toggle{border-color:#477372;color:#2b2b2b;cursor:pointer}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{border-color:#518382;background-color:#3d4042}.navbar-default .navbar-toggle:hover .icon-bar,.navbar-default .navbar-toggle:focus .icon-bar{background-color:#568a89}.navbar-default .navbar-toggle .icon-bar{background-color:#477372}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:none}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:rgba(0,0,0,0);color:#568a89}@media (max-width: 479px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#6caead;background-color:rgba(0,0,0,0)}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#568a89;background-color:rgba(0,0,0,0)}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#3c3f41;background-color:rgba(0,0,0,0)}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#6caead}.navbar-inverse{background-color:#222;border-color:#090909}.navbar-inverse .navbar-brand{color:#63676a}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:rgba(0,0,0,0)}.navbar-inverse .navbar-text{color:#63676a}.navbar-inverse .navbar-nav>li>a{color:#63676a}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:rgba(0,0,0,0)}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#090909}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:rgba(0,0,0,0)}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{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:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#090909;color:#fff}@media (max-width: 479px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#090909}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#090909}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#63676a}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:rgba(0,0,0,0)}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#090909}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:rgba(0,0,0,0)}}.navbar-inverse .navbar-link{color:#63676a}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:0px 0px;margin-bottom:18px;list-style:none;background-color:none;border-radius:0px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/ ";padding:0 5px;color:#63676a}.breadcrumb>.active{color:#5cb85c}.pagination{display:inline-block;padding-left:0;margin:18px 0;border-radius:0px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.5;text-decoration:none;color:#375959;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:0px;border-bottom-left-radius:0px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:0px;border-bottom-right-radius:0px}.pagination>li>a:hover,.pagination>li>a:focus,.pagination>li>span:hover,.pagination>li>span:focus{color:#1a2a2a;background-color:#adadad;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:hover,.pagination>.active>a:focus,.pagination>.active>span,.pagination>.active>span:hover,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#375959;border-color:#375959;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#63676a;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:15px}.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:11px}.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:18px 0;list-style:none;text-align:center}.pager:before,.pager:after{content:" ";display:table}.pager:after{clear:both}.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:hover,.pager li>a:focus{text-decoration:none;background-color:#adadad}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#63676a;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:2px 5px;font-size:75%;font-weight:bold;line-height:1;color:#000;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:3px}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#63676a}.label-default[href]:hover,.label-default[href]:focus{background-color:#4a4d50}.label-primary{background-color:#375959}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#243939}.label-success{background-color:#4f9e4f}.label-success[href]:hover,.label-success[href]:focus{background-color:#3e7c3e}.label-info{background-color:#316490}.label-info[href]:hover,.label-info[href]:focus{background-color:#244a6a}.label-warning{background-color:#e28a0d}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#b26d0a}.label-danger{background-color:#a52521}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#7b1b19}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:11px;font-weight:bold;color:#eaeaea;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#63676a;text-indent:initial;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#375959;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.badge-warning{background-color:#e28a0d}.badge-danger{background-color:#a52521}.thumbnail{display:block;padding:4px;margin-bottom:18px;line-height:1.5;background-color:#1d1d1d;border:1px solid #ddd;border-radius:0px;-webkit-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}.thumbnail .caption{padding:9px;color:#63676a}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#375959}.alert{padding:15px;margin-bottom:18px;border:1px solid transparent;border-radius:0px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#d1e8d1;border-color:#4f9e4f;color:#2b2b2b}.alert-success hr{border-top-color:#478d47}.alert-success .alert-link{color:#121212}.alert-info{background-color:#abc9e2;border-color:#316490;color:#2b2b2b}.alert-info hr{border-top-color:#2b577d}.alert-info .alert-link{color:#121212}.alert-warning{background-color:#fdedd8;border-color:#e28a0d;color:#2b2b2b}.alert-warning hr{border-top-color:#ca7b0c}.alert-warning .alert-link{color:#121212}.alert-danger{background-color:#f6d1d0;border-color:#a52521;color:#2b2b2b}.alert-danger hr{border-top-color:#90201d}.alert-danger .alert-link{color:#121212}@-webkit-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{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f5f5f5;border-radius:0px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:11px;line-height:18px;color:#fff;text-align:center;background-color:#375959;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#4f9e4f}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#316490}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#e28a0d}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#a52521}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:6px 8px;background-color:#adadad;border-bottom:1px solid #63676a;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.list-group-item:first-child{border-top-left-radius:0px;border-top-right-radius:0px}.list-group-item:last-child{margin-bottom:0;border-bottom-left-radius:0px;border-bottom-right-radius:0px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#63676a;color:#1d1d1d}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#eaeaea;background-color:#375959;border-color:#375959}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#9bc1c1}.list-group-item-success{color:#2b2b2b;background-color:#d1e8d1}a.list-group-item-success{color:#2b2b2b}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#2b2b2b;background-color:#c0e0c0}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#2b2b2b;border-color:#2b2b2b}.list-group-item-info{color:#2b2b2b;background-color:#abc9e2}a.list-group-item-info{color:#2b2b2b}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#2b2b2b;background-color:#98bcdc}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#2b2b2b;border-color:#2b2b2b}.list-group-item-warning{color:#2b2b2b;background-color:#fdedd8}a.list-group-item-warning{color:#2b2b2b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#2b2b2b;background-color:#fbe3c0}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#2b2b2b;border-color:#2b2b2b}.list-group-item-danger{color:#2b2b2b;background-color:#f6d1d0}a.list-group-item-danger{color:#2b2b2b}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#2b2b2b;background-color:#f1bcba}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#2b2b2b;border-color:#2b2b2b}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:18px;background-color:#3c3f41;border:1px solid transparent;border-radius:5px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{content:" ";display:table}.panel-body:after{clear:both}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:4px;border-top-right-radius:4px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:13px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#353739;border-top:1px solid #313335;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:4px;border-top-left-radius:4px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-left-radius:4px;border-bottom-right-radius:4px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.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,.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-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-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{border-top-left-radius:4px}.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,.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-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-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{border-top-right-radius:4px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px}.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,.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{border-bottom-left-radius:4px}.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,.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{border-bottom-right-radius:4px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #313335}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.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,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>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{border:0;margin-bottom:0}.panel-group{margin-bottom:18px}.panel-group .panel{margin-bottom:0;border-radius:5px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #313335}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #313335}.panel-default{border-color:#1d1d1d}.panel-default>.panel-heading{color:#63676a;background-color:#353739;border-color:#1d1d1d}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#1d1d1d}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#1d1d1d}.panel-primary{border-color:#1d1d1d}.panel-primary>.panel-heading{color:#1d1d1d;background-color:#375959;border-color:#1d1d1d}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#1d1d1d}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#1d1d1d}.panel-success{border-color:#1d1d1d}.panel-success>.panel-heading{color:#2b2b2b;background-color:#d1e8d1;border-color:#1d1d1d}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#1d1d1d}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#1d1d1d}.panel-info{border-color:#1d1d1d}.panel-info>.panel-heading{color:#2b2b2b;background-color:#abc9e2;border-color:#1d1d1d}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#1d1d1d}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#1d1d1d}.panel-warning{border-color:#1d1d1d}.panel-warning>.panel-heading{color:#1d1d1d;background-color:#e28a0d;border-color:#1d1d1d}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#1d1d1d}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#1d1d1d}.panel-danger{border-color:#1d1d1d}.panel-danger>.panel-heading{color:#2b2b2b;background-color:#f6d1d0;border-color:#1d1d1d}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#1d1d1d}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#1d1d1d}.well{min-height:20px;padding:10px;margin-bottom:20px;background-color:#63676a;border:1px solid #313335;border-radius:5px;color:#2b2b2b;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well a{color:#6caead}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:7px;border-radius:3px}.close{float:right;font-size:18px;font-weight:bold;line-height:1;color:#a52521}.close:hover,.close:focus{color:#a52521;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:auto;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275);-moz-transition:-moz-transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275);-o-transition:-o-transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275);transition:transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275)}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);transform:translate(0, 0)}.modal-dialog{position:relative;width:auto;margin:10px;z-index:1050}.modal-content{position:relative;background-color:#3c3f41;border:none;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:initial;outline:none}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.3;filter:alpha(opacity=30)}.modal-header{padding:14px;border-bottom:1px solid #303234;min-height:15.5px;background-color:#353739}.modal-header .bootbox-close-button,.modal-body .bootbox-close-button{padding:0 5px;font-size:22px;margin-top:-2px}.modal-title{margin:0;line-height:1.5}.modal-body{position:relative;padding:14px;color:#adadad;border:none}.modal-footer{padding:13px 14px 14px;text-align:right;border-top:1px solid #303234;background-color:#353739}.modal-footer:before,.modal-footer:after{content:" ";display:table}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media (min-width: 780px){.modal-dialog{width:700px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width: 1200px){.modal-lg{width:1100px}}.tooltip{position:absolute;z-index:1010;display:block;visibility:visible;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:0px}.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{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right: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;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1030;display:none;max-width:276px;padding:0;text-align:left;background-color:#3c3f41;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);white-space:normal}.popover.top{margin-top:-7px}.popover.right{margin-left:7px}.popover.bottom{margin-top:7px}.popover.left{margin-left:-7px}.popover-title{margin:0;padding:8px 14px;font-size:12px;font-weight:normal;line-height:18px;background-color:#353739;border-bottom:1px solid #303234;border-top-left-radius:5px;border-top-right-radius:5px;color:#63676a}.popover-content{padding:7px 10px}.popover-content pre{margin-bottom:5px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:8px}.popover>.arrow:after{border-width:7px;content:""}.popover.top>.arrow{left:50%;margin-left:-8px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-8px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-7px;border-bottom-width:0;border-top-color:#63676a}.popover.right>.arrow{top:50%;left:-8px;margin-top:-8px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-7px;border-left-width:0;border-right-color:#63676a}.popover.bottom>.arrow{left:50%;margin-left:-8px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-8px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-7px;border-top-width:0;border-bottom-color:#63676a}.popover.left>.arrow{top:50%;right:-8px;margin-top:-8px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#63676a;bottom:-7px}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.center-block{display:block;margin-left:auto;margin-right: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;visibility:hidden !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}@media (max-width: 779px){.visible-xs{display:block !important}table.visible-xs{display:table}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (min-width: 780px) and (max-width: 1199px){.visible-sm{display:block !important}table.visible-sm{display:table}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width: 1200px) and (max-width: 1599px){.visible-md{display:block !important}table.visible-md{display:table}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width: 1600px){.visible-lg{display:block !important}table.visible-lg{display:table}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (max-width: 779px){.hidden-xs{display:none !important}}@media (min-width: 780px) and (max-width: 1199px){.hidden-sm{display:none !important}}@media (min-width: 1200px) and (max-width: 1599px){.hidden-md{display:none !important}}@media (min-width: 1600px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}@media print{.hidden-print{display:none !important}}/*! + * Font Awesome Free 5.9.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */.fa,.fas,.pf-landing .pf-landing-list li>i,.far,.fal,.fab{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg,.fa-tree-child{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw,.fa-tree-child,.pf-landing .pf-landing-list li>i,.modal-content h2[data-toggle="collapse"]:after,.modal-content h4[data-toggle="collapse"]:after,.panel-body h2[data-toggle="collapse"]:after,.panel-body h4[data-toggle="collapse"]:after{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li,.pf-landing .pf-landing-list li>i{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:solid 0.08em #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fas.fa-pull-left,.pf-landing .pf-landing-list li>i.fa-pull-left,.far.fa-pull-left,.fal.fa-pull-left,.fab.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fas.fa-pull-right,.pf-landing .pf-landing-list li>i.fa-pull-right,.far.fa-pull-right,.fal.fa-pull-right,.fab.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.fa-rotate-90,.fa-tree-child{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180,#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper.pf-character-active:after{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";transform:scale(1, -1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";transform:scale(-1, -1)}:root .fa-rotate-90,:root .fa-tree-child,:root .fa-rotate-180,:root #pf-landing-login .pf-dynamic-area .pf-character-image-wrapper.pf-character-active:after,#pf-landing-login .pf-dynamic-area :root .pf-character-image-wrapper.pf-character-active:after,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-flip-both{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before,.pf-landing .pf-landing-list li>i:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before,.fa-tree-child:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0, 0, 0, 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}/*! + * Font Awesome Free 5.9.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */@font-face{font-family:'Font Awesome 5 Free';font-style:normal;font-weight:400;font-display:auto;src:url("../../fonts/fa-regular-400.eot");src:url("../../fonts/fa-regular-400.eot?#iefix") format("embedded-opentype"),url("../../fonts/fa-regular-400.woff2") format("woff2"),url("../../fonts/fa-regular-400.woff") format("woff"),url("../../fonts/fa-regular-400.ttf") format("truetype"),url("../../fonts/fa-regular-400.svg#fontawesome") format("svg")}.far{font-family:'Font Awesome 5 Free';font-weight:400}/*! + * Font Awesome Free 5.9.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */@font-face{font-family:'Font Awesome 5 Free';font-style:normal;font-weight:900;font-display:auto;src:url("../../fonts/fa-solid-900.eot");src:url("../../fonts/fa-solid-900.eot?#iefix") format("embedded-opentype"),url("../../fonts/fa-solid-900.woff2") format("woff2"),url("../../fonts/fa-solid-900.woff") format("woff"),url("../../fonts/fa-solid-900.ttf") format("truetype"),url("../../fonts/fa-solid-900.svg#fontawesome") format("svg")}.fa,.fas,.pf-landing .pf-landing-list li>i{font-family:'Font Awesome 5 Free';font-weight:900}/*! + * Font Awesome Free 5.9.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */@font-face{font-family:'Font Awesome 5 Brands';font-style:normal;font-weight:normal;font-display:auto;src:url("../../fonts/fa-brands-400.eot");src:url("../../fonts/fa-brands-400.eot?#iefix") format("embedded-opentype"),url("../../fonts/fa-brands-400.woff2") format("woff2"),url("../../fonts/fa-brands-400.woff") format("woff"),url("../../fonts/fa-brands-400.ttf") format("truetype"),url("../../fonts/fa-brands-400.svg#fontawesome") format("svg")}.fab{font-family:'Font Awesome 5 Brands'}.mCustomScrollbar{-ms-touch-action:pinch-zoom;touch-action:pinch-zoom}.mCustomScrollbar.mCS_no_scrollbar,.mCustomScrollbar.mCS_touch_action{-ms-touch-action:auto;touch-action:auto}.mCustomScrollBox{position:relative;overflow:hidden;height:100%;max-width:100%;outline:none;direction:ltr}.mCSB_container{overflow:hidden;width:auto;height:auto}.mCSB_inside>.mCSB_container{margin-right:16px}.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container{margin-right:0;margin-left:16px}.mCS-dir-rtl>.mCSB_inside>.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-left:0}.mCSB_scrollTools{position:absolute;width:16px;height:auto;left:auto;top:0;right:0;bottom:0}.mCSB_outside+.mCSB_scrollTools{right:-26px}.mCS-dir-rtl>.mCSB_inside>.mCSB_scrollTools,.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{right:auto;left:0}.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{left:-26px}.mCSB_scrollTools .mCSB_draggerContainer{position:absolute;top:0;left:0;bottom:0;right:0;height:auto}.mCSB_scrollTools a+.mCSB_draggerContainer{margin:20px 0}.mCSB_scrollTools .mCSB_draggerRail{width:2px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCSB_scrollTools .mCSB_dragger{cursor:pointer;width:100%;height:30px;z-index:1}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{position:relative;width:4px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px;text-align:center}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:12px}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:8px}.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_buttonDown{display:block;position:absolute;height:20px;width:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools .mCSB_buttonDown{bottom:0}.mCSB_horizontal.mCSB_inside>.mCSB_container{margin-right:0;margin-bottom:16px}.mCSB_horizontal.mCSB_outside>.mCSB_container{min-height:100%}.mCSB_horizontal>.mCSB_container.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal{width:auto;height:16px;top:auto;right:0;bottom:0;left:0}.mCustomScrollBox+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:-26px}.mCSB_scrollTools.mCSB_scrollTools_horizontal a+.mCSB_draggerContainer{margin:0 20px}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:2px;margin:7px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger{width:30px;height:100%;left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:4px;margin:6px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:12px;margin:2px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:8px;margin:4px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft,.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{display:block;position:absolute;width:20px;height:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft{left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{right:0}.mCSB_container_wrapper{position:absolute;height:auto;width:auto;overflow:hidden;top:0;left:0;right:0;bottom:0;margin-right:16px;margin-bottom:16px}.mCSB_container_wrapper>.mCSB_container{padding-right:16px;padding-bottom:16px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:20px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:20px}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden+.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:0}.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools ~ .mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:20px}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools ~ .mCSB_scrollTools.mCSB_scrollTools_horizontal{left:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container_wrapper{margin-right:0;margin-left:16px}.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden>.mCSB_container{padding-right:0}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden>.mCSB_container{padding-bottom:0}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0;margin-left:0}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools,.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight{-webkit-transition:opacity .2s ease-in-out, background-color .2s ease-in-out;-moz-transition:opacity .2s ease-in-out, background-color .2s ease-in-out;-o-transition:opacity .2s ease-in-out, background-color .2s ease-in-out;transition:opacity .2s ease-in-out, background-color .2s ease-in-out}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail{-webkit-transition:width .2s ease-out .2s, height .2s ease-out .2s, margin-left .2s ease-out .2s, margin-right .2s ease-out .2s, margin-top .2s ease-out .2s, margin-bottom .2s ease-out .2s, opacity .2s ease-in-out, background-color .2s ease-in-out;-moz-transition:width .2s ease-out .2s, height .2s ease-out .2s, margin-left .2s ease-out .2s, margin-right .2s ease-out .2s, margin-top .2s ease-out .2s, margin-bottom .2s ease-out .2s, opacity .2s ease-in-out, background-color .2s ease-in-out;-o-transition:width .2s ease-out .2s, height .2s ease-out .2s, margin-left .2s ease-out .2s, margin-right .2s ease-out .2s, margin-top .2s ease-out .2s, margin-bottom .2s ease-out .2s, opacity .2s ease-in-out, background-color .2s ease-in-out;transition:width .2s ease-out .2s, height .2s ease-out .2s, margin-left .2s ease-out .2s, margin-right .2s ease-out .2s, margin-top .2s ease-out .2s, margin-bottom .2s ease-out .2s, opacity .2s ease-in-out, background-color .2s ease-in-out}.mCSB_scrollTools{opacity:0.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCS-autoHide>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide>.mCustomScrollBox ~ .mCSB_scrollTools{opacity:0;filter:"alpha(opacity=0)";-ms-filter:"alpha(opacity=0)"}.mCustomScrollbar>.mCustomScrollBox>.mCSB_scrollTools.mCSB_scrollTools_onDrag,.mCustomScrollbar>.mCustomScrollBox ~ .mCSB_scrollTools.mCSB_scrollTools_onDrag,.mCustomScrollBox:hover>.mCSB_scrollTools,.mCustomScrollBox:hover ~ .mCSB_scrollTools,.mCS-autoHide:hover>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide:hover>.mCustomScrollBox ~ .mCSB_scrollTools{opacity:1;filter:"alpha(opacity=100)";-ms-filter:"alpha(opacity=100)"}.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,0.4);filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#adadad;background-color:rgba(173,173,173,0.75);filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#e28a0d;background-color:rgba(226,138,13,0.85);filter:"alpha(opacity=85)";-ms-filter:"alpha(opacity=85)"}.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar{background-color:#e28a0d;background-color:rgba(226,138,13,0.9);filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAACQCAYAAACPtWCAAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoxMURDMzE5NzIzQkNFMTExOTY0QkYwNzFDNzkwNTlDNCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDOTMwRUZENEMxMUUxMUUzOUYxQkJGN0E1MDMzNTg1MCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDOTMwRUZEM0MxMUUxMUUzOUYxQkJGN0E1MDMzNTg1MCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MGJlMjMyZC1hNzgzLTI1NGQtOTI4Yy02NDI0YmQxNTg0YWEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MTFEQzMxOTcyM0JDRTExMTk2NEJGMDcxQzc5MDU5QzQiLz4gPC9yZGY6RGVzY3Jp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");background-repeat:no-repeat;opacity:0.4;filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_buttonUp{background-position:0 0}.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -20px}.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -40px}.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -56px}.mCSB_scrollTools .mCSB_buttonUp:hover,.mCSB_scrollTools .mCSB_buttonDown:hover,.mCSB_scrollTools .mCSB_buttonLeft:hover,.mCSB_scrollTools .mCSB_buttonRight:hover{opacity:0.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_buttonUp:active,.mCSB_scrollTools .mCSB_buttonDown:active,.mCSB_scrollTools .mCSB_buttonLeft:active,.mCSB_scrollTools .mCSB_buttonRight:active{opacity:0.9;filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCS-light-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail{width:6px;background-color:#000;background-color:rgba(0,0,0,0.2)}.mCS-light-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px}.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:6px;margin:5px 0}.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:12px}.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:12px;margin:2px 0}.mCS-light-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #3c3f41}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #3c3f41}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;*cursor:hand;background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("../img/data-tables/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("../img/data-tables/sort_asc.png")}table.dataTable thead .sorting_desc{background-image:url("../img/data-tables/sort_desc.png")}table.dataTable thead .sorting_asc_disabled{background-image:url("../img/data-tables/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("../img/data-tables/sort_desc_disabled.png")}table.dataTable tbody tr{background-color:#212121}table.dataTable tbody tr.selected{background-color:#1b2326}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #3c3f41}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#2b2b2b}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#1b2326}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{outline:1px solid #c2760c;outline-offset:-1px}table.dataTable.hover tbody tr:hover td,table.dataTable.display tbody tr:hover td{background-color:rgba(194,118,12,0.08)}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#925909}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#2b2b2b}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#212C30}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#1b2326}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:#101517}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#171e20}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#212C30}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#1b2326}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#101517}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#171e20}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:rgba(2,1,0,0.2)}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:rgba(0,0,0,0.2)}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:rgba(0,0,0,0.2)}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#885308}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #3c3f41}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 4px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.9em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.5em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.3em 0.8em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#6f7477 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#adadad !important;border:1px solid transparent;background-color:#313335;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #313335), color-stop(100%, #2b2b2b));background:-webkit-linear-gradient(top, #313335 0%, #2b2b2b 100%);background:-moz-linear-gradient(top, #313335 0%, #2b2b2b 100%);background:-ms-linear-gradient(top, #313335 0%, #2b2b2b 100%);background:-o-linear-gradient(top, #313335 0%, #2b2b2b 100%);background:linear-gradient(to bottom, #313335 0%, #2b2b2b 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#4f5355 !important;border:1px solid transparent;background:transparent;box-shadow:none;pointer-events:all;cursor:not-allowed}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:#313335 !important;border:1px solid transparent;background-color:#c2760c;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #c2760c), color-stop(100%, #c2760c));background:-webkit-linear-gradient(top, #c2760c 0%, #c2760c 100%);background:-moz-linear-gradient(top, #c2760c 0%, #c2760c 100%);background:-ms-linear-gradient(top, #c2760c 0%, #c2760c 100%);background:-o-linear-gradient(top, #c2760c 0%, #c2760c 100%);background:linear-gradient(to bottom, #c2760c 0%, #c2760c 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#c2760c;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #c2760c), color-stop(100%, #c2760c));background:-webkit-linear-gradient(top, #c2760c 0%, #c2760c 100%);background:-moz-linear-gradient(top, #c2760c 0%, #c2760c 100%);background:-ms-linear-gradient(top, #c2760c 0%, #c2760c 100%);background:-o-linear-gradient(top, #c2760c 0%, #c2760c 100%);background:linear-gradient(to bottom, #c2760c 0%, #c2760c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#63676a}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}}@keyframes dtb-spinner{100%{transform:rotate(360deg)}}@-o-keyframes dtb-spinner{100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes dtb-spinner{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes dtb-spinner{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes dtb-spinner{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}div.dt-button-info{position:fixed;top:50%;left:50%;width:400px;margin-top:-100px;margin-left:-200px;background-color:white;border:2px solid #111;box-shadow:3px 3px 8px rgba(0,0,0,0.3);border-radius:3px;text-align:center;z-index:21}div.dt-button-info h2{padding:0.5em;margin:0;font-weight:normal;border-bottom:1px solid #ddd;background-color:#f3f3f3}div.dt-button-info>div{padding:1em}div.dt-button-collection-title{text-align:center;padding:0.3em 0 0.5em;font-size:0.9em}div.dt-button-collection-title:empty{display:none}button.dt-button,div.dt-button,a.dt-button{position:relative;display:inline-block;box-sizing:border-box;margin-right:0.333em;margin-bottom:0.333em;padding:0.5em 1em;cursor:pointer;font-size:0.88em;line-height:1.6em;white-space:nowrap;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;outline:none}.dt-button embed{outline:none}div.dt-buttons{position:relative;float:left}div.dt-buttons.buttons-right{float:right}div.dt-button-collection{position:absolute;top:0;left:0;width:150px;margin-top:3px;padding:8px 8px 4px 8px;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.4);background-color:white;overflow:hidden;z-index:2002;border-radius:5px;box-shadow:3px 3px 5px rgba(0,0,0,0.3);-webkit-column-gap:8px;-moz-column-gap:8px;-ms-column-gap:8px;-o-column-gap:8px;column-gap:8px}div.dt-button-collection button.dt-button,div.dt-button-collection div.dt-button,div.dt-button-collection a.dt-button{position:relative;left:0;right:0;width:100%;display:block;float:none;margin-bottom:4px;margin-right:0}div.dt-button-collection button.dt-button:active:not(.disabled),div.dt-button-collection button.dt-button.active:not(.disabled),div.dt-button-collection div.dt-button:active:not(.disabled),div.dt-button-collection div.dt-button.active:not(.disabled),div.dt-button-collection a.dt-button:active:not(.disabled),div.dt-button-collection a.dt-button.active:not(.disabled){background-color:#dadada;background-image:-webkit-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-moz-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-ms-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:-o-linear-gradient(top, #f0f0f0 0%, #dadada 100%);background-image:linear-gradient(to bottom, #f0f0f0 0%, #dadada 100%);filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f0f0f0', EndColorStr='#dadada');box-shadow:inset 1px 1px 3px #666}div.dt-button-collection.fixed{position:fixed;top:50%;left:50%;margin-left:-75px;border-radius:0}div.dt-button-collection.fixed.two-column{margin-left:-150px}div.dt-button-collection.fixed.three-column{margin-left:-225px}div.dt-button-collection.fixed.four-column{margin-left:-300px}div.dt-button-collection>*{-webkit-column-break-inside:avoid;break-inside:avoid}div.dt-button-collection.two-column{width:300px;padding-bottom:1px;-webkit-column-count:2;-moz-column-count:2;-ms-column-count:2;-o-column-count:2;column-count:2}div.dt-button-collection.three-column{width:450px;padding-bottom:1px;-webkit-column-count:3;-moz-column-count:3;-ms-column-count:3;-o-column-count:3;column-count:3}div.dt-button-collection.four-column{width:600px;padding-bottom:1px;-webkit-column-count:4;-moz-column-count:4;-ms-column-count:4;-o-column-count:4;column-count:4}div.dt-button-collection .dt-button{border-radius:0}div.dt-button-background{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);background:-ms-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-moz-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-o-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:-webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0,0,0,0.3)), color-stop(1, rgba(0,0,0,0.7)));background:-webkit-radial-gradient(center, ellipse farthest-corner, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);background:radial-gradient(ellipse farthest-corner at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.7) 100%);z-index:2001}@media screen and (max-width: 640px){div.dt-buttons{float:none !important;text-align:center}}button.dt-button.processing,div.dt-button.processing,a.dt-button.processing{color:rgba(0,0,0,0.2)}button.dt-button.processing:after,div.dt-button.processing:after,a.dt-button.processing:after{position:absolute;top:50%;left:50%;width:16px;height:16px;margin:-8px 0 0 -8px;box-sizing:border-box;display:block;content:' ';border:2px solid #282828;border-radius:50%;border-left-color:transparent;border-right-color:transparent;animation:dtb-spinner 1500ms infinite linear;-o-animation:dtb-spinner 1500ms infinite linear;-ms-animation:dtb-spinner 1500ms infinite linear;-webkit-animation:dtb-spinner 1500ms infinite linear;-moz-animation:dtb-spinner 1500ms infinite linear}table.dataTable.dtr-inline.collapsed>tbody>tr>td.child,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty{cursor:default !important}table.dataTable.dtr-inline.collapsed>tbody>tr>td.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>th.child:before,table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty:before{display:none !important}table.dataTable.dtr-inline.collapsed>tbody>tr[role="row"]>td:first-child,table.dataTable.dtr-inline.collapsed>tbody>tr[role="row"]>th:first-child{position:relative;padding-left:30px;cursor:pointer}table.dataTable.dtr-inline.collapsed>tbody>tr[role="row"]>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr[role="row"]>th:first-child:before{top:9px;left:4px;height:14px;width:14px;display:block;position:absolute;color:#fff;border:2px solid white;border-radius:14px;box-shadow:0 0 3px #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:'Courier New', Courier, monospace;line-height:14px;content:'+';background-color:#31b131}table.dataTable.dtr-inline.collapsed>tbody>tr.parent>td:first-child:before,table.dataTable.dtr-inline.collapsed>tbody>tr.parent>th:first-child:before{content:'-';background-color:#d33333}table.dataTable.dtr-inline.collapsed.compact>tbody>tr>td:first-child,table.dataTable.dtr-inline.collapsed.compact>tbody>tr>th:first-child{padding-left:27px}table.dataTable.dtr-inline.collapsed.compact>tbody>tr>td:first-child:before,table.dataTable.dtr-inline.collapsed.compact>tbody>tr>th:first-child:before{top:5px;left:4px;height:14px;width:14px;border-radius:14px;line-height:14px;text-indent:3px}table.dataTable.dtr-column>tbody>tr>td.control,table.dataTable.dtr-column>tbody>tr>th.control{position:relative;cursor:pointer}table.dataTable.dtr-column>tbody>tr>td.control:before,table.dataTable.dtr-column>tbody>tr>th.control:before{top:50%;left:50%;height:16px;width:16px;margin-top:-10px;margin-left:-10px;display:block;position:absolute;color:#fff;border:2px solid white;border-radius:14px;box-shadow:0 0 3px #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:'Courier New', Courier, monospace;line-height:14px;content:'+';background-color:#31b131}table.dataTable.dtr-column>tbody>tr.parent td.control:before,table.dataTable.dtr-column>tbody>tr.parent th.control:before{content:'-';background-color:#d33333}table.dataTable>tbody>tr.child{padding:0.5em 1em}table.dataTable>tbody>tr.child:hover{background:transparent !important}table.dataTable>tbody>tr.child ul.dtr-details{display:inline-block;list-style-type:none;margin:0;padding:0}table.dataTable>tbody>tr.child ul.dtr-details>li{border-bottom:1px solid #efefef;padding:0.5em 0}table.dataTable>tbody>tr.child ul.dtr-details>li:first-child{padding-top:0}table.dataTable>tbody>tr.child ul.dtr-details>li:last-child{border-bottom:none}table.dataTable>tbody>tr.child span.dtr-title{display:inline-block;min-width:75px;font-weight:bold}div.dtr-modal{position:fixed;box-sizing:border-box;top:0;left:0;height:100%;width:100%;z-index:100;padding:10em 1em}div.dtr-modal div.dtr-modal-display{position:absolute;top:0;left:0;bottom:0;right:0;width:50%;height:50%;overflow:auto;margin:auto;z-index:102;overflow:auto;background-color:#f5f5f7;border:1px solid black;border-radius:0.5em;box-shadow:0 12px 30px rgba(0,0,0,0.6)}div.dtr-modal div.dtr-modal-content{position:relative;padding:1em}div.dtr-modal div.dtr-modal-close{position:absolute;top:6px;right:6px;width:22px;height:22px;border:1px solid #eaeaea;background-color:#f9f9f9;text-align:center;border-radius:3px;cursor:pointer;z-index:12}div.dtr-modal div.dtr-modal-close:hover{background-color:#eaeaea}div.dtr-modal div.dtr-modal-background{position:fixed;top:0;left:0;right:0;bottom:0;z-index:101;background:rgba(0,0,0,0.6)}@media screen and (max-width: 767px){div.dtr-modal div.dtr-modal-display{width:95%}}table.dataTable tbody>tr.selected,table.dataTable tbody>tr>.selected{background-color:#1b2326}table.dataTable.stripe tbody>tr.odd.selected,table.dataTable.stripe tbody>tr.odd>.selected,table.dataTable.display tbody>tr.odd.selected,table.dataTable.display tbody>tr.odd>.selected{background-color:#182022}table.dataTable.hover tbody>tr.selected:hover,table.dataTable.hover tbody>tr>.selected:hover,table.dataTable.display tbody>tr.selected:hover,table.dataTable.display tbody>tr>.selected:hover{background-color:#1a2225}table.dataTable.order-column tbody>tr.selected>.sorting_1,table.dataTable.order-column tbody>tr.selected>.sorting_2,table.dataTable.order-column tbody>tr.selected>.sorting_3,table.dataTable.order-column tbody>tr>.selected,table.dataTable.display tbody>tr.selected>.sorting_1,table.dataTable.display tbody>tr.selected>.sorting_2,table.dataTable.display tbody>tr.selected>.sorting_3,table.dataTable.display tbody>tr>.selected{background-color:#1a2225}table.dataTable.display tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_1{background-color:#1a2124}table.dataTable.display tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_2{background-color:#1a2124}table.dataTable.display tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_3{background-color:#1a2225}table.dataTable.display tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_1{background-color:#171e20}table.dataTable.display tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_2{background-color:#1b2326}table.dataTable.display tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_3{background-color:#1b2326}table.dataTable.display tbody>tr.odd>.selected,table.dataTable.order-column.stripe tbody>tr.odd>.selected{background-color:#1a2124}table.dataTable.display tbody>tr.even>.selected,table.dataTable.order-column.stripe tbody>tr.even>.selected{background-color:#1a2225}table.dataTable.display tbody>tr.selected:hover>.sorting_1,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_1{background-color:#192023}table.dataTable.display tbody>tr.selected:hover>.sorting_2,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_2{background-color:#192023}table.dataTable.display tbody>tr.selected:hover>.sorting_3,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_3{background-color:#192124}table.dataTable.display tbody>tr:hover>.selected,table.dataTable.display tbody>tr>.selected:hover,table.dataTable.order-column.hover tbody>tr:hover>.selected,table.dataTable.order-column.hover tbody>tr>.selected:hover{background-color:#192023}table.dataTable tbody td.select-checkbox,table.dataTable tbody th.select-checkbox{position:relative}table.dataTable tbody td.select-checkbox:before,table.dataTable tbody td.select-checkbox:after,table.dataTable tbody th.select-checkbox:before,table.dataTable tbody th.select-checkbox:after{display:block;position:absolute;top:1.2em;left:50%;width:12px;height:12px;box-sizing:border-box}table.dataTable tbody td.select-checkbox:before,table.dataTable tbody th.select-checkbox:before{content:' ';margin-top:-6px;margin-left:-6px;border:1px solid black;border-radius:3px}table.dataTable tr.selected td.select-checkbox:after,table.dataTable tr.selected th.select-checkbox:after{content:'\2714';margin-top:-11px;margin-left:-4px;text-align:center;text-shadow:1px 1px #B0BED9, -1px -1px #B0BED9, 1px -1px #B0BED9, -1px 1px #B0BED9}div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:0.5em}@media screen and (max-width: 640px){div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:0;display:block}}table.dataTable tr.dtrg-group{background-color:rgba(43,43,43,0.4)}table.dataTable tr.dtrg-group.dtrg-level-0 td{font-weight:bold}table.dataTable tr.dtrg-group.dtrg-level-1 td,table.dataTable tr.dtrg-group.dtrg-level-2 td{background-color:#f0f0f0;padding-top:0.25em;padding-bottom:0.25em;padding-left:2em;font-size:0.9em}table.dataTable tr.dtrg-group.dtrg-level-2 td{background-color:#f3f3f3}/*! + * DataTables + Font Awesome integration + * License: MIT - http://datatables.net/license + */table.dataTable thead th{position:relative;background-image:none !important}table.dataTable thead th.sorting:after,table.dataTable thead th.sorting_asc:after,table.dataTable thead th.sorting_desc:after{position:absolute;top:12px;right:5px;display:block;font-family:'Font Awesome 5 Free';margin-top:-8px}table.dataTable thead th.sorting:after{content:"\f0dc";font-size:0.8em;margin-top:-8px}table.dataTable thead th.sorting_asc:after{content:"\f0de";color:#5cb85c}table.dataTable thead th.sorting_desc:after{content:"\f0dd";color:#5cb85c}div.dataTables_scrollBody table.dataTable thead th.sorting:after,div.dataTables_scrollBody table.dataTable thead th.sorting_asc:after,div.dataTables_scrollBody table.dataTable thead th.sorting_desc:after{content:""}div.dataTables_paginate a.paginate_button.first,div.dataTables_paginate a.paginate_button.previous{position:relative;padding-left:24px}div.dataTables_paginate a.paginate_button.next,div.dataTables_paginate a.paginate_button.last{position:relative;padding-right:24px}div.dataTables_paginate a.first:before,div.dataTables_paginate a.previous:before{position:absolute;top:4px;left:10px;display:block;font-weight:bold;font-family:'Font Awesome 5 Free'}div.dataTables_paginate a.next:after,div.dataTables_paginate a.last:after{position:absolute;top:4px;right:10px;display:block;font-weight:bold;font-family:'Font Awesome 5 Free'}div.dataTables_paginate a.first:before{content:"\f100"}div.dataTables_paginate a.previous:before{content:"\f104"}div.dataTables_paginate a.next:after{content:"\f105"}div.dataTables_paginate a.last:after{content:"\f101"}/*! X-editable - v1.5.0 +* In-place editing with Twitter Bootstrap, jQuery UI or pure jQuery +* http://github.com/vitalets/x-editable +* Copyright (c) 2013 Vitaliy Potapov; Licensed MIT */.editableform{margin-bottom:0}.editableform .form-group{margin-left:0 !important}.editableform .control-group{margin-bottom:0;white-space:nowrap;line-height:20px}.editable-buttons{display:inline-block;vertical-align:top;margin-left:10px;zoom:1;*display:inline}.editable-buttons.editable-buttons-bottom{display:block;margin-top:5px;margin-left:0}.editable-input{vertical-align:top;display:inline-block;width:auto;white-space:normal;zoom:1;*display:inline}.editable-buttons button.ui-button-icon-only{height:24px;width:30px}.editableform-loading{height:25px;width:auto;min-width:25px;display:flex;flex-direction:column;justify-content:center;align-items:center}.editable-inline .editableform-loading{background-position:left 5px}.editable-error-block{max-width:300px;margin:5px 0 0 0;width:auto;white-space:normal}.editable-error-block.ui-state-error{padding:3px}.editable-error{color:red}.editableform .editable-date{padding:0;margin:0;float:left}.editable-inline .add-on .icon-th{margin-top:3px;margin-left:1px}.editable-checklist label input[type="checkbox"],.editable-input .editable-checklist>div>label>span input[type="checkbox"],.editable-checklist label input[type="radio"],.editable-input .editable-checklist>div>label>span input[type="radio"],.editable-checklist label span,.editable-input .editable-checklist>div>label>span span{vertical-align:middle;margin:0}.editable-checklist label,.editable-input .editable-checklist>div>label>span{white-space:nowrap}.editable-wysihtml5{width:566px;height:250px}.editable-clear{clear:both;font-size:0.9em;text-decoration:none;text-align:right}.editable-clear-x{display:block;width:13px;height:13px;position:absolute;opacity:0.6;z-index:100;top:50%;right:6px;margin-top:-6px}.editable-clear-x:hover{opacity:1}.editable-pre-wrapped{white-space:pre-wrap}.editable-container.editable-popup{max-width:none !important}.editable-container.popover{width:auto}.editable-container.editable-inline{display:inline-block;vertical-align:middle;width:auto;zoom:1;*display:inline}.editable-container.ui-widget{font-size:inherit;z-index:9990}.editable-click,a.editable-click,a.editable-click:hover{text-decoration:none}.editable-click.editable-disabled,a.editable-click.editable-disabled,a.editable-click.editable-disabled:hover{color:#585858;cursor:default;border-bottom:none}.editable-empty,.editable-empty:hover,.editable-empty:focus{font-style:italic;color:#d9534f;text-decoration:none}.editable-unsaved{font-weight:bold}.editable-bg-transition{-webkit-transition:background-color 1400ms ease-out;-moz-transition:background-color 1400ms ease-out;-o-transition:background-color 1400ms ease-out;-ms-transition:background-color 1400ms ease-out;transition:background-color 1400ms ease-out}.form-horizontal .editable{padding-top:5px;display:inline-block}/*! + * Datepicker for Bootstrap + * + * Copyright 2012 Stefan Petre + * Improvements by Andrew Rowls + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + */.datepicker{padding:4px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;direction:ltr}.datepicker-inline{width:220px}.datepicker.datepicker-rtl{direction:rtl}.datepicker.datepicker-rtl table tr td span{float:right}.datepicker-dropdown{top:0;left:0}.datepicker-dropdown:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute;top:-7px;left:6px}.datepicker-dropdown:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:7px}.datepicker>div{display:none}.datepicker.days div.datepicker-days{display:block}.datepicker.months div.datepicker-months{display:block}.datepicker.years div.datepicker-years{display:block}.datepicker table{margin:0}.datepicker td,.datepicker th{text-align:center;width:20px;height:20px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;border:none}.table-striped .datepicker table tr td,.table-striped .datepicker table tr th{background-color:transparent}.datepicker table tr td.day:hover{background:#eeeeee;cursor:pointer}.datepicker table tr td.old,.datepicker table tr td.new{color:#999999}.datepicker table tr td.disabled,.datepicker table tr td.disabled:hover{background:none;color:#999999;cursor:default}.datepicker table tr td.today,.datepicker table tr td.today:hover,.datepicker table tr td.today.disabled,.datepicker table tr td.today.disabled:hover{background-color:#fde19a;background-image:-moz-linear-gradient(top, #fdd49a, #fdf59a);background-image:-ms-linear-gradient(top, #fdd49a, #fdf59a);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));background-image:-webkit-linear-gradient(top, #fdd49a, #fdf59a);background-image:-o-linear-gradient(top, #fdd49a, #fdf59a);background-image:linear-gradient(top, #fdd49a, #fdf59a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);border-color:#fdf59a #fdf59a #fbed50;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#000}.datepicker table tr td.today:hover,.datepicker table tr td.today:hover:hover,.datepicker table tr td.today.disabled:hover,.datepicker table tr td.today.disabled:hover:hover,.datepicker table tr td.today:active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:hover.active,.datepicker table tr td.today.disabled,.datepicker table tr td.today:hover.disabled,.datepicker table tr td.today.disabled.disabled,.datepicker table tr td.today.disabled:hover.disabled,.datepicker table tr td.today[disabled],.datepicker table tr td.today:hover[disabled],.datepicker table tr td.today.disabled[disabled],.datepicker table tr td.today.disabled:hover[disabled]{background-color:#fdf59a}.datepicker table tr td.today:active,.datepicker table tr td.today:hover:active,.datepicker table tr td.today.disabled:active,.datepicker table tr td.today.disabled:hover:active,.datepicker table tr td.today.active,.datepicker table tr td.today:hover.active,.datepicker table tr td.today.disabled.active,.datepicker table tr td.today.disabled:hover.active{background-color:#fbf069 \9}.datepicker table tr td.today:hover:hover{color:#000}.datepicker table tr td.today.active:hover{color:#fff}.datepicker table tr td.range,.datepicker table tr td.range:hover,.datepicker table tr td.range.disabled,.datepicker table tr td.range.disabled:hover{background:#eeeeee;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.datepicker table tr td.range.today,.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today.disabled:hover{background-color:#f3d17a;background-image:-moz-linear-gradient(top, #f3c17a, #f3e97a);background-image:-ms-linear-gradient(top, #f3c17a, #f3e97a);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a));background-image:-webkit-linear-gradient(top, #f3c17a, #f3e97a);background-image:-o-linear-gradient(top, #f3c17a, #f3e97a);background-image:linear-gradient(top, #f3c17a, #f3e97a);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);border-color:#f3e97a #f3e97a #edde34;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.datepicker table tr td.range.today:hover,.datepicker table tr td.range.today:hover:hover,.datepicker table tr td.range.today.disabled:hover,.datepicker table tr td.range.today.disabled:hover:hover,.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:hover.active,.datepicker table tr td.range.today.disabled,.datepicker table tr td.range.today:hover.disabled,.datepicker table tr td.range.today.disabled.disabled,.datepicker table tr td.range.today.disabled:hover.disabled,.datepicker table tr td.range.today[disabled],.datepicker table tr td.range.today:hover[disabled],.datepicker table tr td.range.today.disabled[disabled],.datepicker table tr td.range.today.disabled:hover[disabled]{background-color:#f3e97a}.datepicker table tr td.range.today:active,.datepicker table tr td.range.today:hover:active,.datepicker table tr td.range.today.disabled:active,.datepicker table tr td.range.today.disabled:hover:active,.datepicker table tr td.range.today.active,.datepicker table tr td.range.today:hover.active,.datepicker table tr td.range.today.disabled.active,.datepicker table tr td.range.today.disabled:hover.active{background-color:#efe24b \9}.datepicker table tr td.selected,.datepicker table tr td.selected:hover,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected.disabled:hover{background-color:#9e9e9e;background-image:-moz-linear-gradient(top, #b3b3b3, gray);background-image:-ms-linear-gradient(top, #b3b3b3, gray);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(gray));background-image:-webkit-linear-gradient(top, #b3b3b3, gray);background-image:-o-linear-gradient(top, #b3b3b3, gray);background-image:linear-gradient(top, #b3b3b3, gray);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);border-color:#808080 #808080 #595959;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datepicker table tr td.selected:hover,.datepicker table tr td.selected:hover:hover,.datepicker table tr td.selected.disabled:hover,.datepicker table tr td.selected.disabled:hover:hover,.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:hover.active,.datepicker table tr td.selected.disabled,.datepicker table tr td.selected:hover.disabled,.datepicker table tr td.selected.disabled.disabled,.datepicker table tr td.selected.disabled:hover.disabled,.datepicker table tr td.selected[disabled],.datepicker table tr td.selected:hover[disabled],.datepicker table tr td.selected.disabled[disabled],.datepicker table tr td.selected.disabled:hover[disabled]{background-color:#808080}.datepicker table tr td.selected:active,.datepicker table tr td.selected:hover:active,.datepicker table tr td.selected.disabled:active,.datepicker table tr td.selected.disabled:hover:active,.datepicker table tr td.selected.active,.datepicker table tr td.selected:hover.active,.datepicker table tr td.selected.disabled.active,.datepicker table tr td.selected.disabled:hover.active{background-color:#666666 \9}.datepicker table tr td.active,.datepicker table tr td.active:hover,.datepicker table tr td.active.disabled,.datepicker table tr td.active.disabled:hover{background-color:#006dcc;background-image:-moz-linear-gradient(top, #08c, #04c);background-image:-ms-linear-gradient(top, #08c, #04c);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#04c));background-image:-webkit-linear-gradient(top, #08c, #04c);background-image:-o-linear-gradient(top, #08c, #04c);background-image:linear-gradient(top, #08c, #04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datepicker table tr td.active:hover,.datepicker table tr td.active:hover:hover,.datepicker table tr td.active.disabled:hover,.datepicker table tr td.active.disabled:hover:hover,.datepicker table tr td.active:active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:hover.active,.datepicker table tr td.active.disabled,.datepicker table tr td.active:hover.disabled,.datepicker table tr td.active.disabled.disabled,.datepicker table tr td.active.disabled:hover.disabled,.datepicker table tr td.active[disabled],.datepicker table tr td.active:hover[disabled],.datepicker table tr td.active.disabled[disabled],.datepicker table tr td.active.disabled:hover[disabled]{background-color:#0044cc}.datepicker table tr td.active:active,.datepicker table tr td.active:hover:active,.datepicker table tr td.active.disabled:active,.datepicker table tr td.active.disabled:hover:active,.datepicker table tr td.active.active,.datepicker table tr td.active:hover.active,.datepicker table tr td.active.disabled.active,.datepicker table tr td.active.disabled:hover.active{background-color:#003399 \9}.datepicker table tr td span{display:block;width:23%;height:54px;line-height:54px;float:left;margin:1%;cursor:pointer;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.datepicker table tr td span:hover{background:#eeeeee}.datepicker table tr td span.disabled,.datepicker table tr td span.disabled:hover{background:none;color:#999999;cursor:default}.datepicker table tr td span.active,.datepicker table tr td span.active:hover,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active.disabled:hover{background-color:#006dcc;background-image:-moz-linear-gradient(top, #08c, #04c);background-image:-ms-linear-gradient(top, #08c, #04c);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#08c), to(#04c));background-image:-webkit-linear-gradient(top, #08c, #04c);background-image:-o-linear-gradient(top, #08c, #04c);background-image:linear-gradient(top, #08c, #04c);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.datepicker table tr td span.active:hover,.datepicker table tr td span.active:hover:hover,.datepicker table tr td span.active.disabled:hover,.datepicker table tr td span.active.disabled:hover:hover,.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:hover.active,.datepicker table tr td span.active.disabled,.datepicker table tr td span.active:hover.disabled,.datepicker table tr td span.active.disabled.disabled,.datepicker table tr td span.active.disabled:hover.disabled,.datepicker table tr td span.active[disabled],.datepicker table tr td span.active:hover[disabled],.datepicker table tr td span.active.disabled[disabled],.datepicker table tr td span.active.disabled:hover[disabled]{background-color:#0044cc}.datepicker table tr td span.active:active,.datepicker table tr td span.active:hover:active,.datepicker table tr td span.active.disabled:active,.datepicker table tr td span.active.disabled:hover:active,.datepicker table tr td span.active.active,.datepicker table tr td span.active:hover.active,.datepicker table tr td span.active.disabled.active,.datepicker table tr td span.active.disabled:hover.active{background-color:#003399 \9}.datepicker table tr td span.old,.datepicker table tr td span.new{color:#999999}.datepicker th.datepicker-switch{width:145px}.datepicker thead tr:first-child th,.datepicker tfoot tr th{cursor:pointer}.datepicker thead tr:first-child th:hover,.datepicker tfoot tr th:hover{background:#eeeeee}.datepicker .cw{font-size:10px;width:12px;padding:0 2px 0 5px;vertical-align:middle}.datepicker thead tr:first-child th.cw{cursor:default;background-color:transparent}.input-append.date .add-on i,.input-prepend.date .add-on i{display:block;cursor:pointer;width:16px;height:16px}.input-daterange input{text-align:center}.input-daterange input:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-daterange input:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-daterange .add-on{display:inline-block;width:auto;min-width:16px;height:18px;padding:4px 5px;font-weight:normal;line-height:18px;text-align:center;text-shadow:0 1px 0 #ffffff;vertical-align:middle;background-color:#eeeeee;border:1px solid #ccc;margin-left:-5px;margin-right:-5px}/*! + * Slidebars - A jQuery Framework for Off-Canvas Menus and Sidebars + * Version: 2.0.2 + * Url: http://www.adchsm.com/slidebars/ + * Author: Adam Charles Smith + * Author url: http://www.adchsm.com/ + * License: MIT + * License url: http://www.adchsm.com/slidebars/license/ + */html,body,[canvas=container],[off-canvas]{margin:0;padding:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html,body{width:100%;height:100%}[canvas]{z-index:1}[canvas=container]{width:100%;min-height:100%;overflow-y:auto;position:relative;background-color:white;-webkit-overflow-scrolling:touch}[canvas=container]:before,[canvas=container]:after{clear:both;content:'';display:table}[off-canvas]{display:none;position:fixed;overflow:hidden;overflow-y:auto;background-color:black;color:white;-webkit-overflow-scrolling:touch}[off-canvas*=top]{width:100%;height:255px;top:0}[off-canvas*=right]{width:255px;height:100%;top:0;right:0}[off-canvas*=bottom]{width:100%;height:255px;bottom:0}[off-canvas*=left]{width:255px;height:100%;top:0;left:0}[off-canvas*=reveal]{z-index:0}[off-canvas*=push]{z-index:1}[off-canvas*=overlay]{z-index:9999}[off-canvas*=shift]{z-index:0}[canvas],[off-canvas]{-webkit-transform:translate(0px, 0px);-ms-transform:translate(0px, 0px);transform:translate(0px, 0px);-webkit-transition:-webkit-transform 300ms;transition:transform 300ms ease-in-out;-webkit-backface-visibility:hidden}[off-canvas*=shift][off-canvas*=top]{-webkit-transform:translate(0px, 50%);transform:translate(0px, 50%)}[off-canvas*=shift][off-canvas*=right]{-webkit-transform:translate(-50%, 0px);transform:translate(-50%, 0px)}[off-canvas*=shift][off-canvas*=bottom]{-webkit-transform:translate(0px, -50%);transform:translate(0px, -50%)}[off-canvas*=shift][off-canvas*=left]{-webkit-transform:translate(50%, 0px);transform:translate(50%, 0px)}@media print{[canvas]{-webkit-transform:translate(0px, 0px) !important;-ms-transform:translate(0px, 0px) !important;transform:translate(0px, 0px) !important}[off-canvas]{display:none !important}}.pf-pie-chart{position:relative !important;display:table-cell;text-align:center;vertical-align:middle}.pf-pie-chart span{display:inline-block}.pf-pie-chart canvas{position:absolute;top:0;left:0}.pf-pie-chart-map-timer{width:36px;height:36px;margin:3px}.pf-pie-chart-map-timer canvas{top:3px;left:3px}.pf-pie-chart-map-timer span{font-size:10px;color:#3c3f41}.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#313335;border:1px solid #63676a;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1080}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;color:#adadad;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--pathfinder .select2-selection--single{background-color:#313335;border:1px solid #63676a;border-radius:0;height:32px}.select2-container--pathfinder .select2-selection--single:focus{border:1px solid #568a89}.select2-container--pathfinder .select2-selection--single .select2-selection__rendered{color:#adadad;line-height:30px;font-family:'Oxygen Bold';padding-left:15px}.select2-container--pathfinder .select2-selection--single .select2-selection__rendered div[class^='col-']:first-child{padding-left:0}.select2-container--pathfinder .select2-selection--single .select2-selection__rendered>.fas.fa-long-arrow-alt-right,.select2-container--pathfinder .select2-selection--single .pf-landing .pf-landing-list li.select2-selection__rendered>i.fa-long-arrow-alt-right,.pf-landing .pf-landing-list .select2-container--pathfinder .select2-selection--single li.select2-selection__rendered>i.fa-long-arrow-alt-right{margin-left:8px}.select2-container--pathfinder .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--pathfinder .select2-selection--single .select2-selection__clear:hover{color:#58100d}.select2-container--pathfinder .select2-selection--single .select2-selection__placeholder{color:#63676a}.select2-container--pathfinder .select2-selection--single .select2-selection__arrow{height:30px;position:absolute;top:1px;right:1px;width:20px}.select2-container--pathfinder .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--pathfinder[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--pathfinder[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--pathfinder.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--pathfinder.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--pathfinder.select2-container--open .select2-selection--single{border:1px solid #568a89}.select2-container--pathfinder.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--pathfinder .select2-selection--multiple{background-color:#313335;border:1px solid #63676a;border-radius:0;cursor:text}.select2-container--pathfinder .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 12px;width:100%}.select2-container--pathfinder .select2-selection--multiple .select2-selection__rendered li{display:flex;list-style:none}.select2-container--pathfinder .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:0;padding:1px}.select2-container--pathfinder .select2-selection--multiple .select2-selection__choice{background-color:#adadad;border:1px solid #adadad;border-radius:0;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px;color:#313335;font-weight:bold}.select2-container--pathfinder .select2-selection--multiple .select2-selection__choice__remove{color:#a52521;cursor:pointer;display:inline-block;font-weight:bold;min-width:10px}.select2-container--pathfinder .select2-selection--multiple .select2-selection__choice__remove:hover{opacity:.5}.select2-container--pathfinder[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--pathfinder[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--pathfinder[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--pathfinder[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--pathfinder.select2-container--focus .select2-selection--multiple{border:solid #568a89 1px;outline:0}.select2-container--pathfinder.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--pathfinder.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--pathfinder.select2-container--open.select2-container--above .select2-selection--single,.select2-container--pathfinder.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0;border-top:0}.select2-container--pathfinder.select2-container--open.select2-container--below .select2-selection--single,.select2-container--pathfinder.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0;border-bottom:0}.select2-container--pathfinder .select2-search--dropdown .select2-search__field{border:1px solid #63676a}.select2-container--pathfinder .select2-search--dropdown .select2-search__field:focus{border:1px solid #568a89}.select2-container--pathfinder .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;-webkit-appearance:textfield;box-shadow:none !important}.select2-container--pathfinder .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--pathfinder .select2-results__option{padding:3px 6px;min-height:24px}.select2-container--pathfinder .select2-results__option>.clearfix.pf-result-image [class*="col-"]{line-height:22px}.select2-container--pathfinder .select2-results__option>.clearfix.pf-result-image [class*="col-"] img{height:22px}.select2-container--pathfinder .select2-results__option[role=group]{padding:0}.select2-container--pathfinder .select2-results__option[aria-disabled=true]{color:#63676a;background-color:#3c3f41}.select2-container--pathfinder .select2-results__option[aria-disabled=true] .pf-select-item-anchor{padding-left:15px}.select2-container--pathfinder .select2-results__option[aria-disabled=true] .pf-select-item-anchor:before{content:"\f05e";font-family:"Font Awesome 5 Free";font-weight:bold;font-size:9px;position:absolute;left:2px;top:0;color:#63676a}.select2-container--pathfinder .select2-results__option[aria-selected=true]{color:#63676a;background-color:#3c3f41}.select2-container--pathfinder .select2-results__option .select2-results__option{padding-left:1em}.select2-container--pathfinder .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--pathfinder .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--pathfinder .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--pathfinder .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--pathfinder .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--pathfinder .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--pathfinder .select2-results__option--highlighted[aria-selected]{background-color:#adadad;color:#313335}.select2-container--pathfinder .select2-results__group{cursor:default;display:block;padding:6px;background-color:#2b2b2b;color:#777}.select2-container--pathfinder.select2-container--open .select2-dropdown{border-color:#568a89;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.3);box-shadow:0 6px 12px rgba(0,0,0,0.3)}select.select2-hidden-accessible{-moz-appearance:none;-webkit-appearance:none}select[readonly].select2-hidden-accessible+.select2-container{pointer-events:none;touch-action:none}select[readonly].select2-hidden-accessible+.select2-container .select2-selection{background-color:#3c3f41}select[readonly].select2-hidden-accessible+.select2-container .select2-selection .select2-selection__arrow{background-color:#3c3f41}select[readonly].select2-hidden-accessible+.select2-container .select2-selection .select2-selection__clear{display:none}.blueimp-gallery,.blueimp-gallery>.slides>.slide>.slide-content{position:absolute;top:0;right:0;bottom:0;left:0;-moz-backface-visibility:hidden}.blueimp-gallery>.slides>.slide>.slide-content{margin:auto;width:auto;height:auto;max-width:100%;max-height:100%;opacity:1}.blueimp-gallery{position:fixed;z-index:999999;overflow:hidden;background:#000;background:rgba(0,0,0,0.3);opacity:0;display:none;direction:ltr;-ms-touch-action:none;touch-action:none}.blueimp-gallery-carousel{position:relative;z-index:auto;margin:1em auto;padding-bottom:56.25%;-webkit-box-shadow:0 4px 10px rgba(0,0,0,0.4);box-shadow:0 4px 10px rgba(0,0,0,0.4);border-radius:5px;-ms-touch-action:pan-y;touch-action:pan-y}.blueimp-gallery-display{display:block;opacity:1}.blueimp-gallery>.slides{position:relative;height:100%;overflow:hidden}.blueimp-gallery-carousel>.slides{position:absolute}.blueimp-gallery>.slides>.slide{position:relative;float:left;height:100%;text-align:center;will-change:all;-webkit-transition-timing-function:cubic-bezier(0.645, 0.045, 0.355, 1);-moz-transition-timing-function:cubic-bezier(0.645, 0.045, 0.355, 1);-ms-transition-timing-function:cubic-bezier(0.645, 0.045, 0.355, 1);-o-transition-timing-function:cubic-bezier(0.645, 0.045, 0.355, 1);transition-timing-function:cubic-bezier(0.645, 0.045, 0.355, 1)}.blueimp-gallery,.blueimp-gallery>.slides>.slide>.slide-content{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.blueimp-gallery>.slides>.slide-loading{background-size:64px 64px}.blueimp-gallery>.slides>.slide-loading>.slide-content{opacity:0}.blueimp-gallery>.slides>.slide-error>.slide-content{display:none}.blueimp-gallery>.prev,.blueimp-gallery>.next{position:absolute;top:50%;left:15px;width:35px;height:35px;margin-top:-17px;font-size:22px;line-height:35px;color:#63676a;text-decoration:none;text-align:center;background:rgba(0,0,0,0.2);border-radius:5px;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-transition:color 0.09s linear;transition:color 0.09s linear;will-change:color;opacity:1;cursor:pointer;display:none}.blueimp-gallery>.next{left:auto;right:15px}.blueimp-gallery>.close,.blueimp-gallery>.title{position:absolute;bottom:15px;left:15px;margin:0 40px 0 0;font-size:14px;line-height:14px;font-font:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;color:#63676a;text-shadow:0 1px 3px #1d1d1d;opacity:1;display:none}.blueimp-gallery>.title{margin-left:20px}.blueimp-gallery>.title:before{content:'\f101';font-family:'Font Awesome 5 Free';font-weight:bold;position:absolute;top:-1px;left:-20px;height:14px;width:14px}.blueimp-gallery>.close{padding:15px;right:15px;left:auto;margin:-15px;font-size:30px;text-decoration:none;cursor:pointer}.blueimp-gallery>.play-pause{position:absolute;right:15px;bottom:15px;width:35px;height:35px;font-size:22px;line-height:35px;text-align:center;background:rgba(0,0,0,0.2);border-radius:5px;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-transition:color 0.09s linear;transition:color 0.09s linear;will-change:color;color:#e28a0d;cursor:pointer;opacity:1;display:none}.blueimp-gallery-playing>.play-pause{color:#2b2b2b}.blueimp-gallery>.prev:hover,.blueimp-gallery>.next:hover,.blueimp-gallery>.close:hover,.blueimp-gallery>.play-pause:hover{color:#e28a0d}.blueimp-gallery-controls>.prev,.blueimp-gallery-controls>.next,.blueimp-gallery-controls>.close,.blueimp-gallery-controls>.title,.blueimp-gallery-controls>.play-pause{display:block;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0)}.blueimp-gallery-single>.prev,.blueimp-gallery-left>.prev,.blueimp-gallery-single>.next,.blueimp-gallery-right>.next,.blueimp-gallery-single>.play-pause{display:none}.blueimp-gallery>.slides>.slide>.slide-content,.blueimp-gallery>.prev,.blueimp-gallery>.next,.blueimp-gallery>.close,.blueimp-gallery>.play-pause{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body:last-child .blueimp-gallery-playing>.play-pause{background-position:-20px 0}*+html .blueimp-gallery>.slides>.slide{min-height:300px}*+html .blueimp-gallery>.slides>.slide>.slide-content{position:relative}.blueimp-gallery>.slides>.slide>.text-content{overflow:auto;margin:0 auto;overflow:hidden;text-align:left}.blueimp-gallery .modal-body{position:relative;text-align:center;padding:0 0 56.25% 0;overflow:hidden;cursor:pointer}.blueimp-gallery .modal-footer{margin:0}.blueimp-gallery .modal-body img,.blueimp-gallery .modal-body .video-content video,.blueimp-gallery .modal-body .video-content iframe,.blueimp-gallery .modal-body .video-content a{max-width:100%;max-height:100%;margin:auto;position:absolute;top:0;right:0;bottom:0;left:0}.blueimp-gallery .modal-body .video-content video{display:none}.blueimp-gallery .modal-body .video-playing video{display:block}.blueimp-gallery .modal-body .video-content iframe{width:100%;height:100%;border:none;left:100%}.blueimp-gallery .modal-body .video-playing iframe{left:0}.blueimp-gallery .modal-body .video-playing img,.blueimp-gallery .modal-body .video-playing a{display:none}.blueimp-gallery .modal-body .video-content a{cursor:pointer}.blueimp-gallery .modal-body .video-content a:after{font-family:"Glyphicons Halflings";-webkit-font-smoothing:antialiased;content:"\e029";font-size:64px;line-height:64px;width:64px;height:64px;position:absolute;top:50%;margin:-32px 0 0 -32px}.blueimp-gallery .modal-body .video-loading a{background:url(../img/loading.gif) center no-repeat;background-size:64px 64px}.blueimp-gallery .modal-body .video-loading a:after{content:none}@media screen and (min-width: 768px){.blueimp-gallery .modal-dialog{right:auto;left:auto;width:auto;max-width:1200px;padding-left:5%;padding-right:5%}}.blueimp-gallery .modal-body{position:relative;text-align:center;padding:0 0 56.25% 0;overflow:hidden;cursor:pointer}.blueimp-gallery .modal-footer{margin:0}.blueimp-gallery .modal-body img,.blueimp-gallery .modal-body .video-content video,.blueimp-gallery .modal-body .video-content iframe,.blueimp-gallery .modal-body .video-content a{max-width:100%;max-height:100%;margin:auto;position:absolute;top:0;right:0;bottom:0;left:0}.blueimp-gallery .modal-body .video-content video{display:none}.blueimp-gallery .modal-body .video-playing video{display:block}.blueimp-gallery .modal-body .video-content iframe{width:100%;height:100%;border:none;left:100%}.blueimp-gallery .modal-body .video-playing iframe{left:0}.blueimp-gallery .modal-body .video-playing img,.blueimp-gallery .modal-body .video-playing a{display:none}.blueimp-gallery .modal-body .video-content a{cursor:pointer}.blueimp-gallery .modal-body .video-content a:after{font-family:"Glyphicons Halflings";-webkit-font-smoothing:antialiased;content:"\e029";font-size:64px;line-height:64px;width:64px;height:64px;position:absolute;top:50%;margin:-32px 0 0 -32px}.blueimp-gallery .modal-body .video-loading a{background:url(../img/loading.gif) center no-repeat;background-size:64px 64px}.blueimp-gallery .modal-body .video-loading a:after{content:none}@media screen and (min-width: 768px){.blueimp-gallery .modal-dialog{right:auto;left:auto;width:auto;max-width:1200px;padding-left:5%;padding-right:5%}}/*! ======================================================================== + * Bootstrap Toggle: bootstrap-toggle.css v2.2.0 + * http://www.bootstraptoggle.com + * ======================================================================== + * Copyright 2014 Min Hur, The New York Times Company + * Licensed under MIT + * ======================================================================== */.checkbox label .toggle,.editable-input .editable-checklist>div>label label .toggle,.editable-input .checkbox .editable-checklist>div>label>span .toggle,.editable-input .editable-checklist>div>label>span .toggle,.checkbox-inline .toggle{margin-left:-20px;margin-right:5px}.toggle{position:relative;overflow:hidden}.toggle input[type="checkbox"]{display:none}.toggle-group{position:absolute;width:200%;top:0;bottom:0;left:0;transition:left 0.18s ease-in-out;-webkit-transition:left 0.18s ease-in-out;-moz-user-select:none;-webkit-user-select:none}.toggle.off .toggle-group{left:-100%}.toggle-on{position:absolute;top:0;bottom:0;left:0;right:50%;margin:0;border:0;border-radius:0}.toggle-off{position:absolute;top:0;bottom:0;left:50%;right:0;margin:0;border:0;border-radius:0}.toggle-handle{position:relative;margin:0 auto;padding-top:0;padding-bottom:0;height:100%;width:0;border-width:0 1px;background:#54585a}.toggle.btn{min-width:59px;min-height:34px}.toggle-on.btn{padding-right:24px}.toggle-off.btn{padding-left:24px}.toggle.btn-lg,.btn-group-lg>.toggle.btn{min-width:79px;min-height:45px}.toggle-on.btn-lg,.btn-group-lg>.toggle-on.btn{padding-right:31px}.toggle-off.btn-lg,.btn-group-lg>.toggle-off.btn{padding-left:31px}.toggle-handle.btn-lg,.btn-group-lg>.toggle-handle.btn{width:40px}.toggle.btn-sm,.btn-group-sm>.toggle.btn{min-width:50px;min-height:28px}.toggle-on.btn-sm,.btn-group-sm>.toggle-on.btn{padding-right:10px;padding-left:0}.toggle-off.btn-sm,.btn-group-sm>.toggle-off.btn{padding-left:10px;padding-right:0}.toggle.btn-xs,.btn-group-xs>.toggle.btn{min-width:35px;min-height:22px}.toggle-on.btn-xs,.btn-group-xs>.toggle-on.btn{padding-right:5px}.toggle-off.btn-xs,.btn-group-xs>.toggle-off.btn{padding-left:5px}.checkbox,.editable-input .editable-checklist>div>label{padding-left:20px}.checkbox label,.editable-input .editable-checklist>div>label label,.editable-input .checkbox .editable-checklist>div>label>span,.editable-input .editable-checklist>div>label>span{display:inline-block;vertical-align:middle;position:relative;padding-left:5px}.checkbox label::before,.editable-input .editable-checklist>div>label label::before,.editable-input .checkbox .editable-checklist>div>label>span::before,.editable-input .editable-checklist>div>label>span::before{content:"";display:inline-block;position:absolute;width:17px;height:17px;left:0;margin-left:-20px;border:1px solid #63676a;border-radius:3px;background-color:#313335;-webkit-transition:border 0.18s ease,color 0.18s ease,background-color 0.18s ease;transition:border 0.18s ease,color 0.18s ease,background-color 0.18s ease}.checkbox label::after,.editable-input .editable-checklist>div>label label::after,.editable-input .checkbox .editable-checklist>div>label>span::after,.editable-input .editable-checklist>div>label>span::after{font-family:"Font Awesome 5 Free";content:"\f00c";font-weight:bold;display:inline-block;position:absolute;width:16px;height:16px;left:0;top:0;opacity:0;transform:scale(2) rotateZ(-20deg);transition:all .18s ease-out;will-change:transform, opacity;margin-left:-20px;padding-left:3px;padding-top:1px;font-size:calc(100% - 1px);color:#adadad}.checkbox input[type="checkbox"],.editable-input .editable-checklist>div>label input[type="checkbox"],.checkbox input[type="radio"],.editable-input .editable-checklist>div>label input[type="radio"]{opacity:0;z-index:1;cursor:pointer}.checkbox input[type="checkbox"]:checked+label::after,.editable-input .editable-checklist>div>label input[type="checkbox"]:checked+label::after,.editable-input .checkbox .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.checkbox input[type="radio"]:checked+label::after,.editable-input .editable-checklist>div>label input[type="radio"]:checked+label::after,.editable-input .checkbox .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after{font-family:"Font Awesome 5 Free";content:"\f00c"}.checkbox input[type="checkbox"]:checked+label::after,.editable-input .editable-checklist>div>label input[type="checkbox"]:checked+label::after,.editable-input .checkbox .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.checkbox input[type="radio"]:checked+label::after,.editable-input .editable-checklist>div>label input[type="radio"]:checked+label::after,.editable-input .checkbox .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after{transform:scale(1) rotateZ(0deg);opacity:1}.checkbox input[type="checkbox"]:indeterminate+label::after,.editable-input .editable-checklist>div>label input[type="checkbox"]:indeterminate+label::after,.editable-input .checkbox .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.checkbox input[type="radio"]:indeterminate+label::after,.editable-input .editable-checklist>div>label input[type="radio"]:indeterminate+label::after,.editable-input .checkbox .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after,.editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after{display:block;content:"";width:10px;height:3px;background-color:#555555;border-radius:2px;margin-left:-16.5px;margin-top:7px}.checkbox input[type="checkbox"]:disabled+label,.editable-input .editable-checklist>div>label input[type="checkbox"]:disabled+label,.editable-input .checkbox .editable-checklist>div>label>input[type="checkbox"]:disabled+span,.editable-input .editable-checklist>div>label>input[type="checkbox"]:disabled+span,.checkbox input[type="radio"]:disabled+label,.editable-input .editable-checklist>div>label input[type="radio"]:disabled+label,.editable-input .checkbox .editable-checklist>div>label>input[type="radio"]:disabled+span,.editable-input .editable-checklist>div>label>input[type="radio"]:disabled+span{opacity:0.65}.checkbox input[type="checkbox"]:disabled+label::before,.editable-input .editable-checklist>div>label input[type="checkbox"]:disabled+label::before,.editable-input .checkbox .editable-checklist>div>label>input[type="checkbox"]:disabled+span::before,.editable-input .editable-checklist>div>label>input[type="checkbox"]:disabled+span::before,.checkbox input[type="radio"]:disabled+label::before,.editable-input .editable-checklist>div>label input[type="radio"]:disabled+label::before,.editable-input .checkbox .editable-checklist>div>label>input[type="radio"]:disabled+span::before,.editable-input .editable-checklist>div>label>input[type="radio"]:disabled+span::before{background-color:#3c3f41;cursor:not-allowed}.checkbox.checkbox-circle label::before,.editable-input .editable-checklist>div>label.checkbox-circle label::before,.checkbox.checkbox-circle .editable-input .editable-checklist>div>label>span::before,.editable-input .checkbox.checkbox-circle .editable-checklist>div>label>span::before,.editable-input .editable-checklist>div>label.checkbox-circle .editable-checklist>div>label>span::before{border-radius:50%}.checkbox.checkbox-inline,.editable-input .editable-checklist>div>label.checkbox-inline{margin-top:0}.checkbox-primary input[type="checkbox"]:checked+label::before,.checkbox-primary .editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::before,.editable-input .checkbox-primary .editable-checklist>div>label>input[type="checkbox"]:checked+span::before,.checkbox-primary input[type="radio"]:checked+label::before,.checkbox-primary .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::before,.editable-input .checkbox-primary .editable-checklist>div>label>input[type="radio"]:checked+span::before{background-color:#375959;border-color:#375959}.checkbox-primary input[type="checkbox"]:checked+label::after,.checkbox-primary .editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.editable-input .checkbox-primary .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.checkbox-primary input[type="radio"]:checked+label::after,.checkbox-primary .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .checkbox-primary .editable-checklist>div>label>input[type="radio"]:checked+span::after{color:#fff}.checkbox-danger input[type="checkbox"]:checked+label::before,.checkbox-danger .editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::before,.editable-input .checkbox-danger .editable-checklist>div>label>input[type="checkbox"]:checked+span::before,.checkbox-danger input[type="radio"]:checked+label::before,.checkbox-danger .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::before,.editable-input .checkbox-danger .editable-checklist>div>label>input[type="radio"]:checked+span::before{background-color:#a52521;border-color:#a52521}.checkbox-danger input[type="checkbox"]:checked+label::after,.checkbox-danger .editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.editable-input .checkbox-danger .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.checkbox-danger input[type="radio"]:checked+label::after,.checkbox-danger .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .checkbox-danger .editable-checklist>div>label>input[type="radio"]:checked+span::after{color:#fff}.checkbox-info input[type="checkbox"]:checked+label::before,.checkbox-info .editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::before,.editable-input .checkbox-info .editable-checklist>div>label>input[type="checkbox"]:checked+span::before,.checkbox-info input[type="radio"]:checked+label::before,.checkbox-info .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::before,.editable-input .checkbox-info .editable-checklist>div>label>input[type="radio"]:checked+span::before{background-color:#316490;border-color:#316490}.checkbox-info input[type="checkbox"]:checked+label::after,.checkbox-info .editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.editable-input .checkbox-info .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.checkbox-info input[type="radio"]:checked+label::after,.checkbox-info .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .checkbox-info .editable-checklist>div>label>input[type="radio"]:checked+span::after{color:#fff}.checkbox-warning input[type="checkbox"]:checked+label::before,.checkbox-warning .editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::before,.editable-input .checkbox-warning .editable-checklist>div>label>input[type="checkbox"]:checked+span::before,.checkbox-warning input[type="radio"]:checked+label::before,.checkbox-warning .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::before,.editable-input .checkbox-warning .editable-checklist>div>label>input[type="radio"]:checked+span::before{background-color:#e28a0d;border-color:#e28a0d}.checkbox-warning input[type="checkbox"]:checked+label::after,.checkbox-warning .editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.editable-input .checkbox-warning .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.checkbox-warning input[type="radio"]:checked+label::after,.checkbox-warning .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .checkbox-warning .editable-checklist>div>label>input[type="radio"]:checked+span::after{color:#fff}.checkbox-success input[type="checkbox"]:checked+label::before,.checkbox-success .editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::before,.editable-input .checkbox-success .editable-checklist>div>label>input[type="checkbox"]:checked+span::before,.checkbox-success input[type="radio"]:checked+label::before,.checkbox-success .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::before,.editable-input .checkbox-success .editable-checklist>div>label>input[type="radio"]:checked+span::before{background-color:#4f9e4f;border-color:#4f9e4f}.checkbox-success input[type="checkbox"]:checked+label::after,.checkbox-success .editable-input .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.editable-input .checkbox-success .editable-checklist>div>label>input[type="checkbox"]:checked+span::after,.checkbox-success input[type="radio"]:checked+label::after,.checkbox-success .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .checkbox-success .editable-checklist>div>label>input[type="radio"]:checked+span::after{color:#fff}.checkbox-primary input[type="checkbox"]:indeterminate+label::before,.checkbox-primary .editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::before,.editable-input .checkbox-primary .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::before,.checkbox-primary input[type="radio"]:indeterminate+label::before,.checkbox-primary .editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::before,.editable-input .checkbox-primary .editable-checklist>div>label>input[type="radio"]:indeterminate+span::before{background-color:#375959;border-color:#375959}.checkbox-primary input[type="checkbox"]:indeterminate+label::after,.checkbox-primary .editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.editable-input .checkbox-primary .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.checkbox-primary input[type="radio"]:indeterminate+label::after,.checkbox-primary .editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after,.editable-input .checkbox-primary .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after{background-color:#fff}.checkbox-danger input[type="checkbox"]:indeterminate+label::before,.checkbox-danger .editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::before,.editable-input .checkbox-danger .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::before,.checkbox-danger input[type="radio"]:indeterminate+label::before,.checkbox-danger .editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::before,.editable-input .checkbox-danger .editable-checklist>div>label>input[type="radio"]:indeterminate+span::before{background-color:#a52521;border-color:#a52521}.checkbox-danger input[type="checkbox"]:indeterminate+label::after,.checkbox-danger .editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.editable-input .checkbox-danger .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.checkbox-danger input[type="radio"]:indeterminate+label::after,.checkbox-danger .editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after,.editable-input .checkbox-danger .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after{background-color:#fff}.checkbox-info input[type="checkbox"]:indeterminate+label::before,.checkbox-info .editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::before,.editable-input .checkbox-info .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::before,.checkbox-info input[type="radio"]:indeterminate+label::before,.checkbox-info .editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::before,.editable-input .checkbox-info .editable-checklist>div>label>input[type="radio"]:indeterminate+span::before{background-color:#316490;border-color:#316490}.checkbox-info input[type="checkbox"]:indeterminate+label::after,.checkbox-info .editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.editable-input .checkbox-info .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.checkbox-info input[type="radio"]:indeterminate+label::after,.checkbox-info .editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after,.editable-input .checkbox-info .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after{background-color:#fff}.checkbox-warning input[type="checkbox"]:indeterminate+label::before,.checkbox-warning .editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::before,.editable-input .checkbox-warning .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::before,.checkbox-warning input[type="radio"]:indeterminate+label::before,.checkbox-warning .editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::before,.editable-input .checkbox-warning .editable-checklist>div>label>input[type="radio"]:indeterminate+span::before{background-color:#e28a0d;border-color:#e28a0d}.checkbox-warning input[type="checkbox"]:indeterminate+label::after,.checkbox-warning .editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.editable-input .checkbox-warning .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.checkbox-warning input[type="radio"]:indeterminate+label::after,.checkbox-warning .editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after,.editable-input .checkbox-warning .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after{background-color:#fff}.checkbox-success input[type="checkbox"]:indeterminate+label::before,.checkbox-success .editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::before,.editable-input .checkbox-success .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::before,.checkbox-success input[type="radio"]:indeterminate+label::before,.checkbox-success .editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::before,.editable-input .checkbox-success .editable-checklist>div>label>input[type="radio"]:indeterminate+span::before{background-color:#4f9e4f;border-color:#4f9e4f}.checkbox-success input[type="checkbox"]:indeterminate+label::after,.checkbox-success .editable-input .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.editable-input .checkbox-success .editable-checklist>div>label>input[type="checkbox"]:indeterminate+span::after,.checkbox-success input[type="radio"]:indeterminate+label::after,.checkbox-success .editable-input .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after,.editable-input .checkbox-success .editable-checklist>div>label>input[type="radio"]:indeterminate+span::after{background-color:#fff}.radio{padding-left:20px}.radio label,.radio .editable-input .editable-checklist>div>label>span,.editable-input .radio .editable-checklist>div>label>span{display:inline-block;vertical-align:middle;position:relative;padding-left:5px}.radio label::before,.radio .editable-input .editable-checklist>div>label>span::before,.editable-input .radio .editable-checklist>div>label>span::before{content:"";display:inline-block;position:absolute;width:17px;height:17px;left:0;margin-left:-20px;border:1px solid #63676a;border-radius:50%;background-color:#313335;-webkit-transition:border 0.18s ease,color 0.18s ease;transition:border 0.18s ease,color 0.18s ease}.radio label::after,.radio .editable-input .editable-checklist>div>label>span::after,.editable-input .radio .editable-checklist>div>label>span::after{display:inline-block;position:absolute;content:" ";width:11px;height:11px;left:3px;top:3px;opacity:0;transform:scale(2) rotateZ(-20deg);transition:all .18s ease;will-change:transform, opacity;margin-left:-20px;border-radius:50%;background-color:#adadad;-webkit-transform:scale(0,0);-ms-transform:scale(0,0);transform:scale(0,0);-webkit-transition:-webkit-transform 0.18s cubic-bezier(0.8, -0.33, 0.2, 1.33);-moz-transition:-moz-transform 0.18s cubic-bezier(0.8, -0.33, 0.2, 1.33);-o-transition:-o-transform 0.18s cubic-bezier(0.8, -0.33, 0.2, 1.33);transition:transform 0.18s cubic-bezier(0.8, -0.33, 0.2, 1.33)}.radio input[type="radio"]{opacity:0;z-index:1;cursor:pointer}.radio input[type="radio"]:checked+label::after,.radio .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .radio .editable-checklist>div>label>input[type="radio"]:checked+span::after{-webkit-transform:scale(1,1);-ms-transform:scale(1,1);transform:scale(1,1);opacity:1}.radio input[type="radio"]:disabled+label,.radio .editable-input .editable-checklist>div>label>input[type="radio"]:disabled+span,.editable-input .radio .editable-checklist>div>label>input[type="radio"]:disabled+span{opacity:0.65}.radio input[type="radio"]:disabled+label::before,.radio .editable-input .editable-checklist>div>label>input[type="radio"]:disabled+span::before,.editable-input .radio .editable-checklist>div>label>input[type="radio"]:disabled+span::before{cursor:not-allowed}.radio.radio-inline{margin-top:0}.radio-primary input[type="radio"]+label::after,.radio-primary .editable-input .editable-checklist>div>label>input[type="radio"]+span::after,.editable-input .radio-primary .editable-checklist>div>label>input[type="radio"]+span::after{background-color:#375959}.radio-primary input[type="radio"]:checked+label::before,.radio-primary .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::before,.editable-input .radio-primary .editable-checklist>div>label>input[type="radio"]:checked+span::before{border-color:#375959}.radio-primary input[type="radio"]:checked+label::after,.radio-primary .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .radio-primary .editable-checklist>div>label>input[type="radio"]:checked+span::after{background-color:#375959}.radio-danger input[type="radio"]+label::after,.radio-danger .editable-input .editable-checklist>div>label>input[type="radio"]+span::after,.editable-input .radio-danger .editable-checklist>div>label>input[type="radio"]+span::after{background-color:#a52521}.radio-danger input[type="radio"]:checked+label::before,.radio-danger .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::before,.editable-input .radio-danger .editable-checklist>div>label>input[type="radio"]:checked+span::before{border-color:#a52521}.radio-danger input[type="radio"]:checked+label::after,.radio-danger .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .radio-danger .editable-checklist>div>label>input[type="radio"]:checked+span::after{background-color:#a52521}.radio-info input[type="radio"]+label::after,.radio-info .editable-input .editable-checklist>div>label>input[type="radio"]+span::after,.editable-input .radio-info .editable-checklist>div>label>input[type="radio"]+span::after{background-color:#316490}.radio-info input[type="radio"]:checked+label::before,.radio-info .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::before,.editable-input .radio-info .editable-checklist>div>label>input[type="radio"]:checked+span::before{border-color:#316490}.radio-info input[type="radio"]:checked+label::after,.radio-info .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .radio-info .editable-checklist>div>label>input[type="radio"]:checked+span::after{background-color:#316490}.radio-warning input[type="radio"]+label::after,.radio-warning .editable-input .editable-checklist>div>label>input[type="radio"]+span::after,.editable-input .radio-warning .editable-checklist>div>label>input[type="radio"]+span::after{background-color:#e28a0d}.radio-warning input[type="radio"]:checked+label::before,.radio-warning .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::before,.editable-input .radio-warning .editable-checklist>div>label>input[type="radio"]:checked+span::before{border-color:#e28a0d}.radio-warning input[type="radio"]:checked+label::after,.radio-warning .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .radio-warning .editable-checklist>div>label>input[type="radio"]:checked+span::after{background-color:#e28a0d}.radio-success input[type="radio"]+label::after,.radio-success .editable-input .editable-checklist>div>label>input[type="radio"]+span::after,.editable-input .radio-success .editable-checklist>div>label>input[type="radio"]+span::after{background-color:#4f9e4f}.radio-success input[type="radio"]:checked+label::before,.radio-success .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::before,.editable-input .radio-success .editable-checklist>div>label>input[type="radio"]:checked+span::before{border-color:#4f9e4f}.radio-success input[type="radio"]:checked+label::after,.radio-success .editable-input .editable-checklist>div>label>input[type="radio"]:checked+span::after,.editable-input .radio-success .editable-checklist>div>label>input[type="radio"]:checked+span::after{background-color:#4f9e4f}input[type="checkbox"].styled:checked+label:after,.editable-input .editable-checklist>div>label>input[type="checkbox"].styled:checked+span:after,input[type="radio"].styled:checked+label:after,.editable-input .editable-checklist>div>label>input[type="radio"].styled:checked+span:after{font-family:"Font Awesome 5 Free";content:"\f00c"}input[type="checkbox"] .styled:checked+label::before,input[type="checkbox"] .editable-input .editable-checklist>div>label>.styled:checked+span::before,.editable-input input[type="checkbox"] .editable-checklist>div>label>.styled:checked+span::before,input[type="radio"] .styled:checked+label::before,input[type="radio"] .editable-input .editable-checklist>div>label>.styled:checked+span::before,.editable-input input[type="radio"] .editable-checklist>div>label>.styled:checked+span::before{color:#fff}input[type="checkbox"] .styled:checked+label::after,input[type="checkbox"] .editable-input .editable-checklist>div>label>.styled:checked+span::after,.editable-input input[type="checkbox"] .editable-checklist>div>label>.styled:checked+span::after,input[type="radio"] .styled:checked+label::after,input[type="radio"] .editable-input .editable-checklist>div>label>.styled:checked+span::after,.editable-input input[type="radio"] .editable-checklist>div>label>.styled:checked+span::after{color:#fff}@font-face{font-family:"summernote";font-style:normal;font-weight:normal;src:url("../../fonts/summernote.eot?dbafe969167589eda84514394d126413");src:url("../../fonts/summernote.eot?#iefix") format("embedded-opentype"),url("../../fonts/summernote.woff?dbafe969167589eda84514394d126413") format("woff"),url("../../fonts/summernote.ttf?dbafe969167589eda84514394d126413") format("truetype")}[class^="note-icon-"]:before,[class*=" note-icon-"]:before{display:inline-block;font:normal normal normal 14px summernote;font-size:inherit;-webkit-font-smoothing:antialiased;text-decoration:inherit;text-rendering:auto;text-transform:none;vertical-align:middle;speak:none;-moz-osx-font-smoothing:grayscale}.note-icon-align-center:before,.note-icon-align-indent:before,.note-icon-align-justify:before,.note-icon-align-left:before,.note-icon-align-outdent:before,.note-icon-align-right:before,.note-icon-align:before,.note-icon-arrow-circle-down:before,.note-icon-arrow-circle-left:before,.note-icon-arrow-circle-right:before,.note-icon-arrow-circle-up:before,.note-icon-arrows-alt:before,.note-icon-arrows-h:before,.note-icon-arrows-v:before,.note-icon-bold:before,.note-icon-caret:before,.note-icon-chain-broken:before,.note-icon-circle:before,.note-icon-close:before,.note-icon-code:before,.note-icon-col-after:before,.note-icon-col-before:before,.note-icon-col-remove:before,.note-icon-eraser:before,.note-icon-font:before,.note-icon-frame:before,.note-icon-italic:before,.note-icon-link:before,.note-icon-magic:before,.note-icon-menu-check:before,.note-icon-minus:before,.note-icon-orderedlist:before,.note-icon-pencil:before,.note-icon-picture:before,.note-icon-question:before,.note-icon-redo:before,.note-icon-row-above:before,.note-icon-row-below:before,.note-icon-row-remove:before,.note-icon-special-character:before,.note-icon-square:before,.note-icon-strikethrough:before,.note-icon-subscript:before,.note-icon-summernote:before,.note-icon-superscript:before,.note-icon-table:before,.note-icon-text-height:before,.note-icon-trash:before,.note-icon-underline:before,.note-icon-undo:before,.note-icon-unorderedlist:before,.note-icon-video:before{display:inline-block;font-family:"summernote";font-style:normal;font-weight:normal;text-decoration:inherit}.note-icon-align-center:before{content:"\f101"}.note-icon-align-indent:before{content:"\f102"}.note-icon-align-justify:before{content:"\f103"}.note-icon-align-left:before{content:"\f104"}.note-icon-align-outdent:before{content:"\f105"}.note-icon-align-right:before{content:"\f106"}.note-icon-align:before{content:"\f107"}.note-icon-arrow-circle-down:before{content:"\f108"}.note-icon-arrow-circle-left:before{content:"\f109"}.note-icon-arrow-circle-right:before{content:"\f10a"}.note-icon-arrow-circle-up:before{content:"\f10b"}.note-icon-arrows-alt:before{content:"\f10c"}.note-icon-arrows-h:before{content:"\f10d"}.note-icon-arrows-v:before{content:"\f10e"}.note-icon-bold:before{content:"\f10f"}.note-icon-caret:before{content:"\f110"}.note-icon-chain-broken:before{content:"\f111"}.note-icon-circle:before{content:"\f112"}.note-icon-close:before{content:"\f113"}.note-icon-code:before{content:"\f114"}.note-icon-col-after:before{content:"\f115"}.note-icon-col-before:before{content:"\f116"}.note-icon-col-remove:before{content:"\f117"}.note-icon-eraser:before{content:"\f118"}.note-icon-font:before{content:"\f119"}.note-icon-frame:before{content:"\f11a"}.note-icon-italic:before{content:"\f11b"}.note-icon-link:before{content:"\f11c"}.note-icon-magic:before{content:"\f11d"}.note-icon-menu-check:before{content:"\f11e"}.note-icon-minus:before{content:"\f11f"}.note-icon-orderedlist:before{content:"\f120"}.note-icon-pencil:before{content:"\f121"}.note-icon-picture:before{content:"\f122"}.note-icon-question:before{content:"\f123"}.note-icon-redo:before{content:"\f124"}.note-icon-row-above:before{content:"\f125"}.note-icon-row-below:before{content:"\f126"}.note-icon-row-remove:before{content:"\f127"}.note-icon-special-character:before{content:"\f128"}.note-icon-square:before{content:"\f129"}.note-icon-strikethrough:before{content:"\f12a"}.note-icon-subscript:before{content:"\f12b"}.note-icon-summernote:before{content:"\f12c"}.note-icon-superscript:before{content:"\f12d"}.note-icon-table:before{content:"\f12e"}.note-icon-text-height:before{content:"\f12f"}.note-icon-trash:before{content:"\f130"}.note-icon-underline:before{content:"\f131"}.note-icon-undo:before{content:"\f132"}.note-icon-unorderedlist:before{content:"\f133"}.note-icon-video:before{content:"\f134"}.note-editor{position:relative}.note-editor .note-dropzone{position:absolute;z-index:100;display:none;color:#87cefa;background-color:#fff;opacity:.95}.note-editor .note-dropzone .note-dropzone-message{display:table-cell;font-size:28px;font-weight:700;text-align:center;vertical-align:middle}.note-editor .note-dropzone.hover{color:#098ddf}.note-editor.dragover .note-dropzone{display:table}.note-editor .note-editing-area{position:relative}.note-editor .note-editing-area .note-editable{outline:0}.note-editor .note-editing-area .note-editable sup{vertical-align:super}.note-editor .note-editing-area .note-editable sub{vertical-align:sub}.note-editor .note-editing-area img.note-float-left{margin-right:10px}.note-editor .note-editing-area img.note-float-right{margin-left:10px}.note-editor.note-frame{border:1px solid #a9a9a9}.note-editor.note-frame.codeview .note-editing-area .note-editable{display:none}.note-editor.note-frame.codeview .note-editing-area .note-codable{display:block}.note-editor.note-frame .note-editing-area{overflow:hidden}.note-editor.note-frame .note-editing-area .note-editable{padding:10px;overflow:auto;color:#000;word-wrap:break-word;background-color:#fff}.note-editor.note-frame .note-editing-area .note-editable[contenteditable="false"]{background-color:#e5e5e5}.note-editor.note-frame .note-editing-area .note-codable{display:none;width:100%;padding:10px;margin-bottom:0;font-family:Menlo, Monaco, monospace, sans-serif;font-size:14px;color:#ccc;background-color:#222;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;box-shadow:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;resize:none}.note-editor.note-frame.fullscreen{position:fixed;top:0;left:0;z-index:1050;width:100% !important}.note-editor.note-frame.fullscreen .note-editable{background-color:#fff}.note-editor.note-frame.fullscreen .note-resizebar{display:none}.note-editor.note-frame .note-status-output{display:block;width:100%;height:20px;margin-bottom:0;font-size:14px;line-height:1.42857143;color:#000;border:0;border-top:1px solid #e2e2e2}.note-editor.note-frame .note-status-output:empty{height:0;border-top:0 solid transparent;padding-top:0}.note-editor.note-frame .note-statusbar{background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.note-editor.note-frame .note-statusbar .note-resizebar{width:100%;height:9px;padding-top:1px;cursor:ns-resize}.note-editor.note-frame .note-statusbar .note-resizebar .note-icon-bar{width:20px;margin:1px auto;border-top:1px solid #a9a9a9}.note-editor.note-frame .note-statusbar.locked .note-resizebar{cursor:default}.note-editor.note-frame .note-statusbar.locked .note-resizebar .note-icon-bar{display:none}.note-editor.note-frame .note-placeholder{padding:10px}.note-popover.popover{max-width:none}.note-popover.popover .popover-content a{display:inline-block;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle;margin-top:5px}.note-popover.popover .arrow{left:20px !important}.note-toolbar{position:relative;z-index:500}.note-popover .popover-content,.panel-heading.note-toolbar{padding:0 0 5px 5px;margin:0}.note-popover .popover-content>.btn-group,.panel-heading.note-toolbar>.btn-group{margin-top:5px;margin-right:5px;margin-left:0}.note-popover .popover-content .btn-group .note-table,.panel-heading.note-toolbar .btn-group .note-table{min-width:0;padding:5px}.note-popover .popover-content .btn-group .note-table .note-dimension-picker,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker{font-size:18px}.note-popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-mousecatcher{position:absolute !important;z-index:3;width:10em;height:10em;cursor:pointer}.note-popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-unhighlighted{position:relative !important;z-index:1;width:5em;height:5em;opacity:0.75;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIj4+Pjp6ekKlAqjAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKhmnaJzPAAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat}.note-popover .popover-content .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted,.panel-heading.note-toolbar .btn-group .note-table .note-dimension-picker .note-dimension-picker-highlighted{position:absolute !important;z-index:2;width:1em;height:1em;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASAgMAAAAroGbEAAAACVBMVEUAAIjd6vvD2f9LKLW+AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfYAR0BKwNDEVT0AAAAG0lEQVQI12NgAAOtVatWMTCohoaGUY+EmIkEAEruEzK2J7tvAAAAAElFTkSuQmCC") repeat}.note-popover .popover-content .note-style .dropdown-style blockquote,.panel-heading.note-toolbar .note-style .dropdown-style blockquote,.note-popover .popover-content .note-style .dropdown-style pre,.panel-heading.note-toolbar .note-style .dropdown-style pre{padding:5px 10px;margin:0}.note-popover .popover-content .note-style .dropdown-style h1,.panel-heading.note-toolbar .note-style .dropdown-style h1,.note-popover .popover-content .note-style .dropdown-style h2,.panel-heading.note-toolbar .note-style .dropdown-style h2,.note-popover .popover-content .note-style .dropdown-style h3,.panel-heading.note-toolbar .note-style .dropdown-style h3,.note-popover .popover-content .note-style .dropdown-style h4,.panel-heading.note-toolbar .note-style .dropdown-style h4,.note-popover .popover-content .note-style .dropdown-style h5,.panel-heading.note-toolbar .note-style .dropdown-style h5,.note-popover .popover-content .note-style .dropdown-style h6,.panel-heading.note-toolbar .note-style .dropdown-style h6,.note-popover .popover-content .note-style .dropdown-style p,.panel-heading.note-toolbar .note-style .dropdown-style p{padding:0;margin:0}.note-popover .popover-content .note-color .dropdown-toggle,.panel-heading.note-toolbar .note-color .dropdown-toggle{width:20px;padding-left:5px}.note-popover .popover-content .note-color .dropdown-menu,.panel-heading.note-toolbar .note-color .dropdown-menu{min-width:337px}.note-popover .popover-content .note-color .dropdown-menu .note-palette,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette{display:inline-block;width:160px;margin:0}.note-popover .popover-content .note-color .dropdown-menu .note-palette:first-child,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette:first-child{margin:0 5px}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-palette-title,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette .note-palette-title{margin:2px 7px;font-size:12px;text-align:center;border-bottom:1px solid #63676a}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-color-reset,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette .note-color-reset{width:100%;padding:0 3px;margin:3px;font-size:11px;cursor:pointer;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-color-row,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette .note-color-row{height:20px}.note-popover .popover-content .note-color .dropdown-menu .note-palette .note-color-reset:hover,.panel-heading.note-toolbar .note-color .dropdown-menu .note-palette .note-color-reset:hover{background:#eee}.note-popover .popover-content .note-para .dropdown-menu,.panel-heading.note-toolbar .note-para .dropdown-menu{min-width:216px;padding:5px}.note-popover .popover-content .note-para .dropdown-menu>div:first-child,.panel-heading.note-toolbar .note-para .dropdown-menu>div:first-child{margin-right:5px}.note-popover .popover-content .dropdown-menu,.panel-heading.note-toolbar .dropdown-menu{min-width:90px}.note-popover .popover-content .dropdown-menu:not(.dropdown-style),.panel-heading.note-toolbar .dropdown-menu:not(.dropdown-style){color:#adadad;background-color:#3c3f41}.note-popover .popover-content .dropdown-menu.right,.panel-heading.note-toolbar .dropdown-menu.right{right:0;left:auto}.note-popover .popover-content .dropdown-menu.right::before,.panel-heading.note-toolbar .dropdown-menu.right::before{right:9px;left:auto !important}.note-popover .popover-content .dropdown-menu.right::after,.panel-heading.note-toolbar .dropdown-menu.right::after{right:10px;left:auto !important}.note-popover .popover-content .dropdown-menu.note-check li a i,.panel-heading.note-toolbar .dropdown-menu.note-check li a i{color:deepskyblue;visibility:hidden}.note-popover .popover-content .dropdown-menu.note-check li a.checked i,.panel-heading.note-toolbar .dropdown-menu.note-check li a.checked i{visibility:visible}.note-popover .popover-content .note-fontsize-10,.panel-heading.note-toolbar .note-fontsize-10{font-size:10px}.note-popover .popover-content .note-color-palette,.panel-heading.note-toolbar .note-color-palette{line-height:1}.note-popover .popover-content .note-color-palette div .note-color-btn,.panel-heading.note-toolbar .note-color-palette div .note-color-btn{width:20px;height:20px;padding:0;margin:0;border:1px solid #63676a;cursor:pointer}.note-popover .popover-content .note-color-palette div .note-color-btn:hover,.panel-heading.note-toolbar .note-color-palette div .note-color-btn:hover{border:1px solid #3c3f41}.note-dialog>div{display:none}.note-dialog .form-group{margin-right:0;margin-left:0}.note-dialog .note-modal-form{margin:0}.note-dialog .note-image-dialog .note-dropzone{min-height:100px;margin-bottom:10px;font-size:30px;line-height:4;color:lightgray;text-align:center;border:4px dashed lightgray}@-moz-document url-prefix(){.note-image-input{height:auto}}.note-placeholder{position:absolute;display:none;color:gray}.note-handle .note-control-selection{position:absolute;display:none;border:1px solid #000}.note-handle .note-control-selection>div{position:absolute}.note-handle .note-control-selection .note-control-selection-bg{width:100%;height:100%;background-color:#000;-webkit-opacity:.3;-khtml-opacity:.3;-moz-opacity:.3;opacity:.3;-ms-filter:alpha(opacity=30);filter:alpha(opacity=30)}.note-handle .note-control-selection .note-control-handle{width:7px;height:7px;border:1px solid #000}.note-handle .note-control-selection .note-control-holder{width:7px;height:7px;border:1px solid #000}.note-handle .note-control-selection .note-control-sizing{width:7px;height:7px;background-color:#fff;border:1px solid #000}.note-handle .note-control-selection .note-control-nw{top:-5px;left:-5px;border-right:0;border-bottom:0}.note-handle .note-control-selection .note-control-ne{top:-5px;right:-5px;border-bottom:0;border-left:none}.note-handle .note-control-selection .note-control-sw{bottom:-5px;left:-5px;border-top:0;border-right:0}.note-handle .note-control-selection .note-control-se{right:-5px;bottom:-5px;cursor:se-resize}.note-handle .note-control-selection .note-control-se.note-control-holder{cursor:default;border-top:0;border-left:none}.note-handle .note-control-selection .note-control-selection-info{right:0;bottom:0;padding:5px;margin:5px;font-size:12px;color:#fff;background-color:#000;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-opacity:.7;-khtml-opacity:.7;-moz-opacity:.7;opacity:.7;-ms-filter:alpha(opacity=70);filter:alpha(opacity=70)}.note-hint-popover{min-width:100px;padding:2px}.note-hint-popover .popover-content{max-height:150px;padding:3px;overflow:auto}.note-hint-popover .popover-content .note-hint-group .note-hint-item{display:block !important;padding:3px}.note-hint-popover .popover-content .note-hint-group .note-hint-item.active,.note-hint-popover .popover-content .note-hint-group .note-hint-item:hover{display:block;clear:both;font-weight:400;line-height:1.4;color:#fff;text-decoration:none;white-space:nowrap;cursor:pointer;background-color:#428bca;outline:0}html{margin:0;padding:0;height:100%;position:relative}body{margin:0;padding:0;min-height:100%;direction:ltr}body.mobile-view-activated.hidden-menu{overflow-x:hidden}body.modal-open{overflow:hidden !important}a:hover,a:active,a:focus,button,button:active,button:focus,object,embed,input::-moz-focus-inner{outline:0}h1,h3,h4{margin:0;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.page-title{margin:12px 0 28px}.page-title span{font-size:15px;color:#313335;display:inline-block;vertical-align:1px}label,.editable-input .editable-checklist>div>label>span{font-weight:normal}*:not(td):focus{outline:0 !important}a,input,button{-ms-touch-action:none !important}textarea:focus,select:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{outline:0;outline:thin dotted \9;box-shadow:inset -1px 1px 5px 0 rgba(0,0,0,0.8) !important}.input-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn,.input-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn,.input-xs,.form-control{border-radius:0px !important;-webkit-border-radius:0px !important;-moz-border-radius:0px !important}.input-xs{height:24px;padding:2px 10px;font-size:11px;line-height:1.5}.btn-xs,.btn-group-xs>.btn{padding:0px 2px;font-size:10px;line-height:1.3}.btn-sm,.btn-group-sm>.btn{padding:5px 8px 4px}.btn-lg,.btn-group-lg>.btn{padding:10px 16px}.no-space{margin:0}.no-space>[class*="col-"]{margin:0 !important;padding-right:0;padding-left:0}.h1,.h2,.h3,.h4,.h5,.h6{display:inline-block}h1,.h1{letter-spacing:-1px;font-size:22px;margin:10px 0}h1 small,h1 .small,.h1 small,.h1 .small{font-size:12px;font-weight:300;letter-spacing:-1px}h2,.h2{font-size:20px;margin:20px 0;line-height:normal}h3,.h3{display:block;font-size:17px;font-weight:400;margin:20px 0;line-height:normal}h4,.h4{line-height:normal;margin:20px 0 10px 0}h5,.h5{font-size:14px;font-weight:300;margin-top:0;margin-bottom:10px;line-height:normal}h6,.h6{font-size:13px;margin:10px 0;font-weight:bold;line-height:normal}.row-seperator-header{margin:15px 14px 20px;border-bottom:none;display:block;color:#303133;font-size:20px;font-weight:400}.center-canvas,.center-child-canvas>canvas{display:block !important;margin:0 auto !important}.form-control{box-shadow:none !important;-webkit-box-shadow:none !important;-moz-box-shadow:none !important}.form hr{margin-left:-13px;margin-right:-13px;border-color:rgba(0,0,0,0.1);margin-top:20px;margin-bottom:20px}.form fieldset{display:block;border:none;background:rgba(255,255,255,0.9);position:relative}fieldset{position:relative}.popover-content .form-actions{margin:0 -14px -9px;border-radius:0 0 3px 3px;padding:9px 14px}.no-padding .form .form-actions{margin:0;display:block;padding:13px 14px 15px;border-top:1px solid rgba(0,0,0,0.1);background:rgba(248,248,248,0.9);text-align:right;margin-top:25px}.form header,legend{display:block;padding:8px 0;border-bottom:1px dashed rgba(0,0,0,0.2);background:#fff;font-size:16px;font-weight:300;color:#2b2b2b;margin:25px 0px 20px}.no-padding .form header{margin:25px 14px 0}.form header:first-child{margin-top:10px}legend{font-weight:400;margin-top:0px;background:none}.input-group-addon{padding:6px 10px;will-change:background-color, border-color;border-radius:0;-webkit-transition:all ease-out 0.15s;transition:all ease-out 0.15s}.input-group-addon .fa{font-size:14px}.input-group-addon .fa-lg,.input-group-addon .fa-tree-child,.input-group-addon .fa-2x{font-size:2em}.input-group-addon .fa-3x,.input-group-addon .fa-4x,.input-group-addon .fa-5x{font-size:30px}input[type="text"]:focus+.input-group-addon,input[type="password"]:focus+.input-group-addon,input[type="email"]:focus+.input-group-addon{border-color:#568a89;color:#568a89}.has-warning input[type="text"],.has-warning input[type="text"]+.input-group-addon{border-color:#e28a0d}.has-warning input[type="text"]+.input-group-addon{background-color:#fbe3c0;color:#2b2b2b}.has-warning input[type="text"]:focus,.has-warning input[type="text"]:focus+.input-group-addon{border-color:#e28a0d}.has-warning input[type="text"]:focus+.input-group-addon{background-color:#e28a0d;color:#fff}.has-error .input-group-addon{border-color:#d9534f !important;background:#d9534f !important;color:#2b2b2b !important}.has-success .input-group-addon{border-color:#4f9e4f !important;background-color:#2b2b2b !important;color:#4f9e4f !important}.form fieldset .form-group:last-child,.form fieldset .form-group:last-child .note,.form .form-group:last-child,.form .form-group:last-child .note{margin-bottom:0}.note{margin-top:6px;padding:0 1px;font-size:11px;line-height:15px;color:#7c8184}.input-icon-right{position:relative}.input-icon-right>i,.input-icon-left>i{position:absolute;right:10px;top:10px;font-size:12px;color:#63676a}.input-icon-left>i{right:auto;left:24px}.input-icon-right .form-control{padding-right:27px}.input-icon-left .form-control{padding-left:29px}input[type="text"].ui-autocomplete-loading,input[type="password"].ui-autocomplete-loading,input[type="datetime"].ui-autocomplete-loading,input[type="datetime-local"].ui-autocomplete-loading,input[type="date"].ui-autocomplete-loading,input[type="month"].ui-autocomplete-loading,input[type="time"].ui-autocomplete-loading,input[type="week"].ui-autocomplete-loading,input[type="number"].ui-autocomplete-loading,input[type="email"].ui-autocomplete-loading,input[type="url"].ui-autocomplete-loading,input[type="search"].ui-autocomplete-loading,input[type="tel"].ui-autocomplete-loading,input[type="color"].ui-autocomplete-loading{background-image:url("../../img/select2-spinner.gif") !important;background-repeat:no-repeat;background-position:99% 50%;padding-right:27px}.input-group-addon .checkbox,.input-group-addon .editable-input .editable-checklist>div>label,.editable-input .input-group-addon .editable-checklist>div>label,.input-group-addon .radio{min-height:0px;margin-right:0px !important;padding-top:0}.input-group-addon label input[type="checkbox"].checkbox+span,.input-group-addon .editable-input .editable-checklist>div>label>span input[type="checkbox"].checkbox+span,.editable-input .input-group-addon .editable-checklist>div>label>span input[type="checkbox"].checkbox+span,.input-group-addon label input[type="radio"].radiobox+span,.input-group-addon .editable-input .editable-checklist>div>label>span input[type="radio"].radiobox+span,.editable-input .input-group-addon .editable-checklist>div>label>span input[type="radio"].radiobox+span,.input-group-addon label input[type="radio"].radiobox+span:before,.input-group-addon .editable-input .editable-checklist>div>label>span input[type="radio"].radiobox+span:before,.editable-input .input-group-addon .editable-checklist>div>label>span input[type="radio"].radiobox+span:before,.input-group-addon label input[type="checkbox"].checkbox+span:before,.input-group-addon .editable-input .editable-checklist>div>label>span input[type="checkbox"].checkbox+span:before,.editable-input .input-group-addon .editable-checklist>div>label>span input[type="checkbox"].checkbox+span:before{margin-right:0px}.alert{margin-bottom:10px;margin-top:0px;padding:5px 15px 5px 34px;color:#675100;border-width:0px;border-left-width:3px;padding:10px}.alert .ui-pnotify-title{line-height:12px}.alert .ui-pnotify-text{font-size:10px}.alert .close{top:0px;right:-5px;line-height:18px}.alert-heading{font-weight:600}.alert-danger{border-color:#a52521;color:#2b2b2b;background:#f6d1d0;text-shadow:none}.alert-danger .ui-pnotify-icon{color:#a52521}.alert-warning{border-color:#e28a0d;color:#2b2b2b;background:#fdedd8}.alert-warning .ui-pnotify-icon{color:#e28a0d}.alert-success{border-color:#4f9e4f;color:#2b2b2b;background:#d1e8d1}.alert-success .ui-pnotify-icon{color:#4f9e4f}.alert-info{border-color:#316490;color:#2b2b2b;background:#abc9e2}.alert-info .ui-pnotify-icon{color:#316490}.progress-micro{height:2px !important;line-height:2px !important}.progress-xs{height:7px !important;line-height:7px !important}.progress-sm{height:14px !important;line-height:14px !important}.progress-lg{height:30px !important;line-height:30px !important}.progress .progress-bar{position:absolute;overflow:hidden;line-height:18px}.progress .progressbar-back-text{position:absolute;width:100%;height:100%;font-size:12px;line-height:20px;text-align:center}.progress .progressbar-front-text{display:block;width:100%;font-size:12px;line-height:20px;text-align:center}.progress.right .progress-bar{right:0}.progress.right .progressbar-front-text{position:absolute;right:0}.progress.vertical{width:25px;height:100%;min-height:150px;margin-right:20px;display:inline-block;margin-bottom:0px}.progress.wide-bar{width:40px}.progress.vertical.bottom{position:relative}.progress.vertical.bottom .progressbar-front-text{position:absolute;bottom:0}.progress.vertical .progress-bar{width:100%;height:0;-webkit-transition:height 0.6s ease;transition:height 0.6s ease}.progress.vertical.bottom .progress-bar{position:absolute;bottom:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{position:relative;margin-bottom:20px;overflow:hidden;height:18px;background:#63676a;-webkit-box-shadow:0 1px 0 transparent,0 0 0 1px #63676a inset;box-shadow:0 1px 0 transparent,0 0 0 1px #63676a inset;border-radius:0px}.progress-bar{float:left;width:0;height:100%;font-size:11px;color:#fff;text-align:center;background-color:#428bca;font-weight:bold;-webkit-transition:width 1s ease-in-out,background-color 1s ease-in-out;transition:width 1s ease-in-out,background-color 1s ease-in-out}.progress-striped .progress-bar{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-danger{background-color:#a52521}.progress-striped .progress-bar-danger{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-success{background-color:#4f9e4f}.progress-striped .progress-bar-success{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#e28a0d}.progress-striped .progress-bar-warning{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#316490}.progress-striped .progress-bar-info{background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255,255,255,0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255,255,255,0.15)), color-stop(0.75, rgba(255,255,255,0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-info .bar,.progress .bar-info{background:#316490}.vertical-bars{padding:0;margin:0}.vertical-bars:after{content:"";display:block;height:0;clear:both}.vertical-bars li{padding:14px 0;width:25%;display:block;float:left;text-align:center}.vertical-bars li:first-child{border-left:none}.vertical-bars>li>.progress.vertical:first-child{margin-left:auto}.vertical-bars>li>.progress.vertical{margin:0 auto;float:none}.nav-tabs{border-bottom:none}.nav-tabs>li>a .badge{font-size:11px;padding:3px 5px 3px 5px;opacity:.5;margin-left:5px;min-width:17px;font-weight:normal}.tabs-left .nav-tabs>li>a .badge{margin-right:5px;margin-left:0px}.nav-tabs>li>a .label{display:inline-block;font-size:11px;margin-left:5px;opacity:.5}.nav-tabs>li>a{color:#63676a;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.nav-tabs>li>a:hover{color:#adadad;border-color:transparent transparent #63676a transparent;margin-top:1px;border-top-width:0}.nav-tabs>li.active>a{background-color:#adadad;color:#1d1d1d;border-top-width:0px !important;margin-top:1px !important;font-weight:bold}.tabs-left .nav-tabs>li.active>a{-webkit-box-shadow:-2px 0 0 #428bca;-moz-box-shadow:-2px 0 0 #428bca;box-shadow:-2px 0 0 #428bca;border-top-width:1px !important;border-left:none !important;margin-left:1px !important}.tabs-left .nav-pills>li.active>a{border:none !important;box-shadow:none !important;-webkit-box-shadow:none !important;-moz-box-shadow:none !important}.tabs-right .nav-tabs>li.active>a{-webkit-box-shadow:2px 0 0 #428bca;-moz-box-shadow:2px 0 0 #428bca;box-shadow:2px 0 0 #428bca;border-top-width:1px !important;border-right:none !important;margin-right:1px !important}.tabs-below .nav-tabs>li.active>a{-webkit-box-shadow:0 2px 0 #428bca;-moz-box-shadow:0 2px 0 #428bca;box-shadow:0 2px 0 #428bca;border-bottom-width:0px !important;border-top:none !important;margin-top:0px !important}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #9b9b9b}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li,.tabs-left>.nav-pills>li,.tabs-right>.nav-pills>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a,.tabs-left>.nav-pills>li>a,.tabs-right>.nav-pills>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs,.tabs-left>.nav-pills{float:left;margin-right:19px;border-right:1px solid #9b9b9b}.tabs-left>.nav-pills{border-right:none}.tabs-left>.nav-tabs>li>a{margin-right:-1px}.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#adadad #949494 #adadad #adadad}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#949494 transparent #949494 #9b9b9b;*border-right-color:#fff}.tabs-left>.tab-content{margin-left:109px}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #9b9b9b}.tabs-right>.nav-tabs>li>a{margin-left:-1px}.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#adadad #adadad #adadad #9b9b9b}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#9b9b9b #9b9b9b #9b9b9b transparent;*border-left-color:#fff}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #9b9b9b}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-top-color:#9b9b9b;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #9b9b9b #9b9b9b #9b9b9b}.nav-tabs.bordered{background:#fff;border:1px solid #9b9b9b}.nav-tabs.bordered>:first-child a{border-left-width:0px !important}.nav-tabs.bordered+.tab-content{border:1px solid #9b9b9b;border-top:none}.tabs-pull-right.nav-tabs>li,.tabs-pull-right.nav-pills>li{float:right}.tabs-pull-right.nav-tabs>li:first-child>a,.tabs-pull-right.nav-pills>li:first-child>a{margin-right:1px}.tabs-pull-right.bordered.nav-tabs>li:first-child>a,.tabs-pull-right.bordered.nav-pills>li:first-child>a{border-left-width:1px !important;margin-right:0px;border-right-width:0px}.dropdown-menu-xs{min-width:37px}.dropdown-menu-xs>li>a{padding:3px 10px}.dropdown-menu-xs>li>a:hover i{color:#fff !important}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropdown-submenu:hover>a{background-color:#63676a;color:#1d1d1d}.dropdown-submenu:hover a:after{border-left-color:#5cb85c}.dropdown-submenu>a:after{content:" ";display:block;position:absolute;right:5px;top:7px;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#2b2b2b}.dropdown-submenu>a:hover:after{border-left-color:#adadad}.dropdown-submenu.disabled>a:after{border-left-color:#63676a}.dropdown-submenu.pull-left{float:none}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px}.pagination>li>a,.pagination>li>span{box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05);-moz-box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05);-webkit-box-shadow:inset 0 -2px 0 rgba(0,0,0,0.05)}.btn-default.disabled{color:#adadad}.btn{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;will-change:background-color, border-color;border-radius:2px;-webkit-transition:color 0.18s ease-in-out,background-color 0.18s ease-in-out,border-color 0.18s ease-in-out,box-shadow 0.18s ease-in-out;transition:color 0.18s ease-in-out,background-color 0.18s ease-in-out,border-color 0.18s ease-in-out,box-shadow 0.18s ease-in-out}.btn.btn-ribbon{background-color:#707070;background-image:-moz-linear-gradient(top, #777, #666);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#777), to(#666));background-image:-webkit-linear-gradient(top, #777, #666);background-image:-o-linear-gradient(top, #777, #666);background-image:linear-gradient(to bottom, #777, #666);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff777777', endColorstr='#ff666666', GradientType=0);color:white;padding:0 5px;line-height:20px;vertical-align:middle;height:20px;display:block;border:none;float:left;margin:0 8px 0 0;cursor:pointer}.btn.btn-ribbon>i{font-size:111%}.ribbon-button-alignment{padding-top:10px;display:inline-block}.ribbon-button-alignment.pull-right>.btn.btn-ribbon{margin:0 0 0 8px}.panel-purple{border-color:#6e587a}.panel-purple>.panel-heading{color:#fff;background-color:#6e587a;border-color:#6e587a}.panel-greenLight{border-color:#71843f}.panel-greenLight>.panel-heading{color:#fff;background-color:#71843f;border-color:#71843f}.panel-greenDark{border-color:#496949}.panel-greenDark>.panel-heading{color:#fff;background-color:#496949;border-color:#496949}.panel-darken{border-color:#313335}.panel-darken>.panel-heading{color:#fff;background-color:#404040;border-color:#404040}.panel-green{border-color:#5cb85c}.panel-green>.panel-heading{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.panel-red{border-color:#d9534f}.panel-red>.panel-heading{color:#fff;background-color:#d9534f;border-color:#d9534f}.panel-teal{border-color:#568a89}.panel-teal>.panel-heading{color:#fff;background-color:#568a89;border-color:#568a89}.panel-orange{border-color:#e28a0d}.panel-orange>.panel-heading{color:#fff;background-color:#e28a0d;border-color:#e28a0d}.panel-blueDark{border-color:#4c4f53}.panel-blueDark>.panel-heading{color:#fff;background-color:#4c4f53;border-color:#4c4f53}.panel-magenta{border-color:#6e3671}.panel-magenta>.panel-heading{color:#fff;background-color:#6e3671;border-color:#6e3671}.panel-blue{border-color:#428bca}.panel-blue>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-footer>.btn-block{border-radius:0px;-moz-border-radius:0px;-webkit-border-radius:0px;border-bottom:none;border-left:none;border-right:none}.btn-circle{width:30px;height:30px;text-align:center;padding:6px 0;font-size:12px;line-height:18px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%;-webkit-box-shadow:0 1px 6px 0 rgba(0,0,0,0.12),0 1px 6px 0 rgba(0,0,0,0.12);box-shadow:0 1px 6px 0 rgba(0,0,0,0.12),0 1px 6px 0 rgba(0,0,0,0.12)}.btn-circle.btn-sm,.btn-group-sm>.btn-circle.btn{width:22px;height:22px;padding:4px 0;font-size:12px;line-height:14px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%}.btn-circle.btn-lg,.btn-group-lg>.btn-circle.btn{width:50px;height:50px;padding:10px 15px;font-size:18px;line-height:30px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%}.btn-circle.btn-xl{width:70px;height:70px;padding:10px 15px;font-size:24px;line-height:50px;border-radius:50%;-moz-border-radius:50%;-webkit-border-radius:50%}.btn-label{position:relative;left:-8px;display:inline-block;padding:5px 8px;background:rgba(0,0,0,0.15);border-radius:2px 0 0 2px}.btn-labeled{padding-top:0;padding-bottom:0;padding-left:8px}.btn-link{box-shadow:none;-webkit-box-shadow:none;font-size:13px}.morris-hover.morris-default-style{border-radius:5px;padding:5px;color:#666;background:rgba(29,29,29,0.85);font-family:'Oxygen Bold';font-size:10px;text-align:left;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold}.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap}.morris-hover{position:absolute;z-index:903}.fixed-page-footer .morris-hover{z-index:900}.txt-color.txt-color-blue,.txt-color-blue.pf-help-light,.pf-help-light:hover,.txt-color-blue.pf-help,.pf-help:hover,.txt-color.pf-help-default:hover,.dataTable td.pf-help-default.pf-table-link-cell:hover,.dataTable td.pf-table-link-cell.pf-help-light:hover,.dataTable td.pf-table-link-cell.pf-help:hover,.dataTable td.pf-table-action-cell>.pf-help-default.pf-table-action-icon-cell:hover,.dataTable td.pf-table-action-cell>.pf-table-action-icon-cell.pf-help-light:hover,.dataTable td.pf-table-action-cell>.pf-table-action-icon-cell.pf-help:hover,.pf-landing .pf-landing-list li>i.pf-help-default:hover,.pf-landing .pf-landing-list li>i.pf-help-light:hover,.pf-landing .pf-landing-list li>i.pf-help:hover,.dataTable td.txt-color-blue.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-blue.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-blue{color:#428bca !important}.txt-color.txt-color-blueLight,.txt-color-blueLight.pf-help-light,.txt-color-blueLight.pf-help,.dataTable td.txt-color-blueLight.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-blueLight.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-blueLight{color:#92a2a8 !important}.txt-color.txt-color-blueDark,.txt-color-blueDark.pf-help-light,.txt-color-blueDark.pf-help,.dataTable td.txt-color-blueDark.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-blueDark.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-blueDark{color:#4c4f53 !important}.txt-color.txt-color-grayLightest,.txt-color-grayLightest.pf-help-light,.txt-color-grayLightest.pf-help,.dataTable td.txt-color-grayLightest.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-grayLightest.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-grayLightest{color:#eaeaea !important}.txt-color.txt-color-grayLighter,.txt-color-grayLighter.pf-help-light,.txt-color-grayLighter.pf-help,.dataTable td.txt-color-grayLighter.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-grayLighter.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-grayLighter{color:#adadad !important}.txt-color.txt-color-grayLight,.pf-help-light,.txt-color-grayLight.pf-help,.dataTable td.txt-color-grayLight.pf-table-link-cell,.dataTable td.pf-table-link-cell.pf-help-light,.dataTable td.pf-table-action-cell>.txt-color-grayLight.pf-table-action-icon-cell,.dataTable td.pf-table-action-cell>.pf-table-action-icon-cell.pf-help-light,.pf-landing .pf-landing-list li>i.txt-color-grayLight,.pf-landing .pf-landing-list li>i.pf-help-light{color:#63676a !important}.txt-color.txt-color-gray,.txt-color-gray.pf-help-light,.pf-help,.dataTable td.txt-color-gray.pf-table-link-cell,.dataTable td.pf-table-link-cell.pf-help,.dataTable td.pf-table-action-cell>.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-gray,.pf-landing .pf-landing-list li>i.pf-help{color:#3c3f41 !important}.txt-color.txt-color-grayDark,.txt-color-grayDark.pf-help-light,.txt-color-grayDark.pf-help,.dataTable td.txt-color-grayDark.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-grayDark.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-grayDark{color:#313335 !important}.txt-color.txt-color-greenLight,.txt-color-greenLight.pf-help-light,.txt-color-greenLight.pf-help,.dataTable td.txt-color-greenLight.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-greenLight.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-greenLight{color:#66c84f !important}.txt-color.txt-color-green,.txt-color-green.pf-help-light,.pf-help-light.pf-log-info,.txt-color-green.pf-help,.pf-help.pf-log-info,.dataTable td.txt-color-green.pf-table-link-cell,.dataTable td.pf-table-link-cell.pf-log-info,.dataTable td.pf-table-action-cell>.txt-color-green.pf-table-action-icon-cell,.dataTable td.pf-table-action-cell>.pf-table-action-icon-cell.pf-log-info,.txt-color.pf-log-info,.pf-landing .pf-landing-list li>i.pf-log-info,.pf-landing .pf-landing-list li>i.txt-color-green{color:#5cb85c !important}.txt-color.txt-color-greenDark,.txt-color-greenDark.pf-help-light,.txt-color-greenDark.pf-help,.dataTable td.txt-color-greenDark.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-greenDark.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-greenDark{color:#4f9e4f !important}.txt-color.txt-color-redLight,.txt-color-redLight.pf-help-light,.txt-color-redLight.pf-help,.dataTable td.txt-color-redLight.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-redLight.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-redLight{color:#a65858 !important}.txt-color.txt-color-red,.txt-color-red.pf-help-light,.pf-help-light.pf-log-error,.txt-color-red.pf-help,.pf-help.pf-log-error,.dataTable td.txt-color-red.pf-table-link-cell,.dataTable td.pf-table-link-cell.pf-log-error,.dataTable td.pf-table-action-cell>.txt-color-red.pf-table-action-icon-cell,.dataTable td.pf-table-action-cell>.pf-table-action-icon-cell.pf-log-error,.txt-color.pf-log-error,.pf-landing .pf-landing-list li>i.pf-log-error,.pf-landing .pf-landing-list li>i.txt-color-red{color:#d9534f !important}.txt-color.txt-color-redDark,.txt-color-redDark.pf-help-light,.txt-color-redDark.pf-help,.dataTable td.txt-color-redDark.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-redDark.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-redDark{color:#a52521 !important}.txt-color.txt-color-redDarker,.txt-color-redDarker.pf-help-light,.txt-color-redDarker.pf-help,.dataTable td.txt-color-redDarker.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-redDarker.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-redDarker{color:#58100d !important}.txt-color.txt-color-yellow,.txt-color-yellow.pf-help-light,.txt-color-yellow.pf-help,.dataTable td.txt-color-yellow.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-yellow.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-yellow{color:#e2ce48 !important}.txt-color.txt-color-yellowDark,.txt-color-yellowDark.pf-help-light,.txt-color-yellowDark.pf-help,.dataTable td.txt-color-yellowDark.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-yellowDark.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-yellowDark{color:#c8b847 !important}.txt-color.txt-color-orangeLight,.txt-color-orangeLight.pf-help-light,.txt-color-orangeLight.pf-help,.dataTable td.txt-color-orangeLight.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-orangeLight.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-orangeLight{color:#f0ad4e !important}.txt-color.txt-color-orange,.txt-color-orange.pf-help-light,.txt-color-orange.pf-help,.dataTable td.txt-color-orange.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-orange.pf-table-action-icon-cell,.dataTable td.pf-table-action-cell:hover>.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-orange{color:#e28a0d !important}.txt-color.txt-color-orangeDark,.txt-color-orangeDark.pf-help-light,.txt-color-orangeDark.pf-help,.dataTable td.txt-color-orangeDark.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-orangeDark.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-orangeDark{color:#c2760c !important}.txt-color.txt-color-pink,.txt-color-pink.pf-help-light,.txt-color-pink.pf-help,.dataTable td.txt-color-pink.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-pink.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-pink{color:#e06fdf !important}.txt-color.txt-color-pinkDark,.txt-color-pinkDark.pf-help-light,.txt-color-pinkDark.pf-help,.dataTable td.txt-color-pinkDark.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-pinkDark.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-pinkDark{color:#a8829f !important}.txt-color.txt-color-purple,.txt-color-purple.pf-help-light,.txt-color-purple.pf-help,.dataTable td.txt-color-purple.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-purple.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-purple{color:#6e587a !important}.txt-color.txt-color-darken,.txt-color-darken.pf-help-light,.txt-color-darken.pf-help,.dataTable td.txt-color-darken.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-darken.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-darken{color:#404040 !important}.txt-color.txt-color-lighten,.txt-color-lighten.pf-help-light,.txt-color-lighten.pf-help,.dataTable td.txt-color-lighten.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-lighten.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-lighten{color:#d5e7ec !important}.txt-color.txt-color-white,.txt-color-white.pf-help-light,.txt-color-white.pf-help,.dataTable td.txt-color-white.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-white.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-white{color:#fff !important}.txt-color.txt-color-magenta,.txt-color-magenta.pf-help-light,.txt-color-magenta.pf-help,.dataTable td.txt-color-magenta.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-magenta.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-magenta{color:#6e3671 !important}.txt-color.txt-color-tealLightest,.txt-color-tealLightest.pf-help-light,.txt-color-tealLightest.pf-help,.dataTable td.txt-color-tealLightest.pf-table-link-cell,.dataTable td.pf-table-link-cell:hover,.dataTable td.pf-table-action-cell>.txt-color-tealLightest.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-tealLightest{color:#6caead !important}.txt-color.txt-color-tealLighter,.txt-color-tealLighter.pf-help-light,.txt-color-tealLighter.pf-help,.dataTable td.txt-color-tealLighter.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-tealLighter.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i{color:#568a89 !important}.txt-color.txt-color-teal,.txt-color-teal.pf-help-light,.txt-color-teal.pf-help,.dataTable td.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-teal.pf-table-action-icon-cell,.dataTable td.pf-table-action-cell>td.pf-table-action-icon-cell.pf-table-link-cell,.pf-landing .pf-landing-list li>i.txt-color-teal{color:#477372 !important}.txt-color.txt-color-indigoDark,.txt-color-indigoDark.pf-help-light,.txt-color-indigoDark.pf-help,.dataTable td.txt-color-indigoDark.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-indigoDark.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-indigoDark{color:#5c6bc0 !important}.txt-color.txt-color-indigoDarkest,.txt-color-indigoDarkest.pf-help-light,.txt-color-indigoDarkest.pf-help,.dataTable td.txt-color-indigoDarkest.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-indigoDarkest.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-indigoDarkest{color:#313966 !important}.txt-color.txt-color-gold,.txt-color-gold.pf-help-light,.txt-color-gold.pf-help,.dataTable td.txt-color-gold.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-gold.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-gold{color:#cfb53b !important}.txt-color.txt-color-silver,.txt-color-silver.pf-help-light,.txt-color-silver.pf-help,.dataTable td.txt-color-silver.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-silver.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-silver{color:silver !important}.txt-color.txt-color-bronze,.txt-color-bronze.pf-help-light,.txt-color-bronze.pf-help,.dataTable td.txt-color-bronze.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-bronze.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-bronze{color:#8c7853 !important}.txt-color.txt-color-primary,.txt-color-primary.pf-help-light,.txt-color-primary.pf-help,.dataTable td.txt-color-primary.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-primary.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-primary{color:#375959 !important}.txt-color.txt-color-success,.txt-color-success.pf-help-light,.txt-color-success.pf-help,.dataTable td.txt-color-success.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-success.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-success{color:#4f9e4f !important}.txt-color.txt-color-information,.txt-color-information.pf-help-light,.txt-color-information.pf-help,.dataTable td.txt-color-information.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-information.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-information{color:#316490 !important}.txt-color.txt-color-info,.txt-color-info.pf-help-light,.txt-color-info.pf-help,.dataTable td.txt-color-info.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-info.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-info{color:#316490 !important}.txt-color.txt-color-warning,.txt-color-warning.pf-help-light,.pf-help-light.pf-log-warning,.txt-color-warning.pf-help,.pf-help.pf-log-warning,.dataTable td.txt-color-warning.pf-table-link-cell,.dataTable td.pf-table-link-cell.pf-log-warning,.dataTable td.pf-table-action-cell>.txt-color-warning.pf-table-action-icon-cell,.dataTable td.pf-table-action-cell>.pf-table-action-icon-cell.pf-log-warning,.txt-color.pf-log-warning,.pf-landing .pf-landing-list li>i.pf-log-warning,.pf-landing .pf-landing-list li>i.txt-color-warning{color:#e28a0d !important}.txt-color.txt-color-danger,.txt-color-danger.pf-help-light,.txt-color-danger.pf-help,.dataTable td.txt-color-danger.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-danger.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-danger{color:#a52521 !important}.txt-color.txt-color-hint,.txt-color-hint.pf-help-light,.txt-color-hint.pf-help,.dataTable td.txt-color-hint.pf-table-link-cell,.dataTable td.pf-table-action-cell>.txt-color-hint.pf-table-action-icon-cell,.pf-landing .pf-landing-list li>i.txt-color-hint{color:#c8b847 !important}.bg-color.bg-color-blue{background-color:#428bca !important}.bg-color.bg-color-blueLight{background-color:#92a2a8 !important}.bg-color.bg-color-blueDark{background-color:#4c4f53 !important}.bg-color.bg-color-green{background-color:#5cb85c !important}.bg-color.bg-color-greenLight{background-color:#71843f !important}.bg-color.bg-color-greenDark{background-color:#496949 !important}.bg-color.bg-color-red{background-color:#d9534f !important}.bg-color.bg-color-yellow{background-color:#e2ce48 !important}.bg-color.bg-color-orange{background-color:#e28a0d !important}.bg-color.bg-color-orangeDark{background-color:#c2760c !important}.bg-color.bg-color-pink{background-color:#e06fdf !important}.bg-color.bg-color-pinkDark{background-color:#a8829f !important}.bg-color.bg-color-purple{background-color:#6e587a !important}.bg-color.bg-color-darken{background-color:#404040 !important}.bg-color.bg-color-lighten{background-color:#d5e7ec !important}.bg-color.bg-color-white{background-color:#fff !important}.bg-color.bg-color-gray{background-color:#3c3f41 !important}.bg-color.bg-color-grayDark{background-color:#313335 !important}.bg-color.bg-color-grayDarker{background-color:#2b2b2b !important}.bg-color.bg-color-magenta{background-color:#6e3671 !important}.bg-color.bg-color-tealLighter{background-color:#568a89 !important}.bg-color.bg-color-tealDark{background-color:#375959 !important}.bg-color.bg-color-tealDarker{background-color:#212C30 !important}.bg-color.bg-color-tealDarkest{background-color:#1b2326 !important}.bg-color.bg-color-redLight{background-color:#a65858 !important}.pf-animation-slide-in{-moz-animation-duration:1.2s;-webkit-animation-duration:1.2s;-moz-animation-name:pfSlideIn;-webkit-animation-name:pfSlideIn;position:relative}@-webkit-keyframes pfSlideIn{from{opacity:0;top:-20px}to{opacity:1;top:0px}}@-moz-keyframes pfSlideIn{from{opacity:0;top:-20px}to{opacity:1;top:0px}}@-ms-keyframes pfSlideIn{from{opacity:0;top:-20px}to{opacity:1;top:0px}}@keyframes pfSlideIn{from{opacity:0;top:-20px}to{opacity:1;top:0px}}.pf-animation-path-draw{stroke-dasharray:500;stroke-dashoffset:500;animation:pfPathDraw 3s linear alternate infinite}@-webkit-keyframes pfPathDraw{from{stroke-dashoffset:500}to{stroke-dashoffset:0}}@-moz-keyframes pfPathDraw{from{stroke-dashoffset:500}to{stroke-dashoffset:0}}@-ms-keyframes pfPathDraw{from{stroke-dashoffset:500}to{stroke-dashoffset:0}}@keyframes pfPathDraw{from{stroke-dashoffset:500}to{stroke-dashoffset:0}}@-webkit-keyframes pfBubbleWobble{from{transform:scale(1, 1)}6.5%{transform:scale(1, 1.4)}13%{transform:scale(1.4, 1)}20%{transform:scale(1, 1)}to{transform:scale(1, 1)}}@-moz-keyframes pfBubbleWobble{from{transform:scale(1, 1)}6.5%{transform:scale(1, 1.4)}13%{transform:scale(1.4, 1)}20%{transform:scale(1, 1)}to{transform:scale(1, 1)}}@-ms-keyframes pfBubbleWobble{from{transform:scale(1, 1)}6.5%{transform:scale(1, 1.4)}13%{transform:scale(1.4, 1)}20%{transform:scale(1, 1)}to{transform:scale(1, 1)}}@keyframes pfBubbleWobble{from{transform:scale(1, 1)}6.5%{transform:scale(1, 1.4)}13%{transform:scale(1.4, 1)}20%{transform:scale(1, 1)}to{transform:scale(1, 1)}}@-webkit-keyframes pfBubblePop{from{opacity:1;transform:translateZ(0) scale(1, 1)}to{opacity:0;transform:translateZ(0) scale(1.75, 1.75)}}@-moz-keyframes pfBubblePop{from{opacity:1;transform:translateZ(0) scale(1, 1)}to{opacity:0;transform:translateZ(0) scale(1.75, 1.75)}}@-ms-keyframes pfBubblePop{from{opacity:1;transform:translateZ(0) scale(1, 1)}to{opacity:0;transform:translateZ(0) scale(1.75, 1.75)}}@keyframes pfBubblePop{from{opacity:1;transform:translateZ(0) scale(1, 1)}to{opacity:0;transform:translateZ(0) scale(1.75, 1.75)}}@-webkit-keyframes pfPulseDanger{0%{fill:#d9534f}50%{fill:#58100d}100%{fill:#d9534f}}@-moz-keyframes pfPulseDanger{0%{fill:#d9534f}50%{fill:#58100d}100%{fill:#d9534f}}@-ms-keyframes pfPulseDanger{0%{fill:#d9534f}50%{fill:#58100d}100%{fill:#d9534f}}@keyframes pfPulseDanger{0%{fill:#d9534f}50%{fill:#58100d}100%{fill:#d9534f}}@-webkit-keyframes pulseBackgroundSuccess{0%{}10%{background-color:#4f9e4f;color:#313335}100%{}}@-moz-keyframes pulseBackgroundSuccess{0%{}10%{background-color:#4f9e4f;color:#313335}100%{}}@-ms-keyframes pulseBackgroundSuccess{10%{background-color:#4f9e4f;color:#313335}}@keyframes pulseBackgroundSuccess{0%{}10%{background-color:#4f9e4f;color:#313335}100%{}}@-webkit-keyframes pulseBackgroundSuccessActive{0%{}10%{background-color:#478d47;color:#313335}100%{}}@-moz-keyframes pulseBackgroundSuccessActive{0%{}10%{background-color:#478d47;color:#313335}100%{}}@-ms-keyframes pulseBackgroundSuccessActive{10%{background-color:#478d47;color:#313335}}@keyframes pulseBackgroundSuccessActive{0%{}10%{background-color:#478d47;color:#313335}100%{}}.pf-animation-pulse-success{-webkit-animation:pulseBackgroundSuccess 1s 1;animation:pulseBackgroundSuccess 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}.pf-animation-pulse-success .sorting_1{-webkit-animation:pulseBackgroundSuccessActive 1s 1;animation:pulseBackgroundSuccessActive 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}@-webkit-keyframes pulseBackgroundSuccessKeep{0%{color:inherit}10%{background-color:#4f9e4f;color:#313335}100%{background-color:rgba(79,158,79,0.3)}}@-moz-keyframes pulseBackgroundSuccessKeep{0%{color:inherit}10%{background-color:#4f9e4f;color:#313335}100%{background-color:rgba(79,158,79,0.3)}}@-ms-keyframes pulseBackgroundSuccessKeep{0%{color:inherit}10%{background-color:#4f9e4f;color:#313335}100%{background-color:rgba(79,158,79,0.3)}}@keyframes pulseBackgroundSuccessKeep{0%{color:inherit}10%{background-color:#4f9e4f;color:#313335}100%{background-color:rgba(79,158,79,0.3)}}@-webkit-keyframes pulseBackgroundSuccessActiveKeep{0%{color:inherit}10%{background-color:#478d47;color:#313335}100%{background-color:rgba(71,141,71,0.3)}}@-moz-keyframes pulseBackgroundSuccessActiveKeep{0%{color:inherit}10%{background-color:#478d47;color:#313335}100%{background-color:rgba(71,141,71,0.3)}}@-ms-keyframes pulseBackgroundSuccessActiveKeep{0%{color:inherit}10%{background-color:#478d47;color:#313335}100%{background-color:rgba(71,141,71,0.3)}}@keyframes pulseBackgroundSuccessActiveKeep{0%{color:inherit}10%{background-color:#478d47;color:#313335}100%{background-color:rgba(71,141,71,0.3)}}.pf-animation-pulse-success-keep{-webkit-animation:pulseBackgroundSuccessKeep 1s 1;animation:pulseBackgroundSuccessKeep 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}.pf-animation-pulse-success-keep .sorting_1{-webkit-animation:pulseBackgroundSuccessActiveKeep 1s 1;animation:pulseBackgroundSuccessActiveKeep 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}@-webkit-keyframes pulseBackgroundWarning{0%{}10%{background-color:#e28a0d;color:#2b2b2b}100%{}}@-moz-keyframes pulseBackgroundWarning{0%{}10%{background-color:#e28a0d;color:#2b2b2b}100%{}}@-ms-keyframes pulseBackgroundWarning{10%{background-color:#e28a0d;color:#2b2b2b}}@keyframes pulseBackgroundWarning{0%{}10%{background-color:#e28a0d;color:#2b2b2b}100%{}}@-webkit-keyframes pulseBackgroundWarningActive{0%{}10%{background-color:#ca7b0c;color:#2b2b2b}100%{}}@-moz-keyframes pulseBackgroundWarningActive{0%{}10%{background-color:#ca7b0c;color:#2b2b2b}100%{}}@-ms-keyframes pulseBackgroundWarningActive{10%{background-color:#ca7b0c;color:#2b2b2b}}@keyframes pulseBackgroundWarningActive{0%{}10%{background-color:#ca7b0c;color:#2b2b2b}100%{}}.pf-animation-pulse-warning{-webkit-animation:pulseBackgroundWarning 1s 1;animation:pulseBackgroundWarning 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}.pf-animation-pulse-warning .sorting_1{-webkit-animation:pulseBackgroundWarningActive 1s 1;animation:pulseBackgroundWarningActive 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}@-webkit-keyframes pulseBackgroundWarningKeep{0%{color:inherit}10%{background-color:#e28a0d;color:#2b2b2b}100%{background-color:rgba(226,138,13,0.3)}}@-moz-keyframes pulseBackgroundWarningKeep{0%{color:inherit}10%{background-color:#e28a0d;color:#2b2b2b}100%{background-color:rgba(226,138,13,0.3)}}@-ms-keyframes pulseBackgroundWarningKeep{0%{color:inherit}10%{background-color:#e28a0d;color:#2b2b2b}100%{background-color:rgba(226,138,13,0.3)}}@keyframes pulseBackgroundWarningKeep{0%{color:inherit}10%{background-color:#e28a0d;color:#2b2b2b}100%{background-color:rgba(226,138,13,0.3)}}@-webkit-keyframes pulseBackgroundWarningActiveKeep{0%{color:inherit}10%{background-color:#ca7b0c;color:#2b2b2b}100%{background-color:rgba(202,123,12,0.3)}}@-moz-keyframes pulseBackgroundWarningActiveKeep{0%{color:inherit}10%{background-color:#ca7b0c;color:#2b2b2b}100%{background-color:rgba(202,123,12,0.3)}}@-ms-keyframes pulseBackgroundWarningActiveKeep{0%{color:inherit}10%{background-color:#ca7b0c;color:#2b2b2b}100%{background-color:rgba(202,123,12,0.3)}}@keyframes pulseBackgroundWarningActiveKeep{0%{color:inherit}10%{background-color:#ca7b0c;color:#2b2b2b}100%{background-color:rgba(202,123,12,0.3)}}.pf-animation-pulse-warning-keep{-webkit-animation:pulseBackgroundWarningKeep 1s 1;animation:pulseBackgroundWarningKeep 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}.pf-animation-pulse-warning-keep .sorting_1{-webkit-animation:pulseBackgroundWarningActiveKeep 1s 1;animation:pulseBackgroundWarningActiveKeep 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}@-webkit-keyframes pulseBackgroundDanger{0%{}10%{background-color:#d9534f;color:#2b2b2b}100%{}}@-moz-keyframes pulseBackgroundDanger{0%{}10%{background-color:#d9534f;color:#2b2b2b}100%{}}@-ms-keyframes pulseBackgroundDanger{10%{background-color:#d9534f;color:#2b2b2b}}@keyframes pulseBackgroundDanger{0%{}10%{background-color:#d9534f;color:#2b2b2b}100%{}}@-webkit-keyframes pulseBackgroundDangerActive{0%{}10%{background-color:#d43f3a;color:#2b2b2b}100%{}}@-moz-keyframes pulseBackgroundDangerActive{0%{}10%{background-color:#d43f3a;color:#2b2b2b}100%{}}@-ms-keyframes pulseBackgroundDangerActive{10%{background-color:#d43f3a;color:#2b2b2b}}@keyframes pulseBackgroundDangerActive{0%{}10%{background-color:#d43f3a;color:#2b2b2b}100%{}}.pf-animation-pulse-danger{-webkit-animation:pulseBackgroundDanger 1s 1;animation:pulseBackgroundDanger 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}.pf-animation-pulse-danger .sorting_1{-webkit-animation:pulseBackgroundDangerActive 1s 1;animation:pulseBackgroundDangerActive 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}@-webkit-keyframes pulseBackgroundDangerKeep{0%{color:inherit}10%{background-color:#d9534f;color:#2b2b2b}100%{background-color:rgba(217,83,79,0.3)}}@-moz-keyframes pulseBackgroundDangerKeep{0%{color:inherit}10%{background-color:#d9534f;color:#2b2b2b}100%{background-color:rgba(217,83,79,0.3)}}@-ms-keyframes pulseBackgroundDangerKeep{0%{color:inherit}10%{background-color:#d9534f;color:#2b2b2b}100%{background-color:rgba(217,83,79,0.3)}}@keyframes pulseBackgroundDangerKeep{0%{color:inherit}10%{background-color:#d9534f;color:#2b2b2b}100%{background-color:rgba(217,83,79,0.3)}}@-webkit-keyframes pulseBackgroundDangerActiveKeep{0%{color:inherit}10%{background-color:#d43f3a;color:#2b2b2b}100%{background-color:rgba(212,63,58,0.3)}}@-moz-keyframes pulseBackgroundDangerActiveKeep{0%{color:inherit}10%{background-color:#d43f3a;color:#2b2b2b}100%{background-color:rgba(212,63,58,0.3)}}@-ms-keyframes pulseBackgroundDangerActiveKeep{0%{color:inherit}10%{background-color:#d43f3a;color:#2b2b2b}100%{background-color:rgba(212,63,58,0.3)}}@keyframes pulseBackgroundDangerActiveKeep{0%{color:inherit}10%{background-color:#d43f3a;color:#2b2b2b}100%{background-color:rgba(212,63,58,0.3)}}.pf-animation-pulse-danger-keep{-webkit-animation:pulseBackgroundDangerKeep 1s 1;animation:pulseBackgroundDangerKeep 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}.pf-animation-pulse-danger-keep .sorting_1{-webkit-animation:pulseBackgroundDangerActiveKeep 1s 1;animation:pulseBackgroundDangerActiveKeep 1s 1;-webkit-animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);animation-timing-function:cubic-bezier(0.53, -0.03, 0.68, 0.38);will-change:color, background-color;animation-fill-mode:forwards}.pf-animate-rotate,.modal-content h2[data-toggle="collapse"]:after,.modal-content h4[data-toggle="collapse"]:after,.panel-body h2[data-toggle="collapse"]:after,.panel-body h4[data-toggle="collapse"]:after{-webkit-transition:all 0.08s linear;transition:all 0.08s linear}.pf-animate-rotate.right,.modal-content h2.right[data-toggle="collapse"]:after,.modal-content h4.right[data-toggle="collapse"]:after,.panel-body h2.right[data-toggle="collapse"]:after,.panel-body h4.right[data-toggle="collapse"]:after{-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.pf-animate-rotate.left,.modal-content h2.left[data-toggle="collapse"]:after,.modal-content h4.left[data-toggle="collapse"]:after,.panel-body h2.left[data-toggle="collapse"]:after,.panel-body h4.left[data-toggle="collapse"]:after{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}@keyframes rotateRainbow{0%{background-position-x:0}100%{background-position-x:100vw}}@font-face{font-family:'Triglavian';font-style:normal;font-weight:900;src:url("../../fonts/triglavian-regular.eot");src:url("../../fonts/triglavian-regular.eot?#iefix") format("embedded-opentype"),url("../../fonts/triglavian-regular.woff2") format("woff2"),url("../../fonts/triglavian-regular.woff") format("woff"),url("../../fonts/triglavian-regular.ttf") format("truetype");font-display:swap}.pf-triglivian{font-family:'Triglavian';font-weight:900}:fullscreen{overflow-y:scroll}body{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}a,.pf-link{color:#477372;will-change:color;text-decoration:none;cursor:pointer;-webkit-transition:color 0.08s ease-out,background-color 0.08s ease-out;transition:color 0.08s ease-out,background-color 0.08s ease-out}a:hover,.pf-link:hover{color:#6caead;text-decoration:none}a:focus,.pf-link:focus{color:#477372}a.disabled,.pf-link.disabled{color:#777;pointer-events:none;cursor:default}em,.pf-font-italic{font-style:italic}em.pf-brand,.pf-font-italic.pf-brand{text-transform:uppercase}.pf-font-uppercase{text-transform:uppercase}.pf-font-capitalize{text-transform:capitalize}.pf-font-line-through{text-decoration:line-through}.pf-text-ellipsis{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.fa-char:before{font-family:Arial, sans-serif;font-weight:bold;content:attr(data-char-content)}.fa-tree-child{color:#63676a;padding-right:5px}.no-scroll{overflow:hidden}.no-padding{padding:0 !important}.no-margin{margin:0 !important}.pf-hidden-by-attr[data-attr='']{display:none}.pf-hidden-by-attr:not([data-attr='']){display:initial}.pf-hidden-by-attr:before{content:attr(data-attr) " " attr(data-attr-label)}.pf-shown-by-attr[data-attr='']{display:initial}.pf-shown-by-attr:not([data-attr='']){display:none}.pf-shown-by-attr:before{content:attr(data-attr) " " attr(data-attr-label)}html{scrollbar-width:thin;scrollbar-color:#717171 #222223}::-webkit-scrollbar{display:none;width:16px;height:16px}::-webkit-scrollbar-track{background-color:#2b2b2b;border-left:1px solid #313335;border-radius:2px;-webkit-transition:background-color 0.5s;transition:background-color 0.5s}::-webkit-scrollbar-thumb{height:6px;border:5px solid transparent;background-clip:padding-box;-webkit-border-radius:8px;background-color:#868c90}::-webkit-scrollbar-thumb:hover{background-color:#a1a5a8}::-webkit-scrollbar-button{width:0;height:0;display:none}::-webkit-scrollbar-corner{background-color:transparent}::selection{background:#adadad;color:#1d1d1d}::-moz-selection{background:#adadad;color:#1d1d1d}.row--reverse{display:flex;flex-direction:column-reverse}.pf-container-flex-end{display:flex;justify-content:flex-end}.well.well-text-number{font-family:Oxygen, Arial, sans-serif;font-weight:bold;letter-spacing:.02em;line-height:16px;text-rendering:geometricPrecision;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.collapse{will-change:height}.pf-help-default,.pf-help-light,.pf-help{cursor:help;pointer-events:auto;-webkit-transition:color 0.08s ease-out;transition:color 0.08s ease-out}.pf-dialog-icon-button,.pf-system-signature-module .pf-sig-table .fa-plus,.pf-system-route-module .pf-system-route-table td .fa-sync,.pf-system-route-module .pf-system-route-table td .fa-search,.pf-connection-info-module .pf-connection-info-table td .fa-plus{cursor:pointer;margin-top:2px;-webkit-transition:color 0.15s ease-out;transition:color 0.15s ease-out}.pf-dialog-icon-button:not(.collapsed),.pf-system-signature-module .pf-sig-table .fa-plus:not(.collapsed),.pf-system-route-module .pf-system-route-table td .fa-sync:not(.collapsed),.pf-system-route-module .pf-system-route-table td .fa-search:not(.collapsed),.pf-connection-info-module .pf-connection-info-table td .fa-plus:not(.collapsed),.pf-dialog-icon-button:hover,.pf-system-signature-module .pf-sig-table .fa-plus:hover,.pf-system-route-module .pf-system-route-table td .fa-sync:hover,.pf-system-route-module .pf-system-route-table td .fa-search:hover,.pf-connection-info-module .pf-connection-info-table td .fa-plus:hover{color:#e28a0d}.pf-module-icon-button{cursor:pointer;color:#63676a;-webkit-transition:color 0.15s ease-out;transition:color 0.15s ease-out}.pf-module-icon-button.fas,.pf-landing .pf-landing-list li>i.pf-module-icon-button{position:relative}.pf-module-icon-button:hover,.pf-module-icon-button.active{color:#e28a0d !important}.pf-module-icon-button.editable{border-bottom:none !important}.pf-module-icon-button[data-badge]:after{content:attr(data-badge);position:absolute;top:-8px;left:calc(100% - 5px);color:#e28a0d;border-radius:9px;padding:3px 4px;font-size:11px;font-weight:bold;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;font-family:Oxygen, Arial, sans-serif}.pf-module-icon-button-copy{cursor:copy;-moz-user-select:text;user-select:text}.pf-bg-icon-inline,.editable-input .pf-editable-toggle .pf-editable-toggle-item,table td.pf-table-cell-bg-image .pf-table-cell-bg-image-wrapper,table th.pf-table-cell-bg-image .pf-table-cell-bg-image-wrapper{background-size:contain;background-origin:content-box;background-repeat:no-repeat;background-image:var(--bg-image);background-position:bottom 0 right 0;image-rendering:-webkit-optimize-contrast}.pf-bg-icon-inline{display:inline-block;width:20px;height:20px;margin:-5px 5px;outline:1px solid;outline-color:transparent;outline-offset:2px;-webkit-transition:outline-color 0.15s ease-out;transition:outline-color 0.15s ease-out}.pf-bg-icon-inline:hover{outline-color:#477372}.alert{will-change:opacity, transform}.editable-input optgroup[label]{background-color:#3c3f41;color:#63676a}.editable-input optgroup[label] option{background-color:#313335;color:#adadad;font-family:Consolas,monospace,Menlo,Monaco,"Courier New"}.editable-input .editable-checklist>div>label{display:block !important;padding-left:20px !important;color:#adadad}.editable-input .editable-checklist>div>label>span:after{top:-2px}.editable-input .editable-checklist.pf-editable-settings{display:grid;column-gap:15px;grid-template-columns:repeat(2, auto);align-items:end}.editable-input .editable-checklist.pf-editable-settings>.pf-editable-headline{grid-column:1}.editable-input .editable-checklist.pf-editable-settings>.pf-editable-headline:before{content:attr(data-headline);display:block;text-transform:capitalize;font-weight:bold;line-height:18px;margin-bottom:5px;margin-top:5px;color:#7c8184;padding-left:25px}.editable-input .editable-checklist.pf-editable-settings>.pf-editable-headline+.pf-editable-headline[data-count='1']{grid-column:2}.editable-input .editable-checklist .pf-editable-unknown[value='0']+span{color:#d9534f}.editable-input .editable-checklist .pf-editable-warn+span{color:#e28a0d}.editable-input .pf-editable-toggle{display:flex;margin-bottom:5px;justify-content:space-between;align-items:center}.editable-input .pf-editable-toggle .pf-editable-toggle-item{width:98px;height:68px;background-color:#7c8184;padding:3px;border-radius:4px;border:1px solid #313335;cursor:pointer;-webkit-transition:background-color 0.08s ease-out;transition:background-color 0.08s ease-out;will-change:background-color}.editable-input .pf-editable-toggle .pf-editable-toggle-item.active{background-color:#477372}.editable-input .pf-editable-toggle .pf-editable-toggle-item:hover{background-color:#568a89}.editable-input .pf-editable-toggle .pf-editable-toggle-item+.fas,.editable-input .pf-editable-toggle .pf-landing .pf-landing-list li>.pf-editable-toggle-item+i,.pf-landing .pf-landing-list .editable-input .pf-editable-toggle li>.pf-editable-toggle-item+i{margin:0 10px}select:active,select:hover{outline:none}select:active,select:hover{outline-color:red}.select2-results [class*="col-"],.select2-container--pathfinder [class*="col-"]{padding-left:3px;padding-right:3px}.select2-results [class*="col-"]:first-child,.select2-container--pathfinder [class*="col-"]:first-child{padding-left:0}.select2-results [class*="col-"]:last-child,.select2-container--pathfinder [class*="col-"]:last-child{padding-right:0}.select2 ::-webkit-search-cancel-button{-webkit-appearance:none !important}.select2-results.mCustomScrollbar .select2-results__option--load-more{position:absolute;margin-top:50px}.dataTables_wrapper .dataTables_length select{margin:0 3px;padding:1px}.dataTables_wrapper .pf-table-toolbar-status{text-align:center;line-height:22px;color:#63676a}.dataTables_wrapper .dataTables_filter{margin-top:0}@media (max-width: 779px){.dataTables_wrapper .dataTables_filter input[type='search']{width:100px}}.dataTables_wrapper .dt-buttons,.dataTables_wrapper .dt-stats{display:inline-block}.dataTables_wrapper .dt-buttons .dt-button,.dataTables_wrapper .dt-stats .dt-button{padding:0 5px;line-height:22px;margin-bottom:0}.dataTables_wrapper .dt-buttons .dt-button:not(:last-child),.dataTables_wrapper .dt-stats .dt-button:not(:last-child){margin-right:5px}.dataTables_wrapper .dt-buttons .dt-button .fas,.dataTables_wrapper .dt-buttons .dt-button .pf-landing .pf-landing-list li>i,.pf-landing .pf-landing-list .dataTables_wrapper .dt-buttons .dt-button li>i,.dataTables_wrapper .dt-buttons .dt-stat .fas,.dataTables_wrapper .dt-buttons .dt-stat .pf-landing .pf-landing-list li>i,.pf-landing .pf-landing-list .dataTables_wrapper .dt-buttons .dt-stat li>i,.dataTables_wrapper .dt-stats .dt-button .fas,.dataTables_wrapper .dt-stats .dt-button .pf-landing .pf-landing-list li>i,.pf-landing .pf-landing-list .dataTables_wrapper .dt-stats .dt-button li>i,.dataTables_wrapper .dt-stats .dt-stat .fas,.dataTables_wrapper .dt-stats .dt-stat .pf-landing .pf-landing-list li>i,.pf-landing .pf-landing-list .dataTables_wrapper .dt-stats .dt-stat li>i{margin-right:5px}.dataTables_wrapper .dt-buttons .dt-button.disabled,.dataTables_wrapper .dt-buttons .dt-stat.disabled,.dataTables_wrapper .dt-stats .dt-button.disabled,.dataTables_wrapper .dt-stats .dt-stat.disabled{color:#4f5355}.dataTables_wrapper .dt-buttons .dt-button.processing:after,.dataTables_wrapper .dt-buttons .dt-stat.processing:after,.dataTables_wrapper .dt-stats .dt-button.processing:after,.dataTables_wrapper .dt-stats .dt-stat.processing:after{border:2px solid #4f5355;border-left-color:#e28a0d;border-right-color:#e28a0d}.pf-dataTable-condensed-toolbar{padding-top:3px}.pf-dataTable-condensed-toolbar .dataTables_info{padding-top:0;text-align:left}.pf-dataTable-condensed-toolbar .dataTables_paginate{padding-top:0;margin-top:0}.pf-dataTable-condensed-toolbar .dataTables_paginate .paginate_button{padding:0;height:13px;border:0 !important}.pf-dataTable-condensed-toolbar .dataTables_paginate .paginate_button:before,.pf-dataTable-condensed-toolbar .dataTables_paginate .paginate_button:after{top:0}.pf-dataTable-condensed-toolbar .dataTables_paginate .paginate_button:hover{background:transparent !important;color:#e28a0d !important}.pf-dataTable-condensed-toolbar .dt-buttons{text-align:right;margin-bottom:0;float:right !important}.pf-dataTable-condensed-toolbar .dt-buttons .dt-button{line-height:18px;padding-right:0}.pf-dataTable-condensed-toolbar .dt-buttons .dt-button .fa{margin-right:0}.dataTable th.pf-table-image-cell,.dataTable th.pf-table-image-small-cell,.dataTable th.pf-table-image-smaller-cell{padding-left:0 !important;padding-right:0 !important;image-rendering:-webkit-optimize-contrast}.dataTable th.sorting,.dataTable th.sorting_asc,.dataTable th.sorting_desc{padding-right:18px !important}.dataTable tr.group{background-color:rgba(43,43,43,0.4)}.dataTable td.editable-disabled:focus{outline:none;background-color:transparent}.dataTable td.editable-click:not(.editable-disabled){cursor:pointer}.dataTable td:focus,.dataTable td.editable-open,.dataTable td.cellHighlight{outline:1px solid #c2760c;outline-offset:-1px;background-color:rgba(194,118,12,0.08)}.dataTable td>.fa-circle{font-size:9px !important}.dataTable td>.label{font-size:80%}.dataTable td>.pf-fake-connection{height:3px}.dataTable td.pf-table-link-cell{cursor:pointer;-webkit-transition:color 0.08s ease-out;transition:color 0.08s ease-out}.dataTable td.pf-table-action-cell{cursor:pointer}.dataTable td.pf-table-action-cell>.fas{pointer-events:none}.dataTable td.pf-table-action-cell>.pf-table-action-icon-cell{-webkit-transition:color 0.08s ease-out;transition:color 0.08s ease-out}.dataTable td.pf-table-type-cell>span:first-child{display:inline-block;width:28px}.dataTable td.pf-table-type-cell>span:nth-child(2){display:inline-block;width:22px}.dataTable td.pf-table-type-cell>span:nth-child(2) kbd:empty{display:none}.dataTable td.pf-table-image-cell{padding:0 !important;image-rendering:-webkit-optimize-contrast}.dataTable td.pf-table-image-cell img{width:26px;box-sizing:content-box;border-left:1px solid #3c3f41;border-right:1px solid #3c3f41}.dataTable td.pf-table-image-small-cell img{width:24px;border-left:1px solid transparent;border-right:1px solid transparent}.dataTable td.pf-table-image-smaller-cell{padding:0 !important;border-right:1px solid transparent}.dataTable td.pf-table-image-smaller-cell img{width:23px}.dataTable td.pf-table-button-sm-cell{padding:0 5px}.dataTable td.pf-table-counter-cell{color:#63676a}.dataTable td.pf-table-counter-cell .pf-digit-counter-small{width:20px;display:inline-block;font-size:10px}.dataTable td.pf-table-counter-cell .pf-digit-counter-large{width:26px;display:inline-block;font-size:10px}.dataTable td .pf-table-unknown-cell{color:#d9534f;font-style:italic}.dataTable td .pf-table-cell-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dataTable td .pf-table-cell-80{width:90px}.dataTable td .pf-table-cell-90{width:100px}.dataTable td .pf-table-cell-100{width:110px}.dataTable td .pf-endpoint-bubble{width:15px;height:15px}.dataTable td .pf-endpoint-bubble:after{width:15px;height:15px}.dataTable td.separator-right,.dataTable th.separator-right{border-right:1px solid #3c3f41}.dataTable td svg.peity,.dataTable th svg.peity{display:block}.dataTable thead th.colHighlight{border-bottom:1px solid #c2760c}.dataTable tbody td.colHighlight{border-left:1px solid #c2760c;border-right:1px solid #c2760c;background-color:rgba(194,118,12,0.08)}.dataTable tbody tr:first-child td.colHighlight{border-top:1px solid #c2760c}.dataTable tbody tr:last-child td.colHighlight{border-bottom:1px solid #c2760c}table.pf-table-fixed{width:100%;table-layout:fixed}table.collapsing{-webkit-transition:height 0.01s ease;transition:height 0.01s ease}table.collapse.in{display:table}table tr.collapsing{-webkit-transition:height 0.01s ease;transition:height 0.01s ease}table tr.collapse.in{display:table-row !important}table td.separator-right,table th.separator-right{border-right:1px solid #313335}table td.pf-table-cell-10,table th.pf-table-cell-10{width:10px}table td.pf-table-cell-20,table th.pf-table-cell-20{width:20px}table td.pf-table-cell-50,table th.pf-table-cell-50{width:50px}table td.pf-table-cell-100,table th.pf-table-cell-100{max-width:100px}table td.pf-table-cell-ellipses-auto,table th.pf-table-cell-ellipses-auto{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}table td.pf-table-cell-bg-image,table th.pf-table-cell-bg-image{padding:0 0 0 5px !important;vertical-align:middle !important;border-top-color:transparent !important}table td.pf-table-cell-bg-image .pf-table-cell-bg-image-wrapper,table th.pf-table-cell-bg-image .pf-table-cell-bg-image-wrapper{display:block;width:auto;height:40px;padding:2px 0}table td.pf-table-cell-bg-image .pf-table-cell-bg-image-wrapper.smaller,table th.pf-table-cell-bg-image .pf-table-cell-bg-image-wrapper.smaller{height:30px}table td.pf-table-cell-chart,table th.pf-table-cell-chart{position:relative}table td.pf-table-cell-chart svg.peity,table th.pf-table-cell-chart svg.peity{display:block;position:absolute;margin-top:-2px}table td.pf-table-cell-progress,table th.pf-table-cell-progress{position:relative}table td.pf-table-cell-progress:before,table th.pf-table-cell-progress:before{content:'';position:absolute;bottom:0;left:0;width:0;width:calc(var(--width) * 1%);height:1px;border-top:1px solid #428bca}table td.pf-table-cell-progress:after,table th.pf-table-cell-progress:after{content:'';position:absolute;bottom:0;left:0;width:100%;height:1px;border-width:0 2px;border-style:solid;border-color:#adadad}.pf-table-tools{height:45px}.pf-table-tools>.btn-labeled:not(:last-child){margin-right:10px}.pf-table-tools-action{will-change:height, opacity;opacity:0;display:none;height:0;overflow:hidden}.pf-loading-overlay{position:absolute;width:100%;height:100%;top:0;left:0;opacity:0;background:#2b2b2b;z-index:1060;border-radius:5px}.pf-loading-overlay .pf-loading-overlay-wrapper{width:25px;height:25px;margin:auto;text-align:center;position:absolute;top:0;left:0;bottom:0;right:0}.pf-loading-overlay .pf-loading-overlay-wrapper i{padding:3px}.navbar-header-block{width:100%}.navbar-header-block .navbar-nav{width:100%}.modal .navbar-nav li:not(.disabled){position:relative}.modal .navbar-nav li:not(.disabled):before{content:'';position:absolute;top:0;background-color:#5cb85c;opacity:0;-webkit-transition:top 0.15s ease-out,opacity 0.15s ease-out;transition:top 0.15s ease-out,opacity 0.15s ease-out;will-change:opacity,top;width:100%;height:2px}.modal .navbar-nav li:not(.disabled):hover:before,.modal .navbar-nav li:not(.disabled).active:before{top:-4px;opacity:1}.navbar-fixed-top .navbar-nav li:not(.disabled){position:relative}.navbar-fixed-top .navbar-nav li:not(.disabled):before{content:'';position:absolute;bottom:0;background-color:#5cb85c;opacity:0;-webkit-transition:bottom 0.15s ease-out,opacity 0.15s ease-out;transition:bottom 0.15s ease-out,opacity 0.15s ease-out;will-change:opacity,bottom;width:100%;height:2px}.navbar-fixed-top .navbar-nav li:not(.disabled):hover:before,.navbar-fixed-top .navbar-nav li:not(.disabled).active:before{bottom:-4px;opacity:1}.pf-navbar-version-info{cursor:pointer}.pf-site{background-color:#05050a;background-repeat:no-repeat}.pf-menu{color:#63676a;background-color:#313335;width:150px;transition-duration:180ms;will-change:transform}.pf-menu-left .list-group-item{cursor:pointer;-webkit-box-shadow:inset -10px 0px 5px -5px rgba(0,0,0,0.4);box-shadow:inset -10px 0px 5px -5px rgba(0,0,0,0.4)}.pf-menu-right .list-group-item{cursor:pointer;-webkit-box-shadow:inset 10px 0px 5px -5px rgba(0,0,0,0.4);box-shadow:inset 10px 0px 5px -5px rgba(0,0,0,0.4)}.list-group-item.disabled:after{content:'\f023';font-family:'Font Awesome 5 Free';font-weight:bold;color:#2b2b2b;position:absolute;right:8px}.list-group-item.loading{pointer-events:none;color:#777}.list-group-item.loading:after{content:'\f021';font-family:'Font Awesome 5 Free';font-weight:bold;position:absolute;right:8px;animation:fa-spin 2s infinite linear}.mCSB_container,.mCSB_dragger{will-change:top, left, height, width;transition:height .18s linear, width .18s linear}.mCSB_container{overflow-x:visible !important;overflow-y:visible !important}.pf-timestamp-counter{visibility:hidden}.pf-map-type-private{color:#7986cb}.pf-map-type-corporation{color:#5cb85c}.pf-map-type-alliance{color:#428bca}.pf-map-type-global{color:#568a89}.pf-user-status{color:#a52521}.pf-user-status-corp{color:#5cb85c}.pf-user-status-ally{color:#428bca}.pf-user-status-own{color:#7986cb}.pf-endpoint-bubble{display:inline-block;position:relative;width:18px;height:18px}.pf-endpoint-bubble:after{content:var(--svgBubble);display:inline-block;pointer-events:none;width:18px;height:18px;vertical-align:top}.pf-system-effect{display:none;color:#adadad;cursor:help}.pf-system-effect-magnetar{color:#e06fdf;display:inline-block}.pf-system-effect-redgiant{color:#d9534f;display:inline-block}.pf-system-effect-pulsar{color:#428bca;display:inline-block}.pf-system-effect-wolfrayet{color:#e28a0d;display:inline-block}.pf-system-effect-cataclysmic{color:#ffb;display:inline-block}.pf-system-effect-blackhole{color:#000;display:inline-block}.pf-rally,.pf-system-info-rally .pf-system-head{text-shadow:1px 1px 2px #1d1d1d;background-color:#782d77;background-image:linear-gradient(-45deg, #3e264e 25%, transparent 25%, transparent 50%, #3e264e 50%, #3e264e 75%, transparent 75%, transparent);background-size:25px 25px;-webkit-animation:move 2.5s linear infinite;-moz-animation:move 2.5s linear infinite;-ms-animation:move 2.5s linear infinite;animation:move 2.5s linear infinite}.pf-system-security-0-0{color:#be0000}.pf-system-security-0-1{color:#ab2600}.pf-system-security-0-2{color:#be3900}.pf-system-security-0-3{color:#c24e02}.pf-system-security-0-4{color:#ab5f00}.pf-system-security-0-5{color:#bebe00}.pf-system-security-0-6{color:#73bf26}.pf-system-security-0-7{color:#00bf00}.pf-system-security-0-8{color:#00bf39}.pf-system-security-0-9{color:#39bf99}.pf-system-security-1-0{color:#28c0bf}.pf-system-sec{display:inline-block;transform:translateY(0);-webkit-font-smoothing:antialiased;margin-right:5px;cursor:-moz-grab;cursor:-webkit-grab;cursor:grab}.pf-system-sec-highSec{color:#5cb85c}.pf-system-sec-lowSec{color:#e28a0d}.pf-system-sec-nullSec{color:#d9534f}.pf-system-sec-high{color:#d9534f}.pf-system-sec-mid{color:#e28a0d}.pf-system-sec-low{color:#428bca}.pf-system-sec-unknown{color:#7986cb}.pf-system-sec-abyssal{color:#e06fdf}.pf-system-sec-special{color:#c8b847}.pf-system-sec-drifter{color:#44aa82}.pf-system-status-friendly{border-color:#428bca !important;color:#428bca}.pf-system-status-occupied{border-color:#e28a0d !important;color:#e28a0d}.pf-system-status-hostile{border-color:#d9534f !important;color:#d9534f}.pf-system-status-empty{border-color:#5cb85c !important;color:#5cb85c}.pf-system-status-unscanned{border-color:#568a89 !important;color:#568a89}.pf-system-info-status-label{background-color:#63676a;color:#000;will-change:background-color;-webkit-transition:background-color 0.3s ease-out;transition:background-color 0.3s ease-out}.pf-system-info-status-label.pf-system-status-friendly{background-color:#428bca}.pf-system-info-status-label.pf-system-status-occupied{background-color:#e28a0d}.pf-system-info-status-label.pf-system-status-hostile{background-color:#d9534f}.pf-system-info-status-label.pf-system-status-empty{background-color:#5cb85c}.pf-system-info-status-label.pf-system-status-unscanned{background-color:#568a89}.pf-system-hidden{opacity:0.15 !important;pointer-events:none}.pf-system-effect-dialog .clearfix+.col-md-6{margin-top:10px}.pf-system-effect-dialog .clearfix+.col-md-6+.col-md-6{margin-top:10px}.pf-planet-barren{color:#755e48}.pf-planet-gas{color:#a4b2b2}.pf-planet-ice{color:#aacada}.pf-planet-lava{color:#891c08}.pf-planet-oceanic{color:#4d7999}.pf-planet-plasma{color:#28576e}.pf-planet-shattered{color:#7986cb}.pf-planet-storm{color:#38556a}.pf-planet-temperate{color:#4c593c}.pf-fake-connection{box-sizing:content-box;display:inline-block;width:70px;height:4px;max-width:100%;border-top:2px solid #63676a;border-bottom:2px solid #63676a;background-color:#3c3f41;position:relative;font-size:10px;font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif}.pf-fake-connection.pf-map-connection-stargate{background-color:#313966;border-color:#63676a}.pf-fake-connection.pf-map-connection-jumpbridge{background-color:#6caead;border-color:#3c3f41;background:repeating-linear-gradient(to right, #6caead, #6caead 10px, #3c3f41 10px, #3c3f41 20px)}.pf-fake-connection.pf-map-connection-abyssal{background-color:#5a225a;border-color:#3c3f41;background:repeating-linear-gradient(to right, #5a225a, #5a225a 5px, #3c3f41 5px, #3c3f41 10px)}.pf-fake-connection.pf-map-connection-wh-eol{border-color:#d747d6}.pf-fake-connection.pf-map-connection-wh-reduced{background-color:#e28a0d}.pf-fake-connection.pf-map-connection-wh-critical{background-color:#a52521}.pf-fake-connection.pf-map-connection-wh-size-s:after,.pf-fake-connection.pf-map-connection-wh-size-m:after,.pf-fake-connection.pf-map-connection-wh-size-l:after,.pf-fake-connection.pf-map-connection-wh-size-xl:after,.pf-fake-connection.pf-map-connection-preserve-mass:after{content:'?';background-color:#3c3f41;color:#adadad;padding:1px 2px;position:absolute;left:calc(50% - 12px);top:-5px;font-family:Arial, sans-serif;font-size:11px;line-height:12px;min-width:14px;text-align:center;border-radius:3px;-webkit-box-shadow:0 3px 6px rgba(0,0,0,0.3);box-shadow:0 3px 6px rgba(0,0,0,0.3)}.pf-fake-connection.pf-map-connection-wh-size-s{border-style:dotted}.pf-fake-connection.pf-map-connection-wh-size-s:after{content:'S'}.pf-fake-connection.pf-map-connection-wh-size-m{border-style:dashed}.pf-fake-connection.pf-map-connection-wh-size-m:after{content:'M'}.pf-fake-connection.pf-map-connection-wh-size-l:after{content:'L'}.pf-fake-connection.pf-map-connection-wh-size-xl:after{content:'XL'}.pf-fake-connection.pf-map-connection-preserve-mass:after{content:'save mass';background-color:#a52521;color:#eaeaea;left:calc(50% - 28px)}.pf-fake-connection-text{padding:0 2px;border-style:solid;border-color:#575a5d;border-width:2px;border-left:none;border-right:none}.pf-fake-connection-text.pf-wh-eol{border-color:#d747d6}.pf-fake-connection-text.pf-wh-reduced{background-color:#e28a0d;color:#000}.pf-fake-connection-text.pf-wh-critical{background-color:#a52521;color:#000}.pf-fake-connection-text.pf-wh-frig{border-top-style:dotted;border-bottom-style:dotted}.pf-structure-status-unknown{color:#568a89}.pf-structure-status-online{color:#5cb85c}.pf-structure-status-offline{color:#a52521}.tooltip-inner{color:#adadad;background-color:#3c3f41;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;padding:5px 5px;border-radius:3px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}.modal .tooltip{z-index:1060}.modal .tooltip .tooltip-inner{color:#313335;background-color:#adadad}.tooltip.top .tooltip-arrow{border-top-color:#63676a}.tooltip.right .tooltip-arrow{border-right-color:#63676a}.tooltip.bottom .tooltip-arrow{border-bottom-color:#63676a}.tooltip.left .tooltip-arrow{border-left-color:#63676a}td.pf-popover-trigger:hover{color:#477372}.pf-notransition{-webkit-transition:none !important;-moz-transition:none !important;-o-transition:none !important;transition:none !important}.pf-dynamic-area{padding:10px;min-height:100px;position:relative;background-color:#313335;overflow:hidden;border-radius:5px}.pf-dynamic-area .dl-horizontal{margin-bottom:0}.pf-dynamic-area .dl-horizontal dd{min-width:100px}.pf-dynamic-area .dl-horizontal dd.txt-color,.pf-dynamic-area .dl-horizontal dd.pf-help-light,.pf-dynamic-area .dl-horizontal dd.pf-help,.pf-dynamic-area .dl-horizontal .dataTable td.pf-table-action-cell>dd.pf-table-action-icon-cell,.dataTable .pf-dynamic-area .dl-horizontal td.pf-table-action-cell>dd.pf-table-action-icon-cell{font-weight:bold}.pf-dynamic-area>[class~='alert']:last-of-type{margin-bottom:0}.pf-dynamic-area[data-resizebar]{padding-bottom:15px}.pf-dynamic-area[data-resizebar]:hover .pf-resizearea{-webkit-transition-delay:.15s;transition-delay:.15s;height:40px;opacity:1}.pf-dynamic-area[data-resizebar]:hover .pf-resizebar-bar{border-top:1px solid #e28a0d !important}.pf-dynamic-area:not([data-resizebar]) .pf-dynamic-area-resizebar{display:none}.pf-dynamic-area .pf-resizearea{height:0;opacity:0;-webkit-transition:height 0.12s ease-out,opacity 0.12s ease-out;transition:height 0.12s ease-out,opacity 0.12s ease-out;will-change:height, opacity}.pf-dynamic-area .pf-dynamic-area-statusbar{position:absolute;left:0;bottom:0;width:100%;background-color:#313335;padding:1px 0}.pf-dynamic-area .pf-dynamic-area-statusbar .pf-dynamic-area-resizebar{width:100%;height:9px;padding-top:1px;cursor:row-resize}.pf-dynamic-area .pf-dynamic-area-statusbar .pf-dynamic-area-resizebar:hover .pf-resizebar-bar{border-top:1px solid #e28a0d}.pf-dynamic-area .pf-dynamic-area-statusbar .pf-dynamic-area-resizebar .pf-resizebar-bar{border-top:1px solid #63676a;transition:border-top 0.15s ease-out;width:20px;margin:1px auto}.pf-code-ObjectBrace{color:#b042ae;font-weight:bold}.pf-code-ArrayBrace{color:#6caead;font-weight:bold}.pf-code-PropertyName{color:#898d91;font-weight:bold}.pf-code-String{color:#e28a0d}.pf-code-Number{color:#5cb85c}.pf-code-Boolean{color:#7986cb;font-weight:bold}.pf-code-Function{color:#898d91;font-style:italic;white-space:pre}.pf-code-Null{color:#d9534f;font-weight:bold}.pf-code-Comma{color:#898d91;font-weight:bold}.pf-code-Date{color:#898d91;font-style:italic}pre .fa-ul{display:flex;flex-direction:column;margin-left:15px}pre>ul{margin-top:10px}code .fas,code .pf-landing .pf-landing-list li>i,.pf-landing .pf-landing-list code li>i,code .far,code .fab{color:#63676a;cursor:pointer;margin:0 3px}code section{border-radius:5px}code section:not(:last-child){border-bottom:1px dashed #3c3f41;padding-bottom:5px}#pf-head{margin-bottom:0px}#pf-head a{-webkit-transition:color 0.15s ease-out;transition:color 0.15s ease-out;will-change:color}#pf-head a:focus{color:#477372}#pf-head a:focus img{border-color:#3c3f41}#pf-head a:hover{text-decoration:none}#pf-head a:hover .badge{color:#6caead}#pf-head a:hover img{border-color:#568a89}#pf-head i{margin-right:2px}#pf-head .pf-brand-desc{margin:6px 10px 0 90px;width:180px}#pf-head .pf-head-menu{padding:3px 10px;line-height:24px}#pf-head .pf-head-menu .pf-head-menu-logo{width:24px;height:24px;display:inline-block;float:left}#pf-head .pf-head-user-character{opacity:0;visibility:hidden}#pf-head .pf-head-active-users{cursor:pointer}#pf-head .pf-head-active-users{display:none}#pf-head .pf-head-active-users .badge{-webkit-transition:color 0.3s ease-out;transition:color 0.3s ease-out}#pf-head .pf-head-image{display:inline-block;margin-top:-6px;margin-bottom:-6px;width:27px;border:1px solid #3c3f41;image-rendering:-webkit-optimize-contrast;-webkit-transition:border-color 0.15s ease-out;transition:border-color 0.15s ease-out;will-change:border-color}#pf-head .pf-head-image.--left{margin-right:3px}#pf-head .pf-head-image.--right{margin-left:8px}#pf-head .pf-head-program-status{cursor:pointer}#pf-head .pf-head-map-tracking{margin-bottom:4px;margin-top:4px}#pf-head .tooltip .tooltip-inner{color:#adadad}.pf-head{-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.4);box-shadow:0 6px 12px rgba(0,0,0,0.4)}.pf-head .badge{background-color:#3c3f41;color:#adadad}.pf-head .badge:empty{display:none}.pf-head small{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}#pf-footer{display:flex;position:absolute;bottom:0;left:0;width:100%;margin:0;background:rgba(60,63,65,0.3);padding:1px 0}#pf-footer a{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;color:#375959}#pf-footer a:hover{color:#477372;text-decoration:none}#pf-footer .pf-footer-left{display:flex;flex:none;justify-content:flex-start}#pf-footer .pf-footer-center{display:flex;flex:1;padding:0 20px}#pf-footer .pf-footer-right{display:flex;flex:none;justify-content:flex-end}.navbar-fixed-bottom{padding:2px 0}.navbar-fixed-bottom .container-fluid{padding-left:0;padding-right:0}.flex-row{display:flex;flex:0 1 auto;flex-direction:row;flex-wrap:wrap}.flex-col{flex:0 0 auto}.flex-grow{flex-grow:1;flex-basis:0;max-width:100%}.flex-between{justify-content:space-between}#pf-global-info{width:100%;margin-bottom:0;border:none;padding:9px 10px}#pf-global-info .ui-pnotify-icon{float:left}#pf-global-info .ui-pnotify-icon>span{display:block}#pf-global-info .ui-pnotify-title{margin-bottom:0}.panel-reverse-order{display:table;width:100%}.panel-reverse-order .reverse-order-header{display:table-header-group}.panel-reverse-order .reverse-order-footer{display:table-footer-group}@-webkit-keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}@-moz-keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}@-ms-keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}@keyframes move{0%{background-position:0 0}100%{background-position:50px 50px}}.pf-animate{visibility:hidden;opacity:0}.pf-color-line{position:fixed;top:0;left:0;width:100%;height:3px;background:repeating-linear-gradient(-45deg, #66c84f 0%, #568a89 12.5%, #6caead 25%, #5cb85c 37.5%, #66c84f 50%);background-size:100vw 100vw;-webkit-animation:rotateRainbow 3s infinite linear forwards;animation:rotateRainbow 3s infinite linear forwards}.pf-color-line.warning{background-image:linear-gradient(to right, #e28a0d, #e28a0d 100%)}.pf-color-line.danger{background-image:linear-gradient(to right, #a52521, #a52521 100%)}.pf-splash{position:fixed;z-index:2000;background-color:#1d1d1d;color:#63676a;top:0;bottom:0;left:0;right:0;will-change:opacity}.pf-splash:not(.pf-splash-warning):not(.pf-splash-error){cursor:wait}.pf-splash .pf-splash-title{position:fixed;left:50%;top:30%;text-align:center;max-width:500px;padding:20px;transform:translate(-50%, -50%)}.pf-splash .pf-splash-debug{position:absolute;bottom:0;width:100%}.pf-splash .pf-splash-debug .pf-splash-debug-headline{padding:0 10px}.pf-splash .pf-splash-debug .pf-splash-pre{margin-bottom:0}@media (max-width: 1200px){.pf-landing .pf-brand-desc{display:none}.pf-landing .navbar .navbar-brand{margin-left:10px}}.pf-landing section:not(:last-of-type){border-bottom:1px solid #2b2b2b}.pf-landing section{min-height:200px;padding:20px 0 40px 0}.pf-landing section h4:not(.pf-dynamic-area){font-size:18px;font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif;margin:5px 0 10px 0;border-bottom:1px solid #2b2b2b;line-height:34px}.pf-landing .container>.row{margin-bottom:30px}.pf-landing .alert{box-shadow:0 4px 10px rgba(0,0,0,0.4)}.pf-landing a[data-gallery]{position:relative;display:inline-block;overflow:hidden;margin:5px 0 15px 0;box-shadow:0 4px 10px rgba(0,0,0,0.4)}.pf-landing a[data-gallery]:before{content:'\f06e';font-family:'Font Awesome 5 Free';font-size:20px;color:#e28a0d;position:absolute;height:100%;width:100%;z-index:10;-webkit-transition:transform 0.1s ease-out,opacity 0.1s ease-out;transition:transform 0.1s ease-out,opacity 0.1s ease-out;will-change:transform, opacity;transform:scale(1.3, 1.3);opacity:0;display:flex;flex-direction:column;justify-content:center;align-items:center}.pf-landing a[data-gallery]:hover img{border-color:#6caead;filter:brightness(50%)}.pf-landing a[data-gallery]:hover:before{-webkit-transition-delay:.05s;transition-delay:.05s;transform:scale(1, 1);opacity:1}.pf-landing a[data-gallery] .pf-landing-image-preview{border-width:1px;border-style:solid;border-color:#1d1d1d;display:inline-block;will-change:all;filter:brightness(100%);-webkit-transition:all 0.2s ease-out;transition:all 0.2s ease-out}.pf-landing a[data-gallery] .pf-landing-image-preview.pf-landing-image-preview-small{height:160px}.pf-landing a[data-gallery] .pf-landing-image-preview.pf-landing-image-preview-medium{height:256px}#pf-landing-top{display:flex;flex-direction:column;align-items:center;height:255px;border-bottom:1px solid #313335;overflow:hidden;transition:height 0.25s ease-out;will-change:height;background-color:#050a11}#pf-landing-top:hover{transition-delay:0.25s;height:355px}#pf-landing-top .pf-header-bg{height:inherit}#pf-landing-top #pf-header-container{position:absolute;height:inherit;pointer-events:none;z-index:30}#pf-landing-top #pf-header-container #pf-logo-container{height:inherit;z-index:110}@media (max-width: 1199px){#pf-landing-top #pf-header-container #pf-logo-container{text-align:center}}#pf-landing-top #pf-header-container #pf-logo-container>svg{width:250px;padding-top:60px;padding-bottom:50px;height:100%;opacity:.8}#pf-landing-top #pf-header-container #pf-header-preview-container{align-self:flex-end;margin-bottom:-26px}#pf-landing-top #pf-header-container #pf-header-preview-container .pf-header-preview-element{position:relative;margin-left:12px;margin-top:12px;height:155px;width:180px;padding:7px;opacity:0;border-radius:5px;background-color:rgba(43,43,43,0.5)}#pf-landing-top #pf-header-container #pf-header-preview-container .pf-header-preview-element:nth-child(n+4){box-shadow:0 4px 10px rgba(0,0,0,0.4)}#pf-landing-top #pf-header-container #pf-header-preview-container .pf-header-preview-element:after{content:'';position:absolute;width:calc(100% - 14px);height:calc(100% - 14px);border-radius:3px;background-image:var(--bg-image);background-repeat:no-repeat;background-position:50% 50%;background-color:rgba(29,29,29,0.75)}#pf-landing-top #pf-header-canvas{position:absolute;top:0;left:0}#pf-landing-top #pf-header-canvas.fade.in{cursor:none}#pf-landing-login{position:relative;background-color:inherit;z-index:20;padding-top:40px;padding-bottom:30px}@media (max-width: 1199px){#pf-landing-login{padding-top:10px}}#pf-landing-login .row{margin-bottom:0}#pf-landing-login .pf-character-selection>div:not(.pf-character-row-animate){-webkit-transition:width 0.2s ease,margin 0.2s ease;transition:width 0.2s ease,margin 0.2s ease}#pf-landing-login .pf-dynamic-area{display:inline-block;margin:10px 5px 20px 5px;padding:10px 10px 5px 10px;min-width:155px;min-height:184px;border-radius:10px;-webkit-box-shadow:0 4px 10px rgba(0,0,0,0.4);box-shadow:0 4px 10px rgba(0,0,0,0.4)}#pf-landing-login .pf-dynamic-area .ribbon-wrapper{z-index:5}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper{opacity:0;width:128px;border:2px solid #63676a;border-radius:8px;-webkit-transition:border-color 0.2s ease-out,box-shadow 0.2s ease-out;transition:border-color 0.2s ease-out,box-shadow 0.2s ease-out;transform:translate3d(0, 0, 0);will-change:border-color, transition;overflow:hidden;cursor:pointer;display:inline-block;background-color:#2b2b2b;box-sizing:content-box}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper:hover{border-color:#4f9e4f}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper:hover .pf-character-name{color:#4f9e4f}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper:hover .pf-character-image{filter:grayscale(50%)}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper.pf-character-active:after{font-family:"Font Awesome 5 Free";content:"\f111";font-weight:bold;position:absolute;top:5px;left:5px;height:14px;width:14px;color:#5cb85c;font-size:10px}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-select-image{overflow:hidden;width:128px;height:128px;position:relative}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-select-image .pf-character-info{position:absolute;top:0;left:0;width:0;height:100%;color:#adadad;background:rgba(60,63,65,0.8);overflow:hidden;will-change:width, transition;padding:5px 0}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-select-image .pf-character-info .pf-character-info-img{width:36px}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-select-image .pf-character-info .pf-character-info-text{line-height:25px}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-name{font-size:13px;line-height:30px;border-top:1px solid #313335;color:#adadad;-webkit-transition:color 0.2s ease-out;transition:color 0.2s ease-out}#pf-landing-login .pf-dynamic-area .pf-character-image-wrapper .pf-character-image{border-top-left-radius:8px;border-top-right-radius:8px;-webkit-transition:all 0.3s ease-out;transition:all 0.3s ease-out;filter:grayscale(0%)}#pf-landing-login .pf-sso-login-button{width:270px;height:45px;margin-top:10px;margin-bottom:15px;color:#adadad;filter:drop-shadow(0 4px 5px rgba(0,0,0,0.4));transition:color 0.18s ease-out, filter 0.06s ease-out;will-change:color, fill}#pf-landing-login .pf-sso-login-button:hover{color:#e28a0d;filter:drop-shadow(0 1px 3px rgba(0,0,0,0.4))}#pf-landing-login .pf-sso-login-button>svg{width:inherit;height:inherit}#pf-landing-login #pf-notification-panel{display:none}#pf-landing-gallery-carousel{background-image:url("../../img/pf-header-bg.jpg")}#pf-landing-gallery-carousel .slide-content{border-radius:5px;pointer-events:none}#pf-landing-gallery-carousel h3{width:100%;text-align:left}.pf-landing-pricing-panel{margin-top:20px}.pricing-big{position:relative;-webkit-box-shadow:0 4px 10px rgba(0,0,0,0.4);box-shadow:0 4px 10px rgba(0,0,0,0.4)}.pricing-big .panel-heading{border-color:#3c3f41}.pricing-big .the-price{padding:1px 0;background:#2d3031;text-align:center}.pricing-big .the-price .subscript{font-size:12px;color:#63676a}.pricing-big .price-features{background:#3c3f41;color:#adadad;padding:20px 15px;line-height:22px}.pricing-big .price-features:not(.price-features-fluid){min-height:205px}.pricing-big .price-features .list-unstyled.text-left li,.pricing-big .price-features .text-left.list-inline li{text-indent:-1em;padding-left:1.5em}.pricing-big .price-features .list-unstyled.text-left li .fa,.pricing-big .price-features .text-left.list-inline li .fa{text-indent:0}.pricing-big .badge{color:#adadad;background-color:#2b2b2b}.pricing-big table tr td{line-height:1}.pricing-big table tr td .btn-group .btn{border-radius:0;padding-top:4px;padding-bottom:4px}#pf-landing-admin .pf-landing-admin-login{margin-bottom:0}#pf-landing-about .pf-landing-about-me{width:256px;height:256px;border:none;-webkit-box-shadow:0 4px 10px rgba(0,0,0,0.4);box-shadow:0 4px 10px rgba(0,0,0,0.4)}.pf-landing-footer{padding:30px 0;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;background-color:#171717}.pf-landing-footer .row{margin-bottom:0 !important}.pf-landing-footer .pf-social-networks{margin-bottom:0}.pf-landing-footer .pf-social-networks>li{display:inline-block;line-height:1}.pf-landing-footer .pf-social-networks>li a{display:inline-block;background:rgba(99,103,106,0.5);line-height:24px;text-align:center;font-size:14px;margin-right:3px;padding:6px 6px 2px 6px;width:36px}.pf-body[data-script='admin'] .navbar-brand:hover{color:#777}.pf-body[data-script='admin'] .panel{text-align:initial}.pf-body[data-script='admin'] .panel h3 img{position:absolute;right:0;top:0;margin:5px 14px 0 0;border-radius:5px;width:28px}.pf-body[data-script='admin'] .form-horizontal .panel{color:#adadad}.pf-body[data-script='setup']{user-select:text}.pf-body[data-script='setup'] .navbar-brand:hover{color:#777}.pf-body[data-script='setup'] section{min-height:auto;padding-top:10px;padding-bottom:0;border-bottom:0}.pf-body[data-script='setup'] section:first-of-type{padding-top:60px}.pf-body[data-script='setup'] section:last-of-type{padding-bottom:60px}@media (min-width: 780px){.pf-body[data-script='setup'] section .container{width:760px}}@media (min-width: 1200px){.pf-body[data-script='setup'] section .container{width:1160px}}@media (min-width: 1600px){.pf-body[data-script='setup'] section .container{width:1360px}}.pf-body[data-script='setup'] section .container>.row{margin-bottom:0}.pf-body[data-script='setup'] .pf-landing-pricing-panel{margin-top:10px}.pf-body[data-script='setup'] .panel-heading{padding-right:8px}.pf-body[data-script='setup'] .table{text-align:left}.pf-body[data-script='setup'] .pf-setup-body-cronjob .panel-footer{display:flex;justify-content:space-around}.pf-body[data-script='setup'] .pf-cron-row-active td:not(:last-child){background-color:#212C30}.pf-body[data-script='setup'] .pf-cron-row-active td:first-child{background-color:#1b2326}.pf-head-breadcrumb{display:inline-block;margin:0}.pf-head-breadcrumb li{display:inline-block;position:relative;cursor:pointer}.pf-head-breadcrumb li:before{content:"";position:absolute;right:-9px;top:-1px;z-index:20;border-left:10px solid #272728;border-top:15px solid transparent;border-bottom:15px solid transparent;transition:0.3s ease}.pf-head-breadcrumb li:after{content:"";position:absolute;right:-10px;top:-1px;z-index:10;border-left:10px solid #63676a;border-top:15px solid transparent;border-bottom:15px solid transparent}.pf-head-breadcrumb li:hover .pf-head-breadcrumb-item{color:#568a89}.pf-head-breadcrumb li:hover .pf-head-breadcrumb-item>img{border-color:#568a89 !important}.pf-head-breadcrumb li:hover:not(:last-of-type) .pf-head-breadcrumb-item{max-width:135px}.pf-head-breadcrumb li:first-of-type .pf-head-breadcrumb-item{padding-left:10px}.pf-head-breadcrumb li:last-of-type .pf-head-breadcrumb-item{padding-right:10px}.pf-head-breadcrumb li:last-of-type:before{display:none}.pf-head-breadcrumb li:last-of-type:after{display:none}.pf-head-breadcrumb li:not(:last-of-type) .pf-head-breadcrumb-item{max-width:60px}.pf-head-breadcrumb li.--empty{pointer-events:none}.pf-head-breadcrumb .pf-head-breadcrumb-item{display:inline-block;vertical-align:middle;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;padding:0 5px 0 15px;line-height:30px;width:auto;-webkit-transition:color 0.15s ease-out,max-width 0.15s ease-in-out;transition:color 0.15s ease-out,max-width 0.15s ease-in-out;will-change:color, max-width}.pf-head-breadcrumb .pf-head-breadcrumb-item [class^="pf-system-sec-"]{margin-right:5px}.pf-head-breadcrumb .pf-head-breadcrumb-item>.fas:last-of-type,.pf-head-breadcrumb .pf-landing .pf-landing-list li.pf-head-breadcrumb-item>i:last-of-type,.pf-landing .pf-landing-list .pf-head-breadcrumb li.pf-head-breadcrumb-item>i:last-of-type{margin-right:5px !important}.logo-ploygon-top-right{fill:#477372;fill-rule:evenodd;stroke:#477372;stroke-width:4px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1;stroke-dasharray:821.3;stroke-dashoffset:821.3;animation:logo-animation-paint 3.5s ease-in-out 1}.logo-ploygon-bottom-left{fill:#5cb85c;fill-rule:evenodd;stroke:#5cb85c;stroke-width:4px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1;stroke-dasharray:401;stroke-dashoffset:401;animation:logo-animation-paint 3.5s linear 1}.logo-ploygon-bottom-right{fill:#375959;fill-rule:evenodd;stroke:#375959;stroke-width:4px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1;stroke-dasharray:461;stroke-dashoffset:461;animation:logo-animation-paint 3.5s linear 1}.logo-ploygon-top-left{fill:#63676a;fill-rule:evenodd;stroke:#63676a;stroke-width:4px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1;stroke-dasharray:835;stroke-dashoffset:835;animation:logo-animation-paint 3.5s linear 1}@keyframes logo-animation-paint{0%{fill-opacity:0;animation-timing-function:ease-in-out}50%{fill-opacity:0}70%{stroke-dashoffset:0;animation-timing-function:ease-in}100%{stroke-dashoffset:0;fill-opacity:1}}#pf-map-module{margin:15px 10px 52px 10px}#pf-map-tab-element{max-width:3354px;margin:0 auto;display:grid;grid-column-gap:10px;grid-template:"tabs1" max-content "wrapper" minmax(38px, 1fr)/1fr}@media screen and (min-width: 1600px){#pf-map-tab-element{grid-template-areas:"tabs1 tabs1 tabs1 tabs1" "wrapper wrapper wrapper wrapper";grid-template-columns:1fr 1fr 1fr minmax(444px, 1fr)}}#pf-map-tab-element #pf-map-tab-bar-left{grid-area:tabs1}#pf-map-tab-element .pf-map-tab-content-wrapper{grid-area:wrapper;z-index:100}@media screen and (min-width: 1600px){#pf-map-tab-element.left{grid-template-areas:". tabs1 tabs1 tabs1" "wrapper wrapper wrapper wrapper";grid-template-columns:minmax(444px, 1fr) 1fr 1fr 1fr}}@media screen and (min-width: 1600px){#pf-map-tab-element.left .pf-map-tab-content{grid-template-areas:"area2 map map map" "area2 area1 area1 area3" "area2 area1 area1 area3";grid-template-columns:minmax(444px, 1fr) 1fr 1fr minmax(444px, 1fr)}}.pf-map-tab-bar{display:flex;position:relative}.pf-map-tab-bar:after{border-radius:0 !important;font-size:14px !important}.pf-map-tab-bar .pf-map-tab{z-index:10;flex:0 0 auto}.pf-map-tab-bar .pf-map-tab:last-child{margin-right:0}.pf-map-tab-bar .pf-map-tab>a[data-badge]:after{content:attr(data-badge);position:absolute;top:-4px;left:60%;background:#313335;color:#e28a0d;border-radius:9px;padding:3px 4px;font-size:11px;font-weight:bold;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center}.pf-map-tab-bar .noSort{margin-left:auto}.pf-map-tab-bar .pf-map-type-tab-default{border-top:2px solid transparent}.pf-map-tab-bar .pf-map-type-tab-default>a:hover,.pf-map-tab-bar .pf-map-type-tab-default>a:focus,.pf-map-tab-bar .pf-map-type-tab-default>a.editable-open{color:#e28a0d;background-color:transparent;border-color:transparent}.pf-map-tab-bar .pf-map-type-tab-private{border-top:2px solid #7986cb}.pf-map-tab-bar .pf-map-type-tab-corporation{border-top:2px solid #5cb85c}.pf-map-tab-bar .pf-map-type-tab-alliance{border-top:2px solid #428bca}.pf-map-tab-bar .pf-map-type-tab-global{border-top:2px solid #568a89}.pf-map-tab-bar .pf-map-tab-icon+.nav-tabs-link:not(:empty){margin-left:3px}.pf-map-tab-bar .pf-map-tab-shared-icon{margin-left:3px}.pf-map-tab-content{display:grid;grid-column-gap:10px;grid-template:"map" max-content "area1" minmax(0, max-content) "area2" minmax(0, max-content) "area3" minmax(0, max-content)/1fr}@media screen and (min-width: 780px){.pf-map-tab-content{grid-template:"map map" max-content "area1 area1" minmax(0, min-content) "area2 area3" minmax(0, min-content)/1fr 1fr}}@media screen and (min-width: 1200px){.pf-map-tab-content{grid-template:"map map map" max-content "area1 area1 area2" minmax(0, max-content) "area1 area1 area3" minmax(0, 1fr)/1fr 1fr minmax(444px, 1fr)}}@media screen and (min-width: 1600px){.pf-map-tab-content{grid-template:"map map map area2" minmax(0, max-content) "area1 area1 area3 area2" minmax(0, max-content) "area1 area1 area3 area2" minmax(0, 1fr)/1fr 1fr minmax(444px, 1fr) minmax(444px, 1fr)}}.pf-map-tab-content.active{display:grid}.pf-map-tab-content-area{position:relative;border-radius:5px;min-height:0;-webkit-transition:min-height 0.3s ease;transition:min-height 0.3s ease}.pf-map-tab-content-area-map{grid-area:map;position:relative;resize:vertical;width:100%;height:558px;min-height:300px;max-height:1000px;overflow:hidden;padding:5px;background:rgba(43,43,43,0.93);box-shadow:inset -3px 3px 10px 0 rgba(0,0,0,0.3);will-change:width, height;border-top-left-radius:0;border-top-right-radius:0;border-width:1px;border-style:solid;border-color:#313335}.pf-map-tab-content-area-map:before{content:'';position:absolute;bottom:0;right:0;border-style:solid;border-width:14px 14px 0 0;border-color:transparent #313335 transparent transparent;cursor:row-resize}.pf-map-tab-content-area-map:focus,.pf-map-tab-content-area-map:hover{border:1px solid #3c3f41}.pf-map-tab-content-area-map:focus:before,.pf-map-tab-content-area-map:hover:before{border-color:transparent #3c3f41 transparent transparent}.pf-map-tab-content-area-a,.pf-map-tab-content-area-b,.pf-map-tab-content-area-c{display:grid;grid-gap:10px;grid-auto-rows:max-content}.pf-map-tab-content-area-a:not(:empty),.pf-map-tab-content-area-b:not(:empty),.pf-map-tab-content-area-c:not(:empty){margin-top:10px}.pf-map-tab-content-area-a{grid-area:area1}.pf-map-tab-content-area-b{grid-area:area2}@media screen and (min-width: 1600px){.pf-map-tab-content-area-b{margin-top:0 !important}}.pf-map-tab-content-area-c{grid-area:area3}.pf-map-tab-content .pf-sortable-dropzone{margin-top:10px;min-height:38px}.pf-module{font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;background:rgba(60,63,65,0.27);padding:10px;width:100%;overflow:hidden;border-radius:5px;border-top-left-radius:0;opacity:0;will-change:opacity, transform, height}.pf-module:before{content:'';position:absolute;top:0;left:0;border-style:solid;border-width:0 0 9px 9px;border-color:transparent transparent transparent #3c3f41;cursor:row-resize}.pf-module .label:not(:last-child){margin-bottom:10px}.pf-module .pf-module-head h5{display:inline-block;line-height:16px;margin-bottom:0}.pf-module .pf-module-head h5 .pf-module-icon-button{margin-left:4px}.pf-module .pf-module-head+.pf-module-body:not(:empty):not(.hidden){margin-top:10px}.pf-module .grid{display:grid;grid-gap:10px;grid-template-columns:repeat(auto-fit, minmax(200px, 1fr))}.pf-module .pf-module-table{font-size:11px;white-space:nowrap}.pf-module .dataTable{font-size:10px}.pf-module .pf-dynamic-area{background:rgba(43,43,43,0.4);min-height:initial}.pf-module .pf-module-control-area{display:flex;justify-content:center;align-items:center;min-height:inherit}.pf-module .pf-module-control-area:hover .fa-sync{transform:rotateZ(720deg)}.pf-module .pf-module-control-area .fa-sync{-webkit-transition:transform 1.6s ease-out;transition:transform 1.6s ease-out}.pf-module-spacer{margin-bottom:10px}@-webkit-keyframes bounce{0%,20%,50%,80%,100%{transform:translateY(0)}40%{transform:translateY(-8px)}60%{transform:translateY(-4px)}}@-moz-keyframes bounce{0%,20%,50%,80%,100%{transform:translateY(0)}40%{transform:translateY(-8px)}60%{transform:translateY(-4px)}}@-ms-keyframes bounce{0%,20%,50%,80%,100%{transform:translateY(0)}40%{transform:translateY(-8px)}60%{transform:translateY(-4px)}}@keyframes bounce{0%,20%,50%,80%,100%{transform:translateY(0)}40%{transform:translateY(-8px)}60%{transform:translateY(-4px)}}.pf-map-overlay{position:absolute;display:none;z-index:10000;background:rgba(0,0,0,0.25);border-radius:5px}.pf-map-overlay.pf-map-overlay-timer{right:25px;bottom:25px;width:36px;height:36px}.pf-map-overlay.pf-map-overlay-zoom{bottom:25px;left:5px;width:26px;height:52px;padding:2px 4px;display:block}.pf-map-overlay.pf-map-overlay-zoom .pf-zoom-overlay-up,.pf-map-overlay.pf-map-overlay-zoom .pf-zoom-overlay-down{display:block;text-align:center;font-size:16px;cursor:pointer;-webkit-transition:color 0.18s ease-in-out;transition:color 0.18s ease-in-out;will-change:color}.pf-map-overlay.pf-map-overlay-zoom .pf-zoom-overlay-up:hover,.pf-map-overlay.pf-map-overlay-zoom .pf-zoom-overlay-down:hover{color:#c2760c}.pf-map-overlay.pf-map-overlay-zoom .pf-zoom-overlay-up.disabled,.pf-map-overlay.pf-map-overlay-zoom .pf-zoom-overlay-down.disabled{cursor:not-allowed;color:#2b2b2b}.pf-map-overlay.pf-map-overlay-zoom .pf-zoom-overlay-value{display:block;margin-top:2px;text-align:center;font-size:11px;line-height:13px;-webkit-transition:color 0.18s ease-in-out;transition:color 0.18s ease-in-out;will-change:color}.pf-map-overlay.pf-map-overlay-zoom .active{color:#c2760c}.pf-map-overlay.pf-map-overlay-info{top:8px;right:25px;height:36px;min-height:36px;min-width:36px;padding:3px 3px 3px 8px;line-height:26px}.pf-map-overlay.pf-map-overlay-info i{margin:0;margin-top:5px;width:0;height:26px;opacity:0;color:#63676a;transform:scale(0);transform-origin:50% 50% 0px;-webkit-transition:color 0.18s ease-in-out;transition:color 0.18s ease-in-out;cursor:help;will-change:all}.pf-map-overlay.pf-map-overlay-info i.fas,.pf-map-overlay.pf-map-overlay-info .pf-landing .pf-landing-list li>i,.pf-landing .pf-landing-list .pf-map-overlay.pf-map-overlay-info li>i,.pf-map-overlay.pf-map-overlay-info i.far{font-size:20px}.pf-map-overlay.pf-map-overlay-info i.glyphicon{margin-top:1px;font-size:22px;padding-left:3px}.pf-map-overlay.pf-map-overlay-info i.active,.pf-map-overlay.pf-map-overlay-info i:hover{color:#c2760c}.pf-map-overlay.pf-map-overlay-local{top:54px;right:25px;min-height:80px;width:32px;display:block;will-change:width}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content{margin-right:36px;padding:5px 0 5px 5px;overflow:hidden}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content .pf-map-overlay-headline{font-size:12px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;white-space:nowrap}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content .pf-map-overlay-headline .badge{margin-left:5px}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content .pf-map-overlay-headline .pf-system-sec{cursor:default}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content .pf-local-table{font-size:10px}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content .pf-local-table.no-footer{border-bottom:1px solid transparent}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content .pf-local-table td{white-space:nowrap}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content .dataTables_paginate,.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content .dataTables_empty{white-space:nowrap;padding-top:3px}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content .pf-map-overlay-toolbar .pf-map-overlay-toolbar-icon{vertical-align:0;margin-top:14px}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-content .pf-map-overlay-toolbar .pf-map-overlay-toolbar-checkbox{display:inline-block;margin-bottom:0}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-main{position:absolute;top:0;right:0;height:100%;padding:3px;width:32px;cursor:pointer;text-align:center;border-left:1px solid #2b2b2b}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-main .pf-map-overlay-local-trigger{margin-bottom:10px}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-main .pf-map-overlay-local-trigger:hover,.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-main .pf-map-overlay-local-trigger.right{color:#c2760c}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-main i{font-size:12px}.pf-map-overlay.pf-map-overlay-local .pf-map-overlay-local-jumps{position:absolute;bottom:5px;width:calc(100% - 6px)}.pf-map-overlay.pf-map-overlay-local .badge{font-family:Arial, sans-serif;background-color:#2b2b2b}.pf-grid-small:before{content:' ';display:block;position:absolute;left:0;top:0;width:100%;height:100%;opacity:0.6;background:url("data:image/png;base64,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") !important}.jtk-drag-select .pf-map{cursor:grab !important}.jtk-drag-select .pf-map .pf-system{cursor:grab !important}.jtk-drag-select .pf-map .pf-system .pf-system-head{cursor:grab !important}.pf-map{width:2500px;height:1500px;position:relative;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;will-change:transform}.pf-map.pf-map-move{cursor:move !important}.pf-map .jtk-hover:not(.jtk-overlay){animation-duration:1s;animation-delay:0.5s;animation-fill-mode:both;animation-timing-function:linear;animation-iteration-count:infinite;animation-name:bounce}.pf-map .jtk-source-hover,.pf-map .jtk-target-hover{animation-duration:1s;animation-delay:0.5s;animation-fill-mode:both;animation-timing-function:linear;animation-iteration-count:infinite;animation-name:bounce;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.3);box-shadow:0 6px 12px rgba(0,0,0,0.3)}.pf-map .jtk-drag-active{-webkit-transition:box-shadow 0.12s ease-out,transform 0.08s ease-out !important;transition:box-shadow 0.12s ease-out,transform 0.08s ease-out !important}.pf-map .jtk-drag-hover.jtk-drag-active{-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.3);box-shadow:0 6px 12px rgba(0,0,0,0.3);transform:translate3d(0, -1px, 0) scale(1.1) !important}.pf-map .pf-system{position:absolute;min-width:60px;height:auto;overflow:hidden;background-color:#313335;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;z-index:100;will-change:top, left, opacity, transform;border-width:2px;border-style:solid;border-color:#63676a;border-radius:5px;-webkit-transition:border-color 0.2s ease-out,box-shadow 0.12s ease-out,opacity 0.12s ease-out;transition:border-color 0.2s ease-out,box-shadow 0.12s ease-out,opacity 0.12s ease-out;transform:translate3d(0, 0, 0)}.pf-map .pf-system:not(.jtk-drag-hover):hover{-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.3);box-shadow:0 6px 12px rgba(0,0,0,0.3);transform:translate3d(0, -1px, 0) !important}.pf-map .pf-system .pf-system-head{padding:0 3px 0 3px;cursor:pointer;font-family:Arial, sans-serif;font-weight:bold;white-space:nowrap;backface-visibility:hidden}.pf-map .pf-system .pf-system-head .pf-system-head-name{border:none;display:inline-block;min-width:50px;color:#adadad;margin-right:2px;-webkit-font-smoothing:antialiased;transform:translateY(0)}.pf-map .pf-system .pf-system-head .pf-system-head-counter{display:inline-block;text-align:right;min-width:8px;margin-right:1px;color:#5cb85c;cursor:help}.pf-map .pf-system .pf-system-head .pf-system-head-counter:empty{display:none}.pf-map .pf-system .pf-system-head .pf-system-effect{font-size:11px;transform:translateY(0)}.pf-map .pf-system .pf-system-head .fa-lock{font-size:11px;display:none;transform:translateY(0)}.pf-map .pf-system .pf-system-head .pf-system-head-expand{margin-left:2px;color:#63676a;width:10px;display:none;transform:translateY(0)}.pf-map .pf-system .pf-system-head .editable-empty{font-style:normal}.pf-map .pf-system .pf-system-head-info{display:flex;color:#7c8184;font-size:10px;line-height:10px;padding-right:1px;margin-bottom:2px;transform:translateY(0)}.pf-map .pf-system .pf-system-head-info [class^="pf-system-sec-"]{cursor:help}.pf-map .pf-system .pf-system-head-info-left{flex:1}.pf-map .pf-system .pf-system-head-info-right{flex:1;text-align:right}.pf-map .pf-system .pf-system-body{height:0px;width:100%;overflow:hidden;cursor:-moz-grab;cursor:-webkit-grab;cursor:grab;padding:0 4px;white-space:nowrap;backface-visibility:hidden;display:none;will-change:width;border-top-width:1px;border-top-style:dashed;border-top-color:#63676a}.pf-map .pf-system .pf-system-body .pf-system-body-item{position:relative;color:#7c8184;font-size:10px;line-height:16px;height:16px}.pf-map .pf-system .pf-system-body .pf-system-body-item .pf-system-body-right{float:right;color:#f0ad4e;width:50px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;transform:translateY(0);display:none}.pf-map .pf-system .pf-system-body .pf-system-body-item .pf-user-status{font-size:6px;width:10px;vertical-align:middle;transform:translateY(0)}.pf-map .pf-system .pf-system-body .pf-system-body-item .pf-system-body-item-name{position:absolute;display:inline-block;width:calc(100% - 10px);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;transform:translateY(0)}.pf-map .pf-system .tooltip.in{opacity:1}.pf-map .pf-system .tooltip .tooltip-inner{color:#313335;background-color:#adadad;padding:3px 3px}.pf-map .pf-system-active:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target){-webkit-box-shadow:#ffb 0px 0px 8px 0px;box-shadow:#ffb 0px 0px 8px 0px}.pf-map .pf-system-selected:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target),.pf-map .jtk-drag:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target){-webkit-box-shadow:#58100d 0px 0px 8px 0px;box-shadow:#58100d 0px 0px 8px 0px;background-color:#58100d}.pf-map .pf-system-selected:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target) .pf-system-head,.pf-map .jtk-drag:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target) .pf-system-head,.pf-map .pf-system-selected:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target) .pf-system-body,.pf-map .jtk-drag:not(.pf-map-endpoint-source):not(.pf-map-endpoint-target) .pf-system-body{background-color:#58100d}.pf-map .pf-system-locked .pf-system-sec{cursor:default !important}.pf-map .pf-system-locked .pf-system-body{cursor:default !important}.pf-map .pf-system-locked .fa-lock{color:#63676a !important;display:inline-block !important}.pf-map .pf-system-debug{position:absolute;color:#fff;font-size:10px;line-height:22px;text-align:center;pointer-events:none;font-family:Oxygen, Arial, sans-serif;z-index:500}.pf-map .pf-system-debug:before{content:attr(data-depth);font-family:Oxygen, Arial, sans-serif;position:absolute;line-height:10px;top:1px;left:2px;color:#000}.pf-map .jtk-endpoint{z-index:90}.pf-map .jtk-endpoint svg circle{-webkit-transition:stroke 0.18s ease-out,fill 0.18s ease-out;transition:stroke 0.18s ease-out,fill 0.18s ease-out}.pf-map .jtk-endpoint svg *{stroke:#63676a;cursor:pointer}.pf-map .jtk-endpoint:hover circle{stroke:#e28a0d !important}.pf-map .jtk-endpoint.jtk-hover{z-index:95}.pf-map .jtk-endpoint.jtk-hover.pf-map-endpoint-bubble:after{filter:drop-shadow(-3px 3px 4px rgba(0,0,0,0.3));animation-iteration-count:infinite;animation-delay:0.5s}.pf-map .jtk-endpoint:after{content:var(--svgBubble);position:absolute;display:block;pointer-events:none;top:-8px;left:-8px;width:30px;height:30px;z-index:-1;will-change:opacity, transform;animation-name:pfBubblePop;animation-duration:0.09s;animation-timing-function:cubic-bezier(0.16, 0.87, 0.48, 0.99);animation-fill-mode:forwards;animation-iteration-count:1}.pf-map .pf-map-endpoint-bubble:after{display:block;animation-name:pfBubbleWobble;animation-duration:1s;animation-timing-function:linear;animation-iteration-count:1;animation-fill-mode:both}.pf-map .jtk-endpoint-drop-allowed circle{stroke:#5cb85c !important;fill:#5cb85c !important}.pf-map .jtk-endpoint-drop-forbidden circle{stroke:#a52521 !important;fill:#a52521 !important}.pf-map .jtk-connector{z-index:40;cursor:pointer;overflow:unset;-webkit-transition:stroke 0.18s ease-out,opacity 0.18s ease-out;transition:stroke 0.18s ease-out,opacity 0.18s ease-out;will-change:all}.pf-map .jtk-connector path{-webkit-transition:stroke 0.18s ease-out;transition:stroke 0.18s ease-out}.pf-map .jtk-connector.jtk-hover{z-index:80;filter:drop-shadow(-3px 3px 4px rgba(0,0,0,0.3))}.pf-map .jtk-connector.jtk-hover path:first-child{stroke:#eaeaea}.pf-map .jtk-connector.jtk-dragging{z-index:80;opacity:0.4}.pf-map .pf-map-connection-abyssal{z-index:40}.pf-map .pf-map-connection-abyssal path:first-child{stroke:rgba(255,255,255,0)}.pf-map .pf-map-connection-abyssal path:nth-child(2){stroke:#5a225a}.pf-map .pf-map-connection-abyssal.jtk-hover path:first-child{stroke:rgba(255,255,255,0)}.pf-map .pf-map-connection-abyssal.jtk-hover path:nth-child(2){stroke:#eaeaea}.pf-map .pf-map-connection-jumpbridge{z-index:50}.pf-map .pf-map-connection-jumpbridge path:first-child{stroke:rgba(255,255,255,0)}.pf-map .pf-map-connection-jumpbridge path:nth-child(2){stroke:#568a89}.pf-map .pf-map-connection-jumpbridge.jtk-hover path:first-child{stroke:rgba(255,255,255,0)}.pf-map .pf-map-connection-jumpbridge.jtk-hover path:nth-child(2){stroke:#eaeaea}.pf-map .pf-map-connection-stargate{z-index:60}.pf-map .pf-map-connection-stargate path:first-child{stroke:#63676a}.pf-map .pf-map-connection-stargate path:nth-child(2){stroke:#313966}.pf-map .pf-map-connection-wh-fresh,.pf-map .pf-map-connection-wh-reduced,.pf-map .pf-map-connection-wh-critical,.pf-map .pf-map-connection-wh-eol{z-index:70}.pf-map .pf-map-connection-wh-eol path:first-child{stroke:#d747d6}.pf-map .pf-map-connection-wh-reduced path:nth-child(2){stroke:#e28a0d}.pf-map .pf-map-connection-wh-critical path:nth-child(2){stroke:#a52521}.pf-map .pf-map-connection-wh-size-s path:nth-child(2),.pf-map .pf-map-connection-wh-size-m path:nth-child(2){stroke-linecap:square !important}.pf-map .pf-map-connection-active{filter:drop-shadow(0px 0px 3px #ffb) !important}.pf-map .pf-map-connection-process{opacity:0.4 !important}.pf-map .pf-map-connection-process path{pointer-events:none}.pf-map .jtk-overlay{opacity:1;pointer-events:none;will-change:opacity;-webkit-transition:opacity 0.18s ease-out;transition:opacity 0.18s ease-out}.pf-map .jtk-overlay.jtk-hover:not(.debug){opacity:0 !important}.pf-map .pf-map-component-overlay,.pf-map .pf-map-connection-state-overlay{font-size:11px;z-index:1020;background-color:#3c3f41;color:#adadad}.pf-map .pf-map-component-overlay{line-height:14px;padding:1px 4px;border-radius:6px;-webkit-box-shadow:0 3px 6px rgba(0,0,0,0.3);box-shadow:0 3px 6px rgba(0,0,0,0.3)}.pf-map .pf-map-component-overlay.small{-webkit-font-smoothing:antialiased;font-family:Arial, sans-serif;padding:1px 2px;line-height:12px;min-width:14px;border-radius:3px}.pf-map .pf-map-component-overlay.icon{font-size:12px;line-height:12px;padding:0;width:12px;height:12px;overflow:hidden;text-align:center;border-radius:50%}.pf-map .pf-map-component-overlay.debug{background-color:#3e264e;opacity:0.8}.pf-map .pf-map-connection-state-overlay{background-color:transparent;font-size:12px;width:15px;height:15px;opacity:0.4 !important;z-index:1030}.pf-map .frig{background-color:#f0ad4e;color:#1d1d1d}.pf-map .mass{background-color:#a52521;color:#eaeaea}.pf-map .eol{background-color:#3c3f41;color:#d747d6}.pf-map .pf-map-connection-arrow-overlay-success .pf-map-connection-arrow-overlay{stroke:#313335;fill:#5cb85c}.pf-map .pf-map-connection-arrow-overlay-danger .pf-map-connection-arrow-overlay{stroke:#313335;fill:#d9534f;animation-name:pfPulseDanger;animation-duration:4s;animation-iteration-count:infinite}.pf-map-drag-to-select{background:#375959 !important;display:block;position:absolute;visibility:hidden;opacity:0;z-index:9000;border:1px dashed #adadad;left:var(--selectBox-left, 0px);top:var(--selectBox-top, 0px);width:var(--selectBox-width, 1px);height:var(--selectBox-height, 1px);pointer-events:none;will-change:left, top, width, height, opacity;border-radius:5px;-webkit-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.pf-map-drag-to-select.active{visibility:visible;opacity:0.3}.ui-dialog-content label,.ui-dialog-content .editable-input .editable-checklist>div>label>span,.editable-input .ui-dialog-content .editable-checklist>div>label>span{min-width:60px}.dropdown-menu{min-width:150px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;z-index:1050;will-change:opacity, top, left, transform}.dropdown-menu a{cursor:pointer}.dropdown-menu i{width:20px;pointer-events:none}.dropdown-menu i.fa-char:before{font-weight:bolder}.dropdown-menu:not(.dropdown-submenu-left) .dropdown-menu{border-top-left-radius:0;border-bottom-left-radius:0;clip-path:inset(-12px -12px -12px 0px)}.dropdown-menu[role]>li:not(.disabled){position:relative}.dropdown-menu[role]>li:not(.disabled):before{content:'';position:absolute;left:0;background-color:#5cb85c;opacity:0;-webkit-transition:left 0.15s ease-out,opacity 0.15s ease-out;transition:left 0.15s ease-out,opacity 0.15s ease-out;will-change:opacity,left;width:2px;height:100%}.dropdown-menu[role]>li:not(.disabled):hover:before,.dropdown-menu[role]>li:not(.disabled).active:before{left:-4px;opacity:1}.dropdown-menu>li.disabled{cursor:not-allowed;pointer-events:none}.dropdown-menu>li>a{padding:3px 8px}.dropdown-menu.dropdown-submenu-left>.dropdown-submenu>.dropdown-menu{left:-100%;border-top-right-radius:0;border-bottom-right-radius:0;clip-path:inset(-12px 0 -12px -12px)}.pf-system-tooltip-inner{color:#adadad;padding:2px 4px;min-width:25px;-webkit-transition:color 0.2s ease-out;transition:color 0.2s ease-out}.pf-system-demo-module .pf-module-body{grid-template:"info info " min-content "userData mapData " min-content "trigger sortableJs" min-content / 1fr 1fr}.pf-system-demo-module .pf-module-body>.pf-dynamic-area{margin:0}.pf-system-demo-module .pf-module-body>.pf-dynamic-area[data-area="info"]{grid-area:info;max-height:800px}.pf-system-demo-module .pf-module-body>.pf-dynamic-area[data-area="userData"]{grid-area:userData}.pf-system-demo-module .pf-module-body>.pf-dynamic-area[data-area="mapData"]{grid-area:mapData}.pf-system-demo-module .pf-module-body>.pf-dynamic-area[data-area="trigger"]{grid-area:trigger}.pf-system-demo-module .pf-module-body>.pf-dynamic-area[data-area="sortableJs"]{grid-area:sortableJs}.pf-system-demo-module .pf-module-body>.pf-dynamic-area>h5{margin-bottom:0}.pf-system-demo-module .pf-module-body>.pf-dynamic-area>h5+code:not(:empty){margin-top:10px}.pf-map-tab-content-area-a .pf-system-demo-module .pf-module-body{grid-template:"info userData mapData" minmax(200px, min-content) "info userData mapData" minmax(auto, min-content) "trigger sortableJs mapData" minmax(38px, min-content)/minmax(38px, 1fr) minmax(210px, max-content) minmax(38px, 1fr)}.pf-map-tab-content-area-a .pf-system-demo-module .pf-module-body>.pf-dynamic-area[data-area="userData"]{max-width:100%;min-width:210px;max-height:800px;min-height:210px;resize:both}.pf-map-tab-content-area-a .pf-system-demo-module .pf-module-body>.pf-dynamic-area[data-area="userData"]:after{content:'';position:absolute;bottom:0;right:0;border-style:solid;border-width:9px 9px 0 0;border-color:transparent #3c3f41 transparent transparent;cursor:se-resize}.pf-system-info-module h5{text-transform:capitalize}.pf-system-info-module .pf-module-head .fa-angle-double-right{width:20px}.pf-system-info-module .pf-module-body{grid-template-columns:repeat(auto-fit, minmax(165px, 1fr))}.pf-system-info-module .pf-system-info-section .pf-dynamic-area{height:calc(100% - 23px)}.pf-system-info-module .pf-system-info-name-cell{user-select:all}.pf-system-info-module .pf-system-info-svg{position:absolute;margin:2px 0}.pf-system-info-module .pf-system-sov-fw-percentage{border-top-color:transparent}.pf-system-info-module .pf-system-sov-fw-status-icon{margin-left:20px;color:var(--color)}.pf-system-info-module .pf-system-sov-fw-contested-row,.pf-system-info-module .pf-system-sov-fw-occupation-row{display:none}.pf-system-info-module .pf-system-description-section{grid-column:span 2}.pf-system-info-module .pf-system-info-description-area{height:100%;min-height:100px;padding:0}.pf-system-info-module .pf-system-info-description-area .pf-system-info-description-button{position:absolute;right:10px;top:13px}.pf-system-info-module .pf-system-info-description-area .pf-system-info-description{padding:10px;user-select:text}.pf-system-info-module .pf-system-info-description-area .note-toolbar kbd{padding:3px 4px}.pf-system-info-module .pf-system-info-description-area .note-toolbar .note-customBtn{float:right}.pf-system-info-module .pf-system-info-description-area .note-toolbar:before,.pf-system-info-module .pf-system-info-description-area .note-toolbar:after{content:" ";display:table}.pf-system-info-module .pf-system-info-description-area .note-toolbar:after{clear:both}.pf-system-info-module .pf-system-info-description>h2:first-child,.pf-system-info-module .pf-system-info-description>h3:first-child,.pf-system-info-module .note-editable>h2:first-child,.pf-system-info-module .note-editable>h3:first-child{margin-top:0 !important}.pf-system-info-module .pf-system-info-description h2:before,.pf-system-info-module .pf-system-info-description h3:before,.pf-system-info-module .note-editable h2:before,.pf-system-info-module .note-editable h3:before{font-family:"Font Awesome 5 Free";content:"\f105";font-weight:bold;display:inline-block;margin-right:3px}.pf-system-info-module .pf-system-info-description h2,.pf-system-info-module .note-editable h2{font-size:16px;margin:15px 0}.pf-system-info-module .pf-system-info-description h3,.pf-system-info-module .note-editable h3{font-size:14px;margin:10px 0}.pf-system-info-module .pf-system-info-description a:after,.pf-system-info-module .note-editable a:after{font-family:"Font Awesome 5 Free";content:"\f35d";font-size:70%;vertical-align:top;font-weight:bold;display:inline-block;margin-left:2px}.pf-system-info-module .pf-system-info-description hr,.pf-system-info-module .note-editable hr{border-top:1px solid #313335}.pf-system-info-module .pf-system-info-description blockquote,.pf-system-info-module .note-editable blockquote{padding:5px 10px;margin:0 0 10px;font-size:13px;border-left:3px solid #477372}.pf-system-info-module .pf-system-info-description ol,.pf-system-info-module .pf-system-info-description ul,.pf-system-info-module .note-editable ol,.pf-system-info-module .note-editable ul{padding-left:20px}.pf-system-info-module .pf-system-info-description ul,.pf-system-info-module .note-editable ul{list-style:disc}.pf-system-info-module .pf-system-info-description ol,.pf-system-info-module .note-editable ol{list-style:decimal}.pf-map-tab-content-area-b .pf-system-info-module .pf-module-body-small .pf-system-info-section,.pf-map-tab-content-area-c .pf-system-info-module .pf-module-body-small .pf-system-info-section{grid-column:span 2}.modal.link-dialog .checkbox,.modal.link-dialog .editable-input .editable-checklist>div>label,.editable-input .modal.link-dialog .editable-checklist>div>label{display:none}.pf-system-graph-module .pf-module-head h5.pull-right{margin-right:5px}.pf-system-graph-module .pf-module-body{grid-template-columns:repeat(auto-fit, minmax(165px, 1fr))}.pf-system-graph-module .pf-system-graph{position:relative;width:100%;height:100px;display:flex;justify-content:center;align-items:center;margin-top:10px;-webkit-transition:height 0.18s ease-out;transition:height 0.18s ease-out}.pf-system-signature-module .progress-label-right{margin-right:20px;margin-left:10px;vertical-align:middle;font-size:11px}.pf-system-signature-module .pf-system-progress-scanned{display:inline-block;margin-left:20px;width:calc(100% - 230px)}.pf-system-signature-module .pf-system-progress-scanned .progress{margin-bottom:3px}.pf-system-signature-module .pf-sig-table-clear-button{will-change:color;color:#a52521}.pf-system-signature-module .pf-sig-table .editable-container.editable-inline{display:inline}.pf-system-signature-module .pf-sig-table .editable-container.editable-inline .control-group{display:inline}.pf-system-signature-module .pf-sig-table .editable-container.editable-inline .control-group .editable-input{display:inline}.pf-system-signature-module .pf-sig-table .pf-editable-description{width:100%;background-color:#2b2b2b;max-height:300px;font-size:11px;line-height:14px;padding:3px 6px}.pf-system-signature-module .pf-sig-table-secondary th{pointer-events:none}.pf-system-signature-module .pf-sig-table-secondary th:after{display:none !important}.pf-system-signature-module .pf-sig-table-secondary th.pf-table-counter-cell{color:transparent}.pf-system-route-module .pf-system-route-table{width:100%}.pf-system-route-module .pf-system-route-table td{text-transform:capitalize}.pf-system-route-module .pf-system-route-table td .pf-fake-connection{display:none;width:12px;cursor:pointer}.pf-system-route-module .pf-system-route-table td .pf-fake-connection[data-disabled]{cursor:initial}.pf-system-route-module .pf-system-route-table td .pf-fake-connection[class*=' pf-map-connection-wh-size-']{width:25px}.pf-system-route-module .pf-system-route-table td .pf-fake-connection:after{font-size:10px}.pf-system-route-module .pf-system-route-table td .pf-fake-connection.pf-map-connection-preserve-mass:after{content:"\f071";font-family:"Font Awesome 5 Free";font-style:normal;font-weight:bold;left:calc(50% - 7px)}.pf-system-route-module .pf-system-route-table td.pf-table-jump-cell .pf-fake-connection{display:inline-block}.pf-system-intel-module .pf-module-head:not(:first-child){margin-top:15px;margin-bottom:5px}.pf-system-killboard-module .pf-system-killboard-wsStatusWrapper{margin-left:8px;font-size:60%;line-height:100%;vertical-align:middle}.pf-system-killboard-module .pf-system-killboard-list{margin-bottom:0}.pf-system-killboard-module .pf-system-killboard-list>li{padding-left:0;overflow:visible;min-height:50px;will-change:transform, opacity, margin-left;-webkit-transition:padding-left 0.12s cubic-bezier(0.3, 0.8, 0.8, 1.7);transition:padding-left 0.12s cubic-bezier(0.3, 0.8, 0.8, 1.7)}.pf-system-killboard-module .pf-system-killboard-list>li h3{white-space:nowrap}.pf-system-killboard-module .pf-system-killboard-list>li>.flex-col{align-self:center;position:relative}.pf-system-killboard-module .pf-system-killboard-list>li>.flex-col:last-child{display:flex;flex-direction:column;align-content:space-between;min-width:110px}.pf-system-killboard-module .pf-system-killboard-list>li a:hover>img{border-color:#568a89}.pf-system-killboard-module .pf-system-killboard-list>li.media{margin-top:10px}.pf-system-killboard-module .pf-system-killboard-list>li.pf-system-killboard-list-head{min-height:20px}.pf-system-killboard-module .pf-system-killboard-list>li.pf-system-killboard-list-head h5{margin-bottom:0;min-width:auto !important}.pf-system-killboard-module .pf-system-killboard-list>li.pf-system-killboard-list-head h5:first-child>i{margin-right:5px}.pf-system-killboard-module .pf-system-killboard-list>li.pf-system-killboard-list-head h5:last-child>i{margin-left:5px}.pf-system-killboard-module .pf-system-killboard-list>li .media-heading-location{margin:0;font-size:11px;line-height:13px}.pf-system-killboard-module .pf-system-killboard-list>li .media-heading-isk{margin:0;font-size:11px;line-height:25px}.pf-system-killboard-module .pf-system-killboard-list>li .media-heading-date{margin:0;font-size:10px;line-height:12px}.pf-system-killboard-module .pf-system-killboard-list>li .pf-system-killboard-img-l{height:50px;width:50px;min-width:50px;max-width:50px;min-height:50px;max-height:50px;margin-right:10px;border:1px solid #2b2b2b;overflow:hidden;will-change:border-color;border-radius:50%;-webkit-transition:border-color 0.12s ease-out;transition:border-color 0.12s ease-out}.pf-system-killboard-module .pf-system-killboard-list>li .pf-system-killboard-img-m{display:inline;height:32px;width:32px;min-width:32px;max-width:32px;min-height:32px;max-height:32px;margin-right:10px;border:1px solid #2b2b2b;overflow:hidden;will-change:border-color;border-radius:50%;-webkit-transition:border-color 0.12s ease-out;transition:border-color 0.12s ease-out;align-self:center}.pf-system-killboard-module .pf-system-killboard-list>li .pf-system-killboard-img-s{display:inline;height:20px;width:20px;min-width:20px;max-width:20px;min-height:20px;max-height:20px;margin-right:10px;border:1px solid #2b2b2b;overflow:hidden;will-change:border-color;border-radius:50%;-webkit-transition:border-color 0.12s ease-out;transition:border-color 0.12s ease-out}.pf-system-killboard-module .pf-system-killboard-list>li:before{content:"\f054";font-family:"Font Awesome 5 Free";font-weight:bold;position:absolute;z-index:10;left:-18px;top:16px;color:#477372;opacity:0;will-change:opacity, left;-webkit-transition:all 0.12s ease-out;transition:all 0.12s ease-out}.pf-system-killboard-module .pf-system-killboard-list>li:not(.pf-system-killboard-list-head):hover{padding-left:10px}.pf-system-killboard-module .pf-system-killboard-list>li:not(.pf-system-killboard-list-head):hover:before{opacity:1;left:-3px}.pf-system-killboard-module .pf-system-killboard-list>li .badge-victim:after{content:"\f714";font-family:"Font Awesome 5 Free";font-style:normal;font-weight:bold;font-size:13px;color:#a52521;position:absolute;bottom:-6px;left:20px}.pf-system-killboard-module .pf-system-killboard-list>li .badge-attacker:after{content:var(--label);font-style:normal;font-weight:bold;font-size:11px;color:var(--color);background-color:#313335;line-height:1;border-radius:9px;padding:3px 4px;position:absolute;bottom:-2px;left:30px}.pf-system-killboard-module .pf-module-control-area{margin-top:15px}.pf-connection-info-module .pf-module-body{grid-template-columns:repeat(auto-fit, minmax(200px, 1fr))}.pf-connection-info-module .pf-connection-info-table{width:100%}.pf-global-thera-module .pf-global-thera-control{margin-bottom:10px}.pf-global-thera-module .pf-global-thera-table .pf-fake-connection{width:100%}input,select{background-color:#313335;color:#adadad;border:1px solid #63676a;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}input:focus,select:focus{border-color:#568a89}input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,select:-webkit-autofill,select:-webkit-autofill:hover,select:-webkit-autofill:focus{border:1px solid #63676a;-webkit-text-fill-color:#adadad;transition:background-color 5000s ease-in-out 0s;font-family:"Oxygen Bold", Arial, sans-serif;font-weight:bold;font-size:12px;-webkit-box-shadow:0 0 0 50px #313335 inset !important;box-shadow:0 0 0 50px #313335 inset !important}input[disabled]::-moz-placeholder,select[disabled]::-moz-placeholder{color:rgba(0,0,0,0);opacity:1}input[disabled]:-ms-input-placeholder,select[disabled]:-ms-input-placeholder{color:rgba(0,0,0,0)}input[disabled]::-webkit-input-placeholder,select[disabled]::-webkit-input-placeholder{color:rgba(0,0,0,0)}input.pf-select2,select.pf-select2{height:32px}input[type='number']::-webkit-inner-spin-button,input[type='number']::-webkit-outer-spin-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;margin:0;display:none}input[type='file']::-webkit-file-upload-button{background-color:transparent;border:none;color:#63676a;outline:none}textarea{min-height:32px;max-height:400px;resize:vertical}fieldset[disabled] .form-control{color:#63676a}fieldset[disabled] .form-control::-moz-placeholder{color:rgba(0,0,0,0);opacity:1}fieldset[disabled] .form-control:-ms-input-placeholder{color:rgba(0,0,0,0)}fieldset[disabled] .form-control::-webkit-input-placeholder{color:rgba(0,0,0,0)}fieldset[disabled] .input-icon-left .fa-stack i:last-child,fieldset[disabled] .input-icon-right .fa-stack i:last-child{color:#3c3f41}#select2-pf-map-dialog-edit-icon-select-container,#select2-pf-map-dialog-new-icon-select-container,#select2-pf-map-dialog-new-icon-select-results,#select2-pf-map-dialog-edit-icon-select-results,.pf-form-icon-field{font-family:"Font Awesome 5 Free";font-weight:bold}#select2-pf-map-dialog-edit-icon-select-container option,#select2-pf-map-dialog-new-icon-select-container option,#select2-pf-map-dialog-new-icon-select-results option,#select2-pf-map-dialog-edit-icon-select-results option,.pf-form-icon-field option{font-family:inherit;font-weight:inherit}@supports (-moz-appearance: none){select{-moz-appearance:none !important;background:#313335 url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAMAAABPT11nAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAZQTFRFiIiIAAAA/v9K/QAAAAJ0Uk5T/wDltzBKAAAAHElEQVR42mJggAFGGMUIZjGCGIwMYIIRCgACDAABOwAVoypkGgAAAABJRU5ErkJggg==") right center no-repeat !important;background-position:calc(100% - 5px) center !important;padding-right:16px !important}}.input-icon-left:not(.input-icon-right) .fa-stack:first-child{left:14px}.input-icon-right:not(.input-icon-left) .fa-stack:first-child{right:14px}.input-icon-left.input-icon-right .fa-stack:first-child{left:14px}.input-icon-left.input-icon-right .fa-stack:nth-child(2){right:14px}.input-icon-left .fa-stack,.input-icon-right .fa-stack{position:absolute;top:4px}.input-icon-left .fa-stack i:first-child,.input-icon-right .fa-stack i:first-child{color:#63676a}.input-icon-left .fa-stack i:last-child,.input-icon-right .fa-stack i:last-child{color:#313335}.btn .btn-progress{position:absolute;display:block;height:100%;background-color:rgba(92,184,92,0.2);max-width:100%;width:0;top:0;left:0;overflow:hidden;line-height:30px;color:#f0ad4e;font-size:10px;text-align:left;-webkit-transition:width 0.1s linear;transition:width 0.1s linear}.pf-form-dropzone{border:2px dashed #2b2b2b;height:100px;background-color:#353739;text-align:center;font-size:20px;line-height:100px;margin:15px 0;color:#2b2b2b;border-radius:10px;-webkit-transition:color 0.18s ease-out,border-color 0.18s ease-out;transition:color 0.18s ease-out,border-color 0.18s ease-out}.pf-form-dropzone:hover{color:#568a89;border-color:#568a89;cursor:-moz-grabbing;cursor:-webkit-grabbing;cursor:grabbing}.toggle.btn:active{box-shadow:none}.pf-form-field-char-count{display:block;margin-top:10px}.modal-content h2,.panel-body h2{font-family:"Oxygen","Helvetica Neue",Helvetica,Arial,sans-serif;letter-spacing:0;font-size:14px;margin:20px 0 10px 0;line-height:normal}.modal-content h2.pf-dynamic-area,.modal-content h4.pf-dynamic-area,.panel-body h2.pf-dynamic-area,.panel-body h4.pf-dynamic-area{min-height:0;margin:0 0 10px 0}.modal-content h2.pf-dynamic-area>img,.modal-content h4.pf-dynamic-area>img,.panel-body h2.pf-dynamic-area>img,.panel-body h4.pf-dynamic-area>img{margin:-10px 5px -10px -10px;width:35px}.modal-content h2[data-toggle="collapse"],.modal-content h4[data-toggle="collapse"],.panel-body h2[data-toggle="collapse"],.panel-body h4[data-toggle="collapse"]{cursor:pointer}.modal-content h2[data-toggle="collapse"]:hover:after,.modal-content h4[data-toggle="collapse"]:hover:after,.panel-body h2[data-toggle="collapse"]:hover:after,.panel-body h4[data-toggle="collapse"]:hover:after{color:#e28a0d !important}.modal-content h2[data-toggle="collapse"]:after,.modal-content h4[data-toggle="collapse"]:after,.panel-body h2[data-toggle="collapse"]:after,.panel-body h4[data-toggle="collapse"]:after{content:"\f078";font-family:"Font Awesome 5 Free";font-style:normal;font-weight:bold;font-size:13px;padding-right:10px;position:absolute;color:#e28a0d;top:10px;right:6px;will-change:transform, color}.modal-content h2[data-toggle="collapse"].collapsed:after,.modal-content h4[data-toggle="collapse"].collapsed:after,.panel-body h2[data-toggle="collapse"].collapsed:after,.panel-body h4[data-toggle="collapse"].collapsed:after{top:13px;right:5px;color:#63676a;-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.modal-content .dataTables_wrapper+.alert{margin-top:10px}.modal-content .dataTable,.modal-content .table{font-size:10px;font-family:"Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif}.modal-content hr{margin:5px 0 15px 0;border-color:#63676a}.modal-content .well{margin-bottom:0}.modal-content .well .list-inline{margin-bottom:0}@media (min-width: 780px){.modal-content .fa-tree-child+.checkbox,.modal-content .editable-input .editable-checklist>div>.fa-tree-child+label,.editable-input .modal-content .editable-checklist>div>.fa-tree-child+label{margin-left:5px;display:inline-block;float:none;width:unset}}.modal-content .pf-wizard-navigation{margin:0}.modal-content .pf-wizard-navigation li:not(:last-child):before{border-top:1px solid #63676a;content:"";display:block;font-size:0;overflow:hidden;position:relative;top:12px;left:71px;right:1px;width:100%}.modal-content .pf-wizard-navigation li.finished:before{border-image:linear-gradient(to right, #375959, #375959) 1 1%;border-bottom:0}.modal-content .pf-wizard-navigation li.active:before{border-image:linear-gradient(to right, #4f9e4f, #63676a) 1 1%;border-bottom:0}.modal-content .pf-wizard-navigation li>h6{color:#63676a;font-size:11px;margin:5px}.modal-content .pf-wizard-navigation li a:hover+h6{color:#adadad}.modal-content .pf-wizard-navigation li.active a:not(.btn-danger)+h6{color:#adadad}#pf-notification-dialog h1{will-change:transform}#pf-settings-dialog .form-group .btn-sm,#pf-settings-dialog .form-group .btn-group-sm>.btn{padding:4px 7px 3px}#pf-settings-dialog #pf-dialog-captcha-wrapper{margin:0;padding:3px 0;min-height:35px}#pf-map-dialog #pf-map-dialog-character-select,#pf-map-dialog #pf-map-dialog-corporation-select,#pf-map-dialog #pf-map-dialog-alliance-select{width:535px}#pf-route-dialog #pf-route-dialog-map-select{width:300px !important}#pf-shortcuts-dialog td kbd+i{width:16px}#pf-shortcuts-dialog td kbd:last-of-type+i{display:none}#pf-manual-scrollspy{position:relative;height:700px;overflow:auto}#pf-manual-scrollspy .list-unstyled.well,#pf-manual-scrollspy .well.list-inline{display:inline-block}#pf-manual-scrollspy h2:first-of-type{margin-top:0}#pf-system-dialog .form-control-static.pf-dynamic-area{padding:7px;min-height:32px}.pf-system-dialog-select{width:300px !important}#pf-task-dialog .pf-task-dialog-status{min-height:inherit}#pf-task-dialog h4>small.pull-right{font-family:Arial, sans-serif;font-weight:bold;margin-top:-5px}#pf-map-info-logs{margin-bottom:10px}#pf-stats-dialog .pf-dynamic-area{margin-bottom:10px}#pf-structure-dialog #pf-structure-dialog-corporation-select,#pf-structure-dialog #pf-structure-dialog-type-select{width:267px !important}#pf-connection-info-dialog #pf-connection-info-dialog-type-select,#pf-connection-info-dialog #pf-connection-info-dialog-character-select{width:310px !important}.pf-sig-reader-dialog h4{margin-top:8px}.pf-sig-reader-dialog h4 .pf-system-progress-scanned{display:inline-block;margin-left:20px;width:calc(100% - 255px)}.pf-sig-reader-dialog h4 .pf-system-progress-scanned .progress{margin-bottom:2px}.pf-sig-reader-dialog h4 .progress-label-right{margin-left:8px;vertical-align:middle;font-size:11px;opacity:0.65}.pf-sig-reader-dialog #pf-sig-info{margin-bottom:10px}.pf-sig-reader-dialog .pf-sig-table-info tbody{pointer-events:none}.pf-sig-reader-dialog .pf-sig-table-info .editable-click.editable-disabled{color:inherit}.pf-jump-info-dialog blockquote{margin-top:15px;margin-bottom:5px}.pf-changelog-dialog .pf-dynamic-message-container{margin-bottom:20px}.pf-system-effect-dialog .dataTable{border-collapse:collapse}.pf-credits-dialog .pf-credits-logo-background{overflow:visible;background:var(--bg-image);background-position-y:-50px;padding:15px;margin-bottom:20px}.pf-credits-dialog .pf-credits-logo-background>svg{height:80px;width:90px}.pf-credits-dialog .pf-credits-logo-background>h3{position:absolute;top:5px;right:15px;margin:0}.pf-credits-dialog .pf-dynamic-area{min-height:50px}.pf-credits-dialog .dl-horizontal{display:inline-block;width:48%}.pf-credits-dialog .btn{padding:0}.pf-credits-dialog blockquote{font-size:14px}.pf-sortable-handle:before{content:'\22EE\22EE\00A0';display:inline-block;font-style:normal;cursor:-moz-grab !important;cursor:-webkit-grab !important;cursor:grab !important;color:#63676a;width:12px;transition:color 0.15s ease-out}.pf-sortable-handle:hover:before{color:#f0ad4e}.pf-sortable-ghost{opacity:0.7 !important}.pf-sortable-ghost .pf-sortable-handle{color:#f0ad4e}.pf-sortable-chosen{background:rgba(226,138,13,0.2)}.pf-sortable-dropzone:after{content:attr(data-area);display:flex;justify-content:center;align-items:center;height:100%;background-color:rgba(40,51,67,0.25);color:#c2760c;font-size:20px;text-transform:uppercase;font-weight:bold;position:absolute;top:0;left:0;width:100%;pointer-events:none;border:1px dashed #375959;border-radius:5px;border-top-left-radius:0;overflow:hidden;z-index:1}.pf-log-graph{height:100px;width:100%}.timeline{list-style:none;position:relative}.timeline:before{top:0;bottom:0;position:absolute;content:" ";width:1px;left:50%;margin-top:20px;background-image:linear-gradient(to bottom, #4f9e4f, #63676a 25%)}.timeline>li{margin-bottom:20px;position:relative}.timeline>li.timeline-first .timeline-title{color:#4f9e4f}.timeline>li.timeline-first .timeline-badge{background-color:#4f9e4f}.timeline>li:before,.timeline>li:after{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li:before,.timeline>li:after{content:" ";display:table}.timeline>li:after{clear:both}.timeline>li>.timeline-panel{width:47%;float:left;border:1px solid #313335;padding:8px;position:relative;background-color:#313335;font-size:11px;-webkit-box-shadow:0 4px 10px rgba(0,0,0,0.4);box-shadow:0 4px 10px rgba(0,0,0,0.4);border-radius:5px}.timeline>li>.timeline-panel:before{content:" ";position:absolute;top:10px;right:-8px;display:inline-block;border-top:7px solid transparent;border-left:7px solid #63676a;border-right:0 solid #63676a;border-bottom:7px solid transparent}.timeline>li>.timeline-panel:after{content:" ";position:absolute;top:10px;right:-8px;display:inline-block;border-top:7px solid transparent;border-left:7px solid #63676a;border-right:0 solid #63676a;border-bottom:7px solid transparent}.timeline>li>.timeline-badge{color:#2b2b2b;width:23px;height:23px;line-height:23px;text-align:center;position:absolute;top:6px;left:50%;margin-left:-11px;background-color:#63676a;z-index:100;border-radius:50%}.timeline>li>.timeline-badge>i{vertical-align:middle}.timeline>li.timeline-inverted>.timeline-panel{float:right}.timeline>li.timeline-inverted>.timeline-panel:before{border-left-width:0;border-right-width:7px;left:-8px;right:auto}.timeline>li.timeline-inverted>.timeline-panel:after{border-left-width:0;border-right-width:8px;left:-9px;right:auto}.timeline-title{margin-top:0;color:inherit}.timeline-body>hr{display:none}.timeline-body>hr ~ *{display:none}.timeline-body>p,.timeline-body>ul{margin-bottom:0;list-style-type:disc;margin-left:15px}.timeline-body>p+p{margin-top:5px}.timeline-footer>.timeline-title{margin-top:10px;margin-bottom:0}@media (max-width: 1200px){ul.timeline:before{left:40px}ul.timeline>li>.timeline-panel{width:calc(100% - 62px)}ul.timeline>li>.timeline-badge{left:29px;margin-left:0;top:6px}ul.timeline>li>.timeline-panel{float:right}ul.timeline>li>.timeline-panel:before{border-left-width:0;border-right-width:7px;left:-8px;right:auto}ul.timeline>li>.timeline-panel:after{border-left-width:0;border-right-width:7px;left:-8px;right:auto}}.popover{z-index:1060;max-width:600px}.popover .arrow{pointer-events:none}.popover .popover-title{text-transform:capitalize;font-family:"Arial","Oxygen Bold","Helvetica Neue",Helvetica,sans-serif;font-weight:bold}.popover .popover-title kbd{line-height:90%;vertical-align:middle;box-shadow:none}.popover .popover-content{font-family:"Arial","Oxygen Bold","Helvetica Neue",Helvetica,sans-serif}.popover .popover-content>.hidden+.popover-footer,.popover .popover-content>.popover-footer:first-child{border-top-left-radius:5px;border-top-right-radius:5px}.popover .popover-footer{margin:0;padding:8px 14px;background-color:#353739;border-top:1px solid #303234;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.popover img{border-radius:3px}.popover h4{color:#adadad}.popover table{color:#adadad;line-height:16px;font-size:11px}.popover table td{padding:0 4px;vertical-align:middle !important}.popover .select2-container{margin-top:-1px;margin-left:-1px}.popover-small .popover-title{padding:4px 6px}.popover-small .popover-content{padding:4px 2px 4px}.popover-small .popover-content-inner{padding:7px 6px 0}.popover-small .popover-footer{padding:6px 6px}.pf-popover{display:initial}.pf-popover .popover-content{padding:0}.pf-popover h6{white-space:nowrap;margin-right:50px}.pf-popover h6:before,.pf-popover h6:after{content:" ";display:table}.pf-popover h6:after{clear:both}.pf-popover .well{margin-top:7px;margin-bottom:10px}.pf-popover .list-group{margin:0}.pf-popover .list-group .list-group-item{color:#313335}.pf-popover .list-group .list-group-item:hover{color:#1d1d1d}.pf-popover .list-group .list-group-item.disabled{background-color:#3c3f41;color:#63676a;cursor:not-allowed}.pf-popover .list-group .list-group-item img{width:30px;margin:-8px 10px -6px -8px;border-radius:0}.pf-popover .list-group .list-group-item i{margin-right:20px}.pf-popover .pf-popover-list-icon{width:28px;margin:5px 0}.pf-popover .pf-popover-list-icon:first-child{margin-left:8px}.pf-popover .pf-popover-list-icon:last-child{margin-right:8px}.pf-popover-character .table>tbody>tr>td{border:none;white-space:nowrap}.pf-popover-character .table>tbody>tr>td:first-child+td{padding:0 5px}.pf-popover-character .well{margin-bottom:0;line-height:13px}.ribbon-wrapper{width:72px;height:88px;overflow:hidden;position:absolute;top:-3px;right:-3px;pointer-events:none}.ribbon{font:bold 12px "Oxygen Bold","Helvetica Neue",Helvetica,Arial,sans-serif;color:#2b2b2b;text-align:center;text-shadow:rgba(255,255,255,0.2) 0px 1px 0px;position:relative;padding:3px 0;left:-4px;top:16px;width:99px;-webkit-box-shadow:2px 3px 3px rgba(0,0,0,0.2);box-shadow:2px 3px 3px rgba(0,0,0,0.2);transform:rotate(45deg)}.ribbon:before,.ribbon:after{content:"";border-left:3px solid transparent;border-right:3px solid transparent;position:absolute;bottom:-3px}.ribbon.ribbon-default{color:#adadad;background-color:#353739;background-image:linear-gradient(top, #2d3031, #2a2b2d)}.ribbon.ribbon-default:before,.ribbon.ribbon-default:after{border-top:3px solid #000}.ribbon.ribbon-green{background-color:#5cb85c;background-image:linear-gradient(top, #51b351, #4a944a)}.ribbon.ribbon-green:before,.ribbon.ribbon-green:after{border-top:3px solid #285028}.ribbon.ribbon-orange{background-color:#e28a0d;background-image:linear-gradient(top, #d4810c, #b46d0b)}.ribbon.ribbon-orange:before,.ribbon.ribbon-orange:after{border-top:3px solid #6c4107}.ribbon.ribbon-red{background-color:#d9534f;background-image:linear-gradient(top, #c9302c, #a82824)}.ribbon.ribbon-red:before,.ribbon.ribbon-red:after{border-top:3px solid #541412}.ribbon.ribbon-blue{background-color:#428bca;background-image:linear-gradient(top, #3784c5, #2d5c85)}.ribbon.ribbon-blue:before,.ribbon.ribbon-blue:after{border-top:3px solid #1a344c}.ribbon:before{left:0}.ribbon:after{right:0}.pf-loading-bars-container{position:relative;z-index:4;margin:0 auto;left:5px;right:19px;width:70px;height:50px;list-style:none}.pf-loading-bars-container .pf-loading-bars-loader{position:absolute;z-index:3;margin:0 auto;left:0;right:0;top:50%;margin-top:-19px;width:56px;height:37px;list-style:none}.pf-loading-bars-container .pf-loading-bars-loader li{background-color:#5cb85c;width:6px;height:6px;float:right;margin-right:3px !important;-webkit-box-shadow:0px 12px 6px rgba(0,0,0,0.2);box-shadow:0px 12px 6px rgba(0,0,0,0.2)}.pf-loading-bars-container .pf-loading-bars-loader li:first-child{-webkit-animation:cssload-loadbars 1.75s cubic-bezier(0.645, 0.045, 0.355, 1) infinite 0s;animation:cssload-loadbars 1.75s cubic-bezier(0.645, 0.045, 0.355, 1) infinite 0s}.pf-loading-bars-container .pf-loading-bars-loader li:nth-child(2){-webkit-animation:cssload-loadbars 1.75s ease-in-out infinite -0.35s;animation:cssload-loadbars 1.75s ease-in-out infinite -0.35s}.pf-loading-bars-container .pf-loading-bars-loader li:nth-child(3){-webkit-animation:cssload-loadbars 1.75s ease-in-out infinite -0.7s;animation:cssload-loadbars 1.75s ease-in-out infinite -0.7s}.pf-loading-bars-container .pf-loading-bars-loader li:nth-child(4){-webkit-animation:cssload-loadbars 1.75s ease-in-out infinite -1.05s;animation:cssload-loadbars 1.75s ease-in-out infinite -1.05s}.pf-loading-bars-container .pf-loading-bars-loader li:nth-child(5){-webkit-animation:cssload-loadbars 1.75s ease-in-out infinite -1.4s;animation:cssload-loadbars 1.75s ease-in-out infinite -1.4s}.pf-loading-bars-container .pf-loading-bars-loader li:nth-child(6){-webkit-animation:cssload-loadbars 1.75s ease-in-out infinite -1.75s;animation:cssload-loadbars 1.75s ease-in-out infinite -1.75s}@-webkit-keyframes cssload-loadbars{0%{height:6px;margin-top:16px}33%{height:6px;margin-top:16px}66%{height:31px;margin-top:0px}100%{height:6px;margin-top:16px}}@-moz-keyframes cssload-loadbars{0%{height:6px;margin-top:16px}33%{height:6px;margin-top:16px}66%{height:31px;margin-top:0px}100%{height:6px;margin-top:16px}}@-ms-keyframes cssload-loadbars{0%{height:6px;margin-top:16px}33%{height:6px;margin-top:16px}66%{height:31px;margin-top:0px}100%{height:6px;margin-top:16px}}@keyframes cssload-loadbars{0%{height:6px;margin-top:16px}33%{height:6px;margin-top:16px}66%{height:31px;margin-top:0px}100%{height:6px;margin-top:16px}}.pf-landing-sticky-panel{position:fixed;min-width:65px;border-radius:5px;padding:8px 10px;box-shadow:0 4px 10px rgba(0,0,0,0.4);text-shadow:#000000b8 0 1px 1px;z-index:100;background-color:rgba(43,43,43,0.75)}.pf-landing-sticky-panel h4{margin:5px 0 10px 0}.pf-landing-sticky-panel ul{margin-bottom:0;margin-left:25px}.pf-landing-sticky-panel ul+h4{margin-top:10px}.pf-landing-sticky-panel--top{top:50px}.pf-landing-sticky-panel--bottom{bottom:10px}.pf-landing-sticky-panel--left{left:10px}.pf-landing-sticky-panel--right{right:10px}.pf-svg-wrapper{width:0;height:0;overflow:hidden}.panel-heading.note-toolbar{background-color:#313335}.panel-heading.note-toolbar .dropdown-toggle>i+span{margin-left:3px}.panel-heading.note-toolbar .dropdown-menu>.note-btn-group:first-child{margin-bottom:3px}.note-editor.note-frame{border:none;background-color:transparent;margin-bottom:0}.note-editor.note-frame .note-editing-area .note-editable{color:#63676a;background-color:transparent;will-change:height;border:1px solid transparent}.note-editor.note-frame .note-editing-area .note-editable.has-error{border-color:#d9534f}.note-editor.note-frame .note-statusbar{background-color:#313335;padding:1px 0;border-top:0}.note-editor.note-frame .note-statusbar .note-resizebar:hover .note-icon-bar{border-top:1px solid #e28a0d}.note-editor.note-frame .note-statusbar .note-resizebar .note-icon-bar{border-top:1px solid #63676a;-webkit-transition:border-top 0.15s ease-out;transition:border-top 0.15s ease-out}[ui-pnotify].ui-pnotify.stack-bar-bottom{width:70%}.youtube{background-position:center;background-repeat:no-repeat;position:relative;display:inline-block;overflow:hidden;transition:all 200ms ease-out;cursor:pointer}.youtube .play{background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAERklEQVR4nOWbTWhcVRTHb1IJVoxGtNCNdal2JYJReC6GWuO83PM/59yUS3FRFARdFlwYP1CfiojQWt36sRCUurRIdVFXIn41lAoVdRGrG1M01YpKrWjiYmaSl8ybZJL3cd+YA//NLObd3++eO8x79z5jSq5Gw+8kov0AP8vMR5l1BtBZQM4B8ks75wCdZdYZZj5qLZ4hov2Nht9Z9vhKKSIaB/gI4M4w62KeAO6Mte4lYOq20FxrlqqOibhHmeWbvNC9ZfDX1mLae391aN6limO/gwgvAPJbWeAZuSDingdwXTBw7/0IsyaA/Fkh+KqOkD+YNfHej1QKD+y7iVlOhgLvFqFfNJvNGyuBJ+KDAF8MDd0tgS8y64OlgSdJMsysL4cG7SOHkyQZLhTee7+d2R2rAVy/S+Jd7/32ouBHAP4gNNRGQyTHc/84NhqNywZp5rvjjnnvt21aABFeCQ+RLwAf2hQ8s7sv9OCLk6AHNgQvIrvbfzKCD76g/O6cu7lf/iER/aQGgy448pExZmhdegAPhR9sObFWH1gT3lp7DaA/5bkIgJhZPgsNmz02novj+KqeApj1ubwXWe4kdyeznAgNvTpE/HQmvKqOMeuFogTUVQSRno+iaLRLAJF7uIgL9O4ubgL8aWgB7S44mNX+35YpICUiAvS9sBLkq1WzT+NFffl6AuoiApi6NT37h6sWkBIRZGkQ8YtLgyji6e1mBYTqCEBPG2Naz+0BWQgtoGoRgCzEsd9hAN1X5BfnFZASUfrSAFQNsyZ1FJASUVpHiLinDJG8U2cBZYogkrcNs5waBAGdstbeU9zdqpw0gPwwSAI6VUxHyFlDpOcHUUBBIuYNs14aZAE5RVwyzPr3/0EAEY0TyfGNjBWQvwZ +CTSbehfAH29mrID8bET0+0EUkAd8WYDOmqJ3ecsG30yr9wqRfm6Y+a1BEFDEjHfHvWmY9ck6CygHvBVr8Xhtb4ZE5HZA3y8DvBNA1TjnrmXWf+sioMwZX5V/VHXMGGMMoKdDCxCRvRWBdzKzdHEO+EisilbPyopHYqp6S9UCAsz4iojI7hUDAtyXVQgIDd6KnOoaWNkbI6FaPSuZGyMArsi7MZoloB4zviI/Nhr3X95jltwTRQmoIfgisy5ai+me67OI7fE4nrqjrqfK1t0eby0FPRB6oGVlchL3rgnfrq19RKbVBdhV9IOSwJmfmJi4vi/4ThERitwyCxVAFqydshuCX5awhQ9KtmuIWd8IDZED/nXT77rvVVv6sHRKwjYi91poqP7Dr+Y6JJ1VSZIMA3wkPNy6bX+o8Bcm0sXMdwM8Fxo0A3xORPaWBp6uPXsmbxCRD0NDL0dOANhVCXy6iAjMcjbcrMt3RITKwdMVRdFo+y5yvkL4eWZ+zHt/ZVD4dEVRNGotpst+dZZZH8k86lqn2pIvT/eqrNfn2xuyqYPZ8mv7s8pfn/8Pybm4TIjanscAAAAASUVORK5CYII=") no-repeat center center;background-size:64px 64px;position:absolute;height:100%;width:100%;opacity:.8;filter:alpha(opacity=80);transition:all 0.2s ease-out}.youtube .play:hover{opacity:1;filter:alpha(opacity=100)} + +/*# sourceMappingURL=pathfinder.css.map */ diff --git a/public/css/v2.0.0/pathfinder.css.br b/public/css/v2.0.0/pathfinder.css.br new file mode 100644 index 00000000..3f70ea9c Binary files /dev/null and b/public/css/v2.0.0/pathfinder.css.br differ diff --git a/public/css/v2.0.0/pathfinder.css.map b/public/css/v2.0.0/pathfinder.css.map new file mode 100644 index 00000000..dfcabcd0 --- /dev/null +++ b/public/css/v2.0.0/pathfinder.css.map @@ -0,0 +1 @@ +{"version":3,"file":"pathfinder.css","sources":["pathfinder.scss","_reset.scss","_colors.scss","_variables.scss","_bootstrap.scss","bootstrap/_mixins.scss","bootstrap/_scaffolding.scss","bootstrap/_type.scss","bootstrap/_code.scss","bootstrap/_grid.scss","bootstrap/_tables.scss","bootstrap/_forms.scss","bootstrap/_buttons.scss","bootstrap/_component-animations.scss","bootstrap/_dropdowns.scss","bootstrap/_button-groups.scss","bootstrap/_input-groups.scss","bootstrap/_navs.scss","bootstrap/_navbar.scss","bootstrap/_breadcrumbs.scss","bootstrap/_pagination.scss","bootstrap/_pager.scss","bootstrap/_labels.scss","bootstrap/_badges.scss","bootstrap/_thumbnails.scss","bootstrap/_alerts.scss","bootstrap/_progress-bars.scss","bootstrap/_media.scss","bootstrap/_list-group.scss","bootstrap/_panels.scss","bootstrap/_wells.scss","bootstrap/_close.scss","bootstrap/_modals.scss","bootstrap/_tooltip.scss","bootstrap/_popovers.scss","bootstrap/_utilities.scss","bootstrap/_responsive-utilities.scss","library/fontawesome/_fontawesome.scss","library/fontawesome/_variables.scss","library/fontawesome/_mixins.scss","library/fontawesome/_core.scss","library/fontawesome/_larger.scss","library/fontawesome/_fixed-width.scss","library/fontawesome/_list.scss","library/fontawesome/_bordered-pulled.scss","library/fontawesome/_animated.scss","library/fontawesome/_rotated-flipped.scss","library/fontawesome/_stacked.scss","library/fontawesome/_icons.scss","library/fontawesome/_screen-reader.scss","library/fontawesome/_regular.scss","library/fontawesome/_solid.scss","library/fontawesome/_brands.scss","library/custom-scrollbar/_mCustomScrollbar.scss","library/data-tables/_all.scss","library/data-tables/DataTables-1.10.18/_jquery.dataTables.scss","library/data-tables/Buttons-1.5.6/_buttons.dataTables.scss","library/data-tables/Buttons-1.5.6/_mixins.scss","library/data-tables/Buttons-1.5.6/_common.scss","library/data-tables/Responsive-2.2.2/_responsive.dataTables.scss","library/data-tables/Select-1.3.0/_select.dataTables.scss","library/data-tables/RowGroup-1.1.1/_rowGroup.dataTables.scss","library/data-tables/_dataTables-fontAwesome.scss","library/x-editable/_bootstrap-editable.scss","library/slidebars/_slidebars.scss","library/easy-pie-chart/_easyPieChart.scss","library/select2/_core.scss","library/select2/_single.scss","library/select2/_multiple.scss","library/select2/_dropdown.scss","library/select2/theme/pathfinder/_layout.scss","library/select2/theme/pathfinder/_single.scss","library/select2/theme/pathfinder/_multiple.scss","library/blue-imp-gallery/_blueimp-gallery.scss","library/blue-imp-gallery/_bootstrap-image-gallery.scss","library/bootstrap-toggle/_bootstrap-toggle.scss","library/bootstrap-checkbox/_awesome-bootstrap-checkbox.scss","library/summernote/_summernote.scss","_main.scss","_main-colorpallet.scss","layout/_all.scss","layout/_function.scss","layout/_animation.scss","layout/_fonts.scss","layout/_main.scss","layout/_landing.scss","layout/_breadcrumb.scss","layout/_logo.scss","layout/_map_module.scss","layout/_map.scss","layout/module/_all.scss","layout/module/_demo.scss","layout/module/_system_info.scss","layout/module/_system_graph.scss","layout/module/_system_signature.scss","layout/module/_system_route.scss","layout/module/_system_intel.scss","layout/module/_system_killboard.scss","layout/module/_connection_info.scss","layout/module/_global_thera.scss","layout/_forms.scss","layout/_dialogs.scss","layout/_sortable.scss","layout/_log.scss","layout/_timeline.scss","layout/_popover.scss","layout/_ribbon.scss","layout/_loading_bar.scss","layout/_sticky_panel.scss","layout/_svg.scss","layout/_summernote.scss","layout/_pnotify.scss","layout/_youtube.scss"],"names":[],"mappings":"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","sourceRoot":"../../../sass"} \ No newline at end of file diff --git a/public/img/custom-scrollbar/mCSB_buttons.png b/public/img/custom-scrollbar/mCSB_buttons.png deleted file mode 100644 index 985a9b8b..00000000 Binary files a/public/img/custom-scrollbar/mCSB_buttons.png and /dev/null differ diff --git a/public/img/data-tables/back_disabled.png b/public/img/data-tables/back_disabled.png deleted file mode 100644 index 881de797..00000000 Binary files a/public/img/data-tables/back_disabled.png and /dev/null differ diff --git a/public/img/data-tables/back_enabled.png b/public/img/data-tables/back_enabled.png deleted file mode 100644 index c608682b..00000000 Binary files a/public/img/data-tables/back_enabled.png and /dev/null differ diff --git a/public/img/data-tables/back_enabled_hover.png b/public/img/data-tables/back_enabled_hover.png deleted file mode 100644 index d300f106..00000000 Binary files a/public/img/data-tables/back_enabled_hover.png and /dev/null differ diff --git a/public/img/data-tables/forward_disabled.png b/public/img/data-tables/forward_disabled.png deleted file mode 100644 index 6a6ded7d..00000000 Binary files a/public/img/data-tables/forward_disabled.png and /dev/null differ diff --git a/public/img/data-tables/forward_enabled.png b/public/img/data-tables/forward_enabled.png deleted file mode 100644 index a4e6b538..00000000 Binary files a/public/img/data-tables/forward_enabled.png and /dev/null differ diff --git a/public/img/data-tables/forward_enabled_hover.png b/public/img/data-tables/forward_enabled_hover.png deleted file mode 100644 index fc46c5eb..00000000 Binary files a/public/img/data-tables/forward_enabled_hover.png and /dev/null differ diff --git a/public/img/data-tables/sort_asc.png b/public/img/data-tables/sort_asc.png deleted file mode 100644 index a88d7975..00000000 Binary files a/public/img/data-tables/sort_asc.png and /dev/null differ diff --git a/public/img/data-tables/sort_both.png b/public/img/data-tables/sort_both.png deleted file mode 100644 index 18670406..00000000 Binary files a/public/img/data-tables/sort_both.png and /dev/null differ diff --git a/public/img/data-tables/sort_desc.png b/public/img/data-tables/sort_desc.png deleted file mode 100644 index def071ed..00000000 Binary files a/public/img/data-tables/sort_desc.png and /dev/null differ diff --git a/public/img/data-tables/sort_desc_disabled.png b/public/img/data-tables/sort_desc_disabled.png deleted file mode 100644 index 7824973c..00000000 Binary files a/public/img/data-tables/sort_desc_disabled.png and /dev/null differ diff --git a/public/img/landing/intel.png b/public/img/landing/intel.png deleted file mode 100644 index da83cf16..00000000 Binary files a/public/img/landing/intel.png and /dev/null differ diff --git a/public/img/landing/map.png b/public/img/landing/map.png deleted file mode 100644 index 93aa61e1..00000000 Binary files a/public/img/landing/map.png and /dev/null differ diff --git a/public/img/landing/map/bg.jpg b/public/img/landing/map/bg.jpg deleted file mode 100644 index bdc68ad9..00000000 Binary files a/public/img/landing/map/bg.jpg and /dev/null differ diff --git a/public/img/landing/map/browser.jpg b/public/img/landing/map/browser.jpg deleted file mode 100644 index 4baa3f9a..00000000 Binary files a/public/img/landing/map/browser.jpg and /dev/null differ diff --git a/public/img/landing/map/neocom.jpg b/public/img/landing/map/neocom.jpg deleted file mode 100644 index c188e6f2..00000000 Binary files a/public/img/landing/map/neocom.jpg and /dev/null differ diff --git a/public/img/landing/pathfinder_1.jpg b/public/img/landing/pathfinder_1.jpg deleted file mode 100644 index ed8a0b70..00000000 Binary files a/public/img/landing/pathfinder_1.jpg and /dev/null differ diff --git a/public/img/landing/pathfinder_2.jpg b/public/img/landing/pathfinder_2.jpg deleted file mode 100644 index 47b53a32..00000000 Binary files a/public/img/landing/pathfinder_2.jpg and /dev/null differ diff --git a/public/img/landing/pathfinder_3.jpg b/public/img/landing/pathfinder_3.jpg deleted file mode 100644 index 6334b5af..00000000 Binary files a/public/img/landing/pathfinder_3.jpg and /dev/null differ diff --git a/public/img/landing/responsive.jpg b/public/img/landing/responsive.jpg deleted file mode 100644 index 2548dbae..00000000 Binary files a/public/img/landing/responsive.jpg and /dev/null differ diff --git a/public/img/landing/scope.png b/public/img/landing/scope.png deleted file mode 100644 index 599814da..00000000 Binary files a/public/img/landing/scope.png and /dev/null differ diff --git a/public/img/logo_bg.png b/public/img/logo_bg.png deleted file mode 100644 index b7014d39..00000000 Binary files a/public/img/logo_bg.png and /dev/null differ diff --git a/public/img/pf-bg.jpg b/public/img/pf-bg.jpg deleted file mode 100644 index 8f2dfb3c..00000000 Binary files a/public/img/pf-bg.jpg and /dev/null differ diff --git a/public/img/pf-header-bg.jpg b/public/img/pf-header-bg.jpg deleted file mode 100644 index a9e8aad9..00000000 Binary files a/public/img/pf-header-bg.jpg and /dev/null differ diff --git a/public/img/svg/logo.svg b/public/img/svg/logo.svg deleted file mode 100644 index 66f9adae..00000000 --- a/public/img/svg/logo.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/public/img/v2.0.0/gallery/admin_1.jpg b/public/img/v2.0.0/gallery/admin_1.jpg new file mode 100644 index 00000000..15c2d0bf Binary files /dev/null and b/public/img/v2.0.0/gallery/admin_1.jpg differ diff --git a/public/img/v2.0.0/gallery/admin_1.webp b/public/img/v2.0.0/gallery/admin_1.webp new file mode 100644 index 00000000..563bcfb4 Binary files /dev/null and b/public/img/v2.0.0/gallery/admin_1.webp differ diff --git a/public/img/v2.0.0/gallery/admin_2.jpg b/public/img/v2.0.0/gallery/admin_2.jpg new file mode 100644 index 00000000..1779df8a Binary files /dev/null and b/public/img/v2.0.0/gallery/admin_2.jpg differ diff --git a/public/img/v2.0.0/gallery/admin_2.webp b/public/img/v2.0.0/gallery/admin_2.webp new file mode 100644 index 00000000..7623b926 Binary files /dev/null and b/public/img/v2.0.0/gallery/admin_2.webp differ diff --git a/public/img/v2.0.0/gallery/connection_1.jpg b/public/img/v2.0.0/gallery/connection_1.jpg new file mode 100644 index 00000000..0590d7d8 Binary files /dev/null and b/public/img/v2.0.0/gallery/connection_1.jpg differ diff --git a/public/img/v2.0.0/gallery/connection_1.webp b/public/img/v2.0.0/gallery/connection_1.webp new file mode 100644 index 00000000..8bcf1d72 Binary files /dev/null and b/public/img/v2.0.0/gallery/connection_1.webp differ diff --git a/public/img/v2.0.0/gallery/development_1.jpg b/public/img/v2.0.0/gallery/development_1.jpg new file mode 100644 index 00000000..a4cce2cc Binary files /dev/null and b/public/img/v2.0.0/gallery/development_1.jpg differ diff --git a/public/img/v2.0.0/gallery/development_1.webp b/public/img/v2.0.0/gallery/development_1.webp new file mode 100644 index 00000000..a52d2ef4 Binary files /dev/null and b/public/img/v2.0.0/gallery/development_1.webp differ diff --git a/public/img/v2.0.0/gallery/development_2.jpg b/public/img/v2.0.0/gallery/development_2.jpg new file mode 100644 index 00000000..dfc723ea Binary files /dev/null and b/public/img/v2.0.0/gallery/development_2.jpg differ diff --git a/public/img/v2.0.0/gallery/development_2.webp b/public/img/v2.0.0/gallery/development_2.webp new file mode 100644 index 00000000..074921f8 Binary files /dev/null and b/public/img/v2.0.0/gallery/development_2.webp differ diff --git a/public/img/v2.0.0/gallery/discord_1.jpg b/public/img/v2.0.0/gallery/discord_1.jpg new file mode 100644 index 00000000..710b2fce Binary files /dev/null and b/public/img/v2.0.0/gallery/discord_1.jpg differ diff --git a/public/img/v2.0.0/gallery/discord_1.webp b/public/img/v2.0.0/gallery/discord_1.webp new file mode 100644 index 00000000..00b1ca4f Binary files /dev/null and b/public/img/v2.0.0/gallery/discord_1.webp differ diff --git a/public/img/v2.0.0/gallery/install_db.jpg b/public/img/v2.0.0/gallery/install_db.jpg new file mode 100644 index 00000000..5b43819e Binary files /dev/null and b/public/img/v2.0.0/gallery/install_db.jpg differ diff --git a/public/img/v2.0.0/gallery/install_db.webp b/public/img/v2.0.0/gallery/install_db.webp new file mode 100644 index 00000000..21ca33ac Binary files /dev/null and b/public/img/v2.0.0/gallery/install_db.webp differ diff --git a/public/img/v2.0.0/gallery/install_settings.jpg b/public/img/v2.0.0/gallery/install_settings.jpg new file mode 100644 index 00000000..1b3fefe8 Binary files /dev/null and b/public/img/v2.0.0/gallery/install_settings.jpg differ diff --git a/public/img/v2.0.0/gallery/install_settings.webp b/public/img/v2.0.0/gallery/install_settings.webp new file mode 100644 index 00000000..68524a55 Binary files /dev/null and b/public/img/v2.0.0/gallery/install_settings.webp differ diff --git a/public/img/v2.0.0/gallery/intel_1.jpg b/public/img/v2.0.0/gallery/intel_1.jpg new file mode 100644 index 00000000..067259ef Binary files /dev/null and b/public/img/v2.0.0/gallery/intel_1.jpg differ diff --git a/public/img/v2.0.0/gallery/intel_1.webp b/public/img/v2.0.0/gallery/intel_1.webp new file mode 100644 index 00000000..17505ec4 Binary files /dev/null and b/public/img/v2.0.0/gallery/intel_1.webp differ diff --git a/public/img/v2.0.0/gallery/kb_1.jpg b/public/img/v2.0.0/gallery/kb_1.jpg new file mode 100644 index 00000000..6afbe14e Binary files /dev/null and b/public/img/v2.0.0/gallery/kb_1.jpg differ diff --git a/public/img/v2.0.0/gallery/kb_1.webp b/public/img/v2.0.0/gallery/kb_1.webp new file mode 100644 index 00000000..a28946f7 Binary files /dev/null and b/public/img/v2.0.0/gallery/kb_1.webp differ diff --git a/public/img/v2.0.0/gallery/kb_2.jpg b/public/img/v2.0.0/gallery/kb_2.jpg new file mode 100644 index 00000000..fcd7fa0f Binary files /dev/null and b/public/img/v2.0.0/gallery/kb_2.jpg differ diff --git a/public/img/v2.0.0/gallery/kb_2.webp b/public/img/v2.0.0/gallery/kb_2.webp new file mode 100644 index 00000000..16f839fc Binary files /dev/null and b/public/img/v2.0.0/gallery/kb_2.webp differ diff --git a/public/img/v2.0.0/gallery/log_1.jpg b/public/img/v2.0.0/gallery/log_1.jpg new file mode 100644 index 00000000..a02a6496 Binary files /dev/null and b/public/img/v2.0.0/gallery/log_1.jpg differ diff --git a/public/img/v2.0.0/gallery/log_1.webp b/public/img/v2.0.0/gallery/log_1.webp new file mode 100644 index 00000000..9ca91d23 Binary files /dev/null and b/public/img/v2.0.0/gallery/log_1.webp differ diff --git a/public/img/v2.0.0/gallery/login_1.jpg b/public/img/v2.0.0/gallery/login_1.jpg new file mode 100644 index 00000000..a9627d40 Binary files /dev/null and b/public/img/v2.0.0/gallery/login_1.jpg differ diff --git a/public/img/v2.0.0/gallery/login_1.webp b/public/img/v2.0.0/gallery/login_1.webp new file mode 100644 index 00000000..04118023 Binary files /dev/null and b/public/img/v2.0.0/gallery/login_1.webp differ diff --git a/public/img/v2.0.0/gallery/map_1.jpg b/public/img/v2.0.0/gallery/map_1.jpg new file mode 100644 index 00000000..aa3c09d4 Binary files /dev/null and b/public/img/v2.0.0/gallery/map_1.jpg differ diff --git a/public/img/v2.0.0/gallery/map_1.webp b/public/img/v2.0.0/gallery/map_1.webp new file mode 100644 index 00000000..3f6e4e0c Binary files /dev/null and b/public/img/v2.0.0/gallery/map_1.webp differ diff --git a/public/img/v2.0.0/gallery/map_2.jpg b/public/img/v2.0.0/gallery/map_2.jpg new file mode 100644 index 00000000..2764f3ee Binary files /dev/null and b/public/img/v2.0.0/gallery/map_2.jpg differ diff --git a/public/img/v2.0.0/gallery/map_2.webp b/public/img/v2.0.0/gallery/map_2.webp new file mode 100644 index 00000000..d3e1900e Binary files /dev/null and b/public/img/v2.0.0/gallery/map_2.webp differ diff --git a/public/img/v2.0.0/gallery/map_3.jpg b/public/img/v2.0.0/gallery/map_3.jpg new file mode 100644 index 00000000..375d9853 Binary files /dev/null and b/public/img/v2.0.0/gallery/map_3.jpg differ diff --git a/public/img/v2.0.0/gallery/map_3.webp b/public/img/v2.0.0/gallery/map_3.webp new file mode 100644 index 00000000..2d623f5c Binary files /dev/null and b/public/img/v2.0.0/gallery/map_3.webp differ diff --git a/public/img/v2.0.0/gallery/route_1.jpg b/public/img/v2.0.0/gallery/route_1.jpg new file mode 100644 index 00000000..d94d0c99 Binary files /dev/null and b/public/img/v2.0.0/gallery/route_1.jpg differ diff --git a/public/img/v2.0.0/gallery/route_1.webp b/public/img/v2.0.0/gallery/route_1.webp new file mode 100644 index 00000000..e3d58257 Binary files /dev/null and b/public/img/v2.0.0/gallery/route_1.webp differ diff --git a/public/img/v2.0.0/gallery/route_2.jpg b/public/img/v2.0.0/gallery/route_2.jpg new file mode 100644 index 00000000..4b2c1857 Binary files /dev/null and b/public/img/v2.0.0/gallery/route_2.jpg differ diff --git a/public/img/v2.0.0/gallery/route_2.webp b/public/img/v2.0.0/gallery/route_2.webp new file mode 100644 index 00000000..dbad31bd Binary files /dev/null and b/public/img/v2.0.0/gallery/route_2.webp differ diff --git a/public/img/v2.0.0/gallery/settings_1.jpg b/public/img/v2.0.0/gallery/settings_1.jpg new file mode 100644 index 00000000..128c12b5 Binary files /dev/null and b/public/img/v2.0.0/gallery/settings_1.jpg differ diff --git a/public/img/v2.0.0/gallery/settings_1.webp b/public/img/v2.0.0/gallery/settings_1.webp new file mode 100644 index 00000000..05b6047d Binary files /dev/null and b/public/img/v2.0.0/gallery/settings_1.webp differ diff --git a/public/img/v2.0.0/gallery/signatures_1.jpg b/public/img/v2.0.0/gallery/signatures_1.jpg new file mode 100644 index 00000000..7de84953 Binary files /dev/null and b/public/img/v2.0.0/gallery/signatures_1.jpg differ diff --git a/public/img/v2.0.0/gallery/signatures_1.webp b/public/img/v2.0.0/gallery/signatures_1.webp new file mode 100644 index 00000000..f90f3123 Binary files /dev/null and b/public/img/v2.0.0/gallery/signatures_1.webp differ diff --git a/public/img/v2.0.0/gallery/signatures_2.jpg b/public/img/v2.0.0/gallery/signatures_2.jpg new file mode 100644 index 00000000..2e8847fc Binary files /dev/null and b/public/img/v2.0.0/gallery/signatures_2.jpg differ diff --git a/public/img/v2.0.0/gallery/signatures_2.webp b/public/img/v2.0.0/gallery/signatures_2.webp new file mode 100644 index 00000000..dc81c7ef Binary files /dev/null and b/public/img/v2.0.0/gallery/signatures_2.webp differ diff --git a/public/img/v2.0.0/gallery/statistics_1.jpg b/public/img/v2.0.0/gallery/statistics_1.jpg new file mode 100644 index 00000000..f831eb43 Binary files /dev/null and b/public/img/v2.0.0/gallery/statistics_1.jpg differ diff --git a/public/img/v2.0.0/gallery/statistics_1.webp b/public/img/v2.0.0/gallery/statistics_1.webp new file mode 100644 index 00000000..1c20a06c Binary files /dev/null and b/public/img/v2.0.0/gallery/statistics_1.webp differ diff --git a/public/img/v2.0.0/gallery/statistics_2.jpg b/public/img/v2.0.0/gallery/statistics_2.jpg new file mode 100644 index 00000000..a26636e6 Binary files /dev/null and b/public/img/v2.0.0/gallery/statistics_2.jpg differ diff --git a/public/img/v2.0.0/gallery/statistics_2.webp b/public/img/v2.0.0/gallery/statistics_2.webp new file mode 100644 index 00000000..d6eba7ca Binary files /dev/null and b/public/img/v2.0.0/gallery/statistics_2.webp differ diff --git a/public/img/v2.0.0/gallery/system_1.jpg b/public/img/v2.0.0/gallery/system_1.jpg new file mode 100644 index 00000000..1e2f1be1 Binary files /dev/null and b/public/img/v2.0.0/gallery/system_1.jpg differ diff --git a/public/img/v2.0.0/gallery/system_1.webp b/public/img/v2.0.0/gallery/system_1.webp new file mode 100644 index 00000000..d6526dc4 Binary files /dev/null and b/public/img/v2.0.0/gallery/system_1.webp differ diff --git a/public/img/v2.0.0/gallery/system_2.jpg b/public/img/v2.0.0/gallery/system_2.jpg new file mode 100644 index 00000000..10267c8c Binary files /dev/null and b/public/img/v2.0.0/gallery/system_2.jpg differ diff --git a/public/img/v2.0.0/gallery/system_2.webp b/public/img/v2.0.0/gallery/system_2.webp new file mode 100644 index 00000000..9aecbfba Binary files /dev/null and b/public/img/v2.0.0/gallery/system_2.webp differ diff --git a/public/img/v2.0.0/gallery/taskmanager_1.jpg b/public/img/v2.0.0/gallery/taskmanager_1.jpg new file mode 100644 index 00000000..83dd8d0d Binary files /dev/null and b/public/img/v2.0.0/gallery/taskmanager_1.jpg differ diff --git a/public/img/v2.0.0/gallery/taskmanager_1.webp b/public/img/v2.0.0/gallery/taskmanager_1.webp new file mode 100644 index 00000000..3bfe42ea Binary files /dev/null and b/public/img/v2.0.0/gallery/taskmanager_1.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/admin_1.jpg b/public/img/v2.0.0/gallery/thumbs/admin_1.jpg new file mode 100644 index 00000000..50955ecd Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/admin_1.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/admin_1.webp b/public/img/v2.0.0/gallery/thumbs/admin_1.webp new file mode 100644 index 00000000..2ffa8d63 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/admin_1.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/admin_2.jpg b/public/img/v2.0.0/gallery/thumbs/admin_2.jpg new file mode 100644 index 00000000..3fb54524 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/admin_2.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/admin_2.webp b/public/img/v2.0.0/gallery/thumbs/admin_2.webp new file mode 100644 index 00000000..0df9fe8e Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/admin_2.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/connection_1.jpg b/public/img/v2.0.0/gallery/thumbs/connection_1.jpg new file mode 100644 index 00000000..457c9600 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/connection_1.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/connection_1.webp b/public/img/v2.0.0/gallery/thumbs/connection_1.webp new file mode 100644 index 00000000..112a5b4f Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/connection_1.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/development_1.jpg b/public/img/v2.0.0/gallery/thumbs/development_1.jpg new file mode 100644 index 00000000..68741598 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/development_1.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/development_1.webp b/public/img/v2.0.0/gallery/thumbs/development_1.webp new file mode 100644 index 00000000..74279c2e Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/development_1.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/development_2.jpg b/public/img/v2.0.0/gallery/thumbs/development_2.jpg new file mode 100644 index 00000000..7ce24f4a Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/development_2.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/development_2.webp b/public/img/v2.0.0/gallery/thumbs/development_2.webp new file mode 100644 index 00000000..9ea2873e Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/development_2.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/discord_1.jpg b/public/img/v2.0.0/gallery/thumbs/discord_1.jpg new file mode 100644 index 00000000..e351bc3d Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/discord_1.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/discord_1.webp b/public/img/v2.0.0/gallery/thumbs/discord_1.webp new file mode 100644 index 00000000..b7f3912d Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/discord_1.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/install_db.jpg b/public/img/v2.0.0/gallery/thumbs/install_db.jpg new file mode 100644 index 00000000..a0c96d88 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/install_db.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/install_db.webp b/public/img/v2.0.0/gallery/thumbs/install_db.webp new file mode 100644 index 00000000..a119a0b6 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/install_db.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/install_settings.jpg b/public/img/v2.0.0/gallery/thumbs/install_settings.jpg new file mode 100644 index 00000000..fd28e6ec Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/install_settings.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/install_settings.webp b/public/img/v2.0.0/gallery/thumbs/install_settings.webp new file mode 100644 index 00000000..c03bc935 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/install_settings.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/intel_1.jpg b/public/img/v2.0.0/gallery/thumbs/intel_1.jpg new file mode 100644 index 00000000..98477303 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/intel_1.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/intel_1.webp b/public/img/v2.0.0/gallery/thumbs/intel_1.webp new file mode 100644 index 00000000..9210d27f Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/intel_1.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/kb_1.jpg b/public/img/v2.0.0/gallery/thumbs/kb_1.jpg new file mode 100644 index 00000000..70f1a8be Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/kb_1.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/kb_1.webp b/public/img/v2.0.0/gallery/thumbs/kb_1.webp new file mode 100644 index 00000000..24bcf68e Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/kb_1.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/kb_2.jpg b/public/img/v2.0.0/gallery/thumbs/kb_2.jpg new file mode 100644 index 00000000..70c9cb49 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/kb_2.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/kb_2.webp b/public/img/v2.0.0/gallery/thumbs/kb_2.webp new file mode 100644 index 00000000..cfc1e057 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/kb_2.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/log_1.jpg b/public/img/v2.0.0/gallery/thumbs/log_1.jpg new file mode 100644 index 00000000..19cf9f4e Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/log_1.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/log_1.webp b/public/img/v2.0.0/gallery/thumbs/log_1.webp new file mode 100644 index 00000000..ed92f7a8 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/log_1.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/login_1.jpg b/public/img/v2.0.0/gallery/thumbs/login_1.jpg new file mode 100644 index 00000000..6ce6d3ac Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/login_1.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/login_1.webp b/public/img/v2.0.0/gallery/thumbs/login_1.webp new file mode 100644 index 00000000..ffdad765 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/login_1.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/map_1.jpg b/public/img/v2.0.0/gallery/thumbs/map_1.jpg new file mode 100644 index 00000000..4fd126ad Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/map_1.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/map_1.webp b/public/img/v2.0.0/gallery/thumbs/map_1.webp new file mode 100644 index 00000000..2a9358ff Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/map_1.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/map_2.jpg b/public/img/v2.0.0/gallery/thumbs/map_2.jpg new file mode 100644 index 00000000..323ecaac Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/map_2.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/map_2.webp b/public/img/v2.0.0/gallery/thumbs/map_2.webp new file mode 100644 index 00000000..8761ee9e Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/map_2.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/map_3.jpg b/public/img/v2.0.0/gallery/thumbs/map_3.jpg new file mode 100644 index 00000000..44c632aa Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/map_3.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/map_3.webp b/public/img/v2.0.0/gallery/thumbs/map_3.webp new file mode 100644 index 00000000..8b8d3edd Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/map_3.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/route_1.jpg b/public/img/v2.0.0/gallery/thumbs/route_1.jpg new file mode 100644 index 00000000..01e18822 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/route_1.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/route_1.webp b/public/img/v2.0.0/gallery/thumbs/route_1.webp new file mode 100644 index 00000000..4a0239c7 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/route_1.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/route_2.jpg b/public/img/v2.0.0/gallery/thumbs/route_2.jpg new file mode 100644 index 00000000..e64b722f Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/route_2.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/route_2.webp b/public/img/v2.0.0/gallery/thumbs/route_2.webp new file mode 100644 index 00000000..9b0c6932 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/route_2.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/settings_1.jpg b/public/img/v2.0.0/gallery/thumbs/settings_1.jpg new file mode 100644 index 00000000..c45a46ab Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/settings_1.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/settings_1.webp b/public/img/v2.0.0/gallery/thumbs/settings_1.webp new file mode 100644 index 00000000..483bfedd Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/settings_1.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/signatures_1.jpg b/public/img/v2.0.0/gallery/thumbs/signatures_1.jpg new file mode 100644 index 00000000..c65d5c38 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/signatures_1.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/signatures_1.webp b/public/img/v2.0.0/gallery/thumbs/signatures_1.webp new file mode 100644 index 00000000..1e1566d7 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/signatures_1.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/signatures_2.jpg b/public/img/v2.0.0/gallery/thumbs/signatures_2.jpg new file mode 100644 index 00000000..ee9330a3 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/signatures_2.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/signatures_2.webp b/public/img/v2.0.0/gallery/thumbs/signatures_2.webp new file mode 100644 index 00000000..c72a0b6b Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/signatures_2.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/statistics_1.jpg b/public/img/v2.0.0/gallery/thumbs/statistics_1.jpg new file mode 100644 index 00000000..88294be1 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/statistics_1.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/statistics_1.webp b/public/img/v2.0.0/gallery/thumbs/statistics_1.webp new file mode 100644 index 00000000..5e44b7d7 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/statistics_1.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/statistics_2.jpg b/public/img/v2.0.0/gallery/thumbs/statistics_2.jpg new file mode 100644 index 00000000..13d069dc Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/statistics_2.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/statistics_2.webp b/public/img/v2.0.0/gallery/thumbs/statistics_2.webp new file mode 100644 index 00000000..ae0d80cd Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/statistics_2.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/system_1.jpg b/public/img/v2.0.0/gallery/thumbs/system_1.jpg new file mode 100644 index 00000000..054a4da0 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/system_1.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/system_1.webp b/public/img/v2.0.0/gallery/thumbs/system_1.webp new file mode 100644 index 00000000..9ee31937 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/system_1.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/system_2.jpg b/public/img/v2.0.0/gallery/thumbs/system_2.jpg new file mode 100644 index 00000000..72d99ab2 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/system_2.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/system_2.webp b/public/img/v2.0.0/gallery/thumbs/system_2.webp new file mode 100644 index 00000000..e04e4d81 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/system_2.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/taskmanager_1.jpg b/public/img/v2.0.0/gallery/thumbs/taskmanager_1.jpg new file mode 100644 index 00000000..c9ea25c5 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/taskmanager_1.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/taskmanager_1.webp b/public/img/v2.0.0/gallery/thumbs/taskmanager_1.webp new file mode 100644 index 00000000..9e545c01 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/taskmanager_1.webp differ diff --git a/public/img/v2.0.0/gallery/thumbs/wip.jpg b/public/img/v2.0.0/gallery/thumbs/wip.jpg new file mode 100644 index 00000000..0ef19a27 Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/wip.jpg differ diff --git a/public/img/v2.0.0/gallery/thumbs/wip.webp b/public/img/v2.0.0/gallery/thumbs/wip.webp new file mode 100644 index 00000000..cfe00dee Binary files /dev/null and b/public/img/v2.0.0/gallery/thumbs/wip.webp differ diff --git a/public/img/v2.0.0/header/pf-header-1200.jpg b/public/img/v2.0.0/header/pf-header-1200.jpg new file mode 100644 index 00000000..e59b6c11 Binary files /dev/null and b/public/img/v2.0.0/header/pf-header-1200.jpg differ diff --git a/public/img/v2.0.0/header/pf-header-1200.png b/public/img/v2.0.0/header/pf-header-1200.png new file mode 100644 index 00000000..cf588e42 Binary files /dev/null and b/public/img/v2.0.0/header/pf-header-1200.png differ diff --git a/public/img/v2.0.0/header/pf-header-1200.webp b/public/img/v2.0.0/header/pf-header-1200.webp new file mode 100644 index 00000000..d144fff9 Binary files /dev/null and b/public/img/v2.0.0/header/pf-header-1200.webp differ diff --git a/public/img/v2.0.0/header/pf-header-1600.jpg b/public/img/v2.0.0/header/pf-header-1600.jpg new file mode 100644 index 00000000..6efa5eb6 Binary files /dev/null and b/public/img/v2.0.0/header/pf-header-1600.jpg differ diff --git a/public/img/v2.0.0/header/pf-header-1600.png b/public/img/v2.0.0/header/pf-header-1600.png new file mode 100644 index 00000000..ae90ffa0 Binary files /dev/null and b/public/img/v2.0.0/header/pf-header-1600.png differ diff --git a/public/img/v2.0.0/header/pf-header-1600.webp b/public/img/v2.0.0/header/pf-header-1600.webp new file mode 100644 index 00000000..730f560b Binary files /dev/null and b/public/img/v2.0.0/header/pf-header-1600.webp differ diff --git a/public/img/v2.0.0/header/pf-header-3840.jpg b/public/img/v2.0.0/header/pf-header-3840.jpg new file mode 100644 index 00000000..b9c0f87d Binary files /dev/null and b/public/img/v2.0.0/header/pf-header-3840.jpg differ diff --git a/public/img/v2.0.0/header/pf-header-3840.png b/public/img/v2.0.0/header/pf-header-3840.png new file mode 100644 index 00000000..db87017c Binary files /dev/null and b/public/img/v2.0.0/header/pf-header-3840.png differ diff --git a/public/img/v2.0.0/header/pf-header-3840.webp b/public/img/v2.0.0/header/pf-header-3840.webp new file mode 100644 index 00000000..31d8a8d8 Binary files /dev/null and b/public/img/v2.0.0/header/pf-header-3840.webp differ diff --git a/public/img/v2.0.0/header/pf-header-480.jpg b/public/img/v2.0.0/header/pf-header-480.jpg new file mode 100644 index 00000000..4b612127 Binary files /dev/null and b/public/img/v2.0.0/header/pf-header-480.jpg differ diff --git a/public/img/v2.0.0/header/pf-header-480.png b/public/img/v2.0.0/header/pf-header-480.png new file mode 100644 index 00000000..f3bc825f Binary files /dev/null and b/public/img/v2.0.0/header/pf-header-480.png differ diff --git a/public/img/v2.0.0/header/pf-header-480.webp b/public/img/v2.0.0/header/pf-header-480.webp new file mode 100644 index 00000000..24c8d5b8 Binary files /dev/null and b/public/img/v2.0.0/header/pf-header-480.webp differ diff --git a/public/img/v2.0.0/header/pf-header-780.jpg b/public/img/v2.0.0/header/pf-header-780.jpg new file mode 100644 index 00000000..e2de757b Binary files /dev/null and b/public/img/v2.0.0/header/pf-header-780.jpg differ diff --git a/public/img/v2.0.0/header/pf-header-780.png b/public/img/v2.0.0/header/pf-header-780.png new file mode 100644 index 00000000..dd661e0a Binary files /dev/null and b/public/img/v2.0.0/header/pf-header-780.png differ diff --git a/public/img/v2.0.0/header/pf-header-780.webp b/public/img/v2.0.0/header/pf-header-780.webp new file mode 100644 index 00000000..a5280d4a Binary files /dev/null and b/public/img/v2.0.0/header/pf-header-780.webp differ diff --git a/public/img/v2.0.0/icons/client/ui/window/charcustomization.png b/public/img/v2.0.0/icons/client/ui/window/charcustomization.png new file mode 100644 index 00000000..54716005 Binary files /dev/null and b/public/img/v2.0.0/icons/client/ui/window/charcustomization.png differ diff --git a/public/img/v2.0.0/icons/client/ui/window/clonebay.png b/public/img/v2.0.0/icons/client/ui/window/clonebay.png new file mode 100644 index 00000000..aae77ff9 Binary files /dev/null and b/public/img/v2.0.0/icons/client/ui/window/clonebay.png differ diff --git a/public/img/v2.0.0/icons/client/ui/window/concord.png b/public/img/v2.0.0/icons/client/ui/window/concord.png new file mode 100644 index 00000000..23130c48 Binary files /dev/null and b/public/img/v2.0.0/icons/client/ui/window/concord.png differ diff --git a/public/img/v2.0.0/icons/client/ui/window/docking.png b/public/img/v2.0.0/icons/client/ui/window/docking.png new file mode 100644 index 00000000..0c72594e Binary files /dev/null and b/public/img/v2.0.0/icons/client/ui/window/docking.png differ diff --git a/public/img/v2.0.0/icons/client/ui/window/factionalwarfare.png b/public/img/v2.0.0/icons/client/ui/window/factionalwarfare.png new file mode 100644 index 00000000..90a8e761 Binary files /dev/null and b/public/img/v2.0.0/icons/client/ui/window/factionalwarfare.png differ diff --git a/public/img/v2.0.0/icons/client/ui/window/fitting.png b/public/img/v2.0.0/icons/client/ui/window/fitting.png new file mode 100644 index 00000000..bec796cb Binary files /dev/null and b/public/img/v2.0.0/icons/client/ui/window/fitting.png differ diff --git a/public/img/v2.0.0/icons/client/ui/window/industry.png b/public/img/v2.0.0/icons/client/ui/window/industry.png new file mode 100644 index 00000000..41f3f258 Binary files /dev/null and b/public/img/v2.0.0/icons/client/ui/window/industry.png differ diff --git a/public/img/v2.0.0/icons/client/ui/window/insurance.png b/public/img/v2.0.0/icons/client/ui/window/insurance.png new file mode 100644 index 00000000..0f62ba9b Binary files /dev/null and b/public/img/v2.0.0/icons/client/ui/window/insurance.png differ diff --git a/public/img/v2.0.0/icons/client/ui/window/jumpclones.png b/public/img/v2.0.0/icons/client/ui/window/jumpclones.png new file mode 100644 index 00000000..1974368d Binary files /dev/null and b/public/img/v2.0.0/icons/client/ui/window/jumpclones.png differ diff --git a/public/img/v2.0.0/icons/client/ui/window/lpstore.png b/public/img/v2.0.0/icons/client/ui/window/lpstore.png new file mode 100644 index 00000000..a4953f6d Binary files /dev/null and b/public/img/v2.0.0/icons/client/ui/window/lpstore.png differ diff --git a/public/img/v2.0.0/icons/client/ui/window/market.png b/public/img/v2.0.0/icons/client/ui/window/market.png new file mode 100644 index 00000000..a583312d Binary files /dev/null and b/public/img/v2.0.0/icons/client/ui/window/market.png differ diff --git a/public/img/v2.0.0/icons/client/ui/window/repairshop.png b/public/img/v2.0.0/icons/client/ui/window/repairshop.png new file mode 100644 index 00000000..7d9af15c Binary files /dev/null and b/public/img/v2.0.0/icons/client/ui/window/repairshop.png differ diff --git a/public/img/v2.0.0/icons/client/ui/window/reprocess.png b/public/img/v2.0.0/icons/client/ui/window/reprocess.png new file mode 100644 index 00000000..350e4652 Binary files /dev/null and b/public/img/v2.0.0/icons/client/ui/window/reprocess.png differ diff --git a/public/img/v2.0.0/icons/client/ui/window/research.png b/public/img/v2.0.0/icons/client/ui/window/research.png new file mode 100644 index 00000000..12ac75fd Binary files /dev/null and b/public/img/v2.0.0/icons/client/ui/window/research.png differ diff --git a/public/img/v2.0.0/icons/client/ui/window/skins.png b/public/img/v2.0.0/icons/client/ui/window/skins.png new file mode 100644 index 00000000..1df82a01 Binary files /dev/null and b/public/img/v2.0.0/icons/client/ui/window/skins.png differ diff --git a/public/img/v2.0.0/icons/grid_left.png b/public/img/v2.0.0/icons/grid_left.png new file mode 100644 index 00000000..fc0a67b7 Binary files /dev/null and b/public/img/v2.0.0/icons/grid_left.png differ diff --git a/public/img/v2.0.0/icons/grid_right.png b/public/img/v2.0.0/icons/grid_right.png new file mode 100644 index 00000000..0728df8a Binary files /dev/null and b/public/img/v2.0.0/icons/grid_right.png differ diff --git a/public/img/v2.0.0/icons/logo_anoik.png b/public/img/v2.0.0/icons/logo_anoik.png new file mode 100644 index 00000000..0212b180 Binary files /dev/null and b/public/img/v2.0.0/icons/logo_anoik.png differ diff --git a/public/img/v2.0.0/icons/logo_dotlan.png b/public/img/v2.0.0/icons/logo_dotlan.png new file mode 100644 index 00000000..f8853710 Binary files /dev/null and b/public/img/v2.0.0/icons/logo_dotlan.png differ diff --git a/public/img/v2.0.0/icons/logo_eve.png b/public/img/v2.0.0/icons/logo_eve.png new file mode 100644 index 00000000..a8b42259 Binary files /dev/null and b/public/img/v2.0.0/icons/logo_eve.png differ diff --git a/public/img/v2.0.0/icons/logo_eveeye.png b/public/img/v2.0.0/icons/logo_eveeye.png new file mode 100644 index 00000000..328177b2 Binary files /dev/null and b/public/img/v2.0.0/icons/logo_eveeye.png differ diff --git a/public/img/v2.0.0/misc/donate_patreon.png b/public/img/v2.0.0/misc/donate_patreon.png new file mode 100644 index 00000000..c4944368 Binary files /dev/null and b/public/img/v2.0.0/misc/donate_patreon.png differ diff --git a/public/img/v2.0.0/misc/donate_paypal.png b/public/img/v2.0.0/misc/donate_paypal.png new file mode 100644 index 00000000..626201a6 Binary files /dev/null and b/public/img/v2.0.0/misc/donate_paypal.png differ diff --git a/public/img/data-tables/sort_asc_disabled.png b/public/img/v2.0.0/misc/grid_40x40.png similarity index 92% rename from public/img/data-tables/sort_asc_disabled.png rename to public/img/v2.0.0/misc/grid_40x40.png index dcd7b7b8..794ce32e 100644 Binary files a/public/img/data-tables/sort_asc_disabled.png and b/public/img/v2.0.0/misc/grid_40x40.png differ diff --git a/public/img/v2.0.0/misc/logo.png b/public/img/v2.0.0/misc/logo.png new file mode 100644 index 00000000..3433792f Binary files /dev/null and b/public/img/v2.0.0/misc/logo.png differ diff --git a/public/img/v2.0.0/misc/logo_alpha.png b/public/img/v2.0.0/misc/logo_alpha.png new file mode 100644 index 00000000..6e6314b1 Binary files /dev/null and b/public/img/v2.0.0/misc/logo_alpha.png differ diff --git a/public/img/v2.0.0/misc/notification.png b/public/img/v2.0.0/misc/notification.png new file mode 100644 index 00000000..00284f48 Binary files /dev/null and b/public/img/v2.0.0/misc/notification.png differ diff --git a/public/img/v2.0.0/sso/data.png b/public/img/v2.0.0/sso/data.png new file mode 100644 index 00000000..7390c697 Binary files /dev/null and b/public/img/v2.0.0/sso/data.png differ diff --git a/public/img/v2.0.0/sso/eve_sso_login_buttons_large_black.png b/public/img/v2.0.0/sso/eve_sso_login_buttons_large_black.png new file mode 100644 index 00000000..cfb3a6f5 Binary files /dev/null and b/public/img/v2.0.0/sso/eve_sso_login_buttons_large_black.png differ diff --git a/public/img/v2.0.0/sso/eve_sso_login_buttons_large_black_hover.png b/public/img/v2.0.0/sso/eve_sso_login_buttons_large_black_hover.png new file mode 100644 index 00000000..de56dbb8 Binary files /dev/null and b/public/img/v2.0.0/sso/eve_sso_login_buttons_large_black_hover.png differ diff --git a/public/img/v2.0.0/sso/gameplay.png b/public/img/v2.0.0/sso/gameplay.png new file mode 100644 index 00000000..ecf3b600 Binary files /dev/null and b/public/img/v2.0.0/sso/gameplay.png differ diff --git a/public/img/v2.0.0/sso/signature.png b/public/img/v2.0.0/sso/signature.png new file mode 100644 index 00000000..fa5c758a Binary files /dev/null and b/public/img/v2.0.0/sso/signature.png differ diff --git a/public/img/v2.0.0/svg/bubble.svg b/public/img/v2.0.0/svg/bubble.svg new file mode 100644 index 00000000..0ae2e8b6 --- /dev/null +++ b/public/img/v2.0.0/svg/bubble.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/img/v2.0.0/svg/ccp_sso.svg b/public/img/v2.0.0/svg/ccp_sso.svg new file mode 100644 index 00000000..b4a537cc --- /dev/null +++ b/public/img/v2.0.0/svg/ccp_sso.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/img/v2.0.0/svg/logo_inline.svg b/public/img/v2.0.0/svg/logo_inline.svg new file mode 100644 index 00000000..af3c150e --- /dev/null +++ b/public/img/v2.0.0/svg/logo_inline.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/img/v2.0.0/svg/logo_simple.svg b/public/img/v2.0.0/svg/logo_simple.svg new file mode 100644 index 00000000..3fd9c082 --- /dev/null +++ b/public/img/v2.0.0/svg/logo_simple.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/public/img/v2.0.0/svg/swords.svg b/public/img/v2.0.0/svg/swords.svg new file mode 100644 index 00000000..9e1f2d7e --- /dev/null +++ b/public/img/v2.0.0/svg/swords.svg @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/public/js/v1.5.5/app.js b/public/js/v1.5.5/app.js deleted file mode 100644 index 3a9f2724..00000000 --- a/public/js/v1.5.5/app.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";var mainScriptPath=document.body.getAttribute("data-script"),jsBaseUrl=document.body.getAttribute("data-js-path");requirejs.config({baseUrl:"js",paths:{conf:"app/conf",dialog:"app/ui/dialog",layout:"app/ui/layout",module:"app/ui/module",templates:"../../templates",img:"../../img",login:"./app/login",mappage:"./app/mappage",setup:"./app/setup",admin:"./app/admin",notification:"./app/notification",jquery:"lib/jquery-3.4.1.min",bootstrap:"lib/bootstrap.min",text:"lib/requirejs/text",mustache:"lib/mustache.min",localForage:"lib/localforage.min",velocity:"lib/velocity.min",velocityUI:"lib/velocity.ui.min",slidebars:"lib/slidebars",jsPlumb:"lib/jsplumb",farahey:"lib/farahey",easyTimer:"lib/easytimer.min",customScrollbar:"lib/jquery.mCustomScrollbar.min",mousewheel:"lib/jquery.mousewheel.min",xEditable:"lib/bootstrap-editable.min",morris:"lib/morris.min",raphael:"lib/raphael.min",bootbox:"lib/bootbox.min",easyPieChart:"lib/jquery.easypiechart.min",peityInlineChart:"lib/jquery.peity.min",hoverIntent:"lib/jquery.hoverIntent.min",select2:"lib/select2.min",validator:"lib/validator.min",lazylinepainter:"lib/jquery.lazylinepainter-1.5.1.min",blueImpGallery:"lib/blueimp-gallery",blueImpGalleryHelper:"lib/blueimp-helper",blueImpGalleryBootstrap:"lib/bootstrap-image-gallery",bootstrapConfirmation:"lib/bootstrap-confirmation.min",bootstrapToggle:"lib/bootstrap-toggle.min",lazyload:"lib/jquery.lazyload.min",sortable:"lib/sortable.min","summernote.loader":"./app/summernote.loader",summernote:"lib/summernote/summernote.min",easePack:"lib/EasePack.min",tweenLite:"lib/TweenLite.min","datatables.loader":"./app/datatables.loader","datatables.net":"lib/datatables/DataTables-1.10.18/js/jquery.dataTables.min","datatables.net-buttons":"lib/datatables/Buttons-1.5.6/js/dataTables.buttons.min","datatables.net-buttons-html":"lib/datatables/Buttons-1.5.6/js/buttons.html5.min","datatables.net-responsive":"lib/datatables/Responsive-2.2.2/js/dataTables.responsive.min","datatables.net-select":"lib/datatables/Select-1.3.0/js/dataTables.select.min","datatables.plugins.render.ellipsis":"lib/datatables/plugins/render/ellipsis",pnotify:"lib/pnotify/pnotify","pnotify.buttons":"lib/pnotify/pnotify.buttons","pnotify.confirm":"lib/pnotify/pnotify.confirm","pnotify.nonblock":"lib/pnotify/pnotify.nonblock","pnotify.desktop":"lib/pnotify/pnotify.desktop","pnotify.history":"lib/pnotify/pnotify.history","pnotify.callbacks":"lib/pnotify/pnotify.callbacks","pnotify.reference":"lib/pnotify/pnotify.reference"},shim:{bootstrap:{deps:["jquery"]},farahey:{deps:["jsPlumb"]},velocity:{deps:["jquery"]},velocityUI:{deps:["velocity"]},slidebars:{deps:["jquery"]},customScrollbar:{deps:["jquery","mousewheel"]},"datatables.loader":{deps:["jquery"]},"datatables.net":{deps:["jquery"]},"datatables.net-buttons":{deps:["datatables.net"]},"datatables.net-buttons-html":{deps:["datatables.net-buttons"]},"datatables.net-responsive":{deps:["datatables.net"]},"datatables.net-select":{deps:["datatables.net"]},"datatables.plugins.render.ellipsis":{deps:["datatables.net"]},xEditable:{deps:["bootstrap"]},bootbox:{deps:["jquery","bootstrap"],exports:"bootbox"},morris:{deps:["jquery","raphael"],exports:"Morris",init:function(e,t){window.Raphael=t}},pnotify:{deps:["jquery"]},easyPieChart:{deps:["jquery"]},peityInlineChart:{deps:["jquery"]},hoverIntent:{deps:["jquery"]},select2:{deps:["jquery","mousewheel"],exports:"Select2"},validator:{deps:["jquery","bootstrap"]},lazylinepainter:{deps:["jquery","bootstrap"]},blueImpGallery:{deps:["jquery"]},bootstrapConfirmation:{deps:["bootstrap"]},bootstrapToggle:{deps:["jquery"]},lazyload:{deps:["jquery"]},summernote:{deps:["jquery"]}}}),require.config({baseUrl:jsBaseUrl}),requirejs([mainScriptPath]); -//# sourceMappingURL=app.js.map diff --git a/public/js/v1.5.5/app.js.br b/public/js/v1.5.5/app.js.br deleted file mode 100644 index 9873760b..00000000 Binary files a/public/js/v1.5.5/app.js.br and /dev/null differ diff --git a/public/js/v1.5.5/app.js.map b/public/js/v1.5.5/app.js.map deleted file mode 100644 index 6da4d3a5..00000000 --- a/public/js/v1.5.5/app.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["app.js"],"names":["mainScriptPath","document","body","getAttribute","jsBaseUrl","requirejs","config","baseUrl","paths","conf","dialog","layout","module","templates","img","login","mappage","setup","admin","notification","jquery","bootstrap","text","mustache","localForage","velocity","velocityUI","slidebars","jsPlumb","farahey","easyTimer","customScrollbar","mousewheel","xEditable","morris","raphael","bootbox","easyPieChart","peityInlineChart","hoverIntent","select2","validator","lazylinepainter","blueImpGallery","blueImpGalleryHelper","blueImpGalleryBootstrap","bootstrapConfirmation","bootstrapToggle","lazyload","sortable","summernote.loader","summernote","easePack","tweenLite","datatables.loader","datatables.net","datatables.net-buttons","datatables.net-buttons-html","datatables.net-responsive","datatables.net-select","datatables.plugins.render.ellipsis","pnotify","pnotify.buttons","pnotify.confirm","pnotify.nonblock","pnotify.desktop","pnotify.history","pnotify.callbacks","pnotify.reference","shim","deps","exports","init","$","Raphael","window","require"],"mappings":"AAAA,aAGA,IAAIA,eAAiBC,SAASC,KAAKC,aAAa,eAI5CC,UAAYH,SAASC,KAAKC,aAAa,gBAG3CE,UAAUC,QACNC,QAAS,KAETC,OACIC,KAAM,WACNC,OAAQ,gBACRC,OAAQ,gBACRC,OAAQ,gBAERC,UAAW,kBACXC,IAAK,YAGLC,MAAO,cACPC,QAAS,gBACTC,MAAO,cACPC,MAAO,cACPC,aAAc,qBAEdC,OAAQ,uBACRC,UAAW,oBACXC,KAAM,qBACNC,SAAU,mBACVC,YAAa,sBACbC,SAAU,mBACVC,WAAY,sBACZC,UAAW,gBACXC,QAAS,cACTC,QAAS,cACTC,UAAW,oBACXC,gBAAiB,kCACjBC,WAAY,4BACZC,UAAW,6BACXC,OAAQ,iBACRC,QAAS,kBACTC,QAAS,kBACTC,aAAc,8BACdC,iBAAkB,uBAClBC,YAAa,6BACbC,QAAS,kBACTC,UAAW,oBACXC,gBAAiB,uCACjBC,eAAgB,sBAChBC,qBAAsB,qBACtBC,wBAAyB,8BACzBC,sBAAuB,iCACvBC,gBAAiB,2BACjBC,SAAU,0BACVC,SAAU,mBAEVC,oBAAqB,0BACrBC,WAAc,gCAGdC,SAAU,mBACVC,UAAW,oBAGXC,oBAAqB,0BACrBC,iBAAkB,6DAClBC,yBAA0B,yDAC1BC,8BAA+B,oDAC/BC,4BAA6B,+DAC7BC,wBAAyB,uDACzBC,qCAAsC,yCAGtCC,QAAS,sBACTC,kBAAmB,8BACnBC,kBAAmB,8BACnBC,mBAAoB,+BACpBC,kBAAmB,8BACnBC,kBAAmB,8BACnBC,oBAAqB,gCACrBC,oBAAqB,iCAEzBC,MACIhD,WACIiD,MAAO,WAEXzC,SACIyC,MAAO,YAEX7C,UACI6C,MAAO,WAEX5C,YACI4C,MAAO,aAEX3C,WACI2C,MAAO,WAEXvC,iBACIuC,MAAO,SAAU,eAErBhB,qBACIgB,MAAO,WAEXf,kBACIe,MAAO,WAEXd,0BACIc,MAAO,mBAEXb,+BACIa,MAAO,2BAEXZ,6BACIY,MAAO,mBAEXX,yBACIW,MAAO,mBAEXV,sCACIU,MAAO,mBAEXrC,WACIqC,MAAO,cAEXlC,SACIkC,MAAO,SAAU,aACjBC,QAAS,WAEbrC,QACIoC,MAAO,SAAU,WACjBC,QAAS,SACTC,KAAM,SAAUC,EAAGC,GACfC,OAAOD,QAAUA,IAGzBb,SACIS,MAAO,WAEXjC,cACIiC,MAAO,WAEXhC,kBACIgC,MAAO,WAEX/B,aACI+B,MAAO,WAEX9B,SACI8B,MAAO,SAAU,cACjBC,QAAS,WAEb9B,WACI6B,MAAO,SAAU,cAErB5B,iBACI4B,MAAO,SAAU,cAErB3B,gBACI2B,MAAO,WAEXxB,uBACIwB,MAAO,cAEXvB,iBACIuB,MAAO,WAEXtB,UACIsB,MAAO,WAEXnB,YACImB,MAAO,cAQnBM,QAAQtE,QACJC,QAASH,YAIbC,WAAYL","file":"app.js","sourceRoot":"/js"} \ No newline at end of file diff --git a/public/js/v1.5.5/app/admin.js b/public/js/v1.5.5/app/admin.js deleted file mode 100644 index d8d4848e..00000000 --- a/public/js/v1.5.5/app/admin.js +++ /dev/null @@ -1,2 +0,0 @@ -if(function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,o=Object.getPrototypeOf,a=n.slice,i=n.concat,s=n.push,l=n.indexOf,c={},u=c.toString,d=c.hasOwnProperty,f=d.toString,p=f.call(Object),h={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},g=function(e){return null!=e&&e===e.window},v={type:!0,src:!0,nonce:!0,noModule:!0};function y(e,t,n){var o,a,i=(n=n||r).createElement("script");if(i.text=e,t)for(o in v)(a=t[o]||t.getAttribute&&t.getAttribute(o))&&i.setAttribute(o,a);n.head.appendChild(i).parentNode.removeChild(i)}function b(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[u.call(e)]||"object":typeof e}var w="3.4.1",x=function(e,t){return new x.fn.init(e,t)},C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function S(e){var t=!!e&&"length"in e&&e.length,n=b(e);return!m(e)&&!g(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+N+")"+N+"*"),W=new RegExp(N+"|>"),V=new RegExp(M),X=new RegExp("^"+$+"$"),Y={ID:new RegExp("^#("+$+")"),CLASS:new RegExp("^\\.("+$+")"),TAG:new RegExp("^("+$+"|[*])"),ATTR:new RegExp("^"+B),PSEUDO:new RegExp("^"+M),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+N+"*(even|odd|(([+-]|)(\\d*)n|)"+N+"*(?:([+-]|)"+N+"*(\\d+)|))"+N+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+N+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+N+"*((?:-\\d)?\\d*)"+N+"*\\)|)(?=[^-]|$)","i")},G=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+N+"?|("+N+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,oe=function(e,t){return t?"\0"===e?"�":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},ae=function(){f()},ie=we(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{P.apply(E=j.call(x.childNodes),x.childNodes),E[x.childNodes.length].nodeType}catch(t){P={apply:E.length?function(e,t){F.apply(e,j.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}function se(e,t,r,o){var a,s,c,u,d,h,v,y=t&&t.ownerDocument,C=t?t.nodeType:9;if(r=r||[],"string"!=typeof e||!e||1!==C&&9!==C&&11!==C)return r;if(!o&&((t?t.ownerDocument||t:x)!==p&&f(t),t=t||p,m)){if(11!==C&&(d=J.exec(e)))if(a=d[1]){if(9===C){if(!(c=t.getElementById(a)))return r;if(c.id===a)return r.push(c),r}else if(y&&(c=y.getElementById(a))&&b(t,c)&&c.id===a)return r.push(c),r}else{if(d[2])return P.apply(r,t.getElementsByTagName(e)),r;if((a=d[3])&&n.getElementsByClassName&&t.getElementsByClassName)return P.apply(r,t.getElementsByClassName(a)),r}if(n.qsa&&!I[e+" "]&&(!g||!g.test(e))&&(1!==C||"object"!==t.nodeName.toLowerCase())){if(v=e,y=t,1===C&&W.test(e)){for((u=t.getAttribute("id"))?u=u.replace(re,oe):t.setAttribute("id",u=w),s=(h=i(e)).length;s--;)h[s]="#"+u+" "+be(h[s]);v=h.join(","),y=ee.test(e)&&ve(t.parentNode)||t}try{return P.apply(r,y.querySelectorAll(v)),r}catch(t){I(e,!0)}finally{u===w&&t.removeAttribute("id")}}}return l(e.replace(q,"$1"),t,r,o)}function le(){var e=[];return function t(n,o){return e.push(n+" ")>r.cacheLength&&delete t[e.shift()],t[n+" "]=o}}function ce(e){return e[w]=!0,e}function ue(e){var t=p.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function de(e,t){for(var n=e.split("|"),o=n.length;o--;)r.attrHandle[n[o]]=t}function fe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function pe(e){return function(t){return"input"===t.nodeName.toLowerCase()&&t.type===e}}function he(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function me(e){return function(t){return"form"in t?t.parentNode&&!1===t.disabled?"label"in t?"label"in t.parentNode?t.parentNode.disabled===e:t.disabled===e:t.isDisabled===e||t.isDisabled!==!e&&ie(t)===e:t.disabled===e:"label"in t&&t.disabled===e}}function ge(e){return ce(function(t){return t=+t,ce(function(n,r){for(var o,a=e([],n.length,t),i=a.length;i--;)n[o=a[i]]&&(n[o]=!(r[o]=n[o]))})})}function ve(e){return e&&void 0!==e.getElementsByTagName&&e}for(t in n=se.support={},a=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!G.test(t||n&&n.nodeName||"HTML")},f=se.setDocument=function(e){var t,o,i=e?e.ownerDocument||e:x;return i!==p&&9===i.nodeType&&i.documentElement&&(h=(p=i).documentElement,m=!a(p),x!==p&&(o=p.defaultView)&&o.top!==o&&(o.addEventListener?o.addEventListener("unload",ae,!1):o.attachEvent&&o.attachEvent("onunload",ae)),n.attributes=ue(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ue(function(e){return e.appendChild(p.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=K.test(p.getElementsByClassName),n.getById=ue(function(e){return h.appendChild(e).id=w,!p.getElementsByName||!p.getElementsByName(w).length}),n.getById?(r.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},r.find.ID=function(e,t){if(void 0!==t.getElementById&&m){var n=t.getElementById(e);return n?[n]:[]}}):(r.filter.ID=function(e){var t=e.replace(te,ne);return function(e){var n=void 0!==e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}},r.find.ID=function(e,t){if(void 0!==t.getElementById&&m){var n,r,o,a=t.getElementById(e);if(a){if((n=a.getAttributeNode("id"))&&n.value===e)return[a];for(o=t.getElementsByName(e),r=0;a=o[r++];)if((n=a.getAttributeNode("id"))&&n.value===e)return[a]}return[]}}),r.find.TAG=n.getElementsByTagName?function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):n.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],o=0,a=t.getElementsByTagName(e);if("*"===e){for(;n=a[o++];)1===n.nodeType&&r.push(n);return r}return a},r.find.CLASS=n.getElementsByClassName&&function(e,t){if(void 0!==t.getElementsByClassName&&m)return t.getElementsByClassName(e)},v=[],g=[],(n.qsa=K.test(p.querySelectorAll))&&(ue(function(e){h.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&g.push("[*^$]="+N+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||g.push("\\["+N+"*(?:value|"+L+")"),e.querySelectorAll("[id~="+w+"-]").length||g.push("~="),e.querySelectorAll(":checked").length||g.push(":checked"),e.querySelectorAll("a#"+w+"+*").length||g.push(".#.+[+~]")}),ue(function(e){e.innerHTML="";var t=p.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&g.push("name"+N+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&g.push(":enabled",":disabled"),h.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(n.matchesSelector=K.test(y=h.matches||h.webkitMatchesSelector||h.mozMatchesSelector||h.oMatchesSelector||h.msMatchesSelector))&&ue(function(e){n.disconnectedMatch=y.call(e,"*"),y.call(e,"[s!='']:x"),v.push("!=",M)}),g=g.length&&new RegExp(g.join("|")),v=v.length&&new RegExp(v.join("|")),t=K.test(h.compareDocumentPosition),b=t||K.test(h.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},k=t?function(e,t){if(e===t)return d=!0,0;var r=!e.compareDocumentPosition-!t.compareDocumentPosition;return r||(1&(r=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!n.sortDetached&&t.compareDocumentPosition(e)===r?e===p||e.ownerDocument===x&&b(x,e)?-1:t===p||t.ownerDocument===x&&b(x,t)?1:u?R(u,e)-R(u,t):0:4&r?-1:1)}:function(e,t){if(e===t)return d=!0,0;var n,r=0,o=e.parentNode,a=t.parentNode,i=[e],s=[t];if(!o||!a)return e===p?-1:t===p?1:o?-1:a?1:u?R(u,e)-R(u,t):0;if(o===a)return fe(e,t);for(n=e;n=n.parentNode;)i.unshift(n);for(n=t;n=n.parentNode;)s.unshift(n);for(;i[r]===s[r];)r++;return r?fe(i[r],s[r]):i[r]===x?-1:s[r]===x?1:0}),p},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&f(e),n.matchesSelector&&m&&!I[t+" "]&&(!v||!v.test(t))&&(!g||!g.test(t)))try{var r=y.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(e){I(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return Y.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&V.test(n)&&(t=i(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=_[e+" "];return t||(t=new RegExp("(^|"+N+")"+e+"("+N+"|$)"))&&_(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var o=se.attr(r,e);return null==o?"!="===t:!t||(o+="","="===t?o===n:"!="===t?o!==n:"^="===t?n&&0===o.indexOf(n):"*="===t?n&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function E(e,t,n){return m(t)?x.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?x.grep(e,function(e){return e===t!==n}):"string"!=typeof t?x.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(x.fn.init=function(e,t,n){var o,a;if(!e)return this;if(n=n||O,"string"==typeof e){if(!(o="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:F.exec(e))||!o[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(o[1]){if(t=t instanceof x?t[0]:t,x.merge(this,x.parseHTML(o[1],t&&t.nodeType?t.ownerDocument||t:r,!0)),A.test(o[1])&&x.isPlainObject(t))for(o in t)m(this[o])?this[o](t[o]):this.attr(o,t[o]);return this}return(a=r.getElementById(o[2]))&&(this[0]=a,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(x):x.makeArray(e,this)}).prototype=x.fn,O=x(r);var P=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function R(e,t){for(;(e=e[t])&&1!==e.nodeType;);return e}x.fn.extend({has:function(e){var t=x(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,me={option:[1,""],thead:[1,"","
              "],col:[2,"","
              "],tr:[2,"","
              "],td:[3,"","
              "],_default:[0,"",""]};function ge(e,t){var n;return n=void 0!==e.getElementsByTagName?e.getElementsByTagName(t||"*"):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&k(e,t)?x.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;nx",h.noCloneChecked=!!ye.cloneNode(!0).lastChild.defaultValue;var Ce=/^key/,Se=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,_e=/^([^.]*)(?:\.(.+)|)/;function Te(){return!0}function De(){return!1}function Ie(e,t){return e===function(){try{return r.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,o,a){var i,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],a);return e}if(null==r&&null==o?(o=n,r=n=void 0):null==o&&("string"==typeof n?(o=r,r=void 0):(o=r,r=n,n=void 0)),!1===o)o=De;else if(!o)return e;return 1===a&&(i=o,(o=function(e){return x().off(e),i.apply(this,arguments)}).guid=i.guid||(i.guid=x.guid++)),e.each(function(){x.event.add(this,t,o,r,n)})}function Ae(e,t,n){n?(Q.set(e,t,!1),x.event.add(e,t,{namespace:!1,handler:function(e){var r,o,i=Q.get(this,t);if(1&e.isTrigger&&this[t]){if(i.length)(x.event.special[t]||{}).delegateType&&e.stopPropagation();else if(i=a.call(arguments),Q.set(this,t,i),r=n(this,t),this[t](),i!==(o=Q.get(this,t))||r?Q.set(this,t,!1):o={},i!==o)return e.stopImmediatePropagation(),e.preventDefault(),o.value}else i.length&&(Q.set(this,t,{value:x.event.trigger(x.extend(i[0],x.Event.prototype),i.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,t)&&x.event.add(e,t,Te)}x.event={global:{},add:function(e,t,n,r,o){var a,i,s,l,c,u,d,f,p,h,m,g=Q.get(e);if(g)for(n.handler&&(n=(a=n).handler,o=a.selector),o&&x.find.matchesSelector(oe,o),n.guid||(n.guid=x.guid++),(l=g.events)||(l=g.events={}),(i=g.handle)||(i=g.handle=function(t){return void 0!==x&&x.event.triggered!==t.type?x.event.dispatch.apply(e,arguments):void 0}),c=(t=(t||"").match(L)||[""]).length;c--;)p=m=(s=_e.exec(t[c])||[])[1],h=(s[2]||"").split(".").sort(),p&&(d=x.event.special[p]||{},p=(o?d.delegateType:d.bindType)||p,d=x.event.special[p]||{},u=x.extend({type:p,origType:m,data:r,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:h.join(".")},a),(f=l[p])||((f=l[p]=[]).delegateCount=0,d.setup&&!1!==d.setup.call(e,r,h,i)||e.addEventListener&&e.addEventListener(p,i)),d.add&&(d.add.call(e,u),u.handler.guid||(u.handler.guid=n.guid)),o?f.splice(f.delegateCount++,0,u):f.push(u),x.event.global[p]=!0)},remove:function(e,t,n,r,o){var a,i,s,l,c,u,d,f,p,h,m,g=Q.hasData(e)&&Q.get(e);if(g&&(l=g.events)){for(c=(t=(t||"").match(L)||[""]).length;c--;)if(p=m=(s=_e.exec(t[c])||[])[1],h=(s[2]||"").split(".").sort(),p){for(d=x.event.special[p]||{},f=l[p=(r?d.delegateType:d.bindType)||p]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=a=f.length;a--;)u=f[a],!o&&m!==u.origType||n&&n.guid!==u.guid||s&&!s.test(u.namespace)||r&&r!==u.selector&&("**"!==r||!u.selector)||(f.splice(a,1),u.selector&&f.delegateCount--,d.remove&&d.remove.call(e,u));i&&!f.length&&(d.teardown&&!1!==d.teardown.call(e,h,g.handle)||x.removeEvent(e,p,g.handle),delete l[p])}else for(p in l)x.event.remove(e,p+t[c],n,r,!0);x.isEmptyObject(l)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,o,a,i,s=x.event.fix(e),l=new Array(arguments.length),c=(Q.get(this,"events")||{})[s.type]||[],u=x.event.special[s.type]||{};for(l[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,Oe=/\s*$/g;function je(e,t){return k(e,"table")&&k(11!==t.nodeType?t:t.firstChild,"tr")&&x(e).children("tbody")[0]||e}function Re(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Le(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Ne(e,t){var n,r,o,a,i,s,l,c;if(1===t.nodeType){if(Q.hasData(e)&&(a=Q.access(e),i=Q.set(t,a),c=a.events))for(o in delete i.handle,i.events={},c)for(n=0,r=c[o].length;n")},clone:function(e,t,n){var r,o,a,i,s,l,c,u=e.cloneNode(!0),d=ae(e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(i=ge(u),r=0,o=(a=ge(e)).length;r").attr(e.scriptAttrs||{}).prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&a("error"===e.type?404:200,e.type)}),r.head.appendChild(t[0])},abort:function(){n&&n()}}});var Xt,Yt=[],Gt=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Yt.pop()||x.expando+"_"+Tt++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(t,n,r){var o,a,i,s=!1!==t.jsonp&&(Gt.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Gt.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return o=t.jsonpCallback=m(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(Gt,"$1"+o):!1!==t.jsonp&&(t.url+=(Dt.test(t.url)?"&":"?")+t.jsonp+"="+o),t.converters["script json"]=function(){return i||x.error(o+" was not called"),i[0]},t.dataTypes[0]="json",a=e[o],e[o]=function(){i=arguments},r.always(function(){void 0===a?x(e).removeProp(o):e[o]=a,t[o]&&(t.jsonpCallback=n.jsonpCallback,Yt.push(o)),i&&m(a)&&a(i[0]),i=a=void 0}),"script"}),h.createHTMLDocument=((Xt=r.implementation.createHTMLDocument("").body).innerHTML="
              ",2===Xt.childNodes.length),x.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(h.createHTMLDocument?((o=(t=r.implementation.createHTMLDocument("")).createElement("base")).href=r.location.href,t.head.appendChild(o)):t=r),i=!n&&[],(a=A.exec(e))?[t.createElement(a[1])]:(a=xe([e],t,i),i&&i.length&&x(i).remove(),x.merge([],a.childNodes)));var o,a,i},x.fn.load=function(e,t,n){var r,o,a,i=this,s=e.indexOf(" ");return-1").append(x.parseHTML(e)).find(r):e)}).always(n&&function(e,t){i.each(function(){n.apply(this,a||[e.responseText,t,e])})}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.expr.pseudos.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length},x.offset={setOffset:function(e,t,n){var r,o,a,i,s,l,c=x.css(e,"position"),u=x(e),d={};"static"===c&&(e.style.position="relative"),s=u.offset(),a=x.css(e,"top"),l=x.css(e,"left"),("absolute"===c||"fixed"===c)&&-1<(a+l).indexOf("auto")?(i=(r=u.position()).top,o=r.left):(i=parseFloat(a)||0,o=parseFloat(l)||0),m(t)&&(t=t.call(e,n,x.extend({},s))),null!=t.top&&(d.top=t.top-s.top+i),null!=t.left&&(d.left=t.left-s.left+o),"using"in t?t.using.call(e,d):u.css(d)}},x.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){x.offset.setOffset(this,e,t)});var t,n,r=this[0];return r?r.getClientRects().length?(t=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],o={top:0,left:0};if("fixed"===x.css(r,"position"))t=r.getBoundingClientRect();else{for(t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===x.css(e,"position");)e=e.parentNode;e&&e!==r&&1===e.nodeType&&((o=x(e).offset()).top+=x.css(e,"borderTopWidth",!0),o.left+=x.css(e,"borderLeftWidth",!0))}return{top:t.top-o.top-x.css(r,"marginTop",!0),left:t.left-o.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===x.css(e,"position");)e=e.offsetParent;return e||oe})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;x.fn[e]=function(r){return U(this,function(e,r,o){var a;if(g(e)?a=e:9===e.nodeType&&(a=e.defaultView),void 0===o)return a?a[t]:e[r];a?a.scrollTo(n?a.pageXOffset:o,n?o:a.pageYOffset):e[r]=o},e,r,arguments.length)}}),x.each(["top","left"],function(e,t){x.cssHooks[t]=ze(h.pixelPosition,function(e,n){if(n)return n=Ue(e,t),Me.test(n)?x(e).position()[t]+"px":n})}),x.each({Height:"height",Width:"width"},function(e,t){x.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){x.fn[r]=function(o,a){var i=arguments.length&&(n||"boolean"!=typeof o),s=n||(!0===o||!0===a?"margin":"border");return U(this,function(t,n,o){var a;return g(t)?0===r.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(a=t.documentElement,Math.max(t.body["scroll"+e],a["scroll"+e],t.body["offset"+e],a["offset"+e],a["client"+e])):void 0===o?x.css(t,n,s):x.style(t,n,o,s)},t,i?o:void 0,i)}})}),x.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return 0{"use strict";let e={1:"E004 - C1",2:"L005 - C2",3:"Z006 - C3",4:"M001 - C4",5:"C008 - C5",6:"G008 - C6",7:"Q003 - 0.0",8:"A009 - C13"};return{path:{img:"/public/img/",api:"/api/rest",getCaptcha:"/api/user/getCaptcha",getServerStatus:"/api/user/getEveServerStatus",getCookieCharacterData:"/api/user/getCookieCharacter",logIn:"/api/user/logIn",logout:"/api/user/logout",openIngameWindow:"/api/user/openIngameWindow",saveUserConfig:"/api/user/saveAccount",deleteAccount:"/api/user/deleteAccount",searchAccess:"/api/access/search",initData:"/api/map/initData",getAccessData:"/api/map/getAccessData",updateMapData:"/api/map/updateData",updateUserData:"/api/map/updateUserData",updateUnloadData:"/api/map/updateUnloadData",saveMap:"/api/map/save",deleteMap:"/api/map/delete",importMap:"/api/map/import",getMapConnectionData:"/api/map/getConnectionData",getMapLogData:"/api/map/getLogData",getSystemGraphData:"/api/system/graphData",setDestination:"/api/system/setDestination",pokeRally:"/api/system/pokeRally",searchRoute:"/api/route/search",getStatisticsData:"/api/statistic/getData",searchUniverseData:"/api/universe/search",searchUniverseSystemData:"/api/universe/systems",getConstellationData:"/api/universe/constellationData",gitHubReleases:"/api/github/releases"},breakpoints:[{name:"screen-xl",width:1/0},{name:"screen-l",width:1600},{name:"screen-m",width:1200},{name:"screen-d",width:1e3},{name:"screen-s",width:780},{name:"screen-xs",width:480}],animationSpeed:{splashOverlay:300,headerLink:100,mapOverlay:200,mapOverlayLocal:180,mapMoveSystem:180,mapDeleteSystem:200,mapModule:200,dialogEvents:180},syncStatus:{type:"ajax",webSocket:{status:"closed",class:"txt-color-danger",timestamp:void 0},sharedWorker:{status:"offline",class:"txt-color-danger",timestamp:void 0},ajax:{status:"enabled",class:"txt-color-success",timestamp:void 0}},performanceLogging:{keyServerMapData:"UPDATE_SERVER_MAP",keyClientMapData:"UPDATE_CLIENT_MAP",keyServerUserData:"UPDATE_SERVER_USER_DATA",keyClientUserData:"UPDATE_CLIENT_USER_DATA"},mapIcons:[{class:"fa-desktop",label:"desktop",unicode:""},{class:"fa-space-shuttle",label:"space shuttle",unicode:""},{class:"fa-anchor",label:"anchor",unicode:""},{class:"fa-satellite",label:"satellite",unicode:""},{class:"fa-skull-crossbones",label:"skull crossbones",unicode:""},{class:"fa-fire",label:"fire",unicode:""},{class:"fa-bookmark",label:"bookmark",unicode:""},{class:"fa-cube",label:"cube",unicode:""},{class:"fa-star",label:"star",unicode:""},{class:"fa-hat-wizard",label:"hat wizard",unicode:""},{class:"fa-plane",label:"plane",unicode:""},{class:"fa-globe",label:"globe",unicode:""},{class:"fa-rocket",label:"rocket",unicode:""},{class:"fa-life-ring",label:"life ring",unicode:""},{class:"fa-heart",label:"heart",unicode:""},{class:"fa-poop",label:"poop",unicode:""}],classes:{logTypes:{info:{class:"pf-log-info",label:"info"},warning:{class:"pf-log-warning",label:"warning"},error:{class:"pf-log-error",label:"error"}},systemEffects:{effect:{class:"pf-system-effect",name:"no effect"},magnetar:{class:"pf-system-effect-magnetar",name:"magnetar"},redGiant:{class:"pf-system-effect-redgiant",name:"red giant"},pulsar:{class:"pf-system-effect-pulsar",name:"pulsar"},wolfRayet:{class:"pf-system-effect-wolfrayet",name:"wolf rayet"},cataclysmic:{class:"pf-system-effect-cataclysmic",name:"cataclysmic"},blackHole:{class:"pf-system-effect-blackhole",name:"black hole"}},systemSecurity:{security:{class:"pf-system-sec"},A:{class:"pf-system-sec-abyssal"},SH:{class:"pf-system-sec-unknown"},H:{class:"pf-system-sec-highSec"},L:{class:"pf-system-sec-lowSec"},"0.0":{class:"pf-system-sec-nullSec"},C1:{class:"pf-system-sec-low"},C2:{class:"pf-system-sec-low"},C3:{class:"pf-system-sec-mid"},C4:{class:"pf-system-sec-mid"},C5:{class:"pf-system-sec-high"},C6:{class:"pf-system-sec-high"},C12:{class:"pf-system-sec-special"},C14:{class:"pf-system-sec-drifter"},C15:{class:"pf-system-sec-drifter"},C16:{class:"pf-system-sec-drifter"},C17:{class:"pf-system-sec-drifter"},C18:{class:"pf-system-sec-drifter"}},trueSec:{"0.0":{class:"pf-system-security-0-0"},.1:{class:"pf-system-security-0-1"},.2:{class:"pf-system-security-0-2"},.3:{class:"pf-system-security-0-3"},.4:{class:"pf-system-security-0-4"},.5:{class:"pf-system-security-0-5"},.6:{class:"pf-system-security-0-6"},.7:{class:"pf-system-security-0-7"},.8:{class:"pf-system-security-0-8"},.9:{class:"pf-system-security-0-9"},"1.0":{class:"pf-system-security-1-0"}},systemInfo:{rally:{class:"pf-system-info-rally",label:"rally point"}},planets:{barren:{class:"pf-planet-barren"},gas:{class:"pf-planet-gas"},ice:{class:"pf-planet-ice"},lava:{class:"pf-planet-lava"},oceanic:{class:"pf-planet-oceanic"},plasma:{class:"pf-planet-plasma"},shattered:{class:"pf-planet-shattered"},storm:{class:"pf-planet-storm"},temperate:{class:"pf-planet-temperate"}},pieChart:{class:"pf-pie-chart",pieChartMapCounterClass:"pf-pie-chart-map-timer"}},defaultMapScope:"wh",endpointTypes:{bubble:{cssClass:"pf-map-endpoint-bubble"}},connectionTypes:{abyssal:{cssClass:"pf-map-connection-abyssal",paintStyle:{dashstyle:"0.5 2"}},jumpbridge:{cssClass:"pf-map-connection-jumpbridge",paintStyle:{dashstyle:"4 2 1 2"}},stargate:{cssClass:"pf-map-connection-stargate",paintStyle:{dashstyle:"0"}},wh_eol:{cssClass:"pf-map-connection-wh-eol"},wh_fresh:{cssClass:"pf-map-connection-wh-fresh"},wh_reduced:{cssClass:"pf-map-connection-wh-reduced"},wh_critical:{cssClass:"pf-map-connection-wh-critical"},wh_jump_mass_s:{cssClass:"pf-map-connection-wh-size-s",paintStyle:{dashstyle:"0.5 1",strokeWidth:3},overlays:[["Label",{label:'',cssClass:["pf-map-component-overlay","small","text-center"].join(" "),location:.65,id:"pf-map-connection-jump-mass-overlay"}]]},wh_jump_mass_m:{cssClass:"pf-map-connection-wh-size-m",paintStyle:{dashstyle:"3 1"},overlays:[["Label",{label:'',cssClass:["pf-map-component-overlay","small","text-center"].join(" "),location:.65,id:"pf-map-connection-jump-mass-overlay"}]]},wh_jump_mass_l:{cssClass:"pf-map-connection-wh-size-l",overlays:[["Label",{label:'',cssClass:["pf-map-component-overlay","small","text-center"].join(" "),location:.65,id:"pf-map-connection-jump-mass-overlay"}]]},wh_jump_mass_xl:{cssClass:"pf-map-connection-wh-size-xl",paintStyle:{strokeWidth:6},overlays:[["Label",{label:'',cssClass:["pf-map-component-overlay","small","text-center"].join(" "),location:.65,id:"pf-map-connection-jump-mass-overlay"}]]},preserve_mass:{cssClass:"pf-map-connection-preserve-mass",overlays:[["Label",{label:' save mass',cssClass:["pf-map-component-overlay","mass"].join(" "),location:.35}]]},info_signature:{overlays:[["Arrow",{id:"pf-map-connection-arrow-overlay",cssClass:"pf-map-connection-arrow-overlay",width:12,length:15,direction:1,foldback:.8,location:.5}]]},state_active:{cssClass:"pf-map-connection-active"},state_process:{cssClass:"pf-map-connection-process",overlays:[["Label",{label:'',cssClass:["pf-map-connection-state-overlay"].join(" "),location:.5}]]}},wormholeSizes:{wh_jump_mass_xl:{jumpMassMin:1e9,type:"wh_jump_mass_xl",class:"pf-jump-mass-xl",label:"XL",text:"capital ships"},wh_jump_mass_l:{jumpMassMin:3e8,type:"wh_jump_mass_l",class:"pf-jump-mass-l",label:"L",text:"larger ships"},wh_jump_mass_m:{jumpMassMin:2e7,type:"wh_jump_mass_m",class:"pf-jump-mass-m",label:"M",text:"medium ships"},wh_jump_mass_s:{jumpMassMin:1e3,type:"wh_jump_mass_s",class:"pf-jump-mass-s",label:"S",text:"smallest ships"}},signatureGroups:{1:{name:"(combat site|kampfgebiet|site de combat|Боевой район|战斗地点)",label:"Combat"},2:{name:"(relic site|reliktgebiet|site de reliques|Археологический район|遗迹地点)",label:"Relic"},3:{name:"(data site|datengebiet|site de données|Информационный район|数据地点)",label:"Data"},4:{name:"(gas site|gasgebiet|site de collecte de gaz|Газовый район|气云地点)",label:"Gas"},5:{name:"(wormhole|wurmloch|trou de ver|Червоточина|虫洞)",label:"Wormhole"},6:{name:"(ore site|mineraliengebiet|site de minerai|Астероидный район|矿石地点)",label:"Ore"},7:{name:"(ghost|Призрачный)",label:"Ghost"}},frigateWormholes:{1:e,2:e,3:e,4:e,5:e,6:e,13:e,30:e,31:e,32:e},drifterWormholes:{1:"S877 - C14 Sentinel",2:"B735 - C15 Barbican",3:"V928 - C16 Vidette",4:"C414 - C17 Conflux",5:"R259 - C18 Redoubt"},incomingWormholes:{1:"K162 - C1/2/3 (unknown)",2:"K162 - C4/5 (dangerous)",3:"K162 - C6 (deadly)",4:"K162 - H",5:"K162 - L",6:"K162 - 0.0",7:"K162 - C12 Thera"}}}),define("app/lib/prototypes",[],()=>{"use strict";return Array.prototype.diff=function(e){return this.filter(t=>!e.includes(t))},Array.prototype.intersect=function(e){return this.filter(t=>e.includes(t))},Array.prototype.equalValues=function(e){return 0===this.diff(e).concat(e.diff(this)).length},Array.prototype.concatFilter=function(e){return[...new Set([...this,...e])]},Array.prototype.sortBy=function(e){return this.slice(0).sort((t,n)=>t[e]>n[e]?1:t[e]{"use strict";window.console=(e=>{let t=e.log,n=e.info,r=e.warn,o=e.error,a={indentDefault:{"padding-left":"3px"},global:{"font-weight":500,"font-size":"11px","line-height":"19px","font-family":'"Fira Code", "Lucida Console"'},debug:{color:"#d747d6"},ok:{color:"#5cb85c"},log:{color:"#adadad"},info:{color:"#428bca"},warn:{color:"#ffdd9e"},error:{color:"#ff8080"},pf:{color:"#568a89"},brand:{color:"#375959","line-height":"35px","font-size":"25px"}},i={"%s":{style:["color: #e93f3b; font-style: italic","color: inherit"]},"%i":{style:["color: #9980ff","color: inherit"]},"%d":{style:["color: #9980ff","color: inherit"]},"%f":{style:["color: #9980ff","color: inherit"]},"%o":{style:["",""]},"%O":{style:["",""]}},s=(e,t=!1)=>{let n="";return i.hasOwnProperty(e)&&(n=i[e].style[t?1:0]),n},l=(e,t=[])=>{let n="";return a.hasOwnProperty(e)&&(n=Object.keys(a[e]).filter(e=>!t.length||t.includes(e)).reduce((t,n,r,o)=>t+=n+":"+a[e][n]+";","")),n},c=(e,t)=>{if(t.length){let n=l("global")+l(e);n+=["debug","ok","log","info","pf"].includes(e)?l("indentDefault"):"";let r=["debug","ok","log","info","pf"].includes(e)?"●":"";"string"==typeof t[0]?t[0]="%c"+r+" "+t[0]:t.splice(0,0,"%c"+r+" "+e+":"),t.splice(1,0,n)}},u=(e,t)=>{if("string"==typeof t[0]){let n=(e=>{let t=new RegExp(Object.keys(i).join("|"),"g"),n=e.match(t);return n||[]})(t[0]),r=n.length;t[0]=(e=>{let t=new RegExp(Object.keys(i).join("|"),"g");return e.replace(t,function(e){return"%c"+e+"%c"})})(t[0]);let o=0,a=1,c=a+r,u=0;for(let r=a;r{u("debug",t),c("debug",t),n.apply(e,t)}),e.ok=((...t)=>{u("ok",t),c("ok",t),n.apply(e,t)}),e.info=((...t)=>{u("info",t),c("info",t),n.apply(e,t)}),e.log=((...n)=>{u("log",n),c("log",n),t.apply(e,n)}),e.warn=((...t)=>{u("warn",t),c("warn",t),r.apply(e,t)}),e.error=((...t)=>{u("error",t),c("error",t),o.apply(e,t)}),e.pf=((...t)=>{u("pf",t),c("pf",t),n.apply(e,t)}),e.brand=((...t)=>{u("brand",t),c("brand",t),n.apply(e,t)}),e})(window.console);return{showVersionInfo:e=>{console.ok("%c PATHFINDER","color: #477372; font-size: 25px; margin-left: 10px; line-height: 50px; text-shadow: 1px 1px 0 #212C30; background: url(https://i.imgur.com/bhSr6LI.png) no-repeat;"),console.pf("Release: %s",e)}}}),define("conf/system_effect",[],()=>{"use strict";let e=e=>{let t=0;switch(e){case 1:case 2:case 3:case 4:case 5:case 6:t=e;break;case 13:t=6;break;case 14:case 15:case 16:case 17:case 18:t=2}return t},t={1:[{effect:"Damage",value:"+30%"},{effect:"Missile exp. radius",value:"+15%"},{effect:"Drone tracking",value:"-15%"},{effect:"Targeting range",value:"-15%"},{effect:"Tracking speed",value:"-15%"},{effect:"Target Painter strength",value:"-15%"}],2:[{effect:"Damage",value:"+44%"},{effect:"Missile exp. radius",value:"+22%"},{effect:"Drone tracking",value:"-22%"},{effect:"Targeting range",value:"-22%"},{effect:"Tracking speed",value:"-22%"},{effect:"Target Painter strength",value:"-22%"}],3:[{effect:"Damage",value:"+58%"},{effect:"Missile exp. radius",value:"+29%"},{effect:"Drone tracking",value:"-29%"},{effect:"Targeting range",value:"-29%"},{effect:"Tracking speed",value:"-29%"},{effect:"Target Painter strength",value:"-29%"}],4:[{effect:"Damage",value:"+72%"},{effect:"Missile exp. radius",value:"+36%"},{effect:"Drone tracking",value:"-36%"},{effect:"Targeting range",value:"-36%"},{effect:"Tracking speed",value:"-36%"},{effect:"Target Painter strength",value:"-36%"}],5:[{effect:"Damage",value:"+86%"},{effect:"Missile exp. radius",value:"+43%"},{effect:"Drone tracking",value:"-43%"},{effect:"Targeting range",value:"-43%"},{effect:"Tracking speed",value:"-43%"},{effect:"Target Painter strength",value:"-43%"}],6:[{effect:"Damage",value:"+100%"},{effect:"Missile exp. radius",value:"+50%"},{effect:"Drone tracking",value:"-50%"},{effect:"Targeting range",value:"-50%"},{effect:"Tracking speed",value:"-50%"},{effect:"Target Painter strength",value:"-50%"}]},n={1:[{effect:"Heat damage",value:"+15%"},{effect:"Overload bonus",value:"+30%"},{effect:"Smart Bomb range",value:"+30%"},{effect:"Smart Bomb damage",value:"+30%"},{effect:"Bomb damage",value:"+30%"}],2:[{effect:"Heat damage",value:"+22%"},{effect:"Overload bonus",value:"+44%"},{effect:"Smart Bomb range",value:"+44%"},{effect:"Smart Bomb damage",value:"+44%"},{effect:"Bomb damage",value:"+44%"}],3:[{effect:"Heat damage",value:"+29%"},{effect:"Overload bonus",value:"+58%"},{effect:"Smart Bomb range",value:"+58%"},{effect:"Smart Bomb damage",value:"+58%"},{effect:"Bomb damage",value:"+58%"}],4:[{effect:"Heat damage",value:"+36%"},{effect:"Overload bonus",value:"+72%"},{effect:"Smart Bomb range",value:"+72%"},{effect:"Smart Bomb damage",value:"+72%"},{effect:"Bomb damage",value:"+72%"}],5:[{effect:"Heat damage",value:"+43%"},{effect:"Overload bonus",value:"+86%"},{effect:"Smart Bomb range",value:"+86%"},{effect:"Smart Bomb damage",value:"+86%"},{effect:"Bomb damage",value:"+86%"}],6:[{effect:"Heat damage",value:"+50%"},{effect:"Overload bonus",value:"+100%"},{effect:"Smart Bomb range",value:"+100%"},{effect:"Smart Bomb damage",value:"+100%"},{effect:"Bomb damage",value:"+100%"}]},r={1:[{effect:"Shield HP",value:"+30%"},{effect:"Armor resist",value:"-15%"},{effect:"Capacitor recharge",value:"-15%"},{effect:"Signature",value:"+30%"},{effect:"NOS/Neut drain",value:"+30%"}],2:[{effect:"Shield HP",value:"+44%"},{effect:"Armor resist",value:"-22%"},{effect:"Capacitor recharge",value:"-22%"},{effect:"Signature",value:"+44%"},{effect:"NOS/Neut drain",value:"+44%"}],3:[{effect:"Shield HP",value:"+58%"},{effect:"Armor resist",value:"-29%"},{effect:"Capacitor recharge",value:"-29%"},{effect:"Signature",value:"+58%"},{effect:"NOS/Neut drain",value:"+58%"}],4:[{effect:"Shield HP",value:"+72%"},{effect:"Armor resist",value:"-36%"},{effect:"Capacitor recharge",value:"-36%"},{effect:"Signature",value:"+72%"},{effect:"NOS/Neut drain",value:"+72%"}],5:[{effect:"Shield HP",value:"+86%"},{effect:"Armor resist",value:"-43%"},{effect:"Capacitor recharge",value:"-43%"},{effect:"Signature",value:"+86%"},{effect:"NOS/Neut drain",value:"+86%"}],6:[{effect:"Shield HP",value:"+100%"},{effect:"Armor resist",value:"-50%"},{effect:"Capacitor recharge",value:"-50%"},{effect:"Signature",value:"+100%"},{effect:"NOS/Neut drain",value:"+100%"}]},o={1:[{effect:"Armor HP",value:"+30%"},{effect:"Shield resist",value:"-15%"},{effect:"Small Weapon damage",value:"+60%"},{effect:"Signature size",value:"-15%"}],2:[{effect:"Armor HP",value:"+44%"},{effect:"Shield resist",value:"-22%"},{effect:"Small Weapon damage",value:"+88%"},{effect:"Signature size",value:"-22%"}],3:[{effect:"Armor HP",value:"+58%"},{effect:"Shield resist",value:"-29%"},{effect:"Small Weapon damage",value:"+116%"},{effect:"Signature size",value:"-29%"}],4:[{effect:"Armor HP",value:"+72%"},{effect:"Shield resist",value:"-36%"},{effect:"Small Weapon damage",value:"+144%"},{effect:"Signature size",value:"-36%"}],5:[{effect:"Armor HP",value:"+86%"},{effect:"Shield resist",value:"-43%"},{effect:"Small Weapon damage",value:"+172%"},{effect:"Signature size",value:"-43%"}],6:[{effect:"Armor HP",value:"+100%"},{effect:"Shield resist",value:"-50%"},{effect:"Small Weapon damage",value:"+200%"},{effect:"Signature size",value:"-50%"}]},a={1:[{effect:"Local armor repair amount",value:"-15%"},{effect:"Local shield boost amount",value:"-15%"},{effect:"Shield transfer amount",value:"+30%"},{effect:"Remote repair amount",value:"+30%"},{effect:"Capacitor capacity",value:"+30%"},{effect:"Capacitor recharge time",value:"+15%"},{effect:"Remote Capacitor Transmitter amount",value:"-15%"}],2:[{effect:"Local armor repair amount",value:"-22%"},{effect:"Local shield boost amount",value:"-22%"},{effect:"Shield transfer amount",value:"+44%"},{effect:"Remote repair amount",value:"+44%"},{effect:"Capacitor capacity",value:"+44%"},{effect:"Capacitor recharge time",value:"+22%"},{effect:"Remote Capacitor Transmitter amount",value:"-22%"}],3:[{effect:"Local armor repair amount",value:"-29%"},{effect:"Local shield boost amount",value:"-29%"},{effect:"Shield transfer amount",value:"+58%"},{effect:"Remote repair amount",value:"+58%"},{effect:"Capacitor capacity",value:"+58%"},{effect:"Capacitor recharge time",value:"+29%"},{effect:"Remote Capacitor Transmitter amount",value:"-29%"}],4:[{effect:"Local armor repair amount",value:"-36%"},{effect:"Local shield boost amount",value:"-36%"},{effect:"Shield transfer amount",value:"+72%"},{effect:"Remote repair amount",value:"+72%"},{effect:"Capacitor capacity",value:"+72%"},{effect:"Capacitor recharge time",value:"+36%"},{effect:"Remote Capacitor Transmitter amount",value:"-36%"}],5:[{effect:"Local armor repair amount",value:"-43%"},{effect:"Local shield boost amount",value:"-43%"},{effect:"Shield transfer amount",value:"+86%"},{effect:"Remote repair amount",value:"+86%"},{effect:"Capacitor capacity",value:"+86%"},{effect:"Capacitor recharge time",value:"+43%"},{effect:"Remote Capacitor Transmitter amount",value:"-43%"}],6:[{effect:"Local armor repair amount",value:"-50%"},{effect:"Local shield boost amount",value:"-50%"},{effect:"Shield transfer amount",value:"+100%"},{effect:"Remote repair amount",value:"+100%"},{effect:"Capacitor capacity",value:"+100%"},{effect:"Capacitor recharge time",value:"+50%"},{effect:"Remote Capacitor Transmitter amount",value:"-50%"}]},i={1:[{effect:"Missile velocity",value:"+15%"},{effect:"Missile exp. velocity",value:"+30%"},{effect:"Ship velocity",value:"+30%"},{effect:"Stasis Webifier strength",value:"-15%"},{effect:"Inertia",value:"+15%"},{effect:"Targeting range",value:"+30%"}],2:[{effect:"Missile velocity",value:"+22%"},{effect:"Missile exp. velocity",value:"+44%"},{effect:"Ship velocity",value:"+44%"},{effect:"Stasis Webifier strength",value:"-22%"},{effect:"Inertia",value:"+22%"},{effect:"Targeting range",value:"+44%"}],3:[{effect:"Missile velocity",value:"+29%"},{effect:"Missile exp. velocity",value:"+58%"},{effect:"Ship velocity",value:"+58%"},{effect:"Stasis Webifier strength",value:"-29%"},{effect:"Inertia",value:"+29%"},{effect:"Targeting range",value:"+58%"}],4:[{effect:"Missile velocity",value:"+36%"},{effect:"Missile exp. velocity",value:"+72%"},{effect:"Ship velocity",value:"+72%"},{effect:"Stasis Webifier strength",value:"-36%"},{effect:"Inertia",value:"+36%"},{effect:"Targeting range",value:"+72%"}],5:[{effect:"Missile velocity",value:"+43%"},{effect:"Missile exp. velocity",value:"+86%"},{effect:"Ship velocity",value:"+86%"},{effect:"Stasis Webifier strength",value:"-43%"},{effect:"Inertia",value:"+43%"},{effect:"Targeting range",value:"+86%"}],6:[{effect:"Missile velocity",value:"+50%"},{effect:"Missile exp. velocity",value:"+100%"},{effect:"Ship velocity",value:"+100%"},{effect:"Stasis Webifier strength",value:"-50%"},{effect:"Inertia",value:"+50%"},{effect:"Targeting range",value:"+100%"}]};return{getMultiplierByAreaId:e,wh:{magnetar:{1:t[e(1)],2:t[e(2)],3:t[e(3)],4:t[e(4)],5:t[e(5)],6:t[e(6)],16:t[e(16)]},redGiant:{1:n[e(1)],2:n[e(2)],3:n[e(3)],4:n[e(4)],5:n[e(5)],6:n[e(6)],14:n[e(14)]},pulsar:{1:r[e(1)],2:r[e(2)],3:r[e(3)],4:r[e(4)],5:r[e(5)],6:r[e(6)],17:r[e(17)]},wolfRayet:{1:o[e(1)],2:o[e(2)],3:o[e(3)],4:o[e(4)],5:o[e(5)],6:o[e(6)],13:o[e(13)],18:o[e(18)]},cataclysmic:{1:a[e(1)],2:a[e(2)],3:a[e(3)],4:a[e(4)],5:a[e(5)],6:a[e(6)],15:a[e(15)]},blackHole:{1:i[e(1)],2:i[e(2)],3:i[e(3)],4:i[e(4)],5:i[e(5)],6:i[e(6)]}}}}),define("conf/signature_type",[],()=>{"use strict";let e={10:"Ruined Angel Crystal Quarry",11:"Ruined Angel Monument Site",12:"Ruined Angel Science Outpost",13:"Ruined Angel Temple Site",14:"Ruined Blood Raider Crystal Quarry",15:"Ruined Blood Raider Monument Site",16:"Ruined Blood Raider Science Outpost",17:"Ruined Blood Raider Temple Site",18:"Ruined Guristas Crystal Quarry",19:"Ruined Guristas Monument Site",20:"Ruined Guristas Science Outpost",21:"Ruined Guristas Temple Site",22:"Ruined Sansha Crystal Quarry",23:"Ruined Sansha Monument Site",24:"Ruined Sansha Science Outpost",25:"Ruined Sansha Temple Site",26:"Ruined Serpentis Crystal Quarry",27:"Ruined Serpentis Monument Site",28:"Ruined Serpentis Science Outpost",29:"Ruined Serpentis Temple Site"},t=Object.assign({},e,{1:"Forgotten Perimeter Coronation Platform",2:"Forgotten Perimeter Power Array"}),n=Object.assign({},e,{1:"Forgotten Perimeter Gateway",2:"Forgotten Perimeter Habitation Coils"}),r=Object.assign({},e,{1:"Forgotten Frontier Quarantine Outpost",2:"Forgotten Frontier Recursive Depot"}),o={10:"Abandoned Research Complex DA005",11:"Abandoned Research Complex DA015",12:"Abandoned Research Complex DC007",13:"Abandoned Research Complex DC021",14:"Abandoned Research Complex DC035",15:"Abandoned Research Complex DG003",16:"Central Angel Command Center",17:"Central Angel Data Mining Site",18:"Central Angel Sparking Transmitter",19:"Central Angel Survey Site",20:"Central Blood Raider Command Center",21:"Central Blood Raider Data Mining Site",22:"Central Blood Raider Sparking Transmitter",23:"Central Blood Raider Survey Site",24:"Central Guristas Command Center",25:"Central Guristas Data Mining Center",26:"Central Guristas Sparking Transmitter",27:"Central Guristas Survey Site",28:"Central Sansha Command Center",29:"Central Sansha Data Mining Site",30:"Central Sansha Sparking Transmitter",31:"Central Sansha Survey Site",32:"Central Serpentis Command Center",33:"Central Serpentis Data Mining Site",34:"Central Serpentis Sparking Transmitter",35:"Central Serpentis Survey Site"};return{1:{1:{1:{1:"Perimeter Ambush Point",2:"Perimeter Camp",3:"Phase Catalyst Node",4:"The Line"},2:t,3:Object.assign({},o,{1:"Unsecured Perimeter Amplifier",2:"Unsecured Perimeter Information Center"}),4:{1:"Barren Perimeter Reservoir",2:"Token Perimeter Reservoir",3:"Minor Perimeter Reservoir",4:"Sizeable Perimeter Reservoir",5:"Ordinary Perimeter Reservoir"},5:{1:"H121 - C1",2:"C125 - C2",3:"O883 - C3",4:"M609 - C4",5:"L614 - C5",6:"S804 - C6",7:"F353 - C12 Thera"},6:{1:"Ordinary Perimeter Deposit",2:"Common Perimeter Deposit",3:"Unexceptional Frontier Deposit",4:"Average Frontier Deposit",5:"Isolated Core Deposit",6:"Uncommon Core Deposit"},7:{}},2:{1:{1:"Perimeter Checkpoint",2:"Perimeter Hangar",3:"The Ruins of Enclave Cohort 27",4:"Sleeper Data Sanctuary"},2:n,3:Object.assign({},o,{1:"Unsecured Perimeter Comms Relay",2:"Unsecured Perimeter Transponder Farm"}),4:{1:"Barren Perimeter Reservoir",2:"Token Perimeter Reservoir",3:"Minor Perimeter Reservoir",4:"Sizeable Perimeter Reservoir",5:"Ordinary Perimeter Reservoir"},5:{1:"Z647 - C1",2:"D382 - C2",3:"O477 - C3",4:"Y683 - C4",5:"N062 - C5",6:"R474 - C6",7:"F135 - C12 Thera"},6:{1:"Ordinary Perimeter Deposit",2:"Common Perimeter Deposit",3:"Unexceptional Frontier Deposit",4:"Average Frontier Deposit",5:"Isolated Core Deposit",6:"Uncommon Core Deposit"},7:{}},3:{1:{1:"Fortification Frontier Stronghold",2:"Outpost Frontier Stronghold",3:"Solar Cell",4:"The Oruze Construct"},2:r,3:Object.assign({},o,{1:"Unsecured Frontier Database",2:"Unsecured Frontier Receiver"}),4:{1:"Barren Perimeter Reservoir",2:"Token Perimeter Reservoir",3:"Minor Perimeter Reservoir",4:"Sizeable Perimeter Reservoir",5:"Ordinary Perimeter Reservoir",6:"Bountiful Frontier Reservoir",7:"Vast Frontier Reservoir"},5:{1:"V301 - C1",2:"I182 - C2",3:"N968 - C3",4:"T405 - C4",5:"N770 - C5",6:"A982 - C6",7:"F135 - C12 Thera"},6:{1:"Ordinary Perimeter Deposit",2:"Common Perimeter Deposit",3:"Unexceptional Frontier Deposit",4:"Average Frontier Deposit",5:"Infrequent Core Deposit",6:"Unusual Core Deposit"},7:{}},4:{1:{1:"Frontier Barracks",2:"Frontier Command Post",3:"Integrated Terminus",4:"Sleeper Information Sanctum"},2:{1:"Forgotten Frontier Conversion Module",2:"Forgotten Frontier Evacuation Center"},3:{1:"Unsecured Frontier Digital Nexus",2:"Unsecured Frontier Trinary Hub"},4:{1:"Barren Perimeter Reservoir",2:"Token Perimeter Reservoir",3:"Minor Perimeter Reservoir",4:"Sizeable Perimeter Reservoir",5:"Ordinary Perimeter Reservoir",6:"Vast Frontier Reservoir",7:"Bountiful Frontier Reservoir"},5:{1:"S047 - H",2:"N290 - L",3:"K329 - 0.0"},6:{1:"Ordinary Perimeter Deposit",2:"Common Perimeter Deposit",3:"Unexceptional Frontier Deposit",4:"Average Frontier Deposit",5:"Unusual Core Deposit",6:"Infrequent Core Deposit"},7:{}},5:{1:{1:"Core Garrison",2:"Core Stronghold",3:"Oruze Osobnyk",4:"Quarantine Area"},2:{1:"Forgotten Core Data Field",2:"Forgotten Core Information Pen"},3:{1:"Unsecured Frontier Enclave Relay",2:"Unsecured Frontier Server Bank"},4:{1:"Barren Perimeter Reservoir",2:"Minor Perimeter Reservoir",3:"Ordinary Perimeter Reservoir",4:"Sizeable Perimeter Reservoir",5:"Token Perimeter Reservoir",6:"Bountiful Frontier Reservoir",7:"Vast Frontier Reservoir",8:"Instrumental Core Reservoir",9:"Vital Core Reservoir"},5:{1:"D792 - H",2:"C140 - L",3:"Z142 - 0.0"},6:{1:"Average Frontier Deposit",2:"Unexceptional Frontier Deposit",3:"Uncommon Core Deposit",4:"Ordinary Perimeter Deposit",5:"Common Perimeter Deposit",6:"Exceptional Core Deposit",7:"Infrequent Core Deposit",8:"Unusual Core Deposit",9:"Rarified Core Deposit",10:"Isolated Core Deposit"},7:{}},6:{1:{1:"Core Citadel",2:"Core Bastion",3:"Strange Energy Readings",4:"The Mirror"},2:{1:"Forgotten Core Assembly Hall",2:"Forgotten Core Circuitry Disassembler"},3:{1:"Unsecured Core Backup Array",2:"Unsecured Core Emergence"},4:{1:"Barren Perimeter Reservoir",2:"Minor Perimeter Reservoir",3:"Ordinary Perimeter Reservoir",4:"Sizeable Perimeter Reservoir",5:"Token Perimeter Reservoir",6:"Bountiful Frontier Reservoir",7:"Vast Frontier Reservoir",8:"Instrumental Core Reservoir",9:"Vital Core Reservoir"},5:{1:"B520 - H",2:"D792 - H",3:"C140 - L",4:"C391 - L",5:"C248 - 0.0",6:"Z142 - 0.0"},6:{1:"Ordinary Perimeter Deposit",2:"Common Perimeter Deposit",3:"Unexceptional Frontier Deposit",4:"Average Frontier Deposit",5:"Rarified Core Deposit"},7:{1:"Superior Blood Raider Covert Research Facility"}},12:{1:{1:"Epicenter",2:"Expedition Command Outpost Wreck",3:"Planetary Colonization Office Wreck",4:"Testing Facilities"}},13:{5:{1:"P060 - C1",2:"Z647 - C1",3:"D382 - C2",4:"L005 - C2",5:"N766 - C2",6:"C247 - C3",7:"M267 - C3",8:"O477 - C3",9:"X877 - C4",10:"Y683 - C4",11:"H296 - C5",12:"H900 - C5",13:"H296 - C5",14:"N062 - C5",15:"V911 - C5",16:"U574 - C6",17:"V753 - C6",18:"W237 - C6",19:"B274 - H",20:"D792 - H",21:"D845 - H",22:"N110 - H",23:"A239 - L",24:"C391 - L",25:"J244 - L",26:"U201 - L",27:"U210 - L",28:"C248 - 0.0",29:"E545 - 0.0",30:"K346 - 0.0",31:"Z060 - 0.0"},6:{1:"Shattered Debris Field",2:"Shattered Ice Field"}},14:{1:{1:"Monolith",2:"Wormhole in Rock Circle",3:"Opposing Spatial Rifts",4:"Sleeper Enclave Debris",5:"Crystal Resource"}},15:{1:{1:"Wrecked Ships",2:"Unstable Wormhole",3:"Spatial Rift",4:"Heavily Guarded Spatial Rift",5:"Crystals"}},16:{1:{1:"Ship Graveyard",2:"Sleeper Engineering Station",3:"Spatial Rift",4:"Sleeper Enclave in Coral Rock",5:"Crystals and Stone Circle"}},17:{1:{1:"Monolith",2:"Caged Wormhole",3:"Rock Formation and Wormhole",4:"Particle Acceleration Array",5:"Guarded Asteroid Station"}},18:{1:{1:"Ship Graveyard",2:"Caged Wormhole",3:"Spatial Rift Generator",4:"Sleeper Enclave",5:"Hollow Asteroid"}}},2:{30:{5:{1:"Z971 - C1",2:"R943 - C2",3:"X702 - C3",4:"O128 - C4",5:"M555 - C5",6:"B041 - C6",7:"A641 - H",8:"R051 - L",9:"V283 - 0.0",10:"T458 - C12 Thera"}},31:{5:{1:"Z971 - C1",2:"R943 - C2",3:"X702 - C3",4:"O128 - C4",5:"N432 - C5",6:"U319 - C6",7:"B449 - H",8:"N944 - L",9:"S199 - 0.0",10:"M164 - C12 Thera"}},32:{5:{1:"Z971 - C1",2:"R943 - C2",3:"X702 - C3",4:"O128 - C4",5:"N432 - C5",6:"U319 - C6",7:"B449 - H",8:"N944 - L",9:"S199 - 0.0",10:"L031 - C12 Thera"}}}}}),"undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");!function(e){"use strict";var t=e.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1==t[0]&&9==t[1]&&t[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),function(e){"use strict";e.fn.emulateTransitionEnd=function(t){var n=!1,r=this;e(this).one("bsTransitionEnd",function(){n=!0});return setTimeout(function(){n||e(r).trigger(e.support.transition.end)},t),this},e(function(){e.support.transition=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var n in t)if(void 0!==e.style[n])return{end:t[n]};return!1}(),e.support.transition&&(e.event.special.bsTransitionEnd={bindType:e.support.transition.end,delegateType:e.support.transition.end,handle:function(t){return e(t.target).is(this)?t.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.VERSION="3.3.5",n.TRANSITION_DURATION=150,n.prototype.close=function(t){function r(){i.detach().trigger("closed.bs.alert").remove()}var o=e(this),a=o.attr("data-target");a||(a=(a=o.attr("href"))&&a.replace(/.*(?=#[^\s]*$)/,""));var i=e(a);t&&t.preventDefault(),i.length||(i=o.closest(".alert")),i.trigger(t=e.Event("close.bs.alert")),t.isDefaultPrevented()||(i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.one("bsTransitionEnd",r).emulateTransitionEnd(n.TRANSITION_DURATION):r())};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),o=r.data("bs.alert");o||r.data("bs.alert",o=new n(this)),"string"==typeof t&&o[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.bs.alert.data-api",t,n.prototype.close)}(jQuery),function(e){"use strict";function t(t){return this.each(function(){var r=e(this),o=r.data("bs.button"),a="object"==typeof t&&t;o||r.data("bs.button",o=new n(this,a)),"toggle"==t?o.toggle():t&&o.setState(t)})}var n=function(t,r){this.$element=e(t),this.options=e.extend({},n.DEFAULTS,r),this.isLoading=!1};n.VERSION="3.3.5",n.DEFAULTS={loadingText:"loading..."},n.prototype.setState=function(t){var n="disabled",r=this.$element,o=r.is("input")?"val":"html",a=r.data();t+="Text",null==a.resetText&&r.data("resetText",r[o]()),setTimeout(e.proxy(function(){r[o](null==a[t]?this.options[t]:a[t]),"loadingText"==t?(this.isLoading=!0,r.addClass(n).attr(n,n)):this.isLoading&&(this.isLoading=!1,r.removeClass(n).removeAttr(n))},this),0)},n.prototype.toggle=function(){var e=!0,t=this.$element.closest('[data-toggle="buttons"]');if(t.length){var n=this.$element.find("input");"radio"==n.prop("type")?(n.prop("checked")&&(e=!1),t.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==n.prop("type")&&(n.prop("checked")!==this.$element.hasClass("active")&&(e=!1),this.$element.toggleClass("active")),n.prop("checked",this.$element.hasClass("active")),e&&n.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var r=e.fn.button;e.fn.button=t,e.fn.button.Constructor=n,e.fn.button.noConflict=function(){return e.fn.button=r,this},e(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(n){var r=e(n.target);r.hasClass("btn")||(r=r.closest(".btn")),t.call(r,"toggle"),e(n.target).is('input[type="radio"]')||e(n.target).is('input[type="checkbox"]')||n.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(t){e(t.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(t.type))})}(jQuery),function(e){"use strict";function t(t){return this.each(function(){var r=e(this),o=r.data("bs.carousel"),a=e.extend({},n.DEFAULTS,r.data(),"object"==typeof t&&t),i="string"==typeof t?t:a.slide;o||r.data("bs.carousel",o=new n(this,a)),"number"==typeof t?o.to(t):i?o[i]():a.interval&&o.pause().cycle()})}var n=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",e.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",e.proxy(this.pause,this)).on("mouseleave.bs.carousel",e.proxy(this.cycle,this))};n.VERSION="3.3.5",n.TRANSITION_DURATION=600,n.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},n.prototype.keydown=function(e){if(!/input|textarea/i.test(e.target.tagName)){switch(e.which){case 37:this.prev();break;case 39:this.next();break;default:return}e.preventDefault()}},n.prototype.cycle=function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},n.prototype.getItemIndex=function(e){return this.$items=e.parent().children(".item"),this.$items.index(e||this.$active)},n.prototype.getItemForDirection=function(e,t){var n=this.getItemIndex(t);if(("prev"==e&&0===n||"next"==e&&n==this.$items.length-1)&&!this.options.wrap)return t;var r=(n+("prev"==e?-1:1))%this.$items.length;return this.$items.eq(r)},n.prototype.to=function(e){var t=this,n=this.getItemIndex(this.$active=this.$element.find(".item.active"));return e>this.$items.length-1||0>e?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){t.to(e)}):n==e?this.pause().cycle():this.slide(e>n?"next":"prev",this.$items.eq(e))},n.prototype.pause=function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},n.prototype.next=function(){return this.sliding?void 0:this.slide("next")},n.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},n.prototype.slide=function(t,r){var o=this.$element.find(".item.active"),a=r||this.getItemForDirection(t,o),i=this.interval,s="next"==t?"left":"right",l=this;if(a.hasClass("active"))return this.sliding=!1;var c=a[0],u=e.Event("slide.bs.carousel",{relatedTarget:c,direction:s});if(this.$element.trigger(u),!u.isDefaultPrevented()){if(this.sliding=!0,i&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var d=e(this.$indicators.children()[this.getItemIndex(a)]);d&&d.addClass("active")}var f=e.Event("slid.bs.carousel",{relatedTarget:c,direction:s});return e.support.transition&&this.$element.hasClass("slide")?(a.addClass(t),a[0].offsetWidth,o.addClass(s),a.addClass(s),o.one("bsTransitionEnd",function(){a.removeClass([t,s].join(" ")).addClass("active"),o.removeClass(["active",s].join(" ")),l.sliding=!1,setTimeout(function(){l.$element.trigger(f)},0)}).emulateTransitionEnd(n.TRANSITION_DURATION)):(o.removeClass("active"),a.addClass("active"),this.sliding=!1,this.$element.trigger(f)),i&&this.cycle(),this}};var r=e.fn.carousel;e.fn.carousel=t,e.fn.carousel.Constructor=n,e.fn.carousel.noConflict=function(){return e.fn.carousel=r,this};var o=function(n){var r,o=e(this),a=e(o.attr("data-target")||(r=o.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""));if(a.hasClass("carousel")){var i=e.extend({},a.data(),o.data()),s=o.attr("data-slide-to");s&&(i.interval=!1),t.call(a,i),s&&a.data("bs.carousel").to(s),n.preventDefault()}};e(document).on("click.bs.carousel.data-api","[data-slide]",o).on("click.bs.carousel.data-api","[data-slide-to]",o),e(window).on("load",function(){e('[data-ride="carousel"]').each(function(){var n=e(this);t.call(n,n.data())})})}(jQuery),function(e){"use strict";function t(t){var n,r=t.attr("data-target")||(n=t.attr("href"))&&n.replace(/.*(?=#[^\s]+$)/,"");return e(r)}function n(t){return this.each(function(){var n=e(this),o=n.data("bs.collapse"),a=e.extend({},r.DEFAULTS,n.data(),"object"==typeof t&&t);!o&&a.toggle&&/show|hide/.test(t)&&(a.toggle=!1),o||n.data("bs.collapse",o=new r(this,a)),"string"==typeof t&&o[t]()})}var r=function(t,n){this.$element=e(t),this.options=e.extend({},r.DEFAULTS,n),this.$trigger=e('[data-toggle="collapse"][href="#'+t.id+'"],[data-toggle="collapse"][data-target="#'+t.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};r.VERSION="3.3.5",r.TRANSITION_DURATION=350,r.DEFAULTS={toggle:!0},r.prototype.dimension=function(){return this.$element.hasClass("width")?"width":"height"},r.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var t,o=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(o&&o.length&&(t=o.data("bs.collapse"),t&&t.transitioning))){var a=e.Event("show.bs.collapse");if(this.$element.trigger(a),!a.isDefaultPrevented()){o&&o.length&&(n.call(o,"hide"),t||o.data("bs.collapse",null));var i=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[i](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var s=function(){this.$element.removeClass("collapsing").addClass("collapse in")[i](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!e.support.transition)return s.call(this);var l=e.camelCase(["scroll",i].join("-"));this.$element.one("bsTransitionEnd",e.proxy(s,this)).emulateTransitionEnd(r.TRANSITION_DURATION)[i](this.$element[0][l])}}}},r.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var t=e.Event("hide.bs.collapse");if(this.$element.trigger(t),!t.isDefaultPrevented()){var n=this.dimension();this.$element[n](this.$element[n]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var o=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return e.support.transition?void this.$element[n](0).one("bsTransitionEnd",e.proxy(o,this)).emulateTransitionEnd(r.TRANSITION_DURATION):o.call(this)}}},r.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},r.prototype.getParent=function(){return e(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(e.proxy(function(n,r){var o=e(r);this.addAriaAndCollapsedClass(t(o),o)},this)).end()},r.prototype.addAriaAndCollapsedClass=function(e,t){var n=e.hasClass("in");e.attr("aria-expanded",n),t.toggleClass("collapsed",!n).attr("aria-expanded",n)};var o=e.fn.collapse;e.fn.collapse=n,e.fn.collapse.Constructor=r,e.fn.collapse.noConflict=function(){return e.fn.collapse=o,this},e(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(r){var o=e(this);o.attr("data-target")||r.preventDefault();var a=t(o),i=a.data("bs.collapse")?"toggle":o.data();n.call(a,i)})}(jQuery),function(e){"use strict";function t(t){var n=t.attr("data-target");n||(n=(n=t.attr("href"))&&/#[A-Za-z]/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,""));var r=n&&e(n);return r&&r.length?r:t.parent()}function n(n){n&&3===n.which||(e(r).remove(),e(o).each(function(){var r=e(this),o=t(r),a={relatedTarget:this};o.hasClass("open")&&(n&&"click"==n.type&&/input|textarea/i.test(n.target.tagName)&&e.contains(o[0],n.target)||(o.trigger(n=e.Event("hide.bs.dropdown",a)),n.isDefaultPrevented()||(r.attr("aria-expanded","false"),o.removeClass("open").trigger("hidden.bs.dropdown",a))))}))}var r=".dropdown-backdrop",o='[data-toggle="dropdown"]',a=function(t){e(t).on("click.bs.dropdown",this.toggle)};a.VERSION="3.3.5",a.prototype.toggle=function(r){var o=e(this);if(!o.is(".disabled, :disabled")){var a=t(o),i=a.hasClass("open");if(n(),!i){"ontouchstart"in document.documentElement&&!a.closest(".navbar-nav").length&&e(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(e(this)).on("click",n);var s={relatedTarget:this};if(a.trigger(r=e.Event("show.bs.dropdown",s)),r.isDefaultPrevented())return;o.trigger("focus").attr("aria-expanded","true"),a.toggleClass("open").trigger("shown.bs.dropdown",s)}return!1}},a.prototype.keydown=function(n){if(/(38|40|27|32)/.test(n.which)&&!/input|textarea/i.test(n.target.tagName)){var r=e(this);if(n.preventDefault(),n.stopPropagation(),!r.is(".disabled, :disabled")){var a=t(r),i=a.hasClass("open");if(!i&&27!=n.which||i&&27==n.which)return 27==n.which&&a.find(o).trigger("focus"),r.trigger("click");var s=a.find(".dropdown-menu li:not(.disabled):visible a");if(s.length){var l=s.index(n.target);38==n.which&&l>0&&l--,40==n.which&&ldocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&e?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!e?this.scrollbarWidth:""})},n.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},n.prototype.checkScrollbar=function(){var e=window.innerWidth;if(!e){var t=document.documentElement.getBoundingClientRect();e=t.right-Math.abs(t.left)}this.bodyIsOverflowing=document.body.clientWidth
              ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},t.prototype.init=function(t,n,r){if(this.enabled=!0,this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.$viewport=this.options.viewport&&e(e.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var o=this.options.trigger.split(" "),a=o.length;a--;){var i=o[a];if("click"==i)this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this));else if("manual"!=i){var s="hover"==i?"mouseenter":"focusin",l="hover"==i?"mouseleave":"focusout";this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(l+"."+this.type,this.options.selector,e.proxy(this.leave,this))}}this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},t.prototype.getDefaults=function(){return t.DEFAULTS},t.prototype.getOptions=function(t){return(t=e.extend({},this.getDefaults(),this.$element.data(),t)).delay&&"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),t},t.prototype.getDelegateOptions=function(){var t={},n=this.getDefaults();return this._options&&e.each(this._options,function(e,r){n[e]!=r&&(t[e]=r)}),t},t.prototype.enter=function(t){var n=t instanceof this.constructor?t:e(t.currentTarget).data("bs."+this.type);return n||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n)),t instanceof e.Event&&(n.inState["focusin"==t.type?"focus":"hover"]=!0),n.tip().hasClass("in")||"in"==n.hoverState?void(n.hoverState="in"):(clearTimeout(n.timeout),n.hoverState="in",n.options.delay&&n.options.delay.show?void(n.timeout=setTimeout(function(){"in"==n.hoverState&&n.show()},n.options.delay.show)):n.show())},t.prototype.isInStateTrue=function(){for(var e in this.inState)if(this.inState[e])return!0;return!1},t.prototype.leave=function(t){var n=t instanceof this.constructor?t:e(t.currentTarget).data("bs."+this.type);return n||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n)),t instanceof e.Event&&(n.inState["focusout"==t.type?"focus":"hover"]=!1),n.isInStateTrue()?void 0:(clearTimeout(n.timeout),n.hoverState="out",n.options.delay&&n.options.delay.hide?void(n.timeout=setTimeout(function(){"out"==n.hoverState&&n.hide()},n.options.delay.hide)):n.hide())},t.prototype.show=function(){var n=e.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(n);var r=e.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(n.isDefaultPrevented()||!r)return;var o=this,a=this.tip(),i=this.getUID(this.type);this.setContent(),a.attr("id",i),this.$element.attr("aria-describedby",i),this.options.animation&&a.addClass("fade");var s="function"==typeof this.options.placement?this.options.placement.call(this,a[0],this.$element[0]):this.options.placement,l=/\s?auto?\s?/i,c=l.test(s);c&&(s=s.replace(l,"")||"top"),a.detach().css({top:0,left:0,display:"block"}).addClass(s).data("bs."+this.type,this),this.options.container?a.appendTo(this.options.container):a.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var u=this.getPosition(),d=a[0].offsetWidth,f=a[0].offsetHeight;if(c){var p=s,h=this.getPosition(this.$viewport);s="bottom"==s&&u.bottom+f>h.bottom?"top":"top"==s&&u.top-fh.width?"left":"left"==s&&u.left-di.top+i.height&&(o.top=i.top+i.height-l)}else{var c=t.left-a,u=t.left+a+n;ci.right&&(o.left=i.left+i.width-u)}return o},t.prototype.getTitle=function(){var e=this.$element,t=this.options;return e.attr("data-original-title")||("function"==typeof t.title?t.title.call(e[0]):t.title)},t.prototype.getUID=function(e){do{e+=~~(1e6*Math.random())}while(document.getElementById(e));return e},t.prototype.tip=function(){if(!this.$tip&&(this.$tip=e(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},t.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},t.prototype.enable=function(){this.enabled=!0},t.prototype.disable=function(){this.enabled=!1},t.prototype.toggleEnabled=function(){this.enabled=!this.enabled},t.prototype.toggle=function(t){var n=this;t&&((n=e(t.currentTarget).data("bs."+this.type))||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n))),t?(n.inState.click=!n.inState.click,n.isInStateTrue()?n.enter(n):n.leave(n)):n.tip().hasClass("in")?n.leave(n):n.enter(n)},t.prototype.destroy=function(){var e=this;clearTimeout(this.timeout),this.hide(function(){e.$element.off("."+e.type).removeData("bs."+e.type),e.$tip&&e.$tip.detach(),e.$tip=null,e.$arrow=null,e.$viewport=null})};var n=e.fn.tooltip;e.fn.tooltip=function(n){return this.each(function(){var r=e(this),o=r.data("bs.tooltip"),a="object"==typeof n&&n;(o||!/destroy|hide/.test(n))&&(o||r.data("bs.tooltip",o=new t(this,a)),"string"==typeof n&&o[n]())})},e.fn.tooltip.Constructor=t,e.fn.tooltip.noConflict=function(){return e.fn.tooltip=n,this}}(jQuery),function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};if(!e.fn.tooltip)throw new Error("Popover requires tooltip.js");t.VERSION="3.3.5",t.DEFAULTS=e.extend({},e.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype),t.prototype.constructor=t,t.prototype.getDefaults=function(){return t.DEFAULTS},t.prototype.setContent=function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof n?"html":"append":"text"](n),e.removeClass("fade top bottom left right in"),e.find(".popover-title").html()||e.find(".popover-title").hide()},t.prototype.hasContent=function(){return this.getTitle()||this.getContent()},t.prototype.getContent=function(){var e=this.$element,t=this.options;return e.attr("data-content")||("function"==typeof t.content?t.content.call(e[0]):t.content)},t.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var n=e.fn.popover;e.fn.popover=function(n){return this.each(function(){var r=e(this),o=r.data("bs.popover"),a="object"==typeof n&&n;(o||!/destroy|hide/.test(n))&&(o||r.data("bs.popover",o=new t(this,a)),"string"==typeof n&&o[n]())})},e.fn.popover.Constructor=t,e.fn.popover.noConflict=function(){return e.fn.popover=n,this}}(jQuery),function(e){"use strict";function t(n,r){this.$body=e(document.body),this.$scrollElement=e(e(n).is(document.body)?window:n),this.options=e.extend({},t.DEFAULTS,r),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e.proxy(this.process,this)),this.refresh(),this.process()}function n(n){return this.each(function(){var r=e(this),o=r.data("bs.scrollspy"),a="object"==typeof n&&n;o||r.data("bs.scrollspy",o=new t(this,a)),"string"==typeof n&&o[n]()})}t.VERSION="3.3.5",t.DEFAULTS={offset:10},t.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},t.prototype.refresh=function(){var t=this,n="offset",r=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),e.isWindow(this.$scrollElement[0])||(n="position",r=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var t=e(this),o=t.data("target")||t.attr("href"),a=/^#./.test(o)&&e(o);return a&&a.length&&a.is(":visible")&&[[a[n]().top+r,o]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},t.prototype.process=function(){var e,t=this.$scrollElement.scrollTop()+this.options.offset,n=this.getScrollHeight(),r=this.options.offset+n-this.$scrollElement.height(),o=this.offsets,a=this.targets,i=this.activeTarget;if(this.scrollHeight!=n&&this.refresh(),t>=r)return i!=(e=a[a.length-1])&&this.activate(e);if(i&&t=o[e]&&(void 0===o[e+1]||t .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),t.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu").length&&t.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),o&&o()}var i=r.find("> .active"),s=o&&e.support.transition&&(i.length&&i.hasClass("fade")||!!r.find("> .fade").length);i.length&&s?i.one("bsTransitionEnd",a).emulateTransitionEnd(n.TRANSITION_DURATION):a(),i.removeClass("in")};var r=e.fn.tab;e.fn.tab=t,e.fn.tab.Constructor=n,e.fn.tab.noConflict=function(){return e.fn.tab=r,this};var o=function(n){n.preventDefault(),t.call(e(this),"show")};e(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',o).on("click.bs.tab.data-api",'[data-toggle="pill"]',o)}(jQuery),function(e){"use strict";function t(t){return this.each(function(){var r=e(this),o=r.data("bs.affix"),a="object"==typeof t&&t;o||r.data("bs.affix",o=new n(this,a)),"string"==typeof t&&o[t]()})}var n=function(t,r){this.options=e.extend({},n.DEFAULTS,r),this.$target=e(this.options.target).on("scroll.bs.affix.data-api",e.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",e.proxy(this.checkPositionWithEventLoop,this)),this.$element=e(t),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};n.VERSION="3.3.5",n.RESET="affix affix-top affix-bottom",n.DEFAULTS={offset:0,target:window},n.prototype.getState=function(e,t,n,r){var o=this.$target.scrollTop(),a=this.$element.offset(),i=this.$target.height();if(null!=n&&"top"==this.affixed)return n>o&&"top";if("bottom"==this.affixed)return null!=n?!(o+this.unpin<=a.top)&&"bottom":!(e-r>=o+i)&&"bottom";var s=null==this.affixed,l=s?o:a.top;return null!=n&&n>=o?"top":null!=r&&l+(s?i:t)>=e-r&&"bottom"},n.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(n.RESET).addClass("affix");var e=this.$target.scrollTop(),t=this.$element.offset();return this.pinnedOffset=t.top-e},n.prototype.checkPositionWithEventLoop=function(){setTimeout(e.proxy(this.checkPosition,this),1)},n.prototype.checkPosition=function(){if(this.$element.is(":visible")){var t=this.$element.height(),r=this.options.offset,o=r.top,a=r.bottom,i=Math.max(e(document).height(),e(document.body).height());"object"!=typeof r&&(a=o=r),"function"==typeof o&&(o=r.top(this.$element)),"function"==typeof a&&(a=r.bottom(this.$element));var s=this.getState(i,t,o,a);if(this.affixed!=s){null!=this.unpin&&this.$element.css("top","");var l="affix"+(s?"-"+s:""),c=e.Event(l+".bs.affix");if(this.$element.trigger(c),c.isDefaultPrevented())return;this.affixed=s,this.unpin="bottom"==s?this.getPinnedOffset():null,this.$element.removeClass(n.RESET).addClass(l).trigger(l.replace("affix","affixed")+".bs.affix")}"bottom"==s&&this.$element.offset({top:i-t-a})}};var r=e.fn.affix;e.fn.affix=t,e.fn.affix.Constructor=n,e.fn.affix.noConflict=function(){return e.fn.affix=r,this},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var n=e(this),r=n.data();r.offset=r.offset||{},null!=r.offsetBottom&&(r.offset.bottom=r.offsetBottom),null!=r.offsetTop&&(r.offset.top=r.offsetTop),t.call(n,r)})})}(jQuery),define("bootstrap",["jquery"],function(){}),function(e,t){"use strict";"function"==typeof define&&define.amd?define("bootbox",["jquery"],t):"object"==typeof exports?module.exports=t(require("jquery")):e.bootbox=t(e.jQuery)}(this,function e(t,n){"use strict";var r,o,a,i;Object.keys||(Object.keys=(r=Object.prototype.hasOwnProperty,o=!{toString:null}.propertyIsEnumerable("toString"),i=(a=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"]).length,function(e){if("function"!=typeof e&&("object"!=typeof e||null===e))throw new TypeError("Object.keys called on non-object");var t,n,s=[];for(t in e)r.call(e,t)&&s.push(t);if(o)for(n=0;n
              ',header:'',footer:'',closeButton:'',form:'
              ',button:'',option:"",promptMessage:'
              ',inputs:{text:'',textarea:'',email:'',select:'',checkbox:'
              ',radio:'
              ',date:'',time:'',number:'',password:'',range:''}},u={locale:"en",backdrop:"static",animate:!0,className:null,closeButton:!0,show:!0,container:"body",value:"",inputType:"text",swapButtonOrder:!1,centerVertical:!1,multiple:!1,scrollable:!1};function d(e,r,o,a){var i,s,c,d;return a&&a[0]&&(i=a[0].locale||u.locale,(a[0].swapButtonOrder||u.swapButtonOrder)&&(r=r.reverse())),s=function(e,n,r){return t.extend(!0,{},e,function(e,t){var n=e.length,r={};if(n<1||2").attr("label",r.group)),o=f[r.group]);var i=t(c.option);i.attr("value",r.value).text(r.text),o.append(i)}),p(f,function(e,t){a.append(t)}),a.val(e.value);break;case"checkbox":var h=t.isArray(e.value)?e.value:[e.value];if(!(l=e.inputOptions||[]).length)throw new Error('prompt with "inputType" set to "checkbox" requires at least one option');a=t('
              '),p(l,function(r,o){if(o.value===n||o.text===n)throw new Error('each option needs a "value" property and a "text" property');var i=t(c.inputs[e.inputType]);i.find("input").attr("value",o.value),i.find("label").append("\n"+o.text),p(h,function(e,t){t===o.value&&i.find("input").prop("checked",!0)}),a.append(i)});break;case"radio":if(e.value!==n&&t.isArray(e.value))throw new Error('prompt with "inputType" set to "radio" requires a single, non-array value for "value"');if(!(l=e.inputOptions||[]).length)throw new Error('prompt with "inputType" set to "radio" requires at least one option');a=t('
              ');var v=!0;p(l,function(r,o){if(o.value===n||o.text===n)throw new Error('each option needs a "value" property and a "text" property');var i=t(c.inputs[e.inputType]);i.find("input").attr("value",o.value),i.find("label").append("\n"+o.text),e.value!==n&&o.value===e.value&&(i.find("input").prop("checked",!0),v=!1),a.append(i)}),v&&a.find('input[type="radio"]').first().prop("checked",!0)}if(o.append(a),o.on("submit",function(e){e.preventDefault(),e.stopPropagation(),r.find(".bootbox-accept").trigger("click")}),""!==t.trim(e.message)){var y=t(c.promptMessage).html(e.message);o.prepend(y),e.message=o}else e.message=o;return(r=s.dialog(e)).off("shown.bs.modal"),r.on("shown.bs.modal",function(){a.focus()}),!0===i&&r.modal("show"),r},s.addLocale("en",{OK:"OK",CANCEL:"Cancel",CONFIRM:"OK"}),s}),function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define("localForage",[],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).localforage=e()}}(function(){return function e(t,n,r){function o(i,s){if(!n[i]){if(!t[i]){var l="function"==typeof require&&require;if(!s&&l)return l(i,!0);if(a)return a(i,!0);var c=new Error("Cannot find module '"+i+"'");throw c.code="MODULE_NOT_FOUND",c}var u=n[i]={exports:{}};t[i][0].call(u.exports,function(e){return o(t[i][1][e]||e)},u,u.exports,e,t,n,r)}return n[i].exports}for(var a="function"==typeof require&&require,i=0;i=43)}}).catch(function(){return!1})}(e).then(function(e){return F=e})}function c(e){var t=P[e.name],n={};n.promise=new E(function(e,t){n.resolve=e,n.reject=t}),t.deferredOperations.push(n),t.dbReady?t.dbReady=t.dbReady.then(function(){return n.promise}):t.dbReady=n.promise}function u(e){var t=P[e.name].deferredOperations.pop();if(t)return t.resolve(),t.promise}function d(e,t){var n=P[e.name].deferredOperations.pop();if(n)return n.reject(t),n.promise}function f(e,t){return new E(function(n,r){if(P[e.name]=P[e.name]||{forages:[],db:null,dbReady:null,deferredOperations:[]},e.db){if(!t)return n(e.db);c(e),e.db.close()}var o=[e.name];t&&o.push(e.version);var a=A.open.apply(A,o);t&&(a.onupgradeneeded=function(t){var n=a.result;try{n.createObjectStore(e.storeName),t.oldVersion<=1&&n.createObjectStore(O)}catch(n){if("ConstraintError"!==n.name)throw n;console.warn('The database "'+e.name+'" has been upgraded from version '+t.oldVersion+" to version "+t.newVersion+', but the storage "'+e.storeName+'" already exists.')}}),a.onerror=function(e){e.preventDefault(),r(a.error)},a.onsuccess=function(){n(a.result),u(e)}})}function p(e){return f(e,!1)}function h(e){return f(e,!0)}function m(e,t){if(!e.db)return!0;var n=!e.db.objectStoreNames.contains(e.storeName),r=e.versione.db.version;if(r&&(e.version!==t&&console.warn('The database "'+e.name+"\" can't be downgraded from version "+e.db.version+" to version "+e.version+"."),e.version=e.db.version),o||n){if(n){var a=e.db.version+1;a>e.version&&(e.version=a)}return!0}return!1}function g(e){return r([function(e){for(var t=e.length,n=new ArrayBuffer(t),r=new Uint8Array(n),o=0;o0&&(!e.db||"InvalidStateError"===o.name||"NotFoundError"===o.name))return E.resolve().then(function(){if(!e.db||"NotFoundError"===o.name&&!e.db.objectStoreNames.contains(e.storeName)&&e.version<=e.db.version)return e.db&&(e.version=e.db.version+1),h(e)}).then(function(){return function(e){c(e);for(var t=P[e.name],n=t.forages,r=0;r>4,u[l++]=(15&r)<<4|o>>2,u[l++]=(3&o)<<6|63&a;return c}function x(e){var t,n=new Uint8Array(e),r="";for(t=0;t>2],r+=$[(3&n[t])<<4|n[t+1]>>4],r+=$[(15&n[t+1])<<2|n[t+2]>>6],r+=$[63&n[t+2]];return n.length%3==2?r=r.substring(0,r.length-1)+"=":n.length%3==1&&(r=r.substring(0,r.length-2)+"=="),r}function C(e,t,n,r){e.executeSql("CREATE TABLE IF NOT EXISTS "+t.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],n,r)}function S(e,t,n,r,o,a){e.executeSql(n,r,o,function(e,i){i.code===i.SYNTAX_ERR?e.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[t.storeName],function(e,s){s.rows.length?a(e,i):C(e,t,function(){e.executeSql(n,r,o,a)},a)},a):a(e,i)},a)}function _(e,t){var n=e.name+"/";return e.storeName!==t.storeName&&(n+=e.storeName+"/"),n}function T(){return!function(){var e="_localforage_support_test";try{return localStorage.setItem(e,!0),localStorage.removeItem(e),!1}catch(e){return!0}}()||localStorage.length>0}function D(e,t){e[t]=function(){var n=arguments;return e.ready().then(function(){return e[t].apply(e,n)})}}function I(){for(var e=1;e0)return void o(e.apply(s,[t,l,r,a-1]));i(n)}})})}).catch(i)});return o(l,r),l}.apply(this,[e,t,n,1])},removeItem:function(e,t){var n=this;e=i(e);var r=new E(function(t,r){n.ready().then(function(){var o=n._dbInfo;o.db.transaction(function(n){S(n,o,"DELETE FROM "+o.storeName+" WHERE key = ?",[e],function(){t()},function(e,t){r(t)})})}).catch(r)});return o(r,t),r},clear:function(e){var t=this,n=new E(function(e,n){t.ready().then(function(){var r=t._dbInfo;r.db.transaction(function(t){S(t,r,"DELETE FROM "+r.storeName,[],function(){e()},function(e,t){n(t)})})}).catch(n)});return o(n,e),n},length:function(e){var t=this,n=new E(function(e,n){t.ready().then(function(){var r=t._dbInfo;r.db.transaction(function(t){S(t,r,"SELECT COUNT(key) as c FROM "+r.storeName,[],function(t,n){var r=n.rows.item(0).c;e(r)},function(e,t){n(t)})})}).catch(n)});return o(n,e),n},key:function(e,t){var n=this,r=new E(function(t,r){n.ready().then(function(){var o=n._dbInfo;o.db.transaction(function(n){S(n,o,"SELECT key FROM "+o.storeName+" WHERE id = ? LIMIT 1",[e+1],function(e,n){var r=n.rows.length?n.rows.item(0).key:null;t(r)},function(e,t){r(t)})})}).catch(r)});return o(r,t),r},keys:function(e){var t=this,n=new E(function(e,n){t.ready().then(function(){var r=t._dbInfo;r.db.transaction(function(t){S(t,r,"SELECT key FROM "+r.storeName,[],function(t,n){for(var r=[],o=0;o '__WebKitDatabaseInfoTable__'",[],function(n,r){for(var o=[],a=0;a=0;n--){var r=localStorage.key(n);0===r.indexOf(e)&&localStorage.removeItem(r)}});return o(n,e),n},length:function(e){var t=this.keys().then(function(e){return e.length});return o(t,e),t},key:function(e,t){var n=this,r=n.ready().then(function(){var t,r=n._dbInfo;try{t=localStorage.key(e)}catch(e){t=null}return t&&(t=t.substring(r.keyPrefix.length)),t});return o(r,t),r},keys:function(e){var t=this,n=t.ready().then(function(){for(var e=t._dbInfo,n=localStorage.length,r=[],o=0;o=0;t--){var n=localStorage.key(t);0===n.indexOf(e)&&localStorage.removeItem(n)}}):E.reject("Invalid arguments"),t),r}},ae=function(e,t){return e===t||"number"==typeof e&&"number"==typeof t&&isNaN(e)&&isNaN(t)},ie=function(e,t){for(var n=e.length,r=0;rc.failure_limit)return!1}else n.trigger("appear"),t=0})}var s,l=this,c={threshold:0,failure_limit:0,event:"scroll",effect:"show",container:t,data_attribute:"original",skip_invisible:!1,appear:null,load:null,placeholder:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC"};return a&&(r!==a.failurelimit&&(a.failure_limit=a.failurelimit,delete a.failurelimit),r!==a.effectspeed&&(a.effect_speed=a.effectspeed,delete a.effectspeed),e.extend(c,a)),s=c.container===r||c.container===t?o:e(c.container),0===c.event.indexOf("scroll")&&s.bind(c.event,function(){return i()}),this.each(function(){var t=this,n=e(t);t.loaded=!1,(n.attr("src")===r||!1===n.attr("src"))&&n.is("img")&&n.attr("src",c.placeholder),n.one("appear",function(){if(!this.loaded){if(c.appear){var r=l.length;c.appear.call(t,r,c)}e("").bind("load",function(){var r=n.attr("data-"+c.data_attribute);n.hide(),n.is("img")?n.attr("src",r):n.css("background-image","url('"+r+"')"),n[c.effect](c.effect_speed),t.loaded=!0;var o=e.grep(l,function(e){return!e.loaded});if(l=e(o),c.load){var a=l.length;c.load.call(t,a,c)}}).attr("src",n.attr("data-"+c.data_attribute))}}),0!==c.event.indexOf("scroll")&&n.bind(c.event,function(){t.loaded||n.trigger("appear")})}),o.bind("resize",function(){i()}),/(?:iphone|ipod|ipad).*os 5/gi.test(navigator.appVersion)&&o.bind("pageshow",function(t){t.originalEvent&&t.originalEvent.persisted&&l.each(function(){e(this).trigger("appear")})}),e(n).ready(function(){i()}),this},e.belowthefold=function(n,a){return(a.container===r||a.container===t?(t.innerHeight?t.innerHeight:o.height())+o.scrollTop():e(a.container).offset().top+e(a.container).height())<=e(n).offset().top-a.threshold},e.rightoffold=function(n,a){return(a.container===r||a.container===t?o.width()+o.scrollLeft():e(a.container).offset().left+e(a.container).width())<=e(n).offset().left-a.threshold},e.abovethetop=function(n,a){return(a.container===r||a.container===t?o.scrollTop():e(a.container).offset().top)>=e(n).offset().top+a.threshold+e(n).height()},e.leftofbegin=function(n,a){return(a.container===r||a.container===t?o.scrollLeft():e(a.container).offset().left)>=e(n).offset().left+a.threshold+e(n).width()},e.inviewport=function(t,n){return!(e.rightoffold(t,n)||e.leftofbegin(t,n)||e.belowthefold(t,n)||e.abovethetop(t,n))},e.extend(e.expr[":"],{"below-the-fold":function(t){return e.belowthefold(t,{threshold:0})},"above-the-top":function(t){return!e.belowthefold(t,{threshold:0})},"right-of-screen":function(t){return e.rightoffold(t,{threshold:0})},"left-of-screen":function(t){return!e.rightoffold(t,{threshold:0})},"in-viewport":function(t){return e.inviewport(t,{threshold:0})},"above-the-fold":function(t){return!e.belowthefold(t,{threshold:0})},"right-of-fold":function(t){return e.rightoffold(t,{threshold:0})},"left-of-fold":function(t){return!e.rightoffold(t,{threshold:0})}})}(jQuery,window,document),define("lazyload",["jquery"],function(){}),function(e){"use strict";function t(e){var t=e.length,r=n.type(e);return"function"!==r&&!n.isWindow(e)&&(!(1!==e.nodeType||!t)||"array"===r||0===t||"number"==typeof t&&t>0&&t-1 in e)}if(!e.jQuery){var n=function(e,t){return new n.fn.init(e,t)};n.isWindow=function(e){return e&&e===e.window},n.type=function(e){return e?"object"==typeof e||"function"==typeof e?o[i.call(e)]||"object":typeof e:e+""},n.isArray=Array.isArray||function(e){return"array"===n.type(e)},n.isPlainObject=function(e){var t;if(!e||"object"!==n.type(e)||e.nodeType||n.isWindow(e))return!1;try{if(e.constructor&&!a.call(e,"constructor")&&!a.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(e){return!1}for(t in e);return void 0===t||a.call(e,t)},n.each=function(e,n,r){var o=0,a=e.length,i=t(e);if(r){if(i)for(;o0?o=i:n=i}while(Math.abs(a)>m&&++s=h?u(t,i):0===s?i:d(t,n,n+y)}(t),n,o)};S.getControlPoints=function(){return[{x:e,y:n},{x:r,y:o}]};var _="generateBezier("+[e,n,r,o]+")";return S.toString=function(){return _},S}function c(e,t){var n=e;return y.isString(e)?C.Easings[e]||(n=!1):n=y.isArray(e)&&1===e.length?function(e){return function(t){return Math.round(t*e)*(1/e)}}.apply(null,e):y.isArray(e)&&2===e.length?S.apply(null,e.concat([t])):!(!y.isArray(e)||4!==e.length)&&l.apply(null,e),!1===n&&(n=C.Easings[C.defaults.easing]?C.defaults.easing:x),n}function u(e){if(e){var t=C.timestamp&&!0!==e?e:m.now(),n=C.State.calls.length;n>1e4&&(C.State.calls=function(e){for(var t=-1,n=e?e.length:0,r=[];++t4;e--){var t=n.createElement("div");if(t.innerHTML="\x3c!--[if IE "+e+"]>=0?t:Math.max(0,r+t),s=(n<0?r+n:Math.min(n,r))-i;if(s>0)if(a=new Array(s),this.charAt)for(o=0;o=0}:function(e,t){for(var n=0;n1e-4&&Math.abs(s.v)>1e-4;);return a?function(e){return c[e*(c.length-1)|0]}:u}}();C.Easings={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},spring:function(e){return 1-Math.cos(4.5*e*Math.PI)*Math.exp(6*-e)}},f.each([["ease",[.25,.1,.25,1]],["ease-in",[.42,0,1,1]],["ease-out",[0,0,.58,1]],["ease-in-out",[.42,0,.58,1]],["easeInSine",[.47,0,.745,.715]],["easeOutSine",[.39,.575,.565,1]],["easeInOutSine",[.445,.05,.55,.95]],["easeInQuad",[.55,.085,.68,.53]],["easeOutQuad",[.25,.46,.45,.94]],["easeInOutQuad",[.455,.03,.515,.955]],["easeInCubic",[.55,.055,.675,.19]],["easeOutCubic",[.215,.61,.355,1]],["easeInOutCubic",[.645,.045,.355,1]],["easeInQuart",[.895,.03,.685,.22]],["easeOutQuart",[.165,.84,.44,1]],["easeInOutQuart",[.77,0,.175,1]],["easeInQuint",[.755,.05,.855,.06]],["easeOutQuint",[.23,1,.32,1]],["easeInOutQuint",[.86,0,.07,1]],["easeInExpo",[.95,.05,.795,.035]],["easeOutExpo",[.19,1,.22,1]],["easeInOutExpo",[1,0,0,1]],["easeInCirc",[.6,.04,.98,.335]],["easeOutCirc",[.075,.82,.165,1]],["easeInOutCirc",[.785,.135,.15,.86]]],function(e,t){C.Easings[t[0]]=l.apply(null,t[1])});var _=C.CSS={RegEx:{isHex:/^#([A-f\d]{3}){1,2}$/i,valueUnwrap:/^[A-z]+\((.*)\)$/i,wrappedValueAlreadyExtracted:/[0-9.]+ [0-9.]+ [0-9.]+( [0-9.]+)?/,valueSplit:/([A-z]+\(.+\))|(([A-z0-9#-.]+?)(?=\s|$))/gi},Lists:{colors:["fill","stroke","stopColor","color","backgroundColor","borderColor","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","outlineColor"],transformsBase:["translateX","translateY","scale","scaleX","scaleY","skewX","skewY","rotateZ"],transforms3D:["transformPerspective","translateZ","scaleZ","rotateX","rotateY"],units:["%","em","ex","ch","rem","vw","vh","vmin","vmax","cm","mm","Q","in","pc","pt","px","deg","grad","rad","turn","s","ms"],colorNames:{aliceblue:"240,248,255",antiquewhite:"250,235,215",aquamarine:"127,255,212",aqua:"0,255,255",azure:"240,255,255",beige:"245,245,220",bisque:"255,228,196",black:"0,0,0",blanchedalmond:"255,235,205",blueviolet:"138,43,226",blue:"0,0,255",brown:"165,42,42",burlywood:"222,184,135",cadetblue:"95,158,160",chartreuse:"127,255,0",chocolate:"210,105,30",coral:"255,127,80",cornflowerblue:"100,149,237",cornsilk:"255,248,220",crimson:"220,20,60",cyan:"0,255,255",darkblue:"0,0,139",darkcyan:"0,139,139",darkgoldenrod:"184,134,11",darkgray:"169,169,169",darkgrey:"169,169,169",darkgreen:"0,100,0",darkkhaki:"189,183,107",darkmagenta:"139,0,139",darkolivegreen:"85,107,47",darkorange:"255,140,0",darkorchid:"153,50,204",darkred:"139,0,0",darksalmon:"233,150,122",darkseagreen:"143,188,143",darkslateblue:"72,61,139",darkslategray:"47,79,79",darkturquoise:"0,206,209",darkviolet:"148,0,211",deeppink:"255,20,147",deepskyblue:"0,191,255",dimgray:"105,105,105",dimgrey:"105,105,105",dodgerblue:"30,144,255",firebrick:"178,34,34",floralwhite:"255,250,240",forestgreen:"34,139,34",fuchsia:"255,0,255",gainsboro:"220,220,220",ghostwhite:"248,248,255",gold:"255,215,0",goldenrod:"218,165,32",gray:"128,128,128",grey:"128,128,128",greenyellow:"173,255,47",green:"0,128,0",honeydew:"240,255,240",hotpink:"255,105,180",indianred:"205,92,92",indigo:"75,0,130",ivory:"255,255,240",khaki:"240,230,140",lavenderblush:"255,240,245",lavender:"230,230,250",lawngreen:"124,252,0",lemonchiffon:"255,250,205",lightblue:"173,216,230",lightcoral:"240,128,128",lightcyan:"224,255,255",lightgoldenrodyellow:"250,250,210",lightgray:"211,211,211",lightgrey:"211,211,211",lightgreen:"144,238,144",lightpink:"255,182,193",lightsalmon:"255,160,122",lightseagreen:"32,178,170",lightskyblue:"135,206,250",lightslategray:"119,136,153",lightsteelblue:"176,196,222",lightyellow:"255,255,224",limegreen:"50,205,50",lime:"0,255,0",linen:"250,240,230",magenta:"255,0,255",maroon:"128,0,0",mediumaquamarine:"102,205,170",mediumblue:"0,0,205",mediumorchid:"186,85,211",mediumpurple:"147,112,219",mediumseagreen:"60,179,113",mediumslateblue:"123,104,238",mediumspringgreen:"0,250,154",mediumturquoise:"72,209,204",mediumvioletred:"199,21,133",midnightblue:"25,25,112",mintcream:"245,255,250",mistyrose:"255,228,225",moccasin:"255,228,181",navajowhite:"255,222,173",navy:"0,0,128",oldlace:"253,245,230",olivedrab:"107,142,35",olive:"128,128,0",orangered:"255,69,0",orange:"255,165,0",orchid:"218,112,214",palegoldenrod:"238,232,170",palegreen:"152,251,152",paleturquoise:"175,238,238",palevioletred:"219,112,147",papayawhip:"255,239,213",peachpuff:"255,218,185",peru:"205,133,63",pink:"255,192,203",plum:"221,160,221",powderblue:"176,224,230",purple:"128,0,128",red:"255,0,0",rosybrown:"188,143,143",royalblue:"65,105,225",saddlebrown:"139,69,19",salmon:"250,128,114",sandybrown:"244,164,96",seagreen:"46,139,87",seashell:"255,245,238",sienna:"160,82,45",silver:"192,192,192",skyblue:"135,206,235",slateblue:"106,90,205",slategray:"112,128,144",snow:"255,250,250",springgreen:"0,255,127",steelblue:"70,130,180",tan:"210,180,140",teal:"0,128,128",thistle:"216,191,216",tomato:"255,99,71",turquoise:"64,224,208",violet:"238,130,238",wheat:"245,222,179",whitesmoke:"245,245,245",white:"255,255,255",yellowgreen:"154,205,50",yellow:"255,255,0"}},Hooks:{templates:{textShadow:["Color X Y Blur","black 0px 0px 0px"],boxShadow:["Color X Y Blur Spread","black 0px 0px 0px 0px"],clip:["Top Right Bottom Left","0px 0px 0px 0px"],backgroundPosition:["X Y","0% 0%"],transformOrigin:["X Y Z","50% 50% 0px"],perspectiveOrigin:["X Y","50% 50%"]},registered:{},register:function(){for(var e=0;e<_.Lists.colors.length;e++){var t="color"===_.Lists.colors[e]?"0 0 0 1":"255 255 255 1";_.Hooks.templates[_.Lists.colors[e]]=["Red Green Blue Alpha",t]}var n,r,o;if(p)for(n in _.Hooks.templates)if(_.Hooks.templates.hasOwnProperty(n)){o=(r=_.Hooks.templates[n])[0].split(" ");var a=r[1].match(_.RegEx.valueSplit);"Color"===o[0]&&(o.push(o.shift()),a.push(a.shift()),_.Hooks.templates[n]=[o.join(" "),a.join(" ")])}for(n in _.Hooks.templates)if(_.Hooks.templates.hasOwnProperty(n))for(var i in o=(r=_.Hooks.templates[n])[0].split(" "))if(o.hasOwnProperty(i)){var s=n+o[i],l=i;_.Hooks.registered[s]=[n,l]}},getRoot:function(e){var t=_.Hooks.registered[e];return t?t[0]:e},getUnit:function(e,t){var n=(e.substr(t||0,5).match(/^[a-z%]+/)||[])[0]||"";return n&&v(_.Lists.units,n)?n:""},fixColors:function(e){return e.replace(/(rgba?\(\s*)?(\b[a-z]+\b)/g,function(e,t,n){return _.Lists.colorNames.hasOwnProperty(n)?(t||"rgba(")+_.Lists.colorNames[n]+(t?"":",1)"):t+n})},cleanRootPropertyValue:function(e,t){return _.RegEx.valueUnwrap.test(t)&&(t=t.match(_.RegEx.valueUnwrap)[1]),_.Values.isCSSNullValue(t)&&(t=_.Hooks.templates[e][1]),t},extractValue:function(e,t){var n=_.Hooks.registered[e];if(n){var r=n[0],o=n[1];return(t=_.Hooks.cleanRootPropertyValue(r,t)).toString().match(_.RegEx.valueSplit)[o]}return t},injectValue:function(e,t,n){var r=_.Hooks.registered[e];if(r){var o,a=r[0],i=r[1];return(o=(n=_.Hooks.cleanRootPropertyValue(a,n)).toString().match(_.RegEx.valueSplit))[i]=t,o.join(" ")}return n}},Normalizations:{registered:{clip:function(e,t,n){switch(e){case"name":return"clip";case"extract":var r;return _.RegEx.wrappedValueAlreadyExtracted.test(n)?r=n:r=(r=n.toString().match(_.RegEx.valueUnwrap))?r[1].replace(/,(\s+)?/g," "):n,r;case"inject":return"rect("+n+")"}},blur:function(e,t,n){switch(e){case"name":return C.State.isFirefox?"filter":"-webkit-filter";case"extract":var r=parseFloat(n);if(!r&&0!==r){var o=n.toString().match(/blur\(([0-9]+[A-z]+)\)/i);r=o?o[1]:0}return r;case"inject":return parseFloat(n)?"blur("+n+")":"none"}},opacity:function(e,t,n){if(p<=8)switch(e){case"name":return"filter";case"extract":var r=n.toString().match(/alpha\(opacity=(.*)\)/i);return r?r[1]/100:1;case"inject":return t.style.zoom=1,parseFloat(n)>=1?"":"alpha(opacity="+parseInt(100*parseFloat(n),10)+")"}else switch(e){case"name":return"opacity";case"extract":case"inject":return n}}},register:function(){function e(e,t,n){if("border-box"===_.getPropertyValue(t,"boxSizing").toString().toLowerCase()===(n||!1)){var r,o,a=0,i="width"===e?["Left","Right"]:["Top","Bottom"],s=["padding"+i[0],"padding"+i[1],"border"+i[0]+"Width","border"+i[1]+"Width"];for(r=0;r9)||C.State.isGingerbread||(_.Lists.transformsBase=_.Lists.transformsBase.concat(_.Lists.transforms3D));for(var n=0;n<_.Lists.transformsBase.length;n++)!function(){var e=_.Lists.transformsBase[n];_.Normalizations.registered[e]=function(t,n,o){switch(t){case"name":return"transform";case"extract":return a(n)===r||a(n).transformCache[e]===r?/^scale/i.test(e)?1:0:a(n).transformCache[e].replace(/[()]/g,"");case"inject":var i=!1;switch(e.substr(0,e.length-1)){case"translate":i=!/(%|px|em|rem|vw|vh|\d)$/i.test(o);break;case"scal":case"scale":C.State.isAndroid&&a(n).transformCache[e]===r&&o<1&&(o=1),i=!/(\d)$/i.test(o);break;case"skew":case"rotate":i=!/(deg|\d)$/i.test(o)}return i||(a(n).transformCache[e]="("+o+")"),a(n).transformCache[e]}}}();for(var o=0;o<_.Lists.colors.length;o++)!function(){var e=_.Lists.colors[o];_.Normalizations.registered[e]=function(t,n,o){switch(t){case"name":return e;case"extract":var a;if(_.RegEx.wrappedValueAlreadyExtracted.test(o))a=o;else{var i,s={black:"rgb(0, 0, 0)",blue:"rgb(0, 0, 255)",gray:"rgb(128, 128, 128)",green:"rgb(0, 128, 0)",red:"rgb(255, 0, 0)",white:"rgb(255, 255, 255)"};/^[A-z]+$/i.test(o)?i=s[o]!==r?s[o]:s.black:_.RegEx.isHex.test(o)?i="rgb("+_.Values.hexToRgb(o).join(" ")+")":/^rgba?\(/i.test(o)||(i=s.black),a=(i||o).toString().match(_.RegEx.valueUnwrap)[1].replace(/,(\s+)?/g," ")}return(!p||p>8)&&3===a.split(" ").length&&(a+=" 1"),a;case"inject":return/^rgb/.test(o)?o:(p<=8?4===o.split(" ").length&&(o=o.split(/\s+/).slice(0,3).join(" ")):3===o.split(" ").length&&(o+=" 1"),(p<=8?"rgb":"rgba")+"("+o.replace(/\s+/g,",").replace(/\.(\d)+(?=,)/g,"")+")")}}}();_.Normalizations.registered.innerWidth=t("width",!0),_.Normalizations.registered.innerHeight=t("height",!0),_.Normalizations.registered.outerWidth=t("width"),_.Normalizations.registered.outerHeight=t("height")}},Names:{camelCase:function(e){return e.replace(/-(\w)/g,function(e,t){return t.toUpperCase()})},SVGAttribute:function(e){var t="width|height|x|y|cx|cy|r|rx|ry|x1|x2|y1|y2";return(p||C.State.isAndroid&&!C.State.isChrome)&&(t+="|transform"),new RegExp("^("+t+")$","i").test(e)},prefixCheck:function(e){if(C.State.prefixMatches[e])return[C.State.prefixMatches[e],!0];for(var t=["","Webkit","Moz","ms","O"],n=0,r=t.length;n=2&&console.log("Get "+n+": "+l),l},setPropertyValue:function(e,n,r,o,i){var s=n;if("scroll"===n)i.container?i.container["scroll"+i.direction]=r:"Left"===i.direction?t.scrollTo(r,i.alternateValue):t.scrollTo(i.alternateValue,r);else if(_.Normalizations.registered[n]&&"transform"===_.Normalizations.registered[n]("name",e))_.Normalizations.registered[n]("inject",e,r),s="transform",r=a(e).transformCache[n];else{if(_.Hooks.registered[n]){var l=n,c=_.Hooks.getRoot(n);o=o||_.getPropertyValue(e,c),r=_.Hooks.injectValue(l,r,o),n=c}if(_.Normalizations.registered[n]&&(r=_.Normalizations.registered[n]("inject",e,r),n=_.Normalizations.registered[n]("name",e)),s=_.Names.prefixCheck(n)[0],p<=8)try{e.style[s]=r}catch(e){C.debug&&console.log("Browser does not support ["+r+"] for ["+s+"]")}else{var u=a(e);u&&u.isSVG&&_.Names.SVGAttribute(n)?e.setAttribute(n,r):e.style[s]=r}C.debug>=2&&console.log("Set "+n+" ("+s+"): "+r)}return[s,r]},flushTransformCache:function(e){var t="",n=a(e);if((p||C.State.isAndroid&&!C.State.isChrome)&&n&&n.isSVG){var r=function(t){return parseFloat(_.getPropertyValue(e,t))},o={translate:[r("translateX"),r("translateY")],skewX:[r("skewX")],skewY:[r("skewY")],scale:1!==r("scale")?[r("scale"),r("scale")]:[r("scaleX"),r("scaleY")],rotate:[r("rotateZ"),0,0]};f.each(a(e).transformCache,function(e){/^translate/i.test(e)?e="translate":/^scale/i.test(e)?e="scale":/^rotate/i.test(e)&&(e="rotate"),o[e]&&(t+=e+"("+o[e].join(" ")+") ",delete o[e])})}else{var i,s;f.each(a(e).transformCache,function(n){if(i=a(e).transformCache[n],"transformPerspective"===n)return s=i,!0;9===p&&"rotateZ"===n&&(n="rotate"),t+=n+i+" "}),s&&(t="perspective"+s+" "+t)}_.setPropertyValue(e,"transform",t)}};_.Hooks.register(),_.Normalizations.register(),C.hook=function(e,t,n){var i;return e=o(e),f.each(e,function(e,o){if(a(o)===r&&C.init(o),n===r)i===r&&(i=_.getPropertyValue(o,t));else{var s=_.setPropertyValue(o,t,n);"transform"===s[0]&&C.CSS.flushTransformCache(o),i=s}}),i};var T=function(){function e(){return h?I.promise||null:m}function l(e,o){function i(i){var p,h;if(l.begin&&0===E)try{l.begin.call(b,b)}catch(e){setTimeout(function(){throw e},1)}if("scroll"===k){var m,g,w,T=/^x$/i.test(l.axis)?"Left":"Top",D=parseFloat(l.offset)||0;l.container?y.isWrapped(l.container)||y.isNode(l.container)?(l.container=l.container[0]||l.container,w=(m=l.container["scroll"+T])+f(e).position()[T.toLowerCase()]+D):l.container=null:(m=C.State.scrollAnchor[C.State["scrollProperty"+T]],g=C.State.scrollAnchor[C.State["scrollProperty"+("Left"===T?"Top":"Left")]],w=f(e).offset()[T.toLowerCase()]+D),d={scroll:{rootPropertyValue:!1,startValue:m,currentValue:m,endValue:w,unitType:"",easing:l.easing,scrollData:{container:l.container,direction:T,alternateValue:g}},element:e},C.debug&&console.log("tweensContainer (scroll): ",d.scroll,e)}else if("reverse"===k){if(!(p=a(e)))return;if(!p.tweensContainer)return void f.dequeue(e,l.queue);for(var O in"none"===p.opts.display&&(p.opts.display="auto"),"hidden"===p.opts.visibility&&(p.opts.visibility="visible"),p.opts.loop=!1,p.opts.begin=null,p.opts.complete=null,S.easing||delete l.easing,S.duration||delete l.duration,l=f.extend({},p.opts,l),h=f.extend(!0,{},p?p.tweensContainer:null))if(h.hasOwnProperty(O)&&"element"!==O){var F=h[O].startValue;h[O].startValue=h[O].currentValue=h[O].endValue,h[O].endValue=F,y.isEmptyObject(S)||(h[O].easing=l.easing),C.debug&&console.log("reverse tweensContainer ("+O+"): "+JSON.stringify(h[O]),e)}d=h}else if("start"===k){(p=a(e))&&p.tweensContainer&&!0===p.isAnimating&&(h=p.tweensContainer);var P=function(o,a){var i,c=_.Hooks.getRoot(o),u=!1,m=a[0],g=a[1],v=a[2];if(p&&p.isSVG||"tween"===c||!1!==_.Names.prefixCheck(c)[1]||_.Normalizations.registered[c]!==r){(l.display!==r&&null!==l.display&&"none"!==l.display||l.visibility!==r&&"hidden"!==l.visibility)&&/opacity|filter/.test(o)&&!v&&0!==m&&(v=0),l._cacheValues&&h&&h[o]?(v===r&&(v=h[o].endValue+h[o].unitType),u=p.rootPropertyValueCache[c]):_.Hooks.registered[o]?v===r?(u=_.getPropertyValue(e,c),v=_.getPropertyValue(e,o,u)):u=_.Hooks.templates[c][1]:v===r&&(v=_.getPropertyValue(e,o));var b,w,x,S=!1,T=function(e,t){var n,r;return r=(t||"0").toString().toLowerCase().replace(/[%A-z]+$/,function(e){return n=e,""}),n||(n=_.Values.getUnitType(e)),[r,n]};if(v!==m&&y.isString(v)&&y.isString(m)){i="";var D=0,I=0,k=[],A=[],E=0,O=0,F=0;for(v=_.Hooks.fixColors(v),m=_.Hooks.fixColors(m);D=4&&"("===P?E++:(E&&E<5||E>=4&&")"===P&&--E<5)&&(E=0),0===O&&"r"===P||1===O&&"g"===P||2===O&&"b"===P||3===O&&"a"===P||O>=3&&"("===P?(3===O&&"a"===P&&(F=1),O++):F&&","===P?++F>3&&(O=F=0):(F&&O<(F?5:4)||O>=(F?4:3)&&")"===P&&--O<(F?5:4))&&(O=F=0)}}D===v.length&&I===m.length||(C.debug&&console.error('Trying to pattern match mis-matched strings ["'+m+'", "'+v+'"]'),i=r),i&&(k.length?(C.debug&&console.log('Pattern found "'+i+'" -> ',k,A,"["+v+","+m+"]"),v=k,m=A,w=x=""):i=r)}if(i||(v=(b=T(o,v))[0],x=b[1],m=(b=T(o,m))[0].replace(/^([+-\/*])=/,function(e,t){return S=t,""}),w=b[1],v=parseFloat(v)||0,m=parseFloat(m)||0,"%"===w&&(/^(fontSize|lineHeight)$/.test(o)?(m/=100,w="em"):/^scale/.test(o)?(m/=100,w=""):/(Red|Green|Blue)$/i.test(o)&&(m=m/100*255,w=""))),/[\/*]/.test(S))w=x;else if(x!==w&&0!==v)if(0===m)w=x;else{s=s||function(){var r={myParent:e.parentNode||n.body,position:_.getPropertyValue(e,"position"),fontSize:_.getPropertyValue(e,"fontSize")},o=r.position===N.lastPosition&&r.myParent===N.lastParent,a=r.fontSize===N.lastFontSize;N.lastParent=r.myParent,N.lastPosition=r.position,N.lastFontSize=r.fontSize;var i={};if(a&&o)i.emToPx=N.lastEmToPx,i.percentToPxWidth=N.lastPercentToPxWidth,i.percentToPxHeight=N.lastPercentToPxHeight;else{var s=p&&p.isSVG?n.createElementNS("http://www.w3.org/2000/svg","rect"):n.createElement("div");C.init(s),r.myParent.appendChild(s),f.each(["overflow","overflowX","overflowY"],function(e,t){C.CSS.setPropertyValue(s,t,"hidden")}),C.CSS.setPropertyValue(s,"position",r.position),C.CSS.setPropertyValue(s,"fontSize",r.fontSize),C.CSS.setPropertyValue(s,"boxSizing","content-box"),f.each(["minWidth","maxWidth","width","minHeight","maxHeight","height"],function(e,t){C.CSS.setPropertyValue(s,t,"100%")}),C.CSS.setPropertyValue(s,"paddingLeft","100em"),i.percentToPxWidth=N.lastPercentToPxWidth=(parseFloat(_.getPropertyValue(s,"width",null,!0))||1)/100,i.percentToPxHeight=N.lastPercentToPxHeight=(parseFloat(_.getPropertyValue(s,"height",null,!0))||1)/100,i.emToPx=N.lastEmToPx=(parseFloat(_.getPropertyValue(s,"paddingLeft"))||1)/100,r.myParent.removeChild(s)}return null===N.remToPx&&(N.remToPx=parseFloat(_.getPropertyValue(n.body,"fontSize"))||16),null===N.vwToPx&&(N.vwToPx=parseFloat(t.innerWidth)/100,N.vhToPx=parseFloat(t.innerHeight)/100),i.remToPx=N.remToPx,i.vwToPx=N.vwToPx,i.vhToPx=N.vhToPx,C.debug>=1&&console.log("Unit ratios: "+JSON.stringify(i),e),i}();var z=/margin|padding|left|right|width|text|word|letter/i.test(o)||/X$/.test(o)||"x"===o?"x":"y";switch(x){case"%":v*="x"===z?s.percentToPxWidth:s.percentToPxHeight;break;case"px":break;default:v*=s[x+"ToPx"]}switch(w){case"%":v*=1/("x"===z?s.percentToPxWidth:s.percentToPxHeight);break;case"px":break;default:v*=1/s[w+"ToPx"]}}switch(S){case"+":m=v+m;break;case"-":m=v-m;break;case"*":m*=v;break;case"/":m=v/m}d[o]={rootPropertyValue:u,startValue:v,currentValue:v,endValue:m,unitType:w,easing:g},i&&(d[o].pattern=i),C.debug&&console.log("tweensContainer ("+o+"): "+JSON.stringify(d[o]),e)}else C.debug&&console.log("Skipping ["+c+"] due to a lack of browser support.")};for(var j in x)if(x.hasOwnProperty(j)){var R=_.Names.camelCase(j),L=function(t,n){var r,a,i;return y.isFunction(t)&&(t=t.call(e,o,A)),y.isArray(t)?(r=t[0],!y.isArray(t[1])&&/^[\d-]/.test(t[1])||y.isFunction(t[1])||_.RegEx.isHex.test(t[1])?i=t[1]:y.isString(t[1])&&!_.RegEx.isHex.test(t[1])&&C.Easings[t[1]]||y.isArray(t[1])?(a=c(t[1],l.duration),i=t[2]):i=t[1]||t[2]):r=t,a=a||l.easing,y.isFunction(r)&&(r=r.call(e,o,A)),y.isFunction(i)&&(i=i.call(e,o,A)),[r||0,a,i]}(x[j]);if(v(_.Lists.colors,R)){var B=L[0],M=L[1],H=L[2];if(_.RegEx.isHex.test(B)){for(var q=["Red","Green","Blue"],U=_.Values.hexToRgb(B),z=H?_.Values.hexToRgb(H):r,W=0;WparseFloat(n[1]))}({major:1,minor:1,patch:0},o.version)){var i="Velocity UI Pack: You need to update Velocity (velocity.js) to a newer version. Visit http://github.com/julianshapiro/velocity.";throw alert(i),new Error(i)}for(var s in o.RegisterEffect=o.RegisterUI=function(e,t){function n(e,t,n,r){var i,s=0;a.each(e.nodeType?[e]:e,function(e,t){r&&(n+=e*r),i=t.parentNode;var l=["height","paddingTop","paddingBottom","marginTop","marginBottom"];"border-box"===o.CSS.getPropertyValue(t,"boxSizing").toString().toLowerCase()&&(l=["height"]),a.each(l,function(e,n){s+=parseFloat(o.CSS.getPropertyValue(t,n))})}),o.animate(i,{height:("In"===t?"+":"-")+"="+s},{queue:!1,easing:"ease-in-out",duration:n*("In"===t?.6:1)})}return o.Redirects[e]=function(r,i,s,l,c,u,d){var f=s===l-1,p=0;d=d||t.loop,"function"==typeof t.defaultDuration?t.defaultDuration=t.defaultDuration.call(c,c):t.defaultDuration=parseFloat(t.defaultDuration);for(var h=0;h=1?0:t.calls.length?(1-p)/t.calls.length:1;for(h=0;h1&&(a.each(t.reverse(),function(e,n){var r=t[e+1];if(r){var i=n.o||n.options,s=r.o||r.options,l=i&&!1===i.sequenceQueue?"begin":"complete",c=s&&s[l],u={};u[l]=function(){var e=r.e||r.elements,t=e.nodeType?[e]:e;c&&c.call(t,t),o(n)},r.o?r.o=a.extend({},s,u):r.options=a.extend({},s,u)}}),t.reverse()),o(t[0])}}else t.console&&console.log("Velocity UI Pack: Velocity must be loaded first. Aborting.")}(window.jQuery||window.Zepto||window,window,window&&window.document)}),function(e){"function"==typeof define&&define.amd?define("mousewheel",["jquery"],e):"object"==typeof exports?module.exports=e:e(jQuery)}(function(e){function t(t){var i=t||window.event,s=l.call(arguments,1),c=0,d=0,f=0,p=0,h=0,m=0;if((t=e.event.fix(i)).type="mousewheel","detail"in i&&(f=-1*i.detail),"wheelDelta"in i&&(f=i.wheelDelta),"wheelDeltaY"in i&&(f=i.wheelDeltaY),"wheelDeltaX"in i&&(d=-1*i.wheelDeltaX),"axis"in i&&i.axis===i.HORIZONTAL_AXIS&&(d=-1*f,f=0),c=0===f?d:f,"deltaY"in i&&(c=f=-1*i.deltaY),"deltaX"in i&&(d=i.deltaX,0===f&&(c=-1*d)),0!==f||0!==d){if(1===i.deltaMode){var g=e.data(this,"mousewheel-line-height");c*=g,f*=g,d*=g}else if(2===i.deltaMode){var v=e.data(this,"mousewheel-page-height");c*=v,f*=v,d*=v}if(p=Math.max(Math.abs(f),Math.abs(d)),(!a||a>p)&&(a=p,r(i,p)&&(a/=40)),r(i,p)&&(c/=40,d/=40,f/=40),c=Math[c>=1?"floor":"ceil"](c/a),d=Math[d>=1?"floor":"ceil"](d/a),f=Math[f>=1?"floor":"ceil"](f/a),u.settings.normalizeOffset&&this.getBoundingClientRect){var y=this.getBoundingClientRect();h=t.clientX-y.left,m=t.clientY-y.top}return t.deltaX=d,t.deltaY=f,t.deltaFactor=a,t.offsetX=h,t.offsetY=m,t.deltaMode=0,s.unshift(t,c,d,f),o&&clearTimeout(o),o=setTimeout(n,200),(e.event.dispatch||e.event.handle).apply(this,s)}}function n(){a=null}function r(e,t){return u.settings.adjustOldDeltas&&"mousewheel"===e.type&&t%120==0}var o,a,i=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],s="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],l=Array.prototype.slice;if(e.event.fixHooks)for(var c=i.length;c;)e.event.fixHooks[i[--c]]=e.event.mouseHooks;var u=e.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var n=s.length;n;)this.addEventListener(s[--n],t,!1);else this.onmousewheel=t;e.data(this,"mousewheel-line-height",u.getLineHeight(this)),e.data(this,"mousewheel-page-height",u.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var n=s.length;n;)this.removeEventListener(s[--n],t,!1);else this.onmousewheel=null;e.removeData(this,"mousewheel-line-height"),e.removeData(this,"mousewheel-page-height")},getLineHeight:function(t){var n=e(t),r=n["offsetParent"in e.fn?"offsetParent":"parent"]();return r.length||(r=e("body")),parseInt(r.css("fontSize"),10)||parseInt(n.css("fontSize"),10)||16},getPageHeight:function(t){return e(t).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};e.fn.extend({mousewheel:function(e){return e?this.bind("mousewheel",e):this.trigger("mousewheel")},unmousewheel:function(e){return this.unbind("mousewheel",e)}})}),function(e){"function"==typeof define&&define.amd?define("customScrollbar",["jquery"],e):"undefined"!=typeof module&&module.exports?module.exports=e:e(jQuery,window,document)}(function(e){var t,n,r;t="function"==typeof define&&define.amd,n="undefined"!=typeof module&&module.exports,r="https:"==document.location.protocol?"https:":"http:",t||(n?require("jquery-mousewheel")(e):e.event.special.mousewheel||e("head").append(decodeURI("%3Cscript src="+r+"//cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.1.13/jquery.mousewheel.min.js%3E%3C/script%3E"))),function(){var t,n="mCustomScrollbar",r="mCS",o=".mCustomScrollbar",a={setTop:0,setLeft:0,axis:"y",scrollbarPosition:"inside",scrollInertia:950,autoDraggerLength:!0,alwaysShowScrollbar:0,snapOffset:0,mouseWheel:{enable:!0,scrollAmount:"auto",axis:"y",deltaFactor:"auto",disableOver:["select","option","keygen","datalist","textarea"]},scrollButtons:{scrollType:"stepless",scrollAmount:"auto"},keyboard:{enable:!0,scrollType:"stepless",scrollAmount:"auto"},contentTouchScroll:25,documentTouchScroll:!0,advanced:{autoScrollOnFocus:"input,textarea,select,button,datalist,keygen,a[tabindex],area,object,[contenteditable='true']",updateOnContentResize:!0,updateOnImageLoad:"auto",autoUpdateTimeout:60},theme:"light",callbacks:{onTotalScrollOffset:0,onTotalScrollBackOffset:0,alwaysTriggerOffsets:!0}},i=0,s={},l=window.attachEvent&&!window.addEventListener?1:0,c=!1,u=["mCSB_dragger_onDrag","mCSB_scrollTools_onDrag","mCS_img_loaded","mCS_disabled","mCS_destroyed","mCS_no_scrollbar","mCS-autoHide","mCS-dir-rtl","mCS_no_scrollbar_y","mCS_no_scrollbar_x","mCS_y_hidden","mCS_x_hidden","mCSB_draggerContainer","mCSB_buttonUp","mCSB_buttonDown","mCSB_buttonLeft","mCSB_buttonRight"],d={init:function(t){var t=e.extend(!0,{},a,t),n=f.call(this);if(t.live){var l=t.liveSelector||this.selector||o,c=e(l);if("off"===t.live)return void h(l);s[l]=setTimeout(function(){c.mCustomScrollbar(t),"once"===t.live&&c.length&&h(l)},500)}else h(l);return t.setWidth=t.set_width?t.set_width:t.setWidth,t.setHeight=t.set_height?t.set_height:t.setHeight,t.axis=t.horizontalScroll?"x":m(t.axis),t.scrollInertia=t.scrollInertia>0&&t.scrollInertia<17?17:t.scrollInertia,"object"!=typeof t.mouseWheel&&1==t.mouseWheel&&(t.mouseWheel={enable:!0,scrollAmount:"auto",axis:"y",preventDefault:!1,deltaFactor:"auto",normalizeDelta:!1,invert:!1}),t.mouseWheel.scrollAmount=t.mouseWheelPixels?t.mouseWheelPixels:t.mouseWheel.scrollAmount,t.mouseWheel.normalizeDelta=t.advanced.normalizeMouseWheelDelta?t.advanced.normalizeMouseWheelDelta:t.mouseWheel.normalizeDelta,t.scrollButtons.scrollType=g(t.scrollButtons.scrollType),p(t),e(n).each(function(){var n=e(this);if(!n.data(r)){n.data(r,{idx:++i,opt:t,scrollRatio:{y:null,x:null},overflowed:null,contentReset:{y:null,x:null},bindEvents:!1,tweenRunning:!1,sequential:{},langDir:n.css("direction"),cbOffsets:null,trigger:null,poll:{size:{o:0,n:0},img:{o:0,n:0},change:{o:0,n:0}}});var o=n.data(r),a=o.opt,s=n.data("mcs-axis"),l=n.data("mcs-scrollbar-position"),c=n.data("mcs-theme");s&&(a.axis=s),l&&(a.scrollbarPosition=l),c&&(a.theme=c,p(a)),v.call(this),o&&a.callbacks.onCreate&&"function"==typeof a.callbacks.onCreate&&a.callbacks.onCreate.call(this),e("#mCSB_"+o.idx+"_container img:not(."+u[2]+")").addClass(u[2]),d.update.call(null,n)}})},update:function(t,n){var o=t||f.call(this);return e(o).each(function(){var t=e(this);if(t.data(r)){var o=t.data(r),a=o.opt,i=e("#mCSB_"+o.idx+"_container"),s=e("#mCSB_"+o.idx),l=[e("#mCSB_"+o.idx+"_dragger_vertical"),e("#mCSB_"+o.idx+"_dragger_horizontal")];if(!i.length)return;o.tweenRunning&&X(t),n&&o&&a.callbacks.onBeforeUpdate&&"function"==typeof a.callbacks.onBeforeUpdate&&a.callbacks.onBeforeUpdate.call(this),t.hasClass(u[3])&&t.removeClass(u[3]),t.hasClass(u[4])&&t.removeClass(u[4]),s.css("max-height","none"),s.height()!==t.height()&&s.css("max-height",t.height()),b.call(this),"y"===a.axis||a.advanced.autoExpandHorizontalScroll||i.css("width",y(i)),o.overflowed=_.call(this),k.call(this),a.autoDraggerLength&&x.call(this),C.call(this),D.call(this);var c=[Math.abs(i[0].offsetTop),Math.abs(i[0].offsetLeft)];"x"!==a.axis&&(o.overflowed[0]?l[0].height()>l[0].parent().height()?T.call(this):(Y(t,c[0].toString(),{dir:"y",dur:0,overwrite:"none"}),o.contentReset.y=null):(T.call(this),"y"===a.axis?I.call(this):"yx"===a.axis&&o.overflowed[1]&&Y(t,c[1].toString(),{dir:"x",dur:0,overwrite:"none"}))),"y"!==a.axis&&(o.overflowed[1]?l[1].width()>l[1].parent().width()?T.call(this):(Y(t,c[1].toString(),{dir:"x",dur:0,overwrite:"none"}),o.contentReset.x=null):(T.call(this),"x"===a.axis?I.call(this):"yx"===a.axis&&o.overflowed[0]&&Y(t,c[0].toString(),{dir:"y",dur:0,overwrite:"none"}))),n&&o&&(2===n&&a.callbacks.onImageLoad&&"function"==typeof a.callbacks.onImageLoad?a.callbacks.onImageLoad.call(this):3===n&&a.callbacks.onSelectorChange&&"function"==typeof a.callbacks.onSelectorChange?a.callbacks.onSelectorChange.call(this):a.callbacks.onUpdate&&"function"==typeof a.callbacks.onUpdate&&a.callbacks.onUpdate.call(this)),V.call(this)}})},scrollTo:function(t,n){if(void 0!==t&&null!=t){var o=f.call(this);return e(o).each(function(){var o=e(this);if(o.data(r)){var a=o.data(r),i=a.opt,s={trigger:"external",scrollInertia:i.scrollInertia,scrollEasing:"mcsEaseInOut",moveDragger:!1,timeout:60,callbacks:!0,onStart:!0,onUpdate:!0,onComplete:!0},l=e.extend(!0,{},s,n),c=z.call(this,t),u=l.scrollInertia>0&&l.scrollInertia<17?17:l.scrollInertia;c[0]=W.call(this,c[0],"y"),c[1]=W.call(this,c[1],"x"),l.moveDragger&&(c[0]*=a.scrollRatio.y,c[1]*=a.scrollRatio.x),l.dur=re()?0:u,setTimeout(function(){null!==c[0]&&void 0!==c[0]&&"x"!==i.axis&&a.overflowed[0]&&(l.dir="y",l.overwrite="all",Y(o,c[0].toString(),l)),null!==c[1]&&void 0!==c[1]&&"y"!==i.axis&&a.overflowed[1]&&(l.dir="x",l.overwrite="none",Y(o,c[1].toString(),l))},l.timeout)}})}},stop:function(){var t=f.call(this);return e(t).each(function(){var t=e(this);t.data(r)&&X(t)})},disable:function(t){var n=f.call(this);return e(n).each(function(){var n=e(this);n.data(r)&&(n.data(r),V.call(this,"remove"),I.call(this),t&&T.call(this),k.call(this,!0),n.addClass(u[3]))})},destroy:function(){var t=f.call(this);return e(t).each(function(){var o=e(this);if(o.data(r)){var a=o.data(r),i=a.opt,s=e("#mCSB_"+a.idx),l=e("#mCSB_"+a.idx+"_container"),c=e(".mCSB_"+a.idx+"_scrollbar");i.live&&h(i.liveSelector||e(t).selector),V.call(this,"remove"),I.call(this),T.call(this),o.removeData(r),K(this,"mcs"),c.remove(),l.find("img."+u[2]).removeClass(u[2]),s.replaceWith(l.contents()),o.removeClass(n+" _"+r+"_"+a.idx+" "+u[6]+" "+u[7]+" "+u[5]+" "+u[3]).addClass(u[4])}})}},f=function(){return"object"!=typeof e(this)||e(this).length<1?o:this},p=function(t){t.autoDraggerLength=!(e.inArray(t.theme,["rounded","rounded-dark","rounded-dots","rounded-dots-dark"])>-1)&&t.autoDraggerLength,t.autoExpandScrollbar=!(e.inArray(t.theme,["rounded-dots","rounded-dots-dark","3d","3d-dark","3d-thick","3d-thick-dark","inset","inset-dark","inset-2","inset-2-dark","inset-3","inset-3-dark"])>-1)&&t.autoExpandScrollbar,t.scrollButtons.enable=!(e.inArray(t.theme,["minimal","minimal-dark"])>-1)&&t.scrollButtons.enable,t.autoHideScrollbar=e.inArray(t.theme,["minimal","minimal-dark"])>-1||t.autoHideScrollbar,t.scrollbarPosition=e.inArray(t.theme,["minimal","minimal-dark"])>-1?"outside":t.scrollbarPosition},h=function(e){s[e]&&(clearTimeout(s[e]),K(s,e))},m=function(e){return"yx"===e||"xy"===e||"auto"===e?"yx":"x"===e||"horizontal"===e?"x":"y"},g=function(e){return"stepped"===e||"pixels"===e||"step"===e||"click"===e?"stepped":"stepless"},v=function(){var t=e(this),o=t.data(r),a=o.opt,i=a.autoExpandScrollbar?" "+u[1]+"_expand":"",s=["
              ","
              "],l="yx"===a.axis?"mCSB_vertical_horizontal":"x"===a.axis?"mCSB_horizontal":"mCSB_vertical",c="yx"===a.axis?s[0]+s[1]:"x"===a.axis?s[1]:s[0],d="yx"===a.axis?"
              ":"",f=a.autoHideScrollbar?" "+u[6]:"",p="x"!==a.axis&&"rtl"===o.langDir?" "+u[7]:"";a.setWidth&&t.css("width",a.setWidth),a.setHeight&&t.css("height",a.setHeight),a.setLeft="y"!==a.axis&&"rtl"===o.langDir?"989999px":a.setLeft,t.addClass(n+" _"+r+"_"+o.idx+f+p).wrapInner("
              ");var h=e("#mCSB_"+o.idx),m=e("#mCSB_"+o.idx+"_container");"y"===a.axis||a.advanced.autoExpandHorizontalScroll||m.css("width",y(m)),"outside"===a.scrollbarPosition?("static"===t.css("position")&&t.css("position","relative"),t.css("overflow","visible"),h.addClass("mCSB_outside").after(c)):(h.addClass("mCSB_inside").append(c),m.wrap(d)),w.call(this);var g=[e("#mCSB_"+o.idx+"_dragger_vertical"),e("#mCSB_"+o.idx+"_dragger_horizontal")];g[0].css("min-height",g[0].height()),g[1].css("min-width",g[1].width())},y=function(t){var n=[t[0].scrollWidth,Math.max.apply(Math,t.children().map(function(){return e(this).outerWidth(!0)}).get())],r=t.parent().width();return n[0]>r?n[0]:n[1]>r?n[1]:"100%"},b=function(){var t=e(this),n=t.data(r),o=n.opt,a=e("#mCSB_"+n.idx+"_container");if(o.advanced.autoExpandHorizontalScroll&&"y"!==o.axis){a.css({width:"auto","min-width":0,"overflow-x":"scroll"});var i=Math.ceil(a[0].scrollWidth);3===o.advanced.autoExpandHorizontalScroll||2!==o.advanced.autoExpandHorizontalScroll&&i>a.parent().width()?a.css({width:i,"min-width":"100%","overflow-x":"inherit"}):a.css({"overflow-x":"inherit",position:"absolute"}).wrap("
              ").css({width:Math.ceil(a[0].getBoundingClientRect().right+.4)-Math.floor(a[0].getBoundingClientRect().left),"min-width":"100%",position:"relative"}).unwrap()}},w=function(){var t=e(this),n=t.data(r),o=n.opt,a=e(".mCSB_"+n.idx+"_scrollbar:first"),i=te(o.scrollButtons.tabindex)?"tabindex='"+o.scrollButtons.tabindex+"'":"",s=["","","",""],l=["x"===o.axis?s[2]:s[0],"x"===o.axis?s[3]:s[1],s[2],s[3]];o.scrollButtons.enable&&a.prepend(l[0]).append(l[1]).next(".mCSB_scrollTools").prepend(l[2]).append(l[3])},x=function(){var t=e(this),n=t.data(r),o=e("#mCSB_"+n.idx),a=e("#mCSB_"+n.idx+"_container"),i=[e("#mCSB_"+n.idx+"_dragger_vertical"),e("#mCSB_"+n.idx+"_dragger_horizontal")],s=[o.height()/a.outerHeight(!1),o.width()/a.outerWidth(!1)],c=[parseInt(i[0].css("min-height")),Math.round(s[0]*i[0].parent().height()),parseInt(i[1].css("min-width")),Math.round(s[1]*i[1].parent().width())],u=l&&c[1]i&&(i=l),c>s&&(s=c),[i>o.height(),s>o.width()]},T=function(){var t=e(this),n=t.data(r),o=n.opt,a=e("#mCSB_"+n.idx),i=e("#mCSB_"+n.idx+"_container"),s=[e("#mCSB_"+n.idx+"_dragger_vertical"),e("#mCSB_"+n.idx+"_dragger_horizontal")];if(X(t),("x"!==o.axis&&!n.overflowed[0]||"y"===o.axis&&n.overflowed[0])&&(s[0].add(i).css("top",0),Y(t,"_resetY")),"y"!==o.axis&&!n.overflowed[1]||"x"===o.axis&&n.overflowed[1]){var l=dx=0;"rtl"===n.langDir&&(l=a.width()-i.outerWidth(!1),dx=Math.abs(l/n.scrollRatio.x)),i.css("left",l),s[1].css("left",dx),Y(t,"_resetX")}},D=function(){var t,n=e(this),o=n.data(r),a=o.opt;o.bindEvents||(E.call(this),a.contentTouchScroll&&O.call(this),F.call(this),a.mouseWheel.enable&&function r(){t=setTimeout(function(){e.event.special.mousewheel?(clearTimeout(t),P.call(n[0])):r()},100)}(),$.call(this),M.call(this),a.advanced.autoScrollOnFocus&&B.call(this),a.scrollButtons.enable&&H.call(this),a.keyboard.enable&&q.call(this),o.bindEvents=!0)},I=function(){var t=e(this),n=t.data(r),o=n.opt,a=r+"_"+n.idx,i=".mCSB_"+n.idx+"_scrollbar",s=e("#mCSB_"+n.idx+",#mCSB_"+n.idx+"_container,#mCSB_"+n.idx+"_container_wrapper,"+i+" ."+u[12]+",#mCSB_"+n.idx+"_dragger_vertical,#mCSB_"+n.idx+"_dragger_horizontal,"+i+">a"),l=e("#mCSB_"+n.idx+"_container");o.advanced.releaseDraggableSelectors&&s.add(e(o.advanced.releaseDraggableSelectors)),o.advanced.extraDraggableSelectors&&s.add(e(o.advanced.extraDraggableSelectors)),n.bindEvents&&(e(document).add(e(!R()||top.document)).unbind("."+a),s.each(function(){e(this).unbind("."+a)}),clearTimeout(t[0]._focusTimeout),K(t[0],"_focusTimeout"),clearTimeout(n.sequential.step),K(n.sequential,"step"),clearTimeout(l[0].onCompleteTimeout),K(l[0],"onCompleteTimeout"),n.bindEvents=!1)},k=function(t){var n=e(this),o=n.data(r),a=o.opt,i=e("#mCSB_"+o.idx+"_container_wrapper"),s=i.length?i:e("#mCSB_"+o.idx+"_container"),l=[e("#mCSB_"+o.idx+"_scrollbar_vertical"),e("#mCSB_"+o.idx+"_scrollbar_horizontal")],c=[l[0].find(".mCSB_dragger"),l[1].find(".mCSB_dragger")];"x"!==a.axis&&(o.overflowed[0]&&!t?(l[0].add(c[0]).add(l[0].children("a")).css("display","block"),s.removeClass(u[8]+" "+u[10])):(a.alwaysShowScrollbar?(2!==a.alwaysShowScrollbar&&c[0].css("display","none"),s.removeClass(u[10])):(l[0].css("display","none"),s.addClass(u[10])),s.addClass(u[8]))),"y"!==a.axis&&(o.overflowed[1]&&!t?(l[1].add(c[1]).add(l[1].children("a")).css("display","block"),s.removeClass(u[9]+" "+u[11])):(a.alwaysShowScrollbar?(2!==a.alwaysShowScrollbar&&c[1].css("display","none"),s.removeClass(u[11])):(l[1].css("display","none"),s.addClass(u[11])),s.addClass(u[9]))),o.overflowed[0]||o.overflowed[1]?n.removeClass(u[5]):n.addClass(u[5])},A=function(t){var n=t.type,r=t.target.ownerDocument!==document&&null!==frameElement?[e(frameElement).offset().top,e(frameElement).offset().left]:null,o=R()&&t.target.ownerDocument!==top.document&&null!==frameElement?[e(t.view.frameElement).offset().top,e(t.view.frameElement).offset().left]:[0,0];switch(n){case"pointerdown":case"MSPointerDown":case"pointermove":case"MSPointerMove":case"pointerup":case"MSPointerUp":return r?[t.originalEvent.pageY-r[0]+o[0],t.originalEvent.pageX-r[1]+o[1],!1]:[t.originalEvent.pageY,t.originalEvent.pageX,!1];case"touchstart":case"touchmove":case"touchend":var a=t.originalEvent.touches[0]||t.originalEvent.changedTouches[0],i=t.originalEvent.touches.length||t.originalEvent.changedTouches.length;return t.target.ownerDocument!==document?[a.screenY,a.screenX,i>1]:[a.pageY,a.pageX,i>1];default:return r?[t.pageY-r[0]+o[0],t.pageX-r[1]+o[1],!1]:[t.pageY,t.pageX,!1]}},E=function(){function t(e,t,r,o){if(p[0].idleTimer=u.scrollInertia<233?250:0,n.attr("id")===f[1])var a="x",l=(n[0].offsetLeft-t+o)*s.scrollRatio.x;else var a="y",l=(n[0].offsetTop-e+r)*s.scrollRatio.y;Y(i,l.toString(),{dir:a,drag:!0})}var n,o,a,i=e(this),s=i.data(r),u=s.opt,d=r+"_"+s.idx,f=["mCSB_"+s.idx+"_dragger_vertical","mCSB_"+s.idx+"_dragger_horizontal"],p=e("#mCSB_"+s.idx+"_container"),h=e("#"+f[0]+",#"+f[1]),m=u.advanced.releaseDraggableSelectors?h.add(e(u.advanced.releaseDraggableSelectors)):h,g=u.advanced.extraDraggableSelectors?e(!R()||top.document).add(e(u.advanced.extraDraggableSelectors)):e(!R()||top.document);h.bind("contextmenu."+d,function(e){e.preventDefault()}).bind("mousedown."+d+" touchstart."+d+" pointerdown."+d+" MSPointerDown."+d,function(t){if(t.stopImmediatePropagation(),t.preventDefault(),J(t)){c=!0,l&&(document.onselectstart=function(){return!1}),L.call(p,!1),X(i);var r=(n=e(this)).offset(),s=A(t)[0]-r.top,d=A(t)[1]-r.left,f=n.height()+r.top,h=n.width()+r.left;f>s&&s>0&&h>d&&d>0&&(o=s,a=d),S(n,"active",u.autoExpandScrollbar)}}).bind("touchmove."+d,function(e){e.stopImmediatePropagation(),e.preventDefault();var r=n.offset(),i=A(e)[0]-r.top,s=A(e)[1]-r.left;t(o,a,i,s)}),e(document).add(g).bind("mousemove."+d+" pointermove."+d+" MSPointerMove."+d,function(e){if(n){var r=n.offset(),i=A(e)[0]-r.top,s=A(e)[1]-r.left;if(o===i&&a===s)return;t(o,a,i,s)}}).add(m).bind("mouseup."+d+" touchend."+d+" pointerup."+d+" MSPointerUp."+d,function(){n&&(S(n,"active",u.autoExpandScrollbar),n=null),c=!1,l&&(document.onselectstart=null),L.call(p,!0)})},O=function(){function n(e){if(!ee(e)||c||A(e)[2])t=0;else{t=1,C=0,S=0,u=1,_.removeClass("mCS_touch_action");var n=E.offset();d=A(e)[0]-n.top,f=A(e)[1]-n.left,N=[A(e)[0],A(e)[1]]}}function o(e){if(ee(e)&&!c&&!A(e)[2]&&(D.documentTouchScroll||e.preventDefault(),e.stopImmediatePropagation(),(!S||C)&&u)){g=Q();var t=k.offset(),n=A(e)[0]-t.top,r=A(e)[1]-t.left,o="mcsLinearOut";if(F.push(n),P.push(r),N[2]=Math.abs(A(e)[0]-N[0]),N[3]=Math.abs(A(e)[1]-N[1]),T.overflowed[0])var a=O[0].parent().height()-O[0].height(),i=d-n>0&&n-d>-a*T.scrollRatio.y&&(2*N[3]0&&r-f>-s*T.scrollRatio.x&&(2*N[2]30)){var o="mcsEaseOut",a=2.5>(b=1e3/(v-m)),i=a?[F[F.length-2],P[P.length-2]]:[0,0];y=a?[n-i[0],r-i[1]]:[n-p,r-h];var d=[Math.abs(y[0]),Math.abs(y[1])];b=a?[Math.abs(y[0]/4),Math.abs(y[1]/4)]:[b,b];var f=[Math.abs(E[0].offsetTop)-y[0]*s(d[0]/b[0],b[0]),Math.abs(E[0].offsetLeft)-y[1]*s(d[1]/b[1],b[1])];w="yx"===D.axis?[f[0],f[1]]:"x"===D.axis?[null,f[1]]:[f[0],null],x=[4*d[0]+D.scrollInertia,4*d[1]+D.scrollInertia];var _=parseInt(D.contentTouchScroll)||0;w[0]=d[0]>_?w[0]:0,w[1]=d[1]>_?w[1]:0,T.overflowed[0]&&l(w[0],x[0],o,"y",L,!1),T.overflowed[1]&&l(w[1],x[1],o,"x",L,!1)}}}function s(e,t){var n=[1.5*t,2*t,t/1.5,t/2];return e>90?t>4?n[0]:n[3]:e>60?t>3?n[3]:n[2]:e>30?t>8?n[1]:t>6?n[0]:t>4?t:n[2]:t>8?t:n[3]}function l(e,t,n,r,o,a){e&&Y(_,e.toString(),{dur:t,scrollEasing:n,dir:r,overwrite:o,drag:a})}var u,d,f,p,h,m,g,v,y,b,w,x,C,S,_=e(this),T=_.data(r),D=T.opt,I=r+"_"+T.idx,k=e("#mCSB_"+T.idx),E=e("#mCSB_"+T.idx+"_container"),O=[e("#mCSB_"+T.idx+"_dragger_vertical"),e("#mCSB_"+T.idx+"_dragger_horizontal")],F=[],P=[],j=0,L="yx"===D.axis?"none":"all",N=[],$=E.find("iframe"),B=["touchstart."+I+" pointerdown."+I+" MSPointerDown."+I,"touchmove."+I+" pointermove."+I+" MSPointerMove."+I,"touchend."+I+" pointerup."+I+" MSPointerUp."+I],M=void 0!==document.body.style.touchAction&&""!==document.body.style.touchAction;E.bind(B[0],function(e){n(e)}).bind(B[1],function(e){o(e)}),k.bind(B[0],function(e){a(e)}).bind(B[2],function(e){i(e)}),$.length&&$.each(function(){e(this).bind("load",function(){R(this)&&e(this.contentDocument||this.contentWindow.document).bind(B[0],function(e){n(e),a(e)}).bind(B[1],function(e){o(e)}).bind(B[2],function(e){i(e)})})})},F=function(){function n(e,t,n){l.type=n&&o?"stepped":"stepless",l.scrollAmount=10,U(a,e,t,"mcsLinearOut",n?60:null)}var o,a=e(this),i=a.data(r),s=i.opt,l=i.sequential,u=r+"_"+i.idx,d=e("#mCSB_"+i.idx+"_container"),f=d.parent();d.bind("mousedown."+u,function(){t||o||(o=1,c=!0)}).add(document).bind("mousemove."+u,function(e){if(!t&&o&&(window.getSelection?window.getSelection().toString():document.selection&&"Control"!=document.selection.type&&document.selection.createRange().text)){var r=d.offset(),a=A(e)[0]-r.top+d[0].offsetTop,c=A(e)[1]-r.left+d[0].offsetLeft;a>0&&a0&&ca?n("on",38):a>f.height()&&n("on",40)),"y"!==s.axis&&i.overflowed[1]&&(0>c?n("on",37):c>f.width()&&n("on",39)))}}).bind("mouseup."+u+" dragend."+u,function(){t||(o&&(o=0,n("off",null)),c=!1)})},P=function(){function t(t,r){if(X(n),!N(n,t.target)){var i="auto"!==a.mouseWheel.deltaFactor?parseInt(a.mouseWheel.deltaFactor):l&&t.deltaFactor<100?100:t.deltaFactor||100,u=a.scrollInertia;if("x"===a.axis||"x"===a.mouseWheel.axis)var d="x",f=[Math.round(i*o.scrollRatio.x),parseInt(a.mouseWheel.scrollAmount)],p="auto"!==a.mouseWheel.scrollAmount?f[1]:f[0]>=s.width()?.9*s.width():f[0],h=Math.abs(e("#mCSB_"+o.idx+"_container")[0].offsetLeft),m=c[1][0].offsetLeft,g=c[1].parent().width()-c[1].width(),v="y"===a.mouseWheel.axis?t.deltaY||r:t.deltaX;else var d="y",f=[Math.round(i*o.scrollRatio.y),parseInt(a.mouseWheel.scrollAmount)],p="auto"!==a.mouseWheel.scrollAmount?f[1]:f[0]>=s.height()?.9*s.height():f[0],h=Math.abs(e("#mCSB_"+o.idx+"_container")[0].offsetTop),m=c[0][0].offsetTop,g=c[0].parent().height()-c[0].height(),v=t.deltaY||r;"y"===d&&!o.overflowed[0]||"x"===d&&!o.overflowed[1]||((a.mouseWheel.invert||t.webkitDirectionInvertedFromDevice)&&(v=-v),a.mouseWheel.normalizeDelta&&(v=0>v?-1:1),(v>0&&0!==m||0>v&&m!==g||a.mouseWheel.preventDefault)&&(t.stopImmediatePropagation(),t.preventDefault()),t.deltaFactor<5&&!a.mouseWheel.normalizeDelta&&(p=t.deltaFactor,u=17),Y(n,(h-v*p).toString(),{dir:d,dur:u}))}}if(e(this).data(r)){var n=e(this),o=n.data(r),a=o.opt,i=r+"_"+o.idx,s=e("#mCSB_"+o.idx),c=[e("#mCSB_"+o.idx+"_dragger_vertical"),e("#mCSB_"+o.idx+"_dragger_horizontal")],u=e("#mCSB_"+o.idx+"_container").find("iframe");u.length&&u.each(function(){e(this).bind("load",function(){R(this)&&e(this.contentDocument||this.contentWindow.document).bind("mousewheel."+i,function(e,n){t(e,n)})})}),s.bind("mousewheel."+i,function(e,n){t(e,n)})}},j=new Object,R=function(t){var n=!1,r=!1,o=null;if(void 0===t?r="#empty":void 0!==e(t).attr("id")&&(r=e(t).attr("id")),!1!==r&&void 0!==j[r])return j[r];if(t){try{var a=t.contentDocument||t.contentWindow.document;o=a.body.innerHTML}catch(e){}n=null!==o}else{try{var a=top.document;o=a.body.innerHTML}catch(e){}n=null!==o}return!1!==r&&(j[r]=n),n},L=function(e){var t=this.find("iframe");if(t.length){var n=e?"auto":"none";t.css("pointer-events",n)}},N=function(t,n){var o=n.nodeName.toLowerCase(),a=t.data(r).opt.mouseWheel.disableOver;return e.inArray(o,a)>-1&&!(e.inArray(o,["select","textarea"])>-1&&!e(n).is(":focus"))},$=function(){var t,n=e(this),o=n.data(r),a=r+"_"+o.idx,i=e("#mCSB_"+o.idx+"_container"),s=i.parent(),l=e(".mCSB_"+o.idx+"_scrollbar ."+u[12]);l.bind("mousedown."+a+" touchstart."+a+" pointerdown."+a+" MSPointerDown."+a,function(n){c=!0,e(n.target).hasClass("mCSB_dragger")||(t=1)}).bind("touchend."+a+" pointerup."+a+" MSPointerUp."+a,function(){c=!1}).bind("click."+a,function(r){if(t&&(t=0,e(r.target).hasClass(u[12])||e(r.target).hasClass("mCSB_draggerRail"))){X(n);var a=e(this),l=a.find(".mCSB_dragger");if(a.parent(".mCSB_scrollTools_horizontal").length>0){if(!o.overflowed[1])return;var c="x",d=r.pageX>l.offset().left?-1:1,f=Math.abs(i[0].offsetLeft)-d*(.9*s.width())}else{if(!o.overflowed[0])return;var c="y",d=r.pageY>l.offset().top?-1:1,f=Math.abs(i[0].offsetTop)-d*(.9*s.height())}Y(n,f.toString(),{dir:c,scrollEasing:"mcsEaseInOut"})}})},B=function(){var t=e(this),n=t.data(r),o=n.opt,a=r+"_"+n.idx,i=e("#mCSB_"+n.idx+"_container"),s=i.parent();i.bind("focusin."+a,function(){var n=e(document.activeElement),r=i.find(".mCustomScrollBox").length;n.is(o.advanced.autoScrollOnFocus)&&(X(t),clearTimeout(t[0]._focusTimeout),t[0]._focusTimer=r?17*r:0,t[0]._focusTimeout=setTimeout(function(){var e=[ne(n)[0],ne(n)[1]],r=[i[0].offsetTop,i[0].offsetLeft],a=[r[0]+e[0]>=0&&r[0]+e[0]=0&&r[0]+e[1]a");l.bind("contextmenu."+i,function(e){e.preventDefault()}).bind("mousedown."+i+" touchstart."+i+" pointerdown."+i+" MSPointerDown."+i+" mouseup."+i+" touchend."+i+" pointerup."+i+" MSPointerUp."+i+" mouseout."+i+" pointerout."+i+" MSPointerOut."+i+" click."+i,function(r){function i(e,n){a.scrollAmount=o.scrollButtons.scrollAmount,U(t,e,n)}if(r.preventDefault(),J(r)){var s=e(this).attr("class");switch(a.type=o.scrollButtons.scrollType,r.type){case"mousedown":case"touchstart":case"pointerdown":case"MSPointerDown":if("stepped"===a.type)return;c=!0,n.tweenRunning=!1,i("on",s);break;case"mouseup":case"touchend":case"pointerup":case"MSPointerUp":case"mouseout":case"pointerout":case"MSPointerOut":if("stepped"===a.type)return;c=!1,a.dir&&i("off",s);break;case"click":if("stepped"!==a.type||n.tweenRunning)return;i("on",s)}}})},q=function(){function t(t){function r(e,t){i.type=a.keyboard.scrollType,i.scrollAmount=a.keyboard.scrollAmount,"stepped"===i.type&&o.tweenRunning||U(n,e,t)}switch(t.type){case"blur":o.tweenRunning&&i.dir&&r("off",null);break;case"keydown":case"keyup":var s=t.keyCode?t.keyCode:t.which,l="on";if("x"!==a.axis&&(38===s||40===s)||"y"!==a.axis&&(37===s||39===s)){if((38===s||40===s)&&!o.overflowed[0]||(37===s||39===s)&&!o.overflowed[1])return;"keyup"===t.type&&(l="off"),e(document.activeElement).is(d)||(t.preventDefault(),t.stopImmediatePropagation(),r(l,s))}else if(33===s||34===s){if((o.overflowed[0]||o.overflowed[1])&&(t.preventDefault(),t.stopImmediatePropagation()),"keyup"===t.type){X(n);var f=34===s?-1:1;if("x"===a.axis||"yx"===a.axis&&o.overflowed[1]&&!o.overflowed[0])var p="x",h=Math.abs(c[0].offsetLeft)-f*(.9*u.width());else var p="y",h=Math.abs(c[0].offsetTop)-f*(.9*u.height());Y(n,h.toString(),{dir:p,scrollEasing:"mcsEaseInOut"})}}else if((35===s||36===s)&&!e(document.activeElement).is(d)&&((o.overflowed[0]||o.overflowed[1])&&(t.preventDefault(),t.stopImmediatePropagation()),"keyup"===t.type)){if("x"===a.axis||"yx"===a.axis&&o.overflowed[1]&&!o.overflowed[0])var p="x",h=35===s?Math.abs(u.width()-c.outerWidth(!1)):0;else var p="y",h=35===s?Math.abs(u.height()-c.outerHeight(!1)):0;Y(n,h.toString(),{dir:p,scrollEasing:"mcsEaseInOut"})}}}var n=e(this),o=n.data(r),a=o.opt,i=o.sequential,s=r+"_"+o.idx,l=e("#mCSB_"+o.idx),c=e("#mCSB_"+o.idx+"_container"),u=c.parent(),d="input,textarea,select,datalist,keygen,[contenteditable='true']",f=c.find("iframe"),p=["blur."+s+" keydown."+s+" keyup."+s];f.length&&f.each(function(){e(this).bind("load",function(){R(this)&&e(this.contentDocument||this.contentWindow.document).bind(p[0],function(e){t(e)})})}),l.attr("tabindex","0").bind(p[0],function(e){t(e)})},U=function(t,n,o,a,i){function s(e){c.snapAmount&&(d.scrollAmount=c.snapAmount instanceof Array?"x"===d.dir[0]?c.snapAmount[1]:c.snapAmount[0]:c.snapAmount);var n="stepped"!==d.type,r=i||(e?n?h/1.5:m:1e3/60),o=e?n?7.5:40:2.5,u=[Math.abs(f[0].offsetTop),Math.abs(f[0].offsetLeft)],p=[l.scrollRatio.y>10?10:l.scrollRatio.y,l.scrollRatio.x>10?10:l.scrollRatio.x],g="x"===d.dir[0]?u[1]+d.dir[1]*(p[1]*o):u[0]+d.dir[1]*(p[0]*o),v="x"===d.dir[0]?u[1]+d.dir[1]*parseInt(d.scrollAmount):u[0]+d.dir[1]*parseInt(d.scrollAmount),y="auto"!==d.scrollAmount?v:g,b=a||(e?n?"mcsLinearOut":"mcsEaseInOut":"mcsLinear"),w=!!e;return e&&17>r&&(y="x"===d.dir[0]?u[1]:u[0]),Y(t,y.toString(),{dir:d.dir[0],scrollEasing:b,dur:r,onComplete:w}),e?void(d.dir=!1):(clearTimeout(d.step),void(d.step=setTimeout(function(){s()},r)))}var l=t.data(r),c=l.opt,d=l.sequential,f=e("#mCSB_"+l.idx+"_container"),p="stepped"===d.type,h=c.scrollInertia<26?26:c.scrollInertia,m=c.scrollInertia<1?17:c.scrollInertia;switch(n){case"on":if(d.dir=[o===u[16]||o===u[15]||39===o||37===o?"x":"y",o===u[13]||o===u[15]||38===o||37===o?-1:1],X(t),te(o)&&"stepped"===d.type)return;s(p);break;case"off":clearTimeout(d.step),K(d,"step"),X(t),(p||l.tweenRunning&&d.dir)&&s(!0)}},z=function(t){var n=e(this).data(r).opt,o=[];return"function"==typeof t&&(t=t()),t instanceof Array?o=t.length>1?[t[0],t[1]]:"x"===n.axis?[null,t[0]]:[t[0],null]:(o[0]=t.y?t.y:t.x||"x"===n.axis?null:t,o[1]=t.x?t.x:t.y||"y"===n.axis?null:t),"function"==typeof o[0]&&(o[0]=o[0]()),"function"==typeof o[1]&&(o[1]=o[1]()),o},W=function(t,n){if(null!=t&&void 0!==t){var o=e(this),a=o.data(r),i=a.opt,s=e("#mCSB_"+a.idx+"_container"),l=s.parent(),c=typeof t;n||(n="x"===i.axis?"x":"y");var u="x"===n?s.outerWidth(!1)-l.width():s.outerHeight(!1)-l.height(),f="x"===n?s[0].offsetLeft:s[0].offsetTop,p="x"===n?"left":"top";switch(c){case"function":return t();case"object":var h=t.jquery?t:e(t);if(!h.length)return;return"x"===n?ne(h)[1]:ne(h)[0];case"string":case"number":if(te(t))return Math.abs(t);if(-1!==t.indexOf("%"))return Math.abs(u*parseInt(t)/100);if(-1!==t.indexOf("-="))return Math.abs(f-parseInt(t.split("-=")[1]));if(-1!==t.indexOf("+=")){var m=f+parseInt(t.split("+=")[1]);return m>=0?0:Math.abs(m)}if(-1!==t.indexOf("px")&&te(t.split("px")[0]))return Math.abs(t.split("px")[0]);if("top"===t||"left"===t)return 0;if("bottom"===t)return Math.abs(l.height()-s.outerHeight(!1));if("right"===t)return Math.abs(l.width()-s.outerWidth(!1));if("first"===t||"last"===t){var h=s.find(":"+t);return"x"===n?ne(h)[1]:ne(h)[0]}return e(t).length?"x"===n?ne(e(t))[1]:ne(e(t))[0]:(s.css(p,t),void d.update.call(null,o[0]))}}},V=function(t){function n(e){clearTimeout(s[0].autoUpdate),d.update.call(null,o[0],e)}var o=e(this),a=o.data(r),i=a.opt,s=e("#mCSB_"+a.idx+"_container");return t?(clearTimeout(s[0].autoUpdate),void K(s[0],"autoUpdate")):void function t(){return clearTimeout(s[0].autoUpdate),0===o.parents("html").length?void(o=null):void(s[0].autoUpdate=setTimeout(function(){return i.advanced.updateOnSelectorChange&&(a.poll.change.n=function(){!0===i.advanced.updateOnSelectorChange&&(i.advanced.updateOnSelectorChange="*");var e=0,t=s.find(i.advanced.updateOnSelectorChange);return i.advanced.updateOnSelectorChange&&t.length>0&&t.each(function(){e+=this.offsetHeight+this.offsetWidth}),e}(),a.poll.change.n!==a.poll.change.o)?(a.poll.change.o=a.poll.change.n,void n(3)):i.advanced.updateOnContentResize&&(a.poll.size.n=o[0].scrollHeight+o[0].scrollWidth+s[0].offsetHeight+o[0].offsetHeight+o[0].offsetWidth,a.poll.size.n!==a.poll.size.o)?(a.poll.size.o=a.poll.size.n,void n(1)):!i.advanced.updateOnImageLoad||"auto"===i.advanced.updateOnImageLoad&&"y"===i.axis||(a.poll.img.n=s.find("img").length,a.poll.img.n===a.poll.img.o)?void((i.advanced.updateOnSelectorChange||i.advanced.updateOnContentResize||i.advanced.updateOnImageLoad)&&t()):(a.poll.img.o=a.poll.img.n,void s.find("img").each(function(){!function(t){if(e(t).hasClass(u[2]))n();else{var r=new Image;r.onload=function(e,t){return function(){return t.apply(e,arguments)}}(r,function(){this.onload=null,e(t).addClass(u[2]),n(2)}),r.src=t.src}}(this)}))},i.advanced.autoUpdateTimeout))}()},X=function(t){var n=t.data(r),o=e("#mCSB_"+n.idx+"_container,#mCSB_"+n.idx+"_container_wrapper,#mCSB_"+n.idx+"_dragger_vertical,#mCSB_"+n.idx+"_dragger_horizontal");o.each(function(){Z.call(this)})},Y=function(t,n,o){function a(e){return s&&l.callbacks[e]&&"function"==typeof l.callbacks[e]}function i(){var e=[f[0].offsetTop,f[0].offsetLeft],n=[v[0].offsetTop,v[0].offsetLeft],r=[f.outerHeight(!1),f.outerWidth(!1)],a=[d.height(),d.width()];t[0].mcs={content:f,top:e[0],left:e[1],draggerTop:n[0],draggerLeft:n[1],topPct:Math.round(100*Math.abs(e[0])/(Math.abs(r[0])-a[0])),leftPct:Math.round(100*Math.abs(e[1])/(Math.abs(r[1])-a[1])),direction:o.dir}}var s=t.data(r),l=s.opt,c={trigger:"internal",dir:"y",scrollEasing:"mcsEaseOut",drag:!1,dur:l.scrollInertia,overwrite:"all",callbacks:!0,onStart:!0,onUpdate:!0,onComplete:!0},o=e.extend(c,o),u=[o.dur,o.drag?0:o.dur],d=e("#mCSB_"+s.idx),f=e("#mCSB_"+s.idx+"_container"),p=f.parent(),h=l.callbacks.onTotalScrollOffset?z.call(t,l.callbacks.onTotalScrollOffset):[0,0],m=l.callbacks.onTotalScrollBackOffset?z.call(t,l.callbacks.onTotalScrollBackOffset):[0,0];if(s.trigger=o.trigger,0===p.scrollTop()&&0===p.scrollLeft()||(e(".mCSB_"+s.idx+"_scrollbar").css("visibility","visible"),p.scrollTop(0).scrollLeft(0)),"_resetY"!==n||s.contentReset.y||(a("onOverflowYNone")&&l.callbacks.onOverflowYNone.call(t[0]),s.contentReset.y=1),"_resetX"!==n||s.contentReset.x||(a("onOverflowXNone")&&l.callbacks.onOverflowXNone.call(t[0]),s.contentReset.x=1),"_resetY"!==n&&"_resetX"!==n){if(!s.contentReset.y&&t[0].mcs||!s.overflowed[0]||(a("onOverflowY")&&l.callbacks.onOverflowY.call(t[0]),s.contentReset.x=null),!s.contentReset.x&&t[0].mcs||!s.overflowed[1]||(a("onOverflowX")&&l.callbacks.onOverflowX.call(t[0]),s.contentReset.x=null),l.snapAmount){var g=l.snapAmount instanceof Array?"x"===o.dir?l.snapAmount[1]:l.snapAmount[0]:l.snapAmount;n=function(e,t,n){return Math.round(e/t)*t-n}(n,g,l.snapOffset)}switch(o.dir){case"x":var v=e("#mCSB_"+s.idx+"_dragger_horizontal"),y="left",b=f[0].offsetLeft,w=[d.width()-f.outerWidth(!1),v.parent().width()-v.width()],x=[n,0===n?0:n/s.scrollRatio.x],C=h[1],_=m[1],T=C>0?C/s.scrollRatio.x:0,D=_>0?_/s.scrollRatio.x:0;break;case"y":var v=e("#mCSB_"+s.idx+"_dragger_vertical"),y="top",b=f[0].offsetTop,w=[d.height()-f.outerHeight(!1),v.parent().height()-v.height()],x=[n,0===n?0:n/s.scrollRatio.y],C=h[0],_=m[0],T=C>0?C/s.scrollRatio.y:0,D=_>0?_/s.scrollRatio.y:0}x[1]<0||0===x[0]&&0===x[1]?x=[0,0]:x[1]>=w[1]?x=[w[0],w[1]]:x[0]=-x[0],t[0].mcs||(i(),a("onInit")&&l.callbacks.onInit.call(t[0])),clearTimeout(f[0].onCompleteTimeout),G(v[0],y,Math.round(x[1]),u[1],o.scrollEasing),!s.tweenRunning&&(0===b&&x[0]>=0||b===w[0]&&x[0]<=w[0])||G(f[0],y,Math.round(x[0]),u[0],o.scrollEasing,o.overwrite,{onStart:function(){o.callbacks&&o.onStart&&!s.tweenRunning&&(a("onScrollStart")&&(i(),l.callbacks.onScrollStart.call(t[0])),s.tweenRunning=!0,S(v),s.cbOffsets=[l.callbacks.alwaysTriggerOffsets||b>=w[0]+C,l.callbacks.alwaysTriggerOffsets||-_>=b])},onUpdate:function(){o.callbacks&&o.onUpdate&&a("whileScrolling")&&(i(),l.callbacks.whileScrolling.call(t[0]))},onComplete:function(){if(o.callbacks&&o.onComplete){"yx"===l.axis&&clearTimeout(f[0].onCompleteTimeout);var e=f[0].idleTimer||0;f[0].onCompleteTimeout=setTimeout(function(){a("onScroll")&&(i(),l.callbacks.onScroll.call(t[0])),a("onTotalScroll")&&x[1]>=w[1]-T&&s.cbOffsets[0]&&(i(),l.callbacks.onTotalScroll.call(t[0])),a("onTotalScrollBack")&&x[1]<=D&&s.cbOffsets[1]&&(i(),l.callbacks.onTotalScrollBack.call(t[0])),s.tweenRunning=!1,f[0].idleTimer=0,S(v,"hide")},e)}}})}},G=function(e,t,n,r,o,a,i){function s(){y.stop||(m||d.call(),m=Q()-h,l(),m>=y.time&&(y.time=m>y.time?m+c-(m-y.time):m+c-1,y.time0?(y.currVal=function(e,t,n,r,o){switch(o){case"linear":case"mcsLinear":return n*e/r+t;case"mcsLinearOut":return e/=r,e--,n*Math.sqrt(1-e*e)+t;case"easeInOutSmooth":return 1>(e/=r/2)?n/2*e*e+t:-n/2*(--e*(e-2)-1)+t;case"easeInOutStrong":return 1>(e/=r/2)?n/2*Math.pow(2,10*(e-1))+t:(e--,n/2*(2-Math.pow(2,-10*e))+t);case"easeInOut":case"mcsEaseInOut":return 1>(e/=r/2)?n/2*e*e*e+t:n/2*((e-=2)*e*e+2)+t;case"easeOutSmooth":return e/=r,-n*(--e*e*e*e-1)+t;case"easeOutStrong":return n*(1-Math.pow(2,-10*e/r))+t;case"easeOut":case"mcsEaseOut":default:var a=(e/=r)*e,i=a*e;return t+n*(.499999999999997*i*a+-2.5*a*a+5.5*i+-6.5*a+4*e)}}(y.time,g,b,r,o),v[t]=Math.round(y.currVal)+"px"):v[t]=n+"px",f.call()}e._mTween||(e._mTween={top:{},left:{}});var c,u,i=i||{},d=i.onStart||function(){},f=i.onUpdate||function(){},p=i.onComplete||function(){},h=Q(),m=0,g=e.offsetTop,v=e.style,y=e._mTween[t];"left"===t&&(g=e.offsetLeft);var b=n-g;y.stop=0,"none"!==a&&null!=y.id&&(window.requestAnimationFrame?window.cancelAnimationFrame(y.id):clearTimeout(y.id),y.id=null),c=1e3/60,y.time=m+c,u=window.requestAnimationFrame?window.requestAnimationFrame:function(e){return l(),setTimeout(e,.01)},y.id=u(s)},Q=function(){return window.performance&&window.performance.now?window.performance.now():window.performance&&window.performance.webkitNow?window.performance.webkitNow():Date.now?Date.now():(new Date).getTime()},Z=function(){var e=this;e._mTween||(e._mTween={top:{},left:{}});for(var t=["top","left"],n=0;n=0&&r[0]+ne(o)[0]=0&&r[1]+ne(o)[1]=0&&i[1]-a[1]*s[1][0]<0&&i[1]+o[1]-a[1]*s[1][1]>=0},mcsOverflow:e.expr[":"].mcsOverflow||function(t){var n=e(t).data(r);if(n)return n.overflowed[0]||n.overflowed[1]}})})}()}),function(e){"use strict";function t(t){return t.is('[type="checkbox"]')?t.prop("checked"):t.is('[type="radio"]')?!!e('[name="'+t.attr("name")+'"]:checked').length:t.is("select[multiple]")?(t.val()||[]).length:t.val()}function n(t){return this.each(function(){var n=e(this),o=e.extend({},r.DEFAULTS,n.data(),"object"==typeof t&&t),a=n.data("bs.validator");(a||"destroy"!=t)&&(a||n.data("bs.validator",a=new r(this,o)),"string"==typeof t&&a[t]())})}var r=function(n,o){this.options=o,this.validators=e.extend({},r.VALIDATORS,o.custom),this.$element=e(n),this.$btn=e('button[type="submit"], input[type="submit"]').filter('[form="'+this.$element.attr("id")+'"]').add(this.$element.find('input[type="submit"], button[type="submit"]')),this.update(),this.$element.on("input.bs.validator change.bs.validator focusout.bs.validator",e.proxy(this.onInput,this)),this.$element.on("submit.bs.validator",e.proxy(this.onSubmit,this)),this.$element.on("reset.bs.validator",e.proxy(this.reset,this)),this.$element.find("[data-match]").each(function(){var n=e(this),r=n.attr("data-match");e(r).on("input.bs.validator",function(){t(n)&&n.trigger("input.bs.validator")})}),this.$inputs.filter(function(){return t(e(this))&&!e(this).closest(".has-error").length}).trigger("focusout"),this.$element.attr("novalidate",!0)};r.VERSION="0.11.9",r.INPUT_SELECTOR=':input:not([type="hidden"], [type="submit"], [type="reset"], button)',r.FOCUS_OFFSET=20,r.DEFAULTS={delay:500,html:!1,disable:!0,focus:!0,custom:{},errors:{match:"Does not match",minlength:"Not long enough"},feedback:{success:"glyphicon-ok",error:"glyphicon-remove"}},r.VALIDATORS={native:function(e){var t=e[0];return t.checkValidity?!t.checkValidity()&&!t.validity.valid&&(t.validationMessage||"error!"):void 0},match:function(t){var n=t.attr("data-match");return t.val()!==e(n).val()&&r.DEFAULTS.errors.match},minlength:function(e){var t=e.attr("data-minlength");return e.val().length").addClass("list-unstyled").append(e.map(r,function(t){return e("
            • ")[n](t)})),void 0===a.data("bs.validator.originalContent")&&a.data("bs.validator.originalContent",a.html()),a.empty().append(r),o.addClass("has-error has-danger"),o.hasClass("has-feedback")&&i.removeClass(this.options.feedback.success)&&i.addClass(this.options.feedback.error)&&o.removeClass("has-success"))},r.prototype.clearErrors=function(e){var n=e.closest(".form-group"),r=n.find(".help-block.with-errors"),o=n.find(".form-control-feedback");r.html(r.data("bs.validator.originalContent")),n.removeClass("has-error has-danger has-success"),n.hasClass("has-feedback")&&o.removeClass(this.options.feedback.error)&&o.removeClass(this.options.feedback.success)&&t(e)&&o.addClass(this.options.feedback.success)&&n.addClass("has-success")},r.prototype.hasErrors=function(){return!!this.$inputs.filter(function(){return!!(e(this).data("bs.validator.errors")||[]).length}).length},r.prototype.isIncomplete=function(){return!!this.$inputs.filter("[required]").filter(function(){var n=t(e(this));return!("string"==typeof n?e.trim(n):n)}).length},r.prototype.onSubmit=function(e){this.validate(),(this.isIncomplete()||this.hasErrors())&&e.preventDefault()},r.prototype.toggleSubmit=function(){this.options.disable&&this.$btn.toggleClass("disabled",this.isIncomplete()||this.hasErrors())},r.prototype.defer=function(t,n){return n=e.proxy(n,this,t),this.options.delay?(window.clearTimeout(t.data("bs.validator.timeout")),void t.data("bs.validator.timeout",window.setTimeout(n,this.options.delay))):n()},r.prototype.reset=function(){return this.$element.find(".form-control-feedback").removeClass(this.options.feedback.error).removeClass(this.options.feedback.success),this.$inputs.removeData(["bs.validator.errors","bs.validator.deferred"]).each(function(){var t=e(this),n=t.data("bs.validator.timeout");window.clearTimeout(n)&&t.removeData("bs.validator.timeout")}),this.$element.find(".help-block.with-errors").each(function(){var t=e(this),n=t.data("bs.validator.originalContent");t.removeData("bs.validator.originalContent").html(n)}),this.$btn.removeClass("disabled"),this.$element.find(".has-error, .has-danger, .has-success").removeClass("has-error has-danger has-success"),this},r.prototype.destroy=function(){return this.reset(),this.$element.removeAttr("novalidate").removeData("bs.validator").off(".bs.validator"),this.$inputs.off(".bs.validator"),this.options=null,this.validators=null,this.$element=null,this.$btn=null,this.$inputs=null,this};var o=e.fn.validator;e.fn.validator=n,e.fn.validator.Constructor=r,e.fn.validator.noConflict=function(){return e.fn.validator=o,this},e(window).on("load",function(){e('form[data-toggle="validator"]').each(function(){var t=e(this);n.call(t,t.data())})})}(jQuery),define("validator",["jquery","bootstrap"],function(){}),function(e,t){"object"==typeof exports?module.exports=t(require("jquery")):"function"==typeof define&&define.amd?define("easyPieChart",["jquery"],t):t(e.jQuery)}(this,function(e){var t=function(e,t){var n,r=document.createElement("canvas");e.appendChild(r),"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(r);var o=r.getContext("2d");r.width=r.height=t.size;var a=1;window.devicePixelRatio>1&&(a=window.devicePixelRatio,r.style.width=r.style.height=[t.size,"px"].join(""),r.width=r.height=t.size*a,o.scale(a,a)),o.translate(t.size/2,t.size/2),o.rotate((t.rotate/180-.5)*Math.PI);var i=(t.size-t.lineWidth)/2;t.scaleColor&&t.scaleLength&&(i-=t.scaleLength+2),Date.now=Date.now||function(){return+new Date};var s=function(e,t,n){var r=0>=(n=Math.min(Math.max(-1,n||0),1));o.beginPath(),o.arc(0,0,i,0,2*Math.PI*n,r),o.strokeStyle=e,o.lineWidth=t,o.stroke()},l=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(e){window.setTimeout(e,1e3/60)},c=function(){t.scaleColor&&function(){var e,n;o.lineWidth=1,o.fillStyle=t.scaleColor,o.save();for(var r=24;r>0;--r)r%6==0?(n=t.scaleLength,e=0):(n=.6*t.scaleLength,e=t.scaleLength-n),o.fillRect(-t.size/2+e,0,n,1),o.rotate(Math.PI/12);o.restore()}(),t.trackColor&&s(t.trackColor,t.trackWidth||t.lineWidth,1)};this.getCanvas=function(){return r},this.getCtx=function(){return o},this.clear=function(){o.clearRect(t.size/-2,t.size/-2,t.size,t.size)},this.draw=function(e){var r;t.scaleColor||t.trackColor?o.getImageData&&o.putImageData?n?o.putImageData(n,0,0):(c(),n=o.getImageData(0,0,t.size*a,t.size*a)):(this.clear(),c()):this.clear(),o.lineCap=t.lineCap,r="function"==typeof t.barColor?t.barColor(e):t.barColor,s(r,t.lineWidth,e/100)}.bind(this),this.animate=function(e,n){var r=Date.now();t.onStart(e,n);var o=function(){var a=Math.min(Date.now()-r,t.animate.duration),i=t.easing(this,a,e,n-e,t.animate.duration);this.draw(i),t.onStep(e,n,i),a>=t.animate.duration?t.onStop(e,n):l(o)}.bind(this);l(o)}.bind(this)},n=function(e,n){var r={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,trackWidth:void 0,size:110,rotate:0,animate:{duration:1e3,enabled:!0},easing:function(e,t,n,r,o){return 1>(t/=o/2)?r/2*t*t+n:-r/2*(--t*(t-2)-1)+n},onStart:function(){},onStep:function(){},onStop:function(){}};if(void 0!==t)r.renderer=t;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");r.renderer=SVGRenderer}var o={},a=0,i=function(){for(var t in this.el=e,this.options=o,r)r.hasOwnProperty(t)&&(o[t]=n&&void 0!==n[t]?n[t]:r[t],"function"==typeof o[t]&&(o[t]=o[t].bind(this)));o.easing="string"==typeof o.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[o.easing])?jQuery.easing[o.easing]:r.easing,"number"==typeof o.animate&&(o.animate={duration:o.animate,enabled:!0}),"boolean"!=typeof o.animate||o.animate||(o.animate={duration:1e3,enabled:o.animate}),this.renderer=new o.renderer(e,o),this.renderer.draw(a),e.dataset&&e.dataset.percent?this.update(parseFloat(e.dataset.percent)):e.getAttribute&&e.getAttribute("data-percent")&&this.update(parseFloat(e.getAttribute("data-percent")))}.bind(this);this.update=function(e){return e=parseFloat(e),o.animate.enabled?this.renderer.animate(a,e):this.renderer.draw(e),a=e,this}.bind(this),this.disableAnimation=function(){return o.animate.enabled=!1,this},this.enableAnimation=function(){return o.animate.enabled=!0,this},i()};e.fn.easyPieChart=function(t){return this.each(function(){var r;e.data(this,"easyPieChart")||(r=e.extend({},t,e(this).data()),e.data(this,"easyPieChart",new n(this,r)))})}}),function(e){"use strict";"function"==typeof define&&define.amd?define("hoverIntent",["jquery"],e):"object"==typeof module&&module.exports?module.exports=e(require("jquery")):jQuery&&!jQuery.fn.hoverIntent&&e(jQuery)}(function(e){"use strict";var t,n,r={interval:100,sensitivity:6,timeout:0},o=0,a=function(e){t=e.pageX,n=e.pageY},i=function(e,r,o,s){if(Math.sqrt((o.pX-t)*(o.pX-t)+(o.pY-n)*(o.pY-n))

            • '}),Confirmation.prototype=$.extend({},$.fn.popover.Constructor.prototype),Confirmation.prototype.constructor=Confirmation,Confirmation.prototype.getDefaults=function(){return Confirmation.DEFAULTS},Confirmation.prototype.setContent=function(){var e=this,t=this.tip(),n=this.getTitle(),r=t.find('[data-apply="confirmation"]'),o=t.find('[data-dismiss="confirmation"]');this.options,r.addClass(this.getBtnOkClass()).html(this.getBtnOkLabel()).prepend($("").addClass(this.getBtnOkIcon())," ").attr("href",this.getHref()).attr("target",this.getTarget()).off("click").on("click",function(t){if(e.runCallback(e.options.onConfirm,t,e.$element),"submit"==e.$element.attr("type")){var n=e.$element.closest("form");(void 0!==n.attr("novalidate")||n[0].checkValidity())&&n.submit()}e.hide(),e.inState.click=!1,e.$element.trigger($.Event("confirm.bs.confirmation"))}),o.addClass(this.getBtnCancelClass()).html(this.getBtnCancelLabel()).prepend($("").addClass(this.getBtnCancelIcon())," ").off("click").on("click",function(t){e.runCallback(e.options.onCancel,t,e.$element),e.hide(),e.inState.click=!1,e.$element.trigger($.Event("cancel.bs.confirmation"))}),t.find(".popover-title")[this.options.html?"html":"text"](n),t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},Confirmation.prototype.getBtnOkClass=function(){return this.$element.data("btnOkClass")||("function"==typeof this.options.btnOkClass?this.options.btnOkClass.call(this,this.$element):this.options.btnOkClass)},Confirmation.prototype.getBtnOkLabel=function(){return this.$element.data("btnOkLabel")||("function"==typeof this.options.btnOkLabel?this.options.btnOkLabel.call(this,this.$element):this.options.btnOkLabel)},Confirmation.prototype.getBtnOkIcon=function(){return this.$element.data("btnOkIcon")||("function"==typeof this.options.btnOkIcon?this.options.btnOkIcon.call(this,this.$element):this.options.btnOkIcon)},Confirmation.prototype.getBtnCancelClass=function(){return this.$element.data("btnCancelClass")||("function"==typeof this.options.btnCancelClass?this.options.btnCancelClass.call(this,this.$element):this.options.btnCancelClass)},Confirmation.prototype.getBtnCancelLabel=function(){return this.$element.data("btnCancelLabel")||("function"==typeof this.options.btnCancelLabel?this.options.btnCancelLabel.call(this,this.$element):this.options.btnCancelLabel)},Confirmation.prototype.getBtnCancelIcon=function(){return this.$element.data("btnCancelIcon")||("function"==typeof this.options.btnCancelIcon?this.options.btnCancelIcon.call(this,this.$element):this.options.btnCancelIcon)},Confirmation.prototype.getTitle=function(){return this.$element.data("confirmation-title")||this.$element.data("title")||this.$element.attr("title")||("function"==typeof this.options.title?this.options.title.call(this,this.$element):this.options.title)},Confirmation.prototype.getHref=function(){return this.$element.data("href")||this.$element.attr("href")||("function"==typeof this.options.href?this.options.href.call(this,this.$element):this.options.href)},Confirmation.prototype.getTarget=function(){return this.$element.data("target")||this.$element.attr("target")||("function"==typeof this.options.target?this.options.target.call(this,this.$element):this.options.target)},Confirmation.prototype.isPopout=function(){var e=this.$element.data("popout")||("function"==typeof this.options.popout?this.options.popout.call(this,this.$element):this.options.popout);return"false"==e&&(e=!1),e},Confirmation.prototype.runCallback=function(callback,event,element){"function"==typeof callback?callback.call(this,event,element):"string"==typeof callback&&eval(callback)};var old=$.fn.confirmation;$.fn.confirmation=function(e){var t=this;return this.each(function(){var n=$(this),r=n.data("bs.confirmation"),o="object"==typeof e&&e;(o=o||{}).all_selector=t.selector,(r||"destroy"!=e)&&(r||n.data("bs.confirmation",r=new Confirmation(this,o)),"string"==typeof e&&r[e]())})},$.fn.confirmation.Constructor=Confirmation,$.fn.confirmation.noConflict=function(){return $.fn.confirmation=old,this}}(jQuery),define("bootstrapConfirmation",["bootstrap"],function(){}),function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},this.defaults(),n),this.render()};t.VERSION="2.2.0",t.DEFAULTS={on:"On",off:"Off",onstyle:"primary",offstyle:"default",size:"normal",style:"",width:null,height:null},t.prototype.defaults=function(){return{on:this.$element.attr("data-on")||t.DEFAULTS.on,off:this.$element.attr("data-off")||t.DEFAULTS.off,onstyle:this.$element.attr("data-onstyle")||t.DEFAULTS.onstyle,offstyle:this.$element.attr("data-offstyle")||t.DEFAULTS.offstyle,size:this.$element.attr("data-size")||t.DEFAULTS.size,style:this.$element.attr("data-style")||t.DEFAULTS.style,width:this.$element.attr("data-width")||t.DEFAULTS.width,height:this.$element.attr("data-height")||t.DEFAULTS.height}},t.prototype.render=function(){this._onstyle="btn-"+this.options.onstyle,this._offstyle="btn-"+this.options.offstyle;var t="large"===this.options.size?"btn-lg":"small"===this.options.size?"btn-sm":"mini"===this.options.size?"btn-xs":"",n=e('

              ',a+="",a+=null!==e?'':"",a+="",a+="",a+=t,a+="",a+=n,a+="',a+=r,a+="',a+=o,a+="
              ";for(let o of e){r+=parseInt(o.log.ship.mass);let e=I(o,"class"),a=$(o.log.ship.mass);t+=n(e,o.name,o.log.ship.name,o.log.ship.typeName,a)}t+=n(null,"","","",$(r)),t+="
              "}return t},getSystemsInfoTable:e=>{let t="";if(e.length>0){t+="";for(let n=0;n",t+="",t+='",t+='",t+=""}t+="
              ",t+=e[n].name,t+="',t+=e[n].security,t+="',t+=parseFloat(e[n].trueSec).toFixed(1),t+="
              "}return t},getStatusInfoForCharacter:I,getSecurityClassForSystem:A,getTrueSecClassForSystem:E,getStatusInfoForSystem:(n,r)=>{let o="";return t.systemStatus.hasOwnProperty(n)?o=t.systemStatus[n][r]:e.each(t.systemStatus,function(e,t){n!==t.id||(o=t[r])}),o},getSignatureGroupOptions:e=>{let n=[];for(let[r,o]of Object.entries(t.signatureGroups))n.push({value:parseInt(r),text:o[e]});return n},getSignatureTypeNames:(e,t,n)=>q(...t.map(t=>U(a,[e,t,n].join("."))||{})),getAreaIdBySecurity:D,setCurrentMapUserData:e=>(t.currentMapUserData=e,F()),getCurrentMapUserData:F,updateCurrentMapUserData:e=>{let n=(e=>O(t.currentMapUserData,e))(e.config.id);Array.isArray(t.currentMapUserData)||(t.currentMapUserData=[]),!1!==n?t.currentMapUserData[n]=e:t.currentMapUserData.push(e)},setCurrentMapData:e=>(t.currentMapData=e,P()),getCurrentMapData:P,filterCurrentMapData:(e,t)=>{let n=P();return n&&(n=n.filter(n=>U(n,e)===t)),n},updateCurrentMapData:e=>{let n=(e=>O(t.currentMapData,e))(e.config.id);!1!==n?(t.currentMapData[n].config=e.config,t.currentMapData[n].data=e.data):t.currentMapData.push(e)},deleteCurrentMapData:e=>{t.currentMapData=t.currentMapData.filter(t=>t.config.id!==e)},setCurrentUserData:n=>{let r=!1;if(n&&n.character&&n.characters){let o=C(w(),n);Object.values(o).some(e=>e)&&e(document).trigger("pf:changedUserData",[n,o]),t.currentUserData=n,r=!0}else console.error("Could not set userData %o. Missing or malformed obj",n);return r},getCurrentUserData:w,getCurrentCharacterId:x,setCurrentSystemData:e=>{t.currentSystemData=e},getCurrentSystemData:()=>t.currentSystemData,getCurrentLocationData:()=>{let t=e("#"+c.headUserLocationId+">li:last-of-type");return{id:parseInt(t.attr("data-systemId"))||0,name:t.attr("data-systemName")||!1}},getCurrentUserInfo:j,getCurrentCharacterLog:()=>U(w(),"character.log")||!1,findInViewport:e=>{let t=[];for(let n of e){if(!(n instanceof HTMLElement)){console.warn("findInViewport() expects Array() of %O; %o given",HTMLElement,n);continue}let e=n.offsetTop,r=n.offsetLeft,o=n.offsetWidth,a=n.offsetHeight,i=n;for(;n.offsetParent;)e+=(n=n.offsetParent).offsetTop,r+=n.offsetLeft;ewindow.pageYOffset&&r+o>window.pageXOffset&&t.push(i)}return t},initScrollSpy:(t,n=window,r={})=>{let o,a,i=Array.from(t.querySelectorAll(".page-scroll")).map(e=>({link:e,content:document.getElementById(e.getAttribute("data-target"))})),s=e=>{if(!e)return;document.activeElement===e.link&&document.activeElement.blur();let t=e.link.closest("li");t&&t.classList.remove("active")},l=(e,t,n)=>{let r=e.getBoundingClientRect(),o=(e=>"function"==typeof e.offset?parseFloat(e.offset()):parseFloat(e.offset))(t);return n?parseInt(r.bottom,10)<(window.innerHeight||document.documentElement.clientHeight):parseInt(r.top,10)<=o},c=()=>window.innerHeight+window.pageYOffset>=(()=>Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight))(),u=(e,t)=>{let n=e[e.length-1];if(((e,t)=>!(!c()||!l(e.content,t,!0)))(n,t))return n;for(let n=e.length-1;n>=0;n--)if(l(e[n].content,t))return e[n]},d=()=>{let e=u(i,r);e?a&&e.content===a.content||(s(a),(e=>{if(!e)return;let t=e.link.closest("li");t&&t.classList.add("active")})(e),a=e):a&&(s(a),a=null)};d(),n.addEventListener("scroll",()=>{o&&window.cancelAnimationFrame(o),o=window.requestAnimationFrame(d)},!1);let f=function(e){e.preventDefault(),this.content.scrollIntoView({behavior:"smooth"})};for(let t of i)e(t.link).on("click",f.bind(t))},getConfirmationTemplate:m,convertXEditableOptionsToSelect2:e=>{let t=[];if(e.options){let n=e.options.prepend?e.options.prepend:[],r=e.options.source(),o=[];o.push(...n,...r);let a=t=>{let n={id:t.value,text:t.text};return e.value===t.value&&(n.selected=!0),!0===t.disabled&&(n.disabled=!0),t.hasOwnProperty("metaData")&&(n.metaData=t.metaData),n};t=o.map(e=>(e.children?e.children=e.children.map(a):e=a(e),e))}return t},flattenXEditableSelectArray:e=>{let t={};for(let n of e)if(n.children&&n.children.length>0)for(let e of n.children)t[e.value]=e.text;else t[n.value]=n.text;return t},getCharacterDataBySystemId:L,getNearBySystemData:R,getNearByCharacterData:N,setDestination:(n,r,o)=>{let a="";switch(n){case"set_destination":a="Set destination";break;case"add_first_waypoint":a="Set first waypoint";break;case"add_last_waypoint":a="Set new waypoint"}e.ajax({type:"POST",url:t.path.setDestination,data:{clearOtherWaypoints:"set_destination"===n?1:0,first:"add_last_waypoint"===n?0:1,destData:[o]},context:{destType:r,description:a},dataType:"json"}).done(function(e){if(e.destData&&e.destData.length>0)for(let t=0;t0)for(let t=0;t{return new Promise((t,n)=>{let r={action:"copyToClipboard",data:!1};navigator.clipboard?navigator.permissions.query({name:"clipboard-write"}).then(n=>{"granted"===n.state||"prompt"===n.state?navigator.clipboard.writeText(e).then(()=>{r.data=!0,t(r)}).catch(e=>{let n="Failed to write clipboard content";console.error(n,e),b({title:"Clipboard API",text:n,type:"error"}),t(r)}):(b({title:"Clipboard API",text:"You denied write access",type:"warning"}),t(r))}):(console.warn("Clipboard API not supported by your browser"),t(r))})},readFromClipboard:()=>{return new Promise((e,t)=>{let n={action:"readFromClipboard",data:!1};navigator.clipboard?navigator.permissions.query({name:"clipboard-read"}).then(t=>{"granted"===t.state||"prompt"===t.state?navigator.clipboard.readText().then(t=>{n.data=t,e(n)}).catch(t=>{let r="Failed to read clipboard content";console.error(r,t),b({title:"Clipboard API",text:r,type:"error"}),e(n)}):(b({title:"Clipboard API",text:"You denied read access",type:"warning"}),e(n))}):(console.warn("Clipboard API not supported by your browser"),e(n))})},convertDateToUTC:B,convertDateToString:M,getOpenDialogs:()=>e("."+c.dialogClass).filter(":visible"),openIngameWindow:n=>{(n=parseInt(n))>0&&e.ajax({type:"POST",url:t.path.openIngameWindow,data:{targetId:n},dataType:"json"}).done(function(e){e.error.length>0?b({title:"Open window in client",text:"Remote window open failed",type:"error"}):b({title:"Open window in client",text:"Check your EVE client",type:"success"})}).fail(function(e,t,n){let r=t+" "+n;b({title:e.status+": openWindow",text:r,type:"error"})})},formatPrice:e=>{let t=(e=Number(e).toFixed(2)).toString().split(".");return(e=t[0].replace(/\B(?=(\d{3})+(?!\d))/g,",")+(t[1]?"."+t[1]:""))+" ISK"},formatMassValue:$,getLocalStorage:function(){return void 0===l&&(l=s.createInstance({driver:[s.INDEXEDDB,s.WEBSQL,s.LOCALSTORAGE],name:"Pathfinder local storage"})),l},clearSessionStorage:()=>{sessionStorage&&sessionStorage.clear()},getBrowserTabId:S,singleDoubleClick:(n,r,o,a)=>{let i="mouseup.singleDouble";if(!((t,n)=>{let r=!1,o=e._data(t[0],"events");if(o){let e=n.split("."),t=o[e[0]];if(t){let n=2===e.length&&e[1];if(n){for(let e of t)if(e.namespace===n){r=!0;break}}else r=!0}}return r})(n,i)){let e=0;n.off("click").on("click",function(e){e.preventDefault()}),n.off(i).on(i,function(n){1==++e&&setTimeout(t=>{1===e?r.call(t,n):o.call(t,n),e=0},a||t.timer.DBL_CLICK,this)})}},getTableId:H,getTableRowId:(e,t,n)=>e+[t,n].join("-"),getDataTableInstance:(t,n,r,o)=>{let a=null,i=e.fn.dataTable.tables({visible:!1,api:!0}).table("#"+H(t,o,n,r));return i.node()&&(a=i),a},htmlEncode:t=>e("
              ").text(t).html(),htmlDecode:t=>e("
              ").html(t).text(),isValidHtml:e=>{let t=(new DOMParser).parseFromString(e,"text/html");return Array.from(t.body.childNodes).some(e=>1===e.nodeType)},isDomElement:e=>!(!e||1!==e.nodeType),arrayToObject:(e,t="id")=>e.reduce((e,n)=>(e[n[t]]=n,e),{}),getObjVal:U,redirect:z,logout:n=>{let r={};n&&n.ajaxData&&(r=n.ajaxData),e.ajax({type:"POST",url:t.path.logout,data:r,dataType:"json"}).done(function(e){e.reroute&&z(e.reroute,["logout"])}).fail(function(e,t,n){let r=t+" "+n;b({title:e.status+": logout",text:r,type:"error"})})},setCookie:(e,t,n,r)=>{let o=new Date,a=o.getTime(),i=-1*a;if(n>0)switch(r){case"d":i=24*n*60*60*1e3;break;case"s":i=1e3*n}o.setTime(a+i);let s="expires="+o.toUTCString(),l="path="+(window.location.pathname.replace(/[^\/]*$/,"")||"/");document.cookie=e+"="+t+"; "+s+"; "+l},getCookie:e=>{let t=e+"=",n=document.cookie.split(";");for(let e=0;et)return e;for(r=0;r{"use strict";return class extends Promise{constructor(e,t=6e3){let n,r="Promise"===e[Symbol.toStringTag]?e:new Promise(e),o=Promise.race([r,new Promise((e,r)=>{n=setTimeout(e=>{r(new Error("Promise timeout after "+e+"ms"))},t,t)})]);super(function(e,t){o.then(t=>{clearTimeout(n),e(t)}).catch(e=>{clearTimeout(n),t(e)})})}}}),define("app/lib/cron",["easyTimer","app/promises/promise.timeout"],(e,t)=>{"use strict";let n=class{constructor(e,t){if("string"!=typeof e)throw new TypeError('Task "name" must be instance of String, Type of "'+typeof e+'" given');this._config=Object.assign({},this.constructor.defaultConfig,t),this._name=e,this._task=void 0,this._manager=void 0,this._runQueue=new Map,this._runCount=0,this._lastTotalTimeValues=void 0}get name(){return this._name}get task(){return this._task}get runCount(){return this._runCount}get precision(){return this._config.precision}set task(e){if(!(e instanceof Function))throw new TypeError('Task "task" must be instance of "function", Type of "'+typeof e+'" given');this._task=e}get(e){return this._config[e]}set(e,t){this._config[e]=t}setManager(e){this._manager=e}isRunning(){return!!this._runQueue.size}delete(){let e=!1;return this._manager&&(e=this._manager.delete(this.name)),e}isDue(e){if(this._config.dueDate instanceof Date){if((new Date).getTime()>=this._config.dueDate.getTime())return!0}else{let t=e.getTotalTimeValues()[this.precision];if(t-=this._lastTotalTimeValues?this._lastTotalTimeValues[this.precision]:0,1===this._config.interval||t%this._config.interval==0)return!0}return!1}invoke(e){!this.isDue(e)||this.isRunning()&&!this._config.isParallel||this.run(e)}run(e){this._lastTotalTimeValues=Object.assign({},e.getTotalTimeValues());let n="run_"+ ++this._runCount,r=t=>{t(this.task(e,this))},o=this._config.timeout>0?new t(r,this._config.timeout):new Promise(r);o.then(e=>{}).catch(e=>{e instanceof Error&&console.warn(e)}).finally(()=>{this._runQueue.delete(n),this._config.dueDate instanceof Date&&this.delete()}),this._runQueue.set(n,o)}};n.defaultConfig={precision:"seconds",isParallel:!1,interval:1,dueDate:void 0,timeout:50};let r=class{constructor(t){this._config=Object.assign({},this.constructor.defaultConfig,t),this._timerConfig=Object.assign({},this.constructor.defaultTimerConfig),this._tasks=new Map,this._timer=new e.Timer,this._config.precisions.map(e=>e+"Updated").forEach(e=>{this._timer.on(e,e=>{let t=e.type.substring(0,e.type.indexOf("Updated"));this.tasksByPrecision(t).forEach(t=>t.invoke(e.detail.timer))})}),this.debug=((e,...t)=>{this._config.debug&&(t=t||[],console.debug(e,...t))})}new(e,t){return new n(e,t)}set(e){if(!(e instanceof n))throw new TypeError("Parameter must be instance of Task");this.has(e.name)&&this.get(e.name)!==e?console.warn("FAILED to set task. Task name %o already exists",e.name):(e.setManager(this),this._tasks.set(e.name,e),this.debug("SET/UPDATE task: %o config: %o",e.name,e),this.auto())}setNew(e,t){this.set(this.new(e,t))}get(e){return this._tasks.get(e)}has(e){return this._tasks.has(e)}delete(e){let t=this._tasks.delete(e);return t&&(this.debug("DELETE task: %o",e),this.auto()),t}clear(){this.debug("CLEAR all %o task(s)",this._tasks.size),this._tasks.clear(),this.auto()}tasksByPrecision(e){let t=[];return this._tasks.forEach(n=>{e===n.precision&&t.push(n)}),t}start(){this._timer.start(this._timerConfig)}stop(){this._timer.stop()}pause(){this._timer.pause()}reset(){this._timer.reset()}auto(){this._tasks.size?this._timer.isRunning()||(this.start(),this.debug("START [auto] timer. %o task(s) found.",this._tasks.size)):(this.stop(),this.debug("STOP [auto] timer. No tasks set."))}};return r.defaultConfig={precisions:["secondTenths","seconds","minutes","hours","days"],debug:!1},r.defaultTimerConfig={precision:"secondTenths",countdown:!1},new r({debug:!1})}),define("app/counter",["jquery","app/util","app/lib/cron"],(e,t,n)=>{"use strict";let r={counterTaskAttr:"data-counter-task",counterStopClass:"stopCounter",counterDigitSmallClass:"pf-digit-counter-small",counterDigitLargeClass:"pf-digit-counter-large"},o=(e,n,o)=>{let a=t.getTimeDiffParts(n,new Date),i=a.days,s=a.hours,l=a.min,c=a.sec,u=[];"d"===o&&i>=1?u.push('> 1d'):((i>0||u.length>0)&&u.push(''+i+"d"),(s>0||u.length>0)&&u.push(''+s+"h"),(l>0||u.length>0)&&u.push(''+l+"m"),(c>=0||u.length>0)&&u.push(''+c+"s")),e.html(u.join(" "))},a=(t,o)=>{let a="["+r.counterTaskAttr+"]",i=t.filter(a);o&&(i=i.add(t.find(a))),i.each(function(){let t=e(this),o=t.attr(r.counterTaskAttr);n.delete(o)&&t.removeAttr(r.counterTaskAttr).removeClass(r.counterStopClass)})};return{config:r,updateDateDiff:o,initTimestampCounter:(e,i)=>{let s=parseInt(e.text());if(s>0){let l=e.attr("id")||t.getRandomString(),c=new Date(1e3*s);o(e,c,i),e.css({visibility:"initial"});let u=n.new(l,{precision:"seconds",interval:1,timeout:100});u.task=(()=>{e.hasClass(r.counterStopClass)?a(e):o(e,c,i)}),n.set(u),e.attr(r.counterTaskAttr,l)}},initTableCounter:(e,t,a)=>{let i=e.api(),s=e.attr("id"),l=function(e,t,n,i){let s=this,l=s.node(),c=s.data();if(c&&Number.isInteger(c)&&!l.classList.contains(r.counterStopClass)){let e=new Date(1e3*c);o(s.nodes().to$(),e,a)}},c=n.new(s,{precision:"seconds",interval:1,timeout:100});c.task=(e=>{i.cells(null,t).every(l)}),n.set(c),e.attr(r.counterTaskAttr,s)},destroyTimestampCounter:a}}),define("app/promises/promise.deferred",[],()=>{"use strict";return class{constructor(){this._promise=new Promise((e,t)=>{this.resolve=e,this.reject=t}),this.then=this._promise.then.bind(this._promise),this.catch=this._promise.catch.bind(this._promise)}set data(e){return e&&(this._data=e),this._data}get data(){return this._data}get[Symbol.toStringTag](){return"Promise"}}}),function(e){"function"==typeof define&&define.amd?define("datatables.net",["jquery"],function(t){return e(t,window,document)}):"object"==typeof exports?module.exports=function(t,n){return t||(t=window),n||(n="undefined"!=typeof window?require("jquery"):require("jquery")(t)),e(n,t,t.document)}:e(jQuery,window,document)}(function(e,t,n,r){function o(t){var n,r,a={};e.each(t,function(e){(n=e.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(n[1]+" ")&&(r=e.replace(n[0],n[2].toLowerCase()),a[r]=e,"o"===n[1]&&o(t[e]))}),t._hungarianMap=a}function a(t,n,i){var s;t._hungarianMap||o(t),e.each(n,function(o){(s=t._hungarianMap[o])===r||!i&&n[s]!==r||("o"===s.charAt(0)?(n[s]||(n[s]={}),e.extend(!0,n[s],n[o]),a(t[s],n[s],i)):n[s]=n[o])})}function i(e){var t=Ve.defaults.oLanguage,n=t.sDecimal;if(n&&Me(n),e){var r=e.sZeroRecords;!e.sEmptyTable&&r&&"No data available in table"===t.sEmptyTable&&Oe(e,e,"sZeroRecords","sEmptyTable"),!e.sLoadingRecords&&r&&"Loading..."===t.sLoadingRecords&&Oe(e,e,"sZeroRecords","sLoadingRecords"),e.sInfoThousands&&(e.sThousands=e.sInfoThousands),(e=e.sDecimal)&&n!==e&&Me(e)}}function s(e){if(ct(e,"ordering","bSort"),ct(e,"orderMulti","bSortMulti"),ct(e,"orderClasses","bSortClasses"),ct(e,"orderCellsTop","bSortCellsTop"),ct(e,"order","aaSorting"),ct(e,"orderFixed","aaSortingFixed"),ct(e,"paging","bPaginate"),ct(e,"pagingType","sPaginationType"),ct(e,"pageLength","iDisplayLength"),ct(e,"searching","bFilter"),"boolean"==typeof e.sScrollX&&(e.sScrollX=e.sScrollX?"100%":""),"boolean"==typeof e.scrollX&&(e.scrollX=e.scrollX?"100%":""),e=e.aoSearchCols)for(var t=0,n=e.length;t").css({position:"fixed",top:0,left:-1*e(t).scrollLeft(),height:1,width:1,overflow:"hidden"}).append(e("
              ").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(e("
              ").css({width:"100%",height:10}))).appendTo("body"),a=o.children(),i=a.children();r.barWidth=a[0].offsetWidth-a[0].clientWidth,r.bScrollOversize=100===i[0].offsetWidth&&100!==a[0].clientWidth,r.bScrollbarLeft=1!==Math.round(i.offset().left),r.bBounding=!!o[0].getBoundingClientRect().width,o.remove()}e.extend(n.oBrowser,Ve.__browser),n.oScroll.iBarWidth=Ve.__browser.barWidth}function u(e,t,n,o,a,i){var s,l=!1;for(n!==r&&(s=n,l=!0);o!==a;)e.hasOwnProperty(o)&&(s=l?t(s,e[o],o,e):e[o],l=!0,o+=i);return s}function d(t,r){var o=Ve.defaults.column,a=t.aoColumns.length;o=e.extend({},Ve.models.oColumn,o,{nTh:r||n.createElement("th"),sTitle:o.sTitle?o.sTitle:r?r.innerHTML:"",aDataSort:o.aDataSort?o.aDataSort:[a],mData:o.mData?o.mData:a,idx:a});t.aoColumns.push(o),(o=t.aoPreSearchCols)[a]=e.extend({},Ve.models.oSearch,o[a]),f(t,a,e(r).data())}function f(t,n,o){n=t.aoColumns[n];var i=t.oClasses,s=e(n.nTh);if(!n.sWidthOrig){n.sWidthOrig=s.attr("width")||null;var c=(s.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);c&&(n.sWidthOrig=c[1])}o!==r&&null!==o&&(l(o),a(Ve.defaults.column,o),o.mDataProp!==r&&!o.mData&&(o.mData=o.mDataProp),o.sType&&(n._sManualType=o.sType),o.className&&!o.sClass&&(o.sClass=o.className),o.sClass&&s.addClass(o.sClass),e.extend(n,o),Oe(n,o,"sWidth","sWidthOrig"),o.iDataSort!==r&&(n.aDataSort=[o.iDataSort]),Oe(n,o,"aDataSort"));var u=n.mData,d=T(u),f=n.mRender?T(n.mRender):null;o=function(e){return"string"==typeof e&&-1!==e.indexOf("@")};n._bAttrSrc=e.isPlainObject(u)&&(o(u.sort)||o(u.type)||o(u.filter)),n._setter=null,n.fnGetData=function(e,t,n){var o=d(e,t,r,n);return f&&t?f(o,t,e,n):o},n.fnSetData=function(e,t,n){return D(u)(e,t,n)},"number"!=typeof u&&(t._rowReadObject=!0),t.oFeatures.bSort||(n.bSortable=!1,s.addClass(i.sSortableNone)),t=-1!==e.inArray("asc",n.asSorting),o=-1!==e.inArray("desc",n.asSorting),n.bSortable&&(t||o)?t&&!o?(n.sSortingClass=i.sSortableAsc,n.sSortingClassJUI=i.sSortJUIAscAllowed):!t&&o?(n.sSortingClass=i.sSortableDesc,n.sSortingClassJUI=i.sSortJUIDescAllowed):(n.sSortingClass=i.sSortable,n.sSortingClassJUI=i.sSortJUI):(n.sSortingClass=i.sSortableNone,n.sSortingClassJUI="")}function p(e){if(!1!==e.oFeatures.bAutoWidth){var t=e.aoColumns;me(e);for(var n=0,r=t.length;nh[s])a(p.length+h[s],f);else if("string"==typeof h[s])for(c=0,u=p.length;ct&&e[a]--;-1!=o&&n===r&&e.splice(o,1)}function E(e,t,n,o){var a,i=e.aoData[t],s=function(n,r){for(;n.childNodes.length;)n.removeChild(n.firstChild);n.innerHTML=C(e,t,r,"display")};if("dom"!==n&&(n&&"auto"!==n||"dom"!==i.src)){var l=i.anCells;if(l)if(o!==r)s(l[o],o);else for(n=0,a=l.length;n").appendTo(s)),n=0,r=d.length;ntr").attr("role","row"),e(s).find(">tr>th, >tr>td").addClass(u.sHeaderTH),e(l).find(">tr>th, >tr>td").addClass(u.sFooterTH),null!==l)for(n=0,r=(t=t.aoFooter[0]).length;n=t.fnRecordsDisplay()?0:l,t.iInitDisplayStart=-1);l=t._iDisplayStart;var d=t.fnDisplayEnd();if(t.bDeferLoading)t.bDeferLoading=!1,t.iDraw++,de(t,!1);else if(c){if(!t.bDestroying&&!q(t))return}else t.iDraw++;if(0!==u.length)for(s=c?t.aoData.length:d,c=c?0:l;c",{class:i?a[0]:""}).append(e("
              ",{valign:"top",colSpan:g(t),class:t.oClasses.sRowEmpty}).html(o))[0];Re(t,"aoHeaderCallback","header",[e(t.nTHead).children("tr")[0],I(t),l,d,u]),Re(t,"aoFooterCallback","footer",[e(t.nTFoot).children("tr")[0],I(t),l,d,u]),(a=e(t.nTBody)).children().detach(),a.append(e(n)),Re(t,"aoDrawCallback","draw",[t]),t.bSorted=!1,t.bFiltered=!1,t.bDrawing=!1}}function N(e,t){var n=e.oFeatures,r=n.bFilter;n.bSort&&xe(e),r?X(e,e.oPreviousSearch):e.aiDisplay=e.aiDisplayMaster.slice(),!0!==t&&(e._iDisplayStart=0),e._drawHold=t,L(e),e._drawHold=!1}function $(t){var n=t.oClasses,r=e(t.nTable),o=(r=e("
              ").insertBefore(r),t.oFeatures),a=e("
              ",{id:t.sTableId+"_wrapper",class:n.sWrapper+(t.nTFoot?"":" "+n.sNoFooter)});t.nHolding=r[0],t.nTableWrapper=a[0],t.nTableReinsertBefore=t.nTable.nextSibling;for(var i,s,l,c,u,d,f=t.sDom.split(""),p=0;p")[0],"'"==(c=f[p+1])||'"'==c){for(u="",d=2;f[p+d]!=c;)u+=f[p+d],d++;"H"==u?u=n.sJUIHeader:"F"==u&&(u=n.sJUIFooter),-1!=u.indexOf(".")?(c=u.split("."),l.id=c[0].substr(1,c[0].length-1),l.className=c[1]):"#"==u.charAt(0)?l.id=u.substr(1,u.length-1):l.className=u,p+=d}a.append(l),a=e(l)}else if(">"==s)a=a.parent();else if("l"==s&&o.bPaginate&&o.bLengthChange)i=se(t);else if("f"==s&&o.bFilter)i=V(t);else if("r"==s&&o.bProcessing)i=ue(t);else if("t"==s)i=fe(t);else if("i"==s&&o.bInfo)i=te(t);else if("p"==s&&o.bPaginate)i=le(t);else if(0!==Ve.ext.feature.length)for(d=0,c=(l=Ve.ext.feature).length;d',c=(c=a.sSearch).match(/_INPUT_/)?c.replace("_INPUT_",l):c+l,u=(r=e("
              ",{id:s.f?null:o+"_filter",class:r.sFilter}).append(e("
              ").addClass(n.sLength);return t.aanFeatures.l||(c[0].id=r+"_length"),c.children().append(t.oLanguage.sLengthMenu.replace("_MENU_",i[0].outerHTML)),e("select",c).val(t._iDisplayLength).on("change.DT",function(){ie(t,e(this).val()),L(t)}),e(t.nTable).on("length.dt.DT",function(n,r,o){t===r&&e("select",c).val(o)}),c[0]}function le(t){var n=t.sPaginationType,r=Ve.ext.pager[n],o="function"==typeof r,a=function(e){L(e)},i=(n=e("
              ").addClass(t.oClasses.sPaging+n)[0],t.aanFeatures);return o||r.fnInit(t,n,a),i.p||(n.id=t.sTableId+"_paginate",t.aoDrawCallback.push({fn:function(e){if(o){var t,n=e._iDisplayStart,s=e._iDisplayLength,l=e.fnRecordsDisplay(),c=(n=(c=-1===s)?0:Math.ceil(n/s),s=c?1:Math.ceil(l/s),l=r(n,s),0);for(t=i.p.length;ca&&(r=0):"first"==t?r=0:"previous"==t?0>(r=0<=o?r-o:0)&&(r=0):"next"==t?r+o",{id:t.aanFeatures.r?null:t.sTableId+"_processing",class:t.oClasses.sProcessing}).html(t.oLanguage.sProcessing).insertBefore(t.nTable)[0]}function de(t,n){t.oFeatures.bProcessing&&e(t.aanFeatures.r).css("display",n?"block":"none"),Re(t,null,"processing",[t,n])}function fe(t){(d=e(t.nTable)).attr("role","grid");var n=t.oScroll;if(""===n.sX&&""===n.sY)return t.nTable;var r=n.sX,o=n.sY,a=t.oClasses,i=d.children("caption"),s=i.length?i[0]._captionSide:null,l=e(d[0].cloneNode(!1)),c=e(d[0].cloneNode(!1)),u=d.children("tfoot");u.length||(u=null),l=e("
              ",{class:a.sScrollWrapper}).append(e("
              ",{class:a.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:r?r?be(r):null:"100%"}).append(e("
              ",{class:a.sScrollHeadInner}).css({"box-sizing":"content-box",width:n.sXInner||"100%"}).append(l.removeAttr("id").css("margin-left",0).append("top"===s?i:null).append(d.children("thead"))))).append(e("
              ",{class:a.sScrollBody}).css({position:"relative",overflow:"auto",width:r?be(r):null}).append(d)),u&&l.append(e("
              ",{class:a.sScrollFoot}).css({overflow:"hidden",border:0,width:r?r?be(r):null:"100%"}).append(e("
              ",{class:a.sScrollFootInner}).append(c.removeAttr("id").css("margin-left",0).append("bottom"===s?i:null).append(d.children("tfoot")))));var d,f=(d=l.children())[0],p=(a=d[1],u?d[2]:null);return r&&e(a).on("scroll.DT",function(){var e=this.scrollLeft;f.scrollLeft=e,u&&(p.scrollLeft=e)}),e(a).css(o&&n.bCollapse?"max-height":"height",o),t.nScrollHead=f,t.nScrollBody=a,t.nScrollFoot=p,t.aoDrawCallback.push({fn:pe,sName:"scrolling"}),l[0]}function pe(t){var n,o,a,i,s,l=(d=t.oScroll).sX,c=d.sXInner,u=d.sY,d=d.iBarWidth,f=e(t.nScrollHead),m=f[0].style,g=(y=f.children("div"))[0].style,v=y.children("table"),y=t.nScrollBody,b=e(y),w=y.style,x=e(t.nScrollFoot).children("div"),C=x.children("table"),S=e(t.nTHead),_=e(t.nTable),T=_[0],D=T.style,I=t.nTFoot?e(t.nTFoot):null,k=t.oBrowser,A=k.bScrollOversize,E=ot(t.aoColumns,"nTh"),O=[],F=[],P=[],j=[],R=function(e){(e=e.style).paddingTop="0",e.paddingBottom="0",e.borderTopWidth="0",e.borderBottomWidth="0",e.height=0};o=y.scrollHeight>y.clientHeight,t.scrollBarVis!==o&&t.scrollBarVis!==r?(t.scrollBarVis=o,p(t)):(t.scrollBarVis=o,_.children("thead, tfoot").remove(),I&&(a=I.clone().prependTo(_),n=I.find("tr"),a=a.find("tr")),i=S.clone().prependTo(_),S=S.find("tr"),o=i.find("tr"),i.find("th, td").removeAttr("tabindex"),l||(w.width="100%",f[0].style.width="100%"),e.each(M(t,i),function(e,n){s=h(t,e),n.style.width=t.aoColumns[s].sWidth}),I&&he(function(e){e.style.width=""},a),f=_.outerWidth(),""===l?(D.width="100%",A&&(_.find("tbody").height()>y.offsetHeight||"scroll"==b.css("overflow-y"))&&(D.width=be(_.outerWidth()-d)),f=_.outerWidth()):""!==c&&(D.width=be(c),f=_.outerWidth()),he(R,o),he(function(t){P.push(t.innerHTML),O.push(be(e(t).css("width")))},o),he(function(t,n){-1!==e.inArray(t,E)&&(t.style.width=O[n])},S),e(o).height(0),I&&(he(R,a),he(function(t){j.push(t.innerHTML),F.push(be(e(t).css("width")))},a),he(function(e,t){e.style.width=F[t]},n),e(a).height(0)),he(function(e,t){e.innerHTML='
              '+P[t]+"
              ",e.childNodes[0].style.height="0",e.childNodes[0].style.overflow="hidden",e.style.width=O[t]},o),I&&he(function(e,t){e.innerHTML='
              '+j[t]+"
              ",e.childNodes[0].style.height="0",e.childNodes[0].style.overflow="hidden",e.style.width=F[t]},a),_.outerWidth()y.offsetHeight||"scroll"==b.css("overflow-y")?f+d:f,A&&(y.scrollHeight>y.offsetHeight||"scroll"==b.css("overflow-y"))&&(D.width=be(n-d)),(""===l||""!==c)&&Ee(t,1,"Possible column misalignment",6)):n="100%",w.width=be(n),m.width=be(n),I&&(t.nScrollFoot.style.width=be(n)),!u&&A&&(w.height=be(T.offsetHeight+d)),l=_.outerWidth(),v[0].style.width=be(l),g.width=be(l),c=_.height()>y.clientHeight||"scroll"==b.css("overflow-y"),g[u="padding"+(k.bScrollbarLeft?"Left":"Right")]=c?d+"px":"0px",I&&(C[0].style.width=be(l),x[0].style.width=be(l),x[0].style[u]=c?d+"px":"0px"),_.children("colgroup").insertBefore(_.children("thead")),b.scroll(),!t.bSorted&&!t.bFiltered||t._drawHold||(y.scrollTop=0))}function he(e,t,n){for(var r,o,a=0,i=0,s=t.length;i").appendTo(u.find("tbody"));for(u.find("thead, tfoot").remove(),u.append(e(n.nTHead).clone()).append(e(n.nTFoot).clone()),u.find("tfoot th, tfoot td").css("width",""),f=M(n,u.find("thead")[0]),r=0;r").css({width:o.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(n.aoData.length)for(r=0;r").css(l||s?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(u).appendTo(y),l&&c?u.width(c):l?(u.css("width","auto"),u.removeAttr("width"),u.width()").css("width",be(t)).appendTo(r||n.body),a=o[0].offsetWidth;return o.remove(),a}function ve(t,n){var r=ye(t,n);if(0>r)return null;var o=t.aoData[r];return o.nTr?o.anCells[n]:e("
              ").html(C(t,r,n,"display"))[0]}function ye(e,t){for(var n,r=-1,o=-1,a=0,i=e.aoData.length;ar&&(r=n.length,o=a);return o}function be(e){return null===e?"0px":"number"==typeof e?0>e?"0px":e+"px":e.match(/\d$/)?e+"px":e}function we(t){var n,o,a,i,s,l,c=[],u=t.aoColumns;n=t.aaSortingFixed,o=e.isPlainObject(n);var d=[];for(a=function(t){t.length&&!e.isArray(t[0])?d.push(t):e.merge(d,t)},e.isArray(n)&&a(n),o&&n.pre&&a(n.pre),a(t.aaSorting),o&&n.post&&a(n.post),t=0;tr?1:0))return"asc"===l.dir?n:-n;return(n=a[e])<(r=a[t])?-1:n>r?1:0}):c.sort(function(e,t){var n,r,l,c,u=o.length,d=s[e]._aSortData,f=s[t]._aSortData;for(l=0;lr?1:0})}e.bSorted=!0}function Ce(e){for(var t,n,r=e.aoColumns,o=we(e),a=(e=e.oLanguage.oAria,0),i=r.length;a/g,"");var l=n.nTh;l.removeAttribute("aria-sort"),n.bSortable&&(0s?s+1:3));for(s=0,n=i.length;ss?s+1:3))}t.aLastSort=i}function De(e,t){var n,r=e.aoColumns[t],o=Ve.ext.order[r.sSortDataType];o&&(n=o.call(e.oInstance,e,t,m(e,t)));for(var a,i=Ve.ext.type.order[r.sType+"-pre"],s=0,l=e.aoData.length;s=s.length?[0,n[1]]:n)})),n.search!==r&&e.extend(t.oPreviousSearch,ee(n.search)),n.columns)for(a=0,i=n.columns.length;a=n&&(t=n-r),t-=t%r,(-1===r||0>t)&&(t=0),e._iDisplayStart=t}function Ne(t,n){var r=t.renderer,o=Ve.ext.renderer[n];return e.isPlainObject(r)&&r[n]?o[r[n]]||o._:"string"==typeof r&&o[r]||o._}function $e(e){return e.oFeatures.bServerSide?"ssp":e.ajax||e.sAjaxSource?"ajax":"dom"}function Be(e,t){var n=[],r=(n=kt.numbers_length,Math.floor(n/2));return t<=n?n=it(0,t):e<=r?((n=it(0,n-2)).push("ellipsis"),n.push(t-1)):(e>=t-1-r?n=it(t-(n-2),t):((n=it(e-r+2,e+r-1)).push("ellipsis"),n.push(t-1)),n.splice(0,0,"ellipsis"),n.splice(0,0,0)),n.DT_el="span",n}function Me(t){e.each({num:function(e){return At(e,t)},"num-fmt":function(e){return At(e,t,Ke)},"html-num":function(e){return At(e,t,Ge)},"html-num-fmt":function(e){return At(e,t,Ge,Ke)}},function(e,n){qe.type.order[e+t+"-pre"]=n,e.match(/^html\-/)&&(qe.type.search[e+t]=qe.type.search.html)})}function He(e){return function(){var t=[Ae(this[Ve.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return Ve.ext.internal[e].apply(this,t)}}var qe,Ue,ze,We,Ve=function(t){this.$=function(e,t){return this.api(!0).$(e,t)},this._=function(e,t){return this.api(!0).rows(e,t).data()},this.api=function(e){return new Ue(e?Ae(this[qe.iApiIndex]):this)},this.fnAddData=function(t,n){var o=this.api(!0),a=e.isArray(t)&&(e.isArray(t[0])||e.isPlainObject(t[0]))?o.rows.add(t):o.row.add(t);return(n===r||n)&&o.draw(),a.flatten().toArray()},this.fnAdjustColumnSizing=function(e){var t=this.api(!0).columns.adjust(),n=t.settings()[0],o=n.oScroll;e===r||e?t.draw(!1):(""!==o.sX||""!==o.sY)&&pe(n)},this.fnClearTable=function(e){var t=this.api(!0).clear();(e===r||e)&&t.draw()},this.fnClose=function(e){this.api(!0).row(e).child.hide()},this.fnDeleteRow=function(e,t,n){var o=this.api(!0),a=(e=o.rows(e)).settings()[0],i=a.aoData[e[0][0]];return e.remove(),t&&t.call(this,a,i),(n===r||n)&&o.draw(),i},this.fnDestroy=function(e){this.api(!0).destroy(e)},this.fnDraw=function(e){this.api(!0).draw(e)},this.fnFilter=function(e,t,n,o,a,i){a=this.api(!0),null===t||t===r?a.search(e,n,o,i):a.column(t).search(e,n,o,i),a.draw()},this.fnGetData=function(e,t){var n=this.api(!0);if(e!==r){var o=e.nodeName?e.nodeName.toLowerCase():"";return t!==r||"td"==o||"th"==o?n.cell(e,t).data():n.row(e).data()||null}return n.data().toArray()},this.fnGetNodes=function(e){var t=this.api(!0);return e!==r?t.row(e).node():t.rows().nodes().flatten().toArray()},this.fnGetPosition=function(e){var t=this.api(!0),n=e.nodeName.toUpperCase();return"TR"==n?t.row(e).index():"TD"==n||"TH"==n?[(e=t.cell(e).index()).row,e.columnVisible,e.column]:null},this.fnIsOpen=function(e){return this.api(!0).row(e).child.isShown()},this.fnOpen=function(e,t,n){return this.api(!0).row(e).child(t,n).show().child()[0]},this.fnPageChange=function(e,t){var n=this.api(!0).page(e);(t===r||t)&&n.draw(!1)},this.fnSetColumnVis=function(e,t,n){e=this.api(!0).column(e).visible(t),(n===r||n)&&e.columns.adjust().draw()},this.fnSettings=function(){return Ae(this[qe.iApiIndex])},this.fnSort=function(e){this.api(!0).order(e).draw()},this.fnSortListener=function(e,t,n){this.api(!0).order.listener(e,t,n)},this.fnUpdate=function(e,t,n,o,a){var i=this.api(!0);return n===r||null===n?i.row(t).data(e):i.cell(t,n).data(e),(a===r||a)&&i.columns.adjust(),(o===r||o)&&i.draw(),0},this.fnVersionCheck=qe.fnVersionCheck;var n=this,o=t===r,u=this.length;for(var p in o&&(t={}),this.oApi=this.internal=qe.internal,Ve.ext.internal)p&&(this[p]=He(p));return this.each(function(){var p,h={},m=1").appendTo(C)),I.nTHead=n[0],0===(n=C.children("tbody")).length&&(n=e("
              ";for(let n of e)t+="",t+="",t+='",t+="";t+="
              ",t+=n.effect,t+="',t+=n.value,t+="
              "}return t},getSystemPlanetsTable:e=>{let t="";if(e.length>0){let n=/\(([^)]+)\)/;t+="";for(let r of e){let e=r.type.name,o="",a=n.exec(e.toLowerCase());a&&a[1]&&(e=a[1].capitalize(),o=k(a[1])),t+="",t+="",t+='",t+='",t+=""}t+="
              ",t+=r.name,t+="',t+='',t+="',t+=e,t+="
              "}return t},getSystemRegionTable:(e,t)=>{let n=[{label:"Region",value:e}];t&&(t.faction&&n.push({label:"Sov. Faction",value:t.faction.name}),t.alliance&&n.push({label:"Sov. Ally",value:t.alliance.name}));let r="";for(let e of n)r+="",r+="",r+='",r+="";return r+="
              ",r+=e.label,r+="',r+=e.value,r+="
              "},getSystemPilotsTable:e=>{let t="";if(e.length>0){let n=(e,t,n,r,o)=>{let a="
            ',a+="",a+=null!==e?'':"",a+="",a+="",a+=t,a+="",a+=n,a+="',a+=r,a+="',a+=o,a+="
            ";for(let o of e){r+=parseInt(o.log.ship.mass);let e=I(o,"class"),a=N(o.log.ship.mass);t+=n(e,o.name,o.log.ship.name,o.log.ship.typeName,a)}t+=n(null,"","","",N(r)),t+="
            "}return t},getSystemsInfoTable:e=>{let t="";if(e.length>0){t+="";for(let n=0;n",t+="",t+='",t+='",t+=""}t+="
            ",t+=e[n].name,t+="',t+=e[n].security,t+="',t+=parseFloat(e[n].trueSec).toFixed(1),t+="
            "}return t},getStatusInfoForCharacter:I,getSecurityClassForSystem:A,getTrueSecClassForSystem:E,getStatusInfoForSystem:(n,r)=>{let o="";return t.systemStatus.hasOwnProperty(n)?o=t.systemStatus[n][r]:e.each(t.systemStatus,function(e,t){n!==t.id||(o=t[r])}),o},getSignatureGroupOptions:e=>{let n=[];for(let[r,o]of Object.entries(t.signatureGroups))n.push({value:parseInt(r),text:o[e]});return n},getSignatureTypeNames:(e,t,n)=>q(...t.map(t=>U(a,[e,t,n].join("."))||{})),getAreaIdBySecurity:D,setCurrentMapUserData:e=>(t.currentMapUserData=e,F()),getCurrentMapUserData:F,updateCurrentMapUserData:e=>{let n=(e=>O(t.currentMapUserData,e))(e.config.id);Array.isArray(t.currentMapUserData)||(t.currentMapUserData=[]),!1!==n?t.currentMapUserData[n]=e:t.currentMapUserData.push(e)},setCurrentMapData:e=>(t.currentMapData=e,P()),getCurrentMapData:P,filterCurrentMapData:(e,t)=>{let n=P();return n&&(n=n.filter(n=>U(n,e)===t)),n},updateCurrentMapData:e=>{let n=(e=>O(t.currentMapData,e))(e.config.id);!1!==n?(t.currentMapData[n].config=e.config,t.currentMapData[n].data=e.data):t.currentMapData.push(e)},deleteCurrentMapData:e=>{t.currentMapData=t.currentMapData.filter(t=>t.config.id!==e)},setCurrentUserData:n=>{let r=!1;if(n&&n.character&&n.characters){let o=C(w(),n);Object.values(o).some(e=>e)&&e(document).trigger("pf:changedUserData",[n,o]),t.currentUserData=n,r=!0}else console.error("Could not set userData %o. Missing or malformed obj",n);return r},getCurrentUserData:w,getCurrentCharacterId:x,setCurrentSystemData:e=>{t.currentSystemData=e},getCurrentSystemData:()=>t.currentSystemData,getCurrentLocationData:()=>{let t=e("#"+c.headUserLocationId+">li:last-of-type");return{id:parseInt(t.attr("data-systemId"))||0,name:t.attr("data-systemName")||!1}},getCurrentUserInfo:j,getCurrentCharacterLog:()=>U(w(),"character.log")||!1,findInViewport:e=>{let t=[];for(let n of e){if(!(n instanceof HTMLElement)){console.warn("findInViewport() expects Array() of %O; %o given",HTMLElement,n);continue}let e=n.offsetTop,r=n.offsetLeft,o=n.offsetWidth,a=n.offsetHeight,i=n;for(;n.offsetParent;)e+=(n=n.offsetParent).offsetTop,r+=n.offsetLeft;ewindow.pageYOffset&&r+o>window.pageXOffset&&t.push(i)}return t},initScrollSpy:(t,n=window,r={})=>{let o,a,i=Array.from(t.querySelectorAll(".page-scroll")).map(e=>({link:e,content:document.getElementById(e.getAttribute("data-target"))})),s=e=>{if(!e)return;document.activeElement===e.link&&document.activeElement.blur();let t=e.link.closest("li");t&&t.classList.remove("active")},l=(e,t,n)=>{let r=e.getBoundingClientRect(),o=(e=>"function"==typeof e.offset?parseFloat(e.offset()):parseFloat(e.offset))(t);return n?parseInt(r.bottom,10)<(window.innerHeight||document.documentElement.clientHeight):parseInt(r.top,10)<=o},c=()=>window.innerHeight+window.pageYOffset>=(()=>Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight))(),u=(e,t)=>{let n=e[e.length-1];if(((e,t)=>!(!c()||!l(e.content,t,!0)))(n,t))return n;for(let n=e.length-1;n>=0;n--)if(l(e[n].content,t))return e[n]},d=()=>{let e=u(i,r);e?a&&e.content===a.content||(s(a),(e=>{if(!e)return;let t=e.link.closest("li");t&&t.classList.add("active")})(e),a=e):a&&(s(a),a=null)};d(),n.addEventListener("scroll",()=>{o&&window.cancelAnimationFrame(o),o=window.requestAnimationFrame(d)},!1);let f=function(e){e.preventDefault(),this.content.scrollIntoView({behavior:"smooth"})};for(let t of i)e(t.link).on("click",f.bind(t))},getConfirmationTemplate:m,convertXEditableOptionsToSelect2:e=>{let t=[];if(e.options){let n=e.options.prepend?e.options.prepend:[],r=e.options.source(),o=[];o.push(...n,...r);let a=t=>{let n={id:t.value,text:t.text};return e.value===t.value&&(n.selected=!0),!0===t.disabled&&(n.disabled=!0),t.hasOwnProperty("metaData")&&(n.metaData=t.metaData),n};t=o.map(e=>(e.children?e.children=e.children.map(a):e=a(e),e))}return t},flattenXEditableSelectArray:e=>{let t={};for(let n of e)if(n.children&&n.children.length>0)for(let e of n.children)t[e.value]=e.text;else t[n.value]=n.text;return t},getCharacterDataBySystemId:L,getNearBySystemData:R,getNearByCharacterData:$,setDestination:(n,r,o)=>{let a="";switch(n){case"set_destination":a="Set destination";break;case"add_first_waypoint":a="Set first waypoint";break;case"add_last_waypoint":a="Set new waypoint"}e.ajax({type:"POST",url:t.path.setDestination,data:{clearOtherWaypoints:"set_destination"===n?1:0,first:"add_last_waypoint"===n?0:1,destData:[o]},context:{destType:r,description:a},dataType:"json"}).done(function(e){if(e.destData&&e.destData.length>0)for(let t=0;t0)for(let t=0;t{return new Promise((t,n)=>{let r={action:"copyToClipboard",data:!1};navigator.clipboard?navigator.permissions.query({name:"clipboard-write"}).then(n=>{"granted"===n.state||"prompt"===n.state?navigator.clipboard.writeText(e).then(()=>{r.data=!0,t(r)}).catch(e=>{let n="Failed to write clipboard content";console.error(n,e),b({title:"Clipboard API",text:n,type:"error"}),t(r)}):(b({title:"Clipboard API",text:"You denied write access",type:"warning"}),t(r))}):(console.warn("Clipboard API not supported by your browser"),t(r))})},readFromClipboard:()=>{return new Promise((e,t)=>{let n={action:"readFromClipboard",data:!1};navigator.clipboard?navigator.permissions.query({name:"clipboard-read"}).then(t=>{"granted"===t.state||"prompt"===t.state?navigator.clipboard.readText().then(t=>{n.data=t,e(n)}).catch(t=>{let r="Failed to read clipboard content";console.error(r,t),b({title:"Clipboard API",text:r,type:"error"}),e(n)}):(b({title:"Clipboard API",text:"You denied read access",type:"warning"}),e(n))}):(console.warn("Clipboard API not supported by your browser"),e(n))})},convertDateToUTC:B,convertDateToString:M,getOpenDialogs:()=>e("."+c.dialogClass).filter(":visible"),openIngameWindow:n=>{(n=parseInt(n))>0&&e.ajax({type:"POST",url:t.path.openIngameWindow,data:{targetId:n},dataType:"json"}).done(function(e){e.error.length>0?b({title:"Open window in client",text:"Remote window open failed",type:"error"}):b({title:"Open window in client",text:"Check your EVE client",type:"success"})}).fail(function(e,t,n){let r=t+" "+n;b({title:e.status+": openWindow",text:r,type:"error"})})},formatPrice:e=>{let t=(e=Number(e).toFixed(2)).toString().split(".");return(e=t[0].replace(/\B(?=(\d{3})+(?!\d))/g,",")+(t[1]?"."+t[1]:""))+" ISK"},formatMassValue:N,getLocalStorage:function(){return void 0===l&&(l=s.createInstance({driver:[s.INDEXEDDB,s.WEBSQL,s.LOCALSTORAGE],name:"Pathfinder local storage"})),l},clearSessionStorage:()=>{sessionStorage&&sessionStorage.clear()},getBrowserTabId:S,singleDoubleClick:(n,r,o,a)=>{let i="mouseup.singleDouble";if(!((t,n)=>{let r=!1,o=e._data(t[0],"events");if(o){let e=n.split("."),t=o[e[0]];if(t){let n=2===e.length&&e[1];if(n){for(let e of t)if(e.namespace===n){r=!0;break}}else r=!0}}return r})(n,i)){let e=0;n.off("click").on("click",function(e){e.preventDefault()}),n.off(i).on(i,function(n){1==++e&&setTimeout(t=>{1===e?r.call(t,n):o.call(t,n),e=0},a||t.timer.DBL_CLICK,this)})}},getTableId:H,getTableRowId:(e,t,n)=>e+[t,n].join("-"),getDataTableInstance:(t,n,r,o)=>{let a=null,i=e.fn.dataTable.tables({visible:!1,api:!0}).table("#"+H(t,o,n,r));return i.node()&&(a=i),a},htmlEncode:t=>e("
            ").text(t).html(),htmlDecode:t=>e("
            ").html(t).text(),isValidHtml:e=>{let t=(new DOMParser).parseFromString(e,"text/html");return Array.from(t.body.childNodes).some(e=>1===e.nodeType)},isDomElement:e=>!(!e||1!==e.nodeType),arrayToObject:(e,t="id")=>e.reduce((e,n)=>(e[n[t]]=n,e),{}),getObjVal:U,redirect:z,logout:n=>{let r={};n&&n.ajaxData&&(r=n.ajaxData),e.ajax({type:"POST",url:t.path.logout,data:r,dataType:"json"}).done(function(e){e.reroute&&z(e.reroute,["logout"])}).fail(function(e,t,n){let r=t+" "+n;b({title:e.status+": logout",text:r,type:"error"})})},setCookie:(e,t,n,r)=>{let o=new Date,a=o.getTime(),i=-1*a;if(n>0)switch(r){case"d":i=24*n*60*60*1e3;break;case"s":i=1e3*n}o.setTime(a+i);let s="expires="+o.toUTCString(),l="path="+(window.location.pathname.replace(/[^\/]*$/,"")||"/");document.cookie=e+"="+t+"; "+s+"; "+l},getCookie:e=>{let t=e+"=",n=document.cookie.split(";");for(let e=0;et)return e;for(r=0;r{"use strict";return class extends Promise{constructor(e,t=6e3){let n,r="Promise"===e[Symbol.toStringTag]?e:new Promise(e),o=Promise.race([r,new Promise((e,r)=>{n=setTimeout(e=>{r(new Error("Promise timeout after "+e+"ms"))},t,t)})]);super(function(e,t){o.then(t=>{clearTimeout(n),e(t)}).catch(e=>{clearTimeout(n),t(e)})})}}}),define("app/lib/cron",["easyTimer","app/promises/promise.timeout"],(e,t)=>{"use strict";let n=class{constructor(e,t){if("string"!=typeof e)throw new TypeError('Task "name" must be instance of String, Type of "'+typeof e+'" given');this._config=Object.assign({},this.constructor.defaultConfig,t),this._name=e,this._task=void 0,this._manager=void 0,this._runQueue=new Map,this._runCount=0,this._lastTotalTimeValues=void 0}get name(){return this._name}get task(){return this._task}get runCount(){return this._runCount}get precision(){return this._config.precision}set task(e){if(!(e instanceof Function))throw new TypeError('Task "task" must be instance of "function", Type of "'+typeof e+'" given');this._task=e}get(e){return this._config[e]}set(e,t){this._config[e]=t}setManager(e){this._manager=e}isRunning(){return!!this._runQueue.size}delete(){let e=!1;return this._manager&&(e=this._manager.delete(this.name)),e}isDue(e){if(this._config.dueDate instanceof Date){if((new Date).getTime()>=this._config.dueDate.getTime())return!0}else{let t=e.getTotalTimeValues()[this.precision];if(t-=this._lastTotalTimeValues?this._lastTotalTimeValues[this.precision]:0,1===this._config.interval||t%this._config.interval==0)return!0}return!1}invoke(e){!this.isDue(e)||this.isRunning()&&!this._config.isParallel||this.run(e)}run(e){this._lastTotalTimeValues=Object.assign({},e.getTotalTimeValues());let n="run_"+ ++this._runCount,r=t=>{t(this.task(e,this))},o=this._config.timeout>0?new t(r,this._config.timeout):new Promise(r);o.then(e=>{}).catch(e=>{e instanceof Error&&console.warn(e)}).finally(()=>{this._runQueue.delete(n),this._config.dueDate instanceof Date&&this.delete()}),this._runQueue.set(n,o)}};n.defaultConfig={precision:"seconds",isParallel:!1,interval:1,dueDate:void 0,timeout:50};let r=class{constructor(t){this._config=Object.assign({},this.constructor.defaultConfig,t),this._timerConfig=Object.assign({},this.constructor.defaultTimerConfig),this._tasks=new Map,this._timer=new e.Timer,this._config.precisions.map(e=>e+"Updated").forEach(e=>{this._timer.on(e,e=>{let t=e.type.substring(0,e.type.indexOf("Updated"));this.tasksByPrecision(t).forEach(t=>t.invoke(e.detail.timer))})}),this.debug=((e,...t)=>{this._config.debug&&(t=t||[],console.debug(e,...t))})}new(e,t){return new n(e,t)}set(e){if(!(e instanceof n))throw new TypeError("Parameter must be instance of Task");this.has(e.name)&&this.get(e.name)!==e?console.warn("FAILED to set task. Task name %o already exists",e.name):(e.setManager(this),this._tasks.set(e.name,e),this.debug("SET/UPDATE task: %o config: %o",e.name,e),this.auto())}setNew(e,t){this.set(this.new(e,t))}get(e){return this._tasks.get(e)}has(e){return this._tasks.has(e)}delete(e){let t=this._tasks.delete(e);return t&&(this.debug("DELETE task: %o",e),this.auto()),t}clear(){this.debug("CLEAR all %o task(s)",this._tasks.size),this._tasks.clear(),this.auto()}tasksByPrecision(e){let t=[];return this._tasks.forEach(n=>{e===n.precision&&t.push(n)}),t}start(){this._timer.start(this._timerConfig)}stop(){this._timer.stop()}pause(){this._timer.pause()}reset(){this._timer.reset()}auto(){this._tasks.size?this._timer.isRunning()||(this.start(),this.debug("START [auto] timer. %o task(s) found.",this._tasks.size)):(this.stop(),this.debug("STOP [auto] timer. No tasks set."))}};return r.defaultConfig={precisions:["secondTenths","seconds","minutes","hours","days"],debug:!1},r.defaultTimerConfig={precision:"secondTenths",countdown:!1},new r({debug:!1})}),define("app/counter",["jquery","app/util","app/lib/cron"],(e,t,n)=>{"use strict";let r={counterTaskAttr:"data-counter-task",counterStopClass:"stopCounter",counterDigitSmallClass:"pf-digit-counter-small",counterDigitLargeClass:"pf-digit-counter-large"},o=(e,n,o)=>{let a=t.getTimeDiffParts(n,new Date),i=a.days,s=a.hours,l=a.min,c=a.sec,u=[];"d"===o&&i>=1?u.push('> 1d'):((i>0||u.length>0)&&u.push(''+i+"d"),(s>0||u.length>0)&&u.push(''+s+"h"),(l>0||u.length>0)&&u.push(''+l+"m"),(c>=0||u.length>0)&&u.push(''+c+"s")),e.html(u.join(" "))},a=(t,o)=>{let a="["+r.counterTaskAttr+"]",i=t.filter(a);o&&(i=i.add(t.find(a))),i.each(function(){let t=e(this),o=t.attr(r.counterTaskAttr);n.delete(o)&&t.removeAttr(r.counterTaskAttr).removeClass(r.counterStopClass)})};return{config:r,updateDateDiff:o,initTimestampCounter:(e,i)=>{let s=parseInt(e.text());if(s>0){let l=e.attr("id")||t.getRandomString(),c=new Date(1e3*s);o(e,c,i),e.css({visibility:"initial"});let u=n.new(l,{precision:"seconds",interval:1,timeout:100});u.task=(()=>{e.hasClass(r.counterStopClass)?a(e):o(e,c,i)}),n.set(u),e.attr(r.counterTaskAttr,l)}},initTableCounter:(e,t,a)=>{let i=e.api(),s=e.attr("id"),l=function(e,t,n,i){let s=this,l=s.node(),c=s.data();if(c&&Number.isInteger(c)&&!l.classList.contains(r.counterStopClass)){let e=new Date(1e3*c);o(s.nodes().to$(),e,a)}},c=n.new(s,{precision:"seconds",interval:1,timeout:100});c.task=(e=>{i.cells(null,t).every(l)}),n.set(c),e.attr(r.counterTaskAttr,s)},destroyTimestampCounter:a}}),define("app/promises/promise.deferred",[],()=>{"use strict";return class{constructor(){this._promise=new Promise((e,t)=>{this.resolve=e,this.reject=t}),this.then=this._promise.then.bind(this._promise),this.catch=this._promise.catch.bind(this._promise)}set data(e){return e&&(this._data=e),this._data}get data(){return this._data}get[Symbol.toStringTag](){return"Promise"}}}),function(e){"function"==typeof define&&define.amd?define("datatables.net",["jquery"],function(t){return e(t,window,document)}):"object"==typeof exports?module.exports=function(t,n){return t||(t=window),n||(n="undefined"!=typeof window?require("jquery"):require("jquery")(t)),e(n,t,t.document)}:e(jQuery,window,document)}(function(e,t,n,r){function o(t){var n,r,a={};e.each(t,function(e){(n=e.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(n[1]+" ")&&(r=e.replace(n[0],n[2].toLowerCase()),a[r]=e,"o"===n[1]&&o(t[e]))}),t._hungarianMap=a}function a(t,n,i){var s;t._hungarianMap||o(t),e.each(n,function(o){(s=t._hungarianMap[o])===r||!i&&n[s]!==r||("o"===s.charAt(0)?(n[s]||(n[s]={}),e.extend(!0,n[s],n[o]),a(t[s],n[s],i)):n[s]=n[o])})}function i(e){var t=Ve.defaults.oLanguage,n=t.sDecimal;if(n&&Me(n),e){var r=e.sZeroRecords;!e.sEmptyTable&&r&&"No data available in table"===t.sEmptyTable&&Oe(e,e,"sZeroRecords","sEmptyTable"),!e.sLoadingRecords&&r&&"Loading..."===t.sLoadingRecords&&Oe(e,e,"sZeroRecords","sLoadingRecords"),e.sInfoThousands&&(e.sThousands=e.sInfoThousands),(e=e.sDecimal)&&n!==e&&Me(e)}}function s(e){if(ct(e,"ordering","bSort"),ct(e,"orderMulti","bSortMulti"),ct(e,"orderClasses","bSortClasses"),ct(e,"orderCellsTop","bSortCellsTop"),ct(e,"order","aaSorting"),ct(e,"orderFixed","aaSortingFixed"),ct(e,"paging","bPaginate"),ct(e,"pagingType","sPaginationType"),ct(e,"pageLength","iDisplayLength"),ct(e,"searching","bFilter"),"boolean"==typeof e.sScrollX&&(e.sScrollX=e.sScrollX?"100%":""),"boolean"==typeof e.scrollX&&(e.scrollX=e.scrollX?"100%":""),e=e.aoSearchCols)for(var t=0,n=e.length;t").css({position:"fixed",top:0,left:-1*e(t).scrollLeft(),height:1,width:1,overflow:"hidden"}).append(e("
            ").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(e("
            ").css({width:"100%",height:10}))).appendTo("body"),a=o.children(),i=a.children();r.barWidth=a[0].offsetWidth-a[0].clientWidth,r.bScrollOversize=100===i[0].offsetWidth&&100!==a[0].clientWidth,r.bScrollbarLeft=1!==Math.round(i.offset().left),r.bBounding=!!o[0].getBoundingClientRect().width,o.remove()}e.extend(n.oBrowser,Ve.__browser),n.oScroll.iBarWidth=Ve.__browser.barWidth}function u(e,t,n,o,a,i){var s,l=!1;for(n!==r&&(s=n,l=!0);o!==a;)e.hasOwnProperty(o)&&(s=l?t(s,e[o],o,e):e[o],l=!0,o+=i);return s}function d(t,r){var o=Ve.defaults.column,a=t.aoColumns.length;o=e.extend({},Ve.models.oColumn,o,{nTh:r||n.createElement("th"),sTitle:o.sTitle?o.sTitle:r?r.innerHTML:"",aDataSort:o.aDataSort?o.aDataSort:[a],mData:o.mData?o.mData:a,idx:a});t.aoColumns.push(o),(o=t.aoPreSearchCols)[a]=e.extend({},Ve.models.oSearch,o[a]),f(t,a,e(r).data())}function f(t,n,o){n=t.aoColumns[n];var i=t.oClasses,s=e(n.nTh);if(!n.sWidthOrig){n.sWidthOrig=s.attr("width")||null;var c=(s.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/);c&&(n.sWidthOrig=c[1])}o!==r&&null!==o&&(l(o),a(Ve.defaults.column,o),o.mDataProp!==r&&!o.mData&&(o.mData=o.mDataProp),o.sType&&(n._sManualType=o.sType),o.className&&!o.sClass&&(o.sClass=o.className),o.sClass&&s.addClass(o.sClass),e.extend(n,o),Oe(n,o,"sWidth","sWidthOrig"),o.iDataSort!==r&&(n.aDataSort=[o.iDataSort]),Oe(n,o,"aDataSort"));var u=n.mData,d=T(u),f=n.mRender?T(n.mRender):null;o=function(e){return"string"==typeof e&&-1!==e.indexOf("@")};n._bAttrSrc=e.isPlainObject(u)&&(o(u.sort)||o(u.type)||o(u.filter)),n._setter=null,n.fnGetData=function(e,t,n){var o=d(e,t,r,n);return f&&t?f(o,t,e,n):o},n.fnSetData=function(e,t,n){return D(u)(e,t,n)},"number"!=typeof u&&(t._rowReadObject=!0),t.oFeatures.bSort||(n.bSortable=!1,s.addClass(i.sSortableNone)),t=-1!==e.inArray("asc",n.asSorting),o=-1!==e.inArray("desc",n.asSorting),n.bSortable&&(t||o)?t&&!o?(n.sSortingClass=i.sSortableAsc,n.sSortingClassJUI=i.sSortJUIAscAllowed):!t&&o?(n.sSortingClass=i.sSortableDesc,n.sSortingClassJUI=i.sSortJUIDescAllowed):(n.sSortingClass=i.sSortable,n.sSortingClassJUI=i.sSortJUI):(n.sSortingClass=i.sSortableNone,n.sSortingClassJUI="")}function p(e){if(!1!==e.oFeatures.bAutoWidth){var t=e.aoColumns;me(e);for(var n=0,r=t.length;nh[s])a(p.length+h[s],f);else if("string"==typeof h[s])for(c=0,u=p.length;ct&&e[a]--;-1!=o&&n===r&&e.splice(o,1)}function E(e,t,n,o){var a,i=e.aoData[t],s=function(n,r){for(;n.childNodes.length;)n.removeChild(n.firstChild);n.innerHTML=C(e,t,r,"display")};if("dom"!==n&&(n&&"auto"!==n||"dom"!==i.src)){var l=i.anCells;if(l)if(o!==r)s(l[o],o);else for(n=0,a=l.length;n").appendTo(s)),n=0,r=d.length;ntr").attr("role","row"),e(s).find(">tr>th, >tr>td").addClass(u.sHeaderTH),e(l).find(">tr>th, >tr>td").addClass(u.sFooterTH),null!==l)for(n=0,r=(t=t.aoFooter[0]).length;n=t.fnRecordsDisplay()?0:l,t.iInitDisplayStart=-1);l=t._iDisplayStart;var d=t.fnDisplayEnd();if(t.bDeferLoading)t.bDeferLoading=!1,t.iDraw++,de(t,!1);else if(c){if(!t.bDestroying&&!q(t))return}else t.iDraw++;if(0!==u.length)for(s=c?t.aoData.length:d,c=c?0:l;c",{class:i?a[0]:""}).append(e("",{valign:"top",colSpan:g(t),class:t.oClasses.sRowEmpty}).html(o))[0];Re(t,"aoHeaderCallback","header",[e(t.nTHead).children("tr")[0],I(t),l,d,u]),Re(t,"aoFooterCallback","footer",[e(t.nTFoot).children("tr")[0],I(t),l,d,u]),(a=e(t.nTBody)).children().detach(),a.append(e(n)),Re(t,"aoDrawCallback","draw",[t]),t.bSorted=!1,t.bFiltered=!1,t.bDrawing=!1}}function $(e,t){var n=e.oFeatures,r=n.bFilter;n.bSort&&xe(e),r?X(e,e.oPreviousSearch):e.aiDisplay=e.aiDisplayMaster.slice(),!0!==t&&(e._iDisplayStart=0),e._drawHold=t,L(e),e._drawHold=!1}function N(t){var n=t.oClasses,r=e(t.nTable),o=(r=e("
            ").insertBefore(r),t.oFeatures),a=e("
            ",{id:t.sTableId+"_wrapper",class:n.sWrapper+(t.nTFoot?"":" "+n.sNoFooter)});t.nHolding=r[0],t.nTableWrapper=a[0],t.nTableReinsertBefore=t.nTable.nextSibling;for(var i,s,l,c,u,d,f=t.sDom.split(""),p=0;p")[0],"'"==(c=f[p+1])||'"'==c){for(u="",d=2;f[p+d]!=c;)u+=f[p+d],d++;"H"==u?u=n.sJUIHeader:"F"==u&&(u=n.sJUIFooter),-1!=u.indexOf(".")?(c=u.split("."),l.id=c[0].substr(1,c[0].length-1),l.className=c[1]):"#"==u.charAt(0)?l.id=u.substr(1,u.length-1):l.className=u,p+=d}a.append(l),a=e(l)}else if(">"==s)a=a.parent();else if("l"==s&&o.bPaginate&&o.bLengthChange)i=se(t);else if("f"==s&&o.bFilter)i=V(t);else if("r"==s&&o.bProcessing)i=ue(t);else if("t"==s)i=fe(t);else if("i"==s&&o.bInfo)i=te(t);else if("p"==s&&o.bPaginate)i=le(t);else if(0!==Ve.ext.feature.length)for(d=0,c=(l=Ve.ext.feature).length;d',c=(c=a.sSearch).match(/_INPUT_/)?c.replace("_INPUT_",l):c+l,u=(r=e("
            ",{id:s.f?null:o+"_filter",class:r.sFilter}).append(e("
            ").addClass(n.sLength);return t.aanFeatures.l||(c[0].id=r+"_length"),c.children().append(t.oLanguage.sLengthMenu.replace("_MENU_",i[0].outerHTML)),e("select",c).val(t._iDisplayLength).on("change.DT",function(){ie(t,e(this).val()),L(t)}),e(t.nTable).on("length.dt.DT",function(n,r,o){t===r&&e("select",c).val(o)}),c[0]}function le(t){var n=t.sPaginationType,r=Ve.ext.pager[n],o="function"==typeof r,a=function(e){L(e)},i=(n=e("
            ").addClass(t.oClasses.sPaging+n)[0],t.aanFeatures);return o||r.fnInit(t,n,a),i.p||(n.id=t.sTableId+"_paginate",t.aoDrawCallback.push({fn:function(e){if(o){var t,n=e._iDisplayStart,s=e._iDisplayLength,l=e.fnRecordsDisplay(),c=(n=(c=-1===s)?0:Math.ceil(n/s),s=c?1:Math.ceil(l/s),l=r(n,s),0);for(t=i.p.length;ca&&(r=0):"first"==t?r=0:"previous"==t?0>(r=0<=o?r-o:0)&&(r=0):"next"==t?r+o",{id:t.aanFeatures.r?null:t.sTableId+"_processing",class:t.oClasses.sProcessing}).html(t.oLanguage.sProcessing).insertBefore(t.nTable)[0]}function de(t,n){t.oFeatures.bProcessing&&e(t.aanFeatures.r).css("display",n?"block":"none"),Re(t,null,"processing",[t,n])}function fe(t){(d=e(t.nTable)).attr("role","grid");var n=t.oScroll;if(""===n.sX&&""===n.sY)return t.nTable;var r=n.sX,o=n.sY,a=t.oClasses,i=d.children("caption"),s=i.length?i[0]._captionSide:null,l=e(d[0].cloneNode(!1)),c=e(d[0].cloneNode(!1)),u=d.children("tfoot");u.length||(u=null),l=e("
            ",{class:a.sScrollWrapper}).append(e("
            ",{class:a.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:r?r?be(r):null:"100%"}).append(e("
            ",{class:a.sScrollHeadInner}).css({"box-sizing":"content-box",width:n.sXInner||"100%"}).append(l.removeAttr("id").css("margin-left",0).append("top"===s?i:null).append(d.children("thead"))))).append(e("
            ",{class:a.sScrollBody}).css({position:"relative",overflow:"auto",width:r?be(r):null}).append(d)),u&&l.append(e("
            ",{class:a.sScrollFoot}).css({overflow:"hidden",border:0,width:r?r?be(r):null:"100%"}).append(e("
            ",{class:a.sScrollFootInner}).append(c.removeAttr("id").css("margin-left",0).append("bottom"===s?i:null).append(d.children("tfoot")))));var d,f=(d=l.children())[0],p=(a=d[1],u?d[2]:null);return r&&e(a).on("scroll.DT",function(){var e=this.scrollLeft;f.scrollLeft=e,u&&(p.scrollLeft=e)}),e(a).css(o&&n.bCollapse?"max-height":"height",o),t.nScrollHead=f,t.nScrollBody=a,t.nScrollFoot=p,t.aoDrawCallback.push({fn:pe,sName:"scrolling"}),l[0]}function pe(t){var n,o,a,i,s,l=(d=t.oScroll).sX,c=d.sXInner,u=d.sY,d=d.iBarWidth,f=e(t.nScrollHead),m=f[0].style,g=(y=f.children("div"))[0].style,v=y.children("table"),y=t.nScrollBody,b=e(y),w=y.style,x=e(t.nScrollFoot).children("div"),C=x.children("table"),S=e(t.nTHead),_=e(t.nTable),T=_[0],D=T.style,I=t.nTFoot?e(t.nTFoot):null,k=t.oBrowser,A=k.bScrollOversize,E=ot(t.aoColumns,"nTh"),O=[],F=[],P=[],j=[],R=function(e){(e=e.style).paddingTop="0",e.paddingBottom="0",e.borderTopWidth="0",e.borderBottomWidth="0",e.height=0};o=y.scrollHeight>y.clientHeight,t.scrollBarVis!==o&&t.scrollBarVis!==r?(t.scrollBarVis=o,p(t)):(t.scrollBarVis=o,_.children("thead, tfoot").remove(),I&&(a=I.clone().prependTo(_),n=I.find("tr"),a=a.find("tr")),i=S.clone().prependTo(_),S=S.find("tr"),o=i.find("tr"),i.find("th, td").removeAttr("tabindex"),l||(w.width="100%",f[0].style.width="100%"),e.each(M(t,i),function(e,n){s=h(t,e),n.style.width=t.aoColumns[s].sWidth}),I&&he(function(e){e.style.width=""},a),f=_.outerWidth(),""===l?(D.width="100%",A&&(_.find("tbody").height()>y.offsetHeight||"scroll"==b.css("overflow-y"))&&(D.width=be(_.outerWidth()-d)),f=_.outerWidth()):""!==c&&(D.width=be(c),f=_.outerWidth()),he(R,o),he(function(t){P.push(t.innerHTML),O.push(be(e(t).css("width")))},o),he(function(t,n){-1!==e.inArray(t,E)&&(t.style.width=O[n])},S),e(o).height(0),I&&(he(R,a),he(function(t){j.push(t.innerHTML),F.push(be(e(t).css("width")))},a),he(function(e,t){e.style.width=F[t]},n),e(a).height(0)),he(function(e,t){e.innerHTML='
            '+P[t]+"
            ",e.childNodes[0].style.height="0",e.childNodes[0].style.overflow="hidden",e.style.width=O[t]},o),I&&he(function(e,t){e.innerHTML='
            '+j[t]+"
            ",e.childNodes[0].style.height="0",e.childNodes[0].style.overflow="hidden",e.style.width=F[t]},a),_.outerWidth()y.offsetHeight||"scroll"==b.css("overflow-y")?f+d:f,A&&(y.scrollHeight>y.offsetHeight||"scroll"==b.css("overflow-y"))&&(D.width=be(n-d)),(""===l||""!==c)&&Ee(t,1,"Possible column misalignment",6)):n="100%",w.width=be(n),m.width=be(n),I&&(t.nScrollFoot.style.width=be(n)),!u&&A&&(w.height=be(T.offsetHeight+d)),l=_.outerWidth(),v[0].style.width=be(l),g.width=be(l),c=_.height()>y.clientHeight||"scroll"==b.css("overflow-y"),g[u="padding"+(k.bScrollbarLeft?"Left":"Right")]=c?d+"px":"0px",I&&(C[0].style.width=be(l),x[0].style.width=be(l),x[0].style[u]=c?d+"px":"0px"),_.children("colgroup").insertBefore(_.children("thead")),b.scroll(),!t.bSorted&&!t.bFiltered||t._drawHold||(y.scrollTop=0))}function he(e,t,n){for(var r,o,a=0,i=0,s=t.length;i").appendTo(u.find("tbody"));for(u.find("thead, tfoot").remove(),u.append(e(n.nTHead).clone()).append(e(n.nTFoot).clone()),u.find("tfoot th, tfoot td").css("width",""),f=M(n,u.find("thead")[0]),r=0;r").css({width:o.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(n.aoData.length)for(r=0;r").css(l||s?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(u).appendTo(y),l&&c?u.width(c):l?(u.css("width","auto"),u.removeAttr("width"),u.width()").css("width",be(t)).appendTo(r||n.body),a=o[0].offsetWidth;return o.remove(),a}function ve(t,n){var r=ye(t,n);if(0>r)return null;var o=t.aoData[r];return o.nTr?o.anCells[n]:e("").html(C(t,r,n,"display"))[0]}function ye(e,t){for(var n,r=-1,o=-1,a=0,i=e.aoData.length;ar&&(r=n.length,o=a);return o}function be(e){return null===e?"0px":"number"==typeof e?0>e?"0px":e+"px":e.match(/\d$/)?e+"px":e}function we(t){var n,o,a,i,s,l,c=[],u=t.aoColumns;n=t.aaSortingFixed,o=e.isPlainObject(n);var d=[];for(a=function(t){t.length&&!e.isArray(t[0])?d.push(t):e.merge(d,t)},e.isArray(n)&&a(n),o&&n.pre&&a(n.pre),a(t.aaSorting),o&&n.post&&a(n.post),t=0;tr?1:0))return"asc"===l.dir?n:-n;return(n=a[e])<(r=a[t])?-1:n>r?1:0}):c.sort(function(e,t){var n,r,l,c,u=o.length,d=s[e]._aSortData,f=s[t]._aSortData;for(l=0;lr?1:0})}e.bSorted=!0}function Ce(e){for(var t,n,r=e.aoColumns,o=we(e),a=(e=e.oLanguage.oAria,0),i=r.length;a/g,"");var l=n.nTh;l.removeAttribute("aria-sort"),n.bSortable&&(0s?s+1:3));for(s=0,n=i.length;ss?s+1:3))}t.aLastSort=i}function De(e,t){var n,r=e.aoColumns[t],o=Ve.ext.order[r.sSortDataType];o&&(n=o.call(e.oInstance,e,t,m(e,t)));for(var a,i=Ve.ext.type.order[r.sType+"-pre"],s=0,l=e.aoData.length;s=s.length?[0,n[1]]:n)})),n.search!==r&&e.extend(t.oPreviousSearch,ee(n.search)),n.columns)for(a=0,i=n.columns.length;a=n&&(t=n-r),t-=t%r,(-1===r||0>t)&&(t=0),e._iDisplayStart=t}function $e(t,n){var r=t.renderer,o=Ve.ext.renderer[n];return e.isPlainObject(r)&&r[n]?o[r[n]]||o._:"string"==typeof r&&o[r]||o._}function Ne(e){return e.oFeatures.bServerSide?"ssp":e.ajax||e.sAjaxSource?"ajax":"dom"}function Be(e,t){var n=[],r=(n=kt.numbers_length,Math.floor(n/2));return t<=n?n=it(0,t):e<=r?((n=it(0,n-2)).push("ellipsis"),n.push(t-1)):(e>=t-1-r?n=it(t-(n-2),t):((n=it(e-r+2,e+r-1)).push("ellipsis"),n.push(t-1)),n.splice(0,0,"ellipsis"),n.splice(0,0,0)),n.DT_el="span",n}function Me(t){e.each({num:function(e){return At(e,t)},"num-fmt":function(e){return At(e,t,Ke)},"html-num":function(e){return At(e,t,Ge)},"html-num-fmt":function(e){return At(e,t,Ge,Ke)}},function(e,n){qe.type.order[e+t+"-pre"]=n,e.match(/^html\-/)&&(qe.type.search[e+t]=qe.type.search.html)})}function He(e){return function(){var t=[Ae(this[Ve.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return Ve.ext.internal[e].apply(this,t)}}var qe,Ue,ze,We,Ve=function(t){this.$=function(e,t){return this.api(!0).$(e,t)},this._=function(e,t){return this.api(!0).rows(e,t).data()},this.api=function(e){return new Ue(e?Ae(this[qe.iApiIndex]):this)},this.fnAddData=function(t,n){var o=this.api(!0),a=e.isArray(t)&&(e.isArray(t[0])||e.isPlainObject(t[0]))?o.rows.add(t):o.row.add(t);return(n===r||n)&&o.draw(),a.flatten().toArray()},this.fnAdjustColumnSizing=function(e){var t=this.api(!0).columns.adjust(),n=t.settings()[0],o=n.oScroll;e===r||e?t.draw(!1):(""!==o.sX||""!==o.sY)&&pe(n)},this.fnClearTable=function(e){var t=this.api(!0).clear();(e===r||e)&&t.draw()},this.fnClose=function(e){this.api(!0).row(e).child.hide()},this.fnDeleteRow=function(e,t,n){var o=this.api(!0),a=(e=o.rows(e)).settings()[0],i=a.aoData[e[0][0]];return e.remove(),t&&t.call(this,a,i),(n===r||n)&&o.draw(),i},this.fnDestroy=function(e){this.api(!0).destroy(e)},this.fnDraw=function(e){this.api(!0).draw(e)},this.fnFilter=function(e,t,n,o,a,i){a=this.api(!0),null===t||t===r?a.search(e,n,o,i):a.column(t).search(e,n,o,i),a.draw()},this.fnGetData=function(e,t){var n=this.api(!0);if(e!==r){var o=e.nodeName?e.nodeName.toLowerCase():"";return t!==r||"td"==o||"th"==o?n.cell(e,t).data():n.row(e).data()||null}return n.data().toArray()},this.fnGetNodes=function(e){var t=this.api(!0);return e!==r?t.row(e).node():t.rows().nodes().flatten().toArray()},this.fnGetPosition=function(e){var t=this.api(!0),n=e.nodeName.toUpperCase();return"TR"==n?t.row(e).index():"TD"==n||"TH"==n?[(e=t.cell(e).index()).row,e.columnVisible,e.column]:null},this.fnIsOpen=function(e){return this.api(!0).row(e).child.isShown()},this.fnOpen=function(e,t,n){return this.api(!0).row(e).child(t,n).show().child()[0]},this.fnPageChange=function(e,t){var n=this.api(!0).page(e);(t===r||t)&&n.draw(!1)},this.fnSetColumnVis=function(e,t,n){e=this.api(!0).column(e).visible(t),(n===r||n)&&e.columns.adjust().draw()},this.fnSettings=function(){return Ae(this[qe.iApiIndex])},this.fnSort=function(e){this.api(!0).order(e).draw()},this.fnSortListener=function(e,t,n){this.api(!0).order.listener(e,t,n)},this.fnUpdate=function(e,t,n,o,a){var i=this.api(!0);return n===r||null===n?i.row(t).data(e):i.cell(t,n).data(e),(a===r||a)&&i.columns.adjust(),(o===r||o)&&i.draw(),0},this.fnVersionCheck=qe.fnVersionCheck;var n=this,o=t===r,u=this.length;for(var p in o&&(t={}),this.oApi=this.internal=qe.internal,Ve.ext.internal)p&&(this[p]=He(p));return this.each(function(){var p,h={},m=1").appendTo(C)),I.nTHead=n[0],0===(n=C.children("tbody")).length&&(n=e("").appendTo(C)),I.nTBody=n[0],0===(n=C.children("tfoot")).length&&t.length>0&&(""!==I.oScroll.sX||""!==I.oScroll.sY)&&(n=e("").appendTo(C)),0===n.length||0===n.children().length?C.addClass(k.sNoFooter):n.length>0&&(I.nTFoot=n[0],B(I.aoFooter,I.nTFoot)),m.aaData)for(g=0;g/g,Qe=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,Ze=RegExp("(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\|\\$|\\^|\\-)","g"),Ke=/[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi,Je=function(e){return!e||!0===e||"-"===e},et=function(e){var t=parseInt(e,10);return!isNaN(t)&&isFinite(e)?t:null},tt=function(e,t){return Xe[t]||(Xe[t]=RegExp(ft(t),"g")),"string"==typeof e&&"."!==t?e.replace(/\./g,"").replace(Xe[t],"."):e},nt=function(e,t,n){var r="string"==typeof e;return!!Je(e)||(t&&r&&(e=tt(e,t)),n&&r&&(e=e.replace(Ke,"")),!isNaN(parseFloat(e))&&isFinite(e))},rt=function(e,t,n){return!!Je(e)||((Je(e)||"string"==typeof e)&&!!nt(e.replace(Ge,""),t,n)||null)},ot=function(e,t,n){var o=[],a=0,i=e.length;if(n!==r)for(;ae.length))for(var n=(t=e.slice().sort())[0],r=1,o=t.length;r")[0],ht=pt.textContent!==r,mt=/<.*?>/g,gt=Ve.util.throttle,vt=[],yt=Array.prototype;Ue=function(t,n){if(!(this instanceof Ue))return new Ue(t,n);var r=[],o=function(t){(t=function(t){var n,r,o=Ve.settings,a=e.map(o,function(e){return e.nTable});return t?t.nTable&&t.oApi?[t]:t.nodeName&&"table"===t.nodeName.toLowerCase()?-1!==(n=e.inArray(t,a))?[o[n]]:null:t&&"function"==typeof t.settings?t.settings().toArray():("string"==typeof t?r=e(t):t instanceof e&&(r=t),r?r.map(function(){return-1!==(n=e.inArray(this,a))?o[n]:null}).toArray():void 0):[]}(t))&&(r=r.concat(t))};if(e.isArray(t))for(var a=0,i=t.length;ae?new Ue(t[e],this[e]):null},filter:function(e){var t=[];if(yt.filter)t=yt.filter.call(this,e,this);else for(var n=0,r=this.length;n").addClass(n),e("td",r).addClass(n).html(t)[0].colSpan=g(a),i.push(r[0]))};s(t,n),o._details&&o._details.detach(),o._details=e(i),o._detailsShow&&o._details.insertAfter(o.nTr)}return this}),ze(["row().child.show()","row().child().show()"],function(){return Tt(this,!0),this}),ze(["row().child.hide()","row().child().hide()"],function(){return Tt(this,!1),this}),ze(["row().child.remove()","row().child().remove()"],function(){return _t(this),this}),ze("row().child.isShown()",function(){var e=this.context;return e.length&&this.length&&e[0].aoData[this[0]]._detailsShow||!1});var Dt=/^([^:]+):(name|visIdx|visible)$/,It=function(e,t,n,r,o){n=[],r=0;for(var a=o.length;r=0?n:i.length+n];if("function"==typeof t){var o=St(r,a);return e.map(i,function(e,n){return t(n,It(r,n,0,0,o),l[n])?n:null})}var c="string"==typeof t?t.match(Dt):"";if(c)switch(c[2]){case"visIdx":case"visible":if((n=parseInt(c[1],10))<0){var u=e.map(i,function(e,t){return e.bVisible?t:null});return[u[u.length+n]]}return[h(r,n)];case"name":return e.map(s,function(e,t){return e===c[1]?t:null});default:return[]}return t.nodeName&&t._DT_CellIndex?[t._DT_CellIndex.column]:(n=e(l).filter(t).map(function(){return e.inArray(this,l)}).toArray()).length||!t.nodeName?n:(n=e(t).closest("*[data-dt-column]")).length?[n.data("dt-column")]:[]},r,a)},1);return o.selector.cols=t,o.selector.opts=n,o}),We("columns().header()","column().header()",function(){return this.iterator("column",function(e,t){return e.aoColumns[t].nTh},1)}),We("columns().footer()","column().footer()",function(){return this.iterator("column",function(e,t){return e.aoColumns[t].nTf},1)}),We("columns().data()","column().data()",function(){return this.iterator("column-rows",It,1)}),We("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(e,t){return e.aoColumns[t].mData},1)}),We("columns().cache()","column().cache()",function(e){return this.iterator("column-rows",function(t,n,r,o,a){return at(t.aoData,a,"search"===e?"_aFilterData":"_aSortData",n)},1)}),We("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(e,t,n,r,o){return at(e.aoData,o,"anCells",t)},1)}),We("columns().visible()","column().visible()",function(t,n){var o=this.iterator("column",function(n,o){if(t===r)return n.aoColumns[o].bVisible;var a,i,s,l=n.aoColumns,c=l[o],u=n.aoData;if(t!==r&&c.bVisible!==t){if(t){var d=e.inArray(!0,ot(l,"bVisible"),o+1);for(a=0,i=u.length;an;return!0},Ve.isDataTable=Ve.fnIsDataTable=function(t){var n=e(t).get(0),r=!1;return t instanceof Ve.Api||(e.each(Ve.settings,function(t,o){var a=o.nScrollHead?e("table",o.nScrollHead)[0]:null,i=o.nScrollFoot?e("table",o.nScrollFoot)[0]:null;o.nTable!==n&&a!==n&&i!==n||(r=!0)}),r)},Ve.tables=Ve.fnTables=function(t){var n=!1;e.isPlainObject(t)&&(n=t.api,t=t.visible);var r=e.map(Ve.settings,function(n){if(!t||t&&e(n.nTable).is(":visible"))return n.nTable});return n?new Ue(r):r},Ve.camelToHungarian=a,ze("$()",function(t,n){var r=this.rows(n).nodes();r=e(r);return e([].concat(r.filter(t).toArray(),r.find(t).toArray()))}),e.each(["on","one","off"],function(t,n){ze(n+"()",function(){var t=Array.prototype.slice.call(arguments);t[0]=e.map(t[0].split(/\s/),function(e){return e.match(/\.dt\b/)?e:e+".dt"}).join(" ");var r=e(this.tables().nodes());return r[n].apply(r,t),this})}),ze("clear()",function(){return this.iterator("table",function(e){k(e)})}),ze("settings()",function(){return new Ue(this.context,this.context)}),ze("init()",function(){var e=this.context;return e.length?e[0].oInit:null}),ze("data()",function(){return this.iterator("table",function(e){return ot(e.aoData,"_aData")}).flatten()}),ze("destroy()",function(n){return n=n||!1,this.iterator("table",function(r){var o,a=r.nTableWrapper.parentNode,i=r.oClasses,s=r.nTable,l=r.nTBody,c=r.nTHead,u=r.nTFoot,d=e(s),f=(l=e(l),e(r.nTableWrapper)),p=e.map(r.aoData,function(e){return e.nTr});r.bDestroying=!0,Re(r,"aoDestroyCallback","destroy",[r]),n||new Ue(r).columns().visible(!0),f.off(".DT").find(":not(tbody *)").off(".DT"),e(t).off(".DT-"+r.sInstance),s!=c.parentNode&&(d.children("thead").detach(),d.append(c)),u&&s!=u.parentNode&&(d.children("tfoot").detach(),d.append(u)),r.aaSorting=[],r.aaSortingFixed=[],Te(r),e(p).removeClass(r.asStripeClasses.join(" ")),e("th, td",c).removeClass(i.sSortable+" "+i.sSortableAsc+" "+i.sSortableDesc+" "+i.sSortableNone),l.children().detach(),l.append(p),d[c=n?"remove":"detach"](),f[c](),!n&&a&&(a.insertBefore(s,r.nTableReinsertBefore),d.css("width",r.sDestroyWidth).removeClass(i.sTable),(o=r.asDestroyStripes.length)&&l.children().each(function(t){e(this).addClass(r.asDestroyStripes[t%o])})),-1!==(a=e.inArray(r,Ve.settings))&&Ve.settings.splice(a,1)})}),e.each(["column","row","cell"],function(e,t){ze(t+"s().every()",function(e){var n=this.selector.opts,o=this;return this.iterator(t,function(a,i,s,l,c){e.call(o[t](i,"cell"===t?s:n,"cell"===t?n:r),i,s,l,c)})})}),ze("i18n()",function(t,n,o){var a=this.context[0];return(t=T(t)(a.oLanguage))===r&&(t=n),o!==r&&e.isPlainObject(t)&&(t=t[o]!==r?t[o]:t._),t.replace("%d",o)}),Ve.version="1.10.18",Ve.settings=[],Ve.models={},Ve.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0},Ve.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1},Ve.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null},Ve.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(e){return e.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(e){try{return JSON.parse((-1===e.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+e.sInstance+"_"+location.pathname))}catch(e){}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(e,t){try{(-1===e.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+e.sInstance+"_"+location.pathname,JSON.stringify(t))}catch(e){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"Processing...",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:e.extend({},Ve.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"},o(Ve.defaults),Ve.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null},o(Ve.defaults.column),Ve.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,bAjaxDataGet:!0,jqXHR:null,json:r,oAjaxData:r,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==Ne(this)?1*this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==Ne(this)?1*this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var e=this._iDisplayLength,t=this._iDisplayStart,n=t+e,r=this.aiDisplay.length,o=this.oFeatures,a=o.bPaginate;return o.bServerSide?!1===a||-1===e?t+r:Math.min(t+e,this._iRecordsDisplay):!a||n>r||-1===e?r:n},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null},Ve.ext=qe={buttons:{},classes:{},builder:"-source-",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:Ve.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:Ve.version},e.extend(qe,{afnFiltering:qe.search,aTypes:qe.type.detect,ofnSearch:qe.type.search,oSort:qe.type.order,afnSortData:qe.order,aoFeatures:qe.feature,oApi:qe.internal,oStdClasses:qe.classes,oPagination:qe.pager}),e.extend(Ve.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_asc_disabled",sSortableDesc:"sorting_desc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""});var kt=Ve.ext.pager;e.extend(kt,{simple:function(){return["previous","next"]},full:function(){return["first","previous","next","last"]},numbers:function(e,t){return[Be(e,t)]},simple_numbers:function(e,t){return["previous",Be(e,t),"next"]},full_numbers:function(e,t){return["first","previous",Be(e,t),"next","last"]},first_last_numbers:function(e,t){return["first",Be(e,t),"last"]},_numbers:Be,numbers_length:7}),e.extend(!0,Ve.ext.renderer,{pageButton:{_:function(t,o,a,i,s,l){var c,u,d,f=t.oClasses,p=t.oLanguage.oPaginate,h=t.oLanguage.oAria.paginate||{},m=0,g=function(n,r){var o,i,d,v,y=function(e){ce(t,e.data.action,!0)};for(o=0,i=r.length;o").appendTo(n),g(d,v);else{switch(c=null,u="",v){case"ellipsis":n.append('');break;case"first":c=p.sFirst,u=v+(s>0?"":" "+f.sPageButtonDisabled);break;case"previous":c=p.sPrevious,u=v+(s>0?"":" "+f.sPageButtonDisabled);break;case"next":c=p.sNext,u=v+(s",{class:f.sPageButton+" "+u,"aria-controls":t.sTableId,"aria-label":h[v],"data-dt-idx":m,tabindex:t.iTabIndex,id:0===a&&"string"==typeof v?t.sTableId+"_"+v:null}).html(c).appendTo(n),{action:v},y),m++)}};try{d=e(o).find(n.activeElement).data("dt-idx")}catch(e){}g(e(o).empty(),i),d!==r&&e(o).find("[data-dt-idx="+d+"]").focus()}}}),e.extend(Ve.ext.type.detect,[function(e,t){var n=t.oLanguage.sDecimal;return nt(e,n)?"num"+n:null},function(e){if(e&&!(e instanceof Date)&&!Qe.test(e))return null;var t=Date.parse(e);return null!==t&&!isNaN(t)||Je(e)?"date":null},function(e,t){var n=t.oLanguage.sDecimal;return nt(e,n,!0)?"num-fmt"+n:null},function(e,t){var n=t.oLanguage.sDecimal;return rt(e,n)?"html-num"+n:null},function(e,t){var n=t.oLanguage.sDecimal;return rt(e,n,!0)?"html-num-fmt"+n:null},function(e){return Je(e)||"string"==typeof e&&-1!==e.indexOf("<")?"html":null}]),e.extend(Ve.ext.type.search,{html:function(e){return Je(e)?e:"string"==typeof e?e.replace(Ye," ").replace(Ge,""):""},string:function(e){return Je(e)?e:"string"==typeof e?e.replace(Ye," "):e}});var At=function(e,t,n,r){return 0===e||e&&"-"!==e?(t&&(e=tt(e,t)),e.replace&&(n&&(e=e.replace(n,"")),r&&(e=e.replace(r,""))),1*e):-1/0};e.extend(qe.type.order,{"date-pre":function(e){return e=Date.parse(e),isNaN(e)?-1/0:e},"html-pre":function(e){return Je(e)?"":e.replace?e.replace(/<.*?>/g,"").toLowerCase():e+""},"string-pre":function(e){return Je(e)?"":"string"==typeof e?e.toLowerCase():e.toString?e.toString():""},"string-asc":function(e,t){return et?1:0},"string-desc":function(e,t){return et?-1:0}}),Me(""),e.extend(!0,Ve.ext.renderer,{header:{_:function(t,n,r,o){e(t.nTable).on("order.dt.DT",function(e,a,i,s){t===a&&(e=r.idx,n.removeClass(r.sSortingClass+" "+o.sSortAsc+" "+o.sSortDesc).addClass("asc"==s[e]?o.sSortAsc:"desc"==s[e]?o.sSortDesc:r.sSortingClass))})},jqueryui:function(t,n,r,o){e("
            ").addClass(o.sSortJUIWrapper).append(n.contents()).append(e("").addClass(o.sSortIcon+" "+r.sSortingClassJUI)).appendTo(n),e(t.nTable).on("order.dt.DT",function(e,a,i,s){t===a&&(e=r.idx,n.removeClass(o.sSortAsc+" "+o.sSortDesc).addClass("asc"==s[e]?o.sSortAsc:"desc"==s[e]?o.sSortDesc:r.sSortingClass),n.find("span."+o.sSortIcon).removeClass(o.sSortJUIAsc+" "+o.sSortJUIDesc+" "+o.sSortJUI+" "+o.sSortJUIAscAllowed+" "+o.sSortJUIDescAllowed).addClass("asc"==s[e]?o.sSortJUIAsc:"desc"==s[e]?o.sSortJUIDesc:r.sSortingClassJUI))})}}});var Et=function(e){return"string"==typeof e?e.replace(//g,">").replace(/"/g,"""):e};return Ve.render={number:function(e,t,n,r,o){return{display:function(a){if("number"!=typeof a&&"string"!=typeof a)return a;var i=0>a?"-":"",s=parseFloat(a);return isNaN(s)?Et(a):(s=s.toFixed(n),a=Math.abs(s),s=parseInt(a,10),a=n?t+(a-s).toFixed(n).substring(2):"",i+(r||"")+s.toString().replace(/\B(?=(\d{3})+(?!\d))/g,e)+a+(o||""))}}},text:function(){return{display:Et}}},e.extend(Ve.ext.internal,{_fnExternApiFunc:He,_fnBuildAjax:H,_fnAjaxUpdate:q,_fnAjaxParameters:U,_fnAjaxUpdateDraw:z,_fnAjaxDataSrc:W,_fnAddColumn:d,_fnColumnOptions:f,_fnAdjustColumnSizing:p,_fnVisibleToColumnIndex:h,_fnColumnIndexToVisible:m,_fnVisbleColumns:g,_fnGetColumns:v,_fnColumnTypes:y,_fnApplyColumnDefs:b,_fnHungarianMap:o,_fnCamelToHungarian:a,_fnLanguageCompat:i,_fnBrowserDetect:c,_fnAddData:w,_fnAddTr:x,_fnNodeToDataIndex:function(e,t){return t._DT_RowIndex!==r?t._DT_RowIndex:null},_fnNodeToColumnIndex:function(t,n,r){return e.inArray(r,t.aoData[n].anCells)},_fnGetCellData:C,_fnSetCellData:S,_fnSplitObjNotation:_,_fnGetObjectDataFn:T,_fnSetObjectDataFn:D,_fnGetDataMaster:I,_fnClearTable:k,_fnDeleteIndex:A,_fnInvalidate:E,_fnGetRowElements:O,_fnCreateTr:F,_fnBuildHead:j,_fnDrawHead:R,_fnDraw:L,_fnReDraw:$,_fnAddOptionsHtml:N,_fnDetectHeader:B,_fnGetUniqueThs:M,_fnFeatureHtmlFilter:V,_fnFilterComplete:X,_fnFilterCustom:Y,_fnFilterColumn:G,_fnFilter:Q,_fnFilterCreateSearch:Z,_fnEscapeRegex:ft,_fnFilterData:K,_fnFeatureHtmlInfo:te,_fnUpdateInfo:ne,_fnInfoMacros:re,_fnInitialise:oe,_fnInitComplete:ae,_fnLengthChange:ie,_fnFeatureHtmlLength:se,_fnFeatureHtmlPaginate:le,_fnPageChange:ce,_fnFeatureHtmlProcessing:ue,_fnProcessingDisplay:de,_fnFeatureHtmlTable:fe,_fnScrollDraw:pe,_fnApplyToChildren:he,_fnCalculateColumnWidths:me,_fnThrottle:gt,_fnConvertToWidth:ge,_fnGetWidestNode:ve,_fnGetMaxLenString:ye,_fnStringToCss:be,_fnSortFlatten:we,_fnSort:xe,_fnSortAria:Ce,_fnSortListener:Se,_fnSortAttachListener:_e,_fnSortingClasses:Te,_fnSortData:De,_fnSaveState:Ie,_fnLoadState:ke,_fnSettingsFromNode:Ae,_fnLog:Ee,_fnMap:Oe,_fnBindAction:Pe,_fnCallbackReg:je,_fnCallbackFire:Re,_fnLengthOverflow:Le,_fnRenderer:$e,_fnDataSource:Ne,_fnRowAttributes:P,_fnExtend:Fe,_fnCalculateEnd:function(){}}),e.fn.dataTable=Ve,Ve.$=e,e.fn.dataTableSettings=Ve.settings,e.fn.dataTableExt=Ve.ext,e.fn.DataTable=function(t){return e(this).dataTable(t).api()},e.each(Ve,function(t,n){e.fn.DataTable[t]=n}),e.fn.dataTable});var $jscomp=$jscomp||{};$jscomp.scope={},$jscomp.findInternal=function(e,t,n){e instanceof String&&(e=String(e));for(var r=e.length,o=0;o").addClass(this.c.dom.container.className)},this._constructor()};e.extend(u.prototype,{action:function(e,t){return e=this._nodeToButton(e),t===r?e.conf.action:(e.conf.action=t,this)},active:function(t,n){var o=this._nodeToButton(t);return t=this.c.dom.button.active,o=e(o.node),n===r?o.hasClass(t):(o.toggleClass(t,n===r||n),this)},add:function(e,t){var n=this.s.buttons;if("string"==typeof t){t=t.split("-"),n=this.s;for(var r=0,o=t.length-1;r").addClass(d.className).attr("role","menu"),u.conf._collection=u.collection,this._expandButton(u.buttons,u.conf.buttons,!0,a)}c.init&&c.init.call(i.button(u.node),i,e(u.node),c),0}}}},_buildButton:function(t,n){var o=this.c.dom.button,a=this.c.dom.buttonLiner,i=this.c.dom.collection,s=this.s.dt,c=function(e){return"function"==typeof e?e(s,f,t):e};if(n&&i.button&&(o=i.button),n&&i.buttonLiner&&(a=i.buttonLiner),t.available&&!t.available(s,t))return!1;var u=function(t,n,r,o){o.action.call(n.button(r),t,n,r,o),e(n.table().node()).triggerHandler("buttons-action.dt",[n.button(r),n,r,o])};i=t.tag||o.tag;var d=t.clickBlurs===r||t.clickBlurs,f=e("<"+i+"/>").addClass(o.className).attr("tabindex",this.s.dt.settings()[0].iTabIndex).attr("aria-controls",this.s.dt.table().node().id).on("click.dtb",function(e){e.preventDefault(),!f.hasClass(o.disabled)&&t.action&&u(e,s,f,t),d&&f.blur()}).on("keyup.dtb",function(e){13===e.keyCode&&!f.hasClass(o.disabled)&&t.action&&u(e,s,f,t)});return"a"===i.toLowerCase()&&f.attr("href","#"),"button"===i.toLowerCase()&&f.attr("type","button"),a.tag?(i=e("<"+a.tag+"/>").html(c(t.text)).addClass(a.className),"a"===a.tag.toLowerCase()&&i.attr("href","#"),f.append(i)):f.html(c(t.text)),!1===t.enabled&&f.addClass(o.disabled),t.className&&f.addClass(t.className),t.titleAttr&&f.attr("title",c(t.titleAttr)),t.attr&&f.attr(t.attr),t.namespace||(t.namespace=".dt-button-"+l++),a=(a=this.c.dom.buttonContainer)&&a.tag?e("<"+a.tag+"/>").addClass(a.className).append(f):f,this._addKey(t),this.c.buttonCreated&&(a=this.c.buttonCreated(t,a)),{conf:t,node:f.get(0),inserter:a,buttons:[],inCollection:n,collection:null}},_nodeToButton:function(e,t){t||(t=this.s.buttons);for(var n=0,r=t.length;n").addClass(o).css("display","none").insertAfter(i).stop().fadeIn(a):e("div."+o).stop().fadeOut(a,function(){e(this).removeClass(o).remove()})},u.instanceSelector=function(t,n){if(!t)return e.map(n,function(e){return e.inst});var r=[],o=e.map(n,function(e){return e.name}),a=function(t){if(e.isArray(t))for(var i=0,s=t.length;i'+i.collectionTitle+"
            "),i._collection.addClass(i.collectionLayout).css("display","none").insertAfter(f).stop().fadeIn(i.fade),l=i._collection.css("position"),d&&"absolute"===l)i._collection.css({top:d.top,left:d.left});else if("absolute"===l){i._collection.css({top:r.top+a.outerHeight(),left:r.left}),d=c.offset().top+c.height(),d=r.top+a.outerHeight()+i._collection.outerHeight()-d,l=r.top-i._collection.outerHeight(),(d>c.offset().top-l||i.dropup)&&i._collection.css("top",r.top-i._collection.outerHeight()-5),i._collection.hasClass(i.rightAlignClassName)&&i._collection.css("left",r.left+a.outerWidth()-i._collection.outerWidth()),(d=r.left+i._collection.outerWidth())>(c=c.offset().left+c.width())&&i._collection.css("left",r.left-(d-c)),(a=a.offset().left+i._collection.outerWidth())>e(t).width()&&i._collection.css("left",r.left-(a-e(t).width()))}else(a=i._collection.height()/2)>e(t).height()/2&&(a=e(t).height()/2),i._collection.css("marginTop",-1*a);i.background&&u.background(!0,i.backgroundClassName,i.fade,f),setTimeout(function(){e("div.dt-button-background").on("click.dtb-collection",function(){}),e("body").on("click.dtb-collection",function(t){var n=e.fn.addBack?"addBack":"andSelf";e(t.target).parents()[n]().filter(i._collection).length||s()}).on("keyup.dtb-collection",function(e){27===e.keyCode&&s()}),i.autoClose&&o.on("buttons-action.b-internal",function(){s()})},10)}},background:!0,collectionLayout:"",collectionTitle:"",backgroundClassName:"dt-button-background",rightAlignClassName:"dt-button-right",autoClose:!1,fade:400,attr:{"aria-haspopup":!0}},copy:function(e,t){return c.copyHtml5?"copyHtml5":c.copyFlash&&c.copyFlash.available(e,t)?"copyFlash":void 0},csv:function(e,t){return c.csvHtml5&&c.csvHtml5.available(e,t)?"csvHtml5":c.csvFlash&&c.csvFlash.available(e,t)?"csvFlash":void 0},excel:function(e,t){return c.excelHtml5&&c.excelHtml5.available(e,t)?"excelHtml5":c.excelFlash&&c.excelFlash.available(e,t)?"excelFlash":void 0},pdf:function(e,t){return c.pdfHtml5&&c.pdfHtml5.available(e,t)?"pdfHtml5":c.pdfFlash&&c.pdfFlash.available(e,t)?"pdfFlash":void 0},pageLength:function(t){t=t.settings()[0].aLengthMenu;var n=e.isArray(t[0])?t[0]:t,r=e.isArray(t[0])?t[1]:t;return{extend:"collection",text:function(e){return e.i18n("buttons.pageLength",{"-1":"Show all rows",_:"Show %d rows"},e.page.len())},className:"buttons-page-length",autoClose:!0,buttons:e.map(n,function(e,t){return{text:r[t],className:"button-page-length",action:function(t,n){n.page.len(e).draw()},init:function(t,n,r){var o=this;n=function(){o.active(t.page.len()===e)},t.on("length.dt"+r.namespace,n),n()},destroy:function(e,t,n){e.off("length.dt"+n.namespace)}}}),init:function(e,t,n){var r=this;e.on("length.dt"+n.namespace,function(){r.text(n.text)})},destroy:function(e,t,n){e.off("length.dt"+n.namespace)}}}}),i.Api.register("buttons()",function(e,t){t===r&&(t=e,e=r),this.selector.buttonGroup=e;var n=this.iterator(!0,"table",function(n){if(n._buttons)return u.buttonSelector(u.instanceSelector(e,n._buttons),t)},!0);return n._groupSelector=e,n}),i.Api.register("button()",function(e,t){return 1<(e=this.buttons(e,t)).length&&e.splice(1,e.length),e}),i.Api.registerPlural("buttons().active()","button().active()",function(e){return e===r?this.map(function(e){return e.inst.active(e.node)}):this.each(function(t){t.inst.active(t.node,e)})}),i.Api.registerPlural("buttons().action()","button().action()",function(e){return e===r?this.map(function(e){return e.inst.action(e.node)}):this.each(function(t){t.inst.action(t.node,e)})}),i.Api.register(["buttons().enable()","button().enable()"],function(e){return this.each(function(t){t.inst.enable(t.node,e)})}),i.Api.register(["buttons().disable()","button().disable()"],function(){return this.each(function(e){e.inst.disable(e.node)})}),i.Api.registerPlural("buttons().nodes()","button().node()",function(){var t=e();return e(this.each(function(e){t=t.add(e.inst.node(e.node))})),t}),i.Api.registerPlural("buttons().processing()","button().processing()",function(e){return e===r?this.map(function(e){return e.inst.processing(e.node)}):this.each(function(t){t.inst.processing(t.node,e)})}),i.Api.registerPlural("buttons().text()","button().text()",function(e){return e===r?this.map(function(e){return e.inst.text(e.node)}):this.each(function(t){t.inst.text(t.node,e)})}),i.Api.registerPlural("buttons().trigger()","button().trigger()",function(){return this.each(function(e){e.inst.node(e.node).trigger("click")})}),i.Api.registerPlural("buttons().containers()","buttons().container()",function(){var t=e(),n=this._groupSelector;return this.iterator(!0,"table",function(e){if(e._buttons)for(var r=0,o=(e=u.instanceSelector(n,e._buttons)).length;r"+t+"":"",e('
            ').html(t).append(e("
            ")["string"==typeof n?"html":"append"](n)).css("display","none").appendTo("body").fadeIn(),o!==r&&0!==o&&(a=setTimeout(function(){i.buttons.info(!1)},o)),this)}),i.Api.register("buttons.exportData()",function(e){if(this.context.length)return h(new i.Api(this.context[0]),e)}),i.Api.register("buttons.exportInfo()",function(t){t||(t={});var n=t,o="*"===n.filename&&"*"!==n.title&&n.title!==r&&null!==n.title&&""!==n.title?n.title:n.filename;return"function"==typeof o&&(o=o()),o===r||null===o?o=null:(-1!==o.indexOf("*")&&(o=e.trim(o.replace("*",e("head > title").text()))),o=o.replace(/[^a-zA-Z0-9_\u00A1-\uFFFF\.,\-_ !\(\)]/g,""),(n=d(n.extension))||(n=""),o+=n),{filename:o,title:n=null===(n=d(t.title))?null:-1!==n.indexOf("*")?n.replace("*",e("head > title").text()||"Exported data"):n,messageTop:f(this,t.message||t.messageTop,"top"),messageBottom:f(this,t.messageBottom,"bottom")}});var d=function(e){return null===e||e===r?null:"function"==typeof e?e():e},f=function(t,n,r){return null===(n=d(n))?null:(t=e("caption",t.table().container()).eq(0),"*"===n?t.css("caption-side")!==r?null:t.length?t.text():"":n)},p=e("",h.noCloneChecked=!!ye.cloneNode(!0).lastChild.defaultValue;var Ce=/^key/,Se=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,_e=/^([^.]*)(?:\.(.+)|)/;function Te(){return!0}function ke(){return!1}function De(e,t){return e===function(){try{return i.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,i,r,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(i=i||n,n=void 0),t)Ee(e,s,n,i,t[s],o);return e}if(null==i&&null==r?(r=n,i=n=void 0):null==r&&("string"==typeof n?(r=i,i=void 0):(r=i,i=n,n=void 0)),!1===r)r=ke;else if(!r)return e;return 1===o&&(a=r,(r=function(e){return x().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=x.guid++)),e.each(function(){x.event.add(this,t,r,i,n)})}function Ae(e,t,n){n?(Q.set(e,t,!1),x.event.add(e,t,{namespace:!1,handler:function(e){var i,r,a=Q.get(this,t);if(1&e.isTrigger&&this[t]){if(a.length)(x.event.special[t]||{}).delegateType&&e.stopPropagation();else if(a=o.call(arguments),Q.set(this,t,a),i=n(this,t),this[t](),a!==(r=Q.get(this,t))||i?Q.set(this,t,!1):r={},a!==r)return e.stopImmediatePropagation(),e.preventDefault(),r.value}else a.length&&(Q.set(this,t,{value:x.event.trigger(x.extend(a[0],x.Event.prototype),a.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,t)&&x.event.add(e,t,Te)}x.event={global:{},add:function(e,t,n,i,r){var o,a,s,l,c,u,d,p,f,h,m,g=Q.get(e);if(g)for(n.handler&&(n=(o=n).handler,r=o.selector),r&&x.find.matchesSelector(re,r),n.guid||(n.guid=x.guid++),(l=g.events)||(l=g.events={}),(a=g.handle)||(a=g.handle=function(t){return void 0!==x&&x.event.triggered!==t.type?x.event.dispatch.apply(e,arguments):void 0}),c=(t=(t||"").match(L)||[""]).length;c--;)f=m=(s=_e.exec(t[c])||[])[1],h=(s[2]||"").split(".").sort(),f&&(d=x.event.special[f]||{},f=(r?d.delegateType:d.bindType)||f,d=x.event.special[f]||{},u=x.extend({type:f,origType:m,data:i,handler:n,guid:n.guid,selector:r,needsContext:r&&x.expr.match.needsContext.test(r),namespace:h.join(".")},o),(p=l[f])||((p=l[f]=[]).delegateCount=0,d.setup&&!1!==d.setup.call(e,i,h,a)||e.addEventListener&&e.addEventListener(f,a)),d.add&&(d.add.call(e,u),u.handler.guid||(u.handler.guid=n.guid)),r?p.splice(p.delegateCount++,0,u):p.push(u),x.event.global[f]=!0)},remove:function(e,t,n,i,r){var o,a,s,l,c,u,d,p,f,h,m,g=Q.hasData(e)&&Q.get(e);if(g&&(l=g.events)){for(c=(t=(t||"").match(L)||[""]).length;c--;)if(f=m=(s=_e.exec(t[c])||[])[1],h=(s[2]||"").split(".").sort(),f){for(d=x.event.special[f]||{},p=l[f=(i?d.delegateType:d.bindType)||f]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;o--;)u=p[o],!r&&m!==u.origType||n&&n.guid!==u.guid||s&&!s.test(u.namespace)||i&&i!==u.selector&&("**"!==i||!u.selector)||(p.splice(o,1),u.selector&&p.delegateCount--,d.remove&&d.remove.call(e,u));a&&!p.length&&(d.teardown&&!1!==d.teardown.call(e,h,g.handle)||x.removeEvent(e,f,g.handle),delete l[f])}else for(f in l)x.event.remove(e,f+t[c],n,i,!0);x.isEmptyObject(l)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,i,r,o,a,s=x.event.fix(e),l=new Array(arguments.length),c=(Q.get(this,"events")||{})[s.type]||[],u=x.event.special[s.type]||{};for(l[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,Ie=/\s*$/g;function Re(e,t){return E(e,"table")&&E(11!==t.nodeType?t:t.firstChild,"tr")&&x(e).children("tbody")[0]||e}function je(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Le(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Ne(e,t){var n,i,r,o,a,s,l,c;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),c=o.events))for(r in delete a.handle,a.events={},c)for(n=0,i=c[r].length;n")},clone:function(e,t,n){var i,r,o,a,s,l,c,u=e.cloneNode(!0),d=oe(e);if(!(h.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(a=ge(u),i=0,r=(o=ge(e)).length;i").attr(e.scriptAttrs||{}).prop({charset:e.scriptCharset,src:e.url}).on("load error",n=function(e){t.remove(),n=null,e&&o("error"===e.type?404:200,e.type)}),i.head.appendChild(t[0])},abort:function(){n&&n()}}});var Xt,Yt=[],Gt=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Yt.pop()||x.expando+"_"+Tt++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(t,n,i){var r,o,a,s=!1!==t.jsonp&&(Gt.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&Gt.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return r=t.jsonpCallback=m(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(Gt,"$1"+r):!1!==t.jsonp&&(t.url+=(kt.test(t.url)?"&":"?")+t.jsonp+"="+r),t.converters["script json"]=function(){return a||x.error(r+" was not called"),a[0]},t.dataTypes[0]="json",o=e[r],e[r]=function(){a=arguments},i.always(function(){void 0===o?x(e).removeProp(r):e[r]=o,t[r]&&(t.jsonpCallback=n.jsonpCallback,Yt.push(r)),a&&m(o)&&o(a[0]),a=o=void 0}),"script"}),h.createHTMLDocument=((Xt=i.implementation.createHTMLDocument("").body).innerHTML="
            ",2===Xt.childNodes.length),x.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(h.createHTMLDocument?((r=(t=i.implementation.createHTMLDocument("")).createElement("base")).href=i.location.href,t.head.appendChild(r)):t=i),a=!n&&[],(o=A.exec(e))?[t.createElement(o[1])]:(o=xe([e],t,a),a&&a.length&&x(a).remove(),x.merge([],o.childNodes)));var r,o,a},x.fn.load=function(e,t,n){var i,r,o,a=this,s=e.indexOf(" ");return-1").append(x.parseHTML(e)).find(i):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.expr.pseudos.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length},x.offset={setOffset:function(e,t,n){var i,r,o,a,s,l,c=x.css(e,"position"),u=x(e),d={};"static"===c&&(e.style.position="relative"),s=u.offset(),o=x.css(e,"top"),l=x.css(e,"left"),("absolute"===c||"fixed"===c)&&-1<(o+l).indexOf("auto")?(a=(i=u.position()).top,r=i.left):(a=parseFloat(o)||0,r=parseFloat(l)||0),m(t)&&(t=t.call(e,n,x.extend({},s))),null!=t.top&&(d.top=t.top-s.top+a),null!=t.left&&(d.left=t.left-s.left+r),"using"in t?t.using.call(e,d):u.css(d)}},x.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){x.offset.setOffset(this,e,t)});var t,n,i=this[0];return i?i.getClientRects().length?(t=i.getBoundingClientRect(),n=i.ownerDocument.defaultView,{top:t.top+n.pageYOffset,left:t.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,i=this[0],r={top:0,left:0};if("fixed"===x.css(i,"position"))t=i.getBoundingClientRect();else{for(t=this.offset(),n=i.ownerDocument,e=i.offsetParent||n.documentElement;e&&(e===n.body||e===n.documentElement)&&"static"===x.css(e,"position");)e=e.parentNode;e&&e!==i&&1===e.nodeType&&((r=x(e).offset()).top+=x.css(e,"borderTopWidth",!0),r.left+=x.css(e,"borderLeftWidth",!0))}return{top:t.top-r.top-x.css(i,"marginTop",!0),left:t.left-r.left-x.css(i,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent;e&&"static"===x.css(e,"position");)e=e.offsetParent;return e||re})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n="pageYOffset"===t;x.fn[e]=function(i){return H(this,function(e,i,r){var o;if(g(e)?o=e:9===e.nodeType&&(o=e.defaultView),void 0===r)return o?o[t]:e[i];o?o.scrollTo(n?o.pageXOffset:r,n?r:o.pageYOffset):e[i]=r},e,i,arguments.length)}}),x.each(["top","left"],function(e,t){x.cssHooks[t]=ze(h.pixelPosition,function(e,n){if(n)return n=He(e,t),Fe.test(n)?x(e).position()[t]+"px":n})}),x.each({Height:"height",Width:"width"},function(e,t){x.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,i){x.fn[i]=function(r,o){var a=arguments.length&&(n||"boolean"!=typeof r),s=n||(!0===r||!0===o?"margin":"border");return H(this,function(t,n,r){var o;return g(t)?0===i.indexOf("outer")?t["inner"+e]:t.document.documentElement["client"+e]:9===t.nodeType?(o=t.documentElement,Math.max(t.body["scroll"+e],o["scroll"+e],t.body["offset"+e],o["offset"+e],o["client"+e])):void 0===r?x.css(t,n,s):x.style(t,n,r,s)},t,a?r:void 0,a)}})}),x.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return 0{"use strict";let e={1:"E004 - C1",2:"L005 - C2",3:"Z006 - C3",4:"M001 - C4",5:"C008 - C5",6:"G008 - C6",7:"Q003 - 0.0",8:"A009 - C13"};return{path:{img:"/public/img/",api:"/api/rest",getCaptcha:"/api/user/getCaptcha",getServerStatus:"/api/user/getEveServerStatus",getCookieCharacterData:"/api/user/getCookieCharacter",logIn:"/api/user/logIn",logout:"/api/user/logout",openIngameWindow:"/api/user/openIngameWindow",saveUserConfig:"/api/user/saveAccount",deleteAccount:"/api/user/deleteAccount",searchAccess:"/api/access/search",initData:"/api/map/initData",getAccessData:"/api/map/getAccessData",updateMapData:"/api/map/updateData",updateUserData:"/api/map/updateUserData",updateUnloadData:"/api/map/updateUnloadData",saveMap:"/api/map/save",deleteMap:"/api/map/delete",importMap:"/api/map/import",getMapConnectionData:"/api/map/getConnectionData",getMapLogData:"/api/map/getLogData",getSystemGraphData:"/api/system/graphData",setDestination:"/api/system/setDestination",pokeRally:"/api/system/pokeRally",searchRoute:"/api/route/search",getStatisticsData:"/api/statistic/getData",searchUniverseData:"/api/universe/search",searchUniverseSystemData:"/api/universe/systems",getConstellationData:"/api/universe/constellationData",gitHubReleases:"/api/github/releases"},breakpoints:[{name:"screen-xl",width:1/0},{name:"screen-l",width:1600},{name:"screen-m",width:1200},{name:"screen-d",width:1e3},{name:"screen-s",width:780},{name:"screen-xs",width:480}],animationSpeed:{splashOverlay:300,headerLink:100,mapOverlay:200,mapOverlayLocal:180,mapMoveSystem:180,mapDeleteSystem:200,mapModule:200,dialogEvents:180},syncStatus:{type:"ajax",webSocket:{status:"closed",class:"txt-color-danger",timestamp:void 0},sharedWorker:{status:"offline",class:"txt-color-danger",timestamp:void 0},ajax:{status:"enabled",class:"txt-color-success",timestamp:void 0}},performanceLogging:{keyServerMapData:"UPDATE_SERVER_MAP",keyClientMapData:"UPDATE_CLIENT_MAP",keyServerUserData:"UPDATE_SERVER_USER_DATA",keyClientUserData:"UPDATE_CLIENT_USER_DATA"},mapIcons:[{class:"fa-desktop",label:"desktop",unicode:""},{class:"fa-space-shuttle",label:"space shuttle",unicode:""},{class:"fa-anchor",label:"anchor",unicode:""},{class:"fa-satellite",label:"satellite",unicode:""},{class:"fa-skull-crossbones",label:"skull crossbones",unicode:""},{class:"fa-fire",label:"fire",unicode:""},{class:"fa-bookmark",label:"bookmark",unicode:""},{class:"fa-cube",label:"cube",unicode:""},{class:"fa-star",label:"star",unicode:""},{class:"fa-hat-wizard",label:"hat wizard",unicode:""},{class:"fa-plane",label:"plane",unicode:""},{class:"fa-globe",label:"globe",unicode:""},{class:"fa-rocket",label:"rocket",unicode:""},{class:"fa-life-ring",label:"life ring",unicode:""},{class:"fa-heart",label:"heart",unicode:""},{class:"fa-poop",label:"poop",unicode:""}],classes:{logTypes:{info:{class:"pf-log-info",label:"info"},warning:{class:"pf-log-warning",label:"warning"},error:{class:"pf-log-error",label:"error"}},systemEffects:{effect:{class:"pf-system-effect",name:"no effect"},magnetar:{class:"pf-system-effect-magnetar",name:"magnetar"},redGiant:{class:"pf-system-effect-redgiant",name:"red giant"},pulsar:{class:"pf-system-effect-pulsar",name:"pulsar"},wolfRayet:{class:"pf-system-effect-wolfrayet",name:"wolf rayet"},cataclysmic:{class:"pf-system-effect-cataclysmic",name:"cataclysmic"},blackHole:{class:"pf-system-effect-blackhole",name:"black hole"}},systemSecurity:{security:{class:"pf-system-sec"},A:{class:"pf-system-sec-abyssal"},SH:{class:"pf-system-sec-unknown"},H:{class:"pf-system-sec-highSec"},L:{class:"pf-system-sec-lowSec"},"0.0":{class:"pf-system-sec-nullSec"},C1:{class:"pf-system-sec-low"},C2:{class:"pf-system-sec-low"},C3:{class:"pf-system-sec-mid"},C4:{class:"pf-system-sec-mid"},C5:{class:"pf-system-sec-high"},C6:{class:"pf-system-sec-high"},C12:{class:"pf-system-sec-special"},C14:{class:"pf-system-sec-drifter"},C15:{class:"pf-system-sec-drifter"},C16:{class:"pf-system-sec-drifter"},C17:{class:"pf-system-sec-drifter"},C18:{class:"pf-system-sec-drifter"}},trueSec:{"0.0":{class:"pf-system-security-0-0"},.1:{class:"pf-system-security-0-1"},.2:{class:"pf-system-security-0-2"},.3:{class:"pf-system-security-0-3"},.4:{class:"pf-system-security-0-4"},.5:{class:"pf-system-security-0-5"},.6:{class:"pf-system-security-0-6"},.7:{class:"pf-system-security-0-7"},.8:{class:"pf-system-security-0-8"},.9:{class:"pf-system-security-0-9"},"1.0":{class:"pf-system-security-1-0"}},systemInfo:{rally:{class:"pf-system-info-rally",label:"rally point"}},planets:{barren:{class:"pf-planet-barren"},gas:{class:"pf-planet-gas"},ice:{class:"pf-planet-ice"},lava:{class:"pf-planet-lava"},oceanic:{class:"pf-planet-oceanic"},plasma:{class:"pf-planet-plasma"},shattered:{class:"pf-planet-shattered"},storm:{class:"pf-planet-storm"},temperate:{class:"pf-planet-temperate"}},pieChart:{class:"pf-pie-chart",pieChartMapCounterClass:"pf-pie-chart-map-timer"}},defaultMapScope:"wh",endpointTypes:{bubble:{cssClass:"pf-map-endpoint-bubble"}},connectionTypes:{abyssal:{cssClass:"pf-map-connection-abyssal",paintStyle:{dashstyle:"0.5 2"}},jumpbridge:{cssClass:"pf-map-connection-jumpbridge",paintStyle:{dashstyle:"4 2 1 2"}},stargate:{cssClass:"pf-map-connection-stargate",paintStyle:{dashstyle:"0"}},wh_eol:{cssClass:"pf-map-connection-wh-eol"},wh_fresh:{cssClass:"pf-map-connection-wh-fresh"},wh_reduced:{cssClass:"pf-map-connection-wh-reduced"},wh_critical:{cssClass:"pf-map-connection-wh-critical"},wh_jump_mass_s:{cssClass:"pf-map-connection-wh-size-s",paintStyle:{dashstyle:"0.5 1",strokeWidth:3},overlays:[["Label",{label:'',cssClass:["pf-map-component-overlay","small","text-center"].join(" "),location:.65,id:"pf-map-connection-jump-mass-overlay"}]]},wh_jump_mass_m:{cssClass:"pf-map-connection-wh-size-m",paintStyle:{dashstyle:"3 1"},overlays:[["Label",{label:'',cssClass:["pf-map-component-overlay","small","text-center"].join(" "),location:.65,id:"pf-map-connection-jump-mass-overlay"}]]},wh_jump_mass_l:{cssClass:"pf-map-connection-wh-size-l",overlays:[["Label",{label:'',cssClass:["pf-map-component-overlay","small","text-center"].join(" "),location:.65,id:"pf-map-connection-jump-mass-overlay"}]]},wh_jump_mass_xl:{cssClass:"pf-map-connection-wh-size-xl",paintStyle:{strokeWidth:6},overlays:[["Label",{label:'',cssClass:["pf-map-component-overlay","small","text-center"].join(" "),location:.65,id:"pf-map-connection-jump-mass-overlay"}]]},preserve_mass:{cssClass:"pf-map-connection-preserve-mass",overlays:[["Label",{label:' save mass',cssClass:["pf-map-component-overlay","mass"].join(" "),location:.35}]]},info_signature:{overlays:[["Arrow",{id:"pf-map-connection-arrow-overlay",cssClass:"pf-map-connection-arrow-overlay",width:12,length:15,direction:1,foldback:.8,location:.5}]]},state_active:{cssClass:"pf-map-connection-active"},state_process:{cssClass:"pf-map-connection-process",overlays:[["Label",{label:'',cssClass:["pf-map-connection-state-overlay"].join(" "),location:.5}]]}},wormholeSizes:{wh_jump_mass_xl:{jumpMassMin:1e9,type:"wh_jump_mass_xl",class:"pf-jump-mass-xl",label:"XL",text:"capital ships"},wh_jump_mass_l:{jumpMassMin:3e8,type:"wh_jump_mass_l",class:"pf-jump-mass-l",label:"L",text:"larger ships"},wh_jump_mass_m:{jumpMassMin:2e7,type:"wh_jump_mass_m",class:"pf-jump-mass-m",label:"M",text:"medium ships"},wh_jump_mass_s:{jumpMassMin:1e3,type:"wh_jump_mass_s",class:"pf-jump-mass-s",label:"S",text:"smallest ships"}},signatureGroups:{1:{name:"(combat site|kampfgebiet|site de combat|Боевой район|战斗地点)",label:"Combat"},2:{name:"(relic site|reliktgebiet|site de reliques|Археологический район|遗迹地点)",label:"Relic"},3:{name:"(data site|datengebiet|site de données|Информационный район|数据地点)",label:"Data"},4:{name:"(gas site|gasgebiet|site de collecte de gaz|Газовый район|气云地点)",label:"Gas"},5:{name:"(wormhole|wurmloch|trou de ver|Червоточина|虫洞)",label:"Wormhole"},6:{name:"(ore site|mineraliengebiet|site de minerai|Астероидный район|矿石地点)",label:"Ore"},7:{name:"(ghost|Призрачный)",label:"Ghost"}},frigateWormholes:{1:e,2:e,3:e,4:e,5:e,6:e,13:e,30:e,31:e,32:e},drifterWormholes:{1:"S877 - C14 Sentinel",2:"B735 - C15 Barbican",3:"V928 - C16 Vidette",4:"C414 - C17 Conflux",5:"R259 - C18 Redoubt"},incomingWormholes:{1:"K162 - C1/2/3 (unknown)",2:"K162 - C4/5 (dangerous)",3:"K162 - C6 (deadly)",4:"K162 - H",5:"K162 - L",6:"K162 - 0.0",7:"K162 - C12 Thera"}}}),define("app/lib/prototypes",[],()=>{"use strict";return Array.prototype.diff=function(e){return this.filter(t=>!e.includes(t))},Array.prototype.intersect=function(e){return this.filter(t=>e.includes(t))},Array.prototype.equalValues=function(e){return 0===this.diff(e).concat(e.diff(this)).length},Array.prototype.concatFilter=function(e){return[...new Set([...this,...e])]},Array.prototype.sortBy=function(e){return this.slice(0).sort((t,n)=>t[e]>n[e]?1:t[e]{"use strict";window.console=(e=>{let t=e.log,n=e.info,i=e.warn,r=e.error,o={indentDefault:{"padding-left":"3px"},global:{"font-weight":500,"font-size":"11px","line-height":"19px","font-family":'"Fira Code", "Lucida Console"'},debug:{color:"#d747d6"},ok:{color:"#5cb85c"},log:{color:"#adadad"},info:{color:"#428bca"},warn:{color:"#ffdd9e"},error:{color:"#ff8080"},pf:{color:"#568a89"},brand:{color:"#375959","line-height":"35px","font-size":"25px"}},a={"%s":{style:["color: #e93f3b; font-style: italic","color: inherit"]},"%i":{style:["color: #9980ff","color: inherit"]},"%d":{style:["color: #9980ff","color: inherit"]},"%f":{style:["color: #9980ff","color: inherit"]},"%o":{style:["",""]},"%O":{style:["",""]}},s=(e,t=!1)=>{let n="";return a.hasOwnProperty(e)&&(n=a[e].style[t?1:0]),n},l=(e,t=[])=>{let n="";return o.hasOwnProperty(e)&&(n=Object.keys(o[e]).filter(e=>!t.length||t.includes(e)).reduce((t,n,i,r)=>t+=n+":"+o[e][n]+";","")),n},c=(e,t)=>{if(t.length){let n=l("global")+l(e);n+=["debug","ok","log","info","pf"].includes(e)?l("indentDefault"):"";let i=["debug","ok","log","info","pf"].includes(e)?"●":"";"string"==typeof t[0]?t[0]="%c"+i+" "+t[0]:t.splice(0,0,"%c"+i+" "+e+":"),t.splice(1,0,n)}},u=(e,t)=>{if("string"==typeof t[0]){let n=(e=>{let t=new RegExp(Object.keys(a).join("|"),"g"),n=e.match(t);return n||[]})(t[0]),i=n.length;t[0]=(e=>{let t=new RegExp(Object.keys(a).join("|"),"g");return e.replace(t,function(e){return"%c"+e+"%c"})})(t[0]);let r=0,o=1,c=o+i,u=0;for(let i=o;i{u("debug",t),c("debug",t),n.apply(e,t)}),e.ok=((...t)=>{u("ok",t),c("ok",t),n.apply(e,t)}),e.info=((...t)=>{u("info",t),c("info",t),n.apply(e,t)}),e.log=((...n)=>{u("log",n),c("log",n),t.apply(e,n)}),e.warn=((...t)=>{u("warn",t),c("warn",t),i.apply(e,t)}),e.error=((...t)=>{u("error",t),c("error",t),r.apply(e,t)}),e.pf=((...t)=>{u("pf",t),c("pf",t),n.apply(e,t)}),e.brand=((...t)=>{u("brand",t),c("brand",t),n.apply(e,t)}),e})(window.console);return{showVersionInfo:e=>{console.ok("%c PATHFINDER","color: #477372; font-size: 25px; margin-left: 10px; line-height: 50px; text-shadow: 1px 1px 0 #212C30; background: url(https://i.imgur.com/bhSr6LI.png) no-repeat;"),console.pf("Release: %s",e)}}}),define("conf/system_effect",[],()=>{"use strict";let e=e=>{let t=0;switch(e){case 1:case 2:case 3:case 4:case 5:case 6:t=e;break;case 13:t=6;break;case 14:case 15:case 16:case 17:case 18:t=2}return t},t={1:[{effect:"Damage",value:"+30%"},{effect:"Missile exp. radius",value:"+15%"},{effect:"Drone tracking",value:"-15%"},{effect:"Targeting range",value:"-15%"},{effect:"Tracking speed",value:"-15%"},{effect:"Target Painter strength",value:"-15%"}],2:[{effect:"Damage",value:"+44%"},{effect:"Missile exp. radius",value:"+22%"},{effect:"Drone tracking",value:"-22%"},{effect:"Targeting range",value:"-22%"},{effect:"Tracking speed",value:"-22%"},{effect:"Target Painter strength",value:"-22%"}],3:[{effect:"Damage",value:"+58%"},{effect:"Missile exp. radius",value:"+29%"},{effect:"Drone tracking",value:"-29%"},{effect:"Targeting range",value:"-29%"},{effect:"Tracking speed",value:"-29%"},{effect:"Target Painter strength",value:"-29%"}],4:[{effect:"Damage",value:"+72%"},{effect:"Missile exp. radius",value:"+36%"},{effect:"Drone tracking",value:"-36%"},{effect:"Targeting range",value:"-36%"},{effect:"Tracking speed",value:"-36%"},{effect:"Target Painter strength",value:"-36%"}],5:[{effect:"Damage",value:"+86%"},{effect:"Missile exp. radius",value:"+43%"},{effect:"Drone tracking",value:"-43%"},{effect:"Targeting range",value:"-43%"},{effect:"Tracking speed",value:"-43%"},{effect:"Target Painter strength",value:"-43%"}],6:[{effect:"Damage",value:"+100%"},{effect:"Missile exp. radius",value:"+50%"},{effect:"Drone tracking",value:"-50%"},{effect:"Targeting range",value:"-50%"},{effect:"Tracking speed",value:"-50%"},{effect:"Target Painter strength",value:"-50%"}]},n={1:[{effect:"Heat damage",value:"+15%"},{effect:"Overload bonus",value:"+30%"},{effect:"Smart Bomb range",value:"+30%"},{effect:"Smart Bomb damage",value:"+30%"},{effect:"Bomb damage",value:"+30%"}],2:[{effect:"Heat damage",value:"+22%"},{effect:"Overload bonus",value:"+44%"},{effect:"Smart Bomb range",value:"+44%"},{effect:"Smart Bomb damage",value:"+44%"},{effect:"Bomb damage",value:"+44%"}],3:[{effect:"Heat damage",value:"+29%"},{effect:"Overload bonus",value:"+58%"},{effect:"Smart Bomb range",value:"+58%"},{effect:"Smart Bomb damage",value:"+58%"},{effect:"Bomb damage",value:"+58%"}],4:[{effect:"Heat damage",value:"+36%"},{effect:"Overload bonus",value:"+72%"},{effect:"Smart Bomb range",value:"+72%"},{effect:"Smart Bomb damage",value:"+72%"},{effect:"Bomb damage",value:"+72%"}],5:[{effect:"Heat damage",value:"+43%"},{effect:"Overload bonus",value:"+86%"},{effect:"Smart Bomb range",value:"+86%"},{effect:"Smart Bomb damage",value:"+86%"},{effect:"Bomb damage",value:"+86%"}],6:[{effect:"Heat damage",value:"+50%"},{effect:"Overload bonus",value:"+100%"},{effect:"Smart Bomb range",value:"+100%"},{effect:"Smart Bomb damage",value:"+100%"},{effect:"Bomb damage",value:"+100%"}]},i={1:[{effect:"Shield HP",value:"+30%"},{effect:"Armor resist",value:"-15%"},{effect:"Capacitor recharge",value:"-15%"},{effect:"Signature",value:"+30%"},{effect:"NOS/Neut drain",value:"+30%"}],2:[{effect:"Shield HP",value:"+44%"},{effect:"Armor resist",value:"-22%"},{effect:"Capacitor recharge",value:"-22%"},{effect:"Signature",value:"+44%"},{effect:"NOS/Neut drain",value:"+44%"}],3:[{effect:"Shield HP",value:"+58%"},{effect:"Armor resist",value:"-29%"},{effect:"Capacitor recharge",value:"-29%"},{effect:"Signature",value:"+58%"},{effect:"NOS/Neut drain",value:"+58%"}],4:[{effect:"Shield HP",value:"+72%"},{effect:"Armor resist",value:"-36%"},{effect:"Capacitor recharge",value:"-36%"},{effect:"Signature",value:"+72%"},{effect:"NOS/Neut drain",value:"+72%"}],5:[{effect:"Shield HP",value:"+86%"},{effect:"Armor resist",value:"-43%"},{effect:"Capacitor recharge",value:"-43%"},{effect:"Signature",value:"+86%"},{effect:"NOS/Neut drain",value:"+86%"}],6:[{effect:"Shield HP",value:"+100%"},{effect:"Armor resist",value:"-50%"},{effect:"Capacitor recharge",value:"-50%"},{effect:"Signature",value:"+100%"},{effect:"NOS/Neut drain",value:"+100%"}]},r={1:[{effect:"Armor HP",value:"+30%"},{effect:"Shield resist",value:"-15%"},{effect:"Small Weapon damage",value:"+60%"},{effect:"Signature size",value:"-15%"}],2:[{effect:"Armor HP",value:"+44%"},{effect:"Shield resist",value:"-22%"},{effect:"Small Weapon damage",value:"+88%"},{effect:"Signature size",value:"-22%"}],3:[{effect:"Armor HP",value:"+58%"},{effect:"Shield resist",value:"-29%"},{effect:"Small Weapon damage",value:"+116%"},{effect:"Signature size",value:"-29%"}],4:[{effect:"Armor HP",value:"+72%"},{effect:"Shield resist",value:"-36%"},{effect:"Small Weapon damage",value:"+144%"},{effect:"Signature size",value:"-36%"}],5:[{effect:"Armor HP",value:"+86%"},{effect:"Shield resist",value:"-43%"},{effect:"Small Weapon damage",value:"+172%"},{effect:"Signature size",value:"-43%"}],6:[{effect:"Armor HP",value:"+100%"},{effect:"Shield resist",value:"-50%"},{effect:"Small Weapon damage",value:"+200%"},{effect:"Signature size",value:"-50%"}]},o={1:[{effect:"Local armor repair amount",value:"-15%"},{effect:"Local shield boost amount",value:"-15%"},{effect:"Shield transfer amount",value:"+30%"},{effect:"Remote repair amount",value:"+30%"},{effect:"Capacitor capacity",value:"+30%"},{effect:"Capacitor recharge time",value:"+15%"},{effect:"Remote Capacitor Transmitter amount",value:"-15%"}],2:[{effect:"Local armor repair amount",value:"-22%"},{effect:"Local shield boost amount",value:"-22%"},{effect:"Shield transfer amount",value:"+44%"},{effect:"Remote repair amount",value:"+44%"},{effect:"Capacitor capacity",value:"+44%"},{effect:"Capacitor recharge time",value:"+22%"},{effect:"Remote Capacitor Transmitter amount",value:"-22%"}],3:[{effect:"Local armor repair amount",value:"-29%"},{effect:"Local shield boost amount",value:"-29%"},{effect:"Shield transfer amount",value:"+58%"},{effect:"Remote repair amount",value:"+58%"},{effect:"Capacitor capacity",value:"+58%"},{effect:"Capacitor recharge time",value:"+29%"},{effect:"Remote Capacitor Transmitter amount",value:"-29%"}],4:[{effect:"Local armor repair amount",value:"-36%"},{effect:"Local shield boost amount",value:"-36%"},{effect:"Shield transfer amount",value:"+72%"},{effect:"Remote repair amount",value:"+72%"},{effect:"Capacitor capacity",value:"+72%"},{effect:"Capacitor recharge time",value:"+36%"},{effect:"Remote Capacitor Transmitter amount",value:"-36%"}],5:[{effect:"Local armor repair amount",value:"-43%"},{effect:"Local shield boost amount",value:"-43%"},{effect:"Shield transfer amount",value:"+86%"},{effect:"Remote repair amount",value:"+86%"},{effect:"Capacitor capacity",value:"+86%"},{effect:"Capacitor recharge time",value:"+43%"},{effect:"Remote Capacitor Transmitter amount",value:"-43%"}],6:[{effect:"Local armor repair amount",value:"-50%"},{effect:"Local shield boost amount",value:"-50%"},{effect:"Shield transfer amount",value:"+100%"},{effect:"Remote repair amount",value:"+100%"},{effect:"Capacitor capacity",value:"+100%"},{effect:"Capacitor recharge time",value:"+50%"},{effect:"Remote Capacitor Transmitter amount",value:"-50%"}]},a={1:[{effect:"Missile velocity",value:"+15%"},{effect:"Missile exp. velocity",value:"+30%"},{effect:"Ship velocity",value:"+30%"},{effect:"Stasis Webifier strength",value:"-15%"},{effect:"Inertia",value:"+15%"},{effect:"Targeting range",value:"+30%"}],2:[{effect:"Missile velocity",value:"+22%"},{effect:"Missile exp. velocity",value:"+44%"},{effect:"Ship velocity",value:"+44%"},{effect:"Stasis Webifier strength",value:"-22%"},{effect:"Inertia",value:"+22%"},{effect:"Targeting range",value:"+44%"}],3:[{effect:"Missile velocity",value:"+29%"},{effect:"Missile exp. velocity",value:"+58%"},{effect:"Ship velocity",value:"+58%"},{effect:"Stasis Webifier strength",value:"-29%"},{effect:"Inertia",value:"+29%"},{effect:"Targeting range",value:"+58%"}],4:[{effect:"Missile velocity",value:"+36%"},{effect:"Missile exp. velocity",value:"+72%"},{effect:"Ship velocity",value:"+72%"},{effect:"Stasis Webifier strength",value:"-36%"},{effect:"Inertia",value:"+36%"},{effect:"Targeting range",value:"+72%"}],5:[{effect:"Missile velocity",value:"+43%"},{effect:"Missile exp. velocity",value:"+86%"},{effect:"Ship velocity",value:"+86%"},{effect:"Stasis Webifier strength",value:"-43%"},{effect:"Inertia",value:"+43%"},{effect:"Targeting range",value:"+86%"}],6:[{effect:"Missile velocity",value:"+50%"},{effect:"Missile exp. velocity",value:"+100%"},{effect:"Ship velocity",value:"+100%"},{effect:"Stasis Webifier strength",value:"-50%"},{effect:"Inertia",value:"+50%"},{effect:"Targeting range",value:"+100%"}]};return{getMultiplierByAreaId:e,wh:{magnetar:{1:t[e(1)],2:t[e(2)],3:t[e(3)],4:t[e(4)],5:t[e(5)],6:t[e(6)],16:t[e(16)]},redGiant:{1:n[e(1)],2:n[e(2)],3:n[e(3)],4:n[e(4)],5:n[e(5)],6:n[e(6)],14:n[e(14)]},pulsar:{1:i[e(1)],2:i[e(2)],3:i[e(3)],4:i[e(4)],5:i[e(5)],6:i[e(6)],17:i[e(17)]},wolfRayet:{1:r[e(1)],2:r[e(2)],3:r[e(3)],4:r[e(4)],5:r[e(5)],6:r[e(6)],13:r[e(13)],18:r[e(18)]},cataclysmic:{1:o[e(1)],2:o[e(2)],3:o[e(3)],4:o[e(4)],5:o[e(5)],6:o[e(6)],15:o[e(15)]},blackHole:{1:a[e(1)],2:a[e(2)],3:a[e(3)],4:a[e(4)],5:a[e(5)],6:a[e(6)]}}}}),define("conf/signature_type",[],()=>{"use strict";let e={10:"Ruined Angel Crystal Quarry",11:"Ruined Angel Monument Site",12:"Ruined Angel Science Outpost",13:"Ruined Angel Temple Site",14:"Ruined Blood Raider Crystal Quarry",15:"Ruined Blood Raider Monument Site",16:"Ruined Blood Raider Science Outpost",17:"Ruined Blood Raider Temple Site",18:"Ruined Guristas Crystal Quarry",19:"Ruined Guristas Monument Site",20:"Ruined Guristas Science Outpost",21:"Ruined Guristas Temple Site",22:"Ruined Sansha Crystal Quarry",23:"Ruined Sansha Monument Site",24:"Ruined Sansha Science Outpost",25:"Ruined Sansha Temple Site",26:"Ruined Serpentis Crystal Quarry",27:"Ruined Serpentis Monument Site",28:"Ruined Serpentis Science Outpost",29:"Ruined Serpentis Temple Site"},t=Object.assign({},e,{1:"Forgotten Perimeter Coronation Platform",2:"Forgotten Perimeter Power Array"}),n=Object.assign({},e,{1:"Forgotten Perimeter Gateway",2:"Forgotten Perimeter Habitation Coils"}),i=Object.assign({},e,{1:"Forgotten Frontier Quarantine Outpost",2:"Forgotten Frontier Recursive Depot"}),r={10:"Abandoned Research Complex DA005",11:"Abandoned Research Complex DA015",12:"Abandoned Research Complex DC007",13:"Abandoned Research Complex DC021",14:"Abandoned Research Complex DC035",15:"Abandoned Research Complex DG003",16:"Central Angel Command Center",17:"Central Angel Data Mining Site",18:"Central Angel Sparking Transmitter",19:"Central Angel Survey Site",20:"Central Blood Raider Command Center",21:"Central Blood Raider Data Mining Site",22:"Central Blood Raider Sparking Transmitter",23:"Central Blood Raider Survey Site",24:"Central Guristas Command Center",25:"Central Guristas Data Mining Center",26:"Central Guristas Sparking Transmitter",27:"Central Guristas Survey Site",28:"Central Sansha Command Center",29:"Central Sansha Data Mining Site",30:"Central Sansha Sparking Transmitter",31:"Central Sansha Survey Site",32:"Central Serpentis Command Center",33:"Central Serpentis Data Mining Site",34:"Central Serpentis Sparking Transmitter",35:"Central Serpentis Survey Site"};return{1:{1:{1:{1:"Perimeter Ambush Point",2:"Perimeter Camp",3:"Phase Catalyst Node",4:"The Line"},2:t,3:Object.assign({},r,{1:"Unsecured Perimeter Amplifier",2:"Unsecured Perimeter Information Center"}),4:{1:"Barren Perimeter Reservoir",2:"Token Perimeter Reservoir",3:"Minor Perimeter Reservoir",4:"Sizeable Perimeter Reservoir",5:"Ordinary Perimeter Reservoir"},5:{1:"H121 - C1",2:"C125 - C2",3:"O883 - C3",4:"M609 - C4",5:"L614 - C5",6:"S804 - C6",7:"F353 - C12 Thera"},6:{1:"Ordinary Perimeter Deposit",2:"Common Perimeter Deposit",3:"Unexceptional Frontier Deposit",4:"Average Frontier Deposit",5:"Isolated Core Deposit",6:"Uncommon Core Deposit"},7:{}},2:{1:{1:"Perimeter Checkpoint",2:"Perimeter Hangar",3:"The Ruins of Enclave Cohort 27",4:"Sleeper Data Sanctuary"},2:n,3:Object.assign({},r,{1:"Unsecured Perimeter Comms Relay",2:"Unsecured Perimeter Transponder Farm"}),4:{1:"Barren Perimeter Reservoir",2:"Token Perimeter Reservoir",3:"Minor Perimeter Reservoir",4:"Sizeable Perimeter Reservoir",5:"Ordinary Perimeter Reservoir"},5:{1:"Z647 - C1",2:"D382 - C2",3:"O477 - C3",4:"Y683 - C4",5:"N062 - C5",6:"R474 - C6",7:"F135 - C12 Thera"},6:{1:"Ordinary Perimeter Deposit",2:"Common Perimeter Deposit",3:"Unexceptional Frontier Deposit",4:"Average Frontier Deposit",5:"Isolated Core Deposit",6:"Uncommon Core Deposit"},7:{}},3:{1:{1:"Fortification Frontier Stronghold",2:"Outpost Frontier Stronghold",3:"Solar Cell",4:"The Oruze Construct"},2:i,3:Object.assign({},r,{1:"Unsecured Frontier Database",2:"Unsecured Frontier Receiver"}),4:{1:"Barren Perimeter Reservoir",2:"Token Perimeter Reservoir",3:"Minor Perimeter Reservoir",4:"Sizeable Perimeter Reservoir",5:"Ordinary Perimeter Reservoir",6:"Bountiful Frontier Reservoir",7:"Vast Frontier Reservoir"},5:{1:"V301 - C1",2:"I182 - C2",3:"N968 - C3",4:"T405 - C4",5:"N770 - C5",6:"A982 - C6",7:"F135 - C12 Thera"},6:{1:"Ordinary Perimeter Deposit",2:"Common Perimeter Deposit",3:"Unexceptional Frontier Deposit",4:"Average Frontier Deposit",5:"Infrequent Core Deposit",6:"Unusual Core Deposit"},7:{}},4:{1:{1:"Frontier Barracks",2:"Frontier Command Post",3:"Integrated Terminus",4:"Sleeper Information Sanctum"},2:{1:"Forgotten Frontier Conversion Module",2:"Forgotten Frontier Evacuation Center"},3:{1:"Unsecured Frontier Digital Nexus",2:"Unsecured Frontier Trinary Hub"},4:{1:"Barren Perimeter Reservoir",2:"Token Perimeter Reservoir",3:"Minor Perimeter Reservoir",4:"Sizeable Perimeter Reservoir",5:"Ordinary Perimeter Reservoir",6:"Vast Frontier Reservoir",7:"Bountiful Frontier Reservoir"},5:{1:"S047 - H",2:"N290 - L",3:"K329 - 0.0"},6:{1:"Ordinary Perimeter Deposit",2:"Common Perimeter Deposit",3:"Unexceptional Frontier Deposit",4:"Average Frontier Deposit",5:"Unusual Core Deposit",6:"Infrequent Core Deposit"},7:{}},5:{1:{1:"Core Garrison",2:"Core Stronghold",3:"Oruze Osobnyk",4:"Quarantine Area"},2:{1:"Forgotten Core Data Field",2:"Forgotten Core Information Pen"},3:{1:"Unsecured Frontier Enclave Relay",2:"Unsecured Frontier Server Bank"},4:{1:"Barren Perimeter Reservoir",2:"Minor Perimeter Reservoir",3:"Ordinary Perimeter Reservoir",4:"Sizeable Perimeter Reservoir",5:"Token Perimeter Reservoir",6:"Bountiful Frontier Reservoir",7:"Vast Frontier Reservoir",8:"Instrumental Core Reservoir",9:"Vital Core Reservoir"},5:{1:"D792 - H",2:"C140 - L",3:"Z142 - 0.0"},6:{1:"Average Frontier Deposit",2:"Unexceptional Frontier Deposit",3:"Uncommon Core Deposit",4:"Ordinary Perimeter Deposit",5:"Common Perimeter Deposit",6:"Exceptional Core Deposit",7:"Infrequent Core Deposit",8:"Unusual Core Deposit",9:"Rarified Core Deposit",10:"Isolated Core Deposit"},7:{}},6:{1:{1:"Core Citadel",2:"Core Bastion",3:"Strange Energy Readings",4:"The Mirror"},2:{1:"Forgotten Core Assembly Hall",2:"Forgotten Core Circuitry Disassembler"},3:{1:"Unsecured Core Backup Array",2:"Unsecured Core Emergence"},4:{1:"Barren Perimeter Reservoir",2:"Minor Perimeter Reservoir",3:"Ordinary Perimeter Reservoir",4:"Sizeable Perimeter Reservoir",5:"Token Perimeter Reservoir",6:"Bountiful Frontier Reservoir",7:"Vast Frontier Reservoir",8:"Instrumental Core Reservoir",9:"Vital Core Reservoir"},5:{1:"B520 - H",2:"D792 - H",3:"C140 - L",4:"C391 - L",5:"C248 - 0.0",6:"Z142 - 0.0"},6:{1:"Ordinary Perimeter Deposit",2:"Common Perimeter Deposit",3:"Unexceptional Frontier Deposit",4:"Average Frontier Deposit",5:"Rarified Core Deposit"},7:{1:"Superior Blood Raider Covert Research Facility"}},12:{1:{1:"Epicenter",2:"Expedition Command Outpost Wreck",3:"Planetary Colonization Office Wreck",4:"Testing Facilities"}},13:{5:{1:"P060 - C1",2:"Z647 - C1",3:"D382 - C2",4:"L005 - C2",5:"N766 - C2",6:"C247 - C3",7:"M267 - C3",8:"O477 - C3",9:"X877 - C4",10:"Y683 - C4",11:"H296 - C5",12:"H900 - C5",13:"H296 - C5",14:"N062 - C5",15:"V911 - C5",16:"U574 - C6",17:"V753 - C6",18:"W237 - C6",19:"B274 - H",20:"D792 - H",21:"D845 - H",22:"N110 - H",23:"A239 - L",24:"C391 - L",25:"J244 - L",26:"U201 - L",27:"U210 - L",28:"C248 - 0.0",29:"E545 - 0.0",30:"K346 - 0.0",31:"Z060 - 0.0"},6:{1:"Shattered Debris Field",2:"Shattered Ice Field"}},14:{1:{1:"Monolith",2:"Wormhole in Rock Circle",3:"Opposing Spatial Rifts",4:"Sleeper Enclave Debris",5:"Crystal Resource"}},15:{1:{1:"Wrecked Ships",2:"Unstable Wormhole",3:"Spatial Rift",4:"Heavily Guarded Spatial Rift",5:"Crystals"}},16:{1:{1:"Ship Graveyard",2:"Sleeper Engineering Station",3:"Spatial Rift",4:"Sleeper Enclave in Coral Rock",5:"Crystals and Stone Circle"}},17:{1:{1:"Monolith",2:"Caged Wormhole",3:"Rock Formation and Wormhole",4:"Particle Acceleration Array",5:"Guarded Asteroid Station"}},18:{1:{1:"Ship Graveyard",2:"Caged Wormhole",3:"Spatial Rift Generator",4:"Sleeper Enclave",5:"Hollow Asteroid"}}},2:{30:{5:{1:"Z971 - C1",2:"R943 - C2",3:"X702 - C3",4:"O128 - C4",5:"M555 - C5",6:"B041 - C6",7:"A641 - H",8:"R051 - L",9:"V283 - 0.0",10:"T458 - C12 Thera"}},31:{5:{1:"Z971 - C1",2:"R943 - C2",3:"X702 - C3",4:"O128 - C4",5:"N432 - C5",6:"U319 - C6",7:"B449 - H",8:"N944 - L",9:"S199 - 0.0",10:"M164 - C12 Thera"}},32:{5:{1:"Z971 - C1",2:"R943 - C2",3:"X702 - C3",4:"O128 - C4",5:"N432 - C5",6:"U319 - C6",7:"B449 - H",8:"N944 - L",9:"S199 - 0.0",10:"L031 - C12 Thera"}}}}}),"undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");!function(e){"use strict";var t=e.fn.jquery.split(" ")[0].split(".");if(t[0]<2&&t[1]<9||1==t[0]&&9==t[1]&&t[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),function(e){"use strict";e.fn.emulateTransitionEnd=function(t){var n=!1,i=this;e(this).one("bsTransitionEnd",function(){n=!0});return setTimeout(function(){n||e(i).trigger(e.support.transition.end)},t),this},e(function(){e.support.transition=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var n in t)if(void 0!==e.style[n])return{end:t[n]};return!1}(),e.support.transition&&(e.event.special.bsTransitionEnd={bindType:e.support.transition.end,delegateType:e.support.transition.end,handle:function(t){return e(t.target).is(this)?t.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.VERSION="3.3.5",n.TRANSITION_DURATION=150,n.prototype.close=function(t){function i(){a.detach().trigger("closed.bs.alert").remove()}var r=e(this),o=r.attr("data-target");o||(o=(o=r.attr("href"))&&o.replace(/.*(?=#[^\s]*$)/,""));var a=e(o);t&&t.preventDefault(),a.length||(a=r.closest(".alert")),a.trigger(t=e.Event("close.bs.alert")),t.isDefaultPrevented()||(a.removeClass("in"),e.support.transition&&a.hasClass("fade")?a.one("bsTransitionEnd",i).emulateTransitionEnd(n.TRANSITION_DURATION):i())};var i=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var i=e(this),r=i.data("bs.alert");r||i.data("bs.alert",r=new n(this)),"string"==typeof t&&r[t].call(i)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=i,this},e(document).on("click.bs.alert.data-api",t,n.prototype.close)}(jQuery),function(e){"use strict";function t(t){return this.each(function(){var i=e(this),r=i.data("bs.button"),o="object"==typeof t&&t;r||i.data("bs.button",r=new n(this,o)),"toggle"==t?r.toggle():t&&r.setState(t)})}var n=function(t,i){this.$element=e(t),this.options=e.extend({},n.DEFAULTS,i),this.isLoading=!1};n.VERSION="3.3.5",n.DEFAULTS={loadingText:"loading..."},n.prototype.setState=function(t){var n="disabled",i=this.$element,r=i.is("input")?"val":"html",o=i.data();t+="Text",null==o.resetText&&i.data("resetText",i[r]()),setTimeout(e.proxy(function(){i[r](null==o[t]?this.options[t]:o[t]),"loadingText"==t?(this.isLoading=!0,i.addClass(n).attr(n,n)):this.isLoading&&(this.isLoading=!1,i.removeClass(n).removeAttr(n))},this),0)},n.prototype.toggle=function(){var e=!0,t=this.$element.closest('[data-toggle="buttons"]');if(t.length){var n=this.$element.find("input");"radio"==n.prop("type")?(n.prop("checked")&&(e=!1),t.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==n.prop("type")&&(n.prop("checked")!==this.$element.hasClass("active")&&(e=!1),this.$element.toggleClass("active")),n.prop("checked",this.$element.hasClass("active")),e&&n.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var i=e.fn.button;e.fn.button=t,e.fn.button.Constructor=n,e.fn.button.noConflict=function(){return e.fn.button=i,this},e(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(n){var i=e(n.target);i.hasClass("btn")||(i=i.closest(".btn")),t.call(i,"toggle"),e(n.target).is('input[type="radio"]')||e(n.target).is('input[type="checkbox"]')||n.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(t){e(t.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(t.type))})}(jQuery),function(e){"use strict";function t(t){return this.each(function(){var i=e(this),r=i.data("bs.carousel"),o=e.extend({},n.DEFAULTS,i.data(),"object"==typeof t&&t),a="string"==typeof t?t:o.slide;r||i.data("bs.carousel",r=new n(this,o)),"number"==typeof t?r.to(t):a?r[a]():o.interval&&r.pause().cycle()})}var n=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",e.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",e.proxy(this.pause,this)).on("mouseleave.bs.carousel",e.proxy(this.cycle,this))};n.VERSION="3.3.5",n.TRANSITION_DURATION=600,n.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},n.prototype.keydown=function(e){if(!/input|textarea/i.test(e.target.tagName)){switch(e.which){case 37:this.prev();break;case 39:this.next();break;default:return}e.preventDefault()}},n.prototype.cycle=function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},n.prototype.getItemIndex=function(e){return this.$items=e.parent().children(".item"),this.$items.index(e||this.$active)},n.prototype.getItemForDirection=function(e,t){var n=this.getItemIndex(t);if(("prev"==e&&0===n||"next"==e&&n==this.$items.length-1)&&!this.options.wrap)return t;var i=(n+("prev"==e?-1:1))%this.$items.length;return this.$items.eq(i)},n.prototype.to=function(e){var t=this,n=this.getItemIndex(this.$active=this.$element.find(".item.active"));return e>this.$items.length-1||0>e?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){t.to(e)}):n==e?this.pause().cycle():this.slide(e>n?"next":"prev",this.$items.eq(e))},n.prototype.pause=function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},n.prototype.next=function(){return this.sliding?void 0:this.slide("next")},n.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},n.prototype.slide=function(t,i){var r=this.$element.find(".item.active"),o=i||this.getItemForDirection(t,r),a=this.interval,s="next"==t?"left":"right",l=this;if(o.hasClass("active"))return this.sliding=!1;var c=o[0],u=e.Event("slide.bs.carousel",{relatedTarget:c,direction:s});if(this.$element.trigger(u),!u.isDefaultPrevented()){if(this.sliding=!0,a&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var d=e(this.$indicators.children()[this.getItemIndex(o)]);d&&d.addClass("active")}var p=e.Event("slid.bs.carousel",{relatedTarget:c,direction:s});return e.support.transition&&this.$element.hasClass("slide")?(o.addClass(t),o[0].offsetWidth,r.addClass(s),o.addClass(s),r.one("bsTransitionEnd",function(){o.removeClass([t,s].join(" ")).addClass("active"),r.removeClass(["active",s].join(" ")),l.sliding=!1,setTimeout(function(){l.$element.trigger(p)},0)}).emulateTransitionEnd(n.TRANSITION_DURATION)):(r.removeClass("active"),o.addClass("active"),this.sliding=!1,this.$element.trigger(p)),a&&this.cycle(),this}};var i=e.fn.carousel;e.fn.carousel=t,e.fn.carousel.Constructor=n,e.fn.carousel.noConflict=function(){return e.fn.carousel=i,this};var r=function(n){var i,r=e(this),o=e(r.attr("data-target")||(i=r.attr("href"))&&i.replace(/.*(?=#[^\s]+$)/,""));if(o.hasClass("carousel")){var a=e.extend({},o.data(),r.data()),s=r.attr("data-slide-to");s&&(a.interval=!1),t.call(o,a),s&&o.data("bs.carousel").to(s),n.preventDefault()}};e(document).on("click.bs.carousel.data-api","[data-slide]",r).on("click.bs.carousel.data-api","[data-slide-to]",r),e(window).on("load",function(){e('[data-ride="carousel"]').each(function(){var n=e(this);t.call(n,n.data())})})}(jQuery),function(e){"use strict";function t(t){var n,i=t.attr("data-target")||(n=t.attr("href"))&&n.replace(/.*(?=#[^\s]+$)/,"");return e(i)}function n(t){return this.each(function(){var n=e(this),r=n.data("bs.collapse"),o=e.extend({},i.DEFAULTS,n.data(),"object"==typeof t&&t);!r&&o.toggle&&/show|hide/.test(t)&&(o.toggle=!1),r||n.data("bs.collapse",r=new i(this,o)),"string"==typeof t&&r[t]()})}var i=function(t,n){this.$element=e(t),this.options=e.extend({},i.DEFAULTS,n),this.$trigger=e('[data-toggle="collapse"][href="#'+t.id+'"],[data-toggle="collapse"][data-target="#'+t.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};i.VERSION="3.3.5",i.TRANSITION_DURATION=350,i.DEFAULTS={toggle:!0},i.prototype.dimension=function(){return this.$element.hasClass("width")?"width":"height"},i.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var t,r=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(r&&r.length&&(t=r.data("bs.collapse"),t&&t.transitioning))){var o=e.Event("show.bs.collapse");if(this.$element.trigger(o),!o.isDefaultPrevented()){r&&r.length&&(n.call(r,"hide"),t||r.data("bs.collapse",null));var a=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[a](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var s=function(){this.$element.removeClass("collapsing").addClass("collapse in")[a](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!e.support.transition)return s.call(this);var l=e.camelCase(["scroll",a].join("-"));this.$element.one("bsTransitionEnd",e.proxy(s,this)).emulateTransitionEnd(i.TRANSITION_DURATION)[a](this.$element[0][l])}}}},i.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var t=e.Event("hide.bs.collapse");if(this.$element.trigger(t),!t.isDefaultPrevented()){var n=this.dimension();this.$element[n](this.$element[n]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var r=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return e.support.transition?void this.$element[n](0).one("bsTransitionEnd",e.proxy(r,this)).emulateTransitionEnd(i.TRANSITION_DURATION):r.call(this)}}},i.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},i.prototype.getParent=function(){return e(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(e.proxy(function(n,i){var r=e(i);this.addAriaAndCollapsedClass(t(r),r)},this)).end()},i.prototype.addAriaAndCollapsedClass=function(e,t){var n=e.hasClass("in");e.attr("aria-expanded",n),t.toggleClass("collapsed",!n).attr("aria-expanded",n)};var r=e.fn.collapse;e.fn.collapse=n,e.fn.collapse.Constructor=i,e.fn.collapse.noConflict=function(){return e.fn.collapse=r,this},e(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(i){var r=e(this);r.attr("data-target")||i.preventDefault();var o=t(r),a=o.data("bs.collapse")?"toggle":r.data();n.call(o,a)})}(jQuery),function(e){"use strict";function t(t){var n=t.attr("data-target");n||(n=(n=t.attr("href"))&&/#[A-Za-z]/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,""));var i=n&&e(n);return i&&i.length?i:t.parent()}function n(n){n&&3===n.which||(e(i).remove(),e(r).each(function(){var i=e(this),r=t(i),o={relatedTarget:this};r.hasClass("open")&&(n&&"click"==n.type&&/input|textarea/i.test(n.target.tagName)&&e.contains(r[0],n.target)||(r.trigger(n=e.Event("hide.bs.dropdown",o)),n.isDefaultPrevented()||(i.attr("aria-expanded","false"),r.removeClass("open").trigger("hidden.bs.dropdown",o))))}))}var i=".dropdown-backdrop",r='[data-toggle="dropdown"]',o=function(t){e(t).on("click.bs.dropdown",this.toggle)};o.VERSION="3.3.5",o.prototype.toggle=function(i){var r=e(this);if(!r.is(".disabled, :disabled")){var o=t(r),a=o.hasClass("open");if(n(),!a){"ontouchstart"in document.documentElement&&!o.closest(".navbar-nav").length&&e(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(e(this)).on("click",n);var s={relatedTarget:this};if(o.trigger(i=e.Event("show.bs.dropdown",s)),i.isDefaultPrevented())return;r.trigger("focus").attr("aria-expanded","true"),o.toggleClass("open").trigger("shown.bs.dropdown",s)}return!1}},o.prototype.keydown=function(n){if(/(38|40|27|32)/.test(n.which)&&!/input|textarea/i.test(n.target.tagName)){var i=e(this);if(n.preventDefault(),n.stopPropagation(),!i.is(".disabled, :disabled")){var o=t(i),a=o.hasClass("open");if(!a&&27!=n.which||a&&27==n.which)return 27==n.which&&o.find(r).trigger("focus"),i.trigger("click");var s=o.find(".dropdown-menu li:not(.disabled):visible a");if(s.length){var l=s.index(n.target);38==n.which&&l>0&&l--,40==n.which&&ldocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&e?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!e?this.scrollbarWidth:""})},n.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},n.prototype.checkScrollbar=function(){var e=window.innerWidth;if(!e){var t=document.documentElement.getBoundingClientRect();e=t.right-Math.abs(t.left)}this.bodyIsOverflowing=document.body.clientWidth
            ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},t.prototype.init=function(t,n,i){if(this.enabled=!0,this.type=t,this.$element=e(n),this.options=this.getOptions(i),this.$viewport=this.options.viewport&&e(e.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var r=this.options.trigger.split(" "),o=r.length;o--;){var a=r[o];if("click"==a)this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this));else if("manual"!=a){var s="hover"==a?"mouseenter":"focusin",l="hover"==a?"mouseleave":"focusout";this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(l+"."+this.type,this.options.selector,e.proxy(this.leave,this))}}this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},t.prototype.getDefaults=function(){return t.DEFAULTS},t.prototype.getOptions=function(t){return(t=e.extend({},this.getDefaults(),this.$element.data(),t)).delay&&"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),t},t.prototype.getDelegateOptions=function(){var t={},n=this.getDefaults();return this._options&&e.each(this._options,function(e,i){n[e]!=i&&(t[e]=i)}),t},t.prototype.enter=function(t){var n=t instanceof this.constructor?t:e(t.currentTarget).data("bs."+this.type);return n||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n)),t instanceof e.Event&&(n.inState["focusin"==t.type?"focus":"hover"]=!0),n.tip().hasClass("in")||"in"==n.hoverState?void(n.hoverState="in"):(clearTimeout(n.timeout),n.hoverState="in",n.options.delay&&n.options.delay.show?void(n.timeout=setTimeout(function(){"in"==n.hoverState&&n.show()},n.options.delay.show)):n.show())},t.prototype.isInStateTrue=function(){for(var e in this.inState)if(this.inState[e])return!0;return!1},t.prototype.leave=function(t){var n=t instanceof this.constructor?t:e(t.currentTarget).data("bs."+this.type);return n||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n)),t instanceof e.Event&&(n.inState["focusout"==t.type?"focus":"hover"]=!1),n.isInStateTrue()?void 0:(clearTimeout(n.timeout),n.hoverState="out",n.options.delay&&n.options.delay.hide?void(n.timeout=setTimeout(function(){"out"==n.hoverState&&n.hide()},n.options.delay.hide)):n.hide())},t.prototype.show=function(){var n=e.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(n);var i=e.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(n.isDefaultPrevented()||!i)return;var r=this,o=this.tip(),a=this.getUID(this.type);this.setContent(),o.attr("id",a),this.$element.attr("aria-describedby",a),this.options.animation&&o.addClass("fade");var s="function"==typeof this.options.placement?this.options.placement.call(this,o[0],this.$element[0]):this.options.placement,l=/\s?auto?\s?/i,c=l.test(s);c&&(s=s.replace(l,"")||"top"),o.detach().css({top:0,left:0,display:"block"}).addClass(s).data("bs."+this.type,this),this.options.container?o.appendTo(this.options.container):o.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var u=this.getPosition(),d=o[0].offsetWidth,p=o[0].offsetHeight;if(c){var f=s,h=this.getPosition(this.$viewport);s="bottom"==s&&u.bottom+p>h.bottom?"top":"top"==s&&u.top-ph.width?"left":"left"==s&&u.left-da.top+a.height&&(r.top=a.top+a.height-l)}else{var c=t.left-o,u=t.left+o+n;ca.right&&(r.left=a.left+a.width-u)}return r},t.prototype.getTitle=function(){var e=this.$element,t=this.options;return e.attr("data-original-title")||("function"==typeof t.title?t.title.call(e[0]):t.title)},t.prototype.getUID=function(e){do{e+=~~(1e6*Math.random())}while(document.getElementById(e));return e},t.prototype.tip=function(){if(!this.$tip&&(this.$tip=e(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},t.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},t.prototype.enable=function(){this.enabled=!0},t.prototype.disable=function(){this.enabled=!1},t.prototype.toggleEnabled=function(){this.enabled=!this.enabled},t.prototype.toggle=function(t){var n=this;t&&((n=e(t.currentTarget).data("bs."+this.type))||(n=new this.constructor(t.currentTarget,this.getDelegateOptions()),e(t.currentTarget).data("bs."+this.type,n))),t?(n.inState.click=!n.inState.click,n.isInStateTrue()?n.enter(n):n.leave(n)):n.tip().hasClass("in")?n.leave(n):n.enter(n)},t.prototype.destroy=function(){var e=this;clearTimeout(this.timeout),this.hide(function(){e.$element.off("."+e.type).removeData("bs."+e.type),e.$tip&&e.$tip.detach(),e.$tip=null,e.$arrow=null,e.$viewport=null})};var n=e.fn.tooltip;e.fn.tooltip=function(n){return this.each(function(){var i=e(this),r=i.data("bs.tooltip"),o="object"==typeof n&&n;(r||!/destroy|hide/.test(n))&&(r||i.data("bs.tooltip",r=new t(this,o)),"string"==typeof n&&r[n]())})},e.fn.tooltip.Constructor=t,e.fn.tooltip.noConflict=function(){return e.fn.tooltip=n,this}}(jQuery),function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};if(!e.fn.tooltip)throw new Error("Popover requires tooltip.js");t.VERSION="3.3.5",t.DEFAULTS=e.extend({},e.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype),t.prototype.constructor=t,t.prototype.getDefaults=function(){return t.DEFAULTS},t.prototype.setContent=function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof n?"html":"append":"text"](n),e.removeClass("fade top bottom left right in"),e.find(".popover-title").html()||e.find(".popover-title").hide()},t.prototype.hasContent=function(){return this.getTitle()||this.getContent()},t.prototype.getContent=function(){var e=this.$element,t=this.options;return e.attr("data-content")||("function"==typeof t.content?t.content.call(e[0]):t.content)},t.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var n=e.fn.popover;e.fn.popover=function(n){return this.each(function(){var i=e(this),r=i.data("bs.popover"),o="object"==typeof n&&n;(r||!/destroy|hide/.test(n))&&(r||i.data("bs.popover",r=new t(this,o)),"string"==typeof n&&r[n]())})},e.fn.popover.Constructor=t,e.fn.popover.noConflict=function(){return e.fn.popover=n,this}}(jQuery),function(e){"use strict";function t(n,i){this.$body=e(document.body),this.$scrollElement=e(e(n).is(document.body)?window:n),this.options=e.extend({},t.DEFAULTS,i),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e.proxy(this.process,this)),this.refresh(),this.process()}function n(n){return this.each(function(){var i=e(this),r=i.data("bs.scrollspy"),o="object"==typeof n&&n;r||i.data("bs.scrollspy",r=new t(this,o)),"string"==typeof n&&r[n]()})}t.VERSION="3.3.5",t.DEFAULTS={offset:10},t.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},t.prototype.refresh=function(){var t=this,n="offset",i=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),e.isWindow(this.$scrollElement[0])||(n="position",i=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var t=e(this),r=t.data("target")||t.attr("href"),o=/^#./.test(r)&&e(r);return o&&o.length&&o.is(":visible")&&[[o[n]().top+i,r]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},t.prototype.process=function(){var e,t=this.$scrollElement.scrollTop()+this.options.offset,n=this.getScrollHeight(),i=this.options.offset+n-this.$scrollElement.height(),r=this.offsets,o=this.targets,a=this.activeTarget;if(this.scrollHeight!=n&&this.refresh(),t>=i)return a!=(e=o[o.length-1])&&this.activate(e);if(a&&t=r[e]&&(void 0===r[e+1]||t .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),t.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu").length&&t.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),r&&r()}var a=i.find("> .active"),s=r&&e.support.transition&&(a.length&&a.hasClass("fade")||!!i.find("> .fade").length);a.length&&s?a.one("bsTransitionEnd",o).emulateTransitionEnd(n.TRANSITION_DURATION):o(),a.removeClass("in")};var i=e.fn.tab;e.fn.tab=t,e.fn.tab.Constructor=n,e.fn.tab.noConflict=function(){return e.fn.tab=i,this};var r=function(n){n.preventDefault(),t.call(e(this),"show")};e(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',r).on("click.bs.tab.data-api",'[data-toggle="pill"]',r)}(jQuery),function(e){"use strict";function t(t){return this.each(function(){var i=e(this),r=i.data("bs.affix"),o="object"==typeof t&&t;r||i.data("bs.affix",r=new n(this,o)),"string"==typeof t&&r[t]()})}var n=function(t,i){this.options=e.extend({},n.DEFAULTS,i),this.$target=e(this.options.target).on("scroll.bs.affix.data-api",e.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",e.proxy(this.checkPositionWithEventLoop,this)),this.$element=e(t),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};n.VERSION="3.3.5",n.RESET="affix affix-top affix-bottom",n.DEFAULTS={offset:0,target:window},n.prototype.getState=function(e,t,n,i){var r=this.$target.scrollTop(),o=this.$element.offset(),a=this.$target.height();if(null!=n&&"top"==this.affixed)return n>r&&"top";if("bottom"==this.affixed)return null!=n?!(r+this.unpin<=o.top)&&"bottom":!(e-i>=r+a)&&"bottom";var s=null==this.affixed,l=s?r:o.top;return null!=n&&n>=r?"top":null!=i&&l+(s?a:t)>=e-i&&"bottom"},n.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(n.RESET).addClass("affix");var e=this.$target.scrollTop(),t=this.$element.offset();return this.pinnedOffset=t.top-e},n.prototype.checkPositionWithEventLoop=function(){setTimeout(e.proxy(this.checkPosition,this),1)},n.prototype.checkPosition=function(){if(this.$element.is(":visible")){var t=this.$element.height(),i=this.options.offset,r=i.top,o=i.bottom,a=Math.max(e(document).height(),e(document.body).height());"object"!=typeof i&&(o=r=i),"function"==typeof r&&(r=i.top(this.$element)),"function"==typeof o&&(o=i.bottom(this.$element));var s=this.getState(a,t,r,o);if(this.affixed!=s){null!=this.unpin&&this.$element.css("top","");var l="affix"+(s?"-"+s:""),c=e.Event(l+".bs.affix");if(this.$element.trigger(c),c.isDefaultPrevented())return;this.affixed=s,this.unpin="bottom"==s?this.getPinnedOffset():null,this.$element.removeClass(n.RESET).addClass(l).trigger(l.replace("affix","affixed")+".bs.affix")}"bottom"==s&&this.$element.offset({top:a-t-o})}};var i=e.fn.affix;e.fn.affix=t,e.fn.affix.Constructor=n,e.fn.affix.noConflict=function(){return e.fn.affix=i,this},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var n=e(this),i=n.data();i.offset=i.offset||{},null!=i.offsetBottom&&(i.offset.bottom=i.offsetBottom),null!=i.offsetTop&&(i.offset.top=i.offsetTop),t.call(n,i)})})}(jQuery),define("bootstrap",["jquery"],function(){}),function(e,t){"use strict";"function"==typeof define&&define.amd?define("bootbox",["jquery"],t):"object"==typeof exports?module.exports=t(require("jquery")):e.bootbox=t(e.jQuery)}(this,function e(t,n){"use strict";var i,r,o,a;Object.keys||(Object.keys=(i=Object.prototype.hasOwnProperty,r=!{toString:null}.propertyIsEnumerable("toString"),a=(o=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"]).length,function(e){if("function"!=typeof e&&("object"!=typeof e||null===e))throw new TypeError("Object.keys called on non-object");var t,n,s=[];for(t in e)i.call(e,t)&&s.push(t);if(r)for(n=0;n
            ',header:'',footer:'',closeButton:'',form:'
            ',button:'',option:"",promptMessage:'
            ',inputs:{text:'',textarea:'',email:'',select:'',checkbox:'
            ',radio:'
            ',date:'',time:'',number:'',password:'',range:''}},u={locale:"en",backdrop:"static",animate:!0,className:null,closeButton:!0,show:!0,container:"body",value:"",inputType:"text",swapButtonOrder:!1,centerVertical:!1,multiple:!1,scrollable:!1};function d(e,i,r,o){var a,s,c,d;return o&&o[0]&&(a=o[0].locale||u.locale,(o[0].swapButtonOrder||u.swapButtonOrder)&&(i=i.reverse())),s=function(e,n,i){return t.extend(!0,{},e,function(e,t){var n=e.length,i={};if(n<1||2").attr("label",i.group)),r=p[i.group]);var a=t(c.option);a.attr("value",i.value).text(i.text),r.append(a)}),f(p,function(e,t){o.append(t)}),o.val(e.value);break;case"checkbox":var h=t.isArray(e.value)?e.value:[e.value];if(!(l=e.inputOptions||[]).length)throw new Error('prompt with "inputType" set to "checkbox" requires at least one option');o=t('
            '),f(l,function(i,r){if(r.value===n||r.text===n)throw new Error('each option needs a "value" property and a "text" property');var a=t(c.inputs[e.inputType]);a.find("input").attr("value",r.value),a.find("label").append("\n"+r.text),f(h,function(e,t){t===r.value&&a.find("input").prop("checked",!0)}),o.append(a)});break;case"radio":if(e.value!==n&&t.isArray(e.value))throw new Error('prompt with "inputType" set to "radio" requires a single, non-array value for "value"');if(!(l=e.inputOptions||[]).length)throw new Error('prompt with "inputType" set to "radio" requires at least one option');o=t('
            ');var v=!0;f(l,function(i,r){if(r.value===n||r.text===n)throw new Error('each option needs a "value" property and a "text" property');var a=t(c.inputs[e.inputType]);a.find("input").attr("value",r.value),a.find("label").append("\n"+r.text),e.value!==n&&r.value===e.value&&(a.find("input").prop("checked",!0),v=!1),o.append(a)}),v&&o.find('input[type="radio"]').first().prop("checked",!0)}if(r.append(o),r.on("submit",function(e){e.preventDefault(),e.stopPropagation(),i.find(".bootbox-accept").trigger("click")}),""!==t.trim(e.message)){var y=t(c.promptMessage).html(e.message);r.prepend(y),e.message=r}else e.message=r;return(i=s.dialog(e)).off("shown.bs.modal"),i.on("shown.bs.modal",function(){o.focus()}),!0===a&&i.modal("show"),i},s.addLocale("en",{OK:"OK",CANCEL:"Cancel",CONFIRM:"OK"}),s}),function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define("localForage",[],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).localforage=e()}}(function(){return function e(t,n,i){function r(a,s){if(!n[a]){if(!t[a]){var l="function"==typeof require&&require;if(!s&&l)return l(a,!0);if(o)return o(a,!0);var c=new Error("Cannot find module '"+a+"'");throw c.code="MODULE_NOT_FOUND",c}var u=n[a]={exports:{}};t[a][0].call(u.exports,function(e){return r(t[a][1][e]||e)},u,u.exports,e,t,n,i)}return n[a].exports}for(var o="function"==typeof require&&require,a=0;a=43)}}).catch(function(){return!1})}(e).then(function(e){return P=e})}function c(e){var t=$[e.name],n={};n.promise=new O(function(e,t){n.resolve=e,n.reject=t}),t.deferredOperations.push(n),t.dbReady?t.dbReady=t.dbReady.then(function(){return n.promise}):t.dbReady=n.promise}function u(e){var t=$[e.name].deferredOperations.pop();if(t)return t.resolve(),t.promise}function d(e,t){var n=$[e.name].deferredOperations.pop();if(n)return n.reject(t),n.promise}function p(e,t){return new O(function(n,i){if($[e.name]=$[e.name]||{forages:[],db:null,dbReady:null,deferredOperations:[]},e.db){if(!t)return n(e.db);c(e),e.db.close()}var r=[e.name];t&&r.push(e.version);var o=A.open.apply(A,r);t&&(o.onupgradeneeded=function(t){var n=o.result;try{n.createObjectStore(e.storeName),t.oldVersion<=1&&n.createObjectStore(I)}catch(n){if("ConstraintError"!==n.name)throw n;console.warn('The database "'+e.name+'" has been upgraded from version '+t.oldVersion+" to version "+t.newVersion+', but the storage "'+e.storeName+'" already exists.')}}),o.onerror=function(e){e.preventDefault(),i(o.error)},o.onsuccess=function(){n(o.result),u(e)}})}function f(e){return p(e,!1)}function h(e){return p(e,!0)}function m(e,t){if(!e.db)return!0;var n=!e.db.objectStoreNames.contains(e.storeName),i=e.versione.db.version;if(i&&(e.version!==t&&console.warn('The database "'+e.name+"\" can't be downgraded from version "+e.db.version+" to version "+e.version+"."),e.version=e.db.version),r||n){if(n){var o=e.db.version+1;o>e.version&&(e.version=o)}return!0}return!1}function g(e){return i([function(e){for(var t=e.length,n=new ArrayBuffer(t),i=new Uint8Array(n),r=0;r0&&(!e.db||"InvalidStateError"===r.name||"NotFoundError"===r.name))return O.resolve().then(function(){if(!e.db||"NotFoundError"===r.name&&!e.db.objectStoreNames.contains(e.storeName)&&e.version<=e.db.version)return e.db&&(e.version=e.db.version+1),h(e)}).then(function(){return function(e){c(e);for(var t=$[e.name],n=t.forages,i=0;i>4,u[l++]=(15&i)<<4|r>>2,u[l++]=(3&r)<<6|63&o;return c}function x(e){var t,n=new Uint8Array(e),i="";for(t=0;t>2],i+=M[(3&n[t])<<4|n[t+1]>>4],i+=M[(15&n[t+1])<<2|n[t+2]>>6],i+=M[63&n[t+2]];return n.length%3==2?i=i.substring(0,i.length-1)+"=":n.length%3==1&&(i=i.substring(0,i.length-2)+"=="),i}function C(e,t,n,i){e.executeSql("CREATE TABLE IF NOT EXISTS "+t.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],n,i)}function S(e,t,n,i,r,o){e.executeSql(n,i,r,function(e,a){a.code===a.SYNTAX_ERR?e.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[t.storeName],function(e,s){s.rows.length?o(e,a):C(e,t,function(){e.executeSql(n,i,r,o)},o)},o):o(e,a)},o)}function _(e,t){var n=e.name+"/";return e.storeName!==t.storeName&&(n+=e.storeName+"/"),n}function T(){return!function(){var e="_localforage_support_test";try{return localStorage.setItem(e,!0),localStorage.removeItem(e),!1}catch(e){return!0}}()||localStorage.length>0}function k(e,t){e[t]=function(){var n=arguments;return e.ready().then(function(){return e[t].apply(e,n)})}}function D(){for(var e=1;e0)return void r(e.apply(s,[t,l,i,o-1]));a(n)}})})}).catch(a)});return r(l,i),l}.apply(this,[e,t,n,1])},removeItem:function(e,t){var n=this;e=a(e);var i=new O(function(t,i){n.ready().then(function(){var r=n._dbInfo;r.db.transaction(function(n){S(n,r,"DELETE FROM "+r.storeName+" WHERE key = ?",[e],function(){t()},function(e,t){i(t)})})}).catch(i)});return r(i,t),i},clear:function(e){var t=this,n=new O(function(e,n){t.ready().then(function(){var i=t._dbInfo;i.db.transaction(function(t){S(t,i,"DELETE FROM "+i.storeName,[],function(){e()},function(e,t){n(t)})})}).catch(n)});return r(n,e),n},length:function(e){var t=this,n=new O(function(e,n){t.ready().then(function(){var i=t._dbInfo;i.db.transaction(function(t){S(t,i,"SELECT COUNT(key) as c FROM "+i.storeName,[],function(t,n){var i=n.rows.item(0).c;e(i)},function(e,t){n(t)})})}).catch(n)});return r(n,e),n},key:function(e,t){var n=this,i=new O(function(t,i){n.ready().then(function(){var r=n._dbInfo;r.db.transaction(function(n){S(n,r,"SELECT key FROM "+r.storeName+" WHERE id = ? LIMIT 1",[e+1],function(e,n){var i=n.rows.length?n.rows.item(0).key:null;t(i)},function(e,t){i(t)})})}).catch(i)});return r(i,t),i},keys:function(e){var t=this,n=new O(function(e,n){t.ready().then(function(){var i=t._dbInfo;i.db.transaction(function(t){S(t,i,"SELECT key FROM "+i.storeName,[],function(t,n){for(var i=[],r=0;r '__WebKitDatabaseInfoTable__'",[],function(n,i){for(var r=[],o=0;o=0;n--){var i=localStorage.key(n);0===i.indexOf(e)&&localStorage.removeItem(i)}});return r(n,e),n},length:function(e){var t=this.keys().then(function(e){return e.length});return r(t,e),t},key:function(e,t){var n=this,i=n.ready().then(function(){var t,i=n._dbInfo;try{t=localStorage.key(e)}catch(e){t=null}return t&&(t=t.substring(i.keyPrefix.length)),t});return r(i,t),i},keys:function(e){var t=this,n=t.ready().then(function(){for(var e=t._dbInfo,n=localStorage.length,i=[],r=0;r=0;t--){var n=localStorage.key(t);0===n.indexOf(e)&&localStorage.removeItem(n)}}):O.reject("Invalid arguments"),t),i}},oe=function(e,t){return e===t||"number"==typeof e&&"number"==typeof t&&isNaN(e)&&isNaN(t)},ae=function(e,t){for(var n=e.length,i=0;ic.failure_limit)return!1}else n.trigger("appear"),t=0})}var s,l=this,c={threshold:0,failure_limit:0,event:"scroll",effect:"show",container:t,data_attribute:"original",skip_invisible:!1,appear:null,load:null,placeholder:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC"};return o&&(i!==o.failurelimit&&(o.failure_limit=o.failurelimit,delete o.failurelimit),i!==o.effectspeed&&(o.effect_speed=o.effectspeed,delete o.effectspeed),e.extend(c,o)),s=c.container===i||c.container===t?r:e(c.container),0===c.event.indexOf("scroll")&&s.bind(c.event,function(){return a()}),this.each(function(){var t=this,n=e(t);t.loaded=!1,(n.attr("src")===i||!1===n.attr("src"))&&n.is("img")&&n.attr("src",c.placeholder),n.one("appear",function(){if(!this.loaded){if(c.appear){var i=l.length;c.appear.call(t,i,c)}e("").bind("load",function(){var i=n.attr("data-"+c.data_attribute);n.hide(),n.is("img")?n.attr("src",i):n.css("background-image","url('"+i+"')"),n[c.effect](c.effect_speed),t.loaded=!0;var r=e.grep(l,function(e){return!e.loaded});if(l=e(r),c.load){var o=l.length;c.load.call(t,o,c)}}).attr("src",n.attr("data-"+c.data_attribute))}}),0!==c.event.indexOf("scroll")&&n.bind(c.event,function(){t.loaded||n.trigger("appear")})}),r.bind("resize",function(){a()}),/(?:iphone|ipod|ipad).*os 5/gi.test(navigator.appVersion)&&r.bind("pageshow",function(t){t.originalEvent&&t.originalEvent.persisted&&l.each(function(){e(this).trigger("appear")})}),e(n).ready(function(){a()}),this},e.belowthefold=function(n,o){return(o.container===i||o.container===t?(t.innerHeight?t.innerHeight:r.height())+r.scrollTop():e(o.container).offset().top+e(o.container).height())<=e(n).offset().top-o.threshold},e.rightoffold=function(n,o){return(o.container===i||o.container===t?r.width()+r.scrollLeft():e(o.container).offset().left+e(o.container).width())<=e(n).offset().left-o.threshold},e.abovethetop=function(n,o){return(o.container===i||o.container===t?r.scrollTop():e(o.container).offset().top)>=e(n).offset().top+o.threshold+e(n).height()},e.leftofbegin=function(n,o){return(o.container===i||o.container===t?r.scrollLeft():e(o.container).offset().left)>=e(n).offset().left+o.threshold+e(n).width()},e.inviewport=function(t,n){return!(e.rightoffold(t,n)||e.leftofbegin(t,n)||e.belowthefold(t,n)||e.abovethetop(t,n))},e.extend(e.expr[":"],{"below-the-fold":function(t){return e.belowthefold(t,{threshold:0})},"above-the-top":function(t){return!e.belowthefold(t,{threshold:0})},"right-of-screen":function(t){return e.rightoffold(t,{threshold:0})},"left-of-screen":function(t){return!e.rightoffold(t,{threshold:0})},"in-viewport":function(t){return e.inviewport(t,{threshold:0})},"above-the-fold":function(t){return!e.belowthefold(t,{threshold:0})},"right-of-fold":function(t){return e.rightoffold(t,{threshold:0})},"left-of-fold":function(t){return!e.rightoffold(t,{threshold:0})}})}(jQuery,window,document),define("lazyload",["jquery"],function(){}),function(e){"use strict";function t(e){var t=e.length,i=n.type(e);return"function"!==i&&!n.isWindow(e)&&(!(1!==e.nodeType||!t)||"array"===i||0===t||"number"==typeof t&&t>0&&t-1 in e)}if(!e.jQuery){var n=function(e,t){return new n.fn.init(e,t)};n.isWindow=function(e){return e&&e===e.window},n.type=function(e){return e?"object"==typeof e||"function"==typeof e?r[a.call(e)]||"object":typeof e:e+""},n.isArray=Array.isArray||function(e){return"array"===n.type(e)},n.isPlainObject=function(e){var t;if(!e||"object"!==n.type(e)||e.nodeType||n.isWindow(e))return!1;try{if(e.constructor&&!o.call(e,"constructor")&&!o.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(e){return!1}for(t in e);return void 0===t||o.call(e,t)},n.each=function(e,n,i){var r=0,o=e.length,a=t(e);if(i){if(a)for(;r0?r=a:n=a}while(Math.abs(o)>m&&++s=h?u(t,a):0===s?a:d(t,n,n+y)}(t),n,r)};S.getControlPoints=function(){return[{x:e,y:n},{x:i,y:r}]};var _="generateBezier("+[e,n,i,r]+")";return S.toString=function(){return _},S}function c(e,t){var n=e;return y.isString(e)?C.Easings[e]||(n=!1):n=y.isArray(e)&&1===e.length?function(e){return function(t){return Math.round(t*e)*(1/e)}}.apply(null,e):y.isArray(e)&&2===e.length?S.apply(null,e.concat([t])):!(!y.isArray(e)||4!==e.length)&&l.apply(null,e),!1===n&&(n=C.Easings[C.defaults.easing]?C.defaults.easing:x),n}function u(e){if(e){var t=C.timestamp&&!0!==e?e:m.now(),n=C.State.calls.length;n>1e4&&(C.State.calls=function(e){for(var t=-1,n=e?e.length:0,i=[];++t4;e--){var t=n.createElement("div");if(t.innerHTML="\x3c!--[if IE "+e+"]>=0?t:Math.max(0,i+t),s=(n<0?i+n:Math.min(n,i))-a;if(s>0)if(o=new Array(s),this.charAt)for(r=0;r=0}:function(e,t){for(var n=0;n1e-4&&Math.abs(s.v)>1e-4;);return o?function(e){return c[e*(c.length-1)|0]}:u}}();C.Easings={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},spring:function(e){return 1-Math.cos(4.5*e*Math.PI)*Math.exp(6*-e)}},p.each([["ease",[.25,.1,.25,1]],["ease-in",[.42,0,1,1]],["ease-out",[0,0,.58,1]],["ease-in-out",[.42,0,.58,1]],["easeInSine",[.47,0,.745,.715]],["easeOutSine",[.39,.575,.565,1]],["easeInOutSine",[.445,.05,.55,.95]],["easeInQuad",[.55,.085,.68,.53]],["easeOutQuad",[.25,.46,.45,.94]],["easeInOutQuad",[.455,.03,.515,.955]],["easeInCubic",[.55,.055,.675,.19]],["easeOutCubic",[.215,.61,.355,1]],["easeInOutCubic",[.645,.045,.355,1]],["easeInQuart",[.895,.03,.685,.22]],["easeOutQuart",[.165,.84,.44,1]],["easeInOutQuart",[.77,0,.175,1]],["easeInQuint",[.755,.05,.855,.06]],["easeOutQuint",[.23,1,.32,1]],["easeInOutQuint",[.86,0,.07,1]],["easeInExpo",[.95,.05,.795,.035]],["easeOutExpo",[.19,1,.22,1]],["easeInOutExpo",[1,0,0,1]],["easeInCirc",[.6,.04,.98,.335]],["easeOutCirc",[.075,.82,.165,1]],["easeInOutCirc",[.785,.135,.15,.86]]],function(e,t){C.Easings[t[0]]=l.apply(null,t[1])});var _=C.CSS={RegEx:{isHex:/^#([A-f\d]{3}){1,2}$/i,valueUnwrap:/^[A-z]+\((.*)\)$/i,wrappedValueAlreadyExtracted:/[0-9.]+ [0-9.]+ [0-9.]+( [0-9.]+)?/,valueSplit:/([A-z]+\(.+\))|(([A-z0-9#-.]+?)(?=\s|$))/gi},Lists:{colors:["fill","stroke","stopColor","color","backgroundColor","borderColor","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","outlineColor"],transformsBase:["translateX","translateY","scale","scaleX","scaleY","skewX","skewY","rotateZ"],transforms3D:["transformPerspective","translateZ","scaleZ","rotateX","rotateY"],units:["%","em","ex","ch","rem","vw","vh","vmin","vmax","cm","mm","Q","in","pc","pt","px","deg","grad","rad","turn","s","ms"],colorNames:{aliceblue:"240,248,255",antiquewhite:"250,235,215",aquamarine:"127,255,212",aqua:"0,255,255",azure:"240,255,255",beige:"245,245,220",bisque:"255,228,196",black:"0,0,0",blanchedalmond:"255,235,205",blueviolet:"138,43,226",blue:"0,0,255",brown:"165,42,42",burlywood:"222,184,135",cadetblue:"95,158,160",chartreuse:"127,255,0",chocolate:"210,105,30",coral:"255,127,80",cornflowerblue:"100,149,237",cornsilk:"255,248,220",crimson:"220,20,60",cyan:"0,255,255",darkblue:"0,0,139",darkcyan:"0,139,139",darkgoldenrod:"184,134,11",darkgray:"169,169,169",darkgrey:"169,169,169",darkgreen:"0,100,0",darkkhaki:"189,183,107",darkmagenta:"139,0,139",darkolivegreen:"85,107,47",darkorange:"255,140,0",darkorchid:"153,50,204",darkred:"139,0,0",darksalmon:"233,150,122",darkseagreen:"143,188,143",darkslateblue:"72,61,139",darkslategray:"47,79,79",darkturquoise:"0,206,209",darkviolet:"148,0,211",deeppink:"255,20,147",deepskyblue:"0,191,255",dimgray:"105,105,105",dimgrey:"105,105,105",dodgerblue:"30,144,255",firebrick:"178,34,34",floralwhite:"255,250,240",forestgreen:"34,139,34",fuchsia:"255,0,255",gainsboro:"220,220,220",ghostwhite:"248,248,255",gold:"255,215,0",goldenrod:"218,165,32",gray:"128,128,128",grey:"128,128,128",greenyellow:"173,255,47",green:"0,128,0",honeydew:"240,255,240",hotpink:"255,105,180",indianred:"205,92,92",indigo:"75,0,130",ivory:"255,255,240",khaki:"240,230,140",lavenderblush:"255,240,245",lavender:"230,230,250",lawngreen:"124,252,0",lemonchiffon:"255,250,205",lightblue:"173,216,230",lightcoral:"240,128,128",lightcyan:"224,255,255",lightgoldenrodyellow:"250,250,210",lightgray:"211,211,211",lightgrey:"211,211,211",lightgreen:"144,238,144",lightpink:"255,182,193",lightsalmon:"255,160,122",lightseagreen:"32,178,170",lightskyblue:"135,206,250",lightslategray:"119,136,153",lightsteelblue:"176,196,222",lightyellow:"255,255,224",limegreen:"50,205,50",lime:"0,255,0",linen:"250,240,230",magenta:"255,0,255",maroon:"128,0,0",mediumaquamarine:"102,205,170",mediumblue:"0,0,205",mediumorchid:"186,85,211",mediumpurple:"147,112,219",mediumseagreen:"60,179,113",mediumslateblue:"123,104,238",mediumspringgreen:"0,250,154",mediumturquoise:"72,209,204",mediumvioletred:"199,21,133",midnightblue:"25,25,112",mintcream:"245,255,250",mistyrose:"255,228,225",moccasin:"255,228,181",navajowhite:"255,222,173",navy:"0,0,128",oldlace:"253,245,230",olivedrab:"107,142,35",olive:"128,128,0",orangered:"255,69,0",orange:"255,165,0",orchid:"218,112,214",palegoldenrod:"238,232,170",palegreen:"152,251,152",paleturquoise:"175,238,238",palevioletred:"219,112,147",papayawhip:"255,239,213",peachpuff:"255,218,185",peru:"205,133,63",pink:"255,192,203",plum:"221,160,221",powderblue:"176,224,230",purple:"128,0,128",red:"255,0,0",rosybrown:"188,143,143",royalblue:"65,105,225",saddlebrown:"139,69,19",salmon:"250,128,114",sandybrown:"244,164,96",seagreen:"46,139,87",seashell:"255,245,238",sienna:"160,82,45",silver:"192,192,192",skyblue:"135,206,235",slateblue:"106,90,205",slategray:"112,128,144",snow:"255,250,250",springgreen:"0,255,127",steelblue:"70,130,180",tan:"210,180,140",teal:"0,128,128",thistle:"216,191,216",tomato:"255,99,71",turquoise:"64,224,208",violet:"238,130,238",wheat:"245,222,179",whitesmoke:"245,245,245",white:"255,255,255",yellowgreen:"154,205,50",yellow:"255,255,0"}},Hooks:{templates:{textShadow:["Color X Y Blur","black 0px 0px 0px"],boxShadow:["Color X Y Blur Spread","black 0px 0px 0px 0px"],clip:["Top Right Bottom Left","0px 0px 0px 0px"],backgroundPosition:["X Y","0% 0%"],transformOrigin:["X Y Z","50% 50% 0px"],perspectiveOrigin:["X Y","50% 50%"]},registered:{},register:function(){for(var e=0;e<_.Lists.colors.length;e++){var t="color"===_.Lists.colors[e]?"0 0 0 1":"255 255 255 1";_.Hooks.templates[_.Lists.colors[e]]=["Red Green Blue Alpha",t]}var n,i,r;if(f)for(n in _.Hooks.templates)if(_.Hooks.templates.hasOwnProperty(n)){r=(i=_.Hooks.templates[n])[0].split(" ");var o=i[1].match(_.RegEx.valueSplit);"Color"===r[0]&&(r.push(r.shift()),o.push(o.shift()),_.Hooks.templates[n]=[r.join(" "),o.join(" ")])}for(n in _.Hooks.templates)if(_.Hooks.templates.hasOwnProperty(n))for(var a in r=(i=_.Hooks.templates[n])[0].split(" "))if(r.hasOwnProperty(a)){var s=n+r[a],l=a;_.Hooks.registered[s]=[n,l]}},getRoot:function(e){var t=_.Hooks.registered[e];return t?t[0]:e},getUnit:function(e,t){var n=(e.substr(t||0,5).match(/^[a-z%]+/)||[])[0]||"";return n&&v(_.Lists.units,n)?n:""},fixColors:function(e){return e.replace(/(rgba?\(\s*)?(\b[a-z]+\b)/g,function(e,t,n){return _.Lists.colorNames.hasOwnProperty(n)?(t||"rgba(")+_.Lists.colorNames[n]+(t?"":",1)"):t+n})},cleanRootPropertyValue:function(e,t){return _.RegEx.valueUnwrap.test(t)&&(t=t.match(_.RegEx.valueUnwrap)[1]),_.Values.isCSSNullValue(t)&&(t=_.Hooks.templates[e][1]),t},extractValue:function(e,t){var n=_.Hooks.registered[e];if(n){var i=n[0],r=n[1];return(t=_.Hooks.cleanRootPropertyValue(i,t)).toString().match(_.RegEx.valueSplit)[r]}return t},injectValue:function(e,t,n){var i=_.Hooks.registered[e];if(i){var r,o=i[0],a=i[1];return(r=(n=_.Hooks.cleanRootPropertyValue(o,n)).toString().match(_.RegEx.valueSplit))[a]=t,r.join(" ")}return n}},Normalizations:{registered:{clip:function(e,t,n){switch(e){case"name":return"clip";case"extract":var i;return _.RegEx.wrappedValueAlreadyExtracted.test(n)?i=n:i=(i=n.toString().match(_.RegEx.valueUnwrap))?i[1].replace(/,(\s+)?/g," "):n,i;case"inject":return"rect("+n+")"}},blur:function(e,t,n){switch(e){case"name":return C.State.isFirefox?"filter":"-webkit-filter";case"extract":var i=parseFloat(n);if(!i&&0!==i){var r=n.toString().match(/blur\(([0-9]+[A-z]+)\)/i);i=r?r[1]:0}return i;case"inject":return parseFloat(n)?"blur("+n+")":"none"}},opacity:function(e,t,n){if(f<=8)switch(e){case"name":return"filter";case"extract":var i=n.toString().match(/alpha\(opacity=(.*)\)/i);return i?i[1]/100:1;case"inject":return t.style.zoom=1,parseFloat(n)>=1?"":"alpha(opacity="+parseInt(100*parseFloat(n),10)+")"}else switch(e){case"name":return"opacity";case"extract":case"inject":return n}}},register:function(){function e(e,t,n){if("border-box"===_.getPropertyValue(t,"boxSizing").toString().toLowerCase()===(n||!1)){var i,r,o=0,a="width"===e?["Left","Right"]:["Top","Bottom"],s=["padding"+a[0],"padding"+a[1],"border"+a[0]+"Width","border"+a[1]+"Width"];for(i=0;i9)||C.State.isGingerbread||(_.Lists.transformsBase=_.Lists.transformsBase.concat(_.Lists.transforms3D));for(var n=0;n<_.Lists.transformsBase.length;n++)!function(){var e=_.Lists.transformsBase[n];_.Normalizations.registered[e]=function(t,n,r){switch(t){case"name":return"transform";case"extract":return o(n)===i||o(n).transformCache[e]===i?/^scale/i.test(e)?1:0:o(n).transformCache[e].replace(/[()]/g,"");case"inject":var a=!1;switch(e.substr(0,e.length-1)){case"translate":a=!/(%|px|em|rem|vw|vh|\d)$/i.test(r);break;case"scal":case"scale":C.State.isAndroid&&o(n).transformCache[e]===i&&r<1&&(r=1),a=!/(\d)$/i.test(r);break;case"skew":case"rotate":a=!/(deg|\d)$/i.test(r)}return a||(o(n).transformCache[e]="("+r+")"),o(n).transformCache[e]}}}();for(var r=0;r<_.Lists.colors.length;r++)!function(){var e=_.Lists.colors[r];_.Normalizations.registered[e]=function(t,n,r){switch(t){case"name":return e;case"extract":var o;if(_.RegEx.wrappedValueAlreadyExtracted.test(r))o=r;else{var a,s={black:"rgb(0, 0, 0)",blue:"rgb(0, 0, 255)",gray:"rgb(128, 128, 128)",green:"rgb(0, 128, 0)",red:"rgb(255, 0, 0)",white:"rgb(255, 255, 255)"};/^[A-z]+$/i.test(r)?a=s[r]!==i?s[r]:s.black:_.RegEx.isHex.test(r)?a="rgb("+_.Values.hexToRgb(r).join(" ")+")":/^rgba?\(/i.test(r)||(a=s.black),o=(a||r).toString().match(_.RegEx.valueUnwrap)[1].replace(/,(\s+)?/g," ")}return(!f||f>8)&&3===o.split(" ").length&&(o+=" 1"),o;case"inject":return/^rgb/.test(r)?r:(f<=8?4===r.split(" ").length&&(r=r.split(/\s+/).slice(0,3).join(" ")):3===r.split(" ").length&&(r+=" 1"),(f<=8?"rgb":"rgba")+"("+r.replace(/\s+/g,",").replace(/\.(\d)+(?=,)/g,"")+")")}}}();_.Normalizations.registered.innerWidth=t("width",!0),_.Normalizations.registered.innerHeight=t("height",!0),_.Normalizations.registered.outerWidth=t("width"),_.Normalizations.registered.outerHeight=t("height")}},Names:{camelCase:function(e){return e.replace(/-(\w)/g,function(e,t){return t.toUpperCase()})},SVGAttribute:function(e){var t="width|height|x|y|cx|cy|r|rx|ry|x1|x2|y1|y2";return(f||C.State.isAndroid&&!C.State.isChrome)&&(t+="|transform"),new RegExp("^("+t+")$","i").test(e)},prefixCheck:function(e){if(C.State.prefixMatches[e])return[C.State.prefixMatches[e],!0];for(var t=["","Webkit","Moz","ms","O"],n=0,i=t.length;n=2&&console.log("Get "+n+": "+l),l},setPropertyValue:function(e,n,i,r,a){var s=n;if("scroll"===n)a.container?a.container["scroll"+a.direction]=i:"Left"===a.direction?t.scrollTo(i,a.alternateValue):t.scrollTo(a.alternateValue,i);else if(_.Normalizations.registered[n]&&"transform"===_.Normalizations.registered[n]("name",e))_.Normalizations.registered[n]("inject",e,i),s="transform",i=o(e).transformCache[n];else{if(_.Hooks.registered[n]){var l=n,c=_.Hooks.getRoot(n);r=r||_.getPropertyValue(e,c),i=_.Hooks.injectValue(l,i,r),n=c}if(_.Normalizations.registered[n]&&(i=_.Normalizations.registered[n]("inject",e,i),n=_.Normalizations.registered[n]("name",e)),s=_.Names.prefixCheck(n)[0],f<=8)try{e.style[s]=i}catch(e){C.debug&&console.log("Browser does not support ["+i+"] for ["+s+"]")}else{var u=o(e);u&&u.isSVG&&_.Names.SVGAttribute(n)?e.setAttribute(n,i):e.style[s]=i}C.debug>=2&&console.log("Set "+n+" ("+s+"): "+i)}return[s,i]},flushTransformCache:function(e){var t="",n=o(e);if((f||C.State.isAndroid&&!C.State.isChrome)&&n&&n.isSVG){var i=function(t){return parseFloat(_.getPropertyValue(e,t))},r={translate:[i("translateX"),i("translateY")],skewX:[i("skewX")],skewY:[i("skewY")],scale:1!==i("scale")?[i("scale"),i("scale")]:[i("scaleX"),i("scaleY")],rotate:[i("rotateZ"),0,0]};p.each(o(e).transformCache,function(e){/^translate/i.test(e)?e="translate":/^scale/i.test(e)?e="scale":/^rotate/i.test(e)&&(e="rotate"),r[e]&&(t+=e+"("+r[e].join(" ")+") ",delete r[e])})}else{var a,s;p.each(o(e).transformCache,function(n){if(a=o(e).transformCache[n],"transformPerspective"===n)return s=a,!0;9===f&&"rotateZ"===n&&(n="rotate"),t+=n+a+" "}),s&&(t="perspective"+s+" "+t)}_.setPropertyValue(e,"transform",t)}};_.Hooks.register(),_.Normalizations.register(),C.hook=function(e,t,n){var a;return e=r(e),p.each(e,function(e,r){if(o(r)===i&&C.init(r),n===i)a===i&&(a=_.getPropertyValue(r,t));else{var s=_.setPropertyValue(r,t,n);"transform"===s[0]&&C.CSS.flushTransformCache(r),a=s}}),a};var T=function(){function e(){return h?D.promise||null:m}function l(e,r){function a(a){var f,h;if(l.begin&&0===O)try{l.begin.call(b,b)}catch(e){setTimeout(function(){throw e},1)}if("scroll"===E){var m,g,w,T=/^x$/i.test(l.axis)?"Left":"Top",k=parseFloat(l.offset)||0;l.container?y.isWrapped(l.container)||y.isNode(l.container)?(l.container=l.container[0]||l.container,w=(m=l.container["scroll"+T])+p(e).position()[T.toLowerCase()]+k):l.container=null:(m=C.State.scrollAnchor[C.State["scrollProperty"+T]],g=C.State.scrollAnchor[C.State["scrollProperty"+("Left"===T?"Top":"Left")]],w=p(e).offset()[T.toLowerCase()]+k),d={scroll:{rootPropertyValue:!1,startValue:m,currentValue:m,endValue:w,unitType:"",easing:l.easing,scrollData:{container:l.container,direction:T,alternateValue:g}},element:e},C.debug&&console.log("tweensContainer (scroll): ",d.scroll,e)}else if("reverse"===E){if(!(f=o(e)))return;if(!f.tweensContainer)return void p.dequeue(e,l.queue);for(var I in"none"===f.opts.display&&(f.opts.display="auto"),"hidden"===f.opts.visibility&&(f.opts.visibility="visible"),f.opts.loop=!1,f.opts.begin=null,f.opts.complete=null,S.easing||delete l.easing,S.duration||delete l.duration,l=p.extend({},f.opts,l),h=p.extend(!0,{},f?f.tweensContainer:null))if(h.hasOwnProperty(I)&&"element"!==I){var P=h[I].startValue;h[I].startValue=h[I].currentValue=h[I].endValue,h[I].endValue=P,y.isEmptyObject(S)||(h[I].easing=l.easing),C.debug&&console.log("reverse tweensContainer ("+I+"): "+JSON.stringify(h[I]),e)}d=h}else if("start"===E){(f=o(e))&&f.tweensContainer&&!0===f.isAnimating&&(h=f.tweensContainer);var $=function(r,o){var a,c=_.Hooks.getRoot(r),u=!1,m=o[0],g=o[1],v=o[2];if(f&&f.isSVG||"tween"===c||!1!==_.Names.prefixCheck(c)[1]||_.Normalizations.registered[c]!==i){(l.display!==i&&null!==l.display&&"none"!==l.display||l.visibility!==i&&"hidden"!==l.visibility)&&/opacity|filter/.test(r)&&!v&&0!==m&&(v=0),l._cacheValues&&h&&h[r]?(v===i&&(v=h[r].endValue+h[r].unitType),u=f.rootPropertyValueCache[c]):_.Hooks.registered[r]?v===i?(u=_.getPropertyValue(e,c),v=_.getPropertyValue(e,r,u)):u=_.Hooks.templates[c][1]:v===i&&(v=_.getPropertyValue(e,r));var b,w,x,S=!1,T=function(e,t){var n,i;return i=(t||"0").toString().toLowerCase().replace(/[%A-z]+$/,function(e){return n=e,""}),n||(n=_.Values.getUnitType(e)),[i,n]};if(v!==m&&y.isString(v)&&y.isString(m)){a="";var k=0,D=0,E=[],A=[],O=0,I=0,P=0;for(v=_.Hooks.fixColors(v),m=_.Hooks.fixColors(m);k=4&&"("===$?O++:(O&&O<5||O>=4&&")"===$&&--O<5)&&(O=0),0===I&&"r"===$||1===I&&"g"===$||2===I&&"b"===$||3===I&&"a"===$||I>=3&&"("===$?(3===I&&"a"===$&&(P=1),I++):P&&","===$?++P>3&&(I=P=0):(P&&I<(P?5:4)||I>=(P?4:3)&&")"===$&&--I<(P?5:4))&&(I=P=0)}}k===v.length&&D===m.length||(C.debug&&console.error('Trying to pattern match mis-matched strings ["'+m+'", "'+v+'"]'),a=i),a&&(E.length?(C.debug&&console.log('Pattern found "'+a+'" -> ',E,A,"["+v+","+m+"]"),v=E,m=A,w=x=""):a=i)}if(a||(v=(b=T(r,v))[0],x=b[1],m=(b=T(r,m))[0].replace(/^([+-\/*])=/,function(e,t){return S=t,""}),w=b[1],v=parseFloat(v)||0,m=parseFloat(m)||0,"%"===w&&(/^(fontSize|lineHeight)$/.test(r)?(m/=100,w="em"):/^scale/.test(r)?(m/=100,w=""):/(Red|Green|Blue)$/i.test(r)&&(m=m/100*255,w=""))),/[\/*]/.test(S))w=x;else if(x!==w&&0!==v)if(0===m)w=x;else{s=s||function(){var i={myParent:e.parentNode||n.body,position:_.getPropertyValue(e,"position"),fontSize:_.getPropertyValue(e,"fontSize")},r=i.position===N.lastPosition&&i.myParent===N.lastParent,o=i.fontSize===N.lastFontSize;N.lastParent=i.myParent,N.lastPosition=i.position,N.lastFontSize=i.fontSize;var a={};if(o&&r)a.emToPx=N.lastEmToPx,a.percentToPxWidth=N.lastPercentToPxWidth,a.percentToPxHeight=N.lastPercentToPxHeight;else{var s=f&&f.isSVG?n.createElementNS("http://www.w3.org/2000/svg","rect"):n.createElement("div");C.init(s),i.myParent.appendChild(s),p.each(["overflow","overflowX","overflowY"],function(e,t){C.CSS.setPropertyValue(s,t,"hidden")}),C.CSS.setPropertyValue(s,"position",i.position),C.CSS.setPropertyValue(s,"fontSize",i.fontSize),C.CSS.setPropertyValue(s,"boxSizing","content-box"),p.each(["minWidth","maxWidth","width","minHeight","maxHeight","height"],function(e,t){C.CSS.setPropertyValue(s,t,"100%")}),C.CSS.setPropertyValue(s,"paddingLeft","100em"),a.percentToPxWidth=N.lastPercentToPxWidth=(parseFloat(_.getPropertyValue(s,"width",null,!0))||1)/100,a.percentToPxHeight=N.lastPercentToPxHeight=(parseFloat(_.getPropertyValue(s,"height",null,!0))||1)/100,a.emToPx=N.lastEmToPx=(parseFloat(_.getPropertyValue(s,"paddingLeft"))||1)/100,i.myParent.removeChild(s)}return null===N.remToPx&&(N.remToPx=parseFloat(_.getPropertyValue(n.body,"fontSize"))||16),null===N.vwToPx&&(N.vwToPx=parseFloat(t.innerWidth)/100,N.vhToPx=parseFloat(t.innerHeight)/100),a.remToPx=N.remToPx,a.vwToPx=N.vwToPx,a.vhToPx=N.vhToPx,C.debug>=1&&console.log("Unit ratios: "+JSON.stringify(a),e),a}();var z=/margin|padding|left|right|width|text|word|letter/i.test(r)||/X$/.test(r)||"x"===r?"x":"y";switch(x){case"%":v*="x"===z?s.percentToPxWidth:s.percentToPxHeight;break;case"px":break;default:v*=s[x+"ToPx"]}switch(w){case"%":v*=1/("x"===z?s.percentToPxWidth:s.percentToPxHeight);break;case"px":break;default:v*=1/s[w+"ToPx"]}}switch(S){case"+":m=v+m;break;case"-":m=v-m;break;case"*":m*=v;break;case"/":m=v/m}d[r]={rootPropertyValue:u,startValue:v,currentValue:v,endValue:m,unitType:w,easing:g},a&&(d[r].pattern=a),C.debug&&console.log("tweensContainer ("+r+"): "+JSON.stringify(d[r]),e)}else C.debug&&console.log("Skipping ["+c+"] due to a lack of browser support.")};for(var R in x)if(x.hasOwnProperty(R)){var j=_.Names.camelCase(R),L=function(t,n){var i,o,a;return y.isFunction(t)&&(t=t.call(e,r,A)),y.isArray(t)?(i=t[0],!y.isArray(t[1])&&/^[\d-]/.test(t[1])||y.isFunction(t[1])||_.RegEx.isHex.test(t[1])?a=t[1]:y.isString(t[1])&&!_.RegEx.isHex.test(t[1])&&C.Easings[t[1]]||y.isArray(t[1])?(o=c(t[1],l.duration),a=t[2]):a=t[1]||t[2]):i=t,o=o||l.easing,y.isFunction(i)&&(i=i.call(e,r,A)),y.isFunction(a)&&(a=a.call(e,r,A)),[i||0,o,a]}(x[R]);if(v(_.Lists.colors,j)){var B=L[0],F=L[1],q=L[2];if(_.RegEx.isHex.test(B)){for(var U=["Red","Green","Blue"],H=_.Values.hexToRgb(B),z=q?_.Values.hexToRgb(q):i,W=0;WparseFloat(n[1]))}({major:1,minor:1,patch:0},r.version)){var a="Velocity UI Pack: You need to update Velocity (velocity.js) to a newer version. Visit http://github.com/julianshapiro/velocity.";throw alert(a),new Error(a)}for(var s in r.RegisterEffect=r.RegisterUI=function(e,t){function n(e,t,n,i){var a,s=0;o.each(e.nodeType?[e]:e,function(e,t){i&&(n+=e*i),a=t.parentNode;var l=["height","paddingTop","paddingBottom","marginTop","marginBottom"];"border-box"===r.CSS.getPropertyValue(t,"boxSizing").toString().toLowerCase()&&(l=["height"]),o.each(l,function(e,n){s+=parseFloat(r.CSS.getPropertyValue(t,n))})}),r.animate(a,{height:("In"===t?"+":"-")+"="+s},{queue:!1,easing:"ease-in-out",duration:n*("In"===t?.6:1)})}return r.Redirects[e]=function(i,a,s,l,c,u,d){var p=s===l-1,f=0;d=d||t.loop,"function"==typeof t.defaultDuration?t.defaultDuration=t.defaultDuration.call(c,c):t.defaultDuration=parseFloat(t.defaultDuration);for(var h=0;h=1?0:t.calls.length?(1-f)/t.calls.length:1;for(h=0;h1&&(o.each(t.reverse(),function(e,n){var i=t[e+1];if(i){var a=n.o||n.options,s=i.o||i.options,l=a&&!1===a.sequenceQueue?"begin":"complete",c=s&&s[l],u={};u[l]=function(){var e=i.e||i.elements,t=e.nodeType?[e]:e;c&&c.call(t,t),r(n)},i.o?i.o=o.extend({},s,u):i.options=o.extend({},s,u)}}),t.reverse()),r(t[0])}}else t.console&&console.log("Velocity UI Pack: Velocity must be loaded first. Aborting.")}(window.jQuery||window.Zepto||window,window,window&&window.document)}),function(e){"function"==typeof define&&define.amd?define("mousewheel",["jquery"],e):"object"==typeof exports?module.exports=e:e(jQuery)}(function(e){function t(t){var a=t||window.event,s=l.call(arguments,1),c=0,d=0,p=0,f=0,h=0,m=0;if((t=e.event.fix(a)).type="mousewheel","detail"in a&&(p=-1*a.detail),"wheelDelta"in a&&(p=a.wheelDelta),"wheelDeltaY"in a&&(p=a.wheelDeltaY),"wheelDeltaX"in a&&(d=-1*a.wheelDeltaX),"axis"in a&&a.axis===a.HORIZONTAL_AXIS&&(d=-1*p,p=0),c=0===p?d:p,"deltaY"in a&&(c=p=-1*a.deltaY),"deltaX"in a&&(d=a.deltaX,0===p&&(c=-1*d)),0!==p||0!==d){if(1===a.deltaMode){var g=e.data(this,"mousewheel-line-height");c*=g,p*=g,d*=g}else if(2===a.deltaMode){var v=e.data(this,"mousewheel-page-height");c*=v,p*=v,d*=v}if(f=Math.max(Math.abs(p),Math.abs(d)),(!o||o>f)&&(o=f,i(a,f)&&(o/=40)),i(a,f)&&(c/=40,d/=40,p/=40),c=Math[c>=1?"floor":"ceil"](c/o),d=Math[d>=1?"floor":"ceil"](d/o),p=Math[p>=1?"floor":"ceil"](p/o),u.settings.normalizeOffset&&this.getBoundingClientRect){var y=this.getBoundingClientRect();h=t.clientX-y.left,m=t.clientY-y.top}return t.deltaX=d,t.deltaY=p,t.deltaFactor=o,t.offsetX=h,t.offsetY=m,t.deltaMode=0,s.unshift(t,c,d,p),r&&clearTimeout(r),r=setTimeout(n,200),(e.event.dispatch||e.event.handle).apply(this,s)}}function n(){o=null}function i(e,t){return u.settings.adjustOldDeltas&&"mousewheel"===e.type&&t%120==0}var r,o,a=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],s="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],l=Array.prototype.slice;if(e.event.fixHooks)for(var c=a.length;c;)e.event.fixHooks[a[--c]]=e.event.mouseHooks;var u=e.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var n=s.length;n;)this.addEventListener(s[--n],t,!1);else this.onmousewheel=t;e.data(this,"mousewheel-line-height",u.getLineHeight(this)),e.data(this,"mousewheel-page-height",u.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var n=s.length;n;)this.removeEventListener(s[--n],t,!1);else this.onmousewheel=null;e.removeData(this,"mousewheel-line-height"),e.removeData(this,"mousewheel-page-height")},getLineHeight:function(t){var n=e(t),i=n["offsetParent"in e.fn?"offsetParent":"parent"]();return i.length||(i=e("body")),parseInt(i.css("fontSize"),10)||parseInt(n.css("fontSize"),10)||16},getPageHeight:function(t){return e(t).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};e.fn.extend({mousewheel:function(e){return e?this.bind("mousewheel",e):this.trigger("mousewheel")},unmousewheel:function(e){return this.unbind("mousewheel",e)}})}),function(e){"function"==typeof define&&define.amd?define("customScrollbar",["jquery"],e):"undefined"!=typeof module&&module.exports?module.exports=e:e(jQuery,window,document)}(function(e){var t,n,i;t="function"==typeof define&&define.amd,n="undefined"!=typeof module&&module.exports,i="https:"==document.location.protocol?"https:":"http:",t||(n?require("jquery-mousewheel")(e):e.event.special.mousewheel||e("head").append(decodeURI("%3Cscript src="+i+"//cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.1.13/jquery.mousewheel.min.js%3E%3C/script%3E"))),function(){var t,n="mCustomScrollbar",i="mCS",r=".mCustomScrollbar",o={setTop:0,setLeft:0,axis:"y",scrollbarPosition:"inside",scrollInertia:950,autoDraggerLength:!0,alwaysShowScrollbar:0,snapOffset:0,mouseWheel:{enable:!0,scrollAmount:"auto",axis:"y",deltaFactor:"auto",disableOver:["select","option","keygen","datalist","textarea"]},scrollButtons:{scrollType:"stepless",scrollAmount:"auto"},keyboard:{enable:!0,scrollType:"stepless",scrollAmount:"auto"},contentTouchScroll:25,documentTouchScroll:!0,advanced:{autoScrollOnFocus:"input,textarea,select,button,datalist,keygen,a[tabindex],area,object,[contenteditable='true']",updateOnContentResize:!0,updateOnImageLoad:"auto",autoUpdateTimeout:60},theme:"light",callbacks:{onTotalScrollOffset:0,onTotalScrollBackOffset:0,alwaysTriggerOffsets:!0}},a=0,s={},l=window.attachEvent&&!window.addEventListener?1:0,c=!1,u=["mCSB_dragger_onDrag","mCSB_scrollTools_onDrag","mCS_img_loaded","mCS_disabled","mCS_destroyed","mCS_no_scrollbar","mCS-autoHide","mCS-dir-rtl","mCS_no_scrollbar_y","mCS_no_scrollbar_x","mCS_y_hidden","mCS_x_hidden","mCSB_draggerContainer","mCSB_buttonUp","mCSB_buttonDown","mCSB_buttonLeft","mCSB_buttonRight"],d={init:function(t){var t=e.extend(!0,{},o,t),n=p.call(this);if(t.live){var l=t.liveSelector||this.selector||r,c=e(l);if("off"===t.live)return void h(l);s[l]=setTimeout(function(){c.mCustomScrollbar(t),"once"===t.live&&c.length&&h(l)},500)}else h(l);return t.setWidth=t.set_width?t.set_width:t.setWidth,t.setHeight=t.set_height?t.set_height:t.setHeight,t.axis=t.horizontalScroll?"x":m(t.axis),t.scrollInertia=t.scrollInertia>0&&t.scrollInertia<17?17:t.scrollInertia,"object"!=typeof t.mouseWheel&&1==t.mouseWheel&&(t.mouseWheel={enable:!0,scrollAmount:"auto",axis:"y",preventDefault:!1,deltaFactor:"auto",normalizeDelta:!1,invert:!1}),t.mouseWheel.scrollAmount=t.mouseWheelPixels?t.mouseWheelPixels:t.mouseWheel.scrollAmount,t.mouseWheel.normalizeDelta=t.advanced.normalizeMouseWheelDelta?t.advanced.normalizeMouseWheelDelta:t.mouseWheel.normalizeDelta,t.scrollButtons.scrollType=g(t.scrollButtons.scrollType),f(t),e(n).each(function(){var n=e(this);if(!n.data(i)){n.data(i,{idx:++a,opt:t,scrollRatio:{y:null,x:null},overflowed:null,contentReset:{y:null,x:null},bindEvents:!1,tweenRunning:!1,sequential:{},langDir:n.css("direction"),cbOffsets:null,trigger:null,poll:{size:{o:0,n:0},img:{o:0,n:0},change:{o:0,n:0}}});var r=n.data(i),o=r.opt,s=n.data("mcs-axis"),l=n.data("mcs-scrollbar-position"),c=n.data("mcs-theme");s&&(o.axis=s),l&&(o.scrollbarPosition=l),c&&(o.theme=c,f(o)),v.call(this),r&&o.callbacks.onCreate&&"function"==typeof o.callbacks.onCreate&&o.callbacks.onCreate.call(this),e("#mCSB_"+r.idx+"_container img:not(."+u[2]+")").addClass(u[2]),d.update.call(null,n)}})},update:function(t,n){var r=t||p.call(this);return e(r).each(function(){var t=e(this);if(t.data(i)){var r=t.data(i),o=r.opt,a=e("#mCSB_"+r.idx+"_container"),s=e("#mCSB_"+r.idx),l=[e("#mCSB_"+r.idx+"_dragger_vertical"),e("#mCSB_"+r.idx+"_dragger_horizontal")];if(!a.length)return;r.tweenRunning&&X(t),n&&r&&o.callbacks.onBeforeUpdate&&"function"==typeof o.callbacks.onBeforeUpdate&&o.callbacks.onBeforeUpdate.call(this),t.hasClass(u[3])&&t.removeClass(u[3]),t.hasClass(u[4])&&t.removeClass(u[4]),s.css("max-height","none"),s.height()!==t.height()&&s.css("max-height",t.height()),b.call(this),"y"===o.axis||o.advanced.autoExpandHorizontalScroll||a.css("width",y(a)),r.overflowed=_.call(this),E.call(this),o.autoDraggerLength&&x.call(this),C.call(this),k.call(this);var c=[Math.abs(a[0].offsetTop),Math.abs(a[0].offsetLeft)];"x"!==o.axis&&(r.overflowed[0]?l[0].height()>l[0].parent().height()?T.call(this):(Y(t,c[0].toString(),{dir:"y",dur:0,overwrite:"none"}),r.contentReset.y=null):(T.call(this),"y"===o.axis?D.call(this):"yx"===o.axis&&r.overflowed[1]&&Y(t,c[1].toString(),{dir:"x",dur:0,overwrite:"none"}))),"y"!==o.axis&&(r.overflowed[1]?l[1].width()>l[1].parent().width()?T.call(this):(Y(t,c[1].toString(),{dir:"x",dur:0,overwrite:"none"}),r.contentReset.x=null):(T.call(this),"x"===o.axis?D.call(this):"yx"===o.axis&&r.overflowed[0]&&Y(t,c[0].toString(),{dir:"y",dur:0,overwrite:"none"}))),n&&r&&(2===n&&o.callbacks.onImageLoad&&"function"==typeof o.callbacks.onImageLoad?o.callbacks.onImageLoad.call(this):3===n&&o.callbacks.onSelectorChange&&"function"==typeof o.callbacks.onSelectorChange?o.callbacks.onSelectorChange.call(this):o.callbacks.onUpdate&&"function"==typeof o.callbacks.onUpdate&&o.callbacks.onUpdate.call(this)),V.call(this)}})},scrollTo:function(t,n){if(void 0!==t&&null!=t){var r=p.call(this);return e(r).each(function(){var r=e(this);if(r.data(i)){var o=r.data(i),a=o.opt,s={trigger:"external",scrollInertia:a.scrollInertia,scrollEasing:"mcsEaseInOut",moveDragger:!1,timeout:60,callbacks:!0,onStart:!0,onUpdate:!0,onComplete:!0},l=e.extend(!0,{},s,n),c=z.call(this,t),u=l.scrollInertia>0&&l.scrollInertia<17?17:l.scrollInertia;c[0]=W.call(this,c[0],"y"),c[1]=W.call(this,c[1],"x"),l.moveDragger&&(c[0]*=o.scrollRatio.y,c[1]*=o.scrollRatio.x),l.dur=ie()?0:u,setTimeout(function(){null!==c[0]&&void 0!==c[0]&&"x"!==a.axis&&o.overflowed[0]&&(l.dir="y",l.overwrite="all",Y(r,c[0].toString(),l)),null!==c[1]&&void 0!==c[1]&&"y"!==a.axis&&o.overflowed[1]&&(l.dir="x",l.overwrite="none",Y(r,c[1].toString(),l))},l.timeout)}})}},stop:function(){var t=p.call(this);return e(t).each(function(){var t=e(this);t.data(i)&&X(t)})},disable:function(t){var n=p.call(this);return e(n).each(function(){var n=e(this);n.data(i)&&(n.data(i),V.call(this,"remove"),D.call(this),t&&T.call(this),E.call(this,!0),n.addClass(u[3]))})},destroy:function(){var t=p.call(this);return e(t).each(function(){var r=e(this);if(r.data(i)){var o=r.data(i),a=o.opt,s=e("#mCSB_"+o.idx),l=e("#mCSB_"+o.idx+"_container"),c=e(".mCSB_"+o.idx+"_scrollbar");a.live&&h(a.liveSelector||e(t).selector),V.call(this,"remove"),D.call(this),T.call(this),r.removeData(i),K(this,"mcs"),c.remove(),l.find("img."+u[2]).removeClass(u[2]),s.replaceWith(l.contents()),r.removeClass(n+" _"+i+"_"+o.idx+" "+u[6]+" "+u[7]+" "+u[5]+" "+u[3]).addClass(u[4])}})}},p=function(){return"object"!=typeof e(this)||e(this).length<1?r:this},f=function(t){t.autoDraggerLength=!(e.inArray(t.theme,["rounded","rounded-dark","rounded-dots","rounded-dots-dark"])>-1)&&t.autoDraggerLength,t.autoExpandScrollbar=!(e.inArray(t.theme,["rounded-dots","rounded-dots-dark","3d","3d-dark","3d-thick","3d-thick-dark","inset","inset-dark","inset-2","inset-2-dark","inset-3","inset-3-dark"])>-1)&&t.autoExpandScrollbar,t.scrollButtons.enable=!(e.inArray(t.theme,["minimal","minimal-dark"])>-1)&&t.scrollButtons.enable,t.autoHideScrollbar=e.inArray(t.theme,["minimal","minimal-dark"])>-1||t.autoHideScrollbar,t.scrollbarPosition=e.inArray(t.theme,["minimal","minimal-dark"])>-1?"outside":t.scrollbarPosition},h=function(e){s[e]&&(clearTimeout(s[e]),K(s,e))},m=function(e){return"yx"===e||"xy"===e||"auto"===e?"yx":"x"===e||"horizontal"===e?"x":"y"},g=function(e){return"stepped"===e||"pixels"===e||"step"===e||"click"===e?"stepped":"stepless"},v=function(){var t=e(this),r=t.data(i),o=r.opt,a=o.autoExpandScrollbar?" "+u[1]+"_expand":"",s=["
            ","
            "],l="yx"===o.axis?"mCSB_vertical_horizontal":"x"===o.axis?"mCSB_horizontal":"mCSB_vertical",c="yx"===o.axis?s[0]+s[1]:"x"===o.axis?s[1]:s[0],d="yx"===o.axis?"
            ":"",p=o.autoHideScrollbar?" "+u[6]:"",f="x"!==o.axis&&"rtl"===r.langDir?" "+u[7]:"";o.setWidth&&t.css("width",o.setWidth),o.setHeight&&t.css("height",o.setHeight),o.setLeft="y"!==o.axis&&"rtl"===r.langDir?"989999px":o.setLeft,t.addClass(n+" _"+i+"_"+r.idx+p+f).wrapInner("
            ");var h=e("#mCSB_"+r.idx),m=e("#mCSB_"+r.idx+"_container");"y"===o.axis||o.advanced.autoExpandHorizontalScroll||m.css("width",y(m)),"outside"===o.scrollbarPosition?("static"===t.css("position")&&t.css("position","relative"),t.css("overflow","visible"),h.addClass("mCSB_outside").after(c)):(h.addClass("mCSB_inside").append(c),m.wrap(d)),w.call(this);var g=[e("#mCSB_"+r.idx+"_dragger_vertical"),e("#mCSB_"+r.idx+"_dragger_horizontal")];g[0].css("min-height",g[0].height()),g[1].css("min-width",g[1].width())},y=function(t){var n=[t[0].scrollWidth,Math.max.apply(Math,t.children().map(function(){return e(this).outerWidth(!0)}).get())],i=t.parent().width();return n[0]>i?n[0]:n[1]>i?n[1]:"100%"},b=function(){var t=e(this),n=t.data(i),r=n.opt,o=e("#mCSB_"+n.idx+"_container");if(r.advanced.autoExpandHorizontalScroll&&"y"!==r.axis){o.css({width:"auto","min-width":0,"overflow-x":"scroll"});var a=Math.ceil(o[0].scrollWidth);3===r.advanced.autoExpandHorizontalScroll||2!==r.advanced.autoExpandHorizontalScroll&&a>o.parent().width()?o.css({width:a,"min-width":"100%","overflow-x":"inherit"}):o.css({"overflow-x":"inherit",position:"absolute"}).wrap("
            ").css({width:Math.ceil(o[0].getBoundingClientRect().right+.4)-Math.floor(o[0].getBoundingClientRect().left),"min-width":"100%",position:"relative"}).unwrap()}},w=function(){var t=e(this),n=t.data(i),r=n.opt,o=e(".mCSB_"+n.idx+"_scrollbar:first"),a=te(r.scrollButtons.tabindex)?"tabindex='"+r.scrollButtons.tabindex+"'":"",s=["","","",""],l=["x"===r.axis?s[2]:s[0],"x"===r.axis?s[3]:s[1],s[2],s[3]];r.scrollButtons.enable&&o.prepend(l[0]).append(l[1]).next(".mCSB_scrollTools").prepend(l[2]).append(l[3])},x=function(){var t=e(this),n=t.data(i),r=e("#mCSB_"+n.idx),o=e("#mCSB_"+n.idx+"_container"),a=[e("#mCSB_"+n.idx+"_dragger_vertical"),e("#mCSB_"+n.idx+"_dragger_horizontal")],s=[r.height()/o.outerHeight(!1),r.width()/o.outerWidth(!1)],c=[parseInt(a[0].css("min-height")),Math.round(s[0]*a[0].parent().height()),parseInt(a[1].css("min-width")),Math.round(s[1]*a[1].parent().width())],u=l&&c[1]a&&(a=l),c>s&&(s=c),[a>r.height(),s>r.width()]},T=function(){var t=e(this),n=t.data(i),r=n.opt,o=e("#mCSB_"+n.idx),a=e("#mCSB_"+n.idx+"_container"),s=[e("#mCSB_"+n.idx+"_dragger_vertical"),e("#mCSB_"+n.idx+"_dragger_horizontal")];if(X(t),("x"!==r.axis&&!n.overflowed[0]||"y"===r.axis&&n.overflowed[0])&&(s[0].add(a).css("top",0),Y(t,"_resetY")),"y"!==r.axis&&!n.overflowed[1]||"x"===r.axis&&n.overflowed[1]){var l=dx=0;"rtl"===n.langDir&&(l=o.width()-a.outerWidth(!1),dx=Math.abs(l/n.scrollRatio.x)),a.css("left",l),s[1].css("left",dx),Y(t,"_resetX")}},k=function(){var t,n=e(this),r=n.data(i),o=r.opt;r.bindEvents||(O.call(this),o.contentTouchScroll&&I.call(this),P.call(this),o.mouseWheel.enable&&function i(){t=setTimeout(function(){e.event.special.mousewheel?(clearTimeout(t),$.call(n[0])):i()},100)}(),M.call(this),F.call(this),o.advanced.autoScrollOnFocus&&B.call(this),o.scrollButtons.enable&&q.call(this),o.keyboard.enable&&U.call(this),r.bindEvents=!0)},D=function(){var t=e(this),n=t.data(i),r=n.opt,o=i+"_"+n.idx,a=".mCSB_"+n.idx+"_scrollbar",s=e("#mCSB_"+n.idx+",#mCSB_"+n.idx+"_container,#mCSB_"+n.idx+"_container_wrapper,"+a+" ."+u[12]+",#mCSB_"+n.idx+"_dragger_vertical,#mCSB_"+n.idx+"_dragger_horizontal,"+a+">a"),l=e("#mCSB_"+n.idx+"_container");r.advanced.releaseDraggableSelectors&&s.add(e(r.advanced.releaseDraggableSelectors)),r.advanced.extraDraggableSelectors&&s.add(e(r.advanced.extraDraggableSelectors)),n.bindEvents&&(e(document).add(e(!j()||top.document)).unbind("."+o),s.each(function(){e(this).unbind("."+o)}),clearTimeout(t[0]._focusTimeout),K(t[0],"_focusTimeout"),clearTimeout(n.sequential.step),K(n.sequential,"step"),clearTimeout(l[0].onCompleteTimeout),K(l[0],"onCompleteTimeout"),n.bindEvents=!1)},E=function(t){var n=e(this),r=n.data(i),o=r.opt,a=e("#mCSB_"+r.idx+"_container_wrapper"),s=a.length?a:e("#mCSB_"+r.idx+"_container"),l=[e("#mCSB_"+r.idx+"_scrollbar_vertical"),e("#mCSB_"+r.idx+"_scrollbar_horizontal")],c=[l[0].find(".mCSB_dragger"),l[1].find(".mCSB_dragger")];"x"!==o.axis&&(r.overflowed[0]&&!t?(l[0].add(c[0]).add(l[0].children("a")).css("display","block"),s.removeClass(u[8]+" "+u[10])):(o.alwaysShowScrollbar?(2!==o.alwaysShowScrollbar&&c[0].css("display","none"),s.removeClass(u[10])):(l[0].css("display","none"),s.addClass(u[10])),s.addClass(u[8]))),"y"!==o.axis&&(r.overflowed[1]&&!t?(l[1].add(c[1]).add(l[1].children("a")).css("display","block"),s.removeClass(u[9]+" "+u[11])):(o.alwaysShowScrollbar?(2!==o.alwaysShowScrollbar&&c[1].css("display","none"),s.removeClass(u[11])):(l[1].css("display","none"),s.addClass(u[11])),s.addClass(u[9]))),r.overflowed[0]||r.overflowed[1]?n.removeClass(u[5]):n.addClass(u[5])},A=function(t){var n=t.type,i=t.target.ownerDocument!==document&&null!==frameElement?[e(frameElement).offset().top,e(frameElement).offset().left]:null,r=j()&&t.target.ownerDocument!==top.document&&null!==frameElement?[e(t.view.frameElement).offset().top,e(t.view.frameElement).offset().left]:[0,0];switch(n){case"pointerdown":case"MSPointerDown":case"pointermove":case"MSPointerMove":case"pointerup":case"MSPointerUp":return i?[t.originalEvent.pageY-i[0]+r[0],t.originalEvent.pageX-i[1]+r[1],!1]:[t.originalEvent.pageY,t.originalEvent.pageX,!1];case"touchstart":case"touchmove":case"touchend":var o=t.originalEvent.touches[0]||t.originalEvent.changedTouches[0],a=t.originalEvent.touches.length||t.originalEvent.changedTouches.length;return t.target.ownerDocument!==document?[o.screenY,o.screenX,a>1]:[o.pageY,o.pageX,a>1];default:return i?[t.pageY-i[0]+r[0],t.pageX-i[1]+r[1],!1]:[t.pageY,t.pageX,!1]}},O=function(){function t(e,t,i,r){if(f[0].idleTimer=u.scrollInertia<233?250:0,n.attr("id")===p[1])var o="x",l=(n[0].offsetLeft-t+r)*s.scrollRatio.x;else var o="y",l=(n[0].offsetTop-e+i)*s.scrollRatio.y;Y(a,l.toString(),{dir:o,drag:!0})}var n,r,o,a=e(this),s=a.data(i),u=s.opt,d=i+"_"+s.idx,p=["mCSB_"+s.idx+"_dragger_vertical","mCSB_"+s.idx+"_dragger_horizontal"],f=e("#mCSB_"+s.idx+"_container"),h=e("#"+p[0]+",#"+p[1]),m=u.advanced.releaseDraggableSelectors?h.add(e(u.advanced.releaseDraggableSelectors)):h,g=u.advanced.extraDraggableSelectors?e(!j()||top.document).add(e(u.advanced.extraDraggableSelectors)):e(!j()||top.document);h.bind("contextmenu."+d,function(e){e.preventDefault()}).bind("mousedown."+d+" touchstart."+d+" pointerdown."+d+" MSPointerDown."+d,function(t){if(t.stopImmediatePropagation(),t.preventDefault(),J(t)){c=!0,l&&(document.onselectstart=function(){return!1}),L.call(f,!1),X(a);var i=(n=e(this)).offset(),s=A(t)[0]-i.top,d=A(t)[1]-i.left,p=n.height()+i.top,h=n.width()+i.left;p>s&&s>0&&h>d&&d>0&&(r=s,o=d),S(n,"active",u.autoExpandScrollbar)}}).bind("touchmove."+d,function(e){e.stopImmediatePropagation(),e.preventDefault();var i=n.offset(),a=A(e)[0]-i.top,s=A(e)[1]-i.left;t(r,o,a,s)}),e(document).add(g).bind("mousemove."+d+" pointermove."+d+" MSPointerMove."+d,function(e){if(n){var i=n.offset(),a=A(e)[0]-i.top,s=A(e)[1]-i.left;if(r===a&&o===s)return;t(r,o,a,s)}}).add(m).bind("mouseup."+d+" touchend."+d+" pointerup."+d+" MSPointerUp."+d,function(){n&&(S(n,"active",u.autoExpandScrollbar),n=null),c=!1,l&&(document.onselectstart=null),L.call(f,!0)})},I=function(){function n(e){if(!ee(e)||c||A(e)[2])t=0;else{t=1,C=0,S=0,u=1,_.removeClass("mCS_touch_action");var n=O.offset();d=A(e)[0]-n.top,p=A(e)[1]-n.left,N=[A(e)[0],A(e)[1]]}}function r(e){if(ee(e)&&!c&&!A(e)[2]&&(k.documentTouchScroll||e.preventDefault(),e.stopImmediatePropagation(),(!S||C)&&u)){g=Q();var t=E.offset(),n=A(e)[0]-t.top,i=A(e)[1]-t.left,r="mcsLinearOut";if(P.push(n),$.push(i),N[2]=Math.abs(A(e)[0]-N[0]),N[3]=Math.abs(A(e)[1]-N[1]),T.overflowed[0])var o=I[0].parent().height()-I[0].height(),a=d-n>0&&n-d>-o*T.scrollRatio.y&&(2*N[3]0&&i-p>-s*T.scrollRatio.x&&(2*N[2]30)){var r="mcsEaseOut",o=2.5>(b=1e3/(v-m)),a=o?[P[P.length-2],$[$.length-2]]:[0,0];y=o?[n-a[0],i-a[1]]:[n-f,i-h];var d=[Math.abs(y[0]),Math.abs(y[1])];b=o?[Math.abs(y[0]/4),Math.abs(y[1]/4)]:[b,b];var p=[Math.abs(O[0].offsetTop)-y[0]*s(d[0]/b[0],b[0]),Math.abs(O[0].offsetLeft)-y[1]*s(d[1]/b[1],b[1])];w="yx"===k.axis?[p[0],p[1]]:"x"===k.axis?[null,p[1]]:[p[0],null],x=[4*d[0]+k.scrollInertia,4*d[1]+k.scrollInertia];var _=parseInt(k.contentTouchScroll)||0;w[0]=d[0]>_?w[0]:0,w[1]=d[1]>_?w[1]:0,T.overflowed[0]&&l(w[0],x[0],r,"y",L,!1),T.overflowed[1]&&l(w[1],x[1],r,"x",L,!1)}}}function s(e,t){var n=[1.5*t,2*t,t/1.5,t/2];return e>90?t>4?n[0]:n[3]:e>60?t>3?n[3]:n[2]:e>30?t>8?n[1]:t>6?n[0]:t>4?t:n[2]:t>8?t:n[3]}function l(e,t,n,i,r,o){e&&Y(_,e.toString(),{dur:t,scrollEasing:n,dir:i,overwrite:r,drag:o})}var u,d,p,f,h,m,g,v,y,b,w,x,C,S,_=e(this),T=_.data(i),k=T.opt,D=i+"_"+T.idx,E=e("#mCSB_"+T.idx),O=e("#mCSB_"+T.idx+"_container"),I=[e("#mCSB_"+T.idx+"_dragger_vertical"),e("#mCSB_"+T.idx+"_dragger_horizontal")],P=[],$=[],R=0,L="yx"===k.axis?"none":"all",N=[],M=O.find("iframe"),B=["touchstart."+D+" pointerdown."+D+" MSPointerDown."+D,"touchmove."+D+" pointermove."+D+" MSPointerMove."+D,"touchend."+D+" pointerup."+D+" MSPointerUp."+D],F=void 0!==document.body.style.touchAction&&""!==document.body.style.touchAction;O.bind(B[0],function(e){n(e)}).bind(B[1],function(e){r(e)}),E.bind(B[0],function(e){o(e)}).bind(B[2],function(e){a(e)}),M.length&&M.each(function(){e(this).bind("load",function(){j(this)&&e(this.contentDocument||this.contentWindow.document).bind(B[0],function(e){n(e),o(e)}).bind(B[1],function(e){r(e)}).bind(B[2],function(e){a(e)})})})},P=function(){function n(e,t,n){l.type=n&&r?"stepped":"stepless",l.scrollAmount=10,H(o,e,t,"mcsLinearOut",n?60:null)}var r,o=e(this),a=o.data(i),s=a.opt,l=a.sequential,u=i+"_"+a.idx,d=e("#mCSB_"+a.idx+"_container"),p=d.parent();d.bind("mousedown."+u,function(){t||r||(r=1,c=!0)}).add(document).bind("mousemove."+u,function(e){if(!t&&r&&(window.getSelection?window.getSelection().toString():document.selection&&"Control"!=document.selection.type&&document.selection.createRange().text)){var i=d.offset(),o=A(e)[0]-i.top+d[0].offsetTop,c=A(e)[1]-i.left+d[0].offsetLeft;o>0&&o0&&co?n("on",38):o>p.height()&&n("on",40)),"y"!==s.axis&&a.overflowed[1]&&(0>c?n("on",37):c>p.width()&&n("on",39)))}}).bind("mouseup."+u+" dragend."+u,function(){t||(r&&(r=0,n("off",null)),c=!1)})},$=function(){function t(t,i){if(X(n),!N(n,t.target)){var a="auto"!==o.mouseWheel.deltaFactor?parseInt(o.mouseWheel.deltaFactor):l&&t.deltaFactor<100?100:t.deltaFactor||100,u=o.scrollInertia;if("x"===o.axis||"x"===o.mouseWheel.axis)var d="x",p=[Math.round(a*r.scrollRatio.x),parseInt(o.mouseWheel.scrollAmount)],f="auto"!==o.mouseWheel.scrollAmount?p[1]:p[0]>=s.width()?.9*s.width():p[0],h=Math.abs(e("#mCSB_"+r.idx+"_container")[0].offsetLeft),m=c[1][0].offsetLeft,g=c[1].parent().width()-c[1].width(),v="y"===o.mouseWheel.axis?t.deltaY||i:t.deltaX;else var d="y",p=[Math.round(a*r.scrollRatio.y),parseInt(o.mouseWheel.scrollAmount)],f="auto"!==o.mouseWheel.scrollAmount?p[1]:p[0]>=s.height()?.9*s.height():p[0],h=Math.abs(e("#mCSB_"+r.idx+"_container")[0].offsetTop),m=c[0][0].offsetTop,g=c[0].parent().height()-c[0].height(),v=t.deltaY||i;"y"===d&&!r.overflowed[0]||"x"===d&&!r.overflowed[1]||((o.mouseWheel.invert||t.webkitDirectionInvertedFromDevice)&&(v=-v),o.mouseWheel.normalizeDelta&&(v=0>v?-1:1),(v>0&&0!==m||0>v&&m!==g||o.mouseWheel.preventDefault)&&(t.stopImmediatePropagation(),t.preventDefault()),t.deltaFactor<5&&!o.mouseWheel.normalizeDelta&&(f=t.deltaFactor,u=17),Y(n,(h-v*f).toString(),{dir:d,dur:u}))}}if(e(this).data(i)){var n=e(this),r=n.data(i),o=r.opt,a=i+"_"+r.idx,s=e("#mCSB_"+r.idx),c=[e("#mCSB_"+r.idx+"_dragger_vertical"),e("#mCSB_"+r.idx+"_dragger_horizontal")],u=e("#mCSB_"+r.idx+"_container").find("iframe");u.length&&u.each(function(){e(this).bind("load",function(){j(this)&&e(this.contentDocument||this.contentWindow.document).bind("mousewheel."+a,function(e,n){t(e,n)})})}),s.bind("mousewheel."+a,function(e,n){t(e,n)})}},R=new Object,j=function(t){var n=!1,i=!1,r=null;if(void 0===t?i="#empty":void 0!==e(t).attr("id")&&(i=e(t).attr("id")),!1!==i&&void 0!==R[i])return R[i];if(t){try{var o=t.contentDocument||t.contentWindow.document;r=o.body.innerHTML}catch(e){}n=null!==r}else{try{var o=top.document;r=o.body.innerHTML}catch(e){}n=null!==r}return!1!==i&&(R[i]=n),n},L=function(e){var t=this.find("iframe");if(t.length){var n=e?"auto":"none";t.css("pointer-events",n)}},N=function(t,n){var r=n.nodeName.toLowerCase(),o=t.data(i).opt.mouseWheel.disableOver;return e.inArray(r,o)>-1&&!(e.inArray(r,["select","textarea"])>-1&&!e(n).is(":focus"))},M=function(){var t,n=e(this),r=n.data(i),o=i+"_"+r.idx,a=e("#mCSB_"+r.idx+"_container"),s=a.parent(),l=e(".mCSB_"+r.idx+"_scrollbar ."+u[12]);l.bind("mousedown."+o+" touchstart."+o+" pointerdown."+o+" MSPointerDown."+o,function(n){c=!0,e(n.target).hasClass("mCSB_dragger")||(t=1)}).bind("touchend."+o+" pointerup."+o+" MSPointerUp."+o,function(){c=!1}).bind("click."+o,function(i){if(t&&(t=0,e(i.target).hasClass(u[12])||e(i.target).hasClass("mCSB_draggerRail"))){X(n);var o=e(this),l=o.find(".mCSB_dragger");if(o.parent(".mCSB_scrollTools_horizontal").length>0){if(!r.overflowed[1])return;var c="x",d=i.pageX>l.offset().left?-1:1,p=Math.abs(a[0].offsetLeft)-d*(.9*s.width())}else{if(!r.overflowed[0])return;var c="y",d=i.pageY>l.offset().top?-1:1,p=Math.abs(a[0].offsetTop)-d*(.9*s.height())}Y(n,p.toString(),{dir:c,scrollEasing:"mcsEaseInOut"})}})},B=function(){var t=e(this),n=t.data(i),r=n.opt,o=i+"_"+n.idx,a=e("#mCSB_"+n.idx+"_container"),s=a.parent();a.bind("focusin."+o,function(){var n=e(document.activeElement),i=a.find(".mCustomScrollBox").length;n.is(r.advanced.autoScrollOnFocus)&&(X(t),clearTimeout(t[0]._focusTimeout),t[0]._focusTimer=i?17*i:0,t[0]._focusTimeout=setTimeout(function(){var e=[ne(n)[0],ne(n)[1]],i=[a[0].offsetTop,a[0].offsetLeft],o=[i[0]+e[0]>=0&&i[0]+e[0]=0&&i[0]+e[1]a");l.bind("contextmenu."+a,function(e){e.preventDefault()}).bind("mousedown."+a+" touchstart."+a+" pointerdown."+a+" MSPointerDown."+a+" mouseup."+a+" touchend."+a+" pointerup."+a+" MSPointerUp."+a+" mouseout."+a+" pointerout."+a+" MSPointerOut."+a+" click."+a,function(i){function a(e,n){o.scrollAmount=r.scrollButtons.scrollAmount,H(t,e,n)}if(i.preventDefault(),J(i)){var s=e(this).attr("class");switch(o.type=r.scrollButtons.scrollType,i.type){case"mousedown":case"touchstart":case"pointerdown":case"MSPointerDown":if("stepped"===o.type)return;c=!0,n.tweenRunning=!1,a("on",s);break;case"mouseup":case"touchend":case"pointerup":case"MSPointerUp":case"mouseout":case"pointerout":case"MSPointerOut":if("stepped"===o.type)return;c=!1,o.dir&&a("off",s);break;case"click":if("stepped"!==o.type||n.tweenRunning)return;a("on",s)}}})},U=function(){function t(t){function i(e,t){a.type=o.keyboard.scrollType,a.scrollAmount=o.keyboard.scrollAmount,"stepped"===a.type&&r.tweenRunning||H(n,e,t)}switch(t.type){case"blur":r.tweenRunning&&a.dir&&i("off",null);break;case"keydown":case"keyup":var s=t.keyCode?t.keyCode:t.which,l="on";if("x"!==o.axis&&(38===s||40===s)||"y"!==o.axis&&(37===s||39===s)){if((38===s||40===s)&&!r.overflowed[0]||(37===s||39===s)&&!r.overflowed[1])return;"keyup"===t.type&&(l="off"),e(document.activeElement).is(d)||(t.preventDefault(),t.stopImmediatePropagation(),i(l,s))}else if(33===s||34===s){if((r.overflowed[0]||r.overflowed[1])&&(t.preventDefault(),t.stopImmediatePropagation()),"keyup"===t.type){X(n);var p=34===s?-1:1;if("x"===o.axis||"yx"===o.axis&&r.overflowed[1]&&!r.overflowed[0])var f="x",h=Math.abs(c[0].offsetLeft)-p*(.9*u.width());else var f="y",h=Math.abs(c[0].offsetTop)-p*(.9*u.height());Y(n,h.toString(),{dir:f,scrollEasing:"mcsEaseInOut"})}}else if((35===s||36===s)&&!e(document.activeElement).is(d)&&((r.overflowed[0]||r.overflowed[1])&&(t.preventDefault(),t.stopImmediatePropagation()),"keyup"===t.type)){if("x"===o.axis||"yx"===o.axis&&r.overflowed[1]&&!r.overflowed[0])var f="x",h=35===s?Math.abs(u.width()-c.outerWidth(!1)):0;else var f="y",h=35===s?Math.abs(u.height()-c.outerHeight(!1)):0;Y(n,h.toString(),{dir:f,scrollEasing:"mcsEaseInOut"})}}}var n=e(this),r=n.data(i),o=r.opt,a=r.sequential,s=i+"_"+r.idx,l=e("#mCSB_"+r.idx),c=e("#mCSB_"+r.idx+"_container"),u=c.parent(),d="input,textarea,select,datalist,keygen,[contenteditable='true']",p=c.find("iframe"),f=["blur."+s+" keydown."+s+" keyup."+s];p.length&&p.each(function(){e(this).bind("load",function(){j(this)&&e(this.contentDocument||this.contentWindow.document).bind(f[0],function(e){t(e)})})}),l.attr("tabindex","0").bind(f[0],function(e){t(e)})},H=function(t,n,r,o,a){function s(e){c.snapAmount&&(d.scrollAmount=c.snapAmount instanceof Array?"x"===d.dir[0]?c.snapAmount[1]:c.snapAmount[0]:c.snapAmount);var n="stepped"!==d.type,i=a||(e?n?h/1.5:m:1e3/60),r=e?n?7.5:40:2.5,u=[Math.abs(p[0].offsetTop),Math.abs(p[0].offsetLeft)],f=[l.scrollRatio.y>10?10:l.scrollRatio.y,l.scrollRatio.x>10?10:l.scrollRatio.x],g="x"===d.dir[0]?u[1]+d.dir[1]*(f[1]*r):u[0]+d.dir[1]*(f[0]*r),v="x"===d.dir[0]?u[1]+d.dir[1]*parseInt(d.scrollAmount):u[0]+d.dir[1]*parseInt(d.scrollAmount),y="auto"!==d.scrollAmount?v:g,b=o||(e?n?"mcsLinearOut":"mcsEaseInOut":"mcsLinear"),w=!!e;return e&&17>i&&(y="x"===d.dir[0]?u[1]:u[0]),Y(t,y.toString(),{dir:d.dir[0],scrollEasing:b,dur:i,onComplete:w}),e?void(d.dir=!1):(clearTimeout(d.step),void(d.step=setTimeout(function(){s()},i)))}var l=t.data(i),c=l.opt,d=l.sequential,p=e("#mCSB_"+l.idx+"_container"),f="stepped"===d.type,h=c.scrollInertia<26?26:c.scrollInertia,m=c.scrollInertia<1?17:c.scrollInertia;switch(n){case"on":if(d.dir=[r===u[16]||r===u[15]||39===r||37===r?"x":"y",r===u[13]||r===u[15]||38===r||37===r?-1:1],X(t),te(r)&&"stepped"===d.type)return;s(f);break;case"off":clearTimeout(d.step),K(d,"step"),X(t),(f||l.tweenRunning&&d.dir)&&s(!0)}},z=function(t){var n=e(this).data(i).opt,r=[];return"function"==typeof t&&(t=t()),t instanceof Array?r=t.length>1?[t[0],t[1]]:"x"===n.axis?[null,t[0]]:[t[0],null]:(r[0]=t.y?t.y:t.x||"x"===n.axis?null:t,r[1]=t.x?t.x:t.y||"y"===n.axis?null:t),"function"==typeof r[0]&&(r[0]=r[0]()),"function"==typeof r[1]&&(r[1]=r[1]()),r},W=function(t,n){if(null!=t&&void 0!==t){var r=e(this),o=r.data(i),a=o.opt,s=e("#mCSB_"+o.idx+"_container"),l=s.parent(),c=typeof t;n||(n="x"===a.axis?"x":"y");var u="x"===n?s.outerWidth(!1)-l.width():s.outerHeight(!1)-l.height(),p="x"===n?s[0].offsetLeft:s[0].offsetTop,f="x"===n?"left":"top";switch(c){case"function":return t();case"object":var h=t.jquery?t:e(t);if(!h.length)return;return"x"===n?ne(h)[1]:ne(h)[0];case"string":case"number":if(te(t))return Math.abs(t);if(-1!==t.indexOf("%"))return Math.abs(u*parseInt(t)/100);if(-1!==t.indexOf("-="))return Math.abs(p-parseInt(t.split("-=")[1]));if(-1!==t.indexOf("+=")){var m=p+parseInt(t.split("+=")[1]);return m>=0?0:Math.abs(m)}if(-1!==t.indexOf("px")&&te(t.split("px")[0]))return Math.abs(t.split("px")[0]);if("top"===t||"left"===t)return 0;if("bottom"===t)return Math.abs(l.height()-s.outerHeight(!1));if("right"===t)return Math.abs(l.width()-s.outerWidth(!1));if("first"===t||"last"===t){var h=s.find(":"+t);return"x"===n?ne(h)[1]:ne(h)[0]}return e(t).length?"x"===n?ne(e(t))[1]:ne(e(t))[0]:(s.css(f,t),void d.update.call(null,r[0]))}}},V=function(t){function n(e){clearTimeout(s[0].autoUpdate),d.update.call(null,r[0],e)}var r=e(this),o=r.data(i),a=o.opt,s=e("#mCSB_"+o.idx+"_container");return t?(clearTimeout(s[0].autoUpdate),void K(s[0],"autoUpdate")):void function t(){return clearTimeout(s[0].autoUpdate),0===r.parents("html").length?void(r=null):void(s[0].autoUpdate=setTimeout(function(){return a.advanced.updateOnSelectorChange&&(o.poll.change.n=function(){!0===a.advanced.updateOnSelectorChange&&(a.advanced.updateOnSelectorChange="*");var e=0,t=s.find(a.advanced.updateOnSelectorChange);return a.advanced.updateOnSelectorChange&&t.length>0&&t.each(function(){e+=this.offsetHeight+this.offsetWidth}),e}(),o.poll.change.n!==o.poll.change.o)?(o.poll.change.o=o.poll.change.n,void n(3)):a.advanced.updateOnContentResize&&(o.poll.size.n=r[0].scrollHeight+r[0].scrollWidth+s[0].offsetHeight+r[0].offsetHeight+r[0].offsetWidth,o.poll.size.n!==o.poll.size.o)?(o.poll.size.o=o.poll.size.n,void n(1)):!a.advanced.updateOnImageLoad||"auto"===a.advanced.updateOnImageLoad&&"y"===a.axis||(o.poll.img.n=s.find("img").length,o.poll.img.n===o.poll.img.o)?void((a.advanced.updateOnSelectorChange||a.advanced.updateOnContentResize||a.advanced.updateOnImageLoad)&&t()):(o.poll.img.o=o.poll.img.n,void s.find("img").each(function(){!function(t){if(e(t).hasClass(u[2]))n();else{var i=new Image;i.onload=function(e,t){return function(){return t.apply(e,arguments)}}(i,function(){this.onload=null,e(t).addClass(u[2]),n(2)}),i.src=t.src}}(this)}))},a.advanced.autoUpdateTimeout))}()},X=function(t){var n=t.data(i),r=e("#mCSB_"+n.idx+"_container,#mCSB_"+n.idx+"_container_wrapper,#mCSB_"+n.idx+"_dragger_vertical,#mCSB_"+n.idx+"_dragger_horizontal");r.each(function(){Z.call(this)})},Y=function(t,n,r){function o(e){return s&&l.callbacks[e]&&"function"==typeof l.callbacks[e]}function a(){var e=[p[0].offsetTop,p[0].offsetLeft],n=[v[0].offsetTop,v[0].offsetLeft],i=[p.outerHeight(!1),p.outerWidth(!1)],o=[d.height(),d.width()];t[0].mcs={content:p,top:e[0],left:e[1],draggerTop:n[0],draggerLeft:n[1],topPct:Math.round(100*Math.abs(e[0])/(Math.abs(i[0])-o[0])),leftPct:Math.round(100*Math.abs(e[1])/(Math.abs(i[1])-o[1])),direction:r.dir}}var s=t.data(i),l=s.opt,c={trigger:"internal",dir:"y",scrollEasing:"mcsEaseOut",drag:!1,dur:l.scrollInertia,overwrite:"all",callbacks:!0,onStart:!0,onUpdate:!0,onComplete:!0},r=e.extend(c,r),u=[r.dur,r.drag?0:r.dur],d=e("#mCSB_"+s.idx),p=e("#mCSB_"+s.idx+"_container"),f=p.parent(),h=l.callbacks.onTotalScrollOffset?z.call(t,l.callbacks.onTotalScrollOffset):[0,0],m=l.callbacks.onTotalScrollBackOffset?z.call(t,l.callbacks.onTotalScrollBackOffset):[0,0];if(s.trigger=r.trigger,0===f.scrollTop()&&0===f.scrollLeft()||(e(".mCSB_"+s.idx+"_scrollbar").css("visibility","visible"),f.scrollTop(0).scrollLeft(0)),"_resetY"!==n||s.contentReset.y||(o("onOverflowYNone")&&l.callbacks.onOverflowYNone.call(t[0]),s.contentReset.y=1),"_resetX"!==n||s.contentReset.x||(o("onOverflowXNone")&&l.callbacks.onOverflowXNone.call(t[0]),s.contentReset.x=1),"_resetY"!==n&&"_resetX"!==n){if(!s.contentReset.y&&t[0].mcs||!s.overflowed[0]||(o("onOverflowY")&&l.callbacks.onOverflowY.call(t[0]),s.contentReset.x=null),!s.contentReset.x&&t[0].mcs||!s.overflowed[1]||(o("onOverflowX")&&l.callbacks.onOverflowX.call(t[0]),s.contentReset.x=null),l.snapAmount){var g=l.snapAmount instanceof Array?"x"===r.dir?l.snapAmount[1]:l.snapAmount[0]:l.snapAmount;n=function(e,t,n){return Math.round(e/t)*t-n}(n,g,l.snapOffset)}switch(r.dir){case"x":var v=e("#mCSB_"+s.idx+"_dragger_horizontal"),y="left",b=p[0].offsetLeft,w=[d.width()-p.outerWidth(!1),v.parent().width()-v.width()],x=[n,0===n?0:n/s.scrollRatio.x],C=h[1],_=m[1],T=C>0?C/s.scrollRatio.x:0,k=_>0?_/s.scrollRatio.x:0;break;case"y":var v=e("#mCSB_"+s.idx+"_dragger_vertical"),y="top",b=p[0].offsetTop,w=[d.height()-p.outerHeight(!1),v.parent().height()-v.height()],x=[n,0===n?0:n/s.scrollRatio.y],C=h[0],_=m[0],T=C>0?C/s.scrollRatio.y:0,k=_>0?_/s.scrollRatio.y:0}x[1]<0||0===x[0]&&0===x[1]?x=[0,0]:x[1]>=w[1]?x=[w[0],w[1]]:x[0]=-x[0],t[0].mcs||(a(),o("onInit")&&l.callbacks.onInit.call(t[0])),clearTimeout(p[0].onCompleteTimeout),G(v[0],y,Math.round(x[1]),u[1],r.scrollEasing),!s.tweenRunning&&(0===b&&x[0]>=0||b===w[0]&&x[0]<=w[0])||G(p[0],y,Math.round(x[0]),u[0],r.scrollEasing,r.overwrite,{onStart:function(){r.callbacks&&r.onStart&&!s.tweenRunning&&(o("onScrollStart")&&(a(),l.callbacks.onScrollStart.call(t[0])),s.tweenRunning=!0,S(v),s.cbOffsets=[l.callbacks.alwaysTriggerOffsets||b>=w[0]+C,l.callbacks.alwaysTriggerOffsets||-_>=b])},onUpdate:function(){r.callbacks&&r.onUpdate&&o("whileScrolling")&&(a(),l.callbacks.whileScrolling.call(t[0]))},onComplete:function(){if(r.callbacks&&r.onComplete){"yx"===l.axis&&clearTimeout(p[0].onCompleteTimeout);var e=p[0].idleTimer||0;p[0].onCompleteTimeout=setTimeout(function(){o("onScroll")&&(a(),l.callbacks.onScroll.call(t[0])),o("onTotalScroll")&&x[1]>=w[1]-T&&s.cbOffsets[0]&&(a(),l.callbacks.onTotalScroll.call(t[0])),o("onTotalScrollBack")&&x[1]<=k&&s.cbOffsets[1]&&(a(),l.callbacks.onTotalScrollBack.call(t[0])),s.tweenRunning=!1,p[0].idleTimer=0,S(v,"hide")},e)}}})}},G=function(e,t,n,i,r,o,a){function s(){y.stop||(m||d.call(),m=Q()-h,l(),m>=y.time&&(y.time=m>y.time?m+c-(m-y.time):m+c-1,y.time0?(y.currVal=function(e,t,n,i,r){switch(r){case"linear":case"mcsLinear":return n*e/i+t;case"mcsLinearOut":return e/=i,e--,n*Math.sqrt(1-e*e)+t;case"easeInOutSmooth":return 1>(e/=i/2)?n/2*e*e+t:-n/2*(--e*(e-2)-1)+t;case"easeInOutStrong":return 1>(e/=i/2)?n/2*Math.pow(2,10*(e-1))+t:(e--,n/2*(2-Math.pow(2,-10*e))+t);case"easeInOut":case"mcsEaseInOut":return 1>(e/=i/2)?n/2*e*e*e+t:n/2*((e-=2)*e*e+2)+t;case"easeOutSmooth":return e/=i,-n*(--e*e*e*e-1)+t;case"easeOutStrong":return n*(1-Math.pow(2,-10*e/i))+t;case"easeOut":case"mcsEaseOut":default:var o=(e/=i)*e,a=o*e;return t+n*(.499999999999997*a*o+-2.5*o*o+5.5*a+-6.5*o+4*e)}}(y.time,g,b,i,r),v[t]=Math.round(y.currVal)+"px"):v[t]=n+"px",p.call()}e._mTween||(e._mTween={top:{},left:{}});var c,u,a=a||{},d=a.onStart||function(){},p=a.onUpdate||function(){},f=a.onComplete||function(){},h=Q(),m=0,g=e.offsetTop,v=e.style,y=e._mTween[t];"left"===t&&(g=e.offsetLeft);var b=n-g;y.stop=0,"none"!==o&&null!=y.id&&(window.requestAnimationFrame?window.cancelAnimationFrame(y.id):clearTimeout(y.id),y.id=null),c=1e3/60,y.time=m+c,u=window.requestAnimationFrame?window.requestAnimationFrame:function(e){return l(),setTimeout(e,.01)},y.id=u(s)},Q=function(){return window.performance&&window.performance.now?window.performance.now():window.performance&&window.performance.webkitNow?window.performance.webkitNow():Date.now?Date.now():(new Date).getTime()},Z=function(){var e=this;e._mTween||(e._mTween={top:{},left:{}});for(var t=["top","left"],n=0;n=0&&i[0]+ne(r)[0]=0&&i[1]+ne(r)[1]=0&&a[1]-o[1]*s[1][0]<0&&a[1]+r[1]-o[1]*s[1][1]>=0},mcsOverflow:e.expr[":"].mcsOverflow||function(t){var n=e(t).data(i);if(n)return n.overflowed[0]||n.overflowed[1]}})})}()}),function(e){"use strict";function t(t){return t.is('[type="checkbox"]')?t.prop("checked"):t.is('[type="radio"]')?!!e('[name="'+t.attr("name")+'"]:checked').length:t.is("select[multiple]")?(t.val()||[]).length:t.val()}function n(t){return this.each(function(){var n=e(this),r=e.extend({},i.DEFAULTS,n.data(),"object"==typeof t&&t),o=n.data("bs.validator");(o||"destroy"!=t)&&(o||n.data("bs.validator",o=new i(this,r)),"string"==typeof t&&o[t]())})}var i=function(n,r){this.options=r,this.validators=e.extend({},i.VALIDATORS,r.custom),this.$element=e(n),this.$btn=e('button[type="submit"], input[type="submit"]').filter('[form="'+this.$element.attr("id")+'"]').add(this.$element.find('input[type="submit"], button[type="submit"]')),this.update(),this.$element.on("input.bs.validator change.bs.validator focusout.bs.validator",e.proxy(this.onInput,this)),this.$element.on("submit.bs.validator",e.proxy(this.onSubmit,this)),this.$element.on("reset.bs.validator",e.proxy(this.reset,this)),this.$element.find("[data-match]").each(function(){var n=e(this),i=n.attr("data-match");e(i).on("input.bs.validator",function(){t(n)&&n.trigger("input.bs.validator")})}),this.$inputs.filter(function(){return t(e(this))&&!e(this).closest(".has-error").length}).trigger("focusout"),this.$element.attr("novalidate",!0)};i.VERSION="0.11.9",i.INPUT_SELECTOR=':input:not([type="hidden"], [type="submit"], [type="reset"], button)',i.FOCUS_OFFSET=20,i.DEFAULTS={delay:500,html:!1,disable:!0,focus:!0,custom:{},errors:{match:"Does not match",minlength:"Not long enough"},feedback:{success:"glyphicon-ok",error:"glyphicon-remove"}},i.VALIDATORS={native:function(e){var t=e[0];return t.checkValidity?!t.checkValidity()&&!t.validity.valid&&(t.validationMessage||"error!"):void 0},match:function(t){var n=t.attr("data-match");return t.val()!==e(n).val()&&i.DEFAULTS.errors.match},minlength:function(e){var t=e.attr("data-minlength");return e.val().length").addClass("list-unstyled").append(e.map(i,function(t){return e("
          • ")[n](t)})),void 0===o.data("bs.validator.originalContent")&&o.data("bs.validator.originalContent",o.html()),o.empty().append(i),r.addClass("has-error has-danger"),r.hasClass("has-feedback")&&a.removeClass(this.options.feedback.success)&&a.addClass(this.options.feedback.error)&&r.removeClass("has-success"))},i.prototype.clearErrors=function(e){var n=e.closest(".form-group"),i=n.find(".help-block.with-errors"),r=n.find(".form-control-feedback");i.html(i.data("bs.validator.originalContent")),n.removeClass("has-error has-danger has-success"),n.hasClass("has-feedback")&&r.removeClass(this.options.feedback.error)&&r.removeClass(this.options.feedback.success)&&t(e)&&r.addClass(this.options.feedback.success)&&n.addClass("has-success")},i.prototype.hasErrors=function(){return!!this.$inputs.filter(function(){return!!(e(this).data("bs.validator.errors")||[]).length}).length},i.prototype.isIncomplete=function(){return!!this.$inputs.filter("[required]").filter(function(){var n=t(e(this));return!("string"==typeof n?e.trim(n):n)}).length},i.prototype.onSubmit=function(e){this.validate(),(this.isIncomplete()||this.hasErrors())&&e.preventDefault()},i.prototype.toggleSubmit=function(){this.options.disable&&this.$btn.toggleClass("disabled",this.isIncomplete()||this.hasErrors())},i.prototype.defer=function(t,n){return n=e.proxy(n,this,t),this.options.delay?(window.clearTimeout(t.data("bs.validator.timeout")),void t.data("bs.validator.timeout",window.setTimeout(n,this.options.delay))):n()},i.prototype.reset=function(){return this.$element.find(".form-control-feedback").removeClass(this.options.feedback.error).removeClass(this.options.feedback.success),this.$inputs.removeData(["bs.validator.errors","bs.validator.deferred"]).each(function(){var t=e(this),n=t.data("bs.validator.timeout");window.clearTimeout(n)&&t.removeData("bs.validator.timeout")}),this.$element.find(".help-block.with-errors").each(function(){var t=e(this),n=t.data("bs.validator.originalContent");t.removeData("bs.validator.originalContent").html(n)}),this.$btn.removeClass("disabled"),this.$element.find(".has-error, .has-danger, .has-success").removeClass("has-error has-danger has-success"),this},i.prototype.destroy=function(){return this.reset(),this.$element.removeAttr("novalidate").removeData("bs.validator").off(".bs.validator"),this.$inputs.off(".bs.validator"),this.options=null,this.validators=null,this.$element=null,this.$btn=null,this.$inputs=null,this};var r=e.fn.validator;e.fn.validator=n,e.fn.validator.Constructor=i,e.fn.validator.noConflict=function(){return e.fn.validator=r,this},e(window).on("load",function(){e('form[data-toggle="validator"]').each(function(){var t=e(this);n.call(t,t.data())})})}(jQuery),define("validator",["jquery","bootstrap"],function(){}),function(e,t){"object"==typeof exports?module.exports=t(require("jquery")):"function"==typeof define&&define.amd?define("easyPieChart",["jquery"],t):t(e.jQuery)}(this,function(e){var t=function(e,t){var n,i=document.createElement("canvas");e.appendChild(i),"undefined"!=typeof G_vmlCanvasManager&&G_vmlCanvasManager.initElement(i);var r=i.getContext("2d");i.width=i.height=t.size;var o=1;window.devicePixelRatio>1&&(o=window.devicePixelRatio,i.style.width=i.style.height=[t.size,"px"].join(""),i.width=i.height=t.size*o,r.scale(o,o)),r.translate(t.size/2,t.size/2),r.rotate((t.rotate/180-.5)*Math.PI);var a=(t.size-t.lineWidth)/2;t.scaleColor&&t.scaleLength&&(a-=t.scaleLength+2),Date.now=Date.now||function(){return+new Date};var s=function(e,t,n){var i=0>=(n=Math.min(Math.max(-1,n||0),1));r.beginPath(),r.arc(0,0,a,0,2*Math.PI*n,i),r.strokeStyle=e,r.lineWidth=t,r.stroke()},l=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(e){window.setTimeout(e,1e3/60)},c=function(){t.scaleColor&&function(){var e,n;r.lineWidth=1,r.fillStyle=t.scaleColor,r.save();for(var i=24;i>0;--i)i%6==0?(n=t.scaleLength,e=0):(n=.6*t.scaleLength,e=t.scaleLength-n),r.fillRect(-t.size/2+e,0,n,1),r.rotate(Math.PI/12);r.restore()}(),t.trackColor&&s(t.trackColor,t.trackWidth||t.lineWidth,1)};this.getCanvas=function(){return i},this.getCtx=function(){return r},this.clear=function(){r.clearRect(t.size/-2,t.size/-2,t.size,t.size)},this.draw=function(e){var i;t.scaleColor||t.trackColor?r.getImageData&&r.putImageData?n?r.putImageData(n,0,0):(c(),n=r.getImageData(0,0,t.size*o,t.size*o)):(this.clear(),c()):this.clear(),r.lineCap=t.lineCap,i="function"==typeof t.barColor?t.barColor(e):t.barColor,s(i,t.lineWidth,e/100)}.bind(this),this.animate=function(e,n){var i=Date.now();t.onStart(e,n);var r=function(){var o=Math.min(Date.now()-i,t.animate.duration),a=t.easing(this,o,e,n-e,t.animate.duration);this.draw(a),t.onStep(e,n,a),o>=t.animate.duration?t.onStop(e,n):l(r)}.bind(this);l(r)}.bind(this)},n=function(e,n){var i={barColor:"#ef1e25",trackColor:"#f9f9f9",scaleColor:"#dfe0e0",scaleLength:5,lineCap:"round",lineWidth:3,trackWidth:void 0,size:110,rotate:0,animate:{duration:1e3,enabled:!0},easing:function(e,t,n,i,r){return 1>(t/=r/2)?i/2*t*t+n:-i/2*(--t*(t-2)-1)+n},onStart:function(){},onStep:function(){},onStop:function(){}};if(void 0!==t)i.renderer=t;else{if("undefined"==typeof SVGRenderer)throw new Error("Please load either the SVG- or the CanvasRenderer");i.renderer=SVGRenderer}var r={},o=0,a=function(){for(var t in this.el=e,this.options=r,i)i.hasOwnProperty(t)&&(r[t]=n&&void 0!==n[t]?n[t]:i[t],"function"==typeof r[t]&&(r[t]=r[t].bind(this)));r.easing="string"==typeof r.easing&&"undefined"!=typeof jQuery&&jQuery.isFunction(jQuery.easing[r.easing])?jQuery.easing[r.easing]:i.easing,"number"==typeof r.animate&&(r.animate={duration:r.animate,enabled:!0}),"boolean"!=typeof r.animate||r.animate||(r.animate={duration:1e3,enabled:r.animate}),this.renderer=new r.renderer(e,r),this.renderer.draw(o),e.dataset&&e.dataset.percent?this.update(parseFloat(e.dataset.percent)):e.getAttribute&&e.getAttribute("data-percent")&&this.update(parseFloat(e.getAttribute("data-percent")))}.bind(this);this.update=function(e){return e=parseFloat(e),r.animate.enabled?this.renderer.animate(o,e):this.renderer.draw(e),o=e,this}.bind(this),this.disableAnimation=function(){return r.animate.enabled=!1,this},this.enableAnimation=function(){return r.animate.enabled=!0,this},a()};e.fn.easyPieChart=function(t){return this.each(function(){var i;e.data(this,"easyPieChart")||(i=e.extend({},t,e(this).data()),e.data(this,"easyPieChart",new n(this,i)))})}}),function(e){"use strict";"function"==typeof define&&define.amd?define("hoverIntent",["jquery"],e):"object"==typeof module&&module.exports?module.exports=e(require("jquery")):jQuery&&!jQuery.fn.hoverIntent&&e(jQuery)}(function(e){"use strict";var t,n,i={interval:100,sensitivity:6,timeout:0},r=0,o=function(e){t=e.pageX,n=e.pageY},a=function(e,i,r,s){if(Math.sqrt((r.pX-t)*(r.pX-t)+(r.pY-n)*(r.pY-n))

          • '}),Confirmation.prototype=$.extend({},$.fn.popover.Constructor.prototype),Confirmation.prototype.constructor=Confirmation,Confirmation.prototype.getDefaults=function(){return Confirmation.DEFAULTS},Confirmation.prototype.setContent=function(){var e=this,t=this.tip(),n=this.getTitle(),i=t.find('[data-apply="confirmation"]'),r=t.find('[data-dismiss="confirmation"]');this.options,i.addClass(this.getBtnOkClass()).html(this.getBtnOkLabel()).prepend($("").addClass(this.getBtnOkIcon())," ").attr("href",this.getHref()).attr("target",this.getTarget()).off("click").on("click",function(t){if(e.runCallback(e.options.onConfirm,t,e.$element),"submit"==e.$element.attr("type")){var n=e.$element.closest("form");(void 0!==n.attr("novalidate")||n[0].checkValidity())&&n.submit()}e.hide(),e.inState.click=!1,e.$element.trigger($.Event("confirm.bs.confirmation"))}),r.addClass(this.getBtnCancelClass()).html(this.getBtnCancelLabel()).prepend($("").addClass(this.getBtnCancelIcon())," ").off("click").on("click",function(t){e.runCallback(e.options.onCancel,t,e.$element),e.hide(),e.inState.click=!1,e.$element.trigger($.Event("cancel.bs.confirmation"))}),t.find(".popover-title")[this.options.html?"html":"text"](n),t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},Confirmation.prototype.getBtnOkClass=function(){return this.$element.data("btnOkClass")||("function"==typeof this.options.btnOkClass?this.options.btnOkClass.call(this,this.$element):this.options.btnOkClass)},Confirmation.prototype.getBtnOkLabel=function(){return this.$element.data("btnOkLabel")||("function"==typeof this.options.btnOkLabel?this.options.btnOkLabel.call(this,this.$element):this.options.btnOkLabel)},Confirmation.prototype.getBtnOkIcon=function(){return this.$element.data("btnOkIcon")||("function"==typeof this.options.btnOkIcon?this.options.btnOkIcon.call(this,this.$element):this.options.btnOkIcon)},Confirmation.prototype.getBtnCancelClass=function(){return this.$element.data("btnCancelClass")||("function"==typeof this.options.btnCancelClass?this.options.btnCancelClass.call(this,this.$element):this.options.btnCancelClass)},Confirmation.prototype.getBtnCancelLabel=function(){return this.$element.data("btnCancelLabel")||("function"==typeof this.options.btnCancelLabel?this.options.btnCancelLabel.call(this,this.$element):this.options.btnCancelLabel)},Confirmation.prototype.getBtnCancelIcon=function(){return this.$element.data("btnCancelIcon")||("function"==typeof this.options.btnCancelIcon?this.options.btnCancelIcon.call(this,this.$element):this.options.btnCancelIcon)},Confirmation.prototype.getTitle=function(){return this.$element.data("confirmation-title")||this.$element.data("title")||this.$element.attr("title")||("function"==typeof this.options.title?this.options.title.call(this,this.$element):this.options.title)},Confirmation.prototype.getHref=function(){return this.$element.data("href")||this.$element.attr("href")||("function"==typeof this.options.href?this.options.href.call(this,this.$element):this.options.href)},Confirmation.prototype.getTarget=function(){return this.$element.data("target")||this.$element.attr("target")||("function"==typeof this.options.target?this.options.target.call(this,this.$element):this.options.target)},Confirmation.prototype.isPopout=function(){var e=this.$element.data("popout")||("function"==typeof this.options.popout?this.options.popout.call(this,this.$element):this.options.popout);return"false"==e&&(e=!1),e},Confirmation.prototype.runCallback=function(callback,event,element){"function"==typeof callback?callback.call(this,event,element):"string"==typeof callback&&eval(callback)};var old=$.fn.confirmation;$.fn.confirmation=function(e){var t=this;return this.each(function(){var n=$(this),i=n.data("bs.confirmation"),r="object"==typeof e&&e;(r=r||{}).all_selector=t.selector,(i||"destroy"!=e)&&(i||n.data("bs.confirmation",i=new Confirmation(this,r)),"string"==typeof e&&i[e]())})},$.fn.confirmation.Constructor=Confirmation,$.fn.confirmation.noConflict=function(){return $.fn.confirmation=old,this}}(jQuery),define("bootstrapConfirmation",["bootstrap"],function(){}),function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},this.defaults(),n),this.render()};t.VERSION="2.2.0",t.DEFAULTS={on:"On",off:"Off",onstyle:"primary",offstyle:"default",size:"normal",style:"",width:null,height:null},t.prototype.defaults=function(){return{on:this.$element.attr("data-on")||t.DEFAULTS.on,off:this.$element.attr("data-off")||t.DEFAULTS.off,onstyle:this.$element.attr("data-onstyle")||t.DEFAULTS.onstyle,offstyle:this.$element.attr("data-offstyle")||t.DEFAULTS.offstyle,size:this.$element.attr("data-size")||t.DEFAULTS.size,style:this.$element.attr("data-style")||t.DEFAULTS.style,width:this.$element.attr("data-width")||t.DEFAULTS.width,height:this.$element.attr("data-height")||t.DEFAULTS.height}},t.prototype.render=function(){this._onstyle="btn-"+this.options.onstyle,this._offstyle="btn-"+this.options.offstyle;var t="large"===this.options.size?"btn-lg":"small"===this.options.size?"btn-sm":"mini"===this.options.size?"btn-xs":"",n=e('
            ').append(n,i,r),a=e('
            ').addClass(this.$element.prop("checked")?this._onstyle:this._offstyle+" off").addClass(t).addClass(this.options.style);this.$element.wrap(a),e.extend(this,{$toggle:this.$element.parent(),$toggleOn:n,$toggleOff:i,$toggleGroup:o}),this.$toggle.append(o);var s=this.options.width||Math.max(n.outerWidth(),i.outerWidth())+r.outerWidth()/2,l=this.options.height||Math.max(n.outerHeight(),i.outerHeight());n.addClass("toggle-on"),i.addClass("toggle-off"),this.$toggle.css({width:s,height:l}),this.options.height&&(n.css("line-height",n.height()+"px"),i.css("line-height",i.height()+"px")),this.update(!0),this.trigger(!0)},t.prototype.toggle=function(){this.$element.prop("checked")?this.off():this.on()},t.prototype.on=function(e){return!this.$element.prop("disabled")&&(this.$toggle.removeClass(this._offstyle+" off").addClass(this._onstyle),this.$element.prop("checked",!0),void(e||this.trigger()))},t.prototype.off=function(e){return!this.$element.prop("disabled")&&(this.$toggle.removeClass(this._onstyle).addClass(this._offstyle+" off"),this.$element.prop("checked",!1),void(e||this.trigger()))},t.prototype.enable=function(){this.$toggle.removeAttr("disabled"),this.$element.prop("disabled",!1)},t.prototype.disable=function(){this.$toggle.attr("disabled","disabled"),this.$element.prop("disabled",!0)},t.prototype.update=function(e){this.$element.prop("disabled")?this.disable():this.enable(),this.$element.prop("checked")?this.on(e):this.off(e)},t.prototype.trigger=function(t){this.$element.off("change.bs.toggle"),t||this.$element.change(),this.$element.on("change.bs.toggle",e.proxy(function(){this.update()},this))},t.prototype.destroy=function(){this.$element.off("change.bs.toggle"),this.$toggleGroup.remove(),this.$element.removeData("bs.toggle"),this.$element.unwrap()};var n=e.fn.bootstrapToggle;e.fn.bootstrapToggle=function(n){return this.each(function(){var i=e(this),r=i.data("bs.toggle"),o="object"==typeof n&&n;r||i.data("bs.toggle",r=new t(this,o)),"string"==typeof n&&r[n]&&r[n]()})},e.fn.bootstrapToggle.Constructor=t,e.fn.toggle.noConflict=function(){return e.fn.bootstrapToggle=n,this},e(function(){e("input[type=checkbox][data-toggle^=toggle]").bootstrapToggle()}),e(document).on("click.bs.toggle","div[data-toggle^=toggle]",function(t){e(this).find("input[type=checkbox]").bootstrapToggle("toggle"),t.preventDefault()})}(jQuery),define("bootstrapToggle",["jquery"],function(){}),function(e){"function"==typeof define&&define.amd?define("select2",["jquery"],e):"object"==typeof module&&module.exports?module.exports=function(t,n){return void 0===n&&(n="undefined"!=typeof window?require("jquery"):require("jquery")(t)),e(n),n}:e(jQuery)}(function(e){var t=function(){if(e&&e.fn&&e.fn.select2&&e.fn.select2.amd)var t=e.fn.select2.amd;return function(){var e,n,i;t&&t.requirejs||(t?n=t:t={},function(t){function r(e,t){return b.call(e,t)}function o(e,t){var n,i,r,o,a,s,l,c,u,d,p,f=t&&t.split("/"),h=v.map,m=h&&h["*"]||{};if(e){for(a=(e=e.split("/")).length-1,v.nodeIdCompat&&x.test(e[a])&&(e[a]=e[a].replace(x,"")),"."===e[0].charAt(0)&&f&&(e=f.slice(0,f.length-1).concat(e)),u=0;u0&&(e.splice(u-1,2),u-=2)}e=e.join("/")}if((f||m)&&h){for(u=(n=e.split("/")).length;u>0;u-=1){if(i=n.slice(0,u).join("/"),f)for(d=f.length;d>0;d-=1)if((r=h[f.slice(0,d).join("/")])&&(r=r[i])){o=r,s=u;break}if(o)break;!l&&m&&m[i]&&(l=m[i],c=u)}!o&&l&&(o=l,s=c),o&&(n.splice(0,s,o),e=n.join("/"))}return e}function a(e,n){return function(){var i=w.call(arguments,0);return"string"!=typeof i[0]&&1===i.length&&i.push(null),p.apply(t,i.concat([e,n]))}}function s(e){return function(t){m[e]=t}}function l(e){if(r(g,e)){var n=g[e];delete g[e],y[e]=!0,d.apply(t,n)}if(!r(m,e)&&!r(y,e))throw new Error("No "+e);return m[e]}function c(e){var t,n=e?e.indexOf("!"):-1;return n>-1&&(t=e.substring(0,n),e=e.substring(n+1,e.length)),[t,e]}function u(e){return e?c(e):[]}var d,p,f,h,m={},g={},v={},y={},b=Object.prototype.hasOwnProperty,w=[].slice,x=/\.js$/;f=function(e,t){var n,i=c(e),r=i[0],a=t[1];return e=i[1],r&&(n=l(r=o(r,a))),r?e=n&&n.normalize?n.normalize(e,function(e){return function(t){return o(t,e)}}(a)):o(e,a):(r=(i=c(e=o(e,a)))[0],e=i[1],r&&(n=l(r))),{f:r?r+"!"+e:e,n:e,pr:r,p:n}},h={require:function(e){return a(e)},exports:function(e){var t=m[e];return void 0!==t?t:m[e]={}},module:function(e){return{id:e,uri:"",exports:m[e],config:function(e){return function(){return v&&v.config&&v.config[e]||{}}}(e)}}},d=function(e,n,i,o){var c,d,p,v,b,w,x,C=[],S=typeof i;if(w=u(o=o||e),"undefined"===S||"function"===S){for(n=!n.length&&i.length?["require","exports","module"]:n,b=0;b0&&(t.call(arguments,e.prototype.constructor),r=n.prototype.constructor),r.apply(this,arguments)}var r=t(n),o=t(e);n.displayName=e.displayName,i.prototype=new function(){this.constructor=i};for(var a=0;a":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},n.appendMany=function(t,n){if("1.7"===e.fn.jquery.substr(0,3)){var i=e();e.map(n,function(e){i=i.add(e)}),n=i}t.append(n)},n.__cache={};var r=0;return n.GetUniqueElementId=function(e){var t=e.getAttribute("data-select2-id");return null==t&&(e.id?(t=e.id,e.setAttribute("data-select2-id",t)):(e.setAttribute("data-select2-id",++r),t=r.toString())),t},n.StoreData=function(e,t,i){var r=n.GetUniqueElementId(e);n.__cache[r]||(n.__cache[r]={}),n.__cache[r][t]=i},n.GetData=function(t,i){var r=n.GetUniqueElementId(t);return i?n.__cache[r]&&null!=n.__cache[r][i]?n.__cache[r][i]:e(t).data(i):n.__cache[r]},n.RemoveData=function(e){var t=n.GetUniqueElementId(e);null!=n.__cache[t]&&delete n.__cache[t]},n}),t.define("select2/results",["jquery","./utils"],function(e,t){function n(e,t,i){this.$element=e,this.data=i,this.options=t,n.__super__.constructor.call(this)}return t.Extend(n,t.Observable),n.prototype.render=function(){var t=e('
              ');return this.options.get("multiple")&&t.attr("aria-multiselectable","true"),this.$results=t,t},n.prototype.clear=function(){this.$results.empty()},n.prototype.displayMessage=function(t){var n=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var i=e('
            • '),r=this.options.get("translations").get(t.message);i.append(n(r(t.args))),i[0].className+=" select2-results__message",this.$results.append(i)},n.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},n.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n0?t.first().trigger("mouseenter"):e.first().trigger("mouseenter"),this.ensureHighlightVisible()},n.prototype.setClasses=function(){var n=this;this.data.current(function(i){var r=e.map(i,function(e){return e.id.toString()});n.$results.find(".select2-results__option[aria-selected]").each(function(){var n=e(this),i=t.GetData(this,"data"),o=""+i.id;null!=i.element&&i.element.selected||null==i.element&&e.inArray(o,r)>-1?n.attr("aria-selected","true"):n.attr("aria-selected","false")})})},n.prototype.showLoading=function(e){this.hideLoading();var t={disabled:!0,loading:!0,text:this.options.get("translations").get("searching")(e)},n=this.option(t);n.className+=" loading-results",this.$results.prepend(n)},n.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},n.prototype.option=function(n){var i=document.createElement("li");i.className="select2-results__option";var r={role:"treeitem","aria-selected":"false"};for(var o in n.disabled&&(delete r["aria-selected"],r["aria-disabled"]="true"),null==n.id&&delete r["aria-selected"],null!=n._resultId&&(i.id=n._resultId),n.title&&(i.title=n.title),n.children&&(r.role="group",r["aria-label"]=n.text,delete r["aria-selected"]),r){var a=r[o];i.setAttribute(o,a)}if(n.children){var s=e(i),l=document.createElement("strong");l.className="select2-results__group",e(l),this.template(n,l);for(var c=[],u=0;u",{class:"select2-results__options select2-results__options--nested"});f.append(c),s.append(l),s.append(f)}else this.template(n,i);return t.StoreData(i,"data",n),i},n.prototype.bind=function(n,i){var r=this,o=n.id+"-results";this.$results.attr("id",o),n.on("results:all",function(e){r.clear(),r.append(e.data),n.isOpen()&&(r.setClasses(),r.highlightFirstItem())}),n.on("results:append",function(e){r.append(e.data),n.isOpen()&&r.setClasses()}),n.on("query",function(e){r.hideMessages(),r.showLoading(e)}),n.on("select",function(){n.isOpen()&&(r.setClasses(),r.highlightFirstItem())}),n.on("unselect",function(){n.isOpen()&&(r.setClasses(),r.highlightFirstItem())}),n.on("open",function(){r.$results.attr("aria-expanded","true"),r.$results.attr("aria-hidden","false"),r.setClasses(),r.ensureHighlightVisible()}),n.on("close",function(){r.$results.attr("aria-expanded","false"),r.$results.attr("aria-hidden","true"),r.$results.removeAttr("aria-activedescendant")}),n.on("results:toggle",function(){var e=r.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),n.on("results:select",function(){var e=r.getHighlightedResults();if(0!==e.length){var n=t.GetData(e[0],"data");"true"==e.attr("aria-selected")?r.trigger("close",{}):r.trigger("select",{data:n})}}),n.on("results:previous",function(){var e=r.getHighlightedResults(),t=r.$results.find("[aria-selected]"),n=t.index(e);if(!(n<=0)){var i=n-1;0===e.length&&(i=0);var o=t.eq(i);o.trigger("mouseenter");var a=r.$results.offset().top,s=o.offset().top,l=r.$results.scrollTop()+(s-a);0===i?r.$results.scrollTop(0):s-a<0&&r.$results.scrollTop(l)}}),n.on("results:next",function(){var e=r.getHighlightedResults(),t=r.$results.find("[aria-selected]"),n=t.index(e)+1;if(!(n>=t.length)){var i=t.eq(n);i.trigger("mouseenter");var o=r.$results.offset().top+r.$results.outerHeight(!1),a=i.offset().top+i.outerHeight(!1),s=r.$results.scrollTop()+a-o;0===n?r.$results.scrollTop(0):a>o&&r.$results.scrollTop(s)}}),n.on("results:focus",function(e){e.element.addClass("select2-results__option--highlighted")}),n.on("results:message",function(e){r.displayMessage(e)}),e.fn.mousewheel&&this.$results.on("mousewheel",function(e){var t=r.$results.scrollTop(),n=r.$results.get(0).scrollHeight-t+e.deltaY,i=e.deltaY>0&&t-e.deltaY<=0,o=e.deltaY<0&&n<=r.$results.height();i?(r.$results.scrollTop(0),e.preventDefault(),e.stopPropagation()):o&&(r.$results.scrollTop(r.$results.get(0).scrollHeight-r.$results.height()),e.preventDefault(),e.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(n){var i=e(this),o=t.GetData(this,"data");"true"!==i.attr("aria-selected")?r.trigger("select",{originalEvent:n,data:o}):r.options.get("multiple")?r.trigger("unselect",{originalEvent:n,data:o}):r.trigger("close",{})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(n){var i=t.GetData(this,"data");r.getHighlightedResults().removeClass("select2-results__option--highlighted"),r.trigger("results:focus",{data:i,element:e(this)})})},n.prototype.getHighlightedResults=function(){return this.$results.find(".select2-results__option--highlighted")},n.prototype.destroy=function(){this.$results.remove()},n.prototype.ensureHighlightVisible=function(){var e=this.getHighlightedResults();if(0!==e.length){var t=this.$results.find("[aria-selected]").index(e),n=this.$results.offset().top,i=e.offset().top,r=this.$results.scrollTop()+(i-n),o=i-n;r-=2*e.outerHeight(!1),t<=2?this.$results.scrollTop(0):(o>this.$results.outerHeight()||o<0)&&this.$results.scrollTop(r)}},n.prototype.template=function(t,n){var i=this.options.get("templateResult"),r=this.options.get("escapeMarkup"),o=i(t,n);null==o?n.style.display="none":"string"==typeof o?n.innerHTML=r(o):e(n).append(o)},n}),t.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),t.define("select2/selection/base",["jquery","../utils","../keys"],function(e,t,n){function i(e,t){this.$element=e,this.options=t,i.__super__.constructor.call(this)}return t.Extend(i,t.Observable),i.prototype.render=function(){var n=e('');return this._tabindex=0,null!=t.GetData(this.$element[0],"old-tabindex")?this._tabindex=t.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),n.attr("title",this.$element.attr("title")),n.attr("tabindex",this._tabindex),this.$selection=n,n},i.prototype.bind=function(e,t){var i=this,r=(e.id,e.id+"-results");this.container=e,this.$selection.on("focus",function(e){i.trigger("focus",e)}),this.$selection.on("blur",function(e){i._handleBlur(e)}),this.$selection.on("keydown",function(e){i.trigger("keypress",e),e.which===n.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){i.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){i.update(e.data)}),e.on("open",function(){i.$selection.attr("aria-expanded","true"),i.$selection.attr("aria-owns",r),i._attachCloseHandler(e)}),e.on("close",function(){i.$selection.attr("aria-expanded","false"),i.$selection.removeAttr("aria-activedescendant"),i.$selection.removeAttr("aria-owns"),i.$selection.focus(),window.setTimeout(function(){i.$selection.focus()},0),i._detachCloseHandler(e)}),e.on("enable",function(){i.$selection.attr("tabindex",i._tabindex)}),e.on("disable",function(){i.$selection.attr("tabindex","-1")})},i.prototype._handleBlur=function(t){var n=this;window.setTimeout(function(){document.activeElement==n.$selection[0]||e.contains(n.$selection[0],document.activeElement)||n.trigger("blur",t)},1)},i.prototype._attachCloseHandler=function(n){e(document.body).on("mousedown.select2."+n.id,function(n){var i=e(n.target).closest(".select2");e(".select2.select2-container--open").each(function(){e(this),this!=i[0]&&t.GetData(this,"element").select2("close")})})},i.prototype._detachCloseHandler=function(t){e(document.body).off("mousedown.select2."+t.id)},i.prototype.position=function(e,t){t.find(".selection").append(e)},i.prototype.destroy=function(){this._detachCloseHandler(this.container)},i.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},i}),t.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,n,i){function r(){r.__super__.constructor.apply(this,arguments)}return n.Extend(r,t),r.prototype.render=function(){var e=r.__super__.render.call(this);return e.addClass("select2-selection--single"),e.html(''),e},r.prototype.bind=function(e,t){var n=this;r.__super__.bind.apply(this,arguments);var i=e.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",i).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",i),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),e.on("focus",function(t){e.isOpen()||n.$selection.focus()})},r.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},r.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},r.prototype.selectionContainer=function(){return e("")},r.prototype.update=function(e){if(0!==e.length){var t=e[0],n=this.$selection.find(".select2-selection__rendered"),i=this.display(t,n);n.empty().append(i),n.attr("title",t.title||t.text)}else this.clear()},r}),t.define("select2/selection/multiple",["jquery","./base","../utils"],function(e,t,n){function i(e,t){i.__super__.constructor.apply(this,arguments)}return n.Extend(i,t),i.prototype.render=function(){var e=i.__super__.render.call(this);return e.addClass("select2-selection--multiple"),e.html('
                '),e},i.prototype.bind=function(t,r){var o=this;i.__super__.bind.apply(this,arguments),this.$selection.on("click",function(e){o.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(t){if(!o.options.get("disabled")){var i=e(this).parent(),r=n.GetData(i[0],"data");o.trigger("unselect",{originalEvent:t,data:r})}})},i.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},i.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},i.prototype.selectionContainer=function(){return e('
              • ×
              • ')},i.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],i=0;i1||n)return e.call(this,t);this.clear();var i=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(i)},t}),t.define("select2/selection/allowClear",["jquery","../keys","../utils"],function(e,t,n){function i(){}return i.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(e){i._handleClear(e)}),t.on("keypress",function(e){i._handleKeyboardClear(e,t)})},i.prototype._handleClear=function(e,t){if(!this.options.get("disabled")){var i=this.$selection.find(".select2-selection__clear");if(0!==i.length){t.stopPropagation();var r=n.GetData(i[0],"data"),o=this.$element.val();this.$element.val(this.placeholder.id);var a={data:r};if(this.trigger("clear",a),a.prevented)return void this.$element.val(o);for(var s=0;s0||0===i.length)){var r=e('×');n.StoreData(r[0],"data",i),this.$selection.find(".select2-selection__rendered").prepend(r)}},i}),t.define("select2/selection/search",["jquery","../utils","../keys"],function(e,t,n){function i(e,t,n){e.call(this,t,n)}return i.prototype.render=function(t){var n=e('');this.$searchContainer=n,this.$search=n.find("input");var i=t.call(this);return this._transferTabIndex(),i},i.prototype.bind=function(e,i,r){var o=this;e.call(this,i,r),i.on("open",function(){o.$search.trigger("focus")}),i.on("close",function(){o.$search.val(""),o.$search.removeAttr("aria-activedescendant"),o.$search.trigger("focus")}),i.on("enable",function(){o.$search.prop("disabled",!1),o._transferTabIndex()}),i.on("disable",function(){o.$search.prop("disabled",!0)}),i.on("focus",function(e){o.$search.trigger("focus")}),i.on("results:focus",function(e){o.$search.attr("aria-activedescendant",e.id)}),this.$selection.on("focusin",".select2-search--inline",function(e){o.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){o._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){if(e.stopPropagation(),o.trigger("keypress",e),o._keyUpPrevented=e.isDefaultPrevented(),e.which===n.BACKSPACE&&""===o.$search.val()){var i=o.$searchContainer.prev(".select2-selection__choice");if(i.length>0){var r=t.GetData(i[0],"data");o.searchRemoveChoice(r),e.preventDefault()}}});var a=document.documentMode,s=a&&a<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(e){s?o.$selection.off("input.search input.searchcheck"):o.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(e){if(s&&"input"===e.type)o.$selection.off("input.search input.searchcheck");else{var t=e.which;t!=n.SHIFT&&t!=n.CTRL&&t!=n.ALT&&t!=n.TAB&&o.handleSearch(e)}})},i.prototype._transferTabIndex=function(e){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},i.prototype.createPlaceholder=function(e,t){this.$search.attr("placeholder",t.text)},i.prototype.update=function(e,t){var n=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),e.call(this,t),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),n&&(this.$element.find("[data-select2-tag]").length?this.$element.focus():this.$search.focus())},i.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var e=this.$search.val();this.trigger("query",{term:e})}this._keyUpPrevented=!1},i.prototype.searchRemoveChoice=function(e,t){this.trigger("unselect",{data:t}),this.$search.val(t.text),this.handleSearch()},i.prototype.resizeSearch=function(){this.$search.css("width","25px");var e="";e=""!==this.$search.attr("placeholder")?this.$selection.find(".select2-selection__rendered").innerWidth():.75*(this.$search.val().length+1)+"em",this.$search.css("width",e)},i}),t.define("select2/selection/eventRelay",["jquery"],function(e){function t(){}return t.prototype.bind=function(t,n,i){var r=this,o=["open","opening","close","closing","select","selecting","unselect","unselecting","clear","clearing"],a=["opening","closing","selecting","unselecting","clearing"];t.call(this,n,i),n.on("*",function(t,n){if(-1!==e.inArray(t,o)){n=n||{};var i=e.Event("select2:"+t,{params:n});r.$element.trigger(i),-1!==e.inArray(t,a)&&(n.prevented=i.isDefaultPrevented())}})},t}),t.define("select2/translation",["jquery","require"],function(e,t){function n(e){this.dict=e||{}}return n.prototype.all=function(){return this.dict},n.prototype.get=function(e){return this.dict[e]},n.prototype.extend=function(t){this.dict=e.extend({},t.all(),this.dict)},n._cache={},n.loadPath=function(e){if(!(e in n._cache)){var i=t(e);n._cache[e]=i}return new n(n._cache[e])},n}),t.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"}}),t.define("select2/data/base",["../utils"],function(e){function t(e,n){t.__super__.constructor.call(this)}return e.Extend(t,e.Observable),t.prototype.current=function(e){throw new Error("The `current` method must be defined in child classes.")},t.prototype.query=function(e,t){throw new Error("The `query` method must be defined in child classes.")},t.prototype.bind=function(e,t){},t.prototype.destroy=function(){},t.prototype.generateResultId=function(t,n){var i=t.id+"-result-";return i+=e.generateChars(4),null!=n.id?i+="-"+n.id.toString():i+="-"+e.generateChars(4),i},t}),t.define("select2/data/select",["./base","../utils","jquery"],function(e,t,n){function i(e,t){this.$element=e,this.options=t,i.__super__.constructor.call(this)}return t.Extend(i,e),i.prototype.current=function(e){var t=[],i=this;this.$element.find(":selected").each(function(){var e=n(this),r=i.item(e);t.push(r)}),e(t)},i.prototype.select=function(e){var t=this;if(e.selected=!0,n(e.element).is("option"))return e.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current(function(i){var r=[];(e=[e]).push.apply(e,i);for(var o=0;o=0){var u=o.filter(i(c)),d=this.item(u),p=n.extend(!0,{},c,d),f=this.option(p);u.replaceWith(f)}else{var h=this.option(c);if(c.children){var m=this.convertToOptions(c.children);t.appendMany(h,m)}s.push(h)}}return s},i}),t.define("select2/data/ajax",["./array","../utils","jquery"],function(e,t,n){function i(e,t){this.ajaxOptions=this._applyDefaults(t.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),i.__super__.constructor.call(this,e,t)}return t.Extend(i,e),i.prototype._applyDefaults=function(e){var t={data:function(e){return n.extend({},e,{q:e.term})},transport:function(e,t,i){var r=n.ajax(e);return r.then(t),r.fail(i),r}};return n.extend({},t,e,!0)},i.prototype.processResults=function(e){return e},i.prototype.query=function(e,t){function i(){var i=o.transport(o,function(i){var o=r.processResults(i,e);r.options.get("debug")&&window.console&&console.error&&(o&&o.results&&n.isArray(o.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),t(o)},function(){"status"in i&&(0===i.status||"0"===i.status)||r.trigger("results:message",{message:"errorLoading"})});r._request=i}var r=this;null!=this._request&&(n.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var o=n.extend({type:"GET"},this.ajaxOptions);"function"==typeof o.url&&(o.url=o.url.call(this.$element,e)),"function"==typeof o.data&&(o.data=o.data.call(this.$element,e)),this.ajaxOptions.delay&&null!=e.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(i,this.ajaxOptions.delay)):i()},i}),t.define("select2/data/tags",["jquery"],function(e){function t(t,n,i){var r=i.get("tags"),o=i.get("createTag");void 0!==o&&(this.createTag=o);var a=i.get("insertTag");if(void 0!==a&&(this.insertTag=a),t.call(this,n,i),e.isArray(r))for(var s=0;s0&&t.term.length>this.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),t.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.query=function(e,t,n){var i=this;this.current(function(r){var o=null!=r?r.length:0;i.maximumSelectionLength>0&&o>=i.maximumSelectionLength?i.trigger("results:message",{message:"maximumSelected",args:{maximum:i.maximumSelectionLength}}):e.call(i,t,n)})},e}),t.define("select2/dropdown",["jquery","./utils"],function(e,t){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return t.Extend(n,t.Observable),n.prototype.render=function(){var t=e('');return t.attr("dir",this.options.get("dir")),this.$dropdown=t,t},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),t.define("select2/dropdown/search",["jquery","../utils"],function(e,t){function n(){}return n.prototype.render=function(t){var n=t.call(this),i=e('');return this.$searchContainer=i,this.$search=i.find("input"),n.prepend(i),n},n.prototype.bind=function(t,n,i){var r=this;t.call(this,n,i),this.$search.on("keydown",function(e){r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(t){e(this).off("keyup")}),this.$search.on("keyup input",function(e){r.handleSearch(e)}),n.on("open",function(){r.$search.attr("tabindex",0),r.$search.focus(),window.setTimeout(function(){r.$search.focus()},0)}),n.on("close",function(){r.$search.attr("tabindex",-1),r.$search.val(""),r.$search.blur()}),n.on("focus",function(){n.isOpen()||r.$search.focus()}),n.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(r.showSearch(e)?r.$searchContainer.removeClass("select2-search--hide"):r.$searchContainer.addClass("select2-search--hide"))})},n.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},n.prototype.showSearch=function(e,t){return!0},n}),t.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,i){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,i)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),i=t.length-1;i>=0;i--){var r=t[i];this.placeholder.id===r.id&&n.splice(i,1)}return n},e}),t.define("select2/dropdown/infiniteScroll",["jquery"],function(e){function t(e,t,n,i){this.lastParams={},e.call(this,t,n,i),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return t.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&this.$results.append(this.$loadingMore)},t.prototype.bind=function(t,n,i){var r=this;t.call(this,n,i),n.on("query",function(e){r.lastParams=e,r.loading=!0}),n.on("query:append",function(e){r.lastParams=e,r.loading=!0}),this.$results.on("scroll",function(){var t=e.contains(document.documentElement,r.$loadingMore[0]);!r.loading&&t&&r.$results.offset().top+r.$results.outerHeight(!1)+50>=r.$loadingMore.offset().top+r.$loadingMore.outerHeight(!1)&&r.loadMore()})},t.prototype.loadMore=function(){this.loading=!0;var t=e.extend({},{page:1},this.lastParams);t.page++,this.trigger("query:append",t)},t.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},t.prototype.createLoadingMore=function(){var t=e('
              • '),n=this.options.get("translations").get("loadingMore");return t.html(n(this.lastParams)),t},t}),t.define("select2/dropdown/attachBody",["jquery","../utils"],function(e,t){function n(t,n,i){this.$dropdownParent=i.get("dropdownParent")||e(document.body),t.call(this,n,i)}return n.prototype.bind=function(e,t,n){var i=this,r=!1;e.call(this,t,n),t.on("open",function(){i._showDropdown(),i._attachPositioningHandler(t),r||(r=!0,t.on("results:all",function(){i._positionDropdown(),i._resizeDropdown()}),t.on("results:append",function(){i._positionDropdown(),i._resizeDropdown()}))}),t.on("close",function(){i._hideDropdown(),i._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},n.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},n.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},n.prototype.render=function(t){var n=e(""),i=t.call(this);return n.append(i),this.$dropdownContainer=n,n},n.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},n.prototype._attachPositioningHandler=function(n,i){var r=this,o="scroll.select2."+i.id,a="resize.select2."+i.id,s="orientationchange.select2."+i.id,l=this.$container.parents().filter(t.hasScroll);l.each(function(){t.StoreData(this,"select2-scroll-position",{x:e(this).scrollLeft(),y:e(this).scrollTop()})}),l.on(o,function(n){var i=t.GetData(this,"select2-scroll-position");e(this).scrollTop(i.y)}),e(window).on(o+" "+a+" "+s,function(e){r._positionDropdown(),r._resizeDropdown()})},n.prototype._detachPositioningHandler=function(n,i){var r="scroll.select2."+i.id,o="resize.select2."+i.id,a="orientationchange.select2."+i.id;this.$container.parents().filter(t.hasScroll).off(r),e(window).off(r+" "+o+" "+a)},n.prototype._positionDropdown=function(){var t=e(window),n=this.$dropdown.hasClass("select2-dropdown--above"),i=this.$dropdown.hasClass("select2-dropdown--below"),r=null,o=this.$container.offset();o.bottom=o.top+this.$container.outerHeight(!1);var a={height:this.$container.outerHeight(!1)};a.top=o.top,a.bottom=o.top+a.height;var s=this.$dropdown.outerHeight(!1),l=t.scrollTop(),c=t.scrollTop()+t.height(),u=lo.bottom+s,p={left:o.left,top:a.bottom},f=this.$dropdownParent;"static"===f.css("position")&&(f=f.offsetParent());var h=f.offset();p.top-=h.top,p.left-=h.left,n||i||(r="below"),d||!u||n?!u&&d&&n&&(r="below"):r="above",("above"==r||n&&"below"!==r)&&(p.top=a.top-h.top-s),null!=r&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+r),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+r)),this.$dropdownContainer.css(p)},n.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},n.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},n}),t.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,i){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,i)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,i=0;i0&&(d.dataAdapter=c.Decorate(d.dataAdapter,v)),d.maximumInputLength>0&&(d.dataAdapter=c.Decorate(d.dataAdapter,y)),d.maximumSelectionLength>0&&(d.dataAdapter=c.Decorate(d.dataAdapter,b)),d.tags&&(d.dataAdapter=c.Decorate(d.dataAdapter,m)),null==d.tokenSeparators&&null==d.tokenizer||(d.dataAdapter=c.Decorate(d.dataAdapter,g)),null!=d.query){var E=t(d.amdBase+"compat/query");d.dataAdapter=c.Decorate(d.dataAdapter,E)}if(null!=d.initSelection){var A=t(d.amdBase+"compat/initSelection");d.dataAdapter=c.Decorate(d.dataAdapter,A)}}if(null==d.resultsAdapter&&(d.resultsAdapter=n,null!=d.ajax&&(d.resultsAdapter=c.Decorate(d.resultsAdapter,S)),null!=d.placeholder&&(d.resultsAdapter=c.Decorate(d.resultsAdapter,C)),d.selectOnClose&&(d.resultsAdapter=c.Decorate(d.resultsAdapter,k))),null==d.dropdownAdapter){if(d.multiple)d.dropdownAdapter=w;else{var O=c.Decorate(w,x);d.dropdownAdapter=O}if(0!==d.minimumResultsForSearch&&(d.dropdownAdapter=c.Decorate(d.dropdownAdapter,T)),d.closeOnSelect&&(d.dropdownAdapter=c.Decorate(d.dropdownAdapter,D)),null!=d.dropdownCssClass||null!=d.dropdownCss||null!=d.adaptDropdownCssClass){var I=t(d.amdBase+"compat/dropdownCss");d.dropdownAdapter=c.Decorate(d.dropdownAdapter,I)}d.dropdownAdapter=c.Decorate(d.dropdownAdapter,_)}if(null==d.selectionAdapter){if(d.multiple?d.selectionAdapter=r:d.selectionAdapter=i,null!=d.placeholder&&(d.selectionAdapter=c.Decorate(d.selectionAdapter,o)),d.allowClear&&(d.selectionAdapter=c.Decorate(d.selectionAdapter,a)),d.multiple&&(d.selectionAdapter=c.Decorate(d.selectionAdapter,s)),null!=d.containerCssClass||null!=d.containerCss||null!=d.adaptContainerCssClass){var P=t(d.amdBase+"compat/containerCss");d.selectionAdapter=c.Decorate(d.selectionAdapter,P)}d.selectionAdapter=c.Decorate(d.selectionAdapter,l)}if("string"==typeof d.language)if(d.language.indexOf("-")>0){var $=d.language.split("-")[0];d.language=[d.language,$]}else d.language=[d.language];if(e.isArray(d.language)){var R=new u;d.language.push("en");for(var j=d.language,L=0;L0){for(var o=e.extend(!0,{},r),a=r.children.length-1;a>=0;a--)null==n(i,r.children[a])&&o.children.splice(a,1);return o.children.length>0?o:n(i,o)}var s=t(r.text).toUpperCase(),l=t(i.term).toUpperCase();return s.indexOf(l)>-1?r:null},minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(e){return e},templateResult:function(e){return e.text},templateSelection:function(e){return e.text},theme:"default",width:"resolve"}},A.prototype.set=function(t,n){var i={};i[e.camelCase(t)]=n;var r=c._convertData(i);e.extend(!0,this.defaults,r)},new A}),t.define("select2/options",["require","jquery","./defaults","./utils"],function(e,t,n,i){function r(t,r){if(this.options=t,null!=r&&this.fromElement(r),this.options=n.apply(this.options),r&&r.is("input")){var o=e(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=i.Decorate(this.options.dataAdapter,o)}}return r.prototype.fromElement=function(e){var n=["select2"];null==this.options.multiple&&(this.options.multiple=e.prop("multiple")),null==this.options.disabled&&(this.options.disabled=e.prop("disabled")),null==this.options.language&&(e.prop("lang")?this.options.language=e.prop("lang").toLowerCase():e.closest("[lang]").prop("lang")&&(this.options.language=e.closest("[lang]").prop("lang"))),null==this.options.dir&&(e.prop("dir")?this.options.dir=e.prop("dir"):e.closest("[dir]").prop("dir")?this.options.dir=e.closest("[dir]").prop("dir"):this.options.dir="ltr"),e.prop("disabled",this.options.disabled),e.prop("multiple",this.options.multiple),i.GetData(e[0],"select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),i.StoreData(e[0],"data",i.GetData(e[0],"select2Tags")),i.StoreData(e[0],"tags",!0)),i.GetData(e[0],"ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),e.attr("ajax--url",i.GetData(e[0],"ajaxUrl")),i.StoreData(e[0],"ajax-Url",i.GetData(e[0],"ajaxUrl")));var r;r=t.fn.jquery&&"1."==t.fn.jquery.substr(0,2)&&e[0].dataset?t.extend(!0,{},e[0].dataset,i.GetData(e[0])):i.GetData(e[0]);var o=t.extend(!0,{},r);for(var a in o=i._convertData(o))t.inArray(a,n)>-1||(t.isPlainObject(this.options[a])?t.extend(this.options[a],o[a]):this.options[a]=o[a]);return this},r.prototype.get=function(e){return this.options[e]},r.prototype.set=function(e,t){this.options[e]=t},r}),t.define("select2/core",["jquery","./options","./utils","./keys"],function(e,t,n,i){var r=function(e,i){null!=n.GetData(e[0],"select2")&&n.GetData(e[0],"select2").destroy(),this.$element=e,this.id=this._generateId(e),i=i||{},this.options=new t(i,e),r.__super__.constructor.call(this);var o=e.attr("tabindex")||0;n.StoreData(e[0],"old-tabindex",o),e.attr("tabindex","-1");var a=this.options.get("dataAdapter");this.dataAdapter=new a(e,this.options);var s=this.render();this._placeContainer(s);var l=this.options.get("selectionAdapter");this.selection=new l(e,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,s);var c=this.options.get("dropdownAdapter");this.dropdown=new c(e,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,s);var u=this.options.get("resultsAdapter");this.results=new u(e,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var d=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(e){d.trigger("selection:update",{data:e})}),e.addClass("select2-hidden-accessible"),e.attr("aria-hidden","true"),this._syncAttributes(),n.StoreData(e[0],"select2",this),e.data("select2",this)};return n.Extend(r,n.Observable),r.prototype._generateId=function(e){return"select2-"+(null!=e.attr("id")?e.attr("id"):null!=e.attr("name")?e.attr("name")+"-"+n.generateChars(2):n.generateChars(4)).replace(/(:|\.|\[|\]|,)/g,"")},r.prototype._placeContainer=function(e){e.insertAfter(this.$element);var t=this._resolveWidth(this.$element,this.options.get("width"));null!=t&&e.css("width",t)},r.prototype._resolveWidth=function(e,t){var n=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==t){var i=this._resolveWidth(e,"style");return null!=i?i:this._resolveWidth(e,"element")}if("element"==t){var r=e.outerWidth(!1);return r<=0?"auto":r+"px"}if("style"==t){var o=e.attr("style");if("string"!=typeof o)return null;for(var a=o.split(";"),s=0,l=a.length;s=1)return c[1]}return null}return t},r.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},r.prototype._registerDomEvents=function(){var t=this;this.$element.on("change.select2",function(){t.dataAdapter.current(function(e){t.trigger("selection:update",{data:e})})}),this.$element.on("focus.select2",function(e){t.trigger("focus",e)}),this._syncA=n.bind(this._syncAttributes,this),this._syncS=n.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var i=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=i?(this._observer=new i(function(n){e.each(n,t._syncA),e.each(n,t._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",t._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",t._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",t._syncS,!1))},r.prototype._registerDataEvents=function(){var e=this;this.dataAdapter.on("*",function(t,n){e.trigger(t,n)})},r.prototype._registerSelectionEvents=function(){var t=this,n=["toggle","focus"];this.selection.on("toggle",function(){t.toggleDropdown()}),this.selection.on("focus",function(e){t.focus(e)}),this.selection.on("*",function(i,r){-1===e.inArray(i,n)&&t.trigger(i,r)})},r.prototype._registerDropdownEvents=function(){var e=this;this.dropdown.on("*",function(t,n){e.trigger(t,n)})},r.prototype._registerResultsEvents=function(){var e=this;this.results.on("*",function(t,n){e.trigger(t,n)})},r.prototype._registerEvents=function(){var e=this;this.on("open",function(){e.$container.addClass("select2-container--open")}),this.on("close",function(){e.$container.removeClass("select2-container--open")}),this.on("enable",function(){e.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){e.$container.addClass("select2-container--disabled")}),this.on("blur",function(){e.$container.removeClass("select2-container--focus")}),this.on("query",function(t){e.isOpen()||e.trigger("open",{}),this.dataAdapter.query(t,function(n){e.trigger("results:all",{data:n,query:t})})}),this.on("query:append",function(t){this.dataAdapter.query(t,function(n){e.trigger("results:append",{data:n,query:t})})}),this.on("keypress",function(t){var n=t.which;e.isOpen()?n===i.ESC||n===i.TAB||n===i.UP&&t.altKey?(e.close(),t.preventDefault()):n===i.ENTER?(e.trigger("results:select",{}),t.preventDefault()):n===i.SPACE&&t.ctrlKey?(e.trigger("results:toggle",{}),t.preventDefault()):n===i.UP?(e.trigger("results:previous",{}),t.preventDefault()):n===i.DOWN&&(e.trigger("results:next",{}),t.preventDefault()):(n===i.ENTER||n===i.SPACE||n===i.DOWN&&t.altKey)&&(e.open(),t.preventDefault())})},r.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},r.prototype._syncSubtree=function(e,t){var n=!1,i=this;if(!e||!e.target||"OPTION"===e.target.nodeName||"OPTGROUP"===e.target.nodeName){if(t)if(t.addedNodes&&t.addedNodes.length>0)for(var r=0;r0&&(n=!0);else n=!0;n&&this.dataAdapter.current(function(e){i.trigger("selection:update",{data:e})})}},r.prototype.trigger=function(e,t){var n=r.__super__.trigger,i={open:"opening",close:"closing",select:"selecting",unselect:"unselecting",clear:"clearing"};if(void 0===t&&(t={}),e in i){var o=i[e],a={prevented:!1,name:e,args:t};if(n.call(this,o,a),a.prevented)return void(t.prevented=!0)}n.call(this,e,t)},r.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},r.prototype.open=function(){this.isOpen()||this.trigger("query",{})},r.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},r.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},r.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},r.prototype.focus=function(e){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},r.prototype.enable=function(e){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),null!=e&&0!==e.length||(e=[!0]);var t=!e[0];this.$element.prop("disabled",t)},r.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var e=[];return this.dataAdapter.current(function(t){e=t}),e},r.prototype.val=function(t){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==t||0===t.length)return this.$element.val();var n=t[0];e.isArray(n)&&(n=e.map(n,function(e){return e.toString()})),this.$element.val(n).trigger("change")},r.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",n.GetData(this.$element[0],"old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),n.RemoveData(this.$element[0]),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},r.prototype.render=function(){var t=e('');return t.attr("dir",this.options.get("dir")),this.$container=t,this.$container.addClass("select2-container--"+this.options.get("theme")),n.StoreData(t[0],"element",this.$element),t},r}),t.define("jquery-mousewheel",["jquery"],function(e){return e}),t.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(e,t,n,i,r){if(null==e.fn.select2){var o=["open","close","destroy"];e.fn.select2=function(t){if("object"==typeof(t=t||{}))return this.each(function(){var i=e.extend(!0,{},t);new n(e(this),i)}),this;if("string"==typeof t){var i,a=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=r.GetData(this,"select2");null==e&&window.console&&console.error&&console.error("The select2('"+t+"') method was called on an element that is not using Select2."),i=e[t].apply(e,a)}),e.inArray(t,o)>-1?this:i}throw new Error("Invalid arguments for Select2: "+t)}}return null==e.fn.select2.defaults&&(e.fn.select2.defaults=i),n}),{define:t.define,require:t.require}}(),n=t.require("jquery.select2");return e.fn.select2.amd=t,n}),define("app/util",["jquery","app/init","app/lib/prototypes","app/lib/console","conf/system_effect","conf/signature_type","bootbox","localForage","lazyload","velocity","velocityUI","customScrollbar","validator","easyPieChart","hoverIntent","bootstrapConfirmation","bootstrapToggle","select2"],(e,t,n,i,r,o,a,s)=>{"use strict";let l,c={ajaxOverlayClass:"pf-loading-overlay",ajaxOverlayWrapperClass:"pf-loading-overlay-wrapper",noScrollClass:"no-scroll",formEditableFieldClass:"pf-editable",formErrorContainerClass:"pf-dialog-error-container",formWarningContainerClass:"pf-dialog-warning-container",formInfoContainerClass:"pf-dialog-info-container",headMapTrackingId:"pf-head-map-tracking",headUserLocationId:"pf-head-user-location",menuButtonFullScreenId:"pf-menu-button-fullscreen",menuButtonMagnetizerId:"pf-menu-button-magnetizer",menuButtonGridId:"pf-menu-button-grid",menuButtonEndpointId:"pf-menu-button-endpoint",menuButtonCompactId:"pf-menu-button-compact",menuButtonMapDeleteId:"pf-menu-button-map-delete",footerId:"pf-footer",footerCenterClass:"pf-footer-center",globalInfoPanelId:"pf-global-info",settingsMessageVelocityOptions:{duration:180},dialogClass:"modal-dialog",mapModuleId:"pf-map-module",mapTabBarId:"pf-map-tabs",mapWrapperClass:"pf-map-wrapper",mapClass:"pf-map",userStatusClass:"pf-user-status",dynamicAreaClass:"pf-dynamic-area",select2Class:"pf-select2",select2ImageLazyLoadClass:"pf-select2-image-lazyLoad",animationPulseClassPrefix:"pf-animation-pulse-",popoverClass:"pf-popover",popoverTriggerClass:"pf-popover-trigger",popoverSmallClass:"popover-small",popoverCharacterClass:"pf-popover-character",popoverListIconClass:"pf-popover-list-icon",summernoteClass:"pf-summernote",helpDefaultClass:"pf-help-default",helpClass:"pf-help",fontTriglivianClass:"pf-triglivian"},u={},d={};e.fn.showLoadingAnimation=function(t){return this.each(function(){let n=e(this),i="fa-lg";n.css("pointer-events","none"),t&&t.icon&&t.icon.size&&(i=t.icon.size);let r=e("
                ",{class:c.ajaxOverlayClass}).append(e("
                ",{class:[c.ajaxOverlayWrapperClass].join(" ")}).append(e("",{class:["fas",i,"fa-sync","fa-spin"].join(" ")})));n.append(r),e(r).velocity({opacity:.6},{duration:120})})},e.fn.hideLoadingAnimation=function(){return this.each(function(){let t=e(this),n=t.find("."+c.ajaxOverlayClass);n.length&&n.velocity("stop").velocity("reverse",{complete:function(){e(this).remove(),t.css("pointer-events","auto")}})})},e.fn.showSplashOverlay=function(n){e(this).velocity("fadeIn",{duration:t.animationSpeed.splashOverlay,complete:function(){void 0!==n&&n()}})},e.fn.hideSplashOverlay=function(){e(this).velocity("fadeOut",{duration:t.animationSpeed.splashOverlay})},e.fn.showCaptchaImage=function(t,n){return this.each(function(){let i=e(this),r=i.find("img");i.showLoadingAnimation(c.loadingOptions),v(t,function(e){r.attr("src",e).show(),i.hideLoadingAnimation({icon:{size:"fa-2x"}}),n&&n()})})},e.fn.resetFormFields=function(){return this.each(function(){let t=e(this);t.is("select")||t.val(""),t.parents(".form-group").removeClass("has-error has-success")})},e.fn.showFormMessage=function(t){let n=e(this),i=[],r=[],o=[];for(let e=0;e0){n.find('[name="'+t[e].field+'"]').parents(".form-group").removeClass("has-success").addClass("has-error").find(".help-block").text(t[e].message)}}else"warning"===t[e].type?r.push(t[e].message):"info"===t[e].type&&o.push(t[e].message);i.length>0&&n.hideFormMessage("error",function(t){e(t).find("small").html(i.join("
                ")),e(t).velocity("transition.slideUpIn",c.settingsMessageVelocityOptions)}),r.length>0&&n.hideFormMessage("warning",function(t){e(t).find("small").html(r.join("
                ")),e(t).velocity("transition.slideUpIn",c.settingsMessageVelocityOptions)}),o.length>0&&n.hideFormMessage("info",function(t){e(t).find("small").html(o.join("
                ")),e(t).velocity("transition.slideUpIn",c.settingsMessageVelocityOptions)})},e.fn.hideFormMessage=function(t,n){let i=e(this),r=e.extend({},c.settingsMessageVelocityOptions);void 0!==n&&(r.complete=n,r.display="block");let o=null;switch(t){case"error":o=i.find("."+c.formErrorContainerClass);break;case"warning":o=i.find("."+c.formWarningContainerClass);break;case"info":o=i.find("."+c.formInfoContainerClass);break;case"all":o=i.find("."+c.formErrorContainerClass+", ."+c.formWarningContainerClass+", ."+c.formInfoContainerClass)}o&&(o.is(":visible")?o.velocity("transition.slideDownOut",r):n&&n(o))},e.fn.initFormValidation=function(t){return t=void 0===t?{}:t,this.each(function(){let n=e(this);n.validator(t),n.on("valid.bs.validator",function(t){let n=e(t.relatedTarget).parents(".form-group");n&&n.removeClass("has-error").addClass("has-success")}),n.on("invalid.bs.validator",function(t){let n=e(t.relatedTarget).parents(".form-group");n&&n.removeClass("has-success").addClass("has-error")})})},e.fn.isValidForm=function(){let t=!1;return 0===e(this).find(".has-error").length&&(t=!0),t},e.fn.initMapUpdateCounter=function(){e(this).easyPieChart({barColor:function(e){let t="#568a89";return e<=30?t="#d9534f":e<=50&&(t="#f0ad4e"),t},trackColor:"#2b2b2b",size:30,scaleColor:!1,lineWidth:2,animate:1e3})},e.fn.initTooltips=function(t){t="object"==typeof t?t:{};let n={container:this,delay:100};return t=e.extend(n,t),this.each(function(){e(this).find("[title]").tooltip("destroy").tooltip(t)})},e.fn.destroyTooltips=function(t){return this.each(function(){let n=e(this),i=n.filter("[title]");t&&(i=i.add(n.find("[title]"))),i.each(function(){e(this).tooltip("destroy")})})},e.fn.addCharacterInfoTooltip=function(n,i){let r={};if(n.created&&n.updated&&n.created.character&&n.updated.character){let o=n.created,a=n.updated,s=D(o.character,"class"),l=D(a.character,"class"),u=new Date(1e3*o.created),d=new Date(1e3*a.updated),p=B(u),f=B(d);r={popoverClass:c.popoverCharacterClass,ccpImageServerUrl:t.url.ccpImageServer,created:o,updated:a,createdTime:F(p),updatedTime:F(f),createdStatusClass:s,updatedStatusClass:l};let h={placement:"top",html:!0,trigger:"hover",container:"body",title:"Created / Updated",delay:{show:150,hide:0}};return i=e.extend({},h,i),this.each(function(){let t=e(this);requirejs(["text!templates/tooltip/character_info.html","mustache"],(e,n)=>{let o=n.render(e,r);t.popover(i),t.data("bs.popover").options.content=o,i.show&&t.popover("show")})})}return this},e.fn.initCharacterSwitchPopover=function(n){let i=e(this);requirejs(["text!templates/tooltip/character_switch.html","mustache"],function(r,o){let a={popoverClass:c.popoverCharacterClass,browserTabId:S(),routes:t.routes,userData:n,otherCharacters:()=>n.characters.filter((e,t)=>{let i=f("characters",e.id);return(new Image).src=i,n.characters[t].image=i,e.id!==n.character.id})},s=o.render(r,a);return i.each(function(){let n=e(this);void 0!==n.data("bs.popover")&&n.off("click").popover("destroy"),n.on("click",function(n){n.preventDefault(),n.stopPropagation();let i=e(this),r=i.attr("data-easein"),o=i.data("bs.popover"),a=null,l={duration:t.animationSpeed.dialogEvents};void 0===o?(i.on("shown.bs.popover",function(t){e(this).data("bs.popover").tip().find(".btn").on("click",function(t){e("body").click()})}),i.popover({html:!0,title:"select character",trigger:"manual",placement:"bottom",container:"body",content:s,animation:!1}).data("bs.popover").tip().addClass(c.popoverClass),i.popover("show"),(a=i.data("bs.popover").tip()).velocity("transition."+r,l),a.initTooltips(),a.on("click",".btn",function(){e("body").data("characterSwitch",!0),setTimeout(function(){e("body").removeData("characterSwitch")},500)})):(a=i.data("bs.popover").tip()).is(":visible")?a.velocity("reverse"):(i.popover("show"),a.initTooltips(),a.velocity("transition."+r,l))}),i.initPopoverClose("hideCharacterPopup")})})},e.fn.destroyPopover=function(t){return this.each(function(){let n=e(this),i="."+c.popoverTriggerClass,r=n.filter(i);t&&(r=r.add(n.find(i))),r.each(function(){let t=e(this);t.data("bs.popover")&&t.popover("destroy")})})},e.fn.initPopoverClose=function(t){return this.each(function(){e("body").off("click."+t).on("click."+t+" contextmenu",function(t){e("."+c.popoverTriggerClass).each(function(){let n=e(this);if(!n.is(t.target)&&0===n.has(t.target).length&&0===e(".popover").has(t.target).length){let e=n.data("bs.popover");void 0!==e&&e.tip().is(":visible")&&n.popover("hide")}})})})},e.fn.setPopoverSmall=function(){return this.each(function(){let t=e(this).data("bs.popover");t&&t.tip().addClass(c.popoverSmallClass)})},e.fn.showMessage=function(t){let n=e(this);requirejs(["text!templates/form/message.html","mustache"],function(i,r){let o="alert-danger",a="txt-color-danger";switch(t.type){case"info":o="alert-info",a="txt-color-information";break;case"success":o="alert-success",a="txt-color-success";break;case"warning":o="alert-warning",a="txt-color-warning"}let s={dismissible:!0,messageId:y("pf-alert-"),messageTypeClass:o,messageTextClass:a,insertElement:"replace"};s=e.extend(s,t);let l=r.render(i,s);switch(s.insertElement){case"replace":n.html(l);break;case"prepend":n.prepend(l);break;case"append":n.append(l);break;default:console.error("insertElement: %s is not specified!",s.insertElement)}e("#"+s.messageId).velocity("stop").velocity("fadeIn")})},e.fn.pulseBackgroundColor=function(t,n=!1,i=!1){let r=c.animationPulseClassPrefix;switch(t){case"added":r+="success";break;case"changed":r+="warning";break;case"deleted":r+="danger";break;default:console.warn("Invalid status: %s",t)}n&&(r+="-keep");let o=e=>{e.removeClass(r);let t=e.data("animationTimer");d.hasOwnProperty(t)&&(clearTimeout(t),delete d[t],e.removeData("animationTimer"))};return this.each(function(){let t=e(this);if(t.hasClass(r)&&o(t),!i&&(t.addClass(r),!n)){let e=setTimeout(o,1500,t);t.data("animationTimer",e),d[e]=!0}})},e.fn.getMapTabElements=function(t){let n=e(this).find("#"+c.mapTabBarId).find("a");return t&&(n=n.filter(function(n,i){return e(i).data("mapId")===t})),n};let p=()=>e("body").data("version"),f=(e,n,i=32,r)=>{let o=!1;if("string"==typeof e&&"number"==typeof n&&"number"==typeof i){if(e=e.toLowerCase(),!r)switch(e){case"factions":e="corporations";case"alliances":case"corporations":r="logo";break;case"characters":r="portrait";break;case"types":r="icon";break;default:console.warn("Invalid resourceType: %o for in eveImageUrl()",e)}o=[t.url.ccpImageServer,e,n,r].join("/"),o+="?"+new URLSearchParams({size:i}).toString()}return o},h=()=>{const e=!0,t=!1,n=["scroll","wheel","touchstart","touchmove","touchenter","touchend","touchleave","mouseout","mouseleave","mouseup","mousedown","mousemove","mouseenter","mousewheel","mouseover"],i=(e,t)=>t?function(t){return t.preventDefault=(()=>{}),e.call(this,t)}:e,r=r=>{EventTarget.prototype.addEventListener=function(o,a,s){const l="object"==typeof s,c=l?s.capture:s;(s=l?(e=>{const t=Object.getOwnPropertyDescriptor(e,"passive");return t&&!0!==t.writable&&void 0===t.set?Object.assign({},e):e})(s):{}).passive=((t,i)=>void 0!==t?t:-1!==n.indexOf(i)&&e)(s.passive,o),s.capture=void 0===c?t:c,a=i(a,s.passive),r.call(this,o,a,s)}};if((()=>{let e=!1;try{const t=Object.defineProperty({},"passive",{get(){e=!0}});window.addEventListener("test",null,t),window.removeEventListener("test",null,t)}catch(e){}return e})()){r(EventTarget.prototype.addEventListener)}},m=(e,t)=>{let n=["popover"];"small"===H(t,"size")&&n.push("popover-small");let i='
                "},g=(t=!0)=>{e("html").toggleClass(c.noScrollClass,!t)},v=(n,i)=>{e.ajax({type:"POST",url:t.path.getCaptcha,data:{reason:n},dataType:"json"}).done(function(e){e.error.length>0?b({title:"getCaptchaImage",text:"Captcha image generation failed",type:"error"}):i(e.img)}).fail(function(e,t,n){let i=t+" "+n;b({title:e.status+": getCaptchaImage",text:i,type:"error"})})},y=(e="id_")=>e+Math.random().toString(36).substring(2,10),b=(e,t)=>{requirejs(["notification"],n=>{n.showNotify(e,t)})},w=()=>t.currentUserData,x=()=>{let e=parseInt(H(w(),"character.id"))||0;return e||(e=parseInt(document.body.getAttribute("data-character-id"))),e},C=(e,t)=>{let n=n=>H(e,n)!==H(t,n),i=(H(e,"characters")||[]).map(e=>e.id).sort(),r=(H(t,"characters")||[]).map(e=>e.id).sort(),o=(H(e,"character.logHistory")||[]).map(e=>e.stamp).sort(),a=(H(t,"character.logHistory")||[]).map(e=>e.stamp).sort();return{userId:n("id"),characterId:n("character.id"),characterLogLocation:n("character.logLocation"),characterSystemId:n("character.log.system.id"),characterShipType:n("character.log.ship.typeId"),characterStationId:n("character.log.station.id"),characterStructureId:n("character.log.structure.id"),charactersIds:i.toString()!==r.toString(),characterLogHistory:o.toString()!==a.toString()}},S=()=>{let e=sessionStorage.getItem("tabId");return null===e&&(e=y(),sessionStorage.setItem("tabId",e)),e},_=e=>{let t="";switch(e){case 0:t="connecting";break;case 1:t="open";break;case 2:t="closing";break;case 3:t="closed"}return t},T=(n,i)=>{let r=t.syncStatus;switch(n){case"ws:open":r.webSocket.status=_(i.readyState),r.webSocket.class="txt-color-success",r.webSocket.timestamp=(new Date).getTime()/1e3,r.type="webSocket",T("ajax:disable"),e(window).trigger("pf:syncStatus");break;case"ws:get":r.webSocket.timestamp=(new Date).getTime()/1e3,e(window).trigger("pf:syncStatus");break;case"ws:closed":r.webSocket.status=_(i.readyState),r.webSocket.class="txt-color-danger",r.webSocket.timestamp=void 0,T("ajax:enable");break;case"ws:error":r.webSocket.status=_(i.readyState),r.webSocket.class="txt-color-danger",T("ajax:enable");break;case"sw:init":r.sharedWorker.status="online",r.sharedWorker.class="txt-color-success";break;case"sw:error":r.sharedWorker.status="offline",r.sharedWorker.class="txt-color-danger",T("ajax:enable");break;case"ajax:enable":r.ajax.status="enabled",r.ajax.class="txt-color-success",r.ajax.timestamp=(new Date).getTime()/1e3,r.type="ajax",e(window).trigger("pf:syncStatus");break;case"ajax:get":r.ajax.timestamp=(new Date).getTime()/1e3,e(window).trigger("pf:syncStatus");break;case"ajax:disable":r.ajax.status="disabled",r.ajax.class="txt-color-warning"}},k=e=>{let t=0;switch(e){case"H":t=30;break;case"L":t=31;break;case"0.0":t=32;break;default:for(let n=1;n<=18;n++)if(e==="C"+n){t=n;break}}return t},D=(e,n)=>{let i="";if(t.characterStatus){let r=R("corporationId"),o=R("allianceId"),a=w();if(a){let r=a.characters;for(let o=0;o{let i="";return t.classes.planets.hasOwnProperty(e)&&(i=t.classes.planets[e][n]),i},A=e=>{let n="";return"C13"===e&&(e="SH"),t.classes.systemSecurity.hasOwnProperty(e)&&(n=t.classes.systemSecurity[e].class),n},O=e=>{let n="";return e=parseFloat(e),!isNaN(e)&&isFinite(e)&&(e<0&&(e=0),e=e.toFixed(1).toString(),t.classes.trueSec.hasOwnProperty(e)&&(n=t.classes.trueSec[e].class)),n},I=(e,t)=>{let n=!1;if(Array.isArray(e)&&t===parseInt(t,10))for(let i=0;i{let i=!1;if(t.currentMapUserData)if(n===parseInt(n,10)){for(let e=0;e{let n=!1;return t.currentMapData&&(n=e===parseInt(e,10)?t.currentMapData.find(t=>t.config.id===e):t.currentMapData),n},R=e=>{let t=w(),n=!1;if(t){let i=t.character;i&&("privateId"===e&&(n=i.id),"allianceId"===e&&i.alliance&&(n=i.alliance.id),"corporationId"===e&&i.corporation&&(n=i.corporation.id))}return n},j=(e,t,n,i={})=>{let r=e=>{for(let n=0;n=0)for(let a=0;a{if(e&&e.length)for(let n=0;n{let r=function(e){return this.id!==e.id},o=L(t,e.systemData.systemId);o.length&&(o=o.filter(function(e,t,o){let a=!0;for(let t in i)if(t>n){let n=i[t].filter(r,e);n.length>0?i[t]=n:delete i[t]}else for(let n=0;n(parseInt(e)/1e3).toLocaleString()+" t",B=e=>new Date(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds()),F=(e,t)=>{let n=("0"+(e.getMonth()+1)).slice(-2)+"/"+("0"+e.getDate()).slice(-2)+"/"+e.getFullYear(),i=("0"+e.getHours()).slice(-2)+":"+("0"+e.getMinutes()).slice(-2);return n+" "+(i+=t?":"+("0"+e.getSeconds()).slice(-2):"")},q=(e,t,n,i)=>e+[t,n,i].join("-"),U=(...e)=>{let t=e.reduce((e,t)=>e.concatFilter(Object.values(t)),[]);return t.unshift(""),delete(t=Object.assign({},t))[0],t},H=(e,t)=>t.split(".").reduce((e,t)=>void 0===e||null===e?e:e[t],e),z=(e,t=[])=>{e!==document.URL&&(t&&t.length>0&&(e+="?"+t.join("&")),window.location=e)};return{config:c,getVersion:p,showVersionInfo:()=>i.showVersionInfo(p()),eveImageUrl:f,initPrototypes:()=>{h()},initDefaultBootboxConfig:()=>{a.setDefaults({onEscape:!0})},initDefaultConfirmationConfig:()=>{e.fn.confirmation.Constructor.DEFAULTS.placement="left",e.fn.confirmation.Constructor.DEFAULTS.container="body",e.fn.confirmation.Constructor.DEFAULTS.btnCancelClass="btn btn-sm btn-default",e.fn.confirmation.Constructor.DEFAULTS.btnCancelLabel="cancel",e.fn.confirmation.Constructor.DEFAULTS.btnCancelIcon="fas fa-fw fa-ban",e.fn.confirmation.Constructor.DEFAULTS.btnOkClass="btn btn-sm btn-danger",e.fn.confirmation.Constructor.DEFAULTS.btnOkLabel="delete",e.fn.confirmation.Constructor.DEFAULTS.btnOkIcon="fas fa-fw fa-times",e.fn.confirmation.Constructor.DEFAULTS.template=m()},initDefaultSelect2Config:()=>{e.fn.select2.defaults.set("theme","pathfinder"),e.fn.select2.defaults.set("language",{searching:e=>'   searching...'}),e.fn.select2.defaults.set("escapeMarkup",e=>e);let t=t=>{e(t).find("ul.select2-results__options").off("mousewheel"),t.mCustomScrollbar({mouseWheel:{enable:!0,scrollAmount:"auto",axis:"y",preventDefault:!0},keyboard:{enable:!1,scrollType:"stepless",scrollAmount:"auto"},scrollbarPosition:"inside",autoDraggerLength:!0,autoHideScrollbar:!1,advanced:{updateOnContentResize:!0},callbacks:{alwaysTriggerOffsets:!1,onTotalScrollOffset:300,onInit:function(){g(!1)},onUpdate:function(t){e("."+c.select2ImageLazyLoadClass).lazyload({container:this,threshold:240,event:"pf:lazyLoad"})},onTotalScroll:function(){this.mcs.content.find(":first-child").trigger("scroll")},whileScrolling:function(){if(0==this.mcs.top%10){let t=e(this).find(".mCSB_container"),n=t.closest(".mCustomScrollBox");n.find("."+c.select2ImageLazyLoadClass).filter(function(){let i=e(this);if(i.attr("src")===i.attr("data-original"))return!1;let r=t.position().top,o=n.height();return i.closest("div").position().top-240{let n=null;if(e(t).data("select2")){let i=e(t).data("select2").$results;if(i.length){let e=i.parents(".select2-results");e.length&&(n=e)}}return n};e(document).on("select2:open","."+c.select2Class,function(e){let i=n(this);i&&t(i)}),e(document).on("select2:closing","."+c.select2Class,function(t){let i=n(this);i&&i.mCustomScrollbar("destroy"),e(this).parents(".editableform").find(this).next().find(".select2-selection").remove(),g(!0)})},initDefaultEditableConfig:()=>{e.fn.editableform.buttons='
                ',e.fn.editableform.loading='
                '},getCurrentTriggerDelay:(e,n)=>((void 0===t.timer[e].CURRENT_DELAY||t.timer[e].CURRENT_DELAY<=0)&&(t.timer[e].CURRENT_DELAY=t.timer[e].DELAY),n===parseInt(n,10)&&t.timer[e].CURRENT_DELAY+n>0&&(t.timer[e].CURRENT_DELAY+=n),t.timer[e].CURRENT_DELAY),getRandomString:y,getServerTime:()=>{let e=new Date;return new Date(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds())},convertTimestampToServerTime:e=>{let t=(new Date).getTimezoneOffset();return new Date(1e3*(e+60*t))},getTimeDiffParts:(e,t)=>{let n={},i=e.getTime(),r=t.getTime(),o=0;i>=0&&r>=0&&(o=(t.getTime()-e.getTime())/1e3),o=Math.abs(Math.floor(o)),n.days=Math.floor(o/86400);let a=o-24*n.days*60*60;return n.hours=Math.floor(a/3600),a-=60*n.hours*60,n.min=Math.floor(a/60),n.sec=a-60*n.min,n},formatTimeParts:e=>{let t="";return e.days&&(t+=e.days+"d "),t+=("00"+e.hours).slice(-2),t+=":"+("00"+e.min).slice(-2)},timeStart:e=>{"object"==typeof performance?u[e]=performance.now():u[e]=(new Date).getTime()},timeStop:e=>{let t=0;if(u.hasOwnProperty(e)){let n=0;n="object"==typeof performance?performance.now():new Date,t=Number((n-u[e]).toFixed(2)),delete u[e]}return t},updateCounter:(e,t,n)=>{if(e.length){let i=e.val(),r=i.length,o=i.match(/(\r\n|\n|\r)/g),a=0;null!=o&&(a=o.length),r+=a,t.text(n-r),n<=r?t.toggleClass("txt-color-red",!0):t.toggleClass("txt-color-red",!1)}},log:(t,n)=>{e(window).trigger("pf:log",[t,n])},showNotify:b,stopTabBlink:()=>{requirejs(["notification"],e=>{e.stopTabBlink()})},getLogInfo:(e,n)=>{let i="";return t.classes.logTypes.hasOwnProperty(e)&&(i=t.classes.logTypes[e][n]),i},ajaxSetup:()=>{e.ajaxSetup({beforeSend:function(e,t){e.url=location.protocol+"//"+location.host+t.url,!1===t.crossDomain&&e.setRequestHeader("pf-character",x())},complete:function(t,n){((t=!0)=>{let n=e("#"+c.globalInfoPanelId);t&&!n.length?requirejs(["text!templates/ui/info_panel.html","mustache"],(t,n)=>{let i={id:c.globalInfoPanelId},r=e(n.render(t,i));e("#"+c.footerId).find("."+c.footerCenterClass).append(r)}):!t&&n.length&&n.remove()})(parseInt(t.getResponseHeader("pf-maintenance"))||0)}})},request:(n,i,r=[],o={},a={},s=null)=>{return new Promise((l,c)=>{let u={action:"request",name:n.toLowerCase()+i.capitalize()},d=t.path.api+"/"+i,p="";if(isNaN(r))Array.isArray(r)&&(p+="/"+r.join(","));else{let e=parseInt(r,10);p+=e?"/"+e:""}let f={type:n,url:d+=p,dataType:"json",context:a};"GET"===n?f.data=o:(f.data=JSON.stringify(o),f.contentType="application/json; charset=utf-8"),e.ajax(f).done(function(e){u.data=e,u.context=this,l(u)}).fail(function(e,t,n){u.data={jqXHR:e,status:t,error:n},u.context=this,c(u)}).always(function(){s&&s(this)})})},handleAjaxErrorResponse:e=>{if("request"===e.action){let t=e.data.jqXHR,n="";if(t.responseJSON){let i=t.responseJSON;i.error&&i.error.length>0&&(n=i.error.map(e=>e.message?e.message:e.status).join("\n"),e.context.formElement&&e.context.formElement.showFormMessage(i.error))}else n="Invalid JSON response";b({title:t.status+": "+e.name,text:n,type:"error"})}},setSyncStatus:T,getSyncType:()=>t.syncStatus.type,isXHRAborted:e=>!e.getAllResponseHeaders(),triggerMenuAction:(t,n,i)=>{t?"string"==typeof n&&n.length?e(t).trigger("pf:menuAction",[n,i]):console.error("Invalid action: %o",n):console.error("Invalid element: %o",t)},getLabelByRole:t=>e("",{class:["label","label-"+t.style].join(" "),text:t.label}),getMapElementFromOverlay:t=>e(t).parents("."+c.mapWrapperClass).find("."+c.mapClass),getMapModule:()=>{let t=e("#"+c.mapModuleId);return 0===t.length&&(t=e("
                ",{id:c.mapModuleId})),t},getSystemEffectMultiplierByAreaId:e=>r.getMultiplierByAreaId(e),getSystemEffectData:(e,t)=>{let n=r;if(e){n=!1;let i=k(e);i>0&&r.wh[t]&&r.wh[t][i]&&(n=r.wh[t][i])}return n},getSystemEffectTable:e=>{let t="";if(e.length>0){t+="";for(let n of e)t+="",t+="",t+='",t+="";t+="
                ",t+=n.effect,t+="',t+=n.value,t+="
                "}return t},getSystemPlanetsTable:e=>{let t="";if(e.length>0){let n=/\(([^)]+)\)/;t+="";for(let i of e){let e=i.type.name,r="",o=n.exec(e.toLowerCase());o&&o[1]&&(e=o[1].capitalize(),r=E(o[1])),t+="",t+="",t+='",t+='",t+=""}t+="
                ",t+=i.name,t+="',t+='',t+="',t+=e,t+="
                "}return t},getSystemRegionTable:(e,t)=>{let n=[{label:"Region",value:e}];t&&(t.faction&&n.push({label:"Sov. Faction",value:t.faction.name}),t.alliance&&n.push({label:"Sov. Ally",value:t.alliance.name}));let i="";for(let e of n)i+="",i+="",i+='",i+="";return i+="
                ",i+=e.label,i+="',i+=e.value,i+="
                "},getSystemPilotsTable:e=>{let t="";if(e.length>0){let n=(e,t,n,i,r)=>{let o="";return o+='',o+="",o+=null!==e?'':"",o+="",o+="",o+="",o+=t,o+="",o+="",o+=n,o+="",o+='',o+=i,o+="",o+='',o+=r,o+="",o+=""},i=0;t+="";for(let r of e){i+=parseInt(r.log.ship.mass);let e=D(r,"class"),o=M(r.log.ship.mass);t+=n(e,r.name,r.log.ship.name,r.log.ship.typeName,o)}t+=n(null,"","","",M(i)),t+="
                "}return t},getSystemsInfoTable:e=>{let t="";if(e.length>0){t+="";for(let n=0;n",t+="",t+='",t+='",t+=""}t+="
                ",t+=e[n].name,t+="',t+=e[n].security,t+="',t+=parseFloat(e[n].trueSec).toFixed(1),t+="
                "}return t},getStatusInfoForCharacter:D,getSecurityClassForSystem:A,getTrueSecClassForSystem:O,getStatusInfoForSystem:(n,i)=>{let r="";return t.systemStatus.hasOwnProperty(n)?r=t.systemStatus[n][i]:e.each(t.systemStatus,function(e,t){n!==t.id||(r=t[i])}),r},getSignatureGroupOptions:e=>{let n=[];for(let[i,r]of Object.entries(t.signatureGroups))n.push({value:parseInt(i),text:r[e]});return n},getSignatureTypeNames:(e,t,n)=>U(...t.map(t=>H(o,[e,t,n].join("."))||{})),getAreaIdBySecurity:k,setCurrentMapUserData:e=>(t.currentMapUserData=e,P()),getCurrentMapUserData:P,updateCurrentMapUserData:e=>{let n=(e=>I(t.currentMapUserData,e))(e.config.id);Array.isArray(t.currentMapUserData)||(t.currentMapUserData=[]),!1!==n?t.currentMapUserData[n]=e:t.currentMapUserData.push(e)},setCurrentMapData:e=>(t.currentMapData=e,$()),getCurrentMapData:$,filterCurrentMapData:(e,t)=>{let n=$();return n&&(n=n.filter(n=>H(n,e)===t)),n},updateCurrentMapData:e=>{let n=(e=>I(t.currentMapData,e))(e.config.id);!1!==n?(t.currentMapData[n].config=e.config,t.currentMapData[n].data=e.data):t.currentMapData.push(e)},deleteCurrentMapData:e=>{t.currentMapData=t.currentMapData.filter(t=>t.config.id!==e)},setCurrentUserData:n=>{let i=!1;if(n&&n.character&&n.characters){let r=C(w(),n);Object.values(r).some(e=>e)&&e(document).trigger("pf:changedUserData",[n,r]),t.currentUserData=n,i=!0}else console.error("Could not set userData %o. Missing or malformed obj",n);return i},getCurrentUserData:w,getCurrentCharacterId:x,setCurrentSystemData:e=>{t.currentSystemData=e},getCurrentSystemData:()=>t.currentSystemData,getCurrentLocationData:()=>{let t=e("#"+c.headUserLocationId+">li:last-of-type");return{id:parseInt(t.attr("data-systemId"))||0,name:t.attr("data-systemName")||!1}},getCurrentUserInfo:R,getCurrentCharacterLog:()=>H(w(),"character.log")||!1,findInViewport:e=>{let t=[];for(let n of e){if(!(n instanceof HTMLElement)){console.warn("findInViewport() expects Array() of %O; %o given",HTMLElement,n);continue}let e=n.offsetTop,i=n.offsetLeft,r=n.offsetWidth,o=n.offsetHeight,a=n;for(;n.offsetParent;)e+=(n=n.offsetParent).offsetTop,i+=n.offsetLeft;ewindow.pageYOffset&&i+r>window.pageXOffset&&t.push(a)}return t},initScrollSpy:(t,n=window,i={})=>{let r,o,a=Array.from(t.querySelectorAll(".page-scroll")).map(e=>({link:e,content:document.getElementById(e.getAttribute("data-target"))})),s=e=>{if(!e)return;document.activeElement===e.link&&document.activeElement.blur();let t=e.link.closest("li");t&&t.classList.remove("active")},l=(e,t,n)=>{let i=e.getBoundingClientRect(),r=(e=>"function"==typeof e.offset?parseFloat(e.offset()):parseFloat(e.offset))(t);return n?parseInt(i.bottom,10)<(window.innerHeight||document.documentElement.clientHeight):parseInt(i.top,10)<=r},c=()=>window.innerHeight+window.pageYOffset>=(()=>Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight))(),u=(e,t)=>{let n=e[e.length-1];if(((e,t)=>!(!c()||!l(e.content,t,!0)))(n,t))return n;for(let n=e.length-1;n>=0;n--)if(l(e[n].content,t))return e[n]},d=()=>{let e=u(a,i);e?o&&e.content===o.content||(s(o),(e=>{if(!e)return;let t=e.link.closest("li");t&&t.classList.add("active")})(e),o=e):o&&(s(o),o=null)};d(),n.addEventListener("scroll",()=>{r&&window.cancelAnimationFrame(r),r=window.requestAnimationFrame(d)},!1);let p=function(e){e.preventDefault(),this.content.scrollIntoView({behavior:"smooth"})};for(let t of a)e(t.link).on("click",p.bind(t))},getConfirmationTemplate:m,convertXEditableOptionsToSelect2:e=>{let t=[];if(e.options){let n=e.options.prepend?e.options.prepend:[],i=e.options.source(),r=[];r.push(...n,...i);let o=t=>{let n={id:t.value,text:t.text};return e.value===t.value&&(n.selected=!0),!0===t.disabled&&(n.disabled=!0),t.hasOwnProperty("metaData")&&(n.metaData=t.metaData),n};t=r.map(e=>(e.children?e.children=e.children.map(o):e=o(e),e))}return t},flattenXEditableSelectArray:e=>{let t={};for(let n of e)if(n.children&&n.children.length>0)for(let e of n.children)t[e.value]=e.text;else t[n.value]=n.text;return t},getCharacterDataBySystemId:L,getNearBySystemData:j,getNearByCharacterData:N,setDestination:(n,i,r)=>{let o="";switch(n){case"set_destination":o="Set destination";break;case"add_first_waypoint":o="Set first waypoint";break;case"add_last_waypoint":o="Set new waypoint"}e.ajax({type:"POST",url:t.path.setDestination,data:{clearOtherWaypoints:"set_destination"===n?1:0,first:"add_last_waypoint"===n?0:1,destData:[r]},context:{destType:i,description:o},dataType:"json"}).done(function(e){if(e.destData&&e.destData.length>0)for(let t=0;t0)for(let t=0;t{return new Promise((t,n)=>{let i={action:"copyToClipboard",data:!1};navigator.clipboard?navigator.permissions.query({name:"clipboard-write"}).then(n=>{"granted"===n.state||"prompt"===n.state?navigator.clipboard.writeText(e).then(()=>{i.data=!0,t(i)}).catch(e=>{let n="Failed to write clipboard content";console.error(n,e),b({title:"Clipboard API",text:n,type:"error"}),t(i)}):(b({title:"Clipboard API",text:"You denied write access",type:"warning"}),t(i))}):(console.warn("Clipboard API not supported by your browser"),t(i))})},readFromClipboard:()=>{return new Promise((e,t)=>{let n={action:"readFromClipboard",data:!1};navigator.clipboard?navigator.permissions.query({name:"clipboard-read"}).then(t=>{"granted"===t.state||"prompt"===t.state?navigator.clipboard.readText().then(t=>{n.data=t,e(n)}).catch(t=>{let i="Failed to read clipboard content";console.error(i,t),b({title:"Clipboard API",text:i,type:"error"}),e(n)}):(b({title:"Clipboard API",text:"You denied read access",type:"warning"}),e(n))}):(console.warn("Clipboard API not supported by your browser"),e(n))})},convertDateToUTC:B,convertDateToString:F,getOpenDialogs:()=>e("."+c.dialogClass).filter(":visible"),openIngameWindow:n=>{(n=parseInt(n))>0&&e.ajax({type:"POST",url:t.path.openIngameWindow,data:{targetId:n},dataType:"json"}).done(function(e){e.error.length>0?b({title:"Open window in client",text:"Remote window open failed",type:"error"}):b({title:"Open window in client",text:"Check your EVE client",type:"success"})}).fail(function(e,t,n){let i=t+" "+n;b({title:e.status+": openWindow",text:i,type:"error"})})},formatPrice:e=>{let t=(e=Number(e).toFixed(2)).toString().split(".");return(e=t[0].replace(/\B(?=(\d{3})+(?!\d))/g,",")+(t[1]?"."+t[1]:""))+" ISK"},formatMassValue:M,getLocalStorage:function(){return void 0===l&&(l=s.createInstance({driver:[s.INDEXEDDB,s.WEBSQL,s.LOCALSTORAGE],name:"Pathfinder local storage"})),l},clearSessionStorage:()=>{sessionStorage&&sessionStorage.clear()},getBrowserTabId:S,singleDoubleClick:(n,i,r,o)=>{let a="mouseup.singleDouble";if(!((t,n)=>{let i=!1,r=e._data(t[0],"events");if(r){let e=n.split("."),t=r[e[0]];if(t){let n=2===e.length&&e[1];if(n){for(let e of t)if(e.namespace===n){i=!0;break}}else i=!0}}return i})(n,a)){let e=0;n.off("click").on("click",function(e){e.preventDefault()}),n.off(a).on(a,function(n){1==++e&&setTimeout(t=>{1===e?i.call(t,n):r.call(t,n),e=0},o||t.timer.DBL_CLICK,this)})}},getTableId:q,getTableRowId:(e,t,n)=>e+[t,n].join("-"),getDataTableInstance:(t,n,i,r)=>{let o=null,a=e.fn.dataTable.tables({visible:!1,api:!0}).table("#"+q(t,r,n,i));return a.node()&&(o=a),o},htmlEncode:t=>e("
                ").text(t).html(),htmlDecode:t=>e("
                ").html(t).text(),isValidHtml:e=>{let t=(new DOMParser).parseFromString(e,"text/html");return Array.from(t.body.childNodes).some(e=>1===e.nodeType)},isDomElement:e=>!(!e||1!==e.nodeType),arrayToObject:(e,t="id")=>e.reduce((e,n)=>(e[n[t]]=n,e),{}),getObjVal:H,redirect:z,logout:n=>{let i={};n&&n.ajaxData&&(i=n.ajaxData),e.ajax({type:"POST",url:t.path.logout,data:i,dataType:"json"}).done(function(e){e.reroute&&z(e.reroute,["logout"])}).fail(function(e,t,n){let i=t+" "+n;b({title:e.status+": logout",text:i,type:"error"})})},setCookie:(e,t,n,i)=>{let r=new Date,o=r.getTime(),a=-1*o;if(n>0)switch(i){case"d":a=24*n*60*60*1e3;break;case"s":a=1e3*n}r.setTime(o+a);let s="expires="+r.toUTCString(),l="path="+(window.location.pathname.replace(/[^\/]*$/,"")||"/");document.cookie=e+"="+t+"; "+s+"; "+l},getCookie:e=>{let t=e+"=",n=document.cookie.split(";");for(let e=0;e":">",'"':""","'":"'","/":"/","`":"`","=":"="};var u=/\s*/,d=/\s+/,p=/\s*=/,f=/\s*\}/,h=/#|\^|\/|>|\{|&|=|!/;function m(e){this.string=e,this.tail=e,this.pos=0}function g(e,t){this.view=e,this.cache={".":this.view},this.parent=t}function v(){this.cache={}}m.prototype.eos=function(){return""===this.tail},m.prototype.scan=function(e){var t=this.tail.match(e);if(!t||0!==t.index)return"";var n=t[0];return this.tail=this.tail.substring(n.length),this.pos+=n.length,n},m.prototype.scanUntil=function(e){var t,n=this.tail.search(e);switch(n){case-1:t=this.tail,this.tail="";break;case 0:t="";break;default:t=this.tail.substring(0,n),this.tail=this.tail.substring(n)}return this.pos+=t.length,t},g.prototype.push=function(e){return new g(e,this)},g.prototype.lookup=function(e){var t,n,r,a=this.cache;if(a.hasOwnProperty(e))t=a[e];else{for(var s,l,c,u=this,d=!1;u;){if(e.indexOf(".")>0)for(s=u.view,l=e.split("."),c=0;null!=s&&c0?r[r.length-1][4]:n;break;default:i.push(t)}return n}(function(e){for(var t,n,i=[],r=0,o=e.length;r"===a?s=this.renderPartial(o,t,n,r):"&"===a?s=this.unescapedValue(o,t):"name"===a?s=this.escapedValue(o,t):"text"===a&&(s=this.rawValue(o)),void 0!==s&&(l+=s);return l},v.prototype.renderSection=function(e,t,r,o){var a=this,s="",l=t.lookup(e[1]);if(l){if(n(l))for(var c=0,u=l.length;c"'`=\/]/g,function(e){return c[e]})},e.Scanner=m,e.Context=g,e.Writer=v,e}),define("app/render",["jquery","mustache"],(e,t)=>{"use strict";return{render:(e,n)=>{return new Promise(i=>{requirejs(["text!templates/"+e+".html"],e=>{i(t.render(e,n))})})},highlightJson:e=>{let t=new Date,n=new RegExp,i=((e,t)=>{let n=[];for(let i=0;i0&&"\n"!==t.charAt(t.length-1)&&(t+="\n"),r+t},a=function(e,t,n,i,r,a){"string"==typeof e&&(e=e.split("<").join("<").split(">").join(">"));let s=''+t+e+t+n+"";return r&&(s=o(i,s)),s},s=(e,l,c,u,d)=>{let p="",f=c?', ':"",h=typeof e,m="";if(function(e){return e&&"object"==typeof e&&"number"==typeof e.length&&!e.propertyIsEnumerable("length")}(e))if(0===e.length)p+=o(l,'[ ]'+f,d);else{p+=o(l,'['+(m=''),d);for(let t=0;t")+']'+f)}else if("object"===h)if(null===e)p+=a("null","",f,l,u,"pf-code-Null");else if(e.constructor===t.constructor)p+=a("new Date("+e.getTime()+") /*"+e.toLocaleString()+"*/","",f,l,u,"Date");else if(e.constructor===n.constructor)p+=a("new RegExp("+e+")","",f,l,u,"RegExp");else{let t=0;for(let n in e)t++;if(0===t)p+=o(l,'{ }'+f,d);else{p+=o(l,'{'+(m=''),d);let n=0;for(let i in e)if(e.hasOwnProperty(i)){let r="";p+=o(l+1,''+r+i+r+": "+s(e[i],l+1,++n")+'}'+f)}}else"number"===h?p+=a(e,"",f,l,u,"pf-code-Number"):"boolean"===h?p+=a(e,"",f,l,u,"pf-code-Boolean"):"function"===h?e.constructor===n.constructor?p+=a("new RegExp("+e+")","",f,l,u,"RegExp"):(e=function(e,t){let n="";for(let t=0;to?e:o)-r-1),this.slideWidth*n,0);e=this.circle(e),this.move(o,this.slideWidth*n,t),this.move(e,0,t),this.options.continuous&&this.move(this.circle(e-n),-this.slideWidth*n,0)}else e=this.circle(e),this.animate(o*-this.slideWidth,e*-this.slideWidth,t);this.onslide(e)}},getIndex:function(){return this.index},getNumber:function(){return this.num},prev:function(){(this.options.continuous||this.index)&&this.slide(this.index-1)},next:function(){(this.options.continuous||this.index1&&(this.timeout=this.setTimeout(!this.requestAnimationFrame&&this.slide||function(e,n){t.animationFrameId=t.requestAnimationFrame.call(window,function(){t.slide(e,n)})},[this.index+1,this.options.slideshowTransitionSpeed],this.interval)),this.container.addClass(this.options.playingClass)},pause:function(){window.clearTimeout(this.timeout),this.interval=null,this.container.removeClass(this.options.playingClass)},add:function(e){var t;for(e.concat||(e=Array.prototype.slice.call(e)),this.list.concat||(this.list=Array.prototype.slice.call(this.list)),this.list=this.list.concat(e),this.num=this.list.length,this.num>2&&null===this.options.continuous&&(this.options.continuous=!0,this.container.removeClass(this.options.leftEdgeClass)),this.container.removeClass(this.options.rightEdgeClass).removeClass(this.options.singleClass),t=this.num-e.length;tn)return i.slidesContainer[0].style.left=t+"px",i.ontransitionend(),void window.clearInterval(o);i.slidesContainer[0].style.left=(t-e)*(Math.floor(a/n*100)/100)+e+"px"},4);else this.slidesContainer[0].style.left=t+"px"},preventDefault:function(e){e.preventDefault?e.preventDefault():e.returnValue=!1},stopPropagation:function(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0},onresize:function(){this.initSlides(!0)},onmousedown:function(e){e.which&&1===e.which&&"VIDEO"!==e.target.nodeName&&(e.preventDefault(),(e.originalEvent||e).touches=[{pageX:e.pageX,pageY:e.pageY}],this.ontouchstart(e))},onmousemove:function(e){this.touchStart&&((e.originalEvent||e).touches=[{pageX:e.pageX,pageY:e.pageY}],this.ontouchmove(e))},onmouseup:function(e){this.touchStart&&(this.ontouchend(e),delete this.touchStart)},onmouseout:function(t){if(this.touchStart){var n=t.target,i=t.relatedTarget;i&&(i===n||e.contains(n,i))||this.onmouseup(t)}},ontouchstart:function(e){this.options.stopTouchEventsPropagation&&this.stopPropagation(e);var t=(e.originalEvent||e).touches[0];this.touchStart={x:t.pageX,y:t.pageY,time:Date.now()},this.isScrolling=void 0,this.touchDelta={}},ontouchmove:function(e){this.options.stopTouchEventsPropagation&&this.stopPropagation(e);var t,n,i=(e.originalEvent||e).touches[0],r=(e.originalEvent||e).scale,o=this.index;if(!(i.length>1||r&&1!==r))if(this.options.disableScroll&&e.preventDefault(),this.touchDelta={x:i.pageX-this.touchStart.x,y:i.pageY-this.touchStart.y},t=this.touchDelta.x,void 0===this.isScrolling&&(this.isScrolling=this.isScrolling||Math.abs(t)0||o===this.num-1&&t<0?Math.abs(t)/this.slideWidth+1:1,n=[o],o&&n.push(o-1),o20||Math.abs(this.touchDelta.x)>l/2,d=!a&&this.touchDelta.x>0||a===this.num-1&&this.touchDelta.x<0,p=!u&&this.options.closeOnSwipeUpOrDown&&(c&&Math.abs(this.touchDelta.y)>20||Math.abs(this.touchDelta.y)>this.slideHeight/2);this.options.continuous&&(d=!1),t=this.touchDelta.x<0?-1:1,this.isScrolling?p?this.close():this.translateY(a,0,s):u&&!d?(n=a+t,i=a-t,r=l*t,o=-l*t,this.options.continuous?(this.move(this.circle(n),r,0),this.move(this.circle(a-2*t),o,0)):n>=0&&nthis.container[0].clientHeight&&(i.style.maxHeight=this.container[0].clientHeight),this.interval&&this.slides[this.index]===r&&this.play(),this.setTimeout(this.options.onslidecomplete,[n,r]))},onload:function(e){this.oncomplete(e)},onerror:function(e){this.oncomplete(e)},onkeydown:function(e){switch(e.which||e.keyCode){case 13:this.options.toggleControlsOnReturn&&(this.preventDefault(e),this.toggleControls());break;case 27:this.options.closeOnEscape&&(this.close(),e.stopImmediatePropagation());break;case 32:this.options.toggleSlideshowOnSpace&&(this.preventDefault(e),this.toggleSlideshow());break;case 37:this.options.enableKeyboardNavigation&&(this.preventDefault(e),this.prev());break;case 39:this.options.enableKeyboardNavigation&&(this.preventDefault(e),this.next())}},handleClick:function(t){var n=this.options,i=t.target||t.srcElement,r=i.parentNode;function o(t){return e(i).hasClass(t)||e(r).hasClass(t)}o(n.toggleClass)?(this.preventDefault(t),this.toggleControls()):o(n.prevClass)?(this.preventDefault(t),this.prev()):o(n.nextClass)?(this.preventDefault(t),this.next()):o(n.closeClass)?(this.preventDefault(t),this.close()):o(n.playPauseClass)?(this.preventDefault(t),this.toggleSlideshow()):r===this.slidesContainer[0]?n.closeOnSlideClick?(this.preventDefault(t),this.close()):n.toggleControlsOnSlideClick&&(this.preventDefault(t),this.toggleControls()):r.parentNode&&r.parentNode===this.slidesContainer[0]&&n.toggleControlsOnSlideClick&&(this.preventDefault(t),this.toggleControls())},onclick:function(e){if(!(this.options.emulateTouchEvents&&this.touchDelta&&(Math.abs(this.touchDelta.x)>20||Math.abs(this.touchDelta.y)>20)))return this.handleClick(e);delete this.touchDelta},updateEdgeClasses:function(e){e?this.container.removeClass(this.options.leftEdgeClass):this.container.addClass(this.options.leftEdgeClass),e===this.num-1?this.container.addClass(this.options.rightEdgeClass):this.container.removeClass(this.options.rightEdgeClass)},handleSlide:function(e){this.options.continuous||this.updateEdgeClasses(e),this.loadElements(e),this.options.unloadElements&&this.unloadElements(e),this.setTitle(e)},onslide:function(e){this.index=e,this.handleSlide(e),this.setTimeout(this.options.onslide,[e,this.slides[e]])},setTitle:function(e){var t=this.slides[e].firstChild.title,n=this.titleElement;n.length&&(this.titleElement.empty(),t&&n[0].appendChild(document.createTextNode(t)))},setTimeout:function(e,t,n){var i=this;return e&&window.setTimeout(function(){e.apply(i,t||[])},n||0)},imageFactory:function(t,n){var i,r,o,a=this,s=this.imagePrototype.cloneNode(!1),l=t,c=this.options.stretchImages;return"string"!=typeof l&&(l=this.getItemProperty(t,this.options.urlProperty),o=this.getItemProperty(t,this.options.titleProperty)),!0===c&&(c="contain"),(c=this.support.backgroundSize&&this.support.backgroundSize[c]&&c)?r=this.elementPrototype.cloneNode(!1):(r=s,s.draggable=!1),o&&(r.title=o),e(s).on("load error",function t(o){if(!i){if(o={type:o.type,target:r},!r.parentNode)return a.setTimeout(t,[o]);i=!0,e(s).off("load error",t),c&&"load"===o.type&&(r.style.background='url("'+l+'") center no-repeat',r.style.backgroundSize=c),n(o)}}),s.src=l,r},createElement:function(t,n){var i=t&&this.getItemProperty(t,this.options.typeProperty),r=i&&this[i.split("/")[0]+"Factory"]||this.imageFactory,o=t&&r.call(this,t,n),a=this.getItemProperty(t,this.options.srcsetProperty);return o||(o=this.elementPrototype.cloneNode(!1),this.setTimeout(n,[{type:"error",target:o}])),a&&o.setAttribute("srcset",a),e(o).addClass(this.options.slideContentClass),o},loadElement:function(t){this.elements[t]||(this.slides[t].firstChild?this.elements[t]=e(this.slides[t]).hasClass(this.options.slideErrorClass)?3:2:(this.elements[t]=1,e(this.slides[t]).addClass(this.options.slideLoadingClass),this.slides[t].appendChild(this.createElement(this.list[t],this.proxyListener))))},loadElements:function(e){var t,n=Math.min(this.num,2*this.options.preloadRange+1),i=e;for(t=0;tthis.options.preloadRange&&n+this.options.preloadRangee?-this.slideWidth:this.index(e*=2)?.5*e*e*((this._p2+1)*e-this._p2):.5*((e-=2)*e*((this._p2+1)*e+this._p2)+2)})),m=l("easing.SlowMo",function(e,t,n){t=t||0===t?t:.7,null==e?e=.7:e>1&&(e=1),this._p=1!==e?t:0,this._p1=(1-e)/2,this._p2=e,this._p3=this._p1+this._p2,this._calcEnd=!0===n},!0),g=m.prototype=new e;return g.constructor=m,g.getRatio=function(e){var t=e+(.5-e)*this._p;return this._p1>e?this._calcEnd?1-(e=1-e/this._p1)*e:t-(e=1-e/this._p1)*e*e*e*t:e>this._p3?this._calcEnd?1-(e=(e-this._p3)/this._p1)*e:t+(e-t)*(e=(e-this._p3)/this._p1)*e*e*e:this._calcEnd?1:t},m.ease=new m(.7,.7),g.config=m.config=function(e,t,n){return new m(e,t,n)},(g=(t=l("easing.SteppedEase",function(e){e=e||1,this._p1=1/e,this._p2=e+1},!0)).prototype=new e).constructor=t,g.getRatio=function(e){return 0>e?e=0:e>=1&&(e=.999999999),(this._p2*e>>0)*this._p1},g.config=t.config=function(e){return new t(e)},(g=(n=l("easing.RoughEase",function(t){for(var n,i,r,o,a,s,l=(t=t||{}).taper||"none",c=[],u=0,d=0|(t.points||20),f=d,h=!1!==t.randomize,m=!0===t.clamp,g=t.template instanceof e?t.template:null,v="number"==typeof t.strength?.4*t.strength:.4;--f>-1;)n=h?Math.random():1/d*f,i=g?g.getRatio(n):n,"none"===l?r=v:"out"===l?r=(o=1-n)*o*v:"in"===l?r=n*n*v:.5>n?r=.5*(o=2*n)*o*v:r=.5*(o=2*(1-n))*o*v,h?i+=Math.random()*r-.5*r:f%2?i+=.5*r:i-=.5*r,m&&(i>1?i=1:0>i&&(i=0)),c[u++]={x:n,y:i};for(c.sort(function(e,t){return e.x-t.x}),s=new p(1,1,null),f=d;--f>-1;)a=c[f],s=new p(a.x,a.y,s);this._prev=new p(0,0,0!==s.t?s:s.next)},!0)).prototype=new e).constructor=n,g.getRatio=function(e){var t=this._prev;if(e>t.t){for(;t.next&&e>=t.t;)t=t.next;t=t.prev}else for(;t.prev&&t.t>=e;)t=t.prev;return this._prev=t,t.v+(e-t.t)/t.gap*t.c},g.config=function(e){return new n(e)},n.ease=new n,d("Bounce",c("BounceOut",function(e){return 1/2.75>e?7.5625*e*e:2/2.75>e?7.5625*(e-=1.5/2.75)*e+.75:2.5/2.75>e?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375}),c("BounceIn",function(e){return 1/2.75>(e=1-e)?1-7.5625*e*e:2/2.75>e?1-(7.5625*(e-=1.5/2.75)*e+.75):2.5/2.75>e?1-(7.5625*(e-=2.25/2.75)*e+.9375):1-(7.5625*(e-=2.625/2.75)*e+.984375)}),c("BounceInOut",function(e){var t=.5>e;return e=1/2.75>(e=t?1-2*e:2*e-1)?7.5625*e*e:2/2.75>e?7.5625*(e-=1.5/2.75)*e+.75:2.5/2.75>e?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375,t?.5*(1-e):.5*e+.5})),d("Circ",c("CircOut",function(e){return Math.sqrt(1-(e-=1)*e)}),c("CircIn",function(e){return-(Math.sqrt(1-e*e)-1)}),c("CircInOut",function(e){return 1>(e*=2)?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1)})),d("Elastic",(i=function(t,n,i){var r=l("easing."+t,function(e,t){this._p1=e||1,this._p2=t||i,this._p3=this._p2/a*(Math.asin(1/this._p1)||0)},!0),o=r.prototype=new e;return o.constructor=r,o.getRatio=n,o.config=function(e,t){return new r(e,t)},r})("ElasticOut",function(e){return this._p1*Math.pow(2,-10*e)*Math.sin((e-this._p3)*a/this._p2)+1},.3),i("ElasticIn",function(e){return-this._p1*Math.pow(2,10*(e-=1))*Math.sin((e-this._p3)*a/this._p2)},.3),i("ElasticInOut",function(e){return 1>(e*=2)?-.5*this._p1*Math.pow(2,10*(e-=1))*Math.sin((e-this._p3)*a/this._p2):.5*this._p1*Math.pow(2,-10*(e-=1))*Math.sin((e-this._p3)*a/this._p2)+1},.45)),d("Expo",c("ExpoOut",function(e){return 1-Math.pow(2,-10*e)}),c("ExpoIn",function(e){return Math.pow(2,10*(e-1))-.001}),c("ExpoInOut",function(e){return 1>(e*=2)?.5*Math.pow(2,10*(e-1)):.5*(2-Math.pow(2,-10*(e-1)))})),d("Sine",c("SineOut",function(e){return Math.sin(e*s)}),c("SineIn",function(e){return 1-Math.cos(e*s)}),c("SineInOut",function(e){return-.5*(Math.cos(Math.PI*e)-1)})),l("easing.EaseLookup",{find:function(t){return e.map[t]}},!0),u(r.SlowMo,"SlowMo","ease,"),u(n,"RoughEase","ease,"),u(t,"SteppedEase","ease,"),h},!0)}),_gsScope._gsDefine&&_gsScope._gsQueue.pop()(),define("easePack",function(){}),function(e,t){"use strict";var n=e.GreenSockGlobals=e.GreenSockGlobals||e;if(!n.TweenLite){var i,r,o,a,s,l=function(e){var t,i=e.split("."),r=n;for(t=0;i.length>t;t++)r[i[t]]=r=r[i[t]]||{};return r},c=l("com.greensock"),u=1e-10,d=function(e){var t,n=[],i=e.length;for(t=0;t!==i;n.push(e[t++]));return n},p=function(){},f=function(){var e=Object.prototype.toString,t=e.call([]);return function(n){return null!=n&&(n instanceof Array||"object"==typeof n&&!!n.push&&e.call(n)===t)}}(),h={},m=function(t,i,r,o){this.sc=h[t]?h[t].sc:[],h[t]=this,this.gsClass=null,this.func=r;var a=[];this.check=function(s){for(var c,u,d,p,f=i.length,g=f;--f>-1;)(c=h[i[f]]||new m(i[f],[])).gsClass?(a[f]=c.gsClass,g--):s&&c.sc.push(this);if(0===g&&r)for(d=(u=("com.greensock."+t).split(".")).pop(),p=l(u.join("."))[d]=this.gsClass=r.apply(r,a),o&&(n[d]=p,"function"==typeof define&&define.amd?define((e.GreenSockAMDPath?e.GreenSockAMDPath+"/":"")+t.split(".").pop(),[],function(){return p}):"TweenLite"===t&&"undefined"!=typeof module&&module.exports&&(module.exports=p)),f=0;this.sc.length>f;f++)this.sc[f].check()},this.check(!0)},g=e._gsDefine=function(e,t,n,i){return new m(e,t,n,i)},v=c._class=function(e,t,n){return t=t||function(){},g(e,[],function(){return t},n),t};g.globals=n;var y=[0,0,1,1],b=[],w=v("easing.Ease",function(e,t,n,i){this._func=e,this._type=n||0,this._power=i||0,this._params=t?y.concat(t):y},!0),x=w.map={},C=w.register=function(e,t,n,i){for(var r,o,a,s,l=t.split(","),u=l.length,d=(n||"easeIn,easeOut,easeInOut").split(",");--u>-1;)for(o=l[u],r=i?v("easing."+o,null,!0):c.easing[o]||{},a=d.length;--a>-1;)s=d[a],x[o+"."+s]=x[s+o]=r[s]=e.getRatio?e:e[s]||new e};for((o=w.prototype)._calcEnd=!1,o.getRatio=function(e){if(this._func)return this._params[0]=e,this._func.apply(null,this._params);var t=this._type,n=this._power,i=1===t?1-e:2===t?e:.5>e?2*e:2*(1-e);return 1===n?i*=i:2===n?i*=i*i:3===n?i*=i*i*i:4===n&&(i*=i*i*i*i),1===t?1-i:2===t?i:.5>e?i/2:1-i/2},r=(i=["Linear","Quad","Cubic","Quart","Quint,Strong"]).length;--r>-1;)o=i[r]+",Power"+r,C(new w(null,null,1,r),o,"easeOut",!0),C(new w(null,null,2,r),o,"easeIn"+(0===r?",easeNone":"")),C(new w(null,null,3,r),o,"easeInOut");x.linear=c.easing.Linear.easeIn,x.swing=c.easing.Quad.easeInOut;var S=v("events.EventDispatcher",function(e){this._listeners={},this._eventTarget=e||this});(o=S.prototype).addEventListener=function(e,t,n,i,r){r=r||0;var o,l,c=this._listeners[e],u=0;for(null==c&&(this._listeners[e]=c=[]),l=c.length;--l>-1;)(o=c[l]).c===t&&o.s===n?c.splice(l,1):0===u&&r>o.pr&&(u=l+1);c.splice(u,0,{c:t,s:n,up:i,pr:r}),this!==a||s||a.wake()},o.removeEventListener=function(e,t){var n,i=this._listeners[e];if(i)for(n=i.length;--n>-1;)if(i[n].c===t)return void i.splice(n,1)},o.dispatchEvent=function(e){var t,n,i,r=this._listeners[e];if(r)for(t=r.length,n=this._eventTarget;--t>-1;)(i=r[t]).up?i.c.call(i.s||n,{type:e,target:n}):i.c.call(i.s||n)};var _=e.requestAnimationFrame,T=e.cancelAnimationFrame,k=Date.now||function(){return(new Date).getTime()},D=k();for(r=(i=["ms","moz","webkit","o"]).length;--r>-1&&!_;)_=e[i[r]+"RequestAnimationFrame"],T=e[i[r]+"CancelAnimationFrame"]||e[i[r]+"CancelRequestAnimationFrame"];v("Ticker",function(e,t){var n,i,r,o,l,c=this,d=k(),f=!1!==t&&_,h=500,m=33,g=function(e){var t,a,s=k()-D;s>h&&(d+=s-m),D+=s,c.time=(D-d)/1e3,t=c.time-l,(!n||t>0||!0===e)&&(c.frame++,l+=t+(t>=o?.004:o-t),a=!0),!0!==e&&(r=i(g)),a&&c.dispatchEvent("tick")};S.call(c),c.time=c.frame=0,c.tick=function(){g(!0)},c.lagSmoothing=function(e,t){h=e||1/u,m=Math.min(t,h,0)},c.sleep=function(){null!=r&&(f&&T?T(r):clearTimeout(r),i=p,r=null,c===a&&(s=!1))},c.wake=function(){null!==r?c.sleep():c.frame>10&&(D=k()-h+5),i=0===n?p:f&&_?_:function(e){return setTimeout(e,0|1e3*(l-c.time)+1)},c===a&&(s=!0),g(2)},c.fps=function(e){return arguments.length?(o=1/((n=e)||60),l=this.time+o,void c.wake()):n},c.useRAF=function(e){return arguments.length?(c.sleep(),f=e,void c.fps(n)):f},c.fps(e),setTimeout(function(){f&&(!r||5>c.frame)&&c.useRAF(!1)},1500)}),(o=c.Ticker.prototype=new c.events.EventDispatcher).constructor=c.Ticker;var E=v("core.Animation",function(e,t){if(this.vars=t=t||{},this._duration=this._totalDuration=e||0,this._delay=Number(t.delay)||0,this._timeScale=1,this._active=!0===t.immediateRender,this.data=t.data,this._reversed=!0===t.reversed,U){s||a.wake();var n=this.vars.useFrames?q:U;n.add(this,n._time),this.vars.paused&&this.paused(!0)}});a=E.ticker=new c.Ticker,(o=E.prototype)._dirty=o._gc=o._initted=o._paused=!1,o._totalTime=o._time=0,o._rawPrevTime=-1,o._next=o._last=o._onUpdate=o._timeline=o.timeline=null,o._paused=!1;var A=function(){s&&k()-D>2e3&&a.wake(),setTimeout(A,2e3)};A(),o.play=function(e,t){return null!=e&&this.seek(e,t),this.reversed(!1).paused(!1)},o.pause=function(e,t){return null!=e&&this.seek(e,t),this.paused(!0)},o.resume=function(e,t){return null!=e&&this.seek(e,t),this.paused(!1)},o.seek=function(e,t){return this.totalTime(Number(e),!1!==t)},o.restart=function(e,t){return this.reversed(!1).paused(!1).totalTime(e?-this._delay:0,!1!==t,!0)},o.reverse=function(e,t){return null!=e&&this.seek(e||this.totalDuration(),t),this.reversed(!0).paused(!1)},o.render=function(){},o.invalidate=function(){return this},o.isActive=function(){var e,t=this._timeline,n=this._startTime;return!t||!this._gc&&!this._paused&&t.isActive()&&(e=t.rawTime())>=n&&n+this.totalDuration()/this._timeScale>e},o._enabled=function(e,t){return s||a.wake(),this._gc=!e,this._active=this.isActive(),!0!==t&&(e&&!this.timeline?this._timeline.add(this,this._startTime-this._delay):!e&&this.timeline&&this._timeline._remove(this,!0)),!1},o._kill=function(){return this._enabled(!1,!1)},o.kill=function(e,t){return this._kill(e,t),this},o._uncache=function(e){for(var t=e?this:this.timeline;t;)t._dirty=!0,t=t.timeline;return this},o._swapSelfInParams=function(e){for(var t=e.length,n=e.concat();--t>-1;)"{self}"===e[t]&&(n[t]=this);return n},o.eventCallback=function(e,t,n,i){if("on"===(e||"").substr(0,2)){var r=this.vars;if(1===arguments.length)return r[e];null==t?delete r[e]:(r[e]=t,r[e+"Params"]=f(n)&&-1!==n.join("").indexOf("{self}")?this._swapSelfInParams(n):n,r[e+"Scope"]=i),"onUpdate"===e&&(this._onUpdate=t)}return this},o.delay=function(e){return arguments.length?(this._timeline.smoothChildTiming&&this.startTime(this._startTime+e-this._delay),this._delay=e,this):this._delay},o.duration=function(e){return arguments.length?(this._duration=this._totalDuration=e,this._uncache(!0),this._timeline.smoothChildTiming&&this._time>0&&this._timethis._duration?this._duration:e,t)):this._time},o.totalTime=function(e,t,n){if(s||a.wake(),!arguments.length)return this._totalTime;if(this._timeline){if(0>e&&!n&&(e+=this.totalDuration()),this._timeline.smoothChildTiming){this._dirty&&this.totalDuration();var i=this._totalDuration,r=this._timeline;if(e>i&&!n&&(e=i),this._startTime=(this._paused?this._pauseTime:r._time)-(this._reversed?i-e:e)/this._timeScale,r._dirty||this._uncache(!1),r._timeline)for(;r._timeline;)r._timeline._time!==(r._startTime+r._totalTime)/r._timeScale&&r.totalTime(r._totalTime,!0),r=r._timeline}this._gc&&this._enabled(!0,!1),(this._totalTime!==e||0===this._duration)&&(this.render(e,t,!1),$.length&&H())}return this},o.progress=o.totalProgress=function(e,t){return arguments.length?this.totalTime(this.duration()*e,t):this._time/this.duration()},o.startTime=function(e){return arguments.length?(e!==this._startTime&&(this._startTime=e,this.timeline&&this.timeline._sortChildren&&this.timeline.add(this,e-this._delay)),this):this._startTime},o.timeScale=function(e){if(!arguments.length)return this._timeScale;if(e=e||u,this._timeline&&this._timeline.smoothChildTiming){var t=this._pauseTime,n=t||0===t?t:this._timeline.totalTime();this._startTime=n-(n-this._startTime)*this._timeScale/e}return this._timeScale=e,this._uncache(!1)},o.reversed=function(e){return arguments.length?(e!=this._reversed&&(this._reversed=e,this.totalTime(this._timeline&&!this._timeline.smoothChildTiming?this.totalDuration()-this._totalTime:this._totalTime,!0)),this):this._reversed},o.paused=function(e){if(!arguments.length)return this._paused;if(e!=this._paused&&this._timeline){s||e||a.wake();var t=this._timeline,n=t.rawTime(),i=n-this._pauseTime;!e&&t.smoothChildTiming&&(this._startTime+=i,this._uncache(!1)),this._pauseTime=e?n:null,this._paused=e,this._active=this.isActive(),!e&&0!==i&&this._initted&&this.duration()&&this.render(t.smoothChildTiming?this._totalTime:(n-this._startTime)/this._timeScale,!0,!0)}return this._gc&&!e&&this._enabled(!0,!1),this};var O=v("core.SimpleTimeline",function(e){E.call(this,0,e),this.autoRemoveChildren=this.smoothChildTiming=!0});(o=O.prototype=new E).constructor=O,o.kill()._gc=!1,o._first=o._last=null,o._sortChildren=!1,o.add=o.insert=function(e,t){var n,i;if(e._startTime=Number(t||0)+e._delay,e._paused&&this!==e._timeline&&(e._pauseTime=e._startTime+(this.rawTime()-e._startTime)/e._timeScale),e.timeline&&e.timeline._remove(e,!0),e.timeline=e._timeline=this,e._gc&&e._enabled(!0,!0),n=this._last,this._sortChildren)for(i=e._startTime;n&&n._startTime>i;)n=n._prev;return n?(e._next=n._next,n._next=e):(e._next=this._first,this._first=e),e._next?e._next._prev=e:this._last=e,e._prev=n,this._timeline&&this._uncache(!0),this},o._remove=function(e,t){return e.timeline===this&&(t||e._enabled(!1,!0),e._prev?e._prev._next=e._next:this._first===e&&(this._first=e._next),e._next?e._next._prev=e._prev:this._last===e&&(this._last=e._prev),e._next=e._prev=e.timeline=null,this._timeline&&this._uncache(!0)),this},o.render=function(e,t,n){var i,r=this._first;for(this._totalTime=this._time=this._rawPrevTime=e;r;)i=r._next,(r._active||e>=r._startTime&&!r._paused)&&(r._reversed?r.render((r._dirty?r.totalDuration():r._totalDuration)-(e-r._startTime)*r._timeScale,t,n):r.render((e-r._startTime)*r._timeScale,t,n)),r=i},o.rawTime=function(){return s||a.wake(),this._totalTime};var I=v("TweenLite",function(t,n,i){if(E.call(this,n,i),this.render=I.prototype.render,null==t)throw"Cannot tween a null target.";this.target=t="string"!=typeof t?t:I.selector(t)||t;var r,o,a,s=t.jquery||t.length&&t!==e&&t[0]&&(t[0]===e||t[0].nodeType&&t[0].style&&!t.nodeType),l=this.vars.overwrite;if(this._overwrite=l=null==l?F[I.defaultOverwrite]:"number"==typeof l?l>>0:F[l],(s||t instanceof Array||t.push&&f(t))&&"number"!=typeof t[0])for(this._targets=a=d(t),this._propLookup=[],this._siblings=[],r=0;a.length>r;r++)(o=a[r])?"string"!=typeof o?o.length&&o!==e&&o[0]&&(o[0]===e||o[0].nodeType&&o[0].style&&!o.nodeType)?(a.splice(r--,1),this._targets=a=a.concat(d(o))):(this._siblings[r]=z(o,this,!1),1===l&&this._siblings[r].length>1&&W(o,this,null,1,this._siblings[r])):"string"==typeof(o=a[r--]=I.selector(o))&&a.splice(r+1,1):a.splice(r--,1);else this._propLookup={},this._siblings=z(t,this,!1),1===l&&this._siblings.length>1&&W(t,this,null,1,this._siblings);(this.vars.immediateRender||0===n&&0===this._delay&&!1!==this.vars.immediateRender)&&(this._time=-u,this.render(-this._delay))},!0),P=function(t){return t.length&&t!==e&&t[0]&&(t[0]===e||t[0].nodeType&&t[0].style&&!t.nodeType)};(o=I.prototype=new E).constructor=I,o.kill()._gc=!1,o.ratio=0,o._firstPT=o._targets=o._overwrittenProps=o._startAt=null,o._notifyPluginsOfEnabled=o._lazy=!1,I.version="1.13.1",I.defaultEase=o._ease=new w(null,null,1,1),I.defaultOverwrite="auto",I.ticker=a,I.autoSleep=!0,I.lagSmoothing=function(e,t){a.lagSmoothing(e,t)},I.selector=e.$||e.jQuery||function(t){var n=e.$||e.jQuery;return n?(I.selector=n,n(t)):"undefined"==typeof document?t:document.querySelectorAll?document.querySelectorAll(t):document.getElementById("#"===t.charAt(0)?t.substr(1):t)};var $=[],R={},j=I._internals={isArray:f,isSelector:P,lazyTweens:$},L=I._plugins={},N=j.tweenLookup={},M=0,B=j.reservedProps={ease:1,delay:1,overwrite:1,onComplete:1,onCompleteParams:1,onCompleteScope:1,useFrames:1,runBackwards:1,startAt:1,onUpdate:1,onUpdateParams:1,onUpdateScope:1,onStart:1,onStartParams:1,onStartScope:1,onReverseComplete:1,onReverseCompleteParams:1,onReverseCompleteScope:1,onRepeat:1,onRepeatParams:1,onRepeatScope:1,easeParams:1,yoyo:1,immediateRender:1,repeat:1,repeatDelay:1,data:1,paused:1,reversed:1,autoCSS:1,lazy:1},F={none:0,all:1,auto:2,concurrent:3,allOnStart:4,preexisting:5,true:1,false:0},q=E._rootFramesTimeline=new O,U=E._rootTimeline=new O,H=j.lazyRender=function(){var e=$.length;for(R={};--e>-1;)(i=$[e])&&!1!==i._lazy&&(i.render(i._lazy,!1,!0),i._lazy=!1);$.length=0};U._startTime=a.time,q._startTime=a.frame,U._active=q._active=!0,setTimeout(H,1),E._updateRoot=I.render=function(){var e,t,n;if($.length&&H(),U.render((a.time-U._startTime)*U._timeScale,!1,!1),q.render((a.frame-q._startTime)*q._timeScale,!1,!1),$.length&&H(),!(a.frame%120)){for(n in N){for(e=(t=N[n].tweens).length;--e>-1;)t[e]._gc&&t.splice(e,1);0===t.length&&delete N[n]}if((!(n=U._first)||n._paused)&&I.autoSleep&&!q._first&&1===a._listeners.tick.length){for(;n&&n._paused;)n=n._next;n||a.sleep()}}},a.addEventListener("tick",E._updateRoot);var z=function(e,t,n){var i,r,o=e._gsTweenID;if(N[o||(e._gsTweenID=o="t"+M++)]||(N[o]={target:e,tweens:[]}),t&&((i=N[o].tweens)[r=i.length]=t,n))for(;--r>-1;)i[r]===t&&i.splice(r,1);return N[o].tweens},W=function(e,t,n,i,r){var o,a,s,l;if(1===i||i>=4){for(l=r.length,o=0;l>o;o++)if((s=r[o])!==t)s._gc||s._enabled(!1,!1)&&(a=!0);else if(5===i)break;return a}var c,d=t._startTime+u,p=[],f=0,h=0===t._duration;for(o=r.length;--o>-1;)(s=r[o])===t||s._gc||s._paused||(s._timeline!==t._timeline?(c=c||V(t,0,h),0===V(s,c,h)&&(p[f++]=s)):d>=s._startTime&&s._startTime+s.totalDuration()/s._timeScale>d&&((h||!s._initted)&&2e-10>=d-s._startTime||(p[f++]=s)));for(o=f;--o>-1;)s=p[o],2===i&&s._kill(n,e)&&(a=!0),(2!==i||!s._firstPT&&s._initted)&&s._enabled(!1,!1)&&(a=!0);return a},V=function(e,t,n){for(var i=e._timeline,r=i._timeScale,o=e._startTime;i._timeline;){if(o+=i._startTime,r*=i._timeScale,i._paused)return-100;i=i._timeline}return(o/=r)>t?o-t:n&&o===t||!e._initted&&2*u>o-t?u:(o+=e.totalDuration()/e._timeScale/r)>t+u?0:o-t-u};o._init=function(){var e,t,n,i,r,o=this.vars,a=this._overwrittenProps,s=this._duration,l=!!o.immediateRender,c=o.ease;if(o.startAt){for(i in this._startAt&&(this._startAt.render(-1,!0),this._startAt.kill()),r={},o.startAt)r[i]=o.startAt[i];if(r.overwrite=!1,r.immediateRender=!0,r.lazy=l&&!1!==o.lazy,r.startAt=r.delay=null,this._startAt=I.to(this.target,0,r),l)if(this._time>0)this._startAt=null;else if(0!==s)return}else if(o.runBackwards&&0!==s)if(this._startAt)this._startAt.render(-1,!0),this._startAt.kill(),this._startAt=null;else{for(i in n={},o)B[i]&&"autoCSS"!==i||(n[i]=o[i]);if(n.overwrite=0,n.data="isFromStart",n.lazy=l&&!1!==o.lazy,n.immediateRender=l,this._startAt=I.to(this.target,0,n),l){if(0===this._time)return}else this._startAt._init(),this._startAt._enabled(!1)}if(this._ease=c=c?c instanceof w?c:"function"==typeof c?new w(c,o.easeParams):x[c]||I.defaultEase:I.defaultEase,o.easeParams instanceof Array&&c.config&&(this._ease=c.config.apply(c,o.easeParams)),this._easeType=this._ease._type,this._easePower=this._ease._power,this._firstPT=null,this._targets)for(e=this._targets.length;--e>-1;)this._initProps(this._targets[e],this._propLookup[e]={},this._siblings[e],a?a[e]:null)&&(t=!0);else t=this._initProps(this.target,this._propLookup,this._siblings,a);if(t&&I._onPluginEvent("_onInitAllProps",this),a&&(this._firstPT||"function"!=typeof this.target&&this._enabled(!1,!1)),o.runBackwards)for(n=this._firstPT;n;)n.s+=n.c,n.c=-n.c,n=n._next;this._onUpdate=o.onUpdate,this._initted=!0},o._initProps=function(t,n,i,r){var o,a,s,l,c,u;if(null==t)return!1;for(o in R[t._gsTweenID]&&H(),this.vars.css||t.style&&t!==e&&t.nodeType&&L.css&&!1!==this.vars.autoCSS&&function(e,t){var n,i={};for(n in e)B[n]||n in t&&"transform"!==n&&"x"!==n&&"y"!==n&&"width"!==n&&"height"!==n&&"className"!==n&&"border"!==n||!(!L[n]||L[n]&&L[n]._autoCSS)||(i[n]=e[n],delete e[n]);e.css=i}(this.vars,t),this.vars){if(u=this.vars[o],B[o])u&&(u instanceof Array||u.push&&f(u))&&-1!==u.join("").indexOf("{self}")&&(this.vars[o]=u=this._swapSelfInParams(u,this));else if(L[o]&&(l=new L[o])._onInitTween(t,this.vars[o],this)){for(this._firstPT=c={_next:this._firstPT,t:l,p:"setRatio",s:0,c:1,f:!0,n:o,pg:!0,pr:l._priority},a=l._overwriteProps.length;--a>-1;)n[l._overwriteProps[a]]=this._firstPT;(l._priority||l._onInitAllProps)&&(s=!0),(l._onDisable||l._onEnable)&&(this._notifyPluginsOfEnabled=!0)}else this._firstPT=n[o]=c={_next:this._firstPT,t,p:o,f:"function"==typeof t[o],n:o,pg:!1,pr:0},c.s=c.f?t[o.indexOf("set")||"function"!=typeof t["get"+o.substr(3)]?o:"get"+o.substr(3)]():parseFloat(t[o]),c.c="string"==typeof u&&"="===u.charAt(1)?parseInt(u.charAt(0)+"1",10)*Number(u.substr(2)):Number(u)-c.s||0;c&&c._next&&(c._next._prev=c)}return r&&this._kill(r,t)?this._initProps(t,n,i,r):this._overwrite>1&&this._firstPT&&i.length>1&&W(t,this,n,this._overwrite,i)?(this._kill(n,t),this._initProps(t,n,i,r)):(this._firstPT&&(!1!==this.vars.lazy&&this._duration||this.vars.lazy&&!this._duration)&&(R[t._gsTweenID]=!0),s)},o.render=function(e,t,n){var i,r,o,a,s=this._time,l=this._duration,c=this._rawPrevTime;if(e>=l)this._totalTime=this._time=l,this.ratio=this._ease._calcEnd?this._ease.getRatio(1):1,this._reversed||(i=!0,r="onComplete"),0===l&&(this._initted||!this.vars.lazy||n)&&(this._startTime===this._timeline._duration&&(e=0),(0===e||0>c||c===u)&&c!==e&&(n=!0,c>u&&(r="onReverseComplete")),this._rawPrevTime=a=!t||e||c===e?e:u);else if(1e-7>e)this._totalTime=this._time=0,this.ratio=this._ease._calcEnd?this._ease.getRatio(0):0,(0!==s||0===l&&c>0&&c!==u)&&(r="onReverseComplete",i=this._reversed),0>e?(this._active=!1,0===l&&(this._initted||!this.vars.lazy||n)&&(c>=0&&(n=!0),this._rawPrevTime=a=!t||e||c===e?e:u)):this._initted||(n=!0);else if(this._totalTime=this._time=e,this._easeType){var d=e/l,p=this._easeType,f=this._easePower;(1===p||3===p&&d>=.5)&&(d=1-d),3===p&&(d*=2),1===f?d*=d:2===f?d*=d*d:3===f?d*=d*d*d:4===f&&(d*=d*d*d*d),this.ratio=1===p?1-d:2===p?d:.5>e/l?d/2:1-d/2}else this.ratio=this._ease.getRatio(e/l);if(this._time!==s||n){if(!this._initted){if(this._init(),!this._initted||this._gc)return;if(!n&&this._firstPT&&(!1!==this.vars.lazy&&this._duration||this.vars.lazy&&!this._duration))return this._time=this._totalTime=s,this._rawPrevTime=c,$.push(this),void(this._lazy=e);this._time&&!i?this.ratio=this._ease.getRatio(this._time/l):i&&this._ease._calcEnd&&(this.ratio=this._ease.getRatio(0===this._time?0:1))}for(!1!==this._lazy&&(this._lazy=!1),this._active||!this._paused&&this._time!==s&&e>=0&&(this._active=!0),0===s&&(this._startAt&&(e>=0?this._startAt.render(e,t,n):r||(r="_dummyGS")),this.vars.onStart&&(0!==this._time||0===l)&&(t||this.vars.onStart.apply(this.vars.onStartScope||this,this.vars.onStartParams||b))),o=this._firstPT;o;)o.f?o.t[o.p](o.c*this.ratio+o.s):o.t[o.p]=o.c*this.ratio+o.s,o=o._next;this._onUpdate&&(0>e&&this._startAt&&this._startTime&&this._startAt.render(e,t,n),t||(this._time!==s||i)&&this._onUpdate.apply(this.vars.onUpdateScope||this,this.vars.onUpdateParams||b)),r&&(!this._gc||n)&&(0>e&&this._startAt&&!this._onUpdate&&this._startTime&&this._startAt.render(e,t,n),i&&(this._timeline.autoRemoveChildren&&this._enabled(!1,!1),this._active=!1),!t&&this.vars[r]&&this.vars[r].apply(this.vars[r+"Scope"]||this,this.vars[r+"Params"]||b),0===l&&this._rawPrevTime===u&&a!==u&&(this._rawPrevTime=0))}},o._kill=function(e,t){if("all"===e&&(e=null),null==e&&(null==t||t===this.target))return this._lazy=!1,this._enabled(!1,!1);var n,i,r,o,a,s,l,c;if(t="string"!=typeof t?t||this._targets||this.target:I.selector(t)||t,(f(t)||P(t))&&"number"!=typeof t[0])for(n=t.length;--n>-1;)this._kill(e,t[n])&&(s=!0);else{if(this._targets){for(n=this._targets.length;--n>-1;)if(t===this._targets[n]){a=this._propLookup[n]||{},this._overwrittenProps=this._overwrittenProps||[],i=this._overwrittenProps[n]=e?this._overwrittenProps[n]||{}:"all";break}}else{if(t!==this.target)return!1;a=this._propLookup,i=this._overwrittenProps=e?this._overwrittenProps||{}:"all"}if(a){for(r in l=e||a,c=e!==i&&"all"!==i&&e!==a&&("object"!=typeof e||!e._tempKill),l)(o=a[r])&&(o.pg&&o.t._kill(l)&&(s=!0),o.pg&&0!==o.t._overwriteProps.length||(o._prev?o._prev._next=o._next:o===this._firstPT&&(this._firstPT=o._next),o._next&&(o._next._prev=o._prev),o._next=o._prev=null),delete a[r]),c&&(i[r]=1);!this._firstPT&&this._initted&&this._enabled(!1,!1)}}return s},o.invalidate=function(){return this._notifyPluginsOfEnabled&&I._onPluginEvent("_onDisable",this),this._firstPT=null,this._overwrittenProps=null,this._onUpdate=null,this._startAt=null,this._initted=this._active=this._notifyPluginsOfEnabled=this._lazy=!1,this._propLookup=this._targets?{}:[],this},o._enabled=function(e,t){if(s||a.wake(),e&&this._gc){var n,i=this._targets;if(i)for(n=i.length;--n>-1;)this._siblings[n]=z(i[n],this,!0);else this._siblings=z(this.target,this,!0)}return E.prototype._enabled.call(this,e,t),!(!this._notifyPluginsOfEnabled||!this._firstPT)&&I._onPluginEvent(e?"_onEnable":"_onDisable",this)},I.to=function(e,t,n){return new I(e,t,n)},I.from=function(e,t,n){return n.runBackwards=!0,n.immediateRender=0!=n.immediateRender,new I(e,t,n)},I.fromTo=function(e,t,n,i){return i.startAt=n,i.immediateRender=0!=i.immediateRender&&0!=n.immediateRender,new I(e,t,i)},I.delayedCall=function(e,t,n,i,r){return new I(t,0,{delay:e,onComplete:t,onCompleteParams:n,onCompleteScope:i,onReverseComplete:t,onReverseCompleteParams:n,onReverseCompleteScope:i,immediateRender:!1,useFrames:r,overwrite:0})},I.set=function(e,t){return new I(e,0,t)},I.getTweensOf=function(e,t){if(null==e)return[];var n,i,r,o;if(e="string"!=typeof e?e:I.selector(e)||e,(f(e)||P(e))&&"number"!=typeof e[0]){for(n=e.length,i=[];--n>-1;)i=i.concat(I.getTweensOf(e[n],t));for(n=i.length;--n>-1;)for(o=i[n],r=n;--r>-1;)o===i[r]&&i.splice(n,1)}else for(n=(i=z(e).concat()).length;--n>-1;)(i[n]._gc||t&&!i[n].isActive())&&i.splice(n,1);return i},I.killTweensOf=I.killDelayedCallsTo=function(e,t,n){"object"==typeof t&&(n=t,t=!1);for(var i=I.getTweensOf(e,t),r=i.length;--r>-1;)i[r]._kill(n,e)};var X=v("plugins.TweenPlugin",function(e,t){this._overwriteProps=(e||"").split(","),this._propName=this._overwriteProps[0],this._priority=t||0,this._super=X.prototype},!0);if(o=X.prototype,X.version="1.10.1",X.API=2,o._firstPT=null,o._addTween=function(e,t,n,i,r,o){var a,s;return null!=i&&(a="number"==typeof i||"="!==i.charAt(1)?Number(i)-n:parseInt(i.charAt(0)+"1",10)*Number(i.substr(2)))?(this._firstPT=s={_next:this._firstPT,t:e,p:t,s:n,c:a,f:"function"==typeof e[t],n:r||t,r:o},s._next&&(s._next._prev=s),s):void 0},o.setRatio=function(e){for(var t,n=this._firstPT;n;)t=n.c*e+n.s,n.r?t=Math.round(t):1e-6>t&&t>-1e-6&&(t=0),n.f?n.t[n.p](t):n.t[n.p]=t,n=n._next},o._kill=function(e){var t,n=this._overwriteProps,i=this._firstPT;if(null!=e[this._propName])this._overwriteProps=[];else for(t=n.length;--t>-1;)null!=e[n[t]]&&n.splice(t,1);for(;i;)null!=e[i.n]&&(i._next&&(i._next._prev=i._prev),i._prev?(i._prev._next=i._next,i._prev=null):this._firstPT===i&&(this._firstPT=i._next)),i=i._next;return!1},o._roundProps=function(e,t){for(var n=this._firstPT;n;)(e[this._propName]||null!=n.n&&e[n.n.split(this._propName+"_").join("")])&&(n.r=t),n=n._next},I._onPluginEvent=function(e,t){var n,i,r,o,a,s=t._firstPT;if("_onInitAllProps"===e){for(;s;){for(a=s._next,i=r;i&&i.pr>s.pr;)i=i._next;(s._prev=i?i._prev:o)?s._prev._next=s:r=s,(s._next=i)?i._prev=s:o=s,s=a}s=t._firstPT=r}for(;s;)s.pg&&"function"==typeof s.t[e]&&s.t[e]()&&(n=!0),s=s._next;return n},X.activate=function(e){for(var t=e.length;--t>-1;)e[t].API===X.API&&(L[(new e[t])._propName]=e[t]);return!0},g.plugin=function(e){if(!(e&&e.propName&&e.init&&e.API))throw"illegal plugin definition.";var t,n=e.propName,i=e.priority||0,r=e.overwriteProps,o={init:"_onInitTween",set:"setRatio",kill:"_kill",round:"_roundProps",initAll:"_onInitAllProps"},a=v("plugins."+n.charAt(0).toUpperCase()+n.substr(1)+"Plugin",function(){X.call(this,n,i),this._overwriteProps=r||[]},!0===e.global),s=a.prototype=new X(n);for(t in s.constructor=a,a.API=e.API,o)"function"==typeof e[t]&&(s[o[t]]=e[t]);return a.version=e.version,X.activate([a]),a},i=e._gsQueue){for(r=0;i.length>r;r++)i[r]();for(o in h)h[o].func||e.console.log("GSAP encountered missing dependency: com.greensock."+o)}s=!1}}("undefined"!=typeof module&&module.exports&&"undefined"!=typeof global?global:this||window),define("tweenLite",function(){}),define("layout/header_login",["jquery","easePack","tweenLite"],e=>{"use strict";let t,n,i,r,o,a,s,l="pf-header-preview-element",c=!0,u=function(e){let t=0,n=0;e.pageX||e.pageY?(t=e.pageX,n=e.pageY):(e.clientX||e.clientY)&&(t=e.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,n=e.clientY+document.body.scrollTop+document.documentElement.scrollTop),s.x=t,s.y=n},d=function(){c=!(document.body.scrollTop>n)},p=function(){t=window.innerWidth,n=355,i.style.height=n+"px",r.width=t,r.height=n},f=function e(){if(c){o.clearRect(0,0,t,n);for(let e in a)Math.abs(v(s,a[e]))<4e3?(a[e].active=.25,a[e].circle.active=.45):Math.abs(v(s,a[e]))<2e4?(a[e].active=.1,a[e].circle.active=.3):Math.abs(v(s,a[e]))<4e4?(a[e].active=.02,a[e].circle.active=.1):(a[e].active=0,a[e].circle.active=0),m(a[e]),a[e].circle.draw()}requestAnimationFrame(e)},h=function(e){TweenLite.to(e,1+1*Math.random(),{x:e.originX-50+100*Math.random(),y:e.originY-50+100*Math.random(),ease:Circ.easeInOut,onComplete:function(){h(e)}})},m=function(e){if(e.active)for(let t in e.closest)o.beginPath(),o.moveTo(e.x,e.y),o.lineTo(e.closest[t].x,e.closest[t].y),o.strokeStyle="rgba(108, 174, 173,"+e.active+")",o.stroke()},g=function(e,t,n){let i=this;i.pos=e||null,i.radius=t||null,i.color=n||null,this.draw=function(){i.active&&(o.beginPath(),o.arc(i.pos.x,i.pos.y,i.radius,0,2*Math.PI,!1),o.fillStyle="rgba(108, 174, 173,"+i.active+")",o.fill())}},v=function(e,t){return Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2)};e.fn.initHeader=function(c){i=e(this)[0],r=e(this).find("canvas:visible")[0],e("."+l).velocity("transition.bounceIn",{duration:600,stagger:60,delay:120,complete:function(){r&&(!function(){t=window.innerWidth,n=355,s={x:1*t,y:230},i.style.height=n+"px",r.width=t,r.height=n,o=r.getContext("2d"),a=[];for(let e=0;et.longestDuration&&(t.longestDuration=e),a=t.reverse?o-=e:t.playhead,t.paths.push({duration:e,drawStartTime:a,path:s,length:l}),t.playhead+=e}t.totalDuration=t.drawSequential?t.playhead:t.longestDuration,t.rAF=requestAnimationFrame(function(e){i(e,t)}),null!==t.onStart&&t.onStart()};null===t.delay?n():setTimeout(n,t.delay)})},pauseResume:function(){return this.each(function(){var t=e(this).data("lazyLinePainter");t.paused?(t.paused=!1,requestAnimationFrame(function(e){n(e,t)})):(t.paused=!0,cancelAnimationFrame(t.rAF))})},erase:function(){return this.each(function(){var t=e(this).data("lazyLinePainter");t.startTime=null,t.elapsedTime=null,cancelAnimationFrame(t.rAF),t.svg.empty()})},destroy:function(){return this.each(function(){var t=e(this);t.removeData("lazyLinePainter"),t.remove()})}},n=function(e,t){t.startTime=e-t.elapsedTime,requestAnimationFrame(function(e){i(e,t)})},i=function(e,t){t.startTime||(t.startTime=e),t.elapsedTime=e-t.startTime;for(var n=0;n(r=t.elapsedTime-t.paths[n].drawStartTime)&&(r=0):r=t.elapsedTime,rt.paths[n].duration&&(t.paths[n].path.style.strokeDashoffset=0)}t.elapsedTime{"use strict";let t="pf-static-logo-svg",n="logo-ploygon-top-right",i="logo-ploygon-bottom-left",r="logo-ploygon-bottom-right",o="logo-ploygon-top-left";e.fn.drawLogo=function(a,s){let l=e(this),c={logo:{strokepath:[{path:"M195.9 9.6 226.9 297.1 354.2 365 196.2 9.8 ",strokeColor:"#477372",duration:1600},{path:"M1.7 361.3 73.9 284.9 178.6 286.7 2.2 361.4 ",strokeColor:"#5cb85c",duration:1e3},{path:"M192.9 286.7 121.2 318.6 335.6 363.5 193.4 286.7 ",strokeColor:"#375959",duration:900},{path:"M202.8 141.9 0.2 352.6 189.1 0.8 202.7 141.3 ",strokeColor:"#63676a",duration:1500}],dimensions:{width:355,height:366}}};requirejs(["text!templates/layout/logo.html","mustache"],function(u,d){let p={staticLogoId:t,logoPartTopRightClass:n,logoPartBottomLeftClass:i,logoPartBottomRightClass:r,logoPartTopLeftClass:o},f=d.render(u,p);l.html(f),l.lazylinepainter({svgData:c,strokeWidth:2,drawSequential:!1,delay:300,overrideKey:"logo",strokeJoin:"bevel",onComplete:function(){l.find("svg:not(#"+t+")").velocity({opacity:0},{delay:100}),l.find("#"+t).velocity({opacity:1},{delay:100,duration:200,complete:function(){if("function"==typeof a&&a(),!0===s){let n=e("#"+t+" path"),i=[];n.on("mouseover",function(t){let r=e(t.target),o=n.index(r),a=r.attr("data-animationX"),s=r.attr("data-animationY"),l={opacity:[1,1],translateZ:[0,0]};l.translateX=[a,0],l.translateY=[s,0],!1!==i[o]&&e(this).velocity(l,{duration:120,begin:function(){i[o]=!1}}).velocity("reverse",{delay:240,complete:function(){i[o]=!0}})})}}})}}).lazylinepainter("paint")})}}),define("layout/demo_map",["jquery","lazylinepainter"],e=>{"use strict";let t="pf-header-systems",n="pf-header-connectors",i="pf-header-connections",r="pf-header-background",o="pf-header-system",a=600,s=380,l=function(t){let n={connectors:{strokepath:[{path:"m 250.4 34.8 c 1.7 0 3.1 1.3 3.9 2.9 0.8 1.7 0.8 3.7 0 5.3 -0.8 1.7 -2.4 2.7 -4 2.7",duration:150},{path:"m 150 34.7 c -1.7 0 -3.1 1.3 -3.9 2.9 -0.8 1.7 -0.8 3.7 0 5.3 0.8 1.7 2.4 2.7 4 2.7",duration:150},{path:"m 369 96 c -1.7 0 -3.1 1.3 -3.9 2.9 -0.8 1.7 -0.8 3.7 0 5.3 0.8 1.7 2.4 2.7 4 2.7",duration:150},{path:"m 110.4 165 c 1.7 0 3.1 1.3 3.9 2.9 0.8 1.7 0.8 3.7 0 5.3 -0.8 1.7 -2.4 2.7 -4 2.7",duration:150},{path:"m 56 148 c 0 -1.7 1.3 -3.1 2.9 -3.9 1.7 -0.8 3.7 -0.8 5.3 0 1.7 0.8 2.7 2.4 2.7 4",duration:150},{path:"m 229 236 c -1.7 0 -3.1 1.3 -3.9 2.9 -0.8 1.7 -0.8 3.7 0 5.3 0.8 1.7 2.4 2.7 4 2.7",duration:150},{path:"m 331 234.7 c 1.7 0 3.1 1.3 3.9 2.9 0.8 1.7 0.8 3.7 0 5.3 -0.8 1.7 -2.4 2.7 -4 2.7",duration:150},{path:"m 285 251 c 0 1.7 -1.3 3.1 -2.9 3.9 -1.7 0.8 -3.7 0.8 -5.3 0 -1.7 -0.8 -2.7 -2.4 -2.7 -4",duration:150},{path:"m 213 329.5 c 0 -1.7 1.3 -3.1 2.9 -3.9 1.7 -0.8 3.7 -0.8 5.3 0 1.7 0.8 2.7 2.4 2.7 4",duration:150},{path:"m 430 316 c -1.7 0 -3.1 1.3 -3.9 2.9 -0.8 1.7 -0.8 3.7 0 5.3 0.8 1.7 2.4 2.7 4 2.7",duration:150}],dimensions:{width:a,height:s}}};e("#"+i).lazylinepainter({svgData:n,strokeWidth:2,duration:600,drawSequential:!1,strokeOpacity:1,overrideKey:"connectors",strokeJoin:"miter",strokeCap:"butt",strokeColor:"#63676A",onComplete:function(){c(t)}}).lazylinepainter("paint")},c=function(t){let i={connections:{strokepath:[{path:"m 255,40 c 44.5,0 64.2,61.1 109.0,61.15",duration:250,strokeWidth:8},{path:"m 255,40 c 44.5,0 64.2,61.1 109.0,61.15",duration:250,strokeWidth:4,strokeColor:"#3C3F41"},{path:"m 146,40.0 c -51.7,0 -83.8,58.8 -83.8,104.5",duration:250,strokeWidth:8},{path:"m 146,40.0 c -51.7,0 -83.8,58.8 -83.8,104.5",duration:250,strokeWidth:4,strokeColor:"#E28A0D"},{path:"m 115,171 c 45.7,0 64.1,71.2 109.6,70.8",duration:250,strokeWidth:8},{path:"m 115,171 c 45.7,0 64.1,71.2 109.6,70.8",duration:250,strokeWidth:4,strokeColor:"#A52521"},{path:"m 279,256 c 0.5,35.9 -60.1,35.1 -60.1,70.0",duration:250,strokeWidth:8},{path:"m 279,256 c 0.5,35.9 -60.1,35.1 -60.1,70.0",duration:250,strokeWidth:4,strokeColor:"#3C3F41"},{path:"m 335,240 c 44.2,0 43.7,81.6 89.9,81.6",duration:250,strokeWidth:8},{path:"m 335,240 c 44.2,0 43.7,81.6 89.9,81.6",duration:250,strokeWidth:4,strokeColor:"#3C3F41"}],dimensions:{width:a,height:s}}};e("#"+n).lazylinepainter({svgData:i,strokeWidth:2,duration:600,strokeOpacity:1,overrideKey:"connections",strokeJoin:"miter",strokeCap:"butt",strokeColor:"#63676A",onComplete:function(){u(t)}}).lazylinepainter("paint")},u=function(t){e("#"+r+" ."+o).velocity("transition.bounceUpIn",{stagger:150,complete:function(){"function"==typeof t&&t()}})};e.fn.drawDemoMap=function(n){e(this);!function(n){let i={systems:{strokepath:[{path:"m 155 30 90 0 c 2.8 0 5 2.2 5 5 l 0 10 c 0 2.8 -2.2 5 -5 5 l -90 0 c -2.8 0 -5 -2.2 -5 -5 l 0 -10 c 0 -2.8 2.2 -5 5 -5 z",duration:500,strokeColor:"#568A89"},{path:"m 374 91 110 0 c 2.8 0 5 2.2 5 5 l 0 10 c 0 2.8 -2.2 5 -5 5 l -110 0 c -2.8 0 -5 -2.2 -5 -5 l 0 -10 c 0 -2.8 2.2 -5 5 -5 z",duration:500,strokeColor:"#63676A"},{path:"m 15 149 90 0 c 2.8 0 5 2.2 5 5 l 0 30 c 0 2.8 -2.2 5 -5 5 l -90 0 c -2.8 0 -5 -2.2 -5 -5 l 0 -30 c 0 -2.8 2.2 -5 5 -5 z",duration:500,strokeColor:"#D9534F "},{path:"m 235 230 90 0 c 2.8 0 5 2.2 5 5 l 0 10 c 0 2.8 -2.2 5 -5 5 l -90 0 c -2.8 0 -5 -2.2 -5 -5 l 0 -10 c 0 -2.8 2.2 -5 5 -5 z",duration:500,strokeColor:"#63676A"},{path:"m 175 330 90 0 c 2.8 0 5 2.2 5 5 l 0 30 c 0 2.8 -2.2 5 -5 5 l -90 0 c -2.8 0 -5 -2.2 -5 -5 l 0 -30 c 0 -2.8 2.2 -5 5 -5 z",duration:500,strokeColor:"#E28A0D "},{path:"m 436 312 90 0 c 2.8 0 5 2.2 5 5 l 0 10 c 0 2.8 -2.2 5 -5 5 l -90 0 c -2.8 0 -5 -2.2 -5 -5 l 0 -10 c 0 -2.8 2.2 -5 5 -5 z",duration:500,strokeColor:"#5CB85C "}],dimensions:{width:a,height:s}}};e("#"+t).lazylinepainter({svgData:i,strokeWidth:2,strokeOpacity:1,overrideKey:"systems",strokeJoin:"miter",strokeCap:"butt",delay:1e3,onComplete:function(){l(n)}}).lazylinepainter("paint")}(n)}}),define("dialog/account_settings",["jquery","app/init","app/util","bootbox"],(e,t,n,i)=>{"use strict";let r="pf-settings-dialog",o="pf-settings-dialog-account",a="pf-settings-dialog-share",s="pf-settings-dialog-character",l="SESSION.CAPTCHA.ACCOUNT.UPDATE",c="pf-dialog-captcha-wrapper",u="pf-dialog-captcha-image";e.fn.showSettingsDialog=function(){if(n.getOpenDialogs().length>0)return!1;requirejs(["text!templates/dialog/settings.html","mustache"],function(d,p){let f={id:r,settingsAccountContainerId:o,settingsShareContainerId:a,settingsCharacterContainerId:s,userData:t.currentUserData,captchaImageWrapperId:c,captchaImageId:u,formErrorContainerClass:n.config.formErrorContainerClass,ccpImageServer:t.url.ccpImageServer,roleLabel:n.getLabelByRole(n.getObjVal(n.getCurrentUserData(),"character.role")).prop("outerHTML"),characterAutoLocationSelectEnabled:Boolean(n.getObjVal(t,"character.autoLocationSelect"))},h=p.render(d,f),m=i.dialog({title:"Account settings",message:h,show:!1,buttons:{close:{label:"cancel",className:"btn-default"},success:{label:' save',className:"btn-success",callback:function(){let i=e("#"+r).find("form").filter(":visible");if(i.validator("validate"),!0===i.isValidForm()){let r={formData:i.getFormValues()};m.find(".modal-content").showLoadingAnimation(),e.ajax({type:"POST",url:t.path.saveUserConfig,data:r,dataType:"json"}).done(function(t){m.find(".modal-content").hideLoadingAnimation(),t.error&&t.error.length>0?(i.showFormMessage(t.error),e("#"+c).showCaptchaImage(l,function(){e("#captcha").resetFormFields()})):(t.userData&&n.setCurrentUserData(t.userData),i.find(".alert").velocity("transition.slideDownOut",{duration:500,complete:function(){e("#"+c).showCaptchaImage(l,function(){e("#captcha").resetFormFields()})}}),n.showNotify({title:"Account saved",type:"success"}),n.triggerMenuAction(document,"Close"),m.modal("hide"))}).fail(function(t,r,o){m.find(".modal-content").hideLoadingAnimation();let a=r+" "+o;if(n.showNotify({title:t.status+": saveAccountSettings",text:a,type:"error"}),e("#"+c).showCaptchaImage(l,function(){e("#captcha").resetFormFields()}),500===t.status&&t.responseText){let n=e.parseJSON(t.responseText);n.error&&n.error.length>0&&i.showFormMessage(n.error)}e(document).setProgramStatus("problem")})}return!1}}}});m.on("show.bs.modal",function(t){let n=e("#"+c);n.showCaptchaImage(l),n.find("i").on("click",function(){n.showCaptchaImage(l)})}),m.on("shown.bs.modal",function(t){let n=e(this),i=n.find("form");n.initTooltips(),i.initFormValidation()}),m.modal("show"),m.find(".navbar a").on("shown.bs.tab",function(t){m.find(e(this).attr("href")).find('input[data-toggle="toggle"][type="checkbox"]').bootstrapToggle({on:' Enable',off:'Disable ',onstyle:"success",offstyle:"warning",width:100,height:30})})})}}),define("dialog/notification",["jquery","app/init","app/util","bootbox"],(e,t,n,i)=>{"use strict";let r="pf-notification-dialog",o="pf-notification-dialog";e.fn.showNotificationDialog=function(t){0===e("."+o).length&&(e(".modal").modal("hide"),requirejs(["text!templates/dialog/notification.html","mustache"],function(n,a){let s={id:r,content:t.content},l=a.render(n,s);i.dialog({title:t.content.title,message:l,className:o,buttons:t.buttons}).on("shown.bs.modal",function(t){let n=e(this);n.find(".bootbox-close-button").remove(),n.find("button").blur(),function(e){let t=e.find("h1");t.delay(300).velocity("transition.shrinkIn",{duration:500}).delay(800),t.velocity({scale:1.05},{duration:600,loop:5})}(n)})}))}}),define("dialog/manual",["jquery","app/init","app/util","bootbox"],(e,t,n,i)=>{"use strict";let r="pf-dialog-navigation-list",o="pf-dialog-navigation-list-item",a="pf-manual-scrollspy";e.fn.showMapManual=function(){requirejs(["text!templates/dialog/map_manual.html","mustache"],(n,s)=>{let l={dialogNavigationClass:r,dialogNavLiClass:o,scrollspyId:a,pieChartClass:t.classes.pieChart.pieChartMapCounterClass,mapCounterClass:t.classes.pieChart.pieChartMapCounterClass},c=s.render(n,l),u=i.dialog({title:"Manual",message:c,size:"large",buttons:{success:{label:"close",className:"btn-default",callback:function(){e(u).modal("hide")}}},show:!0}),d=!1,p=e(".pf-manual-scroll-break"),f=e("."+o),h=e("#"+a),m=()=>{if(!1===d)for(let t=0;t0){e(f[t]).hasClass("active")||(f.removeClass("active"),f.find("a").blur(),e(f[t]).addClass("active"));break}}};h.mCustomScrollbar({axis:"y",theme:"light-3",scrollInertia:200,autoExpandScrollbar:!1,scrollButtons:{enable:!0,scrollAmount:30},advanced:{updateOnContentResize:!0},callbacks:{onInit:function(){h.find("."+l.mapCounterClass).initMapUpdateCounter();let t=e("."+r).find("a"),n=h.find("a[data-target]");t.add(n).on("click",function(t){t.preventDefault(),d=!0,h.mCustomScrollbar("scrollTo",e(this).attr("data-target"));let n=e(this).parent("."+o);m(),n.length>0&&(f.removeClass("active"),e(this).parent().addClass("active"))})},onScroll:function(){d=!1,m()},whileScrolling:m},mouseWheel:{enable:!0,scrollAmount:200,axis:"y",preventDefault:!0},scrollbarPosition:"outsite",autoDraggerLength:!0})})}}),define("dialog/changelog",["jquery","app/init","app/util","bootbox"],(e,t,n,i)=>{"use strict";let r="pf-changelog-dialog",o="pf-dynamic-message-container",a="timeline",s=i=>{let r=i.find(".modal-content");r.showLoadingAnimation(),e.ajax({type:"POST",url:t.path.gitHubReleases,dataType:"json",context:{changelogDialog:i}}).done(function(e){let t=this.changelogDialog,n=e.version,i=e.releasesData;((e,t)=>{let n="error",i=t.current,r="Installed version check failed";t.dev?(n="info",i=t.current+" (dev)",r="This installation is ahead of current stable version "+t.last+"."):0===t.delta?(n="success",i=t.current,r="This installation is up2date."):(n="warning",i=t.current,r="This installation is "+t.delta+" version behind current stable "+t.last+"."),e.find("."+o).showMessage({dismissible:!1,type:n,title:i,text:r})})(t,n),requirejs(["text!templates/ui/timeline_element.html","mustache"],function(e,n){for(let r=0;r li").velocity("transition.expandIn",{stagger:300,duration:240,complete:function(){}})})}).fail(function(e,t,i){let r=t+" "+e.status+": "+i;n.showNotify({title:e.status+": login",text:r,type:"error"})}).always(function(){r.hideLoadingAnimation()})};e.fn.changelogsDialog=function(){let t=e("
                ").append(e("
                ",{class:o}),e("
                  ",{class:a})),n=i.dialog({className:r,title:"Changelog",size:"large",message:t});n.on("shown.bs.modal",function(e){s(n)})}}),define("dialog/credit",["jquery","app/init","app/util","bootbox","layout/logo"],(e,t,n,i)=>{"use strict";let r="pf-credits-dialog",o="pf-logo-container";e.fn.showCreditsDialog=function(e,t){requirejs(["text!templates/dialog/credit.html","mustache"],(a,s)=>{let l={logoContainerId:o,version:n.getVersion()},c=s.render(a,l),u=i.dialog({className:r,title:"Licence",message:c});u.on("shown.bs.modal",function(n){u.find("#"+o).drawLogo(e,t)})})}}),define("dialog/api_status",["jquery","app/init","app/util","bootbox"],(e,t,n,i)=>{"use strict";let r="pf-api-status-dialog";e.fn.apiStatusDialog=function(e){let t={apiData:e,methodFormat:()=>(e,t)=>{switch(t(e)){case"get":return"txt-color-blue";case"post":return"txt-color-green";case"put":return"txt-color-yellow";case"delete":return"txt-color-red";default:return""}},statusTitle:()=>(e,t)=>{switch(t(e)){case"green":return"ok";case"yellow":return"degraded: Slow or potentially dropping requests";case"orange":return"bad: Most requests are not succeeding and/or are very slow (5s+) on average";case"red":return"error: Status data not available. Either offline or any other fatal error";default:return"unknown"}},secondsFormat:()=>(e,t)=>parseFloat(t(e)).toFixed(2)+"s"};requirejs(["text!templates/dialog/api_status.html","mustache"],(e,n)=>{let o=i.dialog({className:r,title:"API status",message:n.render(e,t),show:!1,buttons:{close:{label:"cancel",className:"btn-default"}}});o.initTooltips(),o.modal("show")})}}),define("login",["jquery","app/init","app/util","app/render","blueImpGallery","bootbox","lazyload","layout/header_login","layout/logo","layout/demo_map","dialog/account_settings","dialog/notification","dialog/manual","dialog/changelog","dialog/credit","dialog/api_status"],(e,t,n,i,r,o)=>{"use strict";let a="pf-splash",s="pf-landing-top",l="pf-header-container",c="pf-logo-container",u="pf-header-map",d="pf-header-map-bg",p="pf-map-neocom",f="pf-map-browser",h="pf-map-bg-image",m="pf-navbar",g="pf-navbar-manual",v="pf-navbar-license",y="pf-navbar-version-info",b="pf-cookie-hint",w="pf-sso-login-button",x="pf-character-selection",C="pf-character-row-animate",S="pf-character-image-wrapper",_="pf-character-info",T="pf-dynamic-message-container",k="pf-gallery",D="pf-landing-image-preview",E="pf-landing-gallery-carousel",A="pf-notification-panel",O="pf-landing-sticky-panel",I="pf-landing-server-panel",P="pf-landing-admin-panel",$="pf-api-status-trigger",R="pf-animate-on-visible",j=365,L=()=>{e("."+y).off("click").on("click",function(t){e.fn.changelogsDialog()})},N=t=>{e("#"+P).css({bottom:("up"===t?"+":"-")+"=35px"})},M=()=>{n.setCookie("cookie",1,j,"d")},B=()=>{if(0===e("#"+E).length)return;r.prototype.textFactory=function(t,n){let r=e("
                  ").addClass("text-content").attr("imgTitle",t.title),o={id:u,bgId:d,neocomId:p,browserId:f,mapBgImageId:h};return i.render(t.href,o).then(e=>r.append(e)).then(e=>n({type:"complete",target:e[0]})),r[0]};let t=new r([{imgTitle:"Browser",href:"ui/map",type:"text/html"},{href:"public/img/landing/responsive.jpg",imgTitle:"Responsive layout",type:"image/jpg",thumbnail:""},{href:"public/img/landing/pathfinder_1.jpg",imgTitle:"Map view",type:"image/jpg",thumbnail:""},{href:"public/img/landing/pathfinder_3.jpg",imgTitle:"Map information",type:"image/jpg",thumbnail:""},{href:"public/img/landing/pathfinder_2.jpg",imgTitle:"System information",type:"image/jpg",thumbnail:""}],{container:"#"+E,carousel:!0,startSlideshow:!1,titleProperty:"imgTitle",transitionSpeed:600,slideshowInterval:5e3,preloadRange:1,onopened:function(){e(this.options.container).find(this.options.titleElement).text("Browser view"),e("#"+u).drawDemoMap(function(){e("#"+u+" svg").velocity({scaleX:.66,scaleY:.66},{duration:360}),e("#"+u).velocity({marginTop:"130px",marginLeft:"-50px"},{duration:360,complete:function(){e("#"+f).velocity("transition.slideUpBigIn",{duration:360,complete:function(){e("#"+p).velocity("transition.slideLeftIn",{duration:180}),e("#"+h).velocity("transition.shrinkIn",{duration:360}),t.play()}})}})})}})},F=()=>e('a[data-gallery="#'+k+'"]').not(".disabled"),q=t=>{if(t.length>0){let n=F();requirejs(["blueImpGalleryBootstrap"],()=>{e(t).each(function(){let t=e("#"+k);t.data("useBootstrapModal",!0),t.toggleClass("blueimp-gallery-controls",!1),e(this).on("click",function(e){e.preventDefault();let t=(e=e||window.event).target||e.srcElement,i=t.src?t.parentNode:t;new r(n,{index:i,event:e,container:"#"+k,titleProperty:"description"})})})})}},U=()=>{e(".youtube").each(function(){e(this).css("background-image","url(//i.ytimg.com/vi/"+this.id+"/sddefault.jpg)"),e(this).append(e("
                  ",{class:"play"})),e(document).delegate("#"+this.id,"click",function(){let t="//www.youtube.com/embed/"+this.id+"?autoplay=1&autohide=1";e(this).data("params")&&(t+="&"+e(this).data("params"));let n=e("